pax_global_header00006660000000000000000000000064147720112400014510gustar00rootroot0000000000000052 comment=5c99ad00d3ffad5941f63aa5b16dbf88bebd8a02 nsis-3.11/000077500000000000000000000000001477201124000124105ustar00rootroot00000000000000nsis-3.11/.github/000077500000000000000000000000001477201124000137505ustar00rootroot00000000000000nsis-3.11/.github/workflows/000077500000000000000000000000001477201124000160055ustar00rootroot00000000000000nsis-3.11/.github/workflows/build.yml000077500000000000000000000123741477201124000176410ustar00rootroot00000000000000name: Build, Test and Publish on: push: branches-ignore: - trunk - svn2git-cache pull_request: jobs: build: strategy: matrix: python-version: ['3.x'] # 2.x is supported but EOL on GitHub Actions os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04, macos-13, windows-2019, windows-2022] # TODO fails to find cppunit on macos-14/15 log: [yes, no] include: - nightly: nightly os: windows-2019 log: no python-version: 3.x runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v4 - name: Brew Dependencies run: | brew install scons mingw-w64 zlib curl --retry 9 -sLo cppunit.rb "https://sourceforge.net/p/nsis/code/HEAD/tree/web-scripts/trunk/cppunit.rb?format=raw" brew install -s --formula cppunit.rb if: startsWith(matrix.os, 'macos') - name: Apt Dependencies run: sudo DEBIAN_FRONTEND=noninteractive apt-get install -y scons g++-mingw-w64-i686 binutils-mingw-w64-i686 zlib1g-dev libcppunit-dev if: startsWith(matrix.os, 'ubuntu') - name: Setup Python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} if: startsWith(matrix.os, 'windows') - name: Choco Dependencies run: | curl --retry 9 -sLo cppunit-msvc-1.12.1.exe https://downloads.sourceforge.net/project/cppunit-msvc/cppunit-msvc-1.12.1.exe $arguments = "/S /D=$HOME\cppunit" Start-Process ./cppunit-msvc-1.12.1.exe $arguments -NoNewWindow -Wait pip install scons choco install zip # microsoft removed the download of htmlhelp.exe -- https://chocolatey.org/packages/html-help-workshop#comment-5245282888 #choco install html-help-workshop echo "${Env:ProgramFiles(x86)}\HTML Help Workshop" >> $Env:GITHUB_PATH if: startsWith(matrix.os, 'windows') - name: Zlib Dependency run: | curl --retry 9 -sLo $HOME/zlib.zip "https://downloads.sourceforge.net/project/libpng/zlib/1.2.8/zlib128-dll.zip?r=&ts=1403402496&use_mirror=hivelocity" mkdir $HOME/zlib unzip $HOME/zlib.zip -d $HOME/zlib - name: Build run: | scons ZLIB_W32=$HOME/zlib SKIPUTILS="NSIS Menu" NSIS_CONFIG_LOG=${{ matrix.log }} test dist-zip if: "!startsWith(matrix.os, 'windows')" - name: Build (Windows) run: | scons ZLIB_W32=$HOME/zlib SKIPUTILS="NSIS Menu" NSIS_CONFIG_LOG=${{ matrix.log }} APPEND_CPPPATH=$HOME/cppunit/include APPEND_LIBPATH=$HOME/cppunit/lib/release-win32 test dist if: startsWith(matrix.os, 'windows') - name: Config Errors if: ${{ failure() }} run: cat config.log - name: Nightly Build run: | rm nsis-*.zip scons ZLIB_W32=$HOME/zlib SKIPUTILS="NSIS Menu" DOCTYPES=web dist-zip echo https://github.com/$Env:GITHUB_REPOSITORY/actions/runs/$Env:GITHUB_RUN_ID > build.log ls -Name nsis-*.zip -OutVariable zip zip $zip build.log if: matrix.nightly == 'nightly' && github.ref == 'refs/heads/master' - name: Upload Artifact uses: actions/upload-artifact@v4 with: name: build.zip path: nsis-*.zip if: matrix.nightly == 'nightly' && github.ref == 'refs/heads/master' nightly: if: github.ref == 'refs/heads/master' runs-on: ubuntu-20.04 needs: [build] steps: - name: Download a single artifact uses: actions/download-artifact@v4 with: name: build.zip - name: Upload to SourceForge run: | echo "$DEPLOY_KEY" > $HOME/deploy_key set -ex chmod 600 $HOME/deploy_key mkdir nightly unzip nsis-*.zip -d nightly LocalNightly=`ls -d nightly/nsis-*` RemoteNightly=kichik,nsis@web.sourceforge.net:/home/project-web/nsis/htdocs/nightly scp -oStrictHostKeyChecking=no -oBatchMode=yes -i $HOME/deploy_key nsis-*.zip $RemoteNightly/nsis.zip scp -oStrictHostKeyChecking=no -oBatchMode=yes -i $HOME/deploy_key nightly/build.log $RemoteNightly/build.log cp $LocalNightly/Docs/Contents.html $LocalNightly/Docs/index.html echo "Options +indexes" > $LocalNightly/Docs/.htaccess echo "Options +indexes" > $LocalNightly/Examples/.htaccess echo "Options +indexes" > $LocalNightly/Include/.htaccess echo "Options +indexes" > $LocalNightly/Contrib/.htaccess rsync -e "ssh -i $HOME/deploy_key -oStrictHostKeyChecking=no -oBatchMode=yes" -va --delete $LocalNightly/Docs/ $RemoteNightly/Docs/ rsync -e "ssh -i $HOME/deploy_key -oStrictHostKeyChecking=no -oBatchMode=yes" -va --delete $LocalNightly/Examples/ $RemoteNightly/Examples/ rsync -e "ssh -i $HOME/deploy_key -oStrictHostKeyChecking=no -oBatchMode=yes" -va --delete $LocalNightly/Include/ $RemoteNightly/Include/ rsync -e "ssh -i $HOME/deploy_key -oStrictHostKeyChecking=no -oBatchMode=yes" -va --delete $LocalNightly/Contrib/ $RemoteNightly/Contrib/ env: DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} nsis-3.11/.github/workflows/copy-svn.yml000077500000000000000000000103161477201124000203120ustar00rootroot00000000000000# to bootstrap this action, create an empty repo with just this file and svn-authors # run the action once with force parameter set to "yes" # git commit -m "xxx" * && git push -f && gh workflow run -R kichik/nsis-travis copy-svn.yml -f force=yes name: Copy from SourceForge Subversion on: workflow_dispatch: inputs: force: description: 'Force push (CAREFUL!)' required: false schedule: - cron: '4 10 * * *' jobs: copy: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - name: Install git-svn run: sudo add-apt-repository ppa:git-core/ppa && sudo apt update && sudo apt install git-svn - name: Configure git run: | git config --global user.email "kichik@gmail.com" git config --global user.name "Amir Szekely" - name: Restore cache id: restore-cache run: | if git fetch origin svn2git-cache; then git checkout svn2git-cache else git checkout --orphan svn2git-cache git rm -rf --cached . git add .github/workflows/* git commit -m "Empty cache" echo "cache-hit=false" >> $GITHUB_OUTPUT fi if [ -f svn2git-cache.tar.gz ]; then tar xzf svn2git-cache.tar.gz echo "cache-hit=true" >> $GITHUB_OUTPUT else echo "cache-hit=false" >> $GITHUB_OUTPUT fi - name: Initial SVN clone if: steps.restore-cache.outputs.cache-hit != 'true' run: | git svn clone -A.github/workflows/svn-authors -s https://svn.code.sf.net/p/nsis/code/NSIS svn2git - name: SVN fetch working-directory: svn2git run: | git svn fetch --fetch-all git svn rebase - name: SVN branches working-directory: svn2git run: | for remote_branch in $(git branch -r | grep -v /tags/); do if echo $remote_branch | grep @; then echo ignoring weird branch $remote_branch continue fi local_branch=`echo $remote_branch | cut -d / -f 2-` git checkout -b "$local_branch" "$remote_branch" || git checkout "$local_branch" git svn rebase done git checkout master - name: SVN tags working-directory: svn2git run: | git for-each-ref --format="%(refname:short) %(objectname)" refs/remotes/origin/tags \ | while read BRANCH REF do TAG_NAME=`echo $BRANCH | cut -d / -f 3-` BODY="$(git log -1 --format=format:%B $REF)" echo "ref=$REF parent=$(git rev-parse $REF^) tagname=$TAG_NAME body=$BODY" >&2 if [ $(git tag -l "$TAG_NAME") ]; then echo tag already exists else git tag -a -m "$BODY" $TAG_NAME $REF^ fi done - name: Setup GitHub access env: SSH_KEY: ${{ secrets.SSH_KEY }} run: | mkdir -p ~/.ssh touch ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 echo "$SSH_KEY" >> ~/.ssh/id_ed25519 - name: Push to GitHub working-directory: svn2git run: | flags="" if [[ "${{ github.event.inputs.force }}" = "yes" ]]; then flags="--force" fi remote_repo="git@github.com:${GITHUB_REPOSITORY}.git" git push "$remote_repo" --all $flags git push "$remote_repo" --tags $flags - name: GC working-directory: svn2git run: | echo run garbage collection so caching does not fail while files are changing git gc --auto - name: Save cache run: | rm -f svn2git-cache.tar.gz tar czf svn2git-cache.tar.gz svn2git git add svn2git-cache.tar.gz cp svn2git/.github/workflows/* .github/workflows/ git add .github/workflows/* git commit --amend -m "update cache" svn2git-cache.tar.gz git push --force git@github.com:${GITHUB_REPOSITORY}.git svn2git-cache nsis-3.11/.github/workflows/svn-authors000077500000000000000000000025121477201124000202240ustar00rootroot00000000000000(no author) = No Author anoncvs_ezcontents = No Author anders_k = Anders eccles = Dave Laundon joostverburg = Joost Verburg justin1014 = Justin Frankel kichik = Amir Szekely sunjammerx = Ximon Eighteen afrow_uk = Stuart ballison = Ben Allison f0rt = f0rt flizebogen = Flizebogen gavenkoa = Oleksandr Gavenko golubdr = David Golub icemank = Sunil Kamath jimpark = Jim Park oripel = Ori Peleg pabs3 = Paul Wise ramon18 = Ramon whyeye = Jan T. Sott wizou = Wizou rainwater = Robert Rainwater uid27073 = Robert Rainwater zarg = zarg o_owd = o_owd nsis-3.11/COPYING000077500000000000000000000364201477201124000134530ustar00rootroot00000000000000COPYRIGHT --------- Copyright (C) 1999-2025 Contributors More detailed copyright information can be found in the individual source code files. APPLICABLE LICENSES ------------------- * All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license. * The zlib compression module for NSIS is licensed under the zlib/libpng license. * The bzip2 compression module for NSIS is licensed under the bzip2 license. * The LZMA compression module for NSIS is licensed under the Common Public License version 1.0. ZLIB/LIBPNG LICENSE ------------------- This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. BZIP2 LICENSE ------------- This program, "bzip2" and associated library "libbzip2", are copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org COMMON PUBLIC LICENSE VERSION 1.0 --------------------------------- THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. SPECIAL EXCEPTION FOR LZMA COMPRESSION MODULE --------------------------------------------- Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0. nsis-3.11/ChangeLog000077500000000000000000056513551477201124000142110ustar00rootroot000000000000002025-03-08 23:04 kichik * /NSIS/tags/v311: Tagging for release 3.11 2025-03-08 23:04 kichik * /NSIS/tags/v311: Delete wrong tag 2025-03-08 22:52 kichik * /NSIS/tags/v311/trunk: Tagging for release 3.11 2025-03-08 22:49 kichik * /NSIS/trunk/SConstruct: no idea why this is suddenly needed 2025-03-08 21:43 kichik * /NSIS/tags/v311: Tagging for release 3.11 2025-03-08 21:42 kichik * /NSIS/trunk/Menu/images/header.gif: 3.11 2025-03-08 21:33 kichik * /NSIS/trunk/Docs/src/history.but: windows 3.11 release 2025-02-13 20:44 anders_k * /NSIS/trunk/Docs/src/usage.but: Expand _?= example code 2025-02-13 12:15 anders_k * /NSIS/trunk/SConstruct, /NSIS/trunk/Scripts/release.py: Set SOURCE_DATE_EPOCH in the release script 2025-02-12 23:01 anders_k * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/SConstruct: Document SOURCE_DATE_EPOCH and ease its usage in release builds 2025-02-04 20:45 anders_k * /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: Force PE OS version and some MSVC optimizations (adapted from PR 28 for MSVC14/VS2022) 2025-02-04 15:21 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c: Set LARGE_ADDRESS_AWARE flag in .exe helper for ARM64 2025-02-04 15:13 anders_k * /NSIS/trunk/Contrib/zip2exe/Base.nsh, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h: Make the compressor selection code more generic 2025-02-04 13:29 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/fileform.c: Retry opening self (partial patch 316) 2025-02-01 20:55 anders_k * /NSIS/trunk/Source/util.cpp: fstat exists on Apple and FreeBSD (thanks Jason) 2025-01-19 20:32 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: 2025 2025-01-19 14:47 kichik * /NSIS/trunk/.github/workflows/build.yml: macos-12 is deprecated on gha 2025-01-12 22:23 anders_k * /NSIS/trunk/Include/WinVer.nsh: Update 24H2 codename 2024-12-02 18:53 kichik * /NSIS/trunk/Docs/src/history.but: credit for issue 2024-12-01 18:09 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c: Don't use middleman on 64-bit 2024-12-01 18:06 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c: Retry creating restricted $PLUGINSDIR (bug #1315) 2024-10-20 19:28 kichik * /NSIS/trunk/.github/workflows/build.yml: fix github actions build 2024-10-16 20:10 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp: LicenseBkColor in the uninstaller (bug #1314) 2024-09-04 13:47 kichik * /NSIS/trunk/.github/workflows/build.yml: update github actions 2024-09-02 14:58 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Docs/src/history.but: Handle CHARSET parameter (patch 315) 2024-09-02 14:28 anders_k * /NSIS/trunk/Docs/src/headers.but: Mention more headers in Useful Headers 2024-08-09 14:06 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/SConscript, /NSIS/trunk/Docs/src/history.but: Accept .zip as command line parameter 2024-06-24 21:11 anders_k * /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Language files/Georgian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Tatar.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Uzbek.nlf: Remove invalid trailing whitespace (bug #1310) 2024-06-17 11:20 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi: Check the documented bit (for ReactOS) 2024-06-14 14:19 anders_k * /NSIS/trunk/Include/WinVer.nsh: More Win11 2024-06-12 11:03 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added ARP to tools menu 2024-06-11 21:24 anders_k * /NSIS/trunk/Docs/src/var.but: Clarify $AppData context and when it exists 2024-06-10 13:15 anders_k * /NSIS/trunk/Examples/makensis.nsi: Use proper branding icon 2024-05-31 18:34 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp: Support setting source file decoding charset with Python-style PEP 263 magic comment 2024-05-30 19:07 anders_k * /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Docs/src/history.but: Make System/Resource.dll reproducible by respecting SOURCE_DATE_EPOCH (patch #312) 2024-05-30 18:57 anders_k * /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Docs/src/history.but: Updated Finnish (patch #313) 2024-03-30 16:51 kichik * /NSIS/tags/v310: Tagging for release 3.10 2024-03-30 16:51 kichik * /NSIS/trunk/Menu/images/header.gif: 3.10 2024-03-30 16:50 kichik * /NSIS/trunk/Docs/src/history.but: Update history.but for 3.10 2024-03-30 16:04 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Fixed plug-in call overwriting SetDetailsPrint lastused (bug #1300, #1271) 2023-12-21 06:32 anders_k * /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/util.cpp: Fix comment typos (PR 25) 2023-11-18 00:32 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: Fix RTL text in component tree 2023-09-02 19:45 anders_k * /NSIS/trunk/Include/Memento.nsh: Customizable memento prefix and id 2023-08-14 22:16 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added InstType /UNINSTNOCUSTOM and /UNINSTCOMPONENTSONLYONCUSTOM 2023-08-02 00:08 anders_k * /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Docs/src/history.but: Support relative URLs in location redirects 2023-07-31 16:41 anders_k * /NSIS/trunk/Source/util.cpp: Fix !appendmemfile type mismatch on posix (Bug #311) 2023-07-30 21:42 anders_k * /NSIS/trunk/Source/scriptpp.cpp: free of constant sorrow 2023-07-28 19:43 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: Added NSD_CB_Find&SelectStringExact 2023-07-27 17:18 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added !appendmemfile for LogicLib internal usage 2023-07-02 22:45 kichik * /NSIS/trunk/Docs/src/build.but: Document some build workarounds for newer Python and Windows 2023-07-02 02:17 kichik * /NSIS/trunk/Scripts: One more folder to ignore 2023-07-02 02:16 kichik * /NSIS/trunk/Scripts/release.py: More Python 3 updates for release script 2023-07-02 02:06 kichik * /NSIS/tags/v309: Tagging for release 3.09 2023-07-02 02:06 kichik * /NSIS/trunk/Menu/images/header.gif: 3.09 2023-07-02 02:05 kichik * /NSIS/trunk/Docs/src/history.but: Prepare for 3.09 2023-07-02 02:00 kichik * /NSIS/trunk/Scripts: Ignore files in Scripts that should never be committed 2023-07-02 01:54 kichik * /NSIS/trunk/Scripts/release.py: Update release script for Python 3, SCons 4.5, and Windows 11 2023-07-01 01:03 kichik * /NSIS/trunk/Examples/makensis.nsi: Match plugin case to old installation method This made release.py complain about a diff between `scons install` and the EXE installer 2023-07-01 00:55 kichik * /NSIS/trunk/Examples/MultiUser.nsi, /NSIS/trunk/Include/Win/RestartManager.nsh: Fix eol 2023-07-01 00:15 kichik * /NSIS/trunk/SCons/Config/ms: Workaround for rc /nologo in newer SCons 2023-06-22 21:46 kichik * /NSIS/trunk/.github/workflows/build.yml: Python 2.7 EOL on GitHub Actions 2023-06-21 23:38 anders_k * /NSIS/trunk/Source/exehead/util.c: Don't allow everyone to delete the uninstaller directory 2023-06-04 20:50 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c: Added bug report number for bug #1296 2023-06-03 15:10 anders_k * /NSIS/trunk/Source/exehead/Main.c: Don't delete old uninstaller if it points somewhere else 2023-06-03 13:06 anders_k * /NSIS/trunk/Source/scriptpp.cpp: Fixed /ifndef when combined with /math 2023-05-21 22:35 anders_k * /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: Don't activate the outline window 2023-05-21 19:22 anders_k * /NSIS/trunk/Examples/makensis.nsi: Installer header image on the right 2023-05-21 17:24 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/scriptpp.cpp: Added internal pragma to dump compiler state 2023-05-21 16:27 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c: Fixed mingw-w64 12 warnings (patch #310) 2023-05-21 16:15 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: Use isolated uninstaller temp directory 2023-04-06 17:12 kichik * /NSIS/trunk/.github/workflows/build.yml: Windows 2022 can't find VC 2023-04-06 16:49 kichik * /NSIS/trunk/.github/workflows/build.yml: Remove deprecated runners 2023-04-06 16:38 kichik * /NSIS/trunk/.github/workflows/copy-svn.yml: Fix GitHub Actions deprecations 2023-01-26 13:51 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2023 2022-12-19 20:19 anders_k * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Docs/src/history.but: Updated Ukrainian (patch 308) 2022-12-19 19:59 anders_k * /NSIS/trunk/Source/makenssi.cpp: Use full path for the default output path 2022-12-16 20:14 anders_k * /NSIS/trunk/Include/WinVer.nsh: Added October 2022 2022-12-14 22:46 anders_k * /NSIS/trunk/Examples/MultiUser.nsi: OutFile for CI 2022-12-13 18:10 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/MultiUser.nsi, /NSIS/trunk/Examples/SConscript: Install MultiUser example 2022-12-12 20:36 anders_k * /NSIS/trunk/Source/util.cpp: Don't use _ environment variable because it is sometimes incorrect 2022-12-12 20:07 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/script.cpp: !uninstfinalize big uninstaller fixes, part 2 (bug #1279) 2022-12-05 21:39 kichik * /NSIS/trunk/.github/workflows/build.yml, /NSIS/trunk/.github/workflows/copy-svn.yml: Avoid node 12.x deprecation warnings 2022-12-04 19:06 anders_k * /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Examples/MultiUser.nsi: Added MultiUser example 2022-12-04 18:52 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Further !uninstfinalize big uninstaller fixes (bug #1279) 2022-10-24 15:55 anders_k * /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/Include/StrFunc.txt: Fixed minor typos 2022-10-23 18:25 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp: Fixed GCC12 binary_function warning (patch #307) 2022-10-23 18:09 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Use SHCloneSpecialIDList instead of SHGetSpecialFolderLocation so missing folders can be created on Win4.x 2022-09-20 21:38 anders_k * /NSIS/trunk/Include/WinVer.nsh: Windows 11 2022 Update 2022-09-20 21:31 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: Fixed NSD_ClearIcon (bug #1286) 2022-09-20 21:29 anders_k * /NSIS/trunk/Include/LogicLib.nsh: Avoid unused label warning 2022-09-19 16:40 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/utils.py: Disable stub relocations in newer GCC (bug #1283) 2022-09-02 20:03 anders_k * /NSIS/trunk/SCons/Config/gnu: Don't generate relocation section in stubs 2022-09-02 20:02 anders_k * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: Reduce old GCC linker warnings 2022-09-02 16:45 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Display error message if starting the generated installer fails 2022-09-01 20:55 anders_k * /NSIS/trunk/Examples/example2.nsi: Fixed typo 2022-08-30 01:53 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh: Fixed LogicLib Switch Unicode bug 2022-08-30 01:45 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/utf.cpp: Fixed !appendfile not writing to non-empty files with a BOM 2022-06-19 20:09 anders_k * /NSIS/trunk/Include/WinVer.nsh: Improved Win11 support 2022-06-12 20:50 anders_k * /NSIS/trunk/Docs/src/bin/halibut/misc.c: Check define for MacOS (Patch 306) 2022-03-29 21:37 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Docs/src/history.but: Bug #1282: Apply zoom level when editor is cleared 2022-01-21 18:52 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll_with_unit.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: Unicode fixes 2022-01-08 18:32 anders_k * /NSIS/trunk/Source/Tests/Platform.cpp, /NSIS/trunk/Source/Tests/ResourceEditor.cpp: Added tests 2022-01-07 23:45 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/Platform.cpp, /NSIS/trunk/Source/Tests/SConscript, /NSIS/trunk/Source/util.h: Fixed MMapBuf size bug 2022-01-02 17:18 anders_k * /NSIS/trunk/Source/ResourceEditor.cpp: Set the cursor hotspot correctly 2021-12-31 18:46 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/StrFunc.txt, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/Tests/textrunner.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: 2022 2021-12-31 01:41 anders_k * /NSIS/trunk/.github/workflows/copy-svn.yml, /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Components.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/NSIS Menu/wx/setup.h, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Contrib/VPatch/Source/GenPat/FileFormat1.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/FileFormat1.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/malloc.c, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/NSISMenu.nsi, /NSIS/trunk/Examples/primes.nsi, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/Memento.nsh, /NSIS/trunk/Include/Sections.nsh, /NSIS/trunk/Include/StrFunc.txt, /NSIS/trunk/Include/Win/RestartManager.nsh, /NSIS/trunk/Include/WinCore.nsh, /NSIS/trunk/Include/WinMessages.nsh, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/linker_script, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/textrunner.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/tokens.cpp: Fix typos found by codespell (DimitriPapadopoulos PR) 2021-12-28 23:24 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added !assert 2021-12-23 22:31 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/error.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/misc.c, /NSIS/trunk/Docs/src/bin/halibut/version.c: Cherry pick halibut upstream 2021-12-06 18:05 anders_k * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp: Allow . in variable names 2021-12-02 20:18 anders_k * /NSIS/trunk/Include/WinVer.nsh: Added WinVer_WaaS 21H2 and Win11 2021-11-21 17:16 anders_k * /NSIS/trunk/Docs/src/bin/halibut/SConscript, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.h: Fixed old GCC issues (bug #1275) 2021-11-17 22:24 anders_k * /NSIS/trunk/Source/7zip/Common/MyCom.h: Fixed silly GCC warning (Bug #1274) 2021-11-06 20:34 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c: Fixed plug-in call overwriting SetDetailsPrint lastused (bug #1271) 2021-11-04 21:40 anders_k * /NSIS/trunk/.github/workflows/build.yml, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SConstruct: Python 3 fixes (Github PR 20) 2021-11-04 20:32 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/SConscript, /NSIS/trunk/Include/Win/RestartManager.nsh: Added RestartManager defines 2021-10-07 14:45 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/history.but: Fixed halibut fprintf format security warnings (patch #304) 2021-09-29 21:12 anders_k * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Docs/src/history.but: Updated PortugueseBR (Bug #1269) 2021-09-25 21:40 kichik * /NSIS/tags/v308: Tagging for release 3.08 2021-09-25 21:36 kichik * /NSIS/trunk/Menu/images/header.gif: 3.08 2021-09-25 21:22 kichik * /NSIS/trunk/Docs/src/history.but: 3.08 2021-09-20 17:21 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Store log window handle in a global 2021-09-20 16:48 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added log window zooming accelerators 2021-09-19 22:41 kichik * /NSIS/trunk/README.md: Update build badges 2021-09-19 21:10 anders_k * /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Source/Tests/winver.nsi: Optimize known conditions 2021-09-19 18:24 anders_k * /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/ResourceEditor.cpp: Fixed types for POSIX 2021-09-18 20:24 anders_k * /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.h: Icon now supports the res:// protocol 2021-09-17 18:13 anders_k * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Source/script.cpp: Added ExecShell /ALLOWERRORUI 2021-09-15 11:54 anders_k * /NSIS/trunk/.github/workflows/build.yml: curl retry 2021-09-15 01:41 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/help.c, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/usection.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Docs/src/var.but: Added \s command from upstream and custom \bold and \html commands 2021-09-14 22:42 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/bin/halibut/malloc.c, /NSIS/trunk/Docs/src/bin/halibut/misc.c, /NSIS/trunk/Docs/src/bin/halibut/ustring.c, /NSIS/trunk/Docs/src/config_web.but, /NSIS/trunk/Docs/unreleased.png: Force nightly fresh external files 2021-09-13 23:21 anders_k * /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/ustring.c, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/style.css: Basic dark mode for main docs and MultiUser 2021-09-13 16:34 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/VPatch/Readme.html: Support dark mode in simple docs 2021-09-13 14:01 anders_k * /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/ustring.c: Constify 2021-09-12 03:30 kichik * /NSIS/trunk/.github/workflows/build.yml: Ignore svn2git-cache branch as it contains no code 2021-09-11 23:54 anders_k * /NSIS/trunk/Docs/src/bin/halibut/biblio.c, /NSIS/trunk/Docs/src/bin/halibut/contents.c, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/keywords.c, /NSIS/trunk/Docs/src/bin/halibut/ustring.c: Cherrypicked minor upstream fixes 2021-09-11 22:57 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/ustring.c, /NSIS/trunk/Docs/src/bin/halibut/version.c, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Source/ResourceEditor.cpp: Better xhtml compatibility, default charset and optional lang tag 2021-09-05 18:27 kichik * /NSIS/trunk/.github/workflows/build.yml: Don't build trunk (it's copied to master which is also built) 2021-09-05 18:26 kichik * /NSIS/trunk/.github/workflows/build.yml, /NSIS/trunk/.github/workflows/copy-svn.yml: Clean-up 2021-09-04 21:59 kichik * /NSIS/trunk/.github/workflows/copy-svn.yml: Fix workflow updating permissions Update workflow on the fly Set schedules 2021-09-04 19:40 kichik * /NSIS/trunk/.github/workflows/copy-svn.yml, /NSIS/trunk/.github/workflows/svn-authors: Attempt number one at copying SourceForge SVN to GitHub using Actions 2021-09-04 01:13 anders_k * /NSIS/trunk/Source/build.cpp: Nameless sections also have to be selected to be counted as required 2021-09-04 01:06 anders_k * /NSIS/trunk/Source/build.cpp: Only count a section as required if it is both SELECTED and RO 2021-09-01 18:58 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/util.cpp: Make GCC happy 2021-08-30 00:06 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/tokens.cpp: Added GetDllVersion /ProductVersion switch 2021-08-29 18:39 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/winver.nsi, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added GetWinVer instruction 2021-08-27 18:23 anders_k * /NSIS/trunk/Source/Tests/winver.nsi: NT4 < SP6 test must be client, not server 2021-08-26 17:09 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Force RichEdit COM calls to UI thread 2021-08-26 16:23 anders_k * /NSIS/trunk/Source/utf.cpp: Allow Cygwin to use fast ASCII range 2021-08-26 14:49 anders_k * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but: System::Store can push/pop the flags state 2021-08-26 12:57 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added $USER.. and $COMMON.. alias constants 2021-08-25 17:36 anders_k * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Docs/style.css, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/unicode.nsi: Docs update and font size fixes 2021-08-23 22:24 anders_k * /NSIS/trunk/Source/ResourceEditor.cpp: Endian fix 2021-08-23 21:50 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: PEAddResource now supports the res: protocol 2021-08-21 22:18 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Use old bitmap on low-bpp displays 2021-08-20 14:56 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Refactored Tooltip text handling 2021-08-20 11:46 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Close button moonlights as Abort 2021-08-18 23:48 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Source/SConscript: Attempt to prevent a selection change from currupting the log 2021-08-18 17:53 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/style.css: Twice the Monospace, not half the size 2021-08-18 16:38 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Respect context-menu drop alignment 2021-08-18 13:53 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added !uninstfinalize (patch 280) 2021-08-17 18:30 anders_k * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Just load the library 2021-08-17 15:08 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/SConscript: Added /LAUNCH compiler switch 2021-08-04 20:15 anders_k * /NSIS/trunk/Contrib/ExDLL/SConscript: Fix build with scons>=4.2 (xantares PR) 2021-08-04 17:24 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi: Added Radio buttons 2021-08-04 17:10 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Ui.c: Disallow STARTF_USESHOWWINDOW+SW_MAXIMIZE 2021-07-29 12:11 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp: Always free the library 2021-07-28 15:07 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp: To 0 and not to NULL, that is the answer 2021-07-27 18:56 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Source/util.cpp: Minor optimizations 2021-07-24 21:56 kichik * /NSIS/tags/v307: Tagging for release 3.07 2021-07-24 21:51 kichik * /NSIS/trunk/Menu/images/header.gif: 3.07 2021-07-24 21:32 kichik * /NSIS/trunk/Examples/AppGen.nsi: fix eol 2021-07-24 20:49 kichik * /NSIS/trunk/Docs/src/history.but: 3.07 2021-07-10 20:19 anders_k * /NSIS/trunk/.github/workflows/build.yml, /web-scripts/trunk/cppunit.rb: Fix GitHub actions brew cppunit 2021-07-10 18:23 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added Visual Studio compatible accelerators 2021-07-08 21:25 anders_k * /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Memento.nsh: Overridable Memento storage macros 2021-07-08 18:31 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp: Ignore error message inserts 2021-07-08 18:23 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi: Chasing the dark mode dragon 2021-06-25 21:18 anders_k * /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Docs/src/history.but: Updated Albanian (Patch #303) 2021-06-25 21:07 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Source/Platform.h: Fix old MinGW 2021-06-25 20:44 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp: Warn if a unsupported bitmap format is used (Bug #681 & FR #559) 2021-06-15 16:56 anders_k * /NSIS/trunk/Docs/src/basic.but: Added REBOOTOK volume warning 2021-06-09 22:04 anders_k * /NSIS/trunk/Include/FileFunc.nsh: Limit output to NSIS_MAX_STRLEN 2021-06-09 20:33 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/FileFunc.nsh: Fixed ${GetTime} hour padding (bug #980) 2021-06-07 21:33 anders_k * /NSIS/trunk/Include/Win/COM.nsh: Added IApplicationDestinations and ICustomDestinationList 2021-06-03 18:10 anders_k * /NSIS/trunk/Include/WinVer.nsh: Win10 21H1 2021-05-11 19:14 anders_k * /NSIS/trunk/Source/script.cpp: Abort if adding plug-in to installer fails (Bug #1264, part 2) 2021-05-03 22:23 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/StrFunc.nsh: Fixed StrClb Unicode bug (patch 302) 2021-05-03 21:56 anders_k * /NSIS/trunk/Include/StrFunc.nsh: Use the correct "Un" mode even if it is unused 2021-05-02 14:29 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/Plugins.cpp: Fixed !addplugindir relative path bug (Bug #1264) 2021-02-16 15:57 anders_k * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/MultiUser/Readme.html: Call MULTIUSER_INIT_QUIT if command line is incompatible (Bug #1253) 2021-02-16 14:19 anders_k * /NSIS/trunk/Examples/makensis.nsi: Don't create desktop shortcut 2021-02-16 13:47 anders_k * /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi: Handle app running 2021-02-15 13:52 anders_k * /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi, /NSIS/trunk/Examples/makensis.nsi: Added QuietUninstallString 2021-01-29 05:29 kichik * /NSIS/trunk/.github/workflows/build.yml: no more htmlhelp.exe from microsoft 2021-01-29 00:20 anders_k * /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Docs/src/history.but: Fixed clipped Chinese text (Bug #1261) 2021-01-27 02:27 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Include/StrFunc.nsh: Try to warn the user if they forgot to declare the function 2021-01-27 01:34 anders_k * /NSIS/trunk/Include/StrFunc.nsh: Using:StrFunc must be a nop in the artificial function mode 2021-01-23 17:06 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi, /nsisweb/trunk/r/.htaccess: Switch from Slack to Discord 2021-01-19 03:31 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: Lookup can parse hex numbers 2021-01-17 21:59 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added FormatMessage lookup 2021-01-17 20:57 anders_k * /NSIS/trunk/Contrib/Makensisw/lookup.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: Added string lookup tool 2021-01-16 18:42 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: Added FirstRadioButton and AdditionalRadioButton controls for better GROUP and TABSTOP handling 2021-01-15 16:51 kichik * /NSIS/trunk/.github/workflows/build.yml: don't run nightly on branches 2021-01-15 16:31 kichik * /NSIS/trunk/SConstruct: Honour SOURCE_DATE_EPOCH for VERSION default (GitHub PR #13) 2021-01-15 16:27 anders_k * /NSIS/trunk/Docs/src/misc.but: Added negative errorlevels warning 2021-01-15 16:21 anders_k * /NSIS/trunk/Include/Win/WinError.nsh: Added more error codes 2021-01-01 20:27 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2021 2021-01-01 20:10 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Source/Platform.h: Use Consolas font if it exists, special Japanese font if required 2020-12-30 15:44 anders_k * /NSIS/trunk/Source/script.cpp: Fixed ExecShell command detailprint when the verb is empty 2020-12-30 01:11 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp: NOTINDEXED file attribute ability 2020-12-29 20:25 anders_k * /NSIS/trunk/Include/WinVer.nsh: Added 20H2 detection 2020-11-03 00:17 kichik * /NSIS/trunk/.github/workflows/build.yml: missed a few changes 2020-11-02 23:58 kichik * /NSIS/trunk/.github/workflows/build.yml, /NSIS/trunk/Docs/src/config_web.but, /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/Docs/unreleased.png, /NSIS/trunk/SConstruct: avoid (extremely buggy) sf shell 2020-11-02 22:51 anders_k * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Source/tokens.cpp: Minor doc update 2020-10-25 00:42 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp: Added special locales 2020-10-13 23:56 kichik * /NSIS/trunk/Docs/src/compilerflags.but: Unicode true is the default 2020-10-13 23:23 kichik * /NSIS/trunk/.github/workflows/build.yml: zip doesn't like wildcards 2020-10-13 23:00 kichik * /NSIS/trunk/Docs/src/history.but: mroe 2020-10-13 22:48 kichik * /NSIS/trunk/Docs/src/history.but: typo 2020-10-13 22:46 kichik * /NSIS/trunk/.github/workflows/build.yml: last one?! 2020-10-13 22:24 kichik * /NSIS/trunk/.github/workflows/build.yml: fix scp host 2020-10-13 21:10 kichik * /NSIS/trunk/.github/workflows/build.yml: sf is very picky 2020-10-13 20:49 kichik * /NSIS/trunk/.github/workflows/build.yml: try scp instead 2020-10-13 20:14 kichik * /NSIS/trunk/.github/workflows/build.yml: try a different method 2020-10-13 19:08 kichik * /NSIS/trunk/.github/workflows/build.yml: wait for upload 2020-10-13 18:52 kichik * /NSIS/trunk/.github/workflows/build.yml: binary zip and html docs 2020-10-13 17:38 kichik * /NSIS/trunk/.github, /NSIS/trunk/.github/workflows, /NSIS/trunk/.github/workflows/build.yml, /NSIS/trunk/.travis.yml, /NSIS/trunk/README.md: switch to github actions 2020-10-08 00:25 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/strlist.cpp: Fixed Unicode compiler crash (bug #1254, patch #300) 2020-08-29 19:30 anders_k * /NSIS/trunk/SConstruct: Never test AppGen.nsi 2020-08-29 17:20 anders_k * /NSIS/trunk/Examples/AppGen.nsi, /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/SConscript: Generate simple application in examples (bug #1252) 2020-08-22 16:24 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Docs/src/history.but: Added nsExec /MBCS switch 2020-08-16 16:19 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: Destroy the header font 2020-08-16 15:50 anders_k * /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Docs/src/history.but: Updated Japanese 2020-08-16 15:37 anders_k * /NSIS/trunk/Contrib/Language files/Corsican.nlf, /NSIS/trunk/Contrib/Language files/Corsican.nsh, /NSIS/trunk/Docs/src/history.but: Updated Corsican (Forum) 2020-08-13 00:49 anders_k * /NSIS/trunk/Source/build.h: Fix the .h as well 2020-08-12 23:32 anders_k * /NSIS/trunk/Source/build.cpp: Fix 64-bit warnings 2020-08-12 23:27 anders_k * /NSIS/trunk/SCons/utils.py: Another Python fix 2020-08-11 23:14 anders_k * /NSIS/trunk/SConstruct: Python equality vs identity fix 2020-08-11 22:52 anders_k * /NSIS/trunk/Source/makenssi.cpp: Postpone leak check so that global destructors can run first 2020-08-10 22:26 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp: Unicode is the now default for i386 2020-08-09 21:07 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi: Draw the header icon background correctly 2020-08-01 23:20 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: Win2000 has a very limited HTML parser, only plain A tags 2020-08-01 02:28 kichik * /NSIS/tags/v3061: Tagging for release 3.06.1 2020-08-01 02:24 kichik * /NSIS/trunk/Menu/images/header.gif: 3.06.1 2020-08-01 02:09 kichik * /NSIS/trunk/Docs/src/history.but: update history 2020-08-01 01:40 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Fixed SetBrandingImage crash 2020-08-01 00:29 anders_k * /NSIS/trunk/Source/manifest.cpp: Fix GCC TtoC conversion 2020-08-01 00:25 kichik * /NSIS/trunk/.travis.yml: don't ignore errors 2020-07-31 23:11 kichik * /NSIS/tags/v306: Tagging for release 3.06 2020-07-31 23:08 kichik * /NSIS/trunk/Menu/images/header.gif: 3.06 2020-07-31 22:53 kichik * /NSIS/trunk/Include/Integration.nsh: fix eol 2020-07-31 22:40 kichik * /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi: fix eol 2020-07-31 21:38 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/manifest.cpp: vc6 build fixes 2020-07-31 21:06 anders_k * /NSIS/trunk/Source/build.cpp: Help VC6 find the type 2020-07-31 20:07 kichik * /NSIS/trunk/Contrib/InstallOptions/testlink.ini, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/NSISMenu.nsi, /NSIS/trunk/Include/Sections.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Menu/index.html, /NSIS/trunk/README.md, /NSIS/trunk/Scripts/release.py: use https 2020-07-31 19:52 kichik * /NSIS/trunk/Docs/src/history.but: update for release 2020-07-25 20:13 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added experimental ManifestAppendCustomString 2020-07-18 23:18 anders_k * /NSIS/trunk/Source/icon.cpp: Fix unaligned memory access (bug #290) 2020-06-29 23:08 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll.dsp, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/nsExec/SConscript, /NSIS/trunk/Contrib/NSISdl/SConscript, /NSIS/trunk/Contrib/UserInfo/SConscript, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/zip2exe/SConscript, /NSIS/trunk/Source/exehead/SConscript: Try to work around the mingw-w64 kernel32:OpenThreadToken library issue 2020-06-28 22:02 anders_k * /NSIS/trunk/Source/exehead/util.h: Don't perform workaround on 98/ME 2020-06-28 21:55 anders_k * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.h: Only perform component list redraw hack on 95/NT4 to avoid flicker 2020-06-27 23:18 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Config/gnu: Don't let GCC 10 generate memmove calls (bug #1248) 2020-06-26 22:52 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp: Primitive SOURCE_DATE_EPOCH support for reproducible builds (patches 294) 2020-06-07 21:05 anders_k * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but: Improved Simplified Chinese translation (Patch 297) 2020-06-06 14:14 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi, /NSIS/trunk/SConstruct: Try harder to generate a usable version string 2020-06-06 13:17 anders_k * /NSIS/trunk/Source/lineparse.cpp: Avoid GCC maybe-uninitialized warning 2020-05-23 19:28 anders_k * /NSIS/trunk/Source/tokens.cpp: Make all preprocessor instructions lower case (patch 287) 2020-05-21 00:44 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/Integration.nsh, /NSIS/trunk/Include/SConscript: Added UnpinShortcut and NotifyShell_AssocChanged macros 2020-05-17 21:37 anders_k * /NSIS/trunk/Docs/src/bin/halibut/halibut.h: GCC -fno-common is now the defaul in GCC 10 (xantares PR for RH/Fedora bug 1799650) 2020-05-17 21:21 anders_k * /NSIS/trunk/Include/WinVer.nsh: WinVer Win10 20H1 detection 2020-05-02 21:53 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp: Added LineParser::gettoken_intx with basic arithmetic expression handling for LoadAndSetImage, SectionSetFlags and SectionSetInstTypes. 2020-05-01 13:15 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: LoadAndSetImage can return the image handle 2020-04-27 12:37 anders_k * /NSIS/trunk/Examples/install-shared.nsi: HKLM, not HKCU 2020-04-27 12:36 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/history.but: Added NSD NetAddress control and Date macros 2020-04-23 18:31 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Include/WinMessages.nsh: Added DatePicker NSD control 2020-04-22 21:37 anders_k * /NSIS/trunk/Contrib/nsDialogs/browse.c: Make sure filter buffer has room for the double terminator 2020-04-22 21:31 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html: Improved nsDialogs::SelectFileDialog filter string format documentation 2020-04-22 21:14 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp: Added !define /intfmt 2020-04-21 19:02 anders_k * /NSIS/trunk/Docs/src/usefulinfos.but: DumpLog example function should not return anything 2020-04-21 18:53 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added MakeNsisW GUID generator command 2020-04-20 17:48 anders_k * /NSIS/trunk/SConstruct: Make sure NSIS_VERSION is not just "v" 2020-04-20 17:21 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/growbuf.h: Added API for compiler host to choose a different output path on output error 2020-04-14 17:37 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but: Updated example functions in the main documentation 2020-04-13 19:16 anders_k * /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi, /NSIS/trunk/Source/exehead/fileform.h: Added a file association example to install-per-user.nsi 2020-04-12 18:25 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: DeleteRegKey /ifempty now also checks for values 2020-04-06 18:04 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/x64.nsh: Added RegKeyIsEmpty LogicLib operator 2020-03-29 20:08 anders_k * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Docs/src/history.but: Updated German (SebStange PR) 2020-03-29 19:10 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Examples/viewhtml.nsi: Removed viewhtml.nsi 2020-03-26 00:19 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Examples/unicode.nsi, /NSIS/trunk/Examples/UserVars.nsi: Updated unicode.nsi and removed UserVars.nsi 2020-03-24 02:35 anders_k * /NSIS/trunk/Contrib/Graphics/SConscript, /NSIS/trunk/Contrib/Modern UI 2/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SConstruct: Python 3 fixes (patch #296) 2020-03-24 02:01 anders_k * /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Docs/src/history.but: * Added MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME * Decoupled the page from MUI * Try FOLDERID_UserProgramFiles 2020-03-18 21:27 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Docs/src/basic.but: Fixed MULTIUSER_INSTALLMODE_FUNCTION and minor typos 2020-03-18 01:01 anders_k * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/install-shared.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/SConscript: Added the install-shared.nsi example 2020-03-17 19:02 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Examples/install-per-user.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/SConscript: Added install-per-user.nsi example 2020-03-12 23:43 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinCore.nsh, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added GetKnownFolderPath 2020-03-10 18:16 anders_k * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added IfRtlLanguage and GetRegView 2020-03-10 01:44 anders_k * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added IfShellVarContextAll and refactored flag instructions generation 2020-03-05 00:07 kichik * /NSIS/trunk/.travis.yml: fix deploy 2020-03-03 19:57 kichik * /NSIS/trunk/Contrib/SubStart/SConscript: fix #1242 - don't install substart on linux 2020-01-02 21:36 anders_k * /NSIS/trunk/.travis.yml: Update travis deploy script 2020-01-01 21:13 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2020 2019-12-29 02:17 anders_k * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/history.but: Added links to more useful headers (Bug #1196) 2019-12-16 03:13 kichik * /NSIS/trunk/.travis.yml: add build.log to nightly zip 2019-12-16 02:47 kichik * /NSIS/trunk/.travis.yml: fix nightly 2019-12-16 01:08 kichik * /NSIS/trunk/Scripts/release.py: nuke old folders so release doesn't fail for no reason 2019-12-16 00:47 kichik * /NSIS/tags/v305: Tagging for release 3.05 2019-12-16 00:44 kichik * /NSIS/trunk/Menu/images/header.gif: 3.05 2019-12-16 00:16 kichik * /NSIS/trunk/Docs/src/history.but: update history 2019-12-14 23:07 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Docs/src/history.but: Fixed nsDialogs CB/LB_Get/SetItemData macros (bug #1238) 2019-12-11 19:10 anders_k * /NSIS/trunk/Contrib/BgImage/SConscript, /NSIS/trunk/Contrib/InstallOptions/SConscript: Set C++ flag on C++ plug-ins (Patch 228) 2019-12-11 18:29 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh: Make VARIANT same size as PROPVARIANT 2019-11-22 00:02 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added SectionInstType as a SectionIn replacement 2019-11-19 16:58 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh: "Type" is PV not V 2019-11-03 16:14 anders_k * /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi: Clarify GetUserName failure on Win9x 2019-10-24 22:15 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Automatically double ampersands in the name attribute 2019-10-24 19:27 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Source/build.cpp: Fix minor GCC warnings 2019-10-23 02:50 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: * Re-use find window * Focus toolbar with F6 * Unicode symbols in usage text 2019-10-21 23:21 anders_k * /NSIS/trunk/Include/WinVer.nsh: Update WinVer Win10 2019-10-16 19:55 anders_k * /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Source/manifest.h: Improved window spy size information and added window outline 2019-10-13 16:49 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added custom log colors and customizable sounds. 2019-10-07 18:01 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c: Fix truncation warning for 64-bit 2019-10-06 16:15 anders_k * /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/SCons/Tools/crossmingw.py, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: Port SCons scripts to py3k (xantares/py3k PR) 2019-10-04 19:54 anders_k * /NSIS/trunk/Docs/src/int.but: Better IntFmt format specification syntax documentation. 2019-09-15 17:10 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c: Help CharNext handle surrogate pairs 2019-09-11 23:36 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Docs/src/history.but: Fixed nsExec Unicode and tab output parsing (bug #1232) 2019-09-06 17:55 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi: Added NSIS menu PE version info 2019-09-04 19:50 anders_k * /NSIS/trunk/Docs/src/attributes.but: Minor docs corrections 2019-09-04 19:39 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh: Added PropVariantChangeType macro 2019-08-22 22:59 anders_k * /NSIS/trunk/Contrib/Language files/Turkish.nlf: Reduced button text length to "Agree" to prevent truncation (Bug #1069) 2019-08-18 22:54 anders_k * /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h: BITMAPCOREHEADER bitmaps cannot be top-down bitmaps 2019-08-18 22:15 anders_k * /NSIS/trunk/Source/growbuf.cpp: Don't display non-fatal growbuf allocation warning 2019-08-17 20:13 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h: VC6 cannot handle class reference initialization in structs 2019-08-17 19:33 kichik * /NSIS/trunk/SConstruct: bug #1218 - build NSIS.exe for dist-zip 2019-08-16 21:43 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh: Added more AppUserModel PKEYs 2019-08-16 19:07 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/style.css, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp: Added the ManifestLongPathAware attribute 2019-08-14 22:28 anders_k * /NSIS/trunk/Docs/src/ui.but: Docs: Clarify that SetDetailsView is for the InstFiles page 2019-08-11 17:12 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh: PROPVARIANT struct is larger on 64-bit 2019-08-04 17:00 anders_k * /NSIS/trunk/Contrib/System/System.html: Updated System plug-in readme 2019-08-03 18:01 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: Added NSD_CreateMLText 2019-08-01 18:06 anders_k * /NSIS/trunk/.travis.yml: Force trusty for all 2019-08-01 17:41 anders_k * /NSIS/trunk/.travis.yml: Force TravisCI linux trusty 2019-07-31 19:59 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/icon.cpp: Zero uninitialized icon group data for reproducible builds (bug #1230) 2019-07-16 14:28 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi, /NSIS/trunk/Menu/index.html: IRC server is gone 2019-06-27 23:22 anders_k * /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Docs/src/history.but: Added quoted path and ordinal System::Call examples. 2019-06-27 00:05 anders_k * /NSIS/trunk/Contrib/Language files/Italian.nlf: Updated Italian translation credits 2019-06-25 20:29 anders_k * /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: Fixed StrFunc parameter order. 2019-06-23 21:32 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: StrFunc.nsh now supports a "using" idiom to help with forward-declaration of functions (bug #1229) 2019-06-16 14:08 anders_k * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h: Allow up to 4 GiB of 3rd-party appended data. 2019-06-06 00:42 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added ManifestMaxVersionTested 2019-05-23 21:58 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: Log window height based on dialog units to fix minimize bug 2019-04-18 21:36 anders_k * /NSIS/trunk/SCons/Tools/crossmingw.py: Auto-detection of 64 bit mingw-w64 on non-windows platforms (Patch #293) 2019-03-17 18:51 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Library.nsh: Fixed InstallLib .NSI space-in-path script bug (bug #1222) 2019-03-13 19:56 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp: %1 in !finalize command can be specified multiple times 2019-03-12 17:15 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi: NSIS Menu Dark mode support 2019-03-11 19:33 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but: Allow quoted library path in System::Call (bug #546) 2019-03-06 19:00 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Include/WinMessages.nsh: Force ANSI RichEdit in nsD example because UTF-16 encoded RTF is not valid 2019-03-04 22:15 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c: Fix WoW64 detection on ARM64 so we can avoid using the CUI helper application 2019-02-15 20:19 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Include/WinMessages.nsh, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/util.cpp: Added NSD_Remove[Ex]Style and NCM_* messages 2019-02-14 23:06 anders_k * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/util.cpp: LR_CREATEDIBSECTION breaks modern.bmp so we must disallow TopDown CheckBitmaps 2019-02-14 22:59 anders_k * /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/ResourceEditor.cpp: Support TopDown CheckBitmap 2019-02-12 00:05 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/makenssi.cpp: Fixed -O double fclose (bug #1221) 2019-02-11 20:32 anders_k * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp: Cast away MAKEINTRESOURCE wchar_t* vs WORD* issue we don't care about 2019-02-11 17:45 anders_k * /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Include/WinVer.nsh: Minor documentation fixes 2019-02-11 16:04 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: ANSI targets are deprecated, force the important examples to use Unicode. 2019-02-10 20:45 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/ResourceEditor.cpp, /NSIS/trunk/Source/Tests/SConscript, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added PEAddResource and PERemoveResource 2019-02-03 20:53 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added LoadAndSetImage instruction 2019-02-02 20:25 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: Print "ANSI targets are deprecated" warning if Unicode/Target attributes are never used. 2019-01-29 23:15 anders_k * /NSIS/trunk/Contrib/Language files/Hindi.nsh, /NSIS/trunk/Docs/src/history.but: Fixed Hindi (patch #291) 2019-01-29 22:11 anders_k * /NSIS/trunk/Include/Win/Propkey.nsh: Added more PropVariant helper macros 2019-01-26 20:34 anders_k * /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/Win/Propkey.nsh: Added IUniformResourceLocator to COM.nsh 2019-01-16 00:14 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but: Docs: Clarify that $outdir is used as a shortcut property and that the path to the .lnk cannot be relative. 2019-01-07 14:30 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2019 2019-01-05 21:26 anders_k * /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Docs/src/history.but: Updated Portuguese (Bug #1219) 2018-12-15 22:14 kichik * /NSIS/tags/v304: Tagging for release 3.04 2018-12-15 22:11 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Scripts/release.py: fix release scons/inst diff 2018-12-15 22:00 kichik * /NSIS/trunk/Menu/images/header.gif: 3.04 2018-12-15 21:59 kichik * /NSIS/trunk/Examples/NSISMenu.nsi: fix eol 2018-12-15 21:57 kichik * /NSIS/trunk/Contrib/Language files/Hindi.nsh: fix eol 2018-12-15 21:48 kichik * /NSIS/trunk/Docs/src/history.but: release date 2018-12-07 22:56 anders_k * /NSIS/trunk/Include/WinVer.nsh: Removed WinVer WaaS diagnostic warning 2018-12-07 22:53 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinVer.nsh: Added WinVer "Windows as a Service" detection macros 2018-12-07 22:06 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/SConstruct: Removed LibraryLocal utility 2018-12-07 21:04 anders_k * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Docs/src/history.but: Fixed MultiUser caption langstring bug (bug #1012) 2018-12-06 23:00 anders_k * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Docs/src/history.but: Minor German translation fixes (bug #1023) 2018-12-06 01:12 anders_k * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp: NSIS_PACKEDVERSION no longer optional. Tries to find a usable fallback value if not specified. 2018-12-03 19:20 anders_k * /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Docs/src/history.but: Updated Belarusian (Bug #1217) 2018-11-30 16:49 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Include/WinVer.nsh: Added WinVer AtLeastBuild and AtMostBuild 2018-11-27 22:36 anders_k * /NSIS/trunk/Contrib/nsDialogs/defs.h, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Source/build.cpp: Use a undocumented variable as the nsDialogs::OnNotify return value so we don't have to worry about restoring it 2018-11-27 22:15 anders_k * /NSIS/trunk/Contrib/nsDialogs/defs.h, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/history.but: nsDialogs::OnNotify can now return values back to Windows, also fixes bug #1216 2018-11-11 22:05 anders_k * /NSIS/trunk/Contrib/Makensisw/afxres.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /nsisweb/trunk/.htaccess, /nsisweb/trunk/mediawiki/extensions/NSISDonate.php, /nsisweb/trunk/mediawiki/LocalSettings.php, /nsisweb/trunk/r/.htaccess: Added MakeNSISW donate link to permalink redirected donate page 2018-11-10 22:31 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi, /nsisweb/trunk/r, /nsisweb/trunk/r/.htaccess: Added permalink redirects for NSIS Menu 2018-11-07 16:58 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp: VC6 cannot handle template class typedef of a template class with the same name (in a different namespace) 2018-11-07 02:39 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Actually remove the problematic type 2018-11-07 02:36 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Old MinGW somehow has the TRIVERTEX struct unprotected but GRADIENT_FILL_* behind WINVER >= 0x0500 and GradientFill behind WINVER >= 0x0410 2018-11-07 01:28 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Moved RichEdit helper function to .cpp 2018-11-07 00:26 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Improved MakeNSISW UI command state handling 2018-11-06 21:04 anders_k * /NSIS/trunk/Contrib/Makensisw/logo.bmp, /NSIS/trunk/Contrib/Makensisw/logo.psp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/makensisw.xml, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/toolbar16d24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar16h24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar16n24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24d.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24d24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24h.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24h24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24n24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar32d24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar32h24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar32n24.bmp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: MakeNSISW is now System DPI aware (16x16, 24x24 and 32x32 toolbar images) 2018-11-04 21:25 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/makensisw.xml, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added About dialog DPI aware support and intro animation 2018-11-02 20:15 anders_k * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/tokens.cpp: Only ignore makensis.nsi test on non-Win32 platforms 2018-11-02 19:51 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/tokens.cpp: !undef now issues warnings instead of errors 2018-11-02 19:16 anders_k * /NSIS/trunk/Examples/NSISMenu.nsi: Added shadow under header text and fixed plug-in links 2018-11-01 23:38 anders_k * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h: POSIX does not have SIZE type but that is OK because we never call that overload 2018-11-01 23:09 anders_k * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h: Moved POSIX dialog unit calcilation function stubs 2018-11-01 22:47 anders_k * /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but: Fix broken MSDN links 2018-11-01 21:33 anders_k * /NSIS/trunk/Docs/style.css: Added HTML documentation code tag font size hack for non-IE browsers 2018-11-01 21:20 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/script.cpp: AddBrandingImage now supports dialog units, even on POSIX 2018-10-31 20:07 anders_k * /NSIS/trunk/Contrib/Library/RegTool/RegTool.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp: Added dummy CRT stubs for VS 2010-15 (bug #1159) 2018-10-30 23:22 anders_k * /NSIS/trunk/SConstruct: Must still ignore makensis.nsi errors on POSIX because of missing MakeNSISW 2018-10-30 23:22 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/version.cpp: Reduce confusion by hiding MakeNSISW version. 2018-10-30 22:33 anders_k * /NSIS/trunk/Contrib/Graphics/Icons/nsis-menu.ico, /NSIS/trunk/Contrib/Graphics/SConscript, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/NSISMenu.nsi, /NSIS/trunk/Examples/SConscript, /NSIS/trunk/SConstruct: Use .nsi NSIS Menu if wxWidgets version is not found. 2018-10-26 20:59 anders_k * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/gfx.nsi: Call WriteUninstaller with full paths 2018-10-25 18:54 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but: Update changelog 2018-10-25 18:40 anders_k * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Source/build.cpp: Make sure the architecture define is always set 2018-10-24 19:01 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Refactored postbuild_cmd and !tempfile handling to help patch #280 2018-10-21 12:28 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h: Dynamically recalculate the toolbar dropdown position 2018-10-18 17:45 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Draw themed size gripper 2018-10-17 01:23 anders_k * /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: 'cause a MinGW party don't stop 2018-10-17 01:13 anders_k * /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: Ain't no party like a MinGW #ifdef party 2018-10-16 20:58 anders_k * /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp, /NSIS/trunk/Source/util.h: Fix MinGW/GCC issues 2018-10-16 16:55 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/wndspy.cpp: Created Window Spy/Info feature 2018-10-13 20:15 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Added more System::Call emulation functions for x64.nsh on ARM[64] 2018-10-13 13:19 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html: Align @ direct register buffer 2018-10-12 20:51 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Include/Win/WinNT.nsh, /NSIS/trunk/Include/x64.nsh: Use Win10 WoW64 API to work around ARM64 lies. 2018-10-08 13:04 anders_k * /NSIS/trunk/Include/LogicLib.nsh: Optimize away LL jump when possible 2018-10-08 12:50 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Include/Library.nsh: Added LIBRARY_INSTALL_EQUAL_VERSION option 2018-09-13 13:35 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Directory.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/License.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Include/Util.nsh: Added MUI_TEXTCOLOR setting. Check/Radio control themes are disabled when high contrast mode is on as a band-aid for SetCtlColors issues. 2018-07-12 15:59 anders_k * /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Include/LangFile.nsh: Minor language file fixes 2018-06-25 21:33 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp: List plug-in directories when plug-in call fails 2018-06-17 21:20 anders_k * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/nsDialogs/Readme.html: Fixed minor documentation typos 2018-06-15 23:12 anders_k * /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/Source/System.c: Use a common helper function to set the CallProc result 2018-06-14 22:13 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/scriptpp.cpp: Stricter !delfile error/warning handling 2018-06-14 20:46 anders_k * /NSIS/trunk/Contrib/Language files/Hindi.nlf, /NSIS/trunk/Contrib/Language files/Hindi.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Added Hindi translation (patch #289) 2018-06-11 19:57 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Better error reporting for GetVersionEx shim on ARM64 2018-06-04 23:10 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Fake GetVersionEx on ARM64 for WinVer.nsh 2018-06-04 14:49 anders_k * /NSIS/trunk/Source/build.cpp: Reset default PEDllCharacteristics when target CPU changes 2018-06-04 14:31 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Fake more System::Call functions under ARM64 2018-06-03 23:53 anders_k * /NSIS/trunk/SCons/Config/ms: Don't store coffgrp LTCG/POGO debug data in VS2015+ release builds 2018-06-03 21:00 anders_k * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Initial groundwork for ARM64 support 2018-06-02 00:38 anders_k * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/util.cpp: throw() is deprecated in C++17 2018-06-01 22:08 anders_k * /NSIS/trunk/Examples/makensis.nsi: Added Publisher ARP value to pass Windows App Certification Kit tests 2018-06-01 17:28 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi: Fixed !macroundef of last defined macro bug 2018-06-01 16:33 anders_k * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Source/Tests/preprocessor.nsi: Added some integer tests 2018-05-31 20:54 anders_k * /NSIS/trunk/Source/Tests/preprocessor.nsi: Test !searchparse and !searchreplace 2018-05-30 21:31 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/Util.nsh: Added MakeARPInstallDate macro to help create the Add/Remove Programs InstallDate property 2018-05-14 19:07 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Preliminary support for disableWindowFiltering and gdiScaling manifest elements 2018-05-03 21:26 anders_k * /NSIS/trunk/Docs/src/basic.but: Changed ExecShell example to show how to use SW_ mode without parameters 2018-04-09 22:23 anders_k * /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Docs/src/history.but: Updated Mongolian 2018-04-09 21:34 anders_k * /NSIS/trunk/Include/x64.nsh: Renamed IsNativeProcessorArchitecture helpers 2018-04-08 21:58 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/x64.nsh: Added IsNativeProcessorArchitecture helper macros to x64.nsh 2018-04-05 21:42 anders_k * /NSIS/trunk/Docs/src/library.but: Document that InstallLib also resets the registry view 2018-03-29 23:36 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: Fixed broken NSD_CB_GetCount command 2018-03-14 19:02 anders_k * /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nsh: Minor fixes for Russian translation (patch #226) 2018-03-14 18:51 anders_k * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh: Cherry-picked a couple of Ukrainian fixes from patch #225 2018-03-13 19:35 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c: Preload NTMARTA.DLL for Windows 7 2018-03-12 22:36 anders_k * /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Docs/src/history.but: Fixed minor Spanish bug (bug #1205) 2018-02-04 21:19 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/tokens.cpp: Fixed bug #1203, -CMDHELP should be printed to stdout 2018-02-01 21:34 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Win/WinNT.nsh, /NSIS/trunk/Include/x64.nsh: Added the GetNativeProcessorArchitecture helper macro in case you really really need to know the true native CPU type 2018-01-31 15:31 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/tokens.cpp: Refactor and document !pragma warning error and warning states 2018-01-30 03:53 kichik * /NSIS/tags/v303: Tagging for release 3.03 2018-01-30 03:52 kichik * /NSIS/trunk/Menu/images/header.gif: 3.03 2018-01-30 03:51 kichik * /NSIS/trunk/Contrib/Language files/Tatar.nsh: need eol 2018-01-30 03:40 kichik * /NSIS/trunk/Contrib/Language files/Tatar.nlf: fix line endings 2018-01-30 03:37 kichik * /NSIS/trunk/Docs/src/history.but: this time for real :) 2018-01-30 00:45 anders_k * /NSIS/trunk/Source/build.h: VC6 can't handle typename here but GCC requires it 2018-01-29 14:42 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/util.cpp: Attempt to fix VC6 2018-01-29 02:46 kichik * /NSIS/trunk/Docs/src/history.but: prepare for release 2018-01-25 18:37 anders_k * /NSIS/trunk/Include/WinVer.nsh: Only include WinVer Win9x code in 32-bit ANSI installers 2018-01-25 17:43 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinVer.nsh: Added WinVer.nsh IsDomainController (patch #286) 2018-01-22 19:08 anders_k * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/Tatar.nlf, /NSIS/trunk/Contrib/Language files/Tatar.nsh, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Added Tatar translation (patch #281) 2018-01-12 02:01 anders_k * /NSIS/trunk/Contrib/nsExec/nsExec.txt: Added required Pop's to nsExec example usage 2018-01-06 17:51 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Fixed "text in struct" bug introduced by a silly typo 2018-01-05 19:10 kichik * /NSIS/trunk/.travis.yml: fix slack 2018-01-05 12:53 anders_k * /NSIS/trunk/Source/exehead/exec.c: Don't allow scripts to delete a HKEY root 2018-01-03 01:44 anders_k * /NSIS/trunk/Contrib/Language files/Afrikaans.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Corsican.nlf, /NSIS/trunk/Contrib/Language files/Esperanto.nlf, /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/Galician.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Irish.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Kurdish.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Pashto.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/ScotsGaelic.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf: Unify branding langstring 2018-01-02 01:51 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2018 2017-12-22 15:33 anders_k * /NSIS/trunk/Include/WinMessages.nsh: Added LVM_GETITEMTEXT to fix the 3rd-party CommCtrl.nsh header 2017-12-18 19:19 anders_k * /NSIS/trunk/Contrib/Language files/ScotsGaelic.nlf: The new Windows 10 guidelines for Scottish Gaelic supposedly say that you must use U+2026 and not dot dot dot 2017-12-18 00:52 anders_k * /NSIS/trunk/Contrib/Language files/ScotsGaelic.nlf, /NSIS/trunk/Contrib/Language files/ScotsGaelic.nsh, /NSIS/trunk/Docs/src/history.but: Updated ScotsGaelic (bug #1197) 2017-12-10 15:44 anders_k * /NSIS/trunk/Contrib/System/System.html: HTML-entify special characters in example code 2017-12-03 18:10 anders_k * /NSIS/trunk/Source/BinInterop.cpp: Fixed silly 64-bit trunction warning 2017-12-03 18:06 anders_k * /NSIS/trunk/Contrib/System/System.html: Don't lock $PluginsDir with SetOutPath even if it is just an example 2017-12-03 18:04 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but: Added experimental System plug-in v2 syntax option 2017-11-30 21:38 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but: Added System plug-in B and H types 2017-11-28 18:15 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/Platform.h: Force HEASLR DllCharacteristics when ASLR bit is set for 64-bit targets 2017-11-16 22:55 anders_k * /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/Pashto.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Fixed rarely used Finnish and Pashto uninstall MUI pages 2017-11-15 18:50 anders_k * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Use additional uninstall pages to catch more translation issues 2017-11-15 18:23 anders_k * /NSIS/trunk/Contrib/Language files/ScotsGaelic.nsh, /NSIS/trunk/Docs/src/history.but: Fixed Scottish Gaelic MUI_UNPAGE_FINISH quote issue (patch #285) 2017-11-05 18:36 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/fileform.cpp: Try to avoid clobbering SysLink GWLP_USERDATA 2017-11-04 17:59 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/tokens.cpp: Added ~, !, && and || !define /math operators 2017-10-30 17:18 anders_k * /NSIS/trunk/Source/boost/scoped_ptr.hpp: A quick hack for our outdated boost library because std::auto_ptr was deprecated in C++11 and removed in C++17 2017-10-29 22:36 anders_k * /NSIS/trunk/SCons/utils.py: Handle case where MSPE.ReadCharacteristics is None 2017-10-26 16:37 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: Only print the PE flags string for actual PE executable files. Now also zeros the checksum just in case. 2017-10-25 23:11 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: Plug-ins now set the ASLR, DEP, LAA and NOSEH flags (bug #1188) 2017-10-24 21:23 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Handle newline when parsing /version 2017-10-24 13:19 anders_k * /NSIS/trunk/Source/util.cpp: Make sure !system outputs whatever is left in the pipe even if there is no newline 2017-10-23 17:55 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/makenssi.cpp: MakeNSIS now returns 0 for various successful information commands (bug #1193) 2017-10-23 16:08 anders_k * /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp: Improved VPatch GenPat error handling 2017-10-21 18:56 anders_k * /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Docs/src/history.but: Updated Italian translation (bug #1194) 2017-10-21 01:41 anders_k * /NSIS/trunk/Source/util.cpp: Cast away pointless warning because A) 0xffffffffUL will fit in a 64-bit off_t, or B) LONG_MAX is used 2017-10-21 01:29 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/util.cpp: Added POSIX mmap helper function used by VxD parser (patch #284) 2017-10-19 14:16 anders_k * /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Support named version resource in VxD files so we can handle MSGame.VxD 2017-10-16 22:08 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: Allow compilation of MUI "applications" that only use custom pages without triggering a helper warning 2017-10-16 12:14 anders_k * /NSIS/trunk/Contrib/System/System.html: Fixed a broken MSDN link in the docs 2017-10-15 16:57 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added Int64Fmt 2017-10-14 16:49 anders_k * /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Util.nsh, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added IntPtrCmp, IntPtrCmpU, Int64Cmp and Int64CmpU 2017-10-13 21:23 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Include/Util.nsh, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added IntPtrOp alias 2017-10-09 17:59 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html: Expand most MUI doc. sections by default 2017-10-09 13:45 anders_k * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Added HTML section anchors 2017-10-08 15:26 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Include/Win/WinDef.nsh, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added IntOp and System::Int64Op >>> SHR operator 2017-10-07 19:16 kichik * /NSIS/trunk/Docs/src/build.but: use same terms for both scons and python 2017-10-07 18:56 anders_k * /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/System.c: Minor 64-bit System fix 2017-10-07 12:37 anders_k * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL: Updated minimum Python version in build docs 2017-10-06 19:30 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms: more 2017-10-06 18:23 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/Source/Tests/icons.py, /NSIS/trunk/Source/Tests/SConscript: support python 3 for building python 2.6 is no longer supported 2017-10-06 17:47 anders_k * /NSIS/trunk/Source/exehead/util.c: Save a couple of bytes by comparing the UTF16LE BOM as a 16-bit number 2017-10-06 14:30 anders_k * /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp: VIAddVersionKey and SetFont now supports hex numbers in the /LANG= parameter 2017-10-06 13:21 anders_k * /NSIS/trunk/Contrib/Library/RegTool/RegTool.cpp, /NSIS/trunk/Source/exehead/Main.c: Optimize away more calls to GetModuleHandle(0) with __ImageBase under MSVC 2017-10-05 18:11 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Avoid using SEEK_END when possible 2017-10-04 23:40 anders_k * /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Refactored GetDLLVersion 2017-10-04 18:20 anders_k * /NSIS/trunk/Source/BinInterop.cpp: Removed optional TLB parser debug output 2017-10-04 12:25 anders_k * /NSIS/trunk/Source/BinInterop.cpp, /NSIS/trunk/Source/BinInterop.h: Added POSIX TLB reader functions 2017-10-03 20:48 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Library.nsi, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added !gettlbversion and TLB reading support on POSIX 2017-09-29 18:56 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Include/WinMessages.nsh: Added more RichEdit NSD macros and a WM_NOTIFY example 2017-09-29 17:41 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/history.but: Removed unused NSD_LB_Clear macro parameter 2017-09-29 14:34 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Include/WinMessages.nsh: Added RichEdit NSD control 2017-09-28 12:11 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinMessages.nsh: Added more NSD editbox macros 2017-09-27 12:34 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html: Simplified initial NSD tutorial steps 2017-09-26 12:01 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Include/WinMessages.nsh: Added UpDown NSD control 2017-09-25 16:37 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: Added more example controls and pages in NSD example.nsi 2017-09-25 11:57 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: Added NSD Prepend/Append CB/LB helper macros 2017-09-18 14:04 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp: Optimize away call to GetModuleHandle(NULL) under MS toolchain 2017-09-17 21:48 anders_k * /NSIS/trunk/Contrib/Language files/Belarusian.nsh: Update Belarusian native ASCII name from BORNAME fork 2017-09-16 17:59 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Include/WinMessages.nsh: Added HotKey and IPAddress NSD controls 2017-09-16 14:01 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinMessages.nsh: Added Animation and TrackBar NSD controls 2017-09-15 17:50 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/history.but: Added more NSD ListBox macros (RFE #543) 2017-09-14 17:10 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added experimental ManifestDPIAwareness attribute so we can declare PerMonitorV2 awareness 2017-09-01 23:06 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi: Added !pragma warning error <#|all>, warning #, disable all, enable all, default all 2017-08-01 00:29 kichik * /NSIS/tags/v3021: Tagging for release 3.02.1 2017-08-01 00:29 kichik * /NSIS/trunk/Menu/images/header.gif: 3.02.1 2017-08-01 00:26 kichik * /NSIS/trunk/Docs/src/history.but: 3.02.1 2017-08-01 00:04 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: include welcome and finish pages to catch more errors 2017-08-01 00:02 kichik * /NSIS/trunk/Contrib/Language files/ScotsGaelic.nsh: escape quotes 2017-07-31 17:44 anders_k * /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Docs/src/history.but: Fix Chinese (Traditional) (Bug #1191) 2017-07-24 21:38 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/scriptpp.cpp: Make sure we always install the "native" RegTool binary. 2017-07-24 11:38 anders_k * /NSIS/trunk/Contrib/Language files/Pashto.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Docs/src/history.but: Fix translation files: Romanian.nsh, TradChinese.nsh (bug #1189) 2017-07-24 06:31 kichik * /NSIS/tags/v302: Tagging for release 3.02 2017-07-24 00:30 kichik * /NSIS/tags/v302: rerelease 3.02 due to another vc6 issue... 2017-07-24 00:28 kichik * /NSIS/trunk/Source/exehead/exec.c: more vc6 weirdness 2017-07-23 23:50 kichik * /NSIS/tags/v302: Tagging for release 3.02 2017-07-23 23:48 kichik * /NSIS/trunk/Menu/images/header.gif: 3.02 2017-07-23 23:45 kichik * /NSIS/trunk/Examples/makensis.nsi: fix regtool path 2017-07-23 23:38 kichik * /NSIS/trunk/Docs/src/SConscript: improve hhc workaround 2017-07-23 19:53 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: vc6 build errors 2017-07-23 19:11 kichik * /NSIS/trunk/Docs/src/history.but: 3.02 2017-07-17 21:44 anders_k * /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Source/tokens.cpp: Minor documentation fixes 2017-06-24 19:28 anders_k * /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/usefulinfos.but: Removed outdated tidbits from the documentation 2017-06-23 12:59 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/exec.c: Logging build now prints EW_SETFLAG changes 2017-06-23 01:11 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/manifest.cpp: $LocalAppData now resolves to the ProgramData folder in the "SetShellVarContext all" context 2017-06-19 22:01 anders_k * /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Docs/src/flowcontrol.but: Minor Czech translation fix from the forum 2017-06-15 18:58 anders_k * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Docs/src/var.but: Display English and German in LangDLL if the codepage is 1250 (Bug #1185) 2017-06-07 21:51 anders_k * /NSIS/trunk/Contrib/Language files/SimpChinese.nsh: Fixed minor error in SimpChinese.nsh (Patch #283) 2017-06-06 19:51 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added the HKCR32, HKCR64, HKCU32, HKCU64, HKLM32 and HKLM64 root keys and the experimental HK*ANY root keys. 2017-06-06 02:03 anders_k * /NSIS/branches/nsis2/Contrib/AdvSplash/advsplash.txt, /NSIS/branches/nsis2/Contrib/ExDLL/exdll.c, /NSIS/branches/nsis2/Contrib/InstallOptions/Readme.html, /NSIS/branches/nsis2/Contrib/InstallOptions/test.ini, /NSIS/branches/nsis2/Contrib/InstallOptions/testnotify.ini, /NSIS/branches/nsis2/Contrib/Language files/Afrikaans.nlf, /NSIS/branches/nsis2/Contrib/Language files/Albanian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Arabic.nlf, /NSIS/branches/nsis2/Contrib/Language files/Arabic.nsh, /NSIS/branches/nsis2/Contrib/Language files/Basque.nlf, /NSIS/branches/nsis2/Contrib/Language files/Basque.nsh, /NSIS/branches/nsis2/Contrib/Language files/Belarusian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Bosnian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Breton.nlf, /NSIS/branches/nsis2/Contrib/Language files/Bulgarian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Catalan.nlf, /NSIS/branches/nsis2/Contrib/Language files/Croatian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Czech.nlf, /NSIS/branches/nsis2/Contrib/Language files/Danish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Danish.nsh, /NSIS/branches/nsis2/Contrib/Language files/Dutch.nlf, /NSIS/branches/nsis2/Contrib/Language files/English.nlf, /NSIS/branches/nsis2/Contrib/Language files/Esperanto.nlf, /NSIS/branches/nsis2/Contrib/Language files/Estonian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Farsi.nlf, /NSIS/branches/nsis2/Contrib/Language files/Finnish.nlf, /NSIS/branches/nsis2/Contrib/Language files/French.nlf, /NSIS/branches/nsis2/Contrib/Language files/Galician.nlf, /NSIS/branches/nsis2/Contrib/Language files/German.nlf, /NSIS/branches/nsis2/Contrib/Language files/Greek.nlf, /NSIS/branches/nsis2/Contrib/Language files/Hebrew.nlf, /NSIS/branches/nsis2/Contrib/Language files/Hungarian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Icelandic.nlf, /NSIS/branches/nsis2/Contrib/Language files/Indonesian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Irish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Italian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Japanese.nlf, /NSIS/branches/nsis2/Contrib/Language files/Korean.nlf, /NSIS/branches/nsis2/Contrib/Language files/Kurdish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Latvian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Lithuanian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Luxembourgish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Macedonian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Malay.nlf, /NSIS/branches/nsis2/Contrib/Language files/Mongolian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Norwegian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Norwegian.nsh, /NSIS/branches/nsis2/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/branches/nsis2/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/branches/nsis2/Contrib/Language files/Polish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Portuguese.nlf, /NSIS/branches/nsis2/Contrib/Language files/Portuguese.nsh, /NSIS/branches/nsis2/Contrib/Language files/PortugueseBR.nlf, /NSIS/branches/nsis2/Contrib/Language files/PortugueseBR.nsh, /NSIS/branches/nsis2/Contrib/Language files/Romanian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Russian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Serbian.nlf, /NSIS/branches/nsis2/Contrib/Language files/SerbianLatin.nlf, /NSIS/branches/nsis2/Contrib/Language files/SimpChinese.nlf, /NSIS/branches/nsis2/Contrib/Language files/Slovak.nlf, /NSIS/branches/nsis2/Contrib/Language files/Slovenian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Spanish.nlf, /NSIS/branches/nsis2/Contrib/Language files/SpanishInternational.nlf, /NSIS/branches/nsis2/Contrib/Language files/Swedish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Swedish.nsh, /NSIS/branches/nsis2/Contrib/Language files/Thai.nlf, /NSIS/branches/nsis2/Contrib/Language files/TradChinese.nlf, /NSIS/branches/nsis2/Contrib/Language files/Turkish.nlf, /NSIS/branches/nsis2/Contrib/Language files/Ukrainian.nlf, /NSIS/branches/nsis2/Contrib/Language files/Ukrainian.nsh, /NSIS/branches/nsis2/Contrib/Language files/Uzbek.nlf, /NSIS/branches/nsis2/Contrib/Language files/Welsh.nlf, /NSIS/branches/nsis2/Contrib/Math/Math.txt, /NSIS/branches/nsis2/Contrib/Modern UI 2/Localization.nsh, /NSIS/branches/nsis2/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh, /NSIS/branches/nsis2/Contrib/Modern UI/System.nsh, /NSIS/branches/nsis2/Contrib/MultiUser/MultiUser.nsh, /NSIS/branches/nsis2/Contrib/MultiUser/Readme.html, /NSIS/branches/nsis2/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/branches/nsis2/Contrib/NSIS Menu/SConscript, /NSIS/branches/nsis2/Contrib/NSISdl/ReadMe.txt, /NSIS/branches/nsis2/Contrib/NSISdl/SConscript, /NSIS/branches/nsis2/Contrib/Splash/splash.txt, /NSIS/branches/nsis2/Contrib/StartMenu/Example.nsi, /NSIS/branches/nsis2/Contrib/System/System.html, /NSIS/branches/nsis2/Contrib/zip2exe/main.cpp, /NSIS/branches/nsis2/Contrib/zip2exe/res.rc, /NSIS/branches/nsis2/Docs/src/attributes.but, /NSIS/branches/nsis2/Docs/src/basic.but, /NSIS/branches/nsis2/Docs/src/callback.but, /NSIS/branches/nsis2/Docs/src/compiler.but, /NSIS/branches/nsis2/Docs/src/credits.but, /NSIS/branches/nsis2/Docs/src/generalpurpose.but, /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Docs/src/langs.but, /NSIS/branches/nsis2/Docs/src/misc.but, /NSIS/branches/nsis2/Docs/src/script.but, /NSIS/branches/nsis2/Docs/src/tutorial.but, /NSIS/branches/nsis2/Docs/src/var.but, /NSIS/branches/nsis2/Examples/bigtest.nsi, /NSIS/branches/nsis2/Examples/example2.nsi, /NSIS/branches/nsis2/Examples/makensis.nsi, /NSIS/branches/nsis2/Examples/Modern UI/StartMenu.nsi, /NSIS/branches/nsis2/Include/LogicLib.nsh, /NSIS/branches/nsis2/Include/StrFunc.nsh, /NSIS/branches/nsis2/Include/UpgradeDLL.nsh, /NSIS/branches/nsis2/SCons/config.py, /NSIS/branches/nsis2/SCons/Config/gnu, /NSIS/branches/nsis2/SCons/Tools/crossmingw.py, /NSIS/branches/nsis2/Scripts/release.py, /NSIS/branches/nsis2/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/branches/nsis2/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/branches/nsis2/Source/exehead/api.h, /NSIS/branches/nsis2/Source/exehead/exec.c, /NSIS/branches/nsis2/Source/exehead/fileform.c, /NSIS/branches/nsis2/Source/exehead/fileform.h, /NSIS/branches/nsis2/Source/exehead/Main.c, /NSIS/branches/nsis2/Source/exehead/Ui.c, /NSIS/branches/nsis2/Source/exehead/util.c, /NSIS/branches/nsis2/Source/lang.cpp, /NSIS/branches/nsis2/Source/makenssi.cpp, /NSIS/branches/nsis2/Source/script.cpp, /NSIS/branches/nsis2/Source/Tests/compression.cpp, /NSIS/branches/nsis2/Source/tokens.cpp, /NSIS/branches/nsis2/Source/tokens.h, /NSIS/branches/nsis2/Source/util.cpp, /NSIS/branches/nsis2/Source/util.h, /NSIS/branches/nsis2/Source/zlib/ZUTIL.H, /NSIS/branches/nsis2/TODO.txt: Backported some bugfixes from NSIS 3 2017-06-05 21:43 anders_k * /NSIS/trunk/Source/exehead/util.c: Bring back optimized mystrcpy(tmpbuf, _T("NUL")) from NSIS2 2017-06-05 20:20 anders_k * /NSIS/trunk/Contrib/Language files/Afrikaans.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Asturian.nlf, /NSIS/trunk/Contrib/Language files/Basque.nlf, /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Language files/Bosnian.nlf, /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Cibemba.nlf, /NSIS/trunk/Contrib/Language files/Corsican.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Efik.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Esperanto.nlf, /NSIS/trunk/Contrib/Language files/Estonian.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/Galician.nlf, /NSIS/trunk/Contrib/Language files/Georgian.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Language files/Igbo.nlf, /NSIS/trunk/Contrib/Language files/Indonesian.nlf, /NSIS/trunk/Contrib/Language files/Irish.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Khmer.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Kurdish.nlf, /NSIS/trunk/Contrib/Language files/Latvian.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Luxembourgish.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Malagasy.nlf, /NSIS/trunk/Contrib/Language files/Malay.nlf, /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/trunk/Contrib/Language files/Pashto.nlf, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/ScotsGaelic.nlf, /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/SpanishInternational.nlf, /NSIS/trunk/Contrib/Language files/Swahili.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Language files/Vietnamese.nlf, /NSIS/trunk/Contrib/Language files/Welsh.nlf, /NSIS/trunk/Contrib/Language files/Yoruba.nlf, /NSIS/trunk/Source/lang.cpp: Add space between disk space value and unit (Bug #1132) 2017-06-05 01:01 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Don't use ShellExecute, only ShellExecuteEx 2017-06-05 00:34 kichik * /NSIS/trunk/README.md: add readme with build status partly https://github.com/kichik/nsis/pull/1 2017-06-04 22:48 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Unsupported SetRegView mode must fail all registry operations 2017-06-03 02:56 anders_k * /NSIS/trunk/.travis.yml, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp, /web-scripts/trunk/cppunit.rb: TravisCI OSX instance needs cppunit v1.13.2 2017-05-29 16:25 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added WriteRegNone 2017-05-29 13:12 anders_k * /NSIS/trunk/Source/script.cpp: SendMessage /TIMEOUT= parameter should not be case-sensitive. 2017-05-27 01:21 anders_k * /NSIS/trunk/Include/Win/COM.nsh: Added IGameExplorer to COM.nsh 2017-05-22 18:10 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: Variables used in Caption can now be set in .onGuiInit (RFE #539) 2017-05-14 16:16 anders_k * /NSIS/trunk/Contrib/Library/RegTool/RegTool.cpp, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/util.h: Include CPU architecture in the RegTool filename so Library.nsh always picks the correct version 2017-05-12 00:19 anders_k * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Library/RegTool/RegTool.cpp, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh: TCHAR cannot be used in RegTool because it must be able to run on Win9x. RegTool now implements A and W functions in the same binary. Bitness mixing is still problematic. 2017-05-03 22:31 kichik * /NSIS/trunk/.travis.yml: notify slack 2017-05-03 21:17 anders_k * /NSIS/trunk/Include/UpgradeDLL.nsh: UpgradeDLL needs to use the correct RegTool version key 2017-05-03 12:08 anders_k * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/scriptpp.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Refactored preprocessor instructions to separate source file 2017-04-26 19:40 kichik * /NSIS/trunk/.travis.yml: build osx on travis 2017-04-25 13:58 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: Use a internal command to detect the CHM header because the !searchparse hack fails with a encoding error if the ACP codepage is 936. 2017-04-25 13:09 anders_k * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/timer.nsi, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added !pragma warning (patch #267) 2017-04-18 19:21 kichik * /NSIS/trunk/Source/exehead/exec.c: log build fix for anders 2017-04-18 08:20 kichik * /NSIS/trunk/.travis.yml: test log build 2017-04-14 21:48 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/zlib/ZUTIL.H: Fixed two GCC POSIX warnings 2017-04-14 14:17 anders_k * /NSIS/trunk/Contrib/Language files/Afrikaans.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Armenian.nlf, /NSIS/trunk/Contrib/Language files/Asturian.nlf, /NSIS/trunk/Contrib/Language files/Basque.nlf, /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Language files/Bosnian.nlf, /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Cibemba.nlf, /NSIS/trunk/Contrib/Language files/Corsican.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Efik.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Esperanto.nlf, /NSIS/trunk/Contrib/Language files/Estonian.nlf, /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/Galician.nlf, /NSIS/trunk/Contrib/Language files/Georgian.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Language files/Igbo.nlf, /NSIS/trunk/Contrib/Language files/Indonesian.nlf, /NSIS/trunk/Contrib/Language files/Irish.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Khmer.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Kurdish.nlf, /NSIS/trunk/Contrib/Language files/Latvian.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Luxembourgish.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Malagasy.nlf, /NSIS/trunk/Contrib/Language files/Malay.nlf, /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/trunk/Contrib/Language files/Pashto.nlf, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/ScotsGaelic.nlf, /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/SpanishInternational.nlf, /NSIS/trunk/Contrib/Language files/Swahili.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Language files/Uzbek.nlf, /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Language files/Vietnamese.nlf, /NSIS/trunk/Contrib/Language files/Welsh.nlf, /NSIS/trunk/Contrib/Language files/Yoruba.nlf, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Default language file codepage is only ASCII compatible (Bug #1180) 2017-04-13 21:00 kichik * /NSIS/trunk/.travis.yml: drone.io is dead so use travis-ci.org instead 2017-04-13 14:42 anders_k * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.h: Fix POSIX error 2017-04-06 18:07 anders_k * /NSIS/trunk/Contrib/Language files/Indonesian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but: Chinese (Traditional) updates by Walter Cheuk (Forum) 2017-04-03 17:35 anders_k * /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/fileform.h: Added MUI_PAGE_CUSTOMFUNCTION_DESTROYED so custom image handles can be cleaned up 2017-03-22 15:05 anders_k * /NSIS/trunk/Examples/makensis.nsi: Fix MUI dependencies check when Languages or Graphics are not installed 2017-03-22 00:46 anders_k * /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Fixed SetRegView and $ProgramFiles[32|64] in 64-bit installers 2017-03-21 22:12 anders_k * /NSIS/trunk/Include/WinVer.nsh: WinVer server 2016 support (patch #282) 2017-03-21 22:04 anders_k * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added ExecShellWait 2017-01-30 20:04 anders_k * /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: Added note about not supporting HTTPS in NSISdl 2017-01-28 18:49 anders_k * /NSIS/trunk/Docs/src/basic.but: Added note about /REBOOTOK not working without admin. rights for bug #1174 2017-01-20 21:15 anders_k * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Source/exehead/Main.c: Fixed unbalanced push/pop in MUI_UNGETLANGUAGE (MUI v1) 2017-01-15 15:20 anders_k * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Docs/src/history.but: Unicode nsExec now supports the /OEM switch (bug #1171) 2017-01-02 03:51 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2017 2016-12-30 00:52 anders_k * /NSIS/trunk/Docs/src/basic.but: Minor documentation fix (bug #919) 2016-12-30 00:39 anders_k * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: Taller MULTIUSER_INSTALLMODEPAGE_TEXT_TOP label (bug #916) 2016-12-30 00:00 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Docs/src/history.but: Added support for MUI_UNCONFIRMPAGE_VARIABLE (RFE #511) 2016-12-29 22:11 anders_k * /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Docs/src/history.but: Minor French improvements (patch #221) 2016-12-29 21:59 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added basic WriteRegMultiStr support (RFE #382, patch #219) 2016-12-29 19:25 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp: Fixed minor 64-bit warnings (Bug #1170) 2016-12-26 23:52 anders_k * /NSIS/trunk/Contrib/System/System.html: Minor documentation fix (Patch #231) 2016-12-26 23:48 anders_k * /NSIS/trunk/Contrib/Language files/Basque.nsh: Added MultiUser text from patch #246. Still undecided if we should merge the rest of the patch... 2016-12-26 23:23 anders_k * /NSIS/trunk/Docs/src/langs.but: Add link to translations forum (Bug #1167) 2016-12-26 23:01 anders_k * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/history.but: MultiUser now supports $ProgramFiles64 (Bug #843) 2016-12-11 21:47 kichik * /NSIS/tags/v301: Tagging for release 3.01 2016-12-11 21:46 kichik * /NSIS/trunk/Scripts/release.py: print all bad eols 2016-12-11 21:46 kichik * /NSIS/trunk/Menu/images/header.gif: 3.01 2016-12-11 21:45 kichik * /NSIS/trunk/Contrib/Language files/Corsican.nsh: fix eol 2016-12-11 21:27 kichik * /NSIS/trunk/Docs/src/history.but: update history for 3.01 2016-12-11 21:01 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/zip2exe/main.cpp: Fixed some minor GCC warnings 2016-12-10 17:04 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/MakeLangId/resource.rc: * Double-click to copy on Vista+ * Don't include \0 in count from GetLocaleInfo 2016-12-10 01:52 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.ico, /NSIS/trunk/Contrib/MakeLangId/resource.h, /NSIS/trunk/Contrib/MakeLangId/resource.rc: MakeLangId rewritten from scratch to support EnumSystemLocales and our internal list 2016-12-05 22:52 kichik * /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/header-notext.gif, /NSIS/trunk/Menu/images/site.gif: new menu icons 2016-12-05 20:34 kichik * /NSIS/trunk/Examples/makensis.nsi: use right uninstall icon 2016-12-05 20:30 kichik * /NSIS/trunk/Contrib/Graphics/SConscript: install new icons 2016-12-05 19:40 anders_k * /NSIS/trunk/Contrib/Makensisw/assoc_nsh.ico, /NSIS/trunk/Contrib/Makensisw/assoc_nsi.ico, /NSIS/trunk/Contrib/Makensisw/icon.ico, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsisicon.ico: * Tweaked filetype icons * MS resource compiler <= VS 2005 does not like PNG compressed icons 2016-12-05 15:44 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Fixed bug #1122 StrCpy maxlen inconsistent behavior 2016-12-04 17:15 anders_k * /NSIS/trunk/Docs/src/build.but: Added final dash in XGCC_W32_PREFIX documentation description. 2016-12-03 22:06 kichik * /NSIS/trunk/Contrib/Graphics/Header/nsis3-branding.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-branding-r.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-grey.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-grey-right.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-metro.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-metro-right.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-vintage.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis3-vintage-right.bmp, /NSIS/trunk/Contrib/Graphics/Icons/nsis3-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/nsis3-install-alt.ico, /NSIS/trunk/Contrib/Graphics/Icons/nsis3-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Wizard/nsis3-branding.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nsis3-grey.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nsis3-metro.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nsis3-vintage.bmp, /NSIS/trunk/Contrib/Makensisw/assoc_nsh.ico, /NSIS/trunk/Contrib/Makensisw/assoc_nsi.ico, /NSIS/trunk/Contrib/Makensisw/icon.ico, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsisicon.ico, /NSIS/trunk/Examples/makensis.nsi: new graphics by idleberg 2016-12-03 00:21 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/MakeLangId/resource.h, /NSIS/trunk/Contrib/MakeLangId/resource.rc: * MakeLangId will now display the codepage if Windows supports the specified langid. * Added more languages. 2016-12-02 19:58 anders_k * /NSIS/trunk/Source/utf.cpp: Make sure tstring can store wchar_t. This currently blocks anyone from writing unit tests for strlist.cpp because the tests are not Unicode yet! 2016-12-02 19:19 anders_k * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Docs/src/history.but: Updated Danish translation (bug #1164) 2016-11-25 21:35 anders_k * /NSIS/trunk/Source/Tests/compression.cpp: A more aggressive workaround for bug #1156 2016-11-23 17:10 anders_k * /NSIS/trunk/Source/Tests/compression.cpp: Temporary workaround for bug #1156 2016-11-23 15:42 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/textrunner.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Unify g_output and console initialization 2016-11-23 00:38 anders_k * /NSIS/trunk/Source/build.h: Allow POSIX to see QUERYHOST constants even though there is no way to use them on those platforms 2016-11-22 23:11 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Use a common helper macro to declare some UI output related variables 2016-11-22 21:21 anders_k * /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Docs/src/history.but: Norwegian MultiUser fixes (patch #279) 2016-11-22 21:17 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Write error messages to stderr by default Disabled if -O is used or if -NOTIFYHWND is valid and returns 0 to QUERYHOST:QH_ENABLESTDERR 2016-10-22 18:19 anders_k * /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Docs/src/history.but: Arabic MultiUser fixes (#278) 2016-10-22 18:16 anders_k * /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Docs/src/history.but: Swedish MultiUser fixes (patch #277) 2016-10-22 18:12 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/script.cpp: Added SetCtlColors Windows COLOR_* constants support 2016-10-12 21:08 anders_k * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Docs/src/history.but: Updates to Brazilian Portuguese translation (Patch #276) 2016-10-12 19:31 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: Undo Lockwindow Off fix from [r6789] because it caused the taskbar button to become invisible! 2016-10-12 17:20 anders_k * /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Docs/src/history.but: Ukrainian MultiUser fixes 2016-10-11 23:52 anders_k * /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Docs/src/history.but: Portuguese fixes (patch #274) 2016-10-11 19:58 anders_k * /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Source/exehead/Ui.c: Fixed broken MSDN URLs 2016-10-11 19:47 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: LockWindow Off should always enable painting 2016-10-11 19:36 anders_k * /NSIS/trunk/Docs/src/credits.but: Tooting my own horn 2016-10-09 22:23 kichik * /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/registry.but: bug #1153 - better doc location for SetRegView 2016-10-08 13:48 anders_k * /NSIS/trunk/Contrib/Language files/Corsican.nlf, /NSIS/trunk/Contrib/Language files/Corsican.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Source/makenssi.cpp: Added Corsican translation (patch #268) 2016-10-06 20:31 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh: Added MUI_LANGUAGEEX macro so language files in other folders can be used (during testing) 2016-09-30 23:32 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: more mingw versions https://github.com/kichik/nsis/pull/5/ 2016-09-06 18:48 f0rt * /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/winchar.cpp: Make WinWStrDupFromWC endian agnostic (Patch #273) 2016-08-22 19:22 f0rt * /NSIS/trunk/SCons/Config/gnu: Make plugins not depend on libstdc++-6.dll (Patch #272) 2016-08-21 12:00 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/winchar.cpp: Fixed possible buffer overflow bug in unused WinWStrDupFromChar function (Patch #271) 2016-07-25 01:26 kichik * /NSIS/trunk/Docs/src/SConscript: i'm not sure why the previous fix fails only on linux, but here is another attempt... 2016-07-25 01:09 kichik * /NSIS/trunk/Docs/src/SConscript: fix missing style.css for html docs 2016-07-25 00:52 kichik * /NSIS/tags/v30: Tagging for release 3.0 2016-07-25 00:49 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0 2016-07-25 00:47 kichik * /NSIS/trunk/Docs/src/history.but: 3.0 release notes 2016-07-16 12:58 anders_k * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp: Attempt to work around wxWidgets CustomLinks/Links incompatibility 2016-07-16 12:47 anders_k * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Docs/src/history.but: PortugueseBR fixes (bug #1149) 2016-07-14 10:53 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added support for !finalize return value comparison 2016-07-09 15:42 anders_k * /NSIS/trunk/Docs/src/credits.but: Fixed some Unicode characters in the credits 2016-07-09 04:34 kichik * /NSIS/trunk/Docs/src/history.but: oops got date wrong 2016-07-09 04:09 kichik * /NSIS/tags/v30rc2: Tagging for release 3.0rc2 2016-07-09 04:08 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0rc2 2016-07-09 04:07 kichik * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp: #1144 fix windows build 2016-07-09 03:37 kichik * /NSIS/trunk/Docs/src/history.but: prepare changelog for 3.0rc2 2016-07-06 11:28 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Disable batch-file workaround for !makensis command 2016-07-04 12:23 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp: Fixed bug #1147: !makensis command must force Unicode output to be UTF-8 2016-06-28 16:56 anders_k * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Docs/src/history.but: PortugueseBR fixes by deguix 2016-06-26 15:32 anders_k * /NSIS/trunk/Source/exehead/Ui.c: cchTextMax is count of TCHARs including \0 2016-06-26 13:39 anders_k * /NSIS/trunk/Contrib/System/System.html: DocFix: System::Call/Get have been available when compiling with GCC for a very long time. 2016-06-26 13:36 anders_k * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Menu/index.html, /NSIS/trunk/SConstruct: NSIS Menu POSIX fixes (bug #1144) 2016-06-18 20:59 anders_k * /NSIS/trunk/Include/WinVer.nsh: Changed the VER_NT_WORKSTATION comparison check to match the MSDN recommendation 2016-06-12 13:16 anders_k * /NSIS/branches/nsis2/Source/util.h: include in util.h (Bug #1146) 2016-06-12 00:09 anders_k * /NSIS/trunk/Contrib/NSIS Menu/SConscript: Must distribute notinstalled.html 2016-06-07 18:51 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh: Added LogicLib & operator 2016-05-25 18:08 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/api.h: Updated changelog and fixed a typo 2016-05-23 23:52 anders_k * /NSIS/trunk/Include/LogicLib.nsh: Hopefully fixed reported issue where the LogicLib EndSelectLabel is not found when using ${Case2} in nested ${Select}s 2016-05-08 08:51 anders_k * /NSIS/trunk/Contrib/Makensisw/icon.ico, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsisicon.ico: Added 128x128 image to the NSIS Menu icon Changed the 32x32x16 and 16x16x16 images to look like the standard round NSIS logo Tweaked the 48x48 images 2016-04-22 13:46 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Docs/src/history.but: Bumped zip2exe version and linked to bugreport in history 2016-04-21 23:01 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Docs/src/history.but: Zip2Exe aborts if the zip file is encrypted 2016-04-12 14:36 anders_k * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Docs/src/history.but: Minor tweaks to Danish.nlf (bug #1140) 2016-04-04 21:06 anders_k * /NSIS/branches/nsis2/SCons/Config/gnu: Fixed bug #1139: Broken defenv['STDCALL'] value * MinGW (GCC 4.5.2, GNU Binutils 2.24) cannot handle a space in the value, windres preprocessing will fail * POSIX GCC needs the space (Bug #1139) Backported doubled quotes trick from trunk 2016-04-03 20:29 kichik * /NSIS/trunk/Scripts/release.py: automate uploading 2016-04-03 20:16 kichik * /NSIS/tags/v30rc1: Tagging for release 3.0rc1 2016-04-03 20:13 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0rc1 2016-04-03 20:12 kichik * /NSIS/trunk/Docs/src/history.but: move to major 2016-04-03 05:56 kichik * /NSIS/trunk/Docs/src/history.but: update for 3.0rc1 2016-04-03 05:47 kichik * /NSIS/trunk/Source/utf.cpp: fix !appendfile writing null bytes on linux and breaking LogicLib ${Switch} statements 2016-04-02 03:17 kichik * /NSIS/tags/v251: Tagging for release 2.51 2016-04-02 03:16 kichik * /NSIS/branches/nsis2/Menu/images/header.gif: 2.51 2016-04-02 03:10 kichik * /NSIS/branches/nsis2/Docs/src/history.but: updated history.but for release of 2.51 2016-04-01 20:17 anders_k * /NSIS/trunk/Contrib/nsDialogs/browse.c: popstringn takes a character count, not a byte size as the max length! 2016-04-01 17:39 anders_k * /NSIS/trunk/Examples/makensis.nsi: Only install the stubs and plugins of the same bitness as us for now until we can get SCons to actually build both 2016-03-28 16:54 anders_k * /NSIS/branches/nsis2/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/nsis2/Docs/src/attributes.but, /NSIS/branches/nsis2/Docs/src/basic.but, /NSIS/branches/nsis2/Docs/src/build.but, /NSIS/branches/nsis2/Docs/src/callback.but, /NSIS/branches/nsis2/Docs/src/compiler.but, /NSIS/branches/nsis2/Docs/src/compilerflags.but, /NSIS/branches/nsis2/Docs/src/file.but, /NSIS/branches/nsis2/Docs/src/flowcontrol.but, /NSIS/branches/nsis2/Docs/src/generalpurpose.but, /NSIS/branches/nsis2/Docs/src/headers.but, /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Docs/src/intro.but, /NSIS/branches/nsis2/Docs/src/labels.but, /NSIS/branches/nsis2/Docs/src/langs.but, /NSIS/branches/nsis2/Docs/src/library.but, /NSIS/branches/nsis2/Docs/src/log.but, /NSIS/branches/nsis2/Docs/src/registry.but, /NSIS/branches/nsis2/Docs/src/script.but, /NSIS/branches/nsis2/Docs/src/sec.but, /NSIS/branches/nsis2/Docs/src/sections.but, /NSIS/branches/nsis2/Docs/src/stack.but, /NSIS/branches/nsis2/Docs/src/string.but, /NSIS/branches/nsis2/Docs/src/tutorial.but, /NSIS/branches/nsis2/Docs/src/ui.but, /NSIS/branches/nsis2/Docs/src/usage.but, /NSIS/branches/nsis2/Docs/src/usefulfunc.but, /NSIS/branches/nsis2/Docs/src/usefulinfos.but, /NSIS/branches/nsis2/Docs/src/var.but, /NSIS/branches/nsis2/Source/tokens.cpp: Backported some documentation fixes from [r6728] 2016-03-28 05:52 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp: no need for conversions here 2016-03-27 23:24 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/jumps.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/modernui.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/silent.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/TODO.txt: Documentation fixes and clarifications 2016-03-23 22:55 anders_k * /NSIS/trunk/Source/exehead/Ui.c: WM_CONTEXTMENU lParam keyboard check needs to be sign extended on 64-bit 2016-03-23 13:50 anders_k * /NSIS/branches/nsis2/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/noclib.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/noclib.h: Backported [r6725] MakeNSISW should not load libraries from the current directory because we don't control that directory when started from the shell (file associations). 2016-03-23 13:42 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: MakeNSISW should not load libraries from the current directory because we don't control that directory when started from the shell (file associations). 2016-03-22 13:21 anders_k * /NSIS/trunk/Source/script.cpp: Separate error messages for plugin dll not found and plugin function not found 2016-03-17 21:36 anders_k * /NSIS/branches/nsis2/Source/build.cpp: Backported [6722] Must use a POSIX compatible string comparison 2016-03-17 21:36 anders_k * /NSIS/trunk/Source/build.cpp: Must use a POSIX compatible string comparison 2016-03-11 19:32 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c: Changed the name of the uninstaller created in %TEMP%\\~nsu.tmp from %UNIQUE%u_.exe to Un_%UNIQUE%.exe 2016-03-11 19:16 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: Copyright 2016 2016-03-09 22:58 anders_k * /NSIS/branches/nsis2/Contrib/VPatch/Readme.html, /NSIS/branches/nsis2/Include/LogicLib.nsh, /NSIS/branches/nsis2/Source/build.cpp, /NSIS/branches/nsis2/Source/exehead/Main.c, /NSIS/branches/nsis2/Source/lang.cpp: Backported some security fixes from trunk [r6706] Delayload CLBCATQ for XP [r6708] Warn when the output filename is setup.exe because Windows will unsafely load compatibility shims [r6718] Display the correct uninstaller langstring name in the recursive error string 2016-03-09 22:33 anders_k * /NSIS/trunk/Source/lang.cpp: Display the correct uninstaller langstring name in the recursive error string 2016-03-09 19:26 anders_k * /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/Util.nsh: ${Int64CmpU} in Util.nsh cannot use LogicLib because the LogicLib Z operators calls ${Int64CmpU} on 64-bit systems 2016-03-09 12:50 anders_k * /NSIS/trunk/Docs/src/compiler.but: Document ${NSIS_CHAR_SIZE} and ${NSIS_PTR_SIZE} 2016-03-08 03:05 anders_k * /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Include/Win/WinDef.nsh: Minor documentation tweaks 2016-03-07 14:37 anders_k * /NSIS/branches/nsis2/Contrib/Makensisw/makensisw.h, /NSIS/branches/nsis2/Contrib/System/Source/Buffers.c, /NSIS/branches/nsis2/Contrib/System/Source/System.c, /NSIS/branches/nsis2/Contrib/System/System.html, /NSIS/branches/nsis2/Include/LogicLib.nsh: Backported support for system 'p' type and logiclib P and Z tests 2016-03-07 14:34 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Include/LogicLib.nsh: Incomplete support for Z (size_t) logiclib integer tests and other minor fixes 2016-03-06 16:28 anders_k * /NSIS/branches/nsis2/Contrib/AdvSplash/advsplash.c, /NSIS/branches/nsis2/Contrib/Banner/Banner.c, /NSIS/branches/nsis2/Contrib/BgImage/BgImage.cpp, /NSIS/branches/nsis2/Contrib/Dialer/dialer.c, /NSIS/branches/nsis2/Contrib/ExDLL/exdll.c, /NSIS/branches/nsis2/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/nsis2/Contrib/LangDLL/LangDLL.c, /NSIS/branches/nsis2/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/branches/nsis2/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/jnetlib/connection.h, /NSIS/branches/nsis2/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/branches/nsis2/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/jnetlib/util.h, /NSIS/branches/nsis2/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/makensisw.h, /NSIS/branches/nsis2/Contrib/Makensisw/utils.cpp, /NSIS/branches/nsis2/Contrib/Makensisw/utils.h, /NSIS/branches/nsis2/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/nsis2/Contrib/nsExec/nsexec.c, /NSIS/branches/nsis2/Contrib/NSISdl/connection.h, /NSIS/branches/nsis2/Contrib/NSISdl/httpget.cpp, /NSIS/branches/nsis2/Contrib/NSISdl/httpget.h, /NSIS/branches/nsis2/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/nsis2/Contrib/NSISdl/util.cpp, /NSIS/branches/nsis2/Contrib/NSISdl/util.h, /NSIS/branches/nsis2/Contrib/Splash/splash.c, /NSIS/branches/nsis2/Contrib/StartMenu/StartMenu.c, /NSIS/branches/nsis2/Contrib/System/Resource/Main.c, /NSIS/branches/nsis2/Contrib/System/Source/System.c, /NSIS/branches/nsis2/Contrib/UserInfo/UserInfo.c, /NSIS/branches/nsis2/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/branches/nsis2/Contrib/zip2exe/main.cpp, /NSIS/branches/nsis2/SCons/Config/gnu, /NSIS/branches/nsis2/Source/7zip/Common/Alloc.cpp, /NSIS/branches/nsis2/Source/DialogTemplate.cpp, /NSIS/branches/nsis2/Source/DialogTemplate.h, /NSIS/branches/nsis2/Source/exehead/Ui.c, /NSIS/branches/nsis2/Source/util.cpp: Fixed some errors and warnings for GCC 4.5.2 2016-02-26 16:16 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Warn when the [License]LangString language id parameter is not a valid number 2016-02-16 18:01 anders_k * /NSIS/trunk/Source/build.cpp: Make sure the filename string is not destroyed before we are done with the .c_str() pointer. 2016-02-16 14:59 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: Use a warning helper function so "warn as error" works everywhere 2016-02-16 14:35 anders_k * /NSIS/trunk/Source/build.cpp: Warn when the output filename is setup.exe because Windows will unsafely load compatibility shims 2016-02-12 14:01 anders_k * /NSIS/trunk/Include/StrFunc.nsh: Don't redefine STRFUNC_*VERBOSITY when StrFunc.nsh is included multiple times 2016-02-12 12:52 anders_k * /NSIS/trunk/Source/exehead/Main.c: Delayload CLBCATQ for XP 2016-02-04 20:14 anders_k * /NSIS/branches/nsis2/Contrib/ExDLL/nsis.pas, /NSIS/branches/nsis2/Contrib/VPatch/Source/Plugin/apply_patch.c, /NSIS/branches/nsis2/Docs/src/usefulinfos.but, /NSIS/branches/nsis2/Examples/rtest.nsi, /NSIS/branches/nsis2/Source/exehead/fileform.h, /NSIS/branches/nsis2/Source/exehead/util.c, /NSIS/branches/nsis2/Source/lineparse.cpp, /NSIS/branches/nsis2/Source/lineparse.h, /NSIS/branches/nsis2/Source/util.cpp: Fixed some typos (Most of them found by codespell/Stefan Weil) 2016-02-04 20:14 anders_k * /NSIS/trunk/Contrib/VPatch/Source/Plugin/apply_patch.c, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Examples/rtest.nsi, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/util.cpp: Fixed some typos (Most of them found by codespell/Stefan Weil) 2016-02-04 19:17 anders_k * /NSIS/branches/nsis2/Contrib/Language files/Japanese.nsh, /NSIS/branches/nsis2/Docs/src/history.but: Added missing MULTIUSER_* entries to Japanese.nsh (patch #266) 2016-02-04 19:17 anders_k * /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Docs/src/history.but: Added missing MULTIUSER_* entries to Japanese.nsh (patch #266) 2016-02-04 18:43 anders_k * /NSIS/branches/nsis2/Source/exehead/exec.c, /NSIS/branches/nsis2/Source/exehead/Main.c, /NSIS/branches/nsis2/Source/exehead/util.c: Backported latest dll preload code from trunk (r6700) 2016-02-04 18:32 anders_k * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: Preload more dlls for Vista and 7 without KB2533623 2015-12-27 06:22 kichik * /NSIS/tags/v30b3: Tagging for release 3.0b3 2015-12-27 06:21 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0b3 2015-12-27 06:13 kichik * /NSIS/trunk/Docs/src/history.but: 3.0b3 changelog 2015-12-27 05:43 kichik * /NSIS/trunk/Docs/src/history.but: 2.50 changelog 2015-12-27 05:36 kichik * /NSIS/tags/v250: Tagging for release 2.50 2015-12-27 05:34 kichik * /NSIS/branches/nsis2/Menu/images/header.gif: 2.50 2015-12-27 05:32 kichik * /NSIS/branches/nsis2/Docs/src/history.but: update 2.50 changelog 2015-12-24 00:50 anders_k * /NSIS/branches/nsis2/Docs/src/attributes.but, /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Source/build.cpp: RequestExecutionLevel now defaults to admin 2015-12-24 00:43 anders_k * /NSIS/branches/nsis2/Source/exehead/Main.c: Preload some system libraries (bug #1125) (Ported from trunk) 2015-12-24 00:40 anders_k * /NSIS/trunk/Source/exehead/Main.c: Preload some system libraries (bug #1125) 2015-12-16 07:45 kichik * /NSIS/tags/v249: Tagging for release 2.49 2015-12-16 07:45 kichik * /NSIS/branches/nsis2/Menu/images/header.gif: 2.49 2015-12-15 23:11 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c: Fixed CreateShortcut failure on Vista caused by security changes in r6645/2.47 2015-12-15 23:08 anders_k * /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Source/exehead/Main.c: Fixed CreateShortcut failure on Vista caused by security changes in 2.47 2015-12-11 20:25 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/SConscript: Merge history and chm fix from 2.48 2015-12-11 07:09 kichik * /NSIS/tags/v248: Tagging for release 2.48 2015-12-11 07:08 kichik * /NSIS/branches/nsis2/Menu/images/header.gif: 2.48 2015-12-11 07:05 kichik * /NSIS/branches/nsis2/Docs/src/history.but: 2.48 changes 2015-12-11 07:03 kichik * /NSIS/branches/nsis2/Docs/src/SConscript: fixed #1129 -- hhc.exe doesn't seem to be functioning with big env 2015-12-09 22:52 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/tokens.cpp: Make sure we have a valid .chm file in the 3.0 installer as well 2015-12-09 22:48 anders_k * /NSIS/branches/nsis2/Examples/makensis.nsi: Make sure we have a valid .chm file 2015-12-09 22:26 anders_k * /NSIS/branches/nsis2/Contrib/InstallOptions/Readme.html, /NSIS/branches/nsis2/Contrib/Modern UI 2/License.txt, /NSIS/branches/nsis2/Contrib/Modern UI 2/MUI2.nsh, /NSIS/branches/nsis2/Contrib/Modern UI 2/Readme.html, /NSIS/branches/nsis2/Contrib/Modern UI/License.txt, /NSIS/branches/nsis2/Contrib/Modern UI/Readme.html, /NSIS/branches/nsis2/Contrib/Modern UI/System.nsh, /NSIS/branches/nsis2/Contrib/MultiUser/MultiUser.nsh, /NSIS/branches/nsis2/COPYING, /NSIS/branches/nsis2/Docs/src/chm_config.but, /NSIS/branches/nsis2/Docs/src/config.but, /NSIS/branches/nsis2/Docs/src/license.but, /NSIS/branches/nsis2/Include/LangFile.nsh, /NSIS/branches/nsis2/Include/VB6RunTime.nsh, /NSIS/branches/nsis2/Source/afxres.h, /NSIS/branches/nsis2/Source/build.cpp, /NSIS/branches/nsis2/Source/build.h, /NSIS/branches/nsis2/Source/bzip2/blocksort.c, /NSIS/branches/nsis2/Source/bzip2/bzlib.c, /NSIS/branches/nsis2/Source/bzip2/bzlib.h, /NSIS/branches/nsis2/Source/bzip2/compress.c, /NSIS/branches/nsis2/Source/bzip2/decompress.c, /NSIS/branches/nsis2/Source/bzip2/huffman.c, /NSIS/branches/nsis2/Source/cbzip2.h, /NSIS/branches/nsis2/Source/clzma.cpp, /NSIS/branches/nsis2/Source/clzma.h, /NSIS/branches/nsis2/Source/compressor.h, /NSIS/branches/nsis2/Source/crc32.c, /NSIS/branches/nsis2/Source/crc32.h, /NSIS/branches/nsis2/Source/czlib.h, /NSIS/branches/nsis2/Source/dirreader.cpp, /NSIS/branches/nsis2/Source/dirreader.h, /NSIS/branches/nsis2/Source/exehead/afxres.h, /NSIS/branches/nsis2/Source/exehead/api.h, /NSIS/branches/nsis2/Source/exehead/bgbg.c, /NSIS/branches/nsis2/Source/exehead/components.c, /NSIS/branches/nsis2/Source/exehead/components.h, /NSIS/branches/nsis2/Source/exehead/config.h, /NSIS/branches/nsis2/Source/exehead/exec.c, /NSIS/branches/nsis2/Source/exehead/exec.h, /NSIS/branches/nsis2/Source/exehead/fileform.c, /NSIS/branches/nsis2/Source/exehead/fileform.h, /NSIS/branches/nsis2/Source/exehead/lang.h, /NSIS/branches/nsis2/Source/exehead/Main.c, /NSIS/branches/nsis2/Source/exehead/plugin.c, /NSIS/branches/nsis2/Source/exehead/plugin.h, /NSIS/branches/nsis2/Source/exehead/state.h, /NSIS/branches/nsis2/Source/exehead/Ui.c, /NSIS/branches/nsis2/Source/exehead/ui.h, /NSIS/branches/nsis2/Source/exehead/util.c, /NSIS/branches/nsis2/Source/exehead/util.h, /NSIS/branches/nsis2/Source/fileform.cpp, /NSIS/branches/nsis2/Source/fileform.h, /NSIS/branches/nsis2/Source/growbuf.cpp, /NSIS/branches/nsis2/Source/growbuf.h, /NSIS/branches/nsis2/Source/icon.h, /NSIS/branches/nsis2/Source/lang.cpp, /NSIS/branches/nsis2/Source/lang.h, /NSIS/branches/nsis2/Source/lineparse.cpp, /NSIS/branches/nsis2/Source/lineparse.h, /NSIS/branches/nsis2/Source/makenssi.cpp, /NSIS/branches/nsis2/Source/manifest.cpp, /NSIS/branches/nsis2/Source/manifest.h, /NSIS/branches/nsis2/Source/mmap.cpp, /NSIS/branches/nsis2/Source/mmap.h, /NSIS/branches/nsis2/Source/Platform.h, /NSIS/branches/nsis2/Source/Plugins.cpp, /NSIS/branches/nsis2/Source/Plugins.h, /NSIS/branches/nsis2/Source/ResourceEditor.cpp, /NSIS/branches/nsis2/Source/ResourceEditor.h, /NSIS/branches/nsis2/Source/ResourceVersionInfo.cpp, /NSIS/branches/nsis2/Source/ResourceVersionInfo.h, /NSIS/branches/nsis2/Source/script.cpp, /NSIS/branches/nsis2/Source/ShConstants.cpp, /NSIS/branches/nsis2/Source/strlist.cpp, /NSIS/branches/nsis2/Source/strlist.h, /NSIS/branches/nsis2/Source/tokens.cpp, /NSIS/branches/nsis2/Source/tokens.h, /NSIS/branches/nsis2/Source/util.cpp, /NSIS/branches/nsis2/Source/util.h, /NSIS/branches/nsis2/Source/winchar.cpp, /NSIS/branches/nsis2/Source/winchar.h, /NSIS/branches/nsis2/Source/writer.cpp, /NSIS/branches/nsis2/Source/writer.h, /NSIS/branches/nsis2/Source/zlib/deflate.c, /NSIS/branches/nsis2/Source/zlib/DEFLATE.H, /NSIS/branches/nsis2/Source/zlib/INFBLOCK.C, /NSIS/branches/nsis2/Source/zlib/trees.c, /NSIS/branches/nsis2/Source/zlib/ZCONF.H, /NSIS/branches/nsis2/Source/zlib/ZLIB.H, /NSIS/branches/nsis2/Source/zlib/ZUTIL.H: Updated copyright year 2015-12-09 21:46 anders_k * /NSIS/branches/nsis2/Docs/src/history.but: Added missing ) for bug #1125 2015-12-09 19:44 anders_k * /NSIS/branches/nsis2/Docs/src/history.but: #1125 is a bug, not a patch 2015-12-09 04:38 kichik * /NSIS/tags/v247: Tagging for release 2.47 2015-12-09 04:38 kichik * /NSIS/branches/nsis2/Scripts/release.py: backport quote hell fix 2015-12-09 04:33 kichik * /NSIS/branches/nsis2/Menu/images/header.gif: 2.47 2015-12-09 04:32 kichik * /NSIS/branches/nsis2/TODO.txt: fix eol 2015-12-09 04:03 kichik * /NSIS/branches/nsis2/Scripts/release.py: backport cppunit skipping 2015-12-09 03:59 kichik * /NSIS/branches/nsis2/Scripts/release.py: use nsis2 branch instead of trunk 2015-12-09 03:56 kichik * /NSIS/branches/nsis2/Docs/src/history.but: update release notes 2015-12-09 00:47 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added experimental Target and CPU attributes 2015-12-08 01:56 anders_k * /NSIS/trunk/Include/LogicLib.nsh: Be more forgiving when avoiding bug #1126 2015-12-08 01:54 anders_k * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/util.cpp: Kill warning with a cast in Ansi version of RunChildProcessRedirected. CppUnit still uses Ansi util.cpp? 2015-12-08 00:26 anders_k * /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Include/WinVer.nsh: Backported support for Windows 8 & 2012 support in WinVer.nsh 2015-12-07 23:56 anders_k * /NSIS/branches/nsis2/Contrib/System/Source/System.c, /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Source/exehead/Ui.c: Backported fix for 4+ TiB freespace calculation bug (bug #1115) 2015-12-07 23:35 anders_k * /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Source/exehead/Main.c, /NSIS/branches/nsis2/Source/exehead/util.c, /NSIS/branches/nsis2/Source/exehead/util.h: Backported "use InitiateShutdown if available" (patch #247) 2015-12-07 23:04 anders_k * /NSIS/branches/nsis2/Contrib/Dialer/dialer.c, /NSIS/branches/nsis2/Docs/src/history.but, /NSIS/branches/nsis2/Source/build.cpp, /NSIS/branches/nsis2/Source/exehead/exec.c, /NSIS/branches/nsis2/Source/exehead/fileform.h, /NSIS/branches/nsis2/Source/exehead/Main.c, /NSIS/branches/nsis2/Source/exehead/SConscript, /NSIS/branches/nsis2/Source/exehead/Ui.c, /NSIS/branches/nsis2/Source/exehead/util.c, /NSIS/branches/nsis2/Source/exehead/util.h: LoadLibrary security hardening to prevent dll hijacking. Backported r6634, 6642, 6645, 6647 and 6657 from 3.0. (bug #1125) 2015-12-07 20:49 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Change the ACL on our %temp% directories (bug #1125) 2015-12-07 02:00 anders_k * /NSIS/branches/nsis2: Creating branch for v2.xx updates 2015-12-07 01:51 anders_k * /NSIS/trunk/Source/script.cpp: !define /math >>> result is unsigned 2015-12-06 00:04 anders_k * /NSIS/trunk/Source/exehead/fileform.h: Updated EW_CREATESHORTCUT opcode description 2015-12-04 21:25 anders_k * /NSIS/trunk/Docs/src/sec.but: Docs: SectionGetSize sets the error flag 2015-12-03 21:18 anders_k * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/AdvSplash/advsplash.txt: * Checking for SetLayeredWindowAttributes is all we need, no need to check the version. * Updated readme example 2015-12-02 21:07 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Include/Win/COM.nsh: Use P<> and not <> when checking pointers 2015-12-01 21:02 anders_k * /NSIS/trunk/Include/LogicLib.nsh: LogicLib: Don't add a EndSelect label when only one Case is used to avoid a unused label warning (bug #1126) 2015-11-30 22:27 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: Fixed VARAIBLES typo in MUI2 internal defines (bug #1127) 2015-11-30 14:00 anders_k * /NSIS/trunk/Contrib/Dialer/dialer.c: Dialer plugin does not have to unload WinInet 2015-11-29 13:54 anders_k * /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Load system modules with full paths 2015-11-28 21:33 anders_k * /NSIS/trunk/Source/Platform.h: Don't look for a specific 2003 TK version when deciding which std::min/max workaround to apply 2015-11-28 13:32 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: bug #1125: Don't load modules from the application nor current directory. 2015-11-27 13:25 anders_k * /NSIS/trunk/Contrib/Makensisw/assoc_nsh.ico, /NSIS/trunk/Contrib/Makensisw/assoc_nsi.ico: MS resource compiler <= VS 2005 does not like PNG compressed icons 2015-11-26 13:21 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but: Fixed Doc bug, GetTempFileName base_dir parameter is optional 2015-11-25 13:13 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Delay load Version.dll to avoid dll hijacking [bug #1125] 2015-11-24 12:48 anders_k * /NSIS/trunk/Examples/makensis.nsi: Avoid missing NSIS.exe.manifest warning when building dist-installer 2015-11-23 10:36 anders_k * /NSIS/trunk/Contrib/Makensisw/assoc_nsh.ico, /NSIS/trunk/Contrib/Makensisw/assoc_nsi.ico, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/shell.ico, /NSIS/trunk/Examples/makensis.nsi: New nsi and nsh file type icons 2015-11-22 12:44 anders_k * /NSIS/trunk/Source/exehead/exec.c: HANDLE NULL check the converted value, not the string length 2015-11-21 13:12 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp: CreateShortcut icon index can now be larger than 255 (Bug #1123) 2015-11-21 11:46 anders_k * /NSIS/trunk/Docs/src/attributes.but: Update the documentation to match the new RequestExecutionLevel default value. 2015-11-17 08:54 anders_k * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Source/strlist.cpp: Clarify ${GetParameters} documentation 2015-11-15 23:06 anders_k * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: No need to delayload MoveFileEx, OpenProcessToken, LookupPrivilegeValueW and AdjustTokenPrivileges on Win9x. 2015-11-06 02:42 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: myGetProcAddress now uses a full path to the system directory when calling LoadLibrary to avoid application directory dll hijacking of SHFolder.dll 2015-11-05 21:05 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/script.cpp: * Added support for 0o octal radix prefix on number literals in the preprocessor * The single parameter version of !if now also supports floats * Preprocessor now warns when invalid floating point numbers are used in math operations 2015-11-05 04:46 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Preprocessor code in dead blocks need to be ignored even if it is invalid Test case: !macro dummy p1 !macroend !if 0 ; The next line does not properly quote its string but it is not !else nor !endif so it has to be ignored !insertmacro dummy "bar' !endif 2015-11-03 23:28 anders_k * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SCons/Config/ms: Better NSIS Menu .manifest requirement detection 2015-11-01 17:11 anders_k * /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/util.cpp: * Try to avoid invalid parameter debug warning in newer versions of MSVCRT.dll when calling _vsnwprintf as a _vscwprintf replacement * _wtof does not exist in MSVCRT.dll on Win2000, use our internal version when building with MinGW/MSVC6 or MSVC /MD 2015-10-31 18:52 anders_k * /NSIS/trunk/Source/exehead/util.c: Fixed NSIS_CONFIG_LOG_STDOUT output in Unicode exehead 2015-10-31 16:27 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Use myWriteFile helper function in exehead 2015-10-30 03:55 anders_k * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/Checksums.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.h, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/Platform.h: Fixed all VS2015 warnings except C4577 ('noexcept' used with no exception handling mode specified) 2015-10-26 23:29 anders_k * /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: FileReadUTF16LE skips optional BOM and FileWriteUTF16LE can write a BOM with the /BOM switch 2015-10-16 20:50 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Docs/src/history.but: Fixed System plugin GUID type output bug on Win98 2015-10-12 12:28 anders_k * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Include/WinMessages.nsh: * MUI_LANGUAGE usage warning was incorrectly displayed in some page combinations * Fixed broken CCM_* defines in WinMessages.nsh 2015-10-10 19:32 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Pages/Directory.nsh, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/var.but: Fixed some typos 2015-10-10 18:20 anders_k * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Docs/src/history.but: Brazilian Portuguese updated (Felipe) patch#263 2015-10-10 12:29 anders_k * /NSIS/trunk/Source/script.cpp: TOK_* instruction handlers in doCommand() cannot use PRINTHELP() if they also use eattoken()! !define "name" "value" always displays error if there are too many arguments, not just one too many 2015-10-10 11:31 anders_k * /NSIS/trunk/Source/makenssi.cpp: Changed "Command line defined" compiler message verbosity level from 4 to 3 2015-10-01 17:32 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp: Allow makensis to use stubs and plugins of different bitness, based on patch #265 2015-09-28 16:08 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: * MakeNSISW symbol sets don't need movable memory * Use helper functions to read&write MRU and symbol set strings * Don't create empty MRU key when there is nothing to save * Made some helper functions static 2015-09-26 14:19 anders_k * /NSIS/trunk/Source/script.cpp: Don't allow empty path in !AddPluginDir 2015-09-24 20:47 anders_k * /NSIS/trunk/Contrib/nsDialogs/welcome.nsi, /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Include/StrFunc.nsh: * Reduced verbosity of StrFunc.nsh * Fixed a 64-bit issue in welcome.nsi 2015-09-19 18:54 anders_k * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/czlib.h: Changed the order of the zlib lib files SConstruct searches for so it can find the MinGW specific .a first. 64-bit MinGW has problems with a MSVC generated lib file. 2015-09-19 14:27 anders_k * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Docs/src/history.but: Updated Polish translation 2015-09-19 14:07 anders_k * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/script.cpp: * TOK_PLUGINDIR path can't be const because of PATH_CONVERT(path) on POSIX * Remove truncate_cast usage from fileform.c 2015-09-19 13:22 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: Display a warning if MUI_LANGDLL_DISPLAY is inserted before MUI_LANGUAGE 2015-09-18 23:16 anders_k * /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/script.cpp: * !AddIncludeDir displays the cpu architecture in the script message if specified as a parameter * Removed unused SYSTEM_PARTIALCALLSUPPORT define * Fixed minor typos * Allow MSVC_USE_SCRIPT to be specified on the commandline or in the environment 2015-09-18 17:44 anders_k * /NSIS/trunk/SCons/Config/gnu: Actually specify a petype this time 2015-09-18 17:42 anders_k * /NSIS/trunk/SCons/Config/gnu: All GCC stub targets use the same PE switch now 2015-09-18 15:55 anders_k * /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: * block_header::offset is now pointer sized in exehead * Wininet.h -> wininet.h for POSIX 2015-09-17 14:30 anders_k * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/NSISdl/netinc.h, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/Source/Call-amd64CPP.S, /NSIS/trunk/Contrib/System/Source/Call-amd64CPP.sx, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/linker_script, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: * Basic System::Call support when compiling with 64-bit MinGW/GCC toolchain * Win64 fixes 2015-09-10 12:14 anders_k * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: Sprinkle some constness on CResourceDirectoryEntry 2015-09-10 12:05 anders_k * /NSIS/trunk/Contrib/Makensisw/update.cpp: * Be extra careful with zero termination of the foreign update status string * Always include Wininet.h 2015-09-07 21:31 anders_k * /NSIS/trunk/Contrib/Makensisw/jnetlib, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/update.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/NSISdl/httpget.h, /NSIS/trunk/Docs/src/history.but: MakeNSISW now uses WinInet when checking for updates 2015-09-06 20:15 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Source/ResourceEditor.cpp: CResourceDirectoryEntry::GetName() does not need to duplicate the string 2015-09-06 20:03 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll.c: Example plugin now correctly uses string_size when allocating its example message buffer 2015-09-03 11:06 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/util.cpp: !system/!execute: XCopy.exe/ChCp.com (and other tools using ulib.dll?) does not work without a valid StdIn so we provide a empty pipe 2015-08-26 12:01 anders_k * /NSIS/trunk/Source/tokens.cpp: Fixed InstTypeText token help string 2015-08-07 00:13 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/manifest.cpp: RequestExecutionLevel now defaults to admin 2015-08-05 00:43 kichik * /NSIS/tags/v30b2: Tagging for release 3.0b2 2015-08-05 00:40 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0b2 2015-08-05 00:30 kichik * /NSIS/trunk/Docs/src/history.but: update history.but for 3.0b2 2015-08-01 15:05 anders_k * /NSIS/trunk/Docs/src/attributes.but: Update manifest documentation for Win10 2015-07-30 18:47 anders_k * /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Source/manifest.h: *Now adds the Win10 manifest by default *Updated WinVer with Win10 version 2015-07-27 20:41 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added PESubsysVer attribute 2015-07-27 19:32 anders_k * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp: ReserveFile /plugin now searches folders added with !AddPluginDir 2015-07-27 18:33 anders_k * /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Include/Win/COM.nsh: Minor x64 system plugin example fixes 2015-07-27 18:24 anders_k * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/Platform.h: Use the system link color on our custom link controls 2015-06-25 20:38 anders_k * /NSIS/trunk/Source/exehead/Ui.c: Use the correct system metric to size the invisible column-header on the instfiles page 2015-06-25 20:12 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: File treats "" as "*", don't allow empty MUI_*_BITMAP defines. 2015-06-24 19:23 f0rt * /NSIS/trunk/SCons/Config/gnu: #261 applied stdcall calling convention for a target platform other than Windows. 2015-06-21 16:13 f0rt * /NSIS/trunk/Contrib/ExDLL/SConscript: #260 pluginapi include files are referenced twice for platforms other than Windows. 2015-05-14 20:17 anders_k * /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp: Fixed minor issues and typos 2015-05-14 19:11 anders_k * /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/modern_nodesc.rc, /NSIS/trunk/Contrib/UIs/modern_smalldesc.rc: German ^ClickUninstall text was cropped in IDC_INTROTEXT in the MUI installers. 2015-05-14 18:41 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Ui.c: Fixed 4+ TiB freespace calculation bug (bugs #1115 & #896) 2015-02-26 18:44 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/tokens.cpp: Fixed CreateShortcut /NoWorkingDir token parsing bug 2015-02-26 18:19 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added !appendfile /RawNL switch 2015-02-18 18:52 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/util.c: Exec[Wait] now sets the CREATE_DEFAULT_ERROR_MODE flag when creating a new process 2015-02-14 22:27 anders_k * /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Include/Win/WinDef.nsh, /NSIS/trunk/Include/Win/WinUser.nsh, /NSIS/trunk/Include/WinCore.nsh, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/uservars.h: Updated copyright details 2015-02-06 21:43 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: (C) 2015 2015-02-06 21:22 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll_with_unit.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas, /NSIS/trunk/Docs/src/history.but: * mynsiscallback must return nil and not 0 to avoid warning in some versions of Delphi. * NSISDialog only uses g_hwndParent if it is valid. 2015-02-03 23:35 anders_k * /NSIS/trunk/Source/script.cpp: Added missing newline in compiler output for TOK_GETFUNCTIONADDR, TOK_GETLABELADDR and TOK_GETCURRENTADDR 2015-02-03 23:25 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll_with_unit.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: Plugin SDK Pascal fixes 2015-01-19 18:03 anders_k * /NSIS/trunk/Contrib/Language files/Armenian.nsh: Moved incorrect !endif 2014-12-17 14:38 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: Warn if MUI_LANGUAGE is inserted before MUI_[UN]PAGE_* 2014-12-04 07:15 kichik * /NSIS/trunk/SCons/Config/ms: only use /FIXED for stubs and especially not for DLLs 2014-11-14 22:00 anders_k * /NSIS/trunk/Source/Plugins.cpp: Use SizeOfRawData and not VirtualSize when looking for the export section in a on-disk plugin dll 2014-10-30 03:13 kichik * /NSIS/trunk/SCons/Config/ms: need /FIXED for VS2010 as well 2014-10-26 23:22 anders_k * /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Fake the LPTSTR type if necessary for MakeNSIS on POSIX 2014-10-26 23:07 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh: Make sure MUI2 UNBITMAP*_STRETCH have default values when using custom bitmaps 2014-10-26 18:57 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Not all versions of MinGW have ARRAYSIZE, use our custom COUNTOF macro 2014-10-23 16:08 anders_k * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.xml, /NSIS/trunk/Contrib/zip2exe/zip2exe.xml: Bug #1105: MakeLangId and zip2exe must use * for processorArchitecture in the manifest 2014-10-23 16:02 anders_k * /NSIS/trunk/Contrib/Math/Source/Math.h, /NSIS/trunk/Contrib/Math/Source/MyMath.h, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Math plugin needs tchar.h 2014-10-23 15:34 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: SetCompressorStats must zero terminate the buffer from EM_GETLINE! 2014-10-22 16:49 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Must check if wParam matches MakensisAPI::QH_* 2014-10-21 23:13 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/tokens.cpp: Preliminary ManifestSupportedOS and WinVer.nsh Win10 support 2014-10-12 20:09 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Source/script.cpp: Patch #258, Makensisw x64 fixes 2014-10-07 19:43 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp: Minor Win64 fixes (Thanks JasonFriday13) 2014-10-07 04:34 kichik * /NSIS/tags/v30b1: Tagging for release 3.0b1 2014-10-07 04:32 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0b1 2014-10-07 04:30 kichik * /NSIS/trunk/Contrib/Language files/Armenian.nlf, /NSIS/trunk/Contrib/Language files/Armenian.nsh: fix eol 2014-10-07 04:26 kichik * /NSIS/trunk/Docs/src/build.but: note about vs2012 2014-10-05 23:56 kichik * /NSIS/trunk/Docs/src/history.but: updated history for 3.0b1 2014-10-05 23:51 kichik * /NSIS/trunk/SConstruct: patch #253 -- allow overriding CC and CXX 2014-10-05 22:26 anders_k * /NSIS/trunk/Docs/src/sec.but: Fixed doc error, SectionSet/GetSize uses KiB 2014-10-05 22:18 anders_k * /NSIS/trunk/Source/util.cpp: RunChildProcessRedirected takes a narrow string in the legacy ANSI mode 2014-10-05 21:52 kichik * /NSIS/trunk/Source/Tests/decompress.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/util.cpp: fixed bug #1098 so test-code works on ubuntu now 2014-10-05 21:08 kichik * /NSIS/trunk/SConstruct: applied patch #254 to allow skipping of ExDLL using SKIPPLUGINS 2014-10-05 21:04 kichik * /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/SConscript: fix gcc build 2014-10-05 20:55 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/SConscript: fixed vs2012 builds 2014-08-21 13:15 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Display a "plugin not found" error message when a invalid command looks like a plugin call. 2014-08-18 20:20 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp: zip2exe: The fix for bug #1085 causes a MSVC redefinition warning when is included. 2014-08-18 14:44 anders_k * /NSIS/trunk/Source/script.cpp: Build final include file path with the same path passed to dir_reader when enumerating include_dirs list. 2014-08-15 20:25 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/x64.nsh, /NSIS/trunk/Source/build.cpp: * Added IsWow64 to x64.nsh and fixed RunningX64 for 64-bit installers. * NSIS_AMD64 and NSIS_IX86 defines added for CPU target detection 2014-08-15 19:15 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added PEDllCharacteristics attribute and changed default DllCharacteristics to TS_AWARE+NO_SEH+NX_COMPAT+DYNAMIC_BASE 2014-08-07 12:31 anders_k * /NSIS/trunk/Source/build.cpp: Warn if !packhdr system() call returns non-zero 2014-08-05 13:53 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/DialogTemplate.cpp: * ChangeUI should warn when it cannot find a dialog. * CDialogTemplate::Save needs to free the template with the correct function. 2014-07-19 21:24 anders_k * /NSIS/trunk/SCons/Config/gnu: Print gcc & g++ version when using the gnu config 2014-07-19 20:56 anders_k * /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.h: Remove pluginapi.c's dependency on nsis_tchar.h 2014-07-19 19:21 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/CallCPP.S, /NSIS/trunk/Contrib/System/Source/CallCPP.sx, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/writer.cpp: Fixed MinGW (GCC 4.5.2) 2014-07-19 05:22 kichik * /NSIS/trunk/Source/script.cpp: another fix for mingw build 2014-07-19 05:08 kichik * /NSIS/trunk/Contrib/System/Source/Call.sx, /NSIS/trunk/Contrib/System/Source/CallCPP.S: and move the files too for mingw system build 2014-07-19 05:06 kichik * /NSIS/trunk/Contrib/System/SConscript: fix mingw build of system plug-in (thanks Anders) 2014-07-18 16:37 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Don't allow !addincludedir with trailing path separator to propagate to !include 2014-07-17 09:21 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Better handling of incomplete WCHAR reads from stdout 2014-07-16 21:54 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Deprecated.nsh, /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Docs/src/history.but: New MUI2 bitmap stretch modes: FitControl, NoStretchNoCrop[NoAlign] and AspectFitHeight. *_NOSTRETCH is now deprecated. 2014-07-16 20:22 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Fixed MakeNSISW stdout log reader when the buffer is almost full 2014-07-16 18:10 anders_k * /NSIS/trunk/Source/script.cpp: Fixed !unmacrodef...again 2014-07-12 11:08 anders_k * /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: !makensis on POSIX does not support -OUTPUTCHARSET 2014-07-11 21:57 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp: Added /WX compiler switch (treat warnings as errors) 2014-07-11 21:11 anders_k * /NSIS/trunk/Contrib/AdvSplash/advsplash.txt, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/testnotify.ini, /NSIS/trunk/Contrib/Math/Math.txt, /NSIS/trunk/Contrib/Splash/splash.txt, /NSIS/trunk/Docs/src/attributes.but: Removed some profanity from the docs 2014-07-08 18:35 anders_k * /NSIS/trunk/Source/tchar.h: If is included by libc++ then clang has problems picking the correct overloaded function (bug #1085) 2014-07-07 00:46 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: compile all languages 2014-07-07 00:45 kichik * /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Examples/languages.nsi: Czech updates by Va?ek Pavl??ek to use Microsoft terminology 2014-07-05 11:55 anders_k * /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/stdafx.h, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/uservars.h: Tabs to spaces and minor cleanup 2014-07-05 00:11 anders_k * /NSIS/trunk/Source/util.cpp: Merged patch #252: Build failure on Mac OS X - conversion error in Source/util.cpp 2014-07-05 00:04 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp: Fixed !macroundef off by one error 2014-07-04 23:27 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Util.nsh, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: !insertmacro allows macro recursion (RFE #497) 2014-07-02 20:03 anders_k * /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Docs/src/config_htmlsingle.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/tokens.cpp: Minor typo and indentation fixes 2014-07-01 22:09 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html: System.dll 64bit fixes 2014-06-29 19:01 anders_k * /NSIS/trunk/Examples/makensis.nsi: Don't use HKCR when uninstalling file associations because it will delete keys under both HKCU and HKLM, we only want to delete the keys we created! 2014-06-28 19:54 anders_k * /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/Call.sx, /NSIS/trunk/Contrib/System/Source/System.c: Make GCC happy and make sure Call.sx is not preprocessed by MS toolchain 2014-06-27 16:30 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: InitiateShutdown is used to reboot the machine if available (patch #247) 2014-06-27 14:27 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but: Added System::Call direct register memory access type 2014-06-23 19:15 anders_k * /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SConstruct: mstoolkit toolchain should use the VC toolkit linker by default. link.exe can even stand in for lib.exe if required 2014-06-23 01:28 anders_k * /NSIS/trunk/Source/Platform.h: Fixed STD_MIN/MAX again for VCToolkit2003: SDK2003R2/CL14.00.40310.41 defines _MAX as _cpp_max and _cpp_max is a template under std. VCToolkit2003/CL13.10.3052 has a template _MAX under std but also does "#define _MAX (max)" so we cannot use "std::_MAX" and have to rely on the "(std::max)" trick. 2014-06-22 18:50 anders_k * /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/zlib/INFBLOCK.C: Fixed 5 GCC warnings 2014-06-22 12:07 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tchar.h: Don't use _itot, only VC supports _itow? 2014-06-22 02:27 kichik * /NSIS/trunk/Contrib/System/Source/System.c: fix error: #pragma GCC diagnostic not allowed inside functions 2014-06-22 00:22 anders_k * /NSIS/trunk/Source/tokens.cpp: SafePPO should consider !makensis as unsafe (for now) 2014-06-21 23:55 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added !makensis command 2014-06-20 18:36 anders_k * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/makenssi.cpp: scons DEBUG=true adds DEBUG to CPPDEFINES 2014-06-19 22:08 anders_k * /NSIS/trunk/Docs/src/intro.but: Updated supported OS list in "Main Features" 2014-06-19 19:06 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added preprocess only mode (/[SAFE]PPO switch) 2014-06-15 19:12 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: Refactored verbosity handling with new setter&getter 2014-06-15 19:00 anders_k * /NSIS/trunk/Source/script.cpp: Minor indentation fixes and cleanup in script.cpp 2014-06-15 14:12 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but: The documented max value for ${U+UnicodeCodepoint} should be U+10FFFF to match the limits of UTF-16 2014-06-15 13:58 anders_k * /NSIS/trunk/Source/build.cpp: Removed bogus comment about possible string prefix bug 2014-06-11 22:01 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/utf.h: MakeNSIS WM_COPYDATA notify messages now use the QH_OUTPUTCHARSET encoding if specified by the host. CP_ACP is the default for compatibility with old IDEs. 2014-05-20 20:13 anders_k * /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/System.c: system_popstring can reuse the HGLOBAL, no need to allocate string storage 2014-05-20 19:30 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: TOK_CREATEDIR tries to reject relative paths because EW_CREATEDIR silently fails if faced with one 2014-05-20 17:26 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/tchar.h: Don't use the evil _tcsnccpy/strncpy function. 2014-05-19 22:03 anders_k * /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/tchar.h: 64bit fixes and optimizations 2014-05-19 19:23 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Fixed POSIX !searchparse bug (patch #251) and hopefully better compatibility with 2.46 2014-05-18 19:32 f0rt * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h: Patch #250: Fix of mingw-w64 warnings concering out of boundary array access 2014-05-18 14:41 anders_k * /NSIS/trunk/Source/utf.h: Better UTF8_GetTrailCount handling of start bytes outside the RFC 3629 range 2014-05-16 20:52 anders_k * /NSIS/trunk/Contrib/Language files/Kurdish.nlf: Kurdish is CP1254 2014-05-13 19:33 anders_k * /NSIS/trunk/Source/script.cpp: ExecShell: Don't DetailPrint default/empty verb as a single space 2014-05-13 19:14 anders_k * /NSIS/trunk/Source/lang.cpp: Use NStreamLineReader's MBCS handling when reading MBCS NLF files to avoid a problematic ACP > TCHAR > NLF CP > TCHAR conversion 2014-05-13 16:42 anders_k * /NSIS/trunk/Contrib/Language files/Armenian.nlf, /NSIS/trunk/Contrib/Language files/Armenian.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Added Armenian translation 2014-05-13 15:51 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Include/UpgradeDLL.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: 2014 and fixed some minor typos 2014-05-11 19:58 kichik * /NSIS/tags/v30b0: Tagging for release 3.0b0 2014-05-11 19:55 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0b0 2014-05-11 19:53 kichik * /NSIS/trunk/Docs/src/history.but: add note about posix builds 2014-05-11 19:49 kichik * /NSIS/trunk/Source/build.cpp: more accurate comment 2014-05-11 19:47 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: more accurate comment 2014-05-10 20:36 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/lineparse.cpp: Changed preprocessor binary literal prefix to 0b, 0y is still supported for now 2014-05-09 18:21 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/lineparse.cpp: Added MASM style 0n and 0y radix prefix support for preprocessor numbers 2014-05-08 20:12 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Must pass count of TCHARs to _LogData2Hex so we don't overflow the buffer in unicode stubs 2014-05-05 02:27 kichik * /NSIS/trunk/Source/util.cpp: do not fail for ascii characters that can be easily replaced (like with Farsi and Pashto) 2014-05-05 02:21 kichik * /NSIS/trunk/Source/build.cpp: i think this is a bug... 2014-05-05 02:20 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: this example is far less impressive in ASCII mode 2014-05-04 23:54 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: bug #1091 - InstallOptions.nsh was removed and is no longer a valid example for MUI 2 2014-04-30 20:45 anders_k * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp: Make sure client rectangle is the correct width so we don't get a blank spot to the right of the header image because our wxWidgets border calculation is sometimes wrong. 2014-04-15 23:26 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/uservars.h: Stricter compiler parameter validation of SectionGet/Set* commands 2014-04-13 17:49 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp: !system and !execute can store the exit code in a define 2014-04-13 14:45 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: !execute supports comparing the exit code with the same syntax as !system 2014-04-05 16:50 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Store db_full_size[_u] statistics as UINT64 2014-03-31 17:34 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Store datablock optimizer statistics as UINT64 in case the same large file is added many times 2014-03-30 22:43 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/util.cpp: !system decodes child output as OEMCP if GetConsoleOutputCP() == GetOEMCP(), this should help bug #1092 (or fix it completely?) 2014-03-30 03:25 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: Adding the same file twice can push cur_datablock over the 2GB limit because datablock_optimize() happens too late. Try to find a dupe early. 2014-03-28 17:10 anders_k * /NSIS/trunk/Include/LangFile.nsh: Clarify the difference between the LANGFILE and LANGFILE_EXT macros. 2014-03-28 16:21 anders_k * /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/SCons/config.py, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: CreateShortCut > CreateShortcut 2014-03-28 16:17 anders_k * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added CreateShortcut /NoWorkingDir optional parameter 2014-03-10 00:06 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/strlist.cpp: Fix bug #1088 and try even harder by using substring if possible 2014-03-09 23:23 anders_k * /NSIS/trunk/Source/build.cpp: Don't store wide and narrow versions of the same error string 2014-03-09 23:04 anders_k * /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h: Print error when ExeHeadStringList::find is unable to convert to narrow string 2014-03-06 17:26 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: lstrcpy is overkill there 2014-03-06 17:23 anders_k * /NSIS/trunk/Include/WinMessages.nsh: Make sure SYSSTRUCT pointer members are correctly aligned for x64 2014-03-04 19:26 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Don't list /amd64-unicode in !addplugindir help (makensis win32) 2014-03-04 19:00 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/LogicLib.nsh: Added P<, P<=, P=, P<>, P>= and P> LogicLib ptrdiff_t tests 2014-03-03 18:10 anders_k * /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/Call-amd64.S, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/Source/exehead/Ui.c: Basic AMD64 System::Call support 2014-02-11 01:34 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp: Fixed some warnings 2014-02-09 23:12 anders_k * /NSIS/trunk/SCons/Config/memset.c, /NSIS/trunk/Source/build.cpp: Prevent MSVC 14.00.40310 from generating a recursive call to memset 2014-02-09 19:32 anders_k * /NSIS/trunk/Source/script.cpp: Calculate ctlcolors64 offset correctly 2014-02-09 18:36 anders_k * /NSIS/trunk/Contrib/InstallOptions/SConscript, /NSIS/trunk/Contrib/nsDialogs/SConscript: DistributeInclude for plugins even when not building ANSI plugins 2014-02-08 00:13 anders_k * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/connection.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/UIs/ui.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Include/Sections.nsh, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: Basic Win64 support (MSVC) 2014-02-03 20:19 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/Util.nsh: Added Int32/64/Ptr helper macros to Util.nsh 2014-02-03 19:23 anders_k * /NSIS/trunk/Contrib/zip2exe/zlib/crypt.h, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c: Fix GCC zip2exe/zlib z_crc_t type mismatch warning 2014-02-02 00:39 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: more conversion warning fixes 2014-02-02 00:37 kichik * /NSIS/trunk/Source/script.cpp: fix gcc warning 2014-02-02 00:36 kichik * /NSIS/trunk/SCons/Config/gnu: avoid warnings about stdcall being ignored 2014-01-27 03:44 kichik * /NSIS/trunk/Source/7zip/Common/Types.h: and fix vc build too now... meh 2014-01-27 03:34 kichik * /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/Platform.h: fixed build with mingw on ubuntu 64-bit 2014-01-23 14:33 anders_k * /NSIS/trunk/Examples/makensis.nsi: Incorrect NSIS version in welcome text and MUI is not new 2014-01-22 09:54 anders_k * /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Source/Tests/decompress.cpp, /NSIS/trunk/Source/Tests/DialogTemplate.cpp, /NSIS/trunk/Source/Tests/specmatch.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: Fixed winchar tests 2014-01-22 03:35 kichik * /NSIS/trunk/Source/winchar.cpp: arg name is s not str 2014-01-21 14:21 anders_k * /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/Tools/mstoolkit.py: mstoolkit.py now supports MSVC_USE_SCRIPT=None to import VC and SDK paths from environment variables 2014-01-21 14:13 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/MakeLangId/SConscript, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/tchar.h, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: POSIX fixes for native and crossplatform utils 2014-01-21 06:59 kichik * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: those are not available on mingw for whatever reason... 2013-12-25 04:56 kichik * /NSIS/tags/v30a2: Tagging for release 3.0a2 2013-12-25 04:55 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0a2 2013-12-25 04:53 kichik * /NSIS/trunk/Docs/src/history.but: get ready for release 2013-12-25 04:50 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/util.h: build fixes for vc 2013-12-09 01:17 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html: System::Call can call exports by ordinal with dll::#123 syntax 2013-12-08 23:48 anders_k * /NSIS/trunk/Source/build.cpp: PE NSIS_VARS_SECTION size should not depend on sizeof(TCHAR) 2013-12-08 16:24 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Fix bug#1086, don't parse non-branch instructions inside a !if 0 block 2013-12-08 15:41 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp: Fixed incorrect page count in compiler statistics 2013-12-08 14:34 anders_k * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: Major POSIX overhaul 2013-10-09 00:16 anders_k * /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h: Optimized return is valid even after the CharEncConv object is destroyed 2013-10-08 18:59 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h: Fix DupWCFromBytes/CharEncConv optimized return bug when converting UTF16LE license file to wchar_t(UTF16LE) 2013-09-06 23:48 anders_k * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.h, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.xml, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Contrib/UIs/ui.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/x64.nsh, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/winver.nsi: Win64 fixes 2013-09-02 21:19 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Include/WinVer.nsh: Windows 8.1 & 2012R2 support in WinVer.nsh 2013-08-18 16:34 anders_k * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/script.cpp: ChangeUI must force RichEdit20A/W class based on target 2013-08-15 23:14 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/Ui.c: Fix bug #1080, Unicode stubs must use RichEdit20W, otherwise EM_GETTEXTRANGE gives us ANSI strings 2013-08-15 21:22 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp: Fixed bug #1079, broken !define Unicode null terminator 2013-08-08 00:26 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp: !include defaults to UTF-8 after Unicode True 2013-08-07 23:26 anders_k * /NSIS/trunk/Source/exehead/util.c: FindFirst short-name fallback trick not required in Unicode stubs 2013-08-07 23:04 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/Platform.h: Win64 fixes 2013-08-07 20:39 anders_k * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: static const toolbar button info 2013-08-07 19:26 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Docs/src/history.but: Fixed MakeNSISW default pushbutton and tab order 2013-08-05 15:37 anders_k * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp: NSIS Menu html window should have the same width as the header image 2013-08-05 14:53 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: MakeNsisW About dialog close button should close the dialog 2013-07-28 14:46 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Optimize FileReadByte/FileReadWord 2013-07-27 23:09 anders_k * /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: FileRead in Unicode installers can handle DBCS, conversion output is limited to UCS-2 2013-07-27 18:29 anders_k * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/util.cpp: Ignore c++ exception specifications, they are still useful as "documentation" 2013-07-27 17:40 anders_k * /NSIS/trunk/Source/exehead/exec.c: Don't limit Lnk path A2W conversion to 1024 WCHARs 2013-07-25 22:00 anders_k * /NSIS/trunk/Source/util.cpp: VS2008 does not like the vsnwprintf(INT_MAX) hack, use _vscwprintf if it exists 2013-07-25 19:18 anders_k * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Use ReadFile helper function in exehead 2013-07-25 18:27 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/exehead/exec.c: FileReadByte should not do any kind of conversion 2013-07-22 18:15 anders_k * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/notinstalled.html: NSIS Menu dialog caption has to contain a %s now (wxWidgets requirement) so our files need to have a html title element. 2013-07-14 20:34 kichik * /NSIS/trunk/Scripts/release.py: automatically upload release notes (until the section number for change log changes... meh) 2013-07-14 20:05 kichik * /NSIS/tags/v30a1: Tagging for release 3.0a1 2013-07-14 20:04 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0a1 2013-07-14 20:03 kichik * /NSIS/trunk/Scripts/release.py: allow skipping CppUnit until we figure out where to get a copy of it again... or just replace it? 2013-07-14 19:57 kichik * /NSIS/trunk/Scripts/release.py: updated svn root 2013-07-14 19:46 kichik * /NSIS/trunk/Docs/src/history.but: update changelog for release 2013-07-14 19:38 kichik * /NSIS/trunk/Source/exehead/Main.c: fix bug #1076 - always be silent if the user passes /S on the command line, even the installer file can't be read. the installer is not always executed from the computer itself and remote deployment can stall because of this issue (with psexec -c on x64 for example). 2013-07-10 21:03 anders_k * /NSIS/trunk/Source/script.cpp: Fix "!insertmacro foo /* this comment kills the macro body" parser bug 2013-07-10 19:09 anders_k * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h, /NSIS/trunk/Docs/src/history.but: Zip2Exe: Unicode checkbox and minor fixes 2013-07-10 16:36 anders_k * /NSIS/trunk/Examples/makensis.nsi: Register PerceivedType=text for .nsi and .nsh 2013-07-10 16:34 anders_k * /NSIS/trunk/Examples/makensis.nsi: Minor cleanup and more LogicLib usage 2013-07-07 23:27 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/tokens.cpp: Added Windows 8.1 Preview GUID alias to ManifestSupportedOS 2013-07-07 22:59 anders_k * /NSIS/trunk/Docs/src/config_htmlsingle.but, /NSIS/trunk/Docs/style.css: Docs: Only htmlsingle sets overflow:auto on pre blocks, other output formats have to accept a scrollbar for the whole document 2013-07-05 21:28 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html: Fix nsDialogs docs typo 2013-06-23 15:07 anders_k * /NSIS/trunk/Contrib/SubStart/ReadMe.txt, /NSIS/trunk/Contrib/SubStart/SConscript, /NSIS/trunk/Contrib/SubStart/substart.c: Rewrote SubStart, does not use CRT 2013-06-08 19:10 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp: Add !finalize %1 fix to changelog and shut up MinGW 2013-06-08 18:48 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp: Default verbosity is /V3 without logo, MakeNSISW still uses /V4 2013-06-08 01:53 anders_k * /NSIS/trunk/Examples/makensis.nsi: More robust uninstall handling on the "Already Installed" page in the installer 2013-06-05 10:23 anders_k * /NSIS/trunk/Source/build.cpp: Fix !finalize %1 string substitution 2013-06-05 09:47 anders_k * /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/WinVer.nsh: Try to handle Unicode mode changes after !include 2013-05-28 20:13 anders_k * /NSIS/trunk/Docs/src/history.but: Update changelog 2013-05-28 20:07 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Source/Platform.h: MakeNSISW should request UTF16LE output 2013-05-26 20:58 anders_k * /NSIS/trunk/Source/util.h: MinGW might have a different include order, make sure the f*print stuff we want to override has already been included 2013-05-26 19:47 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: MakeNsisW: Functional size gripper and other minor fixes 2013-05-21 19:18 anders_k * /NSIS/trunk/Source/script.cpp: Fix !searchparse 2013-05-20 01:16 kichik * /NSIS/trunk/Scripts/release.py: pre-release magic for next time 2013-05-19 23:45 kichik * /NSIS/tags/v30a0: Tagging for release 3.0a0 2013-05-19 23:33 kichik * /NSIS/tags/v30a0: had to fix some stuff... retagging in a second 2013-05-19 23:30 kichik * /NSIS/trunk/SConstruct: fixed version numbering - always use what command line tells you to use (not 3.0.0) 2013-05-19 23:24 kichik * /NSIS/trunk/Source/exehead/util.c: limit ansiName[] size so long string build doesn't break 2013-05-19 23:17 kichik * /NSIS/trunk/Scripts/release.py: quotes kill cmd.exe 2013-05-19 22:53 kichik * /NSIS/tags/v30a0: Tagging for release 3.0a0 2013-05-19 22:49 kichik * /NSIS/trunk/Menu/images/header.gif: 3.0a0 2013-05-19 22:45 kichik * /NSIS/trunk/Docs/src/history.but: updated history for 3.0a0 release 2013-05-19 20:56 kichik * /NSIS/trunk/Docs/src/credits.but: some credit updates 2013-05-18 08:24 kichik * /NSIS/trunk/Contrib/NSISdl/SConscript: use wsock32 instead of ws2_32.dll for windows 95 support. it still works perfectly fine on even windows 7, thanks to export forwarding. but not it will also work on windows 95 pre-ie, if that still exists out there... 2013-05-17 19:31 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: 200? -> 2013 2013-05-04 14:33 anders_k * /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/util.cpp: Allow /INPUTCHARSET early on the command line. 2013-05-04 13:32 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: StdOut Unicode support, controlled by /OUTPUTCHARSET and/or existing BOM if redirected. 2013-04-17 00:40 anders_k * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: Unicode NSISdl needs to call CreateFileW 2013-04-16 21:02 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Improved !searchparse error detection/handling 2013-04-14 23:03 kichik * /NSIS/trunk/Scripts/release.py: fixed svn2cl config example and download url 2013-04-14 22:15 kichik * /NSIS/trunk/Examples/waplugin.nsi: plug-ins directory has changed 2013-04-11 20:54 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Source/utf.cpp: Minor Unicode fixes 2013-04-11 15:28 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h: UTF16BE support in NStreamLineReader 2013-04-11 09:47 kichik * /NSIS/trunk/Scripts/release.py: this script needs win32com too 2013-04-11 09:47 kichik * /NSIS/trunk/SConstruct: there will be only one version (that can generate two different types of installers) 2013-04-11 09:36 kichik * /NSIS/trunk/Examples/makensis.nsi: install unicode.nsi 2013-04-11 09:30 kichik * /NSIS/trunk/Scripts/release.py: print full path of files with bad eol and support svn 1.7 which only has the .svn folder in the root folder 2013-04-11 09:27 kichik * /NSIS/trunk/Contrib/Language files/Khmer.nsh, /NSIS/trunk/Contrib/Language files/Vietnamese.nsh, /NSIS/trunk/Contrib/SubStart/ReadMe.txt, /NSIS/trunk/Examples/unicode.nsi, /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/Win/Propkey.nsh, /NSIS/trunk/TODO.txt: fixed eol 2013-04-11 09:05 kichik * /NSIS/trunk/Examples/Library.nsi: LangDLL.dll moved 2013-04-11 09:02 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: don't crash in LibraryLocal if the file cannot be found 2013-04-11 08:49 kichik * /NSIS/trunk/Source/script.cpp: fixed LicenseLangString always failing 2013-04-11 08:48 kichik * /NSIS/trunk/Source/Tests/SConscript: there is only one winver.nsi now 2013-04-11 08:15 kichik * /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Examples/unicode.nsi: a very basic example of unicode 2013-04-11 07:53 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Contrib/NSIS Menu/wx/setup.h: revert to wxWidgets 2.8.12 as 2.9.X is still experimental and doesn't work for us 2013-04-11 07:21 kichik * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp: solved some wxWidgets assertions 2013-04-10 09:13 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Contrib/NSIS Menu/wx/setup.h, /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat: upgraded to wxWidgets 2.9.4 and fixed unicode build (files were written into vc_mswuunsis and not vc_mswunsis; and some of the IF statement in the batch file didn't work) 2013-04-10 07:11 kichik * /NSIS/trunk/Source/strlist.cpp: my vc6 doesn't like string.clear() because it was born before me 2013-04-10 02:51 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp: Unicode support for !define /file and !searchparse /file 2013-04-09 18:44 anders_k * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/ScotsGaelic.nlf, /NSIS/trunk/Contrib/Language files/ScotsGaelic.nsh, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Added Scottish Gaelic translation 2013-04-03 23:01 anders_k * /NSIS/trunk/Docs/src/history.but: Minor changelog additions 2013-04-03 22:46 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Added !appendfile /CHARSET parameter, output is written using the new NOStream class 2013-03-29 02:39 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp: Added ${__COUNTER__} predefine 2013-03-29 02:04 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h: Support special ${U+1}...${U+FFFFFFFF} Unicode character defines 2013-03-28 21:25 anders_k * /NSIS/trunk/Docs/src/usefulinfos.but: Update System.dll mini-doc; b type has been removed and p should be used for pointers 2013-03-27 02:50 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h: Updated changelog and fixed minor documentation bugs (bug #3063566, bug #3567313) 2013-03-24 23:27 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/Platform.h: DWORD type is unsigned long, not int 2013-03-24 22:38 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: no need for tstring.cpp after all as we only use the tstring typedef and non of the functions 2013-03-24 22:37 kichik * /NSIS/trunk/Source/tstring.cpp: fix operator syntax error 2013-03-24 06:39 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: revert bad commit TCHAR is not WCHAR on POSIX, it's wchar_t which can even be 32-bit 2013-03-24 06:12 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: gotta cast for gcc 2013-03-24 06:11 kichik * /NSIS/trunk/Source/util.h: iconv doesn't do TCHAR, only char and we need stdarg.h for va_arg and friends 2013-03-24 06:10 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: gcc doesn't like %lu for DWORD as it's just unsigned int and not long unsigned int 2013-03-24 06:09 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: we need tstring.cpp too now for conversion 2013-03-24 06:08 kichik * /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h: MultiByteToWideChar is defined by tchar.h, but tchar.h includes tstring.h also, it seems _TSTRING_H_ is used by something else 2013-03-24 06:06 kichik * /NSIS/trunk/Source/Platform.h: we need properly defined TCHAR on POSIX too 2013-03-22 22:33 anders_k * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/history.but: Fix dead links with archive.org 2013-03-22 21:57 anders_k * /NSIS/trunk/Examples/makensis.nsi: Added "LegalCopyright" version string to our installer, removes compiler warning 2013-03-19 02:11 anders_k * /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp: Fixed minor MakeNSIS leaks (Bug #3474662) 2013-03-17 22:44 anders_k * /NSIS/trunk/Contrib/Language files/Cibemba.nlf, /NSIS/trunk/Contrib/Language files/Cibemba.nsh, /NSIS/trunk/Contrib/Language files/Efik.nlf, /NSIS/trunk/Contrib/Language files/Efik.nsh, /NSIS/trunk/Contrib/Language files/Georgian.nlf, /NSIS/trunk/Contrib/Language files/Georgian.nsh, /NSIS/trunk/Contrib/Language files/Igbo.nlf, /NSIS/trunk/Contrib/Language files/Igbo.nsh, /NSIS/trunk/Contrib/Language files/Malagasy.nlf, /NSIS/trunk/Contrib/Language files/Malagasy.nsh, /NSIS/trunk/Contrib/Language files/Pashto.nlf, /NSIS/trunk/Contrib/Language files/Pashto.nsh, /NSIS/trunk/Contrib/Language files/Swahili.nlf, /NSIS/trunk/Contrib/Language files/Swahili.nsh, /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Language files/Valencian.nsh, /NSIS/trunk/Contrib/Language files/Yoruba.nlf, /NSIS/trunk/Contrib/Language files/Yoruba.nsh: Language files are text and not binary, remove svn:mime-type property 2013-03-17 22:10 anders_k * /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Docs/src/history.but: Fixed Korean MUI_[UN]TEXT_FINISH_INFO_* (Bug #3541515) 2013-03-17 21:13 anders_k * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Reduced !include/!insertmacro recursion stack usage (Bug #3067954) 2013-03-17 00:36 kichik * /NSIS/trunk/Source/exehead/Ui.c: "#pragma diagnostic push" only works on gcc 4.6+ 2013-03-16 20:09 anders_k * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Refactor m_macros finder/getter 2013-03-16 01:28 anders_k * /NSIS/trunk/Source/lang.cpp: Don't allow Unicode-only language files to be used in ANSI installers 2013-03-16 00:28 anders_k * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Asturian.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Cibemba.nlf, /NSIS/trunk/Contrib/Language files/Cibemba.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/Efik.nlf, /NSIS/trunk/Contrib/Language files/Efik.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/Georgian.nlf, /NSIS/trunk/Contrib/Language files/Georgian.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Igbo.nlf, /NSIS/trunk/Contrib/Language files/Igbo.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Khmer.nlf, /NSIS/trunk/Contrib/Language files/Khmer.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malagasy.nlf, /NSIS/trunk/Contrib/Language files/Malagasy.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Pashto.nlf, /NSIS/trunk/Contrib/Language files/Pashto.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swahili.nlf, /NSIS/trunk/Contrib/Language files/Swahili.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Language files/Valencian.nsh, /NSIS/trunk/Contrib/Language files/Vietnamese.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh, /NSIS/trunk/Contrib/Language files/Yoruba.nlf, /NSIS/trunk/Contrib/Language files/Yoruba.nsh, /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Include/LangFile.nsh: * Georgian and Pashto are now part of default install. * LANGFILE macro now takes 4 parameters, all .nsh files have been updated * LANGFILE_INCLUDE_WITHDEFAULT will now warn if the fallback string is used * Removed some invalid English strings in various files * Fixed Khmer LangId * Minor Norwegian language fixes * Some files changed from UTF16LE to UTF8SIG 2013-03-14 22:27 anders_k * /NSIS/trunk/Source/lang.cpp: Allow CP_ACP as the codepage in NLF files even if IsValidCodePage() says no 2013-03-14 22:14 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Pages.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: Warn if MUI_PAGE_* is inserted after MUI_LANGUAGE 2013-03-14 22:04 anders_k * /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh: Unicode plugin W function suffix has been removed 2013-03-14 18:00 anders_k * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp: Add new (optional) makensis win32 abort event to avoid multiple instance issues 2013-03-13 17:23 anders_k * /NSIS/trunk/SConstruct: SConstruct only needs to export environments that are imported by other SConscript files 2013-03-13 08:22 kichik * /NSIS/trunk/SCons/Config/gnu: fix mingw env for unicode too 2013-03-12 23:23 anders_k * /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/Win/Propkey.nsh: Add !define for PKEY_AppUserModel_StartPinOption and use it in the COM.nsh example 2013-03-10 23:28 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Include/Win/WinDef.nsh, /NSIS/trunk/Include/Win/WinUser.nsh, /NSIS/trunk/Include/WinCore.nsh: Fix duplicate defines/conflicts in Include/Win*.nsh, nsDialogs.nsh and System.nsh 2013-03-10 23:02 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/util.cpp: Fix some MinGW warnings 2013-03-10 22:26 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Use dynamic buffer sizes for formated CEXEBuild warning/error methods 2013-03-08 19:38 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Experimental UTF16 reading support on POSIX 2013-03-07 23:38 anders_k * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Contrib/InstallOptions/testimgs.nsi, /NSIS/trunk/Contrib/InstallOptions/testlink.nsi, /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added /plugin parameter to ReserveFile for our multi-arc. plugin subdirectories. 2013-03-07 21:25 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Use a custom file reader with UTF8 support for nsi/nsh/nlf files and store UTF16LE or MBCS (stringblock) strings in ExeHeadStringList 2012-12-12 19:34 kichik * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Asturian.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Cibemba.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/Efik.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Igbo.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Khmer.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malagasy.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Pashto.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swahili.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Vietnamese.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh, /NSIS/trunk/Contrib/Language files/Yoruba.nsh: fixed MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE on r5228 and r5229 the MUI language files were moved to a new format in a new directory during this move, the differences between the two MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO disappeared instead of having two variations depending on NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE, they were the same this commit restores the old values from the old language files from r5227 where these values are missing, a #FIXME was added 2012-12-11 21:12 gavenkoa * /NSIS/trunk/Contrib/Language files/Ukrainian.nsh: Fix "LATIN SMALL LETTER I" to "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I". It is possible that fonts have different glyph for this letter. I think that original translation was prepared in build-in editor of popular "Far" file manager which is console application and it usually run in cp866 codepage which doesn't have codepoint for "CYRILLIC SMALL UKRAINIAN I". (xD) But most valuable reason to make this change is to have an ability to run ispell like program. I also fix some spelling errors, so ispell with 'ukrainian' dictionary doesn't show any errors by now. 2012-12-11 20:36 gavenkoa * /NSIS/trunk/Contrib/Language files/Ukrainian.nsh: Fix spelling. 2012-11-13 20:57 gavenkoa * /NSIS/trunk/SConstruct: Another one zlib import lib name (to build with Gnuwin32/Cygwin-Mingw zlib build). 2012-11-12 21:24 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: Display "Install data" size statistics as unsigned number. (Partial fix for bug #3564918) 2012-11-11 04:33 kichik * /NSIS/trunk/SCons/Config/ms: tdefenv must be defined after defenv is ready this caused tdefenv (and therefore util_env) not to contain the right pointers to libcp.lib 2012-11-11 03:48 kichik * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c: Platform.h defines TCHAR, no need to include tchar.h from the system this fixes another set of redefinition warnings 2012-11-11 03:36 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript: there's only one header.gif (the unicode fork has a different header) 2012-11-11 03:12 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/Contrib/VPatch/Source/GenPat/SConscript, /NSIS/trunk/SConstruct: NSIS.exe should be built as a GUI executable not as CLI 2012-11-11 02:39 kichik * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/update.cpp: tchar.h is already included in platform.h no need to include nsis_tchar.h from exdll (this is not a plug-in anyway) this fixes a '_tstof' redefinition warning 2012-11-11 02:09 kichik * /NSIS/trunk/Docs/src/build.but: link to a working dll of zlib 1.2.7 2012-11-09 23:43 anders_k * /NSIS/trunk/Source/util.h: Fix Bug#3571461 - Include POSIX header file 2012-11-09 23:17 anders_k * /NSIS/trunk/Source/exehead/exec.c: Fix HDC leak in CreateFont 2012-11-09 22:35 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: Avoid NSD_Add[Ex]Style register parameter conflict 2012-11-05 01:42 kichik * /NSIS/trunk/INSTALL: a note about building wxWidgets 2012-10-16 09:43 anders_k * /NSIS/trunk/Contrib/BgImage/Example.nsi, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/timer.nsi, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi, /NSIS/trunk/Include/WinMessages.nsh, /NSIS/trunk/Include/WinVer.nsh: Minor example scripts and WinVer.nsh fixes 2012-10-16 08:12 anders_k * /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Remove MRU menu separator when list is empty and delete empty MRU registry items 2012-10-15 02:34 kichik * /NSIS/trunk/SCons/Config/ms: not sure how this ever worked, but it's LIBPATH that needs to be modified and LIB in the OS environment maybe older versions of scons read LIB after environment construction too? 2012-10-13 01:47 anders_k * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/MakeLangId/SConscript, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/version.cpp, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Resource/Main.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/UIs/SConscript, /NSIS/trunk/Contrib/UIs/ui.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/validateunicode.h: MakeNSIS can now generate Unicode or Ansi installers based on a script attribute. SCons generates both Ansi and Unicode stubs and plugins. The official plugins are now stored in architecture specific subdirectories under NSIS\Plugins. !AddPluginDir also gained a new (optional) architecture flag because MakeNSIS now stores separate plugin information for each target architecture. Storing plugins in the root of the Plugins directory is no longer supported. MinGW does not implement the unicode CRT startup functions so the entry point functions and linker parameters had to be changed. The unicode tools use the ansi entry point and a small helper function that calls into the real code: _tmain has full argc+argv emulation while wWinMain does not pass the command line parameters. The stubs do not use any CRT functions and have no CRT or unicode helper code, they call our entry point directly. 2012-10-02 00:22 golubdr * /NSIS/branches/WIN64/Contrib/NSIS Menu/SConscript, /NSIS/branches/WIN64/Contrib/NSIS Menu/wx/wxbuild.bat: Use different directory names for 32-bit and 64-bit versions of wxWidgets. 2012-09-21 14:28 anders_k * /NSIS/trunk/SConstruct: Create unicode makensis by default 2012-09-20 18:42 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added ManifestDPIAware attribute 2012-09-20 10:18 anders_k * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Add ManifestSupportedOS attribute 2012-09-17 12:37 anders_k * /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/WordFunc.nsh: Reduce define spew from included files 2012-09-16 14:45 anders_k * /NSIS/trunk/Examples/makensis.nsi: Must extract nsisconf.nsh to $InstDir 2012-09-14 12:11 anders_k * /NSIS/trunk/Contrib/nsDialogs/Readme.html: Fix bug #3567313, wrong MUI control id in nsD docs 2012-09-11 00:53 anders_k * /NSIS/trunk/SCons/Config/gnu: MinGW: Don't link to LIBGCC*.DLL and LIBSTDC++-*.DLL 2012-09-10 22:56 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h: System: Minor x64 fixes 2012-09-08 02:50 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/connection.cpp, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/netinc.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/zlib/INFBLOCK.C: Removed unused variables and fixed GCC warnings 2012-09-06 22:43 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: Fix GCC array bounds warning when accessing g_usrvars 2012-08-22 23:44 golubdr * /NSIS/branches/WIN64, /NSIS/branches/WIN64/Contrib/VPatch/Source/GenPat/adler32.cpp, /NSIS/branches/WIN64/Examples/makensis.nsi, /NSIS/branches/WIN64/SCons/utils.py, /NSIS/branches/WIN64/SConstruct: Integrate zlib compatibility changes into WIN64. 2012-08-22 23:39 golubdr * /NSIS/trunk/SCons/utils.py: Fix indentation. 2012-08-22 23:32 golubdr * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: Use appropriate zlib DLL depending on version. 2012-08-22 13:34 golubdr * /NSIS/trunk/Contrib/VPatch/Source/GenPat/adler32.cpp: Fixed adler32.cpp to compile with the latest version of zlib. 2012-08-07 00:44 golubdr * /NSIS/branches/WIN64, /NSIS/branches/WIN64/Contrib/Language files/Icelandic.nlf, /NSIS/branches/WIN64/Contrib/Language files/Welsh.nlf, /NSIS/branches/WIN64/Contrib/Library/RegTool/RegTool.c, /NSIS/branches/WIN64/Contrib/System/Source/System.c, /NSIS/branches/WIN64/Docs/src/build.but, /NSIS/branches/WIN64/Docs/src/headers.but, /NSIS/branches/WIN64/Docs/style.css, /NSIS/branches/WIN64/Include/Win/COM.nsh, /NSIS/branches/WIN64/Include/Win/Propkey.nsh, /NSIS/branches/WIN64/Include/WinMessages.nsh, /NSIS/branches/WIN64/Include/WinVer.nsh: Merged trunk into WIN64 branch. 2012-08-07 00:33 golubdr * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c: Fixed regression that was causing RegQueryValueEx to always fail. 2012-08-06 22:26 anders_k * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/style.css: Docs: Limit pre tag line width 2012-08-05 05:26 anders_k * /NSIS/trunk/Include/WinMessages.nsh: WinMessages: Minor ListView additions 2012-08-05 05:13 anders_k * /NSIS/trunk/Include/WinVer.nsh: Add logiclib macros for Win8 2012-08-05 00:04 anders_k * /NSIS/trunk/Include/WinVer.nsh: WinVer: Support Win8 and Srv2012 2012-08-04 23:19 anders_k * /NSIS/trunk/Docs/src/build.but: Update zlib download URL 2012-07-01 22:28 anders_k * /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Language files/Welsh.nlf: Fix bug#3532925: Wrong LangID 2012-06-23 00:26 anders_k * /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/Win/Propkey.nsh, /NSIS/trunk/Include/WinMessages.nsh: Added minimal Tab and ListView support to WinMessages.nsh and some COM helper macros 2012-06-21 23:13 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: System plugin: Try harder to find dll export function 2012-06-06 21:05 golubdr * /NSIS/branches/WIN64/Examples/makensis.nsi: Remove correct shortcuts when uninstalling 64-bit version. 2012-06-06 20:54 golubdr * /NSIS/branches/WIN64/Contrib/Language files/SimpChinese.nsh, /NSIS/branches/WIN64/Contrib/Language files/TradChinese.nsh: Temporary fix for language file problem that prevents CPack from working with latest code. 2012-06-06 18:24 golubdr * /NSIS/branches/WIN64/Contrib/NSIS Menu/nsismenu/nsismenu.cpp: Fix typo that broke 32-bit build. 2012-06-06 16:44 golubdr * /NSIS/branches/WIN64/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/branches/WIN64/Examples/makensis.nsi, /NSIS/branches/WIN64/Source/build.cpp, /NSIS/branches/WIN64/Source/makenssi.cpp: Mark 64-bit NSIS as such. 2012-06-06 16:07 golubdr * /NSIS/branches/WIN64/Contrib/AdvSplash/advsplash.c, /NSIS/branches/WIN64/Contrib/Banner/Banner.c, /NSIS/branches/WIN64/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/WIN64/Contrib/LangDLL/LangDLL.c, /NSIS/branches/WIN64/Contrib/Library/RegTool/RegTool.c, /NSIS/branches/WIN64/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/WIN64/Contrib/Makensisw/utils.cpp, /NSIS/branches/WIN64/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/WIN64/Contrib/nsExec/nsexec.c, /NSIS/branches/WIN64/Contrib/NSISdl/connection.h, /NSIS/branches/WIN64/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/WIN64/Contrib/StartMenu/StartMenu.c, /NSIS/branches/WIN64/Source/exehead/exec.c, /NSIS/branches/WIN64/Source/exehead/fileform.c, /NSIS/branches/WIN64/Source/exehead/Ui.c: Fixed warnings when compiling for 64-bit Windows. 2012-06-06 15:39 golubdr * /NSIS/branches/WIN64/Contrib/System/Source/System.c, /NSIS/branches/WIN64/Contrib/System/Source/System.h: Fake the system plugin for the LoadImage API function on 64-bit Windows. 2012-06-06 15:32 golubdr * /NSIS/branches/WIN64/Source/exehead/fileform.h, /NSIS/branches/WIN64/Source/fileform.cpp, /NSIS/branches/WIN64/Source/Platform.h, /NSIS/branches/WIN64/Source/writer.cpp, /NSIS/branches/WIN64/Source/writer.h: Persist background brush appropriately on 64-bit Windows. 2012-06-06 15:25 golubdr * /NSIS/branches/WIN64/Contrib/Makensisw/toolbar.cpp, /NSIS/branches/WIN64/Source/exehead/exec.c, /NSIS/branches/WIN64/Source/exehead/util.c, /NSIS/branches/WIN64/Source/exehead/util.h: Tweaks so that UI appears correct on 64-bit Windows. 2012-06-06 15:14 golubdr * /NSIS/branches/WIN64/Contrib/MakeLangId/MakeLangId.xml, /NSIS/branches/WIN64/Contrib/Makensisw/makensisw.xml, /NSIS/branches/WIN64/Contrib/zip2exe/zip2exe.xml, /NSIS/branches/WIN64/Source/manifest.cpp: Fix manifests to work on 64-bit Windows. 2012-06-06 15:07 golubdr * /NSIS/branches/WIN64/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/branches/WIN64/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/branches/WIN64/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/WIN64/Contrib/Makensisw/makensisw.h, /NSIS/branches/WIN64/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/WIN64/Contrib/System/SConscript, /NSIS/branches/WIN64/Contrib/System/Source/Plugin.c, /NSIS/branches/WIN64/Contrib/System/Source/Plugin.h, /NSIS/branches/WIN64/Contrib/System/Source/System.c, /NSIS/branches/WIN64/Contrib/System/Source/System.h, /NSIS/branches/WIN64/Contrib/zip2exe/main.cpp, /NSIS/branches/WIN64/SCons/Config/ms, /NSIS/branches/WIN64/SConstruct, /NSIS/branches/WIN64/Source/exehead/Ui.c: Basic changes to get NSIS to compile on 64-bit Windows. 2012-06-05 21:09 golubdr * /NSIS/branches/WIN64: Branch for port to 64-bit Windows. 2012-06-05 21:04 golubdr * /NSIS/branches/WIN64: Removed bad branch. 2012-06-05 20:37 golubdr * /NSIS/branches/WIN64: Branch for port to 64-bit Windows. 2012-03-06 23:09 anders_k * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h: System plugin: Basic x64 fixes 2012-03-06 01:21 anders_k * /NSIS/trunk/Docs/src/config.but: Docs: Fix escape warning 2012-03-06 00:26 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h: System plugin: Prefer A/W export when t type is used 2012-03-05 23:29 anders_k * /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Contrib/InstallOptions/SConscript, /NSIS/trunk/Contrib/nsDialogs/SConscript, /NSIS/trunk/SConstruct: Generate ansi and unicode plugins 2012-03-01 21:12 anders_k * /NSIS/trunk/Docs/src/sec.but: Clarify GetCurInstType documentation 2012-03-01 21:06 anders_k * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Unicode on posix fixes 2012-02-28 22:40 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/tchar.h, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/tstring.h: Unicode fixes 2012-02-27 22:16 anders_k * /NSIS/trunk/Source/Plugins.cpp: ifstream does not have a wchar_t constructor, use FILE* and our FOPEN wrapper. 2012-02-24 15:25 anders_k * /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/style.css, /NSIS/trunk/Source/exehead/exec.c: FileRead is problematic on unicode, just document it for now and hope we can fix it later... 2012-02-24 12:56 anders_k * /NSIS/trunk/Docs/src/bin/halibut/input.c: Halibut: Allow macros to work across files (Upstream rev4803) 2011-12-15 23:35 anders_k * /NSIS/trunk/SConstruct: SCons options display hack: Fix ListVariable to generate comma separated (quoted if required) list of allowed names 2011-12-15 20:07 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp: Added ${NSIS_PACKEDVERSION} predefine 2011-12-13 21:20 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Emulate g as &g16 in *() struct syntax 2011-12-13 21:16 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: Added SYSTEM_LOG "param out" output 2011-12-13 02:13 anders_k * /NSIS/trunk/Source/tstring.h: Use malloc and not GlobalAlloc in makensis (POSIX) 2011-12-13 02:04 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added some rarely used SW_ flags to ExecShell whitelist 2011-12-07 08:18 anders_k * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp: UTF-8 support for SetFont and .nlf font name in ansi build 2011-12-06 23:48 wizou * /NSIS/trunk/Source/Platform.h: fix warnings on BIF_NEWDIALOGSTYLE 2011-12-06 21:28 wizou * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: fix Unicode compilation 2011-12-06 21:25 wizou * /NSIS/trunk/Source/Platform.h: fix warnings on BIF_NEWDIALOGSTYLE 2011-12-06 21:24 wizou * /NSIS/trunk/Source/script.cpp: fix Unicode compilation 2011-12-06 21:24 wizou * /NSIS/trunk/SConstruct: fix: use right compiler for x86 target on VS2010 under Windows 64 bits 2011-12-06 21:23 wizou * /NSIS/trunk: added svn:ignore for .instdist 2011-12-06 21:04 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added <<, >> and >>> !define /math operations 2011-12-06 19:14 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added !if S==, S!=, = and <> compare ops and hex/int/float parsing support 2011-12-06 00:48 anders_k * /NSIS/trunk/Examples/makensis.nsi: Only MSVC is able to generate a compatible pluginapi.lib 2011-12-05 23:44 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/utf.cpp, /NSIS/trunk/Source/utf.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Basic UTF-8 support in ansi build so it can read UTF-8 .nlf files and LangStrings 2011-12-05 22:52 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tstring.h: Fix a couple of simple unicode merge and substart related bugs 2011-12-03 20:07 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: Halibut: Always generate fragment for chapter links in htmlsingle mode 2011-12-03 19:50 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: Halibut: Remove filename for self relative links in htmlsingle mode 2011-12-03 18:16 anders_k * /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/bin/halibut/version.c: Halibut: Include NSIS svn revision in meta generator tag 2011-12-03 00:14 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Pages/License.nsh, /NSIS/trunk/SConstruct: Fix SConstruct Mkdir exists warning and empty verbose stack pop warning in MUI2 2011-12-02 23:18 anders_k * /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/config_chm.but, /NSIS/trunk/Docs/src/config_html.but, /NSIS/trunk/Docs/src/config_htmlsingle.but, /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/SConstruct: Replaced CHMDOCS build switch with DOCTYPES=chm,html,htmlsingle 2011-12-02 04:30 kichik * /NSIS/trunk/Include/SConscript: added missing NSH files and converted includesWin to use Split() 2011-11-30 23:30 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Docs/src/usage.but: Docs: Added some section keywords and fudged TargetMinimalOS min-version 2011-11-30 22:17 anders_k * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: Halibut: Added \cfg{xhtml-keywordfragments}{BOOL} for named fragments 2011-11-21 20:13 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added !getdllversion [Bug#2809308,RFE#1873767] 2011-11-20 23:32 anders_k * /NSIS/trunk/Docs/src/build.but: Added and updated MSVC6 and 2003Feb SDK links 2011-11-20 22:03 anders_k * /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Source/exehead/Ui.c: Changed section index is stored in $0 during .onSelChange callbacks 2011-11-20 18:51 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: !verbose varargs support (Ex: !verbose push 3) 2011-11-19 20:22 anders_k * /NSIS/trunk/Contrib/SubStart/SConscript, /NSIS/trunk/SConstruct: Don't install "bin\substart.exe" 2011-11-19 19:53 anders_k * /NSIS/trunk/Contrib/SubStart/SConscript, /NSIS/trunk/SConstruct: Make sure SubStart is a CLI app (MinGW/GNU config bug) 2011-11-19 15:41 anders_k * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: Changed SetWindowLong to SetWindowLongPtr and removed WNDPROC related casts 2011-11-17 21:04 anders_k * /NSIS/trunk/Source/tokens.cpp: Fixed two old token definition bugs: !if only supports a single expression !undef only takes one parameter 2011-11-17 20:53 anders_k * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/defines.but: Fixed two typos 2011-11-17 18:54 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added !macroundef 2011-11-17 18:16 anders_k * /NSIS/trunk/Contrib/System/SConscript: Fixed .Sx vs .sx file extension in scons script 2011-11-17 16:04 anders_k * /NSIS/trunk/Contrib/System/Source/Call.sx: MinGW needs Call.sx 2011-11-17 16:00 anders_k * /NSIS/trunk/Contrib/System/SConscript: Detect ASM+C pre-processor file extension for MinGW with SCons 1.1+ 2011-11-15 23:12 kichik * /NSIS/trunk/SCons/Config/ms: document the weird workaround 2011-11-15 17:59 anders_k * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added UnsafeStrCpy 2011-11-13 17:31 anders_k * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Added ${__MACRO__} 2011-11-13 15:34 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added !if /FileExists 2011-11-09 18:24 anders_k * /NSIS/trunk/Contrib/Math/Source/Math.c: Math: Unicode merge made MinGW build crash again (Bug#2835731), adding fix back in 2011-11-09 18:12 anders_k * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/update.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/httpget.h, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/NSISdl/util.h, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h: Fix a lot of MinGW/GCC warnings 2011-11-09 10:30 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: MakeNSIS console warn/err colors on Win32 2011-11-09 08:51 anders_k * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: MGA_SHGetKnownFolderPath is not used by anyone 2011-11-09 08:43 anders_k * /NSIS/trunk/Source/exehead/Main.c: Replaced KNOWNFOLDER(LocalAppDataLow)\Temp with %Temp%\Low and now sets environment var 2011-11-08 23:18 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: nsDialogs: Bugfix for __NSD_LoadAndSetImage $R0 as parameter conflict 2011-09-23 17:36 anders_k * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/tokens.cpp: Fixed some old typos 2011-09-13 16:18 anders_k * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: MUI2: Fixed bugs 3400067, 3408407: MUI_FINISHPAGE_TITLE_3LINES padding + reboot 2011-09-12 18:06 anders_k * /NSIS/trunk/Include/WinMessages.nsh: Added all known PBM_ messages and a couple of CCM_ messages 2011-07-29 22:11 anders_k * /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added VIFileVersion instruction and fixed version info resource default language 2011-06-25 19:29 f0rt * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Tools/crossmingw.py: Allow building with a specific win32 targeted cross compiler (#3305366) 2011-06-15 22:57 anders_k * /NSIS/trunk/Source/Platform.h: Fix stupid C&P error 2011-06-15 22:48 anders_k * /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/SConscript: Fixes for MinGW (substart and system.dll still broken) 2011-06-09 20:05 anders_k * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Allow multiple !finalize commands 2011-05-28 18:45 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/usection.but, /NSIS/trunk/Docs/src/usefulinfos.but: applied patch #3307144 - more cross links in documentation (whyeye) 2011-05-02 19:32 f0rt * /NSIS/trunk/SCons/utils.py: Avoid a clash when scons is run in parallel operation (#3295528) 2011-05-02 19:14 f0rt * /NSIS/trunk/Contrib/nsDialogs/InstallOptions.nsi, /NSIS/trunk/Contrib/System/SysFunc.nsh: Use relative paths in .nsi script examples (#3293899) 2011-03-24 16:29 anders_k * /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/WinCore.nsh: Added IApplicationAssociationRegistration[UI] 2011-03-21 05:41 kichik * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nsh: latest from Kli-Ali and Yinghua Wang 2011-03-17 18:47 anders_k * /NSIS/trunk/Examples/makensis.nsi: Include Win\Propkey.nsh in installer 2011-03-13 20:41 anders_k * /NSIS/trunk/Include/Win/COM.nsh, /NSIS/trunk/Include/Win/Propkey.nsh: More .nsh COM stuff (IShellItem, IStartMenuPinnedList, IPropertyStore and basic PROPVARIANT support) 2011-03-13 20:31 anders_k * /NSIS/trunk/Include/Win/WinNT.nsh, /NSIS/trunk/Include/WinVer.nsh: Defend against VER_PLATFORM_WIN32_NT conflict 2011-03-11 05:35 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/Win/COM.nsh: Created Include\Win\COM.nsh 2011-03-11 05:27 anders_k * /NSIS/trunk/Docs/src/registry.but: Fixed typo 2011-03-01 17:31 anders_k * /NSIS/trunk/Source/Platform.h: Reorganized defines 2011-02-08 12:00 kichik * /NSIS/branches/nobjs/closed tickets.txt, /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/nobj/containers, /NSIS/branches/nobjs/Source/nobj/containers/container.cpp, /NSIS/branches/nobjs/Source/nobj/containers/container.h, /NSIS/branches/nobjs/Source/nobj/factory.cpp, /NSIS/branches/nobjs/Source/nobj/factory.h, /NSIS/branches/nobjs/Source/nobj/file.cpp, /NSIS/branches/nobjs/Source/nobj/file.h, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h, /NSIS/branches/nobjs/Source/nobj/nobj.h, /NSIS/branches/nobjs/Source/nobj/str.cpp, /NSIS/branches/nobjs/Source/nobj/str.h, /NSIS/branches/nobjs/Source/SConscript, /NSIS/branches/nobjs/Source/stubdata.cpp, /NSIS/branches/nobjs/Source/stubdata.h: committing so it doesn't get lost not sure it's functional 2010-11-15 23:45 anders_k * /NSIS/trunk/Contrib/System/System.html: GetProcAddress is always ansi 2010-11-15 18:17 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: A working COUNTOF would be nice 2010-11-15 18:02 anders_k * /NSIS/trunk/Contrib/System/Source/System.c: VC6 fixes when using SYSTEM_LOG_DEBUG 2010-11-15 15:40 anders_k * /NSIS/trunk/Source/makenssi.cpp: Win32 only 2010-11-13 21:13 kichik * /NSIS/trunk/SCons/Config/ms: vc 10 doesn't like /opt:nowin98 or even /align:512 2010-11-13 21:07 kichik * /NSIS/trunk/Docs/src/compiler.but: fixed dup section names 2010-11-13 20:40 kichik * /NSIS/trunk/SConstruct: what's this doing here? 2010-10-02 16:27 f0rt * /NSIS/trunk/SConstruct: #3075573: Use variant_dir instead of build_dir in SConstruct file 2010-10-02 01:55 anders_k * /NSIS/trunk/Include/Win/WinDef.nsh: Fix bug #3078983 _Win_HIWORD macro outvar error 2010-09-24 18:43 anders_k * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Switch param type to LPCTSTR 2010-09-21 21:56 anders_k * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Fix for bug #3072159 - UNexpected Changes to Directory Attributes 2010-08-19 21:10 anders_k * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Try FOLDERID_LocalAppDataLow\Temp as last ValidateTempDir() attempt for Low IL aka Protected IE 2010-07-09 15:12 wizou * /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Source/script.cpp: Updated documentation and file functions for Unicode support 2010-07-09 13:52 wizou * /NSIS/trunk/Contrib/Language files/Cibemba.nlf, /NSIS/trunk/Contrib/Language files/Cibemba.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Efik.nlf, /NSIS/trunk/Contrib/Language files/Efik.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/Georgian.nlf, /NSIS/trunk/Contrib/Language files/Georgian.nsh, /NSIS/trunk/Contrib/Language files/Igbo.nlf, /NSIS/trunk/Contrib/Language files/Igbo.nsh, /NSIS/trunk/Contrib/Language files/Khmer.nlf, /NSIS/trunk/Contrib/Language files/Khmer.nsh, /NSIS/trunk/Contrib/Language files/Malagasy.nlf, /NSIS/trunk/Contrib/Language files/Malagasy.nsh, /NSIS/trunk/Contrib/Language files/Pashto.nlf, /NSIS/trunk/Contrib/Language files/Pashto.nsh, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Swahili.nlf, /NSIS/trunk/Contrib/Language files/Swahili.nsh, /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Language files/Valencian.nsh, /NSIS/trunk/Contrib/Language files/Yoruba.nlf, /NSIS/trunk/Contrib/Language files/Yoruba.nsh: Merging language files from Jim Park's repository (new files and some changes) 2010-07-09 12:56 wizou * /NSIS/trunk/Contrib/Language files/Kurdish.nsh: Fix encoding error in Kurdish 2010-07-09 09:30 wizou * /NSIS/trunk/Contrib/Language files/Kurdish.nlf: Fix encoding error in Kurdish 2010-07-09 09:18 wizou * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Asturian.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Vietnamese.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh, /NSIS/trunk/Include/LangFile.nsh: LANGFILE macro arguments now include a localized name AND an ASCII-only name (closest possible to the localized name) 2010-07-08 15:30 wizou * /NSIS/trunk/Contrib/Language files/Afrikaans.nlf, /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Asturian.nlf, /NSIS/trunk/Contrib/Language files/Asturian.nsh, /NSIS/trunk/Contrib/Language files/Basque.nlf, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nlf, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Esperanto.nlf, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nlf, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nlf, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nlf, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nlf, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nlf, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nlf, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nlf, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nlf, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nlf, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nlf, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Vietnamese.nlf, /NSIS/trunk/Contrib/Language files/Vietnamese.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nlf, /NSIS/trunk/Contrib/Language files/Welsh.nsh: Converting Language files to Unicode (UTF-8) according to each associated codepage 2010-07-08 15:12 wizou * /NSIS/branches/ANSI: Creating a branch for ANSI variant (just in case), before making changes in trunk that will break ANSI MakeNsis.exe 2010-07-06 21:47 wizou * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp: minor change (added "const") 2010-07-04 20:15 anders_k * /NSIS/trunk/Source/exehead/util.h: fixed signed/unsigned warnings 2010-07-04 00:07 wizou * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/mmap.cpp: added MSVS_VERSION option to scons command-line to specify which compiler to use 2010-06-17 15:56 wizou * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/mmap.cpp: Improving compression performance (avoiding unnecessary file flush and better handling the 2GB limit) 2010-06-17 10:11 wizou * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp: Adding new ${__FILEDIR__} preprocessor define containing directory of current script 2010-06-16 16:01 wizou * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: #1787648: ${__SECTION__} is correctly defined in hidden section 2010-06-16 15:07 wizou * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp: Default OutFile determined by NSI script filename 2010-06-16 14:20 wizou * /NSIS/trunk/Source/build.cpp: CR/LF fix 2010-06-16 14:19 wizou * /NSIS/trunk/Docs/src/compiler.but: documenting !finalize 2010-06-16 14:10 wizou * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: #1977885: adding !finalize preprocessor commands for post-build execution 2010-06-14 15:24 wizou * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Changed keyword UnicodeInstaller to a more versatile TargetMinimalOS keyword 2010-06-14 14:28 wizou * /NSIS/trunk/Source/exehead/fileform.h: Fix a problem with ANSI/Unicode different opcode numbers 2010-06-14 10:07 wizou * /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: Unicode port: Unicode version of NSIS can now generate both ANSI & Unicode installers (using new instruction UnicodeInstaller on/off). Stubs & Plugins differentiation is done automatically using a 'W' suffix. SConscripts need to be reviewed to generate both variants of Plugins & pluginapi.lib under Unicode compilation. 2010-06-11 16:33 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Fixed and documented !if & operator 2010-06-10 20:54 anders_k * /NSIS/trunk/Docs/src/defines.but: small grammar fix 2010-06-10 20:42 anders_k * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Added !define /ifndef and !define /redef optional arguments 2010-05-28 14:09 wizou * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Source/script.cpp: Merging various fixes from latest Jim Park repository 2010-05-28 13:30 wizou * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh: Unicode port: Auto-convert InstallOptions INI files to Unicode, to support Unicode texts 2010-05-28 13:27 wizou * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/tstring.h: Unicode port: Generate Unicode LangStrings even if source was an ANSI file 2010-05-28 13:10 wizou * /NSIS/trunk/INSTALL, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h: Unicode port: Generate Unicode LangStrings even if source was an ANSI file 2010-05-19 15:21 wizou * /NSIS/trunk/Contrib/nsExec/nsexec.c: nsExec Unicode port by Jim Park (is this correct??) 2010-05-19 15:18 wizou * /NSIS/trunk/Contrib/nsExec/nsexec.c: nsExec small simplification 2010-05-17 15:46 wizou * /NSIS/trunk/Source/DialogTemplate.cpp: Unicode port: Turn RichEdit20A controls into RichEdit20W automatically 2010-05-17 15:11 wizou * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Unicode port: adding UTF-16LE file functions 2010-05-10 17:44 f0rt * /NSIS/trunk/Source/zlib/INFBLOCK.C: #2995455: Make NSIS embedded inflate function compatible with zlib 2010-05-07 16:13 wizou * /NSIS/trunk/Source/makenssi.cpp: Unicode port: restore initial console codepage on exit 2010-05-07 15:35 wizou * /NSIS/trunk/Source/makenssi.cpp: Unicode port: Makensis subprocesses (like !system) also use UTF-8 output 2010-05-07 13:54 wizou * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/zip2exe/main.cpp: Unicode port: Adapted MakensisW & zip2exe for UTF-8 (avoid cutting sequence). Also fix a bug where they would get stuck if output log was multiple of 1023 bytes. Simplification of reading loop. 2010-05-06 19:24 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis.pas: Added some plugincallback api stuff and fixed spelling 2010-05-05 14:14 wizou * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/tstring.cpp: Unicode port: Turn console & output logs to UTF-8. Adapted MakensisW for UTF-8 2010-05-04 22:28 anders_k * /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: VC6 unicode fixes, NSISException still broken 2010-05-04 08:33 wizou * /NSIS/trunk/Source/exehead/Ui.c: warning fix 2010-05-04 08:21 wizou * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp: Unicode port: Support for Unicode license files 2010-05-03 20:02 afrow_uk * /NSIS/trunk/Contrib/zip2exe/Modern.nsh: Changed to use MUI2.nsh 2010-05-03 14:04 wizou * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Adding CEXEBuild::LoadLicenseFile shared by TOK_LICENSELANGSTRING & TOK_LICENSEDATA 2010-05-03 10:12 wizou * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h: Minor changes on FOPENTEXT 2010-04-30 20:17 afrow_uk * /NSIS/trunk/Include/Sections.nsh: Resubmitted Sections.nsh with StrCpy ops back in (and added to my macros). Thanks Anders :S I spose conditional compilation would be a better solution but meh! 2010-04-30 18:42 afrow_uk * /NSIS/trunk/Contrib/ExDLL/exdll-vs2008.vcproj: Fixed bug #2994202 - ExDll vcproj defines VC90 CRT dependency 2010-04-30 18:36 afrow_uk * /NSIS/trunk/Include/Sections.nsh: Added RemoveSection and UnremoveSection macros to hide+unselect and show+select a section. Removed some unnecessary StrCpy ops from the other macros. 2010-04-30 16:39 wizou * /NSIS/trunk/Source/script.cpp: oops 2010-04-30 14:48 wizou * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: Using standard wchar string functions instead of winchar_* 2010-04-28 22:24 anders_k * /NSIS/trunk/Contrib/ExDLL/nsis.pas: Extra_params functions are stdcall 2010-04-21 12:45 wizou * /NSIS/trunk/Examples/makensis.nsi: oops.. reverting unwanted changes on makensis.nsi 2010-04-21 09:09 wizou * /NSIS/trunk/Contrib/Makensisw/afxres.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Examples/makensis.nsi: MakeNSISW now uses RichEdit 2.0, compatible with Unicode (exehead UIs already uses it anyway) 2010-04-21 08:55 wizou * /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Source/Tests/winver.nsi: Unicode: Fixed some scripts 2010-04-20 15:29 wizou * /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h: Unicode: Improved UTF8 detection, less verbose 2010-04-20 09:04 wizou * /NSIS/trunk/Source/tstring.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/validateunicode.cpp, /NSIS/trunk/Source/validateunicode.h: Unicode port: Support for Unicode/UTF8 input files by Jim Park. 2010-04-19 10:06 wizou * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Bug fix & simplification on SetArgv 2010-04-19 10:05 wizou * /NSIS/trunk/Source/lang.cpp: Unicode port: default to Unicode VERSIONINFO resources 2010-04-17 23:20 kichik * /NSIS/trunk/Contrib/SubStart/SConscript, /NSIS/trunk/SConstruct: install substart.exe as makensis.exe this distribution code needs some serious cleanup... 2010-04-17 22:58 kichik * /NSIS/trunk/SCons/Config/ms: workaround for platform sdk problems with scons 1.3.0 2010-04-17 21:42 kichik * /NSIS/trunk/SCons/Tools/mstoolkit.py: fixed nightly build 7.1... 7.1... not 8. what just happened here? 2010-04-17 21:20 kichik * /NSIS/trunk/SCons/Tools/mstoolkit.py: fixed nightly build 2010-04-16 14:56 anders_k * /NSIS/trunk/Contrib/SubStart/substart.c: Return exit code from child process 2010-04-15 12:11 wizou * /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/uservars.h: Additional error checking by Jim Park. Also some cleaning. 2010-04-15 08:51 wizou * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Source/exehead/util.c: Fixed bug and Unicode support in RenameViaWininit function 2010-04-14 16:27 wizou * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/script.cpp: Added comments, and removed unused #include 2010-04-14 16:02 wizou * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/strlist.h: Unicode port: fixing special NSIS escape characters in strings. No change in exehead size. 2010-04-14 15:51 wizou * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.h: Adapting CHAR4_TO_DWORD-style constructions. No change in exehead. 2010-04-14 14:27 wizou * /NSIS/trunk/Source/exehead/exec.c: Reducing exehead by 9 bytes and making Anders happy 2010-04-14 10:15 wizou * /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/uservars.h: Some TCHAR fixes, linker flag for Unicode, and cosmetic touch without real changes 2010-04-13 16:14 wizou * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h: Fix use of wrong MBCS version of string functions. (When playing with TCHAR pointers, most of the time you deal with a number of BYTE/WORD, not a number of multi-byte characters) 2010-04-13 15:25 wizou * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html: Adding Unicode support to System plugin 2010-04-13 15:19 wizou * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/uservars.h: Just renaming some class members and adding Jim Park's comments 2010-04-13 15:01 wizou * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Fix exehead unicode compil warnings 2010-04-12 16:00 wizou * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Contrib/MakeLangId/SConscript, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/version.cpp, /NSIS/trunk/Contrib/UIs/SConscript, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.h, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: more simple TCHARs fixes 2010-03-31 19:16 wizou * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: fix compiler error 2010-03-30 17:50 anders_k * /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp: _countof and swprintf fixes for VC6 2010-03-30 12:27 f0rt * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL, /NSIS/trunk/SConstruct: #2918870: Ensure minimum scons version of 1.2.0 otherwise build scripts won't work. 2010-03-29 15:59 wizou * /NSIS/trunk/Source/strlist.h: fixed text format 2010-03-29 15:32 wizou * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tstring.h: a little bit more TCHARs and minor fixes 2010-03-29 14:24 wizou * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.h, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/util.cpp: Jim Park's Unicode NSIS merging - Step 4 : merging more TCHAR stuff that shouldn't have any impact 2010-03-27 19:20 f0rt * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp: #1753070: Enable that makensis and its related utilities can be built natively for 64-bit systems 2010-03-27 15:52 f0rt * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/zlib/DEFLATE.H: #2918870: Detect Win32 zlib in flat and include/lib directory structure, updated INSTALL and build documentation, removed obsolete Source\zlib\DEFLATE.H. 2010-03-26 17:42 wizou * /NSIS/branches/wizou, /NSIS/branches/wizou/Contrib/ExDLL/exdll-vs2008.sln, /NSIS/branches/wizou/Contrib/ExDLL/pluginapi.c, /NSIS/branches/wizou/Contrib/ExDLL/pluginapi.h, /NSIS/branches/wizou/Contrib/Language files/Asturian.nlf, /NSIS/branches/wizou/Contrib/Language files/Asturian.nsh, /NSIS/branches/wizou/Contrib/Language files/German.nlf, /NSIS/branches/wizou/Contrib/Language files/German.nsh, /NSIS/branches/wizou/Contrib/Language files/Italian.nsh, /NSIS/branches/wizou/Contrib/Language files/Russian.nsh, /NSIS/branches/wizou/Contrib/Language files/SConscript, /NSIS/branches/wizou/Contrib/Language files/Spanish.nlf, /NSIS/branches/wizou/Contrib/Language files/Spanish.nsh, /NSIS/branches/wizou/Contrib/Language files/SpanishInternational.nlf, /NSIS/branches/wizou/Contrib/Language files/SpanishInternational.nsh, /NSIS/branches/wizou/Contrib/Language files/Vietnamese.nlf, /NSIS/branches/wizou/Contrib/Language files/Vietnamese.nsh, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/connection.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/util.h, /NSIS/branches/wizou/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/branches/wizou/Contrib/NSIS Menu/SConscript, /NSIS/branches/wizou/Contrib/NSISdl/asyncdns.cpp, /NSIS/branches/wizou/Contrib/NSISdl/asyncdns.h, /NSIS/branches/wizou/Contrib/NSISdl/connection.cpp, /NSIS/branches/wizou/Contrib/NSISdl/connection.h, /NSIS/branches/wizou/Contrib/NSISdl/httpget.cpp, /NSIS/branches/wizou/Contrib/NSISdl/httpget.h, /NSIS/branches/wizou/Contrib/NSISdl/netinc.h, /NSIS/branches/wizou/Contrib/NSISdl/util.cpp, /NSIS/branches/wizou/Contrib/NSISdl/util.h, /NSIS/branches/wizou/Contrib/StartMenu/StartMenu.c, /NSIS/branches/wizou/Contrib/SubStart, /NSIS/branches/wizou/Contrib/SubStart/ReadMe.txt, /NSIS/branches/wizou/Contrib/SubStart/SConscript, /NSIS/branches/wizou/Contrib/SubStart/substart.c, /NSIS/branches/wizou/Contrib/System/Source/Buffers.c, /NSIS/branches/wizou/Contrib/System/Source/System.c, /NSIS/branches/wizou/Contrib/System/Source/System.h, /NSIS/branches/wizou/Contrib/System/SysFunc.nsh, /NSIS/branches/wizou/Contrib/System/System.html, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/adler32.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/SConscript, /NSIS/branches/wizou/Contrib/zip2exe/SConscript, /NSIS/branches/wizou/Contrib/zip2exe/zlib/adler32.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/crc32.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/crc32.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inffast.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inffast.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inffixed.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inflate.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inflate.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inftrees.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/inftrees.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/ioapi.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/unzip.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/unzip.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/zconf.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/zlib.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/zutil.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/zutil.h, /NSIS/branches/wizou/Docs/src/build.but, /NSIS/branches/wizou/Docs/src/credits.but, /NSIS/branches/wizou/Docs/src/history.but, /NSIS/branches/wizou/Docs/src/library.but, /NSIS/branches/wizou/Docs/src/SConscript, /NSIS/branches/wizou/Examples/LogicLib.nsi, /NSIS/branches/wizou/Examples/makensis.nsi, /NSIS/branches/wizou/Examples/Modern UI/MultiLanguage.nsi, /NSIS/branches/wizou/Include/LogicLib.nsh, /NSIS/branches/wizou/Menu/images/header.gif, /NSIS/branches/wizou/SCons/Config/gnu, /NSIS/branches/wizou/SCons/utils.py, /NSIS/branches/wizou/SConstruct, /NSIS/branches/wizou/Scripts/release.py, /NSIS/branches/wizou/Source/build.cpp, /NSIS/branches/wizou/Source/czlib.h, /NSIS/branches/wizou/Source/exehead/exec.c, /NSIS/branches/wizou/Source/makenssi.cpp, /NSIS/branches/wizou/Source/SConscript, /NSIS/branches/wizou/Source/Tests/SConscript, /NSIS/branches/wizou/Source/zlib/deflate.c, /NSIS/branches/wizou/Source/zlib/trees.c: Jim Park's Unicode NSIS merging - Step 3 : update my branch with latest changes 2010-03-26 17:18 wizou * /NSIS/trunk, /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/nsis_tchar.h, /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.h, /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/Makensisw/afxres.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/update.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/version.cpp, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/Math.h, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/Math/Source/MyMath.h, /NSIS/trunk/Contrib/Math/Source/plugin.c, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/defs.h, /NSIS/trunk/Contrib/nsDialogs/input.c, /NSIS/trunk/Contrib/nsDialogs/input.h, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/rtl.c, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Contrib/NSIS Menu/wx/setup.h, /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat, /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/asyncdns.h, /NSIS/trunk/Contrib/NSISdl/connection.cpp, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/httpget.h, /NSIS/trunk/Contrib/NSISdl/netinc.h, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/NSISdl/util.h, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/UIs/default.rc, /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/resource.h, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc, /NSIS/trunk/Contrib/UIs/ui.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/adler32.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/adler32.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/Checksums.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/Checksums.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/ChunkedFile.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/FileFormat1.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/FileFormat1.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/md5.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/md5.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/POSIXUtil.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/tchar.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/apply_patch.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/apply_patch.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/checksum.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/checksum.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/md5.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/md5.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.c, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.h, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Menu/index.html, /NSIS/trunk/SCons/config.py, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tchar.h, /NSIS/trunk/Source/Tests/memcpy.c, /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/SConscript, /NSIS/trunk/Source/Tests/specmatch.cpp, /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/tstring.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H, /NSIS/trunk/TODO.txt: Jim Park's Unicode NSIS merging - Step 2 : merge TCHARs changes into trunk Compiler output is identical before & after this step 2010-03-24 17:22 wizou * /NSIS/branches/wizou/Contrib/AdvSplash/advsplash.c, /NSIS/branches/wizou/Contrib/Banner/Banner.c, /NSIS/branches/wizou/Contrib/BgImage/BgImage.cpp, /NSIS/branches/wizou/Contrib/Dialer/dialer.c, /NSIS/branches/wizou/Contrib/ExDLL/exdll.c, /NSIS/branches/wizou/Contrib/ExDLL/nsis_tchar.h, /NSIS/branches/wizou/Contrib/ExDLL/pluginapi.c, /NSIS/branches/wizou/Contrib/ExDLL/pluginapi.h, /NSIS/branches/wizou/Contrib/ExDLL/SConscript, /NSIS/branches/wizou/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/wizou/Contrib/LangDLL/LangDLL.c, /NSIS/branches/wizou/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/branches/wizou/Contrib/Library/RegTool/RegTool.c, /NSIS/branches/wizou/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/branches/wizou/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/branches/wizou/Contrib/Makensisw/afxres.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/connection.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/branches/wizou/Contrib/Makensisw/jnetlib/util.h, /NSIS/branches/wizou/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/wizou/Contrib/Makensisw/makensisw.h, /NSIS/branches/wizou/Contrib/Makensisw/toolbar.cpp, /NSIS/branches/wizou/Contrib/Makensisw/toolbar.h, /NSIS/branches/wizou/Contrib/Makensisw/update.cpp, /NSIS/branches/wizou/Contrib/Makensisw/update.h, /NSIS/branches/wizou/Contrib/Makensisw/utils.cpp, /NSIS/branches/wizou/Contrib/Makensisw/utils.h, /NSIS/branches/wizou/Contrib/Makensisw/version.cpp, /NSIS/branches/wizou/Contrib/Math/Source/Math.c, /NSIS/branches/wizou/Contrib/Math/Source/Math.h, /NSIS/branches/wizou/Contrib/Math/Source/MyMath.c, /NSIS/branches/wizou/Contrib/Math/Source/MyMath.h, /NSIS/branches/wizou/Contrib/Math/Source/plugin.c, /NSIS/branches/wizou/Contrib/nsDialogs/browse.c, /NSIS/branches/wizou/Contrib/nsDialogs/defs.h, /NSIS/branches/wizou/Contrib/nsDialogs/input.c, /NSIS/branches/wizou/Contrib/nsDialogs/input.h, /NSIS/branches/wizou/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/wizou/Contrib/nsDialogs/rtl.c, /NSIS/branches/wizou/Contrib/nsExec/nsexec.c, /NSIS/branches/wizou/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/branches/wizou/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/branches/wizou/Contrib/NSIS Menu/SConscript, /NSIS/branches/wizou/Contrib/NSIS Menu/wx/setup.h, /NSIS/branches/wizou/Contrib/NSIS Menu/wx/wxbuild.bat, /NSIS/branches/wizou/Contrib/NSISdl/asyncdns.cpp, /NSIS/branches/wizou/Contrib/NSISdl/asyncdns.h, /NSIS/branches/wizou/Contrib/NSISdl/connection.cpp, /NSIS/branches/wizou/Contrib/NSISdl/connection.h, /NSIS/branches/wizou/Contrib/NSISdl/httpget.cpp, /NSIS/branches/wizou/Contrib/NSISdl/httpget.h, /NSIS/branches/wizou/Contrib/NSISdl/netinc.h, /NSIS/branches/wizou/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/wizou/Contrib/NSISdl/util.cpp, /NSIS/branches/wizou/Contrib/NSISdl/util.h, /NSIS/branches/wizou/Contrib/Splash/splash.c, /NSIS/branches/wizou/Contrib/StartMenu/StartMenu.c, /NSIS/branches/wizou/Contrib/System/Source/Buffers.c, /NSIS/branches/wizou/Contrib/System/Source/Plugin.c, /NSIS/branches/wizou/Contrib/System/Source/Plugin.h, /NSIS/branches/wizou/Contrib/System/Source/System.c, /NSIS/branches/wizou/Contrib/System/Source/System.h, /NSIS/branches/wizou/Contrib/System/System.nsh, /NSIS/branches/wizou/Contrib/UIs/default.rc, /NSIS/branches/wizou/Contrib/UIs/modern.rc, /NSIS/branches/wizou/Contrib/UIs/resource.h, /NSIS/branches/wizou/Contrib/UIs/sdbarker_tiny.rc, /NSIS/branches/wizou/Contrib/UIs/ui.c, /NSIS/branches/wizou/Contrib/UserInfo/UserInfo.c, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/adler32.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/adler32.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/Checksums.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/Checksums.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/ChunkedFile.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/FileFormat1.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/FileFormat1.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/GlobalTypes.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/md5.c, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/md5.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/PatchGenerator.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/POSIXUtil.h, /NSIS/branches/wizou/Contrib/VPatch/Source/GenPat/tchar.h, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/apply_patch.c, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/apply_patch.h, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/checksum.c, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/checksum.h, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/md5.c, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/md5.h, /NSIS/branches/wizou/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/branches/wizou/Contrib/zip2exe/main.cpp, /NSIS/branches/wizou/Contrib/zip2exe/zlib/adler32.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/ioapi.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/ioapi.h, /NSIS/branches/wizou/Contrib/zip2exe/zlib/unzip.c, /NSIS/branches/wizou/Contrib/zip2exe/zlib/unzip.h, /NSIS/branches/wizou/Docs/src/credits.but, /NSIS/branches/wizou/Include/FileFunc.nsh, /NSIS/branches/wizou/Include/LogicLib.nsh, /NSIS/branches/wizou/Include/StrFunc.nsh, /NSIS/branches/wizou/Include/WinVer.nsh, /NSIS/branches/wizou/Menu/index.html, /NSIS/branches/wizou/SCons/config.py, /NSIS/branches/wizou/SCons/Config/ms, /NSIS/branches/wizou/SCons/Tools/mstoolkit.py, /NSIS/branches/wizou/SConstruct, /NSIS/branches/wizou/Source/7zip/7zGuids.cpp, /NSIS/branches/wizou/Source/7zip/Common/Alloc.cpp, /NSIS/branches/wizou/Source/7zip/Common/Alloc.h, /NSIS/branches/wizou/Source/7zip/Common/CRC.cpp, /NSIS/branches/wizou/Source/7zip/Common/CRC.h, /NSIS/branches/wizou/Source/7zip/LZMADecode.c, /NSIS/branches/wizou/Source/7zip/LZMADecode.h, /NSIS/branches/wizou/Source/build.cpp, /NSIS/branches/wizou/Source/build.h, /NSIS/branches/wizou/Source/bzip2/blocksort.c, /NSIS/branches/wizou/Source/bzip2/bzlib.c, /NSIS/branches/wizou/Source/bzip2/bzlib.h, /NSIS/branches/wizou/Source/bzip2/compress.c, /NSIS/branches/wizou/Source/bzip2/decompress.c, /NSIS/branches/wizou/Source/bzip2/huffman.c, /NSIS/branches/wizou/Source/cbzip2.h, /NSIS/branches/wizou/Source/clzma.cpp, /NSIS/branches/wizou/Source/clzma.h, /NSIS/branches/wizou/Source/compressor.h, /NSIS/branches/wizou/Source/crc32.c, /NSIS/branches/wizou/Source/crc32.h, /NSIS/branches/wizou/Source/czlib.h, /NSIS/branches/wizou/Source/DialogTemplate.cpp, /NSIS/branches/wizou/Source/DialogTemplate.h, /NSIS/branches/wizou/Source/dirreader.cpp, /NSIS/branches/wizou/Source/dirreader.h, /NSIS/branches/wizou/Source/exehead/api.h, /NSIS/branches/wizou/Source/exehead/bgbg.c, /NSIS/branches/wizou/Source/exehead/components.c, /NSIS/branches/wizou/Source/exehead/components.h, /NSIS/branches/wizou/Source/exehead/config.h, /NSIS/branches/wizou/Source/exehead/exec.c, /NSIS/branches/wizou/Source/exehead/exec.h, /NSIS/branches/wizou/Source/exehead/fileform.c, /NSIS/branches/wizou/Source/exehead/fileform.h, /NSIS/branches/wizou/Source/exehead/lang.h, /NSIS/branches/wizou/Source/exehead/Main.c, /NSIS/branches/wizou/Source/exehead/state.h, /NSIS/branches/wizou/Source/exehead/Ui.c, /NSIS/branches/wizou/Source/exehead/ui.h, /NSIS/branches/wizou/Source/exehead/util.c, /NSIS/branches/wizou/Source/exehead/util.h, /NSIS/branches/wizou/Source/fileform.cpp, /NSIS/branches/wizou/Source/fileform.h, /NSIS/branches/wizou/Source/growbuf.cpp, /NSIS/branches/wizou/Source/growbuf.h, /NSIS/branches/wizou/Source/icon.cpp, /NSIS/branches/wizou/Source/icon.h, /NSIS/branches/wizou/Source/lang.cpp, /NSIS/branches/wizou/Source/lang.h, /NSIS/branches/wizou/Source/lineparse.cpp, /NSIS/branches/wizou/Source/lineparse.h, /NSIS/branches/wizou/Source/makenssi.cpp, /NSIS/branches/wizou/Source/manifest.cpp, /NSIS/branches/wizou/Source/manifest.h, /NSIS/branches/wizou/Source/mmap.cpp, /NSIS/branches/wizou/Source/mmap.h, /NSIS/branches/wizou/Source/Platform.h, /NSIS/branches/wizou/Source/Plugins.cpp, /NSIS/branches/wizou/Source/Plugins.h, /NSIS/branches/wizou/Source/ResourceEditor.cpp, /NSIS/branches/wizou/Source/ResourceEditor.h, /NSIS/branches/wizou/Source/ResourceVersionInfo.cpp, /NSIS/branches/wizou/Source/ResourceVersionInfo.h, /NSIS/branches/wizou/Source/script.cpp, /NSIS/branches/wizou/Source/ShConstants.cpp, /NSIS/branches/wizou/Source/ShConstants.h, /NSIS/branches/wizou/Source/strlist.cpp, /NSIS/branches/wizou/Source/strlist.h, /NSIS/branches/wizou/Source/tchar.h, /NSIS/branches/wizou/Source/Tests/memcpy.c, /NSIS/branches/wizou/Source/Tests/mmap.cpp, /NSIS/branches/wizou/Source/Tests/SConscript, /NSIS/branches/wizou/Source/Tests/specmatch.cpp, /NSIS/branches/wizou/Source/Tests/winchar.cpp, /NSIS/branches/wizou/Source/tokens.cpp, /NSIS/branches/wizou/Source/tokens.h, /NSIS/branches/wizou/Source/tstring.h, /NSIS/branches/wizou/Source/uservars.h, /NSIS/branches/wizou/Source/util.cpp, /NSIS/branches/wizou/Source/util.h, /NSIS/branches/wizou/Source/winchar.cpp, /NSIS/branches/wizou/Source/winchar.h, /NSIS/branches/wizou/Source/writer.cpp, /NSIS/branches/wizou/Source/writer.h, /NSIS/branches/wizou/Source/zlib/deflate.c, /NSIS/branches/wizou/Source/zlib/DEFLATE.H, /NSIS/branches/wizou/Source/zlib/INFBLOCK.C, /NSIS/branches/wizou/Source/zlib/trees.c, /NSIS/branches/wizou/Source/zlib/ZCONF.H, /NSIS/branches/wizou/Source/zlib/ZLIB.H, /NSIS/branches/wizou/Source/zlib/ZUTIL.H, /NSIS/branches/wizou/TODO.txt: Jim Park's Unicode NSIS merging - Step 1 : switch to TCHARs where relevant. Compiler output is identical before & after this step 2010-02-20 16:35 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed bug #2932991 - define DEBUG conflict 2010-02-20 16:19 kichik * /NSIS/trunk/Docs/src/library.but: oops... typo 2010-02-08 19:18 f0rt * /NSIS/trunk/SConstruct: patch 2918870: reverted fix attempt to install substart.exe as makensis.exe in root directory when installing 2010-02-07 21:24 f0rt * /NSIS/trunk/Contrib/SubStart, /NSIS/trunk/Contrib/SubStart/ReadMe.txt, /NSIS/trunk/Contrib/SubStart/SConscript, /NSIS/trunk/Contrib/SubStart/substart.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/adler32.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/SConscript, /NSIS/trunk/Contrib/zip2exe/SConscript, /NSIS/trunk/Contrib/zip2exe/zlib/adler32.c, /NSIS/trunk/Contrib/zip2exe/zlib/crc32.c, /NSIS/trunk/Contrib/zip2exe/zlib/crc32.h, /NSIS/trunk/Contrib/zip2exe/zlib/inffast.c, /NSIS/trunk/Contrib/zip2exe/zlib/inffast.h, /NSIS/trunk/Contrib/zip2exe/zlib/inffixed.h, /NSIS/trunk/Contrib/zip2exe/zlib/inflate.c, /NSIS/trunk/Contrib/zip2exe/zlib/inflate.h, /NSIS/trunk/Contrib/zip2exe/zlib/inftrees.c, /NSIS/trunk/Contrib/zip2exe/zlib/inftrees.h, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/Contrib/zip2exe/zlib/zconf.h, /NSIS/trunk/Contrib/zip2exe/zlib/zlib.h, /NSIS/trunk/Contrib/zip2exe/zlib/zutil.c, /NSIS/trunk/Contrib/zip2exe/zlib/zutil.h, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/Tests/SConscript, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/trees.c: applied patch #2918870 - use of the zlib compression library provided by the system 2010-02-06 17:04 kichik * /NSIS/trunk/Source/exehead/exec.c: applied patch #2920342 - add error checking to SetCurrentDirectory 2010-02-06 17:00 kichik * /NSIS/trunk/SCons/Config/gnu: applied patch #2930854 - mingw compiled makensis: installers don't show bitmaps (fixed plug-in compatibility with mingw 4.4) 2010-02-06 15:51 kichik * /NSIS/trunk/Contrib/System/Source/System.h: asm is a reserved word for gcc 2010-02-06 13:19 kichik * /NSIS/trunk/Contrib/Language files/Asturian.nlf, /NSIS/trunk/Contrib/Language files/Asturian.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added Asturian by Marcos 2010-02-06 12:57 kichik * /NSIS/trunk/Contrib/ExDLL/exdll-vs2008.sln: pointing to wrong vcproj 2010-01-30 18:16 anders_k * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: Fixed bug #2939230 - Enable NextBtn with skip create checked and empty name 2010-01-24 23:37 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nsh: fixed bug #2873578 - Italian MUI Page Down license page translation 2010-01-24 23:33 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nlf, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh: fixed bug #2842264 - Infinitive Spanish string need to be Present Continuous 2010-01-24 23:29 joostverburg * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/Vietnamese.nlf, /NSIS/trunk/Contrib/Language files/Vietnamese.nsh: Vietnamese translation contributed by Hùng. NGUYEN Manh 2010-01-24 23:27 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/German.nsh: applied path #2840090 - German Translation Update 2010-01-24 23:21 joostverburg * /NSIS/trunk/Contrib/Language files/Russian.nsh: fixed bug #2848552 - Missed Russian translations for MULTIUSER_INSTALLMODEPAGE 2010-01-24 23:13 joostverburg * /NSIS/trunk/Contrib/Language files/Russian.nsh: add translation for Multi-User Header File - contribution by Artem Khaymenov 2010-01-04 11:24 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed bug #2925015 - nsDialogs.nsh uses LB_DELETESTRING message in the wrong way 2009-12-21 21:25 anders_k * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h: System Plugin: Fixed callback proc numbers and memleak in Free() 2009-12-21 19:03 anders_k * /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.html: System Plugin: Changed i to p in readme and sysfunc.nsh (Still need to deal with system.nsh and other .nsh's) 2009-12-21 15:04 anders_k * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.html: System Plugin: Support for p as pointer/handle type 2009-12-05 23:35 kichik * /NSIS/trunk/Scripts/release.py: more release fun 2009-12-05 22:45 kichik * /NSIS/tags/v246: Tagging for release 2.46 2009-12-05 22:44 kichik * /NSIS/trunk/Menu/images/header.gif: 2.46 2009-12-05 22:33 kichik * /NSIS/trunk/Docs/src/history.but: 2.46 2009-12-05 22:12 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: fixed bug #2810188 - Weird (erroneous) behavior of Menu Start selection page 2009-12-05 21:52 kichik * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: fixed bug #2849872 - LogicLib Do..Loop warning 2009-12-05 21:26 kichik * /NSIS/trunk/Contrib/Language files/Italian.nsh: fixed bug #2873598 - removed double spaces 2009-12-05 21:23 kichik * /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.h, /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/asyncdns.h, /NSIS/trunk/Contrib/NSISdl/connection.cpp, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/httpget.h, /NSIS/trunk/Contrib/NSISdl/netinc.h, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/NSISdl/util.h: fixed bug #2892444 - missing license file (jnetlib.h), it's all zlib 2009-11-29 23:19 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/SConstruct: support specifying WXWIN on command line 2009-11-29 23:12 kichik * /NSIS/trunk/Docs/src/SConscript: nicer halibut scons code should make a proper builder out of this 2009-11-16 14:10 wizou * /NSIS/branches/wizou: creating working branch for wizou 2009-08-26 16:38 kichik * /NSIS/trunk/Source/Tests/winver.nsi: added win7 x64 rtm 2009-08-19 09:18 pabs3 * /NSIS/trunk/Contrib/Math/Source/Math.c: applied patch #2835731 - disable name mangling for the DllMain function so that the Math plugin could be properly initialized 2009-07-26 12:38 kichik * /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh: applied patch #2826598 - Minor typo in PortugueseBR language file 2009-07-10 06:26 justin1014 * /NSIS/branches/justin/xproj, /NSIS/branches/justin/xproj/Contrib/AdvSplash/advsplash.c, /NSIS/branches/justin/xproj/Contrib/Banner/Banner.c, /NSIS/branches/justin/xproj/Contrib/BgImage/BgImage.cpp, /NSIS/branches/justin/xproj/Contrib/Dialer/dialer.c, /NSIS/branches/justin/xproj/Contrib/ExDLL/exdll.c, /NSIS/branches/justin/xproj/Contrib/ExDLL/pluginapi.c, /NSIS/branches/justin/xproj/Contrib/ExDLL/pluginapi.h, /NSIS/branches/justin/xproj/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/justin/xproj/Contrib/LangDLL/LangDLL.c, /NSIS/branches/justin/xproj/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/branches/justin/xproj/Contrib/Math/Source/Math.c, /NSIS/branches/justin/xproj/Contrib/nsDialogs/browse.c, /NSIS/branches/justin/xproj/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/justin/xproj/Contrib/nsDialogs/rtl.c, /NSIS/branches/justin/xproj/Contrib/nsExec/nsexec.c, /NSIS/branches/justin/xproj/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/justin/xproj/Contrib/Splash/splash.c, /NSIS/branches/justin/xproj/Contrib/StartMenu/StartMenu.c, /NSIS/branches/justin/xproj/Contrib/System/Source/Plugin.c, /NSIS/branches/justin/xproj/Contrib/System/Source/Plugin.h, /NSIS/branches/justin/xproj/Contrib/UserInfo/UserInfo.c, /NSIS/branches/justin/xproj/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/branches/justin/xproj/Source/exehead/exec.c: branched for secret swell thingy coming soon modified use of type 'stack_t' and '_stack_t' to not collide with certain BSD types. 2009-07-05 15:15 pabs3 * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/usefulinfos.but: Remove outdated information about System::Call being missing when built with GCC. Patch by Thomas Gaugler 2009-06-13 09:30 kichik * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Menu/index.html: wxWidgets 2.8.10 compatibility 2009-06-10 21:26 justin1014 * /NSIS/trunk/Source/script.cpp: Fixed bug in !searchparse (bug 2803622) 2009-06-10 18:50 kichik * /NSIS/trunk/Source/Tests/winver.nsi: 2008 r2 testing 2009-06-08 20:09 kichik * /NSIS/trunk/Contrib/ExDLL/nsis.pas: applied patch #2802794 - nsis.pas - LogMessage() and Call() 2009-06-08 20:05 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #2803097 - Canceling uninstall in Vista gives PCA dialog (bug #2697027) 2009-06-06 21:37 kichik * /NSIS/tags/v245: Tagging for release 2.45 2009-06-06 21:34 kichik * /NSIS/trunk/Menu/images/header.gif: 2.45 2009-06-06 19:59 kichik * /NSIS/trunk/Docs/src/history.but: typo 2009-06-06 19:40 kichik * /NSIS/trunk/Docs/src/history.but: 2.45 2009-06-06 19:35 kichik * /NSIS/trunk/Source/script.cpp: cosmetics 2009-06-06 19:25 kichik * /NSIS/trunk/Docs/src/SConscript: don't ask me why, but this make hhc.exe not crash 2009-06-06 19:15 kichik * /NSIS/trunk/Docs/src/attributes.but: vista AND 7... yes, tis true! 2009-06-06 18:32 kichik * /NSIS/trunk/Source/script.cpp: cosmetics 2009-06-06 18:31 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: implemented RFE #1505425 - !delfile wildcards and /nonfatal 2009-06-06 16:22 kichik * /NSIS/trunk/Source/Platform.h: buildy buildy 2009-06-06 16:21 kichik * /NSIS/trunk/Contrib/Language files/Indonesian.nlf, /NSIS/trunk/Contrib/Language files/Indonesian.nsh: applied patch #2790571 2009-06-06 16:17 kichik * /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh: applied patch #2642542 2009-06-06 16:15 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/Platform.h: terminal services awareness day donate now! 2009-06-06 16:14 kichik * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.xml, /NSIS/trunk/Contrib/Makensisw/makensisw.xml, /NSIS/trunk/Contrib/zip2exe/zip2exe.xml, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/manifest.cpp: fixed bug #2725883 - NSIS installers always show warning on Windows 7 2009-06-06 15:07 kichik * /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/modern_nodesc.rc, /NSIS/trunk/Contrib/UIs/modern_smalldesc.rc: applied patch #2801317 - Install type description position fix 2009-06-06 14:46 kichik * /NSIS/trunk/Docs/src/compiler.but: fixed bug #2606525 - Symbol NSIS_VERSION not documented 2009-06-06 14:26 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: fixed bug #2720968 - MUI2 finish page show custom function 2009-06-06 13:59 kichik * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Source/script.cpp: fixed bug #2796189 - ExecShell doesn't always respect maximized window setting 2009-06-06 13:47 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #2801024 - CreateFont doesn't make sure the first parameter is a valid variable 2009-06-05 18:02 kichik * /NSIS/trunk/Source/Tests/winver.nsi: win7 2009-05-17 21:56 kichik * /NSIS/trunk/Source/Tests/winver.nsi: some 7 loving 2009-05-14 23:31 kichik * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh: fixed bug #2788620 - MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE missing 2009-05-13 18:38 kichik * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp: fixed bug #2781948 - NSIS.exe shows nothing 2009-05-13 18:19 kichik * /NSIS/trunk/Docs/src/attributes.but: bug #2790298 - whatever... 2009-05-13 18:11 kichik * /NSIS/trunk/Source/Tests/winver.nsi: comparison tests for win7/2008r2 2009-05-13 18:10 kichik * /NSIS/trunk/Include/WinVer.nsh: 2008R2 is a server, so add the special bit 2009-05-13 18:01 kichik * /NSIS/trunk/Include/WinVer.nsh: tabs to spaces 2009-05-11 16:45 anders_k * /NSIS/trunk/Include/WinVer.nsh: Support for Win7 and 2008R2 2009-03-28 10:20 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/uservars.h: got rid of a zillion warnings on gcc 2009-03-28 09:56 kichik * /NSIS/trunk/Source/util.cpp: bad results on gcc with const char* -> char* conversion 2009-03-28 09:52 kichik * /NSIS/trunk/Source/tokens.cpp: less warnings from gcc 2009-03-28 09:47 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: a few less #ifdef's 2009-03-23 18:50 kichik * /NSIS/trunk/Docs/src/file.but: fixed bug #2705878 - Wrong Example in Documentation at FindFirst 2009-03-20 12:23 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: fixed bug #2697027 - error from add/remove when uninstaller is canceled and uac is disabled 2009-03-20 12:11 kichik * /NSIS/trunk/Source/exehead/util.c: english 2009-03-20 11:18 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #2138075 - $DOCUMENTS return null value for root vista fails with CSIDL_FLAG_CREATE on root directories and caches the result thanks inno devs for researching this 2009-03-17 23:00 kichik * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh: fixed bug #2690112 - MUI_UNDIRECTORYSPAGE in the Language Files is wrong 2009-03-10 22:24 justin1014 * /NSIS/trunk/Source/script.cpp: Fixed bug #2680110 (embarrassing for me) 2009-03-10 20:14 kichik * /NSIS/trunk/Source/script.cpp: proper line endings 2009-02-23 11:35 joostverburg * /NSIS/trunk/Menu/index.html: typo 2009-02-21 19:31 kichik * /NSIS/tags/v244: Tagging for release 2.44 2009-02-21 19:30 kichik * /NSIS/trunk/Menu/images/header.gif: 2.44 2009-02-21 19:25 kichik * /NSIS/trunk/Docs/src/history.but: shorter urls 2009-02-21 19:16 kichik * /NSIS/trunk/Docs/src/history.but: 2.44 2009-02-21 19:10 kichik * /NSIS/trunk: bugtraq support 2009-02-21 18:30 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: fixed bug #2595565 - nsDialogs::CreateTimer documentation 2009-02-21 18:25 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #2593369 - global labels in unused functions can't be used 2009-02-06 14:15 kichik * /NSIS/trunk/Source/Tests/icon1.nsi, /NSIS/trunk/Source/Tests/icon2.nsi, /NSIS/trunk/Source/Tests/SConscript: basic icon tests to avoid bugs like #2572035 2009-02-06 14:00 kichik * /NSIS/trunk/Source/icon.cpp: fixed bug #2572035 - problem with 2.43 and icons 2009-02-05 07:26 pabs3 * /NSIS/trunk/SConstruct: fix Library.nsi test by adding the test directory to PATH so it can run LibraryLocal 2009-02-05 01:43 kichik * /NSIS/tags/v243: Tagging for release 2.43 2009-02-05 01:41 kichik * /NSIS/trunk/Menu/images/header.gif: 2.43 2009-02-05 01:38 kichik * /NSIS/trunk/Include/Win/WinDef.nsh, /NSIS/trunk/Include/Win/WinError.nsh, /NSIS/trunk/Include/Win/WinNT.nsh, /NSIS/trunk/Include/Win/WinUser.nsh, /NSIS/trunk/Include/WinCore.nsh: native eol 2009-02-05 01:23 kichik * /NSIS/trunk/Docs/src/history.but: 2.43 2009-02-05 01:01 kichik * /NSIS/trunk/Source/exehead/plugin.c: tabs to spaces 2009-02-05 00:52 kichik * /NSIS/trunk/SCons/Config/gnu: proper flags order to avoid the horrible non-virtual destructor warning 2009-02-05 00:50 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: signed/unsigned comparison 2009-02-05 00:02 kichik * /NSIS/trunk/Examples/makensis.nsi: updated file paths 2009-02-04 21:29 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dsp, /NSIS/trunk/Contrib/ExDLL/exdll-vs2008.vcproj: fix for new paths 2009-02-04 14:08 pabs3 * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/Math.h, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/input.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/rtl.c, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/INSTALL: Install the pluginapi stuff in a subdirectory. 2009-02-04 14:05 pabs3 * /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/script.cpp: fix bug #2497148 - allow out of tree builds on POSIX platforms 2009-02-04 13:47 kichik * /NSIS/trunk/Docs/src/tutorial.but: fixed bug #2564005 - Link to NSIS Wiki not correct 2009-02-03 01:07 kichik * /NSIS/branches/nobjs, /NSIS/branches/nobjs/Contrib/AdvSplash/advsplash.c, /NSIS/branches/nobjs/Contrib/Banner/Banner.c, /NSIS/branches/nobjs/Contrib/Banner/Example.nsi, /NSIS/branches/nobjs/Contrib/Banner/Readme.txt, /NSIS/branches/nobjs/Contrib/BgImage/BgImage.cpp, /NSIS/branches/nobjs/Contrib/BgImage/BgImage.txt, /NSIS/branches/nobjs/Contrib/BgImage/Example.nsi, /NSIS/branches/nobjs/Contrib/Dialer/dialer.c, /NSIS/branches/nobjs/Contrib/Dialer/SConscript, /NSIS/branches/nobjs/Contrib/ExDLL/exdll.c, /NSIS/branches/nobjs/Contrib/ExDLL/exdll.dsp, /NSIS/branches/nobjs/Contrib/ExDLL/exdll.h, /NSIS/branches/nobjs/Contrib/ExDLL/exdll-vs2008.sln, /NSIS/branches/nobjs/Contrib/ExDLL/exdll-vs2008.vcproj, /NSIS/branches/nobjs/Contrib/ExDLL/pluginapi.c, /NSIS/branches/nobjs/Contrib/ExDLL/pluginapi.h, /NSIS/branches/nobjs/Contrib/ExDLL/SConscript, /NSIS/branches/nobjs/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/nobjs/Contrib/InstallOptions/InstallOptions.nsh, /NSIS/branches/nobjs/Contrib/InstallOptions/Readme.html, /NSIS/branches/nobjs/Contrib/InstallOptions/testnotify.nsi, /NSIS/branches/nobjs/Contrib/LangDLL/LangDLL.c, /NSIS/branches/nobjs/Contrib/Language files/Bulgarian.nsh, /NSIS/branches/nobjs/Contrib/Language files/English.nlf, /NSIS/branches/nobjs/Contrib/Language files/Esperanto.nlf, /NSIS/branches/nobjs/Contrib/Language files/Esperanto.nsh, /NSIS/branches/nobjs/Contrib/Language files/Malay.nlf, /NSIS/branches/nobjs/Contrib/Language files/PortugueseBR.nlf, /NSIS/branches/nobjs/Contrib/Language files/PortugueseBR.nsh, /NSIS/branches/nobjs/Contrib/Language files/SConscript, /NSIS/branches/nobjs/Contrib/Language files/SimpChinese.nlf, /NSIS/branches/nobjs/Contrib/Language files/SimpChinese.nsh, /NSIS/branches/nobjs/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/branches/nobjs/Contrib/Library/LibraryLocal/SConscript, /NSIS/branches/nobjs/Contrib/Library/RegTool/RegTool.c, /NSIS/branches/nobjs/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/branches/nobjs/Contrib/Makensisw/resource.rc, /NSIS/branches/nobjs/Contrib/Math/math.nsi, /NSIS/branches/nobjs/Contrib/Math/Math.txt, /NSIS/branches/nobjs/Contrib/Math/mathtest.nsi, /NSIS/branches/nobjs/Contrib/Math/SConscript, /NSIS/branches/nobjs/Contrib/Math/Source/Math.c, /NSIS/branches/nobjs/Contrib/Math/Source/Math.h, /NSIS/branches/nobjs/Contrib/Math/Source/plugin.c, /NSIS/branches/nobjs/Contrib/Modern UI 2/License.txt, /NSIS/branches/nobjs/Contrib/Modern UI 2/MUI2.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Directory.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Readme.html, /NSIS/branches/nobjs/Contrib/Modern UI/License.txt, /NSIS/branches/nobjs/Contrib/Modern UI/Readme.html, /NSIS/branches/nobjs/Contrib/Modern UI/System.nsh, /NSIS/branches/nobjs/Contrib/MultiUser/MultiUser.nsh, /NSIS/branches/nobjs/Contrib/nsDialogs/browse.c, /NSIS/branches/nobjs/Contrib/nsDialogs/defs.h, /NSIS/branches/nobjs/Contrib/nsDialogs/example.nsi, /NSIS/branches/nobjs/Contrib/nsDialogs/input.c, /NSIS/branches/nobjs/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/nobjs/Contrib/nsDialogs/nsDialogs.def, /NSIS/branches/nobjs/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/branches/nobjs/Contrib/nsDialogs/nsis.c, /NSIS/branches/nobjs/Contrib/nsDialogs/nsis.h, /NSIS/branches/nobjs/Contrib/nsDialogs/Readme.html, /NSIS/branches/nobjs/Contrib/nsDialogs/rtl.c, /NSIS/branches/nobjs/Contrib/nsDialogs/SConscript, /NSIS/branches/nobjs/Contrib/nsDialogs/timer.nsi, /NSIS/branches/nobjs/Contrib/nsDialogs/welcome.nsi, /NSIS/branches/nobjs/Contrib/nsExec/nsexec.c, /NSIS/branches/nobjs/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/nobjs/Contrib/Splash/splash.c, /NSIS/branches/nobjs/Contrib/StartMenu/Readme.txt, /NSIS/branches/nobjs/Contrib/StartMenu/StartMenu.c, /NSIS/branches/nobjs/Contrib/System/Resource, /NSIS/branches/nobjs/Contrib/System/Resource.dll, /NSIS/branches/nobjs/Contrib/System/Resource/Icon.ico, /NSIS/branches/nobjs/Contrib/System/Resource/Main.c, /NSIS/branches/nobjs/Contrib/System/Resource/Resource.h, /NSIS/branches/nobjs/Contrib/System/Resource/Resource.rc, /NSIS/branches/nobjs/Contrib/System/SConscript, /NSIS/branches/nobjs/Contrib/System/Source/Buffers.c, /NSIS/branches/nobjs/Contrib/System/Source/Buffers.h, /NSIS/branches/nobjs/Contrib/System/Source/Call.S, /NSIS/branches/nobjs/Contrib/System/Source/Plugin.c, /NSIS/branches/nobjs/Contrib/System/Source/Plugin.h, /NSIS/branches/nobjs/Contrib/System/Source/stdafx.h, /NSIS/branches/nobjs/Contrib/System/Source/System.c, /NSIS/branches/nobjs/Contrib/System/Source/System.h, /NSIS/branches/nobjs/Contrib/System/System.html, /NSIS/branches/nobjs/Contrib/System/System.nsi, /NSIS/branches/nobjs/Contrib/UIs/default.rc, /NSIS/branches/nobjs/Contrib/UIs/modern.rc, /NSIS/branches/nobjs/Contrib/UIs/sdbarker_tiny.rc, /NSIS/branches/nobjs/Contrib/UserInfo/SConscript, /NSIS/branches/nobjs/Contrib/UserInfo/UserInfo.c, /NSIS/branches/nobjs/Contrib/VPatch/Source/Plugin/SConscript, /NSIS/branches/nobjs/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/branches/nobjs/COPYING, /NSIS/branches/nobjs/Docs/src/chm_config.but, /NSIS/branches/nobjs/Docs/src/compilerflags.but, /NSIS/branches/nobjs/Docs/src/config.but, /NSIS/branches/nobjs/Docs/src/credits.but, /NSIS/branches/nobjs/Docs/src/defines.but, /NSIS/branches/nobjs/Docs/src/generalpurpose.but, /NSIS/branches/nobjs/Docs/src/headers.but, /NSIS/branches/nobjs/Docs/src/history.but, /NSIS/branches/nobjs/Docs/src/library.but, /NSIS/branches/nobjs/Docs/src/license.but, /NSIS/branches/nobjs/Docs/src/plugin.but, /NSIS/branches/nobjs/Docs/src/usefulinfos.but, /NSIS/branches/nobjs/Examples/bigtest.nsi, /NSIS/branches/nobjs/Examples/FileFunc.nsi, /NSIS/branches/nobjs/Examples/FileFuncTest.nsi, /NSIS/branches/nobjs/Examples/Library.nsi, /NSIS/branches/nobjs/Examples/makensis.nsi, /NSIS/branches/nobjs/Examples/Modern UI/MultiLanguage.nsi, /NSIS/branches/nobjs/Examples/TextFunc.nsi, /NSIS/branches/nobjs/Examples/TextFuncTest.nsi, /NSIS/branches/nobjs/Examples/VersionInfo.nsi, /NSIS/branches/nobjs/Examples/WordFunc.nsi, /NSIS/branches/nobjs/Examples/WordFuncTest.nsi, /NSIS/branches/nobjs/Include/LangFile.nsh, /NSIS/branches/nobjs/Include/Library.nsh, /NSIS/branches/nobjs/Include/SConscript, /NSIS/branches/nobjs/Include/StrFunc.nsh, /NSIS/branches/nobjs/Include/Util.nsh, /NSIS/branches/nobjs/Include/VB6RunTime.nsh, /NSIS/branches/nobjs/Include/Win, /NSIS/branches/nobjs/Include/Win/WinDef.nsh, /NSIS/branches/nobjs/Include/Win/WinError.nsh, /NSIS/branches/nobjs/Include/Win/WinNT.nsh, /NSIS/branches/nobjs/Include/Win/WinUser.nsh, /NSIS/branches/nobjs/Include/WinCore.nsh, /NSIS/branches/nobjs/Include/WinMessages.nsh, /NSIS/branches/nobjs/Include/WinVer.nsh, /NSIS/branches/nobjs/Menu/images/header.gif, /NSIS/branches/nobjs/SCons/config.py, /NSIS/branches/nobjs/SCons/Config/default, /NSIS/branches/nobjs/SCons/Config/gnu, /NSIS/branches/nobjs/SCons/Config/hpc++, /NSIS/branches/nobjs/SCons/Config/ms, /NSIS/branches/nobjs/SCons/Tools/crossmingw.py, /NSIS/branches/nobjs/SCons/utils.py, /NSIS/branches/nobjs/SConstruct, /NSIS/branches/nobjs/Scripts/release.py, /NSIS/branches/nobjs/Source, /NSIS/branches/nobjs/Source/7zip/LZMADecode.c, /NSIS/branches/nobjs/Source/7zip/LZMADecode.h, /NSIS/branches/nobjs/Source/afxres.h, /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/bzip2/blocksort.c, /NSIS/branches/nobjs/Source/bzip2/bzlib.c, /NSIS/branches/nobjs/Source/bzip2/bzlib.h, /NSIS/branches/nobjs/Source/bzip2/compress.c, /NSIS/branches/nobjs/Source/bzip2/decompress.c, /NSIS/branches/nobjs/Source/bzip2/huffman.c, /NSIS/branches/nobjs/Source/cbzip2.h, /NSIS/branches/nobjs/Source/clzma.cpp, /NSIS/branches/nobjs/Source/clzma.h, /NSIS/branches/nobjs/Source/compressor.h, /NSIS/branches/nobjs/Source/crc32.c, /NSIS/branches/nobjs/Source/crc32.h, /NSIS/branches/nobjs/Source/czlib.h, /NSIS/branches/nobjs/Source/dirreader.cpp, /NSIS/branches/nobjs/Source/dirreader.h, /NSIS/branches/nobjs/Source/exehead, /NSIS/branches/nobjs/Source/exehead/afxres.h, /NSIS/branches/nobjs/Source/exehead/api.h, /NSIS/branches/nobjs/Source/exehead/bgbg.c, /NSIS/branches/nobjs/Source/exehead/components.c, /NSIS/branches/nobjs/Source/exehead/components.h, /NSIS/branches/nobjs/Source/exehead/config.h, /NSIS/branches/nobjs/Source/exehead/exec.c, /NSIS/branches/nobjs/Source/exehead/exec.h, /NSIS/branches/nobjs/Source/exehead/fileform.c, /NSIS/branches/nobjs/Source/exehead/fileform.h, /NSIS/branches/nobjs/Source/exehead/lang.h, /NSIS/branches/nobjs/Source/exehead/Main.c, /NSIS/branches/nobjs/Source/exehead/plugin.c, /NSIS/branches/nobjs/Source/exehead/plugin.h, /NSIS/branches/nobjs/Source/exehead/resource.rc, /NSIS/branches/nobjs/Source/exehead/SConscript, /NSIS/branches/nobjs/Source/exehead/state.h, /NSIS/branches/nobjs/Source/exehead/Ui.c, /NSIS/branches/nobjs/Source/exehead/ui.h, /NSIS/branches/nobjs/Source/exehead/util.c, /NSIS/branches/nobjs/Source/exehead/util.h, /NSIS/branches/nobjs/Source/fileform.cpp, /NSIS/branches/nobjs/Source/fileform.h, /NSIS/branches/nobjs/Source/growbuf.cpp, /NSIS/branches/nobjs/Source/growbuf.h, /NSIS/branches/nobjs/Source/icon.cpp, /NSIS/branches/nobjs/Source/icon.h, /NSIS/branches/nobjs/Source/lang.cpp, /NSIS/branches/nobjs/Source/lang.h, /NSIS/branches/nobjs/Source/lineparse.cpp, /NSIS/branches/nobjs/Source/lineparse.h, /NSIS/branches/nobjs/Source/makenssi.cpp, /NSIS/branches/nobjs/Source/manifest.cpp, /NSIS/branches/nobjs/Source/manifest.h, /NSIS/branches/nobjs/Source/mmap.cpp, /NSIS/branches/nobjs/Source/mmap.h, /NSIS/branches/nobjs/Source/Platform.h, /NSIS/branches/nobjs/Source/Plugins.cpp, /NSIS/branches/nobjs/Source/Plugins.h, /NSIS/branches/nobjs/Source/ResourceEditor.cpp, /NSIS/branches/nobjs/Source/ResourceEditor.h, /NSIS/branches/nobjs/Source/ResourceVersionInfo.cpp, /NSIS/branches/nobjs/Source/ResourceVersionInfo.h, /NSIS/branches/nobjs/Source/script.cpp, /NSIS/branches/nobjs/Source/ShConstants.cpp, /NSIS/branches/nobjs/Source/strlist.cpp, /NSIS/branches/nobjs/Source/strlist.h, /NSIS/branches/nobjs/Source/Tests/SConscript, /NSIS/branches/nobjs/Source/Tests/winver.nsi, /NSIS/branches/nobjs/Source/tokens.cpp, /NSIS/branches/nobjs/Source/tokens.h, /NSIS/branches/nobjs/Source/util.cpp, /NSIS/branches/nobjs/Source/util.h, /NSIS/branches/nobjs/Source/winchar.cpp, /NSIS/branches/nobjs/Source/winchar.h, /NSIS/branches/nobjs/Source/writer.cpp, /NSIS/branches/nobjs/Source/writer.h, /NSIS/branches/nobjs/Source/zlib/deflate.c, /NSIS/branches/nobjs/Source/zlib/DEFLATE.H, /NSIS/branches/nobjs/Source/zlib/INFBLOCK.C, /NSIS/branches/nobjs/Source/zlib/trees.c, /NSIS/branches/nobjs/Source/zlib/ZCONF.H, /NSIS/branches/nobjs/Source/zlib/ZLIB.H, /NSIS/branches/nobjs/Source/zlib/ZUTIL.H: updated nobjs branch with trunk changes 5629:5918 (excluding FileFunc.nsh, TextFunc.nsh and WordFunc.nsh) 2009-02-02 23:38 kichik * /NSIS/trunk/Contrib/Makensisw/resource.rc: implemented rfe #2557392 - makensisw: Shortcut to abort compilation 2009-02-01 14:44 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/VB6RunTime.nsh, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/trees.c, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: happy new year! 2009-02-01 12:35 kichik * /NSIS/trunk/Contrib/Banner/Banner.c: a comment explaining foreground issues 2009-02-01 12:32 kichik * /NSIS/trunk/Contrib/UIs/default.rc, /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/resource.rc: revert r5314 - if the banner plug-in shows IDD_VERIFY in its own thread and that thread sets it as the foreground window because of the WS_VISIBLE style, the main thread loses the ability to set the foreground window. this causes the installer window to start on the background if banner is used in .oninit. 2009-02-01 12:06 kichik * /NSIS/trunk/Contrib/ExDLL/exdll-vs2008.sln, /NSIS/trunk/Contrib/ExDLL/exdll-vs2008.vcproj, /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Examples/makensis.nsi: added exdll vs2008 project files, thanks to TobbeSweden 2009-02-01 00:29 kichik * /NSIS/trunk/Contrib/Banner/Example.nsi: saner waiting times 2009-01-31 16:30 kichik * /NSIS/trunk/Contrib/Language files/SConscript: list every language only once 2009-01-31 16:26 kichik * /NSIS/trunk/Contrib/Language files/Esperanto.nlf, /NSIS/trunk/Contrib/Language files/Esperanto.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added Esperanto http://forums.winamp.com/showthread.php?s=&threadid=302218 2009-01-31 16:17 kichik * /NSIS/trunk/Contrib/Language files/Malay.nlf: Qump?! 2009-01-31 15:46 kichik * /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: fixed bug #2533431 - Script compiling fails with !packhdr, but succeeds without?! 2009-01-24 22:09 anders_k * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: applied patch #2500960 - NSD_SetIcon support 2009-01-17 22:32 kichik * /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/util.cpp: applied patch #2497172 - Fixes for POSIX build on Solaris, plus a regression 2009-01-15 13:51 kichik * /NSIS/trunk/Source/util.cpp: fixed bug #2497290 - The TRUE/FALSE bug on MacOS X, revisited 2009-01-13 16:54 pabs3 * /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/VersionInfo.nsi, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/VB6RunTime.nsh: Remove some gratuitous use of non-ANSI characters that were making the Unicode patch harder to review. 2009-01-11 09:48 pabs3 * /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/SCons/Tools/crossmingw.py, /NSIS/trunk/SConstruct: Fix up plugin API header/lib installation for non-Windows platforms. 2009-01-10 22:53 kichik * /NSIS/trunk/SCons/utils.py: pydoc should be in the function 2009-01-10 22:51 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/SCons/utils.py: make sure iconv exists 2009-01-10 22:38 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: and a dash 2009-01-10 22:29 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: wrong prefix in bug report 2009-01-10 22:14 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: fink prefixes for bug #2495138 2009-01-10 22:12 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: since we're already using winchar... 2009-01-10 22:10 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: fixed bug #2494539 - Missing iconv dependency in LibraryLocal in 2.42 2009-01-10 22:04 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Directory.nsh: fixed bug #2494528 - MUI_DIRECTORYPAGE_BGCOLOR 2009-01-10 21:53 kichik * /NSIS/trunk/Source/Platform.h: shell api for shell stuff that's not automatically included in latest sdks 2009-01-10 21:49 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html: wow... so many typos in one paragraph. was i drunk? 2009-01-10 21:48 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html: typo 2009-01-01 01:04 kichik * /NSIS/trunk/Include/SConscript: WinDef.nsh -> WinCore.nsh 2009-01-01 00:55 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nsh: that ending quote shouldn't be there 2008-12-27 14:09 anders_k * /NSIS/trunk/Include/WinCore.nsh: Updated description comment to new filename 2008-12-27 14:05 anders_k * /NSIS/trunk/Include/WinCore.nsh, /NSIS/trunk/Include/WinDef.nsh: Renamed WinDef.nsh to WinCore.nsh 2008-12-27 13:25 anders_k * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/SConscript: Added WinDef.nsh and friends to SCons and makensis.nsi 2008-12-26 14:39 anders_k * /NSIS/trunk/Include/Win, /NSIS/trunk/Include/Win/WinDef.nsh, /NSIS/trunk/Include/Win/WinError.nsh, /NSIS/trunk/Include/Win/WinNT.nsh, /NSIS/trunk/Include/Win/WinUser.nsh, /NSIS/trunk/Include/WinDef.nsh: Added WinDef.nsh and Win subdir - New headers with common windows stuff 2008-12-24 23:40 kichik * /NSIS/trunk/SCons/config.py, /NSIS/trunk/SConstruct: scons 1.2.0 - Options -> Variables 2008-12-21 19:14 anders_k * /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h: changed RegisterPluginCallback return from BOOL to int to support a more detailed return value 2008-12-21 00:49 pabs3 * /NSIS/trunk/Examples/Library.nsi: Fix Library.nsi test script on non-Windows by making it use Contrib/UIs/default.exe instead of makensis.exe, which isn't built except on Windows. 2008-12-20 15:50 kichik * /NSIS/trunk/Scripts/release.py: update for mediawiki 1.13 that insists on adding new lines 2008-12-20 12:27 kichik * /NSIS/tags/v242: Tagging for release 2.42 2008-12-20 12:26 kichik * /NSIS/trunk/Examples/makensis.nsi: missing nsdialogs example 2008-12-20 12:16 kichik * /NSIS/trunk/Menu/images/header.gif: 2.42 2008-12-20 12:00 kichik * /NSIS/trunk/Scripts/release.py: syntax error 2008-12-20 11:55 kichik * /NSIS/trunk/Include/Library.nsh: extract recurring string REGTOOL_KEY so version is defined only once 2008-12-20 11:48 kichik * /NSIS/trunk/Docs/src/history.but: 2.42 2008-12-20 11:19 kichik * /NSIS/trunk/Docs/src/credits.but: more credits 2008-12-20 09:26 kichik * /NSIS/trunk/Source/exehead/api.h: add NSISCALL definition for external plug-ins not built with scons 2008-12-20 09:02 kichik * /NSIS/trunk/Examples/makensis.nsi: forgot util.nsh 2008-12-20 08:57 kichik * /NSIS/trunk/Examples/makensis.nsi: renamed plugin.* to pluginapi.* 2008-12-20 08:49 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/exdll.dsp, /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/ExDLL/plugin.c, /NSIS/trunk/Contrib/ExDLL/plugin.h, /NSIS/trunk/Contrib/ExDLL/pluginapi.c, /NSIS/trunk/Contrib/ExDLL/pluginapi.h, /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/Math.h, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/input.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/rtl.c, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c: renamed plugin.* to pluginapi.* 2008-12-20 08:17 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh, /NSIS/trunk/Contrib/InstallOptions/testnotify.nsi, /NSIS/trunk/Contrib/Math/mathtest.nsi, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/TextFunc.nsi, /NSIS/trunk/Examples/WordFunc.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Source/tokens.cpp: deprecate SetPluginUnload and /NOUNLOAD plug-ins are now responsible to keeping themselves loaded using the new api 2008-12-20 07:59 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.txt: a brief explanation on the section restriction 2008-12-20 07:54 kichik * /NSIS/trunk/Source/exehead/plugin.c: GlobalAlloc should get GPTR not LPTR 2008-12-20 07:22 justin1014 * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added !searchreplace preprocessor command for compiletime text search/replaces 2008-12-20 06:23 justin1014 * /NSIS/branches/justin/datablock-reordering, /NSIS/branches/justin/datablock-reordering/Source/build.cpp, /NSIS/branches/justin/datablock-reordering/Source/build.h: an experimental datablock reordering -- I saw this give me ~1% gains for REAPER installers, though once I turned up the LZMA dictionary size it evaporated.. here in case we ever find it useful, which may be doubtful. 2008-12-20 06:22 justin1014 * /NSIS/branches/justin: my experimental nonsense 2008-12-15 21:51 kichik * /NSIS/trunk/SCons/Config/gnu: again, force quotation around stdcall to avoid parenthesis madness 2008-12-14 23:56 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms: use lists instead of dicts so scons will not treat the dict as a string when a list is also appended 2008-12-12 19:57 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: initialize everything when creating a new dialog to avoid setting leaking from the last dialog 2008-12-12 19:52 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: clean-up onBack setting so it won't propagate from one page to the next 2008-12-12 19:31 kichik * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Banner/Example.nsi, /NSIS/trunk/Contrib/Banner/Readme.txt, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.txt, /NSIS/trunk/Contrib/BgImage/Example.nsi, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/StartMenu.c: no more /UNLOAD with new plug-in api 2008-12-12 19:27 kichik * /NSIS/trunk/Contrib/Math/math.nsi, /NSIS/trunk/Contrib/Math/Math.txt, /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/Math.h, /NSIS/trunk/Contrib/Math/Source/plugin.c: convert to plug-in library and never unload so user variables are saved 2008-12-12 19:22 kichik * /NSIS/trunk/Examples/makensis.nsi: set focus on the radio buttons in the existing installation page 2008-12-12 18:45 kichik * /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/nsDialogs/timer.nsi, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi: use new plug-in callbacks to avoid /NOUNLOAD 2008-12-12 18:24 kichik * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.c: use new plug-in library wherever possible, which is not a lot... 2008-12-12 17:57 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: added support for lib building on cross mingw 2008-12-12 17:51 kichik * /NSIS/trunk/Contrib/Dialer/SConscript, /NSIS/trunk/Contrib/UserInfo/SConscript, /NSIS/trunk/Contrib/VPatch/Source/Plugin/SConscript: plugin.lib requires user32.lib, but it's later optimized out of the dll 2008-12-12 17:47 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c: removed private atoi implementations 2008-12-12 17:45 kichik * /NSIS/trunk/Contrib/ExDLL/plugin.c, /NSIS/trunk/Contrib/ExDLL/plugin.h: simpler atoi for LangDLL and Banner 2008-12-12 17:39 kichik * /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/input.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsis.c, /NSIS/trunk/Contrib/nsDialogs/nsis.h, /NSIS/trunk/Contrib/nsDialogs/rtl.c, /NSIS/trunk/Contrib/nsDialogs/SConscript: remove special implementation of stack operations and use plugin.lib instead 2008-12-12 17:37 kichik * /NSIS/trunk/Contrib/ExDLL/plugin.c, /NSIS/trunk/Contrib/ExDLL/plugin.h: some more functions, required by nsDialogs and probably more plug-ins 2008-12-12 17:19 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dsp: update for plugin.h and plugin.lib 2008-12-12 17:18 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c: switch to plugin.h 2008-12-12 17:13 kichik * /NSIS/trunk/Contrib/ExDLL/plugin.c: allow passing NULL to popstring() for InstallOptions and probably more plug-ins 2008-12-12 17:07 kichik * /NSIS/trunk/Contrib/ExDLL/plugin.h: hello c++! 2008-12-12 17:07 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: use plugin.h and try to force plugin.lib for backward compatibility 2008-12-12 17:02 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: don't allow both "reboot now" and "reboot later" to be turned on at the same time 2008-12-12 16:46 kichik * /NSIS/trunk/Contrib/ExDLL/SConscript: update CPPPATH (include directory) as well so plug-ins can find everything 2008-12-12 16:33 kichik * /NSIS/trunk/Contrib/ExDLL/plugin.c, /NSIS/trunk/Contrib/ExDLL/plugin.h, /NSIS/trunk/Contrib/ExDLL/SConscript, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SConstruct: - create plugin.lib that contains all - distribute plugin.h, api.h and plugin.lib - remove inc_c stuff because we don't really want to install win32 header files as something that can be used on linux (this should be revisited later) - fix up MakeFileList for newer versions of SCons (should be removed in the future) 2008-12-12 16:29 kichik * /NSIS/trunk/Source/exehead: ignore sconf.h 2008-12-12 16:28 kichik * /NSIS/trunk/Source: ignore those pesky two 2008-12-09 23:18 kichik * /NSIS/trunk/Source/Platform.h: HMODULE is used in api.h which is included by build.cpp which is also built on POSIX 2008-12-09 23:13 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: now with proper #include 2008-12-09 23:11 kichik * /NSIS/trunk/Source/exehead/fileform.h: that need not be here (kills LibraryLocal build on gcc) 2008-12-09 23:10 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/api.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/script.cpp: gcc fixes 2008-12-09 23:06 kichik * /NSIS/trunk/SCons/Config/gnu: force quoting to avoid problems with the parenthesis 2008-12-09 23:01 kichik * /NSIS/trunk/Source/exehead/api.h: move definitions common to both plug-ins and stubs to api.h (part of patch #2359978) 2008-12-09 22:54 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: use api.h in exdll.h (part of patch #2359978) 2008-12-09 22:53 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h: move definitions common to both plug-ins and stubs to api.h (part of patch #2359978) 2008-12-09 22:42 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/Platform.h: moved NSISCALL detection to scons 2008-12-09 22:20 kichik * /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h: add standard license headers 2008-12-06 22:20 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html: fixed bug #2386821 - MUI_CUSTOMFUNCTION_MOUSEOVERSECTION documentation error 2008-12-02 22:41 kichik * /NSIS/trunk/Source/Tests/winver.nsi: more tests from the forum 2008-12-01 22:35 kichik * /NSIS/trunk/Include/WinVer.nsh: get just one char for windows 9x "service pack" 2008-11-29 22:03 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/plugin.c, /NSIS/trunk/Source/exehead/plugin.h, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/exehead/Ui.c: applied patch #1912699 - "Pinned" / always loaded plugins support this patch also adds plugin_api_version to exec_flags so your plug-in can now tell if features it needs are available more plug-ins that need this will be converted once the patch to make both the stubs and the plug-ins use the same header file is in place 2008-11-29 21:15 kichik * /NSIS/trunk/Include/WinVer.nsh: bring back WinVerGetMajor, WinVerGetMinor and WinVerGetBuild 2008-11-29 21:03 kichik * /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Source/Tests/winver.nsi: make ${WinVerGetServicePackLevel} accept an output variable again 2008-11-29 18:05 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.def, /NSIS/trunk/Contrib/nsDialogs/SConscript: oops... KillTimer is taken 2008-11-29 18:01 kichik * /NSIS/trunk/Contrib/nsDialogs/timer.nsi: accidentally committed the wrong version this new version uses macros to make the script nicer 2008-11-29 17:56 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/nsDialogs/SConscript, /NSIS/trunk/Contrib/nsDialogs/timer.nsi, /NSIS/trunk/Include/WinMessages.nsh: applied patch #2135855 - Timer support for nsDialogs also added progress bar support for the example 2008-11-29 13:53 kichik * /NSIS/trunk/Source/Tests/winver.nsi: vista sp1 2008-11-29 13:43 kichik * /NSIS/trunk/Source/Tests/winver.nsi: windows 2003 test 2008-11-29 13:26 kichik * /NSIS/trunk/Source/Tests/winver.nsi: allocate 156 bytes so non-existing fields will be zero for OSVERSIONINFO 2008-11-29 13:21 kichik * /NSIS/trunk/Source/Tests/winver.nsi: test service pack inequality as well 2008-11-29 13:21 kichik * /NSIS/trunk/Include/WinVer.nsh: and also in calls... 2008-11-29 13:19 kichik * /NSIS/trunk/Include/WinVer.nsh: no need for outvar 2008-11-29 12:23 kichik * /NSIS/trunk/Source/Tests/winver.nsi: remove some code duplication 2008-11-29 12:18 kichik * /NSIS/trunk/Source/Tests/winver.nsi: missing !include 2008-11-29 01:35 kichik * /NSIS/trunk/Source/Tests/winver.nsi: and update expected failure as well... 2008-11-28 23:28 kichik * /NSIS/trunk/Source/Tests/winver.nsi: update expected results 2008-11-28 20:01 kichik * /NSIS/trunk/Include/WinVer.nsh: fixed bug #2053642 - WinVer 95/NT4 ambiguity also, the last huge commit was based on a patch by Anders 2008-11-28 19:25 kichik * /NSIS/trunk/Source/Tests/winver.nsi: new test infrastructure for WinVer so I don't have to power up a zillion virtual machines for every little change 2008-11-28 19:21 kichik * /NSIS/trunk/Include/WinVer.nsh: implemented RFE #1949260 - Windows Server 2008 support fixed bug #2053700 - Windows XP x64 is reported as Windows 2003 added support for 9x "SP" by converting A, B, C to a SP number also added IsServer, IsWin2003R2, IsStarterEdition, OSHasMediaCenter and OSHasTabletSupport 2008-11-23 21:15 kichik * /NSIS/trunk/Contrib/System/Source/Call.S: only save and restore ebp when stack generation is turned on (for parameters taken or returned on the nsis stack), just like in the old working code 2008-11-22 20:16 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/lang.cpp: fixed bug #2323452 - Grammar, License Agreement 2008-11-21 13:26 kichik * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi: no need for function usage deceleration or un. suffix anymore 2008-11-21 13:22 kichik * /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Examples/TextFunc.nsi, /NSIS/trunk/Examples/TextFuncTest.nsi, /NSIS/trunk/Examples/WordFunc.nsi, /NSIS/trunk/Examples/WordFuncTest.nsi: no need for function usage deceleration or un. suffix anymore 2008-11-21 09:57 kichik * /NSIS/trunk/Contrib/System/Source/Call.S: fixed bug #2318670 - New System plug-in never unloads ebp was never restored from the stack and so edi, esi, ebx and ebp were corrupted when CallProc returned 2008-11-21 09:34 kichik * /NSIS/trunk/Contrib/System/Source/System.h: tabs to spaces 2008-11-21 08:47 kichik * /NSIS/trunk/SCons/Config/gnu: spaces are now frowned upon and quoted for unknown reason 2008-11-21 01:12 kichik * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/Util.nsh, /NSIS/trunk/Include/WordFunc.nsh: use new artificial functions to remove the need to declare usage of functions from the header files and to remove the unnecessary differentiation between install and uninstall functions 2008-11-21 00:04 kichik * /NSIS/trunk/Include/SConscript, /NSIS/trunk/Include/Util.nsh, /NSIS/trunk/Include/WinVer.nsh: extract CallArtificialFunction to Util.nsh 2008-11-20 23:39 kichik * /NSIS/trunk/Include/WinVer.nsh: support for uninstaller 2008-11-20 22:54 kichik * /NSIS/trunk/Include/WinVer.nsh: extract the common artificial function code to a macro 2008-11-20 22:37 kichik * /NSIS/trunk/Include/WinVer.nsh: fake functions so version detection code isn't massively duplicated 2008-11-20 21:54 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Examples/Library.nsi, /NSIS/trunk/Include/Library.nsh: implemented RFE #2315740 - Library support for ActiveX exe /regserver 2008-11-20 21:04 kichik * /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/System/Source/Buffers.h, /NSIS/trunk/Contrib/System/Source/Call.S, /NSIS/trunk/Contrib/System/Source/stdafx.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct: applied patch #2193442 - port System::Call and related functions to GCC 2008-11-20 20:59 kichik * /NSIS/trunk/Scripts/release.py: show some progress on screen for sftp 2008-11-20 20:57 kichik * /NSIS/trunk/Scripts/release.py: semi-automatic purge, assuming the browser is logged on as admin 2008-11-20 20:14 kichik * /NSIS/tags/v241: Tagging for release 2.41 2008-11-20 20:13 kichik * /NSIS/trunk/Menu/images/header.gif: 2.41 2008-11-20 20:06 kichik * /NSIS/trunk/Docs/src/history.but: 2.41 2008-11-20 19:20 kichik * /NSIS/trunk/Source/exehead/Ui.c: applied patch #1982084 - wrong UI behaviour on size texts (VS2005) 2008-11-15 21:54 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/SConstruct: scons 1.1.0 support 2008-11-15 15:48 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: fixed bug #1939573 - LangDLL Memory leaks 2008-11-08 14:56 kichik * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf: applied patch #2189117 - description is not consistent with button text 2008-11-07 22:04 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: fixed bug #2167958 - Big-Endian issue in ResourceEditor 2008-11-07 22:02 kichik * /NSIS/trunk/Source/icon.cpp: fixed bug #2166401 - Uninstaller icon errors on big-endian system 2008-11-01 20:10 kichik * /NSIS/trunk/Contrib/System/Resource/Main.c, /NSIS/trunk/Contrib/System/SConscript: gotta have a main... 2008-10-28 10:42 pabs3 * /NSIS/trunk/Contrib/System/Resource, /NSIS/trunk/Contrib/System/Resource.dll, /NSIS/trunk/Contrib/System/Resource/Icon.ico, /NSIS/trunk/Contrib/System/Resource/Resource.h, /NSIS/trunk/Contrib/System/Resource/Resource.rc, /NSIS/trunk/Contrib/System/SConscript: Build System Resource.dll from source code instead of shipping the binary. 2008-10-24 18:44 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh: improvements by Felipe 2008-10-10 21:35 kichik * /NSIS/tags/v240: Tagging for release 2.40 2008-10-10 21:33 kichik * /NSIS/trunk/Menu/images/header.gif: 2.40 2008-10-10 21:18 kichik * /NSIS/trunk/Docs/src/history.but: 2.40 2008-10-10 21:13 kichik * /NSIS/trunk/Source/Tests/SConscript: use the test as well... 2008-10-10 21:11 kichik * /NSIS/trunk/Source/Tests/winver.nsi: basic winver tests to avoid another 2.39-ish disgrace 2008-10-10 20:57 kichik * /NSIS/trunk/Include/FileFunc.nsh: fixed bug #2067946 - GetParameters returns an incorrect result in some situation. 2008-10-10 20:56 kichik * /NSIS/trunk/Examples/FileFuncTest.nsi: documented the weird result 2008-10-10 20:46 kichik * /NSIS/trunk/Examples/FileFuncTest.nsi: some real tests for GetParameters 2008-10-03 10:46 kichik * /NSIS/trunk/Scripts/release.py: tag revision identification is now automatic 2008-09-16 19:38 kichik * /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/Readme.html: applied patch #2016003 - nsDialogs: Initial folder for SelectFileDialog 2008-09-14 19:39 kichik * /NSIS/trunk/Include/WinVer.nsh: applied patch #2095363 - Patch for bug #2070708 (WinVer.nsh, service pack macros) 2008-09-14 19:11 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: fixed bug #2110357 - MUI2 FinishPage readme not focused 2008-09-05 16:23 kichik * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh: applied patch #2056906 - wrong Simplified Chinese button texts 2008-09-05 16:11 kichik * /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh: fixed bug #2086988 - Some minor errors in the PortugueseBR language file 2008-08-19 18:24 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: fixed bug #2059651 - minor error in nsDialogs documentation 2008-08-16 20:34 kichik * /NSIS/trunk/Scripts/release.py: upload script missing new line 2008-08-16 20:26 kichik * /NSIS/trunk/Scripts/release.py: need to close the file so it can be deleted 2008-08-16 20:11 kichik * /NSIS/tags/v239: Tagging for release 2.39 2008-08-16 20:09 kichik * /NSIS/trunk/Menu/images/header.gif: 2.39 2008-08-16 19:59 kichik * /NSIS/trunk/Scripts/release.py: spaces to tabs 2008-08-16 19:57 kichik * /NSIS/trunk/Docs/src/history.but: english, use it 2008-08-16 19:55 kichik * /NSIS/trunk/Docs/src/history.but: 2.39 2008-08-16 07:49 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: typo 2008-08-15 19:54 kichik * /NSIS/trunk/Include/WinVer.nsh: use System's r1 instead of $1 2008-08-15 18:50 kichik * /NSIS/trunk/Include/WinVer.nsh: added service pack support for old versions of nt that didn't support OSVERSIONINFOEX 2008-08-15 18:39 kichik * /NSIS/trunk/Include/WinVer.nsh: applied patch #2036802 - Windows service pack versions in WinVer.nsh 2008-08-15 18:13 kichik * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html: applied patch #2025721 - Patch for Feature Request 1961307 also closes RFE #1961307 2008-08-15 17:59 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: fixed bug #2053522 - nsDialogs doesn't RemoveProp 2008-08-15 17:46 kichik * /NSIS/trunk/Contrib/nsDialogs/defs.h: cosmetics 2008-08-15 17:36 kichik * /NSIS/trunk/Contrib/nsDialogs/defs.h, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/rtl.c: applied patch #2004129 - nsDialogs: Hand cursor for link 2008-08-15 17:13 kichik * /NSIS/trunk/Include/WinMessages.nsh: EM_EXLIMITTEXT from patch #2004129 2008-08-15 17:07 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: it's listbox_HWND not combo_HWND 2008-08-15 17:07 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: applied patch #2041919 - nsDialogs: controls for listboxes 2008-08-15 16:38 kichik * /NSIS/trunk/Scripts/release.py: no more ftp too... sftp now 2008-08-15 16:20 kichik * /NSIS/trunk/Scripts/release.py: QRS is gone :( 2008-07-26 14:49 kichik * /NSIS/branches/nobjs/Source/build.cpp: no more add_intstring in nobjs 2008-07-26 14:45 kichik * /NSIS/branches/nobjs/Source/script.cpp: remove usage of add_intstring 2008-07-26 14:45 kichik * /NSIS/branches/nobjs/Source/nobj/entry.cpp, /NSIS/branches/nobjs/Source/nobj/entry.h: add string parameter from integer 2008-07-26 14:44 kichik * /NSIS/branches/nobjs/Source/nobj/str.cpp, /NSIS/branches/nobjs/Source/nobj/str.h: add ctor from integer 2008-07-26 12:43 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: extracted init_script_variables(), init_script_constants() and init_script_constants_pf_cf() from CEXEBuild ctor 2008-07-26 12:12 kichik * /NSIS/branches/nobjs/Source/build.cpp: now add_nobj_entry_parm really never returns outside the `if' 2008-07-26 12:07 kichik * /NSIS/branches/nobjs/Source/build.cpp: fixed variable usage in entries 2008-07-26 11:58 kichik * /NSIS/branches/nobjs, /NSIS/branches/nobjs/Contrib/LangDLL/LangDLL.c, /NSIS/branches/nobjs/Contrib/Language files/French.nsh, /NSIS/branches/nobjs/Contrib/Language files/Slovenian.nlf, /NSIS/branches/nobjs/Contrib/Language files/Slovenian.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Readme.html, /NSIS/branches/nobjs/Contrib/MultiUser/MultiUser.nsh, /NSIS/branches/nobjs/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/nobjs/Docs/src/attributes.but, /NSIS/branches/nobjs/Docs/src/defines.but, /NSIS/branches/nobjs/Docs/src/history.but, /NSIS/branches/nobjs/Examples/LogicLib.nsi, /NSIS/branches/nobjs/Examples/makensis.nsi, /NSIS/branches/nobjs/Include/LogicLib.nsh, /NSIS/branches/nobjs/Include/VB6RunTime.nsh, /NSIS/branches/nobjs/Menu/images/header.gif, /NSIS/branches/nobjs/SConstruct, /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/exehead/exec.c, /NSIS/branches/nobjs/Source/exehead/Ui.c, /NSIS/branches/nobjs/Source/mmap.cpp, /NSIS/branches/nobjs/Source/mmap.h, /NSIS/branches/nobjs/Source/script.cpp, /NSIS/branches/nobjs/Source/tokens.cpp, /NSIS/branches/nobjs/Source/tokens.h: updated nobjs branch with trunk changes 5628:5683 2008-07-13 01:02 justin1014 * /NSIS/trunk/Docs/src/defines.but: updated documentation for previous commit, !define /file and !searchparse 2008-07-13 00:37 justin1014 * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: !searchparse and !define /file support 2008-07-12 17:51 kichik * /NSIS/tags/v238: Tagging for release 2.38 2008-07-12 17:48 kichik * /NSIS/trunk/Menu/images/header.gif: 2.38 2008-07-12 17:11 kichik * /NSIS/trunk/Source/exehead/Ui.c: added and verified another condition - both GetDiskFreeSpace and GetDiskFreeSpaceEx require a trailing backslash this needs a lot of optimization 2008-07-12 16:48 kichik * /NSIS/trunk/Docs/src/history.but: 2.38 2008-07-12 16:40 kichik * /NSIS/trunk/Source/exehead/Ui.c: added a safety mechanism to make sure the new directory rooting loop in DirProc() doesn't loop infinitely 2008-07-09 20:45 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: fixed bug #2013317 - nsDialogs pollutes the stack if callbacks are not defined 2008-07-09 20:39 kichik * /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nsh: applied patch #2014106 - Updated Slovenian localization 2008-07-09 20:32 kichik * /NSIS/branches/nobjs/Source/build.cpp: fixed callback functions - ns_func wasn't modified in add_function but only for Call and friends which never happens for callback functions 2008-07-09 20:22 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h: fix function calls by saving offset in nobj_function so it works for more than just the first use of the function 2008-07-09 20:21 kichik * /NSIS/branches/nobjs/Source/build.cpp: fixed label resolving in sections (resolve_instructions() wants size not end pointer) 2008-07-09 20:21 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/nobj/section.cpp, /NSIS/branches/nobjs/Source/nobj/section.h: bye bye nobj_section::get_section() and fileform.h include 2008-07-09 20:20 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h: bye bye nobj_function::get_function() and fileform.h include, hello is_used() 2008-07-09 20:19 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: extracted resolve_instructions() from resolve_coderefs() and resolve_call_int() 2008-07-09 20:18 kichik * /NSIS/branches/nobjs/Source/build.cpp: revive tests for open sections and functions at the end of the script 2008-07-09 20:18 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: bye bye build_cursection, also fixes a bug that caused every section to execute the first section's code 2008-07-09 20:17 kichik * /NSIS/branches/nobjs/Source/build.cpp: removed tests that tested nothing meaningful 2008-07-09 20:17 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: bye bye build_cursection_isfunc 2008-07-09 20:16 kichik * /NSIS/branches/nobjs/Source/build.cpp: convert from build_cusrsection_isfunc to build_cur_nobj_function where required 2008-07-09 20:16 kichik * /NSIS/branches/nobjs/Source/build.cpp: no more need for build_cursection in add_function() 2008-07-09 20:15 kichik * /NSIS/branches/nobjs/Source/script.cpp: build_cursection is no longer valid when doCommand() is called 2008-07-09 20:15 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: check duplicate global labels using nobjs 2008-07-09 20:14 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: add sections after script is parsed 2008-07-09 20:14 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: nicer duplicate local label check 2008-07-07 23:55 kichik * /NSIS/trunk/Source/build.cpp: that define no longer exists 2008-06-26 23:49 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html: tabs to spaces 2008-06-26 23:45 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html: fixed bug #1964719 - Page callback function documentation 2008-06-16 18:00 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: fixed bug #1995024 - Typo in Finish.nsh causes var waste warning 2008-06-13 17:25 kichik * /NSIS/trunk/Source/exehead/exec.c: applied patch #1992325 - Logging - Change CreateDirectory logging to show recursion 2008-06-13 16:51 kichik * /NSIS/trunk/Docs/src/attributes.but: fixed bug #1990955 - Missing links in Documentation 2008-06-13 16:50 kichik * /NSIS/trunk/Examples/LogicLib.nsi: added IfNotThen 2008-06-13 16:42 kichik * /NSIS/trunk/Include/LogicLib.nsh: applied patch #1990761 - ${IfNotThen} macro for LogicLib 2008-06-13 16:31 kichik * /NSIS/trunk/Source/exehead/exec.c: applied patch #1986692 - Close LOG file when LogSet is set to Off. 2008-06-12 19:10 kichik * /NSIS/trunk/Contrib/Language files/French.nsh: fixed bug #1979491 - Non-ANSI display name for French 2008-06-12 18:58 kichik * /NSIS/trunk/Contrib/Language files/French.nsh: fixed bug #1967032: French.nsh : fix on MUI_UNTEXT_FINISH_INFO_REBOOT 2008-06-12 18:09 kichik * /NSIS/trunk/Examples/makensis.nsi: added missing Pop after nsDialogs::Create 2008-05-29 21:17 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: fixed MUI_FINISHPAGE_CANCEL_ENABLED and removed some useless code 2008-05-28 14:34 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: MULTIUSER_INSTALLMODE_INSTDIR should not be used for the uninstaller 2008-05-10 10:44 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization and a bit clearer code 2008-05-10 10:42 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1946112 - Wrong free space calculation 2008-05-08 10:28 kichik * /NSIS/trunk/Source/mmap.h: and m_iMappedSize as well 2008-05-08 10:27 kichik * /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h: mutable instead of const_cast for nicer code 2008-05-04 12:55 joostverburg * /NSIS/trunk/Include/VB6RunTime.nsh: msvbvm60.dll is protected by Windows Vista 2008-05-04 08:30 pabs3 * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/script.cpp: fixed bug #1951417 - fix and re-enable the HeaderBitmap.nsi test on Linux 2008-05-03 13:58 kichik * /NSIS/tags/v237: Tagging for release 2.37 2008-05-03 13:57 kichik * /NSIS/trunk/Menu/images/header.gif: 2.37 2008-05-03 13:44 kichik * /NSIS/trunk/Docs/src/history.but: 2.37 2008-05-03 13:16 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: allow 'A' to be specified anywhere in the flags field 2008-05-03 10:12 kichik * /NSIS/branches/nobjs/Contrib/BgImage/BgImage.cpp, /NSIS/branches/nobjs/Contrib/ExDLL/exdll.dsp, /NSIS/branches/nobjs/Contrib/ExDLL/exdll.dsw, /NSIS/branches/nobjs/Contrib/ExDLL/exdll.h, /NSIS/branches/nobjs/Contrib/InstallOptions/Readme.html, /NSIS/branches/nobjs/Contrib/LangDLL/LangDLL.c, /NSIS/branches/nobjs/Contrib/Language files/Albanian.nlf, /NSIS/branches/nobjs/Contrib/Language files/Albanian.nsh, /NSIS/branches/nobjs/Contrib/Language files/Dutch.nsh, /NSIS/branches/nobjs/Contrib/Language files/English.nsh, /NSIS/branches/nobjs/Contrib/Language files/French.nlf, /NSIS/branches/nobjs/Contrib/Language files/French.nsh, /NSIS/branches/nobjs/Contrib/Language files/German.nsh, /NSIS/branches/nobjs/Contrib/Language files/Hebrew.nsh, /NSIS/branches/nobjs/Contrib/Language files/Italian.nsh, /NSIS/branches/nobjs/Contrib/Language files/Polish.nlf, /NSIS/branches/nobjs/Contrib/Language files/Polish.nsh, /NSIS/branches/nobjs/Contrib/Language files/PortugueseBR.nlf, /NSIS/branches/nobjs/Contrib/Language files/PortugueseBR.nsh, /NSIS/branches/nobjs/Contrib/Language files/Slovak.nlf, /NSIS/branches/nobjs/Contrib/Language files/Slovak.nsh, /NSIS/branches/nobjs/Contrib/Language files/Spanish.nsh, /NSIS/branches/nobjs/Contrib/Language files/SpanishInternational.nsh, /NSIS/branches/nobjs/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/nobjs/Contrib/Modern UI 2/Deprecated.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Interface.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/License.txt, /NSIS/branches/nobjs/Contrib/Modern UI 2/Localization.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/MUI2.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Components.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/branches/nobjs/Contrib/Modern UI 2/Readme.html, /NSIS/branches/nobjs/Contrib/Modern UI 2/SConscript, /NSIS/branches/nobjs/Contrib/Modern UI/License.txt, /NSIS/branches/nobjs/Contrib/Modern UI/Readme.html, /NSIS/branches/nobjs/Contrib/Modern UI/System.nsh, /NSIS/branches/nobjs/Contrib/MultiUser, /NSIS/branches/nobjs/Contrib/MultiUser/MultiUser.nsh, /NSIS/branches/nobjs/Contrib/MultiUser/Readme.html, /NSIS/branches/nobjs/Contrib/MultiUser/SConscript, /NSIS/branches/nobjs/Contrib/nsDialogs/browse.c, /NSIS/branches/nobjs/Contrib/nsDialogs/input.c, /NSIS/branches/nobjs/Contrib/nsDialogs/nsDialogs.c, /NSIS/branches/nobjs/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/branches/nobjs/Contrib/nsDialogs/Readme.html, /NSIS/branches/nobjs/Contrib/nsExec/nsexec.c, /NSIS/branches/nobjs/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/branches/nobjs/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/branches/nobjs/Contrib/NSIS Menu/SConscript, /NSIS/branches/nobjs/Contrib/VPatch/Readme.html, /NSIS/branches/nobjs/Contrib/VPatch/Source/GUI, /NSIS/branches/nobjs/Contrib/VPatch/Source/Plugin/SConscript, /NSIS/branches/nobjs/COPYING, /NSIS/branches/nobjs/Docs/src/basic.but, /NSIS/branches/nobjs/Docs/src/chm_config.but, /NSIS/branches/nobjs/Docs/src/config.but, /NSIS/branches/nobjs/Docs/src/headers.but, /NSIS/branches/nobjs/Docs/src/history.but, /NSIS/branches/nobjs/Docs/src/library.but, /NSIS/branches/nobjs/Docs/src/license.but, /NSIS/branches/nobjs/Docs/src/misc.but, /NSIS/branches/nobjs/Docs/src/modernui.but, /NSIS/branches/nobjs/Docs/src/pages.but, /NSIS/branches/nobjs/Docs/src/SConscript, /NSIS/branches/nobjs/Docs/src/silent.but, /NSIS/branches/nobjs/Docs/src/tutorial.but, /NSIS/branches/nobjs/Docs/src/usefulfunc.but, /NSIS/branches/nobjs/Docs/src/var.but, /NSIS/branches/nobjs/Examples/bigtest.nsi, /NSIS/branches/nobjs/Examples/example1.nsi, /NSIS/branches/nobjs/Examples/example2.nsi, /NSIS/branches/nobjs/Examples/FileFunc.nsi, /NSIS/branches/nobjs/Examples/FileFuncTest.nsi, /NSIS/branches/nobjs/Examples/gfx.nsi, /NSIS/branches/nobjs/Examples/languages.nsi, /NSIS/branches/nobjs/Examples/Library.nsi, /NSIS/branches/nobjs/Examples/LogicLib.nsi, /NSIS/branches/nobjs/Examples/makensis.nsi, /NSIS/branches/nobjs/Examples/Memento.nsi, /NSIS/branches/nobjs/Examples/Modern UI/Basic.nsi, /NSIS/branches/nobjs/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/branches/nobjs/Examples/Modern UI/InstallOptions.nsi, /NSIS/branches/nobjs/Examples/Modern UI/ioA.ini, /NSIS/branches/nobjs/Examples/Modern UI/ioB.ini, /NSIS/branches/nobjs/Examples/Modern UI/ioC.ini, /NSIS/branches/nobjs/Examples/Modern UI/MultiLanguage.nsi, /NSIS/branches/nobjs/Examples/Modern UI/StartMenu.nsi, /NSIS/branches/nobjs/Examples/Modern UI/WelcomeFinish.nsi, /NSIS/branches/nobjs/Examples/one-section.nsi, /NSIS/branches/nobjs/Examples/primes.nsi, /NSIS/branches/nobjs/Examples/rtest.nsi, /NSIS/branches/nobjs/Examples/SConscript, /NSIS/branches/nobjs/Examples/silent.nsi, /NSIS/branches/nobjs/Examples/StrFunc.nsi, /NSIS/branches/nobjs/Examples/TextFunc.nsi, /NSIS/branches/nobjs/Examples/TextFuncTest.nsi, /NSIS/branches/nobjs/Examples/UserVars.nsi, /NSIS/branches/nobjs/Examples/viewhtml.nsi, /NSIS/branches/nobjs/Examples/waplugin.nsi, /NSIS/branches/nobjs/Examples/WordFunc.nsi, /NSIS/branches/nobjs/Examples/WordFuncTest.nsi, /NSIS/branches/nobjs/Include/LangFile.nsh, /NSIS/branches/nobjs/Include/LogicLib.nsh, /NSIS/branches/nobjs/Include/Memento.nsh, /NSIS/branches/nobjs/Include/SConscript, /NSIS/branches/nobjs/Include/StrFunc.nsh, /NSIS/branches/nobjs/Include/VB6RunTime.nsh, /NSIS/branches/nobjs/Include/WordFunc.nsh, /NSIS/branches/nobjs/Menu/compiler.html, /NSIS/branches/nobjs/Menu/docs.html, /NSIS/branches/nobjs/Menu/images/clear.gif, /NSIS/branches/nobjs/Menu/images/header.gif, /NSIS/branches/nobjs/Menu/images/menu.gif, /NSIS/branches/nobjs/Menu/images/menud.gif, /NSIS/branches/nobjs/Menu/index.html, /NSIS/branches/nobjs/Menu/intro.html, /NSIS/branches/nobjs/Menu/notinstalled.html, /NSIS/branches/nobjs/Menu/update.html, /NSIS/branches/nobjs/Menu/websites.html, /NSIS/branches/nobjs/SCons/Config/gnu, /NSIS/branches/nobjs/SConstruct, /NSIS/branches/nobjs/Scripts/release.py, /NSIS/branches/nobjs/Source/7zip/LZMADecode.c, /NSIS/branches/nobjs/Source/7zip/LZMADecode.h, /NSIS/branches/nobjs/Source/afxres.h, /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/bzip2/blocksort.c, /NSIS/branches/nobjs/Source/bzip2/bzlib.c, /NSIS/branches/nobjs/Source/bzip2/bzlib.h, /NSIS/branches/nobjs/Source/bzip2/compress.c, /NSIS/branches/nobjs/Source/bzip2/decompress.c, /NSIS/branches/nobjs/Source/bzip2/huffman.c, /NSIS/branches/nobjs/Source/cbzip2.h, /NSIS/branches/nobjs/Source/clzma.cpp, /NSIS/branches/nobjs/Source/clzma.h, /NSIS/branches/nobjs/Source/compressor.h, /NSIS/branches/nobjs/Source/crc32.c, /NSIS/branches/nobjs/Source/crc32.h, /NSIS/branches/nobjs/Source/czlib.h, /NSIS/branches/nobjs/Source/dirreader.cpp, /NSIS/branches/nobjs/Source/dirreader.h, /NSIS/branches/nobjs/Source/exehead/afxres.h, /NSIS/branches/nobjs/Source/exehead/bgbg.c, /NSIS/branches/nobjs/Source/exehead/components.c, /NSIS/branches/nobjs/Source/exehead/components.h, /NSIS/branches/nobjs/Source/exehead/config.h, /NSIS/branches/nobjs/Source/exehead/exec.c, /NSIS/branches/nobjs/Source/exehead/exec.h, /NSIS/branches/nobjs/Source/exehead/fileform.c, /NSIS/branches/nobjs/Source/exehead/fileform.h, /NSIS/branches/nobjs/Source/exehead/lang.h, /NSIS/branches/nobjs/Source/exehead/Main.c, /NSIS/branches/nobjs/Source/exehead/state.h, /NSIS/branches/nobjs/Source/exehead/Ui.c, /NSIS/branches/nobjs/Source/exehead/ui.h, /NSIS/branches/nobjs/Source/exehead/util.c, /NSIS/branches/nobjs/Source/exehead/util.h, /NSIS/branches/nobjs/Source/fileform.cpp, /NSIS/branches/nobjs/Source/fileform.h, /NSIS/branches/nobjs/Source/growbuf.cpp, /NSIS/branches/nobjs/Source/growbuf.h, /NSIS/branches/nobjs/Source/icon.cpp, /NSIS/branches/nobjs/Source/icon.h, /NSIS/branches/nobjs/Source/lang.cpp, /NSIS/branches/nobjs/Source/lang.h, /NSIS/branches/nobjs/Source/lineparse.cpp, /NSIS/branches/nobjs/Source/lineparse.h, /NSIS/branches/nobjs/Source/makenssi.cpp, /NSIS/branches/nobjs/Source/manifest.cpp, /NSIS/branches/nobjs/Source/manifest.h, /NSIS/branches/nobjs/Source/mmap.cpp, /NSIS/branches/nobjs/Source/mmap.h, /NSIS/branches/nobjs/Source/Platform.h, /NSIS/branches/nobjs/Source/Plugins.cpp, /NSIS/branches/nobjs/Source/Plugins.h, /NSIS/branches/nobjs/Source/ResourceEditor.cpp, /NSIS/branches/nobjs/Source/ResourceEditor.h, /NSIS/branches/nobjs/Source/ResourceVersionInfo.cpp, /NSIS/branches/nobjs/Source/ResourceVersionInfo.h, /NSIS/branches/nobjs/Source/script.cpp, /NSIS/branches/nobjs/Source/ShConstants.cpp, /NSIS/branches/nobjs/Source/strlist.cpp, /NSIS/branches/nobjs/Source/strlist.h, /NSIS/branches/nobjs/Source/Tests/compression.cpp, /NSIS/branches/nobjs/Source/Tests/icons.py, /NSIS/branches/nobjs/Source/tokens.cpp, /NSIS/branches/nobjs/Source/tokens.h, /NSIS/branches/nobjs/Source/util.cpp, /NSIS/branches/nobjs/Source/util.h, /NSIS/branches/nobjs/Source/winchar.cpp, /NSIS/branches/nobjs/Source/winchar.h, /NSIS/branches/nobjs/Source/writer.cpp, /NSIS/branches/nobjs/Source/writer.h, /NSIS/branches/nobjs/Source/zlib/deflate.c, /NSIS/branches/nobjs/Source/zlib/DEFLATE.H, /NSIS/branches/nobjs/Source/zlib/INFBLOCK.C, /NSIS/branches/nobjs/Source/zlib/trees.c, /NSIS/branches/nobjs/Source/zlib/ZCONF.H, /NSIS/branches/nobjs/Source/zlib/ZLIB.H, /NSIS/branches/nobjs/Source/zlib/ZUTIL.H: updated nobjs branch with trunk changes 5408:5627 2008-05-02 20:21 kichik * /NSIS/trunk/Contrib/VPatch/Source/GUI: we don't use the GUI and its source code is available from tibed.net 2008-05-02 20:15 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html: fixed patch #1840709 - VPatch CLI and test suite removed reference to test suite 2008-05-02 20:14 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html: typo fix backported from 3.2 2008-05-02 19:34 kichik * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Polish.nsh: applied patch #1927421 - Polish translation for 2.35 2008-05-02 19:33 kichik * /NSIS/trunk/Contrib/Language files/Slovak.nsh: don't use special chars in language name 2008-05-02 19:32 kichik * /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nsh: applied patch #1939669 - Slovak (sk) translation update 2008-05-02 19:07 kichik * /NSIS/trunk/Source/Tests/icons.py: massive icon tester 2008-05-02 19:04 kichik * /NSIS/trunk/Source/build.cpp: applied patch #1948700 - support for files between 1.6 and 2 GB 2008-05-02 18:43 kichik * /NSIS/trunk/Contrib/nsDialogs/browse.c: fixed bug #1955803 - SelectFileDialog returns stack garbage if user cancels 2008-05-02 18:21 kichik * /NSIS/trunk/Source/icon.cpp: fixed bug #1956350 - wrong icon order since 2.32 2008-05-02 16:47 kichik * /NSIS/trunk/Source/icon.cpp: added IconPairs typedef 2008-05-01 20:31 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Include/StrFunc.nsh: check whether function from StrFunc.nsh is already included 2008-04-25 09:29 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp: applied patch #1951248 - BgImage::Destroy re-enter crash fix 2008-04-23 15:29 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/tokens.cpp: avoid build_cursection and build_cursection_isfunc where possible 2008-04-23 15:28 kichik * /NSIS/branches/nobjs/Source/script.cpp: use section_remove_flags instead of messing with build_cursection directly 2008-04-23 15:23 kichik * /NSIS/branches/nobjs/Source/build.cpp: TODO 2008-04-23 15:22 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: added build_cur_nobj_code which can be either build_cur_nobj_function or build_cur_nobj_section depending on the context and used it where we don't care if it's a function or a section 2008-04-23 15:01 kichik * /NSIS/branches/nobjs/Source/nobj/entry.cpp: i said no platform.h... 2008-04-23 14:52 kichik * /NSIS/branches/nobjs/Source/nobj/code.cpp, /NSIS/branches/nobjs/Source/nobj/entry.cpp, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/int.cpp, /NSIS/branches/nobjs/Source/nobj/jump.cpp, /NSIS/branches/nobjs/Source/nobj/label.cpp, /NSIS/branches/nobjs/Source/nobj/nobj.cpp, /NSIS/branches/nobjs/Source/nobj/section.cpp, /NSIS/branches/nobjs/Source/nobj/str.cpp, /NSIS/branches/nobjs/Source/nobj/var.cpp: no need for Platform.h, which for some reason can no longer be found (probably new scons doesn't pass /ISource) 2008-04-22 20:28 joostverburg * /NSIS/trunk/Docs/src/library.but: correct name of header file 2008-04-22 17:45 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: added missing int status_update; 2008-04-22 13:51 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed bug #1947388 - ${NSD_OnBack} doesn't work 2008-04-22 13:42 kichik * /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/SConstruct: scons 0.98 with an even uglier hack to reverse the result of hhc.exe 2008-04-21 23:01 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #1947702 - Wrong default for PROGRAMFILES64 on Win2000 default to $PROGRAMFIELS if $PROGRAMFILES64 can't be found instead of "C:\Program Files" 2008-04-18 22:08 kichik * /NSIS/trunk/Source/exehead/Ui.c: reverted last commit it forced usage of GetDiskFreeSpace instead of GetDiskFreeSpaceEx for non-existent directories or anything GetDiskFreeSpaceEx deemed invalid 2008-04-18 21:55 kichik * /NSIS/trunk/Source/exehead/Ui.c: partial fix for bug #1946112 - Wrong free space calculation still need to get the lowest existing directory so C:\mount-point\non-existent-dir still works 2008-04-18 17:20 kichik * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh: what is that doing there? 2008-04-18 17:14 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh: Add MULTIUSER_INSTALLMODEPAGE (niwrad777) 2008-04-10 18:00 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: fixed bug #1939571 - LangDLL auto select with only 1 language 2008-04-10 17:58 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: make sure at least one language is specified without creating a dialog 2008-03-31 18:46 kichik * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh: updates by Felipe and deguix 2008-03-30 10:24 pabs3 * /NSIS/trunk/SConstruct: Disable the System.nsi test on Unix, it requires System::Call 2008-03-29 22:36 kichik * /NSIS/trunk/Docs/src/history.but: after-last-minutes english fixes 2008-03-29 22:04 kichik * /NSIS/tags/v236: Tagging for release 2.36 2008-03-29 22:03 kichik * /NSIS/trunk/Menu/images/header.gif: 2.36 2008-03-29 21:58 kichik * /NSIS/trunk/Contrib/Language files/Albanian.nsh: what is this line doing there? 2008-03-29 21:47 kichik * /NSIS/trunk/Docs/src/history.but: 2.36 2008-03-29 18:22 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: fixed error when a custom installation mode initialization function is used only for the installer 2008-03-29 18:02 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: fixed error when a custom installation mode initialization function is used only for the installer 2008-03-29 17:59 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: implemented RFE #1910005 - nsDialogs: support for ComboBox onChange 2008-03-29 17:53 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: fixed bug #1909458 - nsEcec: cannot handle exit code 259 2008-03-29 17:50 joostverburg * /NSIS/trunk/Include/StrFunc.nsh: allow StrFunc.nsh to be included multiple times 2008-03-29 17:34 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: add missing control_HWND for NSD_On* docs 2008-03-29 17:32 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: patch #1900588 - More nsDialogs macros - NSD_AddStyle - NSD_AddExStyle - NSD_SetTextLimit - NSD_CB_AddString - NSD_CB_SelectString - NSD_LB_AddString - NSD_LB_SelectString 2008-03-29 17:06 kichik * /NSIS/trunk/Contrib/Language files/French.nlf: patch #1916564 - French.nlf : fix on ^ComponentsSubText1 2008-03-29 17:05 kichik * /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nsh: patch #1919360 - Update for Albanian language files 2008-03-29 16:42 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: added NSD_CreateNumber with ES_NUMBER 2008-03-29 15:35 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Include/LangFile.nsh: * New LangFile.nsh macro LANGFILE_INCLUDE_WITHDEFAULT to load language file with defaults being obtained from a default file. This replaces the LANGFILE_DEFAULT setting and makes it easier to use LangFile.nsh for multiple sets of languages file without having to care about the different LANGFILE_DEFAULT settings. * Allow LangFile.nsh to be included multiple times. 2008-03-23 21:00 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: fixed typo in MULTIUSER_NOUNINSTALL setting 2008-03-21 16:26 kichik * /NSIS/trunk/Examples/bigtest.nsi: read from correct value in InstallDirRegKey 2008-03-16 19:42 kichik * /NSIS/trunk/Include/Memento.nsh: added missing ${MementoSectionDone} 2008-03-12 20:39 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: fixed bug #1913029 - default installation mode based on registry key is now set correctly 2008-03-07 22:23 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: labels now have click notification, so fix docs up 2008-03-07 08:57 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dsp, /NSIS/trunk/Contrib/ExDLL/exdll.dsw: avoid corruption messages 2008-03-07 08:55 kichik * /NSIS/trunk/Scripts/release.py: Visual Studio's files should also be CRLF or else it chokes 2008-03-06 17:32 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed bug #1908732 - nsDialogs - OnClick support for static controls not working 2008-03-04 16:59 kichik * /NSIS/trunk/Source/util.cpp: already using namespace std 2008-03-03 18:39 kichik * /NSIS/trunk/SConstruct: we need regular Split() as it's not promised those lines will be separated by just \n and not \r\n 2008-03-03 18:24 kichik * /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi: revert AddBrandingImage as it's not needed 2008-03-03 16:33 pabs3 * /NSIS/trunk/SCons/Config/gnu: Fix FTBFS on Debian GNU/Linux amd64 due to not enough use of -m32 2008-03-03 14:04 pabs3 * /NSIS/trunk/Source/util.cpp: Fix Debian bug #456082: fix FTBFS with GCC 4.3 2008-03-03 12:21 pabs3 * /NSIS/trunk/SConstruct: Ignore 'Examples/Modern UI/HeaderBitmap.nsi' on Linux since AddBrandingImage is disabled for non Win32 platforms. 2008-03-03 12:21 pabs3 * /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi: Use AddBrandingImage since MUI_LANGUAGE seems to indirectly use SetBrandingImage. 2008-03-03 12:00 pabs3 * /NSIS/trunk/SConstruct: Ignore 'Examples/Modern UI/WelcomeFinish.nsi' on Linux since it uses System::Call 2008-03-03 11:59 pabs3 * /NSIS/trunk/SConstruct: Use python split instead of scons Split so we can have spaces in file names for ignored tests. 2008-02-24 17:33 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed #1900585 - NSD_SetText doesn't work 2008-02-23 16:32 kichik * /NSIS/trunk/Source/Tests/compression.cpp: use CPPUNIT_ASSERT_EQUAL 2008-02-23 16:28 kichik * /NSIS/trunk/Source/exehead/fileform.c: fixed bug #1874297 - Error decompressing data! Corrupted installer? problem was that decompression ended prematurely. instead of waiting for zlib to return Z_STREAM_END, it checked if no more output was required. this could cause a case where zlib wouldn't read its entire stream. in this particular case, the compressed headers were 0x4001 bytes long and compressed data input buffer size is only 0x4000. instead of waiting for another run of inflate() to read the last byte, which is probably eof, _dodecmop() broke the loop and didn't read that extra byte. since loadHeaders() relays on _dodecomp() to read the entire header so it can calculate where the data block begins, all reads from the data block suddenly became off by one, causing "decompression errors". 2008-02-23 15:04 kichik * /NSIS/trunk/Source/exehead/fileform.h: update structure comments 2008-02-23 12:38 kichik * /NSIS/trunk/Contrib/VPatch/Source/Plugin/SConscript: implemented RFE #1900226 - expose MD5 function from VPatch 2008-02-23 11:35 pabs3 * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp: Fix 1900233: add some tweaks to allow building the NSIS Menu with wxGTK on Debian GNU/Linux. 2008-02-23 10:20 kichik * /NSIS/trunk/Source/icon.cpp: fixed bug #1900098 - SVN trunk FTBFS on Debian GNU/Linux 2008-02-22 18:36 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: use new nsDialogs macros for image handling 2008-02-22 18:32 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: added ${NSD_SetImage}, ${NSD_SetStretchedImage}, ${NSD_ClearImage} and ${NSD_FreeImage} 2008-02-22 17:37 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: HTML fixes 2008-02-22 17:34 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: document macros 2008-02-22 17:01 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: added NSD_SetText, NSD_SetState, NSD_Check and NSD_Uncheck 2008-02-20 22:34 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Components.nsh: add missing macros for descriptions on uninstaller components page 2008-02-19 23:37 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: fixed bug #1896803 - nsDialogs::SelectFolderDialog Bug 1841120 still open? 2008-02-18 23:24 kichik * /NSIS/trunk/Source/icon.cpp: fixed bug #1896500 - Exception during compile 2008-02-16 21:46 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: it should call the old code path if NOT running under WOW64 (though the hack wouldn't work anyway... :( ) 2008-02-16 18:30 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: implemented RFE #1778973 - nsExec & ExecDos - Support DisableX64FSRedirection feature also fixed bug #1889317 2008-02-16 17:53 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: fixed bug #1891066 - Open Script Folder runs executable instead 2008-02-16 17:37 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh: fixed bug #1891106 - Error flag not cleared after ReadRegStr in MUI StartMenu 2008-02-16 17:34 kichik * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Polish.nsh: applied patch #1894983 - Polish language files for NSIS 2.35+ 2008-02-16 16:18 kichik * /NSIS/trunk/Docs/src/misc.but: fixed bug #1894033 - typo in help file 2008-02-11 20:33 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html: fixed bug #1891266 - Modern UI Documentation 2008-02-10 21:48 kichik * /NSIS/branches/nobjs/Source/build.cpp: context is already aware to uninstaller code in resolve_call_int() 2008-02-10 21:40 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h: only add function's code when it's really used no more fake optimization of zeroing out the code 2008-02-09 19:27 kichik * /NSIS/trunk/Contrib/Modern UI 2/Readme.html: macros itself -> macros themselves 2008-02-08 21:16 kichik * /NSIS/tags/v235: Tagging for release 2.35 2008-02-08 21:15 kichik * /NSIS/trunk/Menu/images/header.gif: 2.35 2008-02-08 21:14 kichik * /NSIS/trunk/Include/VB6RunTime.nsh: fixed eol-style 2008-02-08 21:10 kichik * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: fixed eol-style 2008-02-08 21:06 kichik * /NSIS/trunk/Examples/makensis.nsi: removed old files 2008-02-08 20:56 kichik * /NSIS/trunk/Docs/src/history.but: 2.35 2008-02-08 20:40 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: use integer comparison for comparing pointers to zero to support "error" return value 2008-02-08 20:37 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nsh: added MultiUser strings for Hebrew 2008-02-08 20:12 kichik * /NSIS/trunk/Docs/src/library.but: fixed link 2008-02-08 16:48 kichik * /NSIS/trunk/Contrib/nsDialogs/input.c: fixed bug #1889720 - nsDialogs can crash on Windows 98 2008-02-04 01:35 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: default directory that does not require administrator privileges 2008-02-04 01:09 joostverburg * /NSIS/trunk/Examples/UserVars.nsi: administrator privileges required for installation in Program Files 2008-02-04 00:49 joostverburg * /NSIS/trunk/Examples/example1.nsi: default directory that does not require administrator privileges 2008-02-02 18:43 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: extracted add_nobj_entry_internal() 2008-02-02 18:34 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: renamed add_nobj_entries() to add_nobj_code_deps() and changed parameter to nobj_code 2008-02-02 18:33 kichik * /NSIS/branches/nobjs/Source/nobj/code.cpp, /NSIS/branches/nobjs/Source/nobj/code.h, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h, /NSIS/branches/nobjs/Source/nobj/section.cpp, /NSIS/branches/nobjs/Source/nobj/section.h, /NSIS/branches/nobjs/Source/SConscript: move common code from nobj_function and nobj_section into nobj_code (better name pending) 2008-02-02 18:29 kichik * /NSIS/branches/nobjs/Source/build.cpp: validate return value of add_nobj_entries 2008-02-02 18:28 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h, /NSIS/branches/nobjs/Source/nobj/label.cpp, /NSIS/branches/nobjs/Source/nobj/label.h, /NSIS/branches/nobjs/Source/nobj/section.cpp, /NSIS/branches/nobjs/Source/nobj/section.h, /NSIS/branches/nobjs/Source/SConscript: added label support 2008-02-02 13:22 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: same for welcome page (mainly fixes memory allocation) 2008-02-02 13:20 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: a few fix-ups for image size query: - verify allocation - free allocated memory - push bitmap path to avoid quoting issues 2008-02-01 23:06 kichik * /NSIS/branches/nobjs/Source/build.cpp: revert that... labels are later looked-up by name without colons 2008-02-01 23:02 kichik * /NSIS/branches/nobjs/Source/build.cpp: no real need to support labels without colon suffix 2008-02-01 22:50 kichik * /NSIS/branches/nobjs/Source/build.cpp: entries can now be added to data block only through add_nobj_entries 2008-02-01 22:40 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/nobj/section.cpp, /NSIS/branches/nobjs/Source/nobj/section.h: move some section functionality to nobj_section 2008-02-01 22:16 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: extracted add_nobj_entries() from section_end() and function_end() 2008-02-01 22:12 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/nobj/section.cpp, /NSIS/branches/nobjs/Source/nobj/section.h, /NSIS/branches/nobjs/Source/SConscript: nobjify sections and add section's code only after SectionEnd 2008-02-01 21:52 kichik * /NSIS/branches/nobjs/Source/nobj/function.cpp: no need for 2008-02-01 16:44 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh: fixed bug #1861944 - mui.StartMenuPage.Create not referenced 2008-02-01 16:38 kichik * /NSIS/trunk/Docs/src/basic.but: fixed bug #1883917 - File command reference not clear 2008-01-29 22:43 kichik * /NSIS/trunk/Source/tokens.h: another typo 2008-01-29 22:42 kichik * /NSIS/trunk/Source/tokens.h: typo 2008-01-29 15:36 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: set default language file for MUI without changing the user setting 2008-01-29 15:33 joostverburg * /NSIS/trunk/Include/LangFile.nsh: new macro for installer language files, which does not require the name of the language to be set (this is already done by the standard NSIS language files) 2008-01-28 22:05 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh: some more translations for installation mode selection page of Multi-User header file 2008-01-28 21:46 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/MultiUser/Readme.html: * added some comments * added settings for registry key that enables the installation mode to be set to the mode from a previous installation * fixed a few typos 2008-01-28 20:10 joostverburg * /NSIS/trunk/Contrib/MultiUser/Readme.html: typo 2008-01-27 17:45 joostverburg * /NSIS/trunk/Examples/SConscript: use Modern UI 2 2008-01-27 17:44 joostverburg * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/Library.nsi, /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Examples/Memento.nsi, /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Examples/primes.nsi, /NSIS/trunk/Examples/rtest.nsi, /NSIS/trunk/Examples/silent.nsi, /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Examples/TextFunc.nsi, /NSIS/trunk/Examples/TextFuncTest.nsi, /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Examples/viewhtml.nsi, /NSIS/trunk/Examples/waplugin.nsi, /NSIS/trunk/Examples/WordFunc.nsi, /NSIS/trunk/Examples/WordFuncTest.nsi: Windows Vista UAC setting 2008-01-27 17:24 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: * use Modern UI 2 * Windows Vista UAC setting 2008-01-26 15:13 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: document DropList 2008-01-26 11:47 kichik * /NSIS/trunk/Source/icon.cpp: zero icon memory to prevent uninitialized memory from getting into the resources 2008-01-25 12:47 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: check whether variables for image resizing need to be included 2008-01-24 21:54 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: get image control size directly 2008-01-24 21:45 joostverburg * /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/SConscript, /NSIS/trunk/Include/VB6RunTime.nsh: new header file for the setup of Visual Basic 6.0 run-time files 2008-01-24 21:26 joostverburg * /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh: fixed compile error when check for administrator or power user privileges is included 2008-01-24 20:52 joostverburg * /NSIS/trunk/Contrib/MultiUser/Readme.html: corrected info about power users 2008-01-24 19:17 joostverburg * /NSIS/trunk/Contrib/MultiUser/Readme.html: fix FunctionEnd command in example code 2008-01-24 18:50 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: fixed bug #1875945 - Image doesn't fit the window in MUI2 with chinese language. Added support for MUI1 MUI_(UN)WELCOMEFINISHPAGE_BITMAP_NOSTRETCH setting. 2008-01-18 14:03 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: fix comment 2008-01-18 13:49 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: bring back comment 2008-01-18 13:45 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: applied patch #1871856 - nsDialogs: support for keyboard cues for link control 2008-01-12 15:37 kichik * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/silent.but, /NSIS/trunk/Docs/src/var.but: fixed links 2008-01-06 09:27 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh: fixed bug - Dangerous example of MUI_STARTMENU_GETFOLDER macro 2008-01-05 22:54 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: set default state of reboot now / reboot later radio buttons 2008-01-04 13:53 joostverburg * /NSIS/trunk/Contrib/MultiUser/Readme.html: fix typo 2008-01-03 20:48 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript: fixed dependency list 2008-01-03 20:45 kichik * /NSIS/trunk/Contrib/MultiUser/SConscript: fixed wrong function name 2008-01-03 13:45 joostverburg * /NSIS/trunk/Examples/makensis.nsi: move documentation links to NSIS Menu 2008-01-03 13:26 joostverburg * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/clear.gif, /NSIS/trunk/Menu/images/menu.gif, /NSIS/trunk/Menu/images/menud.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: simplified menu providing easier access to all documentation 2008-01-03 01:26 joostverburg * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SConstruct: install Multi-User Header File 2008-01-02 16:19 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html: fix variable name for Start Menu folder 2008-01-02 01:48 joostverburg * /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/MultiUser, /NSIS/trunk/Contrib/MultiUser/MultiUser.nsh, /NSIS/trunk/Contrib/MultiUser/Readme.html, /NSIS/trunk/Contrib/MultiUser/SConscript: Multi-User Header File: Installer configuration for multi-user Windows environments 2007-12-30 13:05 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: remove functions which are already included in a header file 2007-12-29 23:43 joostverburg * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: * include header file content only once * set verbose level 2007-12-29 21:40 kichik * /NSIS/branches/nobjs/Source/nobj/nobj.cpp: deletion is for dummies... we need reference counting 2007-12-29 21:38 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: delay add function pwnage! 2007-12-29 21:21 kichik * /NSIS/branches/nobjs/Source/nobj/entry.cpp: pass all set_parm() calls through one set_parm() 2007-12-29 21:10 kichik * /NSIS/branches/nobjs/Source/nobj/function.cpp: stack stuff is evil 2007-12-29 20:57 kichik * /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h: const fixes 2007-12-29 20:47 kichik * /NSIS/branches/nobjs/Source/nobj/function.cpp: missing memset 2007-12-29 20:44 kichik * /NSIS/branches/nobjs/Source/build.cpp: some nobj TODO 2007-12-29 20:44 kichik * /NSIS/branches/nobjs/Source/nobj/entry.cpp, /NSIS/branches/nobjs/Source/nobj/entry.h, /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h, /NSIS/branches/nobjs/Source/nobj/int.cpp, /NSIS/branches/nobjs/Source/nobj/int.h, /NSIS/branches/nobjs/Source/nobj/jump.cpp, /NSIS/branches/nobjs/Source/nobj/jump.h, /NSIS/branches/nobjs/Source/nobj/nobj.cpp, /NSIS/branches/nobjs/Source/nobj/nobj.h, /NSIS/branches/nobjs/Source/nobj/str.cpp, /NSIS/branches/nobjs/Source/nobj/str.h, /NSIS/branches/nobjs/Source/nobj/var.cpp, /NSIS/branches/nobjs/Source/nobj/var.h: move to 2008 for easier trunk merge 2007-12-29 20:43 kichik * /NSIS/branches/nobjs/Source/nobj/function.cpp, /NSIS/branches/nobjs/Source/nobj/function.h, /NSIS/branches/nobjs/Source/SConscript: added nobj_function 2007-12-29 18:05 kichik * /NSIS/trunk/Source/exehead/lang.h: RFE #1795426 - User friendly message for corrupt or incomplete installer 2007-12-29 14:09 kichik * /NSIS/trunk/Include/LogicLib.nsh: more comments for IfNot from patch #1846785 2007-12-24 22:47 kichik * /NSIS/branches/nobjs/Source/script.cpp: fixed more variable parsing exceptions 2007-12-24 21:28 kichik * /NSIS/branches/nobjs/Source/build.cpp: handle NULL parameters (for example, when setting parm 1 but not 0) 2007-12-24 21:26 kichik * /NSIS/branches/nobjs/Source/script.cpp: fixed SendMessage 2007-12-24 20:57 kichik * /NSIS/tags/v234: Tagging for release 2.34 2007-12-24 20:56 kichik * /NSIS/trunk/Menu/images/header.gif: 2.34 2007-12-24 20:32 kichik * /NSIS/trunk/Docs/src/history.but: better wording 2007-12-23 22:36 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: add missing includes for new nobj directory structure 2007-12-23 22:35 kichik * /NSIS/branches/nobjs/Source/nobj/entry.cpp, /NSIS/branches/nobjs/Source/nobj/entry.h, /NSIS/branches/nobjs/Source/nobj/int.cpp, /NSIS/branches/nobjs/Source/nobj/int.h, /NSIS/branches/nobjs/Source/nobj/jump.cpp, /NSIS/branches/nobjs/Source/nobj/jump.h, /NSIS/branches/nobjs/Source/nobj/nobj.cpp, /NSIS/branches/nobjs/Source/nobj/nobj.h, /NSIS/branches/nobjs/Source/nobj/str.cpp, /NSIS/branches/nobjs/Source/nobj/str.h, /NSIS/branches/nobjs/Source/nobj/var.cpp, /NSIS/branches/nobjs/Source/nobj/var.h, /NSIS/branches/nobjs/Source/SConscript: split each nobj into its own file 2007-12-23 22:23 kichik * /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/nobj, /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h, /NSIS/branches/nobjs/Source/nobj/nobj.cpp, /NSIS/branches/nobjs/Source/nobj/nobj.h, /NSIS/branches/nobjs/Source/SConscript: move nobj.cpp and nobj.h to nobj folder 2007-12-23 22:14 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: pass everything through add_nobj_entry 2007-12-22 20:10 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/script.cpp: use nobj_var instead of GetUserVarIndex 2007-12-22 19:27 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: nobj_var 2007-12-22 19:24 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h, /NSIS/branches/nobjs/Source/script.cpp: nobj_entry::set_parm_jump - simpler than new nobj_jump for every call 2007-12-22 19:19 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/script.cpp: use nobj_jump 2007-12-22 19:03 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: added nobj_jump 2007-12-22 16:44 kichik * /NSIS/trunk/Examples/makensis.nsi: VersionCompare is only referenced when the version page is used 2007-12-22 16:35 kichik * /NSIS/trunk/Examples/makensis.nsi: install Deprecated.nsh 2007-12-22 16:20 kichik * /NSIS/trunk/Source/exehead/util.c: a empty string can be caused by a path like "\boot.ini", so support that as well 2007-12-22 16:10 kichik * /NSIS/trunk/Docs/src/history.but: better phrasing than "usage" 2007-12-22 16:09 kichik * /NSIS/trunk/Docs/src/history.but: 2.34 2007-12-22 15:27 kichik * /NSIS/trunk/Include/WordFunc.nsh: fixed bug #1852141 - WordFind do not support Chinese 2007-12-22 10:34 kichik * /NSIS/trunk/Docs/src/modernui.but, /NSIS/trunk/Docs/src/tutorial.but: link to mui2 2007-12-22 10:26 kichik * /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html: mui2 out of beta 2007-12-22 10:13 kichik * /NSIS/trunk/Contrib/Modern UI 2/Deprecated.nsh, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/SConscript: fixed bug #1784470 - MUI_RESERVEFILE_INSTALLOPTIONS fails install build nicer error messages when moving from MUI to MUI2 2007-12-22 09:54 kichik * /NSIS/trunk/Include/LangFile.nsh: fixed bug #1848952 - Overwriting LANGFILE_abc_NAME not possible anymore 2007-12-22 09:47 kichik * /NSIS/trunk/Docs/src/pages.but: mention nsDialogs as well as InstallOptions 2007-12-22 09:41 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/trees.c, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: happy new year! bug #1855805 2007-12-21 22:46 kichik * /NSIS/branches/nobjs/Source/build.cpp: simply zero real entry structure and don't pass empty parameters to add_nobj_entry_parm() 2007-12-21 22:46 kichik * /NSIS/branches/nobjs/Source/build.h: also declare process_jump_nobj 2007-12-21 22:45 kichik * /NSIS/branches/nobjs/Source/script.cpp: nobj it up 2007-12-21 22:28 kichik * /NSIS/trunk/Source/script.cpp: verify correct offset in TOK_GETFULLPATHNAME 2007-12-21 22:25 kichik * /NSIS/trunk/Source/script.cpp: verify correct offset in TOK_GETCURINSTTYPE 2007-12-21 20:54 kichik * /NSIS/branches/nobjs/Source/build.cpp: just resize() instead of pushing back NULLs 2007-12-21 20:53 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: added nobj_entry::set_parm() for std::string 2007-12-21 20:51 kichik * /NSIS/branches/nobjs/Source/build.cpp: push NULLs instead of wasting memory set_parm does that anyway... 2007-12-21 20:51 kichik * /NSIS/branches/nobjs/Source/build.cpp: TODO 2007-12-21 20:21 kichik * /NSIS/branches/nobjs/Source/build.cpp: pad with right number of parameters 2007-12-21 20:20 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h, /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: was thinking in Java... pointers needed here for proper polymorphism. 2007-12-21 16:50 kichik * /NSIS/branches/nobjs/SCons/Config/ms: some magic for RTTI 2007-12-21 16:47 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: nicer interface for nobj_entry 2007-12-21 16:36 kichik * /NSIS/branches/nobjs/Source/build.cpp, /NSIS/branches/nobjs/Source/build.h: added CEXEBuild::add_nobj_entry() using new nobjs 2007-12-21 16:35 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: more consts 2007-12-21 16:22 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: missing nobj_entry::which() 2007-12-21 16:18 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: nobj::dependencies() is const 2007-12-21 16:12 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: added nobj_entry 2007-12-21 16:01 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h: basic nobjs 2007-12-21 15:52 kichik * /NSIS/branches/nobjs/Source/nobj.cpp, /NSIS/branches/nobjs/Source/nobj.h, /NSIS/branches/nobjs/Source/SConscript: basic nobj implementation 2007-12-21 15:30 kichik * /NSIS/branches/nobjs: made a copy 2007-12-20 21:39 kichik * /NSIS/trunk/Source/util.cpp: more for bug #1851365 2007-12-19 21:17 kichik * /NSIS/trunk/Examples/makensis.nsi: simpler comparison using VersionCompare, less labels and more LogicLib 2007-12-19 21:02 kichik * /NSIS/trunk/Examples/SConscript: use nsDialogs instead of InstallOptions - no more makensis.ini 2007-12-19 20:59 kichik * /NSIS/trunk/Examples/makensis.nsi: properly handle initial value of $ReinstallPageCheck 2007-12-19 20:58 kichik * /NSIS/trunk/Examples/makensis.nsi: proper radio buttons location 2007-12-19 20:57 kichik * /NSIS/trunk/Examples/makensis.nsi: and now for something that actually builds... 2007-12-19 20:52 kichik * /NSIS/trunk/Examples/makensis.ini, /NSIS/trunk/Examples/makensis.nsi: use nsDialogs instead of InstallOptions 2007-12-19 20:52 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: use BM_GETCHECK see following thread for more information http://forums.winamp.com/showthread.php?s=&threadid=282186 2007-12-19 20:33 kichik * /NSIS/trunk/Examples/makensis.nsi: use MUI2 2007-12-15 15:28 kichik * /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/Platform.h: fixed bug #1851365 - mac os x leopard build and run fails - endian issues 2007-12-15 15:14 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed bug #1851136 - nsDialogs: ComboBox not like IO, DropList missing 2007-12-15 14:56 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/Readme.html: applied patch #1848940 - nsDialogs - Additions 2007-12-15 12:24 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #1851273 - relative path Delete doesn't work 2007-12-12 18:45 joostverburg * /NSIS/trunk/Contrib/Language files/German.nsh: spelling 2007-12-08 13:13 kichik * /NSIS/trunk/Include/LogicLib.nsh: applied patch #1846785 - IfNot support for LogicLib 2007-12-01 14:29 kichik * /NSIS/trunk/Docs/src/usage.but: fixed bug #1842326 - installer /D command line reference incomplete 2007-12-01 12:20 kichik * /NSIS/trunk/Scripts/release.py: ensure bug #1835866 and #1831677 won't repeat 2007-12-01 11:43 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.txt, /NSIS/trunk/Contrib/AdvSplash/Example.nsi, /NSIS/trunk/Contrib/Banner/Example.nsi, /NSIS/trunk/Contrib/Banner/Readme.txt, /NSIS/trunk/Contrib/BgImage/BgImage.txt, /NSIS/trunk/Contrib/BgImage/Example.nsi, /NSIS/trunk/Contrib/Dialer/Dialer.txt, /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Contrib/InstallOptions/testimgs.nsi, /NSIS/trunk/Contrib/InstallOptions/testlink.nsi, /NSIS/trunk/Contrib/InstallOptions/testnotify.nsi, /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Math/math.nsi, /NSIS/trunk/Contrib/Math/Math.txt, /NSIS/trunk/Contrib/Math/mathtest.nsi, /NSIS/trunk/Contrib/Math/mathtest.txt, /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Components.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Directory.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/InstallFiles.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/License.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/InstallOptions.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Contrib/nsExec/test.nsi, /NSIS/trunk/Contrib/NSIS Menu/wx/build.txt, /NSIS/trunk/Contrib/NSISdl/License.txt, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Contrib/Splash/Example.nsi, /NSIS/trunk/Contrib/Splash/splash.txt, /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Contrib/System/WhatsNew.txt, /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi, /NSIS/trunk/Contrib/VPatch/example.nsi, /NSIS/trunk/Contrib/VPatch/VPatchLib.nsh, /NSIS/trunk/Contrib/zip2exe/Base.nsh, /NSIS/trunk/Contrib/zip2exe/Classic.nsh, /NSIS/trunk/Contrib/zip2exe/Modern.nsh, /NSIS/trunk/COPYING, /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/Library.nsi, /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Memento.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi, /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Examples/primes.nsi, /NSIS/trunk/Examples/rtest.nsi, /NSIS/trunk/Examples/silent.nsi, /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Examples/TextFunc.nsi, /NSIS/trunk/Examples/TextFuncTest.nsi, /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Examples/VersionInfo.nsi, /NSIS/trunk/Examples/viewhtml.nsi, /NSIS/trunk/Examples/waplugin.nsi, /NSIS/trunk/Examples/WordFunc.nsi, /NSIS/trunk/Examples/WordFuncTest.nsi, /NSIS/trunk/Include/Colors.nsh, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/Memento.nsh, /NSIS/trunk/Include/MUI.nsh, /NSIS/trunk/Include/MUI2.nsh, /NSIS/trunk/Include/Sections.nsh, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh, /NSIS/trunk/Include/WinMessages.nsh, /NSIS/trunk/Include/WinVer.nsh, /NSIS/trunk/Include/WordFunc.nsh, /NSIS/trunk/Include/x64.nsh, /NSIS/trunk/INSTALL, /NSIS/trunk/nsisconf.nsh, /NSIS/trunk/Scripts/RegRestore.nsi, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/Tests/root.txt: fixed bug #1835866 - CR LF combinations 2007-12-01 10:59 kichik * /NSIS/trunk/Contrib/Makensisw/License.txt: test svn:eol-style=native 2007-12-01 10:58 kichik * /NSIS/trunk: some ignores 2007-11-30 09:54 kichik * /NSIS/trunk/Contrib/nsDialogs/rtl.c, /NSIS/trunk/Source/DialogTemplate.cpp: fixed bug #1841573 - RTL components & instfiles page WS_EX_LAYOUTRTL can be used for individual controls 2007-11-29 17:37 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html: fixed bug #1841120 - Incorrectly documented returncode SelectFolderDialog 2007-11-27 20:57 kichik * /NSIS/trunk/Contrib/nsDialogs/welcome.nsi: added missing Pop 2007-11-27 20:56 kichik * /NSIS/trunk/Contrib/nsDialogs/example.nsi: added missing Pops 2007-11-19 19:29 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nsh: updates by Dumperbg 2007-11-18 19:19 kichik * /NSIS/trunk/Source/script.cpp: implemented RFE #1686589 and fixed bug #1701051 - improve warning for backslash line end in comment 2007-11-17 14:29 kichik * /NSIS/tags/v233: Tagging for release 2.33 2007-11-17 14:28 kichik * /NSIS/trunk/Menu/images/header.gif: 2.33 2007-11-17 14:23 kichik * /NSIS/trunk/Docs/src/history.but: 2.33 2007-11-17 14:15 kichik * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed definition of MUI_LANGDLL_LANGUAGES_CP 2007-11-17 14:04 kichik * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh: allow MUI_LANGDLL_ALLLANGUAGES to be defined after MUI_LANGUAGE 2007-11-17 13:53 kichik * /NSIS/trunk/Contrib/VPatch/VPatchLib.nsh: fixed extraction 2007-11-14 20:12 kichik * /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/testimgs.ini, /NSIS/trunk/Contrib/InstallOptions/testlink.ini, /NSIS/trunk/Contrib/InstallOptions/testnotify.ini, /NSIS/trunk/Contrib/Math/mathtest.ini, /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Examples/FileFunc.ini, /NSIS/trunk/Examples/makensis.ini, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/TextFunc.ini, /NSIS/trunk/Examples/WordFunc.ini: use svn:eol-style 2007-11-14 20:10 kichik * /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/testimgs.ini, /NSIS/trunk/Contrib/InstallOptions/testlink.ini, /NSIS/trunk/Contrib/InstallOptions/testnotify.ini, /NSIS/trunk/Contrib/Math/mathtest.ini, /NSIS/trunk/Examples/FileFunc.ini, /NSIS/trunk/Examples/makensis.ini, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/TextFunc.ini, /NSIS/trunk/Examples/WordFunc.ini: LF -> CRLF 2007-11-14 20:06 kichik * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini: LF -> CRLF 2007-11-14 19:20 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: allow MUI_LANGDLL_ALLLANGUAGES to be defined after MUI_LANGUAGE 2007-11-14 06:20 pabs3 * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SConstruct: Add Debian patch for separate stripping options for Win32 & cross-platform options 2007-11-12 20:06 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh: updates by nirwad777 2007-11-10 16:51 kichik * /NSIS/trunk/Contrib/VPatch/VPatchLib.nsh: fixed bug #1829540 - VPatchFile macro does not handle spaces or absolute paths 2007-11-09 19:47 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: add OnClick for static controls 2007-11-09 18:42 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: WaitForSingleObject is simpler than looping on GetExitCodeProcess and allows the process to return STILL_ACTIVE 2007-11-09 18:29 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: probably exit nsExec's internal process with ExitProcess without this, if running nsExec immediately after booting, it'd always return 0 even if CreateProcess failed to execute more @ http://forums.winamp.com/showthread.php?threadid=279683 2007-11-09 16:44 kichik * /NSIS/trunk/Scripts/release.py: use new svn script for changelog update 2007-11-09 16:24 kichik * /NSIS/trunk/Scripts/release.py: fixed CreateChangeLog() 2007-11-09 16:04 kichik * /NSIS/tags/v232: Tagging for release 2.32 2007-11-09 15:57 kichik * /NSIS/trunk/Menu/images/header.gif: 2.32 2007-11-09 15:49 kichik * /NSIS/trunk/Docs/src/history.but: sort 2007-11-09 15:30 kichik * /NSIS/trunk/Source/exehead/fileform.c: declare real calc_percent()'s code just once 2007-11-09 15:22 kichik * /NSIS/trunk/Docs/src/history.but: 2.32 2007-10-27 10:27 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: use just link control 2007-10-27 10:24 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: handle link drawing hand cursor and enter key handling still missing - require subclassing (maybe just create a new link class and have nsDialogs.nsh use that?) 2007-10-27 10:09 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: added function prefixes where missing 2007-10-27 09:57 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: use NSD_GetText 2007-10-27 09:56 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: tabs to spaces 2007-10-27 09:54 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: link support 2007-10-26 19:31 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: fix 3-line title on welcome/finish page 2007-10-25 18:03 kichik * /NSIS/trunk/Menu/index.html: fixed bug #1819946 - NSIS Menu item "Modern UI Language Files" 2007-10-22 23:46 kichik * /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh: fixed bug #1817289 - MUI Language File "\r\n\r\n" 2007-10-21 01:46 pabs3 * /NSIS/trunk/Scripts/release.py, /NSIS/trunk/Scripts/svn2cl.xsl: Remove svn2cl.xsl from SVN and grab it from the Subversion SVN repository when it is not available. 2007-10-20 20:48 kichik * /NSIS/trunk/Scripts/svn2cl.xsl: restore original version 2007-10-20 20:48 kichik * /NSIS/trunk/Scripts/release.py: set strip-prefix from script 2007-10-14 23:02 kichik * /NSIS/trunk/Docs/src/ui.but: fixed bug #1811876 - broken ShowWindow link to MSDN 2007-10-14 21:25 kichik * /NSIS/trunk/SCons/Config/gnu: check compiler flag `-m32' before linker flag as some gcc versions crash when linking non 32-bit objects with this flag 2007-10-07 22:51 kichik * /NSIS/trunk/Scripts/release.py, /NSIS/trunk/Scripts/svn2cl.xsl: better ChangeLog with some MSXML fun (thanks orip!) 2007-10-06 09:05 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html: cvs is now svn 2007-10-06 09:05 kichik * /NSIS/trunk/Contrib/Makensisw/update.cpp: removed reference to cvs 2007-10-06 09:03 kichik * /NSIS/trunk/Docs/src/build.but: use viewvc link 2007-10-06 08:59 kichik * /NSIS/trunk/Docs/src/build.but: cvs is now svn 2007-10-05 18:42 kichik * /NSIS/trunk/Scripts/release.py: release from svn no svn2cl yet, just the normal svn log which seems good enough 2007-10-05 17:44 kichik * /NSIS/trunk/Scripts/RegRestore.nsi: useful after release.py 2007-10-05 09:01 kichik * /NSIS/trunk/Source/script.cpp: only accept two parameters to Var if the first one is /GLOBAL 2007-10-04 19:44 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: use macros from InstallOptions.nsh 2007-10-03 22:08 kichik * /NSIS/trunk/Contrib/UIs/default.rc, /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc, /NSIS/trunk/Source/exehead/resource.rc: verification dialog is now never used hidden, so it can show itself using WS_VISIBLE 2007-10-03 22:07 kichik * /NSIS/trunk/Source/exehead/fileform.c: fixed a bug that where __ensuredata processed window messages using MessageLoop. this could cause synchronization issues when data is decompressed in a page's leave function and the user clicks the next button twice really fast or on a slow computer. WM_COMMAND would be sent twice and so DialogProc could execute the leave function while the installation thread is running causing interpreter havoc. for more details: http://forums.winamp.com/showthread.php?s=&threadid=274333 as always, a few size optimizations were thrown in the loop and the fix actually makes the code smaller 2007-10-03 18:30 kichik * /NSIS/trunk/Docs/src/attributes.but: no more limits on Icon and UninstallIcon 2007-10-03 18:27 kichik * /NSIS/trunk/Source/icon.cpp: more error handling and endianity fixes 2007-10-03 18:25 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h: load default icon from the stub if the user didn't specify a different icon 2007-10-03 18:03 kichik * /NSIS/trunk/Source/icon.cpp: added newline at end of file 2007-10-03 17:52 kichik * /NSIS/trunk/Source/icon.cpp: fixed some obvious big-endian failures, but there might be more 2007-10-03 17:37 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/script.cpp: added support for mismatching installer and uninstaller icons 2007-10-03 17:04 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: fixed GetResourceOffsetA's return type 2007-10-03 17:01 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: added GetResourceOffsetA/W() 2007-10-03 13:31 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/icon.cpp, /NSIS/trunk/Source/icon.h, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: moved icon related functions to icon.cpp 2007-10-03 00:57 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: typo (thanks Anders) 2007-10-02 17:19 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh: updates by dumper 2007-10-02 17:08 kichik * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh: fixed MUI_UNGETLANGUAGE which didn't test the right variable and didn't declare it in the first place causing an error in case MUI_LANGDLL_DISPLAY isn't used 2007-09-29 20:15 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Components.nsh: pretty 2007-09-29 20:12 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Directory.nsh: fixed MUI_DIRECTORYPAGE_BGCOLOR 2007-09-29 20:12 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Components.nsh: fixed description and locking of tree view 2007-09-29 11:17 * /NSIS/tags/v231, /NSIS/tags/v231/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v231/Contrib/InstallOptions/resource.h, /NSIS/tags/v231/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v231'. 2007-09-29 11:17 kichik * /NSIS/trunk/Menu/images/header.gif: 2.31 2007-09-29 10:48 kichik * /NSIS/trunk/Docs/src/history.but: 2.31 2007-09-29 10:13 kichik * /NSIS/trunk/SCons/Config/gnu: fixed bug #1800834 - CVS FTBFS with new mingw32 2007-09-28 18:47 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: unload nsDialogs after it's done 2007-09-28 18:38 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: display reboot text 2007-09-28 18:35 kichik * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: - use BM_GETCHECK instead of BM_SETCHECK to get reboot now's state - compare check state as a number (rebooting should work now) 2007-09-28 18:30 kichik * /NSIS/trunk/Include/WinMessages.nsh: convert BST_* to numbers without prefix for easier comparison 2007-09-28 18:21 kichik * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh: fixed mui.LangDLL.RegistryLanguage variable warning when MUI_LANGDLL_REGISTRY_ROOT and friends weren't used 2007-09-28 18:17 kichik * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh: removed stray Goto 2007-09-28 18:09 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: tabs to spaces 2007-09-28 18:05 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: add Nsis2Io only when it's really needed to avoid unused function warnings 2007-09-28 17:39 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh: allow multiple inclusions 2007-09-28 17:38 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh: fixed bug #1786899 - MUI_PAGE_WELCOME error when use SimpChinese Lang 2007-09-27 10:41 kichik * /NSIS/trunk/Docs/src/credits.but: credits for romanian and persian 2007-09-27 10:39 kichik * /NSIS/trunk/Contrib/Language files/Farsi.nlf: applied patch #1776386 - Persian translation updated 2007-09-25 19:33 kichik * /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nsh: applied patch #1783853 - Improved Romanian translation 2007-09-21 18:20 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: size optimization - better values for status_update 2007-09-20 19:16 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh: fix NOSTRETCH option for header image 2007-09-20 19:09 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/InstallFiles.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh: fix control handles 2007-09-18 22:02 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: fixed plug-in system's SetDetailsPrint usage 2007-09-18 20:14 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: fixed bug #1796053 - makensisw command-line parsing error due to GlobalAlloc/GlobalFree mismatch 2007-09-14 17:14 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: BST_* moved to WinMessages.nsh 2007-09-11 20:23 joostverburg * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh: fix texts for uninstaller components page 2007-09-11 18:00 kichik * /NSIS/trunk/Include/WinMessages.nsh: added BST_* for bug #1792422 2007-09-09 15:55 joostverburg * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh: move finish button text to right category 2007-09-08 21:01 kichik * /NSIS/trunk/Source/script.cpp: missing null terminator 2007-09-08 17:28 kichik * /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Include/Library.nsh: use SetRegView lastused to avoid resetting the user's setting 2007-09-08 17:27 kichik * /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: added SetRegView lastused 2007-09-08 17:20 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/script.cpp: move SetDetailsPrint flag to g_exec_flag and added a lastused capability to EW_SETFLAG 2007-09-07 17:45 kichik * /NSIS/trunk/Contrib/Language files/Korean.nsh: fixed line breaks (thanks koder) 2007-09-07 16:09 kichik * /NSIS/trunk/Docs/src/callback.but: added un.onSelChange 2007-09-01 10:58 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh: don't declare variables for registry values if they won't be used 2007-08-27 17:21 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh: fixed language selection dialog 2007-08-27 17:15 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh: initialize header image 2007-08-25 16:53 kichik * /NSIS/trunk/Docs/src/history.but: oops... forgot release date 2007-08-25 14:01 * /NSIS/tags/v230, /NSIS/tags/v230/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v230/Contrib/InstallOptions/resource.h, /NSIS/tags/v230/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v230'. 2007-08-25 14:00 kichik * /NSIS/trunk/Menu/images/header.gif: 2.30 2007-08-25 13:49 kichik * /NSIS/trunk/Docs/src/history.but: 2.30 2007-08-25 13:13 kichik * /NSIS/trunk/Examples/makensis.nsi: - install MUI2 - install nsDialogs readme 2007-08-25 12:58 kichik * /NSIS/trunk/Contrib/Modern UI 2/SConscript: distribute missing images 2007-08-25 12:52 kichik * /NSIS/trunk/Contrib/nsDialogs/Readme.html, /NSIS/trunk/Contrib/nsDialogs/SConscript: added initial documentation 2007-08-25 12:29 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: push "error" if nsDialogs::CreateControl fails 2007-08-25 12:28 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: added ${NSD_GetText} 2007-08-25 11:44 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c: push "error" if nsDialogs::Create fails 2007-08-25 08:53 kichik * /NSIS/trunk/Contrib/System/System.html: add a link to search all System examples 2007-08-25 08:39 kichik * /NSIS/trunk/Include/WinMessages.nsh: fixed bug #1771644 - LB_ERR missing in WinMessages added CB_ERR too 2007-08-24 16:32 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: added LBS_NOTIFY for list boxes to enable notification 2007-08-22 21:57 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Readme.html, /NSIS/trunk/Contrib/Modern UI 2/SConscript, /NSIS/trunk/Include/MUI2.nsh, /NSIS/trunk/Include/SConscript, /NSIS/trunk/SConstruct: * Distribute MUI2 beta * Preliminary MUI2 documentation 2007-08-20 22:32 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nsh: style improvements and corrections by Ton 2007-08-18 17:15 kichik * /NSIS/trunk/Source/exehead/util.c: tabs to spaces and some other minor clean-ups 2007-08-18 12:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: move check whether the MUI_INTERFACE macro is already included to the macro itself 2007-08-18 12:44 joostverburg * /NSIS/trunk/Source/exehead/util.c: * Use shfolder.dll for CSIDL_COMMON_DOCUMENTS on 95/98 if possible * Information about API calls for special folders 2007-08-18 12:41 joostverburg * /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh: use a label and a link on the same location to be able to display a text and get click events 2007-08-17 18:43 kichik * /NSIS/trunk/Contrib/Modern UI/Changelog.txt: mention MUI_CUSTOMFUNCTION_MOUSEOVERSECTION in 1.8's log 2007-08-17 17:35 kichik * /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Language files/Valencian.nsh: no more headache 2007-08-17 16:51 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Catalan returns 2007-08-17 16:38 kichik * /NSIS/trunk/Contrib/nsDialogs/InstallOptions.nsi: use NSD_FUNCTION_INIFILE 2007-08-17 16:37 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi: CreateItem -> CreateControl 2007-08-17 16:20 kichik * /NSIS/trunk/Source/exehead/util.c: better solution - don't old functions and not shfolder but still try to get all user's version from the os (though tests show it will return current user's version anyway) 2007-08-17 16:16 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #1766268 - $SMPROGRAMS incorrect on Windows 98 use shfolder.dll only on ME and for all users's $APPDATA for which it was introduced 2007-08-14 01:11 pabs3 * /NSIS/trunk/SConstruct: Ignore some failing tests by default on platforms without msvc/mstoolkit 2007-08-11 23:21 joostverburg * /NSIS/trunk/Contrib/Modern UI 2, /NSIS/trunk/Contrib/Modern UI 2/Interface.nsh, /NSIS/trunk/Contrib/Modern UI 2/License.txt, /NSIS/trunk/Contrib/Modern UI 2/Localization.nsh, /NSIS/trunk/Contrib/Modern UI 2/MUI2.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages, /NSIS/trunk/Contrib/Modern UI 2/Pages.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Components.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Directory.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Finish.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/InstallFiles.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/License.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/StartMenu.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh, /NSIS/trunk/Contrib/Modern UI 2/Pages/Welcome.nsh: Modern UI 2.0 beta 2007-08-11 17:03 kichik * /NSIS/trunk/Source/exehead/exec.c: buf1, not buf (patch #1768584) 2007-08-09 23:54 joostverburg * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh: added missing $_CLICK for texts like "Click Next to continue." 2007-08-09 23:47 joostverburg * /NSIS/trunk/Contrib/Language files/Valencian.nsh: New language files for localization of user interfaces and plug-ins. These files currently contain translations of the MUI and will be shared between different MUI versions. 2007-08-09 18:30 joostverburg * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: fixed macro for INI files 2007-08-09 02:59 joostverburg * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: * Put functions for InstallOptions INI files in macros. The functions can be included in the installer or uninstaller by includng a macro. * Added button state flags 2007-08-09 02:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Contrib/Modern UI/System.nsh: Modern UI 1.8 * Uses the new language files * Updated documentation * Although MUI_DIRECTORYPAGE_BGCOLOR and MUI_STARTMENUPAGE_BGCOLOR are documented as interface setttings that apply to every directory page or Start Menu folder page, they were actually implemented as page specific settings. They have been changed to interface settings. * MUI_LANGDLL_DISPLAY now also reads a previously saved language from the registry if the installation is silent. * InstallOptions macros have been moved to a separate header file (InstallOptions.nsh). The MUI_INSTALLOPTIONS_* macros are still provided for backwards compatibility and insert the equalivent INSTALLOPTIONS_* macros. 2007-08-09 01:12 joostverburg * /NSIS/trunk/Contrib/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Language files/Albanian.nsh, /NSIS/trunk/Contrib/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Language files/Basque.nsh, /NSIS/trunk/Contrib/Language files/Belarusian.nsh, /NSIS/trunk/Contrib/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Language files/Breton.nsh, /NSIS/trunk/Contrib/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Language files/Czech.nsh, /NSIS/trunk/Contrib/Language files/Danish.nsh, /NSIS/trunk/Contrib/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Language files/English.nsh, /NSIS/trunk/Contrib/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Language files/French.nsh, /NSIS/trunk/Contrib/Language files/Galician.nsh, /NSIS/trunk/Contrib/Language files/German.nsh, /NSIS/trunk/Contrib/Language files/Greek.nsh, /NSIS/trunk/Contrib/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Language files/Icelandic.nsh, /NSIS/trunk/Contrib/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Language files/Irish.nsh, /NSIS/trunk/Contrib/Language files/Italian.nsh, /NSIS/trunk/Contrib/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Language files/Korean.nsh, /NSIS/trunk/Contrib/Language files/Kurdish.nsh, /NSIS/trunk/Contrib/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Language files/Malay.nsh, /NSIS/trunk/Contrib/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Language files/Polish.nsh, /NSIS/trunk/Contrib/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Language files/Russian.nsh, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Language files/Thai.nsh, /NSIS/trunk/Contrib/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Language files/Uzbek.nsh, /NSIS/trunk/Contrib/Language files/Valencian.nsh, /NSIS/trunk/Contrib/Language files/Welsh.nsh: New language files for localization of user interfaces and plug-ins. These files currently contain translations of the MUI and will be shared between different MUI versions. 2007-08-09 01:08 joostverburg * /NSIS/trunk/Include/LangFile.nsh, /NSIS/trunk/Include/SConscript: Header file to create langauge file that can be included with a single command. When LANGFILE_DEFAULT is set, missing strings will automatically be loaded from a default file. 2007-08-09 00:53 joostverburg * /NSIS/trunk/Contrib/InstallOptions/InstallOptions.nsh, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/SConscript: * New header file with macros and conversion functions for use with InstallOptions * Updated InstallOptions documentation 2007-08-09 00:19 joostverburg * /NSIS/trunk/Source/script.cpp: fixed escaped quotes in macro parameters 2007-07-31 17:32 kichik * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: updates by birk 2007-07-31 17:31 kichik * /NSIS/trunk/Docs/src/credits.but: credits for Slovak 2007-07-28 15:50 kichik * /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: applied patch #1762627 - Updated version of Slovak language files for NSIS 2007-07-27 16:46 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: applied patch #1762003 - Modern UI MUI_CUSTOMFUNCTION_MOUSEOVERSECTION 2007-07-27 00:55 pabs3 * /NSIS/trunk/Source/exehead/exec.c: Prevent FTBFS due to using log_printf3 instead of log_printf2 2007-07-24 19:06 kichik * /NSIS/trunk/Source/exehead/exec.c: a bit more logging 2007-07-23 18:59 kichik * /NSIS/trunk/Source/SConscript: fixed bug #1758873 - do not link to stdc++ when using aCC 2007-07-23 18:43 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/util.cpp: applied patch #1758863 - Patch for building on GCC and aCC 2007-07-23 05:08 kichik * /NSIS/trunk/Contrib/nsDialogs/rtl.c: fixed bug #1758653 - CVS build failure on Linux i386 - TVS_RTLREADING undeclared 2007-07-21 16:22 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: added ${NSD_OnBack} 2007-07-19 04:55 kichik * /NSIS/trunk/Contrib/nsDialogs/rtl.c, /NSIS/trunk/Contrib/nsDialogs/rtl.h: added rtl support 2007-07-18 21:21 kichik * /NSIS/trunk/Contrib/nsDialogs/InstallOptions.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: update state field 2007-07-18 20:47 kichik * /NSIS/trunk/Contrib/nsDialogs/defs.h, /NSIS/trunk/Contrib/nsDialogs/input.c, /NSIS/trunk/Contrib/nsDialogs/InstallOptions.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/SConscript: added rtl support 2007-07-18 19:26 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: real implementation for IsValidCodePage 2007-07-18 19:21 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: get rid of some #ifdef _WIN32 2007-07-18 19:21 kichik * /NSIS/trunk/Source/Platform.h: added HWND 2007-07-18 19:18 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: moved non-win32 CharNextExA implementation to util.cpp 2007-07-18 16:54 kichik * /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh: added ${NSD_OnClick}, ${NSD_OnChange} and ${NSD_OnNotify} 2007-07-17 16:45 kichik * /NSIS/trunk/Source/makenssi.cpp: fixed bug #1755148 - hpux build linkage specification in main 2007-07-16 18:28 kichik * /NSIS/trunk/Source/Tests/winchar.cpp: fixed bug #1753063 - CVS test failure on hppa 2007-07-14 19:21 kichik * /NSIS/trunk/Scripts/release.py: added Download page to TODO list, maybe that'd solve the cache problems 2007-07-14 11:32 * /NSIS/tags/v229, /NSIS/tags/v229/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v229/Contrib/InstallOptions/resource.h, /NSIS/tags/v229/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v229'. 2007-07-14 11:32 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Menu/images/header.gif: 2.29 2007-07-14 10:53 kichik * /NSIS/trunk/Source/exehead/exec.c: let GetStringFromParm call validate_filename 2007-07-14 10:29 kichik * /NSIS/trunk/Contrib/NSISdl/util.cpp: simplified myatoi64() 2007-07-14 09:40 kichik * /NSIS/trunk/Contrib/nsDialogs, /NSIS/trunk/Contrib/nsDialogs/browse.c, /NSIS/trunk/Contrib/nsDialogs/defs.h, /NSIS/trunk/Contrib/nsDialogs/dialog.rc, /NSIS/trunk/Contrib/nsDialogs/example.nsi, /NSIS/trunk/Contrib/nsDialogs/input.c, /NSIS/trunk/Contrib/nsDialogs/input.h, /NSIS/trunk/Contrib/nsDialogs/InstallOptions.nsi, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.c, /NSIS/trunk/Contrib/nsDialogs/nsDialogs.nsh, /NSIS/trunk/Contrib/nsDialogs/nsis.c, /NSIS/trunk/Contrib/nsDialogs/nsis.h, /NSIS/trunk/Contrib/nsDialogs/SConscript, /NSIS/trunk/Contrib/nsDialogs/welcome.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SConstruct: nsDialogs: the next InstallOptions 2007-07-12 19:15 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: load shfolder.dll before the script is executed to avoid any usage effects 2007-07-12 16:35 kichik * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/Platform.h: fixed bug #1752328 - PFNSHGETFOLDERPATHA is stub only and very Windows, move from Platform.h to util.c 2007-07-10 21:57 joostverburg * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/Platform.h: moved definition to Platform.h and removed useless function calls 2007-07-10 21:33 joostverburg * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: When available, use shfolder.dll to get special folder locations. This allows folders like the application data folder for all users to be used on Windows 95/98 when Internet Explorer 5 is installed. 2007-07-07 09:30 kichik * /NSIS/trunk/Source/Tests/mmap.cpp: test content as well 2007-07-06 10:21 kichik * /NSIS/trunk/Source/exehead/exec.c: and if IPeristFile::Save isn't called, fail 2007-07-06 10:11 kichik * /NSIS/trunk/Source/exehead/exec.c: don't call IPeristFile::Save if MultiByteToWideChar fails 2007-07-06 09:55 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: size optimization - use GetStringFromParm instead of wsprintf 2007-07-06 09:31 kichik * /NSIS/trunk/Source/exehead/exec.c: the more common case for SendMessage is ints, so get that first 2007-07-06 09:20 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: way simpler REG_MULTI_SZ reader with pointers 2007-07-05 17:43 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: size optimization - use GetNSISString and GetStringFromParm instead of mystrcat 2007-07-05 15:59 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/SpanishInternational.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SpanishInternational.nsh, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: International Spanish and a few Spanish fixes by niwrad 2007-07-04 17:52 kichik * /NSIS/trunk/Docs/src/compilerflags.but: better explain what compiler flags mean and how flow control instructions should be used around them 2007-06-28 19:06 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Catalan isn't distributed with the installer anymore 2007-06-27 18:54 kichik * /NSIS/trunk/Source/exehead/Ui.c: some more information on the EN_MSGFILTER hack 2007-06-27 17:02 joostverburg * /NSIS/trunk/Docs/src/tutorial.but: corrected LogicLib example 2007-06-27 14:16 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/Source/makenssi.cpp: changed __ALLOW_UNALIGNED_DATA_ACCESS__ to NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS 2007-06-27 14:15 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/hpc++, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp: applied patch #1714416 - patch to build on hpux 2007-06-27 13:03 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.cpp: cl still complained about about not all control paths returning a value 2007-06-27 11:32 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.cpp: mingw doesn't like __int64 left alone (probably #define'd instead typedef'ed) 2007-06-27 11:27 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.cpp: nothing was returned for cl=0 2007-06-27 11:19 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: missing division to show kb 2007-06-27 11:14 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/httpget.h: fixed bug #1744091 - NSISdl shows negative values with buggy apache 2007-06-27 11:09 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.h, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Contrib/NSISdl/SConscript, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/NSISdl/util.h: applied patch #1723131 - NSISdl doesn't handle files over 2GB and patch #1656076 - make NSISdl more "translator-friendly" 2007-06-27 11:00 kichik * /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: there should be a space in the remaining translation string 2007-06-26 19:00 kichik * /NSIS/trunk/Contrib/Banner/Banner.c: fixed bug #1743801 - Banner can hang when called form custom page 2007-06-26 18:08 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: fixed bug #1741061 - use SetErrorMode to disable error messages for the entire installer and not for specific points as it always knows best what messages to display 2007-06-26 17:37 kichik * /NSIS/trunk/Include/FileFunc.nsh: applied patch #1742562 to fix bug #1742255 - GetFileVersion shows incorrect version for .NET Framework 2 2007-06-26 17:27 kichik * /NSIS/trunk/Include/Sections.nsh: fixed bug #1742793 - ReverseSection macro in Sections.nsh doesn't work 2007-06-13 18:55 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: use A functions intead of T 2007-06-10 16:45 pabs3 * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/stdafx.h: Stop some compiler warnings due to lack of trailing newlines. 2007-06-08 18:16 * /NSIS/tags/v228, /NSIS/tags/v228/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v228/Contrib/InstallOptions/resource.h, /NSIS/tags/v228/Contrib/NSISdl/httpget.h, /NSIS/tags/v228/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v228'. 2007-06-08 18:16 kichik * /NSIS/trunk/Menu/images/header.gif: 2.28 2007-06-08 18:07 kichik * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: bump to 1.78 2007-06-08 18:07 kichik * /NSIS/trunk/Docs/src/history.but: 2.28 2007-06-08 17:55 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript: don't install Valencian and Catalan see patch #1558822 for details and http://forums.winamp.com/showthread.php?s=&threadid=270401&highlight=Valencian 2007-06-08 17:15 kichik * /NSIS/trunk/Source/exehead/Ui.c: another focused invisible control problem when hitting the Show Details button that also hides that button 2007-06-08 17:11 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1733692 - Hitting any key in the instfiles page freezes under W2K 2007-06-05 18:37 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: renamed MUI_LANGDLL_SHOW_ALL_LANGUAGES to MUI_LANGDLL_ALLLANGUAGES to match the style of other defines 2007-06-05 18:36 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: applied patch #1724876 - Language selection dialog doesn't display all languages 2007-06-05 18:34 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: documentation for patch #1724876 2007-05-25 11:54 kichik * /NSIS/trunk/Contrib/System/SConscript: objs are unused for a long time 2007-05-25 11:52 kichik * /NSIS/trunk/Contrib/System/Source/chkstk.obj, /NSIS/trunk/Contrib/System/Source/System.sln, /NSIS/trunk/Contrib/System/Source/System.vcproj, /NSIS/trunk/Contrib/System/Source/vc7ldvrm.obj, /NSIS/trunk/Contrib/System/Source/vc7lmul.obj, /NSIS/trunk/Contrib/System/Source/vc7lshl.obj, /NSIS/trunk/Contrib/System/Source/vc7lshr.obj: unused 2007-05-23 23:32 kichik * /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat: check for setup.h 2007-05-23 15:59 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: fixed bug #1713562 - NSISdl doesn't finish download after content-length bytes 2007-05-23 15:15 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: applied patch #1706187 - MUI_STARTMENUPAGE_BGCOLOR and MUI_DIRECTORYPAGE_BGCOLOR 2007-05-23 14:52 kichik * /NSIS/trunk/Docs/src/build.but: LibraryLocal must be compiled for POSIX now 2007-05-23 14:14 kichik * /NSIS/trunk/Source/build.cpp: applied patch #1722147 - equalized compiler errors 2007-05-21 09:23 pabs3 * /NSIS/trunk/SConstruct: allow ignoring tests with IGNORETESTS 2007-05-14 23:50 pabs3 * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/usefulinfos.but: applied patch #1711089 - disable System::Call and System::Get when building with GCC 2007-05-13 18:57 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: fixed bug #1716614 - InstallOptions TxtColor 2007-05-05 20:22 kichik * /NSIS/trunk/Docs/src/build.but: added missing new-line 2007-05-05 20:20 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: fixed bug #1713560 - NSISdl 100% CPU usage during DNS resolution 2007-05-05 13:05 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL: building NSIS Menu 2007-05-05 11:07 * /NSIS/tags/v227, /NSIS/tags/v227/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v227/Contrib/InstallOptions/resource.h, /NSIS/tags/v227/Contrib/NSISdl/httpget.h, /NSIS/tags/v227/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v227'. 2007-05-05 11:07 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Menu/images/header.gif: 2.27 2007-05-05 10:56 kichik * /NSIS/trunk/SConstruct: missing "of" in description 2007-05-01 20:53 kichik * /NSIS/trunk/Source/build.cpp: make $PROGRAMFILES and $COMMONFILES available in the uninstaller as well 2007-04-30 18:02 kichik * /NSIS/trunk/SConstruct: added TOOLSET 2007-04-30 17:18 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: disable the X button for InstallOptions pages as well when CancelEnabled is used 2007-04-29 21:02 kichik * /NSIS/trunk/Source/tokens.cpp: fixed bug #1709460 - Command line help for MessageBox is incomplete 2007-04-27 18:48 * /NSIS/tags/v226, /NSIS/tags/v226/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v226/Contrib/InstallOptions/resource.h, /NSIS/tags/v226/Contrib/NSISdl/httpget.h, /NSIS/tags/v226/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v226'. 2007-04-27 18:48 kichik * /NSIS/trunk/Docs/src/history.but: oops 2007-04-27 18:45 kichik * /NSIS/trunk/Menu/images/header.gif: 2.26 2007-04-27 18:40 kichik * /NSIS/trunk/Source/Tests/SConscript: util.cpp requires version.lib 2007-04-27 18:36 kichik * /NSIS/trunk/Docs/src/history.but: 2.26 2007-04-27 16:57 kichik * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: version bump 2007-04-27 15:56 kichik * /NSIS/trunk/Include/Library.nsh: better wording 2007-04-27 15:15 kichik * /NSIS/trunk/Include/LogicLib.nsh: using __LINE__ for special labels can result in duplicate labels across files (two includes in the same function) 2007-04-27 15:14 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: font should come after the empty string that marks the end of the language list, no need to decrease lang_num 2007-04-26 20:49 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp: removed code duplication for installer/uninstaller in GenerateLangTables 2007-04-26 20:26 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: size optimization 2007-04-26 20:04 kichik * /NSIS/trunk/SConstruct: allow skipping tests with SKIPTESTS 2007-04-26 19:02 kichik * /NSIS/trunk/Scripts/release.py: don't use --show-tag, show entire history 2007-04-26 18:24 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceVersionInfo.h: fixed bug #1707823 - VS_FIXEDFILEINFO undefind in util.cpp 2007-04-25 19:26 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: added comma 2007-04-25 19:20 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: use current codepage to convert font name to unicode 2007-04-24 19:14 kichik * /NSIS/trunk/Source/exehead/Main.c: remove temp uninstaller directory only once 2007-04-24 19:09 kichik * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: added $EXEFILE 2007-04-24 16:16 kichik * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c: restore fs redirection only if it was set in the first place 2007-04-24 14:24 kichik * /NSIS/trunk/Source/util.cpp: applied patch #1706624 - GetDLLVersionLocal VXD support on NT 2007-04-24 14:11 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/Source/script.cpp: use GetDLLVersion 2007-04-24 14:06 kichik * /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: added GetDLLVersion 2007-04-24 11:20 kichik * /NSIS/trunk/Contrib/Language files/Valencian.nlf: added codepage 2007-04-21 09:37 kichik * /NSIS/trunk/Source/script.cpp: fixed plug-in calls 2007-04-21 09:02 kichik * /NSIS/trunk/Source/script.cpp: plug-in runs on windows, path is with backslashes 2007-04-20 23:46 kichik * /NSIS/trunk/Source/script.cpp: use GetFullPathName instead of manually adding the working directory 2007-04-20 23:40 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: size optimization 2007-04-20 20:50 kichik * /NSIS/trunk/Source/exehead/exec.c: sections always end with EW_RET which will cause ExecuteCodeSegment to return before MulDiv is called with progress_bar_len=0 and even if it is 0, MulDiv will just return -1 2007-04-20 20:32 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: size optimization 2007-04-20 11:35 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/SConstruct: build #Source files into LibraryLocal's build dir instead of into #Source 2007-04-19 21:47 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c: validate $EXEPATH as well 2007-04-19 21:38 kichik * /NSIS/trunk/Source/exehead/Main.c: better uninstaller recursion test using the new state_exe_path 2007-04-19 21:38 kichik * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/state.h: added $EXEPATH 2007-04-19 21:20 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: size optimization - SetOutPath already sets the working directory so there's no need to pass $OUTDIR to myCreateProcess 2007-04-19 20:40 kichik * /NSIS/trunk/Source/build.cpp: don't pre-process "ProgramFilesDir" and "CommonFilesDir" as they are not processed in GetNSISString 2007-04-19 20:02 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c: use $PROGRAMFILES for the root of the default $COMMONFILES instead of hard-coding "C:\Program Files" 2007-04-19 18:24 kichik * /NSIS/trunk/Include/Library.nsh: don't fail when filename starts with a number 2007-04-18 18:19 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: allocate g_sdata.script_cmd_args as GMEM_MOVEABLE 2007-04-17 20:49 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: free riched32.dll outside of the wndproc 2007-04-17 20:41 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: - properly allocate size in AddScriptCmdArgs - do clean-up in WM_DESTROY, not only WM_CLOSE 2007-04-17 20:05 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/zip2exe/main.cpp: some more warnings of bug #1676243 2007-04-17 19:12 kichik * /NSIS/trunk/Source/exehead/Ui.c: don't start showing pages if quit was called in the show function 2007-04-17 18:30 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: fixed bug #1701879 - linux LibraryLocal FTBFS 2007-04-16 22:14 kichik * /NSIS/trunk/Source/Platform.h: CResourceEditor was broken on big endian platforms since 2.24 because IMAGE_NT_OPTIONAL_HDR32_MAGIC had improper definition 2007-04-16 22:12 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: tabs to spaces 2007-04-16 21:17 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: more details for RFE #971467 2007-04-16 21:03 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: removed double initialization 2007-04-16 21:00 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: fully intialize g_sdata and delete g_sdata.script_cmd_args 2007-04-16 20:28 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: spaces to tabs 2007-04-16 20:15 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Source/Platform.h: fixed bug #1701290 - linux FTBFS: stubs and librarylocal 2007-04-16 07:34 pabs3 * /NSIS/trunk/Contrib/UserInfo/UserInfo.c: Fix warning about uninitialised variable 2007-04-15 21:34 kichik * /NSIS/trunk/Include/Library.nsh: use LibraryLocal on POSIX as well 2007-04-15 21:29 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: build as cross platform 2007-04-15 21:27 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript: added support for POSIX platforms 2007-04-15 21:12 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: return "no languages available" when combo box is empty of any reason, like no language with matching codepage 2007-04-15 21:07 kichik * /NSIS/trunk/Contrib/Language files/Afrikaans.nlf, /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Basque.nlf, /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Estonian.nlf, /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Language files/Irish.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Latvian.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Luxembourgish.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Language files/Uzbek.nlf: added codepage 2007-04-15 20:39 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #1701050 - Senseless variable warning better warning - variable never set 2007-04-14 23:03 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Source/script.cpp: implemented RFE #1564986 - block unsupported language 2007-04-14 22:30 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h: implemented RFE #1235616 - Variable to get language *name* added $(^Language) 2007-04-14 17:04 kichik * /NSIS/trunk/Docs/src/library.but: nicer options 2007-04-14 16:58 kichik * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Include/Library.nsh: added x64 support for library macros 2007-04-14 16:05 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: don't pass ".dll" to myGetProcAddress as GetModuleHandle and LoadLibrary add that automatically 2007-04-14 15:05 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: tabs to spaces 2007-04-14 14:12 kichik * /NSIS/trunk/Source/exehead/exec.c: RegDeleteKeyExA typedef missing return value 2007-04-14 13:59 kichik * /NSIS/trunk/Docs/src/var.but: some formatting 2007-04-14 13:54 kichik * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: added $PROGRAMFILES32, $PROGRAMFILES64, $COMMONFILES32 and $COMMONFILES64 2007-04-14 12:55 kichik * /NSIS/trunk/Source/exehead/exec.c: don't try deleting from the 32-bit view when RegDeleteKeyExA isn't found but g_exec_flags.alter_reg_view is set 2007-04-14 12:50 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: added SetRegView to allows access to the x64 registry view this method was chosen over a new switch for all regsitry commands to allow easy transition of existing scripts 2007-04-13 20:30 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: implemented RFE #1143843 - Ability to change default reboot behavior added MUI_FINISHPAGE_REBOOTLATER_DEFAULT 2007-04-13 20:10 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed bug #1267491 - MUI finish page has unnecessary cancel button 2007-04-13 19:59 kichik * /NSIS/trunk/Source/exehead/Ui.c: instead of forwarding the X button to the Next button when the Cancel button is disabled on the last page, simply disable the X button when the Cancel button is disabled (part of bug #1267491) 2007-04-13 10:29 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/SConscript: more of bug #1676243 - compiler warnings on Linux 2007-04-13 09:54 kichik * /NSIS/trunk/Source/util.cpp: fixed bug #1699609 - linux CVS FTBFS 2007-04-12 21:56 kichik * /NSIS/trunk/Contrib/Language files/Afrikaans.nlf, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/Language files/Afrikaans.nsh, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: applied patch #1699558 - Afrikaans translation 2007-04-12 20:24 kichik * /NSIS/trunk/Source/exehead/exec.c: fixed bug #774966 - CopyFiles return value not working on NT4 Sp6 2007-04-12 19:24 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1699474 - file /a does not preserve folder attributes 2007-04-12 17:44 kichik * /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Include/Library.nsh: applied patch #1699435 - LIBRARY_IGNORE_VERSION 2007-04-11 21:46 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: signed/unsigned mismatch warning 2007-04-11 21:42 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp: fixed some warnings 2007-04-11 21:37 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: replaced WCStrLen with winchar_strlen 2007-04-11 21:33 kichik * /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: winchar_strlen and winchar_strdup can use const WCHAR 2007-04-11 21:32 kichik * /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/util.cpp: replaced WCStrLen with winchar_strlen 2007-04-11 21:27 kichik * /NSIS/trunk/Source/lang.cpp: fixed some warnings 2007-04-11 21:15 kichik * /NSIS/trunk/Source/build.cpp: cast warning 2007-04-11 21:00 kichik * /NSIS/trunk/Contrib/Library/RegTool/RegTool.c: cast warning 2007-04-11 20:58 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: signed/unsigned mismatch warning 2007-04-11 20:54 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/SConscript: added -Wno-non-virtual-dtor for 7zip files on gnu configuration for bug #1676243 2007-04-11 20:49 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c: avoid cast warning 2007-04-11 20:36 kichik * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp: fix signed/unsigned comparison warnings 2007-04-11 20:03 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: allow only one script in the command line and don't process any arguments after it 2007-04-10 21:07 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: more clean-up: * removed ResetInputScript() * don't edit g_sdata.script for CreateProcess * use SetScript in LoadMRUFile * proper and clear allocation of g_sdata.compile_command in CompileNSISScript() 2007-04-10 20:41 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: properly initialize script_cmd_args for each SetScript 2007-04-10 20:34 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: g_sdata.script is expected not to be NULL 2007-04-10 20:31 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: fixed bug #1696534 - Broken Parameter Handling for Makensisw.exe v.2.3 the entire command line processing and handling of g_sdata.script is overly complex and apparently a bit malfunctioning... for example, g_sdata.script, while expected to contain just the file name, contains every command line argument passed to makensisw and also quotes 2007-04-10 19:48 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: added COMPRESSOR_NONE_SELECTED instead of (NCOMPRESSOR)-1 2007-04-09 19:44 kichik * /NSIS/trunk/Source/exehead/Ui.c: no more need for char* cast 2007-04-09 18:01 kichik * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: use const char for myGetProcAddress 2007-04-09 15:40 kichik * /NSIS/trunk/SConstruct: added a warning to sconf.h, defines.h and version.h about automatic generation 2007-04-09 10:52 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html: applied patch #1683189 - [InstallOptions] new control type: "line" added VLine and HLine 2007-04-09 10:03 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: applied patch #1696610 - Reduce flicker when using MUI_HEADER_TRANSPARENT_TEXT 2007-04-04 08:15 pabs3 * /NSIS/trunk/Source/Platform.h: Fix FTBFS on Linux due to missing definition of MB_USERICON 2007-04-03 11:19 kichik * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: applied patch #1682748 - installer icon for message box 2007-04-03 10:57 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: applied patch #1683186 - [InstallOptions] support for linebreaks in link control 2007-04-03 10:47 kichik * /NSIS/trunk/Include/Library.nsh: fixed bug #1692761 - Library.nsh warning when not using macro UnInstallLib 2007-04-03 10:02 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi: applied patch #1687456 - [UserInfo plugin] Fix for #1684777, GetAccountType and Vista 2007-04-02 10:54 kichik * /NSIS/trunk/Docs/src/bin/halibut/input.c: it's c, not c++ 2007-04-02 10:29 pabs3 * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/Platform.h: Kill some more compiler warnings under Linux and mingw32 2007-04-01 21:27 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: applied patch #1676101 - Suggested corrections to MUI French prompts 2007-04-01 18:00 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript: detect wx-config before trying to run it (part of bug #1672315) 2007-04-01 17:38 kichik * /NSIS/trunk/Source/Tests/compression.cpp, /NSIS/trunk/Source/Tests/mmap.cpp: signed/unsigned comparison 2007-03-31 16:11 kichik * /NSIS/trunk/Scripts/release.py: avoid ".." in ChangeLog 2007-03-31 14:47 * /NSIS/tags/v225, /NSIS/tags/v225/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v225/Contrib/InstallOptions/resource.h, /NSIS/tags/v225/Contrib/NSISdl/httpget.h, /NSIS/tags/v225/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v225'. 2007-03-31 14:47 kichik * /NSIS/trunk/Scripts/release.py: log the correct directory 2007-03-31 13:51 kichik * /NSIS/trunk/Examples/makensis.nsi: Examples\Plugin, not Contrib\ExDLL or Contrib\Plugin 2007-03-31 13:48 kichik * /NSIS/trunk/Examples/makensis.nsi: added missing example files 2007-03-31 13:42 kichik * /NSIS/trunk/Menu/images/header.gif: 2.25 2007-03-31 13:36 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: don't delete if it wasn't allocated 2007-03-31 12:38 kichik * /NSIS/trunk/Docs/src/history.but: 2.25 2007-03-31 11:47 kichik * /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript: version bump 2007-03-31 11:29 kichik * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: version bump 2007-03-31 11:24 pabs3 * /NSIS/trunk/Contrib/VPatch/newfile.txt, /NSIS/trunk/Contrib/VPatch/oldfile.txt: Convert LF linefeeds to CRLF 2007-03-31 10:47 kichik * /NSIS/trunk/Scripts/release.py: use compression for cvs 2007-03-31 09:21 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: fixed access violation in case m_vItems[i]->szClass is an int resource 2007-03-30 21:49 kichik * /NSIS/trunk/Docs/src/library.but: unshared dll example 2007-03-30 19:44 kichik * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/Math/Source/Math.c: use default crt entry point 2007-03-30 19:40 kichik * /NSIS/trunk/Contrib/Math/Source/MyMath.c: formatting without _floatp10 2007-03-30 16:30 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Examples/makensis.nsi: distribute nsis.exe.manifest for the nsis menu as it's dynamically linked 2007-03-27 19:14 kichik * /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat: cd /D so WXWIN on other drives will work 2007-03-24 13:55 kichik * /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/trunk/Contrib/zip2exe/main.cpp: applied patch #1680556 - fixes to allow zip2exe & Makensisw to build in winelib 2007-03-20 22:28 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: don't enter message loop when window failed creation (because of input error or anything else) 2007-03-20 21:44 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: fixed bug #1684751 - StartMenu accepts empty paths 2007-03-20 21:42 kichik * /NSIS/trunk/Contrib/StartMenu/Example.nsi: better error handling 2007-03-20 21:33 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/SConscript, /NSIS/trunk/Contrib/StartMenu/SConscript, /NSIS/trunk/Contrib/StartMenu/StartMenu.c: size optimization it's official. even msdn now says SHGetMalloc returns the same allocator CoTaskMemFree uses and a little debugging backs this even on Windows 95 2007-03-20 19:38 kichik * /NSIS/trunk/Include/LogicLib.nsh: not using System.dll for case-sensitive comparison anymore 2007-03-18 20:03 kichik * /NSIS/trunk/Scripts/release.py: work around perl's weirdness with executing cvs.exe after changing STDOUT for cvs2cl.pl 2007-03-18 19:23 kichik * /NSIS/trunk/Scripts/release.py: couple of fixes to make cvs2cl.pl run (but not work yet( 2007-03-18 18:34 kichik * /NSIS/trunk/SCons/Config/gnu: more of bug #1635841 - gcc strict-aliasing and build system 2007-03-18 18:33 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi: more of patch #1644712 - new compiler predefines 2007-03-15 02:49 pabs3 * /NSIS/trunk/Scripts/release.py: applied patch #1680508 - generate a ChangeLog at release time 2007-03-15 00:43 pabs3 * /NSIS/trunk/Contrib/ExDLL/SConscript: fixed bug #1680944: Woooops, add the SConscript for ExDLL 2007-03-12 10:07 pabs3 * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/INSTALL, /NSIS/trunk/SConstruct: Install the example plugin and C header by default 2007-03-11 16:49 pabs3 * /NSIS/trunk/Source/lang.cpp: Missed a warning 2007-03-11 15:58 pabs3 * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/version.cpp, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/Math/Source/MyMath.h, /NSIS/trunk/Contrib/Math/Source/plugin.c, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/Plugin/checksum.h, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Source/Tests/endian.cpp, /NSIS/trunk/Source/Tests/textrunner.cpp: Kill some compiler warnings under Linux and mingw32 2007-03-10 17:49 kichik * /NSIS/trunk/Include/Memento.nsh: don't Return from macro, use Goto 2007-03-10 17:49 kichik * /NSIS/trunk/Examples/Memento.nsi: use HKCU 2007-03-10 16:24 kichik * /NSIS/trunk/Include/Memento.nsh: typo 2007-03-10 14:41 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Memento.nsi, /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Include/Memento.nsh, /NSIS/trunk/Include/SConscript: remember previously selected sections 2007-03-10 14:16 kichik * /NSIS/trunk/Source/tokens.cpp: it's /o not /0 2007-03-10 12:55 kichik * /NSIS/trunk/Include/LogicLib.nsh: LOGICLIB_SECTIONCMP is no longer required 2007-03-09 18:50 kichik * /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat: cd to the right directory 2007-03-09 18:13 kichik * /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat: removed /Q from rd - ask to be sure 2007-03-09 18:11 kichik * /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat: applied patch #1677482 - wxbuild.bat for paths with spaces 2007-03-09 15:56 kichik * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp: fixed bug #1667976 - new nsis menu is larger 2007-03-08 01:47 pabs3 * /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/trunk/Contrib/NSIS Menu/SConscript: partially fixed bug #1672315: NSIS Menu not portable to Linux wxGTK 2007-03-07 18:55 kichik * /NSIS/trunk/Docs/src/headers.but: typo 2007-03-07 09:26 pabs3 * /NSIS/trunk/Source/exehead/exec.c: FTBFS due to using the wrong log_printf function 2007-03-06 21:22 kichik * /NSIS/trunk/Source/exehead/exec.c: report error in log for WriteReg* when RegSetValueEx itself fails and not only RegCreateKeyEx 2007-03-06 21:14 kichik * /NSIS/trunk/SCons/Config/ms: listing file is fun 2007-03-06 20:35 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: size optimization it's official. even msdn now says SHGetMalloc returns the same allocator CoTaskMemFree uses and a little debugging backs this even on Windows 95 2007-03-04 19:53 kichik * /NSIS/trunk/Source/exehead/fileform.c: size optimization - GlobalFree isn't called in any other case, no need here as well 2007-03-04 18:49 kichik * /NSIS/trunk/Docs/src/build.but: fixed cross-reference 2007-03-04 17:00 kichik * /NSIS/trunk/Docs/src/history.but: it's MSTOOLKIT not MSVCTOOLKIT 2007-03-03 15:19 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL: missing comma 2007-03-03 14:23 kichik * /NSIS/trunk/Source/exehead/Main.c: oops... comment line continuation 2007-03-03 14:19 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization - use don't add "Locale" twice to data section 2007-03-03 14:18 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/fileform.cpp: size optimization - use GetNSISString to do complicated stirng processing 2007-03-03 14:18 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: size optimization - no need for both GetEnvironmentVariable and ExpandEnvironmentStrings 2007-03-03 13:21 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL: more on building and installing without cross-compiler on posix 2007-03-03 13:05 kichik * /NSIS/trunk/Docs/src/intro.but: match language number on site 2007-03-03 12:49 kichik * /NSIS/trunk/Source/exehead/Main.c: fixed uninstallers processing of /D= realcmds might point exactly to cmdline, so zeroing cmdline-2 may not affect it instead, zero cmdline-2, cmdline-1, cmdline and cmdline+1 (entire " /D=") 2007-03-03 10:31 kichik * /NSIS/trunk/Docs/src/langs.but: default UI language 2007-03-02 20:33 kichik * /NSIS/trunk/SConstruct: actually working LIBPATH and CPPPATH options (renamed to APPEND_*) 2007-03-02 11:36 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/SConstruct: append nsis menu include/lib paths in the sconscript 2007-03-02 11:17 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms: added MSVCRT_FLAG 2007-03-02 09:49 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: allocate memory for "--" as well 2007-03-02 04:35 pabs3 * /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Platform.h: fixed bug #1661503: inconsistency between Win32/Linux makensis command line options 2007-03-01 21:05 kichik * /NSIS/trunk/Contrib/StartMenu/SConscript, /NSIS/trunk/SConstruct: fixed bug #1670741 - NSIS Menu can't be built on linux due to .rc & .cpp -> .o added automatic code that changes the target name of resource files to something slightly unique 2007-02-27 21:04 kichik * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: implemented RFE #1669513 - bitwise operators for !define /math 2007-02-24 18:57 kichik * /NSIS/trunk/Contrib/NSIS Menu/include, /NSIS/trunk/Contrib/NSIS Menu/Info.txt, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.sln, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.vcproj, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nslinks.cpp, /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Contrib/NSIS Menu/src, /NSIS/trunk/Contrib/NSIS Menu/wx, /NSIS/trunk/Contrib/NSIS Menu/wx/build.txt, /NSIS/trunk/Contrib/NSIS Menu/wx/setup.h, /NSIS/trunk/Contrib/NSIS Menu/wx/wxbuild.bat, /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html, /NSIS/trunk/SConstruct: build NSIS Menu from source (requires wxWidgets) 2007-02-24 18:23 kichik * /NSIS/trunk/SCons/Config/ms: applied patch #1667950 - Silence spurious warnings when compiling with VC8 2007-02-24 12:16 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Source/Tests/decompress.cpp: fixed bug #1667637 - build, test failures in nsis CVS on Debian GNU/Linux 2007-02-24 11:35 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c: fixed vc7 build errors 2007-02-23 17:01 kichik * /NSIS/trunk/Contrib/Makensisw/SConscript: it's WIN32_LEAN_AND_MEAN, not WIN32_MEAN_AND_LEAN and it makes build fail anyway 2007-02-23 15:10 kichik * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/Math.sln, /NSIS/trunk/Contrib/Math/Source/Math.vcproj, /NSIS/trunk/Contrib/Math/Source/mathcrt.h, /NSIS/trunk/Contrib/Math/Source/mathcrt.lib, /NSIS/trunk/Contrib/Math/Source/mathcrtmt.lib, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/Math/Source/MyMath.h: removed vauge mathcrt.lib 2007-02-23 12:45 kichik * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: fixed bug #1664957 - Vista Start Menu 2007-02-23 12:42 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: implemeneted RFE #1666501 - MakeNSISw: esc -> close 2007-02-23 12:34 kichik * /NSIS/trunk/Source/Tests/decompress.cpp: fixed bug #1666873 - LZMA test segfault on Debian GNU/Linux 2007-02-23 06:20 ballison * /NSIS/branches/UNICODE/Source/exehead/exec.c, /NSIS/branches/UNICODE/Source/exehead/fileform.c, /NSIS/branches/UNICODE/Source/exehead/fileform.h, /NSIS/branches/UNICODE/Source/exehead/lang.h, /NSIS/branches/UNICODE/Source/exehead/Main.c, /NSIS/branches/UNICODE/Source/exehead/state.h, /NSIS/branches/UNICODE/Source/exehead/Ui.c, /NSIS/branches/UNICODE/Source/exehead/ui.h, /NSIS/branches/UNICODE/Source/exehead/util.c, /NSIS/branches/UNICODE/Source/exehead/util.h: * TCHAR implementation. A few TODO's (grep for ) * a few fixups to get ready for 64bit compilation (lots to do still) * don't even think about using this yet. Still have to fixup makensis! * TODO: find bugs where it was assumed that sizeof(somestr) == strlen(somestr), especially with registry functions 2007-02-23 05:02 ballison * /NSIS/branches/UNICODE/Source/exehead/fileform.h, /NSIS/branches/UNICODE/Source/exehead/util.c, /NSIS/branches/UNICODE/Source/exehead/util.h, /NSIS/branches/UNICODE/Source/Platform.h: 64bit fixups 2007-02-20 21:42 kichik * /NSIS/trunk/Include/Sections.nsh: fixed bug #1664648 - Sections.nsh doesn't like $0 2007-02-20 21:34 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1664428 - LicenseForceSelection validation check can be easily skipped rollback 1.269 as lParam can be NULL, as in this case 2007-02-20 20:34 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Galician.nsh: fixed bug #1663795 - Galician language is broken in MUI installers 2007-02-20 20:21 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added Galician for the compliation tests 2007-02-17 17:36 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/tutorial.but: applied patch #1662419 - Documentation typo fixes 2007-02-17 16:34 kichik * /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: copyright notice 2007-02-17 15:58 kichik * /NSIS/trunk/Source/exehead/Main.c: applied patch #1660626 - Delete "$TEMP\~nsu.tmp" directory on reboot 2007-02-17 15:40 kichik * /NSIS/trunk/Source/exehead/Main.c: fail CopyFile of uninstaller in case it already exists this prevents a race condition where Au_.exe is deleted by the current uninstaller and created by another uninstaller before CopyFile is called 2007-02-17 15:24 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: fixed bug #1661677 - InstallOptions MessageBox 2007-02-17 15:11 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: use winchar_strdup 2007-02-17 15:11 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/script.cpp: fixed bug #1662190 - dialog template unicode conversion is lossy 2007-02-17 15:06 kichik * /NSIS/trunk/Source/Tests/winchar.cpp, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: added winchar_strdup 2007-02-17 11:53 * /NSIS/tags/v224, /NSIS/tags/v224/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v224/Contrib/InstallOptions/resource.h, /NSIS/tags/v224/Contrib/NSISdl/httpget.h, /NSIS/tags/v224/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v224'. 2007-02-17 11:53 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Menu/images/header.gif: 2.24 2007-02-17 11:31 kichik * /NSIS/trunk/Include/TextFunc.nsh: clear error flag in _TextFunc_TempFileForFile 2007-02-17 11:22 kichik * /NSIS/trunk/Docs/src/compiler.but: named scope predefines label 2007-02-17 10:49 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: align strings on 4 byte boundary and don't write NULL termination twice 2007-02-17 09:56 kichik * /NSIS/trunk/Source/exehead/util.c: size optimization 2007-02-17 09:12 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: always terminate lpFilteredData with NULL, even if no numbers are found in lpData 2007-02-16 18:30 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: more typos 2007-02-15 22:50 kichik * /NSIS/branches/UNICODE/Contrib/ExDLL/exdll.h, /NSIS/branches/UNICODE/Contrib/Graphics/Checks/red.bmp, /NSIS/branches/UNICODE/Contrib/Graphics/SConscript, /NSIS/branches/UNICODE/Contrib/InstallOptions/Changelog.txt, /NSIS/branches/UNICODE/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/UNICODE/Contrib/InstallOptions/Readme.html, /NSIS/branches/UNICODE/Contrib/LangDLL/LangDLL.c, /NSIS/branches/UNICODE/Contrib/LangDLL/resource.rc, /NSIS/branches/UNICODE/Contrib/Language files/Basque.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Breton.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Bulgarian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Catalan.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Danish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Dutch.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Finnish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/French.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Galician.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Hebrew.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Icelandic.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Irish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Italian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Lithuanian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Mongolian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Polish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/PortugueseBR.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Romanian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/SConscript, /NSIS/branches/UNICODE/Contrib/Language files/Serbian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/SerbianLatin.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Slovenian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Spanish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Swedish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Thai.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Turkish.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Ukrainian.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Uzbek.nlf, /NSIS/branches/UNICODE/Contrib/Language files/Valencian.nlf, /NSIS/branches/UNICODE/Contrib/Library/LibraryLocal/SConscript, /NSIS/branches/UNICODE/Contrib/Library/RegTool/SConscript, /NSIS/branches/UNICODE/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/branches/UNICODE/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/branches/UNICODE/Contrib/MakeLangId/MakeLangId.xml, /NSIS/branches/UNICODE/Contrib/MakeLangId/resource.rc, /NSIS/branches/UNICODE/Contrib/MakeLangId/SConscript, /NSIS/branches/UNICODE/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/branches/UNICODE/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/UNICODE/Contrib/Makensisw/makensisw.h, /NSIS/branches/UNICODE/Contrib/Makensisw/makensisw.xml, /NSIS/branches/UNICODE/Contrib/Makensisw/Readme.txt, /NSIS/branches/UNICODE/Contrib/Makensisw/resource.h, /NSIS/branches/UNICODE/Contrib/Makensisw/resource.rc, /NSIS/branches/UNICODE/Contrib/Makensisw/SConscript, /NSIS/branches/UNICODE/Contrib/Makensisw/toolbar.cpp, /NSIS/branches/UNICODE/Contrib/Makensisw/update.cpp, /NSIS/branches/UNICODE/Contrib/Makensisw/utils.cpp, /NSIS/branches/UNICODE/Contrib/Makensisw/utils.h, /NSIS/branches/UNICODE/Contrib/Math/mathtest.nsi, /NSIS/branches/UNICODE/Contrib/Math/SConscript, /NSIS/branches/UNICODE/Contrib/Math/Source/Math.c, /NSIS/branches/UNICODE/Contrib/Math/Source/mathcrtmt.lib, /NSIS/branches/UNICODE/Contrib/Math/Source/MyMath.c, /NSIS/branches/UNICODE/Contrib/Math/Source/plugin.c, /NSIS/branches/UNICODE/Contrib/Modern UI/Changelog.txt, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Basque.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Breton.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/French.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Galician.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Icelandic.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Irish.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Mongolian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/NorwegianNynorsk.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/SerbianLatin.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Slovenian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Swedish.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Uzbek.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/Language files/Valencian.nsh, /NSIS/branches/UNICODE/Contrib/Modern UI/License.txt, /NSIS/branches/UNICODE/Contrib/Modern UI/Readme.html, /NSIS/branches/UNICODE/Contrib/Modern UI/SConscript, /NSIS/branches/UNICODE/Contrib/Modern UI/System.nsh, /NSIS/branches/UNICODE/Contrib/nsExec/nsexec.c, /NSIS/branches/UNICODE/Contrib/nsExec/nsExec.txt, /NSIS/branches/UNICODE/Contrib/nsExec/test.nsi, /NSIS/branches/UNICODE/Contrib/NSIS Menu/SConscript, /NSIS/branches/UNICODE/Contrib/NSISdl/asyncdns.cpp, /NSIS/branches/UNICODE/Contrib/NSISdl/asyncdns.h, /NSIS/branches/UNICODE/Contrib/NSISdl/httpget.cpp, /NSIS/branches/UNICODE/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/UNICODE/Contrib/StartMenu/StartMenu.c, /NSIS/branches/UNICODE/Contrib/System/Source/Buffers.c, /NSIS/branches/UNICODE/Contrib/System/Source/System.c, /NSIS/branches/UNICODE/Contrib/System/System.html, /NSIS/branches/UNICODE/Contrib/UIs/SConscript, /NSIS/branches/UNICODE/Contrib/UIs/sdbarker_tiny.rc, /NSIS/branches/UNICODE/Contrib/VPatch/Readme.html, /NSIS/branches/UNICODE/Contrib/VPatch/SConscript, /NSIS/branches/UNICODE/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/branches/UNICODE/Contrib/VPatch/Source/GenPat/PatchGenerator.h, /NSIS/branches/UNICODE/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp, /NSIS/branches/UNICODE/Contrib/VPatch/Source/GenPat/SConscript, /NSIS/branches/UNICODE/Contrib/zip2exe/main.cpp, /NSIS/branches/UNICODE/Contrib/zip2exe/res.rc, /NSIS/branches/UNICODE/Contrib/zip2exe/SConscript, /NSIS/branches/UNICODE/Contrib/zip2exe/zip2exe.xml, /NSIS/branches/UNICODE/COPYING, /NSIS/branches/UNICODE/Docs/src/attributes.but, /NSIS/branches/UNICODE/Docs/src/basic.but, /NSIS/branches/UNICODE/Docs/src/build.but, /NSIS/branches/UNICODE/Docs/src/callback.but, /NSIS/branches/UNICODE/Docs/src/chm_config.but, /NSIS/branches/UNICODE/Docs/src/chmlink.js, /NSIS/branches/UNICODE/Docs/src/compiler.but, /NSIS/branches/UNICODE/Docs/src/compilerflags.but, /NSIS/branches/UNICODE/Docs/src/config.but, /NSIS/branches/UNICODE/Docs/src/credits.but, /NSIS/branches/UNICODE/Docs/src/defines.but, /NSIS/branches/UNICODE/Docs/src/file.but, /NSIS/branches/UNICODE/Docs/src/flowcontrol.but, /NSIS/branches/UNICODE/Docs/src/generalpurpose.but, /NSIS/branches/UNICODE/Docs/src/headers.but, /NSIS/branches/UNICODE/Docs/src/history.but, /NSIS/branches/UNICODE/Docs/src/int.but, /NSIS/branches/UNICODE/Docs/src/intro.but, /NSIS/branches/UNICODE/Docs/src/jumps.but, /NSIS/branches/UNICODE/Docs/src/library.but, /NSIS/branches/UNICODE/Docs/src/license.but, /NSIS/branches/UNICODE/Docs/src/log.but, /NSIS/branches/UNICODE/Docs/src/misc.but, /NSIS/branches/UNICODE/Docs/src/SConscript, /NSIS/branches/UNICODE/Docs/src/script.but, /NSIS/branches/UNICODE/Docs/src/sec.but, /NSIS/branches/UNICODE/Docs/src/sections.but, /NSIS/branches/UNICODE/Docs/src/silent.but, /NSIS/branches/UNICODE/Docs/src/tutorial.but, /NSIS/branches/UNICODE/Docs/src/ui.but, /NSIS/branches/UNICODE/Docs/src/usage.but, /NSIS/branches/UNICODE/Docs/src/usefulfunc.but, /NSIS/branches/UNICODE/Docs/src/var.but, /NSIS/branches/UNICODE/Examples/bigtest.nsi, /NSIS/branches/UNICODE/Examples/FileFunc.nsi, /NSIS/branches/UNICODE/Examples/FileFuncTest.nsi, /NSIS/branches/UNICODE/Examples/Library.nsi, /NSIS/branches/UNICODE/Examples/makensis.nsi, /NSIS/branches/UNICODE/Examples/Modern UI/InstallOptions.nsi, /NSIS/branches/UNICODE/Examples/Modern UI/MultiLanguage.nsi, /NSIS/branches/UNICODE/Examples/Modern UI/WelcomeFinish.nsi, /NSIS/branches/UNICODE/Examples/SConscript, /NSIS/branches/UNICODE/Examples/TextFunc.nsi, /NSIS/branches/UNICODE/Examples/TextFuncTest.nsi, /NSIS/branches/UNICODE/Examples/WordFuncTest.nsi, /NSIS/branches/UNICODE/Include/FileFunc.nsh, /NSIS/branches/UNICODE/Include/Library.nsh, /NSIS/branches/UNICODE/Include/LogicLib.nsh, /NSIS/branches/UNICODE/Include/SConscript, /NSIS/branches/UNICODE/Include/TextFunc.nsh, /NSIS/branches/UNICODE/Include/WinVer.nsh, /NSIS/branches/UNICODE/Include/WordFunc.nsh, /NSIS/branches/UNICODE/Include/x64.nsh, /NSIS/branches/UNICODE/INSTALL, /NSIS/branches/UNICODE/Menu/docs.html, /NSIS/branches/UNICODE/Menu/images/header.gif, /NSIS/branches/UNICODE/Menu/images/header-notext.gif, /NSIS/branches/UNICODE/Menu/index.html, /NSIS/branches/UNICODE/Menu/intro.html, /NSIS/branches/UNICODE/Menu/update.html, /NSIS/branches/UNICODE/Menu/websites.html, /NSIS/branches/UNICODE/SCons/config.py, /NSIS/branches/UNICODE/SCons/Config/default, /NSIS/branches/UNICODE/SCons/Config/gnu, /NSIS/branches/UNICODE/SCons/Config/ms, /NSIS/branches/UNICODE/SCons/Tools/crossmingw.py, /NSIS/branches/UNICODE/SCons/Tools/mstoolkit.py, /NSIS/branches/UNICODE/SCons/utils.py, /NSIS/branches/UNICODE/SConstruct, /NSIS/branches/UNICODE/Scripts/release.py, /NSIS/branches/UNICODE/Source/7zip/7zGuids.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/InBuffer.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/StdAfx.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZ/StdAfx.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/LZMA/StdAfx.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/branches/UNICODE/Source/7zip/7zip/Compress/RangeCoder/StdAfx.h, /NSIS/branches/UNICODE/Source/7zip/7zip/ICoder.h, /NSIS/branches/UNICODE/Source/7zip/7zip/IStream.h, /NSIS/branches/UNICODE/Source/7zip/Common/Alloc.cpp, /NSIS/branches/UNICODE/Source/7zip/Common/Alloc.h, /NSIS/branches/UNICODE/Source/7zip/Common/CRC.cpp, /NSIS/branches/UNICODE/Source/7zip/Common/CRC.h, /NSIS/branches/UNICODE/Source/7zip/Common/Defs.h, /NSIS/branches/UNICODE/Source/7zip/Common/MyCom.h, /NSIS/branches/UNICODE/Source/7zip/Common/MyGuidDef.h, /NSIS/branches/UNICODE/Source/7zip/Common/MyUnknown.h, /NSIS/branches/UNICODE/Source/7zip/Common/MyWindows.h, /NSIS/branches/UNICODE/Source/7zip/Common/StdAfx.h, /NSIS/branches/UNICODE/Source/7zip/Common/Types.h, /NSIS/branches/UNICODE/Source/7zip/copying.txt, /NSIS/branches/UNICODE/Source/7zip/LZMADecode.c, /NSIS/branches/UNICODE/Source/7zip/LZMADecode.h, /NSIS/branches/UNICODE/Source/7zip/readme.txt, /NSIS/branches/UNICODE/Source/7zip/sdk.diff, /NSIS/branches/UNICODE/Source/afxres.h, /NSIS/branches/UNICODE/Source/build.cpp, /NSIS/branches/UNICODE/Source/build.h, /NSIS/branches/UNICODE/Source/bzip2/blocksort.c, /NSIS/branches/UNICODE/Source/bzip2/bzlib.c, /NSIS/branches/UNICODE/Source/bzip2/bzlib.h, /NSIS/branches/UNICODE/Source/bzip2/compress.c, /NSIS/branches/UNICODE/Source/bzip2/decompress.c, /NSIS/branches/UNICODE/Source/bzip2/huffman.c, /NSIS/branches/UNICODE/Source/bzip2/Readme.txt, /NSIS/branches/UNICODE/Source/cbzip2.h, /NSIS/branches/UNICODE/Source/clzma.cpp, /NSIS/branches/UNICODE/Source/clzma.h, /NSIS/branches/UNICODE/Source/compressor.h, /NSIS/branches/UNICODE/Source/crc32.c, /NSIS/branches/UNICODE/Source/crc32.h, /NSIS/branches/UNICODE/Source/czlib.h, /NSIS/branches/UNICODE/Source/DialogTemplate.cpp, /NSIS/branches/UNICODE/Source/DialogTemplate.h, /NSIS/branches/UNICODE/Source/dirreader.cpp, /NSIS/branches/UNICODE/Source/dirreader.h, /NSIS/branches/UNICODE/Source/exehead/afxres.h, /NSIS/branches/UNICODE/Source/exehead/bgbg.c, /NSIS/branches/UNICODE/Source/exehead/components.c, /NSIS/branches/UNICODE/Source/exehead/components.h, /NSIS/branches/UNICODE/Source/exehead/config.h, /NSIS/branches/UNICODE/Source/exehead/exec.c, /NSIS/branches/UNICODE/Source/exehead/exec.h, /NSIS/branches/UNICODE/Source/exehead/fileform.c, /NSIS/branches/UNICODE/Source/exehead/fileform.h, /NSIS/branches/UNICODE/Source/exehead/lang.h, /NSIS/branches/UNICODE/Source/exehead/Main.c, /NSIS/branches/UNICODE/Source/exehead/SConscript, /NSIS/branches/UNICODE/Source/exehead/state.h, /NSIS/branches/UNICODE/Source/exehead/Ui.c, /NSIS/branches/UNICODE/Source/exehead/ui.h, /NSIS/branches/UNICODE/Source/exehead/util.c, /NSIS/branches/UNICODE/Source/exehead/util.h, /NSIS/branches/UNICODE/Source/fileform.cpp, /NSIS/branches/UNICODE/Source/fileform.h, /NSIS/branches/UNICODE/Source/growbuf.cpp, /NSIS/branches/UNICODE/Source/growbuf.h, /NSIS/branches/UNICODE/Source/lang.cpp, /NSIS/branches/UNICODE/Source/lang.h, /NSIS/branches/UNICODE/Source/lineparse.cpp, /NSIS/branches/UNICODE/Source/lineparse.h, /NSIS/branches/UNICODE/Source/makenssi.cpp, /NSIS/branches/UNICODE/Source/manifest.cpp, /NSIS/branches/UNICODE/Source/manifest.h, /NSIS/branches/UNICODE/Source/mmap.cpp, /NSIS/branches/UNICODE/Source/mmap.h, /NSIS/branches/UNICODE/Source/Platform.h, /NSIS/branches/UNICODE/Source/Plugins.cpp, /NSIS/branches/UNICODE/Source/Plugins.h, /NSIS/branches/UNICODE/Source/ResourceEditor.cpp, /NSIS/branches/UNICODE/Source/ResourceEditor.h, /NSIS/branches/UNICODE/Source/ResourceVersionInfo.cpp, /NSIS/branches/UNICODE/Source/ResourceVersionInfo.h, /NSIS/branches/UNICODE/Source/SConscript, /NSIS/branches/UNICODE/Source/script.cpp, /NSIS/branches/UNICODE/Source/ShConstants.cpp, /NSIS/branches/UNICODE/Source/ShConstants.h, /NSIS/branches/UNICODE/Source/strlist.cpp, /NSIS/branches/UNICODE/Source/strlist.h, /NSIS/branches/UNICODE/Source/Tests/compression.cpp, /NSIS/branches/UNICODE/Source/Tests/decompress.cpp, /NSIS/branches/UNICODE/Source/Tests/decompress.h, /NSIS/branches/UNICODE/Source/Tests/DialogTemplate.cpp, /NSIS/branches/UNICODE/Source/Tests/endian.cpp, /NSIS/branches/UNICODE/Source/Tests/memcpy.c, /NSIS/branches/UNICODE/Source/Tests/mmap.cpp, /NSIS/branches/UNICODE/Source/Tests/preprocessor.nsi, /NSIS/branches/UNICODE/Source/Tests/ResourceEditor.cpp, /NSIS/branches/UNICODE/Source/Tests/root.txt, /NSIS/branches/UNICODE/Source/Tests/SConscript, /NSIS/branches/UNICODE/Source/Tests/winchar.cpp, /NSIS/branches/UNICODE/Source/tokens.cpp, /NSIS/branches/UNICODE/Source/tokens.h, /NSIS/branches/UNICODE/Source/uservars.h, /NSIS/branches/UNICODE/Source/util.cpp, /NSIS/branches/UNICODE/Source/util.h, /NSIS/branches/UNICODE/Source/winchar.cpp, /NSIS/branches/UNICODE/Source/winchar.h, /NSIS/branches/UNICODE/Source/writer.cpp, /NSIS/branches/UNICODE/Source/writer.h, /NSIS/branches/UNICODE/Source/zlib/deflate.c, /NSIS/branches/UNICODE/Source/zlib/DEFLATE.H, /NSIS/branches/UNICODE/Source/zlib/INFBLOCK.C, /NSIS/branches/UNICODE/Source/zlib/trees.c, /NSIS/branches/UNICODE/Source/zlib/ZCONF.H, /NSIS/branches/UNICODE/Source/zlib/ZLIB.H, /NSIS/branches/UNICODE/Source/zlib/ZUTIL.H, /NSIS/branches/UNICODE/TODO.txt: sync with HEAD 2007-02-15 20:01 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: typo (thanks kk) 2007-02-10 14:23 kichik * /NSIS/trunk/Source/exehead/exec.c: skip_root returns NULL, if buf1 is NULL, so there's no need to check again 2007-02-08 19:48 kichik * /NSIS/trunk/Docs/src/callback.but: clarification for patch #1649187 - OnInstTypeChange callback 2007-02-06 20:58 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: czi's patch for bug #1651312 2007-02-06 20:54 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: fixed bug #1652075 - ONLY_NUMBERS Flag (Install Options Plugin) bug 2007-02-03 18:30 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: fixed bug #1651312 - InstallOptions browse button not working 2007-02-02 22:53 kichik * /NSIS/trunk/SCons/Config/gnu: fixed bug #1646170 - nsis-2.23 can be built on x86_64 hosts 2007-02-02 21:56 kichik * /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/license.but: add "except where otherwise noted" to zlib license general application on the entire package halibut is an example of this exception, it's under bsd 2007-02-02 19:51 kichik * /NSIS/trunk/Include/TextFunc.nsh: fixed bug #1631773 - file permission problem with ${LineFind} 2007-02-02 16:37 kichik * /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript: version bump 2007-02-02 16:34 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: add menu accelerators to MRU 2007-01-30 23:11 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: include windows.h for HWND, GPTR and friends 2007-01-30 18:50 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: winchar_toansi requires WCHAR* not WORD* 2007-01-27 16:53 kichik * /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/makenssi.cpp: applied patch #1638974 - option to set process priority of makensis 2007-01-27 16:31 kichik * /NSIS/trunk/Include/Library.nsh: fixed UnInstallLib for installers 2007-01-27 16:26 kichik * /NSIS/trunk/Docs/src/compiler.but: documentation for new predefines 2007-01-27 16:01 kichik * /NSIS/trunk/Source/Tests/preprocessor.nsi: !if${global} killed the block ignore code !ifdef a !if${something} !endif # this will close the first !if, because ${something} is invalid !endif 2007-01-27 15:54 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp: ignored invalid preprocessor commands in ignored blocks 2007-01-27 15:39 kichik * /NSIS/trunk/Source/build.cpp: set __UNINSTALL__ in set_uninstall_mode, as in original patch #1644712 PageEx and PageExEnd set uninstall_mode in script.cpp, so setting this in set_code_type_predefines doesn't work it's probably better to set it in set_uninstall_mode as other commands probably use it as well 2007-01-27 15:32 kichik * /NSIS/trunk/Source/Tests/preprocessor.nsi: tests for patch #1644712 (new predefines) 2007-01-27 15:32 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/tokens.cpp: applied patch #1644712 - new compiler predefines 2007-01-25 22:37 kichik * /NSIS/trunk/Source/exehead/Main.c: use a different temporary variable now that state_command_line is already in use 2007-01-25 22:24 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c: according to MSDN, passing NULL as hModule to GetModuleFileName will get the path for the executable of the process so there's no need for g_hInstance 2007-01-25 22:08 kichik * /NSIS/trunk/Source/exehead/Main.c: process command line before setting temporary directory to give the user a chance to use /S 2007-01-25 21:29 kichik * /NSIS/trunk/Source/exehead/fileform.c: set silent flag as early as possible, so most crc errors won't appear 2007-01-25 18:07 kichik * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZUTIL.H: clean-up for posix tests compatibility 2007-01-25 17:57 kichik * /NSIS/trunk/Source/Tests/SConscript: lzma needs pthread on posix 2007-01-25 17:56 kichik * /NSIS/trunk/Source/Tests/SConscript: force c, as gcc thinks upper case .C extension is c++ 2007-01-25 17:50 kichik * /NSIS/trunk/Source/Tests/memcpy.c: util.h isn't really needed and only causes problems when compiling the tests 2007-01-25 17:49 kichik * /NSIS/trunk/Source/Tests/decompress.cpp: gcc doesn't like deleting void* 2007-01-25 17:44 kichik * /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/bzip2/bzlib.h: util.h isn't really needed and only causes problems when compiling the tests 2007-01-25 15:23 kichik * /NSIS/trunk/Contrib/nsExec/test.nsi: nsExec::Exec example 2007-01-25 14:08 kichik * /NSIS/trunk/Source/Tests/SConscript, /NSIS/trunk/Source/Tests/winchar.cpp: added winchar tests 2007-01-25 14:07 kichik * /NSIS/trunk/Source/winchar.cpp: fixed winchar_strcmp 2007-01-25 13:27 kichik * /NSIS/trunk/Source/ResourceVersionInfo.cpp: convert all StrToWstrAlloc 2007-01-25 13:22 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: fixed gcc conversion warning/error 2007-01-25 13:15 kichik * /NSIS/trunk/Source/Platform.h: use same conversion for IS_INTRESOURCE and MAKEINTRESOURCE 2007-01-25 13:09 kichik * /NSIS/trunk/Source/ResourceVersionInfo.cpp: StrToWstrAlloc -> winchar_fromansi 2007-01-25 13:08 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: CreateUnicodeString -> winchar_fromansi 2007-01-25 13:07 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: use winchar 2007-01-25 13:04 kichik * /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: add support for codepage selection in winchar_*ansi 2007-01-25 13:02 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp: GetResourceSize -> GetResourceSizeA/GetResourceSizeW 2007-01-25 12:58 kichik * /NSIS/trunk/Source/util.cpp: UpdateResource->UpdateResourceA 2007-01-25 12:57 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/winchar.cpp, /NSIS/trunk/Source/winchar.h: wcs* use wchar_t on POSIX, which is not the same as WCHAR so, winchar_* is introduced which uses WCHAR 2007-01-25 11:22 kichik * /NSIS/trunk/Source/Platform.h: more of patch #1643633 2007-01-24 16:14 kichik * /NSIS/trunk/Include/Library.nsh: UnInstallLib is usually used in uninstallers, so use un.GetParent instead of GetParent 2007-01-24 15:55 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: applied patch #1643633 - 64bit PE support for CResourceEditor 2007-01-24 15:25 kichik * /NSIS/trunk/Include/Library.nsh: typos 2007-01-24 15:19 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp: fixed bug #1083492 - resource editor unicode conversion is lossy 2007-01-24 13:25 kichik * /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp: slight name changes to better fit the "standard" 2007-01-24 13:24 kichik * /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp: fixed bug #1554178 - Compiler ignores next line after comment line ends with \ 2007-01-24 13:08 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1174184 - end of InstallDir appended after browse with custom dir var 2007-01-24 12:51 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: fixed bug #1411970 - Settings in HKLM instead of HKCU? 2007-01-24 11:37 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: make sure the PE is 32-bit and not 64-bit (PE32+) 2007-01-24 11:36 kichik * /NSIS/trunk/Source/Platform.h: add optional header magic definitions 2007-01-24 11:23 kichik * /NSIS/trunk/Include/Library.nsh: use !verbose 2007-01-24 11:19 kichik * /NSIS/trunk/Include/Library.nsh: fixed bug #1097642 - Uninstaller deletes components on reboot after reinstall 2007-01-23 21:21 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: fixed bug #1626504 - VIAddVersionKey causes problems with localized installers 2007-01-23 20:47 kichik * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: more patch #1634704 updates 2007-01-23 19:41 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c: try CSIDL before resorting to registry or API for paths 2007-01-23 19:35 kichik * /NSIS/trunk/Include/x64.nsh: proper comment, $SYSDIR doesn't change 2007-01-23 18:16 kichik * /NSIS/trunk/Source/exehead/exec.c: fixed bug #1638191 - have RegDLL use LoadLibraryEx with LOAD_WITH_ALTERED_SEARCH_PATH 2007-01-23 17:33 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html: applied patch #1634704 - FOCUS flag for InstallOptions Plugin 2007-01-23 17:01 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SConstruct: fixed bug #1635841 - gcc strict-aliasing and build system - added STRIP, APPEND_CCFLAGS and APPEND_LINKFLAGS command line options - added -fno-strict-aliasing to stubs and plug-ins 2007-01-23 16:05 kichik * /NSIS/trunk/Source/Tests/compression.cpp, /NSIS/trunk/Source/Tests/decompress.cpp, /NSIS/trunk/Source/Tests/decompress.h, /NSIS/trunk/Source/Tests/memcpy.c, /NSIS/trunk/Source/Tests/SConscript: compression tests 2007-01-23 16:03 kichik * /NSIS/trunk/Source/cbzip2.h: return >0 only when really finished 2007-01-23 14:12 kichik * /NSIS/trunk/Source/bzip2/blocksort.c: no need for #ifdef anymore with the new build system 2007-01-23 13:57 kichik * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c: no need for #ifdef anymore with the new build system 2007-01-23 09:21 kichik * /NSIS/trunk/Menu/websites.html: fixed bug #1642107 - Simple Typo: "an" instead of "and" 2007-01-22 20:01 kichik * /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/compressor.h: don't return 0 from CLZMA::Comrpess when finished, return 1 2007-01-19 20:09 kichik * /NSIS/trunk/Contrib/Language files/Galician.nlf, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/Language files/Galician.nsh, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Docs/src/credits.but: patch #1631765 - New Galician translation available 2007-01-19 19:33 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #1631889 - NSIS compiler issues erroneous warning on uninstall sections 2007-01-19 19:26 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: fixed bug #1606716 - InstallOptions might send irrelevant NOTIFY for radiobuttons 2007-01-19 18:30 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization - no need for GetDlgItem, WM_COMMAND comes with the lParam = HWND 2007-01-16 21:34 kichik * /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/SConstruct: fixed scons 0.96.94 compatibility 2007-01-13 18:08 * /NSIS/tags/v223, /NSIS/tags/v223/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v223/Contrib/InstallOptions/resource.h, /NSIS/tags/v223/Contrib/NSISdl/httpget.h, /NSIS/tags/v223/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v223'. 2007-01-13 18:08 kichik * /NSIS/trunk/Menu/images/header.gif: 2.23 2007-01-13 17:50 kichik * /NSIS/trunk/Docs/src/history.but: 2.23 2007-01-13 17:40 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html: tabs to spaces 2007-01-13 17:28 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/trees.c, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: 2006 -> 2007 2006-12-29 12:48 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html: little clear up based on patch #1624292 - VPatch docs 2006-12-22 12:47 kichik * /NSIS/trunk/Contrib/System/Source/Buffers.c: fixed bug #1620178 - System::Store l crash installer when private stack is empty 2006-12-15 11:52 kichik * /NSIS/trunk/Contrib/System/Source/System.c: fixed bug #1616267 - System plugin crash with parenthesis in filename 2006-12-09 15:17 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Tests/mmap.cpp: applied patch #1611866 - Fix MMapFile::release(void *pView, int size) 2006-12-09 13:08 kichik * /NSIS/trunk/Source/script.cpp: some CEXEBuild::doParse cleanup - removed last_line_had_slash which was always set to zero - moved m_linebuild.resize(0) so it won't free the memory the next condition uses, though the line needs to be 64kb for that to happen - took care of a coupple of comments 2006-12-09 13:03 kichik * /NSIS/trunk/Source/Tests/preprocessor.nsi: test block comments in !if blocks 2006-12-08 12:22 kichik * /NSIS/trunk/Contrib/Math/SConscript: fixed bug #1610773 - nsis-2.22 fails to install on Linux (mingw32) 2006-12-08 12:20 kichik * /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp: use the safer mkstemp instead of tmpnam 2006-12-08 11:21 kichik * /NSIS/trunk/Examples/makensis.nsi: fixed bug #1611251 - Uninstalling NSIS 2.22 leaves Start menu icons 2006-12-06 06:15 kichik * /NSIS/trunk/SCons/Tools/mstoolkit.py: spaces to tabs 2006-12-05 20:59 kichik * /NSIS/trunk/SCons/Tools/mstoolkit.py: set MSVS_VERSION 2006-12-01 16:29 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: fixed bug #1605581 - nsExec:ExecToLog is unstable in silent mode 2006-11-27 17:50 kichik * /NSIS/trunk/Scripts/release.py: properly print todo list 2006-11-27 17:49 kichik * /NSIS/trunk/Scripts/release.py: globalize scons_line 2006-11-27 16:50 * /NSIS/tags/v222, /NSIS/tags/v222/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v222/Contrib/InstallOptions/resource.h, /NSIS/tags/v222/Contrib/NSISdl/httpget.h, /NSIS/tags/v222/Source/exehead/uninst.ico: This commit was manufactured by cvs2svn to create tag 'v222'. 2006-11-27 16:50 kichik * /NSIS/trunk/Docs/src/history.but: sort 2.22 changes 2006-11-27 16:48 kichik * /NSIS/trunk/Menu/images/header.gif: 2.22 2006-11-27 16:27 kichik * /NSIS/trunk/Include/Library.nsh: $__INSTALLLLIB_SESSIONGUID might as well be {000...}, it's no different than 'session' in functionality 2006-11-27 16:10 kichik * /NSIS/trunk/Docs/src/compilerflags.but: links in SetPluginUnload 2006-11-27 15:38 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: minor CallInstDLL description improvement 2006-11-27 15:22 kichik * /NSIS/trunk/Docs/src/history.but: 2.22 2006-11-27 14:38 kichik * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/SCons/Config/ms: MSVC_VERSION has `Exp` prefix for express versions 2006-11-25 12:13 kichik * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf: fixed bug #1602673 - error in Lithuanian language file 2006-11-25 11:37 kichik * /NSIS/trunk/Source/exehead/util.c: size optimization 2006-11-25 11:32 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: fixed bug #1542530 - WriteUninstaller fails to overwrite read-only uninstallers 2006-11-25 10:51 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization 2006-11-25 10:28 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization 2006-11-25 10:17 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1115825 - install pg/Show details/rt clk popup not destroyed on finish 2006-11-18 09:40 kichik * /NSIS/trunk/Docs/src/attributes.but: compatibility mode without RequestExecutionLevel 2006-11-17 11:38 kichik * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/SCons/Config/ms: proper MSVS_VERSION check 2006-11-14 19:14 joostverburg * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct: automatic MSVC 2005 detection 2006-11-13 14:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: updated info about reserving files 2006-11-13 14:10 joostverburg * /NSIS/trunk/INSTALL, /NSIS/trunk/SCons/Config/ms: * SCons 0.96.93 automatically detects MSVC 2005, using environment variables is no longer needed * Use new exception flag for MSVC 2005 2006-11-11 13:04 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/SConscript: Copy is deprecated by Clone in scons 0.96.93 2006-11-10 14:54 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: added `highest` option for RequestExecutionLevel 2006-11-09 19:56 kichik * /NSIS/trunk/Include/Library.nsh: fixed __InstallLib_Helper_InitSession 2006-11-06 21:18 kichik * /NSIS/trunk/Include/Library.nsh: the system plug-in can take care of the guid/string conversion 2006-11-06 07:04 kichik * /NSIS/trunk/Source/makenssi.cpp: cosmetics 2006-11-05 23:24 joostverburg * /NSIS/trunk/Source/makenssi.cpp: line breaks in license text 2006-11-03 18:50 kichik * /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: patch #1590108 - Another update for Slovenian localization 2006-11-03 12:21 kichik * /NSIS/trunk/Docs/src/headers.but: fixed bug #1589877 - Typos in Appendix E 2006-11-03 11:13 kichik * /NSIS/trunk/Include/WinVer.nsh: !verbose 3 2006-11-02 20:24 kichik * /NSIS/trunk/Contrib/nsExec/nsExec.txt: typo 2006-11-02 12:59 kichik * /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Breton.nsh: minor fixes by solenn 2006-10-31 23:55 joostverburg * /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/license.but: Special exception for LZMA compression module. Thanks Igor! 2006-10-31 22:29 joostverburg * /NSIS/trunk/Include/WinVer.nsh: corrected Windows 98 and Windows Me version number 2006-10-30 20:50 kichik * /NSIS/trunk/SCons/Config/ms: proper memset test 2006-10-30 19:45 kichik * /NSIS/trunk/Contrib/Math/SConscript: fixed TEMP_MSVC2005 test 2006-10-30 19:08 kichik * /NSIS/trunk/Docs/src/attributes.but: RequestExecutionLevel affects the uninstaller as well 2006-10-29 14:52 joostverburg * /NSIS/trunk/SCons/Config/ms: Disabled libcp check for MSVC 2005. This lib is not used anymore. 2006-10-29 11:50 joostverburg * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/Math/Source/mathcrtmt.lib, /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/INSTALL, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct: MSVC 2005 support. Add TEMP_MSVC2005=yes to the build command line. 2006-10-29 00:22 kichik * /NSIS/trunk/Docs/src/license.but: cosmetics 2006-10-29 00:17 kichik * /NSIS/trunk/Docs/src/license.but: zlib-license keyword used twice 2006-10-29 00:16 kichik * /NSIS/trunk/Docs/src/credits.but: added missing translators - Uzbek and Valencian 2006-10-29 00:05 kichik * /NSIS/trunk/Source/makenssi.cpp: added missing NSIS_VERSION to fprintf 2006-10-28 23:58 kichik * /NSIS/trunk/Source/makenssi.cpp: fixed syntax error 2006-10-28 23:58 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SConstruct: license.txt -> COPYING 2006-10-28 23:55 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript: added Uzbek 2006-10-28 20:07 joostverburg * /NSIS/trunk/Contrib/Language files/Uzbek.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Uzbek.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Uzbek language files by Emil Garipov 2006-10-28 19:45 joostverburg * /NSIS/trunk/COPYING, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/copying.txt, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/7zip/readme.txt, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/bzip2/Readme.txt, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/trees.c, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: * The LZMA compression module for NSIS is now licensed under the Common Public License version 1.0 * Added license and copyright notice to every source file * The new COPYING file and license section in the Users Manual list the terms of all relevant licenses 2006-10-28 15:28 kichik * /NSIS/trunk/Docs/src/sections.but: emphasize that section_idx is a !define 2006-10-28 15:22 kichik * /NSIS/trunk/Docs/src/sec.but: added code examples 2006-10-25 21:14 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: fixed bug #1584618 - No Contrib\ExDLL directory 2006-10-20 14:18 kichik * /NSIS/trunk/Scripts/release.py: converted steps to functions for easier step selection 2006-10-20 13:40 kichik * /NSIS/trunk/Docs/src/history.but: typo 2006-10-20 12:53 * /NSIS/tags/v221, /NSIS/tags/v221/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v221/Contrib/InstallOptions/resource.h, /NSIS/tags/v221/Contrib/NSISdl/httpget.h, /NSIS/tags/v221/Source/exehead/uninst.ico, /NSIS/tags/v221/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v221'. 2006-10-20 12:53 kichik * /NSIS/trunk/Docs/src/SConscript: seems to have a problem with long current directory paths now... so go to the root until i find out what's up here 2006-10-20 11:47 kichik * /NSIS/trunk/Menu/images/header.gif: 2.21 2006-10-20 11:38 kichik * /NSIS/trunk/Docs/src/history.but: 2.21 2006-10-20 11:36 kichik * /NSIS/trunk/Docs/src/SConscript: hhc.exe suddenly crashes if the directory is changed before calling it... it works fine without changing the directory - css and js are embedded and the files come out identical removed the directory change 2006-10-17 16:59 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SConstruct: scons 0.96.92 2006-10-17 16:51 kichik * /NSIS/trunk/SConstruct: added a workaround to BuildUtil to avoid the suffix problems that appeared with scons 0.96.92 2006-10-16 13:52 kichik * /NSIS/trunk/Docs/src/attributes.but: RC2 also identifies installers so it's probably safe to assume this will stay 2006-10-16 11:23 kichik * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/MakeLangId/SConscript: call InitCommonControls 2006-10-16 08:46 kichik * /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StreamUtils.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/MyGuidDef.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/sdk.diff, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/SConscript: upgraded to lzma sdk 4.43 for faster compression 2006-10-16 08:05 kichik * /NSIS/trunk/Source/manifest.cpp: avoid gcc warning about switch 2006-10-16 07:53 kichik * /NSIS/trunk/Source/SConscript: cosmetics 2006-10-06 16:49 kichik * /NSIS/trunk/Include/FileFunc.nsh: Instructor fixed handle leak in Locate 2006-10-06 16:25 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: small fixes for better view by Dumperbg 2006-10-02 11:12 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: language name 2006-09-30 15:41 kichik * /NSIS/trunk/Include/x64.nsh: fix comment 2006-09-30 12:35 kichik * /NSIS/trunk/Examples/makensis.nsi: install WinVer.nsh and x64.nsh 2006-09-29 17:41 kichik * /NSIS/trunk/Include/SConscript, /NSIS/trunk/Include/WinVer.nsh: added WinVer.nsh - LogicLib extensions for handling Windows versions 2006-09-29 17:18 kichik * /NSIS/trunk/Include/x64.nsh: typo 2006-09-29 16:15 kichik * /NSIS/trunk/Include/x64.nsh: skip popping the value and directly use LogicLib for IsRunningX64 the very first LogicLib extension - cool! 2006-09-29 15:41 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: oops, forgot to remove lbl_error 2006-09-29 15:39 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: added vista this should be replaced with a call to GetVersion and IntCmp with defines the way it is now, users are tempted to use StrCmp and get installers not working with newer versions of windows 2006-09-29 15:26 kichik * /NSIS/trunk/Docs/src/intro.but: added vista 2006-09-23 22:02 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Language files/Valencian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Valencian.nsh, /NSIS/trunk/Contrib/Modern UI/SConscript: patch #1558822 - Valencian translation 2006-09-23 08:28 kichik * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: implemented RFE #1547844 - default button of the abort warning 2006-09-23 08:16 kichik * /NSIS/trunk/Include/SConscript, /NSIS/trunk/Include/x64.nsh: macros for x64 installations handling 2006-09-22 10:42 kichik * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.xml, /NSIS/trunk/Contrib/Makensisw/makensisw.xml, /NSIS/trunk/Contrib/zip2exe/zip2exe.xml: specifically request for no execution level change on vista this is a workaround for vista's incorrect flagging of all manifested nsis applications as installers 2006-09-22 09:14 kichik * /NSIS/trunk/Docs/src/headers.but: typo 2006-09-16 14:06 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: added RequestExecutionLevel 2006-09-16 13:41 kichik * /NSIS/trunk/Source/script.cpp: cosmetics 2006-09-16 13:38 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/manifest.cpp, /NSIS/trunk/Source/manifest.h, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp: moved manifest generation to a seprate file and added made it support vista's access level extensions 2006-09-16 11:35 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: extracted SetVarsSection 2006-09-15 08:58 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/var.but: build settings passed from config.h to scons 2006-09-13 10:46 joostverburg * /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: updated by Martin Srebotnjak 2006-09-09 13:26 * /NSIS/tags/v220, /NSIS/tags/v220/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v220/Contrib/InstallOptions/resource.h, /NSIS/tags/v220/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v220/Contrib/NSISdl/httpget.h, /NSIS/tags/v220/Source/exehead/uninst.ico, /NSIS/tags/v220/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v220'. 2006-09-09 13:26 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Menu/images/header.gif: 2.20 2006-09-09 08:57 kichik * /NSIS/trunk/Docs/src/script.but: explain about comments being extended 2006-09-08 16:35 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: better MUI_UNTEXT_WELCOME_INFO_TEXT translation (SuperPat) 2006-09-01 09:32 kichik * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: corrections by Osidach Vitaly 2006-08-28 23:01 kichik * /NSIS/trunk/Contrib/Language files/Danish.nlf: fixed bug #1548190 - Danish "Browse" words not translated 2006-08-28 12:41 kichik * /NSIS/trunk/TODO.txt: DirShow is no longer desired, as discussed in patch #1539701 2006-08-25 11:36 kichik * /NSIS/trunk/Contrib/Language files/Italian.nlf: fixed bug #1546183 - Italian language file has duplicate access key 2006-08-25 11:32 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: typo fixes by SuperPat 2006-08-19 12:47 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1536377 - incorrect timestamps on big-endian platforms instead of messing with structs, use simple arithmetic ops to split the time to low & high words 2006-08-19 10:59 kichik * /NSIS/trunk/Contrib/Language files/Swedish.nlf: fixed bug #1542680 - Untranslated entry in Swedish.nlf 2006-08-19 10:56 kichik * /NSIS/trunk/Include/LogicLib.nsh: partial fix for bug #1537976 - vague LogicLib syntax error messages 2006-08-18 18:53 kichik * /NSIS/trunk/Contrib/Language files/Turkish.nlf: fixed bug #1542765 - Turkish.nlf is encoded using UTF-8 2006-08-18 11:15 kichik * /NSIS/trunk/SConstruct: updated comment 2006-08-18 11:03 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: added missing $_CLICK 2006-08-09 06:11 pabs3 * /NSIS/trunk/Examples/Library.nsi: TypeLib.dll doesn't have a resource section, use LangDLL.dll instead 2006-08-08 15:44 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: use InstallOptions' new HWND field, not 1200 + field number - 1 2006-08-08 15:38 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: (Joel) Retranslate some text strings to fit some static controls 2006-08-07 14:01 kichik * /NSIS/trunk/Source/script.cpp: NLF_ERR_REG_DLL isn't used anywhere, no need to add it to the language table 2006-08-07 13:57 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1535995 - failed plug-in calls output incomplete messages 2006-08-07 07:37 pabs3 * /NSIS/trunk/SConstruct: fixed bug #1515592 - NSIS_CONFIG_CONST_DATA_PATH wasn't honoured on Linux 2006-08-06 18:56 * /NSIS/tags/v219, /NSIS/tags/v219/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v219/Contrib/InstallOptions/resource.h, /NSIS/tags/v219/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v219/Contrib/NSISdl/httpget.h, /NSIS/tags/v219/Source/exehead/uninst.ico, /NSIS/tags/v219/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v219'. 2006-08-06 18:56 kichik * /NSIS/trunk/Menu/images/header.gif: 2.19 2006-08-06 18:41 kichik * /NSIS/trunk/Docs/src/history.but: 2.19 2006-08-06 18:13 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: better version of IsDotNETInstalled 2006-08-06 16:22 kichik * /NSIS/trunk/Contrib/System/Source/System.c: fixed bug #1535005 - System.dll corrupts the stack with 0 arguments functions 2006-08-05 11:01 kichik * /NSIS/trunk/Contrib/System/Source/System.c: fixed bug #1535007 - System.dll returns bad values, if function returns short 2006-08-04 15:35 kichik * /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/int.but: improvements by Joe Siebenmann 2006-08-03 18:49 kichik * /NSIS/trunk/Source/script.cpp: like StrCmp and !ifdef, !if is now case insensitive 2006-08-02 11:12 kichik * /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: fixed bug #1531874 - Typos in french translation 2006-07-30 14:27 kichik * /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/asyncdns.h: max_cache_entries isn't used anywhere 2006-07-30 14:26 kichik * /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/asyncdns.h: fixed random dns errors caused by synchronization issues with m_thread_kill for more details: http://forums.winamp.com/showthread.php?s=&threadid=247723 2006-07-30 13:02 kichik * /NSIS/trunk/Contrib/Language files/NorwegianNynorsk.nlf, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/Language files/NorwegianNynorsk.nsh, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: patch #1503208 - Norwegian nynorsk language file 2006-07-30 11:58 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #1468852 - Wrong "Total size" reported if greater than 2GB 2006-07-30 11:52 kichik * /NSIS/trunk/Source/build.cpp: partial fix for bug #1470826 - unaligned memory access 2006-07-30 11:48 kichik * /NSIS/trunk/Source/Platform.h: fixed bug #1504772 - Sources/Platform.h type definitions are not 64bit-safe 2006-07-30 10:29 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: fixed bug #1509909 - !system & !packhdr fail with quotes 2006-07-30 10:11 kichik * /NSIS/trunk/Examples/makensis.nsi: added release notes check box to the finish page 2006-07-24 20:09 kichik * /NSIS/trunk/Contrib/System/System.html: typo 2006-07-01 17:37 kichik * /NSIS/trunk/Scripts/release.py: failing wiki update is not critical 2006-07-01 16:52 * /NSIS/tags/v218, /NSIS/tags/v218/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v218/Contrib/InstallOptions/resource.h, /NSIS/tags/v218/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v218/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v218/Contrib/NSISdl/httpget.h, /NSIS/tags/v218/Source/exehead/uninst.ico, /NSIS/tags/v218/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v218'. 2006-07-01 16:52 kichik * /NSIS/trunk/Docs/src/history.but: sort 2006-07-01 16:52 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Menu/images/header.gif: 2.18 2006-06-30 17:12 kichik * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SerbianLatin.nsh: updates by Obucinac: - Fixed unclear semantics - Fixed grammar - Fixed typos - Tuned to match serbian translation of Windows XP interface 2006-06-30 09:21 kichik * /NSIS/trunk/Docs/src/attributes.but: typos 2006-06-17 07:34 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: corrections by Jeferson Hultmann, from Mozilla bug #340885 2006-06-17 07:31 joostverburg * /NSIS/trunk/Contrib/Language files/Irish.nlf: corrections by Kevin P. Scannell, from Mozilla bug #340979 2006-06-16 20:34 joostverburg * /NSIS/trunk/Contrib/Language files/Turkish.nlf: corrections by Mozilla Turkey, from Mozilla bug #340511 2006-06-16 20:30 joostverburg * /NSIS/trunk/Contrib/Language files/Finnish.nlf: corrections by the Mozilla.fi crew, from Mozilla bug #341643 2006-06-16 14:53 kichik * /NSIS/trunk/Source/Platform.h: avoid "statement with no effect" warnings with gcc 2006-06-16 14:12 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/crc32.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: fixed bug #1504758 - CRC32 implementation use potentially non-32bit types 2006-06-16 13:26 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript: install Irish 2006-06-16 13:18 kichik * /NSIS/trunk/Docs/src/basic.but: no wildcards for RMDir 2006-06-16 13:15 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1504297 - .onVerifyInstDir changes browsing text script executed in .onVerifyInstDir changes ps_tmpbuf which is returned by GetNSISStringTT and is used for the browsing text 2006-06-16 09:28 joostverburg * /NSIS/trunk/Contrib/Language files/Irish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Irish.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Irish language files by by Kevin Scannell (NSIS patch #1503639, Mozilla bug #340979) 2006-06-16 09:16 joostverburg * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf: standard Windows binary prefix for kilo 2006-06-16 09:10 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf: corrections by Iulian Ursache-Dogariu, from Mozilla bug #340645 2006-06-16 09:02 joostverburg * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh: Corrections by Toni Hermoso Pulido (NSIS bug #1504104, Mozilla bug #341094) 2006-06-16 08:42 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: corrections by Marek Stepien, from Mozilla bug #224532 2006-06-16 08:39 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: corrections by Michele Dal Corso, from Mozilla bug #340450 2006-06-16 07:50 kichik * /NSIS/trunk/Include/Library.nsh: fixed __InstallLib_Helper_GetVersion for POSIX 2006-06-02 19:24 kichik * /NSIS/trunk/Docs/src/build.but: better wording 2006-06-01 10:43 kichik * /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/WordFunc.nsh: updates by Instructor: * GetFileAttributes corrections * Prevent error in case of multiple header inclusion 2006-05-21 13:23 pabs3 * /NSIS/trunk/Contrib/VPatch/Readme.html: Correct path to the example in the VPatch README. 2006-05-21 13:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: text & layout fixes 2006-05-21 13:01 pabs3 * /NSIS/trunk/Docs/src/build.but: Update Sourceforge ViewCVS location. 2006-05-21 12:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: version number 2006-05-20 09:14 kichik * /NSIS/trunk/Contrib/Language files/Thai.nlf: corrections 2006-05-19 20:00 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: fixes by Milan Bast 2006-05-19 17:50 kichik * /NSIS/trunk/Scripts/release.py: no need to purge after template changes in mediawiki 1.6 2006-05-19 17:01 * /NSIS/tags/v217, /NSIS/tags/v217/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v217/Contrib/InstallOptions/resource.h, /NSIS/tags/v217/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v217/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v217/Contrib/NSISdl/httpget.h, /NSIS/tags/v217/Source/exehead/uninst.ico, /NSIS/tags/v217/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v217'. 2006-05-19 17:01 kichik * /NSIS/trunk/Menu/images/header.gif: 2.17 2006-05-19 17:00 kichik * /NSIS/trunk/Docs/src/history.but: another fix 2006-05-19 16:56 kichik * /NSIS/trunk/Docs/src/history.but: 2.17 2006-05-19 16:27 kichik * /NSIS/trunk/Examples/makensis.nsi: typo 2006-05-19 16:04 kichik * /NSIS/trunk/Source/util.h: my_glob no longer needed 2006-05-19 15:32 kichik * /NSIS/trunk/Docs/src/sec.but: fixed bug #1491616 - missing explanation of SF_SELECTED 2006-05-19 15:30 kichik * /NSIS/trunk/Docs/src/attributes.but: typo 2006-05-19 10:51 kichik * /NSIS/trunk/Scripts/release.py: new cvs server name 2006-05-19 10:25 kichik * /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Icelandic.nsh: updates by grelli 2006-05-19 07:49 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #1481664 - RMDir can't delete read-only folders 2006-05-06 13:28 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: fixes by dumper 2006-05-03 15:43 kichik * /NSIS/trunk/Source/Platform.h: fixed bug #1481044 - Segfault with nsis 2.16 on MacOS 10.3 (ppc) 2006-04-28 15:54 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/utils.py, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/util.cpp: fixed bug #1474597 - Mac OS X 10.4 build failures 2006-04-28 13:33 kichik * /NSIS/trunk/Source/strlist.h: avoid gcc uninitialized warning 2006-04-28 13:25 kichik * /NSIS/trunk/Source/Platform.h: better HANDLE definition - pointer can be more than 32-bit 2006-04-28 13:23 kichik * /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/czlib.h: virtual destructor to avoid gcc warnings 2006-04-28 10:21 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf: fixed bug #1474587 - Hebrew typo 2006-04-18 10:40 kichik * /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp: always push something in TypeLib::GetLibVersion to avoid stack corruption 2006-04-18 10:38 kichik * /NSIS/trunk/Include/Library.nsh: fixed bug #1471341 - InstallLib misinterprets TLB version number 2006-04-15 12:51 kichik * /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: glob is no longer needed 2006-04-15 12:41 kichik * /NSIS/trunk/Source/util.cpp: initialize path 2006-04-14 10:05 kichik * /NSIS/trunk/Source/build.cpp: typo 2006-04-14 09:22 kichik * /NSIS/trunk/Docs/src/tutorial.but: fixed bug #1469306 - Typo in 2.3.2 2006-04-14 09:19 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript: fixed bug #146947 - Missing Basque and Welsh language files 2006-04-08 11:21 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: updated by Tiago Claus 2006-04-07 18:49 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: fixed bug #1466486 - typo and menu problems in MakeNSISw 2006-04-07 16:21 * /NSIS/tags/v216, /NSIS/tags/v216/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v216/Contrib/InstallOptions/resource.h, /NSIS/tags/v216/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v216/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v216/Contrib/NSISdl/httpget.h, /NSIS/tags/v216/Source/exehead/uninst.ico, /NSIS/tags/v216/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v216'. 2006-04-07 16:21 kichik * /NSIS/trunk/Source/exehead/util.h: match log_text in util.c 2006-04-07 15:33 kichik * /NSIS/trunk/SConstruct: properly quote build settings, even if they come from the command line 2006-04-07 13:54 kichik * /NSIS/trunk/Menu/images/header.gif: 2.16 2006-04-07 13:51 kichik * /NSIS/trunk/Docs/src/build.but: now supports big-endian 2006-04-07 12:37 kichik * /NSIS/trunk/Docs/src/history.but: 2.16 2006-04-07 11:00 kichik * /NSIS/trunk/Docs/src/basic.but: implemented RFE #1464446 - Big warning about RmDir /r "$INSTDIR" please 2006-04-07 10:38 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: applied patch #1465378 - Speed up NSISdl downloads 2006-04-05 18:54 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: fixed nResult warning 2006-04-05 18:52 kichik * /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/SConscript: bump version 2006-04-05 18:51 kichik * /NSIS/trunk/Include/Library.nsh: typelibs are supported 2006-04-05 18:48 kichik * /NSIS/trunk/Contrib/System/System.html: documented shift left and right 2006-04-05 18:47 kichik * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: bump version 2006-04-05 18:46 kichik * /NSIS/trunk/Source/Tests/DialogTemplate.cpp: oops, that shouldn't be there 2006-04-05 18:46 kichik * /NSIS/trunk/Source/Tests/SConscript: need util.cpp for unicode conversion on non-win32 2006-04-05 18:45 kichik * /NSIS/trunk/SCons/config.py, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/util.c: implemented RFE #1460586 - Put time stamps in the install log 2006-04-05 18:45 kichik * /NSIS/trunk/Docs/src/compilerflags.but: link to File 2006-04-05 18:44 kichik * /NSIS/trunk/Source/exehead/exec.c: size optimization 2006-04-05 18:42 kichik * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp: automatically pass makensis build settings to script 2006-04-05 18:42 kichik * /NSIS/trunk/Source/Plugins.cpp: use CResourceEditor helper methods 2006-04-05 18:40 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: another sanity check 2006-04-05 18:39 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: fixed a crash while adding resources when there are named resources 2006-04-05 18:35 kichik * /NSIS/trunk/Contrib/Language files/Basque.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Basque.nsh, /NSIS/trunk/Docs/src/credits.but: Basque language files 2006-04-05 18:34 kichik * /NSIS/trunk/Docs/src/basic.but: fixed bug #1448374 - Nonsensical behavior from File /r 2006-04-05 18:32 kichik * /NSIS/trunk/Docs/src/silent.but: fixed bug #1077439 - nonstandatd behavior of example for command line parameters 2006-04-05 18:31 kichik * /NSIS/trunk/Docs/src/chmlink.js: fixed bug #1449879 - NSIS User Manual script error 2006-04-05 15:22 kichik * /NSIS/trunk/Source/fileform.cpp: properly calculate number of language strings 2006-03-28 18:22 kichik * /NSIS/trunk/Source/script.cpp: make !define /date prints act like !define /math 2006-03-28 18:20 kichik * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: implemented RFE #1459210 - !define /date should use UTC added /utcdate flag 2006-03-28 17:02 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1459789 - Incorrect FileOpen input validation 2006-03-25 19:43 kichik * /NSIS/trunk/Source/build.cpp: big-endian compatibility for uninstall_generate 2006-03-25 19:31 kichik * /NSIS/trunk/Source/build.cpp: use new generate_unicons_offsets 2006-03-25 19:30 kichik * /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: big-endian compatibility for generate_unicons_offsets also a bit refactored using methods from CResourceEditor 2006-03-25 18:50 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: extracted GetResourceDirectory and made it and GetNTHeaders public 2006-03-25 17:44 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: fixed virtual address adjustment calculation 2006-03-25 17:31 kichik * /NSIS/trunk/Source/Tests/ResourceEditor.cpp: original data of MakeLangID.exe, without aligned virtual section size 2006-03-25 17:30 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: set resource section's virtual size to its unaligned size 2006-03-25 17:24 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: big-endian compatibility could have been better, but due to lack of time, original code base and the fact that it works, i'm happy with it 2006-03-25 16:29 kichik * /NSIS/trunk/Source/util.cpp: write little-endian values in replace_icon 2006-03-25 11:46 kichik * /NSIS/trunk/Docs/src/SConscript: CHM depends on style.css, chmlink.js and nsis.hhp 2006-03-25 11:35 kichik * /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: minor fixes by Martin Srebotnjak 2006-03-24 21:32 kichik * /NSIS/trunk/Source/Tests/DialogTemplate.cpp, /NSIS/trunk/Source/Tests/ResourceEditor.cpp, /NSIS/trunk/Source/Tests/SConscript: tests for CResourceEditor and CDialogTemplate 2006-03-24 18:36 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h: big-endian compatibility 2006-03-24 18:15 kichik * /NSIS/trunk/Source/util.cpp: fixed compile errors and warnings in get_executable_path 2006-03-24 16:26 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: fixed test for resource section existence 2006-03-23 17:36 kichik * /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.h: applied patch #1456861 - PatchGenerator syntax error 2006-03-17 21:23 kichik * /NSIS/trunk/Docs/src/library.but: type libraries *are* supported as long as they have a version resource 2006-03-17 21:21 kichik * /NSIS/trunk/Include/Library.nsh: a more accurate error message 2006-03-17 20:55 kichik * /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp: tabs to spaces 2006-03-17 20:55 kichik * /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp: release typelib attribute structure when exiting GetLibVersion 2006-03-17 20:33 kichik * /NSIS/trunk/Include/Library.nsh: added ClearErrors so an error will truly come from File as expected 2006-03-17 20:07 kichik * /NSIS/trunk/Include/Library.nsh: added SetFileAttribute back to remove read-only flag File only removes the read-only flag when SetOverwrite mode is set to "on", not "try" as with InstallLib 2006-03-17 12:20 kichik * /NSIS/trunk/Docs/src/library.but: a bit more support for non-Windows platforms 2006-03-17 12:15 kichik * /NSIS/trunk/Include/Library.nsh: added a minimal implementation of __InstallLib_Helper_GetVersion for non-win32 platforms, using GetDLLVersionLocal 2006-03-17 12:14 kichik * /NSIS/trunk/Source/build.cpp: define NSIS_WIN32_MAKENSIS, if makensis is compiled for win32 2006-03-17 12:01 kichik * /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/exehead/SConscript: moved _NSIS_NO_INT64_SHR test to SCons/Config/ms so it'll only be called once and not for each stub and because it's a better location being a vc specific problem 2006-03-16 17:31 kichik * /NSIS/trunk/Docs/src/build.but: oops, should be NSIS_CONFIG_CONST_DATA_PATH=no, as it should be relocatable and should for the files in the same directory 2006-03-16 17:23 kichik * /NSIS/trunk/Docs/src/build.but: when building makensis that'd be dropped in a zipped release, use NSIS_CONFIG_CONST_DATA_PATH 2006-03-15 06:51 pabs3 * /NSIS/trunk/Source/util.cpp: Make get_executable_path more portable and correct. 2006-03-14 19:53 kichik * /NSIS/trunk/Docs/src/basic.but: typo 2006-03-14 18:22 kichik * /NSIS/trunk/SCons/Config/gnu: make sure -Wl,-Map is supported by the linker mingw supports it, so only check for non-cross envs 2006-03-14 18:21 kichik * /NSIS/trunk/SCons/utils.py: should be main, not __main 2006-03-14 18:03 kichik * /NSIS/trunk/SCons/utils.py: return true if the flag is valid, not the other way around 2006-03-14 17:53 kichik * /NSIS/trunk/SCons/Config/gnu: use FlagsConfigure for -pthread 2006-03-14 17:52 kichik * /NSIS/trunk/SCons/utils.py: added FlagsConfigure for compiler and linker flags configuration 2006-03-14 17:07 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: implemented feature request #1447766 - MUI setting for transparent header labels added MUI_HEADER_TRANSPARENT_TEXT 2006-03-14 16:34 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: tabs to spaces 2006-03-14 16:04 kichik * /NSIS/trunk/Docs/src/basic.but: added a detailed explanation about File /r that can't be interpreted in more than one way 2006-03-14 14:09 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: implemented feature request #1448176 - show function support for start menu page 2006-03-14 12:29 kichik * /NSIS/trunk/Docs/src/build.but: links to pre-compiled versions 2006-03-11 18:31 kichik * /NSIS/trunk/Examples/Library.nsi: smaller test dll for faster tests 2006-03-11 18:19 kichik * /NSIS/trunk/Source/build.cpp: added missing try catch block for init_res_editor calls 2006-03-11 18:14 kichik * /NSIS/trunk/Source/util.cpp: updated update_bitmap, replace_icon and generate_uninstall_icon_data so they'll work on big-endian platforms still need to update generate_unicons_offsets 2006-03-11 18:13 kichik * /NSIS/trunk/Source/Plugins.cpp: made GetExports work on big-endian platforms as well 2006-03-11 18:12 kichik * /NSIS/trunk/Source/Platform.h: made some resource macros work with big-endian as well 2006-03-11 18:11 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Tests/endian.cpp, /NSIS/trunk/Source/util.h: moved endianity macros to Platform.h 2006-03-11 17:34 kichik * /NSIS/trunk/Source/clzma.cpp: fix for WaitForSingleObject POSIX implementation by codesquid 2006-03-11 11:37 kichik * /NSIS/trunk/Source/util.cpp: no need for iNewIconSize in replace_icon 2006-03-11 11:22 kichik * /NSIS/trunk/Source/build.cpp: endianity fixes 2006-03-11 11:21 kichik * /NSIS/trunk/Source/build.cpp: use new writers 2006-03-11 11:16 kichik * /NSIS/trunk/Source/Tests/endian.cpp: tests for 16-bit endian conversion 2006-03-11 11:15 kichik * /NSIS/trunk/Source/util.h: added 16-bit endian conversion macros 2006-03-11 11:15 kichik * /NSIS/trunk/Source/SConscript: added fileform.cpp and writer.cpp 2006-03-11 11:13 kichik * /NSIS/trunk/Source/fileform.cpp, /NSIS/trunk/Source/fileform.h: writers for header structures 2006-03-11 11:13 kichik * /NSIS/trunk/Source/writer.cpp, /NSIS/trunk/Source/writer.h: centralized classes for writing data this allows global changes to how data is written with one change currently, it only converts from big-endian to little-endian in the future, this will allow an easy transition to writing 64-bit data 2006-03-11 10:47 kichik * /NSIS/trunk/Source/clzma.cpp: synchronize ResetEvent as well 2006-03-11 10:42 kichik * /NSIS/trunk/Docs/src/ui.but: link to GetDlgItem 2006-03-10 21:42 kichik * /NSIS/trunk/Source/util.cpp: the conditions on both wIsIcon and wReserved must be met, not just on one of them 2006-03-10 15:17 pabs3 * /NSIS/trunk/SConstruct: Fix for POSIX regression due to sconf.h change. 2006-03-10 14:55 kichik * /NSIS/trunk/Source/clzma.cpp: return if the passed event handle is NULL and not when it's valid 2006-03-08 20:36 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: only report a successful download, if the downloading actually got past the headers 2006-03-08 20:25 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.cpp: fixed bug #1445735 - WinProxy headers not read by NSISdl 2006-03-08 16:44 kichik * /NSIS/trunk/SConstruct: add new line to version.h to avoid gcc warning 2006-03-08 16:14 kichik * /NSIS/trunk/Source/clzma.cpp: * never delete self on Release(), CLZMA is not a real COM class * safer destructor 2006-03-07 14:14 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Source/exehead/exec.c: export validate_filename for plug-ins 2006-03-07 14:12 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: fixed bug #1440636 - invalid folder names returned by StartMenu plug-in 2006-03-07 14:11 kichik * /NSIS/trunk/Source/exehead/util.c: size optimization 2006-03-07 14:02 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: simpler prefixing code 2006-03-06 15:15 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: added "Cancel compilation" menu item to abort current compilation by sending ctrl+c signal 2006-03-06 15:12 kichik * /NSIS/trunk/Source/makenssi.cpp: accept event as ctrl+c as well, because GenerateConsoleCtrlEvent doesn't work form a non-parent-console process 2006-03-06 15:04 kichik * /NSIS/trunk/SConstruct: added back "v" prefix to NSIS_VERSION 2006-03-04 16:18 * /NSIS/tags/v215, /NSIS/tags/v215/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v215/Contrib/InstallOptions/resource.h, /NSIS/tags/v215/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v215/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v215/Contrib/NSISdl/httpget.h, /NSIS/tags/v215/Source/exehead/uninst.ico, /NSIS/tags/v215/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v215'. 2006-03-04 16:18 kichik * /NSIS/trunk/Menu/images/header.gif: 2.15 2006-03-04 16:12 kichik * /NSIS/trunk/Docs/src/history.but: 2.15 2006-03-04 13:48 kichik * /NSIS/trunk/Source/lang.cpp: directory edit box should not be rtl as it contains mostly english 2006-03-03 09:27 kichik * /NSIS/trunk/Docs/src/build.but: note about building System with a cross compiler 2006-03-02 17:21 kichik * /NSIS/trunk/Docs/src/attributes.but: link to SetBrandingImage 2006-03-02 17:18 kichik * /NSIS/trunk/Docs/src/attributes.but: link AddBrandingImage to SetBrandingImage 2006-03-02 17:12 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1441877 - !include keeps searching include dirs even after match 2006-02-24 19:28 kichik * /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/state.h: moved NSIS_STRING from config.h to fileform.h 2006-02-24 19:21 kichik * /NSIS/trunk/Source/util.h: no more need for this evil 2006-02-24 19:19 kichik * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp: fixed bug #1434215 - #define local leaks into path settings 2006-02-24 19:17 kichik * /NSIS/trunk/SConstruct: write all defines to sconf.h which is included by config.h instead of passing them on the command line write the freaquently changing NSIS_VERSION to a separate file named version.h so only files that really need it will include it 2006-02-24 19:14 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: use NSIS_VERSION from the new automatically genereated version.h 2006-02-24 19:12 kichik * /NSIS/trunk/SCons/config.py, /NSIS/trunk/Source/exehead/config.h: move NSIS_VARS_SECTION to sconf.h 2006-02-24 19:10 kichik * /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/SConscript: write all defines to sconf.h which is included by config.h instead of passing them on the command line write the freaquently changing NSIS_VERSION to a separate file named version.h so only files that really need it will include it 2006-02-24 18:15 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1400995 - MB_TOPMOST doesn't work as first sections' instruction 2006-02-24 16:19 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/SCons/Tools/crossmingw.py, /NSIS/trunk/Source/7zip/LZMADecode.c: applied patch #1434174 - GCC 4.2 patches 2006-02-24 16:10 kichik * /NSIS/trunk/Source/script.cpp: wrong strcmp for !define /math division 2006-02-24 16:08 kichik * /NSIS/trunk/Source/Tests/preprocessor.nsi: fixed error messages and removed useless !undef's 2006-02-24 16:00 kichik * /NSIS/trunk/Source/script.cpp: sprintf into a buffer, not a random address 2006-02-24 15:55 kichik * /NSIS/trunk/Source/script.cpp: removed stray parenthesis 2006-02-24 15:52 kichik * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp: applied patch #1372561 - !define /math compile time enhancement 2006-02-24 15:09 kichik * /NSIS/trunk/Docs/src/credits.but: more credit 2006-02-24 15:06 kichik * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: applied patch #1412982 - "!if" - enhanced compile time flow control 2006-02-24 11:49 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: applied patch #1416988 - small italian translation bug 2006-02-24 11:48 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh: applied patch #1427189 - Czech grammar mistakes 2006-02-24 11:44 kichik * /NSIS/trunk/Docs/src/ui.but: fixed bug #1432423 - section 4.9.14.8 IsWindow example incorrect 2006-02-24 11:41 kichik * /NSIS/trunk/Source/dirreader.cpp: fixed bug #1431593 - dir_reader::matches uses iterator that is at end 2006-02-23 17:54 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: example moved to Examples directory 2006-02-23 11:27 pabs3 * /NSIS/trunk/Source/script.cpp: Fix 1431958: Properly convert !addincludedir paths on POSIX platforms. 2006-02-11 18:54 kichik * /NSIS/trunk/Docs/src/misc.but: added Nop 2006-02-10 10:51 kichik * /NSIS/trunk/Examples/WordFuncTest.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh: Updates by Instructor: - Added /NOUNLOAD flag for the system plugin calls. Functions that uses system plugin calls several times, now 25-75% faster. - Added tests for new WordReplace options "{", "}", "{*", "}*" 2006-02-10 10:46 kichik * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Examples/TextFunc.nsi, /NSIS/trunk/Examples/TextFuncTest.nsi, /NSIS/trunk/Examples/WordFuncTest.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/WordFunc.nsh: Updates by Instructor 1. "WordReplace" -Added options "{", "}", "{*", "}*" 2. "GetOptions" -Now sets error flag if option does not found 3. "ConfigRead" -Now sets error flag if entry does not found 4. New case sensitive functions: "WordFindS", "WordFind2XS", "WordFind3XS", "WordReplaceS", "WordAddS", "WordInsertS", "StrFilterS", "TextCompareS", "ConfigReadS", "ConfigWriteS", "GetOptionsS" 2006-02-04 15:01 kichik * /NSIS/trunk/Source/util.cpp: throw runtime_error as it's more appropriate and has the required constructor on libstdc++ as well 2006-02-01 16:55 joostverburg * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: updated by Plamen Penkov 2006-02-01 06:01 pabs3 * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct: Remember to define __BIG_ENDIAN__ for the tests as well as makensis. 2006-01-31 19:52 kichik * /NSIS/trunk/Docs/src/ui.but: fixed bug #1420352 - check box transparent background 2006-01-31 18:27 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #1420657 - RMDIR doesn't delete file with double dots prefix 2006-01-27 18:06 kichik * /NSIS/trunk/Source/exehead/util.c: check if log_dolog is set for NSIS_CONFIG_LOG_STDOUT as well 2006-01-27 17:53 kichik * /NSIS/trunk/SCons/config.py, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: added NSIS_CONFIG_LOG_STDOUT 2006-01-27 17:51 kichik * /NSIS/trunk/Source/build.cpp: pass NSIS_CONFIG_LOG_ODS to script 2006-01-27 15:57 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: fixed bug #1174742 - Icon error message is uninformative 2006-01-27 15:44 kichik * /NSIS/trunk/Source/exehead/Ui.c: richedit controls automatically set the hand cursor for links, no need to do it manually 2006-01-27 15:26 kichik * /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Breton.nsh: - Windows Vista has a LANGID for Breton (1150) - some updates 2006-01-27 13:45 pabs3 * /NSIS/trunk/SCons/Config/gnu: Fix Debian bug #350112: Use CPPDEFINES instead of broken CPPFLAGS to define __BIG_ENDIAN__ on big endian POSIX platforms. 2006-01-26 18:02 kichik * /NSIS/trunk/Docs/src/history.but: typo 2006-01-26 17:24 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Mongolian.nsh: - added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE - more updates 2006-01-24 18:08 * /NSIS/tags/v214, /NSIS/tags/v214/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v214/Contrib/InstallOptions/resource.h, /NSIS/tags/v214/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v214/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v214/Contrib/NSISdl/httpget.h, /NSIS/tags/v214/Source/exehead/uninst.ico, /NSIS/tags/v214/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v214'. 2006-01-24 18:08 kichik * /NSIS/trunk/Menu/images/header.gif: 2.14 2006-01-24 17:57 kichik * /NSIS/trunk/Source/exehead/Ui.c: check g_tmp[0] not state_language[2] 2006-01-24 17:54 kichik * /NSIS/trunk/Docs/src/history.but: 2.14 2006-01-24 17:54 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1412159 - NSIS 2.13 doesn't work on Win 95/98/NT 2006-01-24 17:31 kichik * /NSIS/trunk/Source/exehead/Ui.c: g_tmp should be at least twice NSIS_MAX_STRLEN, no matter what NSIS_MAX_STRLEN is 2006-01-21 15:59 kichik * /NSIS/trunk/SCons/config.py, /NSIS/trunk/Source/exehead/config.h: oops, quoting problems, back to config.h 2006-01-21 15:17 kichik * /NSIS/trunk/SCons/config.py, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/util.c: moved VARS_SECTION_NAME from config.h to config.py and renamed it to NSIS_VARS_SECTION 2006-01-21 12:29 * /NSIS/tags/v213, /NSIS/tags/v213/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v213/Contrib/InstallOptions/resource.h, /NSIS/tags/v213/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v213/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v213/Contrib/NSISdl/httpget.h, /NSIS/tags/v213/Source/exehead/uninst.ico, /NSIS/tags/v213/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v213'. 2006-01-21 12:29 kichik * /NSIS/trunk/SConstruct: don't install TODO.txt 2006-01-21 12:16 kichik * /NSIS/trunk/Menu/images/header.gif: 2.13 2006-01-21 12:02 kichik * /NSIS/trunk/Docs/src/history.but: clearer description 2006-01-21 11:59 kichik * /NSIS/trunk/Docs/src/credits.but: more credit 2006-01-21 11:51 kichik * /NSIS/trunk/Docs/src/history.but: 2.13 2006-01-21 11:48 kichik * /NSIS/trunk/Contrib/System/System.html: it's $LANGUAGE, not $LANG 2006-01-21 10:18 kichik * /NSIS/trunk/Docs/src/SConscript: only fix htmls when not on win32 2006-01-21 09:54 pabs3 * /NSIS/trunk/Contrib/Graphics/SConscript, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Contrib/MakeLangId/SConscript, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Contrib/NSIS Menu/SConscript, /NSIS/trunk/Contrib/UIs/SConscript, /NSIS/trunk/Contrib/VPatch/SConscript, /NSIS/trunk/Contrib/VPatch/Source/GenPat/SConscript, /NSIS/trunk/Contrib/zip2exe/SConscript, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Include/SConscript, /NSIS/trunk/INSTALL, /NSIS/trunk/SCons/config.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp: Merge patch for better installs on POSIX platforms. 2006-01-20 12:36 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: 2006 2006-01-19 18:40 kichik * /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Mongolian.nsh: *** empty log message *** 2006-01-14 16:03 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization 2006-01-14 15:55 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization 2006-01-14 15:42 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization 2006-01-14 15:32 kichik * /NSIS/trunk/Source/exehead/Ui.c: added a comment explaining the workaround 2006-01-14 15:22 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1397031 - masked checkboxes don't redraw on Windows 95 2006-01-14 13:35 kichik * /NSIS/trunk/Source/exehead/Ui.c: TreeView doesn't automatically scroll to newly added items, there's no need to manually scroll back to the top. I'd keep it just to be on the safe side, but on Windows 95, it crashes when there are no items in the TreeView. 2006-01-13 20:44 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimization (zlib is back to 34) 2006-01-13 19:56 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1209843 - $INSTDIR is empty in directory page show callback function 2006-01-13 18:45 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #1378785 - RMDir /r does not remove files with Unicode names 2006-01-13 15:24 kichik * /NSIS/trunk/Contrib/System/System.html: fixed bug #1403608 - Callback function called when host function already returned explain in documentation that the callback destination variable must be cleared 2006-01-13 14:31 kichik * /NSIS/trunk/Contrib/System/Source/System.c: fixed bug #1403601 - System plug-in heap corruption 2006-01-13 14:08 kichik * /NSIS/trunk/Scripts/release.py: update change log start time 2006-01-13 09:52 kichik * /NSIS/trunk/Scripts/release.py: comments update 2006-01-06 17:28 kichik * /NSIS/trunk/Include/LogicLib.nsh: no more need for _StrCmp 2006-01-06 16:05 kichik * /NSIS/trunk/Include/LogicLib.nsh: use StrCmpS instead of System plug-in 2006-01-06 16:00 kichik * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: applied patch #1381929 - StrCmpS - case-sensitive string comparison 2006-01-05 17:57 kichik * /NSIS/trunk/Docs/src/headers.but: better wording 2006-01-03 23:41 ballison * /NSIS/branches/UNICODE/Source/strlist.cpp, /NSIS/branches/UNICODE/Source/strlist.h: converted to using , strlen -> _tcslen, char becomes TCHAR. also used sizeof() better, for unicode compilation ability 2005-12-31 14:23 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1299100 - File /nonfatal line not seen by relative jumps 2005-12-31 14:13 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1362443 - BrandingText /TRIM* expands label a warning is displayed if the label is actually expanded 2005-12-30 15:47 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1324734 - $LANGUAGE based on locale rather than UI language 2005-12-30 13:51 kichik * /NSIS/trunk/Source/exehead/util.c: use normal file functions for wininit.ini modification - according to msdn, mmap operations can raise an exception which wasn't handled - free up a lot of bytes from .data section (no mmap API functions) - mmap size is, like allocation of a buffer, limited by available memory 2005-12-27 19:24 kichik * /NSIS/trunk/Docs/src/file.but: FileRead is limited to 1024 only on the normal builds 2005-12-27 19:22 kichik * /NSIS/trunk/Source/script.cpp: use NSIS_MAX_STRLEN-1 instead of 1023 for FileRead limit 2005-12-24 16:39 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: size optimization (zlib is back to 34/35) 2005-12-24 16:28 kichik * /NSIS/trunk/Source/exehead/util.c: size optimizations 2005-12-24 15:47 kichik * /NSIS/trunk/Examples/FileFunc.nsi: no need for SendMessage (Instructor) 2005-12-24 15:47 kichik * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Include/FileFunc.nsh: GetTime updates by Instructor - Added support for system time (UTC) - Added example how to convert time to 12-hour format AM/PM 2005-12-23 15:04 kichik * /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: removed extra spaces 2005-12-23 10:56 kichik * /NSIS/trunk/Docs/src/jumps.but: added information about relative jumps and macros 2005-12-22 16:24 kichik * /NSIS/trunk/Menu/intro.html: fixed bug #1387748 - typo in nsis menu 2005-12-17 16:51 kichik * /NSIS/trunk/Scripts/release.py: purge pages that use the templates to make sure they're updated 2005-12-17 15:05 * /NSIS/tags/v212, /NSIS/tags/v212/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v212/Contrib/InstallOptions/resource.h, /NSIS/tags/v212/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v212/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v212/Contrib/NSISdl/httpget.h, /NSIS/tags/v212/Source/exehead/uninst.ico, /NSIS/tags/v212/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v212'. 2005-12-17 15:05 kichik * /NSIS/trunk/Menu/images/header.gif: 2.12 2005-12-17 15:02 kichik * /NSIS/trunk/Scripts/release.py: don't quote the version, it drives the command line processor crazy 2005-12-17 14:43 kichik * /NSIS/trunk/Docs/src/history.but: added a missing 2.10 fix (negative values in directory page sizes) 2005-12-17 14:38 kichik * /NSIS/trunk/Docs/src/history.but: 2.12 2005-12-17 14:07 kichik * /NSIS/trunk/Docs/src/tutorial.but: corrected LogicLib.nsi link 2005-12-17 13:54 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SConstruct, /NSIS/trunk/Scripts/release.py: added "-setup" suffix to installer output file name 2005-12-15 18:53 kichik * /NSIS/trunk/SCons/Config/gnu: fixed bug #1370179 - endianness problem with FIX_ENDIAN_INT32_INPLACE 2005-12-15 18:47 kichik * /NSIS/trunk/Source/mmap.cpp: fixed bug #1380447 - Abnormal program termination while writing the uninstaller 2005-12-15 17:11 kichik * /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Breton.nsh: typos 2005-12-10 22:14 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf: translated Browse button (by Ole Stanstrup) 2005-12-10 12:01 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: wrong finish button translation in finish page text 2005-12-09 13:15 kichik * /NSIS/trunk/Source/build.cpp: applied patch #1374675 - made error message for already defined label clearer 2005-12-06 21:02 kichik * /NSIS/trunk/Docs/src/ui.but: typo 2005-12-03 09:45 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Tests/preprocessor.nsi, /NSIS/trunk/Source/tokens.cpp: applied patch #1372048 - added /NONFATAL switch to !include statement 2005-12-02 15:59 kichik * /NSIS/trunk/Docs/src/tutorial.but: added a section about logical code structures, with LogicLib examples 2005-12-02 13:37 kichik * /NSIS/trunk/Docs/src/tutorial.but: fixed bug #1366431 - Better explanation of the general concept 2005-12-02 12:05 kichik * /NSIS/trunk/Docs/src/sec.but: better wording 2005-12-02 12:04 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: typo 2005-11-26 13:06 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1331292 - browsed network root directory isn't accepted 2005-11-26 12:44 kichik * /NSIS/trunk/Source/Tests/root.txt: root instdir related bugs that cannot be automatically tested 2005-11-26 12:14 kichik * /NSIS/trunk/Source/Tests/SConscript: test scripts 2005-11-26 12:14 kichik * /NSIS/trunk/SConstruct: added TestScript for scripts which are only used for testing, and not as examples 2005-11-25 17:57 kichik * /NSIS/trunk/Scripts/release.py: qrs link 2005-11-25 11:54 kichik * /NSIS/trunk/Source/script.cpp: don't ignore multiple line comments inside ifdef'ed blocks 2005-11-25 11:50 kichik * /NSIS/trunk/Source/Tests/preprocessor.nsi: more 2005-11-25 11:33 kichik * /NSIS/trunk/Source/Tests/preprocessor.nsi: some basic preprocessor tests 2005-11-24 21:40 kichik * /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc: added missing checkbox for logging 2005-11-24 21:17 kichik * /NSIS/trunk/Source/exehead/exec.c: added 0x prefix to dword reg values 2005-11-24 19:51 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c: stop search for function body at the end of the string 2005-11-24 19:38 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/Math/Source/plugin.c: removed extra spaces at end of line 2005-11-24 19:27 kichik * /NSIS/trunk/Contrib/Math/mathtest.nsi: there's no such function as len(), only l() 2005-11-24 19:25 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c: fixed bug #1235875 - only increment initial array length when actually adding items - if array index equals array count, the count should also be raised 2005-11-24 18:16 kichik * /NSIS/trunk/Scripts/release.py: automatically update wiki pages 2005-11-24 16:58 kichik * /NSIS/trunk/Docs/src/attributes.but: typo 2005-11-24 16:50 kichik * /NSIS/trunk/Source/exehead/exec.c: ifdef to get rid of binbuf unused variable warning 2005-11-24 16:45 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: applied patch #1340255 - nicer registry commands log 2005-11-24 12:18 kichik * /NSIS/trunk/Docs/src/misc.but: add information about using SetShellVarContext in both installer and uninstaller (bug #1349810) 2005-11-14 20:25 kichik * /NSIS/trunk/Source/tokens.cpp: completed text should only accept one parameter (bug #1349810) 2005-11-14 20:06 kichik * /NSIS/trunk/Contrib/nsExec/nsExec.txt: applied patch #1355653 - /OEM switch 2005-11-12 17:29 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/zip2exe/main.cpp: call DragFinish to free memory 2005-11-12 17:24 kichik * /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/update.cpp: tabs to spaces 2005-11-12 17:23 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: don't fail silently if more than one script is dropped 2005-11-12 17:20 kichik * /NSIS/trunk/Contrib/zip2exe/res.rc: version bump 2005-11-12 17:19 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: drag & drop support 2005-11-12 15:22 * /NSIS/tags/v211, /NSIS/tags/v211/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v211/Contrib/InstallOptions/resource.h, /NSIS/tags/v211/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v211/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v211/Contrib/NSISdl/httpget.h, /NSIS/tags/v211/Source/exehead/uninst.ico, /NSIS/tags/v211/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v211'. 2005-11-12 15:22 kichik * /NSIS/trunk/Scripts/release.py: workaround for release.log permission denied IOError 2005-11-12 15:04 kichik * /NSIS/trunk/Scripts/release.py: add an empty line in another place (for some weird reason, the old log line failed after cvs tagging) 2005-11-12 14:50 kichik * /NSIS/trunk/Examples/makensis.nsi: include only needed gifs for nsis menu 2005-11-12 14:50 kichik * /NSIS/trunk/Scripts/release.py: generate the new header.gif image 2005-11-12 14:25 joostverburg * /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/header-notext.gif: for auto generation 2005-11-12 14:15 joostverburg * /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: updated for new NSIS site 2005-11-12 13:46 kichik * /NSIS/trunk/Scripts/release.py: better palette for header.gif 2005-11-12 12:54 kichik * /NSIS/trunk/Docs/src/history.but: removed double parenthesis 2005-11-12 12:42 kichik * /NSIS/trunk/Docs/src/history.but: better wording 2005-11-12 12:34 kichik * /NSIS/trunk/Scripts/release.py: updated to-update links list 2005-11-12 12:31 kichik * /NSIS/trunk/Scripts/release.py: no more need for get.gif 2005-11-12 12:30 kichik * /NSIS/trunk/Scripts/release.py: add version to release log file name 2005-11-12 10:46 kichik * /NSIS/trunk/SCons/Config/gnu: use a cross-compile environment to test for memcpy and memset 2005-11-11 21:47 kichik * /NSIS/trunk/Docs/src/history.but: changelog for 2.11 2005-11-11 21:39 kichik * /NSIS/trunk/Source/tokens.cpp: missing SW_HIDE for ExecShell 2005-11-11 21:37 kichik * /NSIS/trunk/Docs/src/int.but: wrong result for bitwise not (part of bug #1349810) 2005-11-11 21:31 kichik * /NSIS/trunk/Source/util.cpp: UCS-2LE is not the default on all platforms, so this needs to be explicit 2005-11-11 21:29 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: check for CB_ERR return value from CB_GETITEMDATA 2005-11-11 21:27 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: when $LANGUAGE doesn't match any passed language, select the first language, not some random garbage from the stack 2005-11-09 08:41 kichik * /NSIS/trunk/INSTALL: support links 2005-11-08 21:49 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: fixed bug #1349853 - zip2exe ignores zip timestamps 2005-11-08 20:20 kichik * /NSIS/trunk/Examples/makensis.nsi: support url (rfe #1349867) 2005-11-08 19:52 kichik * /NSIS/trunk/Docs/src/library.but: missing comma 2005-11-08 19:51 kichik * /NSIS/trunk/Docs/src/defines.but: clarity 2005-11-08 19:50 kichik * /NSIS/trunk/Docs/src/compilerflags.but: typo 2005-11-08 19:46 kichik * /NSIS/trunk/Docs/src/sections.but: SectionGroup syntax correction 2005-11-08 19:30 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/SConscript: freebsd portability 2005-11-06 17:04 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: improvements by Martin Srebotnjak 2005-11-06 14:21 joostverburg * /NSIS/trunk/Contrib/Language files/Slovenian.nlf: improvements by Martin Srebotnjak 2005-11-05 23:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: solid compression no longer the default 2005-11-05 16:57 joostverburg * /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Include/Library.nsh: * no need to call ClearErrors after IfErrors * documented error flag for Library macros 2005-11-05 16:08 joostverburg * /NSIS/trunk/Include/Library.nsh: clear errors after checking whether file is in use 2005-11-05 14:07 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1338423 - SetOverwrite ifdiff fails with FAT 2005-11-05 13:51 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: proper clean-up in case of path detection failure 2005-11-05 13:50 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: proper clean-up in case of bad input 2005-11-05 13:41 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: fixed bad input test 2005-11-05 13:39 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: search for /TIMEOUT= only at the beginning of the input string 2005-11-05 13:22 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: applied patch #1346737 - OEM nsExec 2005-11-05 12:19 kichik * /NSIS/trunk/Source/tokens.cpp: applied patch #1348473 - ChangeUI discrepancy 2005-11-04 11:20 kichik * /NSIS/trunk/Include/FileFunc.nsh: VersionCompare is not part of FileFunc.nsh it's part of WordFunc.nsh 2005-10-27 20:41 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1314004 - Copy details to clipboard can crash 2005-10-27 19:31 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: LicenseLangString example 2005-10-26 19:01 joostverburg * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Examples/bigtest.nsi: language improvements 2005-10-25 14:32 kichik * /NSIS/trunk/Source/exehead/Ui.c: use TreeView_* instead of TVM_*, it looks nicer 2005-10-25 13:09 kichik * /NSIS/trunk/Contrib/Graphics/Checks/red.bmp: width should be 96, not 95 2005-10-22 16:52 kichik * /NSIS/trunk/Docs/src/attributes.but: added InstallDirRegKey examples 2005-10-22 15:53 kichik * /NSIS/trunk/Source/Plugins.cpp: - extracted reading an entire file to function read_file - using vector for file contents 2005-10-22 14:46 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp: cosmetics 2005-10-22 13:40 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp: dir_readers' memory now freed by boost::scoped_ptr 2005-10-22 13:25 kichik * /NSIS/trunk/Source/exehead/Main.c: it's SHGetSpecialFolderLocation not SHGetSpecialFolderPath 2005-10-22 12:06 kichik * /NSIS/trunk/Contrib/Makensisw/resource.rc: toolbar24h.bmp is english as well 2005-10-22 12:05 kichik * /NSIS/trunk/Contrib/MakeLangId/MakeLangId.xml, /NSIS/trunk/Contrib/MakeLangId/resource.rc, /NSIS/trunk/Contrib/MakeLangId/SConscript: added manifest for xp style 2005-10-22 11:55 kichik * /NSIS/trunk/Contrib/LangDLL/resource.rc: sort the combo box 2005-10-22 11:54 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: don't relay on the order in the combo box 2005-10-22 11:38 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: use same style for all blocks 2005-10-22 11:37 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: free the allocated memory 2005-10-22 11:31 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: clean-up on ok and cancel as well, not only close 2005-10-22 11:26 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c: added comments 2005-10-21 21:54 kichik * /NSIS/trunk/Docs/src/headers.but: no GetLongPathName on 95 2005-10-21 20:54 * /NSIS/branches/UNICODE, /NSIS/branches/UNICODE/Contrib/ExDLL/exdll.dsw, /NSIS/branches/UNICODE/Contrib/InstallOptions/resource.h, /NSIS/branches/UNICODE/Contrib/Makensisw/makensisw.xml, /NSIS/branches/UNICODE/Contrib/NSISdl/asyncdns.h, /NSIS/branches/UNICODE/Contrib/NSISdl/httpget.h, /NSIS/branches/UNICODE/Source/exehead/uninst.ico, /NSIS/branches/UNICODE/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create branch 'UNICODE'. 2005-10-21 20:54 kichik * /NSIS/trunk/Source/exehead/Main.c: fixed bug #1008632 - some special folders don't always work in Windows 9x 2005-10-21 16:07 kichik * /NSIS/trunk/Docs/src/sec.but: missing backslash 2005-10-21 15:47 kichik * /NSIS/trunk/Include/Sections.nsh: added flag descriptions 2005-10-21 15:45 kichik * /NSIS/trunk/Docs/src/sec.but: added a note about sections.nsh 2005-10-21 14:24 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: handle /NOIEPROXY, even if /PROXY is used 2005-10-21 14:16 kichik * /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: added information about /PROXY 2005-10-21 14:06 kichik * /NSIS/trunk/Contrib/zip2exe/res.rc: tabs to spaces 2005-10-21 14:05 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: applied patch #1334166 - nsisdl: /PROXY switch 2005-10-21 13:55 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: updated history 2005-10-21 13:53 kichik * /NSIS/trunk/Contrib/zip2exe/Base.nsh, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h: applied patch #1334155 - zip2exe: checkbox for solid compression 2005-10-20 19:36 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: provide stdin to keep xcopy happy 2005-10-18 13:12 kichik * /NSIS/trunk/Source/lang.cpp: use NLF_STRINGS_NO_SPECIAL instead of NLF_STRINGS - 3, as the number three can easily change 2005-10-18 13:12 kichik * /NSIS/trunk/Source/lang.h: added NLF_STRINGS_NO_SPECIAL, number of real NLF strings, not including special strings not defined in the NLF 2005-10-18 12:04 kichik * /NSIS/trunk/Docs/src/script.but: added inline comment example 2005-10-17 13:39 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1328629 - Explicitly setting $LANGUAGE does not operate as expected 2005-10-16 12:52 icemank * /NSIS/trunk/Source/lineparse.cpp: Fixed #ifdef blocks. 2005-10-16 12:50 icemank * /NSIS/trunk/SCons/config.py: Fixed indentations. 2005-10-16 05:37 icemank * /NSIS/trunk/SCons/config.py, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lineparse.cpp: Fixed comment handling. 2005-10-13 14:49 kichik * /NSIS/trunk/SCons/Config/ms: original LIB is used, no need to remove #/.sconf_temp 2005-10-13 13:33 kichik * /NSIS/trunk/SCons/Config/ms: don't add /GX to defenv 2005-10-13 13:16 kichik * /NSIS/trunk/SCons/Config/ms: added workaround for Platform SDK's libcp.lib 2005-10-12 14:40 kichik * /NSIS/trunk/Source/script.cpp: use my_convert in !delfile 2005-10-12 14:26 kichik * /NSIS/trunk/Include/LogicLib.nsh: fixed bug #1320297 - LogicLib.nsh portability issues 2005-10-12 14:24 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: added !appendfile 2005-10-12 13:50 kichik * /NSIS/trunk/Docs/src/attributes.but: no language strings and variables with InstallDirRegKey 2005-10-12 13:32 kichik * /NSIS/trunk/Source/zlib/INFBLOCK.C: possible .data optimization 2005-10-12 11:10 kichik * /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh: extract RegTool with the random data as well 2005-10-11 20:04 kichik * /NSIS/trunk/Source/exehead/util.c: typo 2005-10-11 16:47 kichik * /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh: * strip quotes and /S from RegTool's RunOnce key before checking if it exists * added random data to the extraction name of RegTool to avoid problems with install->reboot->install->reboot 2005-10-11 16:31 kichik * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: updated change log 2005-10-11 16:27 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/testnotify.nsi: write HWND and HWND2 entries to the INI with the control's HWND no more weird calculations when there's a browse button 2005-10-10 11:45 kichik * /NSIS/trunk/SCons/Tools/mstoolkit.py: Platfrom SDK's headers and libraries are newer than VC Toolkit's 2005-10-08 21:13 kichik * /NSIS/trunk/SConstruct: output an error message for SCons 0.96.90 or older, instead of a TypeError exception 2005-10-08 10:27 joostverburg * /NSIS/trunk/Contrib/UIs/modern.rc: larger browse button, localized texts will fit in better 2005-10-07 15:45 kichik * /NSIS/trunk/Source/script.cpp: no need for 'SectionIn RO' to be case sensitive 2005-10-07 13:41 kichik * /NSIS/trunk/Source/script.cpp: proper umask 2005-10-07 13:23 kichik * /NSIS/trunk/Include/Library.nsh: write temporary nsh to temp dir to avoid permission problems with unprivileged users 2005-10-07 13:21 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: get output file from command line 2005-10-07 13:08 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: added !tempfile and !delfile 2005-10-05 13:47 kichik * /NSIS/trunk/SCons/Config/gnu: workaround for scons bug - use CPPDEFINES in RCCOM 2005-10-05 13:42 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: use CPPDEFINES in RCCOM 2005-10-04 14:14 kichik * /NSIS/trunk/Scripts/release.py: wrong package name 2005-10-04 14:06 kichik * /NSIS/trunk/Scripts/release.py: upload files to /incoming 2005-10-04 13:46 kichik * /NSIS/trunk/Scripts/release.py: * create_special_build takes 2 arguments, not 3 * use log_dir in log() 2005-10-04 13:25 kichik * /NSIS/trunk/Scripts/release.py: no need for log_dir='..' for scons call of special build 2005-10-04 13:12 kichik * /NSIS/trunk/Scripts/release.py: missing comma 2005-10-04 12:58 * /NSIS/tags/v210, /NSIS/tags/v210/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v210/Contrib/InstallOptions/resource.h, /NSIS/tags/v210/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v210/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v210/Contrib/NSISdl/httpget.h, /NSIS/tags/v210/Source/exehead/uninst.ico, /NSIS/tags/v210/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v210'. 2005-10-04 12:58 kichik * /NSIS/trunk/Scripts/release.py: fixed installation diff test 2005-10-04 12:46 kichik * /NSIS/trunk/Scripts/release.py: missing comma 2005-10-04 12:22 kichik * /NSIS/trunk/Menu/images/header.gif: 2.10 2005-10-04 12:16 kichik * /NSIS/trunk/Scripts/release.py: exit on failure 2005-10-04 12:05 kichik * /NSIS/trunk/Docs/src/history.but: 2.10 2005-10-04 11:18 kichik * /NSIS/trunk/Source/exehead/util.c: validate_filename was called before skip_root in is_valid_instpath and so no root directory was ever valid, even with AllowRootDirInstall 2005-10-03 10:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh: updates by QFox 2005-09-24 15:50 kichik * /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/SConscript: POSIX portability 2005-09-24 15:49 kichik * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/SConscript: use AddAvailableLibs 2005-09-24 15:48 kichik * /NSIS/trunk/SCons/utils.py: useful function, for now only AddAvailableLibs 2005-09-24 11:41 kichik * /NSIS/trunk/SCons/Config/gnu: no optimizations and symbol stripping in debug mode 2005-09-24 11:38 kichik * /NSIS/trunk/Source/Plugins.cpp: don't use NormalizedCommand in IsPluginCommand, it asserts on non-existing plug-in commands 2005-09-24 11:20 kichik * /NSIS/trunk/Source/Tests/mmap.cpp: size2 is changed on POSIX 2005-09-23 15:06 kichik * /NSIS/trunk/INSTALL: added links to optional tools 2005-09-23 10:17 kichik * /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Source/tokens.cpp: documented /ENABLECANCEL 2005-09-23 10:08 kichik * /NSIS/trunk/Source/script.cpp: missing \0 in enum 2005-09-22 20:20 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: fixed compile warning 2005-09-22 20:20 kichik * /NSIS/trunk/Source/clzma.cpp: fixed memory leaks in POSIX implementation 2005-09-20 17:42 kichik * /NSIS/trunk/Contrib/VPatch/Source/Plugin/checksum.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/md5.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c: fixed portability 2005-09-20 17:35 kichik * /NSIS/trunk/Source/Platform.h: WS_EX_LEFTSCROLLBAR needed by MinGW 2005-09-20 17:32 kichik * /NSIS/trunk/SCons/Config/gnu: only mingw supports --file-alignment 2005-09-20 17:15 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Chapter4.html no longer exists 2005-09-17 17:41 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html: typos 2005-09-17 17:38 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp: VPatch 3.1 2005-09-17 09:55 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Source/DialogTemplate.cpp: fixed bug #1283528 - WS_EX_LEFTSCROLLBAR missing in RTL mode 2005-09-17 09:43 kichik * /NSIS/trunk/Contrib/VPatch/Source/GenPat/SConscript: compile GenPat natively 2005-09-17 09:43 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SConstruct: added support for compilation of cross platform utilities 2005-09-17 09:25 kichik * /NSIS/trunk/Contrib/VPatch/example.nsi, /NSIS/trunk/Contrib/VPatch/GenPat.exe, /NSIS/trunk/Contrib/VPatch/patch.pat, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Contrib/VPatch/SConscript, /NSIS/trunk/Contrib/VPatch/Source/GenPat/adler32.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/adler32.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/Checksums.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/Checksums.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/ChunkedFile.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/FileFormat1.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/FileFormat1.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GenPat2.dpr, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GlobalTypes.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/main.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/md5.c, /NSIS/trunk/Contrib/VPatch/Source/GenPat/md5.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.pas, /NSIS/trunk/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp, /NSIS/trunk/Contrib/VPatch/Source/GenPat/POSIXUtil.h, /NSIS/trunk/Contrib/VPatch/Source/GenPat/SConscript, /NSIS/trunk/Contrib/VPatch/Source/GenPat/TreeCode.pas, /NSIS/trunk/Contrib/VPatch/Source/GenPat/VAppend.dpr, /NSIS/trunk/Contrib/VPatch/Source/GenPat/vdsp_crc.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/AboutForm.dfm, /NSIS/trunk/Contrib/VPatch/Source/GUI/clean.bat, /NSIS/trunk/Contrib/VPatch/Source/GUI/DLLWrapper.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/MainForm.dfm, /NSIS/trunk/Contrib/VPatch/Source/GUI/MainForm.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/OSUtil.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/PatchClasses.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/vdsp_crc.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatch.ico, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.bdsproj, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.cfg, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.dof, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.dpr, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.res, /NSIS/trunk/Contrib/VPatch/Source/Plugin/apply_patch.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/apply_patch.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/checksum.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/checksum.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/md5.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/md5.h, /NSIS/trunk/Contrib/VPatch/Source/Plugin/SConscript, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Contrib/VPatch/Source/VPatch2.bpg, /NSIS/trunk/Contrib/VPatch/VPatchLib.nsh, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/SConstruct: VPatch 3.0 2005-09-17 08:50 kichik * /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/NSISdl/SConscript, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/SConstruct: use True/False instead of 1/0 2005-09-17 08:33 kichik * /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/SConscript: moved _WIN32_IE definition to SConscript to avoid #include order problems 2005-09-16 16:27 kichik * /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/exehead/Ui.c: use Int64ShrlMod32 on compiles that generate a call to __aullshr from 64-bit shift 2005-09-16 16:19 kichik * /NSIS/trunk/Source/SConscript: libiconv is iconv 2005-09-16 16:05 kichik * /NSIS/trunk/Source/exehead/Ui.c: better and uniform rounding of required/available size display 2005-09-16 16:02 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: updated for scons 0.96.91 2005-09-16 11:27 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.txt, /NSIS/trunk/Contrib/AdvSplash/Example.nsi, /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Math/Math.txt, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/NSIS Menu/src/msw/app.cpp, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Contrib/Splash/Example.nsi, /NSIS/trunk/Contrib/Splash/splash.txt, /NSIS/trunk/Contrib/System/WhatsNew.txt, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/silent.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.txt, /NSIS/trunk/Scripts/release.py, /NSIS/trunk/Source/mmap.cpp: typos (thanks Jamyn!) 2005-09-15 18:37 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: typo 2005-09-15 18:36 kichik * /NSIS/trunk/INSTALL: appendix number is subject to change, use name 2005-09-13 19:24 kichik * /NSIS/trunk/Contrib/Makensisw/resource.rc: fixed bug #1288159 - Bad mnemonic key in makensisw menu 2005-09-13 19:19 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: fixed bug #1287731 - FileRequest alters working directory 2005-09-09 19:12 kichik * /NSIS/trunk/Source/exehead/Ui.c: - avoid overflow when calculating the digit after the decimal dot - use BOOL isntead of int in SetSizeText 2005-09-09 17:26 kichik * /NSIS/trunk/Source/exehead/Ui.c: moved "shlwapi.dll" and "SHAutoComplete" to .rdata from .data (constified them) 2005-09-09 16:45 kichik * /NSIS/trunk/Source/exehead/Ui.c: break glass in case of emergency (e.g. .rdata overflows) 2005-09-09 16:32 kichik * /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/exehead/util.h: my_GlobalAlloc no longer reduces the size 2005-09-09 16:08 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: my_GlobalAlloc no longer reduces the size 2005-09-09 15:21 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: size optimization 2005-09-09 14:29 kichik * /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h: size optimization 2005-09-09 12:13 kichik * /NSIS/trunk/Source/exehead/Ui.c: round required space up instead of down (thanks Ippi) 2005-09-09 09:18 kichik * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/System.c: fixed build warnings 2005-09-09 08:42 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed SHACF_FILESYSTEM redefinition warning 2005-09-09 08:20 kichik * /NSIS/trunk/INSTALL: updated required version numbers 2005-09-08 19:19 kichik * /NSIS/trunk/Contrib/Language files/Slovenian.nlf: $($^Name) is a typo, it should be $(^Name) 2005-09-08 19:17 kichik * /NSIS/trunk/Scripts/release.py: use log_dir for log() and exit() as well 2005-09-08 19:15 kichik * /NSIS/trunk/Scripts/release.py: write zip logs to correct folder 2005-09-08 18:36 kichik * /NSIS/trunk/Contrib/Language files/Thai.nlf: fixed typos (SoKoOLz) 2005-09-08 17:52 kichik * /NSIS/trunk/SCons/Config/gnu: fixed in scons 0.96.91 2005-09-08 16:48 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/SConstruct: scons 0.96.91 is required 2005-09-06 16:57 kichik * /NSIS/trunk/Source/Platform.h: fixed mingw compile errors (missing SHACF_FILESYSTEM) 2005-09-04 21:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: Modern UI 1.74: Fixed compile error when checkboxes are used on multiple finish page pages 2005-09-03 13:30 kichik * /NSIS/trunk/Scripts/release.py: fixed small errors 2005-09-03 13:29 kichik * /NSIS/trunk/Scripts, /NSIS/trunk/Scripts/release.py: a script to automatically release new versions 2005-09-02 17:08 kichik * /NSIS/trunk/SCons/config.py: moved most of config.h into SConstruct 2005-09-02 16:15 kichik * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/SConscript: moved most of config.h into SConstruct 2005-09-02 11:35 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/Platform.h: added auto completion to the directory page 2005-09-01 17:56 kichik * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf: typo 2005-09-01 17:56 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SerbianLatin.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2005-08-30 16:30 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp: fixed build errors and warnings caused by latest merge 2005-08-27 19:56 oripel * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: merged from PIEPIEPIE branch: - min/max macros removed - Plugins refactored - more functions in util.{h,cpp} 2005-08-27 19:48 oripel * /NSIS/branches/PIEPIEPIE/Source/build.cpp, /NSIS/branches/PIEPIEPIE/Source/clzma.cpp, /NSIS/branches/PIEPIEPIE/Source/growbuf.cpp, /NSIS/branches/PIEPIEPIE/Source/lang.cpp, /NSIS/branches/PIEPIEPIE/Source/Platform.h, /NSIS/branches/PIEPIEPIE/Source/Plugins.cpp, /NSIS/branches/PIEPIEPIE/Source/Plugins.h, /NSIS/branches/PIEPIEPIE/Source/ResourceEditor.cpp, /NSIS/branches/PIEPIEPIE/Source/ResourceEditor.h, /NSIS/branches/PIEPIEPIE/Source/script.cpp, /NSIS/branches/PIEPIEPIE/Source/util.cpp, /NSIS/branches/PIEPIEPIE/Source/util.h: - refactored class Plugins - fixed 'min' and 'max' macro evilness - added some useful functions to util.{h,cpp} 2005-08-26 16:45 * /NSIS/tags/v209: This commit was manufactured by cvs2svn to create tag 'v209'. 2005-08-26 16:45 * /NSIS/branches/PIEPIEPIE, /NSIS/branches/PIEPIEPIE/Contrib/ExDLL/exdll.dsw, /NSIS/branches/PIEPIEPIE/Contrib/InstallOptions/resource.h, /NSIS/branches/PIEPIEPIE/Contrib/Makensisw/makensisw.xml, /NSIS/branches/PIEPIEPIE/Contrib/NSISdl/asyncdns.h, /NSIS/branches/PIEPIEPIE/Contrib/NSISdl/connection.h, /NSIS/branches/PIEPIEPIE/Contrib/NSISdl/httpget.h, /NSIS/branches/PIEPIEPIE/Source/exehead/uninst.ico, /NSIS/branches/PIEPIEPIE/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create branch 'PIEPIEPIE'. 2005-08-26 16:45 kichik * /NSIS/trunk/Docs/src/history.but: 2.09 changelog 2005-08-26 10:10 kichik * /NSIS/trunk/SConstruct: Library.nsi example requires %WINDIR% environment variable 2005-08-26 09:45 kichik * /NSIS/trunk/Menu/images/header.gif: 2.09 2005-08-23 17:45 kichik * /NSIS/trunk/Examples/WordFuncTest.nsi, /NSIS/trunk/Include/WordFunc.nsh: (Instructor) WordReplace - Fixed: Incorrect rule for return errorlevel 1 in situation when string beginning with word to replace and its only one word in string and when uses option - deletes all found words 2005-08-19 12:02 kichik * /NSIS/trunk/SConstruct: added -signed suffix to signed distribution files 2005-08-17 12:36 joostverburg * /NSIS/trunk/Contrib/Graphics/Wizard/arrow.bmp: removed rounded edges 2005-08-14 11:17 kichik * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi: applied part of patch #1248335 for greater portability 2005-08-14 10:44 kichik * /NSIS/trunk/SConstruct: added CODESIGNER option to enable executable digital signing 2005-08-11 20:29 kichik * /NSIS/trunk/SConstruct: no support for Python 1.5.2 2005-08-11 15:58 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript: Malaysian -> Malay 2005-08-11 15:56 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: added extern "C" to DllMain so gcc will find it (patch #1255671) 2005-08-09 15:30 joostverburg * /NSIS/trunk/Contrib/Language files/Malay.nlf, /NSIS/trunk/Contrib/Language files/Malaysian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Malay.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Malaysian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: updated Malay language files 2005-08-06 17:14 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: Modern UI 1.73 changelog 2005-08-06 16:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed checkboxes on uninstaller finish page or multiple finish pages use Var /GLOBAL 2005-08-06 16:23 kichik * /NSIS/trunk/Examples/LogicLib.nsi: no more need for these defines 2005-08-06 16:22 kichik * /NSIS/trunk/Include/LogicLib.nsh: use Var /GLOBAL to avoid annoying warning 2005-08-06 16:12 kichik * /NSIS/trunk/Include/Library.nsh: use Var /GLOBAL to avoid annoying warning 2005-08-06 16:04 kichik * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Var can now be used in sections and functions, but only with the /GLOBAL flag 2005-08-06 12:47 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: size optimization: added __stdcall wrapper for lstrcat 2005-08-06 12:43 kichik * /NSIS/trunk/Source/exehead/Main.c: set initial working directory of the uninstaller to its temporary directory so RMDir will be able to delete $INSTDIR 2005-08-05 15:27 kichik * /NSIS/trunk/SCons/Config/linker_script: replaced with a complete linker script taken from ld --verbose 2005-08-05 15:27 kichik * /NSIS/trunk/SCons/Config/gnu: linker script is defined using -T, not -Wl 2005-08-05 13:14 kichik * /NSIS/trunk/SCons/Config/gnu: DllMain's name is _DllMain@12, not _DllMain@16 2005-08-05 12:52 kichik * /NSIS/trunk/SCons/Config/gnu: added -mwindows to plug-ins linkage 2005-08-04 21:04 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Luxembourgish.nsh: proper case 2005-07-30 12:33 kichik * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: get rid of extra spaces in is_valid_instpath so "C:\ " will not be valid 2005-07-29 15:08 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Docs/src/var.but: plugin -> plug-in 2005-07-28 17:58 kichik * /NSIS/trunk/Examples/Library.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/SConscript: added Library macros test which makes a good syntax example too 2005-07-28 17:56 kichik * /NSIS/trunk/Include/Library.nsh: fixed check for DONE label requirement 2005-07-28 17:30 kichik * /NSIS/trunk/Include/Library.nsh: define uninstalllib.done label only when really needed 2005-07-28 17:25 kichik * /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh: fixed bug #1243865 - *_UNIQUE should use ${__FILE__} 2005-07-28 16:56 kichik * /NSIS/trunk/Include/FileFunc.nsh: workaround for GetLongPathName 2005-07-27 20:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Kurdish.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2005-07-26 17:41 joostverburg * /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Docs/src/credits.but: updated Thai language files by SoKoOLz 2005-07-23 13:51 * /NSIS/tags/v208, /NSIS/tags/v208/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v208/Contrib/InstallOptions/resource.h, /NSIS/tags/v208/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v208/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v208/Contrib/NSISdl/connection.h, /NSIS/tags/v208/Contrib/NSISdl/httpget.h, /NSIS/tags/v208/Source/exehead/uninst.ico, /NSIS/tags/v208/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v208'. 2005-07-23 13:51 kichik * /NSIS/trunk/Examples/makensis.nsi: install new header files and examples 2005-07-23 13:49 kichik * /NSIS/trunk/Menu/images/header.gif: 2.08 2005-07-23 13:07 kichik * /NSIS/trunk/Source/script.cpp: when looking for branding image place holder, look for "Static" class too (windres...) 2005-07-23 12:33 kichik * /NSIS/trunk/Include/FileFunc.nsh: GetLongPathName is not available on Windows 95 2005-07-23 12:31 kichik * /NSIS/trunk/Docs/src/history.but: history for 2.08 2005-07-23 11:23 kichik * /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript: distribute Kurdish language files 2005-07-23 10:29 kichik * /NSIS/trunk/Docs/src/usage.but: implemented RFE #1240601 - documentation of command line switches 2005-07-23 10:06 kichik * /NSIS/trunk/Docs/src/credits.but: added Kurdish 2005-07-22 21:10 kichik * /NSIS/trunk/Contrib/System/System.html: callbacks are created using System::Get, not System::Call 2005-07-22 18:47 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: wParam should be of type WPARAM, not LPARAM 2005-07-22 17:42 kichik * /NSIS/trunk/Contrib/zip2exe/zlib/adler32.c, /NSIS/trunk/Contrib/zip2exe/zlib/crc32.c, /NSIS/trunk/Contrib/zip2exe/zlib/crypt.h, /NSIS/trunk/Contrib/zip2exe/zlib/inffast.c, /NSIS/trunk/Contrib/zip2exe/zlib/inflate.c, /NSIS/trunk/Contrib/zip2exe/zlib/inflate.h, /NSIS/trunk/Contrib/zip2exe/zlib/inftrees.c, /NSIS/trunk/Contrib/zip2exe/zlib/inftrees.h, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.c, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.h, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/Contrib/zip2exe/zlib/zconf.h, /NSIS/trunk/Contrib/zip2exe/zlib/zlib.h, /NSIS/trunk/Contrib/zip2exe/zlib/zutil.c, /NSIS/trunk/Contrib/zip2exe/zlib/zutil.h: zlib 1.2.3 2005-07-22 17:37 kichik * /NSIS/trunk/Source/lang.cpp: use language name in missing LangString warning, if possible 2005-07-21 17:01 kichik * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Include/FileFunc.nsh: updates 2005-07-21 16:36 joostverburg * /NSIS/trunk/Contrib/Language files/Luxembourgish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Luxembourgish.nsh: corrections by Philo 2005-07-21 16:31 joostverburg * /NSIS/trunk/Contrib/Language files/Kurdish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Kurdish.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Kurdish language files by Erdal Ronahi 2005-07-21 16:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Default.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2005-07-21 15:54 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: corrections by SuperPat 2005-07-21 15:50 joostverburg * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf: corrections by Dmitriy Kononchuk 2005-07-19 19:14 kichik * /NSIS/trunk/SConstruct: pass res_target to AppendRES 2005-07-16 15:29 kichik * /NSIS/trunk/Examples/makensis.nsi: added InstallOptions readme to start menu group 2005-07-16 10:14 kichik * /NSIS/trunk/SConstruct: cleaned up a bit 2005-07-16 10:09 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms: add $MAP_FLAG to all envs 2005-07-16 10:03 kichik * /NSIS/trunk/Contrib/UIs/SConscript: pass a new list of source for every built ui 2005-07-15 14:55 kichik * /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh: updates 2005-07-15 10:45 kichik * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/ui.but: fixed bug #1238686 - DetailPrint misspelled 2005-07-09 15:56 kichik * /NSIS/trunk/Examples/waplugin.nsi: don't fail compiling, if winamp is not installed 2005-07-09 15:56 kichik * /NSIS/trunk/SConstruct: use $PROGSUFFIX instead of '.exe' 2005-07-09 10:45 kichik * /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/modern_headerbmp.rc, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.rc, /NSIS/trunk/Contrib/UIs/modern_nodesc.rc, /NSIS/trunk/Contrib/UIs/modern_smalldesc.rc, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc: passed rc files through msvc to fix compatibility with mingw 2005-07-09 10:11 kichik * /NSIS/trunk/Contrib/UIs/SConscript, /NSIS/trunk/SConstruct: alias `UIs` target to UIs 2005-07-08 09:49 kichik * /NSIS/trunk/SCons/Config/gnu: if emitter is a list of emitters, take the first and only emitter 2005-07-07 20:13 kichik * /NSIS/trunk/SConstruct: don't build tests by default to avoid an error about CppUnit missing 2005-07-07 17:56 kichik * /NSIS/trunk/Include/Library.nsh: fixed bug #1234283 - InstallLib fails on paths with spaces 2005-07-03 11:22 joostverburg * /NSIS/trunk/Menu/docs.html: fixed link to Modern UI Readme 2005-07-02 17:53 kichik * /NSIS/trunk/SCons/Config/linker_script, /NSIS/trunk/SCons/Config/memcpy.c, /NSIS/trunk/SCons/Config/memset.c: files needed by gnu configuration 2005-07-02 17:53 kichik * /NSIS/trunk/SCons/Config/gnu: * use a nicer method to replace the emitter * don't write required files on runtime, added them to cvs 2005-07-02 16:49 kichik * /NSIS/trunk/Source/makenssi.cpp: gcc doesn't like sending a temporary string object by reference 2005-07-02 16:40 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: include util.h for Unicode conversion functions 2005-07-02 13:15 kichik * /NSIS/trunk/Source/makenssi.cpp: extracted some functions from main() 2005-07-02 13:07 kichik * /NSIS/trunk/Docs/src/var.but: more information about Var limitations 2005-07-02 12:53 kichik * /NSIS/trunk/Source/makenssi.cpp: applied patch #1223041 - add a per-user config file 2005-07-01 21:24 kichik * /NSIS/trunk/Source/Plugins.cpp: use dir_reader for Plugins::FindCommands 2005-07-01 21:08 kichik * /NSIS/trunk/Source/script.cpp: use dir_reader for !include 2005-07-01 20:40 kichik * /NSIS/trunk/Docs/src/compiler.but: added link from !include to !addincludedir 2005-06-30 20:47 kichik * /NSIS/trunk/Source/exehead/util.c: set error flag for invalid directories passed to myDelete (fixes bug #1227553) 2005-06-30 19:51 kichik * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/var.but: variable names are no longer case sensitive 2005-06-30 19:23 kichik * /NSIS/trunk/Contrib/Language files/Bosnian.nlf, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Modern UI/Language files/Bosnian.nsh, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Bosnian translation by Salih CAVKIC 2005-06-30 19:11 kichik * /NSIS/trunk/Include/UpgradeDLL.nsh: use new RegTool (also fixes bug #1230336) 2005-06-30 19:01 kichik * /NSIS/trunk/Include/Library.nsh: added missing Pop $R3 2005-06-30 18:52 kichik * /NSIS/trunk/Include/Library.nsh: moved installlib.end label after __InstallLib_Helper_AddRegToolEntry macro insertion 2005-06-30 18:16 kichik * /NSIS/trunk/Docs/src/callback.but: fixed .onMouseOverSection example 2005-06-30 17:43 kichik * /NSIS/trunk/Docs/src/build.but: added a note about big-endian platforms 2005-06-30 17:18 kichik * /NSIS/trunk/Docs/src/ui.but: typos 2005-06-28 19:57 kichik * /NSIS/trunk/Docs/src/compiler.but: fixed bug #1227610 - !packhdr example missing dollar sign 2005-06-28 19:18 kichik * /NSIS/trunk/Docs/src/attributes.but: misplaed 'is' 2005-06-25 16:22 kichik * /NSIS/trunk/Source/exehead/Main.c: fix for patch #1214319 - Uninstaller fails due to DLLs in temp folder 2005-06-24 17:26 kichik * /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/modern_headerbmp.rc, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.rc, /NSIS/trunk/Contrib/UIs/modern_nodesc.rc, /NSIS/trunk/Contrib/UIs/modern_smalldesc.rc, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc: WS_VISIBLE is the default, NOT WS_VISIBLE must be specified 2005-06-24 15:49 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h: no `using namespace` in header file 2005-06-24 15:44 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: no need for #include "util.h" 2005-06-24 13:12 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: limit MultiByteToWideChar to the real size available, not the total 2005-06-24 10:52 kichik * /NSIS/trunk/SConstruct: added `test-scripts` target 2005-06-24 10:51 kichik * /NSIS/trunk/Source/Tests/SConscript: renamed target to `test-code` and made conf test alias the target to an error 2005-06-23 22:34 kichik * /NSIS/trunk/Source/exehead/Main.c: look for _?= in the entire command line in case realcmds skipped the first and only space as a question mark is an invalid character in file names, this method shouldn't have false positives 2005-06-23 20:48 kichik * /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Include/Sections.nsh: converted archive links to wiki links 2005-06-23 20:10 kichik * /NSIS/trunk/Contrib/zip2exe/res.rc: fixed bug #1226381 - zip2exe restricts extraction path length 2005-06-23 19:06 kichik * /NSIS/trunk/SConstruct: one less TODO 2005-06-23 11:37 kichik * /NSIS/trunk/Source/Tests/Tests.dsp: replaced by scons 2005-06-23 11:24 kichik * /NSIS/trunk/Contrib/Library/RegTool/RegTool.bin, /NSIS/trunk/Contrib/Library/RegTool/RegTool.c, /NSIS/trunk/Contrib/Library/RegTool/RegTool.nsi, /NSIS/trunk/Contrib/Library/RegTool/SConscript, /NSIS/trunk/Include/Library.nsh: Library improvements with lots of help from stb: - InstallLib will register DLLs after reboot in the order they were specified in the script - InstallLib will register every DLL on reboot if the reboot flag is already set - rewrote RegTool in C - RegTool compiles from source code - RegTool will not run when double clicked - RegTool will register each DLL on a separate process to avoid conflicts 2005-06-22 21:45 kichik * /NSIS/trunk/SConstruct: fixed indention 2005-06-22 21:37 kichik * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/Tests/SConscript: added 'test' target 2005-06-22 15:55 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/default.rc, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern.rc, /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmp.rc, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.rc, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.rc, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.rc, /NSIS/trunk/Contrib/UIs/resource.h, /NSIS/trunk/Contrib/UIs/SConscript, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.rc, /NSIS/trunk/Contrib/UIs/UI Holder, /NSIS/trunk/Contrib/UIs/ui.c, /NSIS/trunk/SConstruct: build UIs from source 2005-06-22 15:47 kichik * /NSIS/trunk/Source/exehead/resource.rc: caption is not needed for license dialogs 2005-06-22 14:49 kichik * /NSIS/trunk/SCons/Config/gnu: added linker script to assure correct order of sections 2005-06-21 22:18 kichik * /NSIS/trunk/Docs/src/bin/halibut/input.c: applied patch #1225167 - halibut fails on macro usage at beginning of line 2005-06-21 21:46 kichik * /NSIS/trunk/Docs/src/library.but: fixed bug #1202495 - Incorrect DLL name in appendix B.4 Visual Basic Runtimes 2005-06-21 21:38 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: added comma 2005-06-21 21:35 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: fixed System readme path and added link 2005-06-21 21:22 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: added comma 2005-06-21 21:13 kichik * /NSIS/trunk/Docs/src/build.but: typo 2005-06-21 20:52 kichik * /NSIS/trunk/Source/exehead/exec.c: MSDN says RegQueryValueEx might not always return null terminated strings 2005-06-21 17:43 kichik * /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Include/SConscript: header files of useful functions (Instructor) 2005-06-21 15:00 kichik * /NSIS/trunk/Docs/src/build.but: added information on building CHM docs 2005-06-21 12:37 kichik * /NSIS/trunk/Docs/src/headers.but, /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/Examples/FileFunc.ini, /NSIS/trunk/Examples/FileFunc.nsi, /NSIS/trunk/Examples/FileFuncTest.nsi, /NSIS/trunk/Examples/TextFunc.ini, /NSIS/trunk/Examples/TextFunc.nsi, /NSIS/trunk/Examples/TextFuncTest.nsi, /NSIS/trunk/Examples/WordFunc.ini, /NSIS/trunk/Examples/WordFunc.nsi, /NSIS/trunk/Examples/WordFuncTest.nsi, /NSIS/trunk/Include/FileFunc.nsh, /NSIS/trunk/Include/TextFunc.nsh, /NSIS/trunk/Include/WordFunc.nsh: header files of useful functions (Instructor) 2005-06-20 20:13 * /NSIS/tags/v207, /NSIS/tags/v207/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v207/Contrib/InstallOptions/resource.h, /NSIS/tags/v207/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v207/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v207/Contrib/NSISdl/connection.h, /NSIS/tags/v207/Contrib/NSISdl/httpget.h, /NSIS/tags/v207/Source/exehead/uninst.ico, /NSIS/tags/v207/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v207'. 2005-06-20 20:13 kichik * /NSIS/trunk/Include/LogicLib.nsh: del /q doesn't work on Windows 98 and on XP it only means not to ask on global wildcard deletion, which LogicLib doesn't do anyway 2005-06-20 19:54 kichik * /NSIS/trunk/Include/Library.nsh: RegTool.bin is in Bin 2005-06-20 19:48 kichik * /NSIS/trunk/Docs/src/history.but: updated history 2005-06-20 16:03 kichik * /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/modernui.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/var.but: updated links for new directory structure 2005-06-20 14:07 kichik * /NSIS/trunk/Menu/index.html: align folders and websites sections 2005-06-20 12:46 kichik * /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp: back-ported fixes from nsisdl 2005-06-20 10:16 kichik * /NSIS/trunk/Docs/src/build.but: added information about dist targets 2005-06-20 08:56 kichik * /NSIS/trunk/Contrib/Makensisw/update.cpp, /NSIS/trunk/Contrib/Makensisw/update.h: update source code 2005-06-19 21:45 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: applied patch #1220277 with the help of veekee 2005-06-19 21:39 kichik * /NSIS/trunk/Contrib/AdvSplash/Example.nsi, /NSIS/trunk/Contrib/InstallOptions/testimgs.nsi, /NSIS/trunk/Contrib/Splash/Example.nsi, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: fixed for new paths 2005-06-19 21:04 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed bug #1221772 - Welcome Page icon overlap 2005-06-19 20:35 kichik * /NSIS/trunk/SConstruct: fixed exception when VER_* is not passed 2005-06-19 17:01 kichik * /NSIS/trunk/SConstruct: added `dist-zip` (same as old `dist`) and `dist-installer` targets 2005-06-19 17:00 kichik * /NSIS/trunk/Examples/makensis.nsi: updated for new build system 2005-06-19 13:55 kichik * /NSIS/trunk/Menu/update.html: replaced NSIS Update with MakeNSISw and added a mention about the nightly build 2005-06-19 13:47 kichik * /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/websites.html: updated links 2005-06-19 13:46 kichik * /NSIS/trunk/Menu/docs.html: install documentation and examples 2005-06-19 12:32 kichik * /NSIS/trunk/Contrib/VPatch/Source/Plugin/SConscript: install documentation and examples 2005-06-19 12:31 kichik * /NSIS/trunk/SConstruct: fixed build of `dist` target when PREFIX is not empty 2005-06-19 11:43 kichik * /NSIS/trunk/Contrib/System/SConscript: distribute Resource.dll 2005-06-19 11:42 kichik * /NSIS/trunk/Contrib/NSISdl/SConscript: distribute License.txt 2005-06-19 11:41 kichik * /NSIS/trunk/Contrib/InstallOptions/SConscript: distribute Changelog.txt 2005-06-19 11:26 kichik * /NSIS/trunk/SConstruct: use RegTool's new SConscript 2005-06-19 11:26 kichik * /NSIS/trunk/Contrib/Library/RegTool/SConscript: basic SConscript that just copies RegTool.bin 2005-06-19 11:20 kichik * /NSIS/trunk/Contrib/Makensisw/SConscript: distribute documents 2005-06-19 11:19 kichik * /NSIS/trunk/SConstruct: added docs and examples support for BuildUtil 2005-06-19 11:15 kichik * /NSIS/trunk/SConstruct: distribute nsisconf.nsh 2005-06-19 11:13 kichik * /NSIS/trunk/Examples/SConscript: distribute makensis.ini 2005-06-19 11:12 kichik * /NSIS/trunk/SConstruct: distribute license 2005-06-19 11:02 kichik * /NSIS/trunk/Examples/SConscript: removed cvsdata.nsi 2005-06-19 11:02 kichik * /NSIS/trunk/Examples/cvsdata.nsi: no longer needed as cvs contains no binaries 2005-06-19 11:00 kichik * /NSIS/trunk/SConstruct: removed NSIS Update 2005-06-19 10:59 kichik * /NSIS/trunk/Contrib/NSIS Update: moved update back to makensisw as there's no point in having an entire application just to check for a new version (downloading from cvs is no longer possible because it contains no binaries) 2005-06-19 10:56 kichik * /NSIS/trunk/Contrib/Makensisw/jnetlib, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/SConscript: moved update back to makensisw 2005-06-19 09:35 kichik * /NSIS/trunk/Docs/src/tutorial.but: fixed bug #1220940 - grammatical error 2005-06-19 09:26 kichik * /NSIS/trunk/Docs/src/credits.but: applied patch #1223362 - Updated credits (obucina) 2005-06-18 19:45 kichik * /NSIS/trunk/Docs/src/SConscript: get style.css from build dir 2005-06-18 11:37 kichik * /NSIS/trunk/Contrib/Language files/Estonian.nlf: Changed details button to begin with capital letter like other buttons. 2005-06-17 18:39 kichik * /NSIS/trunk/SConstruct: reverted DISTDIR to nsis-$VERSION as it's the name of the folder in the zip file 2005-06-17 18:38 kichik * /NSIS/trunk/SConstruct: NSIS Menu now has a SConscript 2005-06-17 18:38 kichik * /NSIS/trunk/Contrib/NSIS Menu/SConscript: install NSIS Menu, no building for now 2005-06-17 18:27 kichik * /NSIS/trunk/SConstruct: always delete .dist folder 2005-06-17 18:20 kichik * /NSIS/trunk/SConstruct: better name for dist temporary directory ($VERSION wasn't replaced) 2005-06-17 14:03 kichik * /NSIS/trunk/Source/SConscript: only pass -DNSIS_VERSION to files that actually use it 2005-06-17 14:02 kichik * /NSIS/trunk/SConstruct: get version from command line and default to "date.cvs" to avoid creation of "official" releases 2005-06-13 19:39 kichik * /NSIS/trunk/Contrib/NSISdl/netinc.h: delete [] x is more correct, although it doesn't really matter with our implementation of new and delete 2005-06-07 19:07 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: typo 2005-06-03 18:45 kichik * /NSIS/trunk/Source/script.cpp: bail on output name that starts with a quote 2005-06-02 16:32 kichik * /NSIS/trunk/Docs/src/basic.but: explain about /oname with spaces 2005-05-28 18:52 * /NSIS/tags/v207b0, /NSIS/tags/v207b0/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v207b0/Contrib/InstallOptions/resource.h, /NSIS/tags/v207b0/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v207b0/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v207b0/Contrib/NSISdl/connection.h, /NSIS/tags/v207b0/Contrib/NSISdl/httpget.h, /NSIS/tags/v207b0/Docs/src/build.bat, /NSIS/tags/v207b0/Source/exehead/uninst.ico, /NSIS/tags/v207b0/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v207b0'. 2005-05-28 18:52 kichik * /NSIS/trunk/INSTALL: short source build and installation help file 2005-05-28 18:48 kichik * /NSIS/trunk/Docs/src/build.but: double build 2005-05-28 18:37 kichik * /NSIS/trunk/SConstruct: read version from external file 2005-05-28 18:34 kichik * /NSIS/trunk/Menu/images/header.gif: 2.07 2005-05-28 17:59 kichik * /NSIS/trunk/Docs/src/build.bat: replaced by scons 2005-05-28 17:56 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/tutorial.but: updated links to point to the new Building NSIS appendix 2005-05-28 17:55 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: removed Compiling NSIS Sources section 2005-05-28 17:55 kichik * /NSIS/trunk/Docs/src/build.but, /NSIS/trunk/Docs/src/SConscript: added Building NSIS appendix 2005-05-28 14:37 kichik * /NSIS/trunk/Include/WinMessages.nsh: L shouldn't be there 2005-05-28 13:45 kichik * /NSIS/trunk/SConstruct: clean DISTDIR after zipping for a clean release 2005-05-27 10:18 kichik * /NSIS/trunk/Include/WinMessages.nsh: a more complete list by Shengalts Aleksander 2005-05-24 20:43 kichik * /NSIS/trunk/Docs/src/silent.but: typo 2005-05-24 19:09 kichik * /NSIS/trunk/Docs/src/SConscript: style.css wasn't copied to the build directory 2005-05-21 16:21 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.dsp, /NSIS/trunk/Contrib/AdvSplash/advsplash.dsw, /NSIS/trunk/Contrib/Banner/Banner.dsp, /NSIS/trunk/Contrib/Banner/Banner.dsw, /NSIS/trunk/Contrib/BgImage/BgImage.dsp, /NSIS/trunk/Contrib/BgImage/BgImage.dsw, /NSIS/trunk/Contrib/Dialer/dialer.dsp, /NSIS/trunk/Contrib/Dialer/dialer.dsw, /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Contrib/InstallOptions/io.dsw, /NSIS/trunk/Contrib/LangDLL/LangDLL.dsp, /NSIS/trunk/Contrib/LangDLL/LangDLL.dsw, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.dsp, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.dsw, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.dsp, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.dsw, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.dsp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.dsw, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsw, /NSIS/trunk/Contrib/nsExec/nsExec.dsp, /NSIS/trunk/Contrib/nsExec/nsExec.dsw, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsw, /NSIS/trunk/Contrib/Splash/splash.dsp, /NSIS/trunk/Contrib/Splash/splash.dsw, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsp, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsw, /NSIS/trunk/Contrib/UserInfo/UserInfo.dsp, /NSIS/trunk/Contrib/UserInfo/UserInfo.dsw, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.dsp, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.dsw, /NSIS/trunk/Contrib/zip2exe/zip2exe.dsp, /NSIS/trunk/Contrib/zip2exe/zip2exe.dsw, /NSIS/trunk/Docs/src/bin/halibut/makefile, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-lzma.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/exehead/Makefile, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/makenssi.dsw: replaced by scons 2005-05-21 15:37 kichik * /NSIS/trunk/SConstruct: set default value of CHMDOCS to 'yes' if hhc.exe is found in PATH 2005-05-21 14:07 kichik * /NSIS/trunk/SConstruct: added CHMDOCS option 2005-05-21 14:05 kichik * /NSIS/trunk/Docs/src/SConscript: added an option to build html documentation 2005-05-21 13:27 kichik * /NSIS/trunk/SConstruct: added SKIPSTUBS, SKIPPLUGINS, SKIPUTILS and SKIPMISC to allow skipping certain parts of the build process 2005-05-21 13:14 kichik * /NSIS/trunk/SConstruct: MAP_FLAG no longer requires target name as a parameter 2005-05-21 13:13 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms: MAP_FLAG no longer needs to be a function 2005-05-21 13:11 kichik * /NSIS/trunk/SCons/Config/gnu: automatically generate map file name with proper path 2005-05-21 13:05 kichik * /NSIS/trunk/Contrib/NSISdl/SConscript: cppused = 1 so stdlib is included when needed 2005-05-21 13:04 kichik * /NSIS/trunk/SConstruct: added cppused argument for BuildPlugin 2005-05-21 13:03 kichik * /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms: added CPP_REQUIRES_STDLIB flag 2005-05-21 10:59 kichik * /NSIS/trunk/SCons/Config/gnu: missing colon 2005-05-20 12:00 kichik * /NSIS/trunk/Docs/src/credits.but: credits for Welsh translation 2005-05-20 11:59 kichik * /NSIS/trunk/SConstruct: no more need for MINGWPREFIX 2005-05-20 11:23 kichik * /NSIS/trunk/SCons/Config/gnu: use cross compiler tool definition 2005-05-20 11:23 kichik * /NSIS/trunk/SCons/Tools/crossmingw.py: tool for cross-compiling mingw 2005-05-20 11:11 kichik * /NSIS/trunk/Contrib/Language files/Welsh.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Welsh.nsh: Welsh translation by Rhoslyn Prys 2005-05-19 16:35 kichik * /NSIS/trunk/Source/util.h: stringify the define itself, not its name 2005-05-17 19:52 kichik * /NSIS/trunk/Source/exehead/Ui.c: reset $INSTDIR if user clicked cancel in the browse dialog 2005-05-14 17:52 kichik * /NSIS/trunk/SCons/Tools/mstoolkit.py: search harder for the platform sdk 2005-05-14 15:57 kichik * /NSIS/trunk/Contrib/Makensisw/icon.ico, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/SConscript: icon for makensisw copied from Contrib\Graphics\Icons 2005-05-12 16:49 kichik * /NSIS/trunk/Contrib/Makensisw/afxres.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: _WIN32_IE 0x0400 where needed 2005-05-12 16:49 kichik * /NSIS/trunk/Contrib/Makensisw/resource.rc: proper case for icon path 2005-05-12 16:27 kichik * /NSIS/trunk/SConstruct, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/SConscript, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.h: made NSIS_VERSION a define set by the scons script 2005-05-11 17:20 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: use DEFAULT_CHARSET for dialog fonts by default 2005-05-11 16:50 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: fixed string skip in ReadVarLenArr 2005-05-11 16:20 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: free return value of CDialogTemplate::Save() using delete[] 2005-05-11 14:51 kichik * /NSIS/trunk/Contrib/Language files/Breton.nlf: commented credits 2005-05-10 20:30 kichik * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: set chm_toc and chm_ind to NULL after closing them 2005-05-10 19:15 kichik * /NSIS/trunk/Source/script.cpp: Call :label is valid in uninstall sections too 2005-05-07 13:44 kichik * /NSIS/trunk/SCons/Config/gnu: --file-alignment is MinGW specific 2005-05-07 13:32 kichik * /NSIS/trunk/SCons/Config/gnu: restore LINKFLAGS after test is done 2005-05-07 05:33 kichik * /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/Platform.h: implemented RFE #1172123 - $LOCALAPPDATA 2005-05-06 10:23 kichik * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/System.h: don't typedef struct twice 2005-05-06 10:19 kichik * /NSIS/trunk/Contrib/Math/Source/MyMath.c: fixed inclusion of mathcrt.h on case sensitive platforms 2005-05-06 10:15 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: define _WIN32_IE for TBN_DROPDOWN, TBDDRET_DEFAULT and TBDDRET_NODEFAULT 2005-05-06 09:57 kichik * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: don't use _MAX_PATH, it's not defined on POSIX 2005-05-06 09:51 kichik * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: first check if the the file was successfully opened, then try opening the other files 2005-05-05 21:09 kichik * /NSIS/trunk/SCons/Config/gnu: add funcs.c only when NODEFLIBS_FLAG is used 2005-05-05 20:25 kichik * /NSIS/trunk/Source/exehead/util.c: SCons/Config/gnu now takes care of adding memcpy if it's needed 2005-05-05 20:25 kichik * /NSIS/trunk/SCons/Config/gnu: check if gcc requires memcpy or memset and add them to crt-less builds 2005-05-03 17:31 kichik * /NSIS/trunk/Contrib/AdvSplash/SConscript, /NSIS/trunk/Contrib/ExDLL/exdll.h: applied parts of patch #1193692 - fixes to scons Contrib stuff 2005-04-30 18:04 kichik * /NSIS/trunk/Contrib/AdvSplash/SConscript, /NSIS/trunk/Contrib/Banner/SConscript, /NSIS/trunk/Contrib/BgImage/SConscript, /NSIS/trunk/Contrib/Dialer/SConscript, /NSIS/trunk/Contrib/Graphics/SConscript, /NSIS/trunk/Contrib/InstallOptions/SConscript, /NSIS/trunk/Contrib/Language files/SConscript, /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/Modern UI/SConscript, /NSIS/trunk/Contrib/nsExec/SConscript, /NSIS/trunk/Contrib/NSISdl/SConscript, /NSIS/trunk/Contrib/Splash/SConscript, /NSIS/trunk/Contrib/StartMenu/SConscript, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/UIs/SConscript, /NSIS/trunk/Contrib/UserInfo/SConscript, /NSIS/trunk/Contrib/zip2exe/SConscript, /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/Examples/SConscript, /NSIS/trunk/Include/SConscript, /NSIS/trunk/SConstruct: install and distribute examples, contribs and documentation 2005-04-29 09:16 kichik * /NSIS/trunk/SCons/Config/gnu: use g++ for linking on mingw, not ld 2005-04-28 17:37 kichik * /NSIS/trunk/Examples/SConscript, /NSIS/trunk/SConstruct: install examples 2005-04-26 20:40 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: update by Dmitry 2005-04-24 20:02 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.rc: no need for afxres.h, windows.h is enough 2005-04-24 17:23 kichik * /NSIS/trunk/Docs/src/bin/halibut/SConscript, /NSIS/trunk/SConstruct: use our default environment for building halibut 2005-04-24 16:34 kichik * /NSIS/trunk/Docs/src/bin/halibut/SConscript, /NSIS/trunk/Docs/src/bin/halibut/version.c: don't pass version as define 2005-04-24 16:04 kichik * /NSIS/trunk/Docs/src/bin/halibut/SConscript: let scons handle quotes 2005-04-24 15:27 kichik * /NSIS/trunk/Contrib/Dialer/SConscript: delayimp is no longer needed 2005-04-24 15:20 kichik * /NSIS/trunk/Contrib/MakeLangId/resource.rc: no need for afxres.h, windows.h is enough 2005-04-23 20:26 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: added support for solid compression selection 2005-04-23 20:21 kichik * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: don't call FreeLibrary on a module "loaded" with GetModuleHandle 2005-04-23 20:18 kichik * /NSIS/trunk/Source/script.cpp: fixed SetCompressor handling 2005-04-23 20:08 kichik * /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: tabs to spaces 2005-04-23 19:22 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: simpler OEM conversion 2005-04-23 19:15 kichik * /NSIS/trunk/Contrib/zip2exe/SConscript: use new zlib files 2005-04-23 19:14 kichik * /NSIS/trunk/Contrib/zip2exe/zlib, /NSIS/trunk/Contrib/zip2exe/zlib/adler32.c, /NSIS/trunk/Contrib/zip2exe/zlib/crc32.c, /NSIS/trunk/Contrib/zip2exe/zlib/crc32.h, /NSIS/trunk/Contrib/zip2exe/zlib/crypt.h, /NSIS/trunk/Contrib/zip2exe/zlib/inffast.c, /NSIS/trunk/Contrib/zip2exe/zlib/inffast.h, /NSIS/trunk/Contrib/zip2exe/zlib/inffixed.h, /NSIS/trunk/Contrib/zip2exe/zlib/inflate.c, /NSIS/trunk/Contrib/zip2exe/zlib/inflate.h, /NSIS/trunk/Contrib/zip2exe/zlib/inftrees.c, /NSIS/trunk/Contrib/zip2exe/zlib/inftrees.h, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.c, /NSIS/trunk/Contrib/zip2exe/zlib/ioapi.h, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/unzip.h, /NSIS/trunk/Contrib/zip2exe/zlib/zconf.h, /NSIS/trunk/Contrib/zip2exe/zlib/zlib.h, /NSIS/trunk/Contrib/zip2exe/zlib/zutil.c, /NSIS/trunk/Contrib/zip2exe/zlib/zutil.h: new zlib version (1.2.2) with lower case file names 2005-04-23 19:13 kichik * /NSIS/trunk/Contrib/zip2exe/zlib: removed old version with upper case names 2005-04-22 17:29 kichik * /NSIS/trunk/SConstruct: more useful aliases 2005-04-22 16:51 kichik * /NSIS/trunk/Contrib/AdvSplash/SConscript, /NSIS/trunk/Contrib/Banner/SConscript, /NSIS/trunk/Contrib/BgImage/SConscript, /NSIS/trunk/Contrib/Dialer/SConscript, /NSIS/trunk/Contrib/InstallOptions/SConscript, /NSIS/trunk/Contrib/LangDLL/SConscript, /NSIS/trunk/Contrib/Library/TypeLib/SConscript, /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/nsExec/SConscript, /NSIS/trunk/Contrib/NSIS Update/SConscript, /NSIS/trunk/Contrib/NSISdl/SConscript, /NSIS/trunk/Contrib/Splash/SConscript, /NSIS/trunk/Contrib/StartMenu/SConscript, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/UserInfo/SConscript, /NSIS/trunk/Contrib/VPatch/Source/Plugin/SConscript, /NSIS/trunk/SConstruct: less code in SConscripts, more shared code in SConstruct 2005-04-22 16:12 kichik * /NSIS/trunk/SConstruct: alias util name to building it, not installing it 2005-04-21 19:52 kichik * /NSIS/trunk/SConstruct: added CPPPATH and LIBPATH options 2005-04-21 17:46 kichik * /NSIS/trunk/SConstruct: - build debug and release in different directories - added 'install' alias - converted build_prefix and prefix to environment variables 2005-04-21 17:44 kichik * /NSIS/trunk/Docs/src/SConscript: use $PREFIX instead of prefix 2005-04-21 17:40 kichik * /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms: added debug configuration 2005-04-21 14:25 kichik * /NSIS/trunk/Examples/bigtest.nsi: bin2h was removed 2005-04-21 14:22 kichik * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/VersionInfo.nsi: applied patch #1184571 - Some fixes to the examples (case sensitive filenames) 2005-04-19 21:03 kichik * /NSIS/trunk/SConstruct: added prefix option 2005-04-19 20:02 kichik * /NSIS/trunk/Plugins: no more compiled binaries in CVS 2005-04-19 20:00 kichik * /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/SConstruct: Math compiles 2005-04-19 19:58 kichik * /NSIS/trunk/Contrib/Math/Source/plugin.c: fixed mingw compile errors 2005-04-19 19:58 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/MyMath.h: fixed vc6 compile errors 2005-04-19 19:58 kichik * /NSIS/trunk/SConstruct: set default empty value for MINGWPREFIX 2005-04-19 19:40 kichik * /NSIS/trunk/Contrib/Math/Source/Math.c: bug fixes by brainsucker 2005-04-19 18:10 kichik * /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h: fixed compile error without NSIS_CONFIG_COMPONENTPAGE 2005-04-16 18:58 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.exe, /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Plugins/advsplash.dll, /NSIS/trunk/Plugins/Banner.dll, /NSIS/trunk/Plugins/BgImage.dll, /NSIS/trunk/Plugins/Dialer.dll, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/LangDLL.dll, /NSIS/trunk/Plugins/nsExec.dll, /NSIS/trunk/Plugins/nsisdl.dll, /NSIS/trunk/Plugins/splash.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Plugins/System.dll, /NSIS/trunk/Plugins/TypeLib.dll, /NSIS/trunk/Plugins/UserInfo.dll, /NSIS/trunk/Plugins/VPatch.dll: no more compiled binaries in CVS 2005-04-16 18:48 kichik * /NSIS/trunk/Contrib/AdvSplash/SConscript, /NSIS/trunk/Contrib/Banner/SConscript, /NSIS/trunk/Contrib/BgImage/SConscript, /NSIS/trunk/Contrib/Dialer/SConscript, /NSIS/trunk/Contrib/InstallOptions/SConscript, /NSIS/trunk/Contrib/LangDLL/SConscript, /NSIS/trunk/Contrib/Library/LibraryLocal/SConscript, /NSIS/trunk/Contrib/Library/TypeLib/SConscript, /NSIS/trunk/Contrib/MakeLangId/SConscript, /NSIS/trunk/Contrib/Makensisw/SConscript, /NSIS/trunk/Contrib/Math/SConscript, /NSIS/trunk/Contrib/nsExec/SConscript, /NSIS/trunk/Contrib/NSIS Update/SConscript, /NSIS/trunk/Contrib/NSISdl/SConscript, /NSIS/trunk/Contrib/Splash/SConscript, /NSIS/trunk/Contrib/StartMenu/SConscript, /NSIS/trunk/Contrib/System/SConscript, /NSIS/trunk/Contrib/UserInfo/SConscript, /NSIS/trunk/Contrib/VPatch/Source/Plugin/SConscript, /NSIS/trunk/Contrib/zip2exe/SConscript, /NSIS/trunk/Docs/src/bin/halibut/SConscript, /NSIS/trunk/Docs/src/SConscript, /NSIS/trunk/SCons, /NSIS/trunk/SCons/Config, /NSIS/trunk/SCons/Config/default, /NSIS/trunk/SCons/Config/gnu, /NSIS/trunk/SCons/Config/ms, /NSIS/trunk/SCons/Tools, /NSIS/trunk/SCons/Tools/mstoolkit.py, /NSIS/trunk/SConstruct, /NSIS/trunk/Source/exehead/SConscript, /NSIS/trunk/Source/SConscript: new build system using SCons 2005-04-16 18:26 kichik * /NSIS/trunk/Include/Library.nsh: use LibraryLocal.exe from Bin directory 2005-04-16 18:24 kichik * /NSIS/trunk/Include/Library.nsh: fixed bug #1181951 - InstallLib error for new shared libraries 2005-04-16 17:09 kichik * /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c: no inline in c 2005-04-16 17:09 kichik * /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/System.h: use #ifdef instead of #pragma once 2005-04-16 17:08 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp: replaced WinMain with main 2005-04-16 17:07 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: include ctype.h for tolower 2005-04-16 16:37 kichik * /NSIS/trunk/Contrib/Dialer/dialer.c: manually use LoadLibrary and GetProcAddress instead of /DELAYLOAD 2005-04-16 10:53 kichik * /NSIS/trunk/Docs/src/tutorial.but: better sentence 2005-04-15 22:11 kichik * /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp: use wsprintf instead of itoa for smaller code size 2005-04-12 17:27 kichik * /NSIS/trunk/Docs/src/bin/halibut/contents.c: applied patch #1180886 - fix halibut segfaults on powerpc (and maybe other platforms) 2005-04-08 17:41 kichik * /NSIS/trunk/Source/exehead/util.c: fixed bug #1073792 - RMDir /REBOOTOK sets reboot flag when folder doesn't exist 2005-04-08 16:57 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #1123353 - `WindowIcon off` crashes makensis 2005-04-08 15:29 kichik * /NSIS/trunk/Source/exehead/exec.c: fixed bug #1119442 - CreateDirectory sets error flag with paths containing "\\" 2005-04-08 14:45 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/util.cpp: applied patch #1179116 - debian amd64/gcc-4.0 build fixes 2005-04-08 14:36 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1168711 - when leaving the directory page, only set log_dolog if the check box was created 2005-04-08 14:27 kichik * /NSIS/trunk/Source/exehead/exec.c: made ExpandEnvStrings set the error flag as the documentation says it should 2005-04-08 14:26 kichik * /NSIS/trunk/Docs/src/registry.but: added information about non-existing environment variables used in ExpandEnvStrings 2005-04-08 14:04 kichik * /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/exehead/exec.c: fixed bug #1178756 - EnumRegValue now sets the error flag if the enumeration index is out of range 2005-04-08 10:30 kichik * /NSIS/trunk/Include/Colors.nsh: some more useful macros 2005-04-08 09:21 kichik * /NSIS/trunk/Contrib/Language files/Malaysian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Malaysian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new Malaysian translation 2005-04-02 12:32 kichik * /NSIS/trunk/Source/exehead/bin2h.c, /NSIS/trunk/Source/exehead/bin2h.exe: no longer needed 2005-04-02 12:14 kichik * /NSIS/trunk/Docs/src/compilerflags.but: added information about SetCompressor /SOLID 2005-04-02 12:04 kichik * /NSIS/trunk/Examples/makensis.nsi: use solid compression 2005-04-02 12:04 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exedata.cpp, /NSIS/trunk/Source/exedata.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: - stubs are no longer included in makensis but read from the Stubs directory - new /SOLID switch for SetCompressor allows setting solid compression without recompiling makensis 2005-04-02 11:23 kichik * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c: added NSISCALL to functions used in the stub (EXEHEAD) 2005-03-31 20:13 kichik * /NSIS/trunk/Include/Library.nsh: reverted latest change as File already removes the read-only flag 2005-03-29 21:32 kichik * /NSIS/trunk/Contrib/Language files/French.nlf: fixed bug #1168652 - French: Install Location 2 shortcuts on P 2005-03-29 20:57 kichik * /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Docs/src/var.but: typos 2005-03-29 19:14 kichik * /NSIS/trunk/Docs/src/compilerflags.but: clarified usage of SetCompressor 2005-03-29 19:09 kichik * /NSIS/trunk/Docs/src/attributes.but: - added AddBrandingImage examples - added information about usage of variables 2005-03-29 18:09 kichik * /NSIS/trunk/Docs/src/plugin.but: typo 2005-03-27 17:40 kichik * /NSIS/trunk/Include/Library.nsh: remove read only file attribute before using Rename /REBOOTOK 2005-03-24 15:21 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: typo 2005-03-22 18:54 kichik * /NSIS/trunk/Docs/src/sections.but: replaced spaces with underscores in index output parameter names 2005-03-22 18:30 kichik * /NSIS/trunk/Docs/src/ui.but: added LockWindow description 2005-03-19 17:07 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: fixed two problematic string length measurements 2005-03-19 17:06 kichik * /NSIS/trunk/Source/script.cpp: use correct freeing method 2005-03-19 16:18 kichik * /NSIS/trunk/Docs/src/history.but: added missing parenthesis 2005-03-19 14:18 * /NSIS/tags/v206, /NSIS/tags/v206/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v206/Contrib/InstallOptions/io.dsw, /NSIS/tags/v206/Contrib/InstallOptions/resource.h, /NSIS/tags/v206/Contrib/Makensisw/afxres.h, /NSIS/tags/v206/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v206/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v206/Contrib/NSISdl/connection.h, /NSIS/tags/v206/Contrib/NSISdl/httpget.h, /NSIS/tags/v206/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v206/Contrib/Splash/splash.dsw, /NSIS/tags/v206/Contrib/zip2exe, /NSIS/tags/v206/Contrib/zip2exe/Base.nsh, /NSIS/tags/v206/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v206/Contrib/zip2exe/icon.ico, /NSIS/tags/v206/Contrib/zip2exe/main.cpp, /NSIS/tags/v206/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v206/Contrib/zip2exe/res.rc, /NSIS/tags/v206/Contrib/zip2exe/resource.h, /NSIS/tags/v206/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v206/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v206/Source/exehead/bin2h.exe, /NSIS/tags/v206/Source/exehead/uninst.ico, /NSIS/tags/v206/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v206'. 2005-03-19 14:18 kichik * /NSIS/trunk/Source/Platform.h: added missing MB_RTLREADING 2005-03-19 13:53 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: 2.05 -> 2.06 2005-03-19 13:44 kichik * /NSIS/trunk/Docs/src/history.but: updated history 2005-03-19 12:49 kichik * /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: improvements 2005-03-19 11:56 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h: fixed bug #1155060 - Install type drop down box not showing default InstType 2005-03-18 15:56 kichik * /NSIS/trunk/Contrib/System/Source/System.c: added missing include 2005-03-17 21:26 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/UIs/UI Holder/ui.cpp, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c: applied patch #1164307 - Fixes to allow building Contrib/ on debian (minus Makefiles) 2005-03-17 20:44 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: implemented feature request #1159701 - "RTLREADING" flag support in the "MessageBox" 2005-03-15 17:48 kichik * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Source/script.cpp: implemented feature request #1159701 - "RTLREADING" flag support in the "MessageBox" 2005-03-11 11:28 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Plugins/advsplash.dll: fixed GlobalFree call with a bad pointer (thanks Takhir) 2005-03-10 18:53 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: fixed bug #1159700 - SetFont doesn't work well with RTL on Windows 9x 2005-03-05 16:56 kichik * /NSIS/trunk/Source/build.cpp: fixed compile error without NSIS_CONFIG_CRC_SUPPORT 2005-03-05 12:07 kichik * /NSIS/trunk/Source/build.cpp: fixed bug #1144763 - more than 3 files in uninstall, cannot compile data was added to udata after setro(TRUE) was used 2005-03-04 13:04 kichik * /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: implemented feature request #711900 - StartMenu SetCtlColors support 2005-03-03 20:46 kichik * /NSIS/trunk/Docs/src/sec.but: SetCurInstType works without the components page too 2005-03-03 20:15 kichik * /NSIS/trunk/Source/exehead/components.c: fixed bug #1155836 - Incorrect section group state section flags weren't read again after a recursive call for _RefreshSectionGroups returned 2005-03-03 17:42 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: fixed bug #1155588 - missing ClearErrors in GetWindowsVersion 2005-02-25 15:28 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimizations 2005-02-25 14:19 kichik * /NSIS/trunk/Source/exehead/Ui.c: `available` variable in DirProc's WM_IN_UPDATEMSG handler wasn't properly initialized 2005-02-25 13:29 kichik * /NSIS/trunk/Source/exehead/Makefile: applied patch #1123154 - nsis 2.05 makefile missing components.c 2005-02-18 13:39 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c: fixed plug-ins directory initialization for extremely restricted guest users with no directory listing access to the temporary directory 2005-02-18 09:12 kichik * /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Icelandic.nsh: fixes 2005-02-17 21:20 kichik * /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: implemented feature request #1124901 - Registry functions and ShellVarContext all registry instructions now accept SHCTX which is replaced with HKLM or HKCU on runtime according to SetShellVarContext 2005-02-17 20:38 kichik * /NSIS/trunk/Contrib/Language files/Icelandic.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Icelandic.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Icelandic by Gretar Orri Kristinsson 2005-02-17 19:31 kichik * /NSIS/trunk/Contrib/Language files/Belarusian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Belarusian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Byelorussian by glory_man 2005-02-11 14:08 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added Breton 2005-02-11 14:06 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added a note about the first used language being the default language 2005-02-11 14:02 kichik * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SerbianLatin.nsh: terminology has changed and typos are fixed 2005-02-04 20:49 kichik * /NSIS/trunk/Source/exehead/Ui.c: added FORCE_INLINE to RefreshComponents 2005-02-04 20:45 kichik * /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: if the first section was a section group, following section groups didn't behave correctly 2005-02-04 17:34 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO was defined twice 2005-02-04 16:39 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: added a note about relative paths and CopyFiles 2005-02-04 16:31 kichik * /NSIS/trunk/Docs/src/history.but: typos 2005-02-04 15:31 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed compile error with logging enabled 2005-02-04 14:45 * /NSIS/tags/v205, /NSIS/tags/v205/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v205/Contrib/InstallOptions/io.dsw, /NSIS/tags/v205/Contrib/InstallOptions/resource.h, /NSIS/tags/v205/Contrib/Makensisw/afxres.h, /NSIS/tags/v205/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v205/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v205/Contrib/NSISdl/connection.h, /NSIS/tags/v205/Contrib/NSISdl/httpget.h, /NSIS/tags/v205/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v205/Contrib/Splash/splash.dsw, /NSIS/tags/v205/Contrib/zip2exe, /NSIS/tags/v205/Contrib/zip2exe/Base.nsh, /NSIS/tags/v205/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v205/Contrib/zip2exe/icon.ico, /NSIS/tags/v205/Contrib/zip2exe/main.cpp, /NSIS/tags/v205/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v205/Contrib/zip2exe/res.rc, /NSIS/tags/v205/Contrib/zip2exe/resource.h, /NSIS/tags/v205/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v205/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v205/Source/exehead/bin2h.exe, /NSIS/tags/v205/Source/exehead/uninst.ico, /NSIS/tags/v205/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v205'. 2005-02-04 14:45 kichik * /NSIS/trunk/Examples/makensis.nsi: added InstallOptions images example 2005-02-04 14:17 kichik * /NSIS/trunk/Source/exehead/components.c: a section group can't be both selected and toggled 2005-02-04 13:55 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: 2.04->2.05 2005-02-04 13:46 kichik * /NSIS/trunk/Docs/src/history.but: changelog for 2.05 2005-02-03 20:26 kichik * /NSIS/trunk/Source/exehead/exec.c: added missing break 2005-02-03 19:02 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: typo 2005-02-03 18:24 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1114876 - "Space Available" shows bad value "258.-2GB" 2005-01-29 15:31 kichik * /NSIS/trunk/Source/util.cpp: better error message for icon number mismatch 2005-01-27 16:28 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: - added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE - other updates and fixes 2005-01-22 17:14 kichik * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: update 2005-01-21 21:49 kichik * /NSIS/trunk/Contrib/System/SysFunc.nsh: fixed bug #1102255 - system.nsi example crash 2005-01-21 19:17 kichik * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: updated change log 2005-01-21 19:14 kichik * /NSIS/trunk/Contrib/InstallOptions/testimgs.ini, /NSIS/trunk/Contrib/InstallOptions/testimgs.nsi: example of displaying images and icons 2005-01-21 19:12 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Plugins/InstallOptions.dll: added TRANSPARENT flag for BITMAP fields 2005-01-21 15:32 kichik * /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi: added MUI_HEADERIMAGE_BITMAP example 2005-01-18 18:06 kichik * /NSIS/trunk/Source/clzma.cpp: LZMA_IO_ERROR was returned instead of LZMA_THREAD_ERROR 2005-01-18 17:56 kichik * /NSIS/trunk/Source/build.cpp: string first in output for compression errors 2005-01-14 18:35 kichik * /NSIS/trunk/Source/dirreader.cpp: use case insensitive string comparison 2005-01-14 17:07 kichik * /NSIS/trunk/Docs/src/credits.but: Breton credits 2005-01-14 16:54 kichik * /NSIS/trunk/Source/exehead/fileform.c: don't rely on WM_DESTROY to update extraction status to 100% 2005-01-14 16:39 kichik * /NSIS/trunk/Contrib/Language files/Breton.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Breton.nsh: Breton translation 2005-01-14 15:59 kichik * /NSIS/trunk/TODO.txt: done 2005-01-14 15:46 kichik * /NSIS/trunk/Source/exehead/components.c: removed unneeded test 2005-01-14 15:24 kichik * /NSIS/trunk/Source/exehead/Ui.c: made SectionGetText work in .onInit too 2005-01-14 15:18 kichik * /NSIS/trunk/Docs/src/sec.but: added information about 9th bit of the section flags 2005-01-14 15:15 kichik * /NSIS/trunk/Include/Sections.nsh: added SF_NAMECHG 2005-01-14 15:13 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: use new section name space 2005-01-14 15:11 kichik * /NSIS/trunk/Source/build.cpp: initialize section name with zeros 2005-01-14 15:11 kichik * /NSIS/trunk/Source/exehead/fileform.h: added space for section name to make it possible to parse it immediately when setting it and not only when the components page is present 2005-01-14 12:21 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf: fixed branding 2005-01-14 10:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2005-01-14 10:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: typo 2005-01-11 17:16 kichik * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/ui.but: applied patch #1098454 with some changes 2005-01-11 16:54 kichik * /NSIS/trunk/Source/exehead/Ui.c: update the inner page if the leave function aborted, something might have changed 2005-01-11 16:41 kichik * /NSIS/trunk/Docs/src/sec.but: added information about 7th and 8th bits of the section flags 2005-01-11 16:39 kichik * /NSIS/trunk/Include/Sections.nsh: added SF_TOGGLED section flag 2005-01-11 16:39 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: deprecated cur_insttype and insttype_changed 2005-01-11 16:38 kichik * /NSIS/trunk/Source/exehead/Ui.c: use new component functions to enable toggling of partially selected sections and fix bug #1045722 2005-01-11 16:33 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: use new components functions so SetCurInstType will take affect immediately and so setting a section group's flags will affect its children too 2005-01-11 16:29 kichik * /NSIS/trunk/Source/exehead/fileform.h: - deprecated cur_insttype and insttype_changed - added SF_TOGGLED section flag 2005-01-11 16:28 kichik * /NSIS/trunk/Source/exehead/components.c, /NSIS/trunk/Source/exehead/components.h, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-lzma.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp: components functions that don't rely on the TreeView 2005-01-11 12:26 kichik * /NSIS/trunk/Docs/src/sections.but: missing "of" 2005-01-10 12:43 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/jumps.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/LogicLib.nsh, /NSIS/trunk/Include/Sections.nsh, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: renamed SubSection to SectionGroup 2005-01-10 11:55 kichik * /NSIS/trunk/Include/Library.nsh: fixed "done" and "register" label warnings 2005-01-10 11:40 kichik * /NSIS/trunk/Source/script.cpp: removed debug message 2005-01-09 12:56 kichik * /NSIS/trunk/Source/7zip/readme.txt: Igor requested the paragraph to be removed 2005-01-08 14:04 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Plugins/advsplash.dll: fixed doubled delay for !nt50 mode 2005-01-08 13:30 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c: indent -nut -kr -bli0 -i2 2005-01-07 16:31 * /NSIS/tags/v204, /NSIS/tags/v204/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v204/Contrib/InstallOptions/io.dsw, /NSIS/tags/v204/Contrib/InstallOptions/resource.h, /NSIS/tags/v204/Contrib/Makensisw/afxres.h, /NSIS/tags/v204/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v204/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v204/Contrib/NSISdl/connection.h, /NSIS/tags/v204/Contrib/NSISdl/httpget.h, /NSIS/tags/v204/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v204/Contrib/Splash/splash.dsw, /NSIS/tags/v204/Contrib/zip2exe, /NSIS/tags/v204/Contrib/zip2exe/Base.nsh, /NSIS/tags/v204/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v204/Contrib/zip2exe/icon.ico, /NSIS/tags/v204/Contrib/zip2exe/main.cpp, /NSIS/tags/v204/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v204/Contrib/zip2exe/res.rc, /NSIS/tags/v204/Contrib/zip2exe/resource.h, /NSIS/tags/v204/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v204/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v204/Source/exehead/bin2h.exe, /NSIS/tags/v204/Source/exehead/uninst.ico, /NSIS/tags/v204/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v204'. 2005-01-07 16:31 kichik * /NSIS/trunk/Docs/src/basic.but: - updated File /r documentation - minor improvements 2005-01-07 14:52 kichik * /NSIS/trunk/Menu/images/header.gif: 2.03->2.04 2005-01-07 11:32 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: RegQueryValueEx only takes 6 parameters 2005-01-05 17:11 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: 2.03->2.04 2005-01-05 17:02 kichik * /NSIS/trunk/Docs/src/history.but: 2.04 changelog 2005-01-05 16:36 kichik * /NSIS/trunk/Source/script.cpp: better fix for bug #1096104 2005-01-05 13:40 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: fixed 1095761 - File /r changes $0 2005-01-05 13:01 kichik * /NSIS/trunk/Source/script.cpp: descending message wasn't being displayed when the directory itself matched 2005-01-05 12:44 kichik * /NSIS/trunk/Docs/src/registry.but: note about not using full path with INI instructions 2005-01-05 12:37 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1096104 - File /r under unix creates incorrect dirs 2005-01-05 12:02 kichik * /NSIS/trunk/Source/dirreader.cpp: compare to string::npos, not 0 2005-01-04 16:35 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Estonian.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2005-01-04 16:18 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Farsi.nsh: - fixes - added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2005-01-04 16:17 kichik * /NSIS/trunk/Contrib/Language files/Farsi.nlf: fixes 2005-01-04 14:54 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: 2005 2005-01-03 20:36 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-12-16 18:45 kichik * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh: updates 2004-12-16 18:43 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-12-14 18:13 kichik * /NSIS/trunk/Contrib/Language files/TradChinese.nlf: fixes 2004-12-14 18:11 kichik * /NSIS/trunk/Contrib/Language files/Korean.nlf: address update 2004-12-14 18:11 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-12-11 16:10 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp: use new MultiByteToWideChar and WideCharToMultiByte implementation 2004-12-11 16:09 kichik * /NSIS/trunk/Source/ResourceEditor.h: updated copyright year 2004-12-11 16:09 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: use new, correct, MultiByteToWideChar and WideCharToMultiByte implementation on POSIX 2004-12-11 16:06 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: added implementation of Unicode conversion functions for POSIX, based on iconv 2004-12-11 14:52 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf: added codepage 2004-12-10 11:09 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: fixed bug #1082017 - Problem with empty dir in File /r 2004-12-10 10:54 kichik * /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.exe: applied patch #1081497 - Fix for LibraryLocal to allow DLL's with a UNC path 2004-12-10 10:35 kichik * /NSIS/trunk/Source/Tests/specmatch.cpp, /NSIS/trunk/Source/Tests/Tests.dsp: added a test for dir_reader::matches 2004-12-10 10:21 kichik * /NSIS/trunk/Source/dirreader.cpp: fixed bug #1080810 - const_iterators cannot be null in g++ (3.4.2) 2004-12-06 17:15 kichik * /NSIS/trunk/Source/dirreader.cpp: fixed vc7.1 compile error 2004-12-03 16:46 * /NSIS/tags/v203, /NSIS/tags/v203/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v203/Contrib/InstallOptions/io.dsw, /NSIS/tags/v203/Contrib/InstallOptions/resource.h, /NSIS/tags/v203/Contrib/Makensisw/afxres.h, /NSIS/tags/v203/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v203/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v203/Contrib/NSISdl/connection.h, /NSIS/tags/v203/Contrib/NSISdl/httpget.h, /NSIS/tags/v203/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v203/Contrib/Splash/splash.dsw, /NSIS/tags/v203/Contrib/zip2exe, /NSIS/tags/v203/Contrib/zip2exe/Base.nsh, /NSIS/tags/v203/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v203/Contrib/zip2exe/icon.ico, /NSIS/tags/v203/Contrib/zip2exe/main.cpp, /NSIS/tags/v203/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v203/Contrib/zip2exe/res.rc, /NSIS/tags/v203/Contrib/zip2exe/resource.h, /NSIS/tags/v203/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v203/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v203/Source/exehead/bin2h.exe, /NSIS/tags/v203/Source/exehead/uninst.ico, /NSIS/tags/v203/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v203'. 2004-12-03 16:46 kichik * /NSIS/trunk/Docs/src/history.but: added MUI 1.72 2004-12-03 16:42 kichik * /NSIS/trunk/Docs/src/history.but: wrong version 2004-12-03 16:37 kichik * /NSIS/trunk/Docs/src/history.but: added a note about improved File /r behavior 2004-12-03 09:40 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh: updated by Puuhis 2004-12-02 18:34 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf: added codepage 2004-12-02 18:33 kichik * /NSIS/trunk/Contrib/Language files/Macedonian.nlf: fixes 2004-12-02 18:33 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: e-mail change 2004-12-02 18:31 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-12-02 18:24 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE (patch #1077370) 2004-11-30 18:45 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-11-30 18:25 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-11-30 18:22 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE (patch #1075188) 2004-11-30 18:19 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh: * added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE * translation improvements 2004-11-30 18:13 kichik * /NSIS/trunk/Docs/src/history.but: update 2004-11-30 18:11 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h: some consts 2004-11-30 18:00 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: fixed bug #1075363 - nsisconf.nsh not included when using makensisw 2004-11-29 20:58 ramon18 * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: updated Portuguese.nsh 2004-11-27 21:00 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-11-27 14:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.72 * Fixed state of Finish page Cancel button when both an installer and uninstaller page is included 2004-11-27 13:58 joostverburg * /NSIS/trunk/Menu/images/header.gif: 2.02->2.03 2004-11-27 13:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-11-27 11:08 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh: added another version of MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-11-26 22:53 kichik * /NSIS/trunk/Source/build.cpp: added NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE to the script define list 2004-11-26 20:28 kichik * /NSIS/trunk/Source/dirreader.cpp: use stat to find out if the file is a directory or not since it's more portable 2004-11-26 20:07 kichik * /NSIS/trunk/Source/dirreader.cpp: * diropen, dirread -> opendir, readdir * fixed warnings 2004-11-26 20:02 kichik * /NSIS/trunk/Source/Makefile: added dirreader.cpp and updated dependencies 2004-11-26 19:49 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: fixed compile error under gcc-2.95 2004-11-26 19:30 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: 2.02->2.03 2004-11-26 18:49 kichik * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: added /date switch to !define for definition of date and time constants 2004-11-26 18:05 kichik * /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Include/Library.nsh: applied patch #1044212 with some changes to make it optional 2004-11-26 17:18 kichik * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: added /x switch for File and ReserveFile to exclude files and directories 2004-11-26 15:44 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: * use new dir_reader * only warn once about /a on POSIX * made /R search for matches inside subdirectories even wildcards were not used 2004-11-26 15:37 kichik * /NSIS/trunk/Source/dirreader.cpp, /NSIS/trunk/Source/dirreader.h, /NSIS/trunk/Source/makenssi.dsp: new interface for reading directories which helps getting some preprocessor clutter outside of script.cpp 2004-11-26 15:26 kichik * /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: added get_file_name which extracts the file name from a path 2004-11-26 10:17 kichik * /NSIS/trunk/Docs/src/attributes.but: better description for Icon and UninstallIcon 2004-11-25 22:31 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed bug #1073363 - keyboard navigation in MUI_PAGE_INSTFILES keyboard navigation doesn't work while the focus is set on a disabled control 2004-11-23 20:10 kichik * /NSIS/trunk/Docs/src/usection.but, /NSIS/trunk/Docs/src/var.but: added information about $INSTDIR not having the same value in installer and uninstaller 2004-11-20 20:11 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: button text 2004-11-20 15:23 kichik * /NSIS/trunk/Source/exehead/Ui.c: made the gradient background window not pretend to be the installer dialog so the "unpacking" window will show even if it is used 2004-11-19 20:21 kichik * /NSIS/trunk/Source/build.cpp: added NSIS_LZMA_COMPRESS_WHOLE to the script define list 2004-11-19 15:11 kichik * /NSIS/trunk/Docs/src/compiler.but: fixed description of ${__TIME__}, ${__DATE__} and ${__TIMESTAMP__} 2004-11-19 15:02 kichik * /NSIS/trunk/Source/build.cpp: fixed an access violation in case of a script jump beyond the last entry 2004-11-19 14:38 kichik * /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Source/makenssi.cpp: better description of command line usage (bug report #1065322) 2004-11-19 13:45 kichik * /NSIS/trunk/Source/makenssi.cpp: more of patch #1055553 - Absolute path of *.nsi not accepted on posix (-- separator between options and files for posix) 2004-11-19 12:09 kichik * /NSIS/trunk/Docs/src/basic.but: added information about SetOutPath and RMDir 2004-11-19 11:48 kichik * /NSIS/trunk/Docs/src/basic.but: better description for ReserveFile 2004-11-13 19:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: corrected uninstaller finish page text 2004-11-12 22:08 kichik * /NSIS/trunk/Docs/src/library.but: added a warning about deploying DLLs from the system directory 2004-11-12 13:58 kichik * /NSIS/trunk/Source/Platform.h: applied patch #1055553 (with some changes) - Absolute path of *.nsi not accepted on posix 2004-11-12 13:58 kichik * /NSIS/trunk/Source/makenssi.cpp: * applied patch #1055553 (with some changes) - Absolute path of *.nsi not accepted on posix * updated license line breaking to fit better * added /VERSION to the usage information text 2004-11-11 21:28 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Only use the GetModuleHandle trick for plug-ins, otherwise just load and unload. If RegDLL uses /NOUNLOAD, unloading will be skipped, but GetModuleHandle won't be used. 2004-11-11 20:34 kichik * /NSIS/trunk/Source/exehead/exec.c: Always increase the load count of registered dlls if /NOUNLOAD is not specified. This should fix some problems with registering many COM dlls in a row. 2004-11-11 19:10 kichik * /NSIS/trunk/Include/Library.nsh: fixed bug #1064540 - warning 'label "installlib.remove_..." not used' 2004-11-09 20:21 kichik * /NSIS/trunk/Docs/src/compilerflags.but: added /FINAL to SetCompressor 2004-10-26 14:57 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: removed trailing space after string 2004-10-25 23:34 kichik * /NSIS/trunk/Source/script.cpp: include unistd.h for chdir() 2004-10-25 21:34 kichik * /NSIS/trunk/Examples/cvsdata.nsi: use File /r instead of a macro for each directory so no updating will be required each time a directory is added 2004-10-25 17:51 kichik * /NSIS/trunk/Source/makenssi.cpp: include unistd.h for chdir() 2004-10-24 13:10 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: fixes 2004-10-24 11:04 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi: added new folders 2004-10-23 19:24 * /NSIS/tags/v202, /NSIS/tags/v202/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v202/Contrib/InstallOptions/io.dsw, /NSIS/tags/v202/Contrib/InstallOptions/resource.h, /NSIS/tags/v202/Contrib/Makensisw/afxres.h, /NSIS/tags/v202/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v202/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v202/Contrib/NSISdl/connection.h, /NSIS/tags/v202/Contrib/NSISdl/httpget.h, /NSIS/tags/v202/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v202/Contrib/Splash/splash.dsw, /NSIS/tags/v202/Contrib/zip2exe, /NSIS/tags/v202/Contrib/zip2exe/Base.nsh, /NSIS/tags/v202/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v202/Contrib/zip2exe/icon.ico, /NSIS/tags/v202/Contrib/zip2exe/main.cpp, /NSIS/tags/v202/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v202/Contrib/zip2exe/res.rc, /NSIS/tags/v202/Contrib/zip2exe/resource.h, /NSIS/tags/v202/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v202/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v202/Menu, /NSIS/tags/v202/Source/exehead/bin2h.exe, /NSIS/tags/v202/Source/exehead/uninst.ico, /NSIS/tags/v202/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v202'. 2004-10-23 19:24 joostverburg * /NSIS/trunk/Menu/images/header.gif: 2.02 2004-10-23 17:43 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/TODO.txt: Added another parameter to plug-in functions. This parameter is a structure with pointers to exec_flags and ExecuteCodeSegment. This is backward compatible with older plug-ins because plug-in functions use the __cdecl calling convention which means NSIS clears the stack. 2004-10-23 09:50 kichik * /NSIS/trunk/Examples/makensis.nsi: added Source\boost 2004-10-23 09:31 kichik * /NSIS/trunk/Examples/makensis.nsi: added Source\Tests 2004-10-23 09:21 kichik * /NSIS/trunk/Docs/src/history.but: updated release date 2004-10-23 09:09 kichik * /NSIS/trunk/Docs/src/attributes.but: removed double parenthesis 2004-10-22 23:52 kichik * /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: StrFunc 1.09 by deguix: - Fixed stack problems involving: StrCase, StrRep, StrSort, StrTok. - Fixed StrClb: When "Action" = "<>", handle was wrongly outputed as text. - Fixed StrSort, StrStrAdv documentation examples. - Fixed StrIOToNSIS, StrLoc, StrNSISToIO, StrRep, StrStr: sometimes didn't find "StrToSearch" at all. 2004-10-22 11:36 kichik * /NSIS/trunk/Docs/src/tutorial.but: dollar should come before the backslash when escaping quotes 2004-10-21 21:32 kichik * /NSIS/trunk/Docs/src/int.but: updated changelog 2004-10-21 21:31 kichik * /NSIS/trunk/Docs/src/history.but: added changelog for 2.02 2004-10-21 19:08 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: updated changelog 2004-10-21 16:39 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh: fixes 2004-10-21 16:30 kichik * /NSIS/trunk/Docs/src/intro.but: double and 2004-10-19 17:51 flizebogen * /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulfunc.but: Fixed some typos 2004-10-18 23:05 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: 2.01->2.02 2004-10-15 20:52 kichik * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: added ClearErrors so errors that occurred before RMDir won't be caught 2004-10-15 03:59 oripel * /NSIS/trunk/Source/script.cpp: Using new resource management syntax, e.g. MANAGE_WITH(buffer, free) 2004-10-15 03:58 oripel * /NSIS/trunk/Source/util.h: Reworked the ResourceManager concepts 2004-10-15 03:40 oripel * /NSIS/trunk/Source/boost, /NSIS/trunk/Source/boost/checked_delete.hpp, /NSIS/trunk/Source/boost/detail, /NSIS/trunk/Source/boost/detail/workaround.hpp, /NSIS/trunk/Source/boost/scoped_array.hpp, /NSIS/trunk/Source/boost/scoped_ptr.hpp: Imported and modified some sources from Boost (http://www.boost.org) 2004-10-15 03:23 oripel * /NSIS/trunk/Source/lineparse.cpp: Added missing #include "Platform.h" 2004-10-14 21:34 kichik * /NSIS/trunk/Source/exehead/exec.c: added a comment 2004-10-14 21:33 kichik * /NSIS/trunk/Source/exehead/Ui.c: size optimizations 2004-10-14 15:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/System.nsh: The selected language is only stored in the registry when installation was succesful 2004-10-14 13:56 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: made the Reboot command first quit and then reboot - fixed bug #989690 - the installer now denies reboots while running - the Reboot instruction no longer returns or sets the error flag - added .onRebootFailed which is called when Reboot fails - installer should now always clean-up when rebooting 2004-10-13 18:39 kichik * /NSIS/trunk/Docs/src/var.but: link to .onInit 2004-10-13 16:58 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exedata.cpp, /NSIS/trunk/Source/exedata.h: renamed exeheader_size to exehead_original_size 2004-10-12 22:59 kichik * /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: StrFunc 1.08 by deguix: - Converted all the functions to LogicLib. - StrSort: Totally remade and it can break old scripts. See documentation for details. - Added defines: StrFunc_List, *_List and *_TypeList. - Fixed StrStrAdv: Variables $R0-$R3 couldn't be used on scripts before calling. - StrRep: Cut down some variables. - Arranged correctly the order of StrSort on the documentation. 2004-10-12 22:44 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: case change for language name 2004-10-12 22:40 kichik * /NSIS/trunk/Source/exehead/Makefile: some more cross compiler prefixes 2004-10-12 21:27 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h: moved implementation of PluginsList into Plugins.cpp 2004-10-12 21:22 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h: moved implementation of LangStringList and StringsArray into lang.cpp 2004-10-12 21:05 kichik * /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/ShConstants.cpp, /NSIS/trunk/Source/ShConstants.h: moved implementation of ConstantsStringList into ShConstants.cpp 2004-10-12 21:01 kichik * /NSIS/trunk/Source/lang.h: missing includes 2004-10-12 20:56 kichik * /NSIS/trunk/TODO.txt: smart relative jumps is done 2004-10-12 20:26 kichik * /NSIS/trunk/Source/strlist.h: int to size_t 2004-10-12 20:09 kichik * /NSIS/trunk/Source/script.cpp: silly typo fixed 2004-10-12 19:57 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.h: tabs to spaces 2004-10-11 21:26 oripel * /NSIS/trunk/Source/exehead/Makefile: Added support for different prefixes for gcc on non-Windows platforms 2004-10-11 21:25 oripel * /NSIS/trunk/Source/util.h: Added template class ResourceManager and friends 2004-10-11 21:24 oripel * /NSIS/trunk/Source/util.cpp: Added missing #include statements for Linux 2004-10-11 21:24 oripel * /NSIS/trunk/Source/script.cpp: Liberal use of ResourceManager 2004-10-11 21:21 oripel * /NSIS/trunk/Source/mmap.h: added missing #include statement for Linux 2004-10-11 21:20 oripel * /NSIS/trunk/Source/Makefile: - added target 'depend' using makedepend - object files are placed in $(BUILDDIR) - OBJS is calculated from SRCS 2004-10-11 14:54 joostverburg * /NSIS/trunk/Contrib/Language files/Albanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Albanian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Albanian language files by Besnik Bleta 2004-10-11 14:26 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/czlib.h: added dict_size parameter to Compressor::Init() so a cast to CLZMA won't be required to pass a dictionary size 2004-10-11 14:23 kichik * /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h: moved implementation of CVersionStrigList into ResourceVersionInfo.cpp 2004-10-11 11:45 kichik * /NSIS/trunk/Source/lineparse.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.dsp: moved implementation of LineParser into lineparse.cpp 2004-10-11 10:32 kichik * /NSIS/trunk/Examples/makensis.nsi: call SHChangeNotify after changing file associations 2004-10-10 20:58 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.cpp, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.dsp: moved implementation of CLZMA into clzma.cpp 2004-10-10 18:41 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Docs/src/usage.but: added small usage examples 2004-10-10 18:17 kichik * /NSIS/trunk/Source/script.cpp: removed extra %s from TOK_GETCURRENTADDR 2004-10-10 17:51 joostverburg * /NSIS/trunk/Include/Library.nsh: fixed type library uninstallation 2004-10-10 16:57 joostverburg * /NSIS/trunk/Include/Library.nsh: fixed parameter name 2004-10-10 16:32 joostverburg * /NSIS/trunk/Docs/src/library.but: fixed parameter name 2004-10-10 14:50 kichik * /NSIS/trunk/Contrib/Banner/Banner.c: - tabs to spaces - removed obsolete commented code 2004-10-10 00:53 ramon18 * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Plugins/Banner.dll: #1042367 - Banner fixed for bug 1022399 now hangs, code simplified on banner destroy 2004-10-02 18:26 kichik * /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/Tests.dsp: use mmap.cpp instead of strlist.h 2004-10-02 18:04 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exedata.cpp, /NSIS/trunk/Source/exedata.h, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-lzma.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/exehead/Makefile, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.h: refactoring: - added CEXEBuild::update_exehead() and made everyone use it - renamed some variables (of the *exeheader* variety) bug fix: - uninstaller CRC-check failed if !packhdr created a non-512-bytes-aligned exehead 2004-10-02 15:17 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/growbuf.cpp, /NSIS/trunk/Source/growbuf.h, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/mmap.cpp, /NSIS/trunk/Source/mmap.h, /NSIS/trunk/Source/strlist.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/util.cpp: refactoring: split strlist.h classes into separate {h,cpp} files 2004-10-02 13:07 kichik * /NSIS/trunk/Source/Tests/mmap.cpp, /NSIS/trunk/Source/Tests/Tests.dsp: MMapFile test 2004-10-01 21:15 kichik * /NSIS/trunk/Source/exehead/Main.c: both _=? and /D= now require a space before them so they can safely remove the space from $CMDLINE 2004-10-01 19:52 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: - converted ctime_r to ctime for better portability - more refactoring 2004-10-01 13:14 kichik * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Plugins/Banner.dll: - fixed bug #1022399 - Only initial banner is in foreground - added a few more checks 2004-10-01 11:18 kichik * /NSIS/trunk/Source/clzma.h: #include 2004-10-01 09:57 kichik * /NSIS/trunk/Source/script.cpp: fixed bug #1038255 - CopyFiles usage checking problem 2004-10-01 09:45 kichik * /NSIS/trunk/Source/Platform.h: define DS_SHELLFONT for win32 too 2004-09-30 22:47 kichik * /NSIS/trunk/Source/strlist.h: only close file handle once in MMapFile::clear() 2004-09-30 22:46 kichik * /NSIS/trunk/Source/script.cpp: dir in do_add_files can be "." on windows too 2004-09-30 22:07 kichik * /NSIS/trunk/Source/Tests/Tests.dsp: updated 2004-09-30 20:25 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: more refactoring 2004-09-30 18:50 kichik * /NSIS/trunk/Source/exehead/Ui.c: updated some comments 2004-09-30 18:49 kichik * /NSIS/trunk/Source/util.h: added endian macros 2004-09-30 18:48 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/strlist.h: refactoring 2004-09-30 18:36 kichik * /NSIS/trunk/Source/makenssi.dsw, /NSIS/trunk/Source/Tests, /NSIS/trunk/Source/Tests/endian.cpp, /NSIS/trunk/Source/Tests/Tests.dsp, /NSIS/trunk/Source/Tests/textrunner.cpp: first-ever CppUnit unit tests 2004-09-30 13:15 kichik * /NSIS/trunk/Source/Makefile: added DEBUG and PROFILING flags 2004-09-30 11:20 kichik * /NSIS/trunk/Source/build.cpp: fixed unsigned/signed comparison warning 2004-09-30 10:37 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: case change for language name 2004-09-29 16:36 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: fixes 2004-09-28 21:25 kichik * /NSIS/trunk/Docs/src/int.but: added shl and shr to IntOp 2004-09-25 18:05 kichik * /NSIS/trunk/Source/exehead/util.c: fixed gcc 3.4 compile errors 2004-09-25 14:56 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: added information about uninstallers and error levels 2004-09-25 14:56 kichik * /NSIS/trunk/Source/exehead/Main.c: return 0 if the uninstaller was successfully copied and executed, not -1 2004-09-25 13:35 kichik * /NSIS/trunk/Docs/src/jumps.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: relative jumps now work with instructions that add multiple entries (including plug-in calls) 2004-09-25 11:22 kichik * /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/Ui.c: added NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE 2004-09-25 10:49 kichik * /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: - added GetErrorLevel and SetErrorLevl - fixed some inconsistencies in the error levels the installer/uninstaller set 2004-09-25 10:09 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: added a cache to the datablock optimizer so it wouldn't need to read the entire datablock to find its optimizations 2004-09-24 14:32 * /NSIS/tags/v201, /NSIS/tags/v201/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v201/Contrib/InstallOptions/io.dsw, /NSIS/tags/v201/Contrib/InstallOptions/resource.h, /NSIS/tags/v201/Contrib/Makensisw/afxres.h, /NSIS/tags/v201/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v201/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v201/Contrib/NSISdl/connection.h, /NSIS/tags/v201/Contrib/NSISdl/httpget.h, /NSIS/tags/v201/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v201/Contrib/Splash/splash.dsw, /NSIS/tags/v201/Contrib/zip2exe, /NSIS/tags/v201/Contrib/zip2exe/Base.nsh, /NSIS/tags/v201/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v201/Contrib/zip2exe/icon.ico, /NSIS/tags/v201/Contrib/zip2exe/main.cpp, /NSIS/tags/v201/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v201/Contrib/zip2exe/res.rc, /NSIS/tags/v201/Contrib/zip2exe/resource.h, /NSIS/tags/v201/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v201/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v201/Source/exehead/bin2h.exe, /NSIS/tags/v201/Source/exehead/uninst.ico, /NSIS/tags/v201/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v201'. 2004-09-24 14:32 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp: fixed compile error on POSIX 2004-09-24 14:05 kichik * /NSIS/trunk/Docs/src/history.but: updated history 2004-09-24 13:59 kichik * /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: String Functions 1.07 - StrStrAdv and StrCase have their functions remodeled with LogicLib. Functions have a lesser chance to have bugs. - Added case-sensitive comparation option for StrStrAdv. - StrCase now uses System.dll which makes case convertions effective with all latin letters (i.e. ?). - StrClbSet and StrClbGet removed, added StrClb. - Made compact the most usual operations inside the header file. File size reduced. - Added "!verbose" to header file -> faster compilation and header file output organized (code borrowed from LogicLib.nsh). 2004-09-24 13:27 kichik * /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Source/exehead/Makefile: added an optional flag called USE_PRECOMPILED_EXEHEADS set it to 1 to force the makefile to use the precompiled exehead .h files that come with NSIS releases 2004-09-24 12:58 kichik * /NSIS/trunk/Source/exehead/exec.c: use RegCreateKeyEx instead of RegCreateKey to hopefully solve the 64-bit Windows 2003 Server problem with WriteRegStr 2004-09-24 12:38 kichik * /NSIS/trunk/Contrib/Library/RegTool/RegTool.bin, /NSIS/trunk/Contrib/Library/RegTool/RegTool.nsi, /NSIS/trunk/Include/Library.nsh: Library fixes and improvements: - always register DLL/TLB, even if the installer didn't copy it there - only copy one RegTool and use it to register all of the DLLs and TLBs - extract the RegTool as an .exe so explorer won't complain it doesn't know how to open the file - fixed REGDLLTLB registering just as a TLB 2004-09-24 11:26 kichik * /NSIS/trunk/Source/exehead/util.c: don't try to delete a directory after reboot if it's not even valid 2004-09-22 16:23 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: fixed a bug in the handling of wCreateDataSize in CDialogTemplate::Save (thanks Sven Ritter) 2004-09-17 22:53 ramon18 * /NSIS/trunk/Contrib/NSISdl/httpget.cpp: #1008509 - Fixed compilation of plugin NSISdl under VS.NET 2004-09-17 16:48 kichik * /NSIS/trunk/Source/script.cpp: SetCtlColors /BRANDING wasn't working right, if just one of the background or text color were specified 2004-09-14 19:26 kichik * /NSIS/trunk/Source/script.cpp: applied patch #1028028 - POSIX-built installers install files w incorrect timestamps. 2004-09-11 15:44 kichik * /NSIS/trunk/Include/Library.nsh: - fixed "already defined" error - fixed unused label warning 2004-09-11 11:25 kichik * /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp: implemented GetDLLVersionLocal for non Win32 platforms 2004-09-10 21:09 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: corrected spelling of "Welcome" (patch 1026048) 2004-09-10 13:54 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but: typos 2004-09-09 17:19 kichik * /NSIS/trunk/Docs/src/langs.but: typo 2004-09-07 19:50 kichik * /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Plugins/VPatch.dll: close all open file handles when one of them fail to open 2004-09-05 12:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: filename corrections 2004-09-04 14:26 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: fixes 2004-09-03 13:14 kichik * /NSIS/trunk/Contrib/Banner/Example.nsi: 1*2000 is not 1000 2004-09-03 13:13 kichik * /NSIS/trunk/Contrib/Banner/Readme.txt: three functions, not two 2004-09-03 12:52 kichik * /NSIS/trunk/Source/exehead/Ui.c: don't forward WM_COMMAND if it was handled 2004-09-02 21:07 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Plugins/nsisdl.dll: added /NOIEPROXY (based on memph's code) 2004-08-27 08:29 kichik * /NSIS/trunk/Source/strlist.h: fixed MMapFile on POSIX, again 2004-08-23 13:35 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: LogicLib 2.5 - AndIf, AndUnless, OrIf, OrUnless added. - Avoids unused variable warnings by requiring !defines before using certain features. 2004-08-21 11:04 kichik * /NSIS/trunk/Docs/src/history.but: added the bgbg bug to the history 2004-08-21 10:58 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: link to cross compiling howto 2004-08-21 10:50 kichik * /NSIS/trunk/Source/7zip/Common/Alloc.cpp, /NSIS/trunk/Source/7zip/Common/Alloc.h, /NSIS/trunk/Source/7zip/Common/MyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyWindows.h: fixed bug #1005296 - NSIS build error on Linux with g++ 3.4.0 - upgraded to the latest LZMA SDK 2004-08-20 19:17 kichik * /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMADecoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMADecoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALen.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALen.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALiteral.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALiteral.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IMyUnknown.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common/ComTry.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp: fixed bug #1005296 - NSIS build error on Linux with g++ 3.4.0 - upgraded to the latest LZMA SDK 2004-08-20 15:40 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: - auto conversion of paths on POSIX platforms - based on patch #1005673 - LoadLanguageFile error message improvement 2004-08-20 15:17 kichik * /NSIS/trunk/Examples/makensis.nsi: case changes for case sensitive platforms 2004-08-20 14:16 kichik * /NSIS/trunk/Source/exehead/fileform.c: initialize g_db_hFile with INVALID_HANDLE_VALUE so the handle 0 will not be closed in CleanUp() if loadHeaders() is never called 2004-08-20 14:14 kichik * /NSIS/trunk/Source/exehead/Main.c: set NSIS Error title for invalid temporary directory error message 2004-08-19 22:05 eccles * /NSIS/trunk/Source/exehead/bgbg.c: request #990249 - Speedup BGGradient painting (was actually a bug) 2004-08-19 21:07 kichik * /NSIS/trunk/Source/strlist.h: fixed MMapFile on POSIX 2004-08-18 16:14 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: bug report #1005303 - NSIS build warnings 2004-08-18 15:56 kichik * /NSIS/trunk/Contrib/MakeLangId, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.cpp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.dsp, /NSIS/trunk/Contrib/MakeLangId/MakeLangId.dsw, /NSIS/trunk/Contrib/MakeLangId/resource.h, /NSIS/trunk/Contrib/MakeLangId/resource.rc: Bin\\MakeLangId.exe source code 2004-08-14 17:35 kichik * /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/zlib/INFBLOCK.C: fixed build warnings (including bug report #1005303 ) 2004-08-14 13:45 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: throw exception instead of failing silently when iconv fails 2004-08-14 12:28 kichik * /NSIS/trunk/Contrib/System/System.html: typo 2004-08-13 23:29 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new languages 2004-08-13 21:32 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/ui.but: - SetFont /LANG= - ^Font and ^FontSize 2004-08-13 21:14 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: DirRequest's title is set by Text 2004-08-13 20:01 kichik * /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.h: tabs to spaces 2004-08-13 19:28 kichik * /NSIS/trunk/Source/exehead/bin2h.c: patch #1005845 - Warning fix for bin2h.c 2004-08-13 19:26 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Indonesian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Latvian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Mongolian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SerbianLatin.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: - patch #1005664 - nlf inclusion problems on case sensitive platforms - fixed Mongolian.nsh 2004-08-13 19:07 kichik * /NSIS/trunk/Source/exehead/Makefile: patch #1005305 - Source/exehead/Makefile for cross compiling on POSIX systems 2004-08-13 18:59 kichik * /NSIS/trunk/Source/Makefile: patch #1005299 - Source/Makefile for building on POSIX systems 2004-08-12 22:25 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf: fixes 2004-08-12 22:23 joostverburg * /NSIS/trunk/Contrib/Language files/Mongolian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Mongolian.nsh: Mongolian language files by Bayarsaikhan Enkhtaivan 2004-08-11 20:34 joostverburg * /NSIS/trunk/Include/Library.nsh: typos 2004-08-11 20:29 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: fixes 2004-08-07 15:47 kichik * /NSIS/trunk/Source/exehead/fileform.c: Fixed the cause of bug #1004496 - Install with /NCRC hangs The hanging disappeared along with the removal of the threaded lzma decoder, but the cause stayed. When the user specified /NCRC on the command line, loadHeaders reported the compressed data size to be 4 bytes larger than it really is. Instead of checking the header flags, it checked the combined flags (command line and header), concluded CRC checksum is disabled and therefore didn't subtract the 4 bytes of the CRC checksum from the compressed data size. 2004-08-07 14:17 kichik * /NSIS/trunk/Docs/src/library.but: typos 2004-08-07 11:54 kichik * /NSIS/trunk/Docs/src/history.but: Window->Windows 2004-08-07 11:25 kichik * /NSIS/trunk/Docs/src/history.but: history updates 2004-08-07 11:00 kichik * /NSIS/trunk/Examples/makensis.nsi: Library files should go into Contrib\Library not Contrib 2004-08-07 10:52 kichik * /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Luxembourgish.nsh: moved Luxembourgish.nsh to the right folder 2004-08-07 10:14 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but: cleared up some InstType indexing confusion 2004-08-07 07:55 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: files for new library system 2004-08-07 07:55 joostverburg * /NSIS/trunk/Menu/images/header.gif: 2.0->2.01 2004-08-06 23:21 joostverburg * /NSIS/trunk/Examples/makensis.nsi: 2.01 version for update page 2004-08-06 22:06 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: DLL version 2.41 2004-08-06 22:06 joostverburg * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/library.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Docs/src/var.but: updated documentation: new system for DLL/TLB library setup, useful script code, history, credits, intro, tutorial 2004-08-06 22:04 joostverburg * /NSIS/trunk/Contrib/Library, /NSIS/trunk/Contrib/Library/LibraryLocal, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.cpp, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.dsp, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.dsw, /NSIS/trunk/Contrib/Library/LibraryLocal/LibraryLocal.exe, /NSIS/trunk/Contrib/Library/RegTool, /NSIS/trunk/Contrib/Library/RegTool/RegTool.bin, /NSIS/trunk/Contrib/Library/RegTool/RegTool.nsi, /NSIS/trunk/Contrib/Library/TypeLib, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.cpp, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.dsp, /NSIS/trunk/Contrib/Library/TypeLib/TypeLib.dsw, /NSIS/trunk/Include/Library.nsh, /NSIS/trunk/Include/UpgradeDLL.nsh, /NSIS/trunk/Plugins/TypeLib.dll: new system for DLL/TLB library setup 2004-08-06 21:47 joostverburg * /NSIS/trunk/Source/exehead/exec.c: compiles with NSIS_SUPPORT_CODECALLBACKS disabled 2004-08-06 21:29 kichik * /NSIS/trunk/Examples/makensis.nsi: 2.0->2.01 2004-08-06 21:29 kichik * /NSIS/trunk/Source/script.cpp: fixed handling of relative paths such as \file.ext in do_add_file 2004-08-06 17:03 kichik * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: converted RMDir back from SHFileOperation to the good old manual method - RMDir can now be used with both /r and /REBOOTOK - RMDir /r no longer leaves lots of files behind if one file removal failed - The plug-ins directory is now always deleted, if not immediately, then after reboot - RMDir /r prints a detailed log of its actions 2004-08-06 16:47 kichik * /NSIS/trunk/Source/exehead/Ui.c: close installer on WM_QUERYENDSESSION instead of trying to clean up on WM_ENDSESSION which doesn't work if there's an active plug-in (for example, when the finish page is showing) 2004-08-06 12:39 joostverburg * /NSIS/trunk/Contrib/Language files/Luxembourgish.nlf, /NSIS/trunk/Contrib/Language files/Luxembourgish.nsh: Luxembourgish language files by Jo Hoeser 2004-08-06 11:29 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: added !execute 2004-08-06 11:05 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c: size optimization - lzma exehead is now 33.5kb 2004-08-01 14:45 joostverburg * /NSIS/trunk/Contrib/Language files/Latvian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Latvian.nsh: fixes 2004-07-24 12:34 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Include/Colors.nsh: updated colors.nsh 2004-07-23 17:23 kichik * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/System/WhatsNew.txt, /NSIS/trunk/Plugins/System.dll: - fixes by brainsucker: * Bug with proc call parts redefinition, # for example * Bug with memory protection during callback processing (XP SP2) - updated documentation: * all examples now work, thanks to brainsucker's fixes * visual improvements * pointer information 2004-07-15 17:54 kichik * /NSIS/trunk/Include/Colors.nsh: some basic color defines by Rob Segal 2004-07-15 17:37 kichik * /NSIS/trunk/Source/exehead/exec.c: fixed internet shortcuts creation with CreateShortcut (thanks rex123) 2004-07-08 21:06 kichik * /NSIS/trunk/Source/exehead/exec.c: DeleteRegKey fix 2004-07-08 18:39 kichik * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: variables confusion (Comm@nder21) 2004-07-08 18:32 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/ResourceEditor.cpp: fixed unicode conversion with iconv 2004-07-07 17:06 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: 'bla'->'${VALUE}' 2004-07-06 23:43 joostverburg * /NSIS/trunk/Source/exehead/config.h: more things NSIS_CONFIG_PLUGIN_SUPPORT relies on 2004-07-02 17:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: fixes 2004-07-01 20:22 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc: made the agree radio button come before the disagree radio button in the license page's tab order so pressing the up key will move the selection up and not down 2004-07-01 19:53 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: applied patch #983523 - Spelling errors on spanish language file 2004-06-25 21:54 kichik * /NSIS/trunk/Docs/src/pages.but: added DirVerify to the list of the directory's page supported options 2004-06-25 20:00 kichik * /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.txt: latest StrFunc example and readme 2004-06-25 19:53 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: - extended maximum binary data for WriteRegBin to 3 * NSIS_MAX_STRLEN - fixed FileRead setting the error flag when a null character is the first character it reads - made File /nonfatal always produce a warning if the file can't be found - some size optimizations 2004-06-25 15:24 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: patch #977897 by Anders - IntOp shr & shl 2004-06-25 11:19 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: 2.0->2.01 2004-06-25 10:48 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc: bump zip2exe version to 0.32 2004-06-25 10:16 kichik * /NSIS/trunk/Source/script.cpp: fixed a crash caused by defining a macro in a file included by another macro 2004-06-19 20:06 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: added msys/cygwin requirement for rm and echo commands 2004-06-19 15:51 kichik * /NSIS/trunk/Source/exehead/Makefile: always make target dirs 2004-06-19 12:42 kichik * /NSIS/trunk/Source/exehead/Makefile, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/Makefile: fixed compatibility with gcc 3.3 and improved makefiles 2004-06-19 11:44 kichik * /NSIS/trunk/Source/strlist.h: fixed MMapBuf on POSIX 2004-06-19 09:36 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: bug #961027 - clarification that CreateShortCut requires the path of link exists 2004-06-18 18:58 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: zip files created on Windows use the OEM code page - conversion to ANSI code page added 2004-06-18 17:59 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: fixed problems with quotes and spaces 2004-06-18 17:39 kichik * /NSIS/trunk/Docs/src/basic.but: missing "there" added 2004-06-17 17:54 kichik * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Banner/Example.nsi, /NSIS/trunk/Contrib/Banner/Readme.txt, /NSIS/trunk/Plugins/Banner.dll: added getWindow 2004-06-12 15:34 joostverburg * /NSIS/trunk/Source/build.cpp: fixed compilation without background gradient support 2004-06-12 14:01 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: updated compilation information 2004-06-11 16:13 kichik * /NSIS/trunk/Docs/src/history.but: updated history for 2.01 2004-06-11 15:33 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: - added BGFont that allows setting the background text font - made Times New Roman default font for the background text because it should always have support for the locale's language 2004-06-11 13:25 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh: updated by Yaron Shahrabani 2004-06-11 11:24 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/zlib/INFBLOCK.C: case changes for #include lines for cross compiling (Michiel Ephraim) 2004-06-04 16:33 kichik * /NSIS/trunk/Contrib/System/System.html: html fixes 2004-06-04 16:31 kichik * /NSIS/trunk/Contrib/System/System.html, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Examples/makensis.nsi: new, hopefully more informative, System plug-in documentation 2004-06-04 15:32 kichik * /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.vcproj, /NSIS/trunk/Contrib/System/WhatsNew.txt, /NSIS/trunk/Plugins/System.dll: (brainsucker) bug-fix-release, 4.06.2004 1. System::Copy /SIZE fixed (Kichik). 2. System::Copy with destination auto-allocation now pushes destination address on stack. 3. Callbacks fixed (Kichik's kick is awesome). 2004-06-04 11:52 kichik * /NSIS/trunk/Source/clzma.h: hCompressionThread is not an handle on POSIX, casting added 2004-06-04 11:49 kichik * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: test both cases 2004-06-04 11:05 kichik * /NSIS/trunk/Source/script.cpp: SetOutPath "-" works again 2004-06-01 12:29 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: fixed cvs root patching 2004-05-28 14:03 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: should be $R0, not $0 2004-05-20 19:44 kichik * /NSIS/trunk/Contrib/System/Source/Buffers.c: a character in the destination buffer address was skipped if size wasn't specified 2004-05-15 11:22 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed the next/back buttons bug caused by the last fix 2004-05-12 09:44 joostverburg * /NSIS/trunk/Menu/update.html: releases / development files 2004-05-09 11:54 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe: description text position 2004-05-08 17:40 kichik * /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/czlib.h: show meaningful error strings and not just numbers for compression errors 2004-05-08 16:07 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages 2004-05-08 14:39 kichik * /NSIS/trunk/Source/build.cpp: print output file path on win32 too 2004-05-08 13:05 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: fixed ${NSISDIR} on POSIX when makensis is called with an absolute path 2004-05-08 11:35 kichik * /NSIS/trunk/Source/script.cpp: fixed local include on POSIX 2004-05-08 11:34 kichik * /NSIS/trunk/Source/util.cpp: always go forward in the POSIX implmentation of CharNext 2004-05-07 11:16 kichik * /NSIS/trunk/Source/build.cpp: use NSIS_MAX_STRLEN, not an arbitrary number 2004-05-07 11:16 kichik * /NSIS/trunk/Source/script.cpp: bigger MAX_LINELENGTH 2004-05-03 18:40 joostverburg * /NSIS/trunk/Include/WinMessages.nsh: added WM_SETTINGCHANGE 2004-05-02 12:02 joostverburg * /NSIS/trunk/Contrib/Makensisw/resource.rc: window caption 2004-05-01 19:44 kichik * /NSIS/trunk/Source/clzma.h: LZMA compression should again work on Windows 95 2004-05-01 12:57 kichik * /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h: - comment update for bug report #945607 - compile error fix for MinGW 2004-05-01 12:41 kichik * /NSIS/trunk/Source/build.cpp: - fixed bug report #945832 - fixed a crash under some POSIX platforms in the code that gets the fully qualified path to the output file 2004-04-24 19:16 kichik * /NSIS/trunk/Source/exehead/Ui.c: GetDiskFreeSpaceEx on NT4 doesn't seem to like NULLs, even though MSDN says it should 2004-04-24 12:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fix 2004-04-21 20:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: fix 2004-04-21 17:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: typo 2004-04-17 09:29 kichik * /NSIS/trunk/Source/script.cpp: fixed File /r 2004-04-16 22:44 kichik * /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/exehead/fileform.c: Converted the LZMA decoder to a state machine like zlib and bzip2. The new method is smaller and safer because there is no need for hideous thread synchronization. The new method also works on Windows 95, unlike the previous one which was using InterlockedCompareExchange. 2004-04-16 22:36 kichik * /NSIS/trunk/Source/exehead/exec.c: back to 34kb for good old zlib exehead 2004-04-16 15:23 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh: fix 2004-04-15 16:12 joostverburg * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf: v6 2004-04-15 16:11 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: 1.68 2004-04-09 13:17 kichik * /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: 1.06 2004-04-09 12:47 kichik * /NSIS/trunk/Source/exehead/util.c: is_valid_instpath: don't check the current directory, check the root directory 2004-04-05 13:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: removed a slash 2004-04-02 15:18 kichik * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/credits.but: - updated list of translators - added SW_HIDE to ShellExec's documentation 2004-03-29 20:21 kichik * /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/IMyUnknown.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Makefile, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/trees.c, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: - makensis should now compile on any POSIX compliment platform (Linux, *BSD, Mac OS X, etc.) - improved makefiles so nothing is compiled when it's already up-to-date - Added SW_HIDE to ExecShell's accepted show modes 2004-03-24 21:14 joostverburg * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf: fixes 2004-03-17 14:32 joostverburg * /NSIS/trunk/Contrib/Language files/Turkish.nlf: fixes 2004-03-14 12:00 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/lang.cpp: updated error messagebox text 2004-03-12 21:01 kichik * /NSIS/trunk/Source/exehead/exehead-lzma.dsp: use __fastcall for LZMA instead of __stdcall because it's smaller and should be faster 2004-03-12 20:43 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/exedata.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Makefile, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/ShConstants.h, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/uservars.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: - updated the makefiles and code to allow compliation with MinGW once again (some of patch #875485 by perditionc) - fixed errors and warnings given by gcc 2004-03-12 10:28 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: always create a valid standard input handle 2004-03-11 19:29 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp: made search for .dll in plug-in names case insensitive 2004-03-11 17:13 joostverburg * /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: fixes 2004-03-07 10:46 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: new LZMA source files 2004-03-06 18:37 kichik * /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL, /NSIS/trunk/Source/7zip/LZMADecode.c, /NSIS/trunk/Source/7zip/LZMADecode.h, /NSIS/trunk/Source/7zip/lzmaNSIS.cpp, /NSIS/trunk/Source/7zip/lzmaNSIS.h, /NSIS/trunk/Source/exehead/exehead-lzma.dsp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/Platform.h, /NSIS/trunk/Source/strlist.h: - lzma exehead is now 34kb instead of 34.5kb thanks to the new LZMA C SDK and should be much faster due to removal of critical section usage (not tested too much, test before usage) - applied some parts of patch #875485 2004-03-06 12:31 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/zlib/INFBLOCK.C: Windows 95 (OSR2)/98/ME no longer see drive free space capped to 2GB. 2004-03-04 21:37 joostverburg * /NSIS/trunk/Docs/src/tutorial.but: updated outdated info about shell extensions and compression methods 2004-02-29 15:44 joostverburg * /NSIS/trunk/Contrib/Graphics/Header/orange.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-nsis.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-r.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-r-nsis.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-uninstall.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-uninstall-nsis.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-uninstall-r.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp, /NSIS/trunk/Contrib/Graphics/Icons/orange-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/orange-install-nsis.ico, /NSIS/trunk/Contrib/Graphics/Icons/orange-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/orange-uninstall-nsis.ico, /NSIS/trunk/Contrib/Graphics/Wizard/orange.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/orange-nsis.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/orange-uninstall.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/orange-uninstall-nsis.bmp: new Orange theme graphics 2004-02-27 14:13 kichik * /NSIS/trunk/Source/script.cpp: only append the last part of the path specified using InstallDir if it is not also the first 2004-02-26 17:03 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: return value info 2004-02-25 23:31 joostverburg * /NSIS/trunk/Menu/update.html: link to development page 2004-02-23 18:39 joostverburg * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/makenssi.cpp: license notes 2004-02-23 17:46 joostverburg * /NSIS/trunk/Examples/makensis.nsi: link text not cut off when high dpi setting is used 2004-02-23 17:22 joostverburg * /NSIS/trunk/Contrib/Graphics/Wizard/orange.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/orange-uninstall.bmp: wrong filenames 2004-02-21 15:42 eccles * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Note about BITMAPs being centered. 2004-02-21 15:28 eccles * /NSIS/trunk/Contrib/Modern UI/System.nsh: Now, IO bitmaps never have any surrounding background. 2004-02-21 15:18 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: We now centre bitmaps manually, to avoid differences in behaviour between XP and everything else. 2004-02-20 17:29 joostverburg * /NSIS/trunk/Docs/src/usefulinfos.but: typo 2004-02-20 15:13 kichik * /NSIS/trunk/Source/exehead/Ui.c: AllowRootDirInstall should now work along with InstallDirRegKey when the specified registry value contains a root directory without a trailing backslash. When writing $INSTDIR as is, this will always be the case. 2004-02-17 13:38 joostverburg * /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: 1.03 - Added commands support for uninstall sections and functions - Fixed variables switch in "StrLoc" and "StrTok" after using these 2004-02-16 19:11 joostverburg * /NSIS/trunk/Contrib/Graphics/Header/orange.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-r.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-uninstall.bmp, /NSIS/trunk/Contrib/Graphics/Header/orange-uninstall-r.bmp, /NSIS/trunk/Contrib/Graphics/Icons/orange-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/orange-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Wizard/orange.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/orange-uninstall.bmp: Orange theme by MoNKi 2004-02-15 13:03 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Include/UpgradeDLL.nsh: UpgradeDLL: rundll32l not always in $SYSDIR 2004-02-14 19:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: background color for welcome/finish page bitmap not set when image is stretched 2004-02-11 22:00 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: fixes 2004-02-10 23:29 anoncvs_ezcontents * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Calling show after a failed initDialog caused a freeze. 2004-02-08 13:53 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: option text 2004-02-08 13:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: Expand all / Hide all options 2004-02-08 13:05 kichik * /NSIS/trunk/Docs/src/history.but: fixed typo - MUI 1.70, not 1.79 2004-02-07 21:13 * /NSIS/tags/v20, /NSIS/tags/v20/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20/Contrib/InstallOptions/resource.h, /NSIS/tags/v20/Contrib/Makensisw/afxres.h, /NSIS/tags/v20/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20/Contrib/NSISdl/connection.h, /NSIS/tags/v20/Contrib/NSISdl/httpget.h, /NSIS/tags/v20/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20/Contrib/Splash/splash.dsw, /NSIS/tags/v20/Contrib/zip2exe, /NSIS/tags/v20/Contrib/zip2exe/Base.nsh, /NSIS/tags/v20/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v20/Contrib/zip2exe/icon.ico, /NSIS/tags/v20/Contrib/zip2exe/main.cpp, /NSIS/tags/v20/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v20/Contrib/zip2exe/res.rc, /NSIS/tags/v20/Contrib/zip2exe/resource.h, /NSIS/tags/v20/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20/Source/exehead/bin2h.c, /NSIS/tags/v20/Source/exehead/bin2h.exe, /NSIS/tags/v20/Source/exehead/Makefile, /NSIS/tags/v20/Source/exehead/uninst.ico, /NSIS/tags/v20/Source/Makefile, /NSIS/tags/v20/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20'. 2004-02-07 21:13 kichik * /NSIS/trunk/Examples/cvsdata.nsi: added Contrib\\Modern UI\\images 2004-02-07 15:47 kichik * /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: (deguix) replaced StrSort and updated documentation some more 2004-02-07 14:24 kichik * /NSIS/trunk/Source/exehead/util.c: check if smaller than 31 (=control char) as unsigned 2004-02-07 00:42 kichik * /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: rc4->final 2004-02-07 00:39 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/StrFunc.nsi, /NSIS/trunk/Include/StrFunc.nsh, /NSIS/trunk/Include/StrFunc.txt: added deguix's collection of string functions 2004-02-06 23:55 kichik * /NSIS/trunk/Docs/src/history.but: updates 2004-02-06 23:27 joostverburg * /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: bottom text link 2004-02-06 23:17 joostverburg * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/arrow.gif, /NSIS/trunk/Menu/images/arrowd.gif, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/menu.gif, /NSIS/trunk/Menu/images/menud.gif, /NSIS/trunk/Menu/images/site.gif, /NSIS/trunk/Menu/images/version.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: NSIS 2.0 2004-02-06 23:14 joostverburg * /NSIS/trunk/Contrib/VPatch/Readme.html: fix 2004-02-06 23:03 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/VPatch/Readme.html: design 2004-02-06 23:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/images, /NSIS/trunk/Contrib/Modern UI/images/closed.gif, /NSIS/trunk/Contrib/Modern UI/images/header.gif, /NSIS/trunk/Contrib/Modern UI/images/open.gif, /NSIS/trunk/Contrib/Modern UI/images/screen1.png, /NSIS/trunk/Contrib/Modern UI/images/screen2.png, /NSIS/trunk/Contrib/Modern UI/Readme.gif, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/Screenshot.png, /NSIS/trunk/Contrib/Modern UI/Screenshot2.png, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.70 * Improved documentation * New Init custom function for Welcome and Finish page 2004-02-06 22:37 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: only free the PIDL in DirProc, don't parse it too so g_tmp gets overwritten with the entire path instaed of just the display name 2004-02-06 18:19 kichik * /NSIS/trunk/Examples/silent.nsi: typo 2004-02-06 17:36 kichik * /NSIS/trunk/Contrib/zip2exe/main.cpp: replaced tabs with spaces 2004-02-06 16:56 kichik * /NSIS/trunk/Contrib/AdvSplash/Example.nsi: llama.bmp doesn't have the color 0x00005B in it 2004-02-06 16:31 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c: made the command line parser cut right on /D= and _?= and not one char before. this way foo.exe "bla"/D=..., which appears to be valid in other applications, will not get the last quote cut off. 2004-02-05 21:47 kichik * /NSIS/trunk/nsisconf.nsh: UninstallIcon, not UnIcon 2004-02-05 14:06 eccles * /NSIS/trunk/Source/exehead/Main.c: cmdline and realcmds might not be pointing to the same string. 2004-02-05 12:19 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp: fixed some mismatched new and delete operators 2004-02-04 23:12 kichik * /NSIS/trunk/Source/exehead/Main.c: fixed uninstallers (thanks again eccles ;) 2004-02-04 22:40 kichik * /NSIS/trunk/Source/exehead/Main.c: fixed $CMDLINE corruption (thanks eccles) 2004-02-04 21:13 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/silent.but, /NSIS/trunk/Docs/src/usefulfunc.but: - updated history - added information about silent installers/uninstallers 2004-02-04 20:03 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: made the command line parser not ignore any switch just before it didn't have a switch before it 2004-02-04 14:46 kichik * /NSIS/trunk/Docs/src/var.but: added information about constants' availability 2004-02-04 11:53 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: fix 2004-02-03 22:18 joostverburg * /NSIS/trunk/Docs/src/generalpurpose.but: more fixing 2004-02-03 13:51 kichik * /NSIS/trunk/Source/makenssi.cpp: updated /hdrinfo to include information about lzma too 2004-02-03 13:44 kichik * /NSIS/trunk/Source/build.cpp: Some system I tested on didn't quite get the END part and seeked beyond the end of the file which caused the CRC checksum to be written in a place where the exehead didn't expect it. Because of this, all solid installers compiled on that system failed CRC. 2004-02-02 20:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fix 2004-02-02 18:59 joostverburg * /NSIS/trunk/Docs/src/generalpurpose.but: another fix 2004-02-02 16:59 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fix 2004-02-02 16:00 joostverburg * /NSIS/trunk/Docs/src/history.but: NSIS 1.x history 2004-02-02 15:14 * /NSIS/tags/v20rc4, /NSIS/tags/v20rc4/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20rc4/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20rc4/Contrib/InstallOptions/resource.h, /NSIS/tags/v20rc4/Contrib/Makensisw/afxres.h, /NSIS/tags/v20rc4/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20rc4/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20rc4/Contrib/NSISdl/connection.h, /NSIS/tags/v20rc4/Contrib/NSISdl/httpget.h, /NSIS/tags/v20rc4/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20rc4/Contrib/Splash/splash.dsw, /NSIS/tags/v20rc4/Contrib/zip2exe, /NSIS/tags/v20rc4/Contrib/zip2exe/Base.nsh, /NSIS/tags/v20rc4/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v20rc4/Contrib/zip2exe/icon.ico, /NSIS/tags/v20rc4/Contrib/zip2exe/main.cpp, /NSIS/tags/v20rc4/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v20rc4/Contrib/zip2exe/res.rc, /NSIS/tags/v20rc4/Contrib/zip2exe/resource.h, /NSIS/tags/v20rc4/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20rc4/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20rc4/Source/exehead/bin2h.c, /NSIS/tags/v20rc4/Source/exehead/bin2h.exe, /NSIS/tags/v20rc4/Source/exehead/Makefile, /NSIS/tags/v20rc4/Source/exehead/uninst.ico, /NSIS/tags/v20rc4/Source/Makefile, /NSIS/tags/v20rc4/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20rc4'. 2004-02-02 15:14 kichik * /NSIS/trunk/Examples/makensis.nsi: no more *.rc for nsisdl 2004-02-02 15:09 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: rc3->rc4 2004-02-02 14:13 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: missing "if" 2004-02-02 14:06 kichik * /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: notes about proxies 2004-02-01 23:55 eccles * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: - "Restores focus to its previous state when exiting" was broken. 2004-02-01 22:11 kichik * /NSIS/trunk/Contrib/NSISdl/resource.h, /NSIS/trunk/Contrib/NSISdl/Script1.rc: no longer needed 2004-02-01 18:52 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Plugins/nsisdl.dll: All windows are now created in the main thread where the main dialog is created. This should fix any weird user32.dll crashes caused by different types of messages sent to the main dialog during destruction of the NSISdl dialog. This also reduces the size of the DLL by 0.5KB :) 2004-02-01 15:50 eccles * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/Script1.rc, /NSIS/trunk/Plugins/nsisdl.dll: - Fixed potential crash caused by WinSock being shutdown while the connection is still open. - Cleaned up dialog creation a little (some details, such as font, were being changed after the dialog was already visible). - Restores focus to its previous state when exiting. - Fixed another one of those "holding down Cancel at the wrong moment can cause the installer to suddenly exit" problems. 2004-02-01 11:18 joostverburg * /NSIS/trunk/Menu/images/version.gif: rc4 2004-01-31 19:54 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/nsExec.dll: fixed mishandling of MBCS chars 2004-01-31 13:35 joostverburg * /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Farsi.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: updated Farsi / Persian langauge files 2004-01-30 23:51 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: - fixed two bugs which caused MBCS chars to be treated wrongly in validate_filename and therefore trim too much when validating a path - converted minus ones to INVALID_FILE_ATTRIBUTES 2004-01-30 22:31 kichik * /NSIS/trunk/Source/makenssi.dsp: - compiles without PSDK again - moved all defines that are missing without PSDK to Platform.h 2004-01-30 22:25 kichik * /NSIS/trunk/Source/Platform.h: - compiles without PSDK again - moved all defines that are missing without PSDK to Platform.h 2004-01-30 22:04 kichik * /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/util.cpp: - compiles without PSDK again - moved all defines that are missing without PSDK to Platform.h 2004-01-30 20:37 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: fixed a bug that was present since at least 1.3, which caused IO to read heap memory beyond pszListItems and possibly to crash 2004-01-29 23:18 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c: forced a clean-up of the plugins dir and solid installer's temp file on reboot since the regular one wasn't called on windows 9x 2004-01-29 19:34 joostverburg * /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/pages.but: fixes 2004-01-29 13:58 joostverburg * /NSIS/trunk/Contrib/Language files/Macedonian.nlf: no need for a codepage 2004-01-29 13:57 joostverburg * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SerbianLatin.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SerbianLatin.nsh: Latin/Cyrillic version 2004-01-29 12:50 joostverburg * /NSIS/trunk/Docs/src/credits.but: Nike 2004-01-29 01:23 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: fixed some compile errors caused by removing some config.h options 2004-01-28 21:22 joostverburg * /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but: new URLs 2004-01-28 20:23 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: page settings info 2004-01-28 19:03 joostverburg * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh: Cyrillic, updated 2004-01-27 21:47 joostverburg * /NSIS/trunk/Menu/index.html: new URLs 2004-01-27 18:44 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.h: fixed logging 2004-01-27 16:58 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: ASCII only display names 2004-01-27 15:23 kichik * /NSIS/trunk/Contrib/InstallOptions/testnotify.nsi: Add the disabled flag too so when we return to this page it's disabled again 2004-01-26 16:33 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/update.html: new URLs 2004-01-26 16:27 joostverburg * /NSIS/trunk/Contrib/Language files/Indonesian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Indonesian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Indonesian language files 2004-01-26 03:38 * /NSIS/tags/v20rc3, /NSIS/tags/v20rc3/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20rc3/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20rc3/Contrib/InstallOptions/resource.h, /NSIS/tags/v20rc3/Contrib/Makensisw/afxres.h, /NSIS/tags/v20rc3/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20rc3/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20rc3/Contrib/NSISdl/connection.h, /NSIS/tags/v20rc3/Contrib/NSISdl/httpget.h, /NSIS/tags/v20rc3/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20rc3/Contrib/Splash/splash.dsw, /NSIS/tags/v20rc3/Contrib/zip2exe, /NSIS/tags/v20rc3/Contrib/zip2exe/Base.nsh, /NSIS/tags/v20rc3/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v20rc3/Contrib/zip2exe/icon.ico, /NSIS/tags/v20rc3/Contrib/zip2exe/main.cpp, /NSIS/tags/v20rc3/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v20rc3/Contrib/zip2exe/res.rc, /NSIS/tags/v20rc3/Contrib/zip2exe/resource.h, /NSIS/tags/v20rc3/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20rc3/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20rc3/Source/afxres.h, /NSIS/tags/v20rc3/Source/exehead/afxres.h, /NSIS/tags/v20rc3/Source/exehead/bin2h.c, /NSIS/tags/v20rc3/Source/exehead/bin2h.exe, /NSIS/tags/v20rc3/Source/exehead/Makefile, /NSIS/tags/v20rc3/Source/exehead/uninst.ico, /NSIS/tags/v20rc3/Source/Makefile, /NSIS/tags/v20rc3/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20rc3'. 2004-01-26 03:38 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: rc2->rc3 2004-01-26 03:29 kichik * /NSIS/trunk/Contrib/nsExec/test.nsi: no need for this return instruction 2004-01-26 03:29 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added some missing enabling and disabling of buttons to the settings window 2004-01-25 21:57 joostverburg * /NSIS/trunk/Menu/images/version.gif: rc3 2004-01-25 17:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: 1.68 2004-01-25 17:34 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf: v6 2004-01-24 22:54 joostverburg * /NSIS/trunk/Contrib/Language files/Latvian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Latvian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Latvian language files 2004-01-24 19:24 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Docs/src/history.but: implemented feature request #883741 - added double click support for MakeNSISW's settings dialog 2004-01-24 16:35 kichik * /NSIS/trunk/Docs/src/history.but: updated history 2004-01-24 16:35 kichik * /NSIS/trunk/Docs/src/script.but: added escaping to prevent a warning from halibut 2004-01-24 16:32 kichik * /NSIS/trunk/Source/script.cpp: fixed a bug that caused escaping not to be ignored on extended !define lines 2004-01-23 10:50 joostverburg * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/var.but: script format 2004-01-21 19:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Estonian.nsh: 1.68 2004-01-21 19:38 joostverburg * /NSIS/trunk/Contrib/Language files/Estonian.nlf: v6 2004-01-20 23:20 eccles * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/strlist.h: Installer would crash with certain combinations of language files when certain language strings were not referenced in all languages. 2004-01-20 22:22 kichik * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: ^Name -> ^NameDA where needed 2004-01-20 19:45 joostverburg * /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh: fixes 2004-01-20 18:10 icemank * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed resize bug. 2004-01-20 17:00 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed resize bug. 2004-01-20 15:03 icemank * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed window positioning in case of change in screen resolution or workarea size. 2004-01-20 13:01 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/NSIS Update/UI.exe: UI fix, log message 2004-01-20 09:11 joostverburg * /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh: fixes 2004-01-19 18:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: 1.68 2004-01-19 18:07 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: fixes 2004-01-17 22:36 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf: fixes 2004-01-17 18:41 joostverburg * /NSIS/trunk/Contrib/Language files/Russian.nlf: fixes 2004-01-17 18:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: use $(^NameDA) where needed 2004-01-17 13:00 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: fixes 2004-01-16 16:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh: fixes 2004-01-15 14:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: incorrect setting name 2004-01-12 23:23 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Now ignores WM_COMMAND messages received while the dialog is in the process of being created. 2004-01-12 20:02 joostverburg * /NSIS/trunk/Contrib/Graphics/Checks/colorful.bmp, /NSIS/trunk/Contrib/Graphics/Checks/modern.bmp, /NSIS/trunk/Contrib/Graphics/Checks/simple.bmp, /NSIS/trunk/Contrib/Graphics/Checks/simple-round.bmp, /NSIS/trunk/Contrib/Graphics/Checks/simple-round2.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/arrow.bmp: new, updated graphics 2004-01-12 18:06 joostverburg * /NSIS/trunk/Source/script.cpp: case insensitive shortcut key names should work now 2004-01-12 16:47 joostverburg * /NSIS/trunk/Contrib/Language files/Macedonian.nlf: code page 2004-01-11 20:50 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: many updates 2004-01-11 15:49 joostverburg * /NSIS/trunk/Contrib/Language files/Arabic.nlf: many updates 2004-01-11 15:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: 1.68 2004-01-11 12:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: 1.68 2004-01-09 23:08 joostverburg * /NSIS/trunk/Source/script.cpp: CreateShortcut shortcut key names case insensitive 2004-01-09 20:24 joostverburg * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh: fixes 2004-01-09 20:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: 1.68 2004-01-09 20:17 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: info 2004-01-08 22:42 joostverburg * /NSIS/trunk/Contrib/NSIS Update/Method.ini: text 2004-01-08 22:29 joostverburg * /NSIS/trunk/Docs/src/sec.but: SetCurInstType 2004-01-08 21:26 joostverburg * /NSIS/trunk/Contrib/NSIS Update/ExtractDLL.dll, /NSIS/trunk/Contrib/NSIS Update/Method.ini, /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/NSIS Update/Resources, /NSIS/trunk/Contrib/NSIS Update/UI.exe: improved user interface 2004-01-08 16:45 joostverburg * /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/ui.but: language strings, BringToFront 2004-01-08 15:13 joostverburg * /NSIS/trunk/Contrib/Graphics/Icons/arrow2-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/arrow2-uninstall.ico: new icons 2004-01-08 15:10 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: fixes 2004-01-07 20:49 joostverburg * /NSIS/trunk/Docs/src/compilerflags.but: compression info 2004-01-07 19:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/License.txt: copyright year 2004-01-07 19:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.69 * All uninstaller pages work without installer pages * Fixed top text on uninstaller license page 2004-01-07 16:45 joostverburg * /NSIS/trunk/Contrib/Language files/Catalan.nlf: fix 2004-01-07 16:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh: 1.68 2004-01-07 13:43 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: typo 2004-01-06 21:28 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/makenssi.cpp: more copyrights 2004 2004-01-06 17:07 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but: copyrights 2004-01-06 00:53 kichik * /NSIS/trunk/Source/7zip/lzmaNSIS.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/exehead/fileform.c: fixed a bunch of bugs that caused lzma and bzip2 not to function without solid compression 2004-01-05 21:53 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Links and Buttons no longer receive the initial keyboard focus as they take over the Enter key. 2004-01-05 15:36 kichik * /NSIS/trunk/Source/clzma.h: finish flag was not set when passed on the first call to Compress 2004-01-05 14:22 kichik * /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.h: fixed non solid compression using bzip2 or lzma 2004-01-04 22:56 * /NSIS/tags/v20rc2, /NSIS/tags/v20rc2/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20rc2/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20rc2/Contrib/InstallOptions/resource.h, /NSIS/tags/v20rc2/Contrib/Makensisw/afxres.h, /NSIS/tags/v20rc2/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20rc2/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20rc2/Contrib/NSISdl/connection.h, /NSIS/tags/v20rc2/Contrib/NSISdl/httpget.h, /NSIS/tags/v20rc2/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20rc2/Contrib/Splash/splash.dsw, /NSIS/tags/v20rc2/Contrib/zip2exe, /NSIS/tags/v20rc2/Contrib/zip2exe/Base.nsh, /NSIS/tags/v20rc2/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v20rc2/Contrib/zip2exe/icon.ico, /NSIS/tags/v20rc2/Contrib/zip2exe/main.cpp, /NSIS/tags/v20rc2/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v20rc2/Contrib/zip2exe/res.rc, /NSIS/tags/v20rc2/Contrib/zip2exe/resource.h, /NSIS/tags/v20rc2/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20rc2/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20rc2/Source/afxres.h, /NSIS/tags/v20rc2/Source/exehead/afxres.h, /NSIS/tags/v20rc2/Source/exehead/bin2h.c, /NSIS/tags/v20rc2/Source/exehead/bin2h.exe, /NSIS/tags/v20rc2/Source/exehead/Makefile, /NSIS/tags/v20rc2/Source/exehead/uninst.ico, /NSIS/tags/v20rc2/Source/Makefile, /NSIS/tags/v20rc2/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20rc2'. 2004-01-04 22:56 joostverburg * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: texts 2004-01-04 22:12 joostverburg * /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/version.gif: rc2 2004-01-04 21:05 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: rc1->rc2 2004-01-04 19:45 eccles * /NSIS/trunk/Source/exehead/Ui.c: Fixed a bug which caused beeping when the space key is hit on the components tree (kichik missed a bit...) 2004-01-04 18:14 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Focus is now set when control initialisation is complete (e.g. after Link control HWNDPROC has been changed) 2004-01-04 17:25 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: fixed compile errors without NSIS_CONFIG_COMPONENTPAGE, NSIS_CONFIG_PLUGIN_SUPPORT or NSIS_SUPPORT_HWNDS 2004-01-04 17:05 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/nsisdl.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: - fixed limit on LangStrings and user variables number which was lower than designed. limit is now 16383 for both. - made log window respond to the context menu key and not just right click - set back the default style for the next after it's re-enabled - set focus on main controls for every page (can still hit enter for next) - added code to prevent weird usage of WM_COMMAND which can cause weird behavior such as disabled next button on the components page - eccles fixed a bug which caused beeping when the space key is hit on the components tree 2004-01-04 14:06 eccles * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/testlink.ini, /NSIS/trunk/Contrib/InstallOptions/testnotify.ini, /NSIS/trunk/Contrib/InstallOptions/testnotify.nsi, /NSIS/trunk/Plugins/InstallOptions.dll: DLL version 2.4 (1/4/2004) * Initial focus is set in "initDialog" making it possible to override it from NSIS prior to calling "show" - When initial focus is to a Text field InstallOptions now follows standard Windows behaviour by having the text selected - Label and other static fields no longer have State= written to the INI file when leaving the dialog - NOTIFY flag can now be used with Link fields (State should be omitted in this case) - Likewise, State can now be used with Button fields (behaves the same as with Link fields) - NOTIFY flag can also now be used with ListBox and DropList fields to have NSIS notified when the selection changes - Meaning of RIGHT flag is now reversed in right-to-left language mode - HSCROLL and VSCROLL flags are no longer restricted to Text fields - Various Link field fixes - Text box colour bug fix 2004-01-04 13:15 kichik * /NSIS/trunk/Examples/UserVars.nsi: commit?! 2004-01-04 13:14 kichik * /NSIS/trunk/Examples/UserVars.nsi: removed useless colon and spaces (last one didn't work) 2004-01-04 13:13 kichik * /NSIS/trunk/Examples/UserVars.nsi: removed useless colon and spaces 2004-01-03 11:53 kichik * /NSIS/trunk/Docs/src/chmlink.js: no need for the alerts 2004-01-02 13:40 joostverburg * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/toolbar24d.bmp: more diabled images, free image lists 2004-01-01 23:02 joostverburg * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/toolbar24.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24d.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar24h.bmp: modern 24-bit toolbar for comctl32 => 4.70 2004-01-01 17:39 joostverburg * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/version.cpp: improved user interface 2004-01-01 16:30 kichik * /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/chmlink.js: this should solve any JScript errors by adding exception handling or drop to the simplest and ugliest solution if exception handling is not available 2004-01-01 16:28 kichik * /NSIS/trunk/Docs/src/langs.but: LangString affects the last used language too 2003-12-31 11:56 joostverburg * /NSIS/trunk/Docs/src/langs.but: multiple languages 2003-12-31 11:39 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: added some missing commas 2003-12-31 11:38 joostverburg * /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: fixes 2003-12-31 03:09 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: Minor fix. 2003-12-30 19:43 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added support for named Symbols sets. 2003-12-30 16:14 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh: 1.68 2003-12-30 16:14 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: fixes 2003-12-30 15:49 joostverburg * /NSIS/trunk/Docs/src/defines.but: fixes 2003-12-29 16:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: fix 2003-12-29 15:52 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: - best compressor wasn't choosing the best compressed file - pressing cancel on the compressor dialog now cancels the compilation 2003-12-29 15:12 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/nsisdl.dll, /NSIS/trunk/Source/exehead/Ui.c: - made NSIS ignore WM_COMMAND from disabled controls - made NSISdl set the cancel button as the default button 2003-12-29 14:27 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp: fixed branding text background color not updating when the system's color change 2003-12-28 23:50 joostverburg * /NSIS/trunk/Docs/src/intro.but: features list 2003-12-28 22:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: 1.68 2003-12-28 16:15 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: updates 2003-12-28 12:46 kichik * /NSIS/trunk/Docs/src/history.but: forgot about RTL improvements in rc1 2003-12-27 22:35 * /NSIS/tags/v20rc1, /NSIS/tags/v20rc1/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20rc1/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20rc1/Contrib/InstallOptions/resource.h, /NSIS/tags/v20rc1/Contrib/Makensisw/afxres.h, /NSIS/tags/v20rc1/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20rc1/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20rc1/Contrib/NSISdl/connection.h, /NSIS/tags/v20rc1/Contrib/NSISdl/httpget.h, /NSIS/tags/v20rc1/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20rc1/Contrib/Splash/splash.dsw, /NSIS/tags/v20rc1/Contrib/zip2exe, /NSIS/tags/v20rc1/Contrib/zip2exe/Base.nsh, /NSIS/tags/v20rc1/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v20rc1/Contrib/zip2exe/icon.ico, /NSIS/tags/v20rc1/Contrib/zip2exe/main.cpp, /NSIS/tags/v20rc1/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v20rc1/Contrib/zip2exe/res.rc, /NSIS/tags/v20rc1/Contrib/zip2exe/resource.h, /NSIS/tags/v20rc1/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20rc1/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20rc1/Source/afxres.h, /NSIS/tags/v20rc1/Source/exehead/afxres.h, /NSIS/tags/v20rc1/Source/exehead/bin2h.c, /NSIS/tags/v20rc1/Source/exehead/bin2h.exe, /NSIS/tags/v20rc1/Source/exehead/Makefile, /NSIS/tags/v20rc1/Source/exehead/uninst.ico, /NSIS/tags/v20rc1/Source/Makefile, /NSIS/tags/v20rc1/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20rc1'. 2003-12-27 22:35 joostverburg * /NSIS/trunk/Menu/images/version.gif: typo 2003-12-27 20:35 kichik * /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/version.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: b4 -> rc1 2003-12-27 19:10 kichik * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: - added missing 7zip source and CVS files - b5 -> rc1 2003-12-27 19:09 kichik * /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: b5 -> rc1 2003-12-27 18:43 kichik * /NSIS/trunk/Docs/src/history.but: - added information about updated VPatch - b5 -> rc1 2003-12-27 18:36 kichik * /NSIS/trunk/Contrib/VPatch/GenPat.exe, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GenPat2.dpr, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.pas, /NSIS/trunk/Contrib/VPatch/Source/GenPat/TreeCode.pas: VPatch 2.1: * Added argument checking and error handling to GenPat. Now returns exit codes as well to indicate success/failure (and the reason for failure). Only GenPat has changed in this version compared to 2.0 final. * Bug Fix: GenPat no longer gives an Access Violation when attempting to patch a file smaller than 64 bytes into a file larger than 64 bytes. 2003-12-26 19:54 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/var.but: added documentation for the new shell folders 2003-12-26 19:48 kichik * /NSIS/trunk/Docs/src/chmlink.js: fixed .nsi examples not starting 2003-12-25 13:31 kichik * /NSIS/trunk/Examples/languages.nsi: added multilingual license example 2003-12-25 12:26 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: added a note about SetOutPath to RegDLL's section 2003-12-24 22:50 kichik * /NSIS/trunk/Examples/one-section.nsi: typo fixed 2003-12-24 18:38 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Include/UpgradeDLL.nsh: UpgradeDLL now supports paths that contain variables 2003-12-24 18:10 joostverburg * /NSIS/trunk/TODO.txt: things to do for NSIS 2.1 or later 2003-12-24 18:06 joostverburg * /NSIS/trunk/Include/Sections.nsh: cleanup 2003-12-24 17:51 joostverburg * /NSIS/trunk/Examples/one-section.nsi: new example 2003-12-24 16:30 kichik * /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Include/Sections.nsh: Made StartRadioButtons not depend on $1 and added an option to work with multiple "radio buttons" blocks 2003-12-24 16:03 kichik * /NSIS/trunk/Docs/src/history.but: - a4 was released in 2002, not 2003 - fixed a grammer mistake (at->on) 2003-12-24 16:00 joostverburg * /NSIS/trunk/Source/exehead/lang.h: error message 2003-12-24 15:54 kichik * /NSIS/trunk/Examples/waplugin.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: - Disabled DirShow as it hasn't been working since b0 which was released more than a year ago. - Rewrote token placement checks to prevent a crash with: "Section uninstall InstallDir something" and to make it a bit more comfortable. 2003-12-24 13:12 joostverburg * /NSIS/trunk/TODO.txt: updates 2003-12-23 17:42 kichik * /NSIS/trunk/Docs/src/history.but: Added release dates 2003-12-23 16:29 kichik * /NSIS/trunk/Source/exehead/Ui.c: Returned WM_COMMAND forwarding as NSISdl is now fixed 2003-12-23 16:29 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: - Escape now works when focused on a link control - Fixed a link control bug that allowed the user to activate the link by clicking outside of the text 2003-12-23 14:24 kichik * /NSIS/trunk/Contrib/InstallOptions/ioptdll.rc, /NSIS/trunk/Contrib/LangDLL/resource.rc, /NSIS/trunk/Contrib/NSISdl/Script1.rc, /NSIS/trunk/Contrib/zip2exe/res.rc: include winresrc.h instead of afxresh which is not available on non Microsoft compilers (part of MFC it seems) 2003-12-22 18:50 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Back to former exehead overheads (zlib, bzip2 - 34, lzma - 34.5) 2003-12-22 14:34 ramon18 * /NSIS/trunk/Source/exehead/util.c: Shell Folders code now use "current user" if cannot retrieve nothing for "all users" 2003-12-22 14:02 ramon18 * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/ShConstants.h: Added ShConstants.h to makenssi project Size optimization on ui.c Some fixes in Shell Folders code 2003-12-22 00:28 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/uservars.h: Code clean up, removed NSIS_SUPPORT_NAMED_USERVARS and NSIS_SUPPORT_LANG_IN_STRINGS Added support for many new constants which get shell folders path without using the registry 2003-12-21 21:00 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Source/7zip/7zGuids.cpp: patches by PerditionC for compatibly with PSDK-less VC6 2003-12-21 20:33 eccles * /NSIS/trunk/Include/LogicLib.nsh: Command.com does not like command lines beginning with an '@' symbol. 2003-12-20 15:01 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: ${Unless} ${Cmd} ... was not working. 2003-12-19 15:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: 1.68 2003-12-18 19:19 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c: only add entries to wininit.ini if short names were retrieved successfully 2003-12-18 14:00 kichik * /NSIS/trunk/Examples/Modern UI/Basic.nsi: Oops, that was a test file 2003-12-17 23:57 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/silent.nsi: Added an example that demonstrates commands related to silent installers 2003-12-17 23:22 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Default.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Farsi.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: - Added SS_NOPREFIX for the static control above the install log so both will show the same when an ampersand is present in the string - Added another parameter for Name. It will be used in places where doubled ampersands are required for text to render as expected. Use it if you have an ampersand in your name. See the updated documentation about the Name command for more information about usage. 2003-12-17 16:13 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: - Fixed bug #858010 - defines were read wrongly into the settings dialog (`i' wasn't reset to 0) - Made Compile and Run execute the installer even if there were warnings 2003-12-17 13:07 kichik * /NSIS/trunk/Docs/src/compilerflags.but: SetCompressorDictSize didn't show 2003-12-16 16:32 kichik * /NSIS/trunk/Source/script.cpp: signed/unsigned mismatch 2003-12-15 15:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: 1.68 2003-12-14 22:09 kichik * /NSIS/trunk/Source/build.cpp: there is no pre function for custom pages, only create function 2003-12-14 17:59 joostverburg * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/style.css: documented new features, font size 2003-12-14 01:15 eccles * /NSIS/trunk/Examples/makensis.nsi: LogicLib added to distribution. 2003-12-14 01:13 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: Some tidying and documentation. 2003-12-14 00:31 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: 2.4: - Added Switch..Case*/Default..EndSwitch: similar to Select but behaves just like the C version (thanks to kichik). - Added unsigned integer comparisons. - Added 64-bit integer comparisons. - Added case-sensitive string tests. - Added other string relational comparisons. - Added section flag tests. 2003-12-14 00:29 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: 2.3: - Much reworking and refactoring. - Added built-in support for the rest of NSIS's conditional tests. - Added ability to use any NSIS conditional command in a normal If type statement. - Optimised the code produced by If (fewer Goto's). - Added statement similar to If that works in reverse: "Unless". - Fixed bug where using Continue in a Do..LoopUntil loop went to the top of the loop and not the loop condition. - Added DoWhile..Loop and Do..LoopWhile loop varieties. - Optimised the code prodiced by Select (fewer Goto's). - Renamed Case_Else to CaseElse. - CaseElse can also be called Default (for the C-minded). 2003-12-14 00:26 eccles * /NSIS/trunk/Include/LogicLib.nsh: 2.2: - Simplified IfThen by utilising If and EndIf. - Simplified For by utilising ForEach. - Fixed ForEach missing the final iteration. - Fixed a couple of Break/Continue bugs. 2003-12-14 00:25 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: 2.1: - Added continue and break labels to repeat type statements. 2003-12-14 00:23 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: NSIS Logic Library - dselkirk's logiclib 2.0: - Complete rewrite using new push/pop system. 2003-12-14 00:22 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: NSIS Logic Library - dselkirk's logiclib 1.3 (1.2 seems to have gone walkabout): - Changed library name to Lib. - Allow for 5 statements deep without use of name variable. - Added If..ElseIf..Else..Endif statements. - Fixed maximum allow statements. - Now allows 10 statement depth. - Condensed code. 2003-12-14 00:19 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: NSIS Logic Library - dselkirk's selectlib 1.1: - Added simplified macros and removed NAME requirement 2003-12-14 00:18 eccles * /NSIS/trunk/Examples/LogicLib.nsi, /NSIS/trunk/Include/LogicLib.nsh: NSIS Logic Library - dselkirk's original selectlib 1.0 2003-12-13 17:17 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/testnotify.ini, /NSIS/trunk/Plugins/InstallOptions.dll: Only validate if pressing the Next button. 2003-12-12 22:00 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Translation buffers were too small 2003-12-12 21:26 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed finish page link positioning, color (standard RRGGBB hex format) 2003-12-11 21:05 joostverburg * /NSIS/trunk/Examples/makensis.nsi: file association fix 2003-12-10 12:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: added MUI_SYSVERSION define 2003-12-09 19:43 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: updated reserve file info 2003-12-09 19:33 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/VPatch/Readme.html: updated reserve file info, fixes, html structure 2003-12-09 16:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh: 1.68 2003-12-08 22:30 kichik * /NSIS/trunk/Source/exehead/Ui.c: Around 20 bytes down 2003-12-08 14:06 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: First verify fields and then, only if all are valid, call the leave function 2003-12-08 12:53 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: - fixed bug #848868 - StartMenu trims 3 lines of text - made StartMenu treat different fonts better, it will not resize according to the selected font 2003-12-08 09:32 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/util.cpp: accept different order in install and uninstall icon files, as long as all of the sizes and color depths match 2003-12-06 20:45 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp: - Better RTL support: * use RTL reading wherever possible (shows the dots, commas, etc. in the correct order) * Message boxes are now RTL too * Fixed RTL for links in InstallOptions - Fixed tab order in StartMenu - Made StartMenu use SHGetSpecialFolderLocation (soon to be in NSIS core too) 2003-12-05 16:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh: 1.68 2003-12-05 16:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finish/abort header subtext can be set without setting the text 2003-12-05 16:03 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh: 1.68 2003-12-05 12:27 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Fixed bug #854678 - sub-header showing success on abort 2003-12-04 22:12 eccles * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/testnotify.ini, /NSIS/trunk/Contrib/InstallOptions/testnotify.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Plugins/InstallOptions.dll: - Added new control type "Button" - Added new flag "NOTIFY" - Added new flag "NOWORDWRAP" for multi-line text boxes - Reduced size down to 12K 2003-12-04 16:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: 1.68 2003-12-04 16:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: removed old font setting 2003-12-04 16:28 joostverburg * /NSIS/trunk/Examples/makensis.nsi: file association, section macros, fixes 2003-12-04 12:09 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: 1.68 2003-12-03 15:43 joostverburg * /NSIS/trunk/Examples/makensis.nsi: typo 2003-12-03 12:30 kichik * /NSIS/trunk/Examples/makensis.nsi: another spelling mistake (recommAnded) 2003-12-02 22:43 zarg * /NSIS/trunk/Examples/makensis.nsi: Speeling mishtake =) 2003-12-02 20:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: 1.68 2003-12-02 12:10 kichik * /NSIS/trunk/Examples/example2.nsi: missed Install_Dir 2003-12-02 01:22 ramon18 * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: Portuguese language files update (nsh->1.68) 2003-12-02 01:13 ramon18 * /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/Script1.rc, /NSIS/trunk/Plugins/nsisdl.dll: Crash fixes, including firewall problems, many Optimizations 2003-12-01 22:48 kichik * /NSIS/trunk/Source/tokens.cpp: Added LZMA to SetCompressor's list 2003-12-01 22:47 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: update/uninstall CVS data 2003-12-01 14:36 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: MUI 1.68 updates 2003-12-01 11:36 kichik * /NSIS/trunk/Examples/makensis.nsi: fixed typo and added lzma source code 2003-12-01 11:33 kichik * /NSIS/trunk/Source/makenssi.cpp: obey /V for line breaks too 2003-12-01 00:16 kichik * /NSIS/trunk/Source/script.cpp: no need for that variable 2003-11-30 18:00 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: build plug-in table only when needed. this also fixes warnings when using something like makensis.exe /X"OutFile bla.exe" /XSection /XSectionEnd 2003-11-30 16:44 kichik * /NSIS/trunk/Source/script.cpp: !ifmacro[n]def based now works with !else 2003-11-30 16:31 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: !ifmacro[n]def based on Anders Kjersem's code 2003-11-30 16:02 kichik * /NSIS/trunk/Source/7zip/lzmaNSIS.cpp, /NSIS/trunk/Source/clzma.h: - Fixed a race condition that happened when LZMA compression finished and occasionally deadlocked the next call (solid installers weren't affected, just the compiler) - Added try and catch for LZMA just in case one of the rare exceptions will be thrown (just compiler) 2003-11-29 16:10 kichik * /NSIS/trunk/Source/script.cpp: fixed !include not failing when it can't find the requested file 2003-11-28 19:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed finish page reboot option buttons 2003-11-28 19:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh: 1.68 2003-11-28 19:04 kichik * /NSIS/trunk/Source/exehead/Main.c: Removed extra back-slash in uninstaller execution path 2003-11-28 18:59 kichik * /NSIS/trunk/Source/exehead/Main.c: bug #848173 - add trailing backslash to the temporary directory so root directories will be recognized as directories and not just the drive path. 2003-11-28 18:52 kichik * /NSIS/trunk/Source/exehead/Main.c: Made temporary folder validator make sure the temporary directory variable contains a fully qualified path. If it doesn't it'll full back to %WINDIR%\Temp. If that doesn't either, it'll fail. This shoulf fix bug #848173 where it would fail with the wrong message on WINE. 2003-11-28 18:50 kichik * /NSIS/trunk/Source/exehead/Ui.c: Another little optimization 2003-11-28 17:57 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: - Made CRC checking from CD-ROM or a network drive faster - Some more optimizations 2003-11-28 05:16 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Minor fixes 2003-11-27 23:21 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: Some more optimizations 2003-11-27 21:29 joostverburg * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Menu/compiler.html: section structure, file associations, shell extensions 2003-11-27 20:19 kichik * /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/lzmaNSIS.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/script.cpp: - All message boxes in code now have a default for silent installers - Some size optimizations 2003-11-27 18:47 kichik * /NSIS/trunk/Source/script.cpp: clean offsets for EW_SETFILEATTRIBUTES that comes after EW_EXTRACTFILE 2003-11-27 14:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: 1.68, fixes 2003-11-26 20:27 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/clzma.h: Smaller memory requirements on compile time (dict * 2 + 5MB) 2003-11-26 17:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial3.ini: no separate INI file anymore 2003-11-26 17:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: 1.68 2003-11-26 13:58 kichik * /NSIS/trunk/Docs/src/bin/halibut/LICENCE: Misspelled 2003-11-26 13:57 kichik * /NSIS/trunk/Docs/src/bin/halibut/LICENSE: Added modification notice 2003-11-26 13:33 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.h: Changed display name for LZMA compressor 2003-11-25 21:07 icemank * /NSIS/trunk/Examples/makensis.nsi: Added context menu method for choosing compressor. 2003-11-25 21:06 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed compressor selection. Added context menu method for choosing compressor. Changed Defines dialog to Settings dialog 2003-11-25 18:11 joostverburg * /NSIS/trunk/Contrib/zip2exe/Base.nsh, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h: version 0.31 * LZMA compression support * Fixed compression setting 2003-11-25 17:18 kichik * /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Include/Sections.nsh: Applied patch #849000 - New sections macros for mutually exclusive section selection by Tim Gallagher 2003-11-25 17:07 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: - More path validation (drive id is an english letter, no chars under 32 in a path) - Fixed bug #839214 - message box shown in silent mode if a file can't be opened for writing. Now it will skip the file if AllowSkipFiles is on and abort if it's not. - Added /SD parameter for MessageBox. Allows to set default for silent installers (MessageBox MB_OKCANCEL "OK? Cancel?" /SD IDOK IDOK doOK IDCANCEL doCancel) 2003-11-25 10:51 kichik * /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALenCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALiteralCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBit.h, /NSIS/trunk/Source/7zip/lzmaNSIS.cpp: shaved 148 bytes, 236 more to go 2003-11-25 07:09 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Allow wildcards in !include 2003-11-25 06:25 kichik * /NSIS/trunk/Source/script.cpp: Added support for reading environmental variables on compile time - $%envVarName%. 2003-11-25 05:55 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp: Parse LangString using the codepage specified in NLF of the language. This helps avoid warnings about unknown variables with LangStrings that contain dollar signs but are not encoded with the system's current codepage. 2003-11-24 22:13 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: No such thing as MUI_UNINNERTEXT_LICENSE_TOP 2003-11-24 21:09 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh: Updated to 1.68 2003-11-24 19:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/Language files/Default.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.68 * New settings for extra space for title and text on Welcome page and Finish page. * Improved handling of verbose settings. Define MUI_VERBOSE the set the Modern UI verbose level (1-4). * Language file string for uninstaller reboot information * Setting for folder validation in leave function * Fixed finish page text settings for multiple pages 2003-11-24 19:36 kichik * /NSIS/trunk/Source/build.cpp: Backwards compatibilty - sections that use SectionIn RO and no other SectionIn should be in all installation types 2003-11-24 19:02 kichik * /NSIS/trunk/Source/7zip/readme.txt, /NSIS/trunk/Source/bzip2/Readme.txt: Note about different licenses 2003-11-24 18:54 kichik * /NSIS/trunk/Source/7zip/readme.txt: Note about code modification 2003-11-24 17:36 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Enabled LZMA selection 2003-11-24 17:05 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added DirVerify (works in PageEx directory) and GetInstDirError. If `DirVerify leave' is used, the next button will not be disabled if the installation directory is not valid or there is not enough space and a flag will be set instead. You can read that flag using GetInstDirError in the leave function of the directory page. A value of 0 means no error, 1 means invalid installation directory and 2 means not enough space. This allows you to handle those errors on your own. 2003-11-24 16:51 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added support for LZMA compressor + fixed command line compressor support 2003-11-24 14:22 kichik * /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Added NSIS_CONFIG_LOG_ODS that makes the log use OutputDebugString instead of install.log. 2003-11-24 13:29 kichik * /NSIS/trunk/Source/exehead/exec.c: Fixed bug #846723 - SetOutPath doesn't work with root directories 2003-11-24 13:11 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp: Uninstaller data offset is saved as EW_WRITEUNINSTALLER's parameters. A step forward to multiple uninstallers and smaller exehead. 2003-11-24 00:12 kichik * /NSIS/trunk/Source/exehead/exehead-lzma.dsp: removed a file 2003-11-24 00:08 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/7zip, /NSIS/trunk/Source/7zip/7zGuids.cpp, /NSIS/trunk/Source/7zip/7zip, /NSIS/trunk/Source/7zip/7zip/Common, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.cpp, /NSIS/trunk/Source/7zip/7zip/Common/OutBuffer.h, /NSIS/trunk/Source/7zip/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress, /NSIS/trunk/Source/7zip/7zip/Compress/LZ, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/IMatchFinder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZInWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZ/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMADecoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMADecoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALen.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALen.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALiteral.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/LZMALiteral.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/InBuffer.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMA.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMAConf.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALenCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALiteralCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZMAState.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/LZOutWindow.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/Compress/LZMA_SMALL/Types.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h, /NSIS/trunk/Source/7zip/7zip/Compress/RangeCoder/StdAfx.h, /NSIS/trunk/Source/7zip/7zip/ICoder.h, /NSIS/trunk/Source/7zip/7zip/IMyUnknown.h, /NSIS/trunk/Source/7zip/7zip/IStream.h, /NSIS/trunk/Source/7zip/Common, /NSIS/trunk/Source/7zip/Common/ComTry.h, /NSIS/trunk/Source/7zip/Common/CRC.cpp, /NSIS/trunk/Source/7zip/Common/CRC.h, /NSIS/trunk/Source/7zip/Common/Defs.h, /NSIS/trunk/Source/7zip/Common/MyCom.h, /NSIS/trunk/Source/7zip/Common/StdAfx.h, /NSIS/trunk/Source/7zip/Common/Types.h, /NSIS/trunk/Source/7zip/copying.txt, /NSIS/trunk/Source/7zip/lzmaNSIS.cpp, /NSIS/trunk/Source/7zip/lzmaNSIS.h, /NSIS/trunk/Source/7zip/readme.txt, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/clzma.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/exedata.cpp, /NSIS/trunk/Source/exedata.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exehead-lzma.dsp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/makenssi.dsw, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: - First LZMA enhanced NSIS version - experimental - Added SetCompressorDictSize (only works for LZMA) - Added SetCompressionLevel (only "works" for zlib and bzip2) - doesn't work for now - Section is only supposed to get 4 parameters if /o is specified - Updated version numbers 2003-11-21 21:57 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Fixed handling of command line SetCompressor option. 2003-11-21 21:47 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh: 1.67 update 2003-11-21 19:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: keep original verbose setting, added MUI_VERBOSE setting 2003-11-20 17:48 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: Fixed compressor initialization 2003-11-20 10:37 kichik * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh: Serbian language files update 2003-11-20 10:36 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh: Version number was wrong 2003-11-19 22:19 * /NSIS/tags/v20b4, /NSIS/tags/v20b4/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20b4/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20b4/Contrib/InstallOptions/ioptdll.rc, /NSIS/tags/v20b4/Contrib/InstallOptions/resource.h, /NSIS/tags/v20b4/Contrib/Makensisw/afxres.h, /NSIS/tags/v20b4/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20b4/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20b4/Contrib/NSISdl/connection.h, /NSIS/tags/v20b4/Contrib/NSISdl/httpget.h, /NSIS/tags/v20b4/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20b4/Contrib/Splash/splash.dsw, /NSIS/tags/v20b4/Contrib/zip2exe, /NSIS/tags/v20b4/Contrib/zip2exe/Base.nsh, /NSIS/tags/v20b4/Contrib/zip2exe/Classic.nsh, /NSIS/tags/v20b4/Contrib/zip2exe/icon.ico, /NSIS/tags/v20b4/Contrib/zip2exe/main.cpp, /NSIS/tags/v20b4/Contrib/zip2exe/Modern.nsh, /NSIS/tags/v20b4/Contrib/zip2exe/res.rc, /NSIS/tags/v20b4/Contrib/zip2exe/resource.h, /NSIS/tags/v20b4/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20b4/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20b4/Source/afxres.h, /NSIS/tags/v20b4/Source/exedata.h, /NSIS/tags/v20b4/Source/exehead/afxres.h, /NSIS/tags/v20b4/Source/exehead/bin2h.c, /NSIS/tags/v20b4/Source/exehead/bin2h.exe, /NSIS/tags/v20b4/Source/exehead/Makefile, /NSIS/tags/v20b4/Source/exehead/uninst.ico, /NSIS/tags/v20b4/Source/Makefile, /NSIS/tags/v20b4/Source/makenssi.dsw, /NSIS/tags/v20b4/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20b4'. 2003-11-19 22:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: corrections 2003-11-19 21:45 joostverburg * /NSIS/trunk/Examples/rtest.nsi: test GetFunctionAddress too 2003-11-19 21:27 kichik * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: Empty password for anonymous CVS 2003-11-19 21:24 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi: missing dir, function update 2003-11-19 17:40 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: functions, texts, link 2003-11-19 16:52 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: fixed accents 2003-11-19 16:28 joostverburg * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/intro.but: default strings, current folder 2003-11-19 15:51 joostverburg * /NSIS/trunk/Contrib/Language files/Slovenian.nlf: v6 2003-11-19 15:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: 1.67 2003-11-19 14:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh: 1.67 2003-11-19 14:08 kichik * /NSIS/trunk/Examples/viewhtml.nsi: Chapter1.html no longer comes with the default package 2003-11-19 13:51 kichik * /NSIS/trunk/Examples/bigtest.nsi: graphics path changed 2003-11-19 13:51 joostverburg * /NSIS/trunk/Contrib/Graphics/Icons/nsis1-install.ico: added 16x16 icon 2003-11-19 13:21 kichik * /NSIS/trunk/Examples/makensis.nsi: Removed "(CVS)" from version 2003-11-19 13:11 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: - Fixed bug #844989 - multiple uninstaller subsections problems - Removed "(CVS)" from version number 2003-11-19 04:38 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added compressor setting option 2003-11-18 23:40 zarg * /NSIS/trunk/Docs/src/attributes.but: LicenseText, ComponentText and DirText updated as they are no longer needed to show certain pages. These are now used to change the default text instead - which have been moved to the NLF files. 2003-11-18 22:35 kichik * /NSIS/trunk/Source/lang.cpp: Font goes in $(^Font), font size goes in $(^FontSize)... 2003-11-18 21:31 joostverburg * /NSIS/trunk/Contrib/Graphics/Header/nsis.bmp, /NSIS/trunk/Contrib/Graphics/Header/nsis-r.bmp, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: header image RTL support, fixed NOSTRETCH settings 2003-11-18 17:05 kichik * /NSIS/trunk/Docs/src/credits.but: Farsi language files credits 2003-11-18 17:04 kichik * /NSIS/trunk/Source/exehead/Ui.c: Only map X button to Next if we're on the last page 2003-11-18 17:01 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: html structure 2003-11-18 15:14 kichik * /NSIS/trunk/Contrib/Language files/Farsi.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Farsi.nsh: Farsi language files by FzerorubigD 2003-11-18 14:30 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.txt: Do not call SetBg from a section 2003-11-18 11:46 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: Updated to 1.67 - thanks F. Heidenreich! 2003-11-18 11:39 kichik * /NSIS/trunk/Examples/makensis.nsi: INI file missing 2003-11-17 23:16 kichik * /NSIS/trunk/Docs/src/tutorial.but: Fixed CHM link to MUI readme 2003-11-17 13:49 kichik * /NSIS/trunk/Docs/src/registry.but: WriteRegExpandStr should have a section of its own 2003-11-16 22:53 ramon18 * /NSIS/trunk/Docs/src/credits.but: Little update 2003-11-16 22:45 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/tutorial.but: Added information about uninstaller sections (bug #841421) 2003-11-16 22:38 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dpr, /NSIS/trunk/Contrib/ExDLL/exdll_with_unit.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: Applied patch #838864 - some more optimizations 2003-11-16 20:13 joostverburg * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/style.css: defaults bold and underlined 2003-11-16 19:57 joostverburg * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/style.css: updated outdated stuff, pages / plug-in calls / multiple languages improved, red defaults, fixes 2003-11-16 19:37 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/test.ini: - PROMPT_CREATE doesn't work with REQ_SAVE - Example INI file had old flag names 2003-11-16 18:55 kichik * /NSIS/trunk/Contrib/Language files/Arabic.nlf: Arabic is RTL 2003-11-16 15:16 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed a harmless typo and made MUI_LANGUAGE only warn once if a language file is out of date 2003-11-16 14:52 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.txt: dll not exe 2003-11-15 17:48 kichik * /NSIS/trunk/Docs/src/history.but: separated a bit 2003-11-15 17:26 kichik * /NSIS/trunk/Docs/src/history.but: Updated changelog and release notes 2003-11-15 15:54 kichik * /NSIS/trunk/Docs/src/credits.but: added Ramon and Hebrew translator 2003-11-14 21:08 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: Files are not valid installation folders 2003-11-14 17:09 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: fix 2003-11-14 16:47 joostverburg * /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: fix 2003-11-14 16:46 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh: 1.67 2003-11-14 13:44 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Plugins/BgImage.dll: Better error handling 2003-11-13 20:00 joostverburg * /NSIS/trunk/Contrib/Language files/Macedonian.nlf: fix 2003-11-13 13:04 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dpr, /NSIS/trunk/Contrib/ExDLL/exdll_with_unit.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: Applied patch #838864 - String-friendly Delphi ExDLL 2003-11-13 11:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed abort subheader, font langstrings 2003-11-12 22:38 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h: ^Font and ^FontSize 2003-11-12 20:24 kichik * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/AdvSplash/advsplash.dsp, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Banner/Banner.dsp, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.dsp, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/Dialer/dialer.dsp, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/exdll.dsp, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/LangDLL/LangDLL.dsp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.dsp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/Splash/splash.dsp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsp, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.dsp, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.dsp: Call the same DllMain for debug and release builds 2003-11-12 18:45 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: typo 2003-11-12 17:35 joostverburg * /NSIS/trunk/Examples/makensis.nsi: UpgradeDLL include file, removed old check 2003-11-12 12:55 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Include/UpgradeDLL.nsh: UpgradeDLL include file, VB6 runtime installation 2003-11-11 23:54 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.h: Link to CHM docs from MakeNSISw 2003-11-11 19:41 joostverburg * /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulfunc.but: updated UpgradeDLL, tutorial 2003-11-11 16:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed license page text 2003-11-11 16:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed finish page text space when using 3 lines title, welcome page after installation 2003-11-11 13:43 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: - Recompile and Run (DrO) - Fix for the context menu (DrO) 2003-11-10 22:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed custom header text 2003-11-10 22:27 joostverburg * /NSIS/trunk/Contrib/NSIS Menu/src/html/m_links.cpp, /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/arrow.gif, /NSIS/trunk/Menu/images/arrowd.gif, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/version.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: new style 2003-11-10 18:51 joostverburg * /NSIS/trunk/Examples/makensis.nsi: no need for makensis.htm anymore 2003-11-10 18:48 joostverburg * /NSIS/trunk/Examples/makensis.nsi: remove docs 2003-11-10 18:44 joostverburg * /NSIS/trunk/Menu/compiler.html: fix 2003-11-10 18:43 joostverburg * /NSIS/trunk/Examples/makensis.nsi: MUI Readme image 2003-11-10 13:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: start menu variable > page macro parameter 2003-11-09 23:10 ramon18 * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/exehead/Ui.c: Reverted "Examples\Modern UI\StartMenu.nsi" and "Plugins\StartMenu.dll" to previous version, little size optimization 2003-11-09 23:03 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: removed debug stuff 2003-11-09 22:45 ramon18 * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added new function LockWindow for flickering problems workaround, fixed crash on NSISdl, fixed focus button redraw 2003-11-09 22:12 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: - Improved and changed text settings - ID for Start Menu Folder pages, easier to use multiple pages - Language not written to registry after running uninstaller - Fixed uninstaller auto close - Documentation fixes - Cleanup 2003-11-07 21:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.gif, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.jpg, /NSIS/trunk/Contrib/Modern UI/System.nsh: different uninstaller header bitmap, fixes, cleanup 2003-11-07 17:59 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fixes, easier to read 2003-11-07 17:53 joostverburg * /NSIS/trunk/Contrib/Language files/Russian.nlf: fixes 2003-11-07 17:53 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: 1.67 2003-11-07 15:44 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh: updated Hebrew language files 2003-11-07 13:49 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fix 2003-11-06 15:05 joostverburg * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/index.html: HTML Help documentation 2003-11-06 14:06 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fix 2003-11-06 13:15 joostverburg * /NSIS/trunk/Contrib/AdvSplash/Example.nsi, /NSIS/trunk/Contrib/BgImage/Example.nsi: new Graphics folder 2003-11-06 00:58 kichik * /NSIS/trunk/Source/exehead/Ui.c: fixed 1%...35%...80%...100% bug with details set to textonly 2003-11-05 16:05 joostverburg * /NSIS/trunk/Contrib/Graphics/Header/nsis.bmp, /NSIS/trunk/Contrib/Graphics/Header/win.bmp: 256 colors 2003-11-05 16:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: added MUI_(UN)WELCOMEFINISHPAGE_INI_3LINES, welcome page after installation works, doc fixes 2003-11-05 14:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finish page actions in leave function, check for NSIS_CONFIG_SILENT_SUPPORT 2003-11-05 14:20 joostverburg * /NSIS/trunk/Contrib/Graphics/Wizard/llama.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nsis.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nullsoft.bmp: 16 colors 2003-11-05 11:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: no language selection dialog when installation is silent 2003-11-04 21:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/ioSpecial3.ini, /NSIS/trunk/Contrib/Modern UI/System.nsh: only enable cancel on finish page when there are checkboxes, no compiler warning anymore 2003-11-04 21:24 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fix 2003-11-04 16:59 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: patch #835443 - simpler SetUserVariable 2003-11-04 16:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/ioSpecial3.ini, /NSIS/trunk/Contrib/Modern UI/System.nsh: Cancel enabled on Finish page, showreadme/run not executed when clicking cancel 2003-11-04 11:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: fix 2003-11-03 17:14 kichik * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/chm_config.but: - Updated preamble of CHM - Fixed build.bat - now updates CHM 2003-11-03 12:09 kichik * /NSIS/trunk/Docs/src/build.bat: Only copy CHM if it's different 2003-11-03 10:55 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: Updated "Calling an external DLL using the System.dll plugin" to be more precise about System parameters 2003-11-03 09:10 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/contents.c, /NSIS/trunk/Docs/src/bin/halibut/error.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/bin/halibut/makefile, /NSIS/trunk/Docs/src/bin/halibut/malloc.c, /NSIS/trunk/Docs/src/bin/halibut/misc.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.c, /NSIS/trunk/Docs/src/bin/halibut/ustring.c, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/chm_config.but, /NSIS/trunk/Docs/src/chmlink.js, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/modernui.but, /NSIS/trunk/Docs/src/nsis.hhp, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/var.but: CHM documentation generates using Halibut. Thanks Nike! 2003-11-03 09:01 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: SetUserVariable for Delphi ExDLL too - thanks spidervenom 2003-11-02 23:37 zarg * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/flowcontrol.but: Updated or made clearer cetarin commands and parameters, thanks to virtlink for the info. 2003-11-01 21:46 kichik * /NSIS/trunk/Docs/src/registry.but: DeleteINIStr and DeleteINISec do set the error flag if there was an error, but not if the key or string were not there before. 2003-11-01 21:41 kichik * /NSIS/trunk/Docs/src/registry.but: DeleteINIStr and DeleteINISec do not set the error flag 2003-11-01 19:56 eccles * /NSIS/trunk/Contrib/InstallOptions/Readme.html: More info about escaping special characters. 2003-11-01 18:42 kichik * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: No need for output from cvsdata.nsi unless it's an error (working this time) 2003-11-01 18:37 kichik * /NSIS/trunk/Examples/makensis.nsi: No need for output from cvsdata.nsi unless it's an error 2003-11-01 00:17 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: A backslash typed into a Text field with MULTILINE flag was not being escaped when saved back to State. 2003-10-31 18:05 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: abort custom function also work when not using abort warning 2003-10-31 15:23 joostverburg * /NSIS/trunk/Docs/style.css: invalid pseudo-class 2003-10-31 13:06 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf: fixed codepage number 2003-10-30 23:51 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: - Icon and bitmap controls were being passed the file name string on creation which the control would interpret as the name of a resource, and fail. - Now passes hInstance to LoadImage call which seems to solve a bizarre sporadic possible Windows bug where the LR_LOADFROMFILE parameter seems to be ignored. 2003-10-30 23:12 kichik * /NSIS/trunk/Source/exehead/Ui.c: That shouldn't have gotten in there... 2003-10-30 00:08 kichik * /NSIS/trunk/Source/exehead/Ui.c: Minimal TreeView item hieght is 16, the height of the checbox 2003-10-28 22:59 kichik * /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Norwegian.nlf: No need to escape quotes, the slashes will show in the output 2003-10-28 18:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: 1.67 2003-10-28 18:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: 1.67 2003-10-28 16:59 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: 1.67 2003-10-28 16:58 joostverburg * /NSIS/trunk/Contrib/Language files/Swedish.nlf: v6 2003-10-27 17:05 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: fixes 2003-10-27 15:46 kichik * /NSIS/trunk/Source/script.cpp: Fixed bug #830913 - if /nonfatal is used a warning should be displayed, not an error 2003-10-27 13:55 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fixes 2003-10-27 12:54 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf: UninstallingText 2003-10-27 12:53 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: 1.67 2003-10-26 16:27 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: UninstallingText 2003-10-26 16:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: 1.67 2003-10-26 13:33 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fixes 2003-10-25 20:50 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf: lang ID 2003-10-24 17:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: category fix 2003-10-24 17:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: renamed MUI_CHECKBITMAP to MUI_COMPONENTSPAGE_CHECKBITMAP 2003-10-24 15:56 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fixes 2003-10-24 14:07 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc: tab stop for license data - thanks Nick Allan 2003-10-24 11:48 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: UninstallingText 2003-10-24 11:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: 1.67 2003-10-23 22:19 ramon18 * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: FIX - Portuguese language (upsss) 2003-10-23 22:17 ramon18 * /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: Portuguese language files update (nsh->1.67) (UninstallingText changed) 2003-10-23 20:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: 1.67 2003-10-23 20:34 joostverburg * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: UninstallingText 2003-10-23 16:21 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: UninstallingText 2003-10-23 16:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: 1.67 2003-10-23 14:34 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: UninstallingText 2003-10-23 14:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: 1.67 2003-10-23 14:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: version 2003-10-23 13:01 joostverburg * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but: credits, history, links, fix 2003-10-23 12:53 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf: UninstallingText 2003-10-23 12:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: 1.67 2003-10-23 12:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial3.ini, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixes: header text, 3 lines welcome/finish title, alternative comp page, docs 2003-10-22 19:23 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Default.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.67 2003-10-22 12:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: fixes 2003-10-21 20:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh: new format 2003-10-20 12:22 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: fixes 2003-10-20 12:15 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh: 1.66 2003-10-20 12:14 joostverburg * /NSIS/trunk/Contrib/Language files/Serbian.nlf: v6 2003-10-19 14:32 joostverburg * /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: v6 2003-10-18 21:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: support for uninst license, directory pages 2003-10-18 21:28 joostverburg * /NSIS/trunk/Contrib/Language files/Macedonian.nlf: v6 2003-10-18 21:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: 1.66 2003-10-17 20:59 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: support for uninst license, directory pages 2003-10-17 20:07 joostverburg * /NSIS/trunk/Contrib/Language files/Norwegian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Norwegian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Norwegian langauge files 2003-10-17 19:55 ramon18 * /NSIS/trunk/Contrib/Modern UI/System.nsh: Fixed hidden controls in header if welcome page is skipped 2003-10-17 12:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: support for uninst license, directory pages 2003-10-17 11:10 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: support for uninst license, directory pages 2003-10-16 22:11 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new languages 2003-10-16 21:39 joostverburg * /NSIS/trunk/Contrib/Language files/Czech.nlf: v6 2003-10-16 21:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh: 1.66 2003-10-16 19:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Default.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Estonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: Modern UI language files backwards compatible 2003-10-16 19:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: removed old macro 2003-10-16 19:24 joostverburg * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf: fix 2003-10-16 15:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: 1.66 2003-10-15 22:53 kichik * /NSIS/trunk/Source/exehead/Ui.c: Fixed bug #821933 - InstallDirRegKey .exe comparation is case-sensitive 2003-10-14 19:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: fix 2003-10-14 19:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: AutoCloseWindow setting, uninst components page fixes 2003-10-14 12:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: langauge fonts 2003-10-14 12:31 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh: fixes 2003-10-12 22:48 zarg * /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/usection.but: Changed some spelling mistakes and gramma. 2003-10-12 16:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe: page style 2003-10-12 14:54 kichik * /NSIS/trunk/Docs/src/bin/halibut/LICENSE: Halibut's license 2003-10-12 12:52 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: improved GetParent, GetParameters 2003-10-11 15:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed custom header text 2003-10-11 12:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed interface problems when there are only custom pages 2003-10-09 22:19 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: grammer fix 2003-10-09 22:16 kichik * /NSIS/trunk/Examples/makensis.nsi: always quote paths in UninstallString 2003-10-09 14:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: header subtext can be changed without changing text 2003-10-08 18:06 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/pages.but: SubCaption for PageEx 2003-10-08 18:00 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: location of LangDLL registry settings 2003-10-08 17:44 joostverburg * /NSIS/trunk/Examples/makensis.ini, /NSIS/trunk/Examples/makensis.nsi: check for already installed versions 2003-10-08 15:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: updated reserve file macros 2003-10-08 11:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: updated info about customized dialogs 2003-10-08 11:19 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new position for interface settings 2003-10-07 19:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: removed invalid undef 2003-10-07 18:13 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: typo 2003-10-07 18:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: new position for interface settings, changed setting names, updated documentation 2003-10-07 14:39 joostverburg * /NSIS/trunk/Docs/src/config.but: web links 2003-10-05 15:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh: new language system 2003-10-05 15:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: 1.66 2003-10-05 15:32 joostverburg * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf: v6 2003-10-05 15:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh: fixes 2003-10-05 11:00 eccles * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Docs/src/var.but: Typos and spelling mistakes etc. 2003-10-02 17:08 joostverburg * /NSIS/trunk/Contrib/Graphics/Icons/classic-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/win-install.ico: improved 16x16 icons 2003-10-02 12:20 kichik * /NSIS/trunk/Source/exehead/ui.h: some parentheses just to be sure 2003-10-02 12:03 kichik * /NSIS/trunk/Source/exehead/exec.c: validate shortcut target, if it turns up as a valid path spec (URLs should still work) 2003-10-02 11:46 kichik * /NSIS/trunk/Source/makenssi.cpp: make sure the notify HWND is valid 2003-10-01 17:55 joostverburg * /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/clear.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/intro.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: Quick Launch page 2003-09-30 15:56 joostverburg * /NSIS/trunk/Contrib/Graphics/Icons/win-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/win-uninstall.ico: 16 colors, added 16x16 icons 2003-09-30 15:13 joostverburg * /NSIS/trunk/Contrib/Graphics/Icons/win-uninstall.ico: classic win style uninstall icon 2003-09-30 11:44 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Bug in UpgradeDLL, thanks TonyDS 2003-09-29 12:43 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Better context menu handling by DrO 2003-09-29 10:59 joostverburg * /NSIS/trunk/Contrib/Graphics/Icons/classic-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/nsis1-uninstall.ico: classic/nsis1 uninstall icons 2003-09-28 16:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/nsisconf.nsh: mui nsisconf macro backwards compatible 2003-09-28 15:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/nsisconf.nsh: nsisconf header: more info, Modern UI support, updated paths 2003-09-28 15:24 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: - Initial keyboard focus set to first (tab-able) field. - Multi-line text boxes now wrap long lines unless horizontal scroll bar is enabled. 2003-09-28 12:46 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: setting name typo 2003-09-28 12:42 joostverburg * /NSIS/trunk/Contrib/zip2exe/Base.nsh, /NSIS/trunk/Contrib/zip2exe/Classic.nsh, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/Modern.nsh, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h, /NSIS/trunk/Examples/makensis.nsi: Zip2Exe 0.3: based on header files, improved interface, Modern UI support, new script code, improved folder detection 2003-09-28 12:14 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c: No more Windows error message when using IfFileExists on a removable drive with no media inserted - now applies to all internal file_exists calls. 2003-09-28 11:33 eccles * /NSIS/trunk/Source/exehead/exec.c: No more Windows error message when using IfFileExists on a removable drive with no media inserted. 2003-09-27 22:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: no error when unused uninst license/directory page strings do not exist 2003-09-27 22:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: fix 2003-09-27 22:24 joostverburg * /NSIS/trunk/Docs/src/usefulinfos.but: vb6 runtime: asycfilt.dll should not be registered 2003-09-26 21:12 kichik * /NSIS/trunk/Source/exehead/Ui.c: Add a back-slash to $INSTDIR when loading dir page only when it's a root directory 2003-09-26 19:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed abort warning custom text 2003-09-26 17:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed issues with multiple languages 2003-09-26 14:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed issues with multiple languages 2003-09-26 14:17 kichik * /NSIS/trunk/Source/exehead/Ui.c: Accept root $INSTDIR on the directory page too 2003-09-26 12:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: uninstall confirm page texts can be customized 2003-09-26 11:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed components page custom leave function 2003-09-26 11:10 joostverburg * /NSIS/trunk/Examples/makensis.nsi: welcome text, finish link, uninstall info 2003-09-26 11:09 joostverburg * /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi: new Graphics folder 2003-09-25 21:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: finished new language system, fixed reservefile, fixed langdll text settings 2003-09-25 11:45 joostverburg * /NSIS/trunk/Contrib/Language files/Korean.nlf: fix 2003-09-25 11:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: support for uninst license, directory pages 2003-09-23 19:57 joostverburg * /NSIS/trunk/Examples/makensis.nsi: forgot a SetOutPath, improved desktop shortcut creation 2003-09-23 19:56 kichik * /NSIS/trunk/Source/build.cpp: Close the compressor before starting to optimize to lower memory usage 2003-09-23 19:01 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: - Fixed ComponentText without InstTypes - Made it impossible to install to non-existing drives/removable drives with no media - Fixed a crash caused by using a LangString in InstallDir - No more Windows error message when a registered DLL dependency can't be found 2003-09-23 18:50 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new Graphics folder 2003-09-23 18:50 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi: directories 2003-09-23 18:34 joostverburg * /NSIS/trunk/Contrib/Graphics, /NSIS/trunk/Contrib/Graphics/Checks, /NSIS/trunk/Contrib/Graphics/Checks/big.bmp, /NSIS/trunk/Contrib/Graphics/Checks/classic.bmp, /NSIS/trunk/Contrib/Graphics/Checks/classic-cross.bmp, /NSIS/trunk/Contrib/Graphics/Checks/colorful.bmp, /NSIS/trunk/Contrib/Graphics/Checks/grey.bmp, /NSIS/trunk/Contrib/Graphics/Checks/grey-cross.bmp, /NSIS/trunk/Contrib/Graphics/Checks/modern.bmp, /NSIS/trunk/Contrib/Graphics/Checks/red.bmp, /NSIS/trunk/Contrib/Graphics/Checks/red-round.bmp, /NSIS/trunk/Contrib/Graphics/Checks/simple.bmp, /NSIS/trunk/Contrib/Graphics/Checks/simple-round.bmp, /NSIS/trunk/Contrib/Graphics/Header, /NSIS/trunk/Contrib/Graphics/Header/nsis.bmp, /NSIS/trunk/Contrib/Graphics/Header/win.bmp, /NSIS/trunk/Contrib/Graphics/Icons, /NSIS/trunk/Contrib/Graphics/Icons/arrow-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/arrow-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/box-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/box-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/classic-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/classic-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/llama-blue.ico, /NSIS/trunk/Contrib/Graphics/Icons/llama-grey.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-install-blue.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-install-blue-full.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-install-colorful.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-install-full.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-uninstall-blue.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-uninstall-colorful.ico, /NSIS/trunk/Contrib/Graphics/Icons/modern-uninstall-full.ico, /NSIS/trunk/Contrib/Graphics/Icons/nsis1-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/pixel-install.ico, /NSIS/trunk/Contrib/Graphics/Icons/pixel-uninstall.ico, /NSIS/trunk/Contrib/Graphics/Icons/win-install.ico, /NSIS/trunk/Contrib/Graphics/Wizard, /NSIS/trunk/Contrib/Graphics/Wizard/llama.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nsis.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/nullsoft.bmp, /NSIS/trunk/Contrib/Graphics/Wizard/win.bmp, /NSIS/trunk/Contrib/Icons, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/shell.ico, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsisicon.ico, /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Examples/makensis.nsi: new Graphics folder with a good structure, updated icons 2003-09-23 15:00 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh: 1.66 2003-09-23 15:00 joostverburg * /NSIS/trunk/Contrib/Language files/Turkish.nlf: v6 2003-09-22 23:20 kichik * /NSIS/trunk/Examples/makensis.nsi: Add Math to the start menu group too 2003-09-22 22:56 kichik * /NSIS/trunk/Contrib/Math/Math.txt, /NSIS/trunk/Contrib/Math/mathtest.ini, /NSIS/trunk/Contrib/Math/mathtest.nsi, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/MyMath.h, /NSIS/trunk/Contrib/Math/Source/plugin.c, /NSIS/trunk/Plugins/Math.dll: 1. Unary-Pre operators detection fixed. 2. Unary Minus operator added (now legal, worked before?). 3. GetReference operator (&). For example (a=&b; *a=3;) will set b=3. 4. Operators precedence added (C-like), much more intellectual expressions parsing. 5. Functions redefenition added, use "#name", like "func()(1); #func()(2);". 2003-09-22 22:18 kichik * /NSIS/trunk/Menu/images/arrow.gif, /NSIS/trunk/Menu/images/arrowd.gif, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: Added missing pictures and fixed multiple arrowd.gif in one page 2003-09-22 19:28 joostverburg * /NSIS/trunk/Contrib/NSIS Menu/Info.txt, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsisicon.ico, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.sln, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.vcproj, /NSIS/trunk/Contrib/NSIS Menu/src/html/helpctrl.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/helpdata.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/helpfrm.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlcell.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlfilt.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlpars.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmltag.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlwin.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmprint.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_dflist.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_fonts.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_hline.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_image.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_layout.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_links.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_list.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_pre.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_style.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_tables.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/winpars.cpp, /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/btn-compiler.gif, /NSIS/trunk/Menu/images/btn-docs.gif, /NSIS/trunk/Menu/images/btn-update.gif, /NSIS/trunk/Menu/images/btn-websites.gif, /NSIS/trunk/Menu/images/btn-welcome.gif, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/line.gif, /NSIS/trunk/Menu/images/silver.gif, /NSIS/trunk/Menu/images/version.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: NSIS Menu updates: new design, source fixes, use wxWindows 2.4.2 2003-09-22 16:06 kichik * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c: - .onVerifyInstDir is now used in the browse dialog too - Fixed problems with SHFileOperation, OleUninitialize and ICopyHook (and possibly XPlay) 2003-09-22 10:09 kichik * /NSIS/trunk/Source/script.cpp: Ignore all commands but those who start with an exclamation mark in nested ignored if blocks too 2003-09-21 16:22 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: a bit more testing 2003-09-21 16:18 kichik * /NSIS/trunk/Examples/makensis.nsi: added new/missing files 2003-09-21 12:09 joostverburg * /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/modernui.but, /NSIS/trunk/Docs/src/tutorial.but: changelog, tutorial, credits, mui info 2003-09-21 11:03 joostverburg * /NSIS/trunk/Contrib/Language files/Russian.nlf: fixes 2003-09-21 11:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: support for uninst license, directory pages 2003-09-21 11:00 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2003-09-20 16:38 joostverburg * /NSIS/trunk/Docs/src/usefulinfos.but: more info about compilation (.NET SDK etc.) 2003-09-20 10:03 kichik * /NSIS/trunk/Source/build.cpp: NLF_[U]CAPTION is always required, not only with a UI 2003-09-20 09:40 kichik * /NSIS/trunk/Contrib/Language files/Finnish.nlf: Spacing fixes - thanks pengyou 2003-09-19 19:52 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fixes 2003-09-19 19:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: support for uninst license, directory pages 2003-09-19 18:05 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: support for uninst license, directory pages 2003-09-19 18:04 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: fixes 2003-09-19 17:30 ramon18 * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: Portuguese languages updates 2003-09-19 15:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh: fix 2003-09-19 15:24 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: removed invalid comment 2003-09-19 15:24 joostverburg * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf: v6 2003-09-19 12:08 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.txt: that made sense... 2003-09-19 11:57 kichik * /NSIS/trunk/Source/build.cpp: Fixed CRC error on bzip2 uninstallers - thanks psyke 2003-09-18 12:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh: 1.66 2003-09-17 11:32 kichik * /NSIS/trunk/Contrib/Language files/German.nlf: fix by lking 2003-09-16 19:07 kichik * /NSIS/trunk/Source/build.cpp: Fixed a dumb bug with the data block optimizer that caused the compiler to crash if something was actually optimized 2003-09-16 16:44 kichik * /NSIS/trunk/Contrib/nsExec/nsExec.txt: /CMD no longer exists 2003-09-16 09:36 kichik * /NSIS/trunk/Source/strlist.h: Removed debug message 2003-09-16 09:19 kichik * /NSIS/trunk/Source/build.cpp: fixed add_db_data crashing on empty inputs 2003-09-15 23:20 kichik * /NSIS/trunk/Contrib/Math, /NSIS/trunk/Contrib/Math/math.nsi, /NSIS/trunk/Contrib/Math/Math.txt, /NSIS/trunk/Contrib/Math/mathtest.ini, /NSIS/trunk/Contrib/Math/mathtest.nsi, /NSIS/trunk/Contrib/Math/mathtest.txt, /NSIS/trunk/Contrib/Math/Source, /NSIS/trunk/Contrib/Math/Source/Math.c, /NSIS/trunk/Contrib/Math/Source/Math.h, /NSIS/trunk/Contrib/Math/Source/Math.sln, /NSIS/trunk/Contrib/Math/Source/Math.vcproj, /NSIS/trunk/Contrib/Math/Source/mathcrt.h, /NSIS/trunk/Contrib/Math/Source/mathcrt.lib, /NSIS/trunk/Contrib/Math/Source/MyMath.c, /NSIS/trunk/Contrib/Math/Source/MyMath.h, /NSIS/trunk/Contrib/Math/Source/plugin.c, /NSIS/trunk/Plugins/Math.dll: Another cool plug-in by brainsucker, a calculator :) 2003-09-15 22:05 kichik * /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/TODO.txt: - Improved file mapping so you can now esaily compile installers up to 2GB with a minimum requirment of memory (changable by FileBufSize) - Fixed DirText - Fixed new browse dialog style problems (thanks LIGHTNING UK!) 2003-09-15 19:18 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: improved GetParant, GetParameters 2003-09-14 11:37 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe: solved description box border problems with custom fonts 2003-09-14 10:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh: 1.66 2003-09-14 10:16 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf: v6 2003-09-13 21:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: 1.66 2003-09-13 21:27 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: v6 2003-09-13 21:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed license page radio buttons 2003-09-13 10:12 kichik * /NSIS/trunk/Docs/src/usefulinfos.but: backslashes instead of slashes 2003-09-12 21:40 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: - Fixed SpaceText none - Fixed a crash that occured if LicenseData was not used and Page license was 2003-09-12 16:45 kichik * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Banner/Banner.dsp, /NSIS/trunk/Contrib/Banner/Readme.txt, /NSIS/trunk/Plugins/Banner.dll: New and improved banner: - No more crashes - Responds to messages (and thus redraws itself) - Doesn't put the main window on the background - Some new /set tricks by brainsucker 2003-09-12 16:05 joostverburg * /NSIS/trunk/Examples/makensis.nsi: removed MUI_PRODUCT, MUI_VERSION 2003-09-12 15:13 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf: comments 2003-09-12 14:07 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf: v6 2003-09-12 14:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: 1.66 2003-09-12 14:02 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: v6 2003-09-12 14:01 joostverburg * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/AdvSplash/advsplash.txt, /NSIS/trunk/Contrib/AdvSplash/Example.nsi, /NSIS/trunk/Plugins/advsplash.dll: 1. Supports any bpp for transparent images 2. Windows XP at bpp < 32 possible bug fixed 3. Removed transparency by pallete color index (always use RGB value) 4. shrinked a bit (0.5 kb) 2003-09-12 13:58 kichik * /NSIS/trunk/Plugins/System.dll: release 5 by brainsucker: 1. u flag - unload dll after procedure call. 2. some changes to asm to turn on Whole Program Optimization. 3. Dll shrinked for 1 kb. 2003-09-12 11:16 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/util.cpp: More memory clean-ups 2003-09-11 20:46 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp: - Fixed a crash caused by clicking cancel on a directory page (thanks pengyou) - Fixed some extraction progress issues 2003-09-11 20:31 kichik * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/Source/System.vcproj, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Contrib/System/WhatsNew.txt: release 5 by brainsucker: 1. u flag - unload dll after procedure call. 2. some changes to asm to turn on Whole Program Optimization. 3. Dll shrinked for 1 kb. 2003-09-11 16:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: support for uninst license, directory pages 2003-09-10 21:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: welcome page: "Click Next to continue" is back 2003-09-10 16:39 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: - Fixed uninstaller refusal to start when on the root directory (note that AllowRootDirInstall true is still required) - Some touch ups regarding NSIS_CONFIG_VISIBLE_SUPPORT 2003-09-10 13:44 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/util.cpp: - Fixed SetOutPath not setting current directory if the directory didn't exist before - Fixed a memory leak 2003-09-09 21:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: removed old stuff 2003-09-09 20:59 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: v6 2003-09-09 20:59 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: 1.66 2003-09-09 19:21 ramon18 * /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: Portuguese languages updates 2003-09-09 16:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: removed MUI_PRODUCT, MUI_VERSION 2003-09-09 14:25 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Fixed overwrite failure on Windows 2000/XP/2003 when the existing file was hidden 2003-09-08 17:02 joostverburg * /NSIS/trunk/Docs/src/compiler.but: double word 2003-09-08 15:28 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: signed/unsigned mismatch 2003-09-08 14:41 joostverburg * /NSIS/trunk/Contrib/Language files/Slovak.nlf: v6 2003-09-08 14:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: 1.66 2003-09-08 14:37 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh: support for uninst license, directory pages 2003-09-08 14:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: setting multiple texts 2003-09-08 13:54 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: - Fixed uninstaller not showing anything when installer is silent - Improved CResourceEditor - should be more tolerant now - Removed legacy code from InstallOptions and StartMenu 2003-09-08 10:38 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/ResourceVersionInfo.cpp: Fixed VIAddVersionKey failing on empty inputs 2003-09-08 10:12 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Typo in MUI_DIRECTORYPAGE_VARIABLE - thanks Zarik 2003-09-07 20:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: wrong string names 2003-09-07 20:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: support for uninst license, directory pages 2003-09-07 20:18 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf: typo in langstring name 2003-09-07 16:46 kichik * /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: fixed SetOverwrite and added ifdiff option 2003-09-07 16:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finish page works without welcome page; uninst dir page strings not included when there is only an inst dir page 2003-09-07 14:36 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Temporary workaround to FindControlIdx returning -1 2003-09-07 13:33 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf: v6 2003-09-07 13:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: 1.66 2003-09-07 13:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed page text settings; support for uninst license, directory pages; renamed language file string; updated startmenu text; removed old language file strings 2003-09-07 08:53 kichik * /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: - fixed a typo in inner langstrings name - [un]LicenseTextRB - Finnish language files updated - made SetStlColors able to set background color with /BRANDING - some optimizations - fixed progress showing for WriteUninstaller 2003-09-07 04:56 icemank * /NSIS/trunk/Contrib/Makensisw/toolbar.h: Fixed button count and index numbers for toolbar 2003-09-06 22:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: missing word 2003-09-06 21:44 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: typo in langstring name 2003-09-06 21:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: 1.66 2003-09-06 20:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: always undef MUI_FINISHPAGE_CURFIELD_NO 2003-09-06 20:41 kichik * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: v6 2003-09-06 20:25 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf: typo in langstring name 2003-09-06 19:52 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf: v6 2003-09-06 19:48 kichik * /NSIS/trunk/Source/script.cpp: !ifdef, again... 2003-09-06 14:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: window caption 2003-09-06 12:45 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: v6 2003-09-06 12:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: 1.66 2003-09-06 12:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: removed old info, changelog 2003-09-06 12:31 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: quotes 2003-09-06 11:57 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: v6 2003-09-06 11:57 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: 1.66 2003-09-06 10:01 kichik * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: Language updates 2003-09-06 09:59 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: - Fixed and improved SetFont - Fixed WindowIcon 2003-09-05 22:22 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Get progress bar to the end even with subsections 2003-09-05 22:05 kichik * /NSIS/trunk/Source/build.cpp: Initialize build_include_depth 2003-09-05 21:16 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/TODO.txt: No more static variables in CEXEBuild member functions 2003-09-05 20:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: uninstaller close button not set to finish button text 2003-09-05 20:16 kichik * /NSIS/trunk/Examples/languages.nsi: Updated to work with the latest CVS version 2003-09-05 19:50 kichik * /NSIS/trunk/Source/lang.cpp: Removed debug message 2003-09-05 19:26 kichik * /NSIS/trunk/Contrib/Banner/Banner.c: Reverting to old source code for now 2003-09-05 19:26 kichik * /NSIS/trunk/Plugins/Banner.dll: Adjusted to latest CVS version - added ShowWindow(hwndDlg,SW_SHOW); 2003-09-05 19:20 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: Spanish language files updated 2003-09-05 15:16 joostverburg * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Examples/primes.nsi, /NSIS/trunk/Examples/rtest.nsi, /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Examples/waplugin.nsi: page commands 2003-09-05 14:56 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: UpgradeDLL: set overwrite flag back 2003-09-05 14:55 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: Fixed LicesneData and language strings 2003-09-05 14:14 kichik * /NSIS/trunk/Source/script.cpp: Only check for open if[n]def if the compilation was successful 2003-09-05 14:10 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed page custom functions 2003-09-05 14:10 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: version number (1.66) 2003-09-05 12:45 kichik * /NSIS/trunk/Source/script.cpp: Fixed SetDetailsPrint 2003-09-05 11:46 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/TODO.txt: - SetCompressor: added /FINAL switch - SetOverwrite: added lastusd option - Greek MUI translation v1.66 2003-09-05 11:17 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: NLF v6, MUI v.166 2003-09-05 10:40 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c: Missed some strings that should be processed - thanks mikem4600 2003-09-04 21:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: settings: syntax, removed old ones 2003-09-04 21:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed IO extract 2003-09-04 21:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixed IO RTL setting 2003-09-04 20:50 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: RTL welcome and finish page 2003-09-04 20:45 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Space after branding text (in uninstaller too) 2003-09-04 20:27 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Space after branding text 2003-09-04 20:25 kichik * /NSIS/trunk/Examples/makensis.nsi: Compile with latest CVS version 2003-09-04 19:08 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h: signed/unsigned mismatch 2003-09-04 18:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.66: support for uninst comp page, multiple pages, new language & page system 2003-09-04 18:25 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Estonian.nlf, /NSIS/trunk/Contrib/Language files/Finnish.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Slovenian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsp, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/Source/System.sln, /NSIS/trunk/Contrib/System/Source/System.vcproj, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.h, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Plugins/System.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exedata.cpp, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/resource.h, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/TODO.txt: * PageEx - every page can be used everywhere and as many times as needed * DirVar - easy way to add another dir page * default strings in the language file (Page directory is enough, no need for DirText) * strings from the language file are now LangStrings that can be used in the script * no more /LANG - one string for all languages * any lang strings can be used everywhere, installer or uninstaller (no un.) * no more unprocessed strings - variables can be used almost everywhere (except in licenseData and InstallDirRegKey) * DirText parm for browse dialog text * SetBkColor -> SetCtlColors - can now set text color too * fixed SetOutPath and File /r bug * fixed File /a /oname bug * added $_CLICK for pages * added quotes support in lang files (patch #752620) * extraction progress * separate RTL dialogs for RTL langs (improved RTL too) * InstallOptions RTL * StartMenu RTL * fixed RegDLL? * added IfSilent and SetSilent (SetSilent only works from .onInit) * fixed verify window (it never showed) (bug #792494) * fixed ifnewer readonly file problem (patch #783782) * fixed wininit.ini manipulation when there is another section after [rename] * fixed some ClearType issues * fixed a minor bug in the resource editor * fixed !ifdef/!endif stuff, rewritten * lots of code and comments clean ups * got rid of some useless exceptions handling and STL classes (still much more to go) * lots of optimizations, of course ;) * updated system.dll with support for GUID, WCHAR, and fast VTable calling (i.e. COM ready) * minor bug fixes 2003-09-04 13:02 joostverburg * /NSIS/trunk/Contrib/VPatch/Readme.html: patch result 2003-08-27 13:10 kichik * /NSIS/trunk/Examples/one-section.nsi: No need with just two sections 2003-08-23 04:34 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Fixed MRU for Windows 9x 2003-08-22 22:01 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: no message 2003-08-22 21:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: fixed invalid link to HeaderBitmap.nsi example 2003-08-22 17:43 joostverburg * /NSIS/trunk/Docs/src/pages.but: fixed InstallOptions link on site 2003-08-22 11:55 joostverburg * /NSIS/trunk/Menu/update.html: text update 2003-08-22 11:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: localize MUI_PRODUCT 2003-08-19 19:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh: 1.65 2003-08-15 19:01 kichik * /NSIS/trunk/Source/build.cpp: Fixed problem with LangString as section name 2003-08-15 16:36 flizebogen * /NSIS/trunk/Docs/src/compilerflags.but: Added very basic informations about the new version commands (VIProductVersion, VIAddVersionKey) 2003-08-15 15:56 joostverburg * /NSIS/trunk/Contrib/Language files/Turkish.nlf: v5 2003-08-13 16:24 icemank * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed bugs in MRU list 2003-08-13 16:18 icemank * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed bugs in MRU list 2003-08-13 16:02 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Fixed bugs in MRU list 2003-08-13 12:30 sunjammerx * /NSIS/trunk/Docs/src/usefulinfos.but: Fixed broken processor pack link. 2003-08-12 17:57 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added MRU file list 2003-08-12 15:11 joostverburg * /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: updated texts, links 2003-08-12 14:37 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h: Direct link to new website 2003-08-12 14:26 joostverburg * /NSIS/trunk/Contrib/VPatch/Readme.html: UI compilation 2003-08-12 14:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Examples/makensis.nsi: reserve files 2003-08-12 13:08 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: added MUI_FINISHPAGE_LINK_COLOR 2003-08-12 12:09 joostverburg * /NSIS/trunk/Contrib/VPatch/Source/GenPat/VPatch2.bpg, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.dpr, /NSIS/trunk/Contrib/VPatch/Source/VPatch2.bpg, /NSIS/trunk/Examples/makensis.nsi: folder settings 2003-08-11 17:33 joostverburg * /NSIS/trunk/Examples/makensis.nsi: include new VPatch files 2003-08-11 16:42 joostverburg * /NSIS/trunk/Contrib/VPatch/GenPat.exe, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Contrib/VPatch/Source, /NSIS/trunk/Contrib/VPatch/Source/GenPat, /NSIS/trunk/Contrib/VPatch/Source/GenPat/GenPat2.dpr, /NSIS/trunk/Contrib/VPatch/Source/GenPat/PatchGenerator.pas, /NSIS/trunk/Contrib/VPatch/Source/GenPat/TreeCode.pas, /NSIS/trunk/Contrib/VPatch/Source/GenPat/VAppend.dpr, /NSIS/trunk/Contrib/VPatch/Source/GenPat/vdsp_crc.pas, /NSIS/trunk/Contrib/VPatch/Source/GenPat/VPatch2.bpg, /NSIS/trunk/Contrib/VPatch/Source/GUI, /NSIS/trunk/Contrib/VPatch/Source/GUI/AboutForm.dfm, /NSIS/trunk/Contrib/VPatch/Source/GUI/AboutForm.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/DLLWrapper.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/MainForm.dfm, /NSIS/trunk/Contrib/VPatch/Source/GUI/MainForm.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/PatchClasses.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/ProgressForm.dfm, /NSIS/trunk/Contrib/VPatch/Source/GUI/ProgressForm.pas, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.dof, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.dpr, /NSIS/trunk/Contrib/VPatch/Source/GUI/VPatchGUI.res, /NSIS/trunk/Contrib/VPatch/Source/Plugin, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.c, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.dsp, /NSIS/trunk/Contrib/VPatch/Source/Plugin/vpatchdll.dsw, /NSIS/trunk/Contrib/VPatch/vpatchdll.c, /NSIS/trunk/Contrib/VPatch/vpatchdll.dsp, /NSIS/trunk/Contrib/VPatch/vpatchdll.dsw: VPatch 2.0 final 2003-08-09 23:23 kichik * /NSIS/trunk/Docs/src/basic.but: Rename /REBOOTOK doesn't care if the destination exists 2003-08-09 15:21 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Finish page - reshow controls for all cases, not just when the next button was clicked 2003-08-08 22:03 kichik * /NSIS/trunk/Docs/src/basic.but: Rename can't overwrite 2003-08-08 13:56 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: Empty lines were not printed (this time it's really fixed) 2003-08-08 13:39 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: - Empty lines were not printed - CR or LF alone were not handled - Tab conversion removed the next char 2003-08-07 15:25 ramon18 * /NSIS/trunk/Contrib/ExDLL/extdll.inc: New MASM32 header for NSIS plug-ins 2003-08-06 16:53 kichik * /NSIS/trunk/Contrib/ExDLL/exdll_with_unit.dpr, /NSIS/trunk/Contrib/ExDLL/nsis.pas: New Delphi unit for NSIS plug-ins by Bernhard Mayer 2003-08-05 15:50 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc: Reverted Ramon's addition of SS_NOPREFIX. It causes trouble with ClearType, compatibility and doesn't allow the user to use accelerators for edit boxes anywhere. 2003-08-05 15:30 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: No need to read STATE twice 2003-08-05 15:05 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Plugins/InstallOptions.dll: - Removed SS_NOPREFIX - Made IO return error instead of crashing if there are no fields in the INI 2003-08-04 22:57 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: SS_NOPREFIX made the header texts redraw when ALT was pressed, allowing the text to be shown on the finish page 2003-08-04 14:41 kichik * /NSIS/trunk/Source/exehead/resource.rc: DIALOGEX not DIALOG 2003-08-04 12:16 kichik * /NSIS/trunk/Docs/src/attributes.but: /S is case sensitive 2003-08-03 23:47 ramon18 * /NSIS/trunk/Plugins/nsExec.dll: Removed debug msgbox 2003-08-03 23:32 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: It seems Windows 98 doesn't check ranges... 2003-08-03 22:04 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: pszState can't be null (thanks Case for the patch) 2003-08-03 21:06 joostverburg * /NSIS/trunk/Docs/src/usefulinfos.but: new UpgradeDLL syntax 2003-08-03 13:07 kichik * /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Patch #781254 applied - thanks Andrey Cherezov 2003-08-03 12:59 kichik * /NSIS/trunk/Source/zlib/INFBLOCK.C: Fixed bug #777590 - inflate left too early causing NSIS to think more data is needed thus discarding unused data 2003-08-03 10:51 kichik * /NSIS/trunk/Examples/one-section.nsi: Way simpler 2003-07-29 20:28 ramon18 * /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh: Croatian language files updates (thanks to RIV@NVX and iostriz) 2003-07-29 20:25 ramon18 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/exehead/resource.rc: SS_NOPREFIX for all STATIC controls, now is possible to name the installer as "My company & CO" for example 2003-07-26 12:54 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: typo 2003-07-26 12:45 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: UpgradeDLL: temp base dir support (to solve Win9x issues) 2003-07-26 12:15 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: hexadecimal 2003-07-26 12:15 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Link control TxtColor 2003-07-26 12:10 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: Finish page: link color (dark blue) 2003-07-26 11:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: spelling / grammar fixes 2003-07-25 17:25 ramon18 * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: Fix 2003-07-24 13:25 kichik * /NSIS/trunk/Source/exehead/fileform.c: Fix invalid CRC messages for data < 512 2003-07-24 00:34 ramon18 * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: removed IMAGE_FILE_RELOCS_STRIPPED 2003-07-23 18:19 ramon18 * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: temp console app now returns correct exitcode from spawned process, temp file is deleted on end 2003-07-23 09:38 ramon18 * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: nsExec create a temp console app to spawn commands, can run applications with user interface and also 16bit DOS 2003-07-23 09:34 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c: NSIS_SUPPORT_LANG_IN_STRINGS works without NSIS_SUPPORT_NAMED_USERVARS 2003-07-22 08:33 kichik * /NSIS/trunk/Source/exehead/fileform.c: Fixed CRC off and whole compression 2003-07-21 19:48 ramon18 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/nsExec.dll: Fixed problem in IO dirreq/filereq, optimized code, nsExec with /CMD param to allow execute 16Bits DOS applications 2003-07-21 11:30 kichik * /NSIS/trunk/Source/exehead/exec.c: Fixed error flag when creating directories with UNC paths 2003-07-21 11:11 kichik * /NSIS/trunk/Source/exehead/Ui.c: Don't show installation type combo box when there are no InstTypes defined 2003-07-20 11:14 kichik * /NSIS/trunk/Examples/makensis.nsi: UserVars.nsi added 2003-07-20 10:54 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: Updates 2003-07-19 13:24 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: clean up 2003-07-19 12:43 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: StartMenu page should work again 2003-07-19 12:29 kichik * /NSIS/trunk/Source/exehead/Main.c: Back to 33.5 2003-07-19 12:15 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c: - Fixed uninstaller - Fixed summary calculations - Secret instruction 2003-07-19 12:06 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h: Simplified searching for escape charaters in strings when uservars enabled 2003-07-19 00:42 ramon18 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: IO support for LINK control text color (TxtColor). Fixed problem with ClearType fonts in XP 2003-07-19 00:39 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/strlist.h: Uservars names not found in strings when names are very similar. 2003-07-18 21:33 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/lang.h: Back to normal messages 2003-07-18 21:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: set background color of link control 2003-07-18 21:25 joostverburg * /NSIS/trunk/Docs/src/var.but: typo 2003-07-18 19:46 joostverburg * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/modernui.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/var.but: lots of updates: user variables, new instructions, text updates, changelog etc. 2003-07-18 17:39 kichik * /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp: Fixed bug #769598 - problems with InstType /COMPONENTSONLYONCUSTOM 2003-07-18 16:43 kichik * /NSIS/trunk/Source/build.cpp: Avoid buffer overrun on huge inputs 2003-07-18 16:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finish page reboot option buttons: background color fixed 2003-07-18 16:01 kichik * /NSIS/trunk/Source/build.cpp: User vars inside strings should work now 2003-07-18 15:27 joostverburg * /NSIS/trunk/Contrib/Language files/Estonian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Estonian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Estonian language files 2003-07-18 15:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: fix 2003-07-18 15:22 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: use MUI_STARTMENUPAGE_VARIABLE define, temp var fix 2003-07-18 14:22 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/TODO.txt: - Fixed all known problems with temporary files and directoroes - Command line switches work again (/NCRC and /S) - GetTempFileName now takes another argument as base directory (default is $TEMP) - Message boxes work from .onGUIEnd - Some more optimizations 2003-07-18 13:05 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: No need for ATL 2003-07-18 12:28 kichik * /NSIS/trunk/Contrib/InstallOptions/io.dsp: No default libraries needed 2003-07-18 02:43 icemank * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: Moved __DATE__ and __TIME__ predefines into CEXEBuild::process_script 2003-07-17 22:26 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: text updates, fixes 2003-07-17 17:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: declare standard temp variables when inserting 2003-07-17 15:35 kichik * /NSIS/trunk/Source/exehead/Ui.c: Tabs to spaces 2003-07-17 12:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finish page options fixed 2003-07-17 12:17 kichik * /NSIS/trunk/TODO.txt: stop using static 2003-07-17 02:00 ramon18 * /NSIS/trunk/Source/exehead/Ui.c: "Space required" updated after every .OnSelChange 2003-07-16 23:03 kichik * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: TEMP is already taken 2003-07-16 22:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: user variables, new macro to get startmenu folder, comp page desc box info text changes, welcome/finish page leave functions 2003-07-16 22:36 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added EnableWindow 2003-07-16 21:13 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h: Defines cleared up and added to NSIS define list 2003-07-16 20:37 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp: No need for that ObjType, was just a test 2003-07-16 20:31 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Plugins/BgImage.dll: Fixed stuck up windows on Windows 98 2003-07-16 18:03 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/TODO.txt: fixed CreateDirectory error flag 2003-07-16 12:28 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/ZLIB.H: shaved more than 500 bytes from zlib, zlib exehead now 33.5k 2003-07-16 09:15 kichik * /NSIS/trunk/Source/exehead/exec.c: Compiles with log enabled 2003-07-15 23:40 ramon18 * /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Fix problem on Script.cpp that allowed VAR declarations inside Functions and Sections, no more differences between installer uservars and unistaller user vars (even if name start with un. ), changed example too 2003-07-15 21:26 joostverburg * /NSIS/trunk/Examples/UserVars.nsi: clean up 2003-07-15 17:17 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: "Description" translated (thanks emiste7) 2003-07-14 14:40 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Fixed the resize bug. 2003-07-13 22:31 ramon18 * /NSIS/trunk/Source/exehead/Ui.c: #769770 fix 2003-07-13 14:19 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Hebrew.nsh: Hebrew language files by Yaron Shahrabani 2003-07-13 11:19 kichik * /NSIS/trunk/Docs/src/var.but: SetShellVarContext doesn't work for $QUICKLAUNCH 2003-07-12 15:19 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/trees.c: tabs to spaces 2003-07-12 14:45 kichik * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: Delete parent folders too as deguix suggested 2003-07-12 14:44 kichik * /NSIS/trunk/Examples/makensis.nsi: Patch #754995 - more information when installing, thanks deguix 2003-07-12 12:19 kichik * /NSIS/trunk/Examples/makensis.nsi: typo 2003-07-12 12:04 kichik * /NSIS/trunk/TODO.txt: empty subsections 2003-07-11 14:36 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: MUI_COMPONENTS -> MUI_PAGE_COMPONENTS (thanks RIV@NVX) 2003-07-10 00:28 ramon18 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/exehead/Ui.c: LINK, dirreq, filereq and browse button in dirpage can be opened using ENTER KEY (WM_COMMAND events forward to inner dialogs), fixed problem with focus on Close/Finish button which was generating wierd beeps if user attempted to finish the installer with ENTER key. 2003-07-09 19:17 joostverburg * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Source/exehead/resource.rc: more space for "Space required" label 2003-07-09 12:59 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe: more space for "Space required" label 2003-07-08 23:18 ramon18 * /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/tokens.cpp: Fixed QUIT problem inside custom pages, user-variables activated and command "Dim" changed to "Var", language strings inside other strings are replaced 2003-07-07 21:08 ramon18 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/testlink.ini, /NSIS/trunk/Plugins/InstallOptions.dll: Fixed LINK control problem on Win9X and improved tabstop handling 2003-07-07 16:22 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe: more space for "Space required" label 2003-07-07 16:10 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf: fixes 2003-07-07 14:08 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Serbian language 2003-07-07 14:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: MUI_UNGETLANGUAGE changes, abort header fixes 2003-07-07 13:35 joostverburg * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh: Language ID 2003-07-07 13:01 joostverburg * /NSIS/trunk/Contrib/Language files/Serbian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Serbian.nsh: Serbian language files 2003-07-07 10:50 joostverburg * /NSIS/trunk/Contrib/Language files/Macedonian.nlf: fixes 2003-07-07 10:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: version numbers 2003-07-06 21:39 joostverburg * /NSIS/trunk/Docs/src/usefulinfos.but: compiler compatibility 2003-07-06 20:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh: fix 2003-07-05 16:55 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: LINK disabled until crashes under Windows 98 are resolved 2003-07-04 17:20 kichik * /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: Macedonian update 2003-07-04 12:48 kichik * /NSIS/trunk/Source/lang.cpp: LicenseForceSelection strings now default to English too if string is missing from the NLF 2003-07-03 21:53 ramon18 * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Plugins/System.dll: Small bug with structures fixed (thanks brainsucker) 2003-06-28 12:31 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceVersionInfo.cpp: tsk tsk tsk... Memory problems fixed 2003-06-28 11:32 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/ResourceVersionInfo.h: Clean-up 2003-06-27 20:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fix 2003-06-27 20:37 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: Options to disable bitmap stretching 2003-06-27 12:48 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: ResizeToFit flag should now work for bitmap controls too 2003-06-27 11:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: fix 2003-06-27 11:09 o_owd * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/tutorial.but: internal links update. replaced \k with \R. 2003-06-26 19:37 kichik * /NSIS/trunk/Source/build.cpp: No ${LANG_ENGLISH} by default 2003-06-25 14:16 joostverburg * /NSIS/trunk/Contrib/Icons/modern-install-blue.ico, /NSIS/trunk/Contrib/Icons/modern-uninstall-blue.ico: Blue Modern UI Icons (based on adni18-B) 2003-06-25 12:08 joostverburg * /NSIS/trunk/Source/lang.cpp: latest translation 2003-06-25 11:17 kichik * /NSIS/trunk/Source/util.cpp: Refer to the docs 2003-06-25 01:16 ramon18 * /NSIS/trunk/Examples/VersionInfo.nsi: Missing LoadLanguageFile 2003-06-24 19:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: MUI_CUSTOMFUNCTION_STARTMENU_LEAVE: use Leave function 2003-06-24 19:17 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: Standard tabing 2003-06-24 10:00 o_owd * /NSIS/trunk/Docs/src/attributes.but: updated LicenseBkColor help 2003-06-23 22:40 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/uservars.h: Special section of data for user vars, whitch allow compiler to assign the right size and no code needed in exehead for mem allocs. Warnings for unreferenced user vars. (758773) Error, if temp file not available, now directory is created if not exist. 2003-06-23 21:56 ramon18 * /NSIS/trunk/Examples/VersionInfo.nsi: (757431) VersionInfo.nsi compiles with errors after /LANG changes 2003-06-23 21:48 ramon18 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Fixes problems with LINK 2003-06-23 16:25 icemank * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/makenssi.cpp: Moved setting of __DATE__ and __TIME__ predefines. 2003-06-23 15:12 icemank * /NSIS/trunk/Source/script.cpp: Modified set_timestamp_define to use FileTimeToLocalFileTime instead of SystemTimeToTzSpecificLocalTime, since the latter is unsupported in Win 9x. 2003-06-23 12:51 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: format 2003-06-23 12:04 o_owd * /NSIS/trunk/Contrib/InstallOptions/Readme.html: corrected link on "NSIS documentation" that goes to Chapter "Chapter3.html#3.5" instead of "Chapter4.html#4.5" 2003-06-22 13:44 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: Find all directories and make sure found entries are directories 2003-06-22 11:22 joostverburg * /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usefulinfos.but: changelog, info, doc 2003-06-22 11:02 joostverburg * /NSIS/trunk/Examples/makensis.nsi: InstallOptions: testlink 2003-06-20 18:04 o_owd * /NSIS/trunk/Docs/src/compilerflags.but: adeed AllowSkipFiles 2003-06-20 17:44 kichik * /NSIS/trunk/Docs/src/build.bat: Should work on Windows 98 now 2003-06-19 12:44 joostverburg * /NSIS/trunk/Contrib/Language files/Russian.nlf: v5 2003-06-19 12:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: version number 2003-06-19 12:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: compatible with Modern UI 1.64/5 2003-06-18 16:27 kichik * /NSIS/trunk/Source/exehead/Main.c: The path is validate when the real uninstaller starts. There is no need to validate twice. 2003-06-18 16:26 kichik * /NSIS/trunk/Source/exehead/util.c: No longer 8, there is a flag with a name now 2003-06-17 23:59 ramon18 * /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Dynamic allocation of needed user variables (exehead grew 512 bytes). Independed user vars in uninstaller and installer 2003-06-17 19:06 ramon18 * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html: Completing documentations for installoptions 2003-06-17 18:55 ramon18 * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Documentation of link control and new options for text control 2003-06-17 12:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: Support for a link on the Finish page 2003-06-16 19:58 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Language strings inside any other strings, $$ defines fix, both currently disabled by defines, support for /LANG in command VIAddVersionKey 2003-06-16 19:02 ramon18 * /NSIS/trunk/Plugins/InstallOptions.dll: Control "LINK" example 2003-06-16 18:49 ramon18 * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/testlink.ini, /NSIS/trunk/Contrib/InstallOptions/testlink.nsi: Added new control "LINK" and example 2003-06-16 12:40 kichik * /NSIS/trunk/Source/exehead/util.c: validate_filename was b0rked 2003-06-15 17:29 kichik * /NSIS/trunk/Contrib/System/System.nsi: StrCmp not IntCmp (thanks deguix) 2003-06-15 11:42 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf: v5 2003-06-14 12:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Improved registry storage for Start Menu folder; ReserveFile macro for StartMenu plug-in; Added MUI_LANGDLL_ALWAYSSHOW option; Checkboxes on Finish page can be used to call a function; example fixes 2003-06-13 21:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: start menu folder selection: works in silent mode; handles empty input 2003-06-13 18:04 joostverburg * /NSIS/trunk/Contrib/Icons/modern-install.ico, /NSIS/trunk/Contrib/Icons/modern-uninstall.ico: new 16 color icons 2003-06-13 15:59 icemank * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Added dotted notation for macro ${__LINE__} predefine 2003-06-13 15:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: bitmap size 2003-06-13 14:04 kichik * /NSIS/trunk/Source/script.cpp: Compiles with NSIS_SUPPORT_VERSION_INFO 2003-06-13 12:52 kichik * /NSIS/trunk/Source/script.cpp: second free goes boom 2003-06-13 03:48 icemank * /NSIS/trunk/Source/script.cpp: Reorganized code 2003-06-12 22:44 kichik * /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/script.cpp: Safer __TIMESTAMP__, __FILE__, and friends 2003-06-12 21:50 icemank * /NSIS/trunk/Source/script.cpp: Better handling of macros and one line commands for standard predefines. 2003-06-12 16:33 kichik * /NSIS/trunk/TODO.txt: updates 2003-06-12 16:14 icemank * /NSIS/trunk/Source/script.cpp: Fixed handling of macros and command line /X option for standard predefines. 2003-06-12 15:09 icemank * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/script.cpp: Added support for standard predefines ala C++, i.e., __DATE__, __TIME__, __TIMESTAMP__, __FILE__, __LINE__ 2003-06-12 00:06 ramon18 * /NSIS/trunk/Examples/UserVars.nsi, /NSIS/trunk/Examples/VersionInfo.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/uservars.h: Version Information now rely on languages, some more updates on named uservars, maybe last one before official release :) (preview UserVars.nsi - doesn't compile yet) 2003-06-12 00:01 ramon18 * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf: Updated codepages 2003-06-11 23:57 ramon18 * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Plugins/InstallOptions.dll: READONLY in text box 2003-06-11 16:32 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html: font size setting for older browsers 2003-06-10 19:34 joostverburg * /NSIS/trunk/Examples/makensis.nsi: VersionInfo example 2003-06-10 19:32 joostverburg * /NSIS/trunk/Examples/VersionInfo.nsi: simple script 2003-06-10 19:32 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: dummy section 2003-06-10 13:18 ramon18 * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Plugins/InstallOptions.dll: Added MULTILINE support for edit box, better tab order between ReqFile, DirReq and it's browse button 2003-06-10 04:35 ramon18 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/TODO.txt: Updated TODO.txt; New methods to change VersionInformation, this time is completed customizable by the script, default code page and language retrieved from OS, but can be changed by script too; fixed problem with some chars like © 2003-06-10 04:33 ramon18 * /NSIS/trunk/Examples/VersionInfo.nsi: Updated to new versioninfo format 2003-06-09 18:59 ramon18 * /NSIS/trunk/Examples/VersionInfo.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/ResourceVersionInfo.cpp, /NSIS/trunk/Source/ResourceVersionInfo.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Comments like C/C++; Added commands to support VersionInformation (VIProductVersion, VIProductName, VICompanyName, VIComments, VILegalTrademarks, VILegalCopyrights, VIDescription); Support to named user variables (up to 500) but disabled by define 2003-06-08 18:23 kichik * /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but: default value for reg keys 2003-06-08 14:45 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: Language detection works for primary only again. It was broken since 1.14, heh 2003-06-08 13:41 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: 750338 again 2003-06-08 13:32 kichik * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: v5 2003-06-07 10:59 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: Safer "bug" report 750338 2003-06-06 11:02 kichik * /NSIS/trunk/Contrib/Language files/Romanian.nlf: fixes 2003-06-06 10:52 kichik * /NSIS/trunk/Contrib/Language files/Czech.nlf: v5 2003-06-05 21:55 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: initialize and destroy 2003-06-05 21:53 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: All acceptable warnings now contain a file name and a line number 2003-06-05 20:33 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: Process the auto-appeneded part of InstallDir at compile-time 2003-06-05 13:15 kichik * /NSIS/trunk/Source/exehead/config.h: don't edit fixes 2003-06-04 21:02 kichik * /NSIS/trunk/Include/Sections.nsh: more macros by derekrprice 2003-06-03 11:51 kichik * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: No more cvs1 errors 2003-06-03 11:08 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Slovenian.nsh: Slovenian for MUI 1.64/5 2003-06-03 11:08 kichik * /NSIS/trunk/Contrib/Language files/Slovenian.nlf: Slovenian v5 2003-06-02 16:58 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp: Updated to v2.0 2003-06-02 14:58 kichik * /NSIS/trunk/Source/lang.cpp: kilo, mega, giga and byte are not processed 2003-06-02 14:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: fixes 2003-06-02 14:26 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Bug #747445 fixed - FileRequest "..." button does nothing on some State values 2003-06-02 13:02 kichik * /NSIS/trunk/Contrib/Language files/Polish.nlf: v5 2003-06-01 21:19 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf: v5 2003-06-01 20:21 kichik * /NSIS/trunk/Contrib/Language files/German.nlf: v5 2003-06-01 18:47 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf: v5 2003-05-30 23:35 icemank * /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h: Hid the Compressor toolbar button 2003-05-30 15:18 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: Spelling 2003-05-30 13:35 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Plugins/InstallOptions.dll: Fixed flags collisions (thanks Ramon) and added the ONLY_NUMBERS flag 2003-05-30 11:44 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: v5 2003-05-30 11:42 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but: Latest documentation by flizebogen 2003-05-30 01:38 icemank * /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: Made the Toolbar style flat 2003-05-29 16:54 kichik * /NSIS/trunk/Contrib/Language files/Italian.nlf: v5 2003-05-29 12:59 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp: Indention 2003-05-29 12:55 kichik * /NSIS/trunk/Plugins/Banner.dll: Back to the old version 2003-05-29 08:55 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: No more MUI_WELCOMEPAGE 2003-05-29 08:46 kichik * /NSIS/trunk/Source/script.cpp: SectionIn RO should not override /o 2003-05-28 04:51 icemank * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsw, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Added Toolbar + more 2003-05-28 04:46 icemank * /NSIS/trunk/Contrib/Makensisw/toolbar.bmp, /NSIS/trunk/Contrib/Makensisw/toolbar.cpp, /NSIS/trunk/Contrib/Makensisw/toolbar.h: Added Toolbar 2003-05-27 18:47 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: - Errors from JNetLib now show again - Shows a dialog with ShowInstDetails hide too 2003-05-27 15:23 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: double pages possible 2003-05-27 14:51 kichik * /NSIS/trunk/Source/util.cpp: VC7 - unsigned/signed 2003-05-27 11:04 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf: v5 2003-05-27 10:52 kichik * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf: v5 2003-05-26 19:45 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: UpgradeDLL - register DLL on reboot fixed 2003-05-26 19:40 kichik * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: v5 2003-05-26 18:28 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp: tabs -> spaces 2003-05-26 18:14 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: v5 2003-05-26 18:12 kichik * /NSIS/trunk/Contrib/Language files/Finnish.nlf: v5 and fixes 2003-05-26 17:55 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added AllowSkipFiles - thanks Ramon! 2003-05-26 17:53 joostverburg * /NSIS/trunk/Contrib/NSIS Menu, /NSIS/trunk/Contrib/NSIS Menu/include, /NSIS/trunk/Contrib/NSIS Menu/include/wx, /NSIS/trunk/Contrib/NSIS Menu/include/wx/msw, /NSIS/trunk/Contrib/NSIS Menu/include/wx/msw/setup.h, /NSIS/trunk/Contrib/NSIS Menu/Info.txt, /NSIS/trunk/Contrib/NSIS Menu/nsismenu, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsisicon.ico, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.cpp, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.rc, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.sln, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/nsismenu.vcproj, /NSIS/trunk/Contrib/NSIS Menu/nsismenu/resource.h, /NSIS/trunk/Contrib/NSIS Menu/src, /NSIS/trunk/Contrib/NSIS Menu/src/html, /NSIS/trunk/Contrib/NSIS Menu/src/html/helpctrl.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/helpdata.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/helpfrm.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlcell.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlfilt.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlpars.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmltag.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmlwin.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/htmprint.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_dflist.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_fonts.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_hline.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_image.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_layout.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_links.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_list.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_pre.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_style.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/m_tables.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/html/winpars.cpp, /NSIS/trunk/Contrib/NSIS Menu/src/msw, /NSIS/trunk/Contrib/NSIS Menu/src/msw/app.cpp: NSIS Menu source 2003-05-26 17:05 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Plugins/BgImage.dll: Threads safer 2003-05-25 20:31 kichik * /NSIS/trunk/Examples/one-section.nsi: Simpler script using the new /o switch 2003-05-25 20:26 joostverburg * /NSIS/trunk/Examples/makensis.nsi: compatible with Modern UI 1.65 2003-05-25 20:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.65 2003-05-25 17:51 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: LicenseBkColor now supports /windows (default = white) and /grey (default = grey) 2003-05-25 17:10 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/resource.h, /NSIS/trunk/Contrib/NSISdl/Script1.rc, /NSIS/trunk/Plugins/nsisdl.dll, /NSIS/trunk/Source/script.cpp: - NSISdl will now take the installer's style - Little typo in script.cpp 2003-05-25 15:33 kichik * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Plugins/Banner.dll, /NSIS/trunk/TODO.txt: Refresh banner's text when erased and minize along with the installer window 2003-05-25 13:12 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c: $SMPROGRAMS, $SMSTARTUP, $DESKTOP, $STARTMENU and $QUICKLAUNCH working again 2003-05-25 13:02 kichik * /NSIS/trunk/Source/script.cpp: Section -name working again 2003-05-24 19:39 kichik * /NSIS/trunk/Source/build.cpp: Plugins code fixed 2003-05-24 14:07 kichik * /NSIS/trunk/TODO.txt: Done - /o 2003-05-24 13:50 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: - Improved installation types behaviour - .onSelChange no longer called when the components page is created - First section is selected at compile time - changes in .onInit stick - Added SectionSetSize / SectionGetSize - Added SetCurInstType / GetCurInstType - Added InstTypeSetText / InstTypeGetText - ability to change (and add and remove) installation types on runtime - NSIS_MAX_INST_TYPES is now 32 by default - InstType texts are now processed ($0, $1, etc. can be used) - Added /o switch for Section - unselected by default 2003-05-24 10:17 kichik * /NSIS/trunk/TODO.txt: More 2003-05-22 18:58 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf: capital 2003-05-22 18:42 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: fixes 2003-05-21 21:24 joostverburg * /NSIS/trunk/Contrib/VPatch/vpatchdll.c, /NSIS/trunk/Contrib/VPatch/vpatchdll.dsp: file locations 2003-05-21 13:04 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: wrong variable name 2003-05-21 13:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Portuguese.nsh: Portuguese Modern UI language file 2003-05-21 12:24 joostverburg * /NSIS/trunk/Contrib/VPatch, /NSIS/trunk/Contrib/VPatch/example.nsi, /NSIS/trunk/Contrib/VPatch/GenPat.exe, /NSIS/trunk/Contrib/VPatch/newfile.txt, /NSIS/trunk/Contrib/VPatch/oldfile.txt, /NSIS/trunk/Contrib/VPatch/patch.pat, /NSIS/trunk/Contrib/VPatch/Readme.html, /NSIS/trunk/Contrib/VPatch/vpatchdll.c, /NSIS/trunk/Contrib/VPatch/vpatchdll.dsp, /NSIS/trunk/Contrib/VPatch/vpatchdll.dsw, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Plugins/VPatch.dll: VPatch 2003-05-18 15:56 kichik * /NSIS/trunk/Source/exehead/exec.c: Sleep back to normal 2003-05-16 10:05 kichik * /NSIS/trunk/Docs/src/callback.but: Bug 738682 fixed - .onGUIEnd => un.onGUIEnd 2003-05-16 09:59 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Finnish.nsh: Finnish MUI language file 2003-05-14 12:45 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.txt: Forgot to mention negative coords 2003-05-14 09:59 kichik * /NSIS/trunk/Docs/src/log.but: Compile NSIS for NSIS_CONFIG_LOG 2003-05-14 09:54 kichik * /NSIS/trunk/Docs/src/callback.but: .onGUIEnd 2003-05-12 16:12 kichik * /NSIS/trunk/Source/util.cpp: Wrong boundary 2003-05-12 15:34 kichik * /NSIS/trunk/Source/util.cpp: Some more checks when finding icon resources offsets - no more crashes when UPX compresses the icons 2003-05-11 18:30 kichik * /NSIS/trunk/Source/script.cpp: A bit more clearer code 2003-05-11 16:57 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Flicker reduction by A. Schiffler 2003-05-11 16:43 kichik * /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh: Macedonian update - NLFv4 and MUI 1.64 2003-05-10 21:45 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.txt, /NSIS/trunk/Plugins/BgImage.dll: Sound loops 2003-05-09 22:45 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.txt: Yey for the spell checker :) 2003-05-09 21:11 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.dsp, /NSIS/trunk/Contrib/BgImage/BgImage.txt, /NSIS/trunk/Contrib/BgImage/Example.nsi, /NSIS/trunk/Plugins/BgImage.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/util.h, /NSIS/trunk/TODO.txt: - BgImage improved a lot - Added .onGUIEnd - Some optimizations 2003-05-09 19:50 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/util.cpp: Check for 8bpp 2003-05-09 19:19 kichik * /NSIS/trunk/Docs/src/attributes.but: 8bpp max for CheckBitmap 2003-05-09 18:33 kichik * /NSIS/trunk/Source/lang.cpp: ADD_FONT not SET_FONT 2003-05-09 12:25 kichik * /NSIS/trunk/Source/exehead/util.c: "Bug" 733817 2003-05-08 17:13 kichik * /NSIS/trunk/Contrib/Makensisw/Readme.txt: Some credits too 2003-05-08 16:41 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: iceman_k's define list for MakeNSISw 2003-05-07 14:56 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: wrong variable 2003-05-07 11:34 joostverburg * /NSIS/trunk/Include/Sections.nsh: SetSectionInInstType / ClearSectionInInstType 2003-05-06 11:48 joostverburg * /NSIS/trunk/Contrib/Language files/Finnish.nlf: Finnish language file 2003-05-06 11:40 joostverburg * /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh: fix 2003-05-05 13:29 joostverburg * /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: quiet download 2003-05-03 21:22 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: fix 2003-05-03 15:51 joostverburg * /NSIS/trunk/Contrib/Language files/Portuguese.nlf: v4 2003-05-02 19:31 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Plugins/UserInfo.dll: Guests comes after users http://forums.winamp.com/showthread.php?s=&threadid=112655 2003-05-02 17:11 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi: Done after error 2003-05-02 10:49 joostverburg * /NSIS/trunk/Contrib/Banner/Readme.txt: more info 2003-05-01 19:28 kichik * /NSIS/trunk/Docs/src/var.but: Tab 2003-05-01 18:13 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: fonts 2003-05-01 15:58 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: fix 2003-05-01 12:12 joostverburg * /NSIS/trunk/Contrib/Language files/Korean.nlf: v4 2003-05-01 12:11 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh: fix 2003-04-30 21:44 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Get instead of remember 2003-04-30 18:35 kichik * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Get instead of remember 2003-04-30 14:12 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: no space before "click next to continue" text on welcome page 2003-04-30 13:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: fix 2003-04-30 13:21 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: v4 2003-04-30 12:48 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Unable to open file error was still set in $0 instead of on the stack 2003-04-30 12:40 kichik * /NSIS/trunk/Source/script.cpp: Bug #730056 fixed - empty license file error added 2003-04-30 12:20 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Two File /r commands should work again 2003-04-29 21:32 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf: v4 2003-04-29 21:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh: new strings 2003-04-29 21:29 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: fix 2003-04-29 16:51 joostverburg * /NSIS/trunk/TODO.txt: langfiles & fonts done 2003-04-29 16:28 kichik * /NSIS/trunk/Source/script.cpp: "Bug" #685834 fixed - implemented a more natural recursion that descends into every directory and not only into those caught by the given spec 2003-04-29 13:42 kichik * /NSIS/trunk/Examples/viewhtml.nsi: Shows the HTML file and both possible ways 2003-04-28 23:15 joostverburg * /NSIS/trunk/Contrib/Language files/Swedish.nlf: v4 2003-04-28 21:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Swedish.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Swedish translation 2003-04-28 20:26 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: wrong define name 2003-04-28 16:39 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc: Bug #728281 fixed - system menu has everything enabled (including maximize) on Windows 9x 2003-04-28 16:30 kichik * /NSIS/trunk/Source/exehead/resource.rc: Bug #728281 fixed - system menu has everything enabled (including maximize) on Windows 9x 2003-04-28 10:31 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: v4 2003-04-27 21:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: examples 2003-04-27 18:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh: fix 2003-04-27 18:31 joostverburg * /NSIS/trunk/Contrib/Language files/Czech.nlf: v4 2003-04-26 22:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: more texts can be customized 2003-04-26 12:57 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh: new strings 2003-04-26 12:57 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf: v4 2003-04-25 15:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: write to INI file in Welcome/Finish page pre functions 2003-04-25 15:19 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf: v4 2003-04-23 20:33 kichik * /NSIS/trunk/Source/lang.cpp: Padding, padding, padding... 2003-04-23 18:57 joostverburg * /NSIS/trunk/Examples/rtest.nsi: format 2003-04-23 15:50 joostverburg * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf: v4 2003-04-23 15:44 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nlf: v4 2003-04-23 15:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh: header text for aborted installer 2003-04-23 15:40 kichik * /NSIS/trunk/Source/exehead/Ui.c: Compiles without NSIS_SUPPORT_CODECALLBACKS again 2003-04-22 13:33 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf: Japanese fonts 2003-04-22 13:28 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf: v4 2003-04-22 13:27 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: fix 2003-04-21 22:24 kichik * /NSIS/trunk/Source/exehead/Ui.c: Bug report 725319 - sort of 2003-04-21 20:56 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf: v4 2003-04-21 20:05 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: forgot some items 2003-04-21 20:05 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: spaces 2003-04-21 20:05 joostverburg * /NSIS/trunk/Contrib/Language files/English.nlf: fix 2003-04-21 19:52 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf: v4 2003-04-21 18:52 flizebogen * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/usefulinfos.but: Added description for Ifabort, modified SectionSetText, added Errorlevel description 2003-04-21 15:23 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fix 2003-04-21 13:32 kichik * /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/TODO.txt: - More strings translatable (K/M/G Byte, registering, unregistering) - Language specific fonts - $\t now works too - More to do 2003-04-21 12:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: language specific fonts 2003-04-20 17:41 kichik * /NSIS/trunk/Source/strlist.h: Should compile on VC7 again 2003-04-20 16:15 joostverburg * /NSIS/trunk/Source/exehead/Ui.c: no more weird descriptions when sections are hidden 2003-04-19 19:57 kichik * /NSIS/trunk/Examples/one-section.nsi: Missing quotes 2003-04-19 16:29 flizebogen * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usefulinfos.but: Updated Changelog and added "compiling NSIS Sources" notes 2003-04-18 21:46 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: ... 2003-04-18 21:42 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Oops :) 2003-04-18 20:01 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Fixed bug [ 720332 ] ">301 Characters in State of List Box Bug - Install Options 2" 2003-04-18 13:54 kichik * /NSIS/trunk/TODO.txt: Clean up 2003-04-18 11:21 kichik * /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Plugins/System.dll: (brainsucker) fixed a bug with calling proc(void) and added e switch to get GetLastError return value. 2003-04-17 15:27 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h: Faster compilation 2003-04-16 12:32 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Transparency bug in IO too 2003-04-15 18:46 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: info about position of custom function defines 2003-04-15 14:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: header text for aborted installer 2003-04-15 08:30 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Plugins/BgImage.dll, /NSIS/trunk/TODO.txt: No more weird border 2003-04-14 14:43 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/test.nsi: leave function 2003-04-13 21:20 joostverburg * /NSIS/trunk/Menu/compiler.html: typo 2003-04-12 23:17 joostverburg * /NSIS/trunk/Source/build.cpp: fixed pluginsdir init function generation 2003-04-12 10:37 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: Traditional and Simplified Chinese updates 2003-04-10 17:44 flizebogen * /NSIS/trunk/Docs/src/usefulinfos.but: Added "How to Read REG_MULTI_SZ Values" to Useful Infos 2003-04-08 09:11 kichik * /NSIS/trunk/Source/exehead/Ui.c: Fixed bug #717022, overlapping chars in dir input 2003-04-07 18:45 joostverburg * /NSIS/trunk/Docs/src/build.bat: that was test stuff 2003-04-07 18:05 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: new macro's: get uninstaller language, delete shortcuts, new languages 2003-04-07 17:59 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fixes 2003-04-07 17:55 joostverburg * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/usefulfunc.but: updated GetWindowsVersion 2003-04-07 15:00 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: header text for aborted installer 2003-04-07 15:00 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf: fixes 2003-04-07 14:58 joostverburg * /NSIS/trunk/Contrib/Language files/Catalan.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Catalan.nsh: translation by falanko 2003-04-07 14:55 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: header text for aborted installer 2003-04-06 20:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: wrong string names 2003-04-06 17:17 kichik * /NSIS/trunk/TODO.txt: Heh, I wonder what I was thinking about when I wrote this... 2003-04-06 16:11 kichik * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh: Updates 2003-04-06 16:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: LicenseForceSelection support - header text for aborted installer 2003-04-06 16:02 joostverburg * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf: LicenseForceSelection support 2003-04-06 15:54 kichik * /NSIS/trunk/Contrib/Language files/Lithuanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Lithuanian.nsh: Lithuanian language by NorCis 2003-04-06 15:45 kichik * /NSIS/trunk/Docs/src/basic.but: Capital F - typo 2003-04-05 14:50 flizebogen * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/pages.but: Updated Changelog 2003-04-05 13:34 kichik * /NSIS/trunk/TODO.txt: Compiler speed optimization 2003-04-05 12:56 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Include/Sections.nsh, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c: Rewrote a lot of the components tree code: - Added SF_PSELECTED for partially selected sub-sections - SF_EXPAND now refreshes the components tree - Fixed problems with sub-sections with RO sections as children - (-1) sent to .onMouseOverSection when mouse over nothing - RO sections can now be in InstTypes too (default to old behavior) - Optimized code 2003-04-05 12:08 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: header text for aborted installer 2003-04-04 22:19 kichik * /NSIS/trunk/TODO.txt: IO todo done 2003-04-04 22:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: header text for aborted installer 2003-04-04 20:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: header text for aborted installer 2003-04-04 20:45 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf: fixes 2003-04-04 19:39 joostverburg * /NSIS/trunk/Menu/images/version.gif: beta 4 2003-04-04 19:26 flizebogen * /NSIS/trunk/Docs/src/defines.but: Changed Conditional Compilation docs to default style 2003-04-04 17:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: renamed string names 2003-04-04 17:23 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf: LicenseForceSelection support 2003-04-04 17:23 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: LicenseForceSelection support - renamed string names 2003-04-04 17:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: header text for aborted installer - renamed string names 2003-04-04 17:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: header text for aborted installer 2003-04-04 14:43 kichik * /NSIS/trunk/Docs/src/bin/halibut/biblio.c, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/contents.c, /NSIS/trunk/Docs/src/bin/halibut/error.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/help.c, /NSIS/trunk/Docs/src/bin/halibut/index.c, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/keywords.c, /NSIS/trunk/Docs/src/bin/halibut/licence.c, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/bin/halibut/malloc.c, /NSIS/trunk/Docs/src/bin/halibut/misc.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.h, /NSIS/trunk/Docs/src/bin/halibut/ustring.c: Hopefully readable now: indent -nut -kr -bl -bli0 -i2 * 2003-04-04 12:27 kichik * /NSIS/trunk/Source/exehead/Ui.c: - Leave function of instfiles will be called if installation aborted too so the MUI will be able to set the title - Cancel button now set default if installation canceled 2003-04-04 11:34 kichik * /NSIS/trunk/Source/script.cpp: Missed a return, IfErrors works again 2003-04-04 09:30 joostverburg * /NSIS/trunk/Docs/src/plugin.but: typo 2003-04-04 08:23 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: LicenseForceSelection support 2003-04-03 19:07 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: fixes 2003-04-03 15:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: typo 2003-04-03 14:27 kichik * /NSIS/trunk/Docs/src/compiler.but: S1 not S2 for !addincludedir 2003-04-03 13:17 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Plugins/InstallOptions.dll: Added EXTENDEDSELCT flag for list boxes which replaces MULTISELECT that now acts exactly as the real style flag ([double] click turns on or off selection) 2003-04-03 12:26 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Plugins/UserInfo.dll: Will always return Admin on 9x systems with advapi32.dll that contains functions it shouldn't (all of them?) 2003-04-02 20:29 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/NSIS Update/Resources/BIN/bzip2.exe, /NSIS/trunk/Contrib/NSIS Update/Resources/BIN/ExtractDLL.dll: NSIS Update - use ExtractDLL 2003-04-02 19:54 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added IfAbort 2003-04-02 18:46 kichik * /NSIS/trunk/TODO.txt: IO improvement 2003-04-02 18:09 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: NSISdl will now take the font from the NSIS installer 2003-04-02 16:56 joostverburg * /NSIS/trunk/Contrib/LangDLL/resource.rc: compiles without Platform SDK 2003-04-02 15:49 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: InitPluginsDir fixes 2003-04-02 12:21 joostverburg * /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: LicenseForceSelection support 2003-04-01 18:07 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: - GetTempFile will now try 100 times before failing - InitPluginsDir will give an error if unable to initialize 2003-04-01 16:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: LicenseForceSelection support 2003-04-01 14:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finish header inserted when MUI_FINISHPAGE_NOAUTOCLOSE is defined - removed double bcheck 2003-03-31 14:28 joostverburg * /NSIS/trunk/Docs/src/defines.but: macro's can contain !ifdef etc. 2003-03-30 17:12 flizebogen * /NSIS/trunk/Docs/src/sections.but: Changed section syntax again (added req flag) 2003-03-30 16:49 flizebogen * /NSIS/trunk/Docs/src/sections.but: Section Syntax (! for bold sections) 2003-03-30 15:08 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: IfErrors clears the error flag again 2003-03-30 12:45 joostverburg * /NSIS/trunk/Docs/src/ui.but: typo 2003-03-30 12:21 joostverburg * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/style.css: updated changelog, blue links 2003-03-30 11:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: finish page accelerator keys 2003-03-29 20:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: finish page accelerator keys 2003-03-29 20:31 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: LicenseForceSelection support 2003-03-29 18:32 joostverburg * /NSIS/trunk/TODO.txt: RMDir /REBOOTOK 2003-03-29 17:33 flizebogen * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/jumps.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/usection.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Docs/style.css: Updated RMDIR command Syntax, added internal Referencies, rearanged order of some commands (by letter), new css file (no underlines for links) 2003-03-29 17:16 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Back to 33.5/34 2003-03-29 13:39 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c: Buttons from focused license text fixed (return will not work if next button not enabled and escape will work as cancel) 2003-03-29 11:45 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: RMDir /REBOOTOK 2003-03-29 11:05 kichik * /NSIS/trunk/Include/Sections.nsh: or not and 2003-03-28 20:45 flizebogen * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/ui.but: Updated SetBKColor and Changelog 2003-03-28 18:41 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Transparent controls. Use SetBkColor (hwnd) transparent 2003-03-28 18:32 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/biblio.c: Now shows line number for unresolved \R cross-references 2003-03-28 16:04 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: langdll text parameter 2003-03-28 13:24 kichik * /NSIS/trunk/Docs/src/attributes.but: No need for two LoadLangugeFile sections 2003-03-27 19:45 flizebogen * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/var.but: Updated Tutorial, typos and a few links 2003-03-27 14:50 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: LicenseForceSelection support 2003-03-27 14:27 joostverburg * /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: LicenseForceSelection support 2003-03-27 14:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: fixes 2003-03-27 13:11 kichik * /NSIS/trunk/Examples/waplugin.nsi: No license page 2003-03-27 12:52 kichik * /NSIS/trunk/Contrib/System/Source/stdafx.h, /NSIS/trunk/Contrib/System/Source/System.c: Source code for latest fixes (brainsucker) 2003-03-26 23:00 kichik * /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Plugins/System.dll: (brainsucker) new system build. now work's at the kichik's computer too :) 2003-03-26 22:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: message text 2003-03-26 22:29 joostverburg * /NSIS/trunk/Examples/makensis.nsi: updated for Modern UI 1.64 2003-03-26 22:03 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: better translation 2003-03-26 21:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: no finish header macro's anymore - language preference stored when installation has completed 2003-03-26 21:11 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: LicenseForceSelection support 2003-03-26 20:51 kichik * /NSIS/trunk/Source/exehead/Ui.c: Bug with new force and license page not being first 2003-03-26 20:15 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: LicenseForceSelection support 2003-03-26 19:58 flizebogen * /NSIS/trunk/Docs/src/attributes.but: Update on LicenseForceSelection 2003-03-26 19:27 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: LicenseForceSelection support 2003-03-26 19:20 kichik * /NSIS/trunk/Source/tokens.cpp: Better syntax 2003-03-26 19:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.64 - LicenseForceSelection support 2003-03-26 19:16 flizebogen * /NSIS/trunk/Docs/src/attributes.but: Added "LicenseForceSelection" 2003-03-26 18:18 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/tokens.cpp: Old language files will work too... 2003-03-26 18:04 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: An option to change the text in the script 2003-03-26 17:47 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/Hebrew.nlf, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/resource.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added LicenseForceSelection radiobuttons|checkbox 2003-03-26 16:01 joostverburg * /NSIS/trunk/TODO.txt: update 2003-03-26 14:37 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Icon with path works again 2003-03-26 13:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: typo 2003-03-25 16:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: ioSpecial 2003-03-25 15:15 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Indentation 2003-03-24 15:35 kichik * /NSIS/trunk/Source/build.cpp: Disable last cancel button only if instfiles used 2003-03-24 14:50 kichik * /NSIS/trunk/Source/build.cpp: Leave function not show function in error 2003-03-23 17:14 kichik * /NSIS/trunk/TODO.txt: more to do 2003-03-23 17:12 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Now frees the memory of loaded bitmaps when exiting 2003-03-22 15:31 kichik * /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.nsi: Updates 2003-03-22 12:38 kichik * /NSIS/trunk/Source/script.cpp: Missing parameter, thanks willowufgood 2003-03-22 11:15 joostverburg * /NSIS/trunk/Contrib/System/Source/chkstk.obj, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/Source/System.vcproj, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Plugins/System.dll: Updated System plugin - Win9x fixes and more 2003-03-21 19:29 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: typo 2003-03-21 12:38 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Fixed TrimNewLines (thanks pengyou) 2003-03-20 20:49 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/TODO.txt: SetStaticBkColor -> SetBkColor, now works for dialogs, buttons, edit boxes and list boxes (only in IO) 2003-03-20 19:37 flizebogen * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/TODO.txt: Added Info "Dump Content of Log Window to File", fixed Typos 2003-03-20 13:13 kichik * /NSIS/trunk/Source/build.cpp: Random flags for uninstaller fixed 2003-03-20 11:39 kichik * /NSIS/trunk/Contrib/System/SysFunc.nsh: GetFullPathName -> SearchPath 2003-03-20 11:33 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: b4 (CVS) label 2003-03-19 17:04 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: fixed Welcome page string names 2003-03-19 13:59 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: updated GetWindowsVersion 2003-03-19 11:54 joostverburg * /NSIS/trunk/Contrib/Language files/Korean.nlf: updated translation 2003-03-18 20:43 kichik * /NSIS/trunk/Source/script.cpp: HEX number for text color in BGGradient 2003-03-18 20:36 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.h, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/resource.h, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/TODO.txt: Some space saving changes, /NOCUSTOM and /COMPONENTSONLYONCUSTOM work together and infastructures for future changes 2003-03-18 16:12 rainwater * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Downloading text in nsisdl page cut off first char of path name if it wasn't a full path. 2003-03-18 15:51 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Docs/src/pages.but: Custom leave function updates 2003-03-18 15:45 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Leave function for custom pages too 2003-03-18 13:53 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: AddBrandingImage doesn't depend on the UI now. Can now set the branding image on the bottom and on the right too, and set a custom padding value 2003-03-18 13:49 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: another small html fix 2003-03-18 13:44 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html: html errors 2003-03-18 13:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: syntax format 2003-03-18 12:39 joostverburg * /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Source/tokens.cpp: Page command syntax 2003-03-18 12:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: define syntax, fixes 2003-03-18 10:11 joostverburg * /NSIS/trunk/Contrib/Dialer/Dialer.txt, /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Examples/waplugin.nsi: ConnectInternet function 2003-03-18 09:57 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: new setup name: Modern UI Test 2003-03-18 09:55 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: removed 1.61 language file compatibility 2003-03-18 09:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: compatible with Modern UI 1.63 2003-03-17 16:05 kichik * /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe: Windows 9x combo box size 2003-03-17 14:20 * /NSIS/tags/v20b3, /NSIS/tags/v20b3/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20b3/Contrib/Icons/normal-install.ico, /NSIS/tags/v20b3/Contrib/Icons/normal-uninstall.ico, /NSIS/tags/v20b3/Contrib/Icons/setup.ico, /NSIS/tags/v20b3/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20b3/Contrib/InstallOptions/ioptdll.rc, /NSIS/tags/v20b3/Contrib/InstallOptions/resource.h, /NSIS/tags/v20b3/Contrib/Makensisw/afxres.h, /NSIS/tags/v20b3/Contrib/Makensisw/makensisw.dsw, /NSIS/tags/v20b3/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20b3/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20b3/Contrib/NSISdl/connection.h, /NSIS/tags/v20b3/Contrib/NSISdl/httpget.cpp, /NSIS/tags/v20b3/Contrib/NSISdl/httpget.h, /NSIS/tags/v20b3/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20b3/Contrib/NSISdl/resource.h, /NSIS/tags/v20b3/Contrib/NSISdl/Script1.rc, /NSIS/tags/v20b3/Contrib/Splash/splash.dsw, /NSIS/tags/v20b3/Contrib/zip2exe, /NSIS/tags/v20b3/Contrib/zip2exe/icon.ico, /NSIS/tags/v20b3/Contrib/zip2exe/main.cpp, /NSIS/tags/v20b3/Contrib/zip2exe/res.rc, /NSIS/tags/v20b3/Contrib/zip2exe/resource.h, /NSIS/tags/v20b3/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20b3/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20b3/Examples/rtest.nsi, /NSIS/tags/v20b3/Source/afxres.h, /NSIS/tags/v20b3/Source/exedata.cpp, /NSIS/tags/v20b3/Source/exedata.h, /NSIS/tags/v20b3/Source/exehead/afxres.h, /NSIS/tags/v20b3/Source/exehead/bin2h.c, /NSIS/tags/v20b3/Source/exehead/bin2h.exe, /NSIS/tags/v20b3/Source/exehead/Makefile, /NSIS/tags/v20b3/Source/exehead/uninst.ico, /NSIS/tags/v20b3/Source/Makefile, /NSIS/tags/v20b3/Source/makenssi.dsw, /NSIS/tags/v20b3/Source/zlib/DEFLATE.H, /NSIS/tags/v20b3/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20b3'. 2003-03-17 14:20 joostverburg * /NSIS/trunk/Examples/makensis.nsi: startmenu shortcuts 2003-03-17 14:12 joostverburg * /NSIS/trunk/Menu/docs.html: tutorial 2003-03-17 13:46 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Plugins/InstallOptions.dll: Escaping notes in the readme and a check for ConvertNewLines 2003-03-17 13:23 kichik * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added FlushINI 2003-03-16 22:13 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: caption 2003-03-16 21:19 joostverburg * /NSIS/trunk/Contrib/NSIS Update/Resources/GUI/NSISUpdate.exe: updated ui 2003-03-16 21:10 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/NSIS Update/Resources/GUI/io.ini: NSIS Update: no mui, gui changes, text changes 2003-03-16 20:37 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Docs/src/usefulinfos.but, /NSIS/trunk/Docs/src/var.but: Added \R{ref}{name} for named references 2003-03-16 19:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: uninstaller: don't show page tile in titlebar 2003-03-16 19:46 joostverburg * /NSIS/trunk/Examples/makensis.nsi: delete old UI's 2003-03-16 17:40 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/tutorial.but, /NSIS/trunk/Source/tokens.cpp: - Docs fixes - Command help for InstType fix 2003-03-16 11:20 flizebogen * /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/usefulinfos.but: added "how to install vb6 runtimes and Call an external dll using system.dll 2003-03-16 10:11 joostverburg * /NSIS/trunk/Docs/style.css: fonts 2003-03-16 09:56 joostverburg * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Warning icon for 'validation error' MessageBox 2003-03-16 06:20 flizebogen * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/usefulinfos.but: Added infos about "Add uninstall information to Add/Remove Program" in a new appendix 2003-03-15 20:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: echo Modern UI version 2003-03-15 18:35 flizebogen * /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/tutorial.but: added SectionSetInstTypes and SectionGetInstTypes, fixed typos in the tutorial 2003-03-15 18:05 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/tutorial.but: Tons of updates 2003-03-15 17:16 kichik * /NSIS/trunk/Source/tokens.cpp: - PluginDir -> !AddPluginDir - Fixed parms list of Section(Get/Set)InstTypes 2003-03-15 15:54 kichik * /NSIS/trunk/Source/tokens.cpp: inst_types not flags 2003-03-15 14:27 kichik * /NSIS/trunk/Docs/src/history.but: History updates 2003-03-15 14:16 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Plugins/BgImage.dll: now compatible with the minimize button 2003-03-15 13:54 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: WriteINIStr now works with an empty value ("") 2003-03-15 13:24 kichik * /NSIS/trunk/TODO.txt: Fonts 2003-03-15 12:55 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Plugins/InstallOptions.dll: InstallOptions 2.1, always \r\n for newline 2003-03-15 11:26 kichik * /NSIS/trunk/Contrib/Icons/yi-simple_check.bmp, /NSIS/trunk/Contrib/Icons/yi-simple2_check.bmp: No shadow 2003-03-14 22:06 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: only IO stuff 2003-03-14 22:04 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: removed old recommended values 2003-03-14 19:29 joostverburg * /NSIS/trunk/Source/makenssi.cpp: bzip2 info in comments 2003-03-14 11:17 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: updated translation 2003-03-14 10:27 joostverburg * /NSIS/trunk/Docs/src/callback.but: no escape in \c 2003-03-14 10:15 joostverburg * /NSIS/trunk/Examples/example1.nsi: comment 2003-03-14 09:23 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: corrected typo's in registry key 2003-03-13 16:15 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: updated translation 2003-03-12 21:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: updated documentation 2003-03-12 18:59 joostverburg * /NSIS/trunk/Include/Sections.nsh: removed HWND_BROADCAST 2003-03-12 15:20 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: UpgradeDLL - Set overwrite to ON after inserting 2003-03-12 12:55 joostverburg * /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi: ReserveFile 2003-03-12 12:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: updated translation 2003-03-11 21:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: removed custom page caption 2003-03-11 20:44 joostverburg * /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Examples/primes.nsi, /NSIS/trunk/Examples/viewhtml.nsi, /NSIS/trunk/Examples/waplugin.nsi: updated format, small changes 2003-03-11 19:26 joostverburg * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/tutorial.but: updated docs, tutorial, changelog 2003-03-11 18:15 flizebogen * /NSIS/trunk/Docs/src/tutorial.but: fixed typos in tutorial, forgot to add 2 files 2003-03-11 16:35 kichik * /NSIS/trunk/Docs/src/stack.but: A bit informative I hope... More information about Exch and order of items in the stack 2003-03-11 15:23 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: copyright years 2003-03-11 13:29 joostverburg * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: comments 2003-03-11 12:54 joostverburg * /NSIS/trunk/Menu/docs.html: removed spaces 2003-03-11 12:43 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe: 2 lines for description 2003-03-11 11:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: Compatible with Modern UI 1.63 2003-03-10 22:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/Screenshot.png, /NSIS/trunk/Contrib/Modern UI/Screenshot2.png: new screenshots 2003-03-10 22:04 joostverburg * /NSIS/trunk/Contrib/Icons/modern-header 2.bmp: new header bitmap 2003-03-10 21:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: 'MS Shell Dlg' font for header title and language selection dialog 2003-03-10 21:20 flizebogen * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/credits.but: Tutorial - initial Version 2003-03-10 21:17 joostverburg * /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe: 2 lines for description 2003-03-10 21:13 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/LangDLL/resource.rc, /NSIS/trunk/Plugins/LangDLL.dll: LangDLL defaults to MS Shell Dlg 2003-03-10 19:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/System.nsh: 3 lines title on Welcome page 2003-03-10 18:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/License.txt: 2003 2003-03-10 15:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: defines 2003-03-09 22:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: new langdll macro / registry system, startmenu registry system, write instdir to registry 2003-03-09 22:10 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: moved defines to configuration 2003-03-09 21:24 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Forgot one pop 2003-03-09 20:23 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: defines for custom extension UI's 2003-03-09 20:17 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Plugins/LangDLL.dll: LangDLL now accepts A too. A for auto count, it looks for the first empty string ("") pushed. 2003-03-09 20:05 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: Modern UI 1.63 - Removed page description in window title 2003-03-09 19:49 kichik * /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c: BGGradient & minize solution 2003-03-09 19:07 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new languages 2003-03-09 19:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: fixes 2003-03-09 19:00 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new mui files 2003-03-09 18:58 joostverburg * /NSIS/trunk/Contrib/UIs/modern_topbmp.exe: that was an old one 2003-03-09 18:55 joostverburg * /NSIS/trunk/Contrib/Icons/modern-header.bmp, /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern_headerbmp.exe, /NSIS/trunk/Contrib/UIs/modern_headerbmpr.exe, /NSIS/trunk/Contrib/UIs/modern_nodesc.exe, /NSIS/trunk/Contrib/UIs/modern_smalldesc.exe, /NSIS/trunk/Contrib/UIs/modern_topbmp.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modern3.exe, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/HeaderBitmap.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.63 2003-03-09 00:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: forgot a $ 2003-03-08 20:13 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h: Bah... m_funcsCount = 0... Thanks Ippi 2003-03-07 22:07 kichik * /NSIS/trunk/TODO.txt: leave callback for custom pages 2003-03-07 21:10 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added SectionSetInstTypes and SectionGetInstTypes, about 70 bytes saved 2003-03-07 19:37 flizebogen * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/uninstall.but: clearified optional and required parameters at some commands with multiple [optional] parameters 2003-03-06 21:26 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: cancel button on finish page with checkboxes 2003-03-06 21:24 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Cancel button available on all pages after the instfiles page but the last page unless /ENABLECANCEL was used in its Page command 2003-03-06 20:06 joostverburg * /NSIS/trunk/Menu/websites.html: link to bug tracker 2003-03-06 19:35 joostverburg * /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Docs/src/credits.but: updated translation 2003-03-06 17:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: custom pages before finish page, io macro's with return value 2003-03-06 17:34 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Docs/src/credits.but: updated translation 2003-03-06 16:46 kichik * /NSIS/trunk/Source/script.cpp: Page and UninstPage should not be used inside sesctions/functions 2003-03-06 11:48 joostverburg * /NSIS/trunk/TODO.txt: big license works 2003-03-05 14:04 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: more welcome / finish page info 2003-03-04 20:35 kichik * /NSIS/trunk/Docs/src/ui.but: Shortened !include of WinMessages.nsh 2003-03-04 20:33 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: - Fixed more problems with !if[n]def/!else - Saved another 10 bytes :) 2003-03-04 20:29 kichik * /NSIS/trunk/Source/exehead/Ui.c: No more limit on RTF size 2003-03-04 20:25 kichik * /NSIS/trunk/Examples/waplugin.nsi: NSISdl calls update 2003-03-04 17:23 kichik * /NSIS/trunk/Source/exehead/exec.c: No need for force reboot, "Therefore, you should only use this flag in an emergency." 2003-03-04 17:22 kichik * /NSIS/trunk/TODO.txt: More 2003-03-04 16:31 kichik * /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsi: $CMDLINE may contain quotes fix by brainsucker 2003-03-03 18:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: documentation updates 2003-03-03 18:52 joostverburg * /NSIS/trunk/Menu/images/version.gif: beta 3 label 2003-03-03 18:14 joostverburg * /NSIS/trunk/Docs/src/history.but: beta 3 changelog 2003-03-03 15:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: ihrem > Ihrem 2003-03-03 13:51 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: - b3 version numbers - last page before instfiles define now works as really planned. it will only be defined if really the last one before instfiles. 2003-03-02 19:51 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: right position for page commands 2003-03-02 17:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: 1.62b 2003-03-01 14:05 flizebogen * /NSIS/trunk/Docs/src/generalpurpose.but: CreateDirectory can now set errorflag 2003-03-01 12:44 kichik * /NSIS/trunk/Source/script.cpp: EnumRegKey/Value output_var check fixed 2003-02-27 22:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: startmenu: changed define names, pre/leave custom functions, checkbox can be disabled, documentation updates 2003-02-27 14:23 kichik * /NSIS/trunk/Source/exehead/exec.c: LogSet on should now work 2003-02-27 13:56 * /NSIS/tags/v20b2, /NSIS/tags/v20b2/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20b2/Contrib/Icons/normal-install.ico, /NSIS/tags/v20b2/Contrib/Icons/normal-uninstall.ico, /NSIS/tags/v20b2/Contrib/Icons/setup.ico, /NSIS/tags/v20b2/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20b2/Contrib/InstallOptions/ioptdll.rc, /NSIS/tags/v20b2/Contrib/InstallOptions/resource.h, /NSIS/tags/v20b2/Contrib/Makensisw/afxres.h, /NSIS/tags/v20b2/Contrib/Makensisw/makensisw.dsw, /NSIS/tags/v20b2/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20b2/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20b2/Contrib/NSISdl/connection.h, /NSIS/tags/v20b2/Contrib/NSISdl/httpget.cpp, /NSIS/tags/v20b2/Contrib/NSISdl/httpget.h, /NSIS/tags/v20b2/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20b2/Contrib/NSISdl/resource.h, /NSIS/tags/v20b2/Contrib/NSISdl/Script1.rc, /NSIS/tags/v20b2/Contrib/Splash/splash.dsw, /NSIS/tags/v20b2/Contrib/zip2exe, /NSIS/tags/v20b2/Contrib/zip2exe/icon.ico, /NSIS/tags/v20b2/Contrib/zip2exe/main.cpp, /NSIS/tags/v20b2/Contrib/zip2exe/res.rc, /NSIS/tags/v20b2/Contrib/zip2exe/resource.h, /NSIS/tags/v20b2/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20b2/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20b2/Examples/primes.nsi, /NSIS/tags/v20b2/Examples/rtest.nsi, /NSIS/tags/v20b2/Source/afxres.h, /NSIS/tags/v20b2/Source/exedata.cpp, /NSIS/tags/v20b2/Source/exedata.h, /NSIS/tags/v20b2/Source/exehead/afxres.h, /NSIS/tags/v20b2/Source/exehead/bin2h.c, /NSIS/tags/v20b2/Source/exehead/bin2h.exe, /NSIS/tags/v20b2/Source/exehead/Makefile, /NSIS/tags/v20b2/Source/exehead/uninst.ico, /NSIS/tags/v20b2/Source/Makefile, /NSIS/tags/v20b2/Source/makenssi.dsw, /NSIS/tags/v20b2/Source/zlib/DEFLATE.H, /NSIS/tags/v20b2/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20b2'. 2003-02-27 13:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: custom function name: MUI_CUSTOMFUNCTION_START > MUI_CUSTOMFUNCTION_STARTMENU 2003-02-26 15:31 kichik * /NSIS/trunk/TODO.txt: b3 todo, and one thing done 2003-02-26 15:30 kichik * /NSIS/trunk/Examples/makensis.nsi: - b2 version number - website URL fixed 2003-02-26 15:28 kichik * /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: - b2 version number - bug with commands starting with ! and ending with \ in if blocks fixed 2003-02-26 15:27 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: Optimizations 2003-02-26 15:24 kichik * /NSIS/trunk/Contrib/Icons/new_nsis.ico: New icon with 16x16 version too 2003-02-26 14:52 kichik * /NSIS/trunk/TODO.txt: Weird bug 2003-02-26 10:44 kichik * /NSIS/trunk/TODO.txt: RMDir /REBOOTOK 2003-02-23 19:26 joostverburg * /NSIS/trunk/Menu/images/btn-compiler.gif, /NSIS/trunk/Menu/images/btn-docs.gif, /NSIS/trunk/Menu/images/btn-update.gif, /NSIS/trunk/Menu/images/btn-websites.gif, /NSIS/trunk/Menu/images/btn-welcome.gif: button design 2003-02-22 10:59 kichik * /NSIS/trunk/Contrib/Language files/Turkish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Turkish.nsh, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Turkish 2003-02-21 22:22 kichik * /NSIS/trunk/Menu/index.html: Compiler link in welcome page 2003-02-21 22:20 kichik * /NSIS/trunk/Examples/example2.nsi: Wrong shortcut 2003-02-21 21:38 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: directory probs solved 2003-02-21 19:29 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: nsis update closes nsis menu 2003-02-21 19:27 joostverburg * /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: # for menu link to current page 2003-02-21 15:57 joostverburg * /NSIS/trunk/Docs/src/history.but: beta 2 changelog 2003-02-21 15:29 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: install cvs data when compiling makensis.nsi, removed makensisw jnetlib 2003-02-20 21:14 kichik * /NSIS/trunk/Contrib/Makensisw/shell.ico: Modern icon for scripts 2003-02-20 21:04 kichik * /NSIS/trunk/TODO.txt: Old stuff removed 2003-02-20 20:31 kichik * /NSIS/trunk/TODO.txt: Halibut links 2003-02-20 19:33 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Examples/makensis.nsi: No need for JNetLib 2003-02-20 19:30 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: - Update moved to NSIS Update - New icon, different from NSIS Menu's 2003-02-20 19:29 kichik * /NSIS/trunk/Contrib/Makensisw/jnetlib: Update moved to NSIS update 2003-02-20 19:09 joostverburg * /NSIS/trunk/Contrib/Dialer/dialer.dsp, /NSIS/trunk/Plugins/Dialer.dll: dynamically load 2003-02-20 18:47 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: CreateDireectory now sets the error flag only when really needed instead of almost always 2003-02-20 18:43 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: temp file in temp dir 2003-02-20 17:33 kichik * /NSIS/trunk/Contrib/Dialer/dialer.c: Removed old stuff 2003-02-20 09:57 joostverburg * /NSIS/trunk/Examples/makensis.nsi: cvsdata.nsi 2003-02-20 09:49 joostverburg * /NSIS/trunk/Examples/makensis.nsi: descriptions, titles, NSISdl license, mui graphics 2003-02-19 22:36 joostverburg * /NSIS/trunk/Examples/makensis.nsi: overwrite, description 2003-02-19 21:46 joostverburg * /NSIS/trunk/Contrib/Dialer/Dialer.txt, /NSIS/trunk/Contrib/NSISdl/License.txt, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: updated readme 2003-02-19 21:29 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi, /NSIS/trunk/Examples/makensis.nsi: Dialer plugin 2003-02-19 21:24 joostverburg * /NSIS/trunk/Contrib/Dialer/dialer.c: linked to ExDLL 2003-02-19 21:12 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: automatically connect to the internet 2003-02-19 21:09 joostverburg * /NSIS/trunk/Contrib/Dialer, /NSIS/trunk/Contrib/Dialer/dialer.c, /NSIS/trunk/Contrib/Dialer/dialer.dsp, /NSIS/trunk/Contrib/Dialer/dialer.dsw, /NSIS/trunk/Contrib/Dialer/Dialer.txt, /NSIS/trunk/Plugins/Dialer.dll: Dialer plugin 2003-02-19 20:36 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/util.c: MBCS support for validate_filename and error flag for CreateDirectory/SetOutPath 2003-02-19 20:03 kichik * /NSIS/trunk/Examples/makensis.nsi: Jumps fixes 2003-02-19 15:05 joostverburg * /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images/version.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: custom dpi / skin compatible 2003-02-18 21:20 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi: better name for the temp file 2003-02-18 21:11 joostverburg * /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/NSIS Update/Resources/GUI/io.ini: NSIS Update can update itself 2003-02-18 20:20 joostverburg * /NSIS/trunk/Contrib/NSIS Update, /NSIS/trunk/Contrib/NSIS Update/NSISUpdate.nsi, /NSIS/trunk/Contrib/NSIS Update/Resources, /NSIS/trunk/Contrib/NSIS Update/Resources/BIN, /NSIS/trunk/Contrib/NSIS Update/Resources/BIN/bzip2.exe, /NSIS/trunk/Contrib/NSIS Update/Resources/GUI, /NSIS/trunk/Contrib/NSIS Update/Resources/GUI/io.ini, /NSIS/trunk/Contrib/NSIS Update/Resources/GUI/NSISUpdate.exe, /NSIS/trunk/Examples/cvsdata.nsi: NSIS Update source 2003-02-18 20:13 kichik * /NSIS/trunk/Docs/src/credits.but: aka Techkid 2003-02-18 20:06 joostverburg * /NSIS/trunk/Menu/images/header.gif: nicer text 2003-02-18 20:00 kichik * /NSIS/trunk/Docs/src/credits.but: NSIS Update 2003-02-18 19:58 kichik * /NSIS/trunk/Source/exehead/util.c: Path validation improvments. Now works with VC7 too. 2003-02-18 19:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated translation 2003-02-18 18:59 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: Added colon for start menu dialog title (thanks bl4st3r) 2003-02-18 18:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated translation 2003-02-18 18:24 joostverburg * /NSIS/trunk/Docs/src/credits.but: credits 2003-02-17 21:49 joostverburg * /NSIS/trunk/Examples/makensis.nsi: added new files to uninstall section 2003-02-17 21:11 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi: entries.log, Source\exehead 2003-02-17 20:38 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new files, improvements 2003-02-17 20:14 joostverburg * /NSIS/trunk/Examples/cvsdata.nsi: nsis update - check for new releases, download cvs files 2003-02-17 19:58 joostverburg * /NSIS/trunk/Menu, /NSIS/trunk/Menu/compiler.html, /NSIS/trunk/Menu/docs.html, /NSIS/trunk/Menu/images, /NSIS/trunk/Menu/images/btn-compiler.gif, /NSIS/trunk/Menu/images/btn-docs.gif, /NSIS/trunk/Menu/images/btn-update.gif, /NSIS/trunk/Menu/images/btn-websites.gif, /NSIS/trunk/Menu/images/btn-welcome.gif, /NSIS/trunk/Menu/images/header.gif, /NSIS/trunk/Menu/images/silver.gif, /NSIS/trunk/Menu/images/version.gif, /NSIS/trunk/Menu/index.html, /NSIS/trunk/Menu/notinstalled.html, /NSIS/trunk/Menu/update.html, /NSIS/trunk/Menu/websites.html: nsis menu - launch nsis information, utilities, websites 2003-02-17 18:57 kichik * /NSIS/trunk/Examples/makensis.nsi: Sections.nsh too 2003-02-16 21:49 kichik * /NSIS/trunk/Examples/one-section.nsi: Added code for subsections too 2003-02-15 11:30 kichik * /NSIS/trunk/Source/exehead/exec.c: Wrong SAM 2003-02-15 11:07 kichik * /NSIS/trunk/Source/exehead/exec.c: Minimal required security clearance so we'll get by for sure 2003-02-15 00:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: removed old guiinit stuff 2003-02-14 22:33 kichik * /NSIS/trunk/Examples/one-section.nsi, /NSIS/trunk/Include/Sections.nsh: New Sections.nsh 2003-02-14 22:24 kichik * /NSIS/trunk/Include/WinMessages.nsh: No need for ${NSISDIR}\Include 2003-02-14 20:20 joostverburg * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Plugins/nsisdl.dll: Push instead of writing to $0 2003-02-14 18:51 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: STATE should work again 2003-02-14 17:44 kichik * /NSIS/trunk/Contrib/InstallOptions/test.nsi: Shift by one, we have a group box now 2003-02-14 13:07 kichik * /NSIS/trunk/Docs/src/callback.but: Missing colon 2003-02-14 10:19 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: initDialog should pop out the INI location, not show 2003-02-13 14:53 kichik * /NSIS/trunk/Docs/src/langs.but: Clarified LangStringUP a bit more 2003-02-13 13:28 kichik * /NSIS/trunk/Docs/src/var.but: A clearer sentence 2003-02-13 11:28 kichik * /NSIS/trunk/Examples/makensis.nsi: Jump to skipNSHAssoc not skipNSIAssoc 2003-02-12 18:04 flizebogen * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Docs/src/var.but: changes to SetFileAttributes and {$QUICKLAUNCH} 2003-02-11 17:58 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: - b2 (CVS) version - NSIS Installer will no longer override .nsi and .nsh association 2003-02-11 13:34 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: updated translation 2003-02-10 18:43 * /NSIS/tags/v20b1, /NSIS/tags/v20b1/Contrib/ExDLL/exdll.dsw, /NSIS/tags/v20b1/Contrib/Icons/normal-install.ico, /NSIS/tags/v20b1/Contrib/Icons/normal-uninstall.ico, /NSIS/tags/v20b1/Contrib/Icons/setup.ico, /NSIS/tags/v20b1/Contrib/InstallOptions/io.dsw, /NSIS/tags/v20b1/Contrib/InstallOptions/ioptdll.rc, /NSIS/tags/v20b1/Contrib/InstallOptions/resource.h, /NSIS/tags/v20b1/Contrib/Makensisw/afxres.h, /NSIS/tags/v20b1/Contrib/Makensisw/makensisw.dsw, /NSIS/tags/v20b1/Contrib/Makensisw/makensisw.xml, /NSIS/tags/v20b1/Contrib/NSISdl/asyncdns.h, /NSIS/tags/v20b1/Contrib/NSISdl/connection.h, /NSIS/tags/v20b1/Contrib/NSISdl/httpget.cpp, /NSIS/tags/v20b1/Contrib/NSISdl/httpget.h, /NSIS/tags/v20b1/Contrib/NSISdl/nsisdl.dsw, /NSIS/tags/v20b1/Contrib/NSISdl/resource.h, /NSIS/tags/v20b1/Contrib/NSISdl/Script1.rc, /NSIS/tags/v20b1/Contrib/Splash/splash.dsw, /NSIS/tags/v20b1/Contrib/zip2exe, /NSIS/tags/v20b1/Contrib/zip2exe/icon.ico, /NSIS/tags/v20b1/Contrib/zip2exe/main.cpp, /NSIS/tags/v20b1/Contrib/zip2exe/res.rc, /NSIS/tags/v20b1/Contrib/zip2exe/resource.h, /NSIS/tags/v20b1/Contrib/zip2exe/zip2exe.dsp, /NSIS/tags/v20b1/Contrib/zip2exe/zip2exe.xml, /NSIS/tags/v20b1/Examples/example2.nsi, /NSIS/tags/v20b1/Examples/primes.nsi, /NSIS/tags/v20b1/Examples/rtest.nsi, /NSIS/tags/v20b1/Source/afxres.h, /NSIS/tags/v20b1/Source/exedata.cpp, /NSIS/tags/v20b1/Source/exedata.h, /NSIS/tags/v20b1/Source/exehead/afxres.h, /NSIS/tags/v20b1/Source/exehead/bin2h.c, /NSIS/tags/v20b1/Source/exehead/bin2h.exe, /NSIS/tags/v20b1/Source/exehead/Makefile, /NSIS/tags/v20b1/Source/exehead/uninst.ico, /NSIS/tags/v20b1/Source/Makefile, /NSIS/tags/v20b1/Source/makenssi.dsw, /NSIS/tags/v20b1/Source/zlib/DEFLATE.H, /NSIS/tags/v20b1/Source/zlib/ZCONF.H: This commit was manufactured by cvs2svn to create tag 'v20b1'. 2003-02-10 18:43 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c: - Disabled file validation for ExecShell too (can exec URLs) - Compiles without support for compression too - Latest compiled version 2003-02-10 18:38 kichik * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/jumps.but: Little rearranging and new section above relative jumps 2003-02-10 18:34 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: /NOUNLOAD must be here 2003-02-10 17:54 kichik * /NSIS/trunk/TODO.txt: Goto + expanding instructions 2003-02-10 17:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Screenshot.png, /NSIS/trunk/Contrib/Modern UI/Screenshot2.png: 1.62 screenshots 2003-02-10 14:02 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/TODO.txt: RTL 2003-02-09 19:40 flizebogen * /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/var.but: fixed little typos and updated variables section 2003-02-09 16:15 joostverburg * /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/TODO.txt: links 2003-02-09 16:02 joostverburg * /NSIS/trunk/Examples/makensis.nsi: welcome page text, contrib desc 2003-02-09 15:56 joostverburg * /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/makenssi.cpp: 2003 2003-02-09 14:11 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/var.but: Some fixes, typos, and additions 2003-02-09 13:22 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi: Updated information about errors 2003-02-09 10:35 flizebogen * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/var.but: basic addtions to the docs 2003-02-09 04:35 kichik * /NSIS/trunk/Docs/src/history.but: A little type (thanks deguix) 2003-02-08 23:33 kichik * /NSIS/trunk/Examples/makensis.nsi: Forgot MUI.nsh 2003-02-08 23:03 kichik * /NSIS/trunk/TODO.txt: BgImage bug 2003-02-08 22:57 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: - b1 version numbers - CreateShortcut works with URLs again, no file name validating though 2003-02-08 22:42 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/pages.but: - Lots of small fixes - b1 history complete 2003-02-08 21:40 joostverburg * /NSIS/trunk/Docs/src/credits.but: translators 2003-02-08 20:49 sunjammerx * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.txt, /NSIS/trunk/Plugins/BgImage.dll: Removed the annoying window title bar 2003-02-08 16:24 kichik * /NSIS/trunk/TODO.txt: IO LBS_MULTIPLESEL 2003-02-08 14:35 kichik * /NSIS/trunk/TODO.txt: Done, done and done. 2003-02-08 14:30 kichik * /NSIS/trunk/Source/exehead/util.c: $QUICKLAUNCH will now fall back to current user too 2003-02-08 14:24 kichik * /NSIS/trunk/Source/exehead/Ui.c: Available space now shown even if remote directory can't be found (\\remote\drive\dir_that_doesnt_exist will now give the avaible space) 2003-02-08 12:28 kichik * /NSIS/trunk/Source/exehead/exec.c: You ain't never seen this bug. That '_' was never there! 2003-02-07 23:04 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/TODO.txt: - Compressor type listed in summary - SetOutPath now sets the current directory (RegDLL no longer does) - File names are now validated for commands that need normal files, the directory selection dialog, and every variable that contains a file/dir name - Fixed a distortion of the MUI's branding text with ClearType - $INSTDIR is now right in the custom page after the directory selection dialog - No more squares in the automatically appended directory name in the directory selection dialog - Size optimizations 2003-02-07 21:17 kichik * /NSIS/trunk/Docs/src/attributes.but: A little clarification on InstProgressFlags & XPStyle 2003-02-07 20:13 joostverburg * /NSIS/trunk/Docs/src/config.but: link to the archive 2003-02-07 19:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: MUI.nsh 2003-02-07 17:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: io hwnd in welcome/finish page function 2003-02-07 17:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated translation 2003-02-07 14:15 kichik * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi, /NSIS/trunk/Include/MUI.nsh: If we already have include directories, why not use them? 2003-02-07 12:48 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: No more random compression ratios. Don't you just love Microsoft standards? 2003-02-07 12:17 kichik * /NSIS/trunk/Examples/makensis.nsi: Added DONTSHOWSHORTCUTS define to prevent popping the shortcuts window at the end of the installation 2003-02-07 11:58 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: No more STATE for labels, useless and buggy with line breaks 2003-02-07 10:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: typo, removed old stuff, MUI_LANGDLL_PUSH 2003-02-07 10:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: unterminated string 2003-02-06 17:59 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: A little typo with CallInstDLL 2003-02-06 13:07 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modern3.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: Smooth progress bar problems fixed 2003-02-04 15:22 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh: updated translation 2003-02-04 11:52 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: missing startmenu defines 2003-02-02 21:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: abort function can call custom function 2003-02-02 19:09 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: more welcome/finish page functions 2003-02-02 18:03 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: startmenu fix 2003-02-02 17:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: modern ui functions can call custom functions 2003-02-02 16:49 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: .NET Framework detection function added 2003-02-02 15:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: fix 2003-02-02 15:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: fix 2003-02-02 15:01 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: updated translation 2003-01-30 18:52 rainwater * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: Russian updates 2003-01-30 18:42 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: No more problems for directories with a name starting with "error" 2003-01-30 00:59 rainwater * /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: Danish updates 2003-01-29 19:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: removed old text 2003-01-29 12:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: 1.62 2003-01-28 21:44 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2003-01-28 17:55 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Line cut on finish page fixed 2003-01-28 16:48 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Transparent branding text for the uninstaller too 2003-01-28 15:10 joostverburg * /NSIS/trunk/TODO.txt: drive space color 2003-01-28 15:07 joostverburg * /NSIS/trunk/TODO.txt: update 2003-01-28 14:28 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: ClearType + transparent branding text fix 2003-01-28 14:02 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: No branding text in welcome/finish page 2003-01-27 17:03 kichik * /NSIS/trunk/Source/exehead/exec.c: Installers can now contain more than one branding image 2003-01-27 16:15 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Plugins/InstallOptions.dll: + New browse dialog style (modern) + Word wrapping for check boxes and radio buttons + No ugly border for edit fields under XP + Scroll bar for list boxes + Only labels can have \r\n - fixed in docs 2003-01-27 15:44 kichik * /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Banner/Banner.dsp, /NSIS/trunk/Contrib/Banner/Example.nsi, /NSIS/trunk/Contrib/Banner/Readme.txt, /NSIS/trunk/Plugins/Banner.dll: Banner now "works" with the MUI too 2003-01-27 15:05 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modern3.exe, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: BrandingText now automatically resizes for all languages in the MUI 2003-01-25 08:43 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Setting the background color for label controls in IO fixed 2003-01-24 19:40 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: + Leave function for pages + Components page text always shown if Page components used 2003-01-23 19:17 kichik * /NSIS/trunk/Contrib/Modern UI/Readme.html: Typos 2003-01-21 20:37 kichik * /NSIS/trunk/Source/exehead/Ui.c: Fixed a bug with non ASCII characters in InstallDir and auto completion of browse selection (squares were added before non ASCII characters) 2003-01-21 19:37 kichik * /NSIS/trunk/TODO.txt: IO manual validation 2003-01-21 19:35 kichik * /NSIS/trunk/Docs/src/langs.but: Braces difference and a little typo 2003-01-21 19:24 kichik * /NSIS/trunk/Examples/makensis.nsi: Added NO_STARTMENUSHORTCUTS define 2003-01-20 13:57 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Fixed bug #671161: DISABLED dir and file request fields now disable the browse button too. 2003-01-20 13:02 kichik * /NSIS/trunk/Docs/src/sections.but: SubSection defined index (thanks VirtLink) 2003-01-19 16:56 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: ListBox and state now play along 2003-01-18 11:14 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: State information for list boxes and their relatives 2003-01-17 14:11 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed bug #660082 - Focus problems in MakeNSISw, menu shortcuts didn't work when focus was on the test button and it was disabled due to an error in the script. 2003-01-16 22:31 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: accelerator keys 2003-01-16 12:23 joostverburg * /NSIS/trunk/Examples/gfx.nsi: not the second page 2003-01-16 12:23 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: more languages 2003-01-16 12:16 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: updated translation 2003-01-15 12:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: startmenu registry 2003-01-15 12:15 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Slovak.nsh: updated/new translations 2003-01-14 14:24 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Missing i 2003-01-13 21:04 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: outdated 2003-01-13 21:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: fixes - polish temporary removed (very outdated) 2003-01-11 21:31 kichik * /NSIS/trunk/Examples/makensis.nsi: Use the new wizard bitmap 2003-01-11 21:29 kichik * /NSIS/trunk/Source/exehead/exec.c: Delete the old brush if setting the brush twice 2003-01-11 20:24 kichik * /NSIS/trunk/TODO.txt: CWD 2003-01-11 19:23 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Fixed problems with wsprintf limit of 1024 chars 2003-01-11 18:05 kichik * /NSIS/trunk/Contrib/Icons/modern-wizard llama.bmp, /NSIS/trunk/Contrib/Icons/modern-wizard nsis llama.bmp, /NSIS/trunk/Contrib/Icons/modern-wizard nsis.bmp: New MUI wizard pictures by VirtLink 2003-01-10 15:05 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/strlist.h: + IO works with new SetStaticBkColor + IO doesn't crash when a label has empty text + LangStrings now really start as "" when not defined 2003-01-09 21:43 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: Don't create more than one brush per SetStaticBkColor - saved about 50 bytes. Still problems with BrandingText width, working on it 2003-01-09 20:13 kichik * /NSIS/trunk/Examples/one-section.nsi: Nicer word wrapping 2003-01-09 20:09 kichik * /NSIS/trunk/Examples/one-section.nsi: Some blurb 2003-01-09 16:49 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: language file updates & fixes 2003-01-09 16:49 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: filename fixes 2003-01-09 16:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: removed 1.4 language file compatibility 2003-01-09 14:33 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: 4096 chars in Text field, that should be enough 2003-01-09 13:00 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Corrected GetWindowsVersion function 2003-01-09 12:49 kichik * /NSIS/trunk/Docs/src/langs.but, /NSIS/trunk/Docs/src/var.but: LangStrings update and other stuff that didn't get uploaded 2003-01-08 20:06 kichik * /NSIS/trunk/Source/exehead/Main.c: Delete the space that comes before _?= in the uninstaller $CMDLINE 2003-01-08 19:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: updated 2003-01-08 15:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: extract_as macro 2003-01-08 15:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: renamed io extract macro 2003-01-06 16:21 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: updated FileRequest/DirRequest size 2003-01-06 15:10 kichik * /NSIS/trunk/Contrib/InstallOptions/test.nsi: If writting into ${TEMP} better read from there too... 2003-01-06 12:58 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: dialog units 2003-01-06 11:37 joostverburg * /NSIS/trunk/Contrib/Language files/Macedonian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Macedonian.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: macedonian language files 2003-01-05 17:47 kichik * /NSIS/trunk/Source/script.cpp: Already inited, no need to do it again 2003-01-05 15:05 sunjammerx * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Inverted test of offset[3] for EW_DELREG meant that RegDeleteKey and RegDeleteValue were being swapped. 2003-01-04 16:25 joostverburg * /NSIS/trunk/Examples/makensis.nsi: fixes, format changes 2003-01-04 15:44 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2003-01-04 14:52 joostverburg * /NSIS/trunk/TODO.txt: button selection bug fixed 2003-01-04 14:45 kichik * /NSIS/trunk/Source/exehead/Ui.c: No more two buttons with thick border 2003-01-04 14:05 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.ini: flag fixed 2003-01-04 13:59 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/InstallOptions/test.ini: new flags 2003-01-04 13:09 joostverburg * /NSIS/trunk/TODO.txt: todo for beta 1 2003-01-04 13:02 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: - No more group by default - Added NoTabStop flag 2003-01-03 23:15 rainwater * /NSIS/trunk/Contrib/InstallOptions/Readme.html: Added DISABLED flag to docs 2003-01-03 22:40 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Changed URL of the archive 2003-01-03 22:34 kichik * /NSIS/trunk/Plugins/InstallOptions.dll: DISABLED flag 2003-01-03 22:33 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Little typo 2003-01-03 22:26 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: DISABLED flag 2003-01-02 17:14 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: nsExec didn't free allocated memory 2003-01-02 13:08 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: typos 2002-12-30 15:33 kichik * /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/resource.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Update !system, cleaned resource.h, DeleteRegKey works on default value 2002-12-30 12:56 joostverburg * /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc: removed nsis stuff 2002-12-29 22:04 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: updated translation 2002-12-29 21:41 joostverburg * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modern3.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc: better grouping 2002-12-29 20:30 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: group radio buttons 2002-12-29 20:16 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Group flag added for radio buttons only 2002-12-29 20:01 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.ini: nicer dialog 2002-12-29 20:01 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: groupbox / return value info 2002-12-29 19:46 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/util.cpp: Last icon used counts, all others deleted 2002-12-29 19:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: UninstallIcon not used when MUI_UNINSTALLER is not defined 2002-12-29 17:48 kichik * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modern3.exe: Second string in 111 now has an id too (76) 2002-12-28 13:05 kichik * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: Fixed bug #659359 2002-12-27 21:24 kichik * /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/ui.but: SendMessage and Return got mixed up 2002-12-27 16:31 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Source/exehead/exec.c: Fixed bug #659045 2002-12-27 15:20 kichik * /NSIS/trunk/Examples/makensis.nsi: nsh now has its own name 2002-12-27 11:54 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: Now works with EXEs that have data tacked after the PE sections (like NSIS installation data) 2002-12-26 22:04 kichik * /NSIS/trunk/Source/script.cpp: Shortcuts can now have comments/descriptions without icon index and start options (leave blank - empty string - "") 2002-12-26 21:52 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: Fixes 2002-12-26 16:21 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: Calling nsExec from an installer that was executing using CreateProcess from another process now doesn't give an error about an invalid handle 2002-12-26 14:37 kichik * /NSIS/trunk/Docs/src/defines.but: !ifndef and !endif docs replaced 2002-12-24 22:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: cleanup 2002-12-24 22:38 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: better format, cleanup, right order of elements 2002-12-24 20:57 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2002-12-24 20:45 joostverburg * /NSIS/trunk/Source/makenssi.cpp: (kichik) MakeNSIS now sends output directly to MakeNSISw, faster, and no more problems with foreign languages in the output. 2002-12-24 20:35 joostverburg * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: (kichik) MakeNSIS now sends output directly to MakeNSISw, faster, and no more problems with foreign languages in the output. 2002-12-23 12:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: e-mail 2002-12-22 20:53 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: Tabs 2002-12-21 23:31 kichik * /NSIS/trunk/Source/Plugins.cpp: idx not dataHandle 2002-12-21 23:13 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: Unsigned/signed warnings 2002-12-21 23:04 kichik * /NSIS/trunk/Source/script.cpp: Removed debug message 2002-12-21 16:16 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: removed debug stuff 2002-12-21 11:24 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Plugins/InstallOptions.dll: Added group box, and made dir request not crash and use Text field 2002-12-21 09:14 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp: Case insensitive plug-in function names 2002-12-20 23:57 kichik * /NSIS/trunk/TODO.txt: Include dirs done 2002-12-20 23:23 kichik * /NSIS/trunk/Source/lang.cpp: A warning if a LangString is not present in all language tables 2002-12-20 20:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: langstring changes 2002-12-20 19:14 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp: OK, LangStrings can now really be defined after they are used 2002-12-20 15:26 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: typo 2002-12-20 15:12 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h: LangStrings now act as functions, they don't need to be defined before used. Uninstaller LangStrings must now be refernced with un. 2002-12-20 13:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: updated translations & version numbers 2002-12-20 11:58 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Fixed bug item #656371 2002-12-20 11:12 kichik * /NSIS/trunk/Docs/src/ui.but: SendMessage STR: 2002-12-19 19:44 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added link the forum in help menu 2002-12-19 17:34 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: updated translation 2002-12-18 21:08 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: xhtml 2002-12-18 20:22 kichik * /NSIS/trunk/Source/exehead/exec.c: Only RegDLL and UnRegDLL will change the current directory so plug-ins will now work as before 2002-12-18 16:41 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Updating works with b1, and MakeNSISw compiles without PSDK 2002-12-18 16:05 kichik * /NSIS/trunk/Source/ResourceEditor.cpp: Fixed bug item #655607 2002-12-18 13:44 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: updated translation 2002-12-17 13:47 joostverburg * /NSIS/trunk/Examples/makensis.nsi: fix 2002-12-17 13:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: updated translation 2002-12-17 13:46 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: ui settings before lang files, xhtml 2002-12-16 17:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: brandingtext trim fixed 2002-12-16 17:24 joostverburg * /NSIS/trunk/Examples/makensis.nsi: fixes 2002-12-16 16:53 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Debug compiles too 2002-12-16 16:41 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Romanian 2002-12-16 14:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: header subtitle during installation too long 2002-12-16 14:14 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: color format 2002-12-16 14:04 joostverburg * /NSIS/trunk/Contrib/Language files/Romanian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Romanian.nsh: Romanian language files 2002-12-16 14:03 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.html: small fixes 2002-12-15 21:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: fixes, multilingual brandingtext, reservefile, bgcolor 2002-12-15 20:56 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Readme.html: ReserveFile 2002-12-15 20:54 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Include dirs (${NSISDIR}\Inclue is automatically one of them, use !AddIncludeDir to add more). Fixed a bug with SetStaticBkColor (-1) 2002-12-15 20:29 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Changelog.txt, /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/Readme.html: new documentation 2002-12-15 19:03 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: stack fix 2002-12-15 14:44 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: removed some useles stuff 2002-12-14 21:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: updated translation 2002-12-14 13:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: updated translation 2002-12-14 13:11 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini: high dpi fix 2002-12-14 00:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: position of Page commands 2002-12-14 00:20 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2002-12-14 00:15 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.62 2002-12-14 00:10 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Plugins/InstallOptions.dll: Install Options DLL 2.0 2002-12-13 23:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh: updated langname 2002-12-12 20:36 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: RESIZETOFIT flag for Image 2002-12-12 19:26 kichik * /NSIS/trunk/Source/script.cpp: BrandingText that starts with / doesn't give errors any more 2002-12-12 19:01 kichik * /NSIS/trunk/Source/script.cpp: Oops... No debuging code needed there :) 2002-12-12 19:00 kichik * /NSIS/trunk/Source/script.cpp: !if/!else/!endif problems should be solved now 2002-12-12 16:54 kichik * /NSIS/trunk/Source/exehead/Ui.c: Abort now works from .onGUIInit 2002-12-12 15:51 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: SetFont "MS Shell Dlg" adds the DS_SHELLFONT style 2002-12-11 20:03 joostverburg * /NSIS/trunk/Docs/src/history.but: start of beta 1 changelog 2002-12-11 19:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: string name fixed 2002-12-11 19:33 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: b1 (CVS) label 2002-12-11 18:51 kichik * /NSIS/trunk/Contrib/UIs/UI Holder/ui.dsp: No readme.txt here... 2002-12-11 16:24 joostverburg * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modern3.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: added minimize box 2002-12-11 16:01 kichik * /NSIS/trunk/Source/exehead/resource.rc: Minimize box 2002-12-11 14:31 joostverburg * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Source/exehead/resource.rc: increased size of component-page textarea 2002-12-11 14:29 kichik * /NSIS/trunk/Source/build.cpp: Second string missing (thanks veekee) 2002-12-10 20:31 joostverburg * /NSIS/trunk/Contrib/Language files/Thai.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Thai.nsh: Thai translation 2002-12-10 17:19 kichik * /NSIS/trunk/Source/exehead/util.c: Fixed a year and a half old bug with renaming on Windows 9x to a file name that does not exist. 2002-12-08 20:53 kichik * /NSIS/trunk/Docs/src/credits.but: Croatian credits 2002-12-08 20:08 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: updated translation 2002-12-08 19:53 kichik * /NSIS/trunk/Docs/src/credits.but: Updated credits 2002-12-08 16:30 joostverburg * /NSIS/trunk/Contrib/Language files/Croatian.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Croatian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: updated & new translations 2002-12-07 13:59 kichik * /NSIS/trunk/Source/exehead/config.h: NSIS_CONFIG_PLUGIN_SUPPORT depends on NSIS_SUPPORT_FNUTIL 2002-12-07 12:49 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: updated translation 2002-12-07 09:57 kichik * /NSIS/trunk/Source/script.cpp: Fixed stupid bug with !else ifdef 2002-12-06 23:17 kichik * /NSIS/trunk/TODO.txt: More for next version 2002-12-06 22:53 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: verbose fixed 2002-12-06 22:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixes 2002-12-06 22:02 kichik * /NSIS/trunk/Examples/makensis.nsi: Unistall confirm page 2002-12-06 21:57 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf: updated translation 2002-12-06 21:57 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf: good translation back 2002-12-06 21:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: added define for uninstall confirm page, continue texts for uninstaller, bugfixes 2002-12-06 20:51 kichik * /NSIS/trunk/Examples/makensis.nsi: No annoying message box 2002-12-06 20:24 kichik * /NSIS/trunk/Examples/makensis.nsi: Delete include dir 2002-12-06 19:34 kichik * /NSIS/trunk/Docs/src/credits.but: New languages credits 2002-12-06 19:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: more improvements 2002-12-06 19:08 joostverburg * /NSIS/trunk/Examples/makensis.nsi: links directly to new docs 2002-12-06 17:34 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: updated translation 2002-12-06 17:25 kichik * /NSIS/trunk/Docs/src/intro.but: Crotian coming 2002-12-06 17:20 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/WinMessages.NSH, /NSIS/trunk/Include, /NSIS/trunk/Include/WinMessages.nsh: new location for WinMessages.nsh 2002-12-06 16:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: updated translation 2002-12-06 16:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: fixes 2002-12-06 16:13 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: added mui_finishpage_run_parameters, updated documentation 2002-12-06 15:43 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/exehead/Ui.c: No more flickering, cross your fingers for no bugs... 2002-12-06 14:55 joostverburg * /NSIS/trunk/Contrib/UIs/modern3.exe: oops...wrong file 2002-12-06 14:18 kichik * /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp: !define lines will keep escaping as they are 2002-12-06 13:21 kichik * /NSIS/trunk/Docs/src/log.but: LogSet 2002-12-06 12:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: changelog updated 2002-12-05 23:07 kichik * /NSIS/trunk/Source/exehead/Ui.c: Locking that actually works... 2002-12-05 19:44 kichik * /NSIS/trunk/Source/makenssi.cpp: Page size in /HDRINFO 2002-12-05 19:42 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: NSIS_CONFIG_ENHANCEDUI_SUPPORT is a must for MUI 2002-12-05 19:28 kichik * /NSIS/trunk/Source/build.cpp: Define list fixed 2002-12-05 19:17 kichik * /NSIS/trunk/TODO.txt: Language files updater 2002-12-05 19:14 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Doesn't enable the check for update menu entry right away but only after the check is finished 2002-12-05 19:00 kichik * /NSIS/trunk/Examples/makensis.nsi: modern3.exe forgotten 2002-12-05 18:30 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/script.cpp: More VC7 compatibility fixes 2002-12-05 17:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: info about modern3.exe 2002-12-05 17:41 joostverburg * /NSIS/trunk/Contrib/UIs/modern3.exe: Modern UI without description area 2002-12-05 17:20 kichik * /NSIS/trunk/Examples/makensis.nsi: Indenting fixes 2002-12-05 16:52 kichik * /NSIS/trunk/Contrib/Banner/Example.nsi: Some "useful" output 2002-12-05 16:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.61 - final version for beta 0 2002-12-05 16:28 joostverburg * /NSIS/trunk/Examples/makensis.nsi: added tiny ui 2002-12-05 16:20 joostverburg * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf: updated translation 2002-12-05 14:56 kichik * /NSIS/trunk/Source/ResourceEditor.h: Unsigned here too... 2002-12-05 14:49 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/ResourceEditor.cpp: Type mismatches 2002-12-05 13:05 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Plugins/nsisdl.dll: Translatable NSISdl 2002-12-05 11:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: fixes 2002-12-04 22:14 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: updated translation 2002-12-04 21:11 kichik * /NSIS/trunk/Source/exehead/exec.c: Set the current directory back to the exe dir 2002-12-04 20:05 kichik * /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/connection.cpp, /NSIS/trunk/Contrib/NSISdl/netinc.h, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/NSISdl/util.h, /NSIS/trunk/Plugins/nsisdl.dll: Smaller 2002-12-04 20:01 kichik * /NSIS/trunk/Docs/src/history.but: History update 2002-12-04 19:22 kichik * /NSIS/trunk/Source/lang.cpp: Delete File: should have a space after it 2002-12-04 18:02 kichik * /NSIS/trunk/Source/script.cpp: Some strings made case insensitive 2002-12-04 14:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Korean.nsh: Korean translation 2002-12-04 14:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: updated translation 2002-12-04 13:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: updated finishpage translation 2002-12-03 20:33 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c: RegDLL now sets the current directory to the DLL directory (Patch #646306 ) 2002-12-03 20:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: language file macro fix 2002-12-03 19:57 joostverburg * /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: resursive defines, langdll macro 2002-12-02 23:08 eccles * /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Freed 104 bytes for more dll imports, at the cost of 78 bytes of code 2002-12-02 17:48 kichik * /NSIS/trunk/Source/script.cpp: define inside define name should work now (${bla${blo}}) 2002-12-02 16:02 kichik * /NSIS/trunk/Source/exehead/Ui.c: Some more improvments 2002-12-02 15:51 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/exehead/Ui.c: Install script fixes. .onSelChange is now called after installation type change too 2002-12-02 15:42 joostverburg * /NSIS/trunk/Contrib/Modern UI/License.txt: line breaks 2002-12-02 14:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated finishpage translation 2002-12-01 22:22 joostverburg * /NSIS/trunk/Examples/makensis.nsi: Modern UI Screenshot2.png added 2002-12-01 18:55 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: updated translation 2002-12-01 18:42 kichik * /NSIS/trunk/Source/exehead/Ui.c: Desktop flickering with first page a custom page 2002-12-01 13:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: !else now always works 2002-12-01 13:19 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: Fixed a bug with !if and friends and fixed an ancient bug with line counting going wrong with macros 2002-12-01 12:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated finishpage translation 2002-12-01 11:43 kichik * /NSIS/trunk/TODO.txt: Links 2002-11-30 20:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh: updated for Modern UI 1.6 2002-11-30 13:38 kichik * /NSIS/trunk/Docs/src/intro.but: More languages 2002-11-30 13:35 kichik * /NSIS/trunk/Docs/src/history.but: Sections in silent installer 2002-11-30 13:15 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/zlib/INFBLOCK.C: + Sections can be unselected in silent mode too + Some documentation fixes + Transition between a normal page and a custom page no longer causes a flicker (between two custom pages it still does) + The completed sub-caption shows again 2002-11-29 19:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: different string for finishpage title possible, some translation updates 2002-11-29 15:46 kichik * /NSIS/trunk/Contrib/Language files/Bulgarian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Bulgarian.nsh: Bulgarian 2002-11-29 11:04 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: MUI_INSTALLCOLORS and MUI_PROGRESSBAR fix 2002-11-28 16:00 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: finishpage run/showreadme fixes 2002-11-28 15:57 kichik * /NSIS/trunk/Source/lineparse.h: Fixed bug with escaping quotes 2002-11-28 15:36 joostverburg * /NSIS/trunk/Contrib/Language files/Danish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Danish.nsh: Danish translation 2002-11-28 13:54 kichik * /NSIS/trunk/Docs/src/ui.but: Another link fixed 2002-11-28 13:50 kichik * /NSIS/trunk/Docs/src/langs.but: Fixed link to lang files dir 2002-11-28 13:43 kichik * /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/ui.but: Section flags updated 2002-11-28 13:13 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: DS_SHELLFONT fixes 2002-11-28 13:08 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: /NOUNLOAD added 2002-11-28 09:59 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated translation 2002-11-27 19:09 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Hungarian.nsh: Hungarian Language File for Modern UI 1.6 2002-11-27 18:44 kichik * /NSIS/trunk/Docs/src/attributes.but: Fixed Icon and UninstallIcon documentation 2002-11-27 16:04 kichik * /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/util.cpp: Moved new and delete away from ResourceEditor into util.cpp 2002-11-27 15:23 kichik * /NSIS/trunk/Source/exehead/resource.h: #define DS_SHELLFONT 2002-11-26 18:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: fixed macro name 2002-11-25 20:16 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: InitPluginsDir now causes to Init___PluginsDir to always get added 2002-11-25 18:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: : added 2002-11-25 18:09 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: 1.6 2002-11-25 16:50 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp: Next button text is now always added when needed, instfiles dialog is destroyed when needed. 2002-11-24 21:12 rainwater * /NSIS/trunk/Plugins/Banner.dll: Added banner.dll to plugins dir 2002-11-24 18:50 kichik * /NSIS/trunk/Contrib/Banner, /NSIS/trunk/Contrib/Banner/Banner.c, /NSIS/trunk/Contrib/Banner/Banner.dsp, /NSIS/trunk/Contrib/Banner/Banner.dsw, /NSIS/trunk/Contrib/Banner/Example.nsi, /NSIS/trunk/Contrib/Banner/Readme.txt, /NSIS/trunk/Examples/makensis.nsi: Banner - shows some text before installation starts 2002-11-24 18:20 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Plugins/BgImage.dll, /NSIS/trunk/Plugins/splash.dll: UnregisterClass added 2002-11-24 17:50 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c: No warning when compiling 2002-11-24 15:30 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: ReserveFile info 2002-11-23 19:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated for Modern UI 1.6 2002-11-22 23:41 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Finish page run command with spaces now works 2002-11-22 22:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: verbose stuff 2002-11-22 21:24 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf: updated translation 2002-11-22 17:10 sunjammerx * /NSIS/trunk/Examples/example1.nsi: Typo correction, and slight re-wording. 2002-11-22 15:46 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c: Exec will now always work 2002-11-22 12:58 kichik * /NSIS/trunk/Source/Plugins.cpp: Another line... =/ 2002-11-22 12:56 kichik * /NSIS/trunk/Source/Plugins.cpp: Forgot a line 2002-11-22 12:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: fixes 2002-11-22 12:45 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp: Plugins used both in uninstaller and installer problems should be fixed now 2002-11-22 12:32 kichik * /NSIS/trunk/Source/script.cpp: Defines returned to normal after !insertmacro 2002-11-22 11:54 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Plugins/UserInfo.dll: Fixed memory leaks 2002-11-22 11:02 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.dsp, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Contrib/nsExec/test.nsi, /NSIS/trunk/Plugins/nsExec.dll: Added ExecToStack 2002-11-22 10:07 kichik * /NSIS/trunk/Contrib/StartMenu/Example.nsi: Something a bit more useful 2002-11-22 09:51 kichik * /NSIS/trunk/Examples/gfx.nsi: Some more explanations 2002-11-21 23:32 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h: Temporary solution to make SetFont work again 2002-11-21 22:59 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp: Fixes with uninstall plugins and custom pages 2002-11-21 22:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/System.nsh: smaller margins on welcome/finish page 2002-11-21 22:36 kichik * /NSIS/trunk/Examples/gfx.nsi: Custom uninstaller page 2002-11-21 21:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: " 2002-11-21 21:51 kichik * /NSIS/trunk/Docs/src/script.but: Single back-slash 2002-11-21 21:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: escape ", brandingtext 2002-11-21 19:15 kichik * /NSIS/trunk/Docs/src/script.but: Escaping quotes 2002-11-21 19:10 kichik * /NSIS/trunk/TODO.txt: Arrg... I hate it when people touch my computer 2002-11-21 19:09 kichik * /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/TODO.txt: Support for escaping quotes using $" Source\lineparse.h Source\script.cpp 2002-11-21 18:43 kichik * /NSIS/trunk/Docs/src/basic.but: Quotes 2002-11-21 18:34 kichik * /NSIS/trunk/nsisconf.nsh: Quote 2002-11-21 17:29 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll: Now works with latest changes 2002-11-21 16:46 kichik * /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: Fixed bug item 641776 and returned zlib header to 34KB 2002-11-20 23:58 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C: fixed bug in zlib support (oops, my bad) 2002-11-20 18:27 kichik * /NSIS/trunk/Docs/src/history.but: InitPluginsDir 2002-11-20 17:41 kichik * /NSIS/trunk/Source/makenssi.cpp: nsisconf.nsh works again 2002-11-20 14:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: InitPluginsDir fixes 2002-11-20 02:06 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.rc: Alt+T should open Tools window 2002-11-19 21:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: updated for Modern UI 1.6 2002-11-19 19:06 joostverburg * /NSIS/trunk/Contrib/Language files/Czech.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Czech.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: updated/new translations 2002-11-19 17:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: updated for Modern UI 1.6 2002-11-19 15:54 joostverburg * /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/AdvSplash/advsplash.dsp, /NSIS/trunk/Contrib/AdvSplash/advsplash.dsw, /NSIS/trunk/Contrib/AdvSplash/advsplash.txt, /NSIS/trunk/Contrib/AdvSplash/Example.nsi, /NSIS/trunk/Plugins/advsplash.dll: fixes 2002-11-18 20:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/Screenshot.png, /NSIS/trunk/Contrib/Modern UI/Screenshot2.png: new screenshots 2002-11-18 17:57 joostverburg * /NSIS/trunk/Examples/makensis.nsi: modern ui updates 2002-11-18 16:14 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: font / ui changes 2002-11-18 15:53 joostverburg * /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc: shell font 2002-11-18 15:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioSpecial.ini, /NSIS/trunk/Contrib/Modern UI/ioWizard.ini: renamed 2002-11-18 15:43 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: font / ui changes 2002-11-18 15:11 kichik * /NSIS/trunk/Examples/makensis.nsi: StartMenu.nsi and WelcomeFinish.nsi 2002-11-18 14:19 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/script.cpp: Now works with DIALOGEX (not thanks to MS docs) 2002-11-18 13:58 joostverburg * /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc: language 2002-11-18 13:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.nsi: fixes 2002-11-17 17:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: startmenu dll return >, not ^ 2002-11-17 17:54 joostverburg * /NSIS/trunk/Contrib/StartMenu/Readme.txt: typo 2002-11-17 17:46 joostverburg * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: shell font, language 2002-11-17 17:42 joostverburg * /NSIS/trunk/Contrib/UIs/modern2.exe: shell font 2002-11-17 16:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern.exe: shell font 2002-11-17 16:44 joostverburg * /NSIS/trunk/Source/exehead/resource.rc: removed useles constant 2002-11-17 16:37 joostverburg * /NSIS/trunk/Contrib/Makensisw/resource.rc: shell font 2002-11-17 16:12 joostverburg * /NSIS/trunk/Source/exehead/resource.rc: shell font 2002-11-17 12:44 joostverburg * /NSIS/trunk/Contrib/System/System.nsh: show window constants now in WinMessages.nsh 2002-11-17 12:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: updated for Modern UI 1.6 2002-11-16 22:05 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: welcome/finish init called by modern ui, guiinit changes 2002-11-16 21:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: welcome/finish page multilanguage fixes 2002-11-16 19:58 kichik * /NSIS/trunk/Docs/src/credits.but: Some cosmetic changes 2002-11-16 19:56 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: 1.6 update 2002-11-16 16:54 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: Updated. 2002-11-16 15:40 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Error when including same language file twice 2002-11-16 15:29 kichik * /NSIS/trunk/Examples/makensis.nsi: Branding.nsh removed 2002-11-16 15:25 kichik * /NSIS/trunk/Examples/branding.nsh: No need any longer 2002-11-16 12:48 kichik * /NSIS/trunk/Examples/makensis.nsi: Added forgotten files 2002-11-15 22:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: updated for Modern UI 1.6 2002-11-15 22:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioWizard.ini, /NSIS/trunk/Contrib/Modern UI/System.nsh: larger textarea on welcome page 2002-11-15 22:14 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: typo 2002-11-15 21:38 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: updated for Modern UI 1.6 2002-11-15 21:24 kichik * /NSIS/trunk/Docs/src/history.but: Still flickers, and welcome and finish screen 2002-11-15 21:11 kichik * /NSIS/trunk/TODO.txt: New commands done 2002-11-15 21:11 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: Rect added 2002-11-15 21:08 kichik * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/ui.but: Ordering and some new functions documented 2002-11-15 20:29 kichik * /NSIS/trunk/Docs/src/plugin.but: Moved around 2002-11-15 20:28 kichik * /NSIS/trunk/Docs/src/plugin.but: SetPluginUnload and warning about last plugin call with /NOUNLOAD 2002-11-15 20:22 kichik * /NSIS/trunk/Docs/src/langs.but: LoadLanguageFile and LangString[UP] are now in the instructions section too 2002-11-15 20:21 kichik * /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/var.but: InitPluginsDir and $PLUGINSDIR 2002-11-15 19:55 kichik * /NSIS/trunk/Docs/src/compilerflags.but: SetPluginUnload 2002-11-15 19:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: updated string names. work for basic installers now, but need to be updated 2002-11-15 19:34 kichik * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/langs.but: Credits and multiple languages added 2002-11-15 19:26 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: typo 2002-11-15 19:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: added return 2002-11-15 19:17 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/version.cpp: minor changes 2002-11-15 18:46 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new modern ui 2002-11-15 18:46 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh: show readme, disable reboot support 2002-11-15 18:45 rainwater * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Docs/src/usection.but, /NSIS/trunk/Docs/src/usefulfunc.but, /NSIS/trunk/Docs/src/var.but: Updated docs 2002-11-15 17:27 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fix 2002-11-15 17:10 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: updated translation 2002-11-15 16:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: updated translation 2002-11-15 16:37 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: Modern UI 1.6 2002-11-15 16:28 kichik * /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini: No more cancel confirm in IO 2002-11-15 16:20 joostverburg * /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: removed finishheader macro 2002-11-15 16:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: custom guiinit 2002-11-15 16:17 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Forgot two lines... 2002-11-15 16:13 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Leave the cancel alone evil IO! 2002-11-15 16:05 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: \t works again, and stil 11kb 2002-11-15 16:00 joostverburg * /NSIS/trunk/Contrib/Modern UI/ioWizard.ini, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/StartMenu.nsi, /NSIS/trunk/Examples/Modern UI/WelcomeFinish.nsi: Modern UI 1.6 2002-11-15 15:54 joostverburg * /NSIS/trunk/Contrib/Icons/modern-wizard.bmp: bitmap for new pages 2002-11-15 15:15 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Back to 11KB 2002-11-15 15:07 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: New lines in labels, different rect and dialog background 2002-11-15 13:50 joostverburg * /NSIS/trunk/TODO.txt: examples checked 2002-11-15 13:49 kichik * /NSIS/trunk/TODO.txt: IO defaults disabling done 2002-11-15 13:45 kichik * /NSIS/trunk/Examples/WinMessages.NSH, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Enabled SetWindowLong 2002-11-15 13:34 joostverburg * /NSIS/trunk/Examples/viewhtml.nsi: temp file, new html file 2002-11-15 13:26 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new examples 2002-11-15 13:15 kichik * /NSIS/trunk/Examples/WinMessages.NSH, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: ShowWindow added 2002-11-15 13:08 kichik * /NSIS/trunk/Examples/gfx.nsi: Some fixes 2002-11-15 12:53 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Enabled/show stuff now doesn't do a thing unless specified in the INI file, no more IO defaults, only NSIS defaults. 2002-11-15 12:24 kichik * /NSIS/trunk/TODO.txt: Examples for plugins - DONE 2002-11-15 12:22 kichik * /NSIS/trunk/Contrib/AdvSplash/Example.nsi: MakeNSISW has no sounds 2002-11-15 12:22 kichik * /NSIS/trunk/Contrib/Splash/Example.nsi: Splash.dll example 2002-11-15 12:21 kichik * /NSIS/trunk/Contrib/AdvSplash/Example.nsi: AdvSplash example 2002-11-15 12:07 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Plugins/BgImage.dll: /WAIT works again 2002-11-15 12:06 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.txt: Pushing order changed 2002-11-15 12:06 kichik * /NSIS/trunk/Contrib/BgImage/Example.nsi: Better example 2002-11-15 11:59 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Plugins/BgImage.dll: Compiles with the new ExDLL.h and updates the image faster 2002-11-15 11:58 kichik * /NSIS/trunk/Contrib/BgImage/Example.nsi: An example for BgImage.dll 2002-11-15 11:31 kichik * /NSIS/trunk/Contrib/StartMenu/Example.nsi: No need for WinMessages.nsh 2002-11-14 22:02 kichik * /NSIS/trunk/TODO.txt: IO 2002-11-14 21:21 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Easier to read 2002-11-14 20:03 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp: /NOCD instead of /CD 2002-11-14 19:43 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h: Plugin size only counted once now, no more huge "optimizations" when using one plugin a lot of times. 2002-11-14 19:20 kichik * /NSIS/trunk/Contrib/System/System.nsi: Unload on last call 2002-11-14 16:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: updated translation 2002-11-14 14:01 kichik * /NSIS/trunk/Examples/makensis.nsi: Compiles again 2002-11-14 12:20 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc: Use MS Shell Dlg 2002-11-14 12:12 kichik * /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/resource.h, /NSIS/trunk/Source/Script1.rc: No resources in makensis... 2002-11-14 12:09 kichik * /NSIS/trunk/Source/exehead/resource.rc: Use MS Shell Dlg 2002-11-14 11:57 kichik * /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp: Resource Files folder cleaned 2002-11-13 19:53 kichik * /NSIS/trunk/TODO.txt: MORE! MORE!!! 2002-11-13 19:47 kichik * /NSIS/trunk/TODO.txt: More... 2002-11-13 19:47 kichik * /NSIS/trunk/Contrib/System/System.nsi: Compiles again 2002-11-13 02:31 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Disable update menu item during an update 2002-11-12 22:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: fix 2002-11-12 21:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: updated translation 2002-11-12 19:20 kichik * /NSIS/trunk/Source/exehead/Ui.c: First page a skipped custom page with now works again and doesn't enter a infinite loop. 2002-11-12 18:33 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.rc, /NSIS/trunk/Plugins/StartMenu.dll: Tab order 2002-11-12 18:19 kichik * /NSIS/trunk/Source/exehead/exec.c: No more Reboot crash when recompiling under VC7 2002-11-12 17:59 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: Graying out when checkbox is checked 2002-11-12 16:18 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: updated translation 2002-11-11 21:14 joostverburg * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: Dialog Item 1200 instead of 12000 2002-11-11 20:49 kichik * /NSIS/trunk/Source/exehead/Ui.c: No more locking 2002-11-11 20:30 kichik * /NSIS/trunk/Source/exehead/Ui.c: First page a custom page now works 2002-11-11 20:24 kichik * /NSIS/trunk/Source/exehead/Ui.c: Unlock right after pre func 2002-11-11 19:19 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp: Some bytes off, zlib is still 34.5 =/ 2002-11-11 18:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: few HTML errors fixed 2002-11-11 18:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: WINDOWTITLE removed 2002-11-11 18:39 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: better translation 2002-11-11 18:37 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html: updated documentation 2002-11-11 18:28 kichik * /NSIS/trunk/Docs/src/history.but: IO flickering 2002-11-11 18:02 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: page sytem, io updates 2002-11-11 17:51 kichik * /NSIS/trunk/Source/script.cpp: Display the right number of expected parameters 2002-11-11 17:37 kichik * /NSIS/trunk/Source/script.cpp: Page ignores "" as a function 2002-11-11 17:30 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Auto define of last page 2002-11-11 17:18 kichik * /NSIS/trunk/Docs/src/credits.but: H not h 2002-11-11 17:17 kichik * /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/resource.h, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.rc, /NSIS/trunk/Plugins/StartMenu.dll: Added /checknoshortcuts 2002-11-11 17:10 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf: Even better 2002-11-11 16:45 kichik * /NSIS/trunk/Source/exehead/Ui.c: Now always unlocks the dialog 2002-11-11 16:06 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/exehead/Ui.c: No more flickering 2002-11-11 15:20 kichik * /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/test.nsi: Caption for custom pages 2002-11-11 15:14 kichik * /NSIS/trunk/Docs/src/pages.but: Caption 2002-11-11 15:12 kichik * /NSIS/trunk/Contrib/StartMenu/Example.nsi: No need for SendMessage, Page custom now does it 2002-11-11 15:11 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Caption parameter for custom pages 2002-11-11 14:34 kichik * /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: More space for q's 2002-11-11 13:37 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: updated translation 2002-11-10 21:43 eccles * /NSIS/trunk/Docs/src/build.bat: Oops, that shouldn't have been left in... 2002-11-10 21:41 eccles * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/credits.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/usefulfunc.but: Spelling mistakes/typos 2002-11-10 18:13 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Back button no longer enabled by default 2002-11-10 17:57 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: updated translation 2002-11-10 16:32 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: InitPluginsDir 2002-11-10 14:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: language file updates 2002-11-09 21:07 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: Start Menu selection 2002-11-09 20:25 kichik * /NSIS/trunk/TODO.txt: Examples 2002-11-09 20:19 kichik * /NSIS/trunk/Source/build.cpp: Back button disabled for pages after instfiles 2002-11-09 19:34 kichik * /NSIS/trunk/Docs/src/credits.but: Icons 2002-11-09 19:29 kichik * /NSIS/trunk/Docs/src/credits.but: Credits 2002-11-09 18:57 kichik * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: Uninstall shortcut too 2002-11-09 18:52 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf: Feature request 635981 2002-11-09 18:39 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: deletes the reg value 2002-11-09 17:58 joostverburg * /NSIS/trunk/Examples/Modern UI/StartMenu.nsi: new example: start menu folder selection 2002-11-09 17:58 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: initplugins, start menu folder selection, new paging system, fixes 2002-11-09 17:06 kichik * /NSIS/trunk/TODO.txt: More stuff to do 2002-11-09 15:18 kichik * /NSIS/trunk/Docs/src/history.but: ShowWin gone 2002-11-09 15:17 kichik * /NSIS/trunk/Docs/src/intro.but: Features updated 2002-11-09 13:53 kichik * /NSIS/trunk/Source/tokens.cpp: InitPlugin*S*Dir 2002-11-09 13:51 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Made it so only one resource editor will be created instead of every time a resource editor is needed, and added InitPluginDir 2002-11-09 13:08 kichik * /NSIS/trunk/Source/build.cpp: Pretty summary 2002-11-09 13:00 kichik * /NSIS/trunk/Examples/makensis.nsi: Compiles again 2002-11-09 12:50 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.dsp, /NSIS/trunk/Contrib/BgImage/exdll.h, /NSIS/trunk/Contrib/ExDLL/exdll.h, /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Contrib/StartMenu/exdll.h, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsp, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/StartMenu.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c: Even easier paging system, no more Abort and Quit from custom pages creator functions, NSIS does it all! 2002-11-08 23:43 kichik * /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Plugins/StartMenu.dll: now with /cancelconfirm 2002-11-08 23:25 kichik * /NSIS/trunk/Contrib/StartMenu/Example.nsi: Better back support 2002-11-08 22:05 kichik * /NSIS/trunk/TODO.txt: Lang docs done 2002-11-08 21:14 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new modern ui 2002-11-08 21:08 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Modern UI 1.5 2002-11-08 21:06 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: better translation 2002-11-08 21:05 kichik * /NSIS/trunk/Examples/makensis.nsi: Plugins added, plugins removed, descriptions changed 2002-11-08 20:42 kichik * /NSIS/trunk/Contrib/BgImage/BgImage.dsp: Output to ../../plugins 2002-11-08 20:41 kichik * /NSIS/trunk/Contrib/BgImage, /NSIS/trunk/Contrib/BgImage/BgImage.cpp, /NSIS/trunk/Contrib/BgImage/BgImage.dsp, /NSIS/trunk/Contrib/BgImage/BgImage.dsw, /NSIS/trunk/Contrib/BgImage/BgImage.txt, /NSIS/trunk/Contrib/BgImage/exdll.h, /NSIS/trunk/Plugins/BgImage.dll: Persistent background image plugin 2002-11-08 20:21 kichik * /NSIS/trunk/Contrib/ShowWin, /NSIS/trunk/Plugins/ShowWin.dll: System.dll does all that ShowWin.dll does and more 2002-11-08 19:29 kichik * /NSIS/trunk/Docs/src/history.but: Plugins added 2002-11-08 19:24 kichik * /NSIS/trunk/Docs/src/langs.but: NSIS multiple languages capabilities documentation 2002-11-08 18:32 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Resize according to NSIS dialog 2002-11-08 18:05 kichik * /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: dl not dll 2002-11-08 17:30 kichik * /NSIS/trunk/Contrib/StartMenu, /NSIS/trunk/Contrib/StartMenu/Example.nsi, /NSIS/trunk/Contrib/StartMenu/exdll.h, /NSIS/trunk/Contrib/StartMenu/Readme.txt, /NSIS/trunk/Contrib/StartMenu/resource.h, /NSIS/trunk/Contrib/StartMenu/StartMenu.c, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsp, /NSIS/trunk/Contrib/StartMenu/StartMenu.dsw, /NSIS/trunk/Contrib/StartMenu/StartMenu.rc, /NSIS/trunk/Plugins/StartMenu.dll: StartMenu.dll, lets the user select the start menu folder 2002-11-08 17:16 kichik * /NSIS/trunk/Contrib/Splash/splash.txt: DLL not EXE 2002-11-08 16:58 kichik * /NSIS/trunk/Source/script.cpp: Warning about misused /NOUNLOAD 2002-11-08 16:51 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Doesn't crash if initDialog is called without /NOUNLOAD. 2002-11-08 11:15 kichik * /NSIS/trunk/Source/exehead/exec.c: Oops... WriteIniStr now writes again 2002-11-08 11:06 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Forgotten D re-added 2002-11-07 23:40 kichik * /NSIS/trunk/Docs/src/compilerflags.but: Some more bold defaults 2002-11-07 21:54 kichik * /NSIS/trunk/Contrib/nsExec/test.nsi: Reading output to a variable example 2002-11-07 20:12 kichik * /NSIS/trunk/Source/exehead/exec.c: WriteIniStr flushing enabled 2002-11-07 15:50 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: Install and next button texts should always be added when needed now. 2002-11-07 15:18 kichik * /NSIS/trunk/Source/build.cpp: Shows the license button even when no page are between the license page and the install log page. 2002-11-06 22:31 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: upgradedll: new command on two lines 2002-11-06 21:20 rainwater * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/ui.but, /NSIS/trunk/Docs/src/uninstall.but: Updated docs 2002-11-06 21:12 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: upgradedll: better dll registration on reboot 2002-11-06 16:22 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi: Better example 2002-11-06 12:13 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh: fixed Uninstaller caption (other language files will be fixed later) 2002-11-06 12:12 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new Modern UI 2002-11-05 21:42 kichik * /NSIS/trunk/Source/exehead/Ui.c: Bug #623117 fixed 2002-11-05 20:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: MUI_UNINSTALLER 2002-11-05 19:36 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: moved !ifdef 2002-11-05 18:47 kichik * /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: Hope this one won't be corrupted 2002-11-05 18:41 kichik * /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: Corrupted 2002-11-05 18:37 kichik * /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: Lets hope it is not corrupted this time 2002-11-05 17:24 kichik * /NSIS/trunk/Source/script.cpp: Can't use !macro inside !macro 2002-11-05 16:31 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: No need for uninstaller macros if we have no uninstaller 2002-11-05 16:23 kichik * /NSIS/trunk/Contrib/Icons/checks4.bmp, /NSIS/trunk/Contrib/Icons/checks4-aa.bmp, /NSIS/trunk/Contrib/Icons/checks-sdbarker.bmp, /NSIS/trunk/Contrib/Icons/checks-sdbarker-aa.bmp: Gotta give the man some credit :) 2002-11-05 16:18 kichik * /NSIS/trunk/Docs/src/callback.but: Typos 2002-11-05 16:18 kichik * /NSIS/trunk/Docs/src/pages.but: Same page, many times 2002-11-05 16:14 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h: WORD->LANGID 2002-11-05 16:11 kichik * /NSIS/trunk/Contrib/UIs/sdbarker_tiny.exe: *** empty log message *** 2002-11-04 19:19 kichik * /NSIS/trunk/Source/script.cpp: Using ChangeUI twice, where the first UI has a branding image and the second doesn't, still made SetBrandingImage think there is really a branding image. Fixed. 2002-11-04 16:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: language macro 2002-11-04 16:35 kichik * /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Source/tokens.cpp: Page, UninstPage usage line improvement 2002-11-04 16:28 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: Dates fixed 2002-11-04 16:27 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: Updated docs 2002-11-04 15:44 kichik * /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi, /NSIS/trunk/Plugins/UserInfo.dll: GetAccountType instead of GetGroup 2002-11-04 15:40 kichik * /NSIS/trunk/Contrib/UserInfo, /NSIS/trunk/Contrib/UserInfo/UserInfo.c, /NSIS/trunk/Contrib/UserInfo/UserInfo.dsp, /NSIS/trunk/Contrib/UserInfo/UserInfo.dsw, /NSIS/trunk/Contrib/UserInfo/UserInfo.nsi, /NSIS/trunk/Plugins/UserInfo.dll: UserInfo DLL to get user group and name 2002-11-04 14:13 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: right position for .onInit 2002-11-04 13:35 rainwater * /NSIS/trunk/Docs/src/sections.but: section typo (bug #633265) 2002-11-04 12:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: update 2002-11-04 12:16 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: width fixed 2002-11-04 11:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: more info 2002-11-04 11:25 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: comment 2002-11-04 11:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: macro system updates 2002-11-03 23:24 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: more info 2002-11-03 18:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: 'Browse for Folder' text fixed 2002-11-03 16:55 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt: date 2002-11-03 16:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: update 2002-11-03 13:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: fixes 2002-11-03 13:23 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new modern ui 2002-11-03 13:21 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: macro system updates 2002-11-03 12:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: macro system updates 2002-11-03 00:01 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: macro system updates 2002-11-02 23:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: abortwarning in basic macro 2002-11-02 23:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: macro system updates 2002-11-02 18:57 kichik * /NSIS/trunk/Docs/src/history.but: Fixed version history of v2.0a2 2002-11-02 15:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: no currentpage var anymore 2002-11-02 15:14 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: r 2002-11-02 15:06 kichik * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: Combo box now shows on Windows 9x 2002-11-02 13:45 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: better translation 2002-11-02 13:41 joostverburg * /NSIS/trunk/Examples/makensis.nsi: System plugin directory 2002-11-02 13:34 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: no currentpage var anymore 2002-11-02 12:37 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: Polski 2002-11-02 12:28 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.nsi: fixes, comments, ReserveFile 2002-11-02 11:01 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: !macro MUI_INTERFACE_ALLRES 2002-11-02 10:54 kichik * /NSIS/trunk/Contrib/Modern UI/System.nsh: Some !ifdefs 2002-11-02 02:14 rainwater * /NSIS/trunk/Docs/src/bin/halibut/makefile: let's not remove the old exe 2002-11-02 01:51 rainwater * /NSIS/trunk/Docs/src/attributes.but: added checkbitmap parameter 2002-11-02 01:46 rainwater * /NSIS/trunk/Docs/style.css: updated style. probably ugly as hell. 2002-11-01 23:01 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/style.css: last update 2002-11-01 22:55 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: updateeeeeeeeeeeeee 2002-11-01 22:52 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: another update 2002-11-01 22:48 rainwater * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: Updated docs again 2002-11-01 22:37 kichik * /NSIS/trunk/Source/script.cpp: GetDLLVersionLocal now always first looks in the current directory 2002-11-01 22:29 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe: updated 2002-11-01 22:28 rainwater * /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c: Different linkage on the index page 2002-11-01 22:04 rainwater * /NSIS/trunk/Docs/src/build.bat: no need to delete help files and text files anymore 2002-11-01 21:56 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe: updated 2002-11-01 21:56 rainwater * /NSIS/trunk/Docs/src/bin/halibut/makefile, /NSIS/trunk/Docs/src/bin/halibut/winhelp.c, /NSIS/trunk/Docs/src/bin/halibut/winhelp.h: Remove winhelp module 2002-11-01 21:52 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/bin/halibut/biblio.c, /NSIS/trunk/Docs/src/bin/halibut/bk_text.c, /NSIS/trunk/Docs/src/bin/halibut/bk_whlp.c, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/contents.c, /NSIS/trunk/Docs/src/bin/halibut/error.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/help.c, /NSIS/trunk/Docs/src/bin/halibut/index.c, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/keywords.c, /NSIS/trunk/Docs/src/bin/halibut/LICENCE, /NSIS/trunk/Docs/src/bin/halibut/licence.c, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/bin/halibut/makefile, /NSIS/trunk/Docs/src/bin/halibut/malloc.c, /NSIS/trunk/Docs/src/bin/halibut/misc.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.h, /NSIS/trunk/Docs/src/bin/halibut/ustring.c, /NSIS/trunk/Docs/src/bin/halibut/winhelp.c, /NSIS/trunk/Docs/src/bin/halibut/winhelp.h: removed text and help file backends; added some usage crap and removed the help command line optin(who needs that) 2002-11-01 21:00 joostverburg * /NSIS/trunk/TODO.txt: bold defaults: done 2002-11-01 20:51 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new Modern UI version 2002-11-01 20:46 joostverburg * /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/test.nsi: new Page system 2002-11-01 20:45 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Japanese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Modern UI 1.4 2002-11-01 20:42 joostverburg * /NSIS/trunk/Contrib/Language files/Japanese.nlf: By Dnanako 2002-11-01 20:34 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/pages.but, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: New paging system. All scripts must be updated, but it sure is worth it. InstallOptions has two new functions initDialog and show. Docs massively updated. 2002-11-01 18:39 rainwater * /NSIS/trunk/Docs/src/attributes.but: typo 2002-11-01 18:22 kichik * /NSIS/trunk/Docs/src/bin/halibut, /NSIS/trunk/Docs/src/bin/halibut/biblio.c, /NSIS/trunk/Docs/src/bin/halibut/bk_text.c, /NSIS/trunk/Docs/src/bin/halibut/bk_whlp.c, /NSIS/trunk/Docs/src/bin/halibut/bk_xhtml.c, /NSIS/trunk/Docs/src/bin/halibut/contents.c, /NSIS/trunk/Docs/src/bin/halibut/error.c, /NSIS/trunk/Docs/src/bin/halibut/halibut.h, /NSIS/trunk/Docs/src/bin/halibut/help.c, /NSIS/trunk/Docs/src/bin/halibut/index.c, /NSIS/trunk/Docs/src/bin/halibut/input.c, /NSIS/trunk/Docs/src/bin/halibut/keywords.c, /NSIS/trunk/Docs/src/bin/halibut/LICENCE, /NSIS/trunk/Docs/src/bin/halibut/licence.c, /NSIS/trunk/Docs/src/bin/halibut/main.c, /NSIS/trunk/Docs/src/bin/halibut/makefile, /NSIS/trunk/Docs/src/bin/halibut/malloc.c, /NSIS/trunk/Docs/src/bin/halibut/misc.c, /NSIS/trunk/Docs/src/bin/halibut/style.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.c, /NSIS/trunk/Docs/src/bin/halibut/tree234.h, /NSIS/trunk/Docs/src/bin/halibut/ustring.c, /NSIS/trunk/Docs/src/bin/halibut/version.c, /NSIS/trunk/Docs/src/bin/halibut/winhelp.c, /NSIS/trunk/Docs/src/bin/halibut/winhelp.h: Hacked up halibut source code 2002-11-01 16:57 joostverburg * /NSIS/trunk/Docs/src/attributes.but: updates 2002-11-01 16:55 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2002-11-01 16:51 joostverburg * /NSIS/trunk/Docs/src/intro.but: listitems fixed 2002-11-01 16:51 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe: HTML now really works in \c 2002-11-01 16:51 joostverburg * /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/modernui.but: fixes 2002-11-01 16:36 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe: doesn't crash 2002-11-01 16:33 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe: \\ works again 2002-11-01 16:30 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe: HTML in \c 2002-11-01 16:02 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: UpgradeDLL fixes 2002-11-01 15:59 kichik * /NSIS/trunk/Docs/src/config.but: More depth 2002-11-01 15:58 kichik * /NSIS/trunk/Docs/src/intro.but: Same as teh html 2002-11-01 15:40 kichik * /NSIS/trunk/Docs/src/bin/halibut.exe: \\ for esacping &, ", < and > 2002-11-01 13:54 joostverburg * /NSIS/trunk/Examples/functions.htm: removed (in the docs now) 2002-11-01 13:10 kichik * /NSIS/trunk/Docs/src/history.but: Escaped 2002-11-01 13:09 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe: New modified halibut by kichik 2002-11-01 11:22 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Plugins/nsisdl.dll: Fixed a bug with HTTP proxy detection - Joost can finally use NSIS-dl :D 2002-11-01 09:59 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: fixes 2002-11-01 09:50 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: fixes for filenames with spaces 2002-11-01 09:39 joostverburg * /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsi: directory fixes 2002-10-31 17:21 kichik * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/TODO.txt: History completed! FINALLY!!! :D 2002-10-31 15:55 kichik * /NSIS/trunk/Contrib/System/Buffers.c, /NSIS/trunk/Contrib/System/Buffers.h, /NSIS/trunk/Contrib/System/Plugin.c, /NSIS/trunk/Contrib/System/Plugin.h, /NSIS/trunk/Contrib/System/Source, /NSIS/trunk/Contrib/System/Source/Buffers.c, /NSIS/trunk/Contrib/System/Source/Buffers.h, /NSIS/trunk/Contrib/System/Source/Plugin.c, /NSIS/trunk/Contrib/System/Source/Plugin.h, /NSIS/trunk/Contrib/System/Source/stdafx.c, /NSIS/trunk/Contrib/System/Source/stdafx.h, /NSIS/trunk/Contrib/System/Source/System.c, /NSIS/trunk/Contrib/System/Source/System.h, /NSIS/trunk/Contrib/System/Source/System.sln, /NSIS/trunk/Contrib/System/Source/System.vcproj, /NSIS/trunk/Contrib/System/Source/vc7ldvrm.obj, /NSIS/trunk/Contrib/System/Source/vc7lmul.obj, /NSIS/trunk/Contrib/System/Source/vc7lshl.obj, /NSIS/trunk/Contrib/System/Source/vc7lshr.obj, /NSIS/trunk/Contrib/System/stdafx.c, /NSIS/trunk/Contrib/System/stdafx.h, /NSIS/trunk/Contrib/System/System.c, /NSIS/trunk/Contrib/System/System.h, /NSIS/trunk/Contrib/System/System.sln, /NSIS/trunk/Contrib/System/System.vcproj, /NSIS/trunk/Contrib/System/vc7ldvrm.obj, /NSIS/trunk/Contrib/System/vc7lmul.obj, /NSIS/trunk/Contrib/System/vc7lshl.obj, /NSIS/trunk/Contrib/System/vc7lshr.obj: Source files to Source directory 2002-10-31 14:43 joostverburg * /NSIS/trunk/Contrib/System/Resource.dll, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.nsi, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Contrib/System/WhatsNew.txt: version 2 final 2002-10-31 14:41 joostverburg * /NSIS/trunk/Contrib/System/Buffers.c, /NSIS/trunk/Contrib/System/Buffers.h, /NSIS/trunk/Contrib/System/Example.nsi, /NSIS/trunk/Contrib/System/New System.txt, /NSIS/trunk/Contrib/System/Plugin.c, /NSIS/trunk/Contrib/System/Plugin.h, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.c, /NSIS/trunk/Contrib/System/System.h, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.vcproj, /NSIS/trunk/Plugins/System.dll: version 2 final 2002-10-31 14:12 kichik * /NSIS/trunk/Docs/src/basic.but: Err... Bullet not number =/ 2002-10-31 14:11 kichik * /NSIS/trunk/Docs/src/basic.but: /a goes in both 2002-10-31 14:00 kichik * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.bat: ReserveFile and /nonfatal added. License is the last appendix again. 2002-10-30 18:17 kichik * /NSIS/trunk/Docs/src/usefulfunc.but: Some more useful functions 2002-10-30 16:24 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf: ... 2002-10-30 15:21 joostverburg * /NSIS/trunk/Docs/src/usefulfunc.but: spelling mistake 2002-10-30 15:19 joostverburg * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/usefulfunc.but: functions 2002-10-29 19:51 joostverburg * /NSIS/trunk/Docs/src/basic.but: better RMDir documentation 2002-10-29 18:55 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf: fixes 2002-10-28 20:41 kichik * /NSIS/trunk/TODO.txt: History 2002-10-28 18:24 joostverburg * /NSIS/trunk/TODO.txt: things to do 2002-10-28 17:01 joostverburg * /NSIS/trunk/Docs/src/attributes.but: CheckBitmap 2002-10-28 16:40 joostverburg * /NSIS/trunk/Docs/src/script.but: plugins 2002-10-28 16:32 joostverburg * /NSIS/trunk/Docs/src/usage.but: better info about using MakeNSIS in explorer 2002-10-27 22:05 joostverburg * /NSIS/trunk/Docs/src/flowcontrol.but: info about inner dialog 2002-10-27 21:27 kichik * /NSIS/trunk/Examples/makensis.nsi: ZIP2EXE description updated 2002-10-27 21:20 kichik * /NSIS/trunk/Examples/makensis.nsi: Fixed nsExec description 2002-10-27 20:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: fixes 2002-10-27 20:52 joostverburg * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/modernui.but: Modern UI appendix 2002-10-27 20:48 kichik * /NSIS/trunk/Docs/src/attributes.but: Made it clear that OutFile can use a fully qualified path and not just an EXE name 2002-10-27 19:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Changelog.txt: complete changelog 2002-10-27 19:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: fixes, full changelog in Changelog.txt 2002-10-27 19:15 joostverburg * /NSIS/trunk/Docs/src/attributes.but: fixed ChangeUI info 2002-10-27 17:48 kichik * /NSIS/trunk/Docs/src/attributes.but: Added information about RTF and fixed a glitch in UninstallText section 2002-10-27 17:17 joostverburg * /NSIS/trunk/Examples/makensis.nsi: cleanup 2002-10-27 17:10 joostverburg * /NSIS/trunk/Examples/makensis.nsi: compatible with new Modern UI 2002-10-27 16:57 joostverburg * /NSIS/trunk/Docs/src/compilerflags.but: bzip2 is not larger anymore 2002-10-27 11:56 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: !verbose 3 for cleaner logs 2002-10-27 11:28 joostverburg * /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Language files/Hungarian.nlf, /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Language files/Portuguese.nlf, /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/Swedish.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Language files/Ukrainian.nlf: cleaned up format, added spaces 2002-10-26 22:12 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: updated changelog 2002-10-26 22:09 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini: new Install Options read/write ini macro's 2002-10-26 21:51 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: !verbose stuff in System.nsh 2002-10-26 21:50 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: some fixes 2002-10-26 19:50 kichik * /NSIS/trunk/Docs/src/license.but: Better looking license 2002-10-26 19:23 kichik * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Docs/src/usection.but, /NSIS/trunk/Docs/src/var.but: Features list updated, some links added and command parameters are now shown alone with a light background behind them. 2002-10-26 17:49 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added Italian 2002-10-26 17:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: macro system updates 2002-10-26 17:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: more info 2002-10-26 17:06 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: bugs corrected 2002-10-26 16:11 kichik * /NSIS/trunk/Source/script.cpp: BrandingText /TRIM* "" will now use the default string too 2002-10-26 13:08 joostverburg * /NSIS/trunk/Contrib/Language files/Ukrainian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Ukrainian.nsh: By Yuri Holubow 2002-10-26 13:06 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added Ukrainian 2002-10-26 12:30 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: some fixes by sanface 2002-10-26 12:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: macro system updates 2002-10-26 12:20 kichik * /NSIS/trunk/Docs/src/license.but: Spelling mistake 2002-10-25 18:10 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: Fixed by Scam 2002-10-25 17:45 kichik * /NSIS/trunk/Contrib/System/Example.nsi, /NSIS/trunk/Contrib/System/Example.txt: txt->nsi 2002-10-24 21:32 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: removed arabic (combination of rtl and non-rtl not possible) 2002-10-24 21:02 kichik * /NSIS/trunk/Source/lang.cpp: English is no longer always created 2002-10-24 11:56 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf: fixed accelerator key 2002-10-23 18:00 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new system plugin 2002-10-23 17:53 joostverburg * /NSIS/trunk/Contrib/System/Buffers.c, /NSIS/trunk/Contrib/System/Buffers.h, /NSIS/trunk/Contrib/System/Example.txt, /NSIS/trunk/Contrib/System/New System.txt, /NSIS/trunk/Contrib/System/Plugin.c, /NSIS/trunk/Contrib/System/Plugin.h, /NSIS/trunk/Contrib/System/SysFunc.nsh, /NSIS/trunk/Contrib/System/System.c, /NSIS/trunk/Contrib/System/System.h, /NSIS/trunk/Contrib/System/System.ncb, /NSIS/trunk/Contrib/System/System.nsh, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Contrib/System/System.vcproj, /NSIS/trunk/Contrib/System/vc7ldvrm.obj, /NSIS/trunk/Contrib/System/vc7lmul.obj, /NSIS/trunk/Contrib/System/vc7lshl.obj, /NSIS/trunk/Contrib/System/vc7lshr.obj, /NSIS/trunk/Contrib/System/WhatsNew.txt, /NSIS/trunk/Plugins/System.dll: new system plugin 2002-10-23 17:38 joostverburg * /NSIS/trunk/Contrib/Language files/PortugueseBR.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/PortugueseBR.nsh: By Layout do Brasil 2002-10-23 17:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: updated LANGNAME 2002-10-23 17:32 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: some new languages 2002-10-23 15:42 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: accelerator keys 2002-10-23 15:39 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Italian.nsh: By sanface 2002-10-23 15:37 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh: By Makidis N. Mike 2002-10-23 15:35 joostverburg * /NSIS/trunk/Contrib/Language files/Arabic.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Arabic.nsh: By asdfuae 2002-10-23 15:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Russian.nsh: By Nik Medved 2002-10-20 17:27 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: File /nonfatal option added 2002-10-19 12:02 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/Ui.c: Hidden sections can now have SectionIn too. Old behaviour retained (hidden sections without SectionIn are in all install types). 2002-10-19 11:42 kichik * /NSIS/trunk/Source/script.cpp: Plugin calls no longer adds size to the section containing them. They are temporary files and shouldn't add size. 2002-10-18 21:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Readme.html: updated changelog 2002-10-17 21:53 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new system 2002-10-17 21:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: forgot to remove some old stuff 2002-10-17 21:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi: easier to use for basic scripts 2002-10-17 19:58 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp: !ifdef/!ifndef can now be used in macros too 2002-10-17 17:45 kichik * /NSIS/trunk/Source/script.cpp: XPStyle off now reomves the XP manifest instead of assuming it wasn't added before and doing nothing 2002-10-17 16:37 kichik * /NSIS/trunk/Examples/makensis.nsi: Indenting 2002-10-17 16:22 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: dns changes 2002-10-17 01:42 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: memory sucks 2002-10-17 01:40 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Different user message if update check failed. 2002-10-17 01:26 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: Update check now uses its own thread. The messagebox is now modal. Also checks for alphas/betas. Adds new version string to messagebox. 2002-10-16 18:21 joostverburg * /NSIS/trunk/Examples/makensis.nsi: compatible with new modern ui 2002-10-16 17:42 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Update check uses IE's proxy settings 2002-10-16 17:31 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Now clear log window really clears the log window 2002-10-16 17:21 rainwater * /NSIS/trunk/Contrib/Makensisw/jnetlib, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/asyncdns.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/connection.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/httpget.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/netinc.h, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.cpp, /NSIS/trunk/Contrib/Makensisw/jnetlib/util.h, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: New makensisw update system 2002-10-16 16:57 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: Now sets the error flag if DllRegisterServer fails (Bugs item #624176) 2002-10-16 16:51 kichik * /NSIS/trunk/Source/exehead/exec.c: Now sets the error flag if DllRegisterServer fails (Bugs item #624176) 2002-10-16 13:20 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: better translation 2002-10-15 20:55 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: accelerator keys 2002-10-15 20:09 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: accelerator keys 2002-10-15 19:37 joostverburg * /NSIS/trunk/Contrib/Language files/English.nlf: typo 2002-10-15 19:05 joostverburg * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: accelerator keys 2002-10-15 19:02 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: uses more LANGNAME's 2002-10-15 18:54 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh: added LANGNAME 2002-10-15 18:44 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Source/lang.cpp: accelerator keys 2002-10-15 18:43 joostverburg * /NSIS/trunk/Docs/src/history.but: changelog updates 2002-10-15 18:37 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: accelerator keys 2002-10-15 18:28 joostverburg * /NSIS/trunk/Contrib/Language files/English.nlf: fixed browse accelerator key 2002-10-15 18:04 kichik * /NSIS/trunk/Docs/src/attributes.but: Some fixes 2002-10-15 17:52 rainwater * /NSIS/trunk/Docs/src/attributes.but: /LANG goes first in LicenseText 2002-10-15 17:49 joostverburg * /NSIS/trunk/Contrib/Language files/English.nlf: some more hotkeys 2002-10-15 17:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: FONT parameter for MUI_INTERFACE_ABSOLUTEPATH macro 2002-10-15 17:45 joostverburg * /NSIS/trunk/Contrib/Language files/English.nlf: hotkeys 2002-10-15 14:48 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: better translation 2002-10-14 19:07 kichik * /NSIS/trunk/Contrib/Language files/Hebrew.nlf: Hebrew NLF. RTL isn't perfect yet, so it's not really usable :) 2002-10-14 15:52 joostverburg * /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc: larger buttons 2002-10-14 15:44 joostverburg * /NSIS/trunk/Contrib/UIs/default.exe: larger 'browse' and 'show details' buttons 2002-10-14 13:37 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: 'show details' button a bit larger 2002-10-14 12:47 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: better translation 2002-10-13 20:40 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh: new format 2002-10-13 20:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh: new format 2002-10-13 19:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh: new format 2002-10-13 19:17 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh: new format 2002-10-13 18:48 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh: new format 2002-10-13 18:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: ABORTWARNING uses a define too 2002-10-13 18:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: better usage of defines, no more wasted space for unused LangStrings 2002-10-13 18:18 kichik * /NSIS/trunk/Contrib/Modern UI/Language files/System.nsh: Shouldn't be here 2002-10-12 19:26 kichik * /NSIS/trunk/Examples/makensis.nsi: Language files now go to the right directory 2002-10-12 18:53 joostverburg * /NSIS/trunk/Docs/src/history.but: updated changelog 2002-10-12 18:46 joostverburg * /NSIS/trunk/Contrib/Makensisw/resource.rc: new modern ui icon name 2002-10-12 18:37 joostverburg * /NSIS/trunk/Contrib/Icons/adni18-installer-C-no48xp.ico, /NSIS/trunk/Contrib/Icons/adni18-uninstall-C-no48xp.ico: new name for modern ui icons 2002-10-12 18:34 joostverburg * /NSIS/trunk/Contrib/Icons/modern-install.ico, /NSIS/trunk/Contrib/Icons/modern-uninstall.ico: shorter name for modern icons 2002-10-12 18:33 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new icon name, font in MUI_INTERFACE macro 2002-10-12 18:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/System.nsh: font can be set using MUI_INTERFACE macro 2002-10-12 18:30 joostverburg * /NSIS/trunk/Examples/makensis.nsi: ui updates 2002-10-12 17:08 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h: 32 bytes down 2002-10-12 16:16 kichik * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: License.txt path changed 2002-10-12 16:02 joostverburg * /NSIS/trunk/Examples/makensis.nsi: new location of Modern UI files 2002-10-12 15:57 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: new location of language files 2002-10-12 15:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/License.txt, /NSIS/trunk/Contrib/Modern UI/Readme.html, /NSIS/trunk/Contrib/Modern UI/Readme.jpg, /NSIS/trunk/Contrib/Modern UI/Screenshot.png, /NSIS/trunk/Examples/Modern UI/License.txt, /NSIS/trunk/Examples/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/Readme.jpg, /NSIS/trunk/Examples/Modern UI/Screenshot.png: moved Modern UI docs to Contrib\Modern UI 2002-10-12 15:36 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: new location of language files 2002-10-12 15:33 joostverburg * /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/French.nsh, /NSIS/trunk/Contrib/Modern UI/German.nsh, /NSIS/trunk/Contrib/Modern UI/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files, /NSIS/trunk/Contrib/Modern UI/Language files/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/English.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/French.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/German.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/System.nsh, /NSIS/trunk/Contrib/Modern UI/Language files/TradChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Polish.nsh, /NSIS/trunk/Contrib/Modern UI/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/Spanish.nsh, /NSIS/trunk/Contrib/Modern UI/TradChinese.nsh: Modern UI Language Files moved to Contrib\Modern UI\Language files 2002-10-12 15:20 joostverburg * /NSIS/trunk/Examples/Modern UI/Screenshot.png: white bg 2002-10-12 15:14 joostverburg * /NSIS/trunk/Examples/Modern UI/Screenshot.png: nicer screenshot 2002-10-11 18:31 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: LANGNAME for Greek 2002-10-11 18:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/Greek.nsh: added LANGNAME 2002-10-11 17:47 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: uses LANGNAME's (some language files have not been updated yet) 2002-10-11 17:41 joostverburg * /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/French.nsh, /NSIS/trunk/Contrib/Modern UI/German.nsh, /NSIS/trunk/Contrib/Modern UI/Spanish.nsh: added LANGNAME 2002-10-11 13:43 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.rc: typo 2002-10-11 13:38 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added a Check for Update command 2002-10-11 13:20 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added polish, languages shown in orginal language 2002-10-11 13:17 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf: added spaces 2002-10-11 13:12 joostverburg * /NSIS/trunk/Contrib/Language files/Polish.nlf, /NSIS/trunk/Contrib/Modern UI/Polish.nsh: By Piotr Murawski & Rafa³ Lampe 2002-10-11 12:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/Spanish.nsh: By MoNKi 2002-10-11 11:39 kichik * /NSIS/trunk/Contrib/LangDLL/resource.rc, /NSIS/trunk/Plugins/LangDLL.dll: Made room for 3 lines of text (bug report #621273) 2002-10-10 21:19 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: changed size of 'available space' text box 2002-10-10 21:15 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: InstType text 2002-10-10 20:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/French.nsh, /NSIS/trunk/Contrib/Modern UI/German.nsh, /NSIS/trunk/Contrib/Modern UI/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/SimpChinese.nsh, /NSIS/trunk/Contrib/Modern UI/TradChinese.nsh: ComponentText fixed 2002-10-10 20:26 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: updated langdll calling 2002-10-10 20:17 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added trad/simp chinese 2002-10-10 20:08 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: text area on folder selection dialog bigger 2002-10-10 19:47 joostverburg * /NSIS/trunk/Contrib/Modern UI/SimpChinese.nsh: By Hotice 2002-10-10 19:44 joostverburg * /NSIS/trunk/Contrib/Modern UI/TradChinese.nsh: update 2002-10-10 00:20 rainwater * /NSIS/trunk/Contrib/Makensisw/logo.bmp, /NSIS/trunk/Contrib/Makensisw/Readme.txt: Minor logo.bmp update; Small docs updates 2002-10-09 21:32 joostverburg * /NSIS/trunk/Contrib/Modern UI/Greek.nsh: name back in license page info-text 2002-10-09 20:48 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Forgot to add g_dwLength to NSCRIPTDATA 2002-10-09 20:41 rainwater * /NSIS/trunk/Contrib/Makensisw/logo.bmp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Alternate doc path points to docs on nsis.sf.net not cvs; Use smaller logo.bmp; Removed background color code from about dialog; Stupid typo in about box (thanks joost); Created some structs for globals 2002-10-09 20:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Greek.nsh, /NSIS/trunk/Contrib/Modern UI/TradChinese.nsh: info-text on license page updated 2002-10-09 17:38 rainwater * /NSIS/trunk/Contrib/Makensisw/logo.bmp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added link to developer site 2002-10-09 17:11 rainwater * /NSIS/trunk/Contrib/Makensisw/logo.bmp, /NSIS/trunk/Contrib/Makensisw/logo.psp, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/version.cpp, /NSIS/trunk/Examples/makensis.nsi: Added new About dialog 2002-10-09 15:34 rainwater * /NSIS/trunk/Docs/src/string.but: String Functions is a chapter 2002-10-09 14:30 joostverburg * /NSIS/trunk/Contrib/Modern UI/English.nsh: changed component page subtitle 2002-10-09 14:22 joostverburg * /NSIS/trunk/Contrib/Modern UI/TradChinese.nsh: translation by Yi-Ting Cheng 2002-10-09 14:19 joostverburg * /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/French.nsh, /NSIS/trunk/Contrib/Modern UI/German.nsh: updated license-info texts 2002-10-09 14:19 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: changed 'I Agree' button text again 2002-10-09 14:09 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added Browse Script (Ctrl+B) 2002-10-09 13:21 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Removed "About NSIS" dialog 2002-10-09 12:51 rainwater * /NSIS/trunk/Contrib/Makensisw/utils.cpp: No more GetMenu calls. 2002-10-09 12:43 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Copy menu item is now disabled if no text is selected. Also, the context menu is now using the same instance of the Edit menu not just a copy. 2002-10-09 06:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/German.nsh: no quotes around button names (like other modern ui translations) 2002-10-09 06:25 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: updated 'I Agree' button text 2002-10-09 06:25 joostverburg * /NSIS/trunk/Contrib/Modern UI/German.nsh: translation by L.King 2002-10-08 21:00 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: larger browse button 2002-10-08 20:53 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: added german 2002-10-08 20:52 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: 'I agree' text updated 2002-10-08 20:10 rainwater * /NSIS/trunk/Contrib/Modern UI/German.nsh: Jann Röder's German language file for Modern UI 2002-10-08 20:08 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: fixed uninstaller error, compile error 2002-10-08 20:07 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: fixed uninstaller error 2002-10-08 19:46 joostverburg * /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/French.nsh, /NSIS/trunk/Contrib/Modern UI/Greek.nsh: fixed uninstall button text 2002-10-08 19:45 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: fixed 'uninstall' text 2002-10-08 18:06 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: some newlines 2002-10-08 18:06 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: greek language, language in registry, some newlines 2002-10-08 18:02 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: changed size of space text areas 2002-10-08 17:33 joostverburg * /NSIS/trunk/Contrib/Language files/Slovak.nlf: corrected some spelling & grammar errors 2002-10-08 14:53 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf: looks better with Modern UI 2002-10-08 14:52 joostverburg * /NSIS/trunk/Contrib/Modern UI/Greek.nsh: Greek Language file for Modern UI 2002-10-08 09:44 joostverburg * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: made license page info-text area a bit larger 2002-10-08 09:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/French.nsh, /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: multilanguage system easier to use (using defines) 2002-10-08 08:26 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf: some corrections 2002-10-07 22:01 kichik * /NSIS/trunk/Examples/waplugin.nsi: 2.77 is old news :) 2002-10-07 21:35 joostverburg * /NSIS/trunk/Contrib/Modern UI/French.nsh: credits updated 2002-10-07 21:31 joostverburg * /NSIS/trunk/Contrib/Modern UI/English.nsh: back fixed 2002-10-07 21:29 joostverburg * /NSIS/trunk/Contrib/Modern UI/French.nsh: French translation by Netsabes 2002-10-07 21:28 joostverburg * /NSIS/trunk/Contrib/Modern UI/English.nsh: removed some spaces 2002-10-07 21:16 joostverburg * /NSIS/trunk/Examples/makensis.nsi: updated modern ui 2002-10-07 20:44 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: example.nsi > basic.nsi 2002-10-07 20:27 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: A bit better 2002-10-07 20:08 kichik * /NSIS/trunk/Source/build.cpp: More consistent summary 2002-10-07 20:07 kichik * /NSIS/trunk/Source/lang.cpp: Some more safety measures with LangString 2002-10-07 19:59 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/iniA.ini, /NSIS/trunk/Examples/Modern UI/iniB.ini, /NSIS/trunk/Examples/Modern UI/iniC.ini, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: removed - updated modern ui directory structure 2002-10-07 19:59 joostverburg * /NSIS/trunk/Examples/Modern UI/Basic.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ioA.ini, /NSIS/trunk/Examples/Modern UI/ioB.ini, /NSIS/trunk/Examples/Modern UI/ioC.ini, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: modern ui 1.3 - new multilanguage system 2002-10-07 19:58 joostverburg * /NSIS/trunk/Contrib/Modern UI, /NSIS/trunk/Contrib/Modern UI/Dutch.nsh, /NSIS/trunk/Contrib/Modern UI/English.nsh, /NSIS/trunk/Contrib/Modern UI/System.nsh: version 1.3 - new multilanguage system 2002-10-07 19:54 joostverburg * /NSIS/trunk/Contrib/Language files/Portuguese.nlf: Portuguese language file 2002-10-07 19:49 justin1014 * /NSIS/trunk/Source/makenssi.dsp: removed inf* dependencies 2002-10-07 19:48 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C: *** empty log message *** 2002-10-07 19:44 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C: some more size reduction 2002-10-07 19:24 justin1014 * /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFBLOCK.H, /NSIS/trunk/Source/zlib/INFCODES.C, /NSIS/trunk/Source/zlib/INFCODES.H, /NSIS/trunk/Source/zlib/INFTREES.C, /NSIS/trunk/Source/zlib/INFTREES.H, /NSIS/trunk/Source/zlib/INFUTIL.C, /NSIS/trunk/Source/zlib/INFUTIL.H: kichik's inlining rec, also put all of inflate into one big infblock.c so we can optimize more =) 2002-10-06 19:05 kichik * /NSIS/trunk/Source/exehead/lang.h: Better looking code 2002-10-06 18:33 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: made inttosizestr only display the + on GB shown on win9x. (sorry kichik, kinda undid some of your optimizaton -- I made this one slightly smaller though than the old one) 2002-10-05 16:20 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: 28 bytes down 2002-10-04 22:54 kichik * /NSIS/trunk/Source/build.cpp: Arrg... some more uninitiated variables! Bad bad habit :( 2002-10-04 20:41 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp: Fixed weird LangString behavior and made SectionSetFlags "understand" SF_BOLD 2002-10-04 18:52 kichik * /NSIS/trunk/Examples/languages.nsi: New section flags structure 2002-10-04 18:34 rainwater * /NSIS/trunk/Contrib/nsExec/nsExec.txt: Updated nsExec readme information on the timeout param 2002-10-04 18:12 kichik * /NSIS/trunk/Contrib/nsExec/test.nsi: Timeout was just a test :) 2002-10-04 18:11 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: Timeout now works 2002-10-04 17:46 kichik * /NSIS/trunk/Contrib/nsExec/test.nsi: nsExec test 2002-10-04 16:05 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed a bug that caused the test button to show up even if no output file string was found in the log. 2002-10-04 14:45 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: Compiles without NSIS_CONFIG_ENHANCEDUI_SUPPORT 2002-10-04 10:27 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added an option for unprocessed user multilingual strings (LangStringUP). Use it if you see weird squares before and special character in your LangString. 2002-10-03 22:16 justin1014 * /NSIS/trunk/Source/zlib/deflate.c: optimized zlib compression parameters a bit 2002-10-03 07:27 justin1014 * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h: updated zip2exe to 2.0b0 standards 2002-10-03 07:07 justin1014 * /NSIS/trunk/Source/exehead/config.h: updated smallmode comment 2002-10-03 07:06 justin1014 * /NSIS/trunk/Source/zlib/deflate.c: *** empty log message *** 2002-10-03 06:48 justin1014 * /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c: bzip2 code cleanup 2002-10-03 06:22 justin1014 * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h: more size savings, and fixed bzip2 small mode 2002-10-03 06:11 justin1014 * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/decompress.c: 20 bytes removed from bzip2 and some cleanup =) 2002-10-03 01:54 justin1014 * /NSIS/trunk/Source/zlib/INFCODES.C: some more byte savings 2002-10-03 01:44 rainwater * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Wrong language 2002-10-02 22:47 eccles * /NSIS/trunk/Source/makenssi.dsp: Added a Debug configuration 2002-10-02 22:45 eccles * /NSIS/trunk/Source/script.cpp: !macroend was only being recognised at the beginning of a line 2002-10-02 21:57 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: Added MUI_INTERFACE_ABSOLUTEPATH 2002-10-02 21:31 kichik * /NSIS/trunk/Source/build.cpp: Compiles again, and bold sections work again 2002-10-02 21:06 kichik * /NSIS/trunk/Source/build.cpp: Bugs item #617703 fixed 2002-10-02 19:54 rainwater * /NSIS/trunk/Contrib/AdvSplash, /NSIS/trunk/Contrib/AdvSplash/advsplash.c, /NSIS/trunk/Contrib/AdvSplash/advsplash.dsp, /NSIS/trunk/Contrib/AdvSplash/advsplash.dsw, /NSIS/trunk/Contrib/AdvSplash/advsplash.txt, /NSIS/trunk/Contrib/UberSplash, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Plugins/advsplash.dll: Added AdvSplash plugin and remove UberSplash. NSIS installer updated. 2002-10-02 19:18 kichik * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added SetPluginUnload manual|alwaysoff 2002-10-02 18:22 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C: another bunch of data removed, zlib is now 34.5k 2002-10-02 18:16 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: No more stray chars for Justin :) 2002-10-02 17:54 justin1014 * /NSIS/trunk/Source/zlib/INFTREES.C: 12 bytes saved, bunch to go 2002-10-02 17:51 rainwater * /NSIS/trunk/Examples/one-section.nsi: changed outfile to one-section.exe 2002-10-02 17:24 justin1014 * /NSIS/trunk/Source/exehead/exehead-zlib.dsp: inflateReset and inflateInit are now the same thing, removed inflate.c dependency 2002-10-02 17:23 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/ZLIB.H: inflateReset and inflateInit are now the same thing, 2002-10-02 17:19 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFCODES.C, /NSIS/trunk/Source/zlib/INFCODES.H, /NSIS/trunk/Source/zlib/ZLIB.H: some big size savings (removed zalloc requirement from runtime yay) 2002-10-02 16:59 kichik * /NSIS/trunk/Examples/one-section.nsi: Now with the new flag values 2002-10-02 16:49 kichik * /NSIS/trunk/Contrib/Language files/Greek.nlf: Space added after Delete file: 2002-10-02 16:46 joostverburg * /NSIS/trunk/Contrib/Language files/Greek.nlf: Greek language file 2002-10-02 16:00 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Plugins/nsExec.dll: Now doesn't crash when using Exec and not ExecToLog. ExecToLog timeout is not yet implemented. 2002-10-02 15:01 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: 94 bytes saved. LangString should now work with sub-sections too. 2002-10-02 13:29 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: Details back when using IO 2002-10-02 12:02 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Fixed running from context menu 2002-10-02 11:48 kichik * /NSIS/trunk/Source/exehead/exec.c: FindWindow $0 works again 2002-10-02 10:14 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Default description text: dialog control ID should be 1043 instead of ${LANG_DUTCH} 2002-10-02 04:32 justin1014 * /NSIS/trunk/Source/build.cpp: made some output info slightly prettier 2002-10-02 04:26 justin1014 * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: fixed another makensisw bug (two stray chars after text for me) -- hopefully this didn't break anything 2002-10-02 04:12 justin1014 * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: fixed a bug when running makensisw from the command line 2002-10-02 03:17 rainwater * /NSIS/trunk/nsisconf.nsh: Cleaned up format a little 2002-10-02 00:24 rainwater * /NSIS/trunk/Docs/src/history.but: I can't read. 2002-10-02 00:23 rainwater * /NSIS/trunk/Docs/src/history.but: Updated History 2002-10-01 23:03 rainwater * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/usage.but, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/nsisconf.nsh, /NSIS/trunk/Source/makenssi.cpp: Renamed nsisconf.nsi to nsisconf.nsh since it is really a include file. The NSIS installer will rename the nsisconf.nsi file to nsh if present to prevent upgrade issues. 2002-10-01 22:09 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Plugins/nsExec.dll: Changed default timeout to 15 seconds (from 100 seconds). Returns now if CreateProcess fails. Now closes handles if unable to allocate memory. 2002-10-01 19:35 kichik * /NSIS/trunk/Plugins/nsExec.dll: Now logs properly 2002-10-01 18:59 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: Logging should work well now 2002-10-01 18:42 eccles * /NSIS/trunk/Source/bzip2/bzlib.h: lol, get my name right will ya justin :) 2002-10-01 17:36 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/trees.c: 30 bytes or so gone from zlib, also made stored blocks use 2 bytes less each 2002-10-01 17:16 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp: Unprocessed strings (such as InstType) can now use LangString/$(name) too. No more "skipped" messages before plugins. 2002-10-01 17:06 joostverburg * /NSIS/trunk/Contrib/Language files/Italian.nlf: Italian language file 2002-10-01 17:00 joostverburg * /NSIS/trunk/Contrib/Language files/Hungarian.nlf: Hungarian language file 2002-10-01 16:37 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c: Added return value to nsExex. Logging still broke. 2002-10-01 14:13 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: bzip2 header down to 34KB, 54 bytes away from 34.5KB zlib. Fixed a bug with ReadRegStr and $0. 2002-10-01 13:53 rainwater * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/file.but, /NSIS/trunk/Docs/src/flowcontrol.but, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/generalpurpose.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/makefile, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/sections.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Docs/src/var.but: Updated docs 2002-10-01 09:34 joostverburg * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: CancelConfirmIcon > CancelConfirmFlags in changelog 2002-10-01 06:36 justin1014 * /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/ZLIB.H: 2 bytes removed from zlib hehe long way to go to catch up to bzip2 2002-10-01 06:30 justin1014 * /NSIS/trunk/Source/exehead/fileform.c: made bzip2 mode slightly smaller by making reinit stuff not necessary 2002-10-01 02:27 justin1014 * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/exehead/fileform.c: even smaller bzip2 code 2002-10-01 02:16 justin1014 * /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/makenssi.dsp: removed bzlib_private.h dependency 2002-10-01 02:15 justin1014 * /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c: updated bzip2 for cleanliness, still some good reorganizations yet 2002-10-01 01:57 justin1014 * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/randtable.c, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/fileform.c: made bzip2 smaller than zlib mode !!! 2002-09-30 22:28 eccles * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: CancelConfirmIcon becomes CancelConfirmFlags with extra options 2002-09-30 22:22 eccles * /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: CancelConfirmIcon becomes CancelConfirmFlags with extra options 2002-09-30 21:42 eccles * /NSIS/trunk/Source/exehead/exec.c: CreateShortcut comment memory corruption 2002-09-30 20:52 eccles * /NSIS/trunk/Source/exehead/Ui.c: Minor code savings 2002-09-30 19:31 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/lang.cpp: Folder instead of Directory 2002-09-30 19:01 kichik * /NSIS/trunk/Source/lang.cpp: Removed debug messages 2002-09-30 18:38 kichik * /NSIS/trunk/Source/lang.cpp: Counts sections right again 2002-09-30 17:57 justin1014 * /NSIS/trunk/Source/zlib/INFTREES.C, /NSIS/trunk/Source/zlib/INFTREES.H: another 20--30 or so 2002-09-30 17:39 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFBLOCK.H, /NSIS/trunk/Source/zlib/INFCODES.C, /NSIS/trunk/Source/zlib/INFCODES.H, /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/INFTREES.C, /NSIS/trunk/Source/zlib/INFTREES.H, /NSIS/trunk/Source/zlib/INFUTIL.C, /NSIS/trunk/Source/zlib/INFUTIL.H, /NSIS/trunk/Source/zlib/ZLIB.H: big ass size savings in zlib mode :) 2002-09-30 17:27 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.21 2002-09-30 17:22 kichik * /NSIS/trunk/Source/lang.cpp: Prevent possible crash 2002-09-30 17:13 kichik * /NSIS/trunk/Source/lang.cpp: Now considers the first section too when deciding if the components page should be shown. Also doesn't show the components page if all sections are RO. 2002-09-30 17:08 rainwater * /NSIS/trunk/Docs/src/history.but: Updated history 2002-09-30 16:59 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFLATE.C: 52 bytes off of zlib 2002-09-30 16:49 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/INFUTIL.C, /NSIS/trunk/Source/zlib/INFUTIL.H, /NSIS/trunk/Source/zlib/ZLIB.H: cut around 30 bytes of code off of zlib mode (room for more tho) 2002-09-30 16:49 justin1014 * /NSIS/trunk/Source/exehead/fileform.c: cut a few bytes of bzip2 mode 2002-09-30 15:22 joostverburg * /NSIS/trunk/Examples/languages.nsi: comment update 2002-09-30 13:49 kichik * /NSIS/trunk/Source/lang.cpp: Err... now works :) 2002-09-30 02:25 justin1014 * /NSIS/trunk/Source/bzip2/decompress.c: heh few more bytes saved 2002-09-30 02:23 justin1014 * /NSIS/trunk/Source/bzip2/decompress.c: woohoo big savings, bzip2 is now 36.0k for me at least 2002-09-30 02:08 justin1014 * /NSIS/trunk/Source/build.cpp: fixed so it would compile :) 2002-09-29 21:33 kichik * /NSIS/trunk/Source/build.cpp: Now really doesn't crash :) 2002-09-29 21:32 kichik * /NSIS/trunk/Source/build.cpp: Now doesn't crash if the closing bracket ')' couldn't be found 2002-09-29 20:57 kichik * /NSIS/trunk/Source/build.cpp: Now shows the number of language tables in the summary. 2002-09-29 20:51 kichik * /NSIS/trunk/Source/tokens.cpp: LangString usage string updated 2002-09-29 20:50 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h: cur_userlangstrings removed, no need. 2002-09-29 20:25 kichik * /NSIS/trunk/Examples/languages.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added user defined multilingual strings. Define using LangString [un.]name lang_id string, use with $(name). Can't be used inside other strings. 2002-09-29 10:04 kichik * /NSIS/trunk/Contrib/Language files/Dutch.nlf, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Contrib/Language files/Korean.nlf, /NSIS/trunk/Contrib/Language files/Russian.nlf, /NSIS/trunk/Contrib/Language files/SimpChinese.nlf, /NSIS/trunk/Contrib/Language files/Slovak.nlf, /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: Delete file: now has a space after it 2002-09-28 14:01 eccles * /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/randtable.c: Saved another 48 bytes of data for bzip2 (at the expense of 6 extra code bytes). bzip2 'randtable' not being initialised in makensis. 2002-09-28 13:00 kichik * /NSIS/trunk/Docs/src/generalpurpose.but: CreateShortCut description added 2002-09-27 23:27 eccles * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/decompress.c: 338 bytes (code) saved from bzip2 2002-09-27 12:28 rainwater * /NSIS/trunk/Examples/makensis.nsi: Showwina and System source were all mixed up 2002-09-27 05:17 justin1014 * /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/INFUTIL.H: reduced zlib size by 16 or so 2002-09-27 05:00 justin1014 * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib_private.h: more bzip size savings (made it so our bzip2 can only decompress one thing at a time, though, which is fine cause thats what we use anyway) 2002-09-27 04:11 justin1014 * /NSIS/trunk/Docs/src/sec.but: fixed typo of file type vs install type 2002-09-27 04:05 justin1014 * /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/randtable.c, /NSIS/trunk/Source/exehead/fileform.c: bzip2 mode reduced down to 36.5kb. yay. 2002-09-27 03:38 justin1014 * /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/randtable.c, /NSIS/trunk/Source/exehead/fileform.c: more bzip2 code reduction, disabled data reduction for now so we can hit targets 2002-09-27 03:35 justin1014 * /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/decompress.c: 50ish bytes of bzip2 code removed 2002-09-27 03:30 justin1014 * /NSIS/trunk/Source/bzip2/bzlib_private.h: 6 bytes or so saved in bzip2 2002-09-27 03:16 justin1014 * /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/randtable.c, /NSIS/trunk/Source/exehead/fileform.c: made bzip2 mode have 336 bytes less data, but about 60 bytes more code. 2002-09-27 02:25 justin1014 * /NSIS/trunk/Docs/src/compilerflags.but: updated setcompress option 2002-09-27 02:22 justin1014 * /NSIS/trunk/Docs/src/compilerflags.but: updated setdatablockoptimize docs 2002-09-26 22:53 eccles * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: Clicking [x] behaves the same as Cancel (thank's brainsucker). Saved 224 bytes. 2002-09-26 22:47 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Plugins/InstallOptions.dll: Clicking [x] behaves the same as Cancel (thank's brainsucker). Saved 224 bytes. 2002-09-26 19:42 kichik * /NSIS/trunk/Source/exehead/Ui.c: Another 12 bytes 2002-09-26 18:41 kichik * /NSIS/trunk/Source/exehead/Ui.c: Section check marks are now changeable in .onNextPage/.onPrevPage after/before the components page. Code size is down by 12 bytes because of this :) 2002-09-26 18:00 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: fixed temp var bug, uses LANG vars 2002-09-26 17:29 joostverburg * /NSIS/trunk/Examples/makensis.nsi: fixed showwin source 2002-09-26 16:58 joostverburg * /NSIS/trunk/Examples/makensis.nsi: showwin.txt at the correct location :) 2002-09-26 14:52 joostverburg * /NSIS/trunk/Examples/makensis.nsi: added plugins 2002-09-25 22:59 rainwater * /NSIS/trunk/Contrib/Language files/Russian.nlf: brainsucker's russian language update 2002-09-25 19:47 joostverburg * /NSIS/trunk/Contrib/System/Last Comments.txt, /NSIS/trunk/Contrib/System/SystemEx.nsi: removed (need to be updated) 2002-09-25 19:13 rainwater * /NSIS/trunk/Examples/makensis.nsi: Updated to use new ModernUI 2002-09-25 18:49 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: better names for temp vars 2002-09-25 18:46 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: temp vars defined by header file, currentpage & io vars should be set using macro parameters 2002-09-25 18:44 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: *** empty log message *** 2002-09-25 18:40 rainwater * /NSIS/trunk/Contrib/Makensisw/Readme.txt: Updated readme. Path to makensis.exe is no longer used in the command-line. 2002-09-25 13:10 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: 6 more bytes down 2002-09-25 13:08 rainwater * /NSIS/trunk/Examples/WinMessages.NSH: Prevent multiple inclusion of !defines 2002-09-25 12:54 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Shortcut comment option added, 44 bytes saved. 2002-09-25 03:44 justin1014 * /NSIS/trunk/Source/exehead/fileform.c: made bzip2 extraction slightly more pedantic 2002-09-25 03:34 justin1014 * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c: another 30 or so bytes saved, by modifying readSelfFile to do all length checking. Not sure if I broke anything though =) 2002-09-25 03:14 justin1014 * /NSIS/trunk/Source/exehead/exec.c: another 8 bytes saved 2002-09-25 03:06 justin1014 * /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c: more byte saveage 2002-09-25 02:55 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: a handful of bytes saved again 2002-09-25 02:36 justin1014 * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: cut another 30 bytes or so off. also made atoi take negative octal/hex numbers. 2002-09-25 02:13 justin1014 * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: 6 bytes saved (made addtrailingslash return char *) 2002-09-24 23:40 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.rc: Moved "Recompile" and "Test Installer" to "Tools" menu. 2002-09-24 23:26 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c: 60 bytes saved. zlib exehead is now 35.5K. 2002-09-24 22:52 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added "Clear Log" command. "Clear Log" and "Edit Script" are now under a new "Tools" menu. Removed some unused resources. 2002-09-24 20:05 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: writes language to registry for uninstaller 2002-09-24 18:49 eccles * /NSIS/trunk/Source/exehead/exec.c: 200 bytes saved! Drum-roll... bzip2 exehead is now 37K. Next target - 50 bytes to get zlib exehead down to 35.5K. 2002-09-24 13:59 rainwater * /NSIS/trunk/Examples/makensis.nsi: Removed /CD from shortcut 2002-09-24 13:49 rainwater * /NSIS/trunk/Contrib/Makensisw/Readme.txt: Updated shortcuts 2002-09-24 13:41 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Removed int declarations 2002-09-24 13:39 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h: Context Menu object reference is re-used each time. 2002-09-24 13:28 kichik * /NSIS/trunk/Contrib/ShowWin/ShowWin.nsi: Hides the I agree button not cancel :) 2002-09-24 10:38 kichik * /NSIS/trunk/Source/build.cpp: rtest.nsi crash bug fixed 2002-09-23 23:29 kichik * /NSIS/trunk/Source/build.cpp: Now actually compiles :) 2002-09-23 23:23 kichik * /NSIS/trunk/Source/build.cpp: Icon sizes mismatch bug fixed 2002-09-23 20:56 eccles * /NSIS/trunk/Source/exehead/Ui.c: 40 bytes saved 2002-09-23 19:27 eccles * /NSIS/trunk/Source/exehead/Ui.c: Tidied - removed some legacy language stuff. No change to compiled output. 2002-09-23 14:07 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/util.cpp: 18 bytes down 2002-09-23 13:08 joostverburg * /NSIS/trunk/Contrib/Icons/yi-box_check.bmp, /NSIS/trunk/Contrib/Language files/Slovak.nlf: *** empty log message *** 2002-09-22 20:04 kichik * /NSIS/trunk/Examples/makensis.nsi: Plugins now have their own sub section inside the contrib subsection 2002-09-22 20:02 eccles * /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/zlib/ZUTIL.H: Use exehead's my_GlobalAlloc 2002-09-22 19:06 justin1014 * /NSIS/trunk/Source/lang.cpp: made NLF_ERR_WRITING etc in silent installers too 2002-09-22 19:05 eccles * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: 80 bytes saved 2002-09-22 18:50 justin1014 * /NSIS/trunk/Source/lang.cpp: updated language string adding to check more for NSIS_VISIBLE_SUPPORT or whatnot. Check to make sure this is OK. Thanks, Justin. 2002-09-22 18:48 justin1014 * /NSIS/trunk/Source/build.cpp: fixed no-compression but uninstaller mode 2002-09-22 14:22 eccles * /NSIS/trunk/Source/exehead/exec.c: 4 byte saving. woooo. 2002-09-22 14:22 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: links to the new nsis.sourceforge.net page 2002-09-22 14:07 joostverburg * /NSIS/trunk/Contrib/Icons/yi-box_install.ico, /NSIS/trunk/Contrib/Icons/yi-box_uninstall.ico: added 16 color icons 2002-09-22 13:59 joostverburg * /NSIS/trunk/Examples/makensis.nsi: Updated for Modern UI 1.20 - No .h files in Contrib\nsExec 2002-09-22 13:38 joostverburg * /NSIS/trunk/Contrib/Icons/yi-box_install.ico, /NSIS/trunk/Contrib/Icons/yi-box_uninstall.ico: *** empty log message *** 2002-09-22 13:37 joostverburg * /NSIS/trunk/Contrib/Icons/yi-simple_install.ico, /NSIS/trunk/Contrib/Icons/yi-simple_uninstall.ico, /NSIS/trunk/Contrib/Icons/yi-simple2_install.ico, /NSIS/trunk/Contrib/Icons/yi-simple2_uninstall.ico: new 16 color icons 2002-09-22 13:33 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.20 2002-09-22 12:53 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: Updated macro system 2002-09-22 12:52 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Updated macro system & LangDLL usage 2002-09-22 12:00 joostverburg * /NSIS/trunk/Examples/Modern UI/iniC.ini: text=iniC 2002-09-22 11:58 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: added io nextpage/prevpage macro's 2002-09-22 11:52 joostverburg * /NSIS/trunk/Contrib/Icons/yi-pixel.ico, /NSIS/trunk/Contrib/Icons/yi-pixel-uninstall.ico: converted to 256 colors 2002-09-22 11:46 joostverburg * /NSIS/trunk/Contrib/Icons/yi-simple_install.ico, /NSIS/trunk/Contrib/Icons/yi-simple_uninstall.ico, /NSIS/trunk/Contrib/Icons/yi-simple2_install.ico, /NSIS/trunk/Contrib/Icons/yi-simple2_uninstall.ico: converted to 256 colors 2002-09-22 11:35 joostverburg * /NSIS/trunk/Examples/Modern UI/iniB.ini, /NSIS/trunk/Examples/Modern UI/iniC.ini, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/Readme.html: Support for multiple IO pages in a row 2002-09-22 11:34 kichik * /NSIS/trunk/Docs/src/plugin.but: Plugin docs fixes (/NOUNLOAD flag stuff) 2002-09-22 11:22 joostverburg * /NSIS/trunk/Contrib/Icons/yi-simple_check.bmp, /NSIS/trunk/Contrib/Icons/yi-simple_install.ico, /NSIS/trunk/Contrib/Icons/yi-simple_uninstall.ico, /NSIS/trunk/Contrib/Icons/yi-simple2_check.bmp, /NSIS/trunk/Contrib/Icons/yi-simple2_install.ico, /NSIS/trunk/Contrib/Icons/yi-simple2_uninstall.ico: *** empty log message *** 2002-09-22 11:09 kichik * /NSIS/trunk/Contrib/ShowWin/ShowWin.dpr: This isn't a Delphi project the last time I checked :) 2002-09-22 10:28 kichik * /NSIS/trunk/Examples/languages.nsi: New plugin calling convention 2002-09-22 10:01 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: test - added info about MUI_INSTALLOPTIONS_INIT 2002-09-21 21:05 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: *** empty log message *** 2002-09-21 20:59 joostverburg * /NSIS/trunk/Contrib/System, /NSIS/trunk/Contrib/System/Buffers.c, /NSIS/trunk/Contrib/System/Buffers.h, /NSIS/trunk/Contrib/System/Last Comments.txt, /NSIS/trunk/Contrib/System/Plugin.c, /NSIS/trunk/Contrib/System/Plugin.h, /NSIS/trunk/Contrib/System/stdafx.c, /NSIS/trunk/Contrib/System/stdafx.h, /NSIS/trunk/Contrib/System/System.c, /NSIS/trunk/Contrib/System/System.h, /NSIS/trunk/Contrib/System/System.ncb, /NSIS/trunk/Contrib/System/System.sln, /NSIS/trunk/Contrib/System/System.txt, /NSIS/trunk/Contrib/System/System.vcproj, /NSIS/trunk/Contrib/System/SystemEx.nsi, /NSIS/trunk/Plugins/System.dll: System plugin 2002-09-21 19:10 justin1014 * /NSIS/trunk/Plugins/ShowWin.dll, /NSIS/trunk/Plugins/splash.dll: updated (I am using way too many commits I know) 2002-09-21 19:10 justin1014 * /NSIS/trunk/Contrib/ExDLL/exdll.h: cleanup 2002-09-21 19:09 justin1014 * /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/Splash/splash.dsp, /NSIS/trunk/Contrib/Splash/splash.txt: updated splash to new exdll. made it so that it always pushes status to the stack even if error occured 2002-09-21 19:05 justin1014 * /NSIS/trunk/Contrib/ShowWin/ShowWin.c, /NSIS/trunk/Contrib/ShowWin/ShowWin.dsp: updated ShowWin for new exdll and to make smaller :) 2002-09-21 18:57 justin1014 * /NSIS/trunk/Plugins/nsisdl.dll: updated to new syntax/exdll 2002-09-21 18:57 justin1014 * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt: updated to new format / exdll 2002-09-21 18:50 justin1014 * /NSIS/trunk/Plugins/nsExec.dll: updated to new exdll interface. /TIMEOUT now should come before any command. 2002-09-21 18:49 justin1014 * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.dsp, /NSIS/trunk/Contrib/nsExec/nsexec.h, /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Contrib/nsExec/nsis.c, /NSIS/trunk/Contrib/nsExec/nsis.h: updated to new exdll interface. note that /TIMEOUT must come before command now. 2002-09-21 18:46 justin1014 * /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/LangDLL.dll: updated to new exdll use and changed LangDLL's parameter format (look in langdll.cpp to see) 2002-09-21 18:45 justin1014 * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/LangDLL/LangDLL.dsp: updated parameter use to new exdll 2002-09-21 18:37 justin1014 * /NSIS/trunk/Source/script.cpp: changed parameters on dlls to be pushed rtl instead of ltr (updating plugins now) 2002-09-21 18:31 justin1014 * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/io.dsp: updated with new exdll.h interface 2002-09-21 18:28 justin1014 * /NSIS/trunk/Contrib/ExDLL/exdll.h: added exdll.h that other plugins should use, for better version compatibility 2002-09-21 18:27 justin1014 * /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/exdll.dsp: updated exdll source 2002-09-21 17:17 eccles * /NSIS/trunk/Source/exehead/fileform.c: Now *really* only shows the unpacking dialog if the NSIS window hasn't been created yet 2002-09-21 15:47 kichik * /NSIS/trunk/Source/script.cpp: Macros don't crash makensis if they have bad syntax 2002-09-21 15:17 kichik * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c: Now only shows the unpacking dialog if the NSIS window hasn't been created yet 2002-09-21 13:11 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp: Installers with plugins now load faster too 2002-09-21 11:27 joostverburg * /NSIS/trunk/Examples/Modern UI/iniA.ini, /NSIS/trunk/Examples/Modern UI/iniB.ini, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: test - io example update 2002-09-21 11:10 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: test - added uninst io macro 2002-09-21 07:05 justin1014 * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c: more updates yay 2002-09-21 06:54 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: ok done for the night. smaller code yay. 248 bytes left to remove from code to bring bzip2 mode down tho :( 2002-09-21 06:42 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: bunch more size opts 2002-09-21 06:13 justin1014 * /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c: woohoo 36.0kb for zlib header 2002-09-21 05:55 justin1014 * /NSIS/trunk/Source/exehead/bgbg.c: 10 bytes off yay 2002-09-21 03:21 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: renamed notify() to outernotify() and made static 2002-09-21 03:21 justin1014 * /NSIS/trunk/Source/exehead/bgbg.c: 2 byte reduction yay 2002-09-21 02:44 justin1014 * /NSIS/trunk/Source/exehead/exec.c: another 4 byte save 2002-09-21 02:34 justin1014 * /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: 2 bytes saved on exehead by using my_SetDlgItemText. heh. 2002-09-21 02:12 justin1014 * /NSIS/trunk/Source/exehead/fileform.c: made "unpacking dialog" dialog only come up when the main installer window hasnt' been created yet. 2002-09-21 02:10 justin1014 * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added ReserveFile command (usable anywhere) that allows you to put a file in the datablock so that it is preloaded for use later. Useful for when you use plugins in .onInit, and bz2 mode. Need to document this stuff. Anyone? :) 2002-09-20 23:45 kichik * /NSIS/trunk/Examples/makensis.nsi: splash: exe -> dll 2002-09-20 23:32 joostverburg * /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: test - better io macro system 2002-09-20 23:22 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp: bzip2 installers should now start a lot faster 2002-09-20 23:13 joostverburg * /NSIS/trunk/Examples/makensis.nsi: *** empty log message *** 2002-09-20 23:05 kichik * /NSIS/trunk/Plugins/splash.dll: Now really doesn't freeze (just recompiled... odd) 2002-09-20 23:02 joostverburg * /NSIS/trunk/Examples/Modern UI/iniA.ini, /NSIS/trunk/Examples/Modern UI/iniB.ini, /NSIS/trunk/Examples/Modern UI/InstallOptions.nsi: test - working on io integration 2002-09-20 22:57 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: working on io integration 2002-09-20 21:36 justin1014 * /NSIS/trunk/Source/exehead/fileform.c: removed unpacking installer msg since it shouldnt be needed if all is working right 2002-09-20 21:03 kichik * /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Plugins/splash.dll: Now actually exits from the message loop 2002-09-20 20:54 kichik * /NSIS/trunk/Contrib/Splash/splash.dsp: Less linkage 2002-09-20 20:53 justin1014 * /NSIS/trunk/Examples/makensis.nsi: updated mouseover text etc 2002-09-20 20:51 kichik * /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Plugins/splash.dll: Doesn't kill NSIS :) 2002-09-20 20:49 joostverburg * /NSIS/trunk/Contrib/ShowWin, /NSIS/trunk/Contrib/ShowWin/ShowWin.c, /NSIS/trunk/Contrib/ShowWin/ShowWin.dpr, /NSIS/trunk/Contrib/ShowWin/ShowWin.dsp, /NSIS/trunk/Contrib/ShowWin/ShowWin.dsw, /NSIS/trunk/Contrib/ShowWin/ShowWin.nsi, /NSIS/trunk/Contrib/ShowWin/ShowWin.txt, /NSIS/trunk/Plugins/ShowWin.dll: *** empty log message *** 2002-09-20 20:44 eccles * /NSIS/trunk/Plugins/InstallOptions.dll: dll updated from earlier source changes - Down to 11K. Negative positions were not being adjusted by the dialog size correctly. Fixed problem with negative positions and 'large fonts'. File/DirRequests now the correct size (size of browse button was not being taken into account correctly). Removed tabstops from statics. 2002-09-20 20:41 justin1014 * /NSIS/trunk/Examples/makensis.nsi: Made contrib/source more organized.. needs modernui mouseovers updated 2002-09-20 20:40 kichik * /NSIS/trunk/Contrib/Splash/splash.txt: Converted to plugin DLL 2002-09-20 20:34 kichik * /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/Splash/splash.dsp: Converted to plugin DLL 2002-09-20 20:33 kichik * /NSIS/trunk/Plugins/splash.dll: Splash converted to plugin DLL 2002-09-20 20:21 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: *** empty log message *** 2002-09-20 20:11 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: Bugfixes, no hard-coded names, io support 2002-09-20 19:23 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc: Smaller about box 2002-09-20 19:20 justin1014 * /NSIS/trunk/Examples/makensis.nsi: partway through my cleanup of start menu shit 2002-09-20 19:16 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.rc: Ctrl+L loads a script 2002-09-20 17:43 justin1014 * /NSIS/trunk/Source/makenssi.cpp: updated /HDRINFO text =) 2002-09-20 17:31 justin1014 * /NSIS/trunk/Examples/makensis.nsi: made an optional define CLASSIC_UI for disabling modern ui completely =) 2002-09-20 17:22 justin1014 * /NSIS/trunk/Contrib/Icons/modern.bmp: fixed color table not having magenta (doh!) 2002-09-20 17:16 justin1014 * /NSIS/trunk/Contrib/Icons/checks1.bmp, /NSIS/trunk/Contrib/Icons/checks2.bmp, /NSIS/trunk/Contrib/Icons/checks4.bmp, /NSIS/trunk/Contrib/Icons/checks4-aa.bmp, /NSIS/trunk/Contrib/Icons/checksX.bmp, /NSIS/trunk/Contrib/Icons/checksX2.bmp, /NSIS/trunk/Contrib/Icons/jarsonic-checks.bmp, /NSIS/trunk/Contrib/Icons/lucas-checks.bmp, /NSIS/trunk/Contrib/Icons/modern.bmp: updated to work with new mask code 2002-09-20 17:11 justin1014 * /NSIS/trunk/Source/exehead/bitmap1.bmp: updated with magentagaynessbg[tm] 2002-09-20 17:08 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: using ImageList_AddMasked for checkbitmaps.. need to update all the checkbitmaps accordingy 2002-09-20 16:22 kichik * /NSIS/trunk/Source/exehead/Ui.c: Log window width now back to normal (no horizontal scroll bar) 2002-09-20 14:52 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: F1 shows docs 2002-09-20 14:37 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: New About Boxes 2002-09-20 12:11 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.rc: flicker-free 2002-09-20 12:01 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp: forgot to update project 2002-09-20 11:53 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/shell.ico, /NSIS/trunk/Examples/makensis.nsi: added .nsi shell icon 2002-09-20 05:12 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.rc: Test->Test Installer (less confusion) 2002-09-20 05:11 rainwater * /NSIS/trunk/Examples/makensis.nsi: Readme.png->Readme.jpg (Modern UI change in installer) 2002-09-20 02:57 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.rc: Smoother resizing 2002-09-20 02:43 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added resize gripper....finally. 2002-09-20 00:53 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added Context Menu in log window 2002-09-19 22:38 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/version.cpp: Code cleanup 2002-09-19 22:25 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/Ui.c: Shaved off another 104 bytes of code. exehead_bzip2 is now 37.5K. 2002-09-19 21:53 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Shaved off 208 bytes of code 2002-09-19 21:10 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: Better support for code between macro's 2002-09-19 18:41 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: Typo :) 2002-09-19 17:57 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.png: *** empty log message *** 2002-09-19 17:55 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/Readme.jpg: Updated Readme 2002-09-19 16:42 kichik * /NSIS/trunk/Source/makenssi.cpp: Shows the right name when can't open script (doesn't show the .nsi appended) 2002-09-19 16:31 rainwater * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/registry.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/var.but, /NSIS/trunk/Docs/style.css: Docs updates. More to come. 2002-09-19 16:27 rainwater * /NSIS/trunk/Examples/makensis.nsi: don't add icon.ico, remove license.txt 2002-09-19 16:14 kichik * /NSIS/trunk/Contrib/Makensisw/Readme.txt: h not k :) 2002-09-19 15:57 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Plugins/nsisdl.dll: Added /TIMEOUT= option 2002-09-19 15:57 joostverburg * /NSIS/trunk/Examples/makensis.nsi: Works with Modern UI 1.19 2002-09-19 15:56 rainwater * /NSIS/trunk/Source/icon.ico: removed 2002-09-19 15:56 rainwater * /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/resource.h, /NSIS/trunk/Source/Script1.rc: removed icon to distinguish makensis and makensisw 2002-09-19 15:50 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.19 - macro system changes 2002-09-19 15:29 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Makensisw now uses nsis version as branding. Added tooltips, updated icon. 2002-09-19 15:27 joostverburg * /NSIS/trunk/Plugins/ShowWin.dll: Show/Hide dialog items 2002-09-18 23:28 justin1014 * /NSIS/trunk/Source/exehead/util.c: used my opt instead of eccles, actually smaller (and made both bzip2 and zlib drop by 0.5k yay!) 2002-09-18 23:19 justin1014 * /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c: updated with a lot of .data size optimizations.. used eccles' optimization for certain registry settings too (thanks dave).. code size may have gone slightly up,but it let me take a lot of data size off (had to change some of the default error msgs too) 2002-09-18 22:30 justin1014 * /NSIS/trunk/Source/exehead/Ui.c: tiny size decrease yay 2002-09-18 21:49 justin1014 * /NSIS/trunk/Plugins/nsisdl.dll: oops forgot to commit this 2002-09-18 21:21 justin1014 * /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/fileform.c: better no-compression mode 2002-09-18 21:20 justin1014 * /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/bzip2/randtable.c: made bzip2 not get compiled when compression is disabled 2002-09-18 19:08 justin1014 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: Fuxing things up making things compile/smaller when lots of options are disabled. 2002-09-18 18:44 rainwater * /NSIS/trunk/Examples/makensis.nsi: Added docs to installer 2002-09-18 18:42 justin1014 * /NSIS/trunk/Source/exehead/config.h: added NSIS_CONFIG_ENHANCEDUI_SUPPORT 2002-09-18 18:39 justin1014 * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/script.cpp: Added NSIS_CONFIG_ENHANCEDUI_SUPPORT to config.h 2002-09-18 18:16 justin1014 * /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp: updated to 1.2, added timeout 2002-09-18 17:29 rainwater * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/callback.but, /NSIS/trunk/Docs/src/compiler.but, /NSIS/trunk/Docs/src/defines.but, /NSIS/trunk/Docs/src/plugin.but, /NSIS/trunk/Docs/src/usection.but: Finished doc port 2002-09-18 16:59 rainwater * /NSIS/trunk/Docs/src/build.bat: added plugin 2002-09-18 16:34 rainwater * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/int.but, /NSIS/trunk/Docs/src/log.but, /NSIS/trunk/Docs/src/misc.but, /NSIS/trunk/Docs/src/reboot.but, /NSIS/trunk/Docs/src/sec.but, /NSIS/trunk/Docs/src/stack.but, /NSIS/trunk/Docs/src/string.but, /NSIS/trunk/Docs/src/uninstall.but, /NSIS/trunk/Docs/src/var.but: Finished instructions for docs 2002-09-18 15:39 rainwater * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/file.but: Added file instructions 2002-09-18 15:27 rainwater * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/flowcontrol.but: Add flow control instructions 2002-09-18 14:47 kichik * /NSIS/trunk/Source/exehead/Ui.c: Removed debug message box 2002-09-18 14:46 kichik * /NSIS/trunk/Source/exehead/Ui.c: Threading issues should now be solved 2002-09-18 14:21 kichik * /NSIS/trunk/Source/exehead/Ui.c: Nasty threading bug should now be fixed 2002-09-18 14:03 rainwater * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/generalpurpose.but: Added general purpose instructions 2002-09-18 13:53 rainwater * /NSIS/trunk/Docs/src/registry.but: added registry instructions 2002-09-18 13:42 kichik * /NSIS/trunk/Source/script.cpp: Wasn't a typo after all 2002-09-17 19:49 kichik * /NSIS/trunk/Source/script.cpp: Another typo (what's a mmap?) 2002-09-17 19:45 kichik * /NSIS/trunk/Source/script.cpp: Typo fixed 2002-09-17 14:39 rainwater * /NSIS/trunk/Docs/src/basic.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/registry.but: Some updated docs. More to come in a minute. 2002-09-17 14:24 rainwater * /NSIS/trunk/Docs/src/bin/halibut.exe: Updated halibut 2002-09-16 12:48 kichik * /NSIS/trunk/Source/exehead/fileform.c: Now compiles without NSIS_CONFIG_SILENT_SUPPORT too 2002-09-14 09:47 kichik * /NSIS/trunk/Examples/WinMessages.NSH: Added HWND_BROADCAST 2002-09-14 09:43 kichik * /NSIS/trunk/Source/exehead/Ui.c: Sets the log window width before logging starts, faster, and works when calling a DLL that logs something before any other command 2002-09-14 00:43 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h: Updated usage info. Last one was really stupid. This one is a tad better. 2002-09-13 23:09 justin1014 * /NSIS/trunk/Source/script.cpp: made SendMessage command logic more sensitive 2002-09-13 22:07 kichik * /NSIS/trunk/Source/exehead/exec.c: Back to 37KB 2002-09-13 21:25 justin1014 * /NSIS/trunk/Source/script.cpp: forgot to have it skip the STR: :) 2002-09-13 21:23 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.18 2002-09-13 21:23 justin1014 * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: increased instruction parameter count to 6, made SendMessage support strings differently and made it support timeouts 2002-09-13 21:17 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: version 1.18 2002-09-13 21:17 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: version 1.18: Uses the new SendMessage string option 2002-09-13 20:59 justin1014 * /NSIS/trunk/Source/exehead/exec.c: Changed SendMessage: WM_SETTEXT no longer implies string (hack), and lParam and wParam can pass strings if they begin with STR: 2002-09-13 19:48 kichik * /NSIS/trunk/Source/makenssi.cpp: Added /version command line option 2002-09-13 19:22 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h: Updated usage 2002-09-13 18:12 justin1014 * /NSIS/trunk/Source/exehead/Main.c: cleanups to command lien parm shit, smaller now 2002-09-13 18:00 justin1014 * /NSIS/trunk/Source/exehead/Main.c: made uninstall pass generic parms back (other than ones beginning with /) 2002-09-13 15:53 kichik * /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp: Script1.rc moved to resources 2002-09-13 15:04 kichik * /NSIS/trunk/Source/script.cpp: Macros output back to normal 2002-09-13 14:58 kichik * /NSIS/trunk/Examples/languages.nsi: Uses the new ${LANG_LangName} feature 2002-09-13 14:20 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Second try 2002-09-13 14:10 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Bug fixed 2002-09-13 09:59 kichik * /NSIS/trunk/Source/script.cpp: Now defines ${LANG_LangName} as the id of the language when loading a NLF. For example: ${LANG_ENGLISH}=1033 2002-09-12 19:34 kichik * /NSIS/trunk/Examples/makensis.nsi: Desktop shortcut to makensisw.exe without makensis.exe 2002-09-12 16:21 kichik * /NSIS/trunk/Source/tokens.cpp: Typo fixed 2002-09-12 16:16 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Now logs as should even if text is selected/cart positions changes 2002-09-12 11:47 kichik * /NSIS/trunk/Source/exehead/Ui.c: Back to 37KB 2002-09-12 11:21 kichik * /NSIS/trunk/Contrib/Language files/TradChinese.nlf: small change 2002-09-11 15:39 rainwater * /NSIS/trunk/Contrib/Makensisw/resource.rc: always show scrollbar 2002-09-11 15:07 rainwater * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Clipboard changes 2002-09-11 12:04 rainwater * /NSIS/trunk/Contrib/Makensisw/utils.cpp: don't free memory 2002-09-11 02:15 rainwater * /NSIS/trunk/Source/exehead/nsis.ico: Updated NSIS icon 2002-09-11 02:14 rainwater * /NSIS/trunk/Examples/makensis.nsi: Register .nsh files with notepad like .nsi files except no compile options. 2002-09-11 00:26 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added ctrl+c support at the window level. Exit is now Alt+X. Free clipboard memory. 2002-09-10 20:04 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Down to 11K. Negative positions were not being adjusted by the dialog size correctly. Fixed problem with negative positions and 'large fonts'. File/DirRequests now the correct size (size of browse button was not being taken into account correctly). Removed tabstops from statics. 2002-09-10 19:25 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.17 2002-09-10 19:20 joostverburg * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh: version 1.17 - Win9x font weight bug fixed (font of title in white rect) 2002-09-10 19:19 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: version 1.17 2002-09-10 19:11 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Added Select All 2002-09-10 16:36 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Find dialog added 2002-09-10 15:49 rainwater * /NSIS/trunk/Examples/Modern UI/Readme.html: NSIS 2 is no longer a mod 2002-09-10 15:09 kichik * /NSIS/trunk/Examples/languages.nsi: Simplified Chinese added 2002-09-10 15:04 kichik * /NSIS/trunk/Examples/languages.nsi: Type fixed, now compiles 2002-09-10 15:01 kichik * /NSIS/trunk/Contrib/Language files/German.nlf: Header changed to v2 2002-09-10 13:50 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Now scrolls on Windows 9x as it should 2002-09-10 12:05 rainwater * /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/functions.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/labels.but, /NSIS/trunk/Docs/src/sections.but: Added sections, functions, and labels. Now only instructions is left 2002-09-10 03:44 rainwater * /NSIS/trunk/Contrib/zip2exe/icon.ico, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/zip2exe.dsp, /NSIS/trunk/Contrib/zip2exe/zip2exe.xml: Updated Zip2Exe's GUI 2002-09-09 23:33 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Examples/makensis.nsi: Updated urls to point to new home page (nsis != nsis2k) 2002-09-09 23:02 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added Load Script option on File menu and fixed save output string filter 2002-09-09 19:59 uid27073 * /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/zip2exe.dsp: makensis.exe path is not in the 'bin' directory 2002-09-09 19:20 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: no crash 2002-09-09 18:19 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Free up memory 2002-09-09 17:56 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: no icon 2002-09-09 17:51 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Can't drag while compiling 2002-09-09 17:25 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc: Updated icon 2002-09-09 16:43 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h: Drag and Drop Support into the Makensisw window 2002-09-09 16:33 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: updated version number 2002-09-08 14:22 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.cpp: Version change 2002-09-08 13:43 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Test button is now only enabled if there were no errors during compilation 2002-09-08 11:02 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Return key detection in richedit control now implemented correctly. 2002-09-07 21:33 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Return key now works on licence page at the same time as the "give initial focus to licence text" patch :) 2002-09-07 20:49 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Renamed my_alloc to my_GlobalAlloc 2002-09-07 12:57 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Now tries to unselect before logging 2002-09-07 12:04 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Another buffer overflow bug fixed 2002-09-07 10:23 kichik * /NSIS/trunk/Docs/src/history.but: Link to complete version history added 2002-09-06 22:18 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Recompiling caussed memory leaks - fixed 2002-09-06 21:54 kichik * /NSIS/trunk/Plugins/InstallOptions.dll: Smaller DLL by eccles 2002-09-06 21:38 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Copy now uses GMEM_MOVEABLE 2002-09-06 21:02 justin1014 * /NSIS/trunk/Source/makenssi.cpp: made SetCurrentDirectory check for error for /CD 2002-09-06 20:59 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Long lines bug fixed. Now gets the whole path of the script and the output exe. 2002-09-06 20:19 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Buffer bugs fixed, should work better. Hopefully it won't crash anymore. 2002-09-06 20:16 rainwater * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/sections.but: added part of the sections docs 2002-09-06 19:58 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.16: changed text on license page 2002-09-06 19:55 joostverburg * /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: changed text on license page: 'scroll down' > 'press page down' because richedit has focus on startup now 2002-09-06 19:38 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Much cleaner license focus implementation 2002-09-06 18:49 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Alternate means of trapping the SetFocus that blows up setting focus to the license page... suggested by KiCHiK 2002-09-06 17:29 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: License control gets focus first -- please can someone test this :D.. the Ui.c code gets a bit hairy 2002-09-06 10:57 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Now beeps when there are errors too 2002-09-06 09:27 kichik * /NSIS/trunk/Contrib/nsExec/nsExec.dsp: Compiles faster, results are smaller 2002-09-06 09:27 kichik * /NSIS/trunk/Plugins/nsExec.dll: Smaller 2002-09-05 22:22 eccles * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Optimisations phase 1 1.5K saved in total 2002-09-05 21:34 eccles * /NSIS/trunk/Contrib/InstallOptions/io.dsp: Changed optimisation from maximise speed to minimise size 2002-09-05 21:09 sunjammerx * /NSIS/trunk/Docs/src/attributes.but: Added PluginDir attribute 2002-09-05 19:39 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: Check for newline 2002-09-05 18:35 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: Stream contents of output (avoid pipe being full) 2002-09-05 18:00 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Plugins/nsExec.dll: Some broken code, but fixes pipe issue 2002-09-05 16:41 rainwater * /NSIS/trunk/Examples/makensis.nsi: add nsExec.dll to installer 2002-09-05 16:31 rainwater * /NSIS/trunk/Contrib/nsExec/nsExec.txt, /NSIS/trunk/Plugins/nsExec.dll: Added nsExec.dll and readme file 2002-09-05 16:24 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/Readme.txt: Updated makensisw with new my_strstr by Kickik 2002-09-05 16:14 kichik * /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/nsExec/nsexec.c: Fixed a bug with my_strstr 2002-09-05 13:18 sunjammerx * /NSIS/trunk/Source/makenssi.cpp: *** empty log message *** 2002-09-05 12:23 kichik * /NSIS/trunk/Contrib/nsExec/nsexec.c: Memory now unlocks and can now be freed 2002-09-05 12:13 kichik * /NSIS/trunk/Contrib/Language files/Swedish.nlf: v2 2002-09-04 20:47 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c: added terminate process 2002-09-04 20:40 rainwater * /NSIS/trunk/Contrib/nsExec/nsexec.c: Added ExecToLog 2002-09-04 19:46 rainwater * /NSIS/trunk/Contrib/nsExec, /NSIS/trunk/Contrib/nsExec/nsexec.c, /NSIS/trunk/Contrib/nsExec/nsExec.dsp, /NSIS/trunk/Contrib/nsExec/nsExec.dsw, /NSIS/trunk/Contrib/nsExec/nsexec.h, /NSIS/trunk/Contrib/nsExec/nsis.c, /NSIS/trunk/Contrib/nsExec/nsis.h: New exec plugin (broke) 2002-09-04 18:50 kichik * /NSIS/trunk/Examples/languages.nsi: Uses the new plugin call method 2002-09-04 18:27 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: Better RTL, not perfect yet 2002-09-04 18:25 kichik * /NSIS/trunk/Plugins/InstallOptions.dll: Added Icon and Bitmap controls 2002-09-04 18:23 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.15. Multilanguage example: changed LangDialog to LangDLL::LangDialog (using the DLL name is now required) 2002-09-04 18:23 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: History updated 2002-09-04 18:23 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: Updated info for Icon and Bitmap 2002-09-04 18:16 joostverburg * /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: changed LangDialog to LangDLL::LangDialog (dll name is now required) 2002-09-04 18:14 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Two new control types: Icon and Bitmap 2002-09-04 17:39 kichik * /NSIS/trunk/Contrib/Language files/French.nlf: New translation by Veekee 2002-09-04 17:15 rainwater * /NSIS/trunk/Contrib/Makensisw/utils.cpp: forgot recompile crap 2002-09-04 17:12 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h: Forgot to update usage instructions 2002-09-04 17:09 rainwater * /NSIS/trunk/Examples/makensis.nsi: Update for new makensisw 2002-09-04 17:08 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/utils.cpp: makensisw now takes same paramters as makensis (path to makensis.exe is no longer passed) 2002-09-04 16:00 kichik * /NSIS/trunk/Source/Plugins.cpp: Plugin command changed to plugin::command without .dll 2002-09-04 14:35 kichik * /NSIS/trunk/Contrib/UberSplash/UberSplash.txt: Copmile note added 2002-09-04 14:28 kichik * /NSIS/trunk/Source/Plugins.cpp: Now only accepts plug-in calls in the form of dllname[.dll]::FunctionName Prevents clashes with future commands 2002-09-04 13:15 kichik * /NSIS/trunk/Source/makenssi.cpp: Now processes plug-in DLLs only if a script is compiled 2002-09-04 13:10 rainwater * /NSIS/trunk/Examples/makensis.nsi: Added UberSplash to the installer 2002-09-04 12:56 kichik * /NSIS/trunk/Contrib/UberSplash, /NSIS/trunk/Contrib/UberSplash/splash.cfg, /NSIS/trunk/Contrib/UberSplash/splash.dcu, /NSIS/trunk/Contrib/UberSplash/splash.dof, /NSIS/trunk/Contrib/UberSplash/splash.dpr, /NSIS/trunk/Contrib/UberSplash/UberSplash.txt: New UberSplash by Vince 2002-09-04 05:40 justin1014 * /NSIS/trunk/Source/exehead/util.c: made win9x move/delete on reboot support proper and function like on win2k (in that shit is deleted in order). Also should be slightly smaller (though < 512 bytes difference) 2002-09-04 01:59 rainwater * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fix crash 2002-09-04 00:49 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/version.cpp: updated link to docs and buffer overrun prob 2002-09-03 23:23 sunjammerx * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Fixed a buffer overrun that was causing makensisw.exe to crash - I *think* this is the cause of the elusive crash that's been around for about a week now. 2002-09-03 20:12 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp: minor update 2002-09-03 20:09 rainwater * /NSIS/trunk/Contrib/Makensisw/Readme.txt: Testing new notification 2002-09-03 19:30 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.14 - small grammar fix & updated UI files 2002-09-03 19:13 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.14 - small grammar fix 2002-09-03 18:49 justin1014 * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/Ui.c: Updated RichEdit usage to hopefully be better (still somewhat untested) 2002-09-03 17:27 kichik * /NSIS/trunk/Source/exehead/Ui.c: RichEdit loading handled in WM_INITDIALOG 2002-09-03 16:52 justin1014 * /NSIS/trunk/Source/script.cpp: made it so SetCompress off when in whole compression mode throws warning 2002-09-03 16:38 justin1014 * /NSIS/trunk/Source/script.cpp: made SetCompressor handle switching back from bzip2 to zlib 2002-09-03 16:29 justin1014 * /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp: removed excess compression dependencies since they were never used 2002-09-03 16:27 justin1014 * /NSIS/trunk/Source/build.cpp: fixed 'zlip' to 'zlib' typo in defines :) 2002-09-03 16:22 kichik * /NSIS/trunk/Contrib/Language files/Korean.nlf: v2 2002-09-03 11:33 kichik * /NSIS/trunk/Source/exehead/Ui.c: Fixed a bug that prevented the last letter from getting copied 2002-09-03 11:25 kichik * /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/UI Holder/resource.h, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Source/exehead/resource.h, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/Ui.c: Now always loads RichEdit2 if present 2002-09-03 11:21 kichik * /NSIS/trunk/Contrib/UIs/UI Holder/ui.dsp: Outputs to ../default.exe 2002-09-03 11:03 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf: v2 2002-09-03 10:14 kichik * /NSIS/trunk/Contrib/UIs/UI Holder, /NSIS/trunk/Contrib/UIs/UI Holder/resource.h, /NSIS/trunk/Contrib/UIs/UI Holder/resource.rc, /NSIS/trunk/Contrib/UIs/UI Holder/ui.cpp, /NSIS/trunk/Contrib/UIs/UI Holder/ui.dsp, /NSIS/trunk/Contrib/UIs/UI Holder/ui.dsw: UI holder source code 2002-09-03 09:43 joostverburg * /NSIS/trunk/Contrib/Language files/SimpChinese.nlf: Simplified Chinese Language file 2002-09-02 23:50 rainwater * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/usage.but: fixed some warnings 2002-09-02 23:00 eccles * /NSIS/trunk/Source/script.cpp: DeleteRegKey now complains if given a third parameter (other than /ifempty) 2002-09-02 20:05 eccles * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/exehead/exehead.xml, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp: exehead.xml no longer required (added dynamically by makensis) 2002-09-02 19:50 eccles * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: Small grammar fix 2002-09-02 19:02 rainwater * /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/usage.but: more doc updates 2002-09-02 18:53 rainwater * /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/usage.but: format updates 2002-09-02 18:05 rainwater * /NSIS/trunk/Docs/src, /NSIS/trunk/Docs/src/attributes.but, /NSIS/trunk/Docs/src/bin, /NSIS/trunk/Docs/src/bin/halibut.exe, /NSIS/trunk/Docs/src/build.bat, /NSIS/trunk/Docs/src/compilerflags.but, /NSIS/trunk/Docs/src/config.but, /NSIS/trunk/Docs/src/history.but, /NSIS/trunk/Docs/src/intro.but, /NSIS/trunk/Docs/src/license.but, /NSIS/trunk/Docs/src/makefile, /NSIS/trunk/Docs/src/script.but, /NSIS/trunk/Docs/src/usage.but: new doc format (incomplete) 2002-09-02 18:04 rainwater * /NSIS/trunk/Docs, /NSIS/trunk/Docs/style.css: New doc format (incomplete) 2002-09-02 17:49 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf: Credits fixed 2002-09-02 17:42 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Contrib/Language files/TradChinese.nlf: NLF v2 2002-09-02 17:39 kichik * /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c: Typo fixed 2002-09-02 17:31 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf: v2 2002-09-02 17:30 joostverburg * /NSIS/trunk/Contrib/UIs/mlbl.exe, /NSIS/trunk/Contrib/UIs/mlbl2.exe: *** empty log message *** 2002-09-02 17:21 joostverburg * /NSIS/trunk/Contrib/Language files/French.nlf: v2 2002-09-02 17:14 joostverburg * /NSIS/trunk/Contrib/Language files/German.nlf: v2 2002-09-02 17:01 joostverburg * /NSIS/trunk/Contrib/Language files/Dutch.nlf: v2 2002-09-02 15:16 joostverburg * /NSIS/trunk/Contrib/Icons/new_lama.ico, /NSIS/trunk/Contrib/Icons/new_nsis_2.ico, /NSIS/trunk/Contrib/Icons/new_nsis_3.ico, /NSIS/trunk/Contrib/Icons/nsis_cd.ico: *** empty log message *** 2002-09-02 15:13 joostverburg * /NSIS/trunk/Contrib/Icons/lama.ico, /NSIS/trunk/Contrib/Icons/lama2.ico, /NSIS/trunk/Contrib/Icons/lama3.ico, /NSIS/trunk/Contrib/Icons/lama4.ico, /NSIS/trunk/Contrib/Icons/lama5.ico: Mike The Llama going modern! 2002-09-02 11:28 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Right-to-left UIs support added 2002-09-02 10:58 joostverburg * /NSIS/trunk/Examples/Modern UI/Readme.html: version 1.13 - added 16 color icons 2002-09-02 10:52 joostverburg * /NSIS/trunk/Contrib/Icons/adni18-installer-C-no48xp.ico, /NSIS/trunk/Contrib/Icons/adni18-uninstall-C-no48xp.ico: added 16 color icon 2002-09-02 10:15 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h: Copy details to clipboard added 2002-09-02 10:15 kichik * /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c: Copy details to clipboard added into NLF 2002-09-01 21:20 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp: Faster build times (WIN32_LEAN_AND_MEAN) 2002-09-01 21:20 kichik * /NSIS/trunk/Contrib/Makensisw/utils.cpp: Now always scrolls to the bottom 2002-09-01 19:35 kichik * /NSIS/trunk/Contrib/Icons/new_lama.ico, /NSIS/trunk/Contrib/Icons/new_nsis.ico: Mike The Llama going modern! 2002-09-01 19:31 kichik * /NSIS/trunk/Source/exehead/bgbg.c: Added DT_NOPREFIX (http://forums.winamp.com/showthread.php?s=&postid=609487#post609487) 2002-09-01 04:16 kichik * /NSIS/trunk/Source/script.cpp: Removed 0xbadf00d thingy 2002-08-31 23:44 eccles * /NSIS/trunk/Source/build.cpp: Buffer overrun 2002-08-31 23:39 sunjammerx * /NSIS/trunk/Contrib/Makensisw/Readme.txt: Fixed a teeny weeny typo ;) 2002-08-31 19:54 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dpr: Defined $LANGUAGE too 2002-08-31 14:30 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/utils.cpp: small makensisw fixes for possible crash 2002-08-31 13:27 kichik * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Faster 2002-08-31 10:27 kichik * /NSIS/trunk/Source/exehead/fileform.h: EW_REBOOT works with out 0xbadf00d 2002-08-31 10:27 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c: Uses my_alloc 2002-08-31 10:26 kichik * /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: my_alloc 2002-08-31 10:25 kichik * /NSIS/trunk/Source/exehead/Ui.c: Back to pop-up menu, multiple languages soon. 2002-08-30 23:31 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Minor improvement to CTRL-C key test code but it's still shite. 2002-08-30 23:06 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Copy detail view contents on CTRL-C (removed the popup context menu approach since it wasn't language independent). This code sucks, please improve it :) 2002-08-30 21:41 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Changed GetCursorPos to GetMessagePos & removed TCHAR crap. Still needs either language support for the popup menu text, or conversion to work off CTRL-C instead. 2002-08-30 19:51 sunjammerx * /NSIS/trunk/Source/exehead/Ui.c: Adds "copy to clipboard" feature for DetailView (feature 590012) 2002-08-30 11:40 kichik * /NSIS/trunk/Examples/makensis.nsi: Start menu link to modern UI readme 2002-08-30 11:02 kichik * /NSIS/trunk/Examples/Modern UI/Readme.html: *** empty log message *** 2002-08-30 11:01 kichik * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe: No more caption in the loading setup dialogs 2002-08-29 19:48 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: Uninstall text in the UI macros 2002-08-29 16:44 kichik * /NSIS/trunk/Contrib/InstallOptions/test.nsi: Now points to the right DLL 2002-08-29 16:44 kichik * /NSIS/trunk/Source/script.cpp: CallInstDLL without /NOUNLOAD now works 2002-08-29 15:40 kichik * /NSIS/trunk/Examples/Modern UI/Readme.html: *** empty log message *** 2002-08-29 15:04 kichik * /NSIS/trunk/Examples/makensis.nsi: Install types descriptions back 2002-08-29 15:02 kichik * /NSIS/trunk/Source/exehead/Ui.c: Section on/off problems solved 2002-08-29 14:17 rainwater * /NSIS/trunk/Contrib/Makensisw/Readme.txt: New changes 2002-08-29 14:16 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Examples/makensis.nsi: Updated urls to point to sourceforge project home 2002-08-29 13:59 kichik * /NSIS/trunk/Examples/makensis.nsi: Description for NSIS source code 2002-08-29 13:53 kichik * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Contrib/UIs/modern2.exe, /NSIS/trunk/Contrib/UIs/modernsimple.exe, /NSIS/trunk/Examples/makensis.nsi: *** empty log message *** 2002-08-29 13:36 kichik * /NSIS/trunk/Examples/makensis.nsi: *** empty log message *** 2002-08-29 13:19 kichik * /NSIS/trunk/Contrib/UIs/modernsimple.exe: Optimized (no text) 2002-08-29 13:13 kichik * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi: *** empty log message *** 2002-08-29 12:41 kichik * /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: Font stuff fixed 2002-08-29 12:25 kichik * /NSIS/trunk/Source/exehead/Ui.c: Still 36.5KB :D 2002-08-29 12:24 kichik * /NSIS/trunk/Source/exehead/exec.c: CreateFont gives the right size now 2002-08-29 12:13 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Font size is not calculated correctly 2002-08-29 11:36 kichik * /NSIS/trunk/Contrib/Icons/yi-pixel-uninstall.ico: *** empty log message *** 2002-08-29 11:34 kichik * /NSIS/trunk/Source/exehead/Ui.c: Back to 36.5KB again 2002-08-29 11:27 kichik * /NSIS/trunk/Source/script.cpp: Plugin calls can now use /NOUNLOAD too 2002-08-29 10:48 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Font can be pushed 2002-08-29 10:31 kichik * /NSIS/trunk/Contrib/UIs/modern.exe, /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/ModernUI.nsh, /NSIS/trunk/Examples/Modern UI/MultiLanguage.nsi, /NSIS/trunk/Examples/Modern UI/Readme.html: *** empty log message *** 2002-08-29 10:25 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: CallInstDLL /NOUNLOAD added 2002-08-29 02:44 rainwater * /NSIS/trunk/Contrib/UIs/modernsimple.exe, /NSIS/trunk/Examples/makensis.nsi: more install gui changes 2002-08-29 02:32 rainwater * /NSIS/trunk/Examples/makensis.nsi: bg color of license is white 2002-08-29 02:18 rainwater * /NSIS/trunk/Examples/makensis.nsi: Minor install change 2002-08-29 02:08 rainwater * /NSIS/trunk/Contrib/UIs/modernsimple.exe: branding location change 2002-08-29 01:59 rainwater * /NSIS/trunk/Contrib/UIs/modernsimple.exe, /NSIS/trunk/Examples/makensis.nsi: Installer changes 2002-08-28 22:53 kichik * /NSIS/trunk/Contrib/LangDLL/resource.rc, /NSIS/trunk/Plugins/LangDLL.dll: Pretty :D 2002-08-28 22:49 kichik * /NSIS/trunk/Examples/languages.nsi: Typo fixed 2002-08-28 22:47 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Outputs the right language 2002-08-28 22:45 kichik * /NSIS/trunk/Examples/languages.nsi: Using the new DLL 2002-08-28 22:44 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Now really gives the right default language 2002-08-28 22:43 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Gives the right default language now 2002-08-28 22:38 kichik * /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Plugins/LangDLL.dll: Languages are inserted backward Language in language is selected automatically Dialog caption is no longer dialog :) 2002-08-28 22:35 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.c: $LANGUAGE too 2002-08-28 22:21 kichik * /NSIS/trunk/Contrib/LangDLL, /NSIS/trunk/Contrib/LangDLL/LangDLL.c, /NSIS/trunk/Contrib/LangDLL/LangDLL.dsp, /NSIS/trunk/Contrib/LangDLL/LangDLL.dsw, /NSIS/trunk/Contrib/LangDLL/resource.h, /NSIS/trunk/Contrib/LangDLL/resource.rc, /NSIS/trunk/Plugins/LangDLL.dll: *** empty log message *** 2002-08-28 21:28 kichik * /NSIS/trunk/Examples/languages.nsi: No more SetLanguage 2002-08-28 21:27 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h: $LANGUAGE problems fixed again 2002-08-28 21:13 kichik * /NSIS/trunk/Source/exehead/Ui.c: $LANGUAGE not set bug fixed 2002-08-28 20:45 kichik * /NSIS/trunk/Contrib/ExDLL/exdll.dsp: Now compiles into plugins 2002-08-28 20:35 kichik * /NSIS/trunk/Contrib/Language files/French.nlf: *** empty log message *** 2002-08-28 20:34 kichik * /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp: Compiles into plugins now 2002-08-28 20:17 kichik * /NSIS/trunk/Source/script.cpp: Normal margins for branding text 2002-08-28 20:16 kichik * /NSIS/trunk/Source/DialogTemplate.h: Trim now works as it should 2002-08-28 20:15 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: Trim now works like it should 2002-08-28 20:10 rainwater * /NSIS/trunk/Examples/makensis.nsi: trimright fix 2002-08-28 20:00 rainwater * /NSIS/trunk/Contrib/Icons/modern.bmp: wrong bitmap order 2002-08-28 19:55 rainwater * /NSIS/trunk/Examples/makensis.nsi: dirtext fix 2002-08-28 19:45 rainwater * /NSIS/trunk/Examples/makensis.nsi: new makensis installer 2002-08-28 19:42 rainwater * /NSIS/trunk/Contrib/UIs/modernsimple.exe: based of of joost' modern ui 2002-08-28 18:57 rainwater * /NSIS/trunk/Examples/makensis.nsi: plugins=bin 2002-08-28 18:39 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/Readme.txt: Updated makensisw 2002-08-28 18:35 kichik * /NSIS/trunk/Source/script.cpp: SetBrandingImage script message fixed 2002-08-28 18:28 rainwater * /NSIS/trunk/Examples/makensis.nsi: Plugins changes 2002-08-28 18:26 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Plugins, /NSIS/trunk/Plugins/InstallOptions.dll, /NSIS/trunk/Plugins/nsisdl.dll, /NSIS/trunk/Source/build.cpp: Moved plugins to Plugins\ directory 2002-08-28 17:44 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/utils.cpp: Added warnings to titlebar 2002-08-28 16:59 kichik * /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Removed SetLanguage (back to $LANGUAGE) 2002-08-28 16:57 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Removed SetLanguage (back to $LANGUAGE) 2002-08-28 16:02 kichik * /NSIS/trunk/Contrib/UIs/modern.exe: *** empty log message *** 2002-08-28 15:41 kichik * /NSIS/trunk/Source/script.cpp: Can now trim the branding text with no text given (will use the default English branding text to determine the text size) 2002-08-28 14:59 kichik * /NSIS/trunk/Source/script.cpp: Sub-sections can have a defined name now too Fixed a bug with macros at the end of the file 2002-08-28 14:58 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/tokens.cpp: Sub-sections can have a defined name now too 2002-08-28 14:58 kichik * /NSIS/trunk/Source/exehead/util.c: Space saving 2002-08-28 13:54 kichik * /NSIS/trunk/Contrib/Icons/yi-pixel.txt: *** empty log message *** 2002-08-28 13:54 kichik * /NSIS/trunk/Contrib/Icons/yi-pixel.ico: Smaller?\127 2002-08-28 13:38 kichik * /NSIS/trunk/Contrib/Icons/yi-pixel.ico, /NSIS/trunk/Contrib/Icons/yi-pixel.txt: *** empty log message *** 2002-08-28 11:55 rainwater * /NSIS/trunk/Contrib/Icons/modern.bmp: increased to 8 bit 2002-08-28 10:15 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf: *** empty log message *** 2002-08-28 10:09 kichik * /NSIS/trunk/Source/exehead/Ui.c: SetLanguage problems fixed 2002-08-28 10:08 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c: 0.5KB saving 2002-08-28 10:07 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: Trimming added 2002-08-28 10:07 kichik * /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: BrandingText control trimming option added 2002-08-28 10:06 kichik * /NSIS/trunk/Source/DialogTemplate.h: Trimming functions added 2002-08-28 02:31 rainwater * /NSIS/trunk/Contrib/Icons/modern.bmp: added xp style checkboxes 2002-08-27 18:34 rainwater * /NSIS/trunk/Examples/makensis.nsi: turn xp style on in makensis install 2002-08-26 18:24 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Beep changes 2002-08-26 18:20 kichik * /NSIS/trunk/Contrib/Makensisw/Readme.txt: h :) 2002-08-26 18:16 rainwater * /NSIS/trunk/Contrib/Makensisw/License.txt: license update 2002-08-26 18:08 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: System Beep addition 2002-08-26 18:07 kichik * /NSIS/trunk/Examples/makensis.nsi: MagicLime new version and docs 2002-08-26 17:52 rainwater * /NSIS/trunk/Contrib/Makensisw/makensisw.cpp: Added System Beep 2002-08-26 17:48 kichik * /NSIS/trunk/Contrib/MagicLime: *** empty log message *** 2002-08-26 16:56 kichik * /NSIS/trunk/Examples/makensis.nsi: Alpha 7 2002-08-26 16:52 kichik * /NSIS/trunk/Examples/Modern UI, /NSIS/trunk/Examples/Modern UI/Example.nsi, /NSIS/trunk/Examples/Modern UI/License.txt, /NSIS/trunk/Examples/Modern UI/Readme.html, /NSIS/trunk/Examples/Modern UI/Readme.png, /NSIS/trunk/Examples/Modern UI/Screenshot.png: *** empty log message *** 2002-08-26 16:09 kichik * /NSIS/trunk/Source/exehead/Ui.c: InstallColors /windows problems fixed 2002-08-26 16:06 kichik * /NSIS/trunk/Contrib/UIs/modern.exe: Show details button problems fixed 2002-08-26 15:38 kichik * /NSIS/trunk/Contrib/UIs/modern.exe: A few pixels here and there 2002-08-26 15:07 kichik * /NSIS/trunk/Examples/languages.nsi: *** empty log message *** 2002-08-26 14:05 kichik * /NSIS/trunk/Source/script.cpp: ChangeUI prints nicer error messages 2002-08-26 13:33 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Disabled UseOuterUIItem 2002-08-26 13:27 kichik * /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp: Added CancelShow (by ORTIM: 13-August 2002) Added pixel transformation for widgets (by ORTIM: 14-August-2002) 2002-08-26 13:27 kichik * /NSIS/trunk/Contrib/InstallOptions/Install Options.html: 1.3 docs 2002-08-26 11:23 kichik * /NSIS/trunk/Contrib/Icons/adni18-uninstall-C-no48xp.ico, /NSIS/trunk/Contrib/UIs/InstallShield.exe, /NSIS/trunk/Contrib/UIs/modern.exe: *** empty log message *** 2002-08-26 11:22 kichik * /NSIS/trunk/Contrib/Icons/adni18-installer-A.ico, /NSIS/trunk/Contrib/Icons/adni18-installer-B.ico, /NSIS/trunk/Contrib/Icons/adni18-installer-C.ico, /NSIS/trunk/Contrib/Icons/adni18-installer-C-no48xp.ico, /NSIS/trunk/Contrib/Icons/adni18-uninstall-A.ico, /NSIS/trunk/Contrib/Icons/adni18-uninstall-B.ico, /NSIS/trunk/Contrib/Icons/adni18-uninstall-C.ico, /NSIS/trunk/Contrib/Icons/adni-installer-A.ico, /NSIS/trunk/Contrib/Icons/adni-installer-B.ico, /NSIS/trunk/Contrib/Icons/adni-installer-C.ico, /NSIS/trunk/Contrib/Icons/adni-uninstall-A.ico, /NSIS/trunk/Contrib/Icons/adni-uninstall-B.ico, /NSIS/trunk/Contrib/Icons/adni-uninstall-C.ico, /NSIS/trunk/Contrib/Icons/andi-installer-A.ico, /NSIS/trunk/Contrib/Icons/andi-installer-B.ico, /NSIS/trunk/Contrib/Icons/andi-installer-C.ico, /NSIS/trunk/Contrib/Icons/andi-uninstall-A.ico, /NSIS/trunk/Contrib/Icons/andi-uninstall-B.ico, /NSIS/trunk/Contrib/Icons/andi-uninstall-C.ico, /NSIS/trunk/Contrib/UIs/InstallShield.exe: *** empty log message *** 2002-08-26 11:07 kichik * /NSIS/trunk/Contrib/Icons/checks4-aa.bmp: Anti-aliased version of checks4.bmp 2002-08-26 11:02 kichik * /NSIS/trunk/Contrib/Icons/adni-installer-A.ico, /NSIS/trunk/Contrib/Icons/adni-installer-B.ico, /NSIS/trunk/Contrib/Icons/adni-installer-C.ico, /NSIS/trunk/Contrib/Icons/adni-uninstall-A.ico, /NSIS/trunk/Contrib/Icons/adni-uninstall-B.ico, /NSIS/trunk/Contrib/Icons/adni-uninstall-C.ico: *** empty log message *** 2002-08-25 16:09 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Added SetLanguage ($LANGUAGE is no longer a variable) 2002-08-25 16:09 kichik * /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h: Added SetLanguage ($LANGUAGE is no longer a variable) Language can be set not only from .onInit Added .onMouseOverSection 2002-08-25 16:08 kichik * /NSIS/trunk/Source/exehead/fileform.h: Added SetLanguage ($LANGUAGE is no longer a variable) Added .onMouseOverSection 2002-08-25 16:06 kichik * /NSIS/trunk/Source/build.cpp: Added .onMouseOverSection 2002-08-25 16:05 kichik * /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added SetLanguage 2002-08-25 14:31 kichik * /NSIS/trunk/Contrib/Icons/andi-installer-A.ico, /NSIS/trunk/Contrib/Icons/andi-installer-B.ico, /NSIS/trunk/Contrib/Icons/andi-installer-C.ico, /NSIS/trunk/Contrib/Icons/andi-uninstall-A.ico, /NSIS/trunk/Contrib/Icons/andi-uninstall-B.ico, /NSIS/trunk/Contrib/Icons/andi-uninstall-C.ico: New icons by adni18 http://www.wincustomize.com/skins.asp?AuthorID=2663 2002-08-25 11:26 kichik * /NSIS/trunk/Source/exehead/Ui.c: update_status_text bug fixed 2002-08-25 10:53 kichik * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Added SetStaticBkColor 2002-08-25 10:52 kichik * /NSIS/trunk/Source/exehead/Ui.c: Replaced .onStaticBkColor with .onInitDialog No more threads conflicts 2002-08-25 10:49 kichik * /NSIS/trunk/Source/exehead/fileform.h: Replaced .onStaticBkColor with .onInitDialog Added SetStaticBkColor 2002-08-25 10:48 kichik * /NSIS/trunk/Source/build.cpp: Replaced .onStaticBkColor with .onInitDialog 2002-08-24 14:44 kichik * /NSIS/trunk/Source/exehead/Ui.c: Fixed some problems with the new background callback function Silent is working again 2002-08-24 14:42 kichik * /NSIS/trunk/Source/script.cpp: CopyFiles script message fixed (no longer always silent) 2002-08-23 08:20 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Custom install type text can now be changed 2002-08-22 22:47 kichik * /NSIS/trunk/Source/exehead/state.h: Better backward compatibility ($LANGUAGE is now last in the user variables array) 2002-08-22 22:46 kichik * /NSIS/trunk/Source/makenssi.cpp: alpha 7 2002-08-22 22:11 kichik * /NSIS/trunk/Contrib/UIs/default.exe: ChangeUI can now change IDD_VERIFY 2002-08-22 22:09 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Better backward compatibility ($LANGUAGE is now last in the user variables array) 2002-08-22 21:53 kichik * /NSIS/trunk/Source/script.cpp: ChangeUI can now change IDD_VERIFY 2002-08-22 21:06 kichik * /NSIS/trunk/Source/exehead/Ui.c: Default license color now fits the user system 2002-08-22 21:06 kichik * /NSIS/trunk/Source/build.cpp: Default license color now fits the user system Now reports the right number of required sections 2002-08-22 15:55 kichik * /NSIS/trunk/Source/exehead/Ui.c: Language can now really be selected from .onInit 2002-08-22 09:37 kichik * /NSIS/trunk/Source/exehead/util.c: Fixed a bug that gave SMPROGRAMS, SMSTARTUP, DESKTOP and STARTMENU to have wrong values. 2002-08-21 21:23 kichik * /NSIS/trunk/Source/exehead/Ui.c: Clearing background problem with custom background color (.onStaticCtlBkColor) 2002-08-21 20:41 kichik * /NSIS/trunk/Source/exehead/Ui.c: Now uses the default language in .onInit 2002-08-21 19:45 kichik * /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c: Fixed a bug that gave EXEDIR, CMDLINE and others wrong values 2002-08-21 19:44 kichik * /NSIS/trunk/Contrib/Language files/TradChinese.nlf: no message 2002-08-21 19:16 kichik * /NSIS/trunk/Source/exehead/util.c: Language can be choosen from .onInit 2002-08-21 19:15 kichik * /NSIS/trunk/Source/exehead/Ui.c: Language can be choosen from .onInit Added .onStaticCtlBkColor and un.onStaticCtlBkColor Fixed a bug that caused RTF not to show on Windows 9x 2002-08-21 19:11 kichik * /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: Replaced SetDlgItemText by GetDlgItem Added CreateFont 2002-08-21 19:10 kichik * /NSIS/trunk/Source/exehead/state.h: Language can be choosen from .onInit 2002-08-21 19:09 kichik * /NSIS/trunk/Source/script.cpp: Language can be choosen from .onInit Replaced SetDlgItemText by GetDlgItem Added CreateFont Checkbox is only required in IDD_DIR if logging is enabled Not specifying any language now really causes the script compiler to use the last used language Fixed a bug with MBCS and the uninstaller text 2002-08-21 19:05 kichik * /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c: Added a dialog that shows up if compress whole is used and initial uncompressing lasts longer than a second. 2002-08-21 19:03 kichik * /NSIS/trunk/Source/lang.cpp: Not specifying any language now really causes the script compiler to use the last used language 2002-08-21 19:02 kichik * /NSIS/trunk/Source/exehead/fileform.h: Replaced SetDlgItemText by GetDlgItem Added .onStaticCtlBkColor and un.onStaticCtlBkColor Added CreateFont 2002-08-21 17:23 kichik * /NSIS/trunk/Source/exehead/fileform.c: Added a dialog that shows up if compress whole is used and initial uncompressing lasts longer than a second. 2002-08-21 16:36 kichik * /NSIS/trunk/Source/exehead/exec.c: Replaced SetDlgItemText by GetDlgItem SendMessage WM_SETTEXT treats lParam as a string Added CreateFont 2002-08-21 16:33 kichik * /NSIS/trunk/Contrib/Language files/English.nlf: Added a comment saying you should put your name in the translation 2002-08-21 16:32 kichik * /NSIS/trunk/Source/exehead/config.h: Added a dialog that shows up if compress whole is used and initial uncompressing lasts longer than a second. 2002-08-21 16:31 kichik * /NSIS/trunk/Source/build.h: Typo fixed 2002-08-21 16:23 kichik * /NSIS/trunk/Source/build.cpp: Language can be choosen from .onInit Added .onStaticCtlBkColor and un.onStaticCtlBkColor Type fixed 2002-08-21 16:21 kichik * /NSIS/trunk/Source/exehead/bgbg.c: Language can be choosen from .onInit 2002-08-20 12:03 kichik * /NSIS/trunk/Contrib/Language files/Russian.nlf: no message 2002-08-19 23:39 eccles * /NSIS/trunk/Source/exehead/util.c: SetShellVarContext all - was failing to fall back to current user Optimised this a little too 2002-08-19 23:18 eccles * /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/ZLIB.H: Instant saving of 0.5K - use of stdcall calling convention to reduce code overhead associated with managing the stack 2002-08-19 21:24 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Small space-saving optimisations 2002-08-17 00:15 eccles * /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp: Problem with previous version, investigating an alternative. 2002-08-16 21:00 eccles * /NSIS/trunk/Source/zlib/INFLATE.C: no message 2002-08-16 20:50 eccles * /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp: instant saving of almost 0.5K! (calling convention 'cdecl' => 'stdcall') 2002-08-16 09:36 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/ResourceEditor.cpp: Unicode to MBCS conversion bugs fixed 2002-08-16 09:06 kichik * /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/ResourceEditor.cpp: MBCS to Unicode conversion bugs fixed 2002-08-11 18:58 eccles * /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/exehead/bgbg.c: Small space-saving optimisation 2002-08-11 18:57 eccles * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp: Changes to format of strings tables 2002-08-11 18:56 eccles * /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Implemented a method where LANG_* strings can be referenced by constant id's - reducing code overhead associated with looking up the global strings variables. Kind of. Just compare the assembly output... 2002-08-11 10:41 kichik * /NSIS/trunk/Contrib/Language files/Swedish.nlf: no message 2002-08-10 16:31 kichik * /NSIS/trunk/Contrib/Language files/Korean.nlf: Korean translation by dTomoyo 2002-08-10 09:49 kichik * /NSIS/trunk/Contrib/Language files/Dutch.nlf: no message 2002-08-10 09:40 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/util.c: No more compile errors without NSIS_CONFIG_PLUGIN_SUPPORT 2002-08-10 09:39 kichik * /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c: No more compile errors without NSIS_CONFIG_PLUGIN_SUPPORT 2002-08-10 09:32 kichik * /NSIS/trunk/Examples/one-section.nsi: Updated version. Windows line breaks and fixed a small bug. 2002-08-09 22:12 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp: - Plug-in command can now come in any order in the script - Second plug-in DLL doesn't produce errors anymore - Infinite loop bug fixed (again) 2002-08-09 18:59 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/script.cpp: Fixed a bug that caused the second plug-in DLL not to get extracted 2002-08-09 15:34 kichik * /NSIS/trunk/Examples/makensis.nsi: Contrib is on its own now 2002-08-09 15:26 kichik * /NSIS/trunk/Source/exehead/exec.c: Fixed a bug with the uninstaller creation 2002-08-09 14:31 kichik * /NSIS/trunk/Source/makenssi.dsp: no more warnings 2002-08-09 14:21 kichik * /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h: Back to 37KB 2002-08-09 13:00 kichik * /NSIS/trunk/Examples/one-section.nsi: Now works when you select a selected section 2002-08-08 21:14 kichik * /NSIS/trunk/Source/DialogTemplate.h: Compiles without Platform SDK 2002-08-08 19:41 kichik * /NSIS/trunk/Source/exehead/Ui.c: Transparent static controls 2002-08-08 17:02 rainwater * /NSIS/trunk/Source/exehead/Main.c: removed delete messagebox 2002-08-08 16:35 kichik * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp: Sunjammer's code is now fully optimized 2002-08-08 15:05 kichik * /NSIS/trunk/Source/exehead/dllpaths.c, /NSIS/trunk/Source/exehead/dllpaths.h: no need 2002-08-08 15:04 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/script.cpp: Improved Sunjammer's code 2002-08-08 10:21 kichik * /NSIS/trunk/Examples/makensis.nsi: Added one-section.nsi example file 2002-08-08 10:20 kichik * /NSIS/trunk/Examples/one-section.nsi: no message 2002-08-08 09:53 kichik * /NSIS/trunk/Source/exehead/Ui.c: Infinite loop bug fixed 2002-08-08 09:52 kichik * /NSIS/trunk/Source/ResourceEditor.h: Compiles without Platform SDK 2002-08-07 21:55 kichik * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/Plugins.cpp: Sunjammer's plug-in feature optimized a bit. Still some work is done in the installer it self, but I am currently working on it 2002-08-07 18:12 kichik * /NSIS/trunk/Source/exehead/exec.c: no message 2002-08-07 17:14 kichik * /NSIS/trunk/Contrib/UIs/default.exe: Supports new ChangeUI 2002-08-07 17:13 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf: grammer fixed 2002-08-07 15:36 kichik * /NSIS/trunk/Source/exehead/Ui.c: If default user language does fit exactly, will try to find primary language match. 2002-08-07 15:14 kichik * /NSIS/trunk/Contrib/Language files/Spanish.nlf, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: ChangeUI can change any dialog. Added UseOuterUIItem 2002-08-06 11:24 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Contrib/Language files/French.nlf, /NSIS/trunk/Contrib/Language files/German.nlf, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h: Fixed some string replacements and that FileErrorText bug. ChangeUI now supports changing dialogs other than IDD_INST. 2002-08-05 22:29 kichik * /NSIS/trunk/Contrib/MagicLime, /NSIS/trunk/Contrib/MagicLime/splash.c: no message 2002-08-05 21:09 kichik * /NSIS/trunk/Source/exehead/Ui.c: Can now add lines to install log window from an external DLL without problems. 2002-08-05 20:40 sunjammerx * /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/script.cpp: Implemented :: syntax to specify which dll contains the comamd to run (in cases where more than one dll has the same command, OR the command is the same name as a built-in command) 2002-08-05 19:38 sunjammerx * /NSIS/trunk/Source/makenssi.dsp: - Renamed ExternalCommands.cpp & h to Plugin.cpp & h 2002-08-05 19:13 sunjammerx * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/ExternalCommands.cpp, /NSIS/trunk/Source/ExternalCommands.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/Plugins.cpp, /NSIS/trunk/Source/Plugins.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: - Fixed a bug in the dll export scanner (spotted and cured by CodeSquid) - Fixed a bug in the installer runtime (spotted by CodeSquid) - Renamed all usage of ExternalCommand to Plugin - Added a compile time PluginDir command 2002-08-05 14:31 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/ResourceEditor.h: Compiles without Platform SDK 2002-08-05 14:11 kichik * /NSIS/trunk/Contrib/Language files/German.nlf: by SmartyMan 2002-08-05 13:55 kichik * /NSIS/trunk/Examples/makensis.nsi: no message 2002-08-05 13:52 kichik * /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp: small bug fixes 2002-08-05 02:05 sunjammerx * /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/dllpaths.c, /NSIS/trunk/Source/exehead/dllpaths.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/ExternalCommands.cpp, /NSIS/trunk/Source/ExternalCommands.h, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.h: Added automatic use of dll commands (see config.h for more details) 2002-08-04 21:24 kichik * /NSIS/trunk/Source/exehead/exec.c: nothing new, cvs just assumes so... 2002-08-04 21:22 kichik * /NSIS/trunk/Source/makenssi.cpp: version updated 2002-08-04 21:22 kichik * /NSIS/trunk/Source/exehead/util.c: damn p... 2002-08-04 20:29 kichik * /NSIS/trunk/Contrib/Language files/French.nlf: no message 2002-08-04 20:25 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp: Full multilingual support! 2002-08-04 19:49 sunjammerx * /NSIS/trunk/Source/makenssi.cpp: Added KiCHiK (Amir Szekely) to the list of contributors output when makensis.exe runs. 2002-08-03 23:06 kichik * /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/lang.cpp, /NSIS/trunk/Source/lang.h, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/script.cpp: no message 2002-08-03 17:47 kichik * /NSIS/trunk/Source/exehead/Ui.c: Now compiles on Windows older than Win2000 too 2002-08-03 17:47 kichik * /NSIS/trunk/Source/nlf.cpp, /NSIS/trunk/Source/nlf.h: no message 2002-08-03 12:14 kichik * /NSIS/trunk/Source/nlf.cpp: no message 2002-08-02 20:11 kichik * /NSIS/trunk/Source/nlf.cpp, /NSIS/trunk/Source/nlf.h, /NSIS/trunk/Source/script.cpp: no message 2002-08-02 18:37 kichik * /NSIS/trunk/Source/nlf.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h: no message 2002-08-02 17:56 rainwater * /NSIS/trunk/Examples/bigtest.nsi: Added the XPStyle on option for the "bigtest". 2002-08-02 16:52 kichik * /NSIS/trunk/Source/exehead/resource.rc: Saved 8 bytes 2002-08-02 16:51 kichik * /NSIS/trunk/Contrib/Language files, /NSIS/trunk/Contrib/Language files/English.nlf, /NSIS/trunk/Source/build.cpp: no message 2002-08-02 15:29 kichik * /NSIS/trunk/Source/DialogTemplate.cpp: Fixed a bug with ChangeUI and no branding image 2002-08-02 13:31 rainwater * /NSIS/trunk/Source/makenssi.ncb, /NSIS/trunk/Source/makenssi.opt, /NSIS/trunk/Source/makenssi.plg, /NSIS/trunk/Source/Release: Removed temp files 2002-08-02 12:45 kichik * /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/makenssi.opt, /NSIS/trunk/Source/makenssi.plg: no message 2002-08-02 10:01 * /NSIS/tags/alpha2, /NSIS/tags/alpha2/Source/makenssi.cpp: This commit was manufactured by cvs2svn to create tag 'alpha2'. 2002-08-02 10:01 kichik * /NSIS/trunk/Contrib, /NSIS/trunk/Contrib/ExDLL, /NSIS/trunk/Contrib/ExDLL/exdll.c, /NSIS/trunk/Contrib/ExDLL/exdll.dpr, /NSIS/trunk/Contrib/ExDLL/exdll.dsp, /NSIS/trunk/Contrib/ExDLL/exdll.dsw, /NSIS/trunk/Contrib/Icons, /NSIS/trunk/Contrib/Icons/checks1.bmp, /NSIS/trunk/Contrib/Icons/checks2.bmp, /NSIS/trunk/Contrib/Icons/checks4.bmp, /NSIS/trunk/Contrib/Icons/checksX.bmp, /NSIS/trunk/Contrib/Icons/checksX2.bmp, /NSIS/trunk/Contrib/Icons/jarsonic-checks.bmp, /NSIS/trunk/Contrib/Icons/lucas-checks.bmp, /NSIS/trunk/Contrib/Icons/normal-install.ico, /NSIS/trunk/Contrib/Icons/normal-uninstall.ico, /NSIS/trunk/Contrib/Icons/setup.ico, /NSIS/trunk/Contrib/InstallOptions, /NSIS/trunk/Contrib/InstallOptions/Install Options.html, /NSIS/trunk/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/trunk/Contrib/InstallOptions/io.dsp, /NSIS/trunk/Contrib/InstallOptions/io.dsw, /NSIS/trunk/Contrib/InstallOptions/ioptdll.rc, /NSIS/trunk/Contrib/InstallOptions/resource.h, /NSIS/trunk/Contrib/InstallOptions/test.ini, /NSIS/trunk/Contrib/InstallOptions/test.nsi, /NSIS/trunk/Contrib/Makensisw, /NSIS/trunk/Contrib/Makensisw/afxres.h, /NSIS/trunk/Contrib/Makensisw/License.txt, /NSIS/trunk/Contrib/Makensisw/makensisw.cpp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsp, /NSIS/trunk/Contrib/Makensisw/makensisw.dsw, /NSIS/trunk/Contrib/Makensisw/makensisw.h, /NSIS/trunk/Contrib/Makensisw/makensisw.xml, /NSIS/trunk/Contrib/Makensisw/noclib.cpp, /NSIS/trunk/Contrib/Makensisw/noclib.h, /NSIS/trunk/Contrib/Makensisw/Readme.txt, /NSIS/trunk/Contrib/Makensisw/resource.h, /NSIS/trunk/Contrib/Makensisw/resource.rc, /NSIS/trunk/Contrib/Makensisw/utils.cpp, /NSIS/trunk/Contrib/Makensisw/utils.h, /NSIS/trunk/Contrib/Makensisw/version.cpp, /NSIS/trunk/Contrib/NSISdl, /NSIS/trunk/Contrib/NSISdl/asyncdns.cpp, /NSIS/trunk/Contrib/NSISdl/asyncdns.h, /NSIS/trunk/Contrib/NSISdl/connection.cpp, /NSIS/trunk/Contrib/NSISdl/connection.h, /NSIS/trunk/Contrib/NSISdl/httpget.cpp, /NSIS/trunk/Contrib/NSISdl/httpget.h, /NSIS/trunk/Contrib/NSISdl/netinc.h, /NSIS/trunk/Contrib/NSISdl/nsisdl.cpp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsp, /NSIS/trunk/Contrib/NSISdl/nsisdl.dsw, /NSIS/trunk/Contrib/NSISdl/ReadMe.txt, /NSIS/trunk/Contrib/NSISdl/resource.h, /NSIS/trunk/Contrib/NSISdl/Script1.rc, /NSIS/trunk/Contrib/NSISdl/util.cpp, /NSIS/trunk/Contrib/NSISdl/util.h, /NSIS/trunk/Contrib/Splash, /NSIS/trunk/Contrib/Splash/splash.c, /NSIS/trunk/Contrib/Splash/splash.dsp, /NSIS/trunk/Contrib/Splash/splash.dsw, /NSIS/trunk/Contrib/Splash/splash.txt, /NSIS/trunk/Contrib/UIs, /NSIS/trunk/Contrib/UIs/default.exe, /NSIS/trunk/Contrib/UIs/mlbl.exe, /NSIS/trunk/Contrib/UIs/mlbl2.exe, /NSIS/trunk/Contrib/zip2exe, /NSIS/trunk/Contrib/zip2exe/icon.ico, /NSIS/trunk/Contrib/zip2exe/main.cpp, /NSIS/trunk/Contrib/zip2exe/res.rc, /NSIS/trunk/Contrib/zip2exe/resource.h, /NSIS/trunk/Contrib/zip2exe/zip2exe.dsp, /NSIS/trunk/Contrib/zip2exe/zip2exe.dsw, /NSIS/trunk/Contrib/zip2exe/zlib, /NSIS/trunk/Contrib/zip2exe/zlib/ADLER32.C, /NSIS/trunk/Contrib/zip2exe/zlib/CRC32.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFBLOCK.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFBLOCK.H, /NSIS/trunk/Contrib/zip2exe/zlib/INFCODES.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFCODES.H, /NSIS/trunk/Contrib/zip2exe/zlib/INFFAST.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFFAST.H, /NSIS/trunk/Contrib/zip2exe/zlib/INFFIXED.H, /NSIS/trunk/Contrib/zip2exe/zlib/INFLATE.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFTREES.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFTREES.H, /NSIS/trunk/Contrib/zip2exe/zlib/INFUTIL.C, /NSIS/trunk/Contrib/zip2exe/zlib/INFUTIL.H, /NSIS/trunk/Contrib/zip2exe/zlib/Unzip.c, /NSIS/trunk/Contrib/zip2exe/zlib/UNZIP.H, /NSIS/trunk/Contrib/zip2exe/zlib/ZCONF.H, /NSIS/trunk/Contrib/zip2exe/zlib/ZLIB.H, /NSIS/trunk/Contrib/zip2exe/zlib/Zutil.c, /NSIS/trunk/Contrib/zip2exe/zlib/ZUTIL.H, /NSIS/trunk/Examples, /NSIS/trunk/Examples/bigtest.nsi, /NSIS/trunk/Examples/branding.nsh, /NSIS/trunk/Examples/example1.nsi, /NSIS/trunk/Examples/example2.nsi, /NSIS/trunk/Examples/functions.htm, /NSIS/trunk/Examples/gfx.nsi, /NSIS/trunk/Examples/makensis.nsi, /NSIS/trunk/Examples/primes.nsi, /NSIS/trunk/Examples/rtest.nsi, /NSIS/trunk/Examples/viewhtml.nsi, /NSIS/trunk/Examples/waplugin.nsi, /NSIS/trunk/Examples/WinMessages.NSH, /NSIS/trunk/Source, /NSIS/trunk/Source/afxres.h, /NSIS/trunk/Source/build.cpp, /NSIS/trunk/Source/build.h, /NSIS/trunk/Source/bzip2, /NSIS/trunk/Source/bzip2/blocksort.c, /NSIS/trunk/Source/bzip2/bzlib.c, /NSIS/trunk/Source/bzip2/bzlib.h, /NSIS/trunk/Source/bzip2/bzlib_private.h, /NSIS/trunk/Source/bzip2/compress.c, /NSIS/trunk/Source/bzip2/decompress.c, /NSIS/trunk/Source/bzip2/huffman.c, /NSIS/trunk/Source/bzip2/randtable.c, /NSIS/trunk/Source/cbzip2.h, /NSIS/trunk/Source/compressor.h, /NSIS/trunk/Source/crc32.c, /NSIS/trunk/Source/czlib.h, /NSIS/trunk/Source/DialogTemplate.cpp, /NSIS/trunk/Source/DialogTemplate.h, /NSIS/trunk/Source/exedata.cpp, /NSIS/trunk/Source/exedata.h, /NSIS/trunk/Source/exehead, /NSIS/trunk/Source/exehead/afxres.h, /NSIS/trunk/Source/exehead/bgbg.c, /NSIS/trunk/Source/exehead/bin2h.c, /NSIS/trunk/Source/exehead/bin2h.exe, /NSIS/trunk/Source/exehead/bitmap1.bmp, /NSIS/trunk/Source/exehead/config.h, /NSIS/trunk/Source/exehead/exec.c, /NSIS/trunk/Source/exehead/exec.h, /NSIS/trunk/Source/exehead/exehead.xml, /NSIS/trunk/Source/exehead/exehead-bzip2.dsp, /NSIS/trunk/Source/exehead/exehead-zlib.dsp, /NSIS/trunk/Source/exehead/fileform.c, /NSIS/trunk/Source/exehead/fileform.h, /NSIS/trunk/Source/exehead/lang.h, /NSIS/trunk/Source/exehead/Main.c, /NSIS/trunk/Source/exehead/Makefile, /NSIS/trunk/Source/exehead/nsis.ico, /NSIS/trunk/Source/exehead/resource.h, /NSIS/trunk/Source/exehead/resource.rc, /NSIS/trunk/Source/exehead/state.h, /NSIS/trunk/Source/exehead/Ui.c, /NSIS/trunk/Source/exehead/ui.h, /NSIS/trunk/Source/exehead/uninst.ico, /NSIS/trunk/Source/exehead/util.c, /NSIS/trunk/Source/exehead/util.h, /NSIS/trunk/Source/icon.ico, /NSIS/trunk/Source/lineparse.h, /NSIS/trunk/Source/Makefile, /NSIS/trunk/Source/makenssi.cpp, /NSIS/trunk/Source/makenssi.dsp, /NSIS/trunk/Source/makenssi.dsw, /NSIS/trunk/Source/makenssi.ncb, /NSIS/trunk/Source/makenssi.opt, /NSIS/trunk/Source/makenssi.plg, /NSIS/trunk/Source/Release, /NSIS/trunk/Source/Release/Script1.res, /NSIS/trunk/Source/Release/vc60.idb, /NSIS/trunk/Source/resource.h, /NSIS/trunk/Source/ResourceEditor.cpp, /NSIS/trunk/Source/ResourceEditor.h, /NSIS/trunk/Source/script.cpp, /NSIS/trunk/Source/Script1.rc, /NSIS/trunk/Source/strlist.h, /NSIS/trunk/Source/tokens.cpp, /NSIS/trunk/Source/tokens.h, /NSIS/trunk/Source/util.cpp, /NSIS/trunk/Source/util.h, /NSIS/trunk/Source/zlib, /NSIS/trunk/Source/zlib/deflate.c, /NSIS/trunk/Source/zlib/DEFLATE.H, /NSIS/trunk/Source/zlib/INFBLOCK.C, /NSIS/trunk/Source/zlib/INFBLOCK.H, /NSIS/trunk/Source/zlib/INFCODES.C, /NSIS/trunk/Source/zlib/INFCODES.H, /NSIS/trunk/Source/zlib/INFLATE.C, /NSIS/trunk/Source/zlib/INFTREES.C, /NSIS/trunk/Source/zlib/INFTREES.H, /NSIS/trunk/Source/zlib/INFUTIL.C, /NSIS/trunk/Source/zlib/INFUTIL.H, /NSIS/trunk/Source/zlib/trees.c, /NSIS/trunk/Source/zlib/ZCONF.H, /NSIS/trunk/Source/zlib/ZLIB.H, /NSIS/trunk/Source/zlib/ZUTIL.H: This commit was generated by cvs2svn to compensate for changes in r2, which included commits to RCS files with non-trunk default branches. 2002-08-02 10:01 kichik * /NSIS/branches/kichik, /NSIS/branches/kichik/Contrib, /NSIS/branches/kichik/Contrib/ExDLL, /NSIS/branches/kichik/Contrib/ExDLL/exdll.c, /NSIS/branches/kichik/Contrib/ExDLL/exdll.dpr, /NSIS/branches/kichik/Contrib/ExDLL/exdll.dsp, /NSIS/branches/kichik/Contrib/ExDLL/exdll.dsw, /NSIS/branches/kichik/Contrib/Icons, /NSIS/branches/kichik/Contrib/Icons/checks1.bmp, /NSIS/branches/kichik/Contrib/Icons/checks2.bmp, /NSIS/branches/kichik/Contrib/Icons/checks4.bmp, /NSIS/branches/kichik/Contrib/Icons/checksX.bmp, /NSIS/branches/kichik/Contrib/Icons/checksX2.bmp, /NSIS/branches/kichik/Contrib/Icons/jarsonic-checks.bmp, /NSIS/branches/kichik/Contrib/Icons/lucas-checks.bmp, /NSIS/branches/kichik/Contrib/Icons/normal-install.ico, /NSIS/branches/kichik/Contrib/Icons/normal-uninstall.ico, /NSIS/branches/kichik/Contrib/Icons/setup.ico, /NSIS/branches/kichik/Contrib/InstallOptions, /NSIS/branches/kichik/Contrib/InstallOptions/Install Options.html, /NSIS/branches/kichik/Contrib/InstallOptions/InstallerOptions.cpp, /NSIS/branches/kichik/Contrib/InstallOptions/io.dsp, /NSIS/branches/kichik/Contrib/InstallOptions/io.dsw, /NSIS/branches/kichik/Contrib/InstallOptions/ioptdll.rc, /NSIS/branches/kichik/Contrib/InstallOptions/resource.h, /NSIS/branches/kichik/Contrib/InstallOptions/test.ini, /NSIS/branches/kichik/Contrib/InstallOptions/test.nsi, /NSIS/branches/kichik/Contrib/Makensisw, /NSIS/branches/kichik/Contrib/Makensisw/afxres.h, /NSIS/branches/kichik/Contrib/Makensisw/License.txt, /NSIS/branches/kichik/Contrib/Makensisw/makensisw.cpp, /NSIS/branches/kichik/Contrib/Makensisw/makensisw.dsp, /NSIS/branches/kichik/Contrib/Makensisw/makensisw.dsw, /NSIS/branches/kichik/Contrib/Makensisw/makensisw.h, /NSIS/branches/kichik/Contrib/Makensisw/makensisw.xml, /NSIS/branches/kichik/Contrib/Makensisw/noclib.cpp, /NSIS/branches/kichik/Contrib/Makensisw/noclib.h, /NSIS/branches/kichik/Contrib/Makensisw/Readme.txt, /NSIS/branches/kichik/Contrib/Makensisw/resource.h, /NSIS/branches/kichik/Contrib/Makensisw/resource.rc, /NSIS/branches/kichik/Contrib/Makensisw/utils.cpp, /NSIS/branches/kichik/Contrib/Makensisw/utils.h, /NSIS/branches/kichik/Contrib/Makensisw/version.cpp, /NSIS/branches/kichik/Contrib/NSISdl, /NSIS/branches/kichik/Contrib/NSISdl/asyncdns.cpp, /NSIS/branches/kichik/Contrib/NSISdl/asyncdns.h, /NSIS/branches/kichik/Contrib/NSISdl/connection.cpp, /NSIS/branches/kichik/Contrib/NSISdl/connection.h, /NSIS/branches/kichik/Contrib/NSISdl/httpget.cpp, /NSIS/branches/kichik/Contrib/NSISdl/httpget.h, /NSIS/branches/kichik/Contrib/NSISdl/netinc.h, /NSIS/branches/kichik/Contrib/NSISdl/nsisdl.cpp, /NSIS/branches/kichik/Contrib/NSISdl/nsisdl.dsp, /NSIS/branches/kichik/Contrib/NSISdl/nsisdl.dsw, /NSIS/branches/kichik/Contrib/NSISdl/ReadMe.txt, /NSIS/branches/kichik/Contrib/NSISdl/resource.h, /NSIS/branches/kichik/Contrib/NSISdl/Script1.rc, /NSIS/branches/kichik/Contrib/NSISdl/util.cpp, /NSIS/branches/kichik/Contrib/NSISdl/util.h, /NSIS/branches/kichik/Contrib/Splash, /NSIS/branches/kichik/Contrib/Splash/splash.c, /NSIS/branches/kichik/Contrib/Splash/splash.dsp, /NSIS/branches/kichik/Contrib/Splash/splash.dsw, /NSIS/branches/kichik/Contrib/Splash/splash.txt, /NSIS/branches/kichik/Contrib/UIs, /NSIS/branches/kichik/Contrib/UIs/default.exe, /NSIS/branches/kichik/Contrib/UIs/mlbl.exe, /NSIS/branches/kichik/Contrib/UIs/mlbl2.exe, /NSIS/branches/kichik/Contrib/zip2exe, /NSIS/branches/kichik/Contrib/zip2exe/icon.ico, /NSIS/branches/kichik/Contrib/zip2exe/main.cpp, /NSIS/branches/kichik/Contrib/zip2exe/res.rc, /NSIS/branches/kichik/Contrib/zip2exe/resource.h, /NSIS/branches/kichik/Contrib/zip2exe/zip2exe.dsp, /NSIS/branches/kichik/Contrib/zip2exe/zip2exe.dsw, /NSIS/branches/kichik/Contrib/zip2exe/zlib, /NSIS/branches/kichik/Contrib/zip2exe/zlib/ADLER32.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/CRC32.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFBLOCK.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFBLOCK.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFCODES.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFCODES.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFFAST.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFFAST.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFFIXED.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFLATE.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFTREES.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFTREES.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFUTIL.C, /NSIS/branches/kichik/Contrib/zip2exe/zlib/INFUTIL.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/Unzip.c, /NSIS/branches/kichik/Contrib/zip2exe/zlib/UNZIP.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/ZCONF.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/ZLIB.H, /NSIS/branches/kichik/Contrib/zip2exe/zlib/Zutil.c, /NSIS/branches/kichik/Contrib/zip2exe/zlib/ZUTIL.H, /NSIS/branches/kichik/Examples, /NSIS/branches/kichik/Examples/bigtest.nsi, /NSIS/branches/kichik/Examples/branding.nsh, /NSIS/branches/kichik/Examples/example1.nsi, /NSIS/branches/kichik/Examples/example2.nsi, /NSIS/branches/kichik/Examples/functions.htm, /NSIS/branches/kichik/Examples/gfx.nsi, /NSIS/branches/kichik/Examples/makensis.nsi, /NSIS/branches/kichik/Examples/primes.nsi, /NSIS/branches/kichik/Examples/rtest.nsi, /NSIS/branches/kichik/Examples/viewhtml.nsi, /NSIS/branches/kichik/Examples/waplugin.nsi, /NSIS/branches/kichik/Examples/WinMessages.NSH, /NSIS/branches/kichik/Source, /NSIS/branches/kichik/Source/afxres.h, /NSIS/branches/kichik/Source/build.cpp, /NSIS/branches/kichik/Source/build.h, /NSIS/branches/kichik/Source/bzip2, /NSIS/branches/kichik/Source/bzip2/blocksort.c, /NSIS/branches/kichik/Source/bzip2/bzlib.c, /NSIS/branches/kichik/Source/bzip2/bzlib.h, /NSIS/branches/kichik/Source/bzip2/bzlib_private.h, /NSIS/branches/kichik/Source/bzip2/compress.c, /NSIS/branches/kichik/Source/bzip2/decompress.c, /NSIS/branches/kichik/Source/bzip2/huffman.c, /NSIS/branches/kichik/Source/bzip2/randtable.c, /NSIS/branches/kichik/Source/cbzip2.h, /NSIS/branches/kichik/Source/compressor.h, /NSIS/branches/kichik/Source/crc32.c, /NSIS/branches/kichik/Source/czlib.h, /NSIS/branches/kichik/Source/DialogTemplate.cpp, /NSIS/branches/kichik/Source/DialogTemplate.h, /NSIS/branches/kichik/Source/exedata.cpp, /NSIS/branches/kichik/Source/exedata.h, /NSIS/branches/kichik/Source/exehead, /NSIS/branches/kichik/Source/exehead/afxres.h, /NSIS/branches/kichik/Source/exehead/bgbg.c, /NSIS/branches/kichik/Source/exehead/bin2h.c, /NSIS/branches/kichik/Source/exehead/bin2h.exe, /NSIS/branches/kichik/Source/exehead/bitmap1.bmp, /NSIS/branches/kichik/Source/exehead/config.h, /NSIS/branches/kichik/Source/exehead/exec.c, /NSIS/branches/kichik/Source/exehead/exec.h, /NSIS/branches/kichik/Source/exehead/exehead.xml, /NSIS/branches/kichik/Source/exehead/exehead-bzip2.dsp, /NSIS/branches/kichik/Source/exehead/exehead-zlib.dsp, /NSIS/branches/kichik/Source/exehead/fileform.c, /NSIS/branches/kichik/Source/exehead/fileform.h, /NSIS/branches/kichik/Source/exehead/lang.h, /NSIS/branches/kichik/Source/exehead/Main.c, /NSIS/branches/kichik/Source/exehead/Makefile, /NSIS/branches/kichik/Source/exehead/nsis.ico, /NSIS/branches/kichik/Source/exehead/resource.h, /NSIS/branches/kichik/Source/exehead/resource.rc, /NSIS/branches/kichik/Source/exehead/state.h, /NSIS/branches/kichik/Source/exehead/Ui.c, /NSIS/branches/kichik/Source/exehead/ui.h, /NSIS/branches/kichik/Source/exehead/uninst.ico, /NSIS/branches/kichik/Source/exehead/util.c, /NSIS/branches/kichik/Source/exehead/util.h, /NSIS/branches/kichik/Source/icon.ico, /NSIS/branches/kichik/Source/lineparse.h, /NSIS/branches/kichik/Source/Makefile, /NSIS/branches/kichik/Source/makenssi.cpp, /NSIS/branches/kichik/Source/makenssi.dsp, /NSIS/branches/kichik/Source/makenssi.dsw, /NSIS/branches/kichik/Source/makenssi.ncb, /NSIS/branches/kichik/Source/makenssi.opt, /NSIS/branches/kichik/Source/makenssi.plg, /NSIS/branches/kichik/Source/Release, /NSIS/branches/kichik/Source/Release/Script1.res, /NSIS/branches/kichik/Source/Release/vc60.idb, /NSIS/branches/kichik/Source/resource.h, /NSIS/branches/kichik/Source/ResourceEditor.cpp, /NSIS/branches/kichik/Source/ResourceEditor.h, /NSIS/branches/kichik/Source/script.cpp, /NSIS/branches/kichik/Source/Script1.rc, /NSIS/branches/kichik/Source/strlist.h, /NSIS/branches/kichik/Source/tokens.cpp, /NSIS/branches/kichik/Source/tokens.h, /NSIS/branches/kichik/Source/util.cpp, /NSIS/branches/kichik/Source/util.h, /NSIS/branches/kichik/Source/zlib, /NSIS/branches/kichik/Source/zlib/deflate.c, /NSIS/branches/kichik/Source/zlib/DEFLATE.H, /NSIS/branches/kichik/Source/zlib/INFBLOCK.C, /NSIS/branches/kichik/Source/zlib/INFBLOCK.H, /NSIS/branches/kichik/Source/zlib/INFCODES.C, /NSIS/branches/kichik/Source/zlib/INFCODES.H, /NSIS/branches/kichik/Source/zlib/INFLATE.C, /NSIS/branches/kichik/Source/zlib/INFTREES.C, /NSIS/branches/kichik/Source/zlib/INFTREES.H, /NSIS/branches/kichik/Source/zlib/INFUTIL.C, /NSIS/branches/kichik/Source/zlib/INFUTIL.H, /NSIS/branches/kichik/Source/zlib/trees.c, /NSIS/branches/kichik/Source/zlib/ZCONF.H, /NSIS/branches/kichik/Source/zlib/ZLIB.H, /NSIS/branches/kichik/Source/zlib/ZUTIL.H: no message 2002-08-02 10:01 * /NSIS, /NSIS/branches, /NSIS/tags, /NSIS/trunk: New repository initialized by cvs2svn. nsis-3.11/Contrib/000077500000000000000000000000001477201124000140105ustar00rootroot00000000000000nsis-3.11/Contrib/AdvSplash/000077500000000000000000000000001477201124000156755ustar00rootroot00000000000000nsis-3.11/Contrib/AdvSplash/Example.nsi000077500000000000000000000022231477201124000200050ustar00rootroot00000000000000Name "AdvSplash.dll test" OutFile "AdvSplash Test.exe" XPStyle on Function .onInit # the plugins dir is automatically deleted when the installer exits InitPluginsDir File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" #optional #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav" MessageBox MB_OK "Fading" advsplash::show 1000 600 400 -1 $PLUGINSDIR\splash Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normally, and '-1' if some error occurred. MessageBox MB_OK "Transparency" File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall.bmp" advsplash::show 2000 0 0 0x1856B1 $PLUGINSDIR\splash Pop $0 MessageBox MB_OK "Transparency/Fading" File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" advsplash::show 1000 600 400 0x04025C $PLUGINSDIR\splash Pop $0 Delete $PLUGINSDIR\splash.bmp FunctionEnd Section SectionEndnsis-3.11/Contrib/AdvSplash/SConscript000077500000000000000000000004101477201124000177050ustar00rootroot00000000000000target = 'AdvSplash' files = Split(""" advsplash.c """) libs = Split(""" kernel32 user32 gdi32 winmm """) examples = Split(""" Example.nsi """) docs = Split(""" advsplash.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples, docs) nsis-3.11/Contrib/AdvSplash/advsplash.c000077500000000000000000000172421477201124000200370ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 // For layered windows #define _WIN32_WINNT 0x0500 #include #include #include // nsis plugin #ifndef LWA_COLORKEY # define LWA_COLORKEY 1 # define LWA_ALPHA 2 #endif #define RESOLUTION 32 // 30 fps ;) (32? I like SHR more than iDIV ;) HINSTANCE g_hInstance; HBITMAP g_hbm; BITMAP bm; int g_rv; int resolution; int sleep_val, fadein_val, fadeout_val, state, timeleft, keycolor, alphaparam; const TCHAR classname[4] = _T("_sp"); typedef BOOL(WINAPI*SetLayeredWindowAttributes_T)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags); SetLayeredWindowAttributes_T SetLayeredWindowAttributesProc; #define IsLayeredWnd() ( SetLayeredWindowAttributesProc != NULL ) static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; RECT r; HDC curdc = NULL; HDC hdc; HBITMAP oldbm; switch (uMsg) { case WM_CREATE: SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); SetWindowLongPtr(hwnd, GWL_STYLE, 0); SetWindowPos(hwnd, NULL, r.left + (r.right - r.left - bm.bmWidth) / 2, r.top + (r.bottom - r.top - bm.bmHeight) / 2, bm.bmWidth, bm.bmHeight, SWP_NOZORDER | SWP_SHOWWINDOW); return 0; case WM_PAINT: curdc = BeginPaint(hwnd, &ps); hdc = CreateCompatibleDC(curdc); GetClientRect(hwnd, &r); oldbm = SelectObject(hdc, g_hbm); BitBlt(curdc, r.left, r.top, r.right - r.left, r.bottom - r.top, hdc, 0, 0, SRCCOPY); SelectObject(hdc, oldbm); DeleteDC(hdc); EndPaint(hwnd, &ps); case WM_CLOSE: return 0; case WM_TIMER: case WM_LBUTTONDOWN: g_rv = (uMsg == WM_LBUTTONDOWN); DestroyWindow(hwnd); break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } void SetTransparentRegion(HWND myWnd) { HDC dc; int x, y; HRGN region, cutrgn; BITMAPINFO bmi; int size = bm.bmWidth * bm.bmHeight * 4; int *bmp = GlobalAlloc(GPTR, size); int *bmp_orig = bmp; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biHeight = bm.bmHeight; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = bm.bmWidth; bmi.bmiHeader.biClrUsed = 0; bmi.bmiHeader.biClrImportant = 0; dc = CreateCompatibleDC(NULL); SelectObject(dc, g_hbm); x = GetDIBits(dc, g_hbm, 0, bm.bmHeight, bmp, &bmi, DIB_RGB_COLORS); region = CreateRectRgn(0, 0, bm.bmWidth, bm.bmHeight); // Search for transparent pixels for (y = bm.bmHeight - 1; y >= 0; y--) { for (x = 0; x < bm.bmWidth;) { if ((*bmp & 0xFFFFFF) == keycolor) { int j = x; while ((x < bm.bmWidth) && ((*bmp & 0xFFFFFF) == keycolor)) { bmp++, x++; } // Cut transparent pixels from the original region cutrgn = CreateRectRgn(j, y, x, y + 1); CombineRgn(region, region, cutrgn, RGN_XOR); DeleteObject(cutrgn); } else { bmp++, x++; } } } // Set resulting region. SetWindowRgn(myWnd, region, TRUE); DeleteObject(region); DeleteObject(dc); GlobalFree(bmp_orig); } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance = hInst; return TRUE; } void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { int call = -1; switch (state) { // FadeIN case 0: if (timeleft == 0) { timeleft = sleep_val; state++; if (IsLayeredWnd()) call = 255; } else { call = ((fadein_val - timeleft) * 255) / fadein_val; break; } // Sleep case 1: if (timeleft == 0) { timeleft = fadeout_val; state++; // fadeout } else break; // FadeOUT case 2: if (timeleft == 0) { PostMessage((HWND) dwUser, WM_TIMER, 0, 0); return; } else { call = ((timeleft) * 255) / fadeout_val; break; } } // Transparency value acquired, and could be set... if ((call >= 0) && IsLayeredWnd()) { SetLayeredWindowAttributesProc((HWND) dwUser, keycolor, (BYTE) call, alphaparam); } // Time is running out... timeleft--; } void __declspec(dllexport) show(HWND hwndParent, int string_size, TCHAR *variables, stack_t ** stacktop) { DEVMODE dm; TCHAR fn[MAX_PATH], uselayerwnd; TCHAR temp[64]; FARPROC slwa; g_rv = -1; resolution = RESOLUTION; EXDLL_INIT(); popstring(temp); sleep_val = myatoi(temp); popstring(temp); fadein_val = myatoi(temp); popstring(temp); fadeout_val = myatoi(temp); popstring(temp); keycolor = myatoi(temp); popstring(fn); dm.dmSize = sizeof(DEVMODE); EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm); #ifdef _WIN64 slwa = (FARPROC) SetLayeredWindowAttributes; #else slwa = GetProcAddress(LoadLibraryA("USER32"), "SetLayeredWindowAttributes"); #endif // Check for winXP/2k at 32 bpp transparency uselayerwnd = slwa && dm.dmBitsPerPel >= 32 && keycolor == -1; if (!uselayerwnd) { // Fading+transparency is unsupported at old windows versions... resolution = sleep_val + fadein_val + fadeout_val; fadeout_val = fadein_val = 0; sleep_val = 1; state = 1; // skip fade in } else { // div them by resolution sleep_val >>= 5; fadein_val >>= 5; fadeout_val >>= 5; state = 0; alphaparam = LWA_ALPHA | ((keycolor == -1) ? (0) : (LWA_COLORKEY)); keycolor = ((keycolor & 0xFF) << 16) + (keycolor & 0xFF00) + ((keycolor & 0xFF0000) >> 16); } if (fn[0] && ((sleep_val + fadein_val + fadeout_val) > 0)) { MSG msg; static WNDCLASS wc; wc.lpfnWndProc = WndProc; wc.hInstance = g_hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = classname; if (RegisterClass(&wc)) { TCHAR fn2[MAX_PATH]; fn2[0] = _T('\0'), lstrcat(fn2, fn); lstrcat(fn2, _T(".wav")); lstrcat(fn, _T(".bmp")); g_hbm = LoadImage(NULL, fn, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); if (g_hbm) { HWND myWnd; UINT timerEvent; // Get Bitmap Information GetObject(g_hbm, sizeof(bm), & bm); myWnd = CreateWindowEx(WS_EX_TOOLWINDOW | (uselayerwnd ? (WS_EX_LAYERED) : (0)), classname, classname, 0, 0, 0, 0, 0, (HWND) hwndParent, NULL, g_hInstance, NULL); // Set transparency / key color if (uselayerwnd) { SetLayeredWindowAttributesProc = (SetLayeredWindowAttributes_T) slwa; // Use win2k method SetLayeredWindowAttributesProc(myWnd, keycolor, (BYTE) ((fadein_val > 0) ? (0) : (255)), alphaparam); } else if (keycolor != -1) { // transparency mode SetTransparentRegion(myWnd); } PlaySound(fn2, NULL, SND_ASYNC | SND_FILENAME | SND_NODEFAULT); // Start up timer... timeleft = fadein_val; timerEvent = timeSetEvent(resolution, RESOLUTION / 4, TimeProc, (DWORD_PTR) myWnd, TIME_PERIODIC); while (IsWindow(myWnd) && GetMessage(&msg, myWnd, 0, 0)) { DispatchMessage(&msg); } // Kill the timer... timeKillEvent(timerEvent); // Stop currently playing wave, we want to exit PlaySound(0, 0, 0); DeleteObject(g_hbm); } // We should UnRegister class, since Windows NT series never does this by itself UnregisterClass(wc.lpszClassName, wc.hInstance); } } wsprintf(temp, _T("%d"), g_rv); pushstring(temp); } nsis-3.11/Contrib/AdvSplash/advsplash.txt000077500000000000000000000037431477201124000204350ustar00rootroot00000000000000AdvSplash.dll - small (5.5k), simple plugin that lets you throw up a splash screen in NSIS installers with cool fading effects (Win2000+) and transparency. To use: Create a .BMP file of your splash screen. Create a .WAV file to play while your splash screen shows. (optional) Add the following lines to your .NSI file: Function .onInit InitPluginsDir File "/oname=$PluginsDir\spltmp.bmp" "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" ; optional ; File /oname=$PluginsDir\spltmp.wav "my_splashsound.wav" advsplash::show 1000 600 400 -1 $PluginsDir\spltmp Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normally, and '-1' if some error occurred. FunctionEnd Calling format advsplash::show Delay FadeIn FadeOut KeyColor FileName Delay - length to show the screen for (in milliseconds) FadeIn - length to show the fadein scene (in ms) (not included in Delay) FadeOut - length to show the fadeout scene (in ms) (not included in Delay) KeyColor - color used for transparency, could be any RGB value (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410), use KeyColor=-1 if there is no transparent color in your image. FileName - splash bitmap filename (without the .bmp). The BMP file used will be this parameter.bmp, and the wave file used (if present) will be this parameter.wav. (If you already have an .onInit function, put that in it) Note 1: fadein/fadeout supported only on win2k/winxp systems, all other systems will show simple splash screen with Delay = Delay + FadeIn + FadeOut. Also, I've noted my winXP uses no transparent color at 16 bpp, so at bpps lower than 32 for images with transparent color no fading effect will occur. Note 2: the return value of splash is 1 if the user closed the splash screen early (pop it from the stack) -Justin Converted to a plugin DLL by Amir Szekely (kichik) Fading and transparency by Nik Medved (brainsucker)nsis-3.11/Contrib/Banner/000077500000000000000000000000001477201124000152155ustar00rootroot00000000000000nsis-3.11/Contrib/Banner/Banner.c000077500000000000000000000077101477201124000165760ustar00rootroot00000000000000#include #include // nsis plugin #include "../../Source/exehead/resource.h" // Unicode support added by Jim Park -- 08/02/2007 HINSTANCE hInstance; HWND hwBanner; HANDLE hThread; BOOL bFailed; TCHAR buf[1024]; INT_PTR CALLBACK BannerProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_INITDIALOG) { int iMainStringSet = 0; popstring(buf); while (lstrcmp(buf, _T("/set")) == 0) { unsigned int id; popstring(buf); id = myatou(buf); popstring(buf); SetDlgItemText(hwndDlg, id, buf); popstring(buf); if (id == IDC_STR) iMainStringSet++; } SetWindowText(hwndDlg, buf); if (!iMainStringSet) SetDlgItemText(hwndDlg, IDC_STR, buf); if (!*buf) SetWindowLongPtr(hwndDlg, GWL_EXSTYLE, GetWindowLongPtr(hwndDlg, GWL_EXSTYLE) | WS_EX_TOOLWINDOW); } if (uMsg == WM_CLOSE) { DestroyWindow(hwndDlg); } return FALSE; } BOOL ProcessMessages() { BOOL processed = FALSE; MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { DispatchMessage(&msg); processed = TRUE; } return processed; } DWORD WINAPI BannerThread(LPVOID lpParameter) { HWND hwndParent = (HWND) lpParameter; HWND lhwBanner; // This right here is the mother of all evils when it comes to // foreground windows. The dialog is created in another thread // and there can only be one thread holding the right to set the // foreground window. So long as this thread exists and has an // active window, another thread from the same process can steal // its thunder. But if the window and the thread are destroyed, // the foreground rights pass on to another process. To avoid // this situation that could cause the installer to show up on // the background if Banner is used in .onInit, we don't let // CreateDialog show the window and instead do this in the // original thread. This is done by not specifying WS_VISIBLE // for IDD_VERIFY. lhwBanner = CreateDialog( GetModuleHandle(0), MAKEINTRESOURCE(IDD_VERIFY), hwndParent, BannerProc ); if (!lhwBanner) { bFailed = TRUE; return 0; } while (IsWindow(lhwBanner)) { if (!ProcessMessages()) { hwBanner = lhwBanner; WaitMessage(); } } hwBanner = NULL; return 0; } static UINT_PTR PluginCallback(enum NSPIM msg) { return 0; } void __declspec(dllexport) show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { EXDLL_INIT(); extra->RegisterPluginCallback(hInstance, PluginCallback); { DWORD dwThreadId; DWORD dwMainThreadId = GetCurrentThreadId(); hwBanner = NULL; if (!IsWindowVisible(hwndParent)) hwndParent = 0; bFailed = FALSE; hThread = CreateThread(0, 0, BannerThread, (LPVOID) hwndParent, 0, &dwThreadId); // wait for the window to initialize and for the stack operations to finish while (hThread && !hwBanner && !bFailed) { ProcessMessages(); Sleep(10); } CloseHandle(hThread); if (AttachThreadInput(dwMainThreadId, dwThreadId, TRUE)) { // Activates and displays a window ShowWindow(hwBanner, SW_SHOW); AttachThreadInput(dwMainThreadId, dwThreadId, FALSE); } else ShowWindow(hwBanner, SW_SHOW); } } void __declspec(dllexport) getWindow(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { wsprintf(buf, _T("%u"), hwBanner); pushstring(buf); } void __declspec(dllexport) destroy(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { if (!hwBanner) return; PostMessage(hwBanner, WM_CLOSE, 0, 0); // Wait for the thread to finish while (hwBanner) { ProcessMessages(); Sleep(25); } } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { hInstance = hInst; if (hwBanner && ul_reason_for_call == DLL_PROCESS_DETACH) { destroy(0, 0, 0, 0); } return TRUE; } nsis-3.11/Contrib/Banner/Example.nsi000077500000000000000000000012721477201124000173300ustar00rootroot00000000000000# Look at Readme.txt for usage alongside with the Modern UI !include "WinMessages.nsh" Name "Banner.dll test" OutFile "Banner Test.exe" ShowInstDetails show Function .onInit Banner::show "Calculating important stuff..." Banner::getWindow Pop $1 again: IntOp $0 $0 + 1 Sleep 1 StrCmp $0 100 0 again GetDlgItem $2 $1 1030 SendMessage $2 ${WM_SETTEXT} 0 "STR:Calculating more important stuff..." again2: IntOp $0 $0 + 1 Sleep 1 StrCmp $0 200 0 again2 Banner::destroy FunctionEnd Section DetailPrint "Using previous calculations to quickly calculate 1*2000..." Sleep 1000 DetailPrint "Eureka! It's $0!!!" DetailPrint "" SectionEndnsis-3.11/Contrib/Banner/Readme.txt000077500000000000000000000022771477201124000171660ustar00rootroot00000000000000BANNER PLUG-IN -------------- The Banner plug-in shows a banner with customizable text. It uses the IDD_VERIFY dialog of the UI. There are three functions - show, getWindow and destroy. Usage ----- Banner::show "Text to show" [optional] Banner::getWindow Banner::destroy See Example.nsi for an example. Modern UI --------- The Modern UI has two labels on the IDD_VERIFY dialog. To change all the texts, use: Banner::show /set 76 "Text 1 (replaces Please wait while Setup is loading...)" "Normal text" Custom UI --------- If you have more labels on your IDD_VERIFY dialog, you can use multiple /set parameters to change the texts. Example: Banner::show /set 76 "bah #1" /set 54 "bah #2" "Normal text" The second parameter for /set is the ID of the control. Some More Tricks ---------------- If you use /set to set the main string (IDC_STR, 1030) you can specify a different string for the window's caption and for the main string. If you use an empty string as the main string (Banner::show "") the banner window will not show on the taskbar. Credits ------- A joint effort of brainsucker and kichik in honor of the messages dropped during the battlensis-3.11/Contrib/Banner/SConscript000077500000000000000000000003611477201124000172320ustar00rootroot00000000000000target = 'Banner' files = Split(""" Banner.c """) libs = Split(""" kernel32 user32 """) examples = Split(""" Example.nsi """) docs = Split(""" Readme.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples, docs) nsis-3.11/Contrib/BgImage/000077500000000000000000000000001477201124000153035ustar00rootroot00000000000000nsis-3.11/Contrib/BgImage/BgImage.cpp000077500000000000000000000371051477201124000173130ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #include #include #include // nsis plugin #undef EXDLL_INIT #define EXDLL_INIT() { \ g_stringsize=string_size; \ g_stacktop=stacktop; } #define NSISFunc(name) extern "C" void __declspec(dllexport) name(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) TCHAR szTemp[2048]; HWND hWndImage, hWndParent; HINSTANCE g_hInstance; CRITICAL_SECTION CriticalSection; void ECS() { EnterCriticalSection(&CriticalSection); } void LCS() { LeaveCriticalSection(&CriticalSection); } enum { MIL_DUMMY, MIL_GRADIENT, MIL_BITMAP, MIL_TRANSPARENT_BITMAP, MIL_TEXT }; struct myImageList { BYTE iType; union { HBITMAP hBitmap; TCHAR *szText; COLORREF cGradientFrom; }; RECT rPos; union { COLORREF cTransparent; COLORREF cTextColor; COLORREF cGradientTo; }; HFONT hFont; BOOL bReady; myImageList *next; } bgBitmap; unsigned int uWndWidth, uWndHeight; WNDPROC oldProc; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); HBITMAP __stdcall LoadBitmapFile(long right, long bottom, BITMAP *bBitmap); COLORREF GetColor(); void __stdcall GetXY(LPPOINT lpPoint); NSISFunc(Destroy); static UINT_PTR PluginCallback(enum NSPIM msg) { if (msg == NSPIM_GUIUNLOAD) { Destroy(0, 0, 0, 0, 0); } return 0; } BOOL bReturn; NSISFunc(SetReturn) { EXDLL_INIT(); extra->RegisterPluginCallback(g_hInstance, PluginCallback); popstring(szTemp); bReturn = !lstrcmpi(szTemp, _T("on")); } static void __stdcall my_pushstring(const TCHAR *str) { stack_t *th; if (!g_stacktop || !bReturn) return; th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+(g_stringsize*sizeof(TCHAR))); lstrcpyn(th->text,str,g_stringsize); th->next=*g_stacktop; *g_stacktop=th; } NSISFunc(SetBg) { EXDLL_INIT(); extra->RegisterPluginCallback(g_hInstance, PluginCallback); ECS(); if (!hWndImage) { hWndParent = hwndParent; if (!hwndParent) { my_pushstring(_T("can't find parent window")); LCS(); return; } WNDCLASS wc = { CS_VREDRAW|CS_HREDRAW, WndProc, 0, 0, g_hInstance, 0, LoadCursor(0, IDC_ARROW), 0, 0, _T("NSISBGImage"), }; ATOM atomClass = RegisterClass(&wc); if (!atomClass) { my_pushstring(_T("can't create window")); return; } hWndImage = CreateWindowEx( WS_EX_TOOLWINDOW, (LPTSTR)(UINT_PTR)atomClass, 0, WS_CLIPSIBLINGS|WS_POPUP, 0, 0, 0, 0, 0, 0, g_hInstance, 0 ); if (!hWndImage) { my_pushstring(_T("can't create window")); LCS(); return; } oldProc = (WNDPROC)SetWindowLongPtr(hwndParent, GWLP_WNDPROC, (LONG_PTR)WndProc); } bgBitmap.bReady = FALSE; if (bgBitmap.iType == MIL_BITMAP) DeleteObject(bgBitmap.hBitmap); unsigned int uScrWidth = GetSystemMetrics(SM_CXSCREEN); unsigned int uScrHeight = GetSystemMetrics(SM_CYSCREEN); bgBitmap.iType = MIL_BITMAP; bgBitmap.rPos.right = 0; bgBitmap.rPos.bottom = 0; uWndWidth = uScrWidth; uWndHeight = uScrHeight; LPCTSTR szGradient = _T("/GRADIENT"); LPCTSTR szFillScreen = _T("/FILLSCREEN"); LPCTSTR szTiled = _T("/TILED"); popstring(szTemp); if (!lstrcmpi(szTemp, szGradient)) { bgBitmap.cGradientFrom = GetColor(); bgBitmap.cGradientTo = GetColor(); bgBitmap.iType = MIL_GRADIENT; goto done; } if (!lstrcmpi(szTemp, szFillScreen)) { bgBitmap.rPos.right = uScrWidth; bgBitmap.rPos.bottom = uScrHeight; popstring(szTemp); } else if (!lstrcmpi(szTemp, szTiled)) { popstring(szTemp); } else { uWndWidth = 0; uWndHeight = 0; } BITMAP bBitmap; bgBitmap.hBitmap = LoadBitmapFile(bgBitmap.rPos.right, bgBitmap.rPos.bottom, &bBitmap); if (!bgBitmap.hBitmap) return; if (!bgBitmap.rPos.right) { bgBitmap.rPos.right = bBitmap.bmWidth; bgBitmap.rPos.bottom = bBitmap.bmHeight; } if (!uWndWidth) { uWndWidth = bBitmap.bmWidth; uWndHeight = bBitmap.bmHeight; } done: bgBitmap.bReady = TRUE; LCS(); if (hWndImage) { SetWindowPos( hWndImage, hWndParent, (uScrWidth-uWndWidth)/2, (uScrHeight-uWndHeight)/2, uWndWidth, uWndHeight, SWP_NOACTIVATE ); } my_pushstring(_T("success")); } NSISFunc(AddImage) { ECS(); myImageList *newImg = (myImageList *)GlobalAlloc(GPTR, sizeof(myImageList)); if (!newImg) { my_pushstring(_T("memory allocation error")); LCS(); return; } newImg->iType = MIL_BITMAP; newImg->cTransparent = (COLORREF)-1; popstring(szTemp); if (!lstrcmpi(szTemp, _T("/TRANSPARENT"))) { newImg->iType = MIL_TRANSPARENT_BITMAP; newImg->cTransparent = GetColor(); popstring(szTemp); } BITMAP bBitmap; newImg->hBitmap = LoadBitmapFile(0, 0, &bBitmap); if (!newImg->hBitmap) { GlobalFree(newImg); return; } GetXY(LPPOINT(&newImg->rPos)); newImg->rPos.right = newImg->rPos.left + bBitmap.bmWidth; newImg->rPos.bottom = newImg->rPos.top + bBitmap.bmHeight; myImageList *img = &bgBitmap; while (img->next) img = img->next; img->next = newImg; my_pushstring(_T("success")); LCS(); } NSISFunc(AddText) { ECS(); myImageList *newImg = (myImageList *)GlobalAlloc(GPTR, sizeof(myImageList)); if (!newImg) { my_pushstring(_T("memory allocation error")); LCS(); return; } newImg->iType = MIL_TEXT; popstring(szTemp); newImg->szText = (TCHAR *)GlobalAlloc(GPTR, (lstrlen(szTemp)+1)*sizeof(TCHAR)); if (!newImg->szText) { my_pushstring(_T("memory allocation error")); GlobalFree(newImg); LCS(); return; } lstrcpy(newImg->szText, szTemp); popstring(szTemp); newImg->hFont = (HFONT) nsishelper_str_to_ptr(szTemp); newImg->cTextColor = GetColor(); GetXY(LPPOINT(&newImg->rPos)); GetXY(LPPOINT(&newImg->rPos) + 1); myImageList *img = &bgBitmap; while (img->next) img = img->next; img->next = newImg; my_pushstring(_T("success")); LCS(); } NSISFunc(Redraw) { RedrawWindow(hWndImage, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); ShowWindow(hWndImage, SW_SHOWNA); } NSISFunc(Clear) { ECS(); myImageList *img = &bgBitmap; while (img) { switch (img->iType) { case MIL_BITMAP: case MIL_TRANSPARENT_BITMAP: DeleteObject(img->hBitmap); break; case MIL_TEXT: GlobalFree(img->szText); break; } myImageList *thisImg = img; img = img->next; thisImg->next = NULL; if (thisImg != &bgBitmap) GlobalFree(thisImg); } bgBitmap.bReady = FALSE; LCS(); } NSISFunc(Destroy) { bgBitmap.bReady = FALSE; if (IsWindow(hwndParent) && oldProc) SetWindowLongPtr(hwndParent, GWLP_WNDPROC, (LONG_PTR)oldProc); if (IsWindow(hWndImage)) SendMessage(hWndImage, WM_CLOSE, 0, 0); hWndImage = 0; oldProc = NULL; Clear(0, 0, 0, 0, 0); UnregisterClass(_T("NSISBGImage"), g_hInstance); } NSISFunc(Sound) { LPCTSTR szLoop = _T("/LOOP"); LPCTSTR szWait = _T("/WAIT"); LPCTSTR szStop = _T("/STOP"); DWORD flags = SND_FILENAME | SND_NODEFAULT; g_stacktop = stacktop; popstring(szTemp); if (lstrcmpi(szTemp, szWait)) flags |= SND_ASYNC; else popstring(szTemp); if (!lstrcmpi(szTemp, szLoop)) { flags |= SND_LOOP; popstring(szTemp); } PlaySound(lstrcmpi(szTemp, szStop) ? szTemp : 0, 0, flags); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwndParent = hWndParent; HWND hwndImage = hWndImage; if (hwnd == hwndParent) { if (message == WM_SIZE) { ShowWindow(hwndImage, wParam == SIZE_MINIMIZED ? SW_HIDE : SW_SHOW); } if (message == WM_WINDOWPOSCHANGED) { SetWindowPos(hwndImage, hwndParent, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); } return CallWindowProc(oldProc, hwnd, message, wParam, lParam); } switch (message) { case WM_PAINT: if (bgBitmap.bReady) { ECS(); PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); if (bgBitmap.iType == MIL_BITMAP) { HDC cdc = CreateCompatibleDC(hdc); SelectObject(cdc, bgBitmap.hBitmap); for (unsigned int x = 0; x < uWndWidth; x += bgBitmap.rPos.right) { for (unsigned int y = 0; y < uWndHeight; y += bgBitmap.rPos.bottom) { BitBlt(hdc, x, y, bgBitmap.rPos.right, bgBitmap.rPos.bottom, cdc, 0, 0, SRCCOPY); } } DeleteDC(cdc); } else { int r = GetRValue(bgBitmap.cGradientFrom) << 10; int g = GetGValue(bgBitmap.cGradientFrom) << 10; int b = GetBValue(bgBitmap.cGradientFrom) << 10; int dr = ((GetRValue(bgBitmap.cGradientTo) << 10) - r) / (int)uWndHeight * 4; int dg = ((GetGValue(bgBitmap.cGradientTo) << 10) - g) / (int)uWndHeight * 4; int db = ((GetBValue(bgBitmap.cGradientTo) << 10) - b) / (int)uWndHeight * 4; RECT rect; rect.left = 0; rect.top = 0; rect.right = uWndWidth; rect.bottom = 4; while (rect.top < (int)uWndHeight) { HBRUSH brush = CreateSolidBrush(RGB(r>>10,g>>10,b>>10)); FillRect(hdc, &rect, brush); DeleteObject(brush); rect.top+=4; rect.bottom+=4; r+=dr; g+=dg; b+=db; } } myImageList *img = bgBitmap.next; while (img) { if (img->iType == MIL_TEXT) { SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, img->cTextColor); SelectObject(hdc, img->hFont); DrawText(hdc, img->szText, -1, &img->rPos, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_WORDBREAK); } else if (img->iType == MIL_BITMAP) { HDC cdc = CreateCompatibleDC(hdc); SelectObject(cdc, img->hBitmap); BitBlt(hdc, img->rPos.left, img->rPos.top, img->rPos.right - img->rPos.left, img->rPos.bottom - img->rPos.top, cdc, 0, 0, SRCCOPY); DeleteDC(cdc); } else { COLORREF cColor; HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave; HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld; HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave; POINT ptSize; HBITMAP hBitmap = img->hBitmap; hdcTemp = CreateCompatibleDC(hdc); SelectObject(hdcTemp, hBitmap); // Select the bitmap ptSize.x = img->rPos.right - img->rPos.left; ptSize.y = img->rPos.bottom - img->rPos.top; DPtoLP(hdcTemp, &ptSize, 1); // Convert from device to logical points // Create some DCs to hold temporary data. hdcBack = CreateCompatibleDC(hdc); hdcObject = CreateCompatibleDC(hdc); hdcMem = CreateCompatibleDC(hdc); hdcSave = CreateCompatibleDC(hdc); // Create a bitmap for each DC. DCs are required for a number of // GDI functions. // Monochrome DC bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); // Monochrome DC bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); // Each DC must select a bitmap object to store pixel data. bmBackOld = (HBITMAP)SelectObject(hdcBack, bmAndBack); bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject); bmMemOld = (HBITMAP)SelectObject(hdcMem, bmAndMem); bmSaveOld = (HBITMAP)SelectObject(hdcSave, bmSave); // Set proper mapping mode. SetMapMode(hdcTemp, GetMapMode(hdc)); // Save the bitmap sent here, because it will be overwritten. BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); // Set the background color of the source DC to the color. // contained in the parts of the bitmap that should be transparent cColor = SetBkColor(hdcTemp, img->cTransparent); // Create the object mask for the bitmap by performing a BitBlt // from the source bitmap to a monochrome bitmap. BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); // Set the background color of the source DC back to the original // color. SetBkColor(hdcTemp, cColor); // Create the inverse of the object mask. BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY); // Copy the background of the main DC to the destination. BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, img->rPos.left, img->rPos.top, SRCCOPY); // Mask out the places where the bitmap will be placed. BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND); // Mask out the transparent colored pixels on the bitmap. BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND); // XOR the bitmap with the background on the destination DC. BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT); // Copy the destination to the screen. BitBlt(hdc, img->rPos.left, img->rPos.top, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY); // Place the original bitmap back into the bitmap sent here. BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY); // Delete the memory bitmaps. DeleteObject(SelectObject(hdcBack, bmBackOld)); DeleteObject(SelectObject(hdcObject, bmObjectOld)); DeleteObject(SelectObject(hdcMem, bmMemOld)); DeleteObject(SelectObject(hdcSave, bmSaveOld)); // Delete the memory DCs. DeleteDC(hdcMem); DeleteDC(hdcBack); DeleteDC(hdcObject); DeleteDC(hdcSave); DeleteDC(hdcTemp); } img = img->next; } LCS(); EndPaint(hwnd, &ps); } break; case WM_WINDOWPOSCHANGING: if (IsWindow(hwndParent)) { LPWINDOWPOS wp = (LPWINDOWPOS) lParam; wp->flags |= SWP_NOACTIVATE; wp->hwndInsertAfter = hwndParent; } break; case WM_CLOSE: DestroyWindow(hwnd); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } HBITMAP __stdcall LoadBitmapFile(long right, long bottom, BITMAP *bBitmap) { HBITMAP hBitmap = (HBITMAP)LoadImage(0, szTemp, IMAGE_BITMAP, right, bottom, LR_LOADFROMFILE); if (!hBitmap || !GetObject(hBitmap, sizeof(BITMAP), (void *)bBitmap)) { my_pushstring(_T("can't load bitmap")); if (hBitmap) DeleteObject(hBitmap); LCS(); return 0; } return hBitmap; } COLORREF GetColor() { COLORREF cColor = 0; popstring(szTemp); cColor |= (BYTE) myatoi(szTemp); popstring(szTemp); cColor |= ((BYTE) myatoi(szTemp)) << 8; popstring(szTemp); cColor |= ((BYTE) myatoi(szTemp)) << 16; return cColor; } void __stdcall GetXY(LPPOINT lpPoint) { popstring(szTemp); int iPosTemp = myatoi(szTemp); if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndWidth; lpPoint->x = (unsigned int)iPosTemp; popstring(szTemp); iPosTemp = myatoi(szTemp); if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndHeight; lpPoint->y = (unsigned int)iPosTemp; } extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: InitializeCriticalSection(&CriticalSection); break; case DLL_PROCESS_DETACH: DeleteCriticalSection(&CriticalSection); break; } return TRUE; } nsis-3.11/Contrib/BgImage/BgImage.txt000077500000000000000000000060751477201124000173520ustar00rootroot00000000000000BgImage.DLL - NSIS extension DLL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Displays an image or a gradient with user defined texts and/or images behind the NSIS window. Can also play WAVs. See Example.nsi for a usage example. Usage ~~~~~ 1) Call SetBg to set the background 2) Call AddText, or AddImage to add texts and images 3) Call Redraw to update the background window 4) Optional - repeat steps 2-3 to add more images -or- call Clear and repeat steps 1-3 for a completely new background. 5) Call Destroy when the background is no longer required (.onGUIEnd for example) Notes ~~~~~ * This plugin requires NSIS 2.42 and above. * Do not call SetBg (which creates the window) from a section or a function called by a section. BgImge must be run from the GUI thread as the installation thread is not built to handle GUI. Available functions ~~~~~~~~~~~~~~ SetBg [/FILLSCREEN|/TILED] path_to_bitmap SetBg /GRADIENT R G B R G B Sets the background and creates the window if necessary Use /FILLSCREEN to make the image fill the screen Use /TILED to set a tiled background Use /GRADIENT to set a gradient background If SetReturn on was called returns "success" on the stack or an error string if there was an error Do not use in .onInit! AddImage [/TRANSPARENT R G B] path_to_bitmap X Y Adds an image to the background window at (X,Y) X and Y can be negative to specify distance from right/bottom Use /TRANSPARENT to make BgImage draw the image transparently Define the transparent color using R G B If SetReturn on was called returns "success" on the stack or an error string if there was an error AddText text font_handle R G B X Y X Y Adds text to the background window Use NSIS's CreateFont to create a font and pass it as font_handle Use R G B to set the text color The first X Y is for the top left corner of the text box The second X Y is for the bottom right corner of the text box X and Y can be negative to specify distance from right/bottoms If SetReturn on was called returns "success" on the stack or an error string if there was an error Clear Clears all of the current background, images and texts Destroy Destroys the current background window Destroy calls Clear automatically Sound [/WAIT|/LOOP] path_to_wav Sound /STOP Plays a wave file Use /WAIT to wait for the sound to finish playing Use /LOOP to loop the sound Use Sound /STOP to stop the loop SetReturn on|off Enable return values from SetBg, AddImage and AddText Default value is off because all of the possible errors are either things you should handle when debugging your script such as "can't load bitmap" or errors you can do nothing about such as "memory allocation error" Credits ~~~~~~~ Coded by Amir Szekely, aka KiCHiK Ximon Eighteen, aka Sunjammer - Fixed window title bar issues iceman_k - Text idea and original implementation Lajos Molnar, aka orfanik - Tile idea and original implementation Jason Reis - Coding helpnsis-3.11/Contrib/BgImage/Example.nsi000077500000000000000000000054361477201124000174240ustar00rootroot00000000000000Name "BgImage.dll test" OutFile "BgImage Test.exe" XPStyle on RequestExecutionLevel user !define DEBUG !macro GetReturnValue !ifdef DEBUG Pop $R9 StrCmp $R9 success +2 DetailPrint "Error: $R9" !endif !macroend Function .onGUIInit # the plugins dir is automatically deleted when the installer exits InitPluginsDir # lets extract some bitmaps... File /oname=$PLUGINSDIR\1.bmp "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" File /oname=$PLUGINSDIR\2.bmp "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" !ifdef DEBUG # turn return values on if in debug mode BgImage::SetReturn on !endif # set the initial background for images to be drawn on # we will use a gradient from drak green to dark red BgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0 !insertmacro GetReturnValue # add an image @ (150,0) BgImage::AddImage $PLUGINSDIR\2.bmp 150 0 !insertmacro GetReturnValue # add the same image only transparent (magenta wiped) @ (150,16) BgImage::AddImage /TRANSPARENT 255 0 255 $PLUGINSDIR\2.bmp 150 16 !insertmacro GetReturnValue # create the font for the following text CreateFont $R0 "Comic Sans MS" 50 700 # add a blue shadow for the text BgImage::AddText "Testing 1... 2... 3..." $R0 0 0 255 48 48 798 198 !insertmacro GetReturnValue # add a green shadow for the text BgImage::AddText "Testing 1... 2... 3..." $R0 0 255 0 52 52 802 202 !insertmacro GetReturnValue # add the text BgImage::AddText "Testing 1... 2... 3..." $R0 255 0 0 50 50 800 200 !insertmacro GetReturnValue # show our creation to the world! BgImage::Redraw # Refresh doesn't return any value FunctionEnd ShowInstDetails show Section # play some sounds FindFirst $0 $1 $WINDIR\Media\*.wav StrCmp $0 "" skipSound moreSounds: StrCmp $1 "" noMoreSounds BgImage::Sound /WAIT $WINDIR\Media\$1 # Sound doesn't return any value either MessageBox MB_YESNO "Another sound?" IDNO noMoreSounds FindNext $0 $1 Goto moreSounds noMoreSounds: FindClose $0 skipSound: # change the background image to Mike, tiled BgImage::SetBg /TILED $PLUGINSDIR\1.bmp !insertmacro GetReturnValue # we have to redraw to reflect the changes BgImage::Redraw MessageBox MB_OK "Mike the llama" # clear everything BgImage::Clear # Clear doesn't return any value # set another gradient BgImage::SetBg /GRADIENT 0xFF 0xFA 0xBA 0xAA 0xA5 0x65 !insertmacro GetReturnValue # add some text BgImage::AddText "A Desert for Mike" $R0 0 0 0 50 50 800 150 !insertmacro GetReturnValue # add mike as an image BgImage::AddImage $PLUGINSDIR\1.bmp 50 150 !insertmacro GetReturnValue # again, we have to call redraw to reflect changes BgImage::Redraw SectionEnd Function .onGUIEnd BgImage::Destroy # Destroy doesn't return any value FunctionEndnsis-3.11/Contrib/BgImage/SConscript000077500000000000000000000004241477201124000173200ustar00rootroot00000000000000target = 'BgImage' files = Split(""" BgImage.cpp """) libs = Split(""" kernel32 user32 gdi32 winmm """) examples = Split(""" Example.nsi """) docs = Split(""" BgImage.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples, docs, cppused = True) nsis-3.11/Contrib/Dialer/000077500000000000000000000000001477201124000152105ustar00rootroot00000000000000nsis-3.11/Contrib/Dialer/Dialer.txt000077500000000000000000000056611477201124000171640ustar00rootroot00000000000000DIALER PLUGIN ------------- Written by Amir Szekely aka KiCHiK Readme by Joost Verburg The Dialer plugin for NSIS provides five functions related to internet connections. To download files from the internet, use the NSISdl plugin. USAGE ----- Example of usage: ClearErrors ;Clear the error flag Dialer::FunctionName ;Call Dialer function IfErrors "" +3 ;Check for errors MessageBox MB_OK "Function not available" Quit Pop $R0 ;Get the return value from the stack MessageBox MB_OK $R0 ;Display the return value EXAMPLE FUNCTION ---------------- ; ConnectInternet (uses Dialer plugin) ; Written by Joost Verburg ; ; This function attempts to make a connection to the internet if there is no ; connection available. If you are not sure that a system using the installer ; has an active internet connection, call this function before downloading ; files with NSISdl. ; ; The function requires Internet Explorer 3, but asks to connect manually if ; IE3 is not installed. Function ConnectInternet Push $R0 ClearErrors Dialer::AttemptConnect IfErrors noie3 Pop $R0 StrCmp $R0 "online" connected MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet." Quit ;Remove to make error not fatal noie3: ; IE3 not installed MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now." connected: Pop $R0 FunctionEnd FUNCTIONS --------- If a function is not available on the system, the error flag will be set. * AttemptConnect Attempts to make a connection to the Internet if the system is not connected. online - already connected / connection successful offline - connection failed Requires Internet Explorer 3 or later * AutodialOnline Causes the modem to automatically dial the default Internet connection if the system is not connected to the internet. If the system is not set up to automatically connect, it will prompt the user. Return values: online - already connected / connection successful offline - connection failed Requires Internet Explorer 4 or later * AutodialUnattended Causes the modem to automatically dial the default Internet connection if the system is not connected to the internet. The user will not be prompted. Return values: online - already connected / connection successful offline - connection failed Requires Internet Explorer 4 or later * AutodialHangup Disconnects an automatic dial-up connection. Return values: success - disconnection successful failure - disconnection failed Requires Internet Explorer 4 or later * GetConnectedState Checks whether the system is connected to the internet. Return values: online - system is online offline - system is offline Requires Internet Explorer 4 or laternsis-3.11/Contrib/Dialer/SConscript000077500000000000000000000003171477201124000172260ustar00rootroot00000000000000target = 'Dialer' files = Split(""" dialer.c """) libs = Split(""" kernel32 user32 wininet """) docs = Split(""" Dialer.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, docs = docs) nsis-3.11/Contrib/Dialer/dialer.c000077500000000000000000000065131477201124000166240ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #define WIN32_LEAN_AND_MEAN #include #include #include // nsis plugin #define NSISFunction(funcname) void __declspec(dllexport) funcname(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; } /*************\ * LOADER * \*************/ HMODULE NSISCALL LoadSystemLibrary(LPCSTR name) { LPCTSTR fmt = sizeof(*fmt) > 1 ? TEXT("%s%S.dll") : TEXT("%s%s.dll"); // The module name is always ANSI BYTE bytebuf[(MAX_PATH+1+20+1+3+!0) * sizeof(*fmt)]; // 20+4 is more than enough for LPTSTR path = (LPTSTR) bytebuf; // the dllnames we are using. UINT cch = GetSystemDirectory(path, MAX_PATH); if (cch > MAX_PATH) // MAX_PATH was somehow not large enough and we don't support cch = 0; // \\?\ paths so we have to settle for just the name. wsprintf(path + cch, fmt, TEXT("\\") + (!cch || path[cch-1] == '\\'), name); return LoadLibrary(path); } FARPROC GetWinInetFunc(LPCSTR funcname) { HMODULE hWinInet = LoadSystemLibrary("WININET"); return hWinInet ? GetProcAddress(hWinInet, funcname) : (FARPROC) hWinInet; } /*************\ * FUNCTIONS * \*************/ NSISFunction(AutodialOnline) { typedef BOOL (WINAPI *fInternetAutodial)(DWORD, HWND); fInternetAutodial pInternetAutodial = (fInternetAutodial) GetWinInetFunc("InternetAutodial"); if (!pInternetAutodial) { extra->exec_flags->exec_error++; return; } EXDLL_INIT(); if (pInternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE, 0)) pushstring(_T("online")); else pushstring(_T("offline")); } NSISFunction(AutodialUnattended) { typedef BOOL (WINAPI *fInternetAutodial)(DWORD, HWND); fInternetAutodial pInternetAutodial = (fInternetAutodial) GetWinInetFunc("InternetAutodial"); if (!pInternetAutodial) { extra->exec_flags->exec_error++; return; } EXDLL_INIT(); if (pInternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED , 0)) pushstring(_T("online")); else pushstring(_T("offline")); } NSISFunction(AttemptConnect) { typedef DWORD (WINAPI *fAttemptConn)(DWORD); fAttemptConn pInternetAttemptConnect = (fAttemptConn) GetWinInetFunc("InternetAttemptConnect"); if (!pInternetAttemptConnect) { extra->exec_flags->exec_error++; return; } EXDLL_INIT(); if (pInternetAttemptConnect(0) == ERROR_SUCCESS) pushstring(_T("online")); else pushstring(_T("offline")); } NSISFunction(GetConnectedState) { DWORD dwState; typedef BOOL (WINAPI *fGetConState)(LPDWORD, DWORD); fGetConState pInternetGetConnectedState = (fGetConState) GetWinInetFunc("InternetGetConnectedState"); if (!pInternetGetConnectedState) { extra->exec_flags->exec_error++; return; } EXDLL_INIT(); if (pInternetGetConnectedState(&dwState, 0)) pushstring(_T("online")); else pushstring(_T("offline")); } NSISFunction(AutodialHangup) { typedef BOOL (WINAPI *fAutodial)(DWORD); fAutodial pInternetAutodialHangup = (fAutodial) GetWinInetFunc("InternetAutodialHangup"); if (!pInternetAutodialHangup) { extra->exec_flags->exec_error++; return; } EXDLL_INIT(); if (pInternetAutodialHangup(0)) pushstring(_T("success")); else pushstring(_T("failure")); } nsis-3.11/Contrib/ExDLL/000077500000000000000000000000001477201124000147205ustar00rootroot00000000000000nsis-3.11/Contrib/ExDLL/SConscript000077500000000000000000000033701477201124000167400ustar00rootroot00000000000000# FIXME: install assembly and pascal includes into the correct locations lib_target = "pluginapi" lib_files = Split(""" pluginapi.c """) api_files = Split(""" pluginapi.h nsis_tchar.h #Source/exehead/api.h """) example = Split(""" exdll.c exdll.dpr exdll.dsp exdll.dsw exdll_with_unit.dpr exdll-vs2008.sln exdll-vs2008.vcproj nsis.pas extdll.inc """) Import('env plugin_env plugin_uenv GetArcSuffix PerformPluginExtrasDistOperationOnce') unicodetarget = 'UNICODE' in env['CPPDEFINES'] plugin_envT = plugin_env if unicodetarget: plugin_envT = plugin_uenv lib_targetT = lib_target + '-' + GetArcSuffix(plugin_envT, unicodetarget) # build library api_envT = plugin_envT.Clone() api_envT.Append(CPPPATH = ['#Source/exehead']) # For api.h lib = api_envT.Library(lib_targetT, lib_files) # distribute library, files and examples if PerformPluginExtrasDistOperationOnce(plugin_envT, unicodetarget): env.DistributeExamples(api_files, path='Plugin/nsis') env.DistributeExamples(example, path='Plugin') if env['PLATFORM'] != 'win32': if 'PREFIX_PLUGINAPI_INC' in env: env.Distribute(api_files, None, 'pluginapi_inc', '', 'nsis', 'pluginapi', 'pluginapi') if env['PLATFORM'] == 'win32': env.DistributeExamples(lib, path='Plugin/nsis') else: example += lib_files if 'PREFIX_PLUGINAPI_LIB' in env: env.Distribute(lib, None, 'pluginapi_lib', '', 'nsis', 'pluginapi', 'pluginapi') # make sure all the other plug-ins can use the library if PerformPluginExtrasDistOperationOnce(plugin_envT, unicodetarget): env.Install('#$BUILD_PREFIX/api/nsis', api_files) env.Install('#$BUILD_PREFIX/api/nsis', lib) plugin_envT.Append(CPPPATH = ['#$BUILD_PREFIX/api']) plugin_envT.Append(LIBPATH = ['#$BUILD_PREFIX/api/nsis']) plugin_envT.Append(LIBS = [lib_targetT]) nsis-3.11/Contrib/ExDLL/exdll-vs2008.sln000077500000000000000000000015621477201124000175150ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exdll", "exdll-vs2008.vcproj", "{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.ActiveCfg = Debug|Win32 {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.Build.0 = Debug|Win32 {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.ActiveCfg = Release|Win32 {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal nsis-3.11/Contrib/ExDLL/exdll-vs2008.vcproj000077500000000000000000000142371477201124000202270ustar00rootroot00000000000000 nsis-3.11/Contrib/ExDLL/exdll.c000077500000000000000000000024051477201124000162000ustar00rootroot00000000000000#include #include // nsis plugin HINSTANCE g_hInstance; HWND g_hwndParent; // To work with Unicode version of NSIS, please use TCHAR-type // functions for accessing the variables and the stack. void __declspec(dllexport) myFunction(HWND hwndParent, int string_size, LPTSTR variables, stack_t **stacktop, extra_parameters *extra, ...) { EXDLL_INIT(); g_hwndParent = hwndParent; // note if you want parameters from the stack, pop them off in order. // i.e. if you are called via exdll::myFunction file.dat read.txt // calling popstring() the first time would give you file.dat, // and the second time would give you read.txt. // you should empty the stack of your parameters, and ONLY your // parameters. // do your stuff here { LPTSTR msgbuf = (LPTSTR) GlobalAlloc(GPTR, (3 + string_size + 1) * sizeof(*msgbuf)); if (msgbuf) { wsprintf(msgbuf, TEXT("$0=%s"), getuservariable(INST_0)); MessageBox(g_hwndParent, msgbuf, TEXT("Message from example plugin"), MB_OK); GlobalFree(msgbuf); } } } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance = hInst; return TRUE; } nsis-3.11/Contrib/ExDLL/exdll.dpr000077500000000000000000000053311477201124000165440ustar00rootroot00000000000000{ NSIS ExDLL example (C) 2001 - Peter Windridge Fixed and formatted by Brett Dever http://editor.nfscheats.com/ Tested in Delphi 7.0 } library exdll; uses Windows; type VarConstants = ( INST_0, INST_1, // $1 INST_2, // $2 INST_3, // $3 INST_4, // $4 INST_5, // $5 INST_6, // $6 INST_7, // $7 INST_8, // $8 INST_9, // $9 INST_R0, // $R0 INST_R1, // $R1 INST_R2, // $R2 INST_R3, // $R3 INST_R4, // $R4 INST_R5, // $R5 INST_R6, // $R6 INST_R7, // $R7 INST_R8, // $R8 INST_R9, // $R9 INST_CMDLINE, // $CMDLINE INST_INSTDIR, // $INSTDIR INST_OUTDIR, // $OUTDIR INST_EXEDIR, // $EXEDIR INST_LANG, // $LANGUAGE __INST_LAST ); TVariableList = INST_0..__INST_LAST; pstack_t = ^stack_t; stack_t = record next: pstack_t; text: PChar; end; var g_stringsize: integer; g_stacktop: ^pstack_t; g_variables: PChar; g_hwndParent: HWND; function PopString(): string; var th: pstack_t; begin if integer(g_stacktop^) <> 0 then begin th := g_stacktop^; Result := PChar(@th.text); g_stacktop^ := th.next; GlobalFree(HGLOBAL(th)); end; end; procedure PushString(const str: string=''); var th: pstack_t; begin if integer(g_stacktop) <> 0 then begin th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize)); lstrcpyn(@th.text, PChar(str), g_stringsize); th.next := g_stacktop^; g_stacktop^ := th; end; end; function GetUserVariable(const varnum: TVariableList): string; begin if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then Result := g_variables + integer(varnum) * g_stringsize else Result := ''; end; procedure SetUserVariable(const varnum: TVariableList; const value: string); begin if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value)) end; procedure NSISDialog(const text, caption: string; const buttons: integer); begin MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons); end; procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl; begin // setup global variables g_stringsize := string_size; g_hwndParent := hwndParent; g_stacktop := stacktop; g_variables := variables; // end global variable setup NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK); NSISDialog(PopString, 'pop', MB_OK); PushString('Hello, this is a push'); SetUserVariable(INST_0, 'This is user var $0'); end; exports ex_dll; begin end. nsis-3.11/Contrib/ExDLL/exdll.dsp000077500000000000000000000103721477201124000165460ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="exdll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=exdll - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "exdll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "exdll.mak" CFG="exdll - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "exdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "exdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "exdll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O1 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /D NSISCALL=__stdcall /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib /nologo /dll /machine:I386 # ADD LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib nsis\pluginapi.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/exdll.dll" /opt:nowin98 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "exdll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /D NSISCALL=__stdcall /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib nsis\pluginapi.lib /nologo /dll /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "exdll - Win32 Release" # Name "exdll - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\exdll.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\nsis\pluginapi.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project nsis-3.11/Contrib/ExDLL/exdll.dsw000077500000000000000000000010251477201124000165500ustar00rootroot00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "exdll"=.\exdll.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### nsis-3.11/Contrib/ExDLL/exdll.h000077500000000000000000000005251477201124000162060ustar00rootroot00000000000000// this file is for backward compatibility only // use the new plugin.h and plugin.lib directly for new plug-ins #ifndef _EXDLL_H_ #define _EXDLL_H_ #include #include // nsis plugin // this may not work if /NODEFAULTLIB is used #ifdef _MSC_VER # pragma comment(lib, "plugin.lib") #endif #endif//_EXDLL_H_ nsis-3.11/Contrib/ExDLL/exdll_with_unit.dpr000077500000000000000000000043501477201124000206360ustar00rootroot00000000000000{ NSIS ExDLL2 example Original is ExDLL (C) 2001 - Peter Windridge Changed with delphi unit nsis.pas by bernhard mayer Tested in Delphi 7.0 } // Example NSIS code { Section exdll_with_unit::registerplugincallback StrCpy $3 "Hello" Push "World" exdll_with_unit::pop_dlg_push Pop $1 DetailPrint $$1=$1 DetailPrint $$3=$3 GetFunctionAddress $0 nsistest Push $0 exdll_with_unit::callnsisfunc SectionEnd Function nsistest DetailPrint "Hello from NSIS function" FunctionEnd } library exdll; uses nsis, windows; {$IFDEF UNICODE} type TString = System.WideString; // UnicodeString? type PTChar = PWideChar; {$ELSE} type TString = AnsiString; type PTChar = PAnsiChar; {$ENDIF} procedure pop_dlg_push(const hwndParent: HWND; const string_size: integer; const variables: PTChar; const stacktop: pointer); cdecl; begin // set up global variables Init(hwndParent, string_size, variables, stacktop); NSISDialog(GetUserVariable(INST_3), 'The value of $3', MB_OK); NSISDialog(PopString, 'pop', MB_OK); PushString('Hello, this is a push'); SetUserVariable(INST_3, 'This is user var $3'); end; procedure callnsisfunc(const hwndParent: HWND; const string_size: integer; const variables: PTChar; const stacktop: pointer; const extraparameters: pointer); cdecl; var FuncAddr : TString; begin Init(hwndParent, string_size, variables, stacktop, extraparameters); FuncAddr := PopString(); Call(FuncAddr); end; function mynsiscallback(const NSPIM: TNSPIM): Pointer; cdecl; begin Result := nil; if NSPIM = NSPIM_UNLOAD then begin NSISDialog(PTChar('NSPIM_UNLOAD is the final callback, goodbye...'), PTChar('mynsiscallback'), MB_OK); end; end; procedure registerplugincallback(const hwndParent: HWND; const string_size: integer; const variables: PTChar; const stacktop: pointer; const extraparameters: pointer); cdecl; var ThisDllInstance : HMODULE; begin Init(hwndParent, string_size, variables, stacktop, extraparameters); if g_extraparameters <> nil then begin ThisDllInstance := hInstance; TRegisterPluginCallback(g_extraparameters.RegisterPluginCallback)(ThisDllInstance, @mynsiscallback); end; end; exports pop_dlg_push; exports callnsisfunc; exports registerplugincallback; begin end. nsis-3.11/Contrib/ExDLL/extdll.inc000077500000000000000000000056071477201124000167220ustar00rootroot00000000000000;################################################################ ; ExtDLL header for MASM32 ; ; Author: Ramon ; ; Obs: This header must be included after windows.inc and kernel32.inc ; because it need the prototypes for lstrcpy, lstrcpyn, ; GlobalAlloc and GlobalFree ; ;################################################################ stack_t struct next dd ? text dd ? ; 1 DUP(?) ; this should be the length of string_size stack_t ends .const ; For page showing plug-ins WM_NOTIFY_OUTER_NEXT equ (WM_USER+0x8) WM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd) NOTIFY_BYE_BYE equ 'x' INST_0 EQU 0 ; $0 INST_1 EQU 1 ; $1 INST_2 EQU 2 ; $2 INST_3 EQU 3 ; $3 INST_4 EQU 4 ; $4 INST_5 EQU 5 ; $5 INST_6 EQU 6 ; $6 INST_7 EQU 7 ; $7 INST_8 EQU 8 ; $8 INST_9 EQU 9 ; $9 INST_R0 EQU 10 ; $R0 INST_R1 EQU 11 ; $R1 INST_R2 EQU 12 ; $R2 INST_R3 EQU 13 ; $R3 INST_R4 EQU 14 ; $R4 INST_R5 EQU 15 ; $R5 INST_R6 EQU 16 ; $R6 INST_R7 EQU 17 ; $R7 INST_R8 EQU 18 ; $R8 INST_R9 EQU 19 ; $R9 INST_CMDLINE EQU 20 ; $CMDLINE INST_INSTDIR EQU 21 ; $INSTDIR INST_OUTDIR EQU 22 ; $OUTDIR INST_EXEDIR EQU 23 ; $EXEDIR INST_LANG EQU 24 ; $LANGUAGE __INST_LAST EQU 25 .data? g_stringsize dd ? g_stacktop dd ? g_variables dd ? m2m MACRO M1, M2 push M2 pop M1 ENDM EXDLL_INIT MACRO m2m g_stringsize, string_size m2m g_stacktop, stacktop m2m g_variables, variables ENDM .code ; utility functions (not required but often useful) popstring proc uses edi pStr:DWORD LOCAL th:DWORD mov edi, g_stacktop cmp edi, 0 jz STACK_ERR mov edi, [edi] cmp edi, 0 jz STACK_ERR ASSUME edi:PTR stack_t invoke lstrcpy, pStr, ADDR [edi].text mov th , edi mov edi, [edi].next mov eax, g_stacktop mov [eax], edi invoke GlobalFree, th ASSUME edi:PTR NOTHING mov eax, 0 ret STACK_ERR: mov eax, 1 ret popstring endp pushstring proc uses edi pStr:DWORD cmp g_stacktop, 0 jz STACK_ERR mov eax, sizeof stack_t add eax, g_stringsize invoke GlobalAlloc, GPTR, eax mov edi, eax assume edi:PTR stack_t invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize mov eax, g_stacktop push DWORD PTR[eax] mov [eax], edi pop eax ;lea edi, [edi].next ; Not needed [edi].next == edi mov DWORD PTR[edi], eax ASSUME edi:PTR NOTHING STACK_ERR: ret pushstring endp getuservariable proc varnum:DWORD .if varnum < 0 || varnum >= __INST_LAST xor eax, eax .else mov eax, varnum imul eax, g_stringsize add eax, g_variables .endif ret getuservariable endp setuservariable proc varnum:DWORD, var:DWORD .if (var != NULL && varnum >= 0 && varnum < __INST_LAST) mov eax, varnum imul eax, g_stringsize add eax, g_variables invoke lstrcpy, eax, var .endif ret setuservariable endp nsis-3.11/Contrib/ExDLL/nsis.pas000077500000000000000000000145071477201124000164130ustar00rootroot00000000000000{ Original Code from (C) 2001 - Peter Windridge Code in separate unit and some changes 2003 by Bernhard Mayer Fixed and formatted by Brett Dever http://editor.nfscheats.com/ simply include this unit in your plugin project and export functions as needed } unit nsis; interface uses windows, SysUtils {$IFNDEF FPC} ,CommCtrl {$ENDIF} {$IF FPC_FULLVERSION < 30000} ; This is probably wrong ,CommCtrl {$ENDIF} ; {$IFDEF UNICODE} type NSISTString = System.WideString; // UnicodeString? type NSISPTChar = PWideChar; {$ELSE} type NSISTString = AnsiString; type NSISPTChar = PAnsiChar; {$ENDIF} type VarConstants = ( INST_0, // $0 INST_1, // $1 INST_2, // $2 INST_3, // $3 INST_4, // $4 INST_5, // $5 INST_6, // $6 INST_7, // $7 INST_8, // $8 INST_9, // $9 INST_R0, // $R0 INST_R1, // $R1 INST_R2, // $R2 INST_R3, // $R3 INST_R4, // $R4 INST_R5, // $R5 INST_R6, // $R6 INST_R7, // $R7 INST_R8, // $R8 INST_R9, // $R9 INST_CMDLINE, // $CMDLINE INST_INSTDIR, // $INSTDIR INST_OUTDIR, // $OUTDIR INST_EXEDIR, // $EXEDIR INST_LANG, // $LANGUAGE __INST_LAST ); TVariableList = INST_0..__INST_LAST; type PluginCallbackMessages = ( NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup NSPIM_GUIUNLOAD // Called after .onGUIEnd ); TNSPIM = NSPIM_UNLOAD..NSPIM_GUIUNLOAD; //TPluginCallback = function (const NSPIM: Integer): Pointer; cdecl; TExecuteCodeSegment = function (const funct_id: Integer; const parent: HWND): Integer; stdcall; Tvalidate_filename = procedure (const filename: NSISPTChar); stdcall; TRegisterPluginCallback = function (const DllInstance: HMODULE; const CallbackFunction: Pointer): Integer; stdcall; pexec_flags_t = ^exec_flags_t; exec_flags_t = record autoclose: Integer; all_user_var: Integer; exec_error: Integer; abort: Integer; exec_reboot: Integer; reboot_called: Integer; XXX_cur_insttype: Integer; plugin_api_version: Integer; silent: Integer; instdir_error: Integer; rtl: Integer; errlvl: Integer; alter_reg_view: Integer; status_update: Integer; end; pextrap_t = ^extrap_t; extrap_t = record exec_flags: Pointer; // exec_flags_t; exec_code_segment: TExecuteCodeSegment; // TFarProc; validate_filename: Pointer; // Tvalidate_filename; RegisterPluginCallback: Pointer; //TRegisterPluginCallback; end; pstack_t = ^stack_t; stack_t = record next: pstack_t; text: NSISPTChar; end; var g_stringsize: integer; g_stacktop: ^pstack_t; g_variables: NSISPTChar; g_hwndParent: HWND; g_hwndList: HWND; g_hwndLogList: HWND; g_extraparameters: pextrap_t; procedure Init(const hwndParent: HWND; const string_size: integer; const variables: NSISPTChar; const stacktop: pointer; const extraparameters: pointer = nil); function LogMessage(Msg : String): BOOL; function Call(NSIS_func : String) : Integer; function PopString(): NSISTString; procedure PushString(const str: NSISTString=''); function GetUserVariable(const varnum: TVariableList): NSISTString; procedure SetUserVariable(const varnum: TVariableList; const value: NSISTString); procedure NSISDialog(const text, caption: NSISTString; const buttons: integer); implementation procedure Init(const hwndParent: HWND; const string_size: integer; const variables: NSISPTChar; const stacktop: pointer; const extraparameters: pointer = nil); begin g_stringsize := string_size; g_hwndParent := hwndParent; g_stacktop := stacktop; g_variables := variables; g_hwndList := FindWindowEx(FindWindowEx(g_hwndParent, 0, '#32770', nil), 0,'SysListView32', nil); g_extraparameters := extraparameters; end; function Call(NSIS_func : String) : Integer; var codeoffset: Integer; //The ID of nsis function begin Result := 0; codeoffset := StrToIntDef(NSIS_func, 0); if (codeoffset <> 0) and (g_extraparameters <> nil) then begin codeoffset := codeoffset - 1; Result := g_extraparameters.exec_code_segment(codeoffset, g_hwndParent); end; end; function LogMessage(Msg : String): BOOL; var ItemCount : Integer; item: TLVItem; begin Result := FAlse; if g_hwndList = 0 then exit; FillChar( item, sizeof(item), 0 ); ItemCount := SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0); item.iItem := ItemCount; item.mask := LVIF_TEXT; item.pszText := PChar(Msg); // Unicode bug? ListView_InsertItem(g_hwndList, item); ListView_EnsureVisible(g_hwndList, ItemCount, not 0); end; function PopString(): NSISTString; var th: pstack_t; begin if NativeUInt(g_stacktop^) <> 0 then begin th := g_stacktop^; Result := NSISPTChar(@th.text); g_stacktop^ := th.next; GlobalFree(HGLOBAL(th)); end; end; procedure PushString(const str: NSISTString=''); var th: pstack_t; begin if NativeUInt(g_stacktop) <> 0 then begin {$IFDEF UNICODE} th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + (g_stringsize * 2))); lstrcpynW(@th.text, PWideChar(str), g_stringsize); {$ELSE} th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + (g_stringsize ))); lstrcpynA(@th.text, PAnsiChar(str), g_stringsize); {$ENDIF} th.next := g_stacktop^; g_stacktop^ := th; end; end; function GetUserVariable(const varnum: TVariableList): NSISTString; begin if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then Result := g_variables + integer(varnum) * g_stringsize else Result := ''; end; procedure SetUserVariable(const varnum: TVariableList; const value: NSISTString); begin if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then {$IFDEF UNICODE} lstrcpyW(g_variables + integer(varnum) * (g_stringsize), PWideChar(value)) {$ELSE} lstrcpyA(g_variables + integer(varnum) * (g_stringsize), PAnsiChar(value)) {$ENDIF} end; procedure NSISDialog(const text, caption: NSISTString; const buttons: integer); var hwndOwner: HWND; begin hwndOwner := g_hwndParent; if not IsWindow(g_hwndParent) then hwndOwner := 0; // g_hwndParent is not valid in NSPIM_[GUI]UNLOAD {$IFDEF UNICODE} MessageBoxW(hwndOwner, PWideChar(text), PWideChar(caption), buttons); {$ELSE} MessageBoxA(hwndOwner, PAnsiChar(text), PAnsiChar(caption), buttons); {$ENDIF} end; begin end. nsis-3.11/Contrib/ExDLL/nsis_tchar.h000077500000000000000000000116761477201124000172440ustar00rootroot00000000000000/* * nsis_tchar.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * This software is provided 'as-is', without any express or implied * warranty. * * For Unicode support by Jim Park -- 08/30/2007 */ // Jim Park: Only those we use are listed here. #pragma once #ifdef _UNICODE #ifndef _T #define __T(x) L ## x #define _T(x) __T(x) #define _TEXT(x) __T(x) #endif #ifndef _TCHAR_DEFINED #define _TCHAR_DEFINED #if !defined(_NATIVE_WCHAR_T_DEFINED) && !defined(_WCHAR_T_DEFINED) typedef unsigned short TCHAR; #else typedef wchar_t TCHAR; #endif #endif // program #define _tenviron _wenviron #define __targv __wargv // printfs #define _ftprintf fwprintf #define _sntprintf _snwprintf #if (defined(_MSC_VER) && (_MSC_VER<=1310||_MSC_FULL_VER<=140040310)) || defined(__MINGW32__) # define _stprintf swprintf #else # define _stprintf _swprintf #endif #define _tprintf wprintf #define _vftprintf vfwprintf #define _vsntprintf _vsnwprintf #if defined(_MSC_VER) && (_MSC_VER<=1310) # define _vstprintf vswprintf #else # define _vstprintf _vswprintf #endif // scanfs #define _tscanf wscanf #define _stscanf swscanf // string manipulations #define _tcscat wcscat #define _tcschr wcschr #define _tcsclen wcslen #define _tcscpy wcscpy #define _tcsdup _wcsdup #define _tcslen wcslen #define _tcsnccpy wcsncpy #define _tcsncpy wcsncpy #define _tcsrchr wcsrchr #define _tcsstr wcsstr #define _tcstok wcstok // string comparisons #define _tcscmp wcscmp #define _tcsicmp _wcsicmp #define _tcsncicmp _wcsnicmp #define _tcsncmp wcsncmp #define _tcsnicmp _wcsnicmp // upper / lower #define _tcslwr _wcslwr #define _tcsupr _wcsupr #define _totlower towlower #define _totupper towupper // conversions to numbers #define _tcstoi64 _wcstoi64 #define _tcstol wcstol #define _tcstoul wcstoul #define _tstof _wtof #define _tstoi _wtoi #define _tstoi64 _wtoi64 #define _ttoi _wtoi #define _ttoi64 _wtoi64 #define _ttol _wtol // conversion from numbers to strings #define _itot _itow #define _ltot _ltow #define _i64tot _i64tow #define _ui64tot _ui64tow // file manipulations #define _tfopen _wfopen #define _topen _wopen #define _tremove _wremove #define _tunlink _wunlink // reading and writing to i/o #define _fgettc fgetwc #define _fgetts fgetws #define _fputts fputws #define _gettchar getwchar // directory #define _tchdir _wchdir // environment #define _tgetenv _wgetenv #define _tsystem _wsystem // time #define _tcsftime wcsftime #else // ANSI #ifndef _T #define _T(x) x #define _TEXT(x) x #endif #ifndef _TCHAR_DEFINED #define _TCHAR_DEFINED typedef char TCHAR; #endif // program #define _tenviron environ #define __targv __argv // printfs #define _ftprintf fprintf #define _sntprintf _snprintf #define _stprintf sprintf #define _tprintf printf #define _vftprintf vfprintf #define _vsntprintf _vsnprintf #define _vstprintf vsprintf // scanfs #define _tscanf scanf #define _stscanf sscanf // string manipulations #define _tcscat strcat #define _tcschr strchr #define _tcsclen strlen #define _tcscnlen strnlen #define _tcscpy strcpy #define _tcsdup _strdup #define _tcslen strlen #define _tcsnccpy strncpy #define _tcsrchr strrchr #define _tcsstr strstr #define _tcstok strtok // string comparisons #define _tcscmp strcmp #define _tcsicmp _stricmp #define _tcsncmp strncmp #define _tcsncicmp _strnicmp #define _tcsnicmp _strnicmp // upper / lower #define _tcslwr _strlwr #define _tcsupr _strupr #define _totupper toupper #define _totlower tolower // conversions to numbers #define _tcstol strtol #define _tcstoul strtoul #define _tstof atof #define _tstoi atoi #define _tstoi64 _atoi64 #define _tstoi64 _atoi64 #define _ttoi atoi #define _ttoi64 _atoi64 #define _ttol atol // conversion from numbers to strings #define _i64tot _i64toa #define _itot _itoa #define _ltot _ltoa #define _ui64tot _ui64toa // file manipulations #define _tfopen fopen #define _topen _open #define _tremove remove #define _tunlink _unlink // reading and writing to i/o #define _fgettc fgetc #define _fgetts fgets #define _fputts fputs #define _gettchar getchar // directory #define _tchdir _chdir // environment #define _tgetenv getenv #define _tsystem system // time #define _tcsftime strftime #endif // is functions (the same in Unicode / ANSI) #define _istgraph isgraph #define _istascii __isascii #define __TFILE__ _T(__FILE__) #define __TDATE__ _T(__DATE__) #define __TTIME__ _T(__TIME__) nsis-3.11/Contrib/ExDLL/pluginapi.c000077500000000000000000000160171477201124000170640ustar00rootroot00000000000000#include #include "pluginapi.h" #ifndef COUNTOF #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #endif // minimal tchar.h emulation #ifndef _T # define _T TEXT #endif #if !defined(TCHAR) && !defined(_TCHAR_DEFINED) # ifdef UNICODE # define TCHAR WCHAR # else # define TCHAR char # endif #endif #define isvalidnsisvarindex(varnum) ( ((unsigned int)(varnum)) < (__INST_LAST) ) unsigned int g_stringsize; stack_t **g_stacktop; LPTSTR g_variables; // utility functions (not required but often useful) int NSISCALL popstring(LPTSTR str) { stack_t *th; if (!g_stacktop || !*g_stacktop) return 1; th=(*g_stacktop); if (str) lstrcpy(str,th->text); *g_stacktop = th->next; GlobalFree((HGLOBAL)th); return 0; } int NSISCALL popstringn(LPTSTR str, int maxlen) { stack_t *th; if (!g_stacktop || !*g_stacktop) return 1; th=(*g_stacktop); if (str) lstrcpyn(str,th->text,maxlen?maxlen:g_stringsize); *g_stacktop = th->next; GlobalFree((HGLOBAL)th); return 0; } void NSISCALL pushstring(LPCTSTR str) { stack_t *th; if (!g_stacktop) return; th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(*str))); lstrcpyn(th->text,str,g_stringsize); th->next=*g_stacktop; *g_stacktop=th; } LPTSTR NSISCALL getuservariable(const int varnum) { if (!isvalidnsisvarindex(varnum)) return NULL; return g_variables+varnum*g_stringsize; } void NSISCALL setuservariable(const int varnum, LPCTSTR var) { if (var && isvalidnsisvarindex(varnum)) lstrcpy(g_variables + varnum*g_stringsize, var); } #ifdef UNICODE int NSISCALL PopStringA(LPSTR ansiStr) { LPWSTR wideStr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*sizeof(WCHAR)); int rval = popstring(wideStr); WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); GlobalFree((HGLOBAL)wideStr); return rval; } int NSISCALL PopStringNA(LPSTR ansiStr, int maxlen) { int realLen = maxlen ? maxlen : g_stringsize; LPWSTR wideStr = (LPWSTR) GlobalAlloc(GPTR, realLen*sizeof(WCHAR)); int rval = popstringn(wideStr, realLen); WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL); GlobalFree((HGLOBAL)wideStr); return rval; } void NSISCALL PushStringA(LPCSTR ansiStr) { LPWSTR wideStr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); pushstring(wideStr); GlobalFree((HGLOBAL)wideStr); return; } void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr) { lstrcpyW(wideStr, getuservariable(varnum)); } void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr) { LPWSTR wideStr = getuservariable(varnum); WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); } void NSISCALL SetUserVariableA(const int varnum, LPCSTR ansiStr) { if (ansiStr && isvalidnsisvarindex(varnum)) { LPWSTR wideStr = g_variables + varnum * g_stringsize; MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); } } #else // ANSI defs int NSISCALL PopStringW(LPWSTR wideStr) { LPSTR ansiStr = (LPSTR) GlobalAlloc(GPTR, g_stringsize); int rval = popstring(ansiStr); MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); GlobalFree((HGLOBAL)ansiStr); return rval; } int NSISCALL PopStringNW(LPWSTR wideStr, int maxlen) { int realLen = maxlen ? maxlen : g_stringsize; LPSTR ansiStr = (LPSTR) GlobalAlloc(GPTR, realLen); int rval = popstringn(ansiStr, realLen); MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen); GlobalFree((HGLOBAL)ansiStr); return rval; } void NSISCALL PushStringW(LPWSTR wideStr) { LPSTR ansiStr = (LPSTR) GlobalAlloc(GPTR, g_stringsize); WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); pushstring(ansiStr); GlobalFree((HGLOBAL)ansiStr); } void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr) { LPSTR ansiStr = getuservariable(varnum); MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); } void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr) { lstrcpyA(ansiStr, getuservariable(varnum)); } void NSISCALL SetUserVariableW(const int varnum, LPCWSTR wideStr) { if (wideStr && isvalidnsisvarindex(varnum)) { LPSTR ansiStr = g_variables + varnum * g_stringsize; WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); } } #endif // playing with integers INT_PTR NSISCALL nsishelper_str_to_ptr(LPCTSTR s) { INT_PTR v=0; if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) { s++; for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; else break; v<<=4; v+=c; } } else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) { for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('7')) c-=_T('0'); else break; v<<=3; v+=c; } } else { int sign=0; if (*s == _T('-')) sign++; else s--; for (;;) { int c=*(++s) - _T('0'); if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) v = -v; } return v; } unsigned int NSISCALL myatou(LPCTSTR s) { unsigned int v=0; for (;;) { unsigned int c=*s++; if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else break; v*=10; v+=c; } return v; } int NSISCALL myatoi_or(LPCTSTR s) { int v=0; if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) { s++; for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; else break; v<<=4; v+=c; } } else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) { for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('7')) c-=_T('0'); else break; v<<=3; v+=c; } } else { int sign=0; if (*s == _T('-')) sign++; else s--; for (;;) { int c=*(++s) - _T('0'); if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) v = -v; } // Support for simple ORed expressions if (*s == _T('|')) { v |= myatoi_or(s+1); } return v; } INT_PTR NSISCALL popintptr() { TCHAR buf[128]; if (popstringn(buf,COUNTOF(buf))) return 0; return nsishelper_str_to_ptr(buf); } int NSISCALL popint_or() { TCHAR buf[128]; if (popstringn(buf,COUNTOF(buf))) return 0; return myatoi_or(buf); } void NSISCALL pushintptr(INT_PTR value) { TCHAR buffer[30]; wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value); pushstring(buffer); } nsis-3.11/Contrib/ExDLL/pluginapi.h000077500000000000000000000061141477201124000170660ustar00rootroot00000000000000#ifndef ___NSIS_PLUGIN__H___ #define ___NSIS_PLUGIN__H___ #ifdef __cplusplus extern "C" { #endif #include "api.h" #include "nsis_tchar.h" // BUGBUG: Why cannot our plugins use the compilers tchar.h? #ifndef NSISCALL # define NSISCALL WINAPI #endif #define EXDLL_INIT() { \ g_stringsize=string_size; \ g_stacktop=stacktop; \ g_variables=variables; } typedef struct _stack_t { struct _stack_t *next; #ifdef UNICODE WCHAR text[1]; // this should be the length of g_stringsize when allocating #else char text[1]; #endif } stack_t; enum { INST_0, // $0 INST_1, // $1 INST_2, // $2 INST_3, // $3 INST_4, // $4 INST_5, // $5 INST_6, // $6 INST_7, // $7 INST_8, // $8 INST_9, // $9 INST_R0, // $R0 INST_R1, // $R1 INST_R2, // $R2 INST_R3, // $R3 INST_R4, // $R4 INST_R5, // $R5 INST_R6, // $R6 INST_R7, // $R7 INST_R8, // $R8 INST_R9, // $R9 INST_CMDLINE, // $CMDLINE INST_INSTDIR, // $INSTDIR INST_OUTDIR, // $OUTDIR INST_EXEDIR, // $EXEDIR INST_LANG, // $LANGUAGE __INST_LAST }; extern unsigned int g_stringsize; extern stack_t **g_stacktop; extern LPTSTR g_variables; void NSISCALL pushstring(LPCTSTR str); void NSISCALL pushintptr(INT_PTR value); #define pushint(v) pushintptr((INT_PTR)(v)) int NSISCALL popstring(LPTSTR str); // 0 on success, 1 on empty stack int NSISCALL popstringn(LPTSTR str, int maxlen); // with length limit, pass 0 for g_stringsize INT_PTR NSISCALL popintptr(); #define popint() ( (int) popintptr() ) int NSISCALL popint_or(); // with support for or'ing (2|4|8) INT_PTR NSISCALL nsishelper_str_to_ptr(LPCTSTR s); #define myatoi(s) ( (int) nsishelper_str_to_ptr(s) ) // converts a string to an integer unsigned int NSISCALL myatou(LPCTSTR s); // converts a string to an unsigned integer, decimal only int NSISCALL myatoi_or(LPCTSTR s); // with support for or'ing (2|4|8) LPTSTR NSISCALL getuservariable(const int varnum); void NSISCALL setuservariable(const int varnum, LPCTSTR var); #ifdef UNICODE #define PopStringW(x) popstring(x) #define PushStringW(x) pushstring(x) #define SetUserVariableW(x,y) setuservariable(x,y) int NSISCALL PopStringA(LPSTR ansiStr); void NSISCALL PushStringA(LPCSTR ansiStr); void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr); void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr); void NSISCALL SetUserVariableA(const int varnum, LPCSTR ansiStr); #else // ANSI defs #define PopStringA(x) popstring(x) #define PushStringA(x) pushstring(x) #define SetUserVariableA(x,y) setuservariable(x,y) int NSISCALL PopStringW(LPWSTR wideStr); void NSISCALL PushStringW(LPWSTR wideStr); void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr); void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr); void NSISCALL SetUserVariableW(const int varnum, LPCWSTR wideStr); #endif #ifdef __cplusplus } #endif #endif//!___NSIS_PLUGIN__H___ nsis-3.11/Contrib/Graphics/000077500000000000000000000000001477201124000155505ustar00rootroot00000000000000nsis-3.11/Contrib/Graphics/Checks/000077500000000000000000000000001477201124000167505ustar00rootroot00000000000000nsis-3.11/Contrib/Graphics/Checks/big.bmp000077500000000000000000000015661477201124000202240ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØ ÝÝÝÝÝÝÝ ÝÝÝÝÝÝÝØÝÝÝÝÝÐ ÝÝÝÝÝÐ ÝÝÝÝÝÐ wwwwwp wwwwwp ÝÝÝÝÝÝÝÝÝÝÝÝÐ ÝÙÝÝÝÐ ÝØÝÝÝÐ wwwwwp wpwwwp ÝÝÝÝÝÝÝØÝÝÝÝÝÐ ÝÙÝÝÐ ÝØÝÝÐ wwwwwp wpwwp ÝÝÝÝÝÝÝÝÝÝÝÝÐ ÝÙ™ÝÝÐ ÝØˆÝÝÐ wwwwwp wpwwp ÝÝÝÝÝÝÝØÝÝÝÝÝÐ Ý™ÙÝР݈ØÝÐ wwwwwp wpwp ÝÝÝÝÝÝÝÝÝÝÝÝÐ Ù™ÙÝР؈ØÝÐ wwwwwp ppwp ÝÝÝÝÝÝÝØÝÝÝÝÝÐ ÙÝ™ÝÐ ØÝˆÝÐ wwwwwp pwwp ÝÝÝÝÝÝÝÝÝÝÝÝÐ ÝÝÝÙÐ ÝÝÝØÐ wwwwwp wwwpp ÝÝÝÝÝÝÝØÝÝÝÝÝÐ ÝÝÝÝ™Ý ÝÝÝÝˆÝ wwwwwp wwwww ÝÝÝÝÝÝÝÝÝÝÝÝÐ ÝÝÝÝÙÝ ÝÝÝÝØÝ wwwwwp wwwwpw ÝÝÝÝÝÝÝØÝÝÝÝÝÐ ÝÝÝÝÝÝÝÝÝÝÝÝwwwwwp wwwww}ÝÝÝÝÝÝÝ ÝÙÝÝØÝ wp}ÝÝÝÝÝÝÝØ ÝÝ w ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝnsis-3.11/Contrib/Graphics/Checks/classic-cross.bmp000077500000000000000000000015661477201124000222330ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ×wwwwww}×wwwwww}×wwwwww}×wwwwww}×wwwwww}ÝÝÝÝÝÝÝØØ}Ø}Ø}Ø}Ø}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Øwwwwp}Øwwwwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÐ}Ø wÝÝwÐ}Øwwwwp}؈wwˆp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÐÐ}Ø w}×wÐ}Øwwwwp}؈‡xˆp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø Ð Ð}Ø ×ww}Ð}Øwwwwp}Øxˆˆ‡p}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÐ}Ø ÝwwÝÐ}Øwwwwp}Øwˆˆwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÐ}Ø ÝwwÝÐ}Øwwwwp}Øwˆˆwp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø Ð Ð}Ø ×ww}Ð}Øwwwwp}Øxˆˆ‡p}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÐÐ}Ø w}×wÐ}Øwwwwp}؈‡xˆp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÐ}Ø wÝÝwÐ}Øwwwwp}؈wwˆp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Øwwwwp}Øwwwwp}ÝÝÝÝÝÝÝØ}Ø}Ø}Ø}Ø}ÝÝÝÝÝÝÝØØˆˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝnsis-3.11/Contrib/Graphics/Checks/classic.bmp000077500000000000000000000015661477201124000211040ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ×wwwwww}×wwwwww}×wwwwww}×wwwwww}×wwwwww}ÝÝÝÝÝÝÝØØ}Ø}Ø}Ø}Ø}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Øwwwwp}Øwwwwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø Ý ÝÝÐ}Ø Ý}ÝÝÐ}Øwwwwp}Øw‡wwp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÐÝÝÐ}Ø ×wÝÝÐ}Øwwwwp}Øxˆwwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÐ}Ø ww}ÝÐ}Øwwwwp}؈ˆ‡wp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÐÝÐ}Ø w×wÝÐ}Øwwwwp}؈xˆwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø Ý Ð}Ø wÝw}Ð}Øwwwwp}؈wˆ‡p}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÐÐ}Ø ÝÝ×wÐ}Øwwwwp}Øwwxˆp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÝÐ}Ø ÝÝÝwÐ}Øwwwwp}Øwwwˆp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÝÐÐ}Ø ÝÝÝ×Ð}Øwwwwp}Øwwwxp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Øwwwwp}Øwwwwp}ÝÝÝÝÝÝÝØ}Ø}Ø}Ø}Ø}ÝÝÝÝÝÝÝØØˆˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝnsis-3.11/Contrib/Graphics/Checks/colorful.bmp000077500000000000000000000047201477201124000213030ustar00rootroot00000000000000BMÐ Î(`  ææÿÿÿýúõÐýõçîµCï·Iï¹PðºRïºTðºVð»Xð¾_ñ¿aòÃdñÀeñÃjòÅkòÅpòÆqòÇsòÈvóÊxóÉzóÊ}ôÍôÌ‚ô΂õψôЊûìÎûîÔûï×üñÜýöéþûõÿþüìªì­ í°1ï¸Eð½IñÂaôσøà¬úëÌûìÍûíÐë¨à¡ÝŸÕšê¨ Ò™ ìªí²&ä®+Û¨+ä´?ïÛªúëÈüñ×È“¾» ¶Š Ëœ!Çœ&Ñ£+Ѫ?Ï©?òåÃôèÈóçÈúòܳ‡°…­…ªƒ¸Œ ÿþûþýú£|—x–w“urŠpƒknYòèÛÑÄÁ½¹±«¡œ‘…dÿþåÍÊÇ ÿÿÿÿÜ ÿ×$$ö$$ë$$ã,,ÿ22ÿ66ÿ::ÿ99ó==ÿ??ÿ99á99ÞBBÿJJÿQQÿTTÿWWÿZZÿ\\ÿaaÿffÿiiÿkkÿnnÿppÿssÿuuÿyyÿ{{ÿ||ÿÿ§§ÿ§§öÆÆÿÁÁ÷ÊÊÿÆÆùÍÍÿÒÒÿÖÖÿØØÿÛÛýääÿççÿõõþúúÿûûÿÿÿÿýýýüüüúúúóóóòòòìììëëëèèèçççåååäääãããßßßÜÜÜÓÓÓÎÎο¿¿½½½¼¼¼»»»ººº¸¸¸¶¶¶´´´²²²°°°­­­«««ªªª¨¨¨¤¤¤   žžžœœœššš™™™–––ŽŽŽŒŒŒ‹‹‹‰‰‰†††„„„‚‚‚€€€zzzxxxuuunnnhhhfffbbb```^^^]]]XXXVVVQQQNNNIIICCC222,,,äääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääW/14A?KQSVXYääáÒÔÕÓ×ÚÝßáâãääääfiZksl_bdfghääää&$39:D?LQTWXääËÏÑʵË×ÚÝßáâäääärpj}–€l`bdfgääää&(;"GE?LQTWääÊËű¨²Ì×ÛÝßáääääyt‚—¢šm`cdfääää.¥PGENMRUääÆÀ¯¦¥§²Í×ÜÞàääää~‡›£¥£šmaceääääO¥¥¥PGENMRääÀ®¦¥¥¥§²Í×ÜÞäää䈛¤¥¥¥£šmacääää!¥O!¥PHE@Mä佪¥¦©¦¥§²ÍØÜääää‹ ¥¤¡£¥£šnaääää!#.¥PFBJä仩¦­»¯¦¥§³ÓÙäää䡤œŽ™£¥£˜u^ääää  ¥IC>ää·ª¬½ÆÂ¯¦¥¬Ñ×ääää’ žŒ|…™£¥Ÿx]ääää,  I8=ää¶±¶ÃÅǯ¦«ÎÖääää”—”„‚{…™£Ÿw\ääää )-<72ää¹·½ÁÄÆÉð¬ËÕäää䑓Іƒz„™v[ääää* )+60ää·º¼¾ÁÄÆÉôËÓääää’‰†ƒz„•tZääää5 '%Määиº½¿ÁÄÆÉÈÎÜääääo‘Œ‰†ƒ~z{qaääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääänsis-3.11/Contrib/Graphics/Checks/grey-cross.bmp000077500000000000000000000015661477201124000215600ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝÝØØwwwwwwØwwwwwwØwwwwwwØwwwwwwØwwwwwwÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝÝÝר}ÝÝÝÝרwwwwwwØwwwwwwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}ÝÝר}wÝÝwרwwwwwwØwˆwwˆwÝÝÝÝÝÝÝØ}ÝÝÝÝר} Ðר}w}×wרwwwwwwØwˆ‡xˆwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}Ð ×Ø}×ww}רwwwwwwØwxˆˆ‡wÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝר}ÝwwÝרwwwwwwØwwˆˆwwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}ÝÝר}ÝwwÝרwwwwwwØwwˆˆwwÝÝÝÝÝÝÝØ}ÝÝÝÝר}Ð ×Ø}×ww}רwwwwwwØwxˆˆ‡wÝÝÝÝÝÝÝØØ}ÝÝÝÝר} Ðר}w}×wרwwwwwwØwˆ‡xˆwÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝר}wÝÝwרwwwwwwØwˆwwˆwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}ÝÝÝÝר}ÝÝÝÝרwwwwwwØwwwwwwÝÝÝÝÝÝÝØwwwwwwØwwwwwwØwwwwwwØwwwwwwØwwwwwwÝÝÝÝÝÝÝØØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝnsis-3.11/Contrib/Graphics/Checks/grey.bmp000077500000000000000000000015661477201124000204310ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝÝØØwwwwwwØwwwwwwØwwwwwwØwwwwwwØwwwwwwÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝÝÝר}ÝÝÝÝרwwwwwwØwwwwwwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}Ð ÝÝר}×}ÝÝרwwwwwwØwx‡wwwÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝר}wwÝÝרwwwwwwØwˆˆwwwÝÝÝÝÝÝÝØØ}ÝÝÝÝר} Ýר}ww}ÝרwwwwwwØwˆˆ‡wwÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÐÝר}w×wÝרwwwwwwØwˆxˆwwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}ÝÝ ×Ø}ÝÝw}רwwwwwwØwwwˆ‡wÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝÐר}ÝÝ×wרwwwwwwØwwwxˆwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}ÝÝÝר}ÝÝÝwרwwwwwwØwwwwˆwÝÝÝÝÝÝÝØ}ÝÝÝÝר}ÝÝÝÐר}ÝÝÝ×רwwwwwwØwwwwxwÝÝÝÝÝÝÝØØ}ÝÝÝÝר}ÝÝÝÝר}ÝÝÝÝרwwwwwwØwwwwwwÝÝÝÝÝÝÝØwwwwwwØwwwwwwØwwwwwwØwwwwwwØwwwwwwÝÝÝÝÝÝÝØØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝnsis-3.11/Contrib/Graphics/Checks/modern.bmp000077500000000000000000000031641477201124000207430ustar00rootroot00000000000000BMtr(`4 4 ÿÿ€€!¥!½ÎÎÞççÖÞÞï÷÷çïïÿÿÿ÷÷÷ïïïçççÞÞÞ„„„                                                                                        nsis-3.11/Contrib/Graphics/Checks/red-round.bmp000077500000000000000000000015661477201124000213620ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ݈ˆˆˆˆˆÝ݈ˆˆˆˆˆÝÝÝÝÝÝÝÝØÐ Ð Ð ØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝÝ ÝÝÝÝÐ ÝÝÝÐ ÝÝÝЈ‡wwwwxˆˆ‡wwwxˆÝÝÝÝÝÝÝØÝÝÝÝÝÝÝÑ‘ÝÝÝÝØxÝÝ݈wwwwwwˆˆwqwwwˆÝÝÝÝÝÝÝÝÝÝÝÝÝÝ™ÝÝ݇wÝ݈wwwwwwˆˆwˆwwˆÝÝÝÝÝÝÝØÝÝÝÝÝÝÑ™™ÝÝØwwÝ݈wwwwwwˆˆqˆˆwwˆÝÝÝÝÝÝÝÝÝÝÝÝÝÙÙ‘ÝÝ×}×xÝ݈wwwwwwˆˆx‡xwwˆÝÝÝÝÝÝÝØÝÝÝÝÝÝÝÝÙ‘ÝÝÝÝ×xÝ݈wwwwwwˆˆwwxwwˆÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ™ÝÝÝÝw݈wwwwwwˆˆwwwˆwˆÝÝÝÝÝÝÝØÝÝÝÝÝÝÝÝÝÙ‘ÝÝÝÝ×x݈wwwwwwˆˆwwwxwˆÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ‘ÝÝÝÝÝx݈wwwwwwˆˆwwwwwˆÝÝÝÝÝÝÝØÝÝÝÝÝÝÝÝÝÝÙÝÝÝÝ׈wwwwwwˆˆwwwwxˆÝÝÝÝÝÝÝ ÝÝÝÝÐ ÝÝÝÝ ÝÝÝÝpˆ‡wwwwxˆˆ‡wwwwˆˆÝÝÝÝÝÝÝØÐ Ð Ð ØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝ݈ˆˆˆˆˆÝ݈ˆˆˆˆˆÝnsis-3.11/Contrib/Graphics/Checks/red.bmp000077500000000000000000000015661477201124000202350ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆÝÝÝÝÝÝÝØxwwwwwwxwwwwwwxwwwwwwxwwwwwwxwwwwwwÝÝÝÝÝÝÝx}ÝÝÝÝ×x}ÙÝÝ×x}×}ÝÝ×xwwwwwwxwx‡wwwÝÝÝÝÝÝÝØx}ÝÝÝÝ×x}y—ÝÝ×x}wwÝÝ×xwwwwwwxwx‡wwwÝÝÝÝÝÝÝx}ÝÝÝÝ×x}™™ÝÝ×x}wwÝÝ×xwwwwwwxwˆˆwwwÝÝÝÝÝÝÝØx}ÝÝÝÝ×xy™™Ý×xwww}Ý×xwwwwwwxxˆˆ‡wwÝÝÝÝÝÝÝx}ÝÝÝÝ×xy—Ù—Ý×xww×wÝ×xwwwwwwxx‡x‡wwÝÝÝÝÝÝÝØx}ÝÝÝÝ×x}Ý×™Ý×x}Ý×wÝ×xwwwwwwxwwwˆwwÝÝÝÝÝÝÝx}ÝÝÝÝ×x}ÝÝy×x}ÝÝw}×xwwwwwwxwwwx‡wÝÝÝÝÝÝÝØx}ÝÝÝÝ×x}ÝÝ×™×x}ÝÝ×w×xwwwwwwxwwwwˆwÝÝÝÝÝÝÝx}ÝÝÝÝ×x}ÝÝÝy—x}ÝÝÝwwxwwwwwwxwwwwx‡ÝÝÝÝÝÝÝØx}ÝÝÝÝ×x}ÝÝÝÝ—x}ÝÝÝÝwxwwwwwwxwwwww‡ÝÝÝÝÝÝÝxwwwwwwxwwwwwwxwwwwwwxwwwwwwxwwwwwwÝÝÝÝÝÝÝØxˆˆˆˆˆˆxˆˆˆˆˆˆxˆˆˆˆˆˆxˆˆˆˆˆˆxˆˆˆˆˆˆwwwwwwwÝwwwwwwwÝwwwwwwwÝwwwwwwwÝwwwwwwwÝnsis-3.11/Contrib/Graphics/Checks/simple-round.bmp000077500000000000000000000031201477201124000220650ustar00rootroot00000000000000BMPN(`ÃÃÿÿ@ÀÿÿÿÀÀÀ€€€nsis-3.11/Contrib/Graphics/Checks/simple-round2.bmp000077500000000000000000000034641477201124000221620ustar00rootroot00000000000000BM42(`ÃÃ??ÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÀÀÀÿÿÿÿÿÿÞÝÞ¼¼»§âˆ@À@ÀAÀBÁAÀBÁCÁCÁDÁ[É#iÎ7jÎ7jÎ8kÎ9~ÔR~ÔSŒÙd‹ÙeŒÙešÞwšÝwšÞx¦âˆ¦â‰±æ˜²æ˜©ª©›œœæææâââÞÞÞÙÙÙÔÔÔÎÎÎÉÉɲ²²©©©œœœƒƒƒ‚‚‚€€€>>>>>>>>>>>>== = << < ;; ;88 :: :7888  788899  6777777 111112115+115555120000000000*000044400""""!" """//////////////////33//#$%####%###. .......... .........&'&&''''&&&------------------------)()(()((((,,,,,,,,,,,,,,,,,,,,nsis-3.11/Contrib/Graphics/Checks/simple.bmp000077500000000000000000000031201477201124000207400ustar00rootroot00000000000000BMPN(`ÃÃÿÿ@ÀÿÿÿÀÀÀ€€€nsis-3.11/Contrib/Graphics/Header/000077500000000000000000000000001477201124000167405ustar00rootroot00000000000000nsis-3.11/Contrib/Graphics/Header/nsis-r.bmp000077500000000000000000000230201477201124000206530ustar00rootroot00000000000000BM&6(–9Ú!  ÿÿÿ˜ˆ§©™´¶§À{i‰w޵¤µÀ­¿uaqɸƄЯ±·ÖÇË͜ߴ»Öœ¤Ó¾Á¿‡ŽÞ¤«í±´å«®ÞÃÃÿþþýüüÓ›™Ü®«â§¢ë¯«ò·²ã¶³íÁ½ç¿ಭ湴꾹ïÆÁ㽹ʘ֥œîº¯“Žê½´ïÊÂÑ·²îƽîÉÀв«çÈÁøëèýùøüø÷™|tñÎÄ·ž—Å«¤ùîëøíêüõóLð³庬¥‰€ìǼîɾñÑÇó×ÎôÚÒñÛÔöåàõåàúðíùïì΀cЃgÏ‚fσgσhÏ„hÐ…iÐ…jІkчlшmÒ‰nщnÒŠoÑŠpÓsÔŽtâ™ÔwÖ’yÕ‘xÞ—~Ö“zÕ’y×”{ו}Ö“|Õ”|ß›ƒÖ•~×–×—€ãŸˆÙ›„ÞŸˆä¤ŽÚŸ‰Ü¢æ«–„dYç°ÏŒë´¡Šj_ஜԥ•깨Ტ콬îÀ°’wmîôîŶéµíǹêÄ·æÁ´Øµ©êƹèĸîË¿äĹîÍÂëË¿¿¥œëÌÁíÏÄòÔÊíÑÇéÎÄîÓÉïÔËðØÏï×ÎòÛÓôÞÖòÝÖóߨòÞ×óàÙôâÜôãÝõåßöçâõæá÷éäöèãõçâ÷ìèúñîùðíúòïùñîþûúýúùІiÒ‰mÑŠoÒ‹pÒŒqÓŽsÓŽtÔuÚ–|Õ“zÖ•|Ú˜ט€Øš‚Ú†¯„rݦ‘ߪ–qe㷦澮çÁ±á¼­íÉ»êÈ»ëʽì˾ìÎÂíÐÅïÖÌðÙÐñÚÑñÛÒòÝÕñÜÔôâÛöçá÷êåøìç÷ëæü÷õûöôÆ”~Õ®çË¿ñÜÓòÞÕòàØøíè÷ìçûôñúóð•p]¾xŸyg¦€mÆš…•vfܳžéÅ´ñÞÕøîéûõòþüûýûúЀ·Šrùðëùòîûöóð½šÌ¥ŠÒ«‘ðÆ©þûùÂ’oðµ‹ð«p»‹ZþýüïžGÞ¹Žê¤IÞ¶„Ì—KÔ¢Sׯgÿÿþþþýÿööæç¦¦112ÏÏÐì9ÙÙ££¡FG8780ÎÌ›ËEš™™Ê——•–ÈÉCÆÆ‘ÄÄŽŽŒÃɇÀÀ¿‚‚}}€¼¼»»<<<ººººwwwwtttt¸¸¸¸····mmmmllµµi´´³³ffa``__\Z®­­W«ªUSTRQQQPNNMLKJJJHHHHHHþþöæç¥¦112ÏÏÐÐ9ÙÙ££¡F¢77ä×ÎÌÌž›œEš™˜Ê—•–”ÉCÆÆ‘ÄÄŽŽŽŒÃŠÂ‰‡ÀÀ¿¿‚ƒƒ}€¼¼»»»<<<ººººwwwtttt¸¸¸¸····mmmmlllµii´´³ffab`^_\ZZ®XWW«ª©S¨RQPPONMMKJJJHHHHHHÿö¥çñ11122ÐÐ99ÙÙ£¡¤¢ê7880ÎÌÌžŸœšš™™Ê—•–”ÈÔÆÆÅ‘‘ÄŽŽŒŒŠŠ‰‰‡À¿¿‚ƒ}€€¼¼»»<<<ººººwwwwttt¸¸¸¸····mmmjjjjµµii´³ffaa`°_\Z®®­­WW«USTRQQPONNIKJJJHHHHHHþ¥çñ¦1122ÏÐÐ9ÙÙ££¡¢G7880ØÌžœDšš˜˜——Ö–”ÉCÆÅ‘ÄŽŽŒŒÃ‰‡‡¿¿‚‚ƒ}€¼¼»»<<<<ºººwwwwttt¸nnkkkkkkkhjhjjjµiii´³ffa±c__ZZ®­­WWªUUTRQQPPONMKKJJHJHHHHþÿ楥¦1122ÏÏÐìÙÙÚ££¤¢7780ÍÎÌ››Ešš™˜Ê—•–”ÈÉÇÆÅ‘‘ÄŽŒŒÃŠÂ‰‰ÀÀ¿¿‚ƒƒ}}€¼»»»<<<ºººwwwtpnnnnkkkkkkkhhhhhhddddi´²³fa±^^_\ZZ®­WWªªUSRRQQPONNMKJJJJHHHHöæçç¦112ÏÏÐì9ÙÚ£ë¡GG788ÍÎÌÌž›œEš™™ÊÊ•–”ÈÉÇÆÅ‘ÄŽŽŒŒŠŠÂ‰‡À¿¿‚‚ƒƒ}€¼»»»<<<ºººwwppnnnnn6ˆˆ555555ˆ6.kkhhddd²²ffa`°__\Z®­¬W«ªUUT¨QQQONNIIJJJHHHHHö¥¥¦¦1122ÏÐÐ9ÙÙÚ£¡¢G7880ÎÎÌ›ŸDšš™˜Ê—•–”ÈCÆÆÄÄŽŽŽŒÃŠÂ‰‡‡À¿¿‚ƒƒ€€¼»»»<<ºººwppppp65=33zzzzzzzz3=(ˆ.hhdd²²²fab°°_\Z®X­WW«ªUSRRQPO§NMKKJJJHHHHþÿöæçç11122ÏÐ9åÙÙ£¡¤¢G8ä8ØÎÌž›œšš™˜Ê——–”ÈÉÇÆÅ‘ÄŽŽŒÃŠÂ‰‡ÀÀ¿‚ƒƒ}€€¼»»»<<ººrppppˆ(=====éÜÜÜé¶Þ3ss¹3=56hhd]²²aa`°_\Z®®­WWWªUSTRQPOOOMMKJJJHHHHþöææçñ¦1122ÏÐÐ9ÙÚÚ£¡GG788ÍÍÌÌ›ËDšš™Ê——•–ÈÉÔÆÆ‘ÄŽŒÃʉ‰ÀÀ¿‚‚ƒ}€¼¼»»<?„*-½ˆ6!''}»ºtuso¹=ˆhd]²a``_\ZZ®­WW«ªªUTRQPPONMKIJJJHHHö楦111ÏÏÐ99ÙÚ££¤¢G788×ÎÌžžŸEš™˜˜——•–”ÈCÆÅ‘ÄŽŽŒŒÃŠÂ‰‡ÀÀ¿‚‚ƒ€}¼»»vrr6((uá½¼¾-*444$ßàz5€-,¼ºw&%3os35hd]¯a`[_\Z®®¬WWªª©TRRQPONNNKKJJHJHöö¥ç¦¦112ÏÐÐ9ÙÙÚÚ¡F¢G7ä8ÎÌÌž›œšš™˜Ê—•–”ÈCCÆÄÄŽŒŒÃŠÂ‰‰‡À¿¿‚‚}€¼»vvv6((Òá»â~„44@@Š…îûûszˆ…-,')< &%¶ss35hd]¯a^_\ZZ®XWW«ªUSRRQQO§NNIIJJJHHþþöæ¥çç¦112ÏÏÐ99ÙÚ££¤GG7800ÎÌž›œEš™™Ê——•”ÈÉCÆÅ‘ÄŽŽŒÃʉ‰ÀÀ¿‚‚ƒ}¼»vvw((ẻ⾄44@@@…îüùùûÛ3ˆ…-,')! &%¶ss3ˆhY¯¯`^\\Z®XWW«ªUUSRRQQPONMKJJJHHöö¥ç¦¦122ÏÏ99ÙÙÚ£¡FG77ä0ØÌÌ›Ëœšš™˜Ê—•–”ÈCÇÆ‘ÄÄŽŒŒÃŠÂ‡‡À¿¿‚ƒ}})xvv((ƒâ~„44@@Ž…ïüù÷÷ùûÛ3ˆ…?,')--,'"!ºtuÜos=6d]¯`[\\®®­WWªUUSSRQPP§NMMKJJJöööææçç¦122ÏÏÐÐÙÙÚ£¡F¢G7880ÎÌž›œEš™™ÊÊ•–”ÈÉCÆÅ‘ÄŽŒÃɉ‡ÀÀ¿}xx6(Òº½¼â¾„44@@@@…ÒðííóôôõÞ†**-,,')|yx5¶ÜßÒ½¼‚¾¾??-**4€ÒðððíóôõÞ*##,,''")??--½Ò¾¾|xróò(###'")! tuÑÝo=.Y¯a^_\Z®­­WWªªUSTQQPOONMMKJöææ¥ç1122ÏÏÐ9åÙÚ££¤F7788 ÎÌž›œEš™˜˜—••–ÈÔCÆ‘ÄŽŽŒÃŠÂ‰À>{:v=Þ¶éß︺¼¾¾‚¿>>>½ïøøøøúúî##""))<ºwußÞo36Y¯¯^_\ZZ®­¬W«ªUUTRQQOONNKKKöö楦¦1122ÏÏ9ååÚ££¤¢G788Ø0ÌÌ›ËEš™˜Ê——•–ÈÈCÆÅ‘ÄŽŒŒÃŠÂ‰‡¿{yºÞÝÞ¶Üèl·º¼~‚ƒƒƒƒƒƒƒ‚‚>,,,,#""!!!!ºwuqészˆY]a`°_\ZZXWWWªUUTRQQPONNMIKöæ¥ç¦¦122ÏÐÐ9ÙÙÚ£¡FG778× ÎÌžËËEš™˜Ê—••”ÈÉÆÆ‘ÄÄŽŽŒÃŠÂ‰Á~{:6ÝÝÝÞéÜèè·á¼â €€€€€€€}""""!!!!!! wuqÜÛz5Y]¯`^_\ZZ®­WW«UUTR¨QQPONMLIþööææ¥¦¦112ÏÏÐ9åÙÙ£¡¡G77780ÎÌÌž›ËEš™˜Ê——•–ÈÉ’ÆÅ‘ÄŽŽŒÃŠŠÂÁ>{:ˆààÝÞ¶éÜÑimỼ¼¼»½½½½½½½€)"""""!!!!!! w&qÑÛ¹5Y]¯`^__ZZ®­WW«ªUUTRRPPOONIKöææç¥¦1222ÏÏÐ9ÙÙ££¡¢F78ä×ÎÎÌ›œDšš™˜Ê—•–”ÈÔÇÆ‘ÄÄŽŽŒÃŠÂ„~{:ˆ¹ààÝÞ¶éÜèèl¸º»½½½ºººº½ !!!!!! ÒqÑÛ¹5Y]¯`°__\ZZ®XWW«ªUSRRQPO§NMKÿööææç¦¦122ÏÏÐ9ÙÙÚ££¡GG87× ÎÌž›œEš™˜Ê—••”ÈÉCƑĎŒŒÃŠÂ„~;:5¹¹àÝÞÞ¶éÜÑèèï½½ºáááááá   tßݹ5Y]¯ab^_\ZZ®­¬W«ªUTSRQPP§NNIöæöæç禦12ÏÏÐìåÙÚ£¡¤¢G788ÍØÌ›œEšš™ÊÊ—•–”È’ÆÅ‘ÄÄŽŽŒŒÃŠ„¾{:5¹¹ààÝÞ¶éÜÜÑîˆ5.áÒÒÒÒ& wuݹ5Y]²ab^_\ZZ®®WWW«ªSTRRQPOONMöææç¦¦122ÏÏÐ9ÙÙÙ£¡F¢G880ØÎž›ËËE™™˜Ê—•–”ÉCCÅÅ‘ÄŽŽŒÃŠ†¾{:5¹¹¹àÝÝÞ¶ééÜî5+( 5ááÒu  tqà¹5Y]²a±`°_\ZZ®XWW«ªUSRRQPOONMþöæçç11122ÏÐ9åÙÚ£¡¢FG780ÍÎÌž›ËEš™˜Ê—••–ÈÉCÆÅ‘ÄŽŽŒÃŠ†?{:ˆ¹¹¹¹àÝÝÞ¶éÜ6 +55ˆ& &%éÛzˆY]²f±b°_\\Z®XWW«ªUTTRQQQONNö楥¦122ÏÏÐÐåÙÙÚ£¤¢G7880ÍÌÌžžËEš™™ÊÊ—•–”ÈÔÇÆ‘ÄŽŽŒÃÂ?|y6¹¹¹ààÝÝÞ¶éß  + ˆ  &%ÜéÛ3ˆY]²fac`°\\Z®­XWWªUUTRRQPO§Nööæçñ¦122ÏÏÐ99ÙÚ£ë¢F788×0ÌÌž›œEš™˜Ê—••”ÈÔÇÆÅÄÄŽŽŒŒŠ„|;ºz¹¹ààÝÝÞ¶Üï   655. &%ÑÜéà3YY²²fa±b°_\ZZ®XWW«VU©SRRPOONþöö¥¥ç¦112ÏÏÐ9åÙÚ£¡¡FG7ä×ÍÎÌž›ËDš™™ÊÊ—–“”ÉÇÆÅ‘ÄŽŽŒÃŠ„~y<3¹¹¹àÝÝÞÜîº    ˆ+.. !! &%ÑÑܶà(Yd²²fe±`°_\ZZ®®WWWªUUTSQQQONÿöæç¥¦¦112ÏÐ99åÚ££¡F¢7780ØÌžËœšš™˜Ê——–”É’ÆÅ‘ÄÄŽŒŒŠ†¾{y=¹¹¹àÝÞéï½…‡Ó…   ˆ6! ßÑÜéÝ35Yd²³feabb°_\ZZ­XW«ªªUTSRQQOOööææ¥¦1122ÏÏÐìåÙÚ£¡¡F77ä00ÎÌžŸËEš™˜Ê——•”È’CÆÅ‘ÄŽŽŒÃ†?|;(z¹¹ààÞß½À@‹‹4À…½+   55! Ò%ßÑÜéÝ3jhd²´³fa±c°_\\Z®®­W«ªªUTRQQPOöö榦1122ÏÏ9ÙÙÙ££¡¢G788×ÎΞ›Eš™™ÊÊ—––”ÈCÆÆ‘ÄŽŒŒŠ„~; 3¹¹àà¶ï‚‹B’’A4¿»á..  ($ ÒqßÑòé3(hdd´´³ffac`_\\Z®®WWWªUUTRRQPOÿööçç¦1112ÏÐÐ9ÙÙÚ£¤¢G77ä00ÎÌž›œEš™˜Ê—Ö•”ÈÔÆÆ‘ÄŽŽŒŠ†¾;y(z¹¹àÞÒ†B“—•B‹†ƒºu  +! ÒqÑÜò¶36hdii´³gfeb`^_\ZZ®­WW«ªUSTRRQOÿööæç¦¦112ÏÏÏìÙÙÚ£¡F¢7788Î0Ìž›œEš™˜Ê—••”ÈÉCÆÅ‘ÄŽŽŒÃ†?|;3¹¹àÞ——•’A4~»á$/   $ &ßÜé¶3(khdii´³³fa±b°__ZZ®­WW««USSRQQPþöö楦¦12ÏÏÐÐååÙÚ£¡FG788×0̛˜Eš™˜Ê—•–ÕÉÔÆÅÄÄŽŒŒŠ„¾;y53¹àÝß¿B“•–BA4¿»p& $$ wqéÞÞÞ=khjµii´´³ffeb^[_\Z®®XWWªªUSSRQPÿæç禦122ÏÏ9ìÙÙÚÚ£¢¢778 0Ξ›œšš™˜Ê—••”ÈÔÆÆÅÄÄŽŽŒŠÂ?|;<=¹¹à齋B“’B‹4>x$"w&éÞÝÝ3ˆkhjµµi´´³³fab`°_\\Z®­WW«ªªUSRQQöææç¦¦112ÏÏÐ99ÙÚÚ¡¡¢G78×0ØÌÌž›œDš™˜ÊÊ—–“ÈÉCÆÅ‘ÄŽŽŒŒŠ„¾{yÒ3¹¹Ýß‚‹AAA@†~vp  uÜÞÝÝ3(khjjµµii´³³feab^__\Z®­WW«ªUUTRQPþÿöæ¥ç¦1112ÏÐÐ9åÚ££¤¢G77800ΞžŸËEš™ÊÊ—•–ÈÉCÇÆÄÄŽŒŒŠ†„~;y5z¹àÞî„‹‹‹@†' %¶ÝÝÝ3=kkjjlµµµi´´³feac°°_\ZZ®­WW«ªUUTRQþö¥¥¦¦1222ÏÐ9åÙÚ££¤G7780 ÎÌžžËšš™˜ÊÊ•––ÈÉÆÆÅ‘ÄŽŽŒŒŠ†?|y< z¹àÞï¿4444;  %%¶ÛÝÝz=·khjjllµµi´´³³feab^__Z®®XWW«ªUUSRQþöæç禦12ÏÏÏì9ÙÚÚ£¡¢F7880ÍÌÌ››Eš™™˜Ê—•–ÕÉCÆÅ‘ÄÄŽŽŒŒŠÂ„¾|y< z¹àÞߺ||' ÜÞÛÛÝz=·kkmmlllµµii´´³ffa±`^_\Z®®­WWªªUTRQþööæç¦1122ÏÏÐ9åÙÚ£¡¤G778×0ÎÌžŸœšš™˜Ê—•–”ÈÔCÆ‘ŽŽŒÃ†Á~{y»(3à¹àÝéqéÝÛooÝ=(nkkmmmmllµµµi´´´ffe±°^_\Z®XXWW«ªªUSRþöö楥¦1222ÏÐ9åÙÚ£¡¡¢G7ä×ÍÎΞ››Eš™˜ÊÊ—•–ÈÉ’ÆÅ‘ÄŽŽŒŒŠÂ„¾~{yxÒ z¹s¹Ýé%·v¶Ýsoooà=ˆnkkkmmmmlllµµii´³³fe±c°[_ZZ®­XWWªUUTRÿö¥¦¦1122ÏÐì9ÙÙÚ£¡FG7780ØÌ››Ešš™˜——Ö–”ÉÔÆÅ‘ÄÄŽŽŒŒÃЉ„À~{y: (3z¹s¹àÝÞ¶¶¶éܶÝÛsooos3(¸nnk···mmmmllµµµi´³³feac`°_\Z®X­WWWªUSRI<öö祦¦1222ÏÐìÙÙÚ£¡¢¢7770ÍÎÌž›ËEš™˜ÊÊ—•”ÈÉÇÆÅ‘ÄŽŽŒÃʉÁ¾~{y:x(3¹sssssssÛÛÛsooos3(¸nnn¸····mmmmlllµiii´³³fa±c°_\\Z®­WW«ªª©¨ÁÅþÿöö楦¦¦22ÏÏÐ99ÙÚ£¡¡FG7ä80ÎÌž›ËEš™™ÊÊ—•–”ÉCÆÅ‘ÄÄŽŽŒŒÃŠÂ‡‡>‚{yx:xº5z¹ssoosssssz 5tnnnn¸¸¸···mmmmlllµiii´´³ffac°__\Z®­­W«ªªUS·éöæ¥ç¦1122ÏÏ99åÙÚ£¡FGG7800ÎÌ››Ëšš™˜Ê—•–”ÈÉÇÆ‘ÄŽŽŒÃŠÂ‰‡À¾‚}yxvrrr.6ˆ555ˆˆ6.nnnpnnn¸¸¸¸¸···mmmllllµii´´³ffe±b°_\\®®­WW«ªUUPÕþþÿöæç¦1112ÏÐÐ99ÙÚ££¡¢ê778ÍÎÌž›ËEš™™ÊÊ••”ÈÉCÆÅ‘‘ÄŽŽŒŒŠÂ‰‡À¿‚}yxxvvrrrrrppppppppptttt¸¸¸¸····mmmlllµµii´³³fe±b^_\\Z®XWW«ªªT7’öææ¥ç¦1122ÏÐÐ9ÙÚ££¡¢G7780ÎÌžËDšš™ÊÊ—•“”ÉCÆÅ‘ÄŽŽŽŒÃŠÂ‰‡ÀÀ‚‚}¼»xvvvrrrrrpppppttttt¸¸¸¸····mmmllllµii´´³ffab^[_\Z®®XW«ªªU5Âöæ¥ñ1112ÏÐÐìåÙÚ£¡¢Gê78רÎÌžËDD™™˜Ê——––ÈÔÇÆÄÄŽŒŒÃŠÂ‡‡À¿¿‚ƒ}}¼»»<<>6222226>/Hsssss²ÑÑ´´µ{{{}}}€€ººƒƒ»»¼…†½À¿ÁÁ‡ˆŠÃŒ‹ÄÅÆÈÇŽÉÉ““”K–•˜ËËÍÌ@@?MM›ëØ×AíÏÎÎ544 ããâ÷NNNNPPPQQST¡UVWXXY[¤¥]]¦^§`ad©©himllnjjkqq>G1|77777777|1G2>Hstttt´´µµ{{}}€€€ººƒ»»¼……†½À¿Á‡ˆˆÃË‹ÅÅIÇŽ‘É’“””J™•—ËÍÍ3@@?Mœ›Ø××AÏÏÎ5544  ŸŸ÷NNNNPPPQSSUUUVWXZY[¤]]]¦§§`ad©ªhfmljjkkq61|||vvvæævvv||777|G>Htttt´µµ{{}}€€ººƒ»¼¼……½½À¿Á‡ˆŠÃŒ‹ÄÅÆÈÇŽ‘‘É’“””–•˜—ËÍÖ@à@Mœž›××áAÏÎ55444ããâ÷ÿþNNNNPPOSSTUUVWXXZ[¤¤¥]¦^§`ad©ªhielbjkk61||vè³ÞÞÑÑÑ´ÑDÞ·6G7u7|G/&tttBµ{{}€€€ººƒ»»¼¼…†½À¿¾‡ˆŠŠÃŒ‹ÅÅÒÈÇ‘‘É“””JÊ•—ËËÌÌ@@?MM›ØØ×AÏÏÎ5544 òãââ÷þNNPPPPORSTTVVWXYY£¤¥]]^§§`ad©ªfelbbkpG|vè°¯²µ{z~~EEEE€}D·6|u712HtttB{¶}€€ººƒ»»¼……†½À¿Á‡ˆŠÃÃŒ‹ÅÆIÇŽ‘‘É’“”J–Ê•——3Ì3@@MœœžØ×ááÏÎÎ5544ŸŸŸ÷÷÷þNNNPPPOQSTUVVWXZ[¤¤¥]]¦§``adªªfebjkr1|èõ¯Ñµ}~E‚::86)0::‚}Ñ·67u7G/tBBB¶}}€ºƒƒ»¼¼…†½À¿ÁˆˆŠÃŒ‹ÄÅÆÇ‘ÉÉ’“””–•˜—ÍÍ33à?MMžØ×áAÏÎÎ5444 ãŸâ÷÷þNPNPPQQTTTUVWXXZ£¤¤]]]§§`addcheejk6|v°¯²´¶~F‚„;;9èÛ76,<;:F€8D)177G>tBB¶}€€ººƒ»»¼¼…†½À¿Á‡ˆˆŠÃŒ‹ÄÅIÇŽ‘‘’’“”K™˜˜—ËÍÕ@@?MœžØ×AAÏÎÎ444 Ÿâ÷NNPPPOOTT¡UWWXXY[¤¥]]^§``ad©hfebk6|v°¯Ñµ¶~F:„;;0éüüÜ7>=<<;-,9D)G771/BBB¶z€ºƒƒ»»¼……½½À¿¾‰ˆŠÃË‹ÅIIÇŽ‘É’“””–•˜—ËËÍ@à?MœL›ØØ××AÏÏÎ544  ãŸ÷÷NNPPPQSTUVWWXXY[[¤¥]]^§`aa©cfebkr|v³±²´¶~F:„;†0éüúúüÛ|>=*<;:,0D)G77GHBwwz€ºƒƒ»¼¼…†½À¿¿¾‡ˆŠÃŒ‹ÄÅIÈÇŽ‘‘É““”K–•˜—ËÍ33@?MMžØ×AAÏÎÎ544 ããŸâ÷þþPPPPOOSTUUWWW¢Y[¤¥]]¦^``aacªfbjp|ݳ´´µ¶~‚„;;0õûúúúúûÛ|>=**<%-9D)G772&Bww~ºƒ»»¼……½½À¿Á‰ˆŠÃÃŒ‹ÅÆIÇŽ‘É’“””–Ê•—ËËÖ3à??ML›Ø××AAÎÎ554  ãŸ÷÷PPPPOSTTUWWWXZ[¤¤]]]¦§§`adcfebkGÝçѶ¶¶zEF‚„;,éûúúúúúúûÛ|)=**<(,9D)G7|>Bwzºƒ»¼¼…††½ÀÁ¾‡ˆŠÃËÄÅÆÇŽ‘‘’’“”KÊ•˜—Ë33Õ@?MLLØ×áAÏÎÎ5444 ãŸ÷ÿNPPQQSTTUVWXYZ£¤¤]]^^§`adcªfek­vä®Ñ{¶z~F:„;ÑýôôöööööúúÝ>++**%,9D)171/Bwz~E»»¼¼…†½À¿Á‰‡ˆÃÃŒÄÄÅIÇߎԑÉÉ’“”KÊ•——ËÍ3@@?MLL××áAÎÎÎ544  Ÿãâ÷ÿPPPQSST¡VVWXYY[[¤]]¦§§aadcfe_pvæç¯²´µ¶~F:„;ýùùîîôôööûüý$À+++*(:,9D6772&Cw~ºƒ»¼¼…†½À¿¾‡ˆŠÃŒŒÄÄÆÈÇŽ‘ÉÉ“”K–•˜—ËÍÍÕ@??M››Ø×áAÏÎ5Î544ŸŸââ÷÷ÿPPPRSTUUVWWXZ[¤¤]]]^§``adfebk6vç±±²´µ¶zEF‚„;;9³ðïïîôôì|$++++++*(-08·G71/CCxE»¼¼…†½½¿¿‡ˆŠŠÃŒ‹ÄÅIÈÇŽÉÉ““”K–•˜—ËÍ3@@?MœL›Ø××ÏÏÎÎ554 ããââ÷÷÷PPQSSTTUVWWYY[¤¥¥]¦^§`adcfebkvæ°²´Ñ´µ¶z~E‚„„;9·ñððïîôì|$++++++*(%,9D6|72CxE»¼……½½À¿Á‰ˆŠÃÃŒ‹ÄÅÈŽŽ‘ÉÉ“””K•˜˜ËË33@@?ML›Ø××AÏÎÎ5444 ŸŸâ÷ÿPPQSTTTVVWXY[[¤¥]]^§§`adcfej­Ýìç±Ñ´´µ¶z~~F:„„9·ñððïîôì|$++++++**(-0D³G71HCxEƒ»……½½À¿Á‡ˆŠÃË‹ÄÅÈÇŽ‘É““”K–•˜—Ë33@@??Mœ›Ø××AÏÎó554  ãââÿþþPOOSTUUVWWXZ[[¤¥]]^§`aa©ªebkvÚÝæ°±Ñ´µ¶¶z~EEF:8·ñððïîôì|$****+***(%,8·6|1/Bxy»¼…†½ÀÀ¿Â‡ˆŠÃŒ‹ÄÅÈÇ‘ÉÉ“””K–•˜ËËÍ3@??ML›××AAÏÎó544  ã÷÷PQSSTUUVWWZY[¤¤]]¦¦§`adcfebp|ÛÚÝäå±Ñ´µ¶zz~~EF¸·‚wtîæè********(%,9D³172Cyƒ¼…†½À¿Á‡ˆŠÃÃŒ‹ÄÆIÈŽ‘É’“””–•˜——ÍÍš@??Mœ›Ø×áAíÎ55544 ããâ÷÷ÿQQQTTUUWWXZ[[¤¥]]¦§``adcfebrÛÙÛÝìäå±Ñµ¶¶}}€~¸õøøøøøùõD%****((((%-0D·G7G&Cy‚¼†½½¿¿Á‡ˆŠÃŒ‹‹ÅIÒÇ‘’’“”K–•˜—ËÍš@@??LžØ×áAÏÎÎ5544ãŸââ÷QOSTTUVWWXZ[[¤]]]^``ad©ªfe_­ÙÙÛÚÝìäå±Ñµ¶{{{}€€€ƒ:::„((((((((%%%%-08·6|1HCy‚¼†½À¿Á‡ˆŠŠÃŒ‹ÄÅIÇÇ‘‘É’“”KÊ•—ËË3Ö@@?MœžØááAÎÎ5544  Ÿâ÷÷ORSTUVWW¢XZ[[¥]]¦§``adcªeb_èÜÜÙÛÚììäå¯Ñµµµ¸¸{{999€FF-%%%%%%%%%%(%-08Dé|1/CyF¼½½À¿¾‡ˆŠÃÃŒ‹ÅÅÈÇŽ‘É’“”KÊʘ—ËÍšÕ@??ML›Ø××AÏÏÎ554  ãŸâ÷QOTUUVVXXZ[[¤¥]]¦§``ddcheb_G¬ÜÜÙÚÝìì䫯Ѵ´¸¸¸¸¸¸889€,,###%(,8D³|1/Cy‚„½ÀÀ¿Á‡ˆŠÃŒ‹ÄÅÈÇ‘‘É’“”KÊ•˜ËËÍ3@???M››××áAÏÎÎ544  Ÿââ÷÷þiQST¡UVWXXY[¤¥]]^§``add©heb_vÐÐÜÙÛÚÝììä«rÞÑÑÑDÑÑÑD¸88,%%%%%9D³|1/Cy‚„½À¿¾‡ˆŠÃÃŒ‹ÅÆÒÇŽ‘É’“””J–•—ËÍÍÕà@?Lœ›××AÏÎÎ5554 Ÿãââ÷OOTT¡VVWXYZ[¤¥]]¦§``adchheb_vÐЬÜÙÛÚÝììää°ÞÑÑÑÞÞÞÞÞDD$9·11/Cy‚„½À¿Â‰ˆŠÃŒ‹‹ÅIÈÇŽ‘É’“”K–•˜—ËÍšÕ?@MM›Ø××AÏÎÎ554  ãââ÷÷ÿiSTUUVWXXZY¤¥]]]§§``adchieb_vÐЬÜÙÛÚÚÝììç62·D·ÞÞÞÞÞÞ) $$$-811/Cy‚†À¿Á‰‡ˆÃÃŒ‹ÄÅÇŽ‘ÉÉ“””K–•——ËÖÌ@@?Mœž›Ø×áíÏÎÎ54  ããâ÷â÷.STUUVWXXY[¤¥]]^§``ad©ªhfeb_vÐÐЬÜÙÛÚÝÝìç22/1|2ÞÞÞ·³ $$0·11/C:†À¿Á‰ˆŠÃŒ‹ÄÄIIÈŽ‘É’““KÊÊ•˜—ÍÖ3@@MœL›×××AÏÎÎ554  ãââ÷TTUWWWXZZ[¤¥]]^§`aad©hhmlb_GÐÐЬÜÙÙÛÚÝì61H22>) $$)é|1Hx„†¿¿‡‰ˆŠÃŒ‹ÄÅIÈǑɒ“”KÊ•˜—ËÍÌ3@?MLœ›Ø×áAÏÎ55444ããâ÷þaT¡UVWXXZ[[¤]]^¦§`aa©ªhimlb_GÐÐЬÜÜÙÛÚÝæ>1H1> $$$$)éè|1&x„½¿Á‡ˆŠŠÃŒ‹ÅÆÒÇŽ‘ÉÉ““”Kʘ˜ËËÌ3@@?MœžØ××áÏÏÎÎ554 ŸŸâ÷pTUUVXXY£[\¥]]^§``ad©ghimljk­¬ÐЬÜÙÙÛÚìç/H/&/$$$$)³éè12Cy‚„ÀÁÁ‡ˆŠÃËÄÅÆÒÇŽ‘É’“”K–•˜—ËË3Õ@@?LœëØ×AAÏÎó554 òãâ÷÷1TUWWWYZ[[¤]]]§§``ad©ªhimlj_r¬ÐÐÐÜÜÛÚìçÞ&0&&&H&&&%$)³³éè1Cy‚;À¿‰‡ˆŠÃŒ‹ÄÅÆÈŽŽ‘ÉÉ““”JÊ•˜—ËÍÌÕà?ML››Ø×áAÏÎÎ544 ãŸŸ÷÷þUUWWXYZ[¤¤¥]^¦``ad©hhiilljjpuÐÐЬÜÛÝçÞ¸€º0}&&&1//%)³³éèv1/x„†¿Á‡ˆŠÃÃŒ‹ÄÅÈŽ‘‘É’“””–ʘ——ËÖ3@??œL›ØáAAÏÎ544  Ÿãâ÷ÿÃUVWWXZ[¤¤¥]¦§§`aad©hhimlnjjq|¬ÐЬÜÛæÞ}F:„F€9¸$ )³³éè1G¶y¹„¿¿Â‡ˆŠÃŒ‹ÄÅIÇŽ‘‘É’“”KÊ™˜—ËÍ33à??L››Ø×áíÏÎÎ5544 Ÿââ÷÷ÃUVWXXZ[[¤]]]§§`aadªhimmlnjjkruÐЬÜÚ縂<¾¾<:€¸Þ·)& 8·³³éè1xy‚†À¾‰‡ŠŠÃŒ‹ÅÅIÇŽ‘ÉÉ““”K•˜——ÍÍÕ@@?Mœ›×××AÎÎ5544  â÷÷ÃUWXXZY[¤¥]]¦§``adcªhimlnnjjkq|¬Ð¬ÜÚ°€;‡ÃЇ<ƒ}²¯   %8·éééGG&y„½ÀÁ‡ˆŠÃŒ‹‹ÅÅÒÇŽÔ‘É’“”K–•˜—ËÍ33à??MœžØ××AÏÏÎ5444 ãã÷÷ÿÃVWWXYY[¥¥]]¦§``dd©hhimlnoo­jk°uÐЬÛç~<ŠÃÈ<:~´²    0D³èèè1xy‚„½ÁˆˆŠÃŒ‹ÄÅIÈÇŽ‘É’“”K–•˜—Ë3Í@@??œL›Ø××íÎÎÎ544  ãâ÷÷ÿÃVWXYY[¤¤]]^§§`adcchimmnno­­pkqvÜÐ¬Ùæ{;‡ŠŠ‡<:~´s  9·èvvG2wy„†ÀÁ‡ˆŠÃË‹ÄÅÒÈÓ‘É’“”K–Ê•——Ë3Õ@@?ML›Ø×ááÏÏÎÎ54  Ÿâ÷÷þÃWWXY[¤¤¥]]¦§`aad©ªhimlnno­­­pk®7¬¬ÜÝÞ‚<‡‡¾;‚~B  %0Dèvvv1/xy¹„½¿¾‡ˆŠÃËÄÅÅÒÇŽ‘É’“””–•˜——Í3š@??œœØØ××íAÎÎ554  ããâÿIVWXZ[[¤¥]]¦§`addchiimlnoo­­rppq°u¬¬Û浄<<<„F~B  'Dév|v1xy¹„;ÀÁÁ‡ˆŠÃŒ‹ÄÅIÈÇŽ‘ÉÉ’“”J–•˜ËËÖ3Õ@?Mœ››ØØ×AAÏÎÎ544  ãââ÷WXZ[[¤¥]]¦§``ad©©hiimnnoo­­rrpkqv¬¬ÜÛç€:„„„Fx!!  vv||12wy:†½¿¾‰ˆŠÃË‹ÅÆIÈÇ‘ÉÉ“”KÊ™˜˜—Í33@??MœžØáAÏÏÎ5444 ãŸâ÷ÿþWXY[[¤¥]]^§§`ddchhimlnno­­rrrppk¯7u¬ÜÛç¶¹¹¹"!!!  v|||12{xy‚„†ÀÁÁˆˆŠÃŒ‹ÄÅÅÈÇÉÉ’“””ʘ˜—ËÍš3@??MžØ×áAÏÎ5554  ŸŸ÷þWXZ[¤¤]]¦§§`adcªhimmlnoo­­rr®®®qq¯7u¬ÜÛæ±wx"!!!!!!  èv7||12{xyF¼†½¿Á‡‡ˆÃÃŒ‹ÄÅIÈÓ‘É’““”K••—ËËÌ3@@?Lœ›ØØ×AíÎÎÎ54  ããâ÷þXY[¤¤¥]]^^§`adc©himmnnoo­rrr®®®®qq±1uܬÜÛÝ. !!!!"!!" vÝ7uuvGwxyF¼…½À¿Á‡ˆŠŠŒ‹‹ÅIÒÇŽ‘É’“””–™˜—ËÍ3Õ@??Mž›Ø×áAÏÎÎ5544 ãâ÷÷þXZ[[¤]]^¦§``dc©hhimlnoo­­rr®®®®®¯qqs°|u¬¬ÜÛÝ.r± B  v|uuuu|2/wxy‚„†½ÀÁ‡‡ˆŠÃŒ‹ÄÅÈÇ‘ÉÉ’“”K••˜—ÍÍÌÕà?Mœ››Ø×áAÏÎ5554 ŸŸâ÷÷þXY[¤]]]¦^§`ad©ªhiimlno­­rrr®®®¯¯¯¯qqs±G7u¬¬ÜÛÚÝÝÝÝææv|7uuuu712µxxyF‚……½À¿¾‰ˆˆÃÃŒ‹ÄÅÒÈŽÔ‘‘’“””K••——ËÖ3@??ML›Ø××AíÏÎ5544  Ÿ÷ÿ…s¢£¤¤¥]]¦§`aad©hhimlnoo­­rrr®®®¯¯¯¯¯qqss±17u¬¬¬¬uuuuuuuuuu712´wwxyF»¼…½½¿¿¾‡ˆŠÃŒ‹ÄÅÆÈÇŽ‘ÉÉ’“”KÊ•˜—ËÍÌ3???œœ›Ø××íÏÎ5554  Ÿã÷÷Ï+Y[¤¤¥]¦¦§`add©«immlnoo­­rrr®®®¯¯¯¯±±±±sss±Guuu¬¬¬uuuuu71´wwwx~»¼…†½À¿Á‰‡ˆÃÃŒ‹ÄÅIÈŽ‘ÉÉ““”KÊ•˜—ËÍ3@à?ML››Ø×AAÏÎÎ55   Ÿâ÷÷ÿþ[[¤¥]]¦§§aad©ghimmnno­­rrr®®®¯¯¯¯±±±±±±ssssss/>>222>>/HttBwwz~EF»¼¼…†½À¿¾‰ˆŠÃŒ‹‹ÅÆÈÇŽ‘É’“””Ê••—ËÍ33@?MML›Ø×áAAÎÎ5544 ãŸâ÷ú·Z¤¤¥]]^§`aadchhimlnnoo­rrr®®®¯¯¯¯±±±±±²²ssssssstttttttBBBwzz~Eº»»¼…†½½¿Á‡ˆŠÃŒŒÄÅIÈÇŽÉÉ““”KÊ•˜—ËÍÌ@??ꜛØ×AAÏÏÎ5444 ãâ÷ÿþþ•[¤¤¥]^§§`ad¨chimmlnoo­­rrr®®®¯¯¯¯±±±±±²²²²²²²ttttttBBBBw¶z~Eºƒ»¼¼…†½À¿Á‡‡ˆŠÃŒ‹ÄÅIÈŽŽ‘ÉÉ“””Jʘ——ËÍ3@??Mœ›Ø×AÏÏÎ5544 ãŸââ÷5Â\¤¥]]^§``ad©ªhimlnno­­­rr®®®¯¯¯¯±±±±±²²²²²²ÑÑÑÑ´´´µµµ{¶zz€ºƒ»»¼……½½À¿Á‰ˆŠÃË‹ÅÆÒÇ‘‘É’““JJʘ—ËÍÖÕ@?êMœ›Ø×áíÏÏÎ5444òŸâ÷b3[¥¥]]§§``adchiimlnoo­­rrr®®®¯¯¯¯±±±±²²²²²²ÑÑÑ´´´µµµ{{}}€€ºººƒ»»¼…†½½ÀÁ¾ˆŠŠÃŒ‹ÄÅÈŽŽ‘ÉÉ““”JÊ•˜—ËÍ3Õ@?MM›ØØ××AÏÎ5544 ŸŸâ÷÷ÿ ¤¥]]¦^§`adcªhimmlnoo­rrrr®®¯¯¯¯¯±±±±²²²²²ÑÑÑÑ´´µµ{{{}}€€ººƒ»»¼……†½À¿Á‰ˆŠŠÃ‹‹ÅÆIÈŽ‘É’“””–•˜˜ËËÌ3@??Mœ›Ø×ááAÎÎ5544㟟÷þnsis-3.11/Contrib/Graphics/Header/nsis3-branding-r.bmp000077500000000000000000000623341477201124000225330ustar00rootroot00000000000000BMÜd6(–9¦d . .Š`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Š`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Š`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Š`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Š`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Š`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{€Š`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Š`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Š`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Š`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Š`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Š`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{€Š`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Š`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Š`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Š`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Š`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Š`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{€Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`v¤ƒ”½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²—q…Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ¦…–™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‡¹ ­ÿÿÿÿÿÿ§ˆ˜Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v‹bxŠ`v£‚”¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡“l€Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v™uˆ‹bxŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vf{áÖÜÁ«¶›v‰óîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJawŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÖÇÏ‹bxŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vf{áÖÜÿÿÿÿÿÿÁ«¶›v‰óîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJawŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÖÇÏ‹bxŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vf{áÖÜÿÿÿÿÿÿÿÿÿÿÿÿÁ«¶›v‰óîðÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…–p„Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÖÇÏ‹bxŠ`vŠ`vŠ`vŠ`vf{áÖÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁ«¶›v‰óîðÿÿÿÿÿÿϾǗr…ïéì ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÖÇÏ‹bxŠ`vŠ`vf{áÖÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁ«¶›v‰óîðϾǗr…ïéìÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿÖÇÏ‹bxŠ`v©ŠšÅ°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»—q…•n‚—r…ïéìÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~‹bx¦‡—½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²šuˆ—q…ïéìÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿáÖÜ’j~ÜÏÖÖÇÏ’k€æÝâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…ïéìÿÿÿÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿáÖÜ’j~ÜÏÖÿÿÿÿÿÿÖÇÏ’k€æÝâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǓm€”nëäçÿÿÿÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿáÖÜ’j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÖÇÏ’k€æÝâÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…ïéìϾǔnëäçÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªáÖÜ’j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÇÏ’k€æÝâÿÿÿÿÿÿϾǗr…ïéìÿÿÿÿÿÿϾǔnëäçÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`vŸ|Ž’j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÇÏ’k€æÝâϾǗr…ïéìÿÿÿÿÿÿÿÿÿÿÿÿϾǔnëäçÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`vŠ`v ½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²zŒg|—r…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǔnëäç ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`vŠ`v¢€’Ű»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»ž{—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǔn•oƒŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¤„••o‚ÖÇÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJaw¦‡—¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª–p„Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªëäç•o‚ÖÇÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǕqƒf{«ÌºÃ̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã˸”mŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿëäç•o‚ÖÇÏÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…ïéìáÖÜ’j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§£‚”š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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿëäç•o‚ÖÇÏÿÿÿÿÿÿϾǗr…ïéìÿÿÿÿÿÿáÖÜ’j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§£‚”ùö÷ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿëäç•o‚ÖÇÏϾǗr…ïéìÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ’j~ÜÏÖÿÿÿÿÿÿÿÿÿþþþ´™§£‚”ùö÷ÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿëäç‘j—r…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ’j~ÜÏÖÿÿÿþþþ´™§£‚”ùö÷ÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ’j~ÚÍÔ´™§£‚”ùö÷ÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿϾNJaw›wЧˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜–p„Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿÿÿÿϾǗr…—q…¨‰™ÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÙÌÓ›v‰Š`vdyÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÿÿÿϾǗr…ïéìïéì—q…ȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`vŠ`vŠ`vdyÜÏÖÿÿÿÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v¶œªÏ¾Ç—r…ïéìÿÿÿÿÿÿïéì—q…ȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`vŠ`vŠ`vŠ`vŠ`vdyÜÏÖÿÿÿÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v–q…—r…ïéìÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ȵ¿ÿÿÿÿÿÿÿÿÿþþþ´™§Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vdyÜÏÖÿÿÿ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`vŠ`v—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ȵ¿ÿÿÿþþþ´™§Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vdyÜÏÖ ~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`v—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…Ç´¾´™§Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vdy‘i~Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`vŠ`v’k™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡’kŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŰ»ÿÿÿÿÿÿ™t‡Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vœy‹¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡“lŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vy|Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vy|nsis-3.11/Contrib/Graphics/Header/nsis3-branding.bmp000077500000000000000000000623341477201124000222740ustar00rootroot00000000000000BMÜd6(–9¦d . .Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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_=Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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_=Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v—q…½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²¤ƒ”Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¹ ­™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‡¦…–ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`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Š`vŠ`v‹bxœx‹¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡šv‰Š`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v•n‚”mŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿ÜÏÖ”mæÝâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜf{Š`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ëäç”mŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿ÿÿÿÿÿÿÜÏÖ”mæÝâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜf{Š`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿëäç”mŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÜÏÖ”mæÝâÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~œx‹Š`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿëäç”mŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÏÖ”mæÝâÿÿÿÿÿÿáÖÜ‘j~ÜÏÖ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿëäç”mŠ`vŠ`vŠ`vȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÏÖ”mæÝâáÖÜ‘j~ÜÏÖÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿÿÿÿëäç”mŠ`v›v‰Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»¥…–i~‘j~ÜÏÖÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…g|zŒ½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²£‚”dyÜÏÖÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿïéì—q…ȵ¿ëäç•oƒÖÇÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vZŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿïéì—q…ȵ¿ÿÿÿÿÿÿëäç•oƒÖÇÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~‘j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿïéì—q…ȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿëäç•oƒÖÇÏÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~ÜÏÖáÖÜ‘j~ÜÏÖÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ïéì—q…ȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëäç•oƒÖÇÏÿÿÿÿÿÿáÖÜ‘j~ÜÏÖÿÿÿÿÿÿáÖÜ‘j~ÜÏÖÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v–q…—q…ȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëäç•oƒÖÇÏáÖÜ‘j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~ÜÏÖÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`vŠ`v–q…½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²ª‹›‹bx‘i~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~ÜÏÖ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`vŠ`v”mįºÅ°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»Å°»©Š›dyÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~œx‹Š`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v™uˆŸ|Žº¡®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜf{›xжœª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œªŸ|ŽŠ`vŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~öóôŸ|Žº¡®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~—r†Ÿ|ŽÌºÃ̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺ã‚“Š`vŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿöóôŸ|Žº¡®ÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~ÜÏÖóîð›v‰Èµ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…¦‡—Š`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿöóôŸ|Žº¡®ÿÿÿÿÿÿáÖÜ‘j~ÜÏÖÿÿÿÿÿÿóîð›v‰Èµ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…ïéì¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿöóôŸ|Žº¡®áÖÜ‘j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿóîð›v‰Èµ¿ÿÿÿÿÿÿÿÿÿÿÿÿϾǗr…ïéìÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿÿÿÿöóôœx‹ŽezÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóîð›v‰Èµ¿ÿÿÿÿÿÿϾǗr…ïéìÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿÿÿÿáÖÜ‘j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóîð›v‰Èµ¿Ï¾Ç—r…ïéìÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿÿÿÿáÖÜf{”n‚§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜§ˆ˜zŒŠ`v‘i~ïéìÿÿÿÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿÿÿÿáÖÜ‘j~¡‘šv‰ÙÌÓÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕ­ŸŠ`vŠ`vȵ¿ÿÿÿÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~ÿÿÿáÖÜ‘j~ÜÏÖûùú¨‰™´™§þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJawŠ`vŠ`vŠ`vȵ¿ÿÿÿÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vZŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v ~áÖÜ‘j~ÜÏÖÿÿÿÿÿÿûùú¨‰™´™§þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJawŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿ÿÿÿÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`v’k€‘j~ÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿûùú¨‰™´™§þþþÿÿÿÿÿÿÿÿÿϾNJawŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿ÿÿÿ¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŠ`vdyÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùú¨‰™´™§þþþÿÿÿϾNJawŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vȵ¿¶œªŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vdyÜÏÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùú¨‰™´™§Î¼ÆŠawŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v”mŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v§ˆ˜ÿÿÿÿÿÿ¯’¡Š`vŠ`vŽf{™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡•pƒŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v™t‡ÿÿÿÿÿÿŰ»Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v“l¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡œy‹Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vZŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vnsis-3.11/Contrib/Graphics/Header/nsis3-grey-right.bmp000077500000000000000000000213441477201124000225650ustar00rootroot00000000000000BMä" (–9Ú! . .55ÿÿÿþþþøøøòòòîîîéééäääßßßÙÙÙØØØ×××ÖÖÖÒÒÒËËËÈÈÈÆÆÆÄÄÄÃÃÃÀÀÀ¼¼¼¸¸¸³³³°°°­­­¨¨¨¤¤¤¡¡¡   ŸŸŸžžžœœœ›››ššš˜˜˜–––•••”””’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŠŠŠ‰‰‰ˆˆˆ‡‡‡………ƒƒƒ€€€333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333(333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333''''''''''''''''''''''''''''''''33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333333333333333323-3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333'233333333330% 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 2333333330% 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 23333330% ()33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 233330% (!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 2330% (!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 23(+(!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333/2&(!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333. . (!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333. . -,!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333. . ( ,!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333. . ( ,!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333". . ( ,!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'3333!$0( ,!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'3333 #( ,*33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333+ 3)333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333+ *0,333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333+ (.&33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333+ (.!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333+ (.!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333.(.!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 (. !33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 3%)3#!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 (( %31!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 ((3331!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333 ((333331!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333)((33333331!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333((3333333331!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'33((333333333331/33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'33.''''''''''.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333$,33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333nsis-3.11/Contrib/Graphics/Header/nsis3-grey.bmp000077500000000000000000000213741477201124000214550ustar00rootroot00000000000000BMü""(–9Ú! . .;;ÿÿÿþþþûûûõõõòòòîîîéééäääßßßÞÞÞÙÙÙØØØÖÖÖÒÒÒËËËÊÊÊÈÈÈÄÄÄÃÃÃÀÀÀ¿¿¿¸¸¸´´´³³³°°°­­­¨¨¨¦¦¦¢¢¢¡¡¡   ŸŸŸžžžœœœ›››™™™˜˜˜–––”””“““’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŠŠŠ‰‰‰ˆˆˆ‡‡‡†††………„„„ƒƒƒ€€€999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999,"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999++++++++++++++++++++++++++++++++ 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999999999999999998(*99+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999/099999999999 0599+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%0999999999 05999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%09999999 02(999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%099999 02 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%0999 02 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%09)!32 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%,4'#7 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%,/ 2 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%,/ 22 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%,/ 2 2 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%,/ 2 2 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999-,/ 2 2 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::999999999999-83 2 999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999907 2(999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999+&5(&9999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999%&2,&#9999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999%&2 ),999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999%&2 ),999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999%& 2 ),999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999/:99999999999%(6 ),999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%2 ),999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999:/99999999999%5/'93999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999%2$* 99999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999%2 9999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999%2 999999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999-89999999999912 99999999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::999999999997 9999999999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999997 9999999999990999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999996++++++++++.999999999999999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::9999999999999999999999999999999999999999+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 999999990'999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999/:999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999993+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999-1999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999914nsis-3.11/Contrib/Graphics/Header/nsis3-metro-right.bmp000077500000000000000000000623341477201124000227510ustar00rootroot00000000000000BMÜd6(–9¦d . .×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xà–8é³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pÛ‡×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿà˜<܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ç®fÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×z×xà•7ä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢PÚ‚×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×x܉!×z×x×x×x×x×x×x×x×x×x×xÙ} õݾê¸xÝ‹$ûñäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×y×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ñÏ¥×z×x×x×x×x×x×x×x×xÙ} õݾÿÿÿÿÿÿê¸xÝ‹$ûñäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×y×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿñÏ¥×z×x×x×x×x×x×xÙ} õݾÿÿÿÿÿÿÿÿÿÿÿÿê¸xÝ‹$ûñäÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡Û†×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿñÏ¥×z×x×x×x×xÙ} õݾÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸xÝ‹$ûñäÿÿÿÿÿÿïÈ—Û‡úìÜß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×xe×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿñÏ¥×z×x×xÙ} õݾÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸xÝ‹$ûñäïÈ—Û‡úìÜÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿñÏ¥×z×xâ›C뼀뼀뼀뼀뼀뼀뼀뼀뼀뼀ۇÛ„Û‡úìÜÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x‘N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿõݾـ×zá™>é³pé³pé³pé³pé³pé³pé³pé³pé³pé³pÜŠ"Û‡úìÜÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿõݾڀóÖ²ñÏ¥Ù÷âÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿñÏ¥Ù÷âÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Ú‚ÚƒøèÓÿÿÿÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿõݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿñÏ¥Ù÷âÉÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡úìÜïÈ—ÚƒøèÓÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`õݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÏ¥Ù÷âÉÿÿÿÿÿÿïÈ—Û‡úìÜÿÿÿÿÿÿïÈ—ÚƒøèÓÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xÞ-Ú€óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÏ¥Ù÷âÉïÈ—Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿïÈ—ÚƒøèÓÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×x×xß’1é³pé³pé³pé³pé³pé³pé³pé³pé³pé³pÝŽ)Ù~ Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—ÚƒøèÓß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×x×xß”4뼀뼀뼀뼀뼀뼀뼀뼀뼀뼀Þ+Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—ÚƒÛ…×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xà–9Ú„ñÏ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×yá™>æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`Û†×x×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`øèÓÚ„ñÏ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û…Ù} âžHîÄîÄîÄîÄîÄîÄîÄîÄîÄíÃÚƒ×x×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿøèÓÚ„ñÏ¥ÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡úìÜõݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[à•7Ü‹#×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×xÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿøèÓÚ„ñÏ¥ÿÿÿÿÿÿïÈ—Û‡úìÜÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[à•7ýøñß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿøèÓÚ„ñÏ¥ïÈ—Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿþýå¨[à•7ýøñÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿøèÓÙ€Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿþýå¨[à•7ýøñÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀòÕ¯å¨[à•7ýøñÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿÿÿÿïÈ—×yÝŒ%áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@Û†×xÞ+ýøñÿÿÿÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿÿÿÿïÈ—Û‡Û‡ášAóÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°òÔ­Ý‹$×xØ{óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x‘N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ÿÿÿïÈ—Û‡úìÜúìÜÛ‡ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×xØ{óÖ²ÿÿÿÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xæ«`ïÈ—Û‡úìÜÿÿÿÿÿÿúìÜÛ‡ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×xØ{óÖ²ÿÿÿÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xÛ†Û‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡ìÀˆÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×x×xØ{óÖ²ÿÿÿß‘0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×xÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡ìÀˆÿÿÿÿþýå¨[×x×x×x×x×x×x×x×x×xØ{óֲߑ0×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×xÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡쿆å¨[×x×x×x×x×x×x×x×x×x×x×xØ{Ù€×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×xÚ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ Ú×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿ܉ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xä¢Pÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿç®fä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢P쿇ÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×xZ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë¼€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáš@×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÝ(ä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢PÚƒ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xnsis-3.11/Contrib/Graphics/Header/nsis3-metro.bmp000077500000000000000000000623341477201124000216360ustar00rootroot00000000000000BMÜd6(–9¦d . .×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xÛ‡é³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pà–8×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿç®f܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ à˜<ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×zÝ'ä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢PÜ‹#×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xÛ„Úƒ×x×x×x×x×x×x×x×x×x×x×xìÀˆóÖ²Úƒ÷âÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾÙ} ×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0øèÓÚƒ×x×x×x×x×x×x×x×x×xìÀˆÿÿÿÿÿÿóÖ²Úƒ÷âÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾÙ} ×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿøèÓÚƒ×x×x×x×x×x×x×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿóÖ²Úƒ÷âÉÿÿÿÿÿÿÿÿÿÿÿÿõݾڀÝ'×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿøèÓÚƒ×x×x×x×x×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÖ²Úƒ÷âÉÿÿÿÿÿÿõݾڀóÖ²æ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿøèÓÚƒ×x×x×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÖ²Úƒ÷âÉõݾڀóÖ²ÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿÿÿÿøèÓÚƒ×xÝ‹$뼀뼀뼀뼀뼀뼀뼀뼀뼀뼀à—;ÙÚ€óÖ²ÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡Ù~ ÝŽ)é³pé³pé³pé³pé³pé³pé³pé³pé³pé³pà•7Ø{óÖ²ÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿúìÜÛ‡ìÀˆøèÓÚ…ñÏ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿúìÜÛ‡ìÀˆÿÿÿÿÿÿøèÓÚ…ñÏ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀÚ€óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿúìÜÛ‡ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿøèÓÚ…ñÏ¥ÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²õݾڀóÖ²ÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0úìÜÛ‡ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøèÓÚ…ñÏ¥ÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xÛ†Û‡ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøèÓÚ…ñÏ¥õݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²ÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×x×xÛ†é³pé³pé³pé³pé³pé³pé³pé³pé³pé³pâE×zÙ€óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²æ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×x×xÚƒë»뼀뼀뼀뼀뼀뼀뼀뼀뼀âœDØ{óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀÝ'×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×x܉!Þ-ç°iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾÙ} ÝŒ&æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`Þ-×x×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0üôëÞ-ç°iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõݾڀ܇Þ-îÄîÄîÄîÄîÄîÄîÄîÄîÄîÄß•6×x×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿüôëÞ-ç°iÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²ûñäÝ‹$ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡á™>×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿüôëÞ-ç°iÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿûñäÝ‹$ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡úìÜæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿüôëÞ-ç°iõܽڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿûñäÝ‹$ìÀˆÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Û‡úìÜÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿÿÿÿüôëÝ'Ø|óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûñäÝ‹$ìÀˆÿÿÿÿÿÿïÈ—Û‡úìÜÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿÿÿÿõݾڀóÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûñäÝ‹$ìÀˆïÈ—Û‡úìÜÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿÿÿÿõݾÙ} Ú„áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@ÝŽ)×xÙ€úìÜÿÿÿÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿÿÿÿõݾڀß’2Ü‹#òÔ­óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°ã L×x×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0ÿÿÿõݾڀóÖ²þúöá›Bå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×y×x×x×xìÀˆÿÿÿÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xß‘0õݾڀóÖ²ÿÿÿÿÿÿþúöá›Bå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×y×x×x×x×x×xìÀˆÿÿÿÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xÚ‚Ú€óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿþúöá›Bå¨[ÿþýÿÿÿÿÿÿÿÿÿïÈ—×y×x×x×x×x×x×x×xìÀˆÿÿÿæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×xØ{óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›Bå¨[ÿþýÿÿÿïÈ—×y×x×x×x×x×x×x×x×x×xìÀˆæ«`×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×xØ{óÖ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›Bå¨[îÆ”×y×x×x×x×x×x×x×x×x×x×x×xÚƒ×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×xØ} ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ Û…×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿä¢P×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x܉ ÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿ쿇ä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pç®fÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xáš@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë¼€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×xÚƒä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢PÝ(×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xnsis-3.11/Contrib/Graphics/Header/nsis3-vintage-right.bmp000077500000000000000000000214441477201124000232550ustar00rootroot00000000000000BM$#J(–9Ú! . .EEãÓÔéÜÝQS–\^ÜÉÊ\]^` b c ffghhiijkkmmn o!p"#q#$r$%r%&s&'t'(v*+v+,w-.y/0{23{34}679:€:;€;<‚>?„@A…AC†BD‡DFŠIK™abgh¤qr©yz®‚²‡ˆ³‰Š²ˆ‰¶Ž¸‘’½˜™Å¦¦Ë®®Ì°°Í±±Î³³Õ¿¿îääöññþýýÿÿÿ     '11111111111111111111111111111111111111 3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC+ 3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC+ 3CC)0CC+ 3CCCC+ 3CC&CC+ 3CC ?2@CCCCCCCC9CC+ 3CC/: ?CC2@CCCCCC9CC+ 3CC/C: ?CCCC2@CCCC9CC+ 3CC/CC: ?CCCCCC2@CC9#CC+ 3CC/CCC: ?CCCCCCCC2@9C#CC+ 3CC/CCCC:-3333333333CC#CC+ 3CC/CCCC? *1111111111CCC#CC+ 3CC/CCC? >:CCCCCCCC9CCCC#CC+ 3CC/CC? >CC:CCCCCC9CCCC#CC+ 3CC/C? >CCCC:CCCC99CCC#CC+ 3CC/? >CCCCCC:CC9CC9CC#CC+DD3CC" >CCCCCCCC:9CCCC9C#CC+DD3CC$1111111111 CCCCCC9#CC+DD3CC%3333333333!CCCCCCCC9CC+DD3CC(:CCCCCCCC9*//////////CC+DD3CC/:CCCCCC9 .8888888887CC+113CC/C:CCCC9? >CCCCCCCB&CC+383CC/CC:CC9CC? >CCCCCB&A#CC+DD3CC/CCC:9CCCC? >CCCB&AC#CC+0<3CC/CCCC CCCCCC? >CB&ACC#CC+> 3CC/CCCC9CCCCCCCC? <&ACCC#CC+DD3CC/CCC9++++++++++!ACCCC#CC+DD3CC/CC9,=========;>CCCC#CC+:D3CC/C95CCCCCCCB>CCC#CC+ 3CC/9CC5CCCCCB>CC#CC+483CCCCCC5CCCB>C#CC+.D3CCCCCCCC5CB>#CC+DD3CCCCCCCCCC4 CC+DD3CC  CC+D:3CCCC+DD3CC06CC+ 3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC+DD3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC+ D< DD/D 3+-1 14nsis-3.11/Contrib/Graphics/Header/nsis3-vintage.bmp000077500000000000000000000214601477201124000221400ustar00rootroot00000000000000BM0#V(–9Ú! . .HHãÓÔéÜÝQS–\^ÜÉÊ\]^` a b b deffhijijkklmn o!p"#q#$r%&s&'t()u)*v*+v+,y/0{23|45899:€:;‚=>‚>?„@A…AC†CE‡EGˆFHMO™abghŸjk¤qr®‚­€³‰Š²ˆ‰¸‘’»•–½˜™Å¦¦Ë®®Í±±Î³³Õ¾¾Õ¿¿îääòëëùööþýýÿÿÿ44444444444444444444444444444444444444(,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5,FF2*FF5,FFFF5,FF FF5,FF7?FFFFFFFFA FF5,FF$7FF?FFFFFFA FF5,FF$F7FFFF?FFFFA FF5,FF$FF7FFFFFF?FFA?1FF5,FF$FFF7FFFFFFFF?A?F1FF5,FF$FFFF5555555555) ?FF1FF5,FF$FFFF "4444444444'?FFF1FF5,FF$FFF7>>>>>>>>07FFFF1FF5,FF$FA?D-EFFFFFFF;7FFF1FF5,FF$A?FFD-EFFFFF;7FF1FF5,FF?FFFFD-EFFF;7F1FF5,FF?FFFFFFD-EF;71FF5,FF?FFFFFFFFD-:FF5,FF FF5,FFFF5,FF82FF5,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5!nsis-3.11/Contrib/Graphics/Header/orange-nsis.bmp000077500000000000000000000230141477201124000216700ustar00rootroot00000000000000BM &2(–9Ú!  ÿÿ%&&899@AAWXXûþÿ …›¤Üõÿä÷ÿ÷üþ±çÿ!·èÿ½êÿÄíÿËïÿÔòÿjy€Éã蘆½íøý×àäôûþjÀíVŒ¨l¨Ç,COŠËì#3;Sx‹Ln4JU=Vcš×öšÖõFbp¤Û÷¡×ó§Ü÷¬âý¨Ü÷®ßø´æþ±àø²àøµáø»äùÀæùÂçúÅèúÊêúÏìûÔîûÖïûÓêöµÉÓÙðüáóüë÷ý-/0ó÷ù;¬í+;>­í+y¦BY5ŽÁ&f‰V·ï1>f¾ñjÃòjÂñiÁð3]th¼éd´ßmÁñ^¨ÐnÄò1Wk)HY[ŸÄqÃòd®ÖI€rÆóvÆówÈó.M^[˜¸yÉó{Çó=dy}Ëô}Èót¸ÜÌôÊòƒÌó|Áæ †Íô'¨üññññùŸk~‚‡ŠŽ'”)•—˜,/00¢¤1¦©23¬4­®5±²6´µ78¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛ ßßÞâããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMör^rèäååæççèèéêëëììí÷>Öáááááá: q‚ˆŒ‰'”+——˜,./0¢¢¤1¦©23¬4­®5±66µ788¸;ºº¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞÞâããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM³lbb†èåææçèèéêëëììííîîù;;:h|‚ˆŒ‰Ž')+—˜,./0¢¤¥¦©©ª3¬4®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM³ÊÊÊèæççèèéêëëììííîîïïù> Ÿ q…‡„‰Ž')+—˜,.00¢¤1¦©2334­®5±²6´µ78¸;¹º¼¼<Ù¾¿¿ÀÀ=ÁÂÂÃÃÛ ßÞââããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM³mmm“èççèéêëëììííîîîïððñõ·» :!{ˆy$€„‰Ž'”)•—˜,/00¢¤1¦©23¬4­®5±²6´µ78¸;¹º¼<<½¾¿¿À==ÝÂÂÃÃÛ ßßÞâãããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM³nnn’éèèéüöëììííîîïïððññòòõá>>>& ƒvw#€€„‰'”+——˜,./0¢¢¤1¦©23¬4­®5±66µµ78¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛÛ ßÞÞâãããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM³uuuœééêëþáìûþùî÷÷öðñññòòòóóóôôôs{v}#€€„‰'”+——˜,./0¢¤¥¦©©ª3¬4®5±±66µ78¶¸;º¼¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââãããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMÜwÍÍ¡éêëëþáöþþááþþþóøáòòóóóôôôôs{v}#€„‰Ž')+—˜,./0¢¤¥¦©233¬4®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÃÃÛ ßÞââãããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMÜŠŠŠÖêëììþûýþáüóùþûþóý>üõôôõs{v}#€„‰Ž'”)•—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼¼<½¾¿¿À==ÁÝÂÂÃÃÛ ßÞâããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMÜ‘ »öêììíþýþùþûñ÷ûþûþøþýõõõs{v#€€„‰Ž'”)•—˜,./0¢¢¤1¦©23¬4­®5±66´µ78¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛ ßßÞâããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMÜØ÷ûöëííîþþðþûúþþþýùûþõú÷ôþ÷õõs{v#€€„‰'”+——˜,./0¢¢¤1¦©ª3¬4®®5±66µ788¸;ºº¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞÞâããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM÷úúõöëíîîþýòðþûûþùôáöþôýþþýõöös{v#€„‰Ž')+—˜,./0¢¤¥¦©©ª3¬4®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMø÷öûöëîîïðõññú÷ýþúûþôþüøööös{v#€„‰Ž')+—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼¼<Ù¾¿¿À==ÁÂÂÃÃÛ ßÞâãããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM÷úúñçëïïðù÷óòòòòöûûôþôýù öö÷sƒv$€„‰Ž'”)•—˜,/00¢¤1¦©23¬4­®5±²6´µ78¸;¹º¼<<½¾¿¿À==ÝÂÂÃÃÛ ßßÞâãããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJM÷öêççìððúüú>>áùõôôôöùõùþþüö÷÷! qzˆ†Š‰'”+——˜,./0¢¢¤1¦©23¬4­®5±66µ778¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞÞâãããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMôææææìðö>êåæçìõùû>üûùööööö÷÷÷÷"~zˆŒŽ'”+—˜,./0¢¤¥¦©©ª3¬4®5±±66µ78¶;;º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââãããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMôææææìóñåææçèèêëëìðöúû>ûú÷÷÷j!%~…Ž')+—˜,./0¢¤1¦©2334­®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÃÃÛ ßÞââãããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMôåååæìüùäåæçèèéëëììííîïïðóøá> & s~…ŒŽ'”)•—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼<<½¾¿¿À==ÝÂÂÃÃÛ ßÞâããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMôååååøüäåæççèéêëììííîîïððññòòòóõùáý|{ˆ‹'”+——˜,./0¢¢¤1¦©23¬4­®5±66´µ78¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞÞâããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMôääæîËOZÒÖèéêëëìííîîïïðññòòòóóóôô>"~…‰'”+——˜,./0¢¢¥¦©©ª3¬4®5±±66µ78¶¸;ºº¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLSôâéïøD@@BÆÆGb†¨ØîîïïðñññòòóóóôôûË|zˆŠŽ')+—˜,./0¢¤¥¦©©ª3¬4®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJNSôìíîE@@BÆÆÆGGIIPVZ‡™¨»»ñòòòóóóô÷ý"|z‡‰Ž'”)•—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼¼<Ù¾¿¿À==ÁÝÂÂÃÃÛ ßÞâãããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLOËòììóAÆ@@BÆÆGGGIIPV_bÉinuÍ™¨»::ôôksƒˆ‹Ž'”)•—˜,/00¢¤1¦©23¬4­®5±²6´µ78¸;¹º¼<<½¾¿¿À=ÁÝÂÂÃÃÛ ßßÞâãããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJNXêëìûXZ__ZPVILGIIPVZbÊmnu͊ΛžÑ©°>!%q‚“Ž'”+——˜,./0¢¢¤1¦©23¬4­®5±66µ778¸;¹º¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞÞâãããããããããããããããããD—JJJJJJJJJJJJJJJJJJJJJJJJJJJJJKOkñéêëVZbÉinuŽ–š’ŽÍÍoumnuÍŠ‘Ï/Ñ©¬³j"ƒ…(')+—˜,./0¢¤¥¦©©ª3¬4®5±±6´µ78¶;;º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââããããããããããããããããã÷þJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIçèñü`VZbÉinuŽ–šÐ¥«Ô±µ;ׇuŽÏ£©Ó¯s ~…“')+—˜,.00¢¤1¦©2334­®5±±6´µ78¸;¹º¼¼<Ù¾¿¿ÀÀ=ÁÂÂÃÃÛ ßÞââãããããããããããããããããOwJJJJJJJJJJJJJJJJJJJJJJJJJJJJJkïôHXVVZbÉinuŽ–šÐ¥«Ô±µ;¼kv’–š0¦Ó®:h%~…“”)•—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼<<½¾¿¿À==ÝÂÂÃÃÛ ßßÞâããããããããããããããããããýwJJJJJJJJJJJJJJJJJJJJJJJJJJJJJÈýHÈVVVVZbÉinuŽ–šÐ¥«Ô±µ¸¼þ ̊ΛХ«Ô¯û"~zˆ(”+——˜,./0¢¢¤1¦©23¬4­®5±66µµ78¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛÛ ßÞÞâããããããããããããããããããJJJJJJJJJJJJJJJJJJJJJJJJJJJJJXTÇUVVVVVZbÉinuŽ–šÐ¥«Ô±µ¸: ‚Š–¡¡Ñ§³·…ˆ“”+——˜,./0¢¤¥¦©©ª3¬4®5±±66µ78¶¸;º¼¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââããããããããããããããããããå2JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJhHT`M ÈÈ]Élnu‘–šÐ¤«Ô±µ;j"s‚q !k" ~†Œ‰')+—˜,./0¢¤¥¦©©ª3¬4®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÃÃÛ ßÞââãããããããããããããããããã"XJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRUÈÈXM`SHHË% Ÿ³³:´;"!j%qzryw#€„‰Ž'”)•—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼¼<½¾¿¿À==ÁÝÂÂÃÃÛ ßÞâãããããããããããããããããããÕ=JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRJRRRYYYYYZ[[^^a]]] ``jh|npptw}#€€„‰Ž'”)•—˜,/0¢¢¤1¦©23¬4­®5±66´µ78¸;¹º¼<<½¾¿ÀÀ=ÁÝÂÂÃÃÛ ßßÞâããããããããããããããããããã4SJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRYYYYZ[[^^^aaaddffiimmmnoopptw}#€€„‰'”+——˜,./0¢¢¤1¦©ª3¬4®®5±66µ788¸;ºº¼<<¾¾¿ÀÀ=ÁÝÂÂÃÃÛ ßÞÞâããããããããããããããããããã5ÂJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRYYYYZ[[^^^aaadddiimmmnnoopttw}#€„‰Ž')+—˜,./0¢¤¥¦©©ª3¬4®5±±6´µ78¶;¹º¼¼<Ù¾¿¿ÀÀ=ÁÝÂÂÃÃÛ ßÞââãããããããããããããããããããb3JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRYYYYZ[[^^^aaaddfiimmmnnooptww}#€„‰Ž')+—˜,/00¢¤1¦©2334­®5±²6´µ78¸;¹º¼¼<Ù¾¿¿À==ÁÂÂÃÃÛ ßÞââããããããããããããããããããã JJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRRRRYYYYYZ[[^^aaaaddfiimmmnnooptw}}#€„‰Ž'”)•—˜,/00¢¤1¦©23¬4­®5±²6´µ78¸;¹º¼<<½¾¿¿À==ÝÂÂÃÃÛ ßßÞâããããããããããããããããããããnsis-3.11/Contrib/Graphics/Header/orange-r-nsis.bmp000077500000000000000000000230141477201124000221270ustar00rootroot00000000000000BM &2(–9Ú!  ÿÿ,..788WXXûþÿ…›¤Üõÿä÷ÿ÷üþ±çÿ·èÿ½êÿÄíÿËïÿÔòÿÉã蘆½íøý×àäôûþhÀî;m‡iÁïf¼éO‘³lÄò)J[ :GnÄñpÆóoÅò%AOyÄëW‹¦„Ìño£¾“Ôö’Óõ8O[C^lš×öØö#¤Û÷§Ü÷¬âý¨Ü÷®ßø´æþ±àø²àøµáøp‹˜»äùÀæùÂçúÅèúÊêúÏìûÔîûÖïûÓêöµÉÓÙðüáóüë÷ý?ABó÷ù;¬í+;>­í+y¦4ÅBYV·ïf¾ñH†¨5bz%DUjÃòjÂñh¾ìd·ãb³ßWÃNŒ®]§Î0<mÁðDy•3Zoc®ÖU•¸qÃò.PbsÇóvÈóvÆóM‚žyÉó{Çóq·Ý}Ëô}ÈóÌôy¾ã€Èï…Íô+3‰Îô‹ÐõˆÊíg™´ŽÑõŽÏôÒõ‰Çè•Ôö•Òõ·Õ–ÕöNn€Hfv›Ùú˜Õö–Ñó™Öö&5=”ÌëœÕöœ×öÖö›ÓóŸØ÷žÖö Ù÷ ×ö›Ðî¤Ýû¢Ù÷Òð£Ú÷¤Ù÷¦Û÷£Öò©Üø¨Ú÷ªÝø•ÀØ­Þø¥Òì®Ýø«Ùó°ßø±Þø²Ýõ°Ûò·âù·áø¹ãù^s~ºãù¼äù½ãù°Óæ¿åùÁæúÁåùÅçúÇèúÉéúËéúÇåöÍëûÎëû—«¶ÑìûÓíû×ïü‡–žØïüÛðüÝñüÂÓÜßòüãôýäôýæõýéöýì÷ýðùþóúþ8¡ÞTtG°í!+ %.‚Êô…ËôšÔö¦Ù÷«Û÷´ßø¹áù¾àôÄæúÇçúÌéúÈãó\gnÕíûÆÜéâóýèõýöûþ¢®¶ïøþúýÿùüþòùþ#$%oqsýþÿzz{ÿÿÿüüüûûûøøøõõõñññïïïíííêêêåååâââÝÝÝÙÙÙÖÖÖÑÑÑËËËÅÅż¼¼´´´¬¬¬£££ššš‹‹‹fffMMM ääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ==<²;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ(}yv$%ttroonnllliggggdddaaa``PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ†ƒ(yv$%%troonnl"kukkdddddaaa```PPQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääââÜÝÙÀÀ¿¿¾BB½¼¼»×A¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”.,+ŽŒˆ†)(}y$%%troonn" f\\ffjj d`aa```T\\\\TSQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œˆ†)(}yv$%troonkj#q!!!q#\ffj ^```S\U]MMVUWTSPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääâÜÜÝÙÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<<²;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ(}yv$%trrnpj#!z[['Zc!]U\\fYY^^R\UVZN[[[NcWTQPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääââÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹¹·@@³=<²;;®®:«9©7§¦¦£¢ ž321/–””.+Žˆ††ƒ(yv$%%tnuf#{*m€_[N{Zc!]UW\TTW]ZNXmO[MUTQPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääââÜÝÙÀÀ¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«ª9776¦£¢ ž321š/–”.,+ŽŒˆ†ƒ(}y$%%tpxq&*øùûàÆ*m_[NZcV]]MNÇÆFÂÂÂFÅÄXONZUTPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääâÜÝÙÀÀ¿¿Û¾BB½¼¼»ºA¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆ†)(}yv$%sj#€ôìäääïúüÆÆÇX_[NNmÄHEEEEEEÁÂÄ[ZUSPPPPPPPPPPPPPPPPPPPPPPPPääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²±;;®:«ª9©76¦£5 žž321/–”’,+Œˆ†)ƒ(}yv$%p#müòòìäÞØÞäääòúü8ÆÄXÅÂEEEEEHEEEEÁÆONMWPPPPPPPPPPPPPPPPPPPPPPPPääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ==<²;;®:««9©7§¦¦£¢žž321/–””.+Žˆ†)ƒ(yv$%#*úñññì佯ª¨ÒÕ»Üääòúü߯ÅHEEEEEJþHEEEEEJ8]TPPPPPPPPPPPPPPPPPPPPPPPääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ†ƒ(yv$%'ùññññì伬ЦŸ›Ìš¦=¿ääCÂEEEEEÂßáÅIEEEEEFÇ[M\RPPPPPPPPPPPPPPPPPPPPPPPäääääääääääâÜÝÙÀÀ¿¿Û¾BB½¼¼»×A¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆ†)(}y$${øññññì伪¨¢Í˜“‰‚wsl%•FGEGGGHýùõûÆÁGGGEIÅ_ZUPPPPPPPPPPPPPPPPPPPPPPPäääääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œˆ†)((}yv${øððððëä»Ð¦Ÿ›Ì‡vtnÉhHÃÃÃÃIÅãôôôüÄÃÃÃÃÃJÄUSPPPPPPPPPPPPPPPPPPPPPPPäääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹·¶@µ=<<²;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ(}yv${øððððëäר¢Í˜“‰ÊwslÈeÆKKKKÃÄûòòòòòàJÃKKKMÆO]TPPPPPPPPPPPPPPPPPPPPPPPäääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·@@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.+ŽŒˆ†ƒ(yv${øððððëäA¤Ÿ›Ì‡vtnÉh\KKKKXüðððððïóýKKKKON]TPPPPPPPPPPPPPPPPPPPPPPPäääääääääääââÜÝÙÀÀ¿Û¾B½½¼¼»×A¹¹·¶@µ=<²±;®®:«ª9776¦£5 ž321š/–”.,+ŽŒˆ†ƒ(}y${øïððóë乢͘“‰ÊwslÈe]NLLLOþííííú8þMLLLÇ]SPPPPPPPPPPPPPPPPPPPPPPPääääääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆ†)(}yv{øïñúáëäÛ¯3̇wtnÉhb]zh^^]]]þììììã]]U^^^XUSPPPPPPPPPPPPPPPPPPPPPPPääääääääääääâÜÜÝÙÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²±;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ(}yv{øôûûöêäää䶦‰slÈeb]{|neeeþêêêêãznleeeeÆ[ZWPPPPPPPPPPPPPPPPPPPPPPPääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ³=<²;;®®:«9©7§¦¦£¢ ž321/–””.+Žˆ†)ƒ(yv{úúúáêääääääåæD>œ~^^€ 0-‹àèèèèù -|jÆN\PPPPPPPPPPPPPPPPPPPPPPPääääääääääääââÜÝÙÀÀ¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ†ƒ(yy{úùûûôéääääâåæççèééê üççççø 4XZUSQPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääâÜÝÙÀÀ¿¿Û¾BB½¼¼»ºA¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆ†)(}y{úúðéäääåææçèèééêëìú¡ üææææø *N\RPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääâÜÝÝÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œˆ†)ƒ(}y{úöí—éäâåæççèééêëììíí¥ üòòòòú 4ÇMWQPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ==<²;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ(}y{÷sdéåææçèèééêëììííîøÏ áááááá ?*cWSPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ†ƒ(y{°"hhŠéæççèééêëììííîîïïú @@?ÆZWSPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääââÜÝÙÀÀ¿¿¾B½½¼¼»×A¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž331š/–”.,+ŽŒˆ†)(}{°ÉÉÉéçèèééêëììííîîïïððú4*MTPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œˆ†)(}{°nnn‘éèèéêëììííîîïïïðññòöCC´¸?ãàOUSQPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääâÜÜÝÙÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²²;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ(}{°rrr‘êééêü÷ìííîîïïððññòòóóöáCßXN]TQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹¹·@µ³=<²;;®®:«9©7§¦¦£¢ ž321/–””.+Žˆ†)ƒ({°www™êêëìþáíûþúïøø÷ñòòòóóóôôôõõõUSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääââÜÝÙÀÀ¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©776¦£¢ ž321š/–”.,+ŽŒˆ†ƒ({Ú}ÊÊêëììþá÷þþááþþþôùáóôôôõõõõõUSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääâÜÝÙÀÀ¿¿Û¾BB½¼¼»ºA¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆ†)({Ú‰‰‰Óëìííþû8ýþáü8óúþûþôý÷õõöUSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääâÜÝÝÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²±;;®:«ª9©76¦£5 žž321/–”’,+Œˆ†)ƒ({Úœ¸÷ëííîþýþúþûñùûþCûþùþàýàõööUSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ==<²;;®:««9©7§¦£5 žž321/–””.+Žˆ†)ƒ({ÚÖøû÷ìîîïþþCñþûãþþþýúûþöáøõþùööUSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ†ƒ({øããö÷ìîïïþýóñþûûþúõá÷þõýþþýö÷÷USPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääâÜÝÙÀÀ¿¿¾BB½¼¼»×A¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”.,+ŽŒˆ†)({ùø÷û÷ìïïðñõòòãøý88þãûþõþ8üù÷÷÷USPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œˆ†)({øããòèìðññúùôóóóô÷ûCûõþõýàú8à÷÷ø]TQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<<²;;®:«ª9©76¦£5 žž321/–””.+Žˆ†)ƒ{ù÷ëèèíññãüãCáúöõõõ÷úöú8þþü÷øøONMWTRQPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·@@³=<²;;®®:«9©7§¦¦£¢ ž321š/–”.+ŽŒˆ†ƒ{õççççíñ÷ëæçèíöúû8üûú÷÷÷÷÷øøøø_VWTPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääââÜÝÙÀÀ¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«ª9776¦£5 ž321š/–”.,+ŽŒˆ†ƒ{õççççíôòæççèééëììíñ÷ãûàûãøøù_\RPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääääâÜÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆ†){õææææíüúåæçèééêììííîîïððñôùáààßÄm\PPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²±;;®:«ª9©76¦£5 žž321/–””.+Žˆ†){õææææúüåæçèèéêëìííîîïïðññòòóóóôöúáCÅZUSPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ³=<²;;®®:«9©7§¦¦£¢žž321/–””.+Žˆ†){õååçïàTb…ÏÓéêëììíîîïïððñòòóóóôôôõõ_V\RPPPPPPPPPPPPPPPPPPPPPPPPPPPPPäääääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ„'õâêðùJEEGÃÃKLkŠ¥ÖïïððñòòòóóôôôõõûÄZUSQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääääâÜÝÙÀÀ¿¿Û¾BB½¼¼»×A¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+ŒˆŠ'õíîïCIEEGÃÃÃKKLLY^b—¥¸¸òóóóôôôõø_ZUPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääääâÜÝÝÙÀÀ¿¿Û¾B½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œ‰móííôXGEEGÃÃKKKLLY^ehÈnswÊ—¥¸??õõÇ]TPPPPPPPPPPPPPPPPPPPPPPPPPPPPPääääääääääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹·¶@µ=<<²;;®:«ª9©76¦£5 žž321/–””.+ŽŠ4ëìíûZbhebY^LKLLY^bhÉnrwʉË̛Φ­X[MWQPPPPPPPPPPPPPPPPPPPPPPPPPPPPD—ääääääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·@@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+mòêëì8^bhÈnsw‚Œ“˜‰ŒÊÊ%%nrwʇÌ2Φ©°]TPPPPPPPPPPPPPPPPPPPPPPPPPPPPØääääääääääääääääääââÜÝÙÀÀ¿¿¾B½½¼¼»×A¹¹·¶@µ=<²±;®®:«ª9776¦£5 ž331š/–”.,+‘qèéòüN^bhÈnsw‚Œ“˜Í¢¨ÑÒ²µÕŠw„ŒÌšŸ¦Ð¬mNM\RPPPPPPPPPPPPPPPPPPPPPPPPPPPP­þäääääääääääääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,‘€ðõXZ^^bhÈnsw‚Œ“˜Í¢¨Ñ®²µ¹u‚‰“˜3£Ð«?[V\PPPPPPPPPPPPPPPPPPPPPPPPPPPP;äääääääääääääääääääâÜÜÝÙÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²²;;®:«ª9©76¦£5 žž321/–””.#ýCX]^^^^bhÈnsw‚Œ“˜Í¢¨Ñ®²µ¹þ{ʉ˘͢¨Ñ:Ô_WTPPPPPPPPPPPPPPPPPPPPPPPPPPPPˆ äääääääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹¹·@µ³=<²;;®®:«9©7§¦¦£¢ ž321/–””.4&mU^^^^^bhÈnsw‚Œ“˜Í¢¨Ñ®²µ?88x‡™›Î¦°´Å\SRQPPPPPPPPPPPPPPPPPPPPPPPPPPPP}OäääääääääääääääääääââÜÝÙÀÀ¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+Ž8X'N]]]Èlsw‚Œ“˜Í¢¨Ñ®²@_&xqzCmm_VRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP _ääääääääääääääääääääâÜÝÙÀÀ¿¿Û¾BB½¼¼»ºA¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”’,+Œˆx##4{{'€€Ç€€€'¡z4°°?²@_WNcWY^PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPÀqääääääääääääääääääääâÜÝÝÙÀÀ¿¿Û¾B½½¼»ºAA¹·¶@µ=<²±;;®:«ª9©76¦£5 žž32š/–”’,+Œˆ†)ƒ(}yv$%trooqqqz{NXX8cj baa```PPPPPPPPPPPPPPPPPPPPPPPPPPPPP¹îääääääääääääääääääääâÜÜÝÙÀÀ¿¿Û¾B½½¼»»AA¹··@µ==<²;;®:««9©7§¦£5 žž321/–””.+Žˆ†)ƒ(}yv$%ttroonllliiigggdddaaa``PPPPPPPPPPPPPPPPPPPPPPPPPPPPP5ÂääääääääääääääääääääââÜÝÙÀÀ¿¿Û¾B½½¼¼»×A¹¹·¶@³=<²±;®®:«9©7§¦¦£¢ ž321š/–”.,+ŽŒˆ†ƒ(yv$%%troonnllliigggdddaaa```PPPPPPPPPPPPPPPPPPPPPPPPPPPPPb3ääääääääääääääääääääââÜÝÙÀÀ¿¿¾BB½¼¼»×A¹¹·¶@µ=<²±;¯®:«ª9776¦£5 ž332š/–”.,+ŽŒˆ†)(}y$%%troonnllliigggdddaaa```PPPPPPPPPPPPPPPPPPPPPPPPPPPPP äääääääääääääääääääääâÜÝÝÙÀÀ¿¿ÛBB½¼¼»ºAA¹·¶@µ=<²±;¯®:«ª9©76¦£5 ž332š/–”’,+Œˆ†)(}yv$%trooonnlliiggggddaaa```PPPPPPPPPPPPPPPPPPPPPPPPPPPPnsis-3.11/Contrib/Graphics/Header/orange-r.bmp000077500000000000000000000230201477201124000211520ustar00rootroot00000000000000BM&6(–9Ú!  }~~áââûþÿ´èý»êýÂíþÈîþÎðþdsyÔòþÛôþÓæî÷üþ ¢Þú©áû>µ³³;¯997­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&${zx"! rrppmkkkkhhbbbbaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…ƒ$}zx"u! rrrpminnniifbbbbbaaaPRWWWWMPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOòòèèèèèèèèääáâ Û¼¼»»º??¹¸¸·Ø>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“*)(‰‡…ƒ&$}{z"u! rqstggyYniiccbaaRWXYYNNNNYXSVPOOOOOOOOOOOOOOOOOOOOOOOOOOOOòñèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡…ƒ&$}{zxu! syvv^`\gYXViaRXN`^^K^^ZYXWMPOOOOOOOOOOOOOOOOOOOOOOOOOOòñèèèèèèèèèäááâ ÛÛ¼¼»»ßº?¹¹¸·¶>>µ³²;¯977­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&${zx"! Ást#Ud]]]dv^`\gYXWVVWY`Ud]]]dU^YSRPOOOOOOOOOOOOOOOOOOOOOOOOOóñèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸··>>µµ³;;®97­66©©5§¥32 ŸŸœ›™.-,+“*Ž(‰…ƒƒ$}zx"u! Ást#j åÀ jdU^`\gYYNZUGÝÀÀÀLIej]KZYSROOOOOOOOOOOOOOOOOOOOOOOOOÞåèèèèèèèèèääáâ Û¼¼»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥3220Ÿœ›™.-,–+“*)(‰‡…ƒ$}{z"u!ÂstIÿîèìúæåÀÝjdU^``KILUCAAACULLGj]UZYWQOOOOOOOOOOOOOOOOOOOOOOOO™©èèèèèèèèèèäáâ Û¼¼»»ßº??¹¸¸·¶>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ&$}{zxu!ÂsÝñîèèèìúþåÀ j]LKAAAAAAAAAKÀj]KXPOOOOOOOOOOOOOOOOOOOOOOOS\èèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­¬66©5§¥¥£20Ÿ/›™™.-,+“)Ž(‡…ƒ&${zxu!rÝûññîè¬7Õ¸Ûèèîü@ÞÀ ICAAAACLCAAAACIIjKNSQOOOOOOOOOOOOOOOOOOOOOOO0èèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸··>>µ³³;¯997­66©5§§¥32 ŸŸœ™™.-,+“*Ž(‰…ƒ&$}zx"ŒÞøñññ誤¡œÉËÎ9ºèèîüÿÀBAAAABIÝIBAAAABÀGUZXVOOOOOOOOOOOOOOOOOOOOOOOþÿèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…ƒ$}zx"yæðððð輨£žÊ–‘Å„||Ž¡ÙFAAAAAGåúåGAAAAAFÀj^NWOOOOOOOOOOOOOOOOOOOOOOOùùèèèèèèèèèèèäáâ Û¼¼»»ßº??¹¸¸·Ø>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ&$}{z"uyæðððð輤¡œÉ”ކÄwÂqm\GEEEEE½ÞúöùÞDEEEEEG]KNSOOOOOOOOOOOOOOOOOOOOOOOúúèèèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡…ƒ&$${zxuyæðððð軣žÊ–‘Å„|Ãqoh]FHHHHKÀúôôôúÀKHHHHFLU\SOOOOOOOOOOOOOOOOOOOOOOOÿþèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸··>>µ³²;¯977­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&${zx"yæïïïï軡œÉ”ކÄÃÂqmfI¾¾¾¾JãûñññññûãN¾¾¾¾ãUSOOOOOOOOOOOOOOOOOOOOOOOØâèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³;;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*Ž(‰‡…ƒ$}zx"yæïïïïç軞ʖ‘Å„| rohce¿¿¿NÀÿüòîîîòüÿÀY¿¿¿GU\SOOOOOOOOOOOOOOOOOOOOOOOÚÚèèèèèèèèèèèääáâ Û¼¼»ßº?¹¹¸¸·Ø>µµ³²;¯97­¬6©©5§¥3220Ÿ/›™.-,–+“*)(‰‡…ƒ$}{z"yæîîñçèßœ—”ƆÄÃÂqmfce[[[UeeÀûíííûÀeeUT[[eK\SOOOOOOOOOOOOOOOOOOOOOOOnÛèèèèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ&$}{zxyæîùÿçèèá¸Óœ„| rohc_jcccceúìììúecccccceKNWOOOOOOOOOOOOOOOOOOOOOOOöµèèèèèèèèèèèèäááâ ÛÛ¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­¬66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&${zxyæýÿýçèèèèèèèÙ¦Çqf__ %ùìëëõ@"oh d`YOOOOOOOOOOOOOOOOOOOOOOOööèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸··>>µ³³;¯®97­66©©5§¥32 ŸŸœ›™.-,+“*Ž(‰…ƒ&$}zxyþæüÿþíèèÛèäéêêêëÚ4'1ôêêêô’LK\XROOOOOOOOOOOOOOOOOOOOOOOööèèèèèèèèèèèèääáâ Û¼¼»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…ƒ$}zzyþýÿüíèèÔ¡¤«´ëëëììíýóêêêój`YPOOOOOOOOOOOOOOOOOOOOOOO÷öèèèèèèèèèèèèèäáâ Û¼¼»»ßº??¹¸¸·¶>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ&$}{zyþ@õ‹íèèÒË–‘Å|È4Üííð 4óéééó4Ý^NSROOOOOOOOOOOOOOOOOOOOOOOO÷÷èèèèèèèèèèèèèäáââ Û¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡…ƒ&${zyþç°ofíèéЖ‘†~Ãqmf=çççýæþþþæ\XVPOOOOOOOOOOOOOOOOOOOOOOOO÷÷èèèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸··>>µ³³;¯997­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&${zyþÏhhhìéê¡‘†|Ãqmf_°çîÿ@ <88888< @eNXPOOOOOOOOOOOOOOOOOOOOOOOOOøøèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…ƒ$}zyþmmmmíêê̆|Âqmf_M°îîïðÿ@= =@eYSVPOOOOOOOOOOOOOOOOOOOOOOOOOOøøèèèèèèèèèèèèèääáâ Û¼¼»»º?¹¹¸¸·Ø>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..,–+“*)(‰‡…ƒ&$}{yþqqqqìëëš|ÂÁmc_M¿<îïïððñþÞ: > :ÝdXWRPOOOOOOOOOOOOOOOOOOOOOOOOOOOøøèèèèèèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡…ƒ&$}{yþÂÂÂÂìëëÚ=°˜1Ö88øñïððññòó÷þÞææÀjZXRPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOùùèèèèèèèèèèèèèèäááâ ÛÛ¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&${yþÃÃÃÃìììíçîðòôõöùòððñòòóóôôõõýýýÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOùùèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸··>>µµ³;¯®97­66©©5§¥32 ŸŸœ›™.-,+“*Ž(‰…ƒ&$}yþ||||ìììçïñóôöøùóññòóóôôõõõö÷øøÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOùùèèèèèèèèèèèèèèääáâ Û¼¼»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥3220Ÿœ›™.-,–+“*)(‰‡…ƒ$}yþƒ„„Åìííçîðòôõ÷ùúôôüûú÷öõõöö÷øùùÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOúúèèèèèèèèèèèèèèèäáâ Û¼¼»»ßº??¹¸¸·¶>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ&$}yþÅÅšàìççïñóôöøùúôóóõøûûüû÷øøùùùÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOúúèèèèèèèèèèèèèèèäáââ Û¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­¬66©5§¥¥£20Ÿ/›™™.-,+“)Ž(‡…ƒ&$yþ”°ýæìçîðòôõ÷ùúûõõúøõõöö÷øùùùúúÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOúúèèèèèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸··>>µ³³;¯997­66©5§§¥32 Ÿ/›™™.-,+“*Ž(‰…ƒ&$yþøæýõìïñóôöøùûûöõùúüüüûûúùúúúûÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOûûèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…ƒ$yæûý@ìîïïðñòô÷ùûû÷õööö÷øúûüüüüûûÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOûûèèèèèèèèèèèèèèèèäáâ Û¼¼»»º??¹¸¸·Ø>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“*)(‰‡…ƒ&$yúæðìïððññòóóôô÷õ÷üüüûûúúúúûûüûÀ]KNSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOûûèèèèèèèèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡…ƒ&$yþæúëêìðñôÞÞåæýôõöö÷øùûûüüüüüüûüÀ]UXWVQOOOOOOOOOOOOOOOOOOOOOOOOOOOOüüèèèèèèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸·¶>>µ³²;¯977­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&yçêêêìññüêíùýæåÞå@þýùùúúûûûüüüüÀd^\YSVOOOOOOOOOOOOOOOOOOOOOOOOOOOOüüèèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³;;®97­66©©5§¥32 ŸŸœ›™.-,–+“*Ž(‰‡…ƒyêêêêìòþ@éêêëëìììïû@åÞÞ@æüüüüüÀjd^XPOOOOOOOOOOOOOOOOOOOOOOOOOOOüüèèèèèèèèèèèèèèèèääáâ Û¼¼»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥3220Ÿ/›™.-,–+“*)(‰‡…ƒyêêêêìûåìêêêëëììíççîïôüþ@åÞÞÿ@Àej]UZYOOOOOOOOOOOOOOOOOOOOOOOOOOOOýýèèèèèèèèèèèèèèèèèäáâ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ†yêêêêÞóéêêëëììííçîïïðññòóôøýæÿåLLUXVOOOOOOOOOOOOOOOOOOOOOOOOOOOOýýèèèèèèèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­¬66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‰…ƒ&yéééëþ^¢±êëëììííççîïðññòóóôõõööøþ `YWQOOOOOOOOOOOOOOOOOOOOOOOOOOOOýýèèèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸··>>µ³³;¯®97­66©©5§¥32 ŸŸœ™™.-,+“*Ž(‰…ƒ#èéçñÞAAAE¾cϰçîïððñòóóôôõõö÷úLU\SVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOýýèèèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…'#ëïýDAAAEEH¾¾¿M_Á˜˜<ññòòóôôõõö÷øåe^NWPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOþþèèèèèèèèèèèèèèèèèèäáâ Û¼¼»»ßº??¹¸¸·Ø>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡ƒ‹vççåCAAAEHH¾¾¿MT_cfmq‹˜1ÖÖõö÷øL]K\SQOOOOOOOOOOOOOOOOOOOOOOOOOOOOOþþèèèèèèèèèèèèèèèèèèäáââ Û¼¼»»ßº?¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡'‚LïíçôeMT¿¾¾¾H¾¾¿MT_cfoqÂw~†ÆÇ–šÏ<ådZYPOOOOOOOOOOOOOOOOOOOOOOOOOOOOþþèèèèèèèèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸··>>µ³²;¯977­66©5§¥¥£20Ÿ/›™™.-,+“*Ž(‡‹v@ììíÿZcfmqÂwÄ|à ÂoofhoqÂwÄ„ÆÇ—ËŸ¤:Ýj]K\SROOOOOOOOOOOOOOOOOOOOOOOOOOOOþþèèèèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³;;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(Š‚ÝñëìóÞ_cfmqÂwĆƔ—œÍ¤Ñž£Ê‚|€Å‘–Êž£¨åIUZYOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿþèèèèèèèèèèèèèèèèèèääáâ Û¼¼»»º?¹¹¸¸·Ø>µµ³²;¯97­¬6©©5§¥3220Ÿ/›™..,–+“*)(ˆ@êù@eZ_cfmqÂwĆƔ—œÍ¤Ñ¬;×sĆޕ.¡¤8LUZYOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)ŽŠ ýj\___cfmqÂwĆƔ—œÍ¤Ñ¬;×v~„Æ”—œÍ¤«ÿ]`\XPOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèäááâ ÛÛ¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­­66©5§¥¥£20Ÿ/›™™.-,+“*Ž#ÀU_____cfmqÂwĆƔ—œÍ¤Ñ¬;×ÀÝ‚„ÅÇ–Ë3Ñ:LYXWROOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸··>>µµ³;¯®97­66©©5§¥32 ŸŸœ›™.-,+“*ŽŒ‚@U\\g__cfmqÂwĆƔ—œÍ¤Ñ¬;×Ý]€‡’ŒÞUXVRPOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèääáâ Û¼¼»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰tˆvveeeeedvv#ŒŒ’œÍ¤Ñ¬²µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“)Ž(‡…ƒ&$}{zxu!yyyvUvjeeå@dYiccaaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèèäáââ Û¼¼»»ßº?¹¹¸·¶>>µ³²;¯97­¬66©5§¥¥£20Ÿ/›™™.-–+“)Ž(‡…ƒ&${zxu! rrllln\tbbbbbaaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèèäááâ Û¼¼»»ßº?¹¹¸··>>µ³³;¯997­66©5§§¥32 Ÿ/›™™.-,+“*Ž(‰…ƒ&${zx"! rrrpllkkhhhbbbbaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèèääáâ Û¼¼»»ßº?¹¹¸¸·Ø>µµ³²;®97­¬6©©5§¥32 ŸŸœ›™.-,–+“*)(‰‡…ƒ$}zx"u! rrrpllkkhhhbbbbaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèèääáâ Û¼¼»»º??¹¸¸·Ø>µµ³²;¯97­¬6ª©5§¥3220Ÿ/›™..-–+“*)(‰‡…ƒ&$}{z"u! rrpllkkhhhhbbbaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿèèèèèèèèèèèèèèèèèèèèèäáââ Û¼¼»»ß??¹¸¸·¶>>µ³²;¯97­¬6ª©5§¥¥£20Ÿ/›™..-–+“)Ž(‡…ƒ&$}{zxu! rrllkkkhhhbbbaaaaOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÿnsis-3.11/Contrib/Graphics/Header/orange-uninstall-nsis.bmp000077500000000000000000000230141477201124000236770ustar00rootroot00000000000000BM &2(–9Ú!  ÿÿ.//îïïÇÈȹººûþÿ÷üþíøýôûþ1:0KYv´Ô>YgMnj–­’Îís¡¹WzŒš×öšÖõ€²ÌØöœ×õ¤Û÷£Ùõ§Ü÷¨Ü÷®ßø±àø²àøµáø»äùÀæùÂçúÅèúÊêúÏìûÔîûÖïûÙðüáóüë÷ýAY>­íQµï_»ðg¿ñjÃòjÂñ3]tjÁïP´i½é_ªÒnÄòfµàc¯ØrÆó1Uh-N`rÃñY™»9bxuÆóHz•(DSwÈóBo‡a¢ÅyÉóyÆò}Ëô}Èòu¼âÌôÊóƒËô†ÎôÂæŠÎôŒÐõ‰ÊíÑõ[…›’Óöx«Ç•Òõ”Òó–Õö:R_ŽÇçEap™Ôö™Öö˜ÓóšÕôœÕöœ×ö›ÔòÁÝŸØ÷žÖöÕô˜Ïì–Ìé Ù÷›Òð‰¹Ó¢Ù÷¡×öŸÖóžÔñ£Ú÷¤Ù÷¦Û÷ Ñí©Üø¨Ú÷ªÝø«Ü÷­Þø°ßø®Üö³ßøªÔì·âù·áø¸áø¹ãù»ãù¼äù½ãù¿åùÁæúµØëÁåùÄçúÇèúÉéúËéú¿ÜìÍëûÎëûÑìûËäòÓíû×ïüØïüÛðüÝñüßòüãôýäôýæõýéöýì÷ýðùþóúþmÁò&-—ÓöšÔö¦Ù÷§Øõ¯Ýø´ßø`r}¿áõÃåùÇçúÄàñ‚“ÐéøÕíû¨µ½âóýÀÌÓàíõîöûöûþdŠ£ž¬µïøþúýÿùüþ)AADDDFFFIIKLLLLOOOQQSSWW\`choquuw||ƒ ‡!ˆ‰"Œ##$%%’&””•''——˜™™(šµ››œœ²·¶¶Âààààààà....................................../-1-..5558888>AADDDFFFIIIILLLOOQQSSSWW\`chkouwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ››œœ²·¶ÂÂààààààà.....................................-,67763315888>>AADDDFFJGEMMHMMMPPQSSSW[\chkouwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'®—˜˜™((š››œœ²·¶ÂÂààààààà.................................../-642222C47631;8AAADDFFGMH TC<T HPPSWW\\chkqsuwx|€ƒ ‡!ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²··¶Âàààààààà................................../36C2B=0BB?22C46H3;EEDFEH7CR? B ?R TjPVW\`choquuw||ƒ ‡!ˆ‰"Œ##$$%’&“”•''–—˜™™(šµ››œœ²²·¶¶Âàààààààà................................./,7BÝÞÞÞÞÞ¹½ðêêêûÓÜÞÞÞÞÞ½ Rfkqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²··¶Âààààààààààà................................0öðúûààà›&ƒtUOLJE>2ÒÑÔÞÞÝþøççççí@ÞÞÞÞÞ½Z³jnoquuw||ƒ ‡!ˆ‰"Œ##Ž$%’&“”•''–—˜™™(šµ››œœ²²·¶¶Âààààààààààà................................0øûÁ÷÷ààààà౫yV>;2¥ÐÐÑ ý÷ææéñååéÁÒÑÔÔÞ¾ bmoquuw|ƒƒ„ !!‰"ŒŒ##$%‘’&””•''——˜™™(šµ››œœ²·¶ÂÂààààààààààà................................0ùøúûæàààààáâãääå©{ÃÐÐÅßöääèÁßðääçûÏÐÐÒ¹Rglouwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ›œœ²·¶ÂÂààààààààààà................................0øûúòìæàààÂáâãäååæçèûÌÍÐûÁÁÏÅßïáßÌÍÍ bakqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'–—˜˜™((šµ››œœ²·¶Âàààààààààààà................................0ùøë……æààáâãääåæèééßÍÍÍÁÁÁÏÍÍÅßøßÄÍÍÉ jfckqsuwx|ƒ ‡!ˆ‰"Œ#Ž$%’&“”•''–—˜™™(šµ››œœ²··¶Âàààààààààààà................................0öìrE{åÂáâãäååæçèéêëìÁÏÎÎÎÏÏÎÎÎδßÄÎκý³gehoquuw||ƒ ‡!ˆ‰"Œ##$%%’&””•''——˜™™(šµ››œœ²·¶¶Âàààààààààààà................................0´GG…æâãääåæèééëììííÀ´ÇÇÇÇÇÇÇÇÇÇÇÇÈÃjYehkouwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ››œœ²·¶ÂÂàààààààààààà................................0ÉKKK…æãäååæçèéêëììííîòüÏÈÊÊÊÊÊÊÊÊÊÆ³bg^chkouwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'®—˜˜™™(š››œœ²·¶ÂÂàààààààààààà................................0ÅLNL…æäåææèééëëìííîïïðñÁÀ÷¿ËËËËËÆßY^chkqsuwx|€ƒ ‡!ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²··¶Âààààààààààààà................................0´OOO‹åæøíéêëììííîïððññòôúüÀßßß¾ž TYW`choquuw||ƒ ‡!ˆ‰"Œ##$%’&“”•''–—˜™™(šµ››œœ²²·¶¶Âààààààààààààà................................0´UUU©æèþöëùÀóíîïïðñññòòòóóóôø¼ R\`choquuw|ƒƒ„ !!‰"ŒŒ##$%‘’&”••''——˜™™(šµ››œœ²·¶ÂÂààààààààààààà................................0´[[[©çèéþöþþöúþþ½Áñöõòóóôôôù¼ R\`chkouwx|ƒ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ›œœ²·¶ÂÂààààààààààààà................................0´dddçééëþ÷ýþþ÷½¾øüþøþÁÀûøôù¼ R\chkqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'–—˜˜™((šµ››œœ²·¶Âàààààààààààààà................................0´k¡©òçêëìþýþüþ÷ö÷úþÁþùþ¾¾þûõù¼ R`chkqsuw||ƒ ‡!ˆ‰"Œ##Ž$%’&“”•''–—˜™™(šµ››œœ²··¶Âàààààààààààààà................................0´¦ôÁõèëìíþþÀ÷þ÷ùþþþþùþøÀöý½õõù¼ R`choquuw||ƒ„ !!‰‰"Œ##$%%’&””•''——˜™™(šµ››œœ²·¶¶Âàààààààààààààà................................0öùÁöñèìííþ½÷þ÷þúùøóþôúþ½õõù¼ R`chkouwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ››œœ²·¶ÂÂàààààààààààààà................................0øøõúõéíîï÷÷ðöþøúþßüþøþøþþúõöù¼ Rchkouwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'®—˜˜™((š››œœ²·¶Âààààààààààààààà................................0õùÁõäéîïïöññòòòòú¾ÀôþøþßõÀûööú¼ Rchkqsuwx|ƒ ‡!ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²··¶Âààààààààààààààà................................0øùëääéïðù¾ýüÁùöóóôôùûõßþþþüööú¼Xbgadhoquuw||ƒ ‡!ˆ‰"Œ##$$%’&“”•''–—˜™™(šµ››œœ²·¶¶Âààààààààààààààà................................0ããããéðöçâãöúßýüûù÷õõõøùúöö÷ú¼ Z³jgekoquwx|ƒƒ„ !!‰"ŒŒ##$%‘&&”••'®—˜˜™™(šµ››œœ²·¶ÂÂààààààààààààààà................................0ããããêñýòâãäååæèé÷úüýüûúøö÷÷ú¾¹XZRTbnkouwx|€ƒ !ˆ‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ›œœ²·¶ÂÂààààààààààààààà................................0ôââââëûùáâãäåæçéêëììíîïöøÁüýýÀÀ¸¹Xbekqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²·¶Âàààààààààààààààà................................0ôââââ÷üáããäåæçèéëììíîïððññòò÷ùûÀý¼RTgloquuw||ƒ ‡!ˆ‰"Œ##Ž$%’&“”•''–—˜™™(šµ››œœ²·¶¶Âàààààààààààààààà................................0ôááãëžM¢¨°åæçèéëììííïïðññòòóóôôXbihoquuw||ƒƒ„ !!‰"ŒŒ##$%‘’&””•''——˜™™(šµ››œœ²·¶ÂÂàààààààààààààààà...............................-9ôáåíø)****+;r‹¿ëìííïïðññòòòóóôôÁžRgckouwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ››œœ²·¶ÂÂàààààààààààààààà...............................39ôéìíÃ2****+++,,-P{ººðñòòòóóôôõ½ ³jihkqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'®—˜˜™((šµ››œœ²·¶Âààààààààààààààààà..............................-6žëìó*****+++,,-;EGKNQ]{ºº¯óôôÀž Rgckqsuwx|ƒ ‡!ˆ‰"Œ#Ž$%’&“”•''–—˜˜™(šµ››œœ²··¶Âààààààààààààààààà..............................3?ûèéëÁ?;--,,++,,-;EJKNQU_ltvz‹Ä»¹X broquuw||ƒ ‡!ˆ‰"Œ##$$%’&“”•''——˜™™(šµ››œœ²·¶¶Âàààààààààààààààààcò.............................16žñèé¾;>GKNQU_k _OULLJKNQU_l¡yz†¨¥¼¹ Rguwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&&”••'®—˜˜™™(šµ››œœ²·¶ÂÂàààààààààààààààààií.............................-?ßåæú=;>GKNQU_kt£€†¨#¨§YŸdpvz~ƒ¨‹½¹X¥bmuwx|€ƒ !ˆ‰"ŒŒ#Ž$%’&“”••'®—˜˜™™(š››œœ²·¶ÂÂàààààààààààààààààÚÚ.............................1éú¾=6;>GKNQU_kt£€†¨¬“'ZU_kx}‚‡"ªžZbrqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²··¶ÂààààààààààààààààààÑí.............................2¾û¸?6;;;>GKNQU_kt£€†¨¬“Æþ lt£¤€†‰ gmquuw||ƒ ‡!ˆ‰"Œ##$%’&“”•''–—˜™™(šµ››œœ²²·¶¶ÂààààààààààààààààààÞÏ.............................:¸45;;;;>GKNQU_kt£€†¨¬“­¼ž[d¡yz|„¨´ÁjYrquuw|ƒƒ„ !!‰"ŒŒ##$%‘’&”••''——˜™™(šµ››œœ²·¶ÂÂààààààààààààààààààVÙ...............................½==2225>DKNQV_t£‚†¨¬“­¹Rmb¥Ãý imkuwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ›œœ²·¶ÂÂààààààààààààààààààj#...............................22R009žX ³ÅÅj†¨Œ¬“úB¸ž¹Z³]chkqsuwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'–—˜˜™((šµ››œœ²·¶Âàààààààààààààààààààj>..............................5.5558888>>AAC<AADDDFFFIIKKLLLOMOQQSSWW\`choquuw||ƒ„ !!‰‰"Œ##$%%’&””•''——˜™™(šµ››œœ²·¶¶Âààààààààààààààààààà5Â..............................555558888>AADDDFFFIIILLLLOOOQSSSWW\`chkouwx|ƒƒ„ !!‰"ŒŒ#Ž$%‘&“”••'®—˜˜™™(šµ››œœ²·¶ÂÂàààààààààààààààààààb3...............................5555888>>AADDDFFFIIKLLLNOOQQSSSW[\chkouwx|€ƒ !ˆ‰"Œ#Ž$%’&“”••'®—˜˜™((š››œœ²·¶ÂÂààààààààààààààààààà .............................555558888>>AADDFFFFIIKLLLOOOQQSSWW\\chkqsuwx|ƒ ‡!ˆ‰"Œ#Ž$%’&“”•''–—˜˜™((µ››œœ²··¶Âàààààààààààààààààààànsis-3.11/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp000077500000000000000000000230141477201124000241360ustar00rootroot00000000000000BM &2(–9Ú!  ÿÿ%&&.//yzzîïïÇÈȹºº ûþÿ÷üþíøýôûþiÁïlÄòc³Ü8d{pÆóoÅò>n‡†Ìð‘Óõ“Ôö’ÓõIgvš×öØö¤Û÷§Ü÷¨Ü÷®ßø±àø²àøµáø»äùÀæùÂçúÅèúÊêúÏìûÔîûÖïûÙðüáóüë÷ýcef0ŒÁ>­íQµï_»ðg¿ñd¸åjÃòjÂñh¾ìf»èJ‡¨Fž[¥ÌP²YžÃDy•pÅób­ÕpÄñi·âU•·.PcqÃòsÇó*HXvÆóuÅðwÈótÂë6ZmyÉóP…¡zÇòs½ä}Ëô}Èó 3>ÌôÊóƒÍôƒËô„Ëô]Ž©‡Îô‰Îô€Âåz¹Ú‹Ðõ‰ÉíŽÑõÐõEev“ÓöÍï•Ôö•Óõs£½–Õö^„™˜Õö™Ôö™Öö™ÒóœÕöœ×öŸØ÷žÖöÖõ Ù÷ ×ö¢Ù÷“Åá£Ú÷¡×õ¤Ù÷¢ØõŸÒî¦Û÷©Üø¨Ú÷ªÝø«Ü÷­Þø°ßø®Üö³ßøªÔì·âù·áø¸áø¹ãù»ãù¼äù½ãù¿åùÁæúµØëÁåùÄçúÇèúÉéúËéú¿Üìfu}ÍëûÎëûÑìûËäòÓíû×ïüØïüÛðüÝñüßòüãôýäôýæõýéöýì÷ýðùþóúþmÁò'0”Ñõ—Óö¦Ù÷§Øõ¯Ýø´ßø¿áõÃåùÇçúÄàñ‚“ÐéøÕíûâóýÀÌÓàíõîöûöûþž¬µïøþúýÿùüþVl}ºÐà#;N% o¯£µÆÒÝè89:@ABýþÿ—¦¹¶¿ËÙæÿÔßô—Ÿ®{áëÿêñÿ³ÀÝ}…—ÈØþÓàÿµÈýgn”šÿý4Ï•..ÿ`11ÊkküCC”OOQZZ[ÿÿÿûûûùùùöööóóóðððìììëëëèèèåååâââÝÝÝÛÛÛÙÙÙÖÖÖÑÑÑÌÌÌÃÃþ¾¾³³³ªªª   “““†††nnnååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))ž(›''&™%%•$‘#"!‹‰ ‡„„}}zuqnmhfc^^\\XXXTTRROOOKKKHHFDD 33333333333333333333333333333333333333333ôóååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqnmjfc^^\\YXXTSSSPOOKKKHHFDDD 33333333333333333333333333333333333333333òòååååååååÉɼ½¹ ¥¥¤¤ £++¢¡¡ µ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}usqnjhf^^\\YXSZN[@NIZGKKHHFDDD= 122 222654333333333333333333333333333333òòåååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ˆ‡„€}{zsqnjhfca^\\YTZ[eAWee>@[NIGGDDD= 6 9;;AAA;9>2543333333333333333333333333333òòåååååååååɼ¼½¹¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&&™%%•$‘#"!‹‰ ‡„„}}zuqnmhfc^^YZeW<` NNI??=?5@9A7<8:;>6 333333333333333333333333333óòåååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡  ))žž((š'&™%%••$‘##"Œ‹‹‰‡‡„}}zuqnnmjfc^^[eLÀEEEEBJ` @6@>;7JBEEÀEEB<:92 33333333333333333333333333ðòåååååååååÉɼ½¹ ¥¥¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘#""!‹‰‡‡„€}usqnmjhf^][e*,ã*ÂÁQÀEEBJ24333333333333333333333333x…ååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™—%%•$‘#"!‹‰ ‡„„}{zsqnmhfca][EÇöôíå¼¹ååå÷üȧQÀEEBÁÞÙÙÙÙÙÙÙÙÙÙÜà§ÀB: 5333333333333333333333333BJååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))ž(›''&™%%•$‘‘##"Œ‹‹‰‡„„}}zuqnmjfcZQãóóóì墖’´£ååå÷üȧÂÜÙÝÙÝÙÝÝÙÝÝÙÝÛà§ÀB892433333333333333333333333¿€ååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqnmjfc`óóóóìå¡’‹†€~ˆåå÷ÞÝÝÝÞÞÝÝÝÝÛàßÝÝßàQE: 33333333333333333333333ûüåååååååååååɼ½¹ ¥¥¤¤»£++¢¡¡ µ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zsqnjhfa`úóóóóì塎ˆ¬|rl¨_o€¿ÂÝÝÝÞÞÝÝßàÈàßÝÝâÂÀJ79533333333333333333333333úúåååååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ ‡„€}{zsqnhfca`úòòòòëå ‹†€~wo©YVPEßÝáÞùùÞßàýàßÝÝÁQB<;633333333333333333333333ÿýåååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))žœ(›'&&™%%•$‘#"!‹‰ ‡„„}}zuqnmhfc`úòòòòë嵎ˆ­¬|rl¨_XSMÁáÝßþûööþöö*ÚáÝâ§E;233333333333333333333333ØìåååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žž((š'&™—%••$‘##"Œ‹‹‰‡‡„€}zusqnmjfc`úññññëå)‹…€~wo©_YVS;ÞáááâùôôöûôôöÚáááßÂB;233333333333333333333333ÙÙåååååååååååÉɼ½¹ ¥¥¤» £+¢¢¡¡ µ)žžœ(›'&™—%••$‘#""!‹‰ˆ‡„€}usqnmjhf`úññññë垈­¬|ri¨_XSMAâááááâøññññõÁáááááE;233333333333333333333333£Úååååååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zsqnjhfc`ùððúú塈€~wo©_YVPFâáááááEóîîîäàááááááB<9633333333333333333333333övååååååååååååɼ¼½¹¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™—%%•$‘#"!‹‰ ‡„„}}zuqnmhfc`ùóäååå¤(‹|¨\XSMCA×ÖØØáâþûëëëëðÀØááØáJ89533333333333333333333333ööååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡  ))ž(›š'&™%%••$‘##"Œ‹‹‰‡‡„}}zuqnmjfc`ûäýúúååååååɸ³¨FCA¾ÖÖÖÄúêêíôééíý×ÖØØáÁ: 33333333333333333333333ööååååååååååååÉɼ½¹ ¥¥¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqnmjffüûäêåååååÉæçèè鱃ÈÖÖÊãùèèì,ãóèèëäÓÖÖ×Q<;2433333333333333333333333÷öåååååååååååååɼ½¹ ¥¥¤¤»£++¢¡¡ Ÿ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zsqnjhfû,ýôïêåååÉææçèééêëìäÅÔÖ,,ëýÏÊãòæãÒÔÔ: 5333333333333333333333333÷÷åååååååååååååɼ½½¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ ‡„€}{zsqnmhfüûîêååÉæçèèéêìííãÔÔÔ,ýýÏÔÔÊäûãÒÔÔʧ7964333333333333333333333333÷÷åååååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))ž(›''&™%%•$‘#"!‹‰ ‡„„}}zuqnmhfùïyFƒéÉææçèééêëìíîîî,ÓÕÕÕÏÏÕÕÕÕºãÒÕÕ¿892 3333333333333333333333333øøåååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqnmjfºbPPêæçèèéêìííîïïððǺÌÌÌÌÌÌÌÌÌÌÌÌÍÈ<92 33333333333333333333333333øøåååååååååååååÉɼ½¹ ¥¥¤¤ £+¢¢¡¡ µ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}usqnjhÎUUUêçèééêëìíîîïïððñõÈÏÍÐÐÐÐÐÐÐÐÐË8>2 333333333333333333333333333øøååååååååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ˆ‡„€}{zsqnjhÊXXXêèéêêìííîîïððñòòóô,ÇÎÆÑÑÑÑÑËä§:25 3333333333333333333333333333ùùååååååååååååååɼ¼½¹¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™™%%•$‘#"!‹‰ ‡„„}}zuqnmh`º__\“éêûðíîîïïððñòóóôôõ÷ýÈÇããã*§;24333333333333333333333333333333ùùååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡  ))žž(›š'&™%%••$‘##"Œ‹‹‰‡‡„}}zuqnmjº¨¨¨±êìþùîüÇöðñòòóôôôõõõööö÷ûÁB<963333333333333333333333333333333ùùååååååååååååååÉɼ½¹ ¥¥¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##""!‹‰‡‡„€}usqnmjºiii±ëìíþùþþùþþ,ôùøõöö÷÷÷üÁB<963333333333333333333333333333333úúåååååååååååååååɼ½¹ ¥¥¤¤»£++¢¡¡ Ÿ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zsqnjºooo˜ëííîþúþþú*ûÈþûþýÇäû÷üÁB<963333333333333333333333333333333úúåååååååååååååååɼ½½¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™—%%•$‘#"!‹‰ ‡„„}{zsqnmºs|“õëîîïþþÈþúùúþ,þüþ**þäøüÁB<963333333333333333333333333333333úúåååååååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))ž(›''&™%%•$‘‘##"Œ‹‰ ‡„„}}zuqnmº®ýøìîïðþþÇúþúüþþþþüþûÇùøøüÁB<963333333333333333333333333333333ûûåååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqnmùüýùôìïððþ÷úþúþýüûöþ÷þøøüÁB<963333333333333333333333333333333ûûååååååååååååååååɼ½¹ ¥¥¤¤ £++¢¡¡ µ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}usqnûûøýøíðñòúúóùþúýþãÈþûþûþþøùüÁB<963333333333333333333333333333333ûûååååååååååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ ‡„€}{zsqnøüýøèíñòòùôôõõõ*Ç÷þûþãøÇ,ùùÁB<963333333333333333333333333333333üüååååååååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&&™%%•$‘#"!‹‰ ‡„„}}zuqnmûüîèèíòóü*È,üùöö÷÷÷äøãþþþÈùùÁEA>2543333333333333333333333333333üüååååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žž((š'&™%%••$‘##"Œ‹‹‰‡‡„€}zusqnmççççíóùëæçùãÈäüúøøøûüùùúÁEJ8A>2 3333333333333333333333333333üüååååååååååååååååÉɼ½¹ ¥¥¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘#""!‹‰ˆ‡„€}usqnmççççîôõæçèééêìíúýÈÈäûùúúÂÀEJ533333333333333333333333333333ýýåååååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqp÷ÉéðûÀ..../Gby“Æîïððñòóôôõõõöö÷÷,§<;2433333333333333333333333333333þþååååååååååååååååååɼ½¹ ¥¥¤¤»£++¢¡¡ µ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zsqyJ÷íïðÈ-....///001¦]bƒ¿¿óôõõõöö÷÷øB895333333333333333333333333333333þþååååååååååååååååååɼ½½¹ ¥¥¤¤» £+¢¡¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ ‡„€}{zsvt§õîïö§.....///001¦CFPVY_kƒ¿¿¶ö÷÷ǧB<;2433333333333333333333333333333þþååååååååååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))žœ(›'&&™%%•$‘#"!‹‰ ‡„„}}zuyWäìíî,533333333333333333333333333333¾zååååååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žž((š'&™—%••$‘##"Œ‹‹‰‡‡„€}xt§ôìí*CFPUY_dlsil_¨VXPVY_©lrª‚‡Ž°”ÁÀB<;2 3333333333333333333333333333ûååååååååååååååååååÉɼ½¹ ¥¥¤¤ £+¢¢¡¡ µ)žžœ(›'&™—%••$‘#""!‹‰ˆ‡„€}vÄãéêëCFPUY_dls|¬ˆŽ°–%°¯]©ow~‚†‹°“ÂQE: 3333333333333333333333333333Ó[åååååååååååååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zy÷í*@CFPUY_dls|¬ˆŽ°–´œ)Jkls€…Š$²ÁJ:>53333333333333333333333333333å7åååååååååååååååååååɼ¼½¹¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™™%%•$‘#"!‹‰ ‡„„}}zeäÂ<@CCCFPUY_dls|¬ˆŽ°–´œËþekr|¬­ˆŒ‘%7; 53333333333333333333333333333ôåååååååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡  ))žž(›š'&™%%••$‘##"Œ‹‹‰‡‡„}}zBQ*>CCCCCFPUY_dls|¬ˆŽ°–´œøÁ§ioª‚‡‹°Ê,§9 6 3333333333333333333333333333uÿåååååååååååååååååååÉɼ½¹ ¥¥¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}uAAACGPUY¨©ls|¬†‡Ž°–´œÅQQgyte¾È§B:5 433333333333333333333333333333$”ååååååååååååååååååååɼ½¹ ¥¥¤¤»£++¢¡¡ Ÿ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}{zeeÄJQQQ§QQB¾gÊeÅŽ°–´œA*§ÀJ89I?? 333333333333333333333333333333Øoååååååååååååååååååååɼ½½¹ ¥¥¤¤» £+¢¢¡ Ÿ))žœ(›'&™—%%•$‘#"!‹‰ ‡„„€}{zsqnmhfcaeeÄ``EQQ§ÇÇ*WNIGFFDDD= 33333333333333333333333333333Ï}ååååååååååååååååååååɼ¼½¹ ¥¥¤¤» £+¢¢¡  ))ž(›''&™%%•$‘‘##"Œ‹‰ ‡„„}}zuqnmhfc^^\\XXXTTRROONKKKHHFDD 333333333333333333333333333335ÂååååååååååååååååååååÉɼ½¹ ¥¥¤¤» £+¢¢¡¡ µ)žžœ(š'&™—%••$‘##"Œ‹‹‰‡‡„€}usqnmjfc^^\\YXXTTRROOOKKKHHFDDD 33333333333333333333333333333b3ååååååååååååååååååååÉɼ½¹ ¥¥¤¤ £++¢¡¡ µ)žžœ(›'&™—%–•$‘#""!‹‰ˆ‡„€}usqnjhf^^\\YXXXTTROOOKKKHHFDDD= 33333333333333333333333333333 åååååååååååååååååååååɼ½½¹ ¥¥¤¤» ++¢¡¡ Ÿ))žœ(›'&™—%–•$‘#"!‹‰ ‡„€}{zsqnjhfca^\\\XXXTTROOOOKKHHFDDD= 3333333333333333333333333333nsis-3.11/Contrib/Graphics/Header/orange-uninstall-r.bmp000077500000000000000000000230201477201124000231610ustar00rootroot00000000000000BM&6(–9Ú!  &''QRRÀÄÅûþÿ÷üþ!íøýôûþh¿ì>pŠpÆóoÅò.QcmµÚƒÊï{½ßÒõ‘Óõ“Ôöš×öØö¤Û÷§Ü÷¨Ü÷®ßø±àø²àø´áø»äùÀæùÅèúÊêúÏìûÔîûÖïûÙðüáóüë÷ý>­íS¶ïb¼ðd¸åjÃòjÂñiÁðiÀî^¬Õg¼éb³ÞNްE}›Kˆ¨mÄòmÁñ\¥ÌXÂoÂðqÃòV•¸(FVqÄñsÇól¹ãsÄñuÆò 6BwÈóxÆóyÉó|ÈóZ’°'/}ËôyÃêÉóÌôn®Ð„Íô„Ëô †Ìô 1:ˆÏõ‹ÐõŒÎôˆÉíY—‘Ñõ“Óö•Ôönœµ–Õö–Óõ“Îðt¤¾@Zh˜Õö™Öö›Õö›Öõ›Ôõœ×ö”ËéšÒñŸØ÷žÖö Ù÷‹¼Ö¢Ù÷£Ú÷ŸÔñžÐí¥Ù÷£×ô¦Û÷©ÜøªÝøªÛ÷­Þø¬Ü÷¬Ûö°ßø­Úó³ßø´ß÷¶àø·âù¹ãù´Ûñ»ãù¼äù½ãù¿åùÁæúÂæúÃçúÂåùÅçúÇèúÉéúÊéúÍëûÏëûÑìûÓíûÔíû×ïüØïü×ìøÛðüØíùÝñüÞñüßòüÓãìãôýâóüäôýæõýÙçïéöýì÷ýèóùðùþïøýóúþVw2Xo:b{ƒÊô“Ñõ˜ÓöLizÕö¦Ù÷¨Øô¯Ýø¢Ìå¹áù­ÑæºÝòÀäùÂåú¾àôÇçúÌèùÐëûÊÝéëõû§¬¯öûþ%8I@@=== 4,/0.677766.)/-+***************************òñèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljha`[YXSSRLFɬ É3F7^. >>8<<< 406732 217.)(+**************************òñèèèèèèèèèÎÃÃľ¾¥¥££Â¡%  ž›œ$™—•#“"!! ދЇ†„‚~~vttrmjhe`[YRU^ɨ ; _¨ É3F76L0>/>.73 §§ ;; §¨ 370/+*************************óòèèèèèèèèèÎÎÃľ¥¥££Â¡%  žœ$™˜—##’"! ‹‰‡…„„‚~vttrmjhhea[YXTUZ¬OÑÀOGA¿;; §¨ 23:76661 OààOÚGA; ¨27.+************************ÜäèèèèèèèèèÎÎÃľ¥¥£Â¡%  žžœ$™˜—•#’"! ‹Š‡†„‚~yvtmljhea`[X]Z ÌüìèùÏÑÀOGA¿;; §¨ 222;ÀÝÛÛÜÜÛáÝÀGA;§270************************—¦èèèèèèèèèèÎÃľ¥¥££Â¡%% žž›$™˜—•#“"! ‹Š‡†„‚~yvtsrljha`[YXUL¿Ì÷ôëèèèèùÍÌÀG¿¿;; OÝÛÜÜÜÜÜÜÜÜÛÚOA;§26),***********************R[èèèèèèèèèèÎÃÃľ¥¥££Â¡%  ž›œ$˜—•#“"! ދЇ†„‚~~vtsrljhe`[YXGæôóóë蘕œÆèèíüÍÌÀGAÀáÜÜÜÜÜÜÜÜÜÜÜÜÞOA;¨1.***********************0 èèèèèèèèèèÎÃÃľ¥¥££Â¡%  žœ$™——#“""! Ž‹‹‰‡…„„‚~~vttrmjhea[Y¿ÿóóóóëè•‹†ƒ}}‡žèèíüÍàáßßßÝâÜßßßáÞßßßÞA 27)+**********************þÿèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmljhea[YXQòòòòòëè#‰µ{w®h`ªu¶"½ÞßßßÚOàâßßáÀÀÞßßßÚQ;¨:0,**********************úùèèèèèèèèèèèÎÃľ¥¥££Â¡%% žžœ$™˜—•#“"! ‹Š‡†„‚~yvtsrljha`[XQòòòòòëè"†}yuli\WRNJOâßßÚüÍàâáÀþþÀÞßßáO¿§3.**********************ûúèèèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljh`[YXQòòòòòë葵²{w®h`ªTPJ7ãäßãÀûøøÏàÀýøøþàáääÚ¿§26/**********************õÿèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  žœ$™—•#“"!! ދЇ†„‚~~vttrmjhe`[YQñññññëè}yul­\WRNE¨âäääÚõõõÏýõõùãäääãQ 26/**********************ØØèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—##’"! ‹‰‡…„„‚~yvtrmljhea[YXQñññññë莲{w®h`ªSPJCAäääääÚòòòòòöãääääá 26/**********************ÚÚèèèèèèèèèèèÎÎÃľ¥¥£Â¡%  žžœ$™˜—•#“"! ‹Š‡†„‚~yvtmljhea`[XQççðýøëè}yulb\RNE@AåååååäOæððððAåååååÉÚ§3.**********************:ÛèèèèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljha`[YXQçóÍõëèè¡"p`ªSPJC?¿ØÙåååÉÀùîîîîþÀäååååä¨1.-**********************ööèèèèèèèèèèèèÎÃÃľ¾¥¥££Â¡%  ž›œ$™—•#“"! ދЇ†„‚~~vttrmjhe`[YXQúÍþ÷ëèèèèèè ¹xWE@9§ÊØØÙVøííïìììýÑÙÙÙå§A 7)+**********************ööèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žœ$™——#“’"! Ž‹‰‡…„„‚~vttrmjhea[YQÍÿÏõëèÄèèééêëëÅ·nVרØÓóëëíæÿëëëûÕØØ¿ 26/***********************ööèèèèèèèèèèèèÎÎÃľ¥¥£Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmljhea[[QûæÍòðêèÆ‰‰Ž–¢ëëììííñÌÒÒÓøêíæÏæ×êêÿÕÒÐ :0-***********************÷öèèèèèèèèèèèèèÎÃľ¥¥££Â¡%% žž›$™˜—•#“"! ‹Š‡†„‚~yvtsrljha`[QÍþðÇ»êè¤{wp­d¯´ŸîîïæÓÒÒÓüæÏÒÇæ××ÐÒÒÍ;1./+***********************÷÷èèèèèèèèèèèèèÎÃÄľ¥¥££Â¡%  ž›œ$˜—•#“"! ‹Š‡†„‚~yvtsrljhe`[YQôðgC»êμ{wpb\TNE]îïï÷ÑÒÒÖÓÏÖÖÖÒæÐÖÖÕ36),************************÷÷èèèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  žœ$™——#“""! ދЇ†„‚~~vttrmjhe`[YQšTEE»ëé¢wpbªTNE@UïïðçþÖÖÖÐÖÖÖÖÖÒÇÖÖÐÌ26)-*************************øøèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmljhea[YQg©©©»ëêÅlbªTNE@5UððççñÿÑËÔÔÔÔÔÔÔÔÔÔûQ2.)-+*************************øøèèèèèèèèèèèèèÎÎÃľ¥¥££¡%  žžœ$™˜—•#“"! ‹Š‡†„‚~yvtmljha`[QnPPPšìëÅ`ªT©C<(IççññòóüÌך¼ÔÔÔÔÔÈæQ70,***************************øøèèèèèèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljha`[QqTTTšììíšÇ³³±ÐÐùøçñòòóôôõÏÑÑÏ××ÍÑG§6),+****************************ùùèèèèèèèèèèèèèèÎÃÃľ¾¥¥££Â¡%  ž›œ$™—•#“"! ދЇ†„‚~~vttrmjhe`[Q¯ªªªšììíïðñóõöøúùñòóóôôõöö÷÷þ××ÑQ§3.******************************ùùèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žœ$™˜—#“’"! Ž‹‰‡…„„‚~vttrmjhea[Qz«««Ÿííîðçòôö÷ùúùòóôôõõöö÷÷øøùùæG§3.******************************ùùèèèèèèèèèèèèèèÎÎÃľ¥¥£Â¡%  žžœ$™˜—•#’"! ‹‰‡†„‚~yvtmljhea`Q€iieŸíîïðñóõöøúúúóýüûùø÷÷øøùùúúQ§3.******************************úúèèèèèèèèèèèèèèèÎÃľ¥¥££Â¡%% žž›$™˜—•#“"! ‹Š‡†„‚~yvtsrljha`Q€l®»ïîïïçòôö÷ùúûúôõ÷úûýýýøùúúúûæQ§3.******************************úúèèèèèèèèèèèèèèèÎÃÄľ¥¥££Â¡%  ž›œ$˜—•#“"! ދЇ†„‚~~vtsrljheaQ²·Íõîïðñóõ÷øúûûûõûù÷÷øøùùúúúûûQ§3.******************************úúèèèèèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  žœ$™——#“""! Ž‹‹‰‡…„‚~~vttrmjheaQçÿÍüîïðçòôö÷ùúûüûöúüýýýüüûúûûûüQ§3.******************************ûûèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmljheaQÿþûæõïçññóôöøúüüü÷øøøùùûüýýýýýüQ§3.******************************ûûèèèèèèèèèèèèèèèèÎÃľ¥¥££¡%% žžœ$™˜—•#“"! ‹Š‡†„‚~yvtmljhaQô׿ûëðñòóóóôõõöøù÷ýýýüüûûûûüüüüQ§3.******************************ûûèèèèèèèèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljhaQÏÏðëëðòóæÌæÏþ÷÷øøùùúûüýýýýýýýýG 270,+***************************üüèèèèèèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  ž›œ$™—•#“"!! ދЇ†„‚~~vttrmjheQïëëëëçóýÑéîúÿæÑÌæÍÿúûûûüüüýýýýG 36./+***************************üüèèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—##’"! ‹‰‡…„„‚~yvtrmljheQêêêêêç÷çéêëëìííçüÏæÑÌÍÏýýýýýG¿ ¨36),***************************üüèèèèèèèèèèèèèèèèÎÎÃľ¥¥£Â¡%  žžœ$™˜—•#’"! ‹Š‡†„‚~yvtmljheQêêêêêñÌüéêëëììíîîïïðççõýÍæÌæÑGA;§27),***************************ýýèèèèèèèèèèèèèèèèèÎÃľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljheQêêêêÍÍéêêëììííîïïððçñòòóôôõùþÍÌOÀ;26)+***************************ýýèèèèèèèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  ž›œ$™—•#“"! ދЇ†„‚~~vttrmjhcQéééêöÚ”êëììííîïïððçññòóôôõöö÷øøùû¨:0****************************ýýèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žœ$™——#“’"! Ž‹‰‡…„„‚~~vttrmjhgQÎéìçæ &&&-?o€»ïïïðççñòóóôõöö÷÷øùùA36/+****************************ýýèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmljfGêîççO&&&&&'''((9Uo³ÈÈóóôõöö÷÷øøùÿO¨10-*****************************þþèèèèèèèèèèèèèèèèèèÎÃľ¥¥££Â¡%% žžœ$™˜—•#“"! ‹Š‡†„‚~yvtsrljokîïðÿ¦&&&&&'''((,8?CJPTo³³ËË÷øøùüA§3.*****************************þþèèèèèèèèèèèèèèèèèèÎÃÄľ¥¥££Â¡% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrlif_Íîïï.((''''''((,5@EJPTW«­l°€ÇËÏO¿ 27),****************************þþèèèèèèèèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  žœ$™—•#“"!! ދЇ†„‚~~vttrmikðîîú¿9CJPTW«WWRTE©@EJPTW«­lu°}ƒ‡ÇOQ;¨3.+***************************þþèèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—##’"! ‹‰‡…„„‚~yvtmo_Íìíî39CJPTW«ipuy}ƒ†‰ƒ{±ªbhr°{ˆÏ¿ 27)+***************************ÿþèèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££¡%  žžœ$™˜—•#“"! ‹Š‡†„‚~yvtlfîïÿ§99CJPTW«ipuy}ƒ†Œº"•ÁZ«ipw{µ¸º¿§ 70,***************************ÿÿèèèèèèèèèèèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrl¬æÏG¨>999CJPTW«ipuy}ƒ†Œº"•Í\iluy}„‰ŒÊ 36),***************************ÿÿèèèèèèèèèèèèèèèèèèèÎÃÃľ¾¥¥££Â¡%  ž›œ$™—•#“"! ދЇ†„‚~~vttrmOG999999CJPTW«ipuy}ƒ†Œº"•ÍÀVbj°„†‹» .0/+***************************ÿÿèèèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žœ$™˜—#“’"! Ž‹‰‡…„„‚~vttrk^ÊQ::>999CJPTW]ipz{}ƒ†Œº"# fhÊÁ¬ÑGG 3/,+***************************ÿÿèèèèèèèèèèèèèèèèèèèÎÎÃľ¥¥£Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmk¬¬¬QQQGQQ ¨¬VZ^^y}ƒ„Œº“ÑF QG;§10-8444******************************ÿÿèèèèèèèèèèèèèèèèèèèèÎÃľ¥¥££Â¡%% žž›$™˜—•#“"! ‹Š‡†„‚~yvtsrljha`[YX^ZZV¨¬_QQGÑÑÑæÏ L7?@@== 44******************************ÿÿèèèèèèèèèèèèèèèèèèèèÎÃÄľ¥¥££Â¡%  ž›œ$˜—•#“"! ދЇ†„‚~~yvtsrljhe`[YXSSSRRMMKKK:FFC@B@@=== 444*****************************ÿÿèèèèèèèèèèèèèèèèèèèèÎÃÃľ¥¥££Â¡%  žœ$™——#“""! Ž‹‹‰‡…„‚~~vttrmjhe`[YSSRRMMMKKHHHDDDBB@== 444*****************************ÿÿèèèèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££Â¡%  žžœ$™˜—•#’"! ‹‰‡…„„‚~yvtmljhea[YXSSRRPMMKKHHHDDDBB@=== 444*****************************ÿÿèèèèèèèèèèèèèèèèèèèèÎÎÃľ¥¥££¡%% žžœ$™˜—•#“"! ‹Š‡†„‚~yvtmljha`[XSSRRPMMKKHHHDDDBB@=== 44*****************************ÿÿèèèèèèèèèèèèèèèèèèèèèÎÃÄľ¥¥££Â%% žž›$$˜—•#“"! ‹Š‡†„‚~yvtsrljha`[YXSSSRRMMKKHHHHDDBB@=== 444****************************ÿÿnsis-3.11/Contrib/Graphics/Header/orange-uninstall.bmp000077500000000000000000000230201477201124000227220ustar00rootroot00000000000000BM&6(–9Ú!  &((RSSÀÄÅvyzûþÿ÷üþ$)íøýôûþpÆó{Ãè†Ïô)?J0IVWƒš>[j-4™Öõ–Òñš×öšÖõ™Óñ•Ëç¤Û÷£Ùõ§Ü÷¨Ü÷®ßø±àø²àø´áø»äùÀæùÅèúÊêúÏìûÔîûÖïûÙðüáóüë÷ý-/0 ,>­íS¶ïb¼ð;n‰jÃòjÁñ.9i½ênÄòb®ÖoÂðh¶à_¦ÌrÄò[žÂU“´sÇóuÆówÈóxÆóyÉó|Èó}Ëô€ÉóÌô„Ëô(0…Ìô‹Ðõ!1:‹ÎóÑõ’ÓöŠÇéÐòGeu–Ôö–Óõ’Ïïu¦À~°Ël—®™Ôö™Öö…¹Õ›Õö›ÔõŒÁÞdŠŸœ×öšÔóžØ÷žÖö Ù÷ÕóšÐî ØöŸ×õ¢Ù÷£Ú÷¡×õŸÔð¥Ù÷¦Û÷¤×ô©ÜøªÝøªÛ÷¢Ñë­Þø¬Ü÷¬Ûö©Øó°ßø­Úó³ßø´ß÷¶àø·âù¹ãù´Ûñ»ãù¼äù½ãù¿åùÁæúÂæúÃçúÂåùÅçúÇèúÉéúÊéúÍëûÏëûÑìûÓíûÔíû×ïüØïü×ìøÛðüØíùÝñüÞñüßòüÓãìãôýâóüäôýæõýÙçïéöýì÷ýèóùðùþïøýóúþVw4ReƒÊô“Ñõ˜ÓöÕö¦Ù÷¯Ýø¢Ìå¹áù­ÑæºÝòÀäùÂåú¾àôÇçúÌèùÐëûÊÝéëõû§¬¯öûþ$7D —žïøþúýÿùüþ:`{Pv’âíõòùþ½ÖëÇÓÝÁÌ×79;dfhnprýþÿ´ÅÚ|‚ŠœªÂEFHÇ×ûãìÿ¶Êý¨¶×²À┟¹Ôáÿ©¸ýŽ—Üš£þ•ÿ / Ìÿ11ü !!22Ì^QQøllû~~ÿÝÝÞ‹‹Œ€ÿÿÿüüüùùùöööñññîîîêêêåååâââÚÚÚØØØ×××ÔÔÔÑÑÑÍÍÍÊÊÊÅÅž¾¾¹¹¹³³³¬¬¬£££•••\\\///////////////////////////////////////00///333 ;;<==???AAACCCF GGGGJJKKOOV\\^`fjmmpyyz} ‚!…†"ˆ‰#‹$%%Ž&’’”'—˜˜™››(œ¼žž  ·¾½½Éççççççç//////////////////////////////////////2-6662253 8;;<==???AAABBB B GJKOOOV\^`efmptyzz}€‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼žž  ·¾½ÉÉçççççççûû////////////////////////////////////02,79:99746258<>==???AB@ 6S7RRRSWLIMKOUV\^`efmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™›((œžž  ·¾½ÉÉçççççççûû///////////////////////////////////0-69:....:::774628<¸áâââáÙñññññöàââââÞ[Wbfjmptyzz}€‚„!†"ˆˆ#Š‹$%&&’“”'—˜™™››(œ¼žž  ·¾½ÉÉççççççççççøø/////////////////////////////////1äääýøêçˆxtneXPJID@<¸ãâââââ¹Çïïïï¸âââââÀNTWhfmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™››(œ¼ž  ·¾½ÉÉçççççççççç÷ø/////////////////////////////////1äóõêççœ%|iU¤GFB>8 ÕØãããÀºùííííþºâããããáªNTZgjlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›((¼žž  ·¾¾½Éççççççççççç÷÷/////////////////////////////////1ùÈþ÷êççççç盲rJ@>5¢ÌÐÐ×[ªøììîìëëýÍÖ×Øã¿ÆÀSejmmpyyz} ‚!…†"ˆ‰#Š‹$%Ž&’”'—–˜™››(œ¼žž  ··¾½½Éçççççççççççó÷/////////////////////////////////1Èåæõêç¾ççèèéêêÁ°h[[ÐÐÓòêêíÇåêêêûÑÐÕ¸[Wbfjmmpyzz}€‚„!†"ˆˆ‰#‹$%Ž&’’”'—˜˜™››(œ¼žž  ·¾½ÉÉçççççççççççÃç/////////////////////////////////1ûÿÈñïéç„„‰‘êêëëììä)ÎÎÓøéìÇËÇåééåÑÎÒªRhfmptyzz}€‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼ž  ·¾½ÉÉçççççççççççe¤/////////////////////////////////1ÈþïôéçŸ|vqi¦Yk­šííîÿÓÎÎÓÍüÇËÎÃÇååÒÎÎÈ TZb`jlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'–˜™™›((œ¼žž  ·¾½Éççççççççççççç!/////////////////////////////////1ôïb>´éɵvqiXPGD@Qíîî÷ÆÎÔÔÌÍËÔÔÔÎÇÊÎÔÑTWdejlmptyz} ‚!…†"ˆˆ#Š‹$%Ž&’“'—–˜™››(œ¼žž  ·¾¾½Éççççççççççççþþ/////////////////////////////////1•I@@´êèqiX¤ID@50- ääððòòü)å´ÏÏÏÏÏÏÄÇHSLba^`efmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™››(œžž  ·¾½ÉÉççççççççççççÿÿ/////////////////////////////////1kGGG•ëëì•쬩ÊÊùøäðñòóôôõæÍÍæååÈÆENSP\^`ejlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›((¼žž  ·¾¾½Éçççççççççççççÿÿ/////////////////////////////////1s¤¤¤•ëëìîïðóõöøúùðòòóôôõöö÷÷åþåÍHTW\\^`fjmmpyyz} ‚!…†"ˆ‰#‹‹$%Ž&’”'—–˜™››(œ¼žž  ··¾½½Éççççççççççççç@G/////////////////////////////////1u¥¥¥šììíïäòôö÷ùúùòóôôõõöö÷÷øøùúÿHNTW\\^`fjmmpyzz}€‚„!†"ˆˆ‰#‹$%Ž&’“”'—˜˜™››(œ¼žž  ·¾½ÉÉçççççççççççççËÉ/////////////////////////////////1{__\šìíîïðóõöøúúúóýüûùø÷÷øøùùúúÿHN[W\^`efmptyzz} ‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼ž  ·¾½ÉÉçççççççççççççÌÊ/////////////////////////////////1wei´îíîîäòôö÷ùúûúôõ÷úûýýýøùúúúúÿHTW\^`ejlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'–˜™™›((œ¼žž  ·¾½Éççççççççççççç糿/////////////////////////////////1x°Èõíîïðóõ÷øúûûûõûù÷÷øøùùúúúûûÿHNTW\\^`ejlmpyyz} ‚!…†"ˆ‰#Š‹$%Ž&’“'—–˜™››(œ¼žž  ·¾¾½ÉççççççççççççççÎÅ/////////////////////////////////1äåÈüíîïäòôö÷ùúûüûöúüýýýüüûúûûûüÿHN[W\\^`fjmmpyyz}€‚„!††"ˆ‰#‹$%%Ž&’’”'—˜˜™››(œ¼žž  ·¾½½Éçççççççççççççç³Í/////////////////////////////////1åþûÇõîäððòôöøúüüü÷øøøùùûüýýýýýüHTW\^`efmptyzz}€‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼žž  ·¾½ÉÉççççççççççççç粬/////////////////////////////////1ôåÇûêïðñòóôôõõöøù÷ýýýüüûûûûüüüüHNTW\^`efmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™›((œžž  ·¾½Éçççççççççççççççº/////////////////////////////////1æËïêêïñóÿªÆÇæþ÷÷øøùùúûüýýýýýýýý)[Sbacejlmptyz} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›((¼žž  ·¾¾½ÉçççççççççççççççÒÐ/////////////////////////////////1îêêêêäòýÆÉíúåÇÆ)ÿåúûûûüüüýýýý¢ÀTWZbcfjmmpyyz} ‚!…†"ˆ‰#‹$$%Ž&’”'—–˜™››(œ¼žž  ·¾½½Éççççççççççççççç]/////////////////////////////////1éééééäøªäèéêêëììäüæÇÆ)ÈæüýýýýE À[Sgfjmptyzz}€‚„!†"ˆˆ##‹$%&&’“”'—˜™™››(œ¼žž  ·¾½ÉÉçççççççççççççççÕž/////////////////////////////////1éééééðÆüèéêêëëìííîîïääõýÿ)ÇÆE¸ N[Sgfmptyz|} ‚!…†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼ž  ·¾½ÉÉçççççççççççççççùÝ/////////////////////////////////1éééééÈÈèééêëëììíîîïïäðñòóôôõùþÈ)¹¹ [Wb`jlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›((¼žž  ·¾½Éççççççççççççççççúú////////////////////////////////01èèèéö*zéêëëììíîîïïäððòóôôõöö÷øøùûªNRhfjmmpyyz} ‚!…†"ˆ‰#Š‹$%Ž&’”'—–˜™››(œ¼žž  ·¾½½Éççççççççççççççççúú////////////////////////////////01¾èëäÿ.+++08h{´îîîïääðñóóôõöö÷÷øùù¸TWbcfjmmpyyz}€‚„!†"ˆˆ‰#‹$%Ž&’’”'—˜˜™››(œ¼žž  ·¾½ÉÉççççççççççççççççñ8///////////////////////////////06Eéíäð¹+++++,,,--5Lo¬ÄÄòóôõöö÷÷øøùå¹NTZaefmptyzz}€‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼žž  ·¾½ÉÉççççççççççççççççòò///////////////////////////////-7íîïå¡+++++,,,--058>BFIo¬¬ÅÅ÷øøùüª NTWhejlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™›((œ¼žž  ·¾½Éçççççççççççççççççòò//////////////////////////////02¢Èíîî7--,,,,,,--05<@BFI¤¥¦¨{ÃÅ˹ [Sjlmptyz} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›(œ¼žž  ·¾¾½Éçççççççççççççççççòò//////////////////////////////27¹ïìíù 8>BFIJ¥J¤II@£<@BFI¤¥¦n¨x~‚ùH NTZhfjmmpyyz} ‚!…†"ˆ‰#‹$$%Ž&’”'—˜˜™››(œ¼žž  ·¾½½Éçççççççççççççççççòò//////////////////////////////-¢ëììÍ8>BFIJ¥_intx~„|~v©KUgj¨v|ƒ!˪ [Smptyzz}€‚„!†"ˆˆ#Š‹$%&&’“”'—˜™™››(œ¼žž  ·¾½ÉÉçççççççççççççççççòò/////////////////////////////04ªíîå¢88>BFIJ¥_intx~‡³%&»T¥_iqvz®±ˆªÍ[Smptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™››(œžž  ·¾½ÉÉçççççççççççççççççòò/////////////////////////////0.ÿæE¿6888>BFIJ¥_intx~‡³%ªP_entx„‡ÌTWklmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›((¼žž  ·¾¾½Éççççççççççççççççççòò/////////////////////////////0¹¹E338888>BFIJ¥_intx~‡³%ºXc¨z}!´ªWhimmpyyz} ‚!…†"ˆ‰#‹‹$%Ž&’”'—–˜™››(œ¼žž  ··¾½½Éççççççççççççççççççòò/////////////////////////////4:91::6888>BFIJ_iuvx~‡³%’ÍdÌTÈÆTbhimmpyzz}€‚„!†"ˆˆ‰#‹$%Ž&’“”'—˜˜™››(œ¼žž  ·¾½ÉÉççççççççççççççççççòò///////////////////////////////4¿¿¿111HH¢NNÀRRRtx~€‡³#ÆT¢E¸ NTZ]\`efmptyzz}€‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼ž  ·¾½ÉÉççççççççççççççççççòò///////////////////////////////3333 ;;;<9::À¿¿¢HHÆÆÆÇWSRIKPOUV\^`ejlmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'–˜™™›((œ¼žž  ·¾½Éçççççççççççççççççççòò//////////////////////////////3/333 ;;;<==??AAACCCF TTTIIJJKOOV\\^`ejlmptyyz} ‚!…†"ˆ‰#Š‹$%Ž&’“'—–˜™››(œ¼žž  ·¾¾½Éçççççççççççççççççççòò///////////////////////////////3333 ;;<==???AAACCCF GGGJJKKOOV\\^`fjmmpyyz}€‚„!††"ˆ‰#‹$%%Ž&’’”'—˜˜™››(œ¼žž  ·¾½½Éçççççççççççççççççççòò//////////////////////////////33333 ;;;<==???AAACCC GGGGJKKKOOV\^`efmptyzz}€‚„!†"ˆˆ#Š‹$%&’“”'—˜™™››(œ¼žž  ·¾½ÉÉçççççççççççççççççççòò///////////////////////////////333 ;;;<==???AAACCC GGGJJKKOOUV\^`efmptyz|} ‚!…†"ˆˆ#Š‹$%Ž&’“”'—˜™™›((œžž  ·¾½ÉÉçççççççççççççççççççòò/////////////////////////////33333 ;;;<==??AAAACCF GGGJJKKOOVV\^`ejlmptyz} ‚!…†"ˆˆ#Š‹$%Ž&’“''–˜™™›((¼žž  ·¾¾½Éççççççççççççççççççççòònsis-3.11/Contrib/Graphics/Header/orange.bmp000077500000000000000000000230201477201124000207130ustar00rootroot00000000000000BM&6(–9Ú!  -..}~~áââÖ××ûþÿ ´èý»êýÂíþÈîþÎðþÔòþfsxÛôþÓæî÷üþ¢Þú©áûíøýôûþíô÷"+iÁïjÀí)HXe­ÒX‹¥7P]xªÄk—®š×öÚùˆ¼×šÔòv£ºšÒïÖó˜Ïë ×ó¤Û÷8JS§Ü÷¨Ü÷®ßø±àø²àø´áø»äùÀæù­ÏàÂçúÅèú¾ßðÊêúÏìûÔîû±ÆÐÖïûÙðü¿ÓÝÎâìáóüë÷ýY]_689<>?‘’;¬í7¡Þ2‘Ç=­íLh,;B¯í0~«*n•L³îg¿ñjÃòjÂñZ¥ÍU›ÂN²kÀñg»çd´ßlÁðnÄòJ„£S’µqÃòrÆóBrŒvÈóvÅò:bwZ–¶yÉózÇó1<}Ëô}Èò€ÊóÌôi¦Æ{Áç„Ëôu´Ö‡Íô9Wg%8B*2ŒÏõÑõŠËïV•+?JÑõ’ÓöSwŠ”Òõ‘Ðñ•ÔöLl}Èç—Õö˜Õõ˜Óõ–Òò™ÖöšÔõ³ÎgŽ£œ×öžØ÷œÖõ“ÉæžÖö Ù÷ÂÝ¢Ù÷¡×ö£Ú÷ŸÒï¦Û÷"©ÜøªÝø©Û÷­Þø¬Ü÷®Ýø°ßø³ßøªÒè·âùµÝô†¤µ¹ãùºãù¼äù½ãù¿åùÁæúÁåùÀã÷ÄçúÆçúÆèúÄåøÉéúÊéúÍëûÎëûÍéùÑìûÓíû×ïüØïüÈÝéÖë÷ÛðüÝñüÛîùßòüãôýäôýæõýéöýì÷ýðùþóúþAYX¸ða¼ñ‚ÊôšÔö£Ø÷¦Ù÷«Û÷ªØó´ßø·àø¸áùºà÷ÀäùÂåú¹ØêÉçùÌéúÐëûÕíûÖíûÚïü¼ÌÖßñüâóýãòûÜéñöûþåêíïøþÄÊÎúýÿùüþýþÿ%%&kklååæÿÿÿüüüùùùóóóîîîéééÞÞÞÛÛÛØØØÕÕÕÑÑÑÎÎÎÊÊÊÅÅÅÁÁÁ¿¿¿¼¼¼¹¹¹¶¶¶±±±«««¢¢¢tttRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPOOXXX\\\\^^^bbbeeehhhnnrrrrswwxx|ƒ‡‡ˆŒ(’+••—,-./ 0¢¤13¨ªª¬6®77²8::´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPÄUVVVUWW\\\\^^^bbbeeegffjjjjfttswx||ƒ‡ˆŒŽ(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèûûOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONUVQRZRQVUUW__^^^bbbfecjmmiiii…j~{w|ƒ‡ˆŒŽ(*+•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>Ú¼½½¾??¿ÀÀÁÁÝâáããèèèèèèèûûOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOUZY``]]YSRQVUWj_bbbcjmiauy]yuj~{|ƒƒ‡ˆŒŽ(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèûûOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPVQS`oo``]YYZRiUjUjjau}ooo`}u…~{‡‡ˆŒ(’+••—,-./ 0¢¤13¨ªª¬6®77²88:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝÝâááãèèèèèèèèúûOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPVQSd“kpp``]YYaiii}dk“pv)oy…~‚‡ˆˆŒ(’+••—,-./ ¡¢¤¤¥34ª¬6®®77²8:³;;¸ºº>>¼¼½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèúúOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPUQYÿîèìûþkqpvo``]uY]LFDDDFLpv}†…Š€‡ˆŒŽ(*+•—,š-./ ¡¢¤1334ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÁÁÝâáããèèèèèèèèúúOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOVYñîèèèìûþkqpvoLDDDDDDDDDLqvy!&‰ˆŒŽ(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>»¼½½¾??¿ßÀÀÁÁÝâáãèèèèèèèèèúúOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOYüññîè±8×½Ýèèîý@å“qqFDDDDFFDDDDFqvouŠ"ˆŒŽ(’*”•—,-./ 0¢¤13¨ªª¬6®77±²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèùùOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORåøñññ诩¦¡ËÍÐ:¿èèîýÿEDDDDEEDDDDEd)}!$ˆŒ(’+••—,-./¡¢¤¤¥34ª¬¬6®77²8::´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèùùOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæèÁ­¨£Ìš–Ç‹’¦ÙBKDDDDDIAúAIDDDDDKvou…&ŒŽ(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèùùOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæððððèÁ©¦¡Ë˜’ÆzrngaIJJJJJÂåúöúåHJJJJJIqyŠŒŽ(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>Ú¼½½¾??¿ßÀÀÁÁÝâáãèèèèèèèèèèùùOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæððððèÀ¨£Ìš–Ç‹wrlfKMMMMLûôôôûLMMMMK)}#ŠŒŽ(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèèèøøOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæïïïïèÀ¦¡Ë˜’ÆzrngcÃÃÃÃKäüñññññüäRÃÃÃÃä)}#ŠŒ(’+••—,-./ 0¢¤13¨ªª¬6®77²88:´;·¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèøøOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæïïïïçèÀ£Ìš–Ç‹wrlf_dÄÄÄRÿýòîîîòýÿQÄÄÄd)}#ŠŽ(’+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;;¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèøøOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæîîñçèß¡›˜ÈÆzrngc_dWWW`ddüíííûdd`WWWdy#ŠŽ(*+•—,š-./ 0¢¤1334ª¬6®®7±²8:´;·¸ºº>Ú¼½½¾¾?¿ßÀÁÁÝâáããèèèèèèèèèè÷øOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæîúÿçèèá½Õ¡‹wrlf_[pl____dûìììûd______du…&Ž(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèèèè÷÷OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæCÿCçèèèèèèèÛ«Énc[[“ xsvùìëëõ@xlgk}†!$(’+••—,-./ 0¢¤13¨ªª¬6®77±²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝÝâááãèèèèèèèèèèè÷÷OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþæýÿþíèèÝèãéêêêëÜ5'v2 ôêêêô ky#%(’+••—,-./ ¡¢¤¤¥34ª¬6®®77²8:³´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèÔïOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþCÿýíèèÖ¦©°¹ëëëììíC  óêêêó  v†…&(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÁÁÝâáããèèèèèèèèèè臺OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþ@õ$íèèÔÍš–„Ê5Þííð“5 óéééó 5uŠ%Ž(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>»¼½½¾??¿ßÀÀÁÁÝâáãèèèèèèèèèèèèJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþçµlcíèéÒš–„wnÅc=ççC) æþþþæ )o$ˆŽ(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝââáãèèèèèèèèèèèèþîOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþÑfffìéꦖwngc[µçîÿ@ <99999< @p$‹Œ(’+••—,-./ 0¢¤13¨ªª¬6®77²8::´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèèèþþOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþÅÅÅÅíêêÎwngc[Nµîîïðÿ@= =@v…~$‡ŒŽ(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèÜþOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþnnnnìëëžwtg_[NÄ<îïïðñþC> >Ck`!Š"‰ˆŒŽ(*+•—,š-// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>Ú¼½½¾¾?¿ÀÀÁÁÝâáããèèèèèèèèèèèèþþOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþrrrrìëëÜ=µœ2Ø99øñïððñòó÷þåBææBv‚€‡ˆŒŽ(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèèèèèèþþOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþzzzzìììíçîðòôõöùòðñòòóóôôõõCCCy~ƒ‡‡ˆŒ(’+••—,-./ 0¢¤13¨ªª¬6®77²²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝÝâááãèèèèèèèèèèèèè&@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþìììçïñóôöøúóñòóóôôõõõö÷øùy~ƒ‡‡ˆŒ(’+••—,-./ ¡¢¤¤¥34ª¬6®®77²8:³´;¸ºº>>¼¼½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèÊÈOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþˆ‹‹ìííçîðòôõ÷ùûôôýüû÷öõõöö÷øùùy~ƒ‡ˆŒŽ(*+•—,š-./ ¡¢¤1334ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÁÁÝâáããèèèèèèèèèèèèèËÉOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþÇÇžàìççïñóôöøúûôóóõùûüýü÷øùùúúy~ƒ‡ˆŒŽ(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>»¼½½¾??¿ßÀÀÁÁÝâáãèèèèèèèèèèèèèè³¾OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþ˜µCæìçîðòôõ÷ùûüõõûøõõöö÷øùùúúûy~‡‡ˆŒŽ(’*”•—,-./ 0¢¤13¨ªª¬6®77±²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝââáãèèèèèèèèèèèèèèÍÄOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþøæCõìïñóôöøúûüöõùûýýýüûûúúûûûy~‡‡ˆŒ(’+••—,-./ 0¢¤¥34ª¬¬6®77²8::´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèèèèèÅÆOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSæüC@ìîïïðñòôöùüü÷õööö÷øûüýýýýüüy~‡ˆŒŽ(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèè°ªOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSûæðìïððññòóôôô÷ö÷ýýýüüûúûûûüýüy~‡ˆŒŽ(*+•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>Ú¼½½¾??¿ÀÀÁÁÝâáãèèèèèèèèèèèèèèèÀ¸OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSþæûëêìðôåæCõõõö÷øùûüýýýýýýüý)}#!&$‹ŒŽ(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèèèèèèèèÑÏOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSçêêêìñBýêíùCæBå@þCúúûûûüüýýýý)`u#…Š"Œ(’+••—,-./ 0¢¤13¨ªª¬6®77²88:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèèèèèè**OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSêêêêìñþ@éêêëëìììïü@Aåÿæüýýýýv)`u#!&(’+•—,š-./ ¡¢¤¤¥34ª¬6®®77²8:³;;¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèèèÔBOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSêêêêìüìêêêëëììíççîïôýþ@ååÿ@pv}!$Ž(*+•—,š-./ 0¢¤1334ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÁÁÝâáããèèèèèèèèèèèèèèèïÓOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSêêêêåóéêêëëììííçîïïðññòóôøCæÿ}#"Ž(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝâáãèèèèèèèèèèèèèèèèúúOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSéééëþ]§¶êëëììííççîïðñòóóôõõööøþ“†…&(’+••—,-./ 0¢¤13¨ªª¬6®77±²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèèèèèèèúúOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPSééçñåDDDJÃ_‘ѵçîîïðñòóóôôõõö÷û}#Š%Œ(’+••—,-./¡¢¤¤¥34ª¬6®®77²8:³´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèèèè°~OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOYëïCHDDGJJMÃÃÄN[tœœ<ñòòóôôõõö÷øBpuŠˆŽ(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèèèèòñOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPU`ççAFDDGJMMÃÃÄNT[_fÅnr‘œ2ØØõö÷÷y#Š'Ž(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>Ú¼½½¾??¿ßÀÀÁÁÝâáãèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOVïíçôdNTÄÄÃÃMÃÃÄNT[_fÅnwzÆÈÉšžÑ<q)}†!&Ž(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½½¾?¿ßÀÀÁÁÝââáãèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPU`@ììíÿY_cÅnrzÆzwrllffÅnrzÆ‹Èɛͤ©Ÿvy#Š'(’+••—,-./ 0¢¤13¨ªª¬6®77²88:´;·¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOVñëìóq[_cÅnrzÆÈ˜›¡Ï©Ó£¨ÌŠz‰Ç–šÌ£¨­Aq)}!‘(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;;¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOON]@êú@dY[_cÅnrzÆÈ˜›¡Ï©Ó±;Ù)~Æ’™/¢¦«9o}!‘(*+•—,š-// 0¢¤1334ª¬6®®7±²8:´;·¸ºº>Ú¼½½¾¾?¿ÀÀÁÁÝâáããèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkCBvZ[[[_cÅnrzÆÈ˜›¡Ï©Ó±;ÙB}‹È˜›¡Ï©®@)†#‘(*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOY`[[[[[_cÅnrzÆÈ˜›¡Ï©Ó±;Ùk~‹Çɚͣ«ÓCk…&'’+••—,-./ 0¢¤13¨ªª¬6®77²²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝÝâááãèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSVo`ZZR[[_cÅnwzÆ'Ș›£Ï©Ó±;Ùk)"'Ÿ )do}‘'’+••—,-./ ¡¢¤¤¥34ª¬6®®77²8:³´;¸ºº>>¼¼½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOR]``dddddo}}#Ÿ¡Ï©Ó²·Ú¼½½¾¾?¿ßÀÁÁÝâáããèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXX\\\\^^aaa```vddqAA)@`!t{x|ƒ‡ˆŒŽ(’*”•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>»¼½½¾??¿ßÀÀÁÁÝâáãèèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOXXX\\\\\^^^bbeeehhhlnnjmrswxx|ƒ‡‡ˆŒŽ(’*”•—,š./ 0¢¤13¨ªª¬6®77±²8:´;·¸º>>»¼½¾¾?¿ßÀÀÁÁÝââáãèèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXX\\\\^^^bbbeeehhhlnnnrrswwxx|ƒ‡‡ˆŒ(’+••—,-./ 0¢¤¥34ª¬¬6®77²8::´;¸¸º>>¼¼½¾¾?¿ßÀÀÁÁÝâááãèèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXX\\\\^^^bbbeeehhhhnnnrsswxx||ƒ‡ˆŒŽ(*+•—,š-./ ¡¢¤¤¥34ª¬6®®7±²8:³;·¸ºº>Ú¼½½¾¾?¿ßÀÀÁÁÝâáããèèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXX\\\\^^^bbbeeghhhnnnnrsswxx|ƒ‡ˆŒŽ(*+•—,š.// 0¢¤1334ª¬6®¯7±²8:´;·¸ºº>Ú¼½½¾??¿ÀÀÁÁÝâáããèèèèèèèèèèèèèèèèèèèòòOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXX\\\\\^^^bbeeeghhlnnnrrsswxx|ƒƒ‡ˆŒŽ(’*”•—,š.// 0¢¤13¨ªª¬6®¯7±²8:´;·¸º>>»¼½½¾??ßÀÀÁÁÝââáãèèèèèèèèèèèèèèèèèèèèòònsis-3.11/Contrib/Graphics/Header/win.bmp000077500000000000000000000230201477201124000202350ustar00rootroot00000000000000BM&6(–9  ÿòÿÿùþýËíþÜóþçöýíõÿýþþøúíÇÌì²·ÿïðþ¿ÁÖ¾¿ÿìíݘ™ý¹ºþÚÛþþ¨¨Ê‡†ÿ²²ä¢¢þÌÌþÓÓéÌÌþããÿèè÷ááùééìààÿõõþúúþûûù÷÷ÿþþýüüñð𳈇ŽmlþÇÅç½¼öÄÁݰ®ëÉǦ{wÒ¶´ØËÊÇŸ™¼•âÓÑíçæÈ¨¡êÚ×ïå㓎·†zýùøñíìòÝ×ùîëøíêûôòæ¾±Ò®£ìËÁõåàúðíùïì΀cЃgσgЄhσhÐ…iÐ…jІkÒˆmчlшmÒ‰nщnÒŠoÒ‹qÓŒrÔvÖ–ØšƒÙžˆÊ“Û£ŽÍšˆÞ¬šã·§â¶¦ã¸¨ç¼­æ½®æ¾¯å½®çÀ²çÁ³èÄ·éŸêÇºéÆ¹éÆºêȼëʾêɽëËÀíÐÆïÔËðØÏï×ÎòÜÔñÛÓóߨòÞ×ñÝÖóàÙôãÝôäÞõåßöçâ÷éäöèãøíéúñîûóðúòïùñîûõóýúùÏ‚eÎdÏ„gІiЈlÑŠoÓŽtÔ‘wÕ“zÁŽyݨ”౟þ˶ᴣ亪㹩弬仫濰èõç´êÈ»éǺêʽëÌ¿ëÌÀìÎÂìÏÄîÓÈïÖÌðÙÐñÚÑñÛÒòÝÕôâÛóáÚöçáõæà÷êåøìç÷ëæª¥£ü÷õûöôñÜÓòÞÕõçá÷ìçùðìûôñ}wtøîéüøöþüûýûúÅÃÂøÆªùðëè¼¢ºµ²ûöó¿‡aå¶’öòïþÌ¢ic^ñÀ“ýðäþóéçßØÛ eþæÏþíÜÿøñþýüõôóáàßÜÛÚÒÑÐÛ—Jæ±zþÊ’ðÉýÔ©úÚ¶æÉªûàÂâͶüêÖëßÒÿöìüôëüÁ|ñÝÆûöðæ‰ý»hïÑ©âÔÂñíèø§3ü²L÷ìÜáÙÌðêàêÞ²÷óåçáºääãâæÆëîÙÓ寅ºc¯Ø¡©!AÓ^_阰ÐÍJ©ò“±ÑWy±ÿÿÿéééDDDDD†††…FFFGIˆJKMMPOŠQRSS‹‹TTŒŒUUUUVVVVWWWWYWYYYY[[[[’’’\\^”–•ba—cd™˜efi›jkkžžŸ nn¡¡oo¢qp£¤¥rruutw§§xyzª©{||«­¬¬<;;CB€€=ƒ°°¯¹¹8„„º#ÏDDDDD†††FFHGGIJKMMNPPQRRRS‹‹TTŒŒUUUUVVVVVWWWWWYYYY[[[[[’]]\\”“••b——cd™˜eh›šjkmžžŸ nn¡¡o¢¢qp¤¤¥r¦utt¨§xxyzª{{|««´~~<;µB€==ƒ°°¯¹888„ºººÏDDDD†††…FE‡GIIJKMMNPQQRRSS‹‹TŒŒUUUUVVVVWWWWWYYYYYY[[[’’’]\^”“•ba—ccd˜efh›jœkmžŸŸ n¡¡¡o¢¢p£¤¤sr¦utw¨§xyzª©{}|«­¬~~;;µ‚€€==ƒ°¯¯¹888ºº#ÏDDDD†………FFHGIJJMMLLPQRRS‹‹R‹‹ŒŒUUUUUVVVVWWWWYYYYYY[[[[[’’]]^”““•``—cc™˜efhgjlkžŸŸnn¡¡¡o¢qp£¤¥rv:utw¨§xyzª{}||«­¬~¸¸CCB€€=ƒƒ°¯¹88„„»»#ÏÏDDDD†………EFGGIJJMMNNOQRRS‹77,77ŽŽXXUUUUVVVVVWWWWZZZZZ[[[[’’’]\\”“••ba>c™™˜efgšjkmmŸŸ nn¡¡o¢¢qp¤¤sr¦utt¨§§xzzª{{||«­´~<;µµ‚€==ƒÁ°¯¹888» ºÏÏDDDD†………FHGGIJKMMNPQRRSŽ7·ÆÆÆÆÆ··%7XXZUVZVWZZX%·····%0Z[[[[[’’’\\^““•_b—ccd˜efhgšjkmžŸ nnn¡oo¢¢pp£¤sr¦utw¨§xxzª©{}|«­¬~~¸;BB€€¶ƒÁ¯¯¹¹¹8„ººÏÏDDDD…………FEGIJJKMNNPQRŠŽ,6¼¼À6·ÆÆÆÆÆÆ·%ŽXXZZŽ&&&&&&&ÆÆÆ·%Z[[[[’’]]\”““•ba—cd™eefišjkmmžŸ  n¡¡oo¢qp£¤¥±r:ut¨§§xyzª©}}|­´´~<;;B‚‚€¶==°¯¯¯¹88„ º#Ï""DDD††…FE‡GGIJKMMNOPQŠ7·®¼ñÄÄ9ñÓÀ66·ÆÆÆÆÆ··&&,%/*--30,&ÆÆ·0[[’’’]\^”“–bb>—c™˜˜efggjkm@ŸŸ nn¡¡oo¢qp£¤rr:uuw¨§xxyªª{}|««¬¬~<;µB‚€¶ƒƒ°¯¯¹888„###Ï"DD††………FEGGIKJMNNPORŽ6®¼ÓñÁ888ãÄè21À0··ÆÆ&, )):1-%ÆÆÆ0[’’]]\^““•bb—cdd˜efh›šlkmžŸ  n¡¡oo¢qq£¤¤sr²utw¨§xyzA³{}«««´´<;;B‚¶==°°¯¹¹88„»ººÏÏÏ"DD†………FEGGIJJKMNNOŠŠ0À¼¼ÓñãÎÎÎãÎÎÎàÛ×ÇÃ7,7 '-,ÆÆ%[’’]\\”“–•b>—cd™˜efhšjlmm@Ÿ nn¡¡o¢¢qp£¤srvuutw¨xxyz©©{|««­¬~<;;BB€¶=Á°¯¯¯888„„º#ºÏÏ""DD†……FFGGGIJKMMNLQOX®¼ÀÀ¼ÑàßãóïïßßëØÖÖW7 ' ºÐ.,ÆÆ0’’’]\^““–_ba—cd˜˜fh›šjœmžŸŸ n¡¡¡o¢¢q££¤±r¦utw¨§xyzA©{}|«­´~~<;Cµ‚€€==ƒ¯¯¯¹888»#º#Ï"""†D†……FF‡GIJJK‰MNPQRX®ÀÀÀÓÑÈÉóõõöôÞÚÇÖÃ7 ' þ!.,ÆÆ0’’’’\\^“–•_`—cd™˜efh›jjkŸŸŸnnn¡¡o¢qp£¤¤rr:ttw¨§xyzª©{}|«­¬~¸<;BB‚€€¶ƒÁ¯¯¹¹88„»##ÏÏ""þD†††F…FGGIˆKKMLNOQRX®¼¼À¼ÊÈÈò÷÷÷÷÷õõÂŽŽ 'þþþ!.&Æ·/’’]]^”“–_b>—cd™˜efi›lkkžŸŸ nnn¡oo¢qp£¤sr¦uutw§§xyAª{{}|­¬¬~;;¾B‚€==ƒ°°¯¹888„ººÏÏÏ""þD†………FHGGJJKMMLOQQRX®ÀÀÀÓÊÍÍò÷÷÷÷÷÷÷÷, 'þþþþÄ-ÆÆ0’]\^““••b—ccd˜effgjlkmžŸŸnn¡¡¡oo¢qp£¤sr¦utw¨§xxzA³{}|««­~~;;µB‚€€¶=Á°°¯¹88„» º#Ï"þþ†………FFEGGˆJKMNNQQQSX®¼ÓÓÒÊÝÍò÷÷÷÷÷÷÷Æ% þþþþþ2%Æ·3]]\^“–••b—cd™˜efhgjlkžžŸ nnn¡oo¢qp£¤¤sr:utw¨§xyzª©}}|«­´~<;;BB€¶=ƒ°°¯¯888„ ºººÏ"""þ†………FFGGJJJMMNNPQRSX®ÓÒÒÒÊÝÝðø÷÷÷÷÷÷& 'þþþþþþ! &Æ0]\^”“••ba—cd™˜efhšjkmžŸŸ nn¡¡oo¢qp£¤¥r¦uutw§§xzAª©}}|«­¬~<;µµB€¶=ƒ°°¯¹¹88»»º#Ï""""þ†……FFFGIˆJKMMNLPQRSXÀÓÒÒÒÊÌÌðø÷÷÷÷÷÷,  þþþþþþþ2%Æ·?]^”“••`accd˜efh›šlkmžŸ  nn¡oo¢qqp¤¥sr:utw¨§xyzA³{}|«­¬¬~<;CB‚€==ƒ°¯¯¹¹8„ ##Ï""""þ†……FFEGIJJMMNNOQQRSX®ÒÑÒÒÊÌÌðøøøø÷÷÷0)' þþ"""Ð3Æ·?]^“–•`b—cc™˜efhgjœkžžŸ  n¡¡oo¢qpp¤¥r¦:ttw¨§xyzª{}}|«¬´~<;CCB€¶=ƒÁ°¯¹¹88„ ºº#ÏÏ""þþ………FEGGIJKKMNLPQQRRXÀÒÑÑÒÊÌÛÛøøøø÷÷Æ/)    #8!!°Ð &Æ3\”“–_`a>cd˜eefh›jkkžŸŸ nn¡¡oo¢qp£¤srvutww§§xyA©³{}««­¬~<;µB‚€¶=ƒƒ¯¯¹888„»º#Ï"""þþþ………E‡GGJJKMMNPOQRSSXÀÒÑÑÑÊÛÛîøøøø÷÷Æ]' )%%% !Ä999994,Æ3]““••`—ccd˜efh›šlkžŸŸ nn¡oo¢qp££¥rruutw¨§xxzA©{}|«­¬¬~¸;µB‚€¶=ƒ¯¯¹8888„» #ÏÏ"""þþþ†…FFEGGˆKKMMLPQQRS‹XÀÒñÑÑÞÛÛîùøøø÷÷Æ*' %úÜ/%Ä5555554,Æ3\“–•b`—cc™˜efhšškkmŸŸ nn¡¡¡o¢¢p£¤¥s¦:utw§§xyzª³{}|«¬¬~<¸µµB‚€¶=ƒÁ¯¯¯¹88 #ºÏÏÏ""þþþ……F‡GGIJJKMNLPQRSS‹XÀÑññÑÞÛÙîùùùùøý·*  6úâÚ%4444441%Æ3^“••ba>cd˜eff››lkkžŸŸ nn¡¡o¢qqp£¤sr¦utw¨§xxzAª©{|«­¬¬~;;CB‚‚€€¶=ƒ°°¯¯888»##ÏÏ""þþþþ……FFGGIKMMMNPOQRSS‹XÀÑñññÞÙÙÙùùùùûûý/) 0ÀÚ7 ))o+%Æ3”–•b`>cc™˜efhgšlkmžŸŸ nn¡oo¢qqp¤¥sr²utw¨§xxzªª{}|«­¬~~;CµB€¶¶=ƒ°¯¯8888 º#ÏÏ"""þþþþ…FFFGIJKMMNLPQRRSS‹XÀÑñññÞÙØîùûûûûûý0   %%7' ')%Æ3“–•`a—cd™˜efh›jlkmžŸ nn¡¡oo¢qp¤¤ssruut¨§xxyzª³{}|«­¬~<;CB‚€¶=ƒƒ¯¯¹¹88„ º#Ï""þþþþþ…FFGGˆJJKMNLQQRSSS‹XÀññññÞÙØÜûûûûûûý6  () ,·3“•b`——cd˜˜ehgšjkkžŸŸnnn¡¡o¢¢qp¤¤sr¦utt¨§xxyz©{}}|­´´~;;Cµ‚€€€=ÁÁ¯¯¹88„„»ºº#Ï"""þþþþþ…FEGGJJKMMNPOQRSS‹TXÀñÿÞÑÞØØÜûûûûûûý6 þþ'*,·?“•bb—>d™˜efh›šlmmžŸ nnn¡oo¢¢pp£¤±ruutw¨§xyzªª{}|«­¬~~;;C‚€¶=ƒƒ°¯¹¹88„» ºÏÏ""""þþþþFFGGIˆKMMMPPQRSSSS‹UÀÊ×åæâØÅæüüûûûûý·-‚º"þþþþ" &0”–•ba—cd˜˜efhšjlmžžŸ nn¡¡oo¢qpp¤s±¦utww§§xyªªª{||«­´~<;;µB‚€¶=ƒÁ°¯¯¹88„„# ºÏÏ"""þþþþþFF‡IIJJKMNOŠQRSSS‹TZÀÇéé×âØÅÅ×ÚÚ¼¼üýý%2"þþþþþþ %&3”••`—>cd™eeh›šlkmžŸŸ nn¡¡oo¢qp¤¤±r²utw¨§xxzzª{}|«­¬¬~<;µB¶¶=ƒ°¯¯888„»ººÏÏ"""þþþþþFEGIˆJKMNNPQRRRS‹TTZ3áää×âÅÖÖÅÖÖÅ×׿ !"þþþþ" ' ,,?”•``—cc™˜efhgjlkmžŸ  nn¡¡o¢qp£¤¥rr¦utw§§xyzª{{}|«­­~~;;CB‚€¶==ƒ°¯¹¹88„„» ##""""þþþþþþ‡‡GIJKKMNNOŠRRSS‹‹TXÀÕää×âÅÖÖÖÖÖÖÖÖÖÇ04#þþþþº' ,/”“•`a—cd™eef›šlœkžžŸ nn¡¡oo¢qp£¤¥rv:utw¨xxzAª©{}|«­¬~¸;CB‚€¶=ƒ°°¯¹88„„»ºº#ÏÏ"""þþþþþþHGIJJKKMNPQRRRS‹‹TTU3Õää¿âÖÖÖáÖÖáÖÖáÖÕ732þþþþ8 U70]–••`>cc™™eff›šlkmžŸŸ nn¡oo¢qpp¤¤sr²utw¨§xxzAª{}|«­­~~;;CB‚€€¶=ƒ°¯¯¹888»º#ÏÏ"""þþþþþþþ‡GIIJKKNNPQQRSSSTTŒZÀÕääÚâááááááááááááÕ732þþ"' 0’”“•b`—cd™˜efhgjœkmžŸŸ n¡¡¡o¢qq£¤¥sr:tww¨§xxzª©{}|«­´~¸d™™efhgjjkmžŸ  nn¡¡o¢¢qp¤¤sr¦utw¨§xxzA©{}||­¬~~;;CB‚€=ƒƒ°¯¯¹888„ º#Ï"""þþþþþþþþGIˆKKMNPŠŠQRSSS‹TTŒU¼ÓÀÀÒÛåêéééêêêêêêêêêêËÂ%?1) /7/\^“–•`a—cd™˜efi›jlkmžŸŸ n¡¡oo¢qp££¥rruttw§§xzzªª{}|«¬¬~<;;µ‚€¶=ƒƒ¯¯¹888„„»ºÏÏÏ"þþþþþþþþþGIJMMMNNOQRRSS‹TTŒŒZÀÓ¼¼ÓðêêÖÙØÖáêêéééêêêêêÔÂ7/? >(*?0%%/’]^”“–•`accd™˜ff››lkkžŸŸ nn¡¡oo¢qp£¤¥r:utt¨§§xyz©©{|«­­¬~<;Cµ€==ƒ°°¯¹888„»º ÏÏ""þþþþþþþþþþGIJKMMNPŠQRSSS‹TTŒZ¼ÓÀ¼ÒÙêÖëÐ9èí¨Þâæ×áêêééééÔÔÂÂ,,&&·®®”]\^“–•b`acdd˜efh›jlkm@ŸŸ nn¡oo¢¢pp£¤±r:utw¨§xyzª©{}|«­¬¬~;;CB‚€€==°°¯¯¹88„ ##"þþþþþþþþþþGJJKKMNPQRRRSSTTTŒV¼ÒÑÿ$ÛÖÝ!!ÐÐ$$ÿÿ2ÊÞìçÚÇÕåÔéééÔ·ÆÆ·6?]]^“–•ba>cc™˜efhgšœkm@Ÿ  nn¡oo¢qp£¤¤±vuutw¨§xyzª©}}«­¬¬~~;;BB¶=ƒÁ¯¯¹888„„ºº#ÏÏ""þþþþþþþþþþJJJMMLOQQRRSS‹‹TŒŒZ¼$!!$ì¢99$Ð$$$$9ÿÿÿññÑÑÒììçÜÚÃÕ®6···3]\”“–•`—>cd˜˜efgšlkm@ŸŸ nn¡¡o¢¢qp£¤sr¦utw¨§xyyzª©}}«­­¬~<;µµB€€=ƒ°¯¯¹¹88„»º#Ï""þ"þþþþþþþþþIJKMNLOQRRRSS‹TTŒŒV ÐÐÿÒ/%03- 12222ÿÿÿññÑÑÑÒÒÒÓÓ.Ó¼¼®3?\^”–•bb—cc™˜eefgšjkmžŸŸ nn¡¡o¢¢qp£¤sr²utw¨§xyzª©{}|«­´~¸<;CB€¶=ƒ°¯¯¹888„» º#""""þþþþþþþþþþIKKMNLOQRRRS‹‹TTŒŒZ¼ÿÑÒ¼%,,,,%%003- .4ÑÑÑÑÑÑÒÒÒÒÓÓ¼À3’]\^“–•ba—cd™˜efh›jlkžŸŸ  n¡¡¡o¢qqp¤¥±ruutw¨§xyzª{{||«­¬~;;CB‚€¶=ƒƒ°¯¹888„„º ºÏÏ""þþþþþþþþþþþJKMMNPOQRRSS‹TTŒŒŒZ¼ÒÒÒ-,,,,,,,,7%%000/3- ÒÑñÑÑÒÒÒ¼®3’]\^”“–•`>—cd˜eeh›šlkm@ŸŸ nn¡¡oo¢qp£¤sr¦utw¨§§xzzª{}}|­¬¬~<;CB€¶¶=ƒƒ¯¯¹¹8„„»º#ÏÏ"""þþþþþþþþþþJKKNNOQQRRS‹‹TTŒŒŒZ1ÑÑÒÃRRŽ777%7%%%%00//.ÿ$ÐÐ9ÿÒ®·/]]\^““–``>>d™˜efhgjlkŸŸ  nn¡¡o¢qqp¤¤±ruutw¨§xxzª©{}|«­´~~;;CB‚€€==°°¯¯¹88„» #ÏÏ"""þþþþþþþþþþþKKMNLPQRRSS‹‹TTŒŒU[ÑÿÿâáåááÇÇÇÃYZZ0Z0Z//19ƒ8 ®Æ0?\\^“–•`a—cd™eef›gjlkmžŸ nn¡¡oo¢qp£¤s±¦utww§§xyzª©}||«­¬~<cd™eefišjkkžŸŸ nn¡¡o¢¢qp£¤sr¦utw¨§xxzª©{}|««­¬~;;µB€¶==ƒ°¯¯¹¹88„» ##Ï""""þþþþþþþþþþþKKMNPPRRRSS‹TTŒŒY2ÐÄëÅáÖÖÖÅÅÅÅÅőؑ‘‘‘‘‘)( ÿ6Æ/]\““•_`—cd™™efhgšlkžŸŸŸnn¡¡¡o¢qpp£¥sruutw¨§xyzª©{}|«­¬~~¸;µ‚‚€¶==Á°¯¹¹88„º#ÏÏ"""þþþþþþþþþþþþMMMLPQRRSS‹‹TTŒŒU[íëÛØááÖÖÖÅÅÅŽØÅ‘‘‘‘‘‘')3  !¼Æ·?““–•`>>cd˜˜efišjœkm@Ÿ nn¡¡oo¢qp££¥±¦:ut¨§xxzzª©}}|«­¬~;;CB‚€¶=ƒ°¯¯¹¹8„„ ##Ï""þþþþþþþþþþþþþMMNPOQRRSS‹TTŒŒŒW--áåááÖÖÅÅÅÅŽؽ‘‘‘‘‘‘'g6®:  "#Ñ6Æ?^––•b—cc™˜eef›gjkmžŸŸ nn¡ooo¢pp£¤sr¦utw¨§xxzzª{}|««­¬~;;CB€=ƒƒ°¯¹¹¹88»º#Ï""þþþþþþþþþþþþþ ;MNNOŠRRSSS‹TTŒŒUZZÕááÇÖ×Ö׎½Ø½‘‘‘‘‘''''-·®.B "#°9À6?^“•_a>cc™˜efh›jlkžŸŸŸ n¡¡¡o¢qpp¤¥rruutw¨§xyzª©{}|«­´~<;;CB€¶ƒƒ°¯¹888„»»º##Ï""þþþþþþþþþþþþþ8¸MMNPQRRRS‹TTŒŒŒUUUVVWWWYY¿¿½½‘½‘‘‘‘'')-6®À5‚ƒÄÊeb*?”^–•`a>cd™˜efh›jkkžŸŸ nn¡¡oo¢qp£¤ss¦:tt¨¨xxyªª©}}|«¬´~<;;B‚€¶=ƒ°¯¯¯¹88 ºÏÏ""þþþþþþþþþþþþþl´MNPQQQSSS‹‹TŒŒŒUUUUUVVVWWYYY[[[>((3/?[”–––”]]]\^“•_b—cc™˜˜ef›šjkmžŸŸ nn¡oo¢¢qp£¤sruutw¨§xxzª©{}|«­¬~~;;µB‚€¶ƒÁ°¯¯¹88„ #ÏÏ"""þþþþþþþþþþþþþþ›‹NNOQRRSS‹‹TTŒŒUUUUVVVVWWWWWYYYYYY[[[[[’’]]\”““•_a—cc™˜eehšjlkm@ŸŸ n¡¡¡o¢qpp£¥rr¦ttw¨§xxzA©{}|«­¬~<;;B‚€€=ƒÁ°¯¯¹88„ººÏÏ"""þþþþþþþþþþþþþþQZNPŠQRRSS‹TTTŒŒUUUUUVVVVWWWWWYYYY[[[[’’]]\”“–•ba—cd™˜efigjkkmŸŸ nn¡¡o¢¢qp£¤sr¦uttw§§xzzª{{||«­´~<;CµB€=ƒƒƒ¯¯¹¹88„» #Ï"""þþþþþþþþþþþþþþþ3NOŠQRSSS‹TTŒŒUUUVVVVVWWWWYYYYYY[[[[’’’]\^““••`accd˜efhišlkmžŸ  nn¡¡ooqq£¤¤sr¦utw¨§xxyz©{}||­´~~<;µB‚¶==Á°¯¯¹888„»#º#Ï"þþþþþþþþþþþþþþþþ5ÂPPŠQRSS‹‹TTŒŒUUUUVVVVWWWWWYYYYY[[[[’’’’]\^““•ba—cd™˜efh›jkkm@Ÿ  n¡¡oo¢¢p£¤srr:utw¨§xyzª©{}|«­¬~~ccd˜eef››lkmžŸŸ nn¡¡oo¢qp£¤¥r¦uut¨§xxzAª{{}|­­~~<;µµ‚€==Á°¯¯¹¹88„»ººÏ""""þþþþþþþþþþþþþþþ OPRRSS‹‹‹TŒŒŒUUUUUVVVWWWWWYYYYYY[[[[’’’]\^““–•`—>cd˜eehgšlkžŸŸ n¡¡¡o¢¢qp£¤rrvutw¨§xxzA³{}|«­­~~;;C‚‚€€==°°¯¯¹88„»º##ÏÏ""þþþþþþþþþþþþþþþþnsis-3.11/Contrib/Graphics/Icons/000077500000000000000000000000001477201124000166235ustar00rootroot00000000000000nsis-3.11/Contrib/Graphics/Icons/arrow-install.ico000077500000000000000000000111461477201124000221230ustar00rootroot00000000000000(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÌÌÏüÌÌ ÌÌÿÿÌÌÀ ÌÏÿÿüÌÀ ÌÿÿÿÿÌÀ ÏÿÿÿÿüÀ ÿÿÿÿÿÿÀ ÿÿÿÿÿÿÀ ÿüÿÿÏÿÀ ÿÌÿÿÌÿÀ üÌÿÿÌÏÀ ÌÌÿÿÌÌÀ ÌÌÿÿÌÌÀ ÌÌÿÿÌÌÀÌÌÿÿÌÌÀ€€À( ì¨ÿÿÿÀ€€À( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿDDDDDDDDDDDDDDDDôDôOÿDODÿôDD@DDôOôDDôODDODD@DDôôôDÿDODOôDD@DDÿDôODDODôDDD@DDôDôDÿôODOÿDD@DDDDDDDDDDDDDD@ ÌÌÌÌÌÌÏüÌÌÌÌÌÌÀ ÌÌÌÌÌÌÿÿÌÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÿÿÿÿÌÌÌÌÌÀ ÌÌÌÌÏÿÿÿÿüÌÌÌÌÀ ÌÌÌÌÿÿÿÿÿÿÌÌÌÌÀ ÌÌÌÏÿÿÿÿÿÿüÌÌÌÀ ÌÌÌÿÿÿÿÿÿÿÿÌÌÌÀ ÌÌÏÿÿÿÿÿÿÿÿüÌÌÀ ÌÌÏÿÿÿÿÿÿÿÿüÌÌÀ ÌÌÏÿÿÿÿÿÿÿÿüÌÌÀ ÌÌÏÿÿÏÿÿüÿÿüÌÌÀ ÌÌÏÿüÏÿÿüÏÿüÌÌÀ ÌÌÏÿÌÏÿÿüÌÿüÌÌÀ ÌÌÏüÌÏÿÿüÌÏüÌÌÀ ÌÌÏÌÌÏÿÿüÌÌüÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ€€À( @mRì¨ÿÿÿÀ€€Ànsis-3.11/Contrib/Graphics/Icons/arrow-uninstall.ico000077500000000000000000000111461477201124000224660ustar00rootroot00000000000000(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™ÿÿ™™ ™™ÿÿ™™ ™™ÿÿ™™ ™™ÿÿ™™ ù™ÿÿ™Ÿ ÿ™ÿÿ™ÿ ÿùÿÿŸÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿ Ÿÿÿÿÿù ™ÿÿÿÿ™ ™Ÿÿÿù™ ™™ÿÿ™™™™Ÿù™™À€€À( =ãÿÿÿÀ€€À( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿññÿÿñññññññÿñÿññññÿñÿ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™Ÿ™™Ÿÿÿù™™ù™™ ™™Ÿù™Ÿÿÿù™Ÿù™™ ™™Ÿÿ™Ÿÿÿù™ÿù™™ ™™ŸÿùŸÿÿùŸÿù™™ ™™ŸÿÿŸÿÿùÿÿù™™ ™™Ÿÿÿÿÿÿÿÿÿù™™ ™™Ÿÿÿÿÿÿÿÿÿù™™ ™™Ÿÿÿÿÿÿÿÿÿù™™ ™™™ÿÿÿÿÿÿÿÿ™™™ ™™™Ÿÿÿÿÿÿÿù™™™ ™™™™ÿÿÿÿÿÿ™™™™ ™™™™Ÿÿÿÿÿù™™™™ ™™™™™ÿÿÿÿ™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™™ÿÿ™™™™™™™™™™™™Ÿù™™™™™™À€€À( @p=ãÿÿÿÀ€€Ànsis-3.11/Contrib/Graphics/Icons/arrow2-install.ico000077500000000000000000000111461477201124000222050ustar00rootroot00000000000000(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÌÌÏüÌÌ ÌÌÿÿÌÌÀ ÌÏÿÿüÌÀ ÌÿÿÿÿÌÀ ÏÿÿÿÿüÀ ÿÿÿÿÿÿÀ ÿÿÿÿÿÿÀ ÿüÿÿÏÿÀ ÿÌÿÿÌÿÀ üÌÿÿÌÏÀ ÌÌÿÿÌÌÀ ÌÌÿÿÌÌÀ ÌÌÿÿÌÌÀÌÌÿÿÌÌÀ€€À( ì¨ìªí« í¬ í¬ ý´ýµý¶ ý¸ ýºý½ ð¸/þÅ9òÂMþËLóÈ^þÐ^õÎqþÕpöÔ‚þÚ‚÷Ù’ÿß’þãžÿÿÿ          À€€À( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿDDDDDDDDDDDDDDDDôDôOÿDODÿôDD@DDôOôDDôODDODD@DDôôôDÿDODOôDD@DDÿDôODDODôDDD@DDôDôDÿôODOÿDD@DDDDDDDDDDDDDD@ ÌÌÌÌÌÌÏüÌÌÌÌÌÌÀ ÌÌÌÌÌÌÿÿÌÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÿÿÿÿÌÌÌÌÌÀ ÌÌÌÌÏÿÿÿÿüÌÌÌÌÀ ÌÌÌÌÿÿÿÿÿÿÌÌÌÌÀ ÌÌÌÏÿÿÿÿÿÿüÌÌÌÀ ÌÌÌÿÿÿÿÿÿÿÿÌÌÌÀ ÌÌÏÿÿÿÿÿÿÿÿüÌÌÀ ÌÌÏÿÿÿÿÿÿÿÿüÌÌÀ ÌÌÏÿÿÿÿÿÿÿÿüÌÌÀ ÌÌÏÿÿÏÿÿüÿÿüÌÌÀ ÌÌÏÿüÏÿÿüÏÿüÌÌÀ ÌÌÏÿÌÏÿÿüÌÿüÌÌÀ ÌÌÏüÌÏÿÿüÌÏüÌÌÀ ÌÌÏÌÌÏÿÿüÌÌüÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ ÌÌÌÌÌÏÿÿüÌÌÌÌÌÀÌÌÌÌÌÏÿÿüÌÌÌÌÌÀ€€À( @ v\u[v\x^z`}ady` |a ~d ce…g†h‰jŠlme …g …h ˆj Šl n o p p ì¨ì©í«í¬ í¬ î²î³ ï´"ï´$ï¶)ð¹2ðº6ð¼;ð½>ñ¾AñÀGñÁHòÃMòÃPòÄQòÅUóÆZóÈ\óÊcóÊdôÍkôÍlôÐsõÐuõÑyõÒ}öÓ€öÕ…÷Ø÷Û”øÝ›øÞøß úúúüüü   D D DDDDDDD  D DD DDD  D D DDDDDD  DD D DDD  D  DDDDDDDD    !!!!!!!!! !!!DD!!!!!!DCDC!!!!!!!!!!DCCCCC!!!!!!!!!!!CCCCDCCC!!!!!!!!!!CCCCCCCCCC!!!!!!!!!CCCCCCCCCCCC"!!!CCCCCCCCCCCCCC&%!!!!CCCCCCCCCCCCCCCC''&%%%DDCDCDCDCDCDCDCDCD%%%"!(+(+(+DDCDCDCDCDCDCDCDCD))))%+.....CDCDCDCDCDCDCDCDCD----+%,////.DDCDC.DDCDCD-DCDCD0000.+.22222DDDD22DDDDDD32DDDD22222./55555DDD555DDDDDD555DDD55555/377777DD7777DDDDDD7777DD777773599999D99999DDDDDD99999D9999957;;;;;;;;;;;DDDDDD;;;;;;;;;;;79===========DDDDDD===========9;>>>>>>>>>>>DDDDDD>>>>>>>>>>>;;???????????DDDDDD???????????;=@@@@@@@@@@@DDDDDD@@@@@@@@@@@=;@BBBBBBBBBBDDDDDDBBBBBBBBBB@;;>>>>>>>>>>DDDDDD>>>>>>>>>>;À€€Ànsis-3.11/Contrib/Graphics/Icons/arrow2-uninstall.ico000077500000000000000000000111461477201124000225500ustar00rootroot00000000000000(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™ÿÿ™™ ™™ÿÿ™™ ™™ÿÿ™™ ™™ÿÿ™™ ù™ÿÿ™Ÿ ÿ™ÿÿ™ÿ ÿùÿÿŸÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿ Ÿÿÿÿÿù ™ÿÿÿÿ™ ™Ÿÿÿù™ ™™ÿÿ™™™™Ÿù™™À€€À( >ã@ã@ãAäCäD äF äAóEóAôGôH óK ôPôY õk9õyM÷…^î‡^ø“pð•pø ‚ñ¢‚ù¬‘ó®’û·žú¸Ÿúÿÿÿ         À€€À( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿññÿÿñññññññÿñÿññññÿñÿ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™Ÿ™™Ÿÿÿù™™ù™™ ™™Ÿù™Ÿÿÿù™Ÿù™™ ™™Ÿÿ™Ÿÿÿù™ÿù™™ ™™ŸÿùŸÿÿùŸÿù™™ ™™ŸÿÿŸÿÿùÿÿù™™ ™™Ÿÿÿÿÿÿÿÿÿù™™ ™™Ÿÿÿÿÿÿÿÿÿù™™ ™™Ÿÿÿÿÿÿÿÿÿù™™ ™™™ÿÿÿÿÿÿÿÿ™™™ ™™™Ÿÿÿÿÿÿÿù™™™ ™™™™ÿÿÿÿÿÿ™™™™ ™™™™Ÿÿÿÿÿù™™™™ ™™™™™ÿÿÿÿ™™™™™ ™™™™™Ÿÿÿù™™™™™ ™™™™™™ÿÿ™™™™™™™™™™™™Ÿù™™™™™™À€€À( @ *w+y,z,},w+x-y.z-}0}0~-‚.…/‰/Œ0Š0Œ..„.‰0‚00†0Š0Œ>ã@ã@ãAäCäE äF äHåTæV!çX$ç[(è]*èc2éf6ég8éj;él>êmAêrEëtIëwMëxMëzQì}UìZí„\íˆcî‰eîkïlï•sï–uð™yðœ}ðž€ñ¢…ñ¨ò®”ó³›ô´›ôµžô· õ¸ õÿÿÿ   H HHHHHHHH H HH HHH  H H H HHHHH  HH H HHH  H H HHHHHHH """"!"""""""HHHHHH""""""""""HHHHHH""""""""""""HHHHHH""""""""""""HHHHHH"######"""""HHHHHH#####"""""""HHHHHH$#""""HHHHHH(&""""H""""HHHHHH"H))(&&&HH%&&&HHHHHH&&&&HH%&&%+..+.+HHH+/+HHHHHH+.+HHH..-,%+11111HHHH11HHHHHH11HHHH1.10.%/33333HHHHH3HHHHHH3HHHHH33333.355555HHHHHHHHHHHHHHHHHH555553388888HHHHHHHHHHHHHHHHHH8888735::999HHHHHHHHHHHHHHHHHH9999958<<<<<>>>>>>HHHHHHHHHHHHHH>>>>>>>9;@@@@@@@@HHHHHHHHHHHH@@@@@@@@;>AAAAAAAAAHHHHHHHHHHAAAAAAAAA>>BBBBBBBBBBHHHHHHHHBBBBBBBBBB>@DDDDDDDDDDDHHHHHHDDDDDDDDDDD@>DGGFFGGGFGGGHHHHGGFFGGFGFFGD>>AAAAAAAAAAAAHHAAAAAAAAAAAA>À€€Ànsis-3.11/Contrib/Graphics/Icons/box-install.ico000077500000000000000000000111461477201124000215610ustar00rootroot00000000000000(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿpˆw"" ˆˆw/" ˆˆwÿÿ ˆˆwÿÿ ˆˆw/" ˆw"" ÷wp÷xˆwwxˆˆ‡wˆˆˆwˆˆˆ‡ˆˆˆùÿà€€Ààðø?üÿ( ,,,0}2‡67‘;˜<›;žC¢ L¦T«!^¯+]¯-f´7k¶>o¸Cw¼O|¿UˆÅc‰Åe—Ìwx€†œ¡¦£Ò‡ÌÕÚéñ÷ÿÿÿ    ùÿà€€Ààðø?üÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ‡"""""" ˆ‡p"""""" ˆˆ‡w""/""" ˆˆÿ‡wp""ÿ""" ˆˆÿw‡ww"/ÿ""" ˆÿwˆ‡ww"ÿÿÿÿò ÿwˆˆ‡ww/ÿÿÿÿò wˆˆÿ‡ww/ÿÿÿÿò ˆˆÿw‡ww"ÿÿÿÿò ˆÿwˆ‡ww"/ÿ""" ÿwˆˆ‡ww""ÿ""" wˆˆÿ‡ww""/""" ˆˆÿw‡ww"""""" ˆÿwˆ‡ww"""""" ÿwˆˆ÷wwpwˆˆÿxwwwwpˆˆÿwˆ‡wwwpˆÿwˆˆˆwwwpÿwˆˆˆˆ‡wwpwˆˆˆˆˆˆwwpˆˆˆˆˆˆˆ‡wpˆˆˆˆˆˆˆwpˆˆˆˆˆˆˆ‡pˆˆˆˆˆˆˆpˆˆˆˆˆˆ€ˆˆˆˆ€ˆˆˆ€ˆ€€ÿÿÿÿÿÏ€ÿüðÀÿÿÿÿÿ€ÿÀÿàÿðÿøÿüÿþÿÿÿÿÿ‡ÿÿÿßÿÿ( @,,,&d.z/~0}1‚2†4Š5Œ6‘8•:˜<›;ž<@ŸC¢ K¦K§L¦P¨T«U«!]¯+]¯-]°-_±0f´7h´7f´9h´9m·Ao¸Cq¸Cp¹Dt»Jv¼Mx¼O{¾S|¿U~ÀXÀYƒÂ^…Ã`†Äa‰Äc‹ÆhÇiÉoÈo”Äw’Ép–Ìw™Ìw–Ìy˜ÍxžÏžÐx€†¡©®ŸÐ£Ïˆ£Ò‡¤Ñ‰¦ÓŒ¨Ô¬Ö“²Ø›´Úœ·Ü¡ºÝ¥½ßªÐèÂ×êÌÙìÍÛíÐæóÞÔÜâçóàéôãìöæî÷éóùðöûóÿÿÿ<;  <<<;; <<<<<;;;!D <<<3 <<KKKFEKKK8777CC5577755555)%%FKKKKKKE 7CC557777755555.)%)HKKKKF 7557777CC7555551.)/HKKKKF 77777CC55755555419KKKKKKKF777CC557775555599FKKKHFKKK=7CC557777755555;;3JKH.&FKA7557777CC755555<;99D9)))@" 77777CC55755555<<<::91+)%$" 777CC5577755555$<<;;:11+)%$"7CC557777K5555557557777KK7755555555577777KK77CCC55555555777KK77CCCCCC55555557KK77CCCCCCCCC555555K77CCCCCCCCCCCC55555CCCCCCCCCCCCCCC5555CCCCCCCCCCCCCCC555CCCCCCCCCCCCCCC55CCCCCCCCCCCCCCC5CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCÿÿÿÿÿÏ€ÿüðÀÿÿÿÿÿ€ÿÀÿàÿðÿøÿüÿþÿÿÿÿÿ‡ÿÿÿßÿÿnsis-3.11/Contrib/Graphics/Icons/classic-install.ico000077500000000000000000000020661477201124000224130ustar00rootroot00000000000000(& èN( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxðxðððxðððxðÿÿxðÿðxðxðxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwxÝxøðˆÝ™€p‡øýÙ™ˆxøð‡xˆÙ˜ˆ€xw‡‡øÙˆ‹°xøð‡xxxp ‹»°€xw‡‡»¸€xøð‡xˆ»xxp€xx»‰°‡‡€ÿð‡{¸›½ÿxxpÿðxw‰»½ø÷‡ÿð‡‡›»Ýxˆˆÿðˆˆ{½Ýˆøðˆpÿðˆˆ}݈€wwˆpÿðˆˆ÷wwÿÿÿÿpwwpˆˆwwwwwwwxpwwpˆˆ€ÿÿ÷ˆˆˆˆˆˆˆˆ‡wwwwpˆÿÿÿÿÿÿÿ‡wwð‡wwpð‡ÿÿðð‡wwpðð‡ðÿÿð‡ðÿÿð‡ðÿð‡ðÿ‡ð‡ð‡ÿÿÿÿÿÿÿ‡wwwwwwwwÿþÿÀøÿÀpÿÀ ÀÀ?À?À`?À`?À?À?ÀÀÀÀÀÀÀ€øüþÿÿøÿøÿøÿøÿøÿøÿøÿünsis-3.11/Contrib/Graphics/Icons/classic-uninstall.ico000077500000000000000000000020661477201124000227560ustar00rootroot00000000000000(& èN( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿÿÿüÿÿðÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿÿ( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwÿwxˆˆ€wwwðwxˆˆ€wwðwxˆˆ€wððwxˆˆ€wððwxˆˆ€‡xÿwxˆˆˆ‡xÿðwxˆˆˆ‡xðwxˆˆˆ‡xð‡wxˆˆˆ‡€ðˆwwxˆˆˆw€ˆwwÿˆˆˆ€w€ˆwwøˆÿˆˆ€w€ˆwwø‡wˆÿˆ€wˆwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/llama-blue.ico000077500000000000000000000042761477201124000213460ustar00rootroot00000000000000 ¨( @€n*=V*|g'Fi*Ol)@q5VXN(aT,n`9zg*]VAc_Rq_BlbLzgFvo\{r_{thyyv/Ÿ9’ ç ëíôúÿýBA•C# Ž8—=–?Š:%€]šC™B ›DšE—G(„h‹s•`ž‰h*Šv2•{5¦L ¨O ¥K®V®U«S «\ ¨R°_ ³\¥o¢s°f µl°g»u¿z¾y¶x¯q"µb#µu#»y$»x#¹w&½|4º|;¹p;ŠFGJD™SIƒkF‰tD‰{SWƒwc„yf…}u¸qAÂ}ÉtÀ}ÒÇs%žƒ&¨¤†!¬Œ"©‹'¥‰8³’$·–,¼”$¹˜'€_•J–ƒV‹‡{Œd©^ª’oª“|ÄÅ„ʆʀˊʉÎŽÏ‘×ك܋ԕՙÁ€&ƒ4ÇŠ4ÆŠ7ž'Î’,Æœ%Í“1Û… Ö› Ù!Ø"Ô›,Ж2Å¡'̧+ʤ)Ü¢"Ù«+ݧ6ݵ-ݲ,×°+à¦$â©%æ¯'ä­'æ®(ã­.é¨&å±+å».ë¶*é²)î¹+ï»,ï¼,ç³1æ°0é¾/ð¼,ð¼-ÃŒJÉ’LÇ“XÇ•[É•UÒFʘhß­EÞ«BÙ¥BΣvÑ£gÓ«|ìÁ0óÁ.ôÂ/õÄ/ñÅ0÷Ç0öÆ0öÉ1ùÉ1úÍ3üÍ2ûË2ýÏ3ÿÐ4ÿÑ4þÐ4“†˜’ŠŸ˜’˜˜˜¢–Š©Ÿ‘´œ‚¯¦³¡Š¹«›®®®§§§´«¢³²±¿º´Ì´œ×²Œ×±„Û¼›Ú¹–Ç·¨Å½·Ë¹×ʼÞĨäÍ´ìÓ»ÅÅÅÌÌËËÈÅØÍÂØÒÌÜÙÕÜÛÛÞÞÝÙÙÙÕÔÓêÕÂìÚÈõÞÈèßÖöâÏöäÓõèÝæææåäâìììèèçúíáúóìñññõôôü÷òüùöúúúøøøýûùÿÿÿþþþþýýýüú-----O\wx„„„„„„„„„„„„„xxw\O--------Ny™žµ¶¹¸¸¸¸¸¸¸¸¸¸¸¸¹¶µž™yN-----Ny—Ÿ¶»¾½¼·›³¾½½½½½º££¹»¶Ÿ—yM---N[“œ´»½¿Â³bkhÀÀÀÀ¿‹iRa·»´œ“[M--:z”ž¶¾¿ÁÁ›lèÊcÁÁÁÁ¿dÒá_³¶ž”z:-Y…–Ÿ¹½ÂÁÁºfÑ_ÂÁÁÁ› âàT‹¹Ÿ–…Y(r‡š ¸½ÂÁÁÁ£gà ‘·¿ÁÁÂ_Ùò`¶ •†r((q¡ ¸½ÀÁÁÁ£Rå /º¿Á`ØöÍŽ •†q(2s¡¥¸½ÀÁÁ£RðçÍV/‹¼_ÑöàÃ`¤•†t85®¡¥¸½ÀÁ·Š* ñõäÞÍÆ )ÞöæÄ,¤•†s44®¡¥¸½Â·]jÍßõþúñåÞÐÎÞòúåÅ,¤•†s44‰®¡¥¸½½dÃßæñùýýýùõðåòöùäÅ,¤•†s44‰­¡¥¸½º çñúÿýüüüüýÿùÿýùäÅ,¤•†s44‰­¡¥¸º€ïùüüüüüüüüüüüüùäÅ,¤•†s44‰­¡¥¸’gÞõýüüüüüüüüüüüüùäÅ,¤•†s44‰­¡¥¸cÊñùýüüüýýýýýýýýüùäÅ,¤•†s45‰­¡ ¸cÏûüüüýû÷÷ø÷÷÷÷øÿûæÇ, •†s55‰­¡ ¸cÌ÷þüýûóêêìììíîô÷ôÚn` •†t55ƒ®¢Ÿ¹ŠÉóÿüÿîÛPQQQQQQTëêÉ.‘Ÿ–…t56ƒ®˜ž¶£0×øüöÚ€£³³³³£Šhm0µž”{q66ƒ¯˜œ´»øüðV`¼ÀÀÀÀÀÀ¼›’£»´œ“zo62~¯Ž•še* õÿæUн½½½½½½½½¾»¶Ÿ•uX21~«ˆ“^ÈÐßõú‸¸¸¸¸¸¸¸¹¶´ “{tB1'}«ˆ‡)ÝíôûúÚTe¤¤¤¤¤¤¤ Ÿžœ•”†uo@&(}ªv<Ëáóøô×P‚•••••••••–“…upB>"(J±pp<# ëî <{†††††††††…zvsoB>9"EÔ§|Zoo; èPCssssssssstqpoA@>=6-!Ó²H@@@+S.CAAAAAAAAABB@@@>=7!--Lܲ¦JIGFDFHGGGGGGGGGHHIII?71---¬éÛ²¬©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨K71-----WÕÜÛÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÓ°K63--------%&$$$$$$$$$$$$$% -----øàÀ€€€€Ààønsis-3.11/Contrib/Graphics/Icons/llama-grey.ico000077500000000000000000000042761477201124000213650ustar00rootroot00000000000000 ¨( @€ZStpmyqnxsryvu|vs|wtypx}xu}xv{y¾74ž2.®84¤=;ª97¹:9º Û Þ ßÀÄÈá â àûüÿ Ç@<¨SM„^W‚[VŒ_Z’f^‡c\Œf`‹fbŽda™hc•pk–vs¥yv¡‡|wƒ}z‚|x‚}„~{‚z}ˆ}yŠ{y‡€‡}…ˆŠ~Š„…‚€…‚‡„ƒˆƒ‚Š„‰‡…‡ƒ…ކ†Ž‡ŽŒ…Š‹‰‡‰‡‹Š‰Š‰‹ŠŒ‹ŠŽŒ‘ˆƒ“‹‡’І•‹‡•І‹‰‘ޑޔ‹ˆ–Ž‹–ŽŠ•ŽŒ™Š“——‘Žš’ŽŸ“‘‘•”“š“™˜—ž™–Ÿž ”¡–‘£—‘ ”£˜’¤˜“¦š•¦œ–¡œš¡œ™¥œ™ª—©˜ªž˜«ž˜¬Ÿ™¦ Ÿ«¡®¡›¯¡œ°¡š°£°£ž±¤ž±¥ž³¥Ÿ´¥ž£¢¢§¦¦¦¥¥¨¦¦¯¦¡ª¥¢¯©¦©©¨®¨©³¦ °¦¢´§ µ§¡´¦ ·©£¶¨¢·ª¤°®­´¬©¸ª£¸ª¤¸«¥¹­§º®§»®¨¹¯ª¼¯©»°«½°ª½±«¾±¬¿³­¶µµ»´²¸··¿µ°»ºº¼»»¾¾½À´®Àµ¯Á¶°Â¶±Ä¹³Å¹´Ä¼¶Â»¸Ç½¸Ä¿¾É¾¹È¾¹É¾ºÊÀ»ÊÀ¼ÊÁ½Ì½ÍÄ¿ÂÂÁÇÇÇÏÆÁÏÆÂÍÅÁËËËÉÉÉÏÏÏÌÌÌÐÇÃÑÈÄÒÉÅÒÊÅÓÌÇÕÍÉÕÍÊ×ÐÍ×ÒÏÓÐÎÚÓÏÙÑÎÐÐÐÕÕÕ×××ÚÓÐÛÔÑÜÖÓÜÕÒÞØÕßÙÕßÙÖÝØÕÚÚÚÞÞÞÜÜÜàÚ×áÛØàÛØãÞÛâÝÚäßÜåàßâââäääåååçççæææçãâéæäéäâíéçìéçëëëêéèîëêîêéïïïíííïìëòðïñññóòòöõôùùùûûûúúúýüüþþþÿÿÿ¡¡¡¡¡DDOVVVVVVVVVVVVVVVOO66¡¡¡¡¡¡¡¡’°¾ÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÄ¹¥wP¡¡¡¡¡’ÚâßÙ×××××××××××××××××ÕÎɽ¥P¡¡¡’Ö×ßàÖÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÎÏËÏËÄ­P¡¡£½ÈÓÄ®«««špY\‹¥«««©w]b… ª¹ËÔÉ…¡œ¹¾ª•‘‘‘mS¼¦C~‘‘‘ŒS¦’7t€žÅ×Õ·E4z±¬–••••u9§èy•••ŽB¢ó‚;t”³àâÎd4z–±Ÿ•••••k ¼k•fïèA^•´àãØd3€ ´Ÿ••••••1Ѓ CfŠyçû:¶Þáßo3Œ©³Ÿ•••••/ÐóÒ¦CjuéþÑH{·Þáßn3Œ©³Ÿ•••Ž^CÒÿÿúÜ»<ôÿéTr·Þáßn3Œ©³Ÿ•••f=¤ÑùÿÿÿÿüܼÛûÿæKr·Þáßn3Œ©³Ÿ•••k8ÝþÿÿÿÿÿÿÿÿÿÿÿÿæKs·Þáßn3Œ©³Ÿ••Q„ýÿÿÿÿÿÿÿÿÿÿÿÿÿæKs·Þáßn3Œ©³Ÿ•h¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿæKs·Þáßn3Œ©³Ÿ•t7»øÿÿÿÿÿÿÿÿÿÿÿÿÿÿæKs·Þáßn3Œ©³Ÿ•i>öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæJr·Þáßn3Œ©³Ÿ•^8óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèTr·Þáßn3Œ©³Ÿ•g<óÿÿÿÿÿæÀÀÀÀÁÃæþÿÂG|·Þáßn3Œ©³Ÿ•q.ÜÿÿÿýèI.... Lï÷TN–·Þáßn3Œ©³Ÿ•_AÂÿÿèIRx}}}}xRGUNy™·Þáßn3Œ©³Ÿ}leÿÿÑ.••••jg{™·Þáßn3Œ©³ŸqBJM¼ÿÿÑ9•••••••••••™·Þáßn3Œ©³ŸZˆÜ÷úÿÿÛ@•••••••••••™·Þáßn-«³Ÿ_c¼óûþú¨B•••••••••••™¸Þáßo4˜¶·ª{P?`ÂüÀ0_••••••••••••ž¾×ßÙd¬ßÈ´žxR8Ò‚:}•••••••••••—±ÈÉÓÌd¡“öäı —ZMa]—Ÿ­¹´¯É²¡¡‰ðûëÓÇÆÅ¸‡†°ÄÆÆÆÆÆÆÆÆÆÆÅºžz›¿v¡¡¡‰öýùõííîêêëîííííííííííë× zv¡¡¡¡¡‰ÍëññññññññññññññññòòêÊŠgv¡¡¡¡¡¡¡¡FXXWWWWWWWWWWWWWWWXPX2¡¡¡¡¡øàÀ€€€€Ààønsis-3.11/Contrib/Graphics/Icons/modern-install-blue-full.ico000077500000000000000000000560061477201124000241460ustar00rootroot00000000000000(†h® è ¨þ 00¨¦ hN!  ¨¶%00 ¨%^6( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @B)D+L/I0 V9#Y:$^;'[?+W=8`<5lF.kL;xI>xP7~T5ZHCbNJ|\Gsc^|ketjkwnq‘_>•b@™u]ƒni‰z`Šzg…xuˆ|{§nn¢jq»zt¹Ž0Ûç›ÿœ(Ÿˆl™ˆv¥k­…m±†q°†uµpÇ`Âkÿ¼nÿ¾ps£”{–¶q“Ä~}„¨vƒÀŠˆˆ›Žž–™ŸšŸŸŸ±ƒ¹Ž‰¨—Ž®™” š¯ž˜°š•¼§™„ƒ¤ˆŠ¡Ž¿¯¬ª³§¥¬ ³´³³¸µ´¿º·¹µ»Ïˆ…—ŒÁ™Ò‘¢ǡ‘Á¦Ò²™Ø²™É‚£×ŒªÁŸ êŸ«Ï¤§Ïª¨Í´¡Ê±¥Ö² Þº¥Ý¾¥Ã¢³É ²É¾»Ûµ°Ù»°Ü²»Ú±½Ý»½à¹ æ »î¼°á¼¹û¸¸à‡ÉÿÙðçÁªðǦäÁ±ã϶âûáŸåǸãɽê̼íÒ·ÿÚµ–›É¦´Þª±ßµ·ÑݶÁß·ÄÓ¶Í̱ÔÀ¼ßÜ»Ðä­ÀáºÄã¾Æã»Èæ¿ÊÂÀÀÅÁÃÉÃÁÛÏÒéÅÅãÎÂêÉÆçÀÉìÇÌäÑÎñÒÁñÕÆòÓÍñÔÎû×ÏîÉÕðÌÖëÙÛóÐÑöÙÑðÙ×øÝÒö×ÙøÕÛóÝÞûÚÞûáÚüãßúÙãýÝæûçáýæâþéæþåéþñïÿøö>T]]B;AaŸ«q ˜YBz¡¬u$#  \dV—¦¬o/%"­žP7(t—Ÿ¦‘|0&­­¥m.r—žy{sf¥©£)x_WF=gD+lH5tK5}T8-6j07c6>qYKGZTUaONxKDhTHxXFeZWjb[jddteiyrmyux”pˆg—k„M=‡Z9‘^>Šk2a<VH“_@ŠeK’eF†kT–gRžxZªsK¥hY¥y[[{ Y|ƒliŸghqi–ul…rs…|tŒzt†}‹~}’tw‘~›}¨ldº}¦‹ÿŽí›ø™ÿ2ÿ¡.¢„O¬J½O­ƒ\¹€X…€}•~„~žˆx¬„h¿”o¢ƒr­‰v Š}²†v¨‘v¬”~°—wµ’z¼•|Ä…[Ä¡Gð¶Mÿ²PÃgǃyǘvѼkÖ¢~ÿ´iì±v=HŒR\˜X`˜wv†z|˜HT£NZ²\e§pt£‚{‚~…¯d»t}ŠÄz…І„‰ŠŠŠ—‰‰„‚ž—Œ’“““›•’”™œœœ£…†¶—„¼“†¼’޹ž‹¯™¡š˜¶¨„‰ª—Ž¢–“©€ˆ¼¥’§¡ž¢§˜®¢¡¡¬¥£§§©¬¬¬³§§¼°¯¥¨¸¶®°²²²º´³º¸¹Ç…–†Ëˆ“Å›•¦ŠÙª…ʨ‘ŦžÍ¢™ÍªœÓ¬•ȳšÓ³•Õ³›ß²œÝ»æ·”̆¨Ó‰¥Ç–¦Ö”­Í—±Ýš´ã›¢âœ¸È¡ Ò¬¤Å²¤Øµ«ÄªµÔª¸ÌººÛµ¹ì¥¥ú«¬â«¹ø­·á»¹ý·ºÿÈ•ÚÁ­Ôýä­ëÒ¬ÿÓ©âóèűèȳãÁ»æÈ½ìͼ÷žÿÛ·†Ï–Ù™£Ø§«È¦ª×¨°Ýº»Ö¦´â¼¾àĺÀݶÂżÝ×·Öê¦Áñ«ÂãºÆûµÄ½Â˶ÃåÇÃÆÚÈÆÌÇÙØÇÚåÀÃéÅÂæÉÁìÌÃæÀÊéÃÌíËÌóÎÅêÒÇòÔÅñÔÌþÐÉôØËìÇÒñÌ×çÙØ÷Ø×ûâÜÆÅãâÔàûÚãýççÿñíÿöô‘|||—;NPWYXU:v—>§ËéððððéÊ¡8y›©Ìð÷ûûã<¹÷÷ðÇ¡4|™O¤ÅïöûûûîI ¹û÷ðë¶qxØ?¶Åé÷÷üûõJDD!âûûöë¶€x6¶òðò÷÷üõ]DEEE ãûú÷ê´€‘}RÄïò÷÷ûüc^_GCCDB”ûûúöç´=âV¨ÄÌï÷÷ûûò¦ÆÁeF"‡ûûûûúí¿|U[ÊÌÌïò÷÷ûü¥ÎÆÁe&“ûûüûúöç´7*K¨ÉÌïòò÷÷÷¥ÎÎÁe&“ûûûûúú뺂{+`¤Äïòðòò÷‡ÅŪfHÙûûúúúöó¿¢44 /`ŸÉïïðìðéïïòïðúúúúúôôóç¤S'/\dÄÌÌèèèèèðððúôôôôôôôê´[ )/\d¨ÇÇǶÇÇ¿æóóôóóóôôôë´[  )/L[µÂ¶©¦¥¶¶ÙÙÙÞÛëóëëêê¤  $)/{Š~j¥¦´¯¯ÙÙÙÙÜÞÞêêê¤ $K‹tg•j}…¯¯¸ÙÙÙÙÞÞêÙQ )„ÏuÖt•hàŽŽ·¸ÙÙÙêÙÙ­A.4 $RÂäääÕÖÖÑlÒkЉØóóÙ­VQ-x– KÉö÷òãÃÓÕÖ×ÓmÕiˆkzëÙ‚VQ,™ž÷üýüöÂ¥·ÚäÔÐåÐÓnoó¶‚VK9~  ûýýý÷̪š®²ÛåøÔøÐåÞ¶V.,—Qûýýý÷̨œ22«ÞóùøÓå¿›-MØÄüüû÷Ì»±s3«²²²ÞêÙ¢-p*Ì÷÷òͼ»¬r²Ü°««œA—*¨íñÀÀ¾¼¬Ýݰ«s5 ‘ #a»¼¾¾¾ß²œ5â(00@@# wàpØ“†{†”àÿÿÿÿÿøÿÿÀÿÿÿþ?øððàÀÀÀ€€€€€€€€€€ÀÀààðøü?ÿÿÿ€ÿÿðÿ(0`€ 4<$C)I2F,#Q. K3'V7$G55Q95b<*j>2UG]PYN6hD+jI6tK2xR7qc/F$W '^+4pFœt.Ža;†YE“YI’[Sˆ`H˜hD˜rN†kZdXšxU¢kF§sJ¶xN£vY´{R™Wv¢Y|‡ih‰vh’{jˆls„xv–yy·ng¥|c©iz¢}qÂvmµ„ ´‰¹’ÆÕ†Í’Ë—ÿŽî›ü—ÿ‘è§ÿŸ&þ3Ų=Ú²>þ¥:¨€Iª€V´„\–ƒh™†w«h¸Šf¿’i«‰y³ˆv·’wÄ…[û²Fþ®_Æ‹eÊ“iÄšwÓœrĨl˼fÅ®~ß¼yþ´cáºqßÃl7BT\…[d›`dƒmp„MY¹Wd¨kv±mzÉœY€¦\†…y€—z€³l‹Â{™Ä{¡{ƒ‰|ƒ§v½~‡Ñ‡†‡—„‡…ƒ˜’Œ—™–—©‰„·‰ƒ«”½”‰¸Ž’§™˜¾–•·¦ƒ‘•¯¦˜¥¾• š ¬§¦¦µª©µ±¯¬¦³¸··Æ†‹Ò…€Ã™†Þ‘ˆ–ÐŒœÁ—™å™˜É¥‡Ô¨‡Ûº‡Ë¥™Ò«˜Æ±š×µ™ýº‚榚ᵖɆ¦ÔŒ¨Ì𩨔¥ØŽ³Î˜²Û—³äœ«É«£Ô¬§È¶ªØ·¨Ç¨²Ô©¸À¾½Û¶¸í§¥ô¨­å¹¨õ¶§ç¦¼÷ª³â½¹ûµ·Ü‚þņþÊ›ÝÆ­ÈÀ½Ü±åÄ«þÓ«æÆ¸öʼíнþܸ‹–Ó›¤Ù«°Ô±¹áÛ­ÊÇ·ÃÛ¶ÁżÓÛ¿×ç¦Âò¬Äã¼ÆûµÇá·Ô½ÄÚºÃäÅÃÃÔÅÈÈÈ×ÝÊ×ÖÑØèÇÆôÊÇëÑÉòÕÉëÉÓòÍÖéØÙ÷ÙÖûâÛÎÐçæÔâûÛãþççþðìþöõ£”/////¡¥¥”‡‡KHffffIK,#+/”¥¥‡gm³ÃÃÓÖØØÓÓÁÀ—L+”¥”‡•®´ÕñóôôøøøøøóóñÕÀ‘+¡£.k¯´ØÚóøùùýùñš¢óüùøóØÓ±ˆŒ£”‘¨´ÓÚôøùýýýýïgš÷ýýùøñÇÁŸ*+¡”L®·ÓÚôùùýýýý÷œT1¡÷ýüùøõñßG+¡“L²ÊÓôôùùýýþþ÷œTZZR¢÷ýýùøõñßJ+¡”G²ñÚôÛùùýýþþ÷wXZ[[ZU¡ùýüüøöÎßG+ìGsñøôøøùùýýþ÷œX[[[[[[W ¢÷ýýüøöÎÁ›,ˆi²ØôôôùùùýýþÓaoo^[[[[[Zš÷þýýüøõÎÁ¬*”žhs·ÖÚÚôùùùýýýv{{ÑÑyb\YVT`ÔýýýýýøöÙDZk-g¨´ÃÖÚôôôùùýýþýó³××ÒÑpb0#íýþþþýýüøöØÁ˜,”šN®ØñÚÙÚôôùùùýýþó³ÛÛ×Òµy5#ÔþýýþýýüüöÙâ±P+IC¨ÊÚÚÚÚÛøôùùùýùó³ÛÛ×ÒÑp5#íýýþýýüüüööÎÁ–=¡¢;h®ÊÖÚòøôøøôùùùÚ³ÛÛÛÒµp5#âýýýüýüýüøöØÃ¬PŒK@i¯´ØÚÚôôôôùøùí³ùùôÙÒµcIïýýüüüüüüøöñDz–!+ 4Dr¯·ØÚÛøôøôøøÓwÐÐÐÐxzuÇüýüüüüüüöööñÎÁ¨=¡ 3;Dqt·ÚÚÚóÚóÚóóóô÷øùøùùüüüüüüüûöüööÙÎÁ±I ”í6@Bnt¯ØÚÚÚØñññóñÚóóôøöøüöüûöööööööõÎÁ®k Æ 4@Bnr¯ÖÚØØØÓØØÕØØØñööööööööéöéüööõçÁ±mŒ¥ 4@Bnrt·ÓÖÓØÃÕÕÇÇíÎÎçõõõõéõõööööõõõòl£ 34@Bnq¨ÃÓÕÃò´´ÃÃÁâÇçÇàçéééõéõõééççǨ#Œ£ 3;@Ai“’´¯³³³ºÅÅâåâçÇççéèõéèçÙñÎÁ$‡£3;@l’¥€&‘´´²®¸¹½ÅÇâçåççÇâçÇõçõçǨ#¥36@—ŽÜ)Æ“¡¬¸º½½ÇÇâââÅçÅççççÎÁ˜N“Ô6d¤„„ƒÔ&žÅÅÅÅÅââççÅçççççŦhC” 3;mÞÜÜÜú„Þ¤‚ î%¤’áÅÅââçççõÇç½›lh?$£ ;j´íßßðúÝîßßëÜ|~Þ(žáááâçõõç⺙llN=/* 6u´Øô÷÷óêîêÜÜßÜÜÞÞ||ð} ¤äóçŬ–lh>"”dÃóùùýøôíÓÔÞëúßßúÝïƒ~ÞõçŬllNd$¡ímØùþÿþþùôÓ´£¥êßßúÝêäÝÝ߃õçè–ii7¡  hØýýþýùôô˶¿»‰…‰¾Ì¼¿¾¾åç忱h7$.ióùùùùøÙÏÉÈ­«†‹åå¾¾¹¸¼«¦–72#¥-mÚøùùôÙÏÏÉ¿¿‰¸ææÌ¾¸‹Š–¦9   -D·ÙÙÙÏÏÏèÉɹɿæÌ¼¼‹‰>2 ¤’ 3QÈÏÍÏÏæÏÍèææ¿¼¦9‡¥£- 2M§©­­­¿ÉȪO9 “” 22228>7  -¤î“ -¡ ' Œ¥íìáÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿþ?ÿÿøÿÿðÿÿÀÿÿ€ÿÿþ?ü?øøððààÀÀÀÀ€€€€€€€€ÀÀÀÀÀààðøø?ü?þÿÿÿ€ÿÿÀÿÿðÿÿø?ÿÿÿÿÿÿÿøÿÿ(  @ÚÚÚ$­­­S˜˜˜k”””n¡¡¡`ÈÈÈ7ìììááá—‘’‹›ˆ}Ý¿¤š÷ͳ ûʰ¤û®—’÷yljájii£ÁÁÁ=õõõ ÍËÌ:ŸŠƒÒݾ¥ÿõÙÐÿýæãÿÙðÿŠzgÿðÙ×ÿòÓÍÿÁŸ ýaVYÚžžžbôôô ââ⢉„Üê̼ÿøÝÒÿþéæÿã϶ÿç›ÿÛÿ‰z`ÿóÝÞÿö×ÙÿϪ¨þaUVßµµµJ«™•¢Ø²™ÿñÕÅÿûáÚÿÿêçÿà‡ÿÿ¼nÿÿœ(ÿ¹Ž0ÿëÙÛÿþåéÿóÐÑÿÁ™þ^[[¸áááÛÙÙ.¡|eôäÁ±ÿñÒÁÿ÷ÚÒÿüãßÿãÎÂÿÿÚµÿÿ¾ÿŸˆlÿþçëÿÿäèÿûÚÞÿá¼¹ÿ|e`ð©©©V²¨¤sxP7ÿÂkÿçÁªÿòÕÇÿñÔÎÿãɽÿíÒ·ÿðǦÿÙ»°ÿýÝæÿúÙãÿøÕÛÿéÅÅÿ±ƒýzyy›ˆ‰^;'ÿ‘_>ÿÇ`ÿ๠ÿåǸÿáĸÿâûÿêÉÆÿñÌÔÿñÌ×ÿîÉÕÿðÌ×ÿìÇÌÿÇ¡‘ÿplhª‡‘L/ÿlF.ÿ•b@ÿ­…mÿ³§¥ÿ¼§™ÿÒ²™ÿϤ§ÿÚ±½ÿß·Äÿã»Èÿæ¿ÊÿçÀÉÿÛµ°ÿsnj¬™Š‡D+ÿZ:%ÿ~T5ÿ›ŽÿvƒÀÿ}„¨ÿˆŠ¡ÿ”{–ÿâ³ÿÚ²¾ÿݶÁÿáºÄÿܲ»ÿ°†uÿ}xt›¸¯±bB)þY;$ÿµpÿäÑÎÿÛÏÒÿµ·Ñÿ¦´Þÿ–›Éÿps£ÿ„ƒ¤ÿ¬ ³ÿã¾Æÿ¹Ž‰ÿ˜s[û¢¡¡eëêëT?:êV9#ÿâǸÿÿøöÿûçáÿÞº¥ÿÉ ²ÿ̱ÔÿÀ¼ßÿª±ßÿŽ¿ÿÝ»½ÿ±†qÿˆt_ÙÜÜÜ"­¥¨vI0 þ¢ÿþñïÿýæáÿî¼°ÿÄ~ÿ¶q“ÿä­ÀÿÜ»ÐÿÓ¶Íÿ—ŒÿzZEû¦¤¤gymq·[?+ÿÖ² ÿû×Ïÿû¸¸ÿ꟫ÿ׌ªÿæ »ÿÉ‚£ÿ§nnÿjK:ýŠ…ƒšóóó õõ÷ —–R72÷xI>ÿ»ztÿψ…ÿÒ‘ÿ¢jqÿ`<5ÿO<7率¡yóóó ØØÝ4‹„Ž™eTPÉZGA×bNFÔfWUÆŽŒÙÙÚ+øàÀ€€€ÀÀð( @ €ôôô çççÛÛÛ#ÒÒÒ,ÌÌÌ2ËËË3ÌÌÌ2ÑÑÑ-ÚÚÚ$èèèòòò ëëëÎÎÎ0©©©Uƒƒƒ}mmm–ccc£___ª^^^«^^^©ccc ttt’’’l²²²LÒÒÒ,êêêòòò ÍÍÍ1™˜™jsoo¤ofdÕxu횃rô¦Žr÷®•tøª’{ùž‡zøˆuoõ`VVëNII×QQQ¸uuu‹¥¥¥YÕÕÕ)îîîæææ°°°Nrnr«†qræ¶—„þÖ³žÿçÈ»ÿíÎÅÿðÒÊÿòÕÎÿñÕÏÿðÒÌÿìÍÆÿãļÿŦžÿ‚opøHBDçGGG¿}¾¾¾@çççÖÖÖ(|…rwß¡„ÿܽœÿêÌ»ÿóÖÎÿúÞÚÿýãáÿýåäÿÚÅÄÿ‹~}ÿ˶µÿûßÞÿúÞÚÿñÓÍÿã´ÿÈ¡ ÿ~flú<9;Þ]]]£¥¥¥YÞÞÞ ×××'Œ†‹”–{uíѬþæÇ­ÿñÕÅÿùÞÕÿþåâÿþêèÿýëêÿâÓÏÿ¬Jÿx_ÿ\UQÿÍ¿¿ÿüçæÿýâßÿõÖÓÿéÆÅÿ×±¯ÿ}…ýMDHèTTT°   ^ãããèè芋—wyóÜ·¨ÿèɱÿòÕÅÿúßÕÿþåàÿÿëèÿþíìÿãÕÏÿ½OÿíœÿíšÿˆgÿhaZÿÏÂÂÿüççÿýââÿ÷×ÚÿìÊÊÿ×°®ÿ§‚‡ýMDGêWWW¬³³³Kéééôôô °°°X‰jaòÙ·©ÿò×ÍÿóØÉÿøÞÑÿýãÜÿÿèäÿÿìëÿçÙØÿÄ¡Gÿõœÿÿ˜ÿÿ˜ÿ÷›ÿ”pÿ[VUÿÖÇÇÿüæèÿþâäÿø×ÚÿêÆÃÿÔ®ªÿ¡€ý@;<çnnnÈÈÈ6óóó ÑÐÑ2ŽwvÓÄ•pÿãÀ­ÿðÕÅÿõÚÍÿùߨÿþäÞÿÿèåÿÿìêÿѼkÿð¶Mÿÿ²Pÿÿ¡.ÿÿÿÿŽÿò™ÿ¦‹ÿ¼°¯ÿùåêÿÿçìÿþàäÿ÷ÔÖÿéÃÀÿÓ¬¦ÿ’svý999ÒqÝÝÝ!ïï˜‰­ˆuüײšÿäÁ¬ÿíνÿòÕÇÿøÝÕÿþãÝÿÿçäÿÿëèÿöäÑÿË´’ÿÿѤÿÿË—ÿÿµkÿÿ2ÿ—kÿ¶¨ÿ÷æçÿþêíÿÿèìÿÿäèÿûÚßÿòÎÍÿà»·ÿÀ™ÿZLMóYYYªºººDòòò ÏÎÎ8ŽtmÙ›}ÿåúÿë˼ÿïξÿóÖÅÿöÙÐÿúÞØÿþäàÿþèåÿÿëèÿÇ´¡ÿÿݺÿÿÖ®ÿÿÇ”ÿÿ´iÿ‰k2ÿ³¦¦ÿÿêíÿÿéëÿÿçëÿÿäçÿþÝãÿ÷Ô×ÿêÆÃÿÒ¬¥ÿ–tkýD@@Õqãã㨠 z†aLû­€^ÿׯšÿéȶÿïξÿóÔÅÿõØÍÿöÚÒÿùÝÙÿüáÞÿþåáÿdzŸÿÿÞ¼ÿÿ×°ÿÿÇ•ÿÿµiÿ‹l3ÿ´£¦ÿÿæìÿþäéÿÿäèÿÿâåÿþÝãÿùØÛÿîËËÿܵ°ÿ¼“‡ÿYLKðfffœÎÎÎ0ððð€mlÅnK4ÿ‘bCÿÀhÿ×­ÿèİÿñÏÁÿô×ÉÿóÖÌÿô×ÑÿöØÕÿ÷ÛÙÿÀ¬ŽÿìÔ®ÿëЫÿ쿘ÿì±vÿ¢„OÿÖ¾ÄÿÿáêÿþßèÿûÛåÿûÛåÿüÚàÿù×ÚÿïÍÎÿá¼¹ÿÌ£˜ÿˆjcúLLL¼´´´Jæææt\OàdA,ÿ~T8ÿ©uMÿÇ‘fÿÙª…ÿéDzÿñÒÂÿðÓÅÿìÐÈÿîÑÊÿðÒÎÿçÊÀÿíÑÀÿïÓÃÿóÕÆÿöÖÅÿñÑÉÿúÚâÿýÛäÿûØãÿù×áÿöÕàÿöÐÜÿóÑ×ÿïÍÏÿåÀ½ÿѪ ÿ¢ƒrþLHGÔaÝÝÝ&aL<æY9%ÿmF.ÿ\<ÿ¬rJÿŇ\ÿÖ¢~ÿçÄ®ÿìκÿè̽ÿåÉ¿ÿåÉÀÿåÈÁÿæÉÃÿçÉÅÿíÏÊÿõÔÎÿôÐÖÿ÷ÓÜÿöÒÜÿóÐÜÿòÎÙÿñË×ÿïË×ÿóÏÚÿñÌÓÿæÀÀÿÔ¬£ÿµ’zÿTLFào×××1VA2éQ3!ÿ`=)ÿzN3ÿ‘^>ÿ­rLÿÃ[ÿϘwÿÞºŸÿåűÿâòÿÞ¿²ÿݾ¯ÿݽ¯ÿÝ¿¶ÿàÀ¼ÿåÁÃÿìÄÍÿîÇÐÿïÈÑÿêÆÑÿêÅÒÿìÅÒÿïËÖÿðÌ×ÿðËÖÿéÃÉÿÖ°ªÿ½–|ÿULC䉉‰uÓÓÓ9N:.ëI-ÿV5#ÿiD,ÿ}R5ÿ“_@ÿ©qJÿ¹€Xÿ¼”}ÿı§ÿÞ­ÿÚ½©ÿÖµ™ÿÔ³—ÿÓ²ÿÔ²¤ÿÕ¬·ÿß·Áÿà¸Ãÿß·ÅÿáºÈÿå½ÊÿèÂÍÿêÅÎÿëÄÏÿçÁÌÿæ¿ÈÿæÁÃÿЩœÿ]RJ刈ˆvÔÔÔ7L9-ëC'ÿM0ÿ]<'ÿmG/ÿ‚T8ÿ–d@ÿ¨vMÿ—Œ’ÿ“§ÿ›•šÿyx…ÿȳžÿÒ³“ÿϯŸÿÈ’ÿÌ“°ÿÒ¥·ÿ×°»ÿÜ´ÀÿÞ·Ãÿß·Äÿß·Äÿà¹Äÿã»Çÿæ¾ÉÿèÁÈÿæÁÄÿΨœÿ\PIäqÚÚÚ.O=2é@'ÿH-ÿV7$ÿb?)ÿsK1ÿ‰\:ÿ¬„_ÿ€ˆ¼ÿÃÿ=HŒÿ-6jÿ©©²ÿvuˆÿ–™ÿ¯™ÿÊ®ÿΜ³ÿÕ­¸ÿÛ³¾ÿݵÁÿݵÁÿÜ´ÀÿݵÁÿâ»ÅÿæÀÉÿã»ÂÿÇ›ÿ¨€fÿVLBÞ———gããã XD;åA'ÿH/ÿS5"ÿ]<&ÿmG-ÿa<ÿ¹ž‹ÿ†Ïÿz…Ðÿ¡°áÿ{ˆÆÿ¢¨¿ÿR\˜ÿ½ÂËÿ07cÿ§˜®ÿ¥’§ÿÄ«ºÿÔ­ºÿÚ³¿ÿÝ·Áÿà¹Äÿã¼Æÿä½ÅÿÝ´¾ÿÈ›¤ÿ±…wÿžxZÿ\TMÑ©©©UñññjRT×?&ÿE+ÿQ4 ÿ`A'ÿ†\9ÿ¿”oÿ×À®ÿËÇÛÿÌÉØÿÎÌ×ÿ¶¾Ûÿ¡¬Øÿ °Ýÿ˜¤ÒÿHT£ÿ§«Èÿ6>qÿ|}–ÿ”«ÿ—Ž¢ÿÉ´ÀÿëÌÒÿìÉÏÿÜ´¾ÿØ¡ÿ±…~ÿ­€mÿmTýeb`¶ÆÆÆ8Œƒ¡A+!þB)ÿN2 ÿeD*ÿ®…bÿäÇ·ÿöÜÔÿøâÜÿòÙÑÿßÍÉÿÔýÿª­Ôÿ¶Ãåÿ¬¸ãÿ¼¾àÿ«®ÚÿNZ²ÿ¾¸ÒÿX`˜ÿ„‰ªÿy|›ÿ„‚žÿéÇÐÿÛ³»ÿ¼’Žÿ´‡wÿª~_ÿ{bLñ|{{‰ááá¼ÀTR>;ð?'ÿJ0ÿkH-ÿÆ¥ŽÿùâÛÿÿóñÿÿõóÿþìèÿôÙÐÿâÁ­ÿÌ©šÿΰÿżÝÿÎÀÝÿ­°ßÿ–ÙÿÎÉãÿ˜¢Ùÿ¬²Ûÿ\e§ÿpt£ÿèÈÐÿ׳³ÿ½“†ÿ´‡pÿ®†YÿncYÕ©©©Uóóó ïïï}mv¼B+ÿB+ÿcB(ÿʨ‘ÿþìçÿÿûùÿÿüûÿÿóðÿúãÝÿìνÿà°‘ÿÇ…ÿÖ”­ÿàž½ÿ×·ÖÿØÈÞÿÄÃâÿŸ§ÝÿÅÊéÿ˜ ÙÿÓÆÙÿãÀÆÿÓ°«ÿ³‰uÿ uXÿ‰lQü{yx“×××'ÌËÍDYFEòB*ÿS7!ÿ¯‹nÿûäßÿÿöôÿÿøöÿÿñíÿüâÝÿïÑÁÿ鯠ÿΊÿŸ]xÿ Y|ÿ̇¨ÿå²ÃÿíÇÔÿâÔàÿÄÁáÿ¢¤ØÿßÈØÿâ¼½ÿ–†ÿ‘gOÿ~\Bÿhb^Ͷ¶¶Iôôô öõö ˜—•G0&þG.ÿ|X<ÿàÁ³ÿþéæÿÿíëÿþèåÿúÞ×ÿôÉ¿ÿí§¢ÿ㛢ÿ¿u‘ÿœYÿЊ©ÿÞ›´ÿÞŸ¶ÿâ§»ÿè²Åÿè¾Îÿ㯸ÿΡšÿ“hQÿpO8ÿhVKò”•–nææææçèh\eÑF0$ýN3 ÿŽgIÿëËÀÿûàÛÿýáÜÿúÜÕÿû½ÿõ®³ÿé ©ÿÙ¡ÿ¯dÿ㜹ÿê¦ÁÿÛ•²ÿ̆©ÿÑ‹¦ÿɇ“ÿº}ÿzQBÿnM8ÿiSFö{{}œÙÙÙ%ÒÒØ7cVb×F/#ÿK2ÿ‘iIÿß²œÿøÏÁÿþÐÉÿÿ¼¸ÿþµ¹ÿø®µÿÿ׆¡ÿò©¿ÿñ«ÂÿᘷÿІ¬ÿ·sÿ¤kfÿtJ@ÿ`@.ÿbLAùxx|¦ÎÎÎ0ÙÚà-}xµQ:3ýD)ÿY1%ÿ„M=ÿǃyÿÿú«¬ÿý¯·ÿü®¸ÿú´½ÿûµÄÿäž´ÿʈ˜ÿŸghÿj@3ÿJ-!ÿG-"ÿn\V팕†ÙÙÙ%ëìí¢¡¶vcS[âI/-ýC'ÿP-"ÿvD9ÿVHÿŸ`Qÿ£dSÿ¬nbÿ§l_ÿ}LHÿ^71ÿ?%ÿ:$ÿE32øebidz³´XæææÕÕÝ7•‘ ’\NZßC/0ø;$þ<#ÿ>$ÿA%ÿI,ÿJ- ÿ?%ÿ7#þH83òb\dÊœ› xÖÖÖ,ööö àäæ'¬¯Æd˜‘Š„zvŸwmj­qhd³ulh¯tp¤‹~––‘™…¶¼ÁUâââõõõ ÿàÿÿ€ÿþ?üøðàÀÀ€€€€€€ÀÀàðøü?ÿÿÀÿ(0` €%óóó íííèèèãããßßßÝÝÝ!ÜÜÜ"ÜÜÜ"ÝÝÝ!ßßßãããèèèïïïóóó óóó èèèØØØ&ÄÄÄ:³³³K¦¦¦Xa———g”””j“““k“““k•••išššd¤¤¤Z±±±MÄÄÄ:ÓÓÓ+àààëëëóóó ñññ àààÈÈÈ6¬¬¬Rnsssbbb¡WWW¯RRR·PPP½OOO¿NNNÀNNNÀMMM½PPP·WWW­eeezzz…n©©©UÂÂÂ<ØØØ&èèèóóó õõõãããÅÅÅ9¡¡¡]{{{„```«f`cÎufgá}kcêƒp_ï‹w^ó“~`õ•aö’~göŒyhõƒoeôtd_ñ`TTìC@@á@@@ÏLLL¼```¡}}}žžž`½½½AÜÜÜ"ìììõõõ ïïïÔÔÔ*§§§Wzzz†d`c»zklã“ysñ°“}ûÈ©þÓ´¦ÿÚ¹§ÿß¿ªþãÅ®ÿåǰÿ䯳þà²ÿܼ°ÿÓ³ªþŨ¢þ«ŽüŽuxøZONñ555ßAAAÊYYY©|||ƒ¨¨¨VÌÌÌ3äääóóó æææÃÃÃ;‘‘‘mb`b²~jwí§†øÄ¢…þÕ³™ÿß¿­þêÌÀÿïÑÉÿòÔÌÿôÖÐþõØÓÿöÙÔÿõÙÕþõØÓÿôÖÑÿñÓÎþíÏÉÿçÉÀÿÛ¼±þĦœþœ†ü\PTõ545ä???Èdddš‘‘‘m¼¼¼BÜÜÜ"ïïïôôô ÚÚÚ$«««U|y{’rdoç­|þϬˆþÚº•þäŰþìÏÂþòÔÌþ÷ÙÕþûÞÚþýâßþþäâþüãáþáÊÉþ­››þº¨§þéÐÏþüÝÝþûÝÛþ÷ÚÕþðÒËþçÉ¿þܹ¥þÌ¡žþ™y€þKBEô656ÝJJJ·wwwˆ©©©UÒÒÒ,ìììôôô ×××'¢¡£cupq°‘yyðÁšŠþÙ·ÿãÆªÿëмþòÖÇÿøÜÒÿûàÝþþåâÿÿèæÿÿêèÿüééþáÑÑÿŸwÿYN6þNHHÿ¤—–ÿê×ÖþýçæÿýäâÿúÜÚþõ×ÐÿëËÅþཹÿÒ«§ÿ¾• þjWaú=89çBBBÄmmm“¡¡¡]ÏÏÏ/îîîÛÛÛ"¤£¥cylu”vsöÈ¡‰þÛ·–þçȰþîÑ¿þõÙÌþúßÖþþãÞþþèåþþìéþþìëþüëêþçØØþ±¡‚þ´‰þ§}þE<þUPPþ¯¤¤þìÜÛþýèçþþäãþüßÝþõÖÕþîÌÍþæÂÂþÙ³¯þÀ—ŸþgnûF?Cì???Êiii–£££[ØØØ&ïïïèèè­¬­WthqÅ•swùÑ©›ÿá¿¥ÿçȯþîÒ¿ÿõÚÌÿúßÖþýãÞÿÿèäÿþëéþÿîìÿüíëÿ娨ÿ¸§þÄ•ÿî›ÿî›þµ„ ÿYKÿ]XWþ±§§ÿíÝÝÿþêêþþååÿüßßþ÷ØÚÿðÎÐÿçÅÄþز¯ÿÀ–™ÿnvüG>Cí???Ênnn‘²²²LÝÝÝ!òòò ðððÆÆÆ8slq·„fbúЫŸþìÌÃÿíпÿïÓÁþõÙÊÿùÞÓÿýãÛþÿæâÿÿêçÿþìëþýîìÿæØØÿÀ­€ÿÏšþõÿÿœÿþœþøÿÆÿ]PþZUVÿ¬¢£ÿïÞÞþþèèÿþäæþüàâÿøØÛÿðÏÐþäÀ¾ÿÖ±«ÿ¿–•þ‡jmü?::ìAAAÃ}¾¾¾@åååöööØØØ&ŽŒŽˆŒidøÀ™|þèÈÀþóØÏþôÚÌþõÚÌþøÝÑþûáØþþäÞþþçâþþêèþþììþíÞÝþ¼«ˆþΘþùœþþ˜þþ–þþ–þþ–þúšþÍ’þQDþXSRþ¹¬¬þðÞßþýçéþþäçþýÞáþù×ÚþïÌÊþã¾¼þÕ¯«þ¼•”þ|eiü634æRRR­”””jÎÎÎ0íííçç稧¨cŽqw빉cþÕ­“ÿèÇ·þñ×ÇÿôÙËÿöÜÐþøÞ×ÿýãÚÿþäßþÿèäÿÿëéÿþìëþÜË«ÿÚ²>ÿû²Fÿþ«>þÿŸ&ÿÿ”ÿþþÿŽÿÿÿü–þè§ÿqc/ÿ¡——þæÕ×ÿýèîþÿèìÿÿäèÿþÝâþøÕØÿðÊÉÿ㾺þÕ®§ÿÁ–›ÿgU[ü333Úcccœ¨¨¨VÜÜÜ"óóó ôôô ÈÈÈ:…w}¹¤~fûÉrþد–ÿæÃ¯þìϼÿðÔÄÿõÙÌþøÞÖÿýãÜÿþäßþÿçãÿÿêçÿþíêþ˼fÿßÃlÿâ¹rÿþÉŠþÿăÿÿ¹jÿþ3þÿ‘ÿÿÿÕ†þ¹’ÿŲ=ÿÍÀ¼þõäçÿþêíþÿèíÿÿæêÿþâåþûÙÞÿõÑÒÿìÇÄþÞºµÿ̦œÿª„þ>8:ðCCCÃ}ÃÃÃ<êêêää䞘œ}’tléÁœ‚þÙ¶¢þß»¨þçİþíÌ»þðÑÁþòÖÈþ÷ÛÒþûáÙþþãÞþþæâþþéæþþëèþþìêþâÒËþǰ•þþÕ¯þþÒ¥þþΟþþ‡þþ®_þþ 7þœkþndTþÑÃÃþþíîþþìîþþêíþþéìþþçêþþãèþýÝáþøÕÙþñÍÌþæÁ¾þÖ¯ªþ½–‹þeeü434ß^^^£¥¥¥YÜÜÜ"ôôô ÈÇÈ>Šyz½¡{eüͨŒÿäÀ¸þêÊÁÿêʹþî̼ÿñÒÁÿó×ÇþöÙÏÿøÜÔÿûßÚþþäàÿÿèäÿþéæþÿëéÿãÒËÿȳÿþݽþÿÛ³ÿÿÔ¬ÿþÉ™þÿ½‚ÿÿ²aÿœt-þndUÿÑÁÂÿþëîþÿêìÿþéìþÿèëÿÿçéÿþãçþþßäÿûÙÞÿõÒÓþìÈÆÿÞ¹¶ÿË£›þ£}pþRFGòDDDÃ{ÇÇÇ7îîîííí©£¦sˆk_ê¦yZÿÆ›|ÿߺ©þëʾÿíοþðοÿñÑÂÿó×Çþõ×Îÿ÷ÛÒÿøÜÖþûàÜÿþäáÿþçãþÿéæÿãÐÈÿdzœÿþÞ¾þÿÜ´ÿÿÔ­ÿþÊšþÿ½ÿÿ³bÿt.þndUÿѾÂÿþçíþÿèìÿþçêþÿçêÿÿæéÿþâæþÿßäÿüÛàÿöÕØþðÍÌÿ俼ÿÔ­¥þ·€ÿ|b]ú444Ûeee›¯¯¯OåååÙÙØ*‚€¨|YHýeGþ°^þÍ¢Šþ຦þéÈ´þíͼþðÑÀþóÕÆþô×ÊþõØÏþöÙÑþ÷ÛÖþùÝÚþûÞÜþýãßþãÌÃþDz›þþÞ¾þþܵþþÔ­þþÉšþþ½þþ²aþu/þpdVþѽÁþþåëþþäêþþâèþþãèþþâçþþàäþþÝãþýÛßþùÖÙþñÏÏþçÂÁþÙ±¬þÅ’þ¢~rþSHJîPPPµ˜˜˜fÚÚÚ$¿ÁMp\YÛkJ5ÿV:ÿœlIÿ½eþÏ¥…ÿݶþèűÿïνÿóÐÃþõØÉÿô×ËÿóÖÍþõ×ÑÿöÙÔÿöÙÖþ÷ÜÚÿàÆ¾ÿŰœÿøàÒþøâÕÿøÚÎÿøÊ¼þø»¤ÿù±†ÿ¨€Iþ•„vÿ߯ÎÿþâêþÿáêÿþßèþüÜæÿýÜçÿýÝåþþÜâÿüÚßÿù×ÙþòÐÒÿèÄÄÿÝ·´þϨžÿ¸Ž‚ÿoXUö@@@Ê€€€~ËËË3·¯¯ejMCøeD.ÿuN5ÿŽ_Aÿ°{SþÇ”hÿÒ£€þßµ™ÿédzÿðÎÀþòÕÆÿó×ÈÿðÔÉþðÔÌÿòÕÏÿôÖÑþô×ÓÿáÇ»ÿÅ®~ÿÝÄ‚þÜÄÿÜÀ‚ÿÞ¾€þß¼yÿá»pÿĨlþÖº³ÿöÙàÿþàéþþÝçÿýÛæþüÚåÿúÙäÿ÷×âþùÖàÿùÖÛÿöÔÖþñÏÐÿêÇÆÿὸþÓ¬£ÿ˜Šÿ€g]û><<Úmmm“»»»Côôô «£ŸscE4þ_>)ÿkF0ÿ‚V9ÿkFþ·SÿÈcþÔŸtÿà¶—ÿéȳþðÐÀÿòÓÃÿîÒÄþëÏÆÿìÏÇÿíÐÈþîÑÌÿîÐÌÿïÑÍÿðÓÎþñÕÑÿóØÔÿ÷Ú×þùÛØÿüÝÙÿûÛÛþüÛáÿûÜäÿüÚãþûØâÿùÖáþùÖàÿ÷ÕßÿöÔÞþõÎÜÿôÏÙÿñÏÕþðÎÒÿëÈÇÿã¾¹þÕ¯¦ÿÇ ÿ™}kþMFCç___£¯¯¯Oñññ–‘€U;(þX8%þc?*þuK1þ‹[;þ¡kFþ¶yOþƇZþÒ™qþܯŽþèÆ³þîлþìнþéÍ¿þçËÀþæÉÀþçÊÂþçÊÃþçÊÃþçÊÅþèÊÆþêÌÈþîÐÌþôÖÏþ÷×ÐþôÑÕþøÕÜþøÕÝþ÷ÔÞþõÓÝþôÑÜþóÏÚþòÎÙþòÌØþïË×þñÌÙþóÏÚþòÍÕþëÆÉþã½»þÖ¯§þÉ£‘þªŠqþYNFíVVV­¦¦¦Xîîî”މŒM4!þS3!ÿ\:&ÿjC,ÿ}Q5þ‘]=ÿ¡iFþ¶wNÿÆ…]ÿÎ’jþتŠÿä©ÿéʵþèʸÿåǹÿãŹþâĹÿàúÿáĺÿáĺþâ¼ÿáþÿäÅÂþëËÅÿñÍÍÿòËÒþóÍÕÿôÍÖÿôÎÖþòÎØÿîÌ×þîË×ÿíÇÕÿìÅÓþìÈÔÿòÎÙÿóÏÚþòÎÙÿìÈÏÿå¿ÀþÙ±¨ÿË£’ÿ³tþ^QEðQQQ³   ^ëëëއƒ•G-þN1 ÿV6%ÿ`=)ÿsI0þT6ÿ‘_?þ¤lHÿ¶xPÿƒZþÊŒjÿÑ ÿÝ»žþäÄ®ÿãðÿà°þÝ¿°ÿܼ­ÿÜ»«ÿܺ«þܼ­ÿÝ¿¶ÿݾºþྻÿâ¼ÂÿéÀÊþëÄÌÿíÆÐÿîÆÏþêÄÏÿéÄÏþéÄÑÿéÃÑÿíÆÓþðËÖÿñÍ×ÿïËÖþïËÕÿîÈÒÿèÃÉþص´ÿΦ˜ÿ·tþ`QCòOOO¶žžž`êêꈂ~žA*þH-þQ2 þZ7$þhB+þvL1þ‚U8þ^?þ¢kHþ®tLþ»‚YþÀ†dþÆ‚þÔ¼©þÞ¯þÜ¿ªþÛ¼©þØ·ŸþÖµšþÔ´™þÔ´›þÕ´¤þÖ¶§þÕ´¯þز»þà·Áþã»Ãþã»Åþà¹ÆþáºÇþâºÉþä½ÉþèÁÌþêÃÎþêÇÐþìÇÐþìÅÏþéÃÍþæ¿Êþå¿ÇþçÁÅþܵ³þœ‡þgWHòOOO¶žžž`êêꇀ| >'þC)ÿK/ÿS4"ÿ`='þkF.ÿxO4þˆW:ÿ—cAÿ£mFþ¬vLÿºŠhÿ›‹Žþ…„˜ÿʶ¨ÿÍ»­þ³©ÿÓ»¥ÿÔ´•ÿѯŽþЭÿÏ®ÿÏ­˜þÍœ¢ÿÒ ¸ÿׯ¼þÙ±½ÿÚ±¿ÿÛ³ÁþݵÃÿà¹Æþâ»Èÿã»Èÿã½Êþæ¾Éÿç¿Ëÿç¿Ëþæ¾Êÿç¾ÉÿçÁÇþéÅÆÿçÁÂÿÖ¯¥þn]UòPPPµ   ^ìì숂~=&þ@&ÿG+ÿN1 ÿY9%þb?)ÿmG/þ{P5ÿ‹Z:ÿ–d@þ¢pGÿ³rÿ€þ~‡¦ÿ¸µµÿmp„þPUnÿމŽÿл¢ÿÔ·–þÒ´™ÿί¤ÿÈ ‰þÅŠ¢ÿÍ’±ÿÏŸ³þÓ«¹ÿ×°»ÿÜ´¿þÞµÂÿÞ·ÃþÞ¶ÃÿÞ¶ÃÿÞ¶ÃþÞ·Âÿà¸Äÿã»Æþæ¾ÈÿèÁÊÿéÂÈþçÂÆÿܵ´ÿ›‰þeUIñSSS±¤¤¤Zîî„”>(þ?&þD)þI.þT6#þ]<&þeB+þqJ1þ€S7þ_;þ¡rIþ«—þu‚¾þ‰—Åþq~°þ(2qþ$XþZ^zþ¾º¸þ‹’þ‡þ«—þ¾™þǦþËŒ¬þÌ•¯þÒ¥´þ×°¹þÛ´¾þݵÀþݵÁþݵÁþÜ´ÀþÜ´ÀþÜ´ÀþÞ·Âþâ»ÆþçÀÉþèÂÊþä½ÃþÒ§®þ½’Šþ¥~`þ\M>îYYY«ªªªSñññ–Œ‰B,þA'ÿD+ÿJ/ÿQ4"þY8$ÿ`>(þkE-ÿyP4ÿa;þ«Wÿ¬¥²ÿp}Íþn|ÊÿMY·ÿ`oºþR`¦ÿˆ“¶ÿ’—²ÿ2:sþV^ƒÿÂÃÃÿYVsþ§”ªÿÔ¥½ÿÒ¤ºþÔ«½ÿÔ®¹ÿׯºþÚ³¿ÿݶÁþÞ¸ÂÿÞ¶ÂÿÜ´ÀþܵÁÿâ»Åÿå¾Çþå¾Çÿã¼ÄÿÓ¦²þºÿ«kÿžxWþ^PBêaaa¡³³³Kõõõ ¢›™yF/%þ>&ÿD*ÿJ1ÿQ4!þY:#ÿ_=&þiC+ÿ~S4ÿšiAþ¸’vÿ­°Ðÿ†Ôþ„ŽÔÿ”ŸÚÿÍßòþjvÆÿ´¼Ìÿ¤ªÃÿ\iªþ—¹ÿÇÌÕÿ '^þGJnÿ­¢¶ÿ’ŠŸþ’ŸÿɱÀÿÓ«ºþÕ¯ºÿÚ´¿þܶÁÿß·Áÿá»Æþå¾ÈÿæÁÈÿâ»Ãþݳ¾ÿÏ¢°ÿ¿‘–þ³†xÿª€fÿ™vWþ_SIáooo’ÁÁÁ=·¯°bO62û>&þA(þG,þP3 þX:#þbC)þvO0þ›lDþ¿’iþÓ·˜þÌÈÓþ¶»áþ¸½áþÚÓÓþÈÍßþ§ÙþÈÎ×þ¢±Úþ§»âþ½ÇÙþŒšÍþ5A”þ\eœþ°¶ËþIQzþFþ™—©þ˸ÇþóÃþɸÃþÔ»ÄþáÀÉþêÉÏþîËÑþåÀÈþÚ±»þËŸ¬þ¸Ž’þ°…{þ°‚rþ©~cþ‹lTý]VRÒ‡‡‡xÓÓÓ+ËÃÈH_ELå@(ÿ?'ÿD,ÿL1þW:#ÿfD*þŽb<ÿ™rÿع¦þåȺÿíÔÌÿíÜÖþé×ÏÿäÐÅÿÄÁÕþÄÃÕÿ½ÂÛÿˆ‘Õÿ‘žÚþ¨¹áÿÙÿŒ˜Öþ«¬×ÿ¤¦Ïÿ8C“þ9C€ÿÓÐÝÿRZˆþ$Vÿ`dƒþœ›®ÿ­¤µÿÞÉÑþìËÑÿä¾Èÿ×­¸þÁ—œÿ±†ÿ²„xþ­€kÿ sWÿv\I÷^\[¹¡¡¡]ãããÞÜß*{op¹E0&þ>'þC*þK0þV8$þlI-þ¥}Yþ×¶¡þíÒÆþùàÙþüæßþûåßþøÞ×þïÔËþàÍÇþܱþȼÀþ­±×þ¸ÄãþÃÒëþ¥¯àþ¶½ãþÙÐâþ–žØþMZ¼þ…ŒÇþÝÌÝþu|¯þ[d›þ®²Èþ‰«þ/6fþ©þêÊÓþå¿ÉþÖ¯´þ¿–’þ¶Š}þ´ˆtþ­‚eþœuOþl[Kæmmm—½½½Aðððñññ£™ ‚R==ò>)ÿA(ÿI/þU8#ÿtP2þ¶’wÿèË¿ÿûäÞþÿïíÿÿôñÿþóñþÿíéÿúáÚÿîÓÈþâñÿ׳œÿÆ­¦ÿÀ®µþƾÕÿµ¹âÿ·¶ßþÔÌãÿ›¤Üÿ~ˆÒþÄÁâÿÍÅßÿ¤¬Ýþ›¤Õÿ±·Ûþgp«ÿ%/xÿ{€¨þêÎÕÿâ¾ÆÿÔ®­þÁ—ÿ·‹zÿ¶‰pþ²‰_ÿ˜yQýe^YÐqÖÖÖ(ÎËÏ@tfhÊE/&þ>&ÿC*þO4 ÿsN0þ¾™~ÿó×Íÿþíéþÿ÷öÿÿüûÿþùùþÿóòÿþëæÿöÜÕþêÍÁÿá·œÿÏšÿÁ‹ˆþØ¥¸ÿݲÌÿÛ­ÊþÛ¿×ÿ±¶âÿª±áþÛ×éÿ¤©Üÿ„ŽÔþ¤¬Þÿ¹¾ãþ™Òÿw€½ÿÄ»ÒþêÉÑÿß¼¿ÿÑ®©þ¾”†ÿ¯ƒoÿ¬dþ©€Uÿ„nUîjij¡³³³Kêêêîîš’T>>ö>)þ@(þI1þjF*þ¸“wþôÙÎþþñìþþúøþþüüþþûúþþõóþþíéþøÞÙþðÓÅþèÆ§þⲑþˉ‹þÄ~•þÔŽ©þÝ”¸þã¦Ãþá·ÔþâÆÙþêØßþ»¿äþš¢ÛþÒØïþ½ÃæþŠ“Öþ¸¹ÞþæÏÙþâ¿ÇþÝ»¼þΪ¡þµvþ¢xaþšpNþ’pLý^Z\ØoÔÔÔ*öööØÚÚ0|qvÆL8.ý?(þG.ÿ[=$þ£`ÿëÎÀÿþëèþÿöôÿÿùùÿþù÷þÿôñÿÿìçÿúßÙþñÓÇÿìŪÿå§–ÿÏ‹þ§hwÿšWuÿ¢Y|þµiÿÙ—·ÿç¹ÉþêÆÏÿïÔÜÿá×åþÉÇãÿ¦ªÜþ~‡Ðÿ©¨×ÿåË×þâ¿Áÿܶ³ÿ”„þ sZÿˆ`Hÿ^CþtbVðrrr’¾¾¾@ííí÷öö «£´qaMNîD-þC+ÿP6 þ„];ÿÕ´ ÿúàÜþÿðíÿÿôòÿþóñþÿïìÿþæâÿùÞ×þñÑÈÿð¾°ÿí§¥ÿæ¢þʇ•ÿ§]ƒÿ™Wxþ£b‚ÿЋ©ÿÝ›±þ䣹ÿê´ÉÿìÆÏþïÍÖÿíÔàþàÒãÿìÓàÿëÃÊþå·¶ÿÒ§Ÿÿ¢rZþX@ÿtR:ÿrYEþZ^c¿¥¥¥Yàààèè艋¬N70þ@)þG.þcA)þ¦cþèɽþýåàþþêèþþëèþþèåþýãÞþ÷ÛÓþôÐÆþó²«þ뢟þæ¢þÛ–¡þ¹lþœY€þ±k“þݘ³þà¶þÙ˜³þÜœ²þßž¶þàŸµþ檿þé·Çþ㮿þÝ£¦þÌ ›þ©zgþ€Y@þnM6þpS>þ_VVânÐÐÐ.óóó ÏÐÔ;cWdÚI3+ÿB+þK1ÿlG,ÿ²ˆjþòÓÊÿûàÛÿþäàþþãàÿüàÝÿùÙÑþùÈÁÿø¶¶ÿñ©­ÿ韨þᚣÿÏ…œÿ¦\‰þÁxŸÿ餾ÿë§Âþàœ·ÿØ”°ÿЋ­þ͉¦ÿ×’©þÐŒœÿȇ‘ÿ½€ƒþˆZOÿyT<ÿnM8þlO<ÿbVQíyz{”ÅÅÅ9îîî²°ºaZO^âJ5+þC+ÿK1ÿkH+þ¼pÿîÎÀÿøÚÑþýÞÒÿüßÕÿüÝÔþþÅÀÿþ¶ºÿü²¼ÿñ§°þ矪ÿä–§ÿ¼m‘þϦÿò©Ãÿñ¬Æþ碻ÿÝ“²ÿÌ‚¨þÁx£ÿÁ|™þ¾}…ÿÀ‰ÿ’]Sþa;,ÿiG4ÿfJ8þ_QNótuy¤µµ¶Jéééóóó ­«¸fYM^ãJ5+þA+þJ1þkH,þª{Yþᬔþôƹþü˾þþÇÅþþ»·þþµ´þþ¶¹þý´¹þöªµþñ¢¯þÞŒ¢þé³þø²Äþô¯Ãþ颼þÝ•·þØŽ³þÇ þ¯n†þžg_þ‚SFþV6(þZ=*þjL:þ]OMòtv|¤¶¶·Jäääö÷÷ ·ºÇVmgwÊU@;øK2$þB)ÿQ. ÿl=.þT>ÿÂvmÿ磟þù°²ÿü®­ÿþ¯²ÿþ²ºþþ³½ÿû«¸ÿ÷©´þÿ¾Ëÿû±Æÿî§½þàœ¶ÿו¦ÿÃþ•]WÿrF7þW6)ÿA'ÿE+þnTEümdb ÅÅÅ9ééé÷÷÷ÏÕØ<‡”¥]P[æJ3.þB& ÿA#þJ)ÿd8+ÿ‹T?þ·ngÿÒ…€ÿÞ‘ÿå•“þçš™ÿç™—ÿæž¡þï´­ÿ㟟ÿdžþ«k}ÿYQÿh?4þL."ÿ?$þ<"ÿB+!ÿTCCõwotÉ™Ÿ¡pÑÑÑ-îîîèé飤Äl|ryÅO;MöJ1,þA'þ>#þF&þZ2'þl=1þxF6þ„M<þŠQ?þ‹R?þ“YIþœaQþ‹VGþm@7þY3-þH* þ7 þ4þ:&þA14û^SSÝv|Š º»»Jàààôôô ööö ÔÖÚ:ž™®…qj|ÄLjëG37ýD-&ÿ>&ÿ9!þ6!ÿ8 ÿ;%þ@&ÿD* ÿF,$þD/+ÿA7Hø[elÌŽ‹Ž’±²·YÔÔÔ/ëëëö÷÷ æêíÓÓÜ3ÂÀÁJ°­¬a¡œt—““‚‘ŽŠŽ‹ŠŽ‘ŽŒ‰˜”“Ÿœšs©¥¤eµ²²VÀ¿ÃGÏÒÔ3äääòòò ÿÿÀÿÿÿÿÿþÿÿÿÿøÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿþ?ÿÿüÿÿüÿÿøÿÿðÿÿðÿÿàÿÿÀÿÿÀÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿðÿÿøÿÿüÿÿü?ÿÿþÿÿÿÿÿÿÿÀÿÿÿÿàÿÿÿÿøÿÿÿÿþÿÿÿnsis-3.11/Contrib/Graphics/Icons/modern-install-blue.ico000077500000000000000000000331161477201124000232030ustar00rootroot00000000000000(vhž è ¨î 00¨– h>!  ¨¦%( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @B)D+L/I0 V9#Y:$^;'[?+W=8`<5lF.kL;xI>xP7~T5ZHCbNJ|\Gsc^|ketjkwnq‘_>•b@™u]ƒni‰z`Šzg…xuˆ|{§nn¢jq»zt¹Ž0Ûç›ÿœ(Ÿˆl™ˆv¥k­…m±†q°†uµpÇ`Âkÿ¼nÿ¾ps£”{–¶q“Ä~}„¨vƒÀŠˆˆ›Žž–™ŸšŸŸŸ±ƒ¹Ž‰¨—Ž®™” š¯ž˜°š•¼§™„ƒ¤ˆŠ¡Ž¿¯¬ª³§¥¬ ³´³³¸µ´¿º·¹µ»Ïˆ…—ŒÁ™Ò‘¢ǡ‘Á¦Ò²™Ø²™É‚£×ŒªÁŸ êŸ«Ï¤§Ïª¨Í´¡Ê±¥Ö² Þº¥Ý¾¥Ã¢³É ²É¾»Ûµ°Ù»°Ü²»Ú±½Ý»½à¹ æ »î¼°á¼¹û¸¸à‡ÉÿÙðçÁªðǦäÁ±ã϶âûáŸåǸãɽê̼íÒ·ÿÚµ–›É¦´Þª±ßµ·ÑݶÁß·ÄÓ¶Í̱ÔÀ¼ßÜ»Ðä­ÀáºÄã¾Æã»Èæ¿ÊÂÀÀÅÁÃÉÃÁÛÏÒéÅÅãÎÂêÉÆçÀÉìÇÌäÑÎñÒÁñÕÆòÓÍñÔÎû×ÏîÉÕðÌÖëÙÛóÐÑöÙÑðÙ×øÝÒö×ÙøÕÛóÝÞûÚÞûáÚüãßúÙãýÝæûçáýæâþéæþåéþñïÿøö>T]]B;AaŸ«q ˜YBz¡¬u$#  \dV—¦¬o/%"­žP7(t—Ÿ¦‘|0&­­¥m.r—žy{sf¥©£)x_WF=gD+lH5tK5}T8-6j07c6>qYKGZTUaONxKDhTHxXFeZWjb[jddteiyrmyux”pˆg—k„M=‡Z9‘^>Šk2a<VH“_@ŠeK’eF†kT–gRžxZªsK¥hY¥y[[{ Y|ƒliŸghqi–ul…rs…|tŒzt†}‹~}’tw‘~›}¨ldº}¦‹ÿŽí›ø™ÿ2ÿ¡.¢„O¬J½O­ƒ\¹€X…€}•~„~žˆx¬„h¿”o¢ƒr­‰v Š}²†v¨‘v¬”~°—wµ’z¼•|Ä…[Ä¡Gð¶Mÿ²PÃgǃyǘvѼkÖ¢~ÿ´iì±v=HŒR\˜X`˜wv†z|˜HT£NZ²\e§pt£‚{‚~…¯d»t}ŠÄz…І„‰ŠŠŠ—‰‰„‚ž—Œ’“““›•’”™œœœ£…†¶—„¼“†¼’޹ž‹¯™¡š˜¶¨„‰ª—Ž¢–“©€ˆ¼¥’§¡ž¢§˜®¢¡¡¬¥£§§©¬¬¬³§§¼°¯¥¨¸¶®°²²²º´³º¸¹Ç…–†Ëˆ“Å›•¦ŠÙª…ʨ‘ŦžÍ¢™ÍªœÓ¬•ȳšÓ³•Õ³›ß²œÝ»æ·”̆¨Ó‰¥Ç–¦Ö”­Í—±Ýš´ã›¢âœ¸È¡ Ò¬¤Å²¤Øµ«ÄªµÔª¸ÌººÛµ¹ì¥¥ú«¬â«¹ø­·á»¹ý·ºÿÈ•ÚÁ­Ôýä­ëÒ¬ÿÓ©âóèűèȳãÁ»æÈ½ìͼ÷žÿÛ·†Ï–Ù™£Ø§«È¦ª×¨°Ýº»Ö¦´â¼¾àĺÀݶÂżÝ×·Öê¦Áñ«ÂãºÆûµÄ½Â˶ÃåÇÃÆÚÈÆÌÇÙØÇÚåÀÃéÅÂæÉÁìÌÃæÀÊéÃÌíËÌóÎÅêÒÇòÔÅñÔÌþÐÉôØËìÇÒñÌ×çÙØ÷Ø×ûâÜÆÅãâÔàûÚãýççÿñíÿöô‘|||—;NPWYXU:v—>§ËéððððéÊ¡8y›©Ìð÷ûûã<¹÷÷ðÇ¡4|™O¤ÅïöûûûîI ¹û÷ðë¶qxØ?¶Åé÷÷üûõJDD!âûûöë¶€x6¶òðò÷÷üõ]DEEE ãûú÷ê´€‘}RÄïò÷÷ûüc^_GCCDB”ûûúöç´=âV¨ÄÌï÷÷ûûò¦ÆÁeF"‡ûûûûúí¿|U[ÊÌÌïò÷÷ûü¥ÎÆÁe&“ûûüûúöç´7*K¨ÉÌïòò÷÷÷¥ÎÎÁe&“ûûûûúú뺂{+`¤Äïòðòò÷‡ÅŪfHÙûûúúúöó¿¢44 /`ŸÉïïðìðéïïòïðúúúúúôôóç¤S'/\dÄÌÌèèèèèðððúôôôôôôôê´[ )/\d¨ÇÇǶÇÇ¿æóóôóóóôôôë´[  )/L[µÂ¶©¦¥¶¶ÙÙÙÞÛëóëëêê¤  $)/{Š~j¥¦´¯¯ÙÙÙÙÜÞÞêêê¤ $K‹tg•j}…¯¯¸ÙÙÙÙÞÞêÙQ )„ÏuÖt•hàŽŽ·¸ÙÙÙêÙÙ­A.4 $RÂäääÕÖÖÑlÒkЉØóóÙ­VQ-x– KÉö÷òãÃÓÕÖ×ÓmÕiˆkzëÙ‚VQ,™ž÷üýüöÂ¥·ÚäÔÐåÐÓnoó¶‚VK9~  ûýýý÷̪š®²ÛåøÔøÐåÞ¶V.,—Qûýýý÷̨œ22«ÞóùøÓå¿›-MØÄüüû÷Ì»±s3«²²²ÞêÙ¢-p*Ì÷÷òͼ»¬r²Ü°««œA—*¨íñÀÀ¾¼¬Ýݰ«s5 ‘ #a»¼¾¾¾ß²œ5â(00@@# wàpØ“†{†”àÿÿÿÿÿøÿÿÀÿÿÿþ?øððàÀÀÀ€€€€€€€€€€ÀÀààðøü?ÿÿÿ€ÿÿðÿ(0`€ 4<$C)I2F,#Q. K3'V7$G55Q95b<*j>2UG]PYN6hD+jI6tK2xR7qc/F$W '^+4pFœt.Ža;†YE“YI’[Sˆ`H˜hD˜rN†kZdXšxU¢kF§sJ¶xN£vY´{R™Wv¢Y|‡ih‰vh’{jˆls„xv–yy·ng¥|c©iz¢}qÂvmµ„ ´‰¹’ÆÕ†Í’Ë—ÿŽî›ü—ÿ‘è§ÿŸ&þ3Ų=Ú²>þ¥:¨€Iª€V´„\–ƒh™†w«h¸Šf¿’i«‰y³ˆv·’wÄ…[û²Fþ®_Æ‹eÊ“iÄšwÓœrĨl˼fÅ®~ß¼yþ´cáºqßÃl7BT\…[d›`dƒmp„MY¹Wd¨kv±mzÉœY€¦\†…y€—z€³l‹Â{™Ä{¡{ƒ‰|ƒ§v½~‡Ñ‡†‡—„‡…ƒ˜’Œ—™–—©‰„·‰ƒ«”½”‰¸Ž’§™˜¾–•·¦ƒ‘•¯¦˜¥¾• š ¬§¦¦µª©µ±¯¬¦³¸··Æ†‹Ò…€Ã™†Þ‘ˆ–ÐŒœÁ—™å™˜É¥‡Ô¨‡Ûº‡Ë¥™Ò«˜Æ±š×µ™ýº‚榚ᵖɆ¦ÔŒ¨Ì𩨔¥ØŽ³Î˜²Û—³äœ«É«£Ô¬§È¶ªØ·¨Ç¨²Ô©¸À¾½Û¶¸í§¥ô¨­å¹¨õ¶§ç¦¼÷ª³â½¹ûµ·Ü‚þņþÊ›ÝÆ­ÈÀ½Ü±åÄ«þÓ«æÆ¸öʼíнþܸ‹–Ó›¤Ù«°Ô±¹áÛ­ÊÇ·ÃÛ¶ÁżÓÛ¿×ç¦Âò¬Äã¼ÆûµÇá·Ô½ÄÚºÃäÅÃÃÔÅÈÈÈ×ÝÊ×ÖÑØèÇÆôÊÇëÑÉòÕÉëÉÓòÍÖéØÙ÷ÙÖûâÛÎÐçæÔâûÛãþççþðìþöõ£”/////¡¥¥”‡‡KHffffIK,#+/”¥¥‡gm³ÃÃÓÖØØÓÓÁÀ—L+”¥”‡•®´ÕñóôôøøøøøóóñÕÀ‘+¡£.k¯´ØÚóøùùýùñš¢óüùøóØÓ±ˆŒ£”‘¨´ÓÚôøùýýýýïgš÷ýýùøñÇÁŸ*+¡”L®·ÓÚôùùýýýý÷œT1¡÷ýüùøõñßG+¡“L²ÊÓôôùùýýþþ÷œTZZR¢÷ýýùøõñßJ+¡”G²ñÚôÛùùýýþþ÷wXZ[[ZU¡ùýüüøöÎßG+ìGsñøôøøùùýýþ÷œX[[[[[[W ¢÷ýýüøöÎÁ›,ˆi²ØôôôùùùýýþÓaoo^[[[[[Zš÷þýýüøõÎÁ¬*”žhs·ÖÚÚôùùùýýýv{{ÑÑyb\YVT`ÔýýýýýøöÙDZk-g¨´ÃÖÚôôôùùýýþýó³××ÒÑpb0#íýþþþýýüøöØÁ˜,”šN®ØñÚÙÚôôùùùýýþó³ÛÛ×Òµy5#ÔþýýþýýüüöÙâ±P+IC¨ÊÚÚÚÚÛøôùùùýùó³ÛÛ×ÒÑp5#íýýþýýüüüööÎÁ–=¡¢;h®ÊÖÚòøôøøôùùùÚ³ÛÛÛÒµp5#âýýýüýüýüøöØÃ¬PŒK@i¯´ØÚÚôôôôùøùí³ùùôÙÒµcIïýýüüüüüüøöñDz–!+ 4Dr¯·ØÚÛøôøôøøÓwÐÐÐÐxzuÇüýüüüüüüöööñÎÁ¨=¡ 3;Dqt·ÚÚÚóÚóÚóóóô÷øùøùùüüüüüüüûöüööÙÎÁ±I ”í6@Bnt¯ØÚÚÚØñññóñÚóóôøöøüöüûöööööööõÎÁ®k Æ 4@Bnr¯ÖÚØØØÓØØÕØØØñööööööööéöéüööõçÁ±mŒ¥ 4@Bnrt·ÓÖÓØÃÕÕÇÇíÎÎçõõõõéõõööööõõõòl£ 34@Bnq¨ÃÓÕÃò´´ÃÃÁâÇçÇàçéééõéõõééççǨ#Œ£ 3;@Ai“’´¯³³³ºÅÅâåâçÇççéèõéèçÙñÎÁ$‡£3;@l’¥€&‘´´²®¸¹½ÅÇâçåççÇâçÇõçõçǨ#¥36@—ŽÜ)Æ“¡¬¸º½½ÇÇâââÅçÅççççÎÁ˜N“Ô6d¤„„ƒÔ&žÅÅÅÅÅââççÅçççççŦhC” 3;mÞÜÜÜú„Þ¤‚ î%¤’áÅÅââçççõÇç½›lh?$£ ;j´íßßðúÝîßßëÜ|~Þ(žáááâçõõç⺙llN=/* 6u´Øô÷÷óêîêÜÜßÜÜÞÞ||ð} ¤äóçŬ–lh>"”dÃóùùýøôíÓÔÞëúßßúÝïƒ~ÞõçŬllNd$¡ímØùþÿþþùôÓ´£¥êßßúÝêäÝÝ߃õçè–ii7¡  hØýýþýùôô˶¿»‰…‰¾Ì¼¿¾¾åç忱h7$.ióùùùùøÙÏÉÈ­«†‹åå¾¾¹¸¼«¦–72#¥-mÚøùùôÙÏÏÉ¿¿‰¸ææÌ¾¸‹Š–¦9   -D·ÙÙÙÏÏÏèÉɹɿæÌ¼¼‹‰>2 ¤’ 3QÈÏÍÏÏæÏÍèææ¿¼¦9‡¥£- 2M§©­­­¿ÉȪO9 “” 22228>7  -¤î“ -¡ ' Œ¥íìáÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿþ?ÿÿøÿÿðÿÿÀÿÿ€ÿÿþ?ü?øøððààÀÀÀÀ€€€€€€€€ÀÀÀÀÀààðøø?ü?þÿÿÿ€ÿÿÀÿÿðÿÿø?ÿÿÿÿÿÿÿøÿÿ(  @ÚÚÚ$­­­S˜˜˜k”””n¡¡¡`ÈÈÈ7ìììááá—‘’‹›ˆ}Ý¿¤š÷ͳ ûʰ¤û®—’÷yljájii£ÁÁÁ=õõõ ÍËÌ:ŸŠƒÒݾ¥ÿõÙÐÿýæãÿÙðÿŠzgÿðÙ×ÿòÓÍÿÁŸ ýaVYÚžžžbôôô ââ⢉„Üê̼ÿøÝÒÿþéæÿã϶ÿç›ÿÛÿ‰z`ÿóÝÞÿö×ÙÿϪ¨þaUVßµµµJ«™•¢Ø²™ÿñÕÅÿûáÚÿÿêçÿà‡ÿÿ¼nÿÿœ(ÿ¹Ž0ÿëÙÛÿþåéÿóÐÑÿÁ™þ^[[¸áááÛÙÙ.¡|eôäÁ±ÿñÒÁÿ÷ÚÒÿüãßÿãÎÂÿÿÚµÿÿ¾ÿŸˆlÿþçëÿÿäèÿûÚÞÿá¼¹ÿ|e`ð©©©V²¨¤sxP7ÿÂkÿçÁªÿòÕÇÿñÔÎÿãɽÿíÒ·ÿðǦÿÙ»°ÿýÝæÿúÙãÿøÕÛÿéÅÅÿ±ƒýzyy›ˆ‰^;'ÿ‘_>ÿÇ`ÿ๠ÿåǸÿáĸÿâûÿêÉÆÿñÌÔÿñÌ×ÿîÉÕÿðÌ×ÿìÇÌÿÇ¡‘ÿplhª‡‘L/ÿlF.ÿ•b@ÿ­…mÿ³§¥ÿ¼§™ÿÒ²™ÿϤ§ÿÚ±½ÿß·Äÿã»Èÿæ¿ÊÿçÀÉÿÛµ°ÿsnj¬™Š‡D+ÿZ:%ÿ~T5ÿ›ŽÿvƒÀÿ}„¨ÿˆŠ¡ÿ”{–ÿâ³ÿÚ²¾ÿݶÁÿáºÄÿܲ»ÿ°†uÿ}xt›¸¯±bB)þY;$ÿµpÿäÑÎÿÛÏÒÿµ·Ñÿ¦´Þÿ–›Éÿps£ÿ„ƒ¤ÿ¬ ³ÿã¾Æÿ¹Ž‰ÿ˜s[û¢¡¡eëêëT?:êV9#ÿâǸÿÿøöÿûçáÿÞº¥ÿÉ ²ÿ̱ÔÿÀ¼ßÿª±ßÿŽ¿ÿÝ»½ÿ±†qÿˆt_ÙÜÜÜ"­¥¨vI0 þ¢ÿþñïÿýæáÿî¼°ÿÄ~ÿ¶q“ÿä­ÀÿÜ»ÐÿÓ¶Íÿ—ŒÿzZEû¦¤¤gymq·[?+ÿÖ² ÿû×Ïÿû¸¸ÿ꟫ÿ׌ªÿæ »ÿÉ‚£ÿ§nnÿjK:ýŠ…ƒšóóó õõ÷ —–R72÷xI>ÿ»ztÿψ…ÿÒ‘ÿ¢jqÿ`<5ÿO<7率¡yóóó ØØÝ4‹„Ž™eTPÉZGA×bNFÔfWUÆŽŒÙÙÚ+øàÀ€€€ÀÀð( @ €ôôô çççÛÛÛ#ÒÒÒ,ÌÌÌ2ËËË3ÌÌÌ2ÑÑÑ-ÚÚÚ$èèèòòò ëëëÎÎÎ0©©©Uƒƒƒ}mmm–ccc£___ª^^^«^^^©ccc ttt’’’l²²²LÒÒÒ,êêêòòò ÍÍÍ1™˜™jsoo¤ofdÕxu횃rô¦Žr÷®•tøª’{ùž‡zøˆuoõ`VVëNII×QQQ¸uuu‹¥¥¥YÕÕÕ)îîîæææ°°°Nrnr«†qræ¶—„þÖ³žÿçÈ»ÿíÎÅÿðÒÊÿòÕÎÿñÕÏÿðÒÌÿìÍÆÿãļÿŦžÿ‚opøHBDçGGG¿}¾¾¾@çççÖÖÖ(|…rwß¡„ÿܽœÿêÌ»ÿóÖÎÿúÞÚÿýãáÿýåäÿÚÅÄÿ‹~}ÿ˶µÿûßÞÿúÞÚÿñÓÍÿã´ÿÈ¡ ÿ~flú<9;Þ]]]£¥¥¥YÞÞÞ ×××'Œ†‹”–{uíѬþæÇ­ÿñÕÅÿùÞÕÿþåâÿþêèÿýëêÿâÓÏÿ¬Jÿx_ÿ\UQÿÍ¿¿ÿüçæÿýâßÿõÖÓÿéÆÅÿ×±¯ÿ}…ýMDHèTTT°   ^ãããèè芋—wyóÜ·¨ÿèɱÿòÕÅÿúßÕÿþåàÿÿëèÿþíìÿãÕÏÿ½OÿíœÿíšÿˆgÿhaZÿÏÂÂÿüççÿýââÿ÷×ÚÿìÊÊÿ×°®ÿ§‚‡ýMDGêWWW¬³³³Kéééôôô °°°X‰jaòÙ·©ÿò×ÍÿóØÉÿøÞÑÿýãÜÿÿèäÿÿìëÿçÙØÿÄ¡Gÿõœÿÿ˜ÿÿ˜ÿ÷›ÿ”pÿ[VUÿÖÇÇÿüæèÿþâäÿø×ÚÿêÆÃÿÔ®ªÿ¡€ý@;<çnnnÈÈÈ6óóó ÑÐÑ2ŽwvÓÄ•pÿãÀ­ÿðÕÅÿõÚÍÿùߨÿþäÞÿÿèåÿÿìêÿѼkÿð¶Mÿÿ²Pÿÿ¡.ÿÿÿÿŽÿò™ÿ¦‹ÿ¼°¯ÿùåêÿÿçìÿþàäÿ÷ÔÖÿéÃÀÿÓ¬¦ÿ’svý999ÒqÝÝÝ!ïï˜‰­ˆuüײšÿäÁ¬ÿíνÿòÕÇÿøÝÕÿþãÝÿÿçäÿÿëèÿöäÑÿË´’ÿÿѤÿÿË—ÿÿµkÿÿ2ÿ—kÿ¶¨ÿ÷æçÿþêíÿÿèìÿÿäèÿûÚßÿòÎÍÿà»·ÿÀ™ÿZLMóYYYªºººDòòò ÏÎÎ8ŽtmÙ›}ÿåúÿë˼ÿïξÿóÖÅÿöÙÐÿúÞØÿþäàÿþèåÿÿëèÿÇ´¡ÿÿݺÿÿÖ®ÿÿÇ”ÿÿ´iÿ‰k2ÿ³¦¦ÿÿêíÿÿéëÿÿçëÿÿäçÿþÝãÿ÷Ô×ÿêÆÃÿÒ¬¥ÿ–tkýD@@Õqãã㨠 z†aLû­€^ÿׯšÿéȶÿïξÿóÔÅÿõØÍÿöÚÒÿùÝÙÿüáÞÿþåáÿdzŸÿÿÞ¼ÿÿ×°ÿÿÇ•ÿÿµiÿ‹l3ÿ´£¦ÿÿæìÿþäéÿÿäèÿÿâåÿþÝãÿùØÛÿîËËÿܵ°ÿ¼“‡ÿYLKðfffœÎÎÎ0ððð€mlÅnK4ÿ‘bCÿÀhÿ×­ÿèİÿñÏÁÿô×ÉÿóÖÌÿô×ÑÿöØÕÿ÷ÛÙÿÀ¬ŽÿìÔ®ÿëЫÿ쿘ÿì±vÿ¢„OÿÖ¾ÄÿÿáêÿþßèÿûÛåÿûÛåÿüÚàÿù×ÚÿïÍÎÿá¼¹ÿÌ£˜ÿˆjcúLLL¼´´´Jæææt\OàdA,ÿ~T8ÿ©uMÿÇ‘fÿÙª…ÿéDzÿñÒÂÿðÓÅÿìÐÈÿîÑÊÿðÒÎÿçÊÀÿíÑÀÿïÓÃÿóÕÆÿöÖÅÿñÑÉÿúÚâÿýÛäÿûØãÿù×áÿöÕàÿöÐÜÿóÑ×ÿïÍÏÿåÀ½ÿѪ ÿ¢ƒrþLHGÔaÝÝÝ&aL<æY9%ÿmF.ÿ\<ÿ¬rJÿŇ\ÿÖ¢~ÿçÄ®ÿìκÿè̽ÿåÉ¿ÿåÉÀÿåÈÁÿæÉÃÿçÉÅÿíÏÊÿõÔÎÿôÐÖÿ÷ÓÜÿöÒÜÿóÐÜÿòÎÙÿñË×ÿïË×ÿóÏÚÿñÌÓÿæÀÀÿÔ¬£ÿµ’zÿTLFào×××1VA2éQ3!ÿ`=)ÿzN3ÿ‘^>ÿ­rLÿÃ[ÿϘwÿÞºŸÿåűÿâòÿÞ¿²ÿݾ¯ÿݽ¯ÿÝ¿¶ÿàÀ¼ÿåÁÃÿìÄÍÿîÇÐÿïÈÑÿêÆÑÿêÅÒÿìÅÒÿïËÖÿðÌ×ÿðËÖÿéÃÉÿÖ°ªÿ½–|ÿULC䉉‰uÓÓÓ9N:.ëI-ÿV5#ÿiD,ÿ}R5ÿ“_@ÿ©qJÿ¹€Xÿ¼”}ÿı§ÿÞ­ÿÚ½©ÿÖµ™ÿÔ³—ÿÓ²ÿÔ²¤ÿÕ¬·ÿß·Áÿà¸Ãÿß·ÅÿáºÈÿå½ÊÿèÂÍÿêÅÎÿëÄÏÿçÁÌÿæ¿ÈÿæÁÃÿЩœÿ]RJ刈ˆvÔÔÔ7L9-ëC'ÿM0ÿ]<'ÿmG/ÿ‚T8ÿ–d@ÿ¨vMÿ—Œ’ÿ“§ÿ›•šÿyx…ÿȳžÿÒ³“ÿϯŸÿÈ’ÿÌ“°ÿÒ¥·ÿ×°»ÿÜ´ÀÿÞ·Ãÿß·Äÿß·Äÿà¹Äÿã»Çÿæ¾ÉÿèÁÈÿæÁÄÿΨœÿ\PIäqÚÚÚ.O=2é@'ÿH-ÿV7$ÿb?)ÿsK1ÿ‰\:ÿ¬„_ÿ€ˆ¼ÿÃÿ=HŒÿ-6jÿ©©²ÿvuˆÿ–™ÿ¯™ÿÊ®ÿΜ³ÿÕ­¸ÿÛ³¾ÿݵÁÿݵÁÿÜ´ÀÿݵÁÿâ»ÅÿæÀÉÿã»ÂÿÇ›ÿ¨€fÿVLBÞ———gããã XD;åA'ÿH/ÿS5"ÿ]<&ÿmG-ÿa<ÿ¹ž‹ÿ†Ïÿz…Ðÿ¡°áÿ{ˆÆÿ¢¨¿ÿR\˜ÿ½ÂËÿ07cÿ§˜®ÿ¥’§ÿÄ«ºÿÔ­ºÿÚ³¿ÿÝ·Áÿà¹Äÿã¼Æÿä½ÅÿÝ´¾ÿÈ›¤ÿ±…wÿžxZÿ\TMÑ©©©UñññjRT×?&ÿE+ÿQ4 ÿ`A'ÿ†\9ÿ¿”oÿ×À®ÿËÇÛÿÌÉØÿÎÌ×ÿ¶¾Ûÿ¡¬Øÿ °Ýÿ˜¤ÒÿHT£ÿ§«Èÿ6>qÿ|}–ÿ”«ÿ—Ž¢ÿÉ´ÀÿëÌÒÿìÉÏÿÜ´¾ÿØ¡ÿ±…~ÿ­€mÿmTýeb`¶ÆÆÆ8Œƒ¡A+!þB)ÿN2 ÿeD*ÿ®…bÿäÇ·ÿöÜÔÿøâÜÿòÙÑÿßÍÉÿÔýÿª­Ôÿ¶Ãåÿ¬¸ãÿ¼¾àÿ«®ÚÿNZ²ÿ¾¸ÒÿX`˜ÿ„‰ªÿy|›ÿ„‚žÿéÇÐÿÛ³»ÿ¼’Žÿ´‡wÿª~_ÿ{bLñ|{{‰ááá¼ÀTR>;ð?'ÿJ0ÿkH-ÿÆ¥ŽÿùâÛÿÿóñÿÿõóÿþìèÿôÙÐÿâÁ­ÿÌ©šÿΰÿżÝÿÎÀÝÿ­°ßÿ–ÙÿÎÉãÿ˜¢Ùÿ¬²Ûÿ\e§ÿpt£ÿèÈÐÿ׳³ÿ½“†ÿ´‡pÿ®†YÿncYÕ©©©Uóóó ïïï}mv¼B+ÿB+ÿcB(ÿʨ‘ÿþìçÿÿûùÿÿüûÿÿóðÿúãÝÿìνÿà°‘ÿÇ…ÿÖ”­ÿàž½ÿ×·ÖÿØÈÞÿÄÃâÿŸ§ÝÿÅÊéÿ˜ ÙÿÓÆÙÿãÀÆÿÓ°«ÿ³‰uÿ uXÿ‰lQü{yx“×××'ÌËÍDYFEòB*ÿS7!ÿ¯‹nÿûäßÿÿöôÿÿøöÿÿñíÿüâÝÿïÑÁÿ鯠ÿΊÿŸ]xÿ Y|ÿ̇¨ÿå²ÃÿíÇÔÿâÔàÿÄÁáÿ¢¤ØÿßÈØÿâ¼½ÿ–†ÿ‘gOÿ~\Bÿhb^Ͷ¶¶Iôôô öõö ˜—•G0&þG.ÿ|X<ÿàÁ³ÿþéæÿÿíëÿþèåÿúÞ×ÿôÉ¿ÿí§¢ÿ㛢ÿ¿u‘ÿœYÿЊ©ÿÞ›´ÿÞŸ¶ÿâ§»ÿè²Åÿè¾Îÿ㯸ÿΡšÿ“hQÿpO8ÿhVKò”•–nææææçèh\eÑF0$ýN3 ÿŽgIÿëËÀÿûàÛÿýáÜÿúÜÕÿû½ÿõ®³ÿé ©ÿÙ¡ÿ¯dÿ㜹ÿê¦ÁÿÛ•²ÿ̆©ÿÑ‹¦ÿɇ“ÿº}ÿzQBÿnM8ÿiSFö{{}œÙÙÙ%ÒÒØ7cVb×F/#ÿK2ÿ‘iIÿß²œÿøÏÁÿþÐÉÿÿ¼¸ÿþµ¹ÿø®µÿÿ׆¡ÿò©¿ÿñ«ÂÿᘷÿІ¬ÿ·sÿ¤kfÿtJ@ÿ`@.ÿbLAùxx|¦ÎÎÎ0ÙÚà-}xµQ:3ýD)ÿY1%ÿ„M=ÿǃyÿÿú«¬ÿý¯·ÿü®¸ÿú´½ÿûµÄÿäž´ÿʈ˜ÿŸghÿj@3ÿJ-!ÿG-"ÿn\V팕†ÙÙÙ%ëìí¢¡¶vcS[âI/-ýC'ÿP-"ÿvD9ÿVHÿŸ`Qÿ£dSÿ¬nbÿ§l_ÿ}LHÿ^71ÿ?%ÿ:$ÿE32øebidz³´XæææÕÕÝ7•‘ ’\NZßC/0ø;$þ<#ÿ>$ÿA%ÿI,ÿJ- ÿ?%ÿ7#þH83òb\dÊœ› xÖÖÖ,ööö àäæ'¬¯Æd˜‘Š„zvŸwmj­qhd³ulh¯tp¤‹~––‘™…¶¼ÁUâââõõõ ÿàÿÿ€ÿþ?üøðàÀÀ€€€€€€ÀÀàðøü?ÿÿÀÿnsis-3.11/Contrib/Graphics/Icons/modern-install-colorful.ico000077500000000000000000000560061477201124000241040ustar00rootroot00000000000000(†h® è ¨þ 00¨¦ hN!  ¨¶%00 ¨%^6( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxôDDDOxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @ëUî&Bó(]Ýió$~òhw[q£H|·f}¾;Ôw.èVÉ>UÞxß)kÕFãXï\ïJ{Þ_Ùh^âecã|måuyåiyöÜ=™ñ0¥ä ºÀAóLöq›·¦$å}РcûþXÞÉ~ÎüiÁ÷BéÓ}úçcüyˆ¥v„®f‹½‘á‡ø/“ð=—ÿªç¨í²ÿ&©ÿ>³ÿ^‚ÈRÍF Þq¡ÛBŸòPžön—éj¬ýz³ú ÄþÆÿÔÿÜÿ/Áÿ#Îÿ!éÿDÈÿ]ÇÿKÛÿgÔÿEâÿDìÿRáÿYïÿƒŒ¦Œ‘³¥¨®«µ¼®µ½¼¼½óŽžò‚¹êž²ø¿Ú¤ºã ½èº½˜œÒ¯ƒÎ¨‹Í´™Î¸—ڵߋ—ᙽå²ë•»ÿ«§è·§ê³©í¹´î¦·ó»¼÷À‘ÑÒœÓÛ·Òï§ßú®ÑûªÞû·Þê‘âæøãžüù‘þ˰òǼò͵þü±íý©óì»ÿ½ÂÊ»ÂÝ•Ìÿ™Ûþ¯Æó¾Áþ°Ìø¶Íþ¼×ø»Ýþ¯ãý§éÿ½ìþ§ðÿæÂÌéÂÈÃÅîÊÀìÌÓãÊÒæÖßèÏÂûÀÎûËÌÿÆ×ÿÕÓÿÝÒÿÙÕÿêÎïýÀïåÂ÷áÅþéÂþðÂóðÁûýÈúüÌüìÕøàÙÿêÝùèÝÿöÒþ÷ÙÿÞàòÛëúÛòþçåõêäþäèÿêëÿîéüííþõæõòåÿöæÿñëúñîþôíþâñü^`fe[OSk(›«§+ƒ0¶/P$z ¦¡„~,¨©ˆF&p™ žw€b†‡‰L-‹WoqytdIHJMK2RZTVXYr5DABEE1RŠUl]\":43@?|n˜švga678C. °£›‘jic9G s³®£¢•“’ƒ= _!œ³´³®®¬”} #x–¢ hÿÿøàÀ€€€€€ÀÀàø?( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwpÿðwwwwpÿðpwwwwwwÿðwwwwwwwÿðwˆwwwwwwpÿðw‡wwpwwpÿðw‡wwwwpÿðw‡wwwwpÿðw‡wwpwwpÿðw‡wwwwwwpÿðwˆwwwwwwÿðwxwwwwwwwwÿðww‡wwwwpw€ÿðww‡wwpˆˆw€ÿðwwøˆˆÿÿÿÿ€ˆˆ€wwˆˆˆˆˆˆˆ‡€ˆˆ€wwpÿÿøwwwwwwwwxˆˆˆˆ€wÿÿÿÿÿÿÿxˆˆôDDDDDOxˆˆ€ôDDDDDOxÿÿôDDDDDOxˆˆ€ôDDDDDOxôDDDDDOxôDDDDDOxôDDDDDOxôDDDDDOxôDDDDDOxôDDDDDOxÿÿÿÿÿÿÿxˆˆˆˆˆˆˆˆÿþÿÀøÿÀpÿÀ ÀÀ?À?À`?À`?À?À?ÀÀÀÀÀÀÀ€øüþÿÿøÿøÿøÿøÿøÿøÿøÿü( @€MXxT^}ë#:ÝYéPÓ?Lñ'PÈhékÍ.uô&l»KpÐBQÉLgóNmÀ`}Jº%I®9\¯;Rº2r¼KPœxV˜Ua„_p•z}‡fz”v}‘C^¤Pz¾e¾gy¸v~º9Þ 0Ò);Íê(ð-ãXÑq ÅP ê| íy/ûKÆ]ÍIÝMØPÒ3_Ê vÓ=mÈ%nÔ4eÔ4rÚCê]é[÷0Cõzêeûzúÿ%tòCTÉmYÜ[qÎDs×cfÄDgúv~þ¿ ”¯:ޱ–<®ß…î™Ì,Ÿö)‰Ñ²ä¢ö,¬»o–´Z·‚e©÷\ðmõPªÁu¡ðw°ŠƶΪêÑÒï4ÓÓ;ðú8àsÌ¡n·dÆ¡~×»XìªAþœhþ°sâþHÈñ~ÌÔWøæBìàGöøIøíWýþUôÕ{ýÿhëþváämÿølþìsøl–~‹«ŽÚó1žþ²ý,¬þSÌlŒÝV™éZŠûI˜þZ›úw†ïK­ùvªäËý/Ôÿåÿ-éÿNÍÿeÈÿ|ËÿfÚÿvÛÿVëÿoíÿ‡ˆŒˆŒ’‰—““š‡Œ¡‰‡¹‹•¶®‚¤£ˆ¼»‹µ¦§§©¦²«°¶¸¸¹óŠ—Èš¶õ²ó«¸Œ‡ÎœÊœ‡×…“Ô˜—Ö¬’Ô’¢À­°Âº½Í«§Þ‚Žè«•ó†¦å•¦ê‚°ë™²ë‰¬ÿ–§þ—¸ú§­í·§ì¶ºæ¡ ÿ¬¶ò·¸üÇ–Ðõ’ËÀ¿ÄÓºÍù¬ÔÉ›éÈŠþÖÿöŒêê’âöçíƒÿþüæšÿ÷›õƧçÈ«ÿ×¥ÿ÷øÓ¶ùö«êï³âü¹èæ¥þ÷©ýç¹úüµ÷ºÁÖ—Çî‡Åü™ÈÿŒÕÿ•Ñÿ¯Íí»Ìî©É÷¹Çû©Øý¹×ÿ”éÿ¨çþºçþ¿ñÿÄÂÈÂÆÝÜÄîÔØïÆÆþÖÆüÆØú××üíÉìåÇûûÈúéÙûõØýÆêýÚèûÚòýàæìéæüòéûçñýóòþÀÀ  Àéž›¦§§§¥˜—–À›iÄÎîîííí½¶¯!“›frÏòôôúú­¬ìð䵂 “ dlrÕòôúýýÙŸ÷÷ä·„DŸdnuËòõýýýÙ2:- ù÷ï܃DŸTmpÉ×õûûýê6===1 úøçŽ|7œ_ovÖóõûûð€„ƒ?>=0™ùü÷æ|4”NaqÊÖóõõûûëßÜÛ†@xìüüüöÝŒ? YRasÌÖõõõõûôïäãÛ÷üüøøæŒ~5“ RjtÈØóóõõõñàäãÛ÷øøøèçˆ{À¢ RjkÒÔØóóóóëºàßÚ‡«ïççèèæ’‰{OX¿¿ÂÔÔóóó××ÐÐâáãæååååå’‰}3–OV£¿ÂÂÔÔÔØÖÕϽÜÝŒ‘‘’’‘‹ˆz V¡£¤¤ÂÂÂÔÒÌŶŒŒ‰‹‰‹‹‘‘‹ˆzx¡¡¡¤¤¤¤¤¤¤Ç†Š‹Š‹ŠŠ‹‹‹‹‹ˆzxW¡¡£¢¢¢šÂÆr‚~~ˆˆˆˆˆŠŠ‹Šˆz WZ£¿¾ªU¾ce…„||~~}ˆˆˆŠˆ{3x  OVZ¿ÓªªÍªÃ¹€~~~~ˆˆ}}<.—S OXkÒñëë×Ñù°E±†~~ˆ}>9ŸÁ Q_Èñôñô×׹м¸²C³Œ~{9/ILQ_ÒùõûôôòîîÐи²·±³Œ>8/y¾HQ_Ìôûûûôôòîîíâ⺴á±ÝŽŒ=8KP^wôûûûúôððîðîíââá´á݆8#˜J\`×ûûûûúôúôððððíðïäÜ@'¦[]lôûýûýýúúýú÷÷÷÷÷ð‚'$b)]rõýýýýýýýýýýûú÷·'$­®(+gÄòûûýýýýýú÷¶F'AB**,h°ÎÐí½»G;%#¨B"&&&&&%%%$¨®®©²®ºÿÿÿÿÿüÿÿÀÿÿÿþ?üøðààÀÀ€€€€€€€€€€ÀÀàððøüÿÿÿÀÿÿøÿ(0`€ SYrÔ-ì$:·Iº'P·k¬1jÖZèRÅ Dñ'QÑ wémÃ'j÷,u³HmòPgòjy>¬]¸v°/Q3bG±;X²5g±ER•pQNn•qx‰M[±oP¦Mk³pq®Ö4Ü ,Î'9É ç/ ï.ç.#úLÕp ÑN-ÒJðiôNÏ/PÊ rÕ(kÉRí#Iøk÷)uöROÚiPÎVqÈfuÊs~ÎLXý~AþWzömxþµ‚˜/ž§;Ф±Ñ–êÊ'„ø'×®æ´Ä3 ô)®²\“l“»a‰I²­J²—j¨“}½¥l®õNòv‘÷K±óq­– ѲØ‚ ï©ð‰%ý«.þÆÉØ!Ùð4×È.óõ=í¬ZĹWÄ£W׆kÆ‹pÇ•zĦx̸zϬeÛ¯}ݳNô‘`þ£}â»ló zþ¿{ÿùNÑ÷nÊß@èÊE÷ÜAðÉVýÜ^ýôNõÄjþÔaÿ×|üño÷s‰®‹×÷0þ²û*«þY‘Îk“×N£Ür­ßQ—ýpƒî~œät˜þP®úp²ôÎþ-Ïþæþ)éþNÔþqÌýNìþlðþ„…‡…†˜—˜˜½€—ƒ‡­˜†ª‹•¦—˜¦ƒ„¼™Šµ‹•½³Š´©©©¬¯²¦°º··¸ó‹—Ñœ²ô®Ð¯ºó¬¹ŠÄ•Ç“žÌ‚ŠÖš‡ÚšÑ–Þ­ŽÒ•¥Í¹³Ë‰œã——ㆈü‰—ù™œù¸ì¨—亞⬎þ§Ÿþ¶šú޳ò©¬æ¹¦í¨²í¹¹è©§ü¸¨þªµ÷·¶øö”ËÍ·Ê÷¬ÑÉžíÝšãÈ‹ýÛ„ÿÍœþÚ™þð’õÇ®èιêÚºì¯ô×§ûÆ»ôÖ¸ùô³ó½ÅÕŽÐþ¸Ñì¥Çú¶Åû§Õþ¸×þŠéþ±èýÂÃÄÞÆÊÇÈØÏÒ×ÐÔÙÆÍêÜÇìÄÑìÙÕêÆÆýׯþÇ×ü×ÖýêÇìîÕîèÆüúÇúè×ûõ×üÓêüäåìéèüóéûçòüôóþæ§¥¥¤¤¤¤¥§ææ¤¡¡SS®®S­ œ™˜š¤æ§¡jm¼ÁÁÈÈÈÈÇǸ¸°­™˜š§æfqÐÒÛðððòòòñïïáǺ‹<™˜šfy~ÒÙð÷÷ûûûûë¶èñòñáà?;˜¤æTn}~ÓÛõ÷÷ûûûþúœ˜ÝùûñãàŠ?"š¶dwz~ÓÜõøûûþþþú¢™éûùòãáŠ7"š§ex{zÔÙõøûþþþþúµ144šéýýùãâÞŠ7:šÌQvxzÔÔõøüüüþþú¯16664šéûýùãâ•…7:šQv{{ÔÜøøøüüþôµ3666664šêûýùåÞ…7!˜¥TJ{{{ÔÜõøøüüþüƆ?ƒ7666660™èúýýùãÞŽ…7˜æ«Kac{ÔÜöøøüüü÷¸·ÂÞÂŽƒ‚61°úýýýùåå•‘ƒ7šMJa{{ÔÔÜöøøøøüüüúßâàâÂŽƒŸúýýýýýùåÞ”…6!˜§«GLctÔÜÜööøøüøüüóíããâÞÞŠžùýýýýùùåä•‘„4šOFLatÔÜöööøøøøøøìíããâÞÂŽŸúùýùýýùùå—‘…‚˜æÌHLttÔËÜÜöööøøøøøìëåãâÞÞŠžùùùùùùùåå䔄‚3¤›HLWuËÔÜÜöööööøöø×ëùùùååÞ€µíùùåùåùååä–‘„‚š HHWtËÍÍÜÜÜöööööõÙ¾½¸¸µŒŒ²ßååååååååää–‘„‚˜ HWuËËÍÍÍÜóÜööööÜÜÛððïñãååâäää—ääää—–‘„‚3æ HUXªËÍÍÍÍÜóÍöÜÜÜÔÙÙÊáàÞÞ•—•”–—–—ä——–’„¥ç UVªËËÍÍÍÍÍóÍÜÜÜÜÔÒÇàÞ••””–”””–––——–’‚¥ç V¨ªª¬Ë¬ÍÍÍÍÍÜÜÔÔл””‘–‘‘““’““––––’„¤« ¨¨¨¨¬¬¬¬¬¬¬¬¬¬¬ÔŽ’’‘“’’“’’“’“““–“’’„¤« ¨¨¨¨¨¬©©¬ç¬¬ÍÍË~Š…‘‘‘’‘’‘’’’’“““’„¤« ¨¨ª¬¬££ç›N£ÍÔs@Š……„„„’’“’’„¤ç UVXªªËË´´£ RÏkkp¹ŠŠ…ƒ…………„’’„2§ UVXXËËÌ´´g®h´k g½"‡ŠŠŽ…………„…„„„0æ UWXËËÜÏ´´¾ópÙÎh±ØŒ††Žƒ……ƒ„……„„‚620 HHWuÏÍóìÖÖõ×ÄõÄØØ³;·!†ŽˆŽ……‘…„„662žM FLWËÜóóôôøõÛÛ×½½Ä¸¸»·Â!ˆˆŽ‘‘…„6640¦« FLtÔóóôô÷ôõÜõÛØÚÚÅÅÊ·;‡Þ†:‰†ˆŽ”…„6400!C FIJaÏôôüüüô÷õðõÛðÚØÉÚ°àÂŒ‰Â††•”‘‚6)0ž£AEFJaÔôüüüüüû÷õðððððÚÚÉÅá·Â‰‡Þ•”Ž‚)4%1æBEIIaÔøôüüüüú÷÷õõðððÚïïïïÅÃßà·ÂÞÞ•Ž6))%ž´DI_`{õüüüüüüû÷÷òòðòïñðÊïãáà÷ÂâÞÞŠ4)%PD__xÔ÷üüþüüû÷û÷÷÷òòòñïïïïñãñßãâ•74%%¦èDZbzõüüüúþûüûûûûûòûò÷òòñòñùãåâŠ4)%"SYZbÔøüþþþþûüûûûûûûûûûòûùòûùñÂ5)#!g,Y\bÙøþþüþüþþüþûþûûûûýûûûûùñ7)#Ýg,\wÓøüüüþüþþþþþþþþþýûýûùñ?)#1ݱ-,[^|Óõüüþþþþþþþþþþþûûá5)%;Æ9+//]nÐðø÷þüþþþûûûïÇ?5)#&²³-+../>or¿ÁÁÀÀ»¹@=5''%;Ƴ-(((((******''''%;ÆÃ8$#('''''''#1²èèÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿüÿÿðÿÿàÿÿ€ÿÿÿþü?üøððààÀÀÀÀÀ€€€€€€ÀÀÀÀÀààððøø?üþÿÿÿ€ÿÿÀÿÿðÿÿü?ÿÿÿÿÿÿÿüÿÿÿ(  @âââ¿¿¿C®®®Z©©©^²²²PÏÏÏ/íííéé骟´u£Ãα˜Þñµ¥êø©¥èø’–Ðïtz£Ò††‰ÉÉÉ5öööÙÖÚ,¬mÂÀÓ}úþãÄÿÿêäþÿÞàòÿv„®ÿÊÒæÿ¶Íþÿl–éû`lÆ­­­Tõõõ êêë¼^ÂÌçcüþì»ÿÿòåÿÿçåõÿJ{Þÿ\ïÿ[q£ÿÖßèÿ»ÝþÿOžöýXkÌ¿¿¿?À€±÷Béÿù‘þÿöÒþÿöæÿÿÃÅîÿz³úÿ=—ÿÿ)kÕÿÌÓãÿâñüÿ™Ûþÿ.“ðýrw¢ãããåßâ#Ú/’íþXÞÿý©óÿüÌüÿ÷ÙÿÿìÕøÿ¼×øÿ•Ìÿÿf‹½ÿÛëúÿÛòþÿ½ìþÿDÈÿÿ4n¯å···IУ²fó$~þüiÁÿûªÞÿýÀïÿýÈúÿðÁûÿǼòÿ¯Æóÿ™½åÿ¯ãýÿ§éÿÿ§ðÿÿRáÿÿáú‘”zÕŠ•„ó(]ÿöq›ÿø¿ÿú®Ñÿû·Þÿü±íÿãžüÿ•»ÿÿgÔÿÿKÛÿÿEâÿÿYïÿÿDìÿÿ¨íþv‚–Ö„‰Žî&BÿòhwÿóŽžÿêž²ÿÚ¤ºÿã ½ÿê‘âÿ>³ÿÿ#ÎÿÿÔÿÿÜÿÿ èÿÿ#ëÿÿªçþsƒ˜Îˆ›ëUþóLÿò‚¹ÿÒœÓÿ¨‹Íÿ¯ƒÎÿ}Ðÿ_ÙÿBŸòÿ&©ÿÿ²ÿÿÆÿÿ Äþÿxßþ‚‹š…Ò­ÃWÝhýñ0¥ÿï§ßÿêÎïÿåÂ÷ÿ˰òÿ³©íÿ‹—áÿ^‚ÈÿRÍÿF Þÿ/Áÿÿ‡øÿ PÈö±³¶Rðíñ¸'àä ºÿðÂóÿõæõÿêÝùÿàÇþÿÏÂûÿ»¼÷ÿ¦·óÿ²ëÿq¡Ûÿ]ÇÿÿXïÿêÿÿSòÿÿTóÿÿ-éÿÿÈûÿ“áþGcÓžžž`ÙÙÙ3Ô04éì&7ÿñ.Hÿò]gÿò„ÿó•ÿõ˜Ÿÿ÷ ©ÿÿ䫸ÿø²½ÿù³¿ÿø®¿ÿù«Áÿê’âÿH·ÿÿ#Ýÿÿ%âÿÿ#äÿÿãÿÿäÿÿæÿÿêÿÿ íÿÿ-óÿÿ9öÿÿîÿÿÍõÿžÛþFh~Õžžž`ÚÚÚ2Ï,;èë =ÿñ%MÿóOjÿñs‰ÿò„ÿôŒ§ÿõ•±ÿÏ™¹ÿš»ÿÉ™¶ÿ®‚¤ÿížÓÿöŒêÿÐ}ûÿ[Œÿÿ2«ÿÿ%µÿÿ½ÿÿÃÿÿÇÿÿÍÿÿÓÿÿÜÿÿäÿÿ$èÿÿàÿÿµòÿˆÙþFc}Ò£££[ààà)Á+IåèHÿðXÿõ@xÿðh—ÿñzªÿó†·ÿõÉÿµÌÿ°’Ëÿ‚e©ÿxV˜ÿΓÚÿ¡nÂÿ¡~×ÿw†ïÿN•ýÿ8žÿÿ,¦ÿÿ"«ÿÿ¯ÿÿ´ÿÿ¼ÿÿÇÿÿÐÿÿÙÿÿÌþÿ™ïÿpÖþI_É®®®Pççç±/ZÜåQþîbÿõ0‚ÿòX¡ÿðu·ÿó’Ëÿí®Ýÿ±–Øÿ¨ŽØÿƧçÿ­ŠÞÿÉ›éÿe¾ÿ´¤éÿKPœÿj‘ÞÿW’ÜÿN¥ðÿ1¤ÿÿ(¦ÿÿ!©ÿÿ²ÿÿ½ÿÿÃÿÿ Âÿÿ©ûÿzêÿ\ÍýUc€¹¼¼¼Bôôô ¨ExÅÝYþëkÿó#ŽÿóF°ÿñ~Ìÿï³âÿíÄëÿÜÄîÿßÀòÿä¼öÿгóÿ½£íÿ´£ìÿ£šèÿcfÄÿˆ áÿC^¤ÿX‰ÂÿSšÙÿH•ÔÿF«ïÿ7·ÿÿ*¾ÿÿÀÿÿ«þÿ~öÿ^äÿP¹øs{…˜ÒÒÒ,¯€¤ŠÇeúèxÿî™ÿñ?¾ÿð›âÿîÏíÿïØñÿïØôÿëÎøÿåÀúÿà¾ûÿ¿¬îÿ·ñÿ²®îÿ«±òÿ—¦íÿ[qÎÿƒ°íÿPz¾ÿ]”ËÿQÂÿI‘ÈÿCÄÿÿ0Ãÿÿ –ýÿ\ïÿIÝÿ#J¦å˜™šlçççÐÃÓC¦"ãß…þä¢ÿï8Êÿð«îÿðÝòÿôâóÿóãõÿìß÷ÿåÏûÿãÁÿÿÛÂýÿÑÀûÿÁ»ôÿ¼½öÿ§­íÿ‘ èÿž½öÿ‚¦èÿ‚°êÿU‚ÇÿYÇÿ`ËÿÿDÃÿÿ ~ûÿEèÿ<ÓþQc޼¾¾¾@õõõ óôô a¨¢¿ ”ýÙ¬ÿå)ÑÿñŸöÿïáöÿõéõÿöê÷ÿðèøÿèÞûÿäÐÿÿßÊÿÿÙÇÿÿÒÅÿÿÉÃÿÿÂÄùÿ»Âùÿ®»óÿ™­éÿ£Åòÿˆ¬èÿÈöÿzÏÿÿUÀÿÿ böÿ9áÿ8·óŒ‘vááá×Òà4‰#¤áʸþÑÒÿìsøÿìÚúÿñìøÿòîùÿðìúÿëäüÿçÚÿÿãÖÿÿßÔÿÿÙÑÿÿÑÍÿÿËÈÿÿÅÃÿÿÁÇÿÿ¼Ìûÿ¯Ãóÿ™²ëÿ¤Îûÿ•ÑÿÿR¦ÿÿBíÿ*ÑþTgš±ÈÈÈ6öööøøù¥Åy‹ ¯ø¶ÎþÓ;ðÿë²þÿðæüÿðíûÿðíüÿîèýÿìãÿÿéáÿÿæàÿÿâßÿÿÞÞÿÿÚÚÿÿÖÕÿÿÐÑÿÿÌÓÿÿÊ×þÿÆÙþÿ¾Ùÿÿ›Ìÿÿ%lùÿ,Üþ!;±á®°²RìììíîðxN³¶ˆÅù­âÿ×\üÿïÕþÿóéþÿóíþÿòìþÿñìþÿïëÿÿíêÿÿìêÿÿééÿÿçèÿÿåæÿÿâãÿÿßãÿÿÞãÿÿÙãÿÿÎÞÿÿVýÿ,ãþ/Á놑ª|ãããÛÛç(lE»¿oÅû§òþÖwÿÿîÒÿÿõëÿÿöðÿÿõòþÿõòþÿôòþÿóòÿÿñòþÿñòþÿðòÿÿïðÿÿìíÿÿèìÿÿÞçÿÿ‘´ÿÿ/çÿ'Åðz‹±†ÛÛÛ#àãì!{nÌP Ïó| íþªAþþʈÿÿåÊÿÿñêÿÿöòÿÿöôÿÿ÷öÿÿööÿÿõõÿÿóôÿÿïðÿÿ×Ýÿÿ“§ÿÿDgúÿ!âþ%9ÁÛ—¦½iãããïðô¥¤ÚdS3ÒÐFáøV óþy/ûþœhþÿ³‘ÿÿÁªÿÿĵÿÿÁ·ÿÿ¶²ÿÿ¡ ÿÿv~þÿ0Cõÿ äþ"ÏïQfÀ¯¿ÃÎCìííÙÚì,’ŽØF5ØÐ.Ýñ&çü( îþ+ôþ(÷þ÷þòþ éþàú$ÒèQaij¤ªËaáââ çëãVŠƒØxqÊ–mgÄ¥fb¬feħmlÈšwxЊŒ“ÖsÄÑÙ?êêêÿàÿÿ€ÿþ?üøðààÀ€€€€€€ÀÀàðøü?ÿÿÿÀÿ(0` €%ôôô ïïïêêêåååáááßßßÞÞÞ ÞÞÞ ßßßáááåååéééïïïóóó õõõ ìììàààÑÑÑ-ÄÄÄ:ºººD±±±M«««S¨¨¨V¦¦¦X¦¦¦X¨¨¨V­­­QµµµJ¾¾¾@ËËË3×××'âââìììóóó óóó çççÕÕÕ)ÀÀÀ>ªªªT”””n‡‡‡{{{š{{{¡zzz¥xxx§www¥uuu¡vvvšzzzƒƒƒ€’’’l£££[¶¶¶HÉÉÉ4ÛÛÛ#éééóóó éééÔÔÔ*¹¹¹Eœœœe………Š„‚‰°‡{œÌ„q«Ù†mµâ‹q¾çwÂëzÄíŠxÃíw¿ëxu³èur¢âtrŒØqptÈnnn´qqq }}}…”””k®®®QÆÆÆ8ÞÞÞ íííõõõ òòò ßßß¾¾¾@›››e†™…s ËšnÆå¬xÜô¸Žìü¸—õý¹Ÿûþ¼¦þþ¼«þÿ»­þÿ¶«þþ­ªýþ¥¦ùþœŸñý‘’çû€„Ø÷{»ïqq‹ßiiiÈggg®wwwŒ’’’lµµµJÑÑÑ-åååóóó íííÔÔÔ*¯¯¯Oƒ‚‡Ž‚jŸØ¨^Úó»kóüƆüþÍžþþÓµÿÿÕÁÿÿÖÈÿÿ×Íþþ×ÒÿÿÕÒÿÿÒÑþþÎÐÿÿÉÍÿÿÁÈþþ¶Àÿÿ¦±þÿ‰—ùþo‚îünzÍösvæddeÌdddª¤¤¤ZÅÅÅ9ÞÞÞ ïïïäääÂÂÃ=š–žplÆ¢T×úÉVýþÑzþþךþþÛ°þþÝÃþþáÐþþãØþþäÞþþäâþþåäþþååüþÐÒçþ·»ÏþÀÃÜþÐ×õþÐÛþþÉÖþþµÉþþž·þþq—þþX~úþ`wÌøhn…å^^`Âmmm˜pµµµIÕÕÕ)ìììââ⺺»H‘…œŽ‘V®Ü¾FéüÔaÿÿÛ„ÿÿÝ™þþá±ÿÿåÉÿÿçØþþéáÿÿêçþÿîëþÿïïýþïðüÿàáêÿƒ¯þel…ÿ…ˆŽÿ¾ÃÏþÜäöÿÛåþÿÎÝþþ½Óÿÿ¤Åþþ€°ÿÿVÿÿQ}ìý]iŸí^`kÐhhh§†††z¯¯¯OÓÓÓ+îîîæææ¼»½H–| ¥K¿éÍAðýÜ^ýþÞþþá”þþå°þþéÉþþëÛþþíäþþïëþþñïþþóòþþòóûþçéîþ‹•½þ>·þ>¡þLSmþ’–þËÎÖþãêöþßêýþÒãþþ¿Øþþ¨Íþþ…ºþþWŸþþ7söýOi¸ó`fwÙfff®„„„}°°°MÛÛÛ#ïïïïïïÄÃÅ>–}œ¡µKÀîÛ@ðþâTþÿãqþþäŽÿÿè¬ÿÿëÇþþîÙÿÿðãÿÿòêþþóïÿÿôñÿÿóóüÿåçíþœ¤Åÿ!NÄÿXóþSæÿC¥ÿU\vþ–˜›ÿÏÒ×ÿèî÷þâïýÿÓæþþÁÜþÿ¨Ðÿÿƒ¿þþL¡ÿÿ0yöþJmÁõaewÛfff­ˆˆˆx½½½Bßßßòòò ôôô ×××'”…ž¬@³îß@èþèKûÿè`ÿÿè~þþë£ÿÿîÀÿÿïÕþþñàÿÿóçÿÿóìþþõðÿÿóñýÿåäîÿ“žÌþ0`Ðÿ^ôÿaþþ`ýÿXîÿE¶þW]xÿ•—™ÿÐÔØþåíôÿâðûþÕêýÿ¿àþÿ£Óþþs¿ÿÿ@¡ÿÿ)|öþDi¾õ]bq×eee¤–––hÆÆÆ8æææöööäää««°_¢:¥ëá7ßþîIõþïTýþîkþþî’þþî¶þþðÍþþðÚþþòãþþóèþþõíþþõïþþèæñþ›£Íþ,^Ñþ`õþfþþgþþgþþfþþ[ìþB³þV[mþœ þÑÕÚþåìõþâïûþÓêüþ¼àþþ’Ïþþa¾þþ5¡þþ xøþHh°ó[]cÏrrr¦¦¦XÒÒÒ,îîîîîîÀ¾ÂE™O’Ôä-Êþõ=íÿöLúþ÷`þÿô‚ÿÿôªþþóÆÿÿôÓÿÿôÝþþôäÿÿõéÿÿöíþþòìüÿ·¼äÿ]ÞÿK‘øþ<ÿÿ"ƒÿÿ uþþqÿÿoÿÿmþþcùÿFÔÿƒˆšþÆÊÎÿåêñþêóúÿáðûÿÐëýþ®àÿÿ…ÑÿÿS¾þþ+¢ÿÿ tøþRg—ï]]]¿€µµµIÞÞÞ ôôô ÙÙÙ(›yœ˜Â*œôõ0ØþûCïÿýPúþümþÿù“ÿÿøµþþöÊÿÿõÔÿÿõÜþþöâÿÿ÷èÿÿ÷êþþéâúÿ›ŸàÿŒãÿбïþŠÁÿÿ‚½ÿÿ`ªþþ.‘ÿÿ€ÿÿtþþUÃÿD`¿ÿÔþÛáçÿêòøþêóûÿåòüÿÚðüþÂéþÿ ÝÿÿpÎþþ@ºÿÿ”ÿÿ fæý\boÞggg¦———gÊÊÊ4ëëëììì´«¶]ª=…Úä"¯þú4ÛþþGìþþ]õþþ}úþýŸüþú¹þþøÊþþøÓþþ÷Ùþþ÷Ýþþ÷ãþþöåþþöåþþöëþþÞÙìþ»Ðëþ¬Öþþ¥ÑþþœÎþþ‚ÁþþZ­þþ2þþ6X’þ•š¥þÞèðþêõþþêõýþéôüþæòüþÞðûþÎíýþ±æþþ‡ÙþþRÉþþ)±þþ€þþ=b±ó^_`Ç{{{‡²²²LÞÞÞ ôôô ØØØ*¥n“¡É €öö'·ÿý5ÚþÿNæÿþlïþÿ‹õÿÿ¦øÿý¼ûþûËýÿúÐþÿøÕþþ÷ÚÿÿöÞÿÿöàþþõßÿÿôãÿÿÞÔìÿÄÓìþºÜÿÿ³×ÿÿ©Öþþ—Îÿÿ~Âÿÿ]©þþD`’ÿ”™¥ÿÛåñþæóÿÿäóþþäôþÿãóýÿßñüþÓîüÿ¼ìþÿœãþþbÔÿÿ4Ãÿÿ þþgçüQb€âhhh§™™™fÍÍÍ1îîîòòò »²¼W®BvÔèˆþû(¹ÿþ<ÕþÿXßÿþxèþþ–ïÿþªõÿý¾øþýÇûÿýËþÿûÒþþùØÿÿ÷ÛÿÿöÛþþõÛÿÿóÜÿÿÝËìÿÄÐìþ»Üÿÿ´×ÿÿ©Öþþ—Íÿÿ}Áÿÿ]©þþD_’ÿ—¥ÿÖãñþàðÿÿÝïþþÜñÿÿÝóþÿÛóýþÒïýÿÂíþÿªéþþwÞÿÿ?Ìÿÿ±þþ‚ùþ0a´ò```‚‚»»»Cæææää䯘ŽÂ!f÷ó"Šþý)µþþ@Ëþþ_×þýáþýšèþü­îþüºòþýÅ÷þþÉûþþÌýþûÒþþøÖþþöÔþþôÓþþòÓþþÛÃìþÄÍëþ¼ÝþþµØþþªÖþþ˜Îþþ}Áþþ]©þþFc–þ˜§þÏÞñþ×ìþþÓëþþÒîþþÓñþþÒòþþÍðþþÁïþþ­ìþþ„äþþHÕþþÀþþ—ýþqØúUbwÜqqq™ªªªTÜÜÜ!ÒÍÒ8¨Vu¿Ü]þ÷#‰ÿþ+©ÿþC¾þþcÎÿü‹Øþû¡àÿü­æÿü·ìþýÁòÿþÅöÿþÈøþþËüÿüÎþÿøÎþþöÎÿÿóÍÿÿÚºìÿÈÎéþØîùÿÙîùÿÎîùþ½íùÿ¥ãùÿ†Íùþh†±ÿŸ®ÅÿÆÝôþÊèÿÿÆèþþÃêÿÿÂíÿÿÆðþþÅòÿÿºðÿÿªîþþ†êÿÿSÞÿÿ#Éþþ ©þÿ ‚îþ:dëggg®———gÐÐÐ.ɵ¿Q«3\äæ]þø$„ÿý.œÿþF²þýiÅÿûŒÎþú¡×ÿû¬Þÿü³åþü¼ìÿýÁðÿýÃóþþÈ÷ÿþÉüÿûÉýþøÈÿÿõÄÿÿÛ²ðÿ«™âþ˜äÿ™šâÿ“âþŽŸâÿ‡Ÿãÿ~œäþ‰¢ÕÿµÒíÿ¾âüþ´åÿÿ®åþþ¬çÿÿ¬éÿÿ±ëþþ¶òÿÿ¯ñÿÿ ïþþîÿÿVåÿÿ%Ðþþ ±þÿ’÷þ(g±ò^bf¿ŠŠŠxÅÅÅ9öööÄ£­c¸IõìZþø$xÿü-ŽÿýJ¦þúr¸ÿùŒÄþùžÏÿú¨×ÿû­Ýþü¶ãÿýºçÿü¾ëþýÃðÿýÃôÿþÂøþûÁýÿ÷½ÿÿñ¹ÿÿêµþþâ¶ÿÿØ»ÿÿÌÂþþÆÊÿÿÁÑÿÿº×þþ´Üÿÿ«ßÿÿßþþßÿÿˆâþþ„ãÿÿ„æÿÿ‡êþþ•ïÿÿ•òÿÿ‰ñþþrðÿÿSêÿÿ%Øþþºþÿž÷ÿsÂøP`rÐ…½½½Aóóó Á—¡sÄAúí Wþ÷%lþú/þúN™þøu¬þ÷Œ¹þø˜Äþù¢Ìþù©Ôþú¯Øþû³Þþû¶áþû»çþü½ëþý¼îþþ¸õþý³ûþ÷®þþì©þþà¦þþÑ«þþ¿´þþ³Áþþ§Ëþþ˜ÐþþÖþþÙþþqÚþþfÛþþ\Üþþ[ßþþZâþþ\æþþiëþþuñþþróþþeòþþNíþþ$ÝþþÀþþ¥õþyÐûC_Úxxx¶¶¶Hððð¿—Î8üî"Lÿõ%\ÿø1nÿøR‰þöužÿõŠ®þ÷•¹ÿøÀÿø£Èþú©Íÿú¯Ñÿú°Öþû´Ûÿû¹ßÿü¹ãþü¶éÿþ±ïÿþ¨÷ÿô¡ýþä—ÿÿÍšÿÿ®¨þþ™¾ÿÿˆËÿÿrÏþþdÒÿÿWÖÿÿPØþþIÚÿÿAÙþþAÝÿÿ@áÿÿAåþþJèÿÿZïÿÿbóþþ]óÿÿLïÿÿ%âþþÊþÿ­ôÿØý:^‡áttt–±±±Mííí¿‹‹×.ýí$Bÿò%Nÿõ2[ÿõUvþôv‹ÿô‰žþõ”ªÿöœ°ÿ÷ž·þø¤¾ÿøªÄÿù¬Éþú¯Îÿú±ÑÿúµÔþü³Øÿü²Üÿü¬ãÿý¢ìþñ’ûÿÎŽÿÿ“ŸþþhºÿÿUÌÿÿJÑþþBÔÿÿ<Ùÿÿ6Úþþ2Ûÿÿ1Þþþ1ßÿÿ2ãÿÿ3æþþ7éÿÿCïÿÿSôþþUõÿÿFñÿÿ!çþþÑýÿ³ðÿŠÛþ6bŒårrr𝝝Oìì켆†•Ü!þë'4þï'>þò3MþòWaþòtyþò‡Šþó‘–þô•šþõš£þ÷¡©þ÷§°þó®¹þð²¼þö³¼þ÷±¼þø³½þø²¿þù¯Àþù­Âþù­¾þã‰õþ_©þþ"Þþþ'áþþ)äþþ(åþþ%æþþ åþþåþþæþþçþþéþþ ëþþ"ìþþ'ñþþ5õþþ@÷þþ4öþþìþþÖùþºëþ•×þ4hŠçrrr›¯¯¯Oììì»…†˜Ú#þë$6ÿï#?ÿñ/JÿñP`þòkvÿñ†þó‰’ÿó›ÿõ”¡þö˜¦ÿ÷£±ÿÑœ²þ¸‘­ÿ쯿ÿ묽þ㨹ÿó­Ãÿù¥ÆÿùËþö˜Ðÿ×|øÿZ–þþ'Ãÿÿ"Ìÿÿ ÐþþÓÿÿ×ÿÿ×þþØÿÿÚþþÜÿÿßÿÿãþþæÿÿëÿÿ%îþþ-ñÿÿ'ðÿÿçþþÌ÷ÿ¯éÿŒÓþ3d‡çttt™±±±Mîî‹“Ô+ýé =ÿîFÿò&QÿóDfþòa}ÿðuþòÿóˆ¥ÿôЬþõ‘²ÿò¡Àÿ¸Ž·þ´‘¸ÿâ±Îÿ¦€¤þl“ÿ¾‰µÿôàÿøïþèüÿ¿{ÿÿk~þþE˜ÿÿ3¥ÿÿ(¬þþ"²ÿÿ¸ÿÿ»þþ¿ÿÿÂþþÆÿÿÊÿÿÐþþ×ÿÿÝÿÿâþþ!æÿÿåÿÿ Ùþþ·õÿ›èÿzÓþ3]‡äwww“¶¶¶Hðð𻊓ŠÉ5üçDþìMþó Zþõ:oþòY‡þïo™þñz¦þò‚¯þó†¶þô”Áþå¢ÎþªŠÇþ¸˜Ìþ¨ˆ¿þtW—þlKŠþ—j¨þÝšãþ¸zÏþ¨tÎþ£}âþ‚ˆúþ^‘þþA–þþ4þþ-¢þþ'©þþ!«þþ¯þþ²þþµþþºþþÀþþÈþþÏþþÕþþÜþþÛþþËþþ¥óþ‹åþkÒþ4W‡Þ}}}‹¼¼¼Bóóóºœ~»?ûäKþìUÿñaÿö0yþóO‘ÿðg þðu®ÿò€¸ÿóÄþôÐÿÚ¨Úÿ¢ˆÑþ¢‡Ðÿ‹pÇÿš~Ëþ‘qÁÿ¶ŒÔÿ¹‰ØÿoP¦þf±ÿ³¡êÿ_a³þnŽßÿ_œÿÿMžþþC¤ÿÿ5¤ÿÿ*¤þþ%¨ÿÿ ªþþ¬ÿÿ°ÿÿ¶þþ¾ÿÿÄÿÿÉþþÏÿÿ Ìÿÿµüþðÿ|ãÿ]Ìý:U…ׄ„„ÄÄÄ:÷÷÷ ¾š©n±JöáOþê[ÿïfÿö'|þõA•ÿñ[§þðn¶ÿò…ÆÿòšÒþð­ÝÿÏ®áÿ®–Ùþ®”ÛÿºžâÿæÄôþž€ÛÿÜ«ôÿÉžíÿˆoÉþ£‹Ûÿ¸­ïÿFF˜þN^¦ÿq™ßÿ]ŒÎþX‘ËÿS©óÿ7¥þþ-£ÿÿ(¥þþ$§ÿÿ!¬ÿÿ ³þþ¼ÿÿÁÿÿÂþþ Àÿÿ¶ÿÿšùþvíÿkßÿ TÂüDY‚Ë‘‘‘rÏÏÏ/ʯÀU¥]êÚTþé^þìlþóƒþô5¡þòN²þðoÂþðš×þï±áþï¿éþàÅìþͺéþϹëþïÂøþà¼õþ½¢ëþá¼úþ¾¤îþ»©îþ¯ôþ—“âþYYºþdpÁþЧáþMiªþ,J‰þ`™Ñþ]°ôþX®îþQ¯ñþC¯øþ6°ýþ+µþþ(¼þþ#Àþþ¿þþ ³þþžýþzóþdæþ[ÜþQ®ö[h}µ£££\ÛÛÛ"ÕÉÔ<œÇþþ.ÁþþŸþþm÷þRêþJàþ?Éý6Q”ÔŽwÌÌÌ1òòò õõõ ¸Ÿ½j#|ãÑ výäˆÿåšþë³ÿñGÑþñœëÿîÑñÿñÝñþôàóÿôáóÿòáõþíßöÿç×ùÿåÈüþäÀÿÿà¿þÿÙÂüÿпùþȽöÿ·´ïÿ±²ðþ»Àøÿ›£éÿ…‘âþ¸ôÿ•»÷ÿ…«ëþ|¦åÿ²ëþW‡Ëÿ5`©ÿ]—Éþ`ËÿÿPÉÿÿ:Áþþ‘þÿYôÿEæþBÚÿ=·ö[i†³ªªªUßßßÙÖÜ0™S³´ €ùÜ’ÿÝ¢þáµÿï=×þò˜òÿîÔõÿòâóþõæôÿöæõÿõçöþðæ÷ÿêáøÿæÕüþäËÿÿàÅÿÿÜÄÿÿ×ÃþþÔÃþÿÌÄüÿÇÂüþÃÄûÿ¯µîÿ¦°ìþ´Çúÿ˜«ëÿ„›ãþޝëÿ’»ðþ|¥âÿm˜ÕÿÀîþoÎÿÿbÌÿÿD¾þþ€üÿHîÿ=ãþ7Òþ#D©à†‰Œ€ÇÇÇ8îîîóóó «ŽºuŽ”çÇšýجþعþè/Úþó‡õþîÏøþðåöþõéõþ÷ê÷þöê÷þòêøþëæùþèÝüþåÔþþãÎþþßËþþÛÉþþÖÇþþÑÅþþÊÃþþÇÄþþÅÇüþÀÅüþ½Çþþ®ºðþ™ªçþ±Íõþ¡Áðþ…¤äþ“¾ïþÏüþ‚ÏþþvÎþþK¸þþlùþ<éþ7Üþ.¿øPdº«««SÞÞÞâææ!Œ\³ª ¤÷Ï´þÎÁÿØ!Ùþîeöÿï¾ûÿìãøþòìøÿóîøÿóîùþñíùÿîèûÿéáüþèÛÿÿåÖÿÿâÔÿÿßÒþþÛÐÿÿ×ÎÿÿÐÊþþÌÉÿÿÈÅÿÿÂÁþþ¿ÀÿÿÀÊÿÿ¼Íúþ²Åôÿ ´ëþ‰žâÿ•´íÿŸÐýþ”ÒÿÿƒÌÿÿEžþþOóÿ5áÿ(Ïþ%Dªß”••pÎÎÎ0ñññ »±ÌWt)¥Ø© ¯ýÂÆþÄÕþÝBñÿìŸþÿì×üþïêúÿðîùÿðïùþïîúÿïêûÿìåýþêßÿÿçÝÿÿæÜÿÿãÛþþàÚÿÿÝÙÿÿÙÖþþÖÓÿÿÒÐÿÿÎÍþþËÊÿÿÇÊÿÿÂÌþþÃÓÿÿÃ×ýþ½Óúÿ¸Õýÿ±Õþþ¤ÔÿÿÂÿÿ+}ýþ:íÿ+Öþ (¾÷m~›½½½Açççïð𕾈p §ò£¾þµÒþÇ$èþàdüþì¾þþðâýþðéüþðíûþðíüþðëýþîèýþíäþþêäþþêãþþèâþþåâþþâáþþààþþßßþþÜÜþþÙØþþÖÕþþÒÔþþÐÕþþÍÖþþÌØþþËÜþþÄÚþþÀÚþþ©Ñþþ[Ÿþþ Lôþ,Þþ"Éû?TžÅ®®®PÝÝÝ!õõõÜÞã(qL­¹r ´÷ Îþ¯ßÿÇ)õÿã‡þþðÙÿÿóæþÿóëýþóíþÿòíþÿñëþþðëÿÿïêÿÿîêÿÿíéþþëéÿÿêèÿÿèèþþççÿÿåçÿÿäåþþâáÿÿßàÿÿÝáþþÜáÿÿÛâþþØâÿÿÓàÿÿÌÝþþйÿÿWùÿ(âþÎý+E®Ö—¤rÕÕÕ)òòò À½ÕHhC³Äm ¿÷Ôþ¬ìÿÌ>ýþæ§ÿÿñÜÿÿôéþþõíÿÿöïÿÿôïþþôïÿÿôðþÿóïÿÿòîþþñîÿÿðîÿÿîîþþíîÿÿíîÿÿëîþþëíÿÿéìÿÿçêþþæéÿÿåèþþáçÿÿÞçÿÿÃ×þþ1qüÿ'åÿÏý#>´Þ€Ž©ÉÊË6ïïïöö÷ ¹¶ÕO^=·ÈX¶÷{Õý¦õþÇIþþà›þþîÖþþóéþþõîþþ÷ñþþöòþþõòýþõóþþõóýþõóþþôóþþóóþþòóþþòóþþñóþþòóþþïðþþííþþìîþþèíþþãêþþÆØþþQ‰þþ)çþÐý!:ºß­ÉÊÌ5ëëëÃÈÝ@h\È®HÄëbÝû‚ ïþ«.þÿÄjþþØ ÿÿæÉÿÿïâþþôîÿÿöóÿÿøôÿÿ÷õþþ÷öÿÿ÷öÿÿ÷öþþööÿÿööÿÿõõþþóõÿÿñóÿÿéìþþÖÞÿÿ³Áþþwšþÿ'Súÿ åþËö6P¼Ê•§µkÕÕÕ)ïïïÚâå-‡ÒˆL.ÅÕGÔ÷bëýt øþ‰%ýÿ¨UÿÿÅþþÚ¼ÿÿåÓÿÿëàÿÿîæþþðëÿÿðìÿÿïìþþîìÿÿìêÿÿèæþþÞÞÿÿÌÐÿÿ «þþ[týÿ @öþ îÿÙý(ÅêWhºª²¼¾QÞÞÞ òòò îðð«¯ÜYj]Ò­;Ðç:ÞøAëýS öþfúþ~Aþþ‘`þþ zþþ¬Žþþ²™þþ± þþ® þþ§Ÿþþœ—þþЉþþpsþþLXýþ1òþéþÙý Êñ=L¿Ç|“¾ƒÎÏÏ4èèèÛßè-›—Üpf^Я3×ä,Ýø*ãü*ëþ. ðþ3öÿ8ùþ:!úÿ6$üÿ0%üþ($úÿ!!÷ÿñþ ëÿ æþ ØüÎð@RÀÅ{„Á‹¸½ËMßàà óóó õöö ÙÜë-¬¯ÝapÑž2/Ô×!ØðÛøÜûáü äþçþçþäýßüÚû Ô÷,ÍãXzĬ“™Èw½ÄÒDààà"ñññøùùéîòÓÔé,ÃÁÝA³±ÎV¦¤Ái›¹w—–µ€”“²ƒ–•µ~œœ»s££Âf­­ËW¹ºÕGÆÊÞ8Ùàã%ëììõõõ ÿÿÀÿÿÿþÿÿøÿÿðÿÿÀÿÿ€ÿ?þüøððààÀÀ€€€€€€€€ÀÀàððøüü?ÿÿ€ÿÿÀÿÿðÿÿøÿÿþÿnsis-3.11/Contrib/Graphics/Icons/modern-install-full.ico000077500000000000000000000560061477201124000232210ustar00rootroot00000000000000(†h® è ¨þ 00¨¦ hN!  ¨¶%00 ¨%^6( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxöfffoxöfffoxöfffoxöfffoxöfffoxöfffoxöfffoxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @i`IngS|oVn~^¢|&˜V€}mqŽ\lžomŸpцÝ”ÿœ(œˆSŽ\•œY”`’gŸp˜v¡Ÿpެj…¾d¡¦{³¤uÓ»{ÿ¼nÿ¾ƒÆ{in“nw w¤~ƒª~Ь™ƒ‡‡”ˆ•–ž¤šŒ¥—Ÿ§Ž¢©…¡¨ˆ¤µˆ¹³©§“ ©”««˜ °’¤¶–¦¼“£°‰Œª– •¹ˆ¥¨‡¸£´¦¤·®£±­­¤· ­µ®«¿¨²°¬´¿­¡®¼¹³±º¶¶±³¼°·¿ºµ¹É³†Æ»‹Ã¼£Ã´¨Å·¬È¸¹‡Ç‡³ÁŠ¬Ì¦À£Ð”‹É£šÆ¾¨Æ§§Æ­½È¡¨Ó¡¹Ø§­Ë±«Í¼»Ú²ÜÁ›ÉÁ¤ÉÌ¡ÃëÏÅ­ÉÎ¯ÕÆ¨ÒʬÜË¨ÜØ¥ÕܯÁÏ´ÛαÉܱÈÞ»Ô×´ÛѳÒÓ¾ÕÔ½Ø×¼ÑܾÞÚ¿áЭãÖ½ÿÚµ–Ó’°É©·À§­Û§¯Ý¨®Ü§±Ú´¾Ù²ºÞ¶¿ß¶¿á­ËÀªÍǶÉÁ¸ÂȾÄʯÙζÕ˺ÒɼÊã¼ÎëÍÅÀÈÇÆÈÈÆÓÍÂÒÌÈÁÓÎÐÓÎÅËÑÇÍÓÓÒÐÖÑÑÐÒ×Ð×ÔÓÙÖâÜÅâßÎÂàÑÌáÛÌåÝÕçÞàáËååØÝÞá×ÞðÝéãØèäàëææçêãéëåìëëëïêìíììíçòîíîðíóñŒ@.`nŽM:C%-n J••C(#dš^ •‘>'<Hi™ —ƒ/;Ietau—=O_mcs]0ˆ[V2 NX\kqphZUQ3,L RYjgfW2+*KPqŸrlbA?4)‹$S›¬®¥ž£«««¢ŠwG9}7" 5!­‰B&‡€z}z}z{v«x6¤¨¨©«­¦„F8T†¡„F’’–þðàÀ€€€€€€€€Ààðþ?( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwpÿðwwwwpÿðpwwwwwwÿðwwwwwwwÿðwˆwwwwwwpÿðw‡wwpwwpÿðw‡wwwwpÿðw‡wwwwpÿðw‡wwpwwpÿðw‡wwwwwwpÿðwˆwwwwwwÿðwxwwwwwwwwÿðww‡wwwwpw€ÿðww‡wwpˆˆw€ÿðwwøˆˆÿÿÿÿ€ˆˆ€wwˆˆˆˆˆˆˆ‡€ˆˆ€wwpÿÿøwwwwwwwwxˆˆˆˆ€wÿÿÿÿÿÿÿxˆˆöfffffoxˆˆ€öfffffoxÿÿöfffffoxˆˆ€öfffffoxöfffffoxöfffffoxöfffffoxöfffffoxöfffffoxöfffffoxÿÿÿÿÿÿÿxˆˆˆˆˆˆˆˆÿþÿÀøÿÀpÿÀ ÀÀ?À?À`?À`?À?À?ÀÀÀÀÀÀÀ€øüþÿÿøÿøÿøÿøÿøÿøÿøÿü( @€985oRwYoWFC=sX'=DwgvKfSus[TZy^b~ddaylgxreZŽw šq=oLŒuCš|F–uW¡tP—|c‡wx¢~`gœ^h©U|º[q…jp‹ph±nf·uzÁm|Ãzž†>¨Œ9ÿŽè–ú—ÿ2ÿ¡.›„L…“M‡Sœ†V‚œ\ž‘_£ŠA¨—Zšˆfž–f“ˆyœ™x£™i£Žz¤›wš©j°jŸ£w˜»y¥¥d°¢i¡¤xºªx¨³}Á²_é°Jÿ²PƯ}ÿ´ié®uŽÁhŒÅv—Äv)4…3<‚FP˜_fškvŽoy•z{”lv®p}¯u´^jÅr}Í…x†|‚z‰u«ƒz¹št¥¥~¸¯{ʼn‰„ƒ’Œ„ž—†‹‡—†˜•š–—£“ƒ¢•‹ ¥š–¬™“ —œ š®œ˜£‹ž­—Ÿµš¡¨†³ª†£´‹º·‰¡«’®­“¢£›© ¢¯Ÿ¸«–¤¹•ˆ–¨’˜©ˆœ°–ºˆ¬ª—¡­‚²«ž±§š¥¶Œµ°¼µ¤¥ ª¤¤¢¨£¨¨¤®§¨®«¬³«ª¦¹¥°¸¡»»¢¤¨±²®µ¬²¸´²²ºµ³¼¼µ³·¾¸µ¸¼ººÁ®‡Ã´†Ë¼—Ó¼”è¼–Á««Èµ²Ç»¼ŒË‰˜Ê…€ÅšÌ˜žÐ—§ÆŠ¦Ê˜·Í—«Ð“´ÔžË¯“̨‹È·™Ìµ¦Å¨§Ô¦¶×¨©È··Ìº©Õ»ºÛ¹É×ÑÀ•ÿÈ•ÁÁ¡ÊÅ¥ÃÄ«ÉÇ©×Ê©ÄÖ§×תÀÃ´ÍÆ±ÉË´ÀƺÄË»ÌË»ÓβÊÚ´ØÕ·ãͬäÕ¦ÿÓ©áÕ¸ÿÛ·‡Î—Ì‘ŸÃŒ•Ó‰§À“©À›¤×”¸Ó¥ªÌ«¶Ä¸ºÁ£«Û¦µÜ´¼ß¹¿ã›ÓÄ«ÍÁ¹ÉƤÑõ×Ë Äà¹ÆäÇÇÄÕÉÊÄÕÊÙÚÅÇËÔËÖÒרÖâÜÆáÜÜÊàÄÑàÅÆã×ÖåÚåáÎåä×ÄÊâÊÖè×ÛçÓÛðÛèæèêëæðíëìðíóñðññ”Ї‡‡ˆˆ””lhv¼ÃàŸjx™ebvºÃèìòòëææ¡ŸjiŒa9t½èòóóÙ ‡ííë啈gˆ59t½ÉòóùÆ$ííë嘇g”54AœÇìóóÆ$''ííæå“w853?šÇÉëòÆ%'(((”íëêÄŽn8e2A¾ÉÍòCDE*&&'eëëê糊bf™-2F¾ÍÍòìF̹G)5ëíëêàߎn3•e ,?›¾ÍÍÍòzÎιG`ëëêçà߆u4f,:A·¾ÊÍÍòzÎιG`êêâàáß°u63¡˜ /:Bt·¾ÊÍÍrÊÊžH‰êââß³³Žs9.zŒ;=§©¿¿¾É;ÍÊÀÂÁàâß³³°Ž{s<.8ˆ #£ª«²¿ÈÈÉÍÍÇÇÄß´³³°°{{{s<.ˆ!_¥¦µ¶¶¶îîïïïȰ°°¨{{{§ssB7+ˆ!#¢¦±²²ÈÈÈÀÀËÀ{ssuBBs@@@<4‹!"J£ª«¿ÈÈÀÀËÀ¿puqqqqq<770IK©¿ÈïììËÀÀÀŽŽpunqq974.™K§²ïòóòòïèÈÈÈÅÅ´´³‘‰on83h[¤­µðúúüúúññññùùùùùûú÷õõäãÓàlY¤¯âúúüüüúùøññúùûûûûûù÷õãã~X\¬âúðØõ “„Q|PØ æZ}R}ûûõãÓ„ed¬âúõÒSMUTÑLMéN×Oýû÷Û~X€áú÷ÒWÚÛôÕÕÕôVôÛÚÏ×ýýíÔ“˜c†âöÛÝõôÜÛôÚõÕ÷ÕÝÚÒûíØc…âõùúøùöøøûùûûùùùùà}”R‚áðñúúùúûûýýýûùíÙ„cZ‚¯âðøøøúûûùëåØÙ}Z]^®®Þëëé“}„‘||]~~—ÿÿÿÿÿðÿÿ€ÿÿÿü?øððàÀÀÀ€€€€€€€€ÀÀààððøü?ÿÿ€ÿÿðÿÿÿÿÿ(0`€ 6. <1 >8,++544A6 SIDA6!V"(Y&/o:BygvHiiVeuWsrRxldxwh{ww^ž|¤y ²}–^1Œg(˜g8šr>Æ{”dDšyE…y[™xWƒmoxj•~hnwˆvzi‡K}“KhŠXh—Y~™Xi¬Gy·Lg®Xvº[u…ifŸg~‰xg¥g~ ck³gyºhb©siºuy¿~xÂw¸ˆ ´ˆ°¢4Õ™ÿŽì˜ú•ÿ‘ÿŸ&þ3Ï©;þ¥:„L›N†„Pœ‡T›—X¥•[±Ÿ_¡]‰»U›‰fœ”gŽ€|–†wœ•x¢™i£Œu¡™w¨kž¦k„½`Ÿ¦yºr±v©¦g²¥j¢¤x¹©v¨³{·³|·]õ®Dþ®_ͳkعi«xʸyþ´c„Âl“ÁjŠÄx™Å{¤ÆyÓÀz-9‘KTŽ\dŠpsŒJX¿Xb«lv²nyʇw‰vŒ˜v¶Žuªw©¨mÁ€xƉ|Ä—~µ{…Ή…†’‰Š›—І†—˜Œ•›––¥–‰¦š—ž¦‹œ§–ž´˜¡¨‡¸­Š¥·Š¸·‹£¦—¼ª”£¸—··˜‰–«£§“¬®¨¨§¶«©¥·£º¶§¤©¶¨¶¶¹¸¸Ç¶ŠÇ»•Ó½˜ý¹‚¬«Ä¾®Æºº÷º¤‰ÉˆšË‰†É——̘›Ñ™¦Ëˆ¨ÇµÊ”¨Ñ˜¹Ñ›‡Ç¥”ͨҥˆÈ¸—Ë·ŸÐ¿¦Å§¾Ì¡§Ô¥¸Ö¤¨É·¶Ä¼§ÓµºÚµÅ—ÒÚþņþÊ›áÚœÈŦ×ʨÇ×¨ØØ©ÇȵÙÎ³ÉØµØÖ¸àÍ­àÖ¢þÓ«àϱ÷ɼáÕ¸þܸË໋”Ò•«Ï­¶Ó´»àÀ¾ÀпœÀÞ«ËÁ·ÊÅªÕÆ¶ÕɽÈÚ·ÞѼßÒ½àÓ·ÇçÆÇÆÒËËÆÔÊ×ÖÆÅÊÕËÖÓØÙ×âÛÅ÷ÙÍáÝÚ÷ßÒÉàÈÔáÈÉãÙÕåÜäàÊåä×÷áÕÏÖèÙæäèëêèðíððïèêðëóñðñðÙŸ™’’ˆ’ˆ’ŠŠŠŠ™ÙÙ™ˆ…‹’•œÅÉÉ¥¤š“ŠŠŠ™Ù™„…Ž•ÅÉÌÌçèñèÚÚÚ¦¤šŠ‰™™ˆ„_ÀÉÊèèëôõôëëæææÚ¦¤ŠŠ‰ŸÙ’„VŽ‘ÅÉÌñôõõõɃ„æîîîææ¦¦šŠ‰ŠÙˆQS`‘ÅÆÌñîõùõå%æùîîëæÙŸš’‰ŠÙÙ„RST‘ÀÉÌñîõùõèS;„æùîîææåŸˆSŠÙˆQOThÀÅÊìôîöõèP;??„æùîîææÙŸ™ˆU‰ŠQOK` ÅÆÊèîõõèP;?@@?ƒæîîëê罞’…SŠŸƒ#J^`¡ÅÊèìôõèP;?@@@@?„æøëëçå½›’…Ušˆ"IK`h¢ÆÊÒììôÀDdEBA@@@@=Ùëëëêå½¼™‹SUå™$JLh ¢ÊÊÒÒìôcggÂÂjEA><™ëëëëêçݼ›’SOŠ„HK^h ¢ÍÍÊÒììõÉ“ÏÏÃÂeE™îîøëêçÝݼž‹OUÙ™%FJ^h¢¢ÆÍÍÒììôÊ“ÓÓÏãj™îøëêêéßÜܼ›‹SIЇ FJ]b¡¢ÁÍÍÍÒìô¥“ÓÓÏÃÂe™ëëêêçßÝܼ¼›‹SOUåÙ% 'M]b‘ÁÁÆÍÐÒì쥠ÓÓÏãe’ëêççÝÝÜܼ¸›Œ_OI¤™$(*MXobÀÁÁÆÐÐÑÒÅ“ööíѧ£êêçÞÞÞܼ¼¸VP ‰Š(3W\a¯¯À¹ÆÆÒÒÒÅhpppiffT’åççÞÜÜܼ¸¸›VPIUˆ)25[n­¯¯±ÇÇÇÊÌÐÐÒÒÊÌÌçÚççÝßÜܼ¼¸¸¸›””ZPI ¦ˆ07km©­°»»»ÇÇËÌèÒÒÒÊÊÌ̽ÉÝܼ·¼¸¸¸””””ZPI ¤‡678¨¨¬º»¿¿¿¿ÔÔÔèÌÒÊÊÉɼܸ¸¼¸¸¸®›®””ZPœŠ/6~ª«´º¾¿¿Ôðððððñññññ»¬®º¸°”­aZXJ¤‡6~8¨ª¬ºº»¿¿¿¿ËÔÇÔÈÈÄÇÇŒŽŽaŽZaZaZXKJšŠ679m¨©°°º»»ÇÇÇÔÈÈÈÄÈȹŒ‰ŽŽŽŽŽŽZ_ZT_PIœˆ075kmn­°±»ÇÔÔÈÒÄÈÄÈÈǹœŒ‹ŽŽŽ_Ž_VTTPPIŸŠ)-.Yln­¯»ÇÔÔììÒÒÒÈÈÈÈÇ•™Œ‹‹‹‹V_VPTPIG¦—&+,Nlo­»ÇÔìììôôôôÈÌÈÈÇœœ››¸››Œ‹…_TPKI ¦š!/45km­ºÇñóõõúññÌñèÔËËçèèèççËÝÝž˜ž˜Œˆ…SRRå%1~²³¾ßòøúúúúúúõóóóòòøùùùùùùùùýü÷÷÷÷ääÛÛ˜ž‡{ª²¾Þãøúúýýýþúøõøóóóøùùûûûûûùûüü÷÷÷ääÛÛ–½š%z€²¾ßóúúýýýýþýúøøøøóøûùûùûùûûüüüü÷÷ääÛ}–„€²¶ÞóúúÛéý˜tózž|z½Ùt—†Ùýýü÷äÛÖ|žšyz²³Þòýú|ÖÙ tér žs t– tø w sûýý÷äÛÕ}釃²µÞøýýÕÕ‚qrw÷wwàxqvÖqwîvxéw rûûüý÷Ö|Ùy†˜·ãýýÛÕxxÖ‚ú÷ÛÖ‚Öà×u‚ü÷×Õ‚xéûûüüàÕ–—y}¶áøüØÕÕäØÖ÷ÕÕàäרä‚Õù‚‚äàÕÕûûùîž–½‡†™ÜáòäÛØü÷ØøØÛ÷×Ûä÷רüØ×÷Ø‚×ûùî×–™‡†}¶áà÷üüü÷üü÷î÷÷ûü÷üüü÷÷ü÷üüîÙ|˜‡t–¶áòøùùùùùùüûûûûûûûûûûûûüîé–™ˆt–¶áòøùúùüûùüùûûûûûûûüöî×–Ÿyt}˜¶·ãòóúøúùùûûûûüüîëØ–å—†z}}¶¶ÞÞááãòùùùîîÚ×—–å—†z|}}µÞëéé×––ç–zzz||||––––—ŸÝÝÝÝééæÿÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿÿüÿÿðÿÿàÿÿ€ÿÿÿþþü?øøððààÀÀÀÀÀÀÀÀÀÀÀÀÀÀààððøøüþ?ÿÿ€ÿÿÀÿÿàÿÿøÿÿüÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿÿÿ(  @ää丸¸Fšš˜s””ƒ•“‘ƒŸ››q¼¼¼Bçççôôô ºººDˆ…¤Ÿ†ãªúÒÓ¾þÓÍÂþÈ·¸û¬›æ–Œ‰¨¾¾¾@öööõõõ ¦¥¤_Š€qÕ¹³þÕÔ½ÿååØÿü£ÿngSÿÖÑÑÿ×ÑÑÿº¶¶ÿ˜ˆÝ®¬ª^ööö¾¾¾@…ykÔ³¤uþÒʬÿâßÎÿÉÁ¤ÿÝ”ÿцÿi`IÿÓÒÐÿÐÓÎÿ­µ®ÿ˜}áÀ¿¿Açççƒ}|ŸŽ\þɳ†ÿÛαÿâÜÅÿÓ»{ÿÿ¼nÿÿœ(ÿ¢|&ÿÉÉÇÿÐ×Ôÿ¶ÉÁÿ ©”ÿ˜‹|²ççç¿¿¿@qm\㕜YÿÆ»‹ÿÜ˨ÿãÖ½ÿÏÅ­ÿÿÚµÿÿ¾ÿ|oVÿÓÙÖÿÁÓÎÿ­ËÀÿ¤· ÿšŠiòÀ¾½G¤ ¢ek{[ùެjÿ³ÁŠÿÉÌ¡ÿÛѳÿÕÆ¨ÿáЭÿÜÁ›ÿ««˜ÿºÒÉÿ«Í¼ÿ§Æ­ÿ¤¶–ÿ’gþ§›’€ž˜šplžoü‡Ç‡ÿ¨Ó¡ÿ»Ú²ÿÈÞ»ÿÓÜ¿ÿØ×¼ÿÁÏ´ÿ­Ë±ÿ¨Æ§ÿ¦Àÿ¦¼“ÿ¤µˆÿ”`ÿ¡‹y ™šoknüƒÆ{ÿ£Ð”ÿ¹Ø§ÿÉܱÿÕܯÿÜØ¥ÿ½È¡ÿ °’ÿ¡¨ˆÿ¢©…ÿ¡¦{ÿ¡ŸpÿœˆSÿŸ‡uŸ©¤¦anŒYù…¾dÿ¬ÌÿÐݾÿàáËÿÞÚ¿ÿÔ×´ÿÉίÿ´¿­ÿ«¿¨ÿ£°ÿŸ§Žÿ˜vÿ˜Vÿ¤—ŒÉÉÉ7x‚xâ‹É£ÿÂàÑÿçòîÿíóñÿàëæÿÕçÞÿÝéãÿìììÿíííÿëìîÿ×Þðÿ¼Îëÿ¯Èú½¿ÁPïïïŒ„Š˜‡¸£þÌåÝÿ´¾Ùÿnw ÿ•¹ÿ~Ьÿw¤ÿ‰Œªÿ~ƒªÿin“ÿíîðÿ¼Êãÿˆ™«ÉçççÎÎÎ2‚‹Õ¶ÕËþ¶¿áÿ§¯Ýÿ¶¿ßÿ§±Úÿ²ºÞÿ§­Ûÿ¨®Üÿ–Óÿëììÿ¦´¾ô½¿ÁO·µ¸Q~…‘ÚªÍÇþØèäÿåìëÿãéëÿéííÿìíïÿëëïÿæçêÿµ¿Æó§®²töööÍÍÎ4‡Š—¤ž¡ìšÆ¾ý¯ÙÎþÌáÛþÝÞáþ½ÃÉø›¤®È¾ÂÄMöööïïïÇÇÊ=¡¥°v—¢­Œœ¦±¤©³ƒ¼¿ÃQèèèðÀ€€€Ààð( @ €öööçççÔÔÔ*¿¿¿?²²²L«««S¨¨¨V¨¨¨V«««S´´´JÂÂÂ<ØØØ&êêêõõõ ÞÞÞ ÀÀÀ>   ^†††y|{y–||v©}~v±€y³€y³‚zx±ƒzx©ƒ~|—ŠŠŠu¥¥¥YÄÄÄ:âââöööéééÈÈÈ6›››d}|{Œzwr¶‘Ž|Ü©¨ðºº úÃÄ«ýÉ˳þÊ̵þȵ²þÁªªû´  ò£ŠàŠ~z»…‚€Œ   _ÍÍÍ1ìììààà³³³K‚‚‚|tqn·”yê±®‹þÁÁ¡ÿÏϸÿØØÄÿÝÞÌÿßàÐÿßàÒÿÜÒÑÿØÌÍÿÓÆÈÿÇ»¼ÿ»««þ¨”ŽòŠ{v‡‡‡w¹¹¹EäääÙÙÙ%¢¢¢\vtt—€xoÙ©ž~þ¹´ÿÉÇ©ÿÖÕÀÿààÐÿää×ÿççÜÿ¼¼µÿddaÿ©¥¤ÿâÜÜÿâÝÝÿØÒÑÿÌÅÆÿ»µ¶ÿª¥£ÿœŒé…~z§§§WÝÝÝ!ââ⤤¤Zwts }p裘qý»³ŠÿÊÅ¥ÿÖÔ½ÿàßÏÿçæÛÿééßÿÊɾÿž†>ÿoWÿ<:6ÿ¯¬¬ÿåààÿáÜÜÿ×ÓÓÿÊÇÆÿ¹¸¸ÿ¤¥¢þœŽñ‹{ª¨¨¨Väääìì츸¸Fwuv”„wkå¡’gþ·ª{ÿÉ¿œÿÓβÿÞÛÈÿåãÖÿéèÝÿÉÈ»ÿ£ŠAÿè™ÿç—ÿoRÿFC=ÿ¯¬¬ÿáÞÞÿÝÛÚÿÓÓÐÿÆÉÅÿ¯¶³ÿ ¢˜ÿ›{ó‡z¢¹¹¹EìììÎÎÎ0ˆˆˆw}nkÚ›‰`ý°¢iÿÄ´ŠÿÒÇ©ÿÚÓ»ÿàÜÈÿåâÑÿËʽÿ¨Œ9ÿë–ÿÿ˜ÿÿ˜ÿð–ÿwYÿ765ÿ³±±ÿÝÜÚÿÙÛÖÿÎÓÍÿ¼ÇÀÿ¨´«ÿŸŸŽÿžŠsòЉÎÎÎ0ãã㣣£\pjl³{aü¨—Zÿ¾ªvÿι’ÿØÊ®ÿÝÓ¹ÿàÙÀÿåáÎÿÁ²_ÿé°Jÿÿ²Pÿÿ¡.ÿÿÿÿŽÿè’ÿŽw ÿ—•“ÿÙÙ×ÿ×Ú×ÿÎÕÑÿÀÎÇÿ­Â¸ÿ¢¯Ÿÿ—ÿ’~lÔ£¢¡aãããÇÇÇ8€‡vgbå‡Sÿ®ŸbÿƯ}ÿÓ¼”ÿÛʬÿÞвÿá×½ÿäßÊÿáÛ»ÿÁ®‡ÿÿѤÿÿË—ÿÿµkÿÿ2ÿZÿ’ŒvÿÙÙÖÿÚÝÛÿÓÙ×ÿÉÔÑÿ¼ÎÈÿ®Ç½ÿ¤ºªÿŸ¢Šÿœ†gúŽ…~šÅÅÅ9ëë먨¨Wrkl³toVüˆ‘Nÿ«¤fÿõ‚ÿÑÀ•ÿÛÈ¥ÿàίÿâÔ¸ÿäÜÆÿåßËÿ»®”ÿÿݺÿÿÖ®ÿÿÇ”ÿÿ´iÿsX'ÿˆ††ÿÜÝÚÿÕÚØÿÌ×ÓÿÁÒÎÿ´ÍÆÿ«Ê¾ÿ¥À®ÿ¢«’ÿ›‘lÿ•~gÕ§¦¦[êêêÛÛÛ#ŽŽŽtubcÝgvKÿ‚–Mÿ ¦cÿ¸¶€ÿÉÁ”ÿÖÇ¡ÿÞͪÿâÑ´ÿä×ÁÿâÚÃÿº¬‘ÿÿÞ¼ÿÿ×°ÿÿÇ•ÿÿµiÿsX(ÿ„„ƒÿÓØÕÿÊÖÑÿÁÓÍÿ¶ÏÉÿ«ÌÂÿ©Êºÿ¥Â­ÿ£°”ÿ˜sÿ™]ö—ŠˆÙÙÙ%ÌÌÌ2}pb]îfSÿ‚œ\ÿš©jÿ®¶}ÿ½¿ŽÿÉÆšÿǪ̃ÿÞЯÿãÓ¹ÿãÔ¼ÿµ§ÿéÒ¬ÿçÍ©ÿè¼–ÿé®uÿŒuCÿ¢¨£ÿË×Òÿ½ÔËÿ²ÑÆÿ«ÎÁÿ©Ì¹ÿ§È°ÿ¥¾¤ÿ£²‘ÿŸtÿœƒXþ~p¬ÄÄÄ:ÄÄÄ:}ux›po_÷gœ^ÿ°jÿ˜»yÿ©Ãˆÿ·Ë—ÿ¿ÎœÿÉÑ¥ÿÑÏ­ÿÚÓ·ÿáÒµÿÛÊ­ÿÜаÿ×ЯÿÔÒ¯ÿÍÆ±ÿÀôÿ¾ÍÅÿ¶ÑÈÿ¬ÎÁÿ¨Ê¸ÿ§É²ÿ¦Æ«ÿ¤¿¢ÿ¤º™ÿ£±‹ÿŸ¡wÿœˆYÿ’u^ÒµµµIÀÀÀ>}ru¡p‚fúh±nÿ~Áwÿ”Ê…ÿ£Ï’ÿ±Õ¡ÿºÙ¨ÿÀÚ¬ÿÇÚ°ÿÏÝ·ÿÖܹÿÜÔ¹ÿàÒ·ÿÙеÿÐÔµÿÀƺÿ·ËÀÿ«Ê»ÿ¨Ì·ÿ¨Ë´ÿ¥Ã©ÿ¥Á¢ÿ¤¾›ÿ¤º–ÿ¤¸‘ÿ£´‹ÿŸ¥wÿœ‡Sÿ—oN䬬¬R¾¾¾@~ps£nŠnûh»|ÿ{ʼnÿ̘ÿ Ñ¤ÿ¬Ö®ÿ·Ú·ÿ½Ü¼ÿÃßÀÿÈàÄÿÌàÅÿÐáÆÿÓàÄÿÕÚÀÿÊÙ¹ÿ«É¦ÿ¨Ë§ÿ©Ë¤ÿ©Åžÿ§¿•ÿ§¾”ÿ¨¾“ÿ§»ÿ§ºŒÿ¦·ˆÿ£°~ÿŸŸiÿ›„Lÿ™hAꨨ¨V¿¿¿?ps¢nŠkûg¹sÿ{Å~ÿŒË‰ÿžÐ—ÿ©Õ¡ÿ²Ø©ÿ»Û¯ÿÁݲÿÅݱÿÌÞ³ÿÒܯÿÚÚ©ÿàØ ÿÑÙ§ÿ§º™ÿ ²ÿ¡«Šÿ¡«‡ÿ¢¬…ÿ£­…ÿ£¬ƒÿ¢ª~ÿ¢¨zÿ¢¥vÿ¡¢qÿŸ—aÿšHÿ•c=ꨨ¨VÂÂÂ<~ruŸphúe³rÿzÁmÿŒÅvÿœË…ÿ«Ð“ÿ´ÔžÿÁبÿÌÛ°ÿÒܳÿÚܱÿÝÙ¨ÿÞצÿØ×§ÿÍ×£ÿ°¸¡ÿŸ³›ÿŸ¯“ÿŸ¦Œÿ ¤‡ÿ¡¦†ÿ¡¦„ÿ¡¤~ÿ¡ vÿ¡œoÿ ›kÿž‘_ÿšyDÿ“eD謬¬RÈÈÈ6€wz˜qsZ÷f©Tÿ{ºXÿŽÁhÿžÇ{ÿ±Î’ÿÁÖ§ÿÏÛ¶ÿÙß¿ÿàßÀÿâݺÿßÚ³ÿÛÙ¯ÿÔÙªÿÐÚ§ÿ»»£ÿ©²¡ÿ ³ÿŸ·šÿ ¬“ÿ ¦Žÿ¡¥‰ÿ¡£‚ÿ wÿ •kÿŸ‘cÿ†Tÿšq=ÿjPà´´´JÓÓÓ+ˆ„‰uj]ðkªWÿ}»_ÿÂrÿ¥ÊŒÿºÓ¨ÿÒßÇÿÝäÔÿãåÙÿâáÔÿÝÚÉÿÛ×ÅÿÔÕ¾ÿÍÓ¸ÿÊÔµÿÏϼÿÇË»ÿÂÌ»ÿºÍ»ÿ´Ë¹ÿ­Â´ÿŸ³ªÿ°¤ÿ«›ÿ›¡‹ÿš™}ÿ—‹mÿ‘xZÿ‰ynÉÃÃÃ;ãã㚘™kxdjÛu«ƒþ€Æ—ÿ“̨ÿ©Õ»ÿÉäØÿáíèÿçñíÿêñîÿêïîÿâëçÿØçßÿÔæÝÿÒæÛÿÑåÚÿæêèÿìëëÿìììÿìììÿìììÿìííÿåèíÿÒÛðÿÍØïÿÃÓíÿ¶Íëÿ Äàÿ«Àý•›šØØØ&ñññ ···Iyls³z€ú€ÅÿšÍ±ÿ»ÛËÿÜìæÿèôðÿî÷ôÿð÷õÿïôóÿéïîÿÞêåÿÙéâÿÕçßÿÔèßÿèìêÿíííÿíííÿîîîÿîîîÿîîîÿîîïÿèéïÿÕÜðÿÆÒîÿ°Æçÿ”¸Óÿ•ªì¤¦¨kêêêÕÕÕ)‹Ž}tgsåz¹šþ˯ÿ·ÜÎÿáðëÿÎÚåÿ¨²ÌÿÇÏ×ÿTZyÿª°¼ÿœ¥¸ÿoy•ÿˆ•¨ÿkvŽÿ±µÀÿ^b~ÿÍÎÔÿ}Ÿÿ’©ÿy}—ÿ‘¥ÿðððÿçéðÿÊÓìÿ¨¾ßÿ†£Àþš¿ÅÅÅ;ííí¶¶¶Jvhs³…—”üŽÇ°ÿ²ØÍÿæñïÿÌÓèÿ—Ìÿlv®ÿ3<ƒÿ˜ž¾ÿu´ÿp}¯ÿ‘ŸÃÿ)4…ÿ˜ž¿ÿ4=‚ÿÃÅÔÿFP˜ÿ§«Éÿ_fšÿ=DwÿðððÿïïðÿÝàéÿ¤·×ÿ{’¬óŸ¢¥tãããÝÝÝ!›œhudxÚˆª¦ü¤ÒÃÿßìèÿÖÛìÿŒ•Õÿr}Íÿ ¨Ûÿ¦¯Úÿ¿Èàÿ—¢Õÿ›§ÕÿžªÖÿ¼Âàÿ^jÅÿËÎäÿ©®ÜÿŸ¦Ùÿ‡Îÿ¤©ÏÿðððÿíííÿÜßàÿ“©Àþ‚‹”ªÍÎÎ2öööóóó ÌÌÌ3…}†“|‹ê¼µþ¹ÚÎÿÍÝåÿ§°Þÿ¹¿ãÿÒ×éÿÀÇâÿ´¼ßÿ§±ÜÿÂËâÿ¢¬ÛÿÌÑæÿš¢ÚÿÚÜêÿš¡Ùÿ¿Ããÿ¢©ÛÿŒ•Òÿïïîÿâããÿ®¼Áýy—Ö·¸¸LìììíííºººF€xƒ¡~|댵°ý°×ÌÿÌßáÿàéêÿåëìÿâèêÿãêêÿÝãéÿÜäèÿßçêÿêìîÿäåíÿíîðÿèéîÿäåíÿâãìÿèèíÿååæÿºÅÊýz™Ü¢¦¨käääèè躺ºG€y…šlk„䇮­ý¤ÑÃþÃâÖÿØéãÿåîêÿèîìÿéïíÿêïíÿëïîÿïððÿñññÿñññÿññðÿïïïÿìììÿâãäÿ³ÀÊü‘Ô¤§©jÞÞÞ íííÌÌÌ3™—›rniÄq…•ð‚²«ý™Ìºÿ³ÛÌÿÇäØÿÒèßÿ×êãÿÜìåÿëîíÿîîîÿííìÿçççÿÙÜÚÿ½ÄÊþ’¡±ðƒŽ˜§¹º»Kåååôôô ÞÞÞ!µ´¶O‰‡’rtŠÈq‡–îr¤¤ú}¸¯ý†Ä¸þ;þ›ÓÄÿÎÙÙþÒÔÙþÆÊÑý«³¿ú‰•¥ëŠ—½Ÿ¢¦tÐÐÐ0îîîíííÖÖÖ)µµ·O“’›y~‘¯o|’Ël•Øm†œÝq‹¢ß‚Ž¥Ý‚Š Ø~ˆšÊ‡Ž™¡¢¥ªmÇÈÈ:åååòòò äääÔÔÔ*ÈÈÈ6ÂÂÂ<¿¿¿?¾¾¾@ÀÀÀ?ÄÄÄ:ÌÌÌ2ÜÜÜ"ìììÿ€ÿþü?øðàÀÀ€€€€ÀÀàðøü?ÿÿÿÀÿ(0` €%À¾Àÿ¹¸¸ÿ¨¨§ÿ£¦—ÿ£¦—ÿ›––ÿ£¦—ÿ›––ÿ£¦—ÿ¦š—ÿ¦š—ÿ¦š—ÿ¦š—ÿ¨¨§ÿÀ¾ÀÿÀ¾Àÿ¨¨§ÿ›––ÿ›—Šÿž¦‹ÿ£¦—ÿ··˜ÿº¶§ÿÈŦÿÇȵÿÇȵÿľ®ÿ¬«ÿ¶«©ÿ¼ª”ÿ¦š—ÿ¦š—ÿ¦š—ÿ¨¨§ÿÀ¾Àÿ¨¨§ÿ’‰Šÿ›—Šÿ¡¨‡ÿ··˜ÿÈŦÿÇȵÿØÖ¸ÿØÖ¸ÿÆÔÊÿ×ÖÆÿÔáÈÿ×ÖÆÿпÂÿпÂÿпÂÿƺºÿ¬«ÿ¶«©ÿ¦š—ÿ¥–‰ÿ¨¨§ÿ¨¨§ÿ›––ÿ’‰Šÿ¢¤xÿ¸­ŠÿÅ—ÿÇȵÿÙγÿ×ÖÆÿ×ÖÆÿØÙ×ÿäàÊÿåä×ÿäàÊÿØÙ×ÿØÙ×ÿÒËËÿÒËËÿÒËËÿпÂÿƺºÿ¬«ÿ¦š—ÿ¦š—ÿ¥–‰ÿ¹¸¸ÿÀ¾Àÿ£¦—ÿ’‰Šÿ¡™wÿ¡¨‡ÿ¸·‹ÿÈŦÿÇȵÿØÖ¸ÿÔáÈÿäàÊÿåä×ÿåä×ÿåä×ÿÇȵÿ‰…†ÿ’‰ŠÿÒËËÿáÝÚÿáÝÚÿáÝÚÿÒËËÿÒËËÿƺºÿƺºÿ¶«©ÿ¦š—ÿ¥–‰ÿ¦š—ÿÀ¾Àÿ›––ÿŽ€|ÿœ•xÿ¹©vÿ¸·‹ÿÈŦÿ×ʨÿØÖ¸ÿÔáÈÿáÝÚÿåä×ÿèëêÿåä×ÿÆÇÆÿ…y[ÿ>8ÿ,++ÿˆvzÿÒËËÿèëêÿáÝÚÿáÝÚÿØÙ×ÿÒËËÿÀ¾Àÿ¹¸¸ÿ¶«©ÿ£¦—ÿ¥–‰ÿ¦š—ÿÀ¾ÀÿÀ¾Àÿ’‰Šÿ–†wÿœ•xÿ¢™iÿ¸·‹ÿÅ—ÿÇȵÿØÖ¸ÿÔáÈÿáÝÚÿåä×ÿèëêÿåä×ÿ×ÖÆÿœ•xÿ´ˆÿž|ÿ6. ÿ544ÿ’‰ŠÿÒËËÿèëêÿáÝÚÿáÝÚÿÒËËÿÒËËÿÆÇÆÿ¹¸¸ÿ¤©¶ÿ›––ÿœ•xÿ¦š—ÿÀ¾Àÿ›––ÿŽ€|ÿ›‰fÿ¢™iÿ«xÿÅ—ÿÈŦÿÙγÿâÛÅÿäàÊÿáÝÚÿ÷áÕÿåä×ÿ×ÖÆÿœ”gÿ´ˆÿì˜ÿì˜ÿž|ÿ<1 ÿ544ÿ’‰ŠÿÒËËÿèëêÿáÝÚÿáÝÚÿÒËËÿÒËËÿÀ¾Àÿ¹¸¸ÿ¨¨§ÿ›––ÿ£Œuÿ¥–‰ÿ¦š—ÿŽ€|ÿ›‰fÿ¥•[ÿ¹©vÿǶŠÿÈŦÿ×ʨÿÙγÿ×ÖÆÿáÝÚÿåä×ÿåä×ÿ×ÖÆÿœ”gÿ´ˆÿì˜ÿú•ÿú•ÿì˜ÿ²}ÿA6 ÿ544ÿ‰…†ÿÒËËÿáÝÚÿáÝÚÿØÙ×ÿËÖÓÿÆÔÊÿ¶Ä¼ÿ¨¶¶ÿ£¦—ÿ›—Šÿœ•xÿ¦š—ÿ¹¸¸ÿ‰…†ÿ•~hÿ›—Xÿ²¥jÿ¹©vÿÇ»•ÿÈŦÿÙγÿ×ÖÆÿâÛÅÿäàÊÿåä×ÿ×ÖÆÿœ”gÿ´ˆÿì˜ÿú•ÿú•ÿú•ÿú•ÿì˜ÿ²}ÿ6. ÿ544ÿ’‰ŠÿÒËËÿÙæäÿØÙ×ÿØÙ×ÿÆÔÊÿÆÇÆÿ¶Ä¼ÿ¥·£ÿ£¦—ÿ›—Šÿ£Œuÿ¶«©ÿ›––ÿxjÿœ‡Tÿ¥•[ÿ¹©vÿ«xÿÓ½˜ÿ×ʨÿÙγÿáÕ¸ÿâÛÅÿâÛÅÿäàÊÿÅ—ÿÏ©;ÿõ®Dÿþ¥:ÿÿŸ&ÿÿ‘ÿú•ÿú•ÿú•ÿú•ÿÕ™ÿSIÿ{wwÿÀ¾ÀÿØÙ×ÿØÙ×ÿØÙ×ÿËÖÓÿÆÇÆÿ¶Ä¼ÿ¨É·ÿ¨¨§ÿž¦‹ÿœ•xÿ£ŒuÿÆÇÆÿ¨¨§ÿnwÿ…y[ÿ›—Xÿ±Ÿ_ÿ«xÿǶŠÿÓ½˜ÿÙγÿÙγÿáÕ¸ÿáÕ¸ÿâÛÅÿäàÊÿ·]ÿعiÿعiÿþņÿþņÿþ´cÿþ¥:ÿÿ‘ÿÿŽÿÆ{ÿž|ÿ°¢4ÿ¨¨§ÿØÙ×ÿØÙ×ÿØÙ×ÿØÙ×ÿËÖÓÿÆÔÊÿ·ÊÅÿ¨É·ÿ¥·£ÿ£¦—ÿœ•xÿ›‰fÿ¦š—ÿ’‰Šÿxldÿ†„Pÿ¥•[ÿ²¥jÿ«xÿǶŠÿÓ½˜ÿàÍ­ÿàÍ­ÿÙγÿáÕ¸ÿâÛÅÿâÛÅÿåä×ÿÇȵÿ¼ª”ÿþÓ«ÿþÓ«ÿþÊ›ÿþņÿþ®_ÿþ¥:ÿ^ÿDA6ÿ¨¨§ÿáÝÚÿáÝÚÿÙæäÿØÙ×ÿËÖÓÿÆÔÊÿ·ÊÅÿ·ÊÅÿ¨É·ÿ¨¶¶ÿž´˜ÿž¦‹ÿ›‰fÿ£ŒuÿÀ¾Àÿ¨¨§ÿˆvzÿsrRÿ„Lÿ›—Xÿ²¥jÿ«xÿÓ½˜ÿÓ½˜ÿ×ʨÿàÍ­ÿàÍ­ÿáÕ¸ÿâÛÅÿâÛÅÿäàÊÿÙγÿ¼ª”ÿþܸÿþܸÿþÓ«ÿþÊ›ÿý¹‚ÿþ´cÿŒg(ÿDA6ÿ¨¨§ÿáÝÚÿÙæäÿØÙ×ÿËÖÓÿËÖÓÿÅÊÕÿ¶ÕÉÿ«ËÁÿ«ËÁÿ¨É·ÿ¥·£ÿž¦‹ÿœ•xÿœ‡Tÿ¦š—ÿ˜Œ•ÿxldÿgvHÿ„Lÿ›—Xÿ©¦gÿ·³|ÿÇ»•ÿÓ½˜ÿÒÚÿàÍ­ÿàÍ­ÿàÍ­ÿáÕ¸ÿâÛÅÿäàÊÿľ®ÿ¼ª”ÿþܸÿþܸÿþÓ«ÿþÊ›ÿþņÿþ®_ÿŒg(ÿDA6ÿ¨¨§ÿØÙ×ÿØÙ×ÿËÖÓÿËÖÓÿÆÔÊÿ¶ÕÉÿ·ÊÅÿ«ËÁÿ¨É·ÿ¨É·ÿ¥·£ÿž¦‹ÿœ•xÿ›‰fÿ£ŒuÿÆÇÆÿÀ¾ÀÿˆvzÿsrRÿgvHÿ}“Kÿ¡]ÿ©¦gÿ·³|ÿ¸·‹ÿÒÚÿÒÚÿ×ʨÿàÍ­ÿàϱÿáÕ¸ÿâÛÅÿâÛÅÿľ®ÿǶŠÿþܸÿþܸÿþÓ«ÿþÊ›ÿý¹‚ÿþ®_ÿŒg(ÿDA6ÿ£¦—ÿØÙ×ÿËÖÓÿÆÔÊÿÆÔÊÿ·ÊÅÿ·ÊÅÿ«ËÁÿ«ËÁÿ¨É·ÿ¦Å§ÿ¥·£ÿœ§–ÿ¢¤xÿ›‰fÿœ‡Tÿ¬«ÿ¨¨§ÿnwÿiiVÿhŠXÿ~™Xÿ¡]ÿž¦kÿ¤Æyÿ·³|ÿÅ—ÿÒÚÿÒÚÿ×ʨÿàϱÿàϱÿ÷ɼÿáÕ¸ÿÈŦÿ¼ª”ÿ÷áÕÿ÷áÕÿ÷ÙÍÿ÷ɼÿ÷º¤ÿý¹‚ÿšr>ÿiiVÿ¤©¶ÿËÖÓÿËÖÓÿÆÔÊÿªÕÆÿªÕÆÿªÕÆÿ«ËÁÿ¨É·ÿ¨É·ÿ¦Å§ÿž´˜ÿ¥·Šÿ¡™wÿœ”gÿ™xWÿ¥–‰ÿ¦š—ÿxldÿeuWÿhŠXÿ~ cÿ¨kÿ±vÿ¨³{ÿµÊ”ÿµÊ”ÿÅ—ÿ¾Ì¡ÿ×ʨÿ×ʨÿáÕ¸ÿáÕ¸ÿáÕ¸ÿÈŦÿ«xÿÓÀzÿÓÀzÿÓÀzÿʸyÿͳkÿͳkÿ¢™iÿ£¦—ÿÆÇÆÿÆÔÊÿÆÔÊÿªÕÆÿ«ËÁÿ«ËÁÿ«ËÁÿ¨É·ÿ¦Å§ÿ¦Å§ÿ¥·£ÿž´˜ÿ¥·Šÿ¡™wÿœ”gÿœ‡Tÿ£Œuÿ›––ÿxldÿh—Yÿg¥gÿyºhÿºrÿ™Å{ÿ¦ËˆÿµÊ”ÿµÊ”ÿ¹Ñ›ÿÇרÿÇרÿÇרÿÙγÿØÖ¸ÿàϱÿàϱÿáÕ¸ÿáÕ¸ÿÙγÿØÖ¸ÿØÖ¸ÿÆÔÊÿпÂÿÆÔÊÿÆÔÊÿ·ÊÅÿ¶ÕÉÿ«ËÁÿ«ËÁÿ¨É·ÿ¨É·ÿ¦Å§ÿ¦Å§ÿ¦Å§ÿ¥·£ÿ£¸—ÿ£¸—ÿ¥·ŠÿŸ¦yÿœ”gÿœ‡Tÿ™xWÿƺºÿ›––ÿxwhÿfŸgÿiºuÿ„ÂlÿŠÄxÿšË‰ÿ¦Ëˆÿ¨Ñ˜ÿ¸Ö¤ÿ¸Ö¤ÿ¸Ö¤ÿÇרÿÇרÿÉØµÿØÖ¸ÿ×ÖÆÿáÕ¸ÿáÕ¸ÿáÕ¸ÿÙγÿÙγÿØÖ¸ÿØÖ¸ÿ¶Ä¼ÿÇȵÿ·ÊÅÿ«ËÁÿ¨É·ÿŸÐ¿ÿ¨É·ÿ¦Å§ÿ¦Å§ÿ¦Å§ÿ£¸—ÿ£¸—ÿ£¸—ÿ£¸—ÿ¥·Šÿ¥·ŠÿŸ¦yÿœ”gÿœ‡Tÿ™xWÿ¬«ÿ˜Œ•ÿxwhÿb©sÿiºuÿy¿~ÿ‰Éˆÿ‰Éˆÿ›Ñ™ÿ§Ô¥ÿ¸Ö¤ÿºÚµÿºÚµÿºÚµÿºÚµÿËà»ÿËà»ÿËà»ÿ×ÖÆÿØÖ¸ÿáÕ¸ÿÙγÿÙγÿÇȵÿÇȵÿ¨É·ÿ«ËÁÿ¦Å§ÿ¦Å§ÿ¨É·ÿ¦Å§ÿ¦Å§ÿ¦Å§ÿ¨Çÿ¥·£ÿ¨Çÿ£¸—ÿ£¸—ÿ¥·Šÿ¥·Šÿ¥·ŠÿŸ¦yÿœ”gÿšyEÿ˜g8ÿº¶§ÿ¦š—ÿu…iÿb©sÿmÁ€ÿxƉÿ†É—ÿ—̘ÿÒ¥ÿ§Ô¥ÿ§ÓµÿºÚµÿºÚµÿËà»ÿÉàÈÿÉàÈÿÉàÈÿÉàÈÿÉàÈÿÔáÈÿÔáÈÿÔáÈÿÔáÈÿÔáÈÿ¸Ö¤ÿ›Ñ™ÿ¨Çÿ§Ô¥ÿ¦Å§ÿ¨Ñ˜ÿ¥·Šÿ£¸—ÿ¥·Šÿ¥·Šÿ¦Ëˆÿ¥·Šÿ¥·Šÿ¥·Šÿ¥·Šÿ¨³{ÿŸ¦yÿž¦kÿ›—XÿšyEÿ˜g8ÿ¬«ÿ˜Œ•ÿxwhÿb©sÿmÁ€ÿy¿~ÿ‰Éˆÿ†É—ÿ›Ñ™ÿ§Ô¥ÿ§Ô¥ÿ¸Ö¤ÿºÚµÿºÚµÿºÚµÿºÚµÿÉØµÿËà»ÿÇרÿËà»ÿØØ©ÿØØ©ÿáÚœÿÇרÿÇרÿœ§–ÿ¥·Šÿ¥·Šÿ¡¨‡ÿ¥·Šÿ¡¨‡ÿ¥·Šÿ¥·Šÿ¨³{ÿ¡¨‡ÿŸ¦yÿ¨³{ÿŸ¦yÿ¨³{ÿŸ¦yÿž¦kÿ¥•[ÿ›—XÿšyEÿ–^1ÿ¶«©ÿ¦š—ÿxwhÿb©sÿiºuÿxÂwÿŠÄxÿ‰ÉˆÿšË‰ÿ¨Ñ˜ÿ¨Ñ˜ÿ§Ô¥ÿ¸Ö¤ÿ¸Ö¤ÿÇרÿÇרÿÇרÿËà»ÿØØ©ÿØØ©ÿØØ©ÿáÚœÿØØ©ÿØØ©ÿ¾Ì¡ÿž´˜ÿž´˜ÿœ§–ÿ¥·Šÿ¥–‰ÿ¡¨‡ÿ¡¨‡ÿ¡¨‡ÿ¡¨‡ÿ¡¨‡ÿ¡¨‡ÿŸ¦yÿ¢¤xÿŸ¦yÿ¢™iÿ¢¤xÿœ”gÿœ‡TÿšyEÿ–^1ÿº¶§ÿ›––ÿxwhÿfŸgÿiºuÿyºhÿ„ÂlÿŠÄxÿ™Å{ÿ¦Ëˆÿ¨Ñ˜ÿ¹Ñ›ÿ¸Ö¤ÿÇרÿËà»ÿËà»ÿØØ©ÿáÕ¸ÿáÚœÿØØ©ÿáÚœÿØØ©ÿØØ©ÿÇרÿ¾Ì¡ÿº¶§ÿž´˜ÿž´˜ÿœ§–ÿ¥·Šÿž¦‹ÿ¡¨‡ÿ¡¨‡ÿ¡¨‡ÿ¢¤xÿ¡¨‡ÿ¢¤xÿ¡™wÿ¢™iÿ¢™iÿœ”gÿœ”gÿœ‡Tÿšr>ÿ–^1ÿ¹¸¸ÿ¦š—ÿxldÿh—Yÿg®Xÿvº[ÿ„½`ÿ“Ájÿ™Å{ÿ¦ËˆÿµÊ”ÿ¸Ö¤ÿÇרÿËà»ÿËà»ÿâÛÅÿâÛÅÿáÕ¸ÿáÕ¸ÿáÕ¸ÿØØ©ÿØØ©ÿØØ©ÿØØ©ÿÇרÿ··˜ÿ¨¨§ÿž´˜ÿž´˜ÿž´˜ÿœ§–ÿž¦‹ÿž¦‹ÿž¦‹ÿž¦‹ÿ¡™wÿ¢¤xÿ¡™wÿœ”gÿ¢™iÿœ”gÿœ‡Tÿ›Nÿ˜g8ÿ”dDÿƺºÿ£§ÿxldÿi‡Kÿi¬Gÿy·Lÿ‰»Uÿ“Ájÿ¤Æyÿ¦Ëˆÿ¸Ö¤ÿÇרÿËà»ÿâÛÅÿâÛÅÿâÛÅÿäàÊÿäàÊÿäàÊÿäàÊÿØØ©ÿØÖ¸ÿØØ©ÿØØ©ÿÇרÿº¶§ÿº¶§ÿ¥·£ÿ¥·£ÿ¦Å§ÿ¥·£ÿ¥·£ÿœ§–ÿ¥·Šÿž¦‹ÿ¥·Šÿ›—Šÿ¢¤xÿ¢™iÿœ”gÿ¥•[ÿœ‡TÿšyEÿšr>ÿ™xWÿƺºÿ¶«©ÿƒmoÿu…iÿk³gÿyºhÿ„ÂlÿŠÄxÿ¦Ëˆÿ§Ô¥ÿÇרÿÔáÈÿÕåÜÿåä×ÿåä×ÿèðíÿÔáÈÿÔáÈÿØÖ¸ÿÔáÈÿ×ÖÆÿËà»ÿÉØµÿÉØµÿÆÔÊÿ×ÖÆÿ×ÖÆÿ×ÖÆÿÆÔÊÿÆÔÊÿÉØµÿ·ÊÅÿ·ÊÅÿ¨¶¶ÿ¤©¶ÿ“¬®ÿ¨¶¶ÿ“¬®ÿœ§–ÿ›––ÿ›—Šÿœ•xÿ–†wÿxldÿ–†wÿÆÇÆÿˆvzÿ~‰xÿmÁ€ÿxƉÿ‡Ç¥ÿ”ͨÿ§Óµÿ¶ÕÉÿÉãÙÿÙæäÿèðíÿèðíÿèðíÿèðíÿèðíÿèðíÿåä×ÿÕåÜÿÕåÜÿÕåÜÿÉãÙÿÉãÙÿÙæäÿèëêÿèëêÿèëêÿèëêÿèëêÿèëêÿèëêÿèëêÿëóñÿèêðÿÏÖèÿÏÖèÿÏÖèÿÏÖèÿ·Ççÿ·ÇçÿœÀÞÿœÀÞÿ“¬®ÿ¨¶¶ÿ˜Œ•ÿ{wwÿv¶Žÿ†É—ÿ‡Ç¥ÿ§ÓµÿªÕÆÿ½àÓÿÙæäÿèðíÿèðíÿëóñÿëóñÿëóñÿðñðÿèðíÿÙæäÿåä×ÿÙæäÿÕåÜÿÕåÜÿÕåÜÿÙæäÿèëêÿèëêÿððïÿððïÿððïÿððïÿððïÿèëêÿððïÿèêðÿèêðÿÏÖèÿÏÖèÿÏÖèÿ·Ççÿ·ÇçÿœÀÞÿœÀÞÿ‰–«ÿ¶Ä¼ÿ¶«©ÿˆvzÿvŒ˜ÿ|Ä—ÿ‡Ç¥ÿ§Óµÿ¶ÕÉÿÕåÜÿèðíÿèðíÿëóñÿëóñÿëóñÿëóñÿðñðÿëóñÿèðíÿÙæäÿÙæäÿÙæäÿÙæäÿÕåÜÿÙæäÿððïÿèëêÿððïÿèëêÿððïÿèëêÿððïÿððïÿèêðÿèêðÿèêðÿèêðÿÏÖèÿÏÖèÿ·Ççÿ·ÇçÿœÀÞÿw©¨ÿ‰–«ÿ’‰Šÿ{wwÿ|Ä—ÿ‡Ç¥ÿ—Ë·ÿªÕÆÿÕåÜÿèðíÿèðíÿœÀÞÿÅÊÕÿëóñÿ“¬®ÿpsŒÿ¤©¶ÿÕåÜÿ¤©¶ÿvŒ˜ÿ¨¶¶ÿuªÿvŒ˜ÿ¶Ä¼ÿÀ¾ÀÿpsŒÿ£§ÿáÝÚÿ¤©¶ÿ††—ÿ¤©¶ÿ£§ÿ††—ÿÀ¾ÀÿëóñÿëóñÿèêðÿÏÖèÿ·ÇçÿœÀÞÿ•«Ïÿuªÿ¨¶¶ÿ¶«©ÿ‡w‰ÿvŒ˜ÿ‡Ç¥ÿ”ͨÿªÕÆÿÉãÙÿëóñÿèðíÿuªÿ•«ÏÿÀ¾Àÿ:Byÿ!VÿpsŒÿÅÊÕÿKTŽÿ:Byÿ¨¶¶ÿ\dŠÿ&/oÿpsŒÿ‰–«ÿ!VÿpsŒÿÙæäÿ:Byÿ:Byÿ¤©¶ÿlv²ÿ!Vÿ\dŠÿððïÿëóñÿëóñÿÏÖèÿ·ÇçÿœÀÞÿ‹”Òÿw©¨ÿÅÊÕÿ˜Œ•ÿ‰…†ÿ‡Ç¥ÿˆÈ¸ÿªÕÆÿÙæäÿëóñÿëóñÿ‹”Òÿ‹”Òÿ{…Îÿ-9‘ÿKTŽÿlv²ÿÏÖèÿlv²ÿlv²ÿ½ÈÚÿnyÊÿ-9‘ÿXb«ÿ•«Ïÿ-9‘ÿlv²ÿáÝÚÿXb«ÿnyÊÿÅÊÕÿlv²ÿ&/oÿKTŽÿððïÿððïÿèêðÿëóñÿÏÖèÿ•«Ïÿuªÿ¤©¶ÿÀ¾Àÿ‡w‰ÿ††—ÿ“¬®ÿŸÐ¿ÿ½àÓÿëóñÿëóñÿœÀÞÿ‹”ÒÿnyÊÿnyÊÿ•«Ïÿ{…ÎÿèðíÿÏÖèÿœÀÞÿ•«Ïÿ{…Îÿ•«Ïÿ½ÈÚÿ­¶ÓÿJX¿ÿ{…ÎÿèêðÿÏÖèÿ­¶Óÿ‹”Òÿ{…ÎÿnyÊÿÅÊÕÿððïÿððïÿèêðÿèêðÿ½ÈÚÿ‹”Òÿ‰–«ÿ£§ÿ‡w‰ÿw©¨ÿ—Ë·ÿ·ÞÑÿÙæäÿèêðÿ´»àÿ‹”Òÿ‹”Òÿ·Ççÿ´»àÿ•«ÏÿÏÖèÿ‹”Òÿ‹”Òÿ½ÈÚÿ·Ççÿ­¶Óÿ´»àÿ·Ççÿ{…Îÿ‹”Òÿèëêÿ{…Îÿ{…Îÿ·Ççÿ½ÈÚÿ‹”Òÿ‹”ÒÿððïÿððïÿèëêÿáÝÚÿ¨¶¶ÿ‰–«ÿ¶Ä¼ÿ˜Œ•ÿ††—ÿ¨¨§ÿ«ËÁÿ·ÞÑÿÉãÙÿ·ÇçÿœÀÞÿ´»àÿèêðÿÏÖèÿ´»àÿÙæäÿ´»àÿœÀÞÿÏÖèÿ­¶ÓÿœÀÞÿ·ÇçÿÏÖèÿ­¶Óÿ´»àÿèêðÿ´»àÿ­¶ÓÿÏÖèÿ´»àÿ{…Îÿ­¶ÓÿððïÿèëêÿáÝÚÿ­¶Óÿ‰–«ÿ¨¨§ÿ˜Œ•ÿ††—ÿw©¨ÿ—Ë·ÿ·ÞÑÿ½ÈÚÿÏÖèÿèêðÿèêðÿèêðÿÏÖèÿèêðÿèêðÿÏÖèÿáÝÚÿÏÖèÿÏÖèÿððïÿèêðÿÏÖèÿèêðÿèêðÿèêðÿÏÖèÿÏÖèÿèêðÿÏÖèÿèêðÿèêðÿáÝÚÿÀ¾Àÿuªÿ“¬®ÿ˜Œ•ÿpsŒÿ‰–«ÿ—Ë·ÿ·ÞÑÿÉãÙÿÙæäÿèëêÿèëêÿèëêÿèëêÿèëêÿèëêÿèêðÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿèêðÿáÝÚÿÅÊÕÿ‰–«ÿ¨¨§ÿ›––ÿpsŒÿ‰–«ÿ~µÿ—Ë·ÿ·ÞÑÿÉãÙÿÙæäÿèëêÿèðíÿèëêÿèêðÿððïÿèëêÿèêðÿèëêÿððïÿððïÿððïÿððïÿððïÿððïÿððïÿèêðÿ÷áÕÿáÝÚÿ­¶Óÿ‰–«ÿ¤©¶ÿ¹¸¸ÿ‡w‰ÿpsŒÿw©¨ÿ“¬®ÿ—Ë·ÿŸÐ¿ÿ½àÓÿÉãÙÿÕåÜÿèðíÿÙæäÿèðíÿèëêÿèëêÿððïÿððïÿððïÿððïÿèêðÿèêðÿáÝÚÿØÙ×ÿ´»àÿ¤©¶ÿ‰–«ÿÆÇÆÿ£§ÿ††—ÿvŒ˜ÿw©¨ÿw©¨ÿ—Ë·ÿ—Ë·ÿªÕÆÿªÕÆÿ·ÞÑÿ·ÞÑÿ½àÓÿÉãÙÿèëêÿèëêÿèëêÿáÝÚÿáÝÚÿпÂÿ­¶Óÿ£§ÿ‰–«ÿ¤©¶ÿÆÇÆÿ£§ÿ††—ÿvŒ˜ÿuªÿw©¨ÿw©¨ÿ~µÿ~µÿ~µÿˆÈ¸ÿªÕÆÿØÙ×ÿÅÊÕÿÅÊÕÿ­¶Óÿ¤©¶ÿ‰–«ÿ‰–«ÿ¤©¶ÿÆÔÊÿ¤©¶ÿ‰–«ÿvŒ˜ÿvŒ˜ÿvŒ˜ÿuªÿuªÿuªÿuªÿ‰–«ÿ‰–«ÿ‰–«ÿ‰–«ÿ£§ÿ¹¸¸ÿ·ÊÅÿ·ÊÅÿ·ÊÅÿ·ÊÅÿÅÊÕÿÅÊÕÿÒËËÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿ€ÿÿÿÿÿüÿÿÿÿðÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿþÿÿþÿÿü?ÿÿøÿÿøÿÿðÿÿðÿÿàÿÿàÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿàÿÿàÿÿðÿÿðÿÿøÿÿøÿÿüÿÿþ?ÿÿÿÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿøÿÿÿÿüÿÿÿÿÿ€ÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/modern-install.ico000077500000000000000000000331161477201124000222560ustar00rootroot00000000000000(vhž è ¨î 00¨– h>!  ¨¦%( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxöfffoxöfffoxöfffoxöfffoxöfffoxöfffoxöfffoxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @i`IngS|oVn~^¢|&˜V€}mqŽ\lžomŸpцÝ”ÿœ(œˆSŽ\•œY”`’gŸp˜v¡Ÿpެj…¾d¡¦{³¤uÓ»{ÿ¼nÿ¾ƒÆ{in“nw w¤~ƒª~Ь™ƒ‡‡”ˆ•–ž¤šŒ¥—Ÿ§Ž¢©…¡¨ˆ¤µˆ¹³©§“ ©”««˜ °’¤¶–¦¼“£°‰Œª– •¹ˆ¥¨‡¸£´¦¤·®£±­­¤· ­µ®«¿¨²°¬´¿­¡®¼¹³±º¶¶±³¼°·¿ºµ¹É³†Æ»‹Ã¼£Ã´¨Å·¬È¸¹‡Ç‡³ÁŠ¬Ì¦À£Ð”‹É£šÆ¾¨Æ§§Æ­½È¡¨Ó¡¹Ø§­Ë±«Í¼»Ú²ÜÁ›ÉÁ¤ÉÌ¡ÃëÏÅ­ÉÎ¯ÕÆ¨ÒʬÜË¨ÜØ¥ÕܯÁÏ´ÛαÉܱÈÞ»Ô×´ÛѳÒÓ¾ÕÔ½Ø×¼ÑܾÞÚ¿áЭãÖ½ÿÚµ–Ó’°É©·À§­Û§¯Ý¨®Ü§±Ú´¾Ù²ºÞ¶¿ß¶¿á­ËÀªÍǶÉÁ¸ÂȾÄʯÙζÕ˺ÒɼÊã¼ÎëÍÅÀÈÇÆÈÈÆÓÍÂÒÌÈÁÓÎÐÓÎÅËÑÇÍÓÓÒÐÖÑÑÐÒ×Ð×ÔÓÙÖâÜÅâßÎÂàÑÌáÛÌåÝÕçÞàáËååØÝÞá×ÞðÝéãØèäàëææçêãéëåìëëëïêìíììíçòîíîðíóñŒ@.`nŽM:C%-n J••C(#dš^ •‘>'<Hi™ —ƒ/;Ietau—=O_mcs]0ˆ[V2 NX\kqphZUQ3,L RYjgfW2+*KPqŸrlbA?4)‹$S›¬®¥ž£«««¢ŠwG9}7" 5!­‰B&‡€z}z}z{v«x6¤¨¨©«­¦„F8T†¡„F’’–þðàÀ€€€€€€€€Ààðþ?( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwpÿðwwwwpÿðpwwwwwwÿðwwwwwwwÿðwˆwwwwwwpÿðw‡wwpwwpÿðw‡wwwwpÿðw‡wwwwpÿðw‡wwpwwpÿðw‡wwwwwwpÿðwˆwwwwwwÿðwxwwwwwwwwÿðww‡wwwwpw€ÿðww‡wwpˆˆw€ÿðwwøˆˆÿÿÿÿ€ˆˆ€wwˆˆˆˆˆˆˆ‡€ˆˆ€wwpÿÿøwwwwwwwwxˆˆˆˆ€wÿÿÿÿÿÿÿxˆˆöfffffoxˆˆ€öfffffoxÿÿöfffffoxˆˆ€öfffffoxöfffffoxöfffffoxöfffffoxöfffffoxöfffffoxöfffffoxÿÿÿÿÿÿÿxˆˆˆˆˆˆˆˆÿþÿÀøÿÀpÿÀ ÀÀ?À?À`?À`?À?À?ÀÀÀÀÀÀÀ€øüþÿÿøÿøÿøÿøÿøÿøÿøÿü( @€985oRwYoWFC=sX'=DwgvKfSus[TZy^b~ddaylgxreZŽw šq=oLŒuCš|F–uW¡tP—|c‡wx¢~`gœ^h©U|º[q…jp‹ph±nf·uzÁm|Ãzž†>¨Œ9ÿŽè–ú—ÿ2ÿ¡.›„L…“M‡Sœ†V‚œ\ž‘_£ŠA¨—Zšˆfž–f“ˆyœ™x£™i£Žz¤›wš©j°jŸ£w˜»y¥¥d°¢i¡¤xºªx¨³}Á²_é°Jÿ²PƯ}ÿ´ié®uŽÁhŒÅv—Äv)4…3<‚FP˜_fškvŽoy•z{”lv®p}¯u´^jÅr}Í…x†|‚z‰u«ƒz¹št¥¥~¸¯{ʼn‰„ƒ’Œ„ž—†‹‡—†˜•š–—£“ƒ¢•‹ ¥š–¬™“ —œ š®œ˜£‹ž­—Ÿµš¡¨†³ª†£´‹º·‰¡«’®­“¢£›© ¢¯Ÿ¸«–¤¹•ˆ–¨’˜©ˆœ°–ºˆ¬ª—¡­‚²«ž±§š¥¶Œµ°¼µ¤¥ ª¤¤¢¨£¨¨¤®§¨®«¬³«ª¦¹¥°¸¡»»¢¤¨±²®µ¬²¸´²²ºµ³¼¼µ³·¾¸µ¸¼ººÁ®‡Ã´†Ë¼—Ó¼”è¼–Á««Èµ²Ç»¼ŒË‰˜Ê…€ÅšÌ˜žÐ—§ÆŠ¦Ê˜·Í—«Ð“´ÔžË¯“̨‹È·™Ìµ¦Å¨§Ô¦¶×¨©È··Ìº©Õ»ºÛ¹É×ÑÀ•ÿÈ•ÁÁ¡ÊÅ¥ÃÄ«ÉÇ©×Ê©ÄÖ§×תÀÃ´ÍÆ±ÉË´ÀƺÄË»ÌË»ÓβÊÚ´ØÕ·ãͬäÕ¦ÿÓ©áÕ¸ÿÛ·‡Î—Ì‘ŸÃŒ•Ó‰§À“©À›¤×”¸Ó¥ªÌ«¶Ä¸ºÁ£«Û¦µÜ´¼ß¹¿ã›ÓÄ«ÍÁ¹ÉƤÑõ×Ë Äà¹ÆäÇÇÄÕÉÊÄÕÊÙÚÅÇËÔËÖÒרÖâÜÆáÜÜÊàÄÑàÅÆã×ÖåÚåáÎåä×ÄÊâÊÖè×ÛçÓÛðÛèæèêëæðíëìðíóñðññ”Ї‡‡ˆˆ””lhv¼ÃàŸjx™ebvºÃèìòòëææ¡ŸjiŒa9t½èòóóÙ ‡ííë啈gˆ59t½ÉòóùÆ$ííë嘇g”54AœÇìóóÆ$''ííæå“w853?šÇÉëòÆ%'(((”íëêÄŽn8e2A¾ÉÍòCDE*&&'eëëê糊bf™-2F¾ÍÍòìF̹G)5ëíëêàߎn3•e ,?›¾ÍÍÍòzÎιG`ëëêçà߆u4f,:A·¾ÊÍÍòzÎιG`êêâàáß°u63¡˜ /:Bt·¾ÊÍÍrÊÊžH‰êââß³³Žs9.zŒ;=§©¿¿¾É;ÍÊÀÂÁàâß³³°Ž{s<.8ˆ #£ª«²¿ÈÈÉÍÍÇÇÄß´³³°°{{{s<.ˆ!_¥¦µ¶¶¶îîïïïȰ°°¨{{{§ssB7+ˆ!#¢¦±²²ÈÈÈÀÀËÀ{ssuBBs@@@<4‹!"J£ª«¿ÈÈÀÀËÀ¿puqqqqq<770IK©¿ÈïììËÀÀÀŽŽpunqq974.™K§²ïòóòòïèÈÈÈÅÅ´´³‘‰on83h[¤­µðúúüúúññññùùùùùûú÷õõäãÓàlY¤¯âúúüüüúùøññúùûûûûûù÷õãã~X\¬âúðØõ “„Q|PØ æZ}R}ûûõãÓ„ed¬âúõÒSMUTÑLMéN×Oýû÷Û~X€áú÷ÒWÚÛôÕÕÕôVôÛÚÏ×ýýíÔ“˜c†âöÛÝõôÜÛôÚõÕ÷ÕÝÚÒûíØc…âõùúøùöøøûùûûùùùùà}”R‚áðñúúùúûûýýýûùíÙ„cZ‚¯âðøøøúûûùëåØÙ}Z]^®®Þëëé“}„‘||]~~—ÿÿÿÿÿðÿÿ€ÿÿÿü?øððàÀÀÀ€€€€€€€€ÀÀààððøü?ÿÿ€ÿÿðÿÿÿÿÿ(0`€ 6. <1 >8,++544A6 SIDA6!V"(Y&/o:BygvHiiVeuWsrRxldxwh{ww^ž|¤y ²}–^1Œg(˜g8šr>Æ{”dDšyE…y[™xWƒmoxj•~hnwˆvzi‡K}“KhŠXh—Y~™Xi¬Gy·Lg®Xvº[u…ifŸg~‰xg¥g~ ck³gyºhb©siºuy¿~xÂw¸ˆ ´ˆ°¢4Õ™ÿŽì˜ú•ÿ‘ÿŸ&þ3Ï©;þ¥:„L›N†„Pœ‡T›—X¥•[±Ÿ_¡]‰»U›‰fœ”gŽ€|–†wœ•x¢™i£Œu¡™w¨kž¦k„½`Ÿ¦yºr±v©¦g²¥j¢¤x¹©v¨³{·³|·]õ®Dþ®_ͳkعi«xʸyþ´c„Âl“ÁjŠÄx™Å{¤ÆyÓÀz-9‘KTŽ\dŠpsŒJX¿Xb«lv²nyʇw‰vŒ˜v¶Žuªw©¨mÁ€xƉ|Ä—~µ{…Ή…†’‰Š›—І†—˜Œ•›––¥–‰¦š—ž¦‹œ§–ž´˜¡¨‡¸­Š¥·Š¸·‹£¦—¼ª”£¸—··˜‰–«£§“¬®¨¨§¶«©¥·£º¶§¤©¶¨¶¶¹¸¸Ç¶ŠÇ»•Ó½˜ý¹‚¬«Ä¾®Æºº÷º¤‰ÉˆšË‰†É——̘›Ñ™¦Ëˆ¨ÇµÊ”¨Ñ˜¹Ñ›‡Ç¥”ͨҥˆÈ¸—Ë·ŸÐ¿¦Å§¾Ì¡§Ô¥¸Ö¤¨É·¶Ä¼§ÓµºÚµÅ—ÒÚþņþÊ›áÚœÈŦ×ʨÇ×¨ØØ©ÇȵÙÎ³ÉØµØÖ¸àÍ­àÖ¢þÓ«àϱ÷ɼáÕ¸þܸË໋”Ò•«Ï­¶Ó´»àÀ¾ÀпœÀÞ«ËÁ·ÊÅªÕÆ¶ÕɽÈÚ·ÞѼßÒ½àÓ·ÇçÆÇÆÒËËÆÔÊ×ÖÆÅÊÕËÖÓØÙ×âÛÅ÷ÙÍáÝÚ÷ßÒÉàÈÔáÈÉãÙÕåÜäàÊåä×÷áÕÏÖèÙæäèëêèðíððïèêðëóñðñðÙŸ™’’ˆ’ˆ’ŠŠŠŠ™ÙÙ™ˆ…‹’•œÅÉÉ¥¤š“ŠŠŠ™Ù™„…Ž•ÅÉÌÌçèñèÚÚÚ¦¤šŠ‰™™ˆ„_ÀÉÊèèëôõôëëæææÚ¦¤ŠŠ‰ŸÙ’„VŽ‘ÅÉÌñôõõõɃ„æîîîææ¦¦šŠ‰ŠÙˆQS`‘ÅÆÌñîõùõå%æùîîëæÙŸš’‰ŠÙÙ„RST‘ÀÉÌñîõùõèS;„æùîîææåŸˆSŠÙˆQOThÀÅÊìôîöõèP;??„æùîîææÙŸ™ˆU‰ŠQOK` ÅÆÊèîõõèP;?@@?ƒæîîëê罞’…SŠŸƒ#J^`¡ÅÊèìôõèP;?@@@@?„æøëëçå½›’…Ušˆ"IK`h¢ÆÊÒììôÀDdEBA@@@@=Ùëëëêå½¼™‹SUå™$JLh ¢ÊÊÒÒìôcggÂÂjEA><™ëëëëêçݼ›’SOŠ„HK^h ¢ÍÍÊÒììõÉ“ÏÏÃÂeE™îîøëêçÝݼž‹OUÙ™%FJ^h¢¢ÆÍÍÒììôÊ“ÓÓÏãj™îøëêêéßÜܼ›‹SIЇ FJ]b¡¢ÁÍÍÍÒìô¥“ÓÓÏÃÂe™ëëêêçßÝܼ¼›‹SOUåÙ% 'M]b‘ÁÁÆÍÐÒì쥠ÓÓÏãe’ëêççÝÝÜܼ¸›Œ_OI¤™$(*MXobÀÁÁÆÐÐÑÒÅ“ööíѧ£êêçÞÞÞܼ¼¸VP ‰Š(3W\a¯¯À¹ÆÆÒÒÒÅhpppiffT’åççÞÜÜܼ¸¸›VPIUˆ)25[n­¯¯±ÇÇÇÊÌÐÐÒÒÊÌÌçÚççÝßÜܼ¼¸¸¸›””ZPI ¦ˆ07km©­°»»»ÇÇËÌèÒÒÒÊÊÌ̽ÉÝܼ·¼¸¸¸””””ZPI ¤‡678¨¨¬º»¿¿¿¿ÔÔÔèÌÒÊÊÉɼܸ¸¼¸¸¸®›®””ZPœŠ/6~ª«´º¾¿¿Ôðððððñññññ»¬®º¸°”­aZXJ¤‡6~8¨ª¬ºº»¿¿¿¿ËÔÇÔÈÈÄÇÇŒŽŽaŽZaZaZXKJšŠ679m¨©°°º»»ÇÇÇÔÈÈÈÄÈȹŒ‰ŽŽŽŽŽŽZ_ZT_PIœˆ075kmn­°±»ÇÔÔÈÒÄÈÄÈÈǹœŒ‹ŽŽŽ_Ž_VTTPPIŸŠ)-.Yln­¯»ÇÔÔììÒÒÒÈÈÈÈÇ•™Œ‹‹‹‹V_VPTPIG¦—&+,Nlo­»ÇÔìììôôôôÈÌÈÈÇœœ››¸››Œ‹…_TPKI ¦š!/45km­ºÇñóõõúññÌñèÔËËçèèèççËÝÝž˜ž˜Œˆ…SRRå%1~²³¾ßòøúúúúúúõóóóòòøùùùùùùùùýü÷÷÷÷ääÛÛ˜ž‡{ª²¾Þãøúúýýýþúøõøóóóøùùûûûûûùûüü÷÷÷ääÛÛ–½š%z€²¾ßóúúýýýýþýúøøøøóøûùûùûùûûüüüü÷÷ääÛ}–„€²¶ÞóúúÛéý˜tózž|z½Ùt—†Ùýýü÷äÛÖ|žšyz²³Þòýú|ÖÙ tér žs t– tø w sûýý÷äÛÕ}釃²µÞøýýÕÕ‚qrw÷wwàxqvÖqwîvxéw rûûüý÷Ö|Ùy†˜·ãýýÛÕxxÖ‚ú÷ÛÖ‚Öà×u‚ü÷×Õ‚xéûûüüàÕ–—y}¶áøüØÕÕäØÖ÷ÕÕàäרä‚Õù‚‚äàÕÕûûùîž–½‡†™ÜáòäÛØü÷ØøØÛ÷×Ûä÷רüØ×÷Ø‚×ûùî×–™‡†}¶áà÷üüü÷üü÷î÷÷ûü÷üüü÷÷ü÷üüîÙ|˜‡t–¶áòøùùùùùùüûûûûûûûûûûûûüîé–™ˆt–¶áòøùúùüûùüùûûûûûûûüöî×–Ÿyt}˜¶·ãòóúøúùùûûûûüüîëØ–å—†z}}¶¶ÞÞááãòùùùîîÚ×—–å—†z|}}µÞëéé×––ç–zzz||||––––—ŸÝÝÝÝééæÿÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿÿüÿÿðÿÿàÿÿ€ÿÿÿþþü?øøððààÀÀÀÀÀÀÀÀÀÀÀÀÀÀààððøøüþ?ÿÿ€ÿÿÀÿÿàÿÿøÿÿüÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿÿÿ(  @ää丸¸Fšš˜s””ƒ•“‘ƒŸ››q¼¼¼Bçççôôô ºººDˆ…¤Ÿ†ãªúÒÓ¾þÓÍÂþÈ·¸û¬›æ–Œ‰¨¾¾¾@öööõõõ ¦¥¤_Š€qÕ¹³þÕÔ½ÿååØÿü£ÿngSÿÖÑÑÿ×ÑÑÿº¶¶ÿ˜ˆÝ®¬ª^ööö¾¾¾@…ykÔ³¤uþÒʬÿâßÎÿÉÁ¤ÿÝ”ÿцÿi`IÿÓÒÐÿÐÓÎÿ­µ®ÿ˜}áÀ¿¿Açççƒ}|ŸŽ\þɳ†ÿÛαÿâÜÅÿÓ»{ÿÿ¼nÿÿœ(ÿ¢|&ÿÉÉÇÿÐ×Ôÿ¶ÉÁÿ ©”ÿ˜‹|²ççç¿¿¿@qm\㕜YÿÆ»‹ÿÜ˨ÿãÖ½ÿÏÅ­ÿÿÚµÿÿ¾ÿ|oVÿÓÙÖÿÁÓÎÿ­ËÀÿ¤· ÿšŠiòÀ¾½G¤ ¢ek{[ùެjÿ³ÁŠÿÉÌ¡ÿÛѳÿÕÆ¨ÿáЭÿÜÁ›ÿ««˜ÿºÒÉÿ«Í¼ÿ§Æ­ÿ¤¶–ÿ’gþ§›’€ž˜šplžoü‡Ç‡ÿ¨Ó¡ÿ»Ú²ÿÈÞ»ÿÓÜ¿ÿØ×¼ÿÁÏ´ÿ­Ë±ÿ¨Æ§ÿ¦Àÿ¦¼“ÿ¤µˆÿ”`ÿ¡‹y ™šoknüƒÆ{ÿ£Ð”ÿ¹Ø§ÿÉܱÿÕܯÿÜØ¥ÿ½È¡ÿ °’ÿ¡¨ˆÿ¢©…ÿ¡¦{ÿ¡ŸpÿœˆSÿŸ‡uŸ©¤¦anŒYù…¾dÿ¬ÌÿÐݾÿàáËÿÞÚ¿ÿÔ×´ÿÉίÿ´¿­ÿ«¿¨ÿ£°ÿŸ§Žÿ˜vÿ˜Vÿ¤—ŒÉÉÉ7x‚xâ‹É£ÿÂàÑÿçòîÿíóñÿàëæÿÕçÞÿÝéãÿìììÿíííÿëìîÿ×Þðÿ¼Îëÿ¯Èú½¿ÁPïïïŒ„Š˜‡¸£þÌåÝÿ´¾Ùÿnw ÿ•¹ÿ~Ьÿw¤ÿ‰Œªÿ~ƒªÿin“ÿíîðÿ¼Êãÿˆ™«ÉçççÎÎÎ2‚‹Õ¶ÕËþ¶¿áÿ§¯Ýÿ¶¿ßÿ§±Úÿ²ºÞÿ§­Ûÿ¨®Üÿ–Óÿëììÿ¦´¾ô½¿ÁO·µ¸Q~…‘ÚªÍÇþØèäÿåìëÿãéëÿéííÿìíïÿëëïÿæçêÿµ¿Æó§®²töööÍÍÎ4‡Š—¤ž¡ìšÆ¾ý¯ÙÎþÌáÛþÝÞáþ½ÃÉø›¤®È¾ÂÄMöööïïïÇÇÊ=¡¥°v—¢­Œœ¦±¤©³ƒ¼¿ÃQèèèðÀ€€€Ààð( @ €öööçççÔÔÔ*¿¿¿?²²²L«««S¨¨¨V¨¨¨V«««S´´´JÂÂÂ<ØØØ&êêêõõõ ÞÞÞ ÀÀÀ>   ^†††y|{y–||v©}~v±€y³€y³‚zx±ƒzx©ƒ~|—ŠŠŠu¥¥¥YÄÄÄ:âââöööéééÈÈÈ6›››d}|{Œzwr¶‘Ž|Ü©¨ðºº úÃÄ«ýÉ˳þÊ̵þȵ²þÁªªû´  ò£ŠàŠ~z»…‚€Œ   _ÍÍÍ1ìììààà³³³K‚‚‚|tqn·”yê±®‹þÁÁ¡ÿÏϸÿØØÄÿÝÞÌÿßàÐÿßàÒÿÜÒÑÿØÌÍÿÓÆÈÿÇ»¼ÿ»««þ¨”ŽòŠ{v‡‡‡w¹¹¹EäääÙÙÙ%¢¢¢\vtt—€xoÙ©ž~þ¹´ÿÉÇ©ÿÖÕÀÿààÐÿää×ÿççÜÿ¼¼µÿddaÿ©¥¤ÿâÜÜÿâÝÝÿØÒÑÿÌÅÆÿ»µ¶ÿª¥£ÿœŒé…~z§§§WÝÝÝ!ââ⤤¤Zwts }p裘qý»³ŠÿÊÅ¥ÿÖÔ½ÿàßÏÿçæÛÿééßÿÊɾÿž†>ÿoWÿ<:6ÿ¯¬¬ÿåààÿáÜÜÿ×ÓÓÿÊÇÆÿ¹¸¸ÿ¤¥¢þœŽñ‹{ª¨¨¨Väääìì츸¸Fwuv”„wkå¡’gþ·ª{ÿÉ¿œÿÓβÿÞÛÈÿåãÖÿéèÝÿÉÈ»ÿ£ŠAÿè™ÿç—ÿoRÿFC=ÿ¯¬¬ÿáÞÞÿÝÛÚÿÓÓÐÿÆÉÅÿ¯¶³ÿ ¢˜ÿ›{ó‡z¢¹¹¹EìììÎÎÎ0ˆˆˆw}nkÚ›‰`ý°¢iÿÄ´ŠÿÒÇ©ÿÚÓ»ÿàÜÈÿåâÑÿËʽÿ¨Œ9ÿë–ÿÿ˜ÿÿ˜ÿð–ÿwYÿ765ÿ³±±ÿÝÜÚÿÙÛÖÿÎÓÍÿ¼ÇÀÿ¨´«ÿŸŸŽÿžŠsòЉÎÎÎ0ãã㣣£\pjl³{aü¨—Zÿ¾ªvÿι’ÿØÊ®ÿÝÓ¹ÿàÙÀÿåáÎÿÁ²_ÿé°Jÿÿ²Pÿÿ¡.ÿÿÿÿŽÿè’ÿŽw ÿ—•“ÿÙÙ×ÿ×Ú×ÿÎÕÑÿÀÎÇÿ­Â¸ÿ¢¯Ÿÿ—ÿ’~lÔ£¢¡aãããÇÇÇ8€‡vgbå‡Sÿ®ŸbÿƯ}ÿÓ¼”ÿÛʬÿÞвÿá×½ÿäßÊÿáÛ»ÿÁ®‡ÿÿѤÿÿË—ÿÿµkÿÿ2ÿZÿ’ŒvÿÙÙÖÿÚÝÛÿÓÙ×ÿÉÔÑÿ¼ÎÈÿ®Ç½ÿ¤ºªÿŸ¢Šÿœ†gúŽ…~šÅÅÅ9ëë먨¨Wrkl³toVüˆ‘Nÿ«¤fÿõ‚ÿÑÀ•ÿÛÈ¥ÿàίÿâÔ¸ÿäÜÆÿåßËÿ»®”ÿÿݺÿÿÖ®ÿÿÇ”ÿÿ´iÿsX'ÿˆ††ÿÜÝÚÿÕÚØÿÌ×ÓÿÁÒÎÿ´ÍÆÿ«Ê¾ÿ¥À®ÿ¢«’ÿ›‘lÿ•~gÕ§¦¦[êêêÛÛÛ#ŽŽŽtubcÝgvKÿ‚–Mÿ ¦cÿ¸¶€ÿÉÁ”ÿÖÇ¡ÿÞͪÿâÑ´ÿä×ÁÿâÚÃÿº¬‘ÿÿÞ¼ÿÿ×°ÿÿÇ•ÿÿµiÿsX(ÿ„„ƒÿÓØÕÿÊÖÑÿÁÓÍÿ¶ÏÉÿ«ÌÂÿ©Êºÿ¥Â­ÿ£°”ÿ˜sÿ™]ö—ŠˆÙÙÙ%ÌÌÌ2}pb]îfSÿ‚œ\ÿš©jÿ®¶}ÿ½¿ŽÿÉÆšÿǪ̃ÿÞЯÿãÓ¹ÿãÔ¼ÿµ§ÿéÒ¬ÿçÍ©ÿè¼–ÿé®uÿŒuCÿ¢¨£ÿË×Òÿ½ÔËÿ²ÑÆÿ«ÎÁÿ©Ì¹ÿ§È°ÿ¥¾¤ÿ£²‘ÿŸtÿœƒXþ~p¬ÄÄÄ:ÄÄÄ:}ux›po_÷gœ^ÿ°jÿ˜»yÿ©Ãˆÿ·Ë—ÿ¿ÎœÿÉÑ¥ÿÑÏ­ÿÚÓ·ÿáÒµÿÛÊ­ÿÜаÿ×ЯÿÔÒ¯ÿÍÆ±ÿÀôÿ¾ÍÅÿ¶ÑÈÿ¬ÎÁÿ¨Ê¸ÿ§É²ÿ¦Æ«ÿ¤¿¢ÿ¤º™ÿ£±‹ÿŸ¡wÿœˆYÿ’u^ÒµµµIÀÀÀ>}ru¡p‚fúh±nÿ~Áwÿ”Ê…ÿ£Ï’ÿ±Õ¡ÿºÙ¨ÿÀÚ¬ÿÇÚ°ÿÏÝ·ÿÖܹÿÜÔ¹ÿàÒ·ÿÙеÿÐÔµÿÀƺÿ·ËÀÿ«Ê»ÿ¨Ì·ÿ¨Ë´ÿ¥Ã©ÿ¥Á¢ÿ¤¾›ÿ¤º–ÿ¤¸‘ÿ£´‹ÿŸ¥wÿœ‡Sÿ—oN䬬¬R¾¾¾@~ps£nŠnûh»|ÿ{ʼnÿ̘ÿ Ñ¤ÿ¬Ö®ÿ·Ú·ÿ½Ü¼ÿÃßÀÿÈàÄÿÌàÅÿÐáÆÿÓàÄÿÕÚÀÿÊÙ¹ÿ«É¦ÿ¨Ë§ÿ©Ë¤ÿ©Åžÿ§¿•ÿ§¾”ÿ¨¾“ÿ§»ÿ§ºŒÿ¦·ˆÿ£°~ÿŸŸiÿ›„Lÿ™hAꨨ¨V¿¿¿?ps¢nŠkûg¹sÿ{Å~ÿŒË‰ÿžÐ—ÿ©Õ¡ÿ²Ø©ÿ»Û¯ÿÁݲÿÅݱÿÌÞ³ÿÒܯÿÚÚ©ÿàØ ÿÑÙ§ÿ§º™ÿ ²ÿ¡«Šÿ¡«‡ÿ¢¬…ÿ£­…ÿ£¬ƒÿ¢ª~ÿ¢¨zÿ¢¥vÿ¡¢qÿŸ—aÿšHÿ•c=ꨨ¨VÂÂÂ<~ruŸphúe³rÿzÁmÿŒÅvÿœË…ÿ«Ð“ÿ´ÔžÿÁبÿÌÛ°ÿÒܳÿÚܱÿÝÙ¨ÿÞצÿØ×§ÿÍ×£ÿ°¸¡ÿŸ³›ÿŸ¯“ÿŸ¦Œÿ ¤‡ÿ¡¦†ÿ¡¦„ÿ¡¤~ÿ¡ vÿ¡œoÿ ›kÿž‘_ÿšyDÿ“eD謬¬RÈÈÈ6€wz˜qsZ÷f©Tÿ{ºXÿŽÁhÿžÇ{ÿ±Î’ÿÁÖ§ÿÏÛ¶ÿÙß¿ÿàßÀÿâݺÿßÚ³ÿÛÙ¯ÿÔÙªÿÐÚ§ÿ»»£ÿ©²¡ÿ ³ÿŸ·šÿ ¬“ÿ ¦Žÿ¡¥‰ÿ¡£‚ÿ wÿ •kÿŸ‘cÿ†Tÿšq=ÿjPà´´´JÓÓÓ+ˆ„‰uj]ðkªWÿ}»_ÿÂrÿ¥ÊŒÿºÓ¨ÿÒßÇÿÝäÔÿãåÙÿâáÔÿÝÚÉÿÛ×ÅÿÔÕ¾ÿÍÓ¸ÿÊÔµÿÏϼÿÇË»ÿÂÌ»ÿºÍ»ÿ´Ë¹ÿ­Â´ÿŸ³ªÿ°¤ÿ«›ÿ›¡‹ÿš™}ÿ—‹mÿ‘xZÿ‰ynÉÃÃÃ;ãã㚘™kxdjÛu«ƒþ€Æ—ÿ“̨ÿ©Õ»ÿÉäØÿáíèÿçñíÿêñîÿêïîÿâëçÿØçßÿÔæÝÿÒæÛÿÑåÚÿæêèÿìëëÿìììÿìììÿìììÿìííÿåèíÿÒÛðÿÍØïÿÃÓíÿ¶Íëÿ Äàÿ«Àý•›šØØØ&ñññ ···Iyls³z€ú€ÅÿšÍ±ÿ»ÛËÿÜìæÿèôðÿî÷ôÿð÷õÿïôóÿéïîÿÞêåÿÙéâÿÕçßÿÔèßÿèìêÿíííÿíííÿîîîÿîîîÿîîîÿîîïÿèéïÿÕÜðÿÆÒîÿ°Æçÿ”¸Óÿ•ªì¤¦¨kêêêÕÕÕ)‹Ž}tgsåz¹šþ˯ÿ·ÜÎÿáðëÿÎÚåÿ¨²ÌÿÇÏ×ÿTZyÿª°¼ÿœ¥¸ÿoy•ÿˆ•¨ÿkvŽÿ±µÀÿ^b~ÿÍÎÔÿ}Ÿÿ’©ÿy}—ÿ‘¥ÿðððÿçéðÿÊÓìÿ¨¾ßÿ†£Àþš¿ÅÅÅ;ííí¶¶¶Jvhs³…—”üŽÇ°ÿ²ØÍÿæñïÿÌÓèÿ—Ìÿlv®ÿ3<ƒÿ˜ž¾ÿu´ÿp}¯ÿ‘ŸÃÿ)4…ÿ˜ž¿ÿ4=‚ÿÃÅÔÿFP˜ÿ§«Éÿ_fšÿ=DwÿðððÿïïðÿÝàéÿ¤·×ÿ{’¬óŸ¢¥tãããÝÝÝ!›œhudxÚˆª¦ü¤ÒÃÿßìèÿÖÛìÿŒ•Õÿr}Íÿ ¨Ûÿ¦¯Úÿ¿Èàÿ—¢Õÿ›§ÕÿžªÖÿ¼Âàÿ^jÅÿËÎäÿ©®ÜÿŸ¦Ùÿ‡Îÿ¤©ÏÿðððÿíííÿÜßàÿ“©Àþ‚‹”ªÍÎÎ2öööóóó ÌÌÌ3…}†“|‹ê¼µþ¹ÚÎÿÍÝåÿ§°Þÿ¹¿ãÿÒ×éÿÀÇâÿ´¼ßÿ§±ÜÿÂËâÿ¢¬ÛÿÌÑæÿš¢ÚÿÚÜêÿš¡Ùÿ¿Ããÿ¢©ÛÿŒ•Òÿïïîÿâããÿ®¼Áýy—Ö·¸¸LìììíííºººF€xƒ¡~|댵°ý°×ÌÿÌßáÿàéêÿåëìÿâèêÿãêêÿÝãéÿÜäèÿßçêÿêìîÿäåíÿíîðÿèéîÿäåíÿâãìÿèèíÿååæÿºÅÊýz™Ü¢¦¨käääèè躺ºG€y…šlk„䇮­ý¤ÑÃþÃâÖÿØéãÿåîêÿèîìÿéïíÿêïíÿëïîÿïððÿñññÿñññÿññðÿïïïÿìììÿâãäÿ³ÀÊü‘Ô¤§©jÞÞÞ íííÌÌÌ3™—›rniÄq…•ð‚²«ý™Ìºÿ³ÛÌÿÇäØÿÒèßÿ×êãÿÜìåÿëîíÿîîîÿííìÿçççÿÙÜÚÿ½ÄÊþ’¡±ðƒŽ˜§¹º»Kåååôôô ÞÞÞ!µ´¶O‰‡’rtŠÈq‡–îr¤¤ú}¸¯ý†Ä¸þ;þ›ÓÄÿÎÙÙþÒÔÙþÆÊÑý«³¿ú‰•¥ëŠ—½Ÿ¢¦tÐÐÐ0îîîíííÖÖÖ)µµ·O“’›y~‘¯o|’Ël•Øm†œÝq‹¢ß‚Ž¥Ý‚Š Ø~ˆšÊ‡Ž™¡¢¥ªmÇÈÈ:åååòòò äääÔÔÔ*ÈÈÈ6ÂÂÂ<¿¿¿?¾¾¾@ÀÀÀ?ÄÄÄ:ÌÌÌ2ÜÜÜ"ìììÿ€ÿþü?øðàÀÀ€€€€ÀÀàðøü?ÿÿÿÀÿnsis-3.11/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico000077500000000000000000000560061477201124000245110ustar00rootroot00000000000000(†h® è ¨þ 00¨¦ hN!  ¨¶%00 ¨%^6( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿÿÿüÿÿðÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿÿ( @B)D+L/I0 V9#Y:$^;'[?+W==`<5lF.kL<xI>xP7~T5ZIGePO{\Hsc^|ketklwnq‘_>•b@˜u]‚ni„ww‡|}ˆ|{§nn¢jq»zt˜ˆw¯ƒf¥m¯†u±†qµpÇ`ÂknoÑ£™¶q“¨Ä~zʈˆŽ‡˜”™ŸšŸŸŸ¡ˆ‡±ƒ¹Ž‰¨—Ž š°™–°ž™º¦œˆ‚¤œŽ«¢™ ¯¬ª¨¡½¶¨´½©¹´³³¸¶¶¿º·Ïˆ…—ŒÁœ™Ò‘¢ơ‘Á¦Ø²™É‚£×ŒªÁŸ¡Ê™ªêŸ«Ï©©Å±£Í´¡Ê±¥È²¬Ö² Þ¸¢Ý¾¥Ç¡³Ç¨·Ê¿½Ûµ°Ü²»Ù²¾Ýº½àº æ »î¼°á¼¹û¸¸ÉÿçÁªäÁ±âǸê̼“ÌššË‡†ÕˆŒÒŒÓ——Ô––Ú—˜Üž›Ø§—À¨ŸÃªŸË “Ó¨ŸÛ³¬Ïº·Á¨¥Ô¼¶Ù¦©á«¬â¯´á¼¼åѨËݶÁÛ·Ä߸ÅÚ¹ÌʸÖųßä­ÀáºÄã½Æã»Èæ¿Êà»ÎÃÂÄÆÂÄÉÃÁÆÂÉÜÉÆéÅÅàÉÀçÀÉìÇÌåÏÉñÒÁñÕÅòÖÉòÓÍû×ÏîÉÕîÏÛðÌ×óÐÑõÚÐöÜÔøÞÒö×ÙøÕÛûÚÞûâÛÌÃâìÝàúÚäïàâöäâúåáýæáûåäþæéûèéþñïàáñíìõÿøöøöøùùû7LUU93:Z¢®ªª®œP9k¤­mpp|²¥S]Mš¨z€¸~)©±¡H/#iš¢lµs´y±§e(hœwnr·ˆ«¦”5Cg'b•.qtxŸž —K3E ";TW\„…ŒŒ—^2‘4<01*[`„Š`%?&˜“A@u,=BŠ6i¸¯ZQ‚‡}va%!K³®d-+‰Œ†G>XfROcN D’ FI {ÿÿðàÀ€€€€€ÀÀàø( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆwwwwwwwÿˆˆˆ€wwwwwwøˆÿˆˆ€wwwwwø‡wˆÿˆ€wwwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿ( @€=$9#"D*K0F-"P-"K1"V6#I/3H7<X97a>)ZH=gD+lH5tK5}T8UJFYTVbMJxKDgTIxXFfXVjb[WQl]Nu^W~a_`idezhlxrmsezwww„M=‡Z9‘^>a<VH“_@ŽgI’eF‡iS™dQxZªsK¥hY¦{Z[{ Y|ˆleŸgh“slˆnt…qs„|uŒyw‡}sw¨ldº}­ƒ[¹€X”€ž†žˆy¬„h¿”o¡ƒs®‰w ‰}²†v¨‘v¬”~°—w¾‘vµ“z½–}Ä…[ÃgǃyǘvÖ¢~dZ…vr‘pc¤}u£vl²LKÊXXÉigÈnqÆuwÅqmÑxvцz‹’~€}ƒ¯d»t‚zÁ€yÓ}„Òƒ€„ŠŠŠ–†‡‹†–š‘“““›•’œœœ£††¶–„¼“†¼’ޥޑ²‹–¤˜”Š„¥”Šª™©‰„±ž™³§—£££¢–¬ª–©­˜®±”« š¶¢¡¡¬¥£§©®«««³«¨ª¥´´©¼²²²»³µº¸ºÆ…ŒÂ–†Ëˆ“Ú–Ä¢‰Ùª…Ê¥˜Ó¬•Ö²œß²œÕ¹œÜ½œà°‘ˉªÓ‰¥Ãš¡Ö‘¬Îœ³Ù›µã›¢â›·È¡¡Ò¬¤Ìµ Ö¶©Ç¨¸Ô¬¹Æ¹·Ú³¹ì¥¥ú«¬â«¹ø­·á»¹ý·ºßįÝijä¬âôèűæÉµèȳä»åɼìͼ÷žìнˆˆÆ–ˆÏœÊ‰ˆÔŽ‘Ù”—ܫϟ¥Ý¡¢Æ³¥Ç¾µÍ¨©Ùµ©Ö¯²Üºµ×©­á¯±á²µãůÊÙ­ÎȵÈݵÁðÐÒ¸Ôê¦Áñ«ÂãºÆûµÄ½ÅãÈÃÊ×ÂÉÎÃÛ×Å×ÚÓÙåÀÃéÅÂàÊÄìÌÃåÁËéÃÌãÏÎíËÍóÎÅìÑÃñÔÄñÔÌþÐÉôØËëÈÓñÌ×çØÜ÷ÙÖûâÜÁÃä×ËãØÚëÞÝñçÖäúÛãíâçüççÿñíççóú÷÷‡pnnnp‹„:@BIKJG9h‹„ar–¹âêêêê⸣7"k™ºêñùùùùùùñê´£nA•³éñùùñÞÞÞïùùùêä¦bjÚb¦·éññùÞÅ]\\½Ëøùùðäªqj5¦êéññùï½[ÂÎÎgZ¿úùùðà¤b‡uD³éìñññ¿[ÙüüüÄYZËúù÷ðà¤;ÚF—³¼éññÝ\ÄüüüÌZÁÁgøùù÷î¯tnqN¸º¼éìñÇ[ôüüÎZÁûÙ^öú÷÷ðà¤5+>—¶¼ììðÇ[ûüÎZÁûüõ^óù÷÷ðæ¯s„u*P•µ¼ììÚ[ÙÄZÁûüüÍföù÷÷÷比3"3.P“µéêå½[ZÁõüüô_Ì÷÷÷îîE&.OSµ¼éÚ[YÊôõÙgÀöîîîîîM %.OR™·¸Ñe[\\[¾Ýîîîíîîîä¤N (.OL¥´±¦©‰ŠÏããÐ×Ðíäíäãठ $(.Amwk¥˜¦¤Ÿ¨ÒÒ××Ò×××ãठ$>lxˆkwv›Ÿ¨ÒÒÒÒÒ×ä×0 &Ly{Šx„U©‚§¨ÒÒÒ××Ò=0 6 $D¦ÛÚ©ŠƒƒƒVÆTx€ÑææÒ=C+nŒ>·ðñðᦉŠÉÇÆXÏW|zíªtF>+Œ’ñüúúì´”ÇÐÉÃÝÉË{yí¨sH>8} •ùüüüñ¼šŽž¢ÐÝÜÉóÉÝߦH-+‹Iùúüúñ¼—22œÕîïÜÉåÒ):Ú³úúùñ¼«¡d2œ  ­Õí­”,i)ºññ컬«¡c¢Õ ›œ=‹`)—ëì°°®«œÖÖ¢œd4 †‰ #Q«¬®®ØØ¢4Ú! ',//<#  jÚ! `Úˆwuu…ŒÚÿÿÿÿÿøÿÿÀÿÿÿþ?øððàÀÀÀ€€€€€€€€€€ÀÀààðøü?ÿÿÿ€ÿÿðÿ(0`€ 4<$>& C)J0F,#Q. L2#V7$E-2H45U79b<*j>2hD+jH6tK2yR6D7UKHJWHLLD_SMPVTT`GLiUHxVGfZVs][x`Ntg]RDij\bu[fh^}ihh{ggngtuhwyvy„M<‡V:^>Ža;†YE“YI’[Sˆ`H˜hD•pN„jZdX™vT¢kF§rI¶xN¤wX´{R™Wv¢Y|‡jk‘jjˆvg’}j‡jt†xw•xx·ng¥|d©iz¢}rÂvm¨€V´„\–ƒh›€z«h·ˆf¿’i¨Šz³‡v·’wÄ…[ÉfÊ“iÆšyÓœrZUŒeZ—rkŽ{qªC>ÅNLÇQOÇYXÈa]È^aÈfeÊqhÉlpÏwxÆhhÐxoÑnrÐ{xÒœY€¦\††yƒ˜zƒƒ|˜³l‹‚|¨Â{™Ä{¡€|Å‹Ñz‚І†‡š…‰ƒŽ–”Œ”™—™©†‚·‰ƒ¦’޽”‰¸Ž’¤——½––µ£—•Ž­¤Œ¤°¨§š¥¾– £œµ¶œ³§¦¨´«®µ±¯§¤·¶ªº«°¼¸¶·Æ†‹Ò…€Á™‡Þ‘ˆ–ÐŒœÂ˜˜å™˜Ë¥ˆÕ§†Ù·É¤˜Ó«™Ë²ŸØ·™æ¦šáµ–ˆ§Ô‹¨Ê𫨔¥ØŽ³Ì–°Ú˜´äœ«Çª¤Ô¬§Æ¸¬×·§Ëª¹Ó©¶Ã¹»Ú¶¸í§¥ô¨­å¹¨ó²«ç¦¼÷ª³â¼¹ûµ·Ü­ÄÀ¾ÚͿūçÇ·õʼíн††ÄšŽÅ˜•ć‰ÔœŽÐŒØ˜™Õ¥˜Ä¤›Ö›¢Ú§¤Éµ¦Æ»´È§¦Ö¸­Õ«°Úº²Ö¢¦à«°á³¸âÆ®ÁܦÄÇ·ÅܵÂÁ¬ÑǺ××¼Óä§Åò¬Ää¼ÇûµÇã¿Ó»ÀĽÄãÇÃÆØÄÉÉÃ×ÔÈÔØÐÖ鯯ôÊÆëÒÇòÕÈëÈÓñÍÖéÓÙ÷ÙÖûâÜÇÉè×ÉæÕÕêÝÜñèÚåúÛãßáðæâéüççþðìéêòþìðîñöüøøŒzvv(((((vvŠzllB?KKKKKB%!$(zvlLRœ­­º½¾¾ºº­ª}C$zzl{™ŸºÀêëëïïïïëíêÀ±‚w$ŠŒ({™Ÿ½ÀíïððùððùùððöïêÀ­œml†m“›½Àëïððùùùùüüùùùùùöë鸫‡!$ŠzC™Ÿ½ÀëððùúüõçååãñõüùùùðïéÞ±‡A$ŠyC´½êëððúùøæÁeeeÁÃáøùùùöðìè­‡A$І=ÀêÀëðððúùãÁbbdddbahÎõúùùöðéÞ­=$ã=VèïëëðððúðåÁbdÊñóóÔÄ_aÇøúùðöð鸫‡%vmN¾êëðëðððçÃaeâýþþþ÷Ê^\aÑüüüùöí鸭‡ІMW›½ÀëëððúðáaeâýþþþýÓf^hauõýùùùöï豜{$L“Ÿº½¾ëëëððçÃaÇûþþþýÓf_ÆâÄfâùüùùöïéè«~%z†E™¸À¾¿ÀëëððçÁaâýþþýÔa_ÆóûÒaÎøüùùööí鱜G&@9Vºè¾ëÀëëððåsd÷þþýÔf]ÆóýþñaÉøüùùööï鸫|%ŠŒ-0N™´¾¾ëëëëðæsdôþýÔf]ÆóýþþófÉõüùùööïíè­œGvC*1Nš¡¾¿ëëëðäÁ`â÷Óa]ÆôþþþýÊfÓööööööïíè±|$0:UšŸ½ëëëëîÌatÇf^Æóþþþþñigòöööööíïé踫“3Š *1:TW¡½ëëëëås]]]ÄóýþþýôÊaÉõööööíííí鸫™Czå +18SW¡½ÀÀêêÍa\aÐ÷ýýûóÆdtòööííííííí츫œPv» +68SUš½ÀÀêäc^eÇÎÎÇibtÚööìíììàööí츭™Rv *+78STš¡¾º¾äŽÁ``a_acÅÚíìàììààöììíì豜RlŒ *+77SS“Ÿºººº±¬ÈˆÌ×ÛìÞÞàÞààìßàìßÞÞÞ±“v‹ *167Swyžº¬º­­­­±¯ØØØØØØÞÞÜÞàèèàÞì辫lŒ *17Mvw‚v'€ŸŸŸ¬œ¤§¯¯ØØØØØÞØÞØÞÞèÞ豓v *+1Rnƒn(¬z€‚‡¢§¯¯ØØØØØ±ÖØÞèèÞ«~Ey» ,I€ppYpZƒŠ#(¬'…֧د¯ØØÞØØØÞÞÞÞ¨M5z *1N‹ƒÃˆã[ŠŠZŠ» #‰„„Õ¯±Ø±ØÞÞÞÞØ§QM5Œ  1T›ãÚͼ㈈ÃY[ÌZ ˆÕÕÕØÞéìÞ±¤{MM3'" ,O­¾êêêèã°ƒƒˆÃÂÌÌYYäZ nŽŽàí诇QQM4v† I­êðùððêè­¬ˆÌÍÌÚÛÈcÂÛÂp͈#ˆàÞ±QQM7Š R¾ðúþúúð꽜‚ÕÏÙÛÉÂÚÛÏÌÚƒYˆàè«~|QJ5vy Vðúþþþúúïê¡V‘¨ÖÖÜÚÏìÏÇÑâÎÃãฬ~NMI?zãRëúþþþþùð꽡‘•£¨ÖÜàîâÏóåÎÚìÞ¼«QE12&„  KÀúúþþúúðë½ ”F;ÿÇ`ÿຠÿàÉÀÿzÃÿ——Ôÿž›Øÿ “ÓÿîÏÛÿîÉÕÿðÌ×ÿìÇÌÿÆ¡‘þplhª‡‘L/ÿlF.ÿ•b@ÿ¯ƒfÿº¦œÿű£ÿȲ¬ÿǨ·ÿÛ·Äÿ߸Åÿã»Èÿæ¿ÊÿçÀÉÿÛµ°ÿsnj¬šŠ‡D+ÿZ:%ÿ~T5ÿ¡ˆ‡ÿˆ‚¤ÿއ˜ÿ”™ÿ£™ÿÇ¡³ÿÙ²¾ÿݶÁÿáºÄÿܲ»ÿ¯†uÿ|xt›»°³_B)þY;$ÿµpÿåÏÉÿÜÉÆÿ¶¨´ÿ¨¡½ÿ§—Àÿ¨ÿœŽ«ÿ½©¹ÿã½Æÿ¹Ž‰ÿ—s[û¡¡¡eíëíV?>èV9#ÿâǸÿÿøöÿûçáÿÞ¸¢ÿÊ™ªÿѨËÿʸÖÿ¼¶Ùÿ¨ŸÃÿݺ½ÿ±†qÿ†s_ØÜÜÜ"¯¦®qI0 þ¢ÿþñïÿýæáÿî¼°ÿÄ~ÿ¶q“ÿä­Àÿà»ÎÿÚ¹Ìÿ—ŒÿyZFû¥¤¤f{nx²[?+þÖ² ÿû×Ïÿû¸¸ÿ꟫ÿ׌ªÿæ »ÿÉ‚£ÿ§nnÿjK;ý‰……˜óóó õöø ˜ŒQ66öxI>ÿ»ztÿψ…ÿÒ‘ÿ¢jqÿ`<5ÿN<:í¤¢¤wóóó ÙØá1Š„••dSSÉZGA×bNFÔdVXÅŽ’‰ÙÙÛ*øàÀ€€€ÀÀð( @ €ôôô çççÛÛÛ#ÒÒÒ,ÌÌÌ2ËËË3ÌÌÌ2ÑÑÑ-ÚÚÚ$èèèòòò ëëëÎÎÎ0©©©Uƒƒƒ}mmm–ccc£___ª^^^«^^^©ccc ttt’’’l²²²LÒÒÒ,êêêòòò ÍÍÍ1™˜™jrno¤oecÓŒwv횃sô¦Žr÷®•tøª’{ùž†zø‡tqô`UWëMIJ×QQQ¸uuu‹¥¥¥YÕÕÕ)îîîæææ°°°Nqmq©†prå¶–„ýÖ³žÿçÈ»ÿíÎÅÿðÒÊÿòÕÎÿñÕÏÿðÒÌÿìÍÆÿãļÿĦŸþ‚npøGADçGGG¿}¾¾¾@çççÖÖÖ({ƒovÝ …ÿܽœÿêÌ»ÿóÖÎÿúÞÚÿýäâÿþçæÿýèæÿýéçÿþçæÿýââÿúÞÛÿñÓÍÿã´ÿÈ¡¡þ}fmú;9;Þ]]]£¥¥¥YÞÞÞ ×××'Œ…‹‘–zvëÑ«þæÇ­ÿñÕÅÿùÞÕÿþæâÿüêèÿñããÿÞÖÛÿÕÐØÿÙÒÚÿèÝâÿøéêÿþêéÿýâàÿõÖÔÿéÆÅÿ×±°ÿœ{…üLCHèTTT°   ^ãããèèèЇ˜wyñÜ·¨ÿèɱÿòÕÅÿúßÕÿþæáÿûêèÿÝÕÚÿ¡¢Æÿy|ÃÿnqÆÿqsÇÿ„†Éÿ·µÔÿíâçÿþëëÿýããÿ÷×ÚÿìÊÊÿ×°®ÿ¦‚‡ýMCGêWWW¬³³³Kéééôôô ±°²U‹icðÙ·©ÿò×ÍÿóØÉÿøÞÑÿýäÝÿýèåÿãØÛÿˆ‹ÂÿdgÊÿ”—Üÿ³¶åÿ¯³ãÿ}„Òÿ\_ÈÿŸŸÏÿõèêÿþêëÿþâåÿø×ÚÿêÆÃÿÔ®ªÿŸý>:<ænnnÈÈÈ6óóó ÑÐÑ1txÎÄ•pÿãÀ­ÿðÕÅÿõÚÍÿùߨÿþåßÿïßßÿ›šÅÿgkËÿ½Åãÿö÷ùÿþýýÿóôùÿŸ¥ÝÿLKÊÿUTÊÿ¿¹Ûÿúêïÿÿèíÿþàäÿ÷ÔÖÿéÃÀÿÓ¬¦ÿrvý999ÒqÝÝÝ!ïïï —š„­ˆuûײšÿäÁ¬ÿíνÿòÕÇÿøÞÕÿýåßÿÖËÕÿkmÄÿ¤«Üÿôôøÿýüüÿõõùÿ©­áÿ]^Îÿ‰ŒØÿÙÿ‡…ÒÿðâëÿþêíÿÿäèÿûÚßÿòÎÍÿà»·ÿÀ™ÿYLNóYYYªºººDòòò ÐÏÏ5soÕ›}ÿåúÿë˼ÿïξÿóÖÅÿöÚÑÿøàÚÿÁ¸ÎÿeeÉÿÙÜîÿüûûÿóóøÿ²µãÿYYÌÿ’ÙÿãäòÿÂÇäÿomÎÿáÔæÿþéíÿÿäèÿþÝãÿ÷Ô×ÿêÆÃÿÒ¬¥ÿ•tlýC@AÕqããã©¡¢v†`Mú­€^ÿׯšÿéȶÿïξÿóÔÅÿõÙÎÿõÝÖÿ¾µÍÿjhËÿéçõÿõô÷ÿ²´âÿVVËÿØÿçèóÿüûûÿÞÝñÿqmÑÿÞÎæÿþçêÿÿâæÿþÝãÿùØÛÿîËËÿܵ°ÿ¼“‡ÿXLLïfffœÎÎÎ0ðððƒnn½nK4ÿ‘bCÿÀhÿ×­ÿèİÿñÏÁÿôØÊÿóÙÐÿÏÀÏÿjfÈÿÁÁåÿ¦¨ÝÿXXÊÿ×ÿîîõÿýúúÿùöøÿ¯°àÿ€yÓÿì×èÿûßèÿûÜåÿüÚàÿù×ÚÿïÍÎÿá¼¹ÿÌ£˜ÿ‡jcúKKK¼´´´JæææwYOßdA,ÿ~T8ÿ©uMÿÇ‘fÿÙª…ÿéDzÿñÒÂÿñÖÉÿãÏÎÿŽˆÇÿ_^ÉÿURÇÿ‹Õÿææñÿüùùÿú÷÷ÿÒÔéÿxvÑÿ²£ÛÿöÛæÿùÙãÿöÕàÿöÐÜÿóÑ×ÿïÍÏÿåÀ½ÿѪ ÿ¡ƒrýJHGÓaÝÝÝ&bK<æY9%ÿmF.ÿ\<ÿ¬rJÿŇ\ÿÖ¢~ÿçÄ®ÿìнÿéÒÅÿ;ÈÿicÃÿVTÄÿ¯²ÜÿÛÜêÿÝÜëÿÂÁäÿ‚€Ñÿ‚ÓÿèÐáÿôÕßÿòÏÚÿñË×ÿïË×ÿóÏÚÿñÌÓÿæÀÀÿÔ¬£ÿ´’zþRLFào×××1VA2éQ3!ÿ`=)ÿzN3ÿ‘^>ÿ­rLÿÃ[ÿϘwÿß» ÿæÉµÿä˾ÿĵÃÿ‚zÁÿfbÄÿllÇÿmkÈÿldÉÿ–ˆÏÿÜÃØÿðÎ×ÿëÉÔÿêÆÒÿìÅÒÿïËÖÿðÌ×ÿðËÖÿéÃÉÿÖ°ªÿ½–}ÿULC䉉‰uÓÓÓ9N:.ëI-ÿV5#ÿiD,ÿ}R5ÿ“_@ÿ©qJÿ¹€Xÿ¾‘vÿʲ¡ÿßįÿÝijÿÕ¾®ÿų³ÿµ¦ºÿ·§½ÿʱÉÿÞÀÌÿãÀÉÿà»ÇÿáºÈÿå½ÊÿèÂÍÿêÅÎÿëÄÏÿçÁÌÿæ¿ÈÿæÁÃÿЩœÿ]RJ刈ˆvÔÔÔ7L9-ëC'ÿM0ÿ]<'ÿmG/ÿ‚T8ÿ–d@ÿ¨uLÿž†ÿš‘ÿ§•ÿ•‹Œÿθ ÿÕ¹œÿÒ·©ÿ̨ŸÿО¸ÿÔ«»ÿز½ÿÜ´ÁÿÞ·Ãÿß·Äÿß·Äÿà¹Äÿã»Çÿæ¾ÉÿèÁÈÿæÁÄÿΨœÿ[PIäqÚÚÚ.P=2é@'ÿH-ÿV7$ÿb?)ÿsK1ÿ‰\:ÿ©~WÿŽƒœÿ‡£ÿ^W~ÿWQlÿµ«§ÿ‘†‰ÿ¬ž•ÿ²‹–ÿÊ®ÿΜ³ÿÕ­¸ÿÛ³¾ÿݵÁÿݵÁÿÜ´ÀÿݵÁÿâ»ÅÿæÀÉÿã»ÂÿÇ›ÿ¨€fÿVLCÞ———gããã ZD;äA'ÿH/ÿS5"ÿ]<&ÿmG-ÿa<ÿ·”zÿ–¯ÿއ²ÿ§£½ÿ‡‚§ÿ¦§ÿvr‘ÿ¹µÿ]Nuÿ²•­ÿ±“ªÿǨ¸ÿÔ­ºÿÚ³¿ÿÝ·Áÿà¹Äÿã¼Æÿä½ÅÿÝ´¾ÿÈ›¤ÿ±…wÿxZÿ[TMÑ©©©UñññpPXÓ?&ÿE+ÿQ4 ÿ`A'ÿ†\9ÿ¿”oÿ×¼¨ÿÏÄÌÿÐÄÇÿÍ¿¾ÿ¶­»ÿ¡œ´ÿžœ¶ÿ ˜¸ÿpc¤ÿ³¤ÀÿdZ…ÿ•‡ ÿ­˜®ÿª–©ÿϵÀÿêÊÐÿìÉÏÿÜ´¾ÿØ¡ÿ±…~ÿ­€mÿlTýca`µÆÆÆ8‘‚‰šB+!þB)ÿN2 ÿeD*ÿ®…bÿäÇ·ÿöÜÔÿøáÛÿòØÐÿàÊÄÿÒ¹¬ÿ­ ´ÿ°ª¾ÿ±§ÊÿðÐÿ·¥Íÿvl²ÿůÊÿ}u£ÿŸ–±ÿ™©ÿ¢–¬ÿèÆÏÿÛ³»ÿ¼’Žÿ´‡wÿª~_ÿzbLñ{{{‰ááážÅOU>?í?'ÿJ0ÿkH-ÿÆ¥ŽÿùâÛÿÿóñÿÿõóÿþìèÿôÙÐÿáÀ¬ÿÊ¢ÿÀ ÿʰÎÿѲÐÿ»¨Óÿ«ÏÿÓ¿Øÿ®¨Óÿ½·Öÿ…±ÿ“‹¯ÿçÆÏÿ׳³ÿ½“†ÿ´‡pÿ­†YÿkaYÓ©©©Uóóó ðððƒl~´B+ ÿB+ÿcB(ÿʨ‘ÿþìçÿÿûùÿÿüûÿÿóðÿúãÝÿìνÿà°‘ÿÆ…ŒÿÖ‘¬ÿàš»ÿÙ­ÎÿÛÁ×ÿÎÃÛÿµ±ÙÿÐÉáÿ°«ÖÿÙÅÖÿãÀÆÿÓ°«ÿ³‰uÿ uXÿ†kRûzxx“×××'ÏÍÒ?\DLîB*ÿS7!ÿ¯‹nÿûäßÿÿöôÿÿøöÿÿñíÿüâÝÿïÑÁÿ鯠ÿΊÿŸ]xÿ Y|ÿ̇¨ÿå²ÂÿíÅÒÿåÒÜÿÑÅÝÿ¸¯ÖÿãÈÖÿâ¼½ÿ–†ÿ‘gOÿ~\Bÿfa`˶¶¶Iôôô öö÷ œ¢ŒG/(þG.ÿ|X<ÿàÁ³ÿþéæÿÿíëÿþèåÿúÞ×ÿôÉ¿ÿí§¢ÿ㛢ÿ¿u‘ÿœYÿЊ©ÿÞ›´ÿÞŸ¶ÿâ§»ÿè°Äÿé¾Íÿ㯸ÿΡšÿ“hQÿpO9ÿdTP𔕖mæææèéël]pÉF/'ýN3 ÿŽgIÿëËÀÿûàÛÿýáÜÿúÜÕÿû½ÿõ®³ÿé ©ÿÙ¡ÿ¯dÿ㜹ÿê¦ÁÿÛ•²ÿ̆©ÿÑ‹¦ÿɇ“ÿº}ÿzQBÿnM8ÿgRIôz{~™ÙÙÙ%ÖÕÝ1eWnÐF/&þK2ÿ‘iIÿß²œÿøÏÁÿþÐÉÿÿ¼¸ÿþµ¹ÿø®µÿÿ׆¡ÿò©¿ÿñ«ÂÿᘷÿІ¬ÿ·sÿ¤kfÿtJ@ÿ`@.ÿ`KDøvx€¢ÎÎÎ0ÜÝå(~xŽ®P8:ûD)ÿY1%ÿ„M=ÿǃyÿÿú«¬ÿý¯·ÿü®¸ÿú´½ÿûµÄÿäž´ÿʈ˜ÿŸghÿj@3ÿJ-!ÿF-"ÿj[\ꌒ—ƒÙÙÙ%ìî濫¾paPfÞG-1üC'ÿP-"ÿvD9ÿVHÿŸ`Qÿ£dSÿ¬nbÿ§l_ÿ}LHÿ^71ÿ?%ÿ9$ÿC36öddo³´¶VæææÖÖâ4•‘©ZLfÛB.5÷;#!þ<#ÿ>$ÿA%ÿI,ÿJ- ÿ?%ÿ6#"ýG97ða]lÅœœ¥tÖ××+ööö âæé$«¯Ï_–™‰„yxŸwmj­qhd³ulh¯tq¤Š€€–“¢‚¸ÀÅPâââõõõ ÿàÿÿ€ÿþ?üøðàÀÀ€€€€€€ÀÀàðøü?ÿÿÀÿ(0` €%óóó íííèèèãããßßßÝÝÝ!ÜÜÜ"ÜÜÜ"ÝÝÝ!ßßßãããèèèïïïóóó óóó èèèØØØ&ÄÄÄ:³³³K¦¦¦Xa———g”””j“““k“““k•••išššd¤¤¤Z±±±MÄÄÄ:ÓÓÓ+àààëëëóóó ñññ àààÈÈÈ6¬¬¬Rnsssbbb¡WWW¯RRR·PPP½OOO¿NNNÀNNNÀMMM½PPP·WWW­eeezzz…n©©©UÂÂÂ<ØØØ&èèèóóó õõõãããÅÅÅ9¡¡¡]{{{„`__ªe^bÌuehá}keêƒp_ï‹w^ó“~`õ•aö’~göŒyhõ‚ofôsdañ^SUìB?@à@@@ÏLLL¼```¡}}}žžž`½½½AÜÜÜ"ìììõõõ ïïïÔÔÔ*§§§Wzzz†c_b¹yilá“ysñ°’}ûȨþÓ³§ÿÚ¹¨ÿß¿ªþãÅ®ÿåǰÿ䯳þà²ÿÛ»°ÿÒ³«þħ¢þ«ŽüuyøYOPñ555ßAAAÊYYY©|||ƒ¨¨¨VÌÌÌ3äääóóó æææÃÃÃ;‘‘‘ma_b±{gv먆‚øÄ¢…þÕ³™ÿß¿­þêÌÀÿïÑÉÿòÔÌÿôÖÐþõØÓÿöÙÔÿõÙÕþõØÓÿôÖÑÿñÓÎþíÏÉÿçÉÀÿÛ¼±þĦœþœ€†üZNTõ545ä???Èdddš‘‘‘m¼¼¼BÜÜÜ"ïïïôôô ÚÚÚ$«««T|y{’oalâ­‹~þϬˆþÚº•þäŰþìÏÂþòÔÌþ÷ÚÕþûÞÛþýãàþþåãþþæäþþåäþþçåþþçåþþãâþýßßþûÞÛþ÷ÚÕþðÒËþçÉ¿þܹ¥þË¡žþ—yƒþJBFô646ÝJJJ·wwwˆ©©©UÒÒÒ,ìììôôô ×××'¢¡£bvoq­uzîÁ™ŠþÙ·ÿãÆªÿëмþòÖÇÿøÜÓÿûàÝþþæãÿþèçÿýêéÿúééþ÷ééÿöèèÿ÷éèþùêêÿüëêÿþêêþÿéèÿýæãÿúÜÚþõ×ÐÿëËÅþཹÿÒ«§ÿ½• þhU`ù<7:çBBBÄmmm“¡¡¡]ÏÏÏ/îîîÛÛÛ"¤£¥bylv½”vtôÈ¡ŠþÛ·–þçȰþîÑ¿þõÙÌþúßÖþþäßþþéæþýëéþöççþçÜßþÖÐÖþËÇÒþÇÄÑþÊÆÓþÓÎØþãÚáþòæéþûíìþþëêþþæäþüàÝþõÖÕþîÌÍþæÂÂþÙ³¯þ¿— þeoûF>Dì???Êiii–£££[ØØØ&ïïïèèè­¬®Vwhr¿–sw÷Ñ©›ÿá¿¥ÿçȯþîÒ¿ÿõÚÌÿúßÖþýäßÿþéåÿýëéþðäãÿÑËÔÿ©©ÅÿˆŒÁþx{ÂÿrvÄÿuwÄþ€‚Æÿš›ÌÿÀ½ÕþæÝäÿùêëÿþììþþççÿüßàþ÷ØÚÿðÎÐÿçÅÄþز¯ÿ¿–šÿŒmwüF>Cí???Ênnn‘²²²LÝÝÝ!òòò ðððÆÆÆ8ums°…edøÐ«ŸþìÌÃÿíпÿïÓÁþõÙÊÿùÞÓÿýãÜþÿçãÿýëèÿòäãþÆÂÎÿÂÿgjÄÿacÊþikÎÿnsÐÿnrÐþfhÍÿ_bÉÿrtÈþ¥¥Îÿà×áÿûììþþëëÿþåæþüàâÿøØÛÿðÏÐþäÀ¾ÿÖ±«ÿ¿–•þ…jnü>9;ìAAAÃ}¾¾¾@åååöööØØØ&‘Žff÷À™}þèÈÀþóØÏþôÚÌþõÚÌþøÝÑþûáØþþåßþýèäþõåäþÐÈÑþ…ŠÀþ\_ÆþkoÎþ¢¦àþÉÊìþÒÕîþÐÓíþ¶½ãþ€ŠÒþUXÉþ^`Èþ  ÍþìâæþýíîþþéìþþåçþýÞáþù×ÚþïÌÊþã¾¼þÕ¯«þ¼••þxciû534æRRR­”””jÎÎÎ0íííçç窨ª^kx蹉cþÕ­“ÿèÇ·þñ×ÇÿôÙËÿöÜÐþøÞ×ÿýãÚÿþæáþùçãÿÛÑÖÿ’“Áþ\]Çÿz‚Ðÿ¾Çãÿîñöþüüüÿþýýÿûûüþâæñÿ›¢ÚÿRSÊþC?Èÿ\\Èÿ¸µÖþóçìÿþìðþÿéîÿÿäèÿþÝâþøÕØÿðÊÉÿ㾺þÕ®§ÿÁ–›ÿdS[û333Úcccœ¨¨¨VÜÜÜ"óóó ôôô ÉÉÉ8†v³¤~fùÉrþد–ÿæÃ¯þìϼÿðÔÄÿõÙÌþøÞÖÿýãÝÿýæáþðßÞÿ·³ÉÿhiÃþlpÏÿ¼Äâÿðòöÿýüüþþýýÿýüüÿéêõþ¬°áÿdgÐÿTSÌþonÒÿ]\Ïÿƒ‚ÎþßÕæÿüìïþÿêîÿÿæêÿþâåþûÙÞÿõÑÒÿìÇÄþÞºµÿ̦œÿ©„€þ=8:ðCCCÃ}ÃÃÃ<êêêää䟙žw”smçÁœ‚þÙ¶¢þß»¨þçİþíÌ»þðÑÁþòÖÈþ÷ÛÒþûâÚþüåàþãÕØþ—–ÄþY[Æþ–Ÿ×þçêòþüûûþýüüþüûüþíîöþ«°áþdgÏþVWÌþŒØþ¾Áæþ„‡ÕþgfÍþžÞþøéíþþëîþþçëþþãèþýÝáþøÕÙþñÍÌþæÁ¾þÖ¯ªþ½–‹þ}dgû334ß^^^£¥¥¥YÜÜÜ"ôôô ÉÉÉ;Œy|·¡zfûͨŒÿäÀ¸þêÊÁÿêʹþî̼ÿñÒÁÿó×ÇþöÙÏÿøÞÖÿøáÝþ×ÊÓÿ‚ÅÿaaÊþÃÉåÿ÷÷øÿþüüÿüûûþììõÿ³·ãÿbcÎþUUÌÿÙÿÔÖíþéêóÿ¤­Úÿ_^Ìþª¥ØÿòãëþþëîÿÿèêÿþäçþþßäÿûÙÞÿõÒÓþìÈÆÿÞ¹¶ÿË£›þ£}qþPFIòDDDÃ{ÇÇÇ7îîîíííª£§n‰jaå¦yZÿÆ›|ÿߺ©þëʾÿíοþðοÿñÑÂÿó×ÇþõØÎÿ÷ÝÕÿõÞÙþÑÆÑÿ{{ÆÿljÎþÜÜñÿýûûÿüúûÿììôþ²¶âÿfgÏÿQPËþŒØÿÔ×íÿööùþùøùÿÈËèÿd`ÏþŸ™×ÿïßêþþéìÿÿçêÿþâæþÿßäÿüÛàÿöÕØþðÍÌÿ俼ÿÔ­¥þ¶€ÿza^ú444Ûeee›¯¯¯OåååÚÚÚ(‘ƒ‚£|WHüeGþ°^þÍ¢Šþ຦þéÈ´þíͼþðÑÀþóÕÆþôØËþõÛÑþõÝÖþÓÆÐþ}{ÆþliÍþßÝòþüúúþíìôþ³¶âþfgÎþLKÉþ‹ŽÖþÖØíþ÷öùþýûûþûùùþÐÏîþgcÐþ£›ØþïÛéþþæëþþäèþþáäþþÝãþýÛßþùÖÙþñÏÏþçÂÁþÙ±¬þÅ’þ¡~sþQGJîPPPµ˜˜˜fÚÚÚ$ÄÀÂIs^\ÔkJ5ÿV:ÿœlIÿ½eþÏ¥…ÿݶþèűÿïνÿóÐÃþõØÊÿôÙÎÿóÚÓþÝÌÒÿމÇÿb^ËþÄÃèÿãâðÿ«®ßÿabÌþQOÉÿ‹ŽÖÿßáðþûùùÿþûûÿýúúþííôÿ £ÛÿgaÎþ»¯ÞÿößêþüàèÿýÞèÿýÝåþþÜâÿüÚßÿù×ÙþòÐÒÿèÄÄÿÝ·´þϨžÿ·Ž‚ÿnXUö@@@Ê€€€~ËËË3¹®¯bnJDóeD.ÿuN5ÿŽ_Aÿ°{SþÇ”hÿÒ£€þßµ™ÿédzÿðÎÀþòÕÆÿôØÊÿñØÎþçÓÒÿ­¥Êÿa^Çþ€Ñÿ˜šØÿccËÿTRÉþŒŽÖÿÖØìÿúøøþýúúÿýúúÿ÷õ÷þÐÑéÿzyÓÿxoÑþÙÆäÿúßéþüÞçÿúÛåÿ÷×âþùÖàÿùÖÛÿöÔÖþñÏÐÿêÇÆÿὸþÓ¬£ÿ˜Šÿf\ú<;;Úmmm“»»»Côôô ¬¢ŸreC3ý_>)ÿkF0ÿ‚V9ÿkFþ·SÿÈcþÔŸtÿà¶—ÿéȳþðÐÀÿòÕÄÿïÖÈþëÕÎÿÐÂÌÿ€|ÅþQOÅÿOLÆÿOMÆÿ‡ŠÓþÒÓêÿ÷ôöÿüùùþüùùÿöôõÿ×Ùéþ–š×ÿfaÎÿ¨šÙþíÕæÿùÜåþùØâÿ÷ÕßÿöÔÞþõÎÜÿôÏÙÿñÏÕþðÎÒÿëÈÇÿã¾¹þÕ¯¦ÿÇ ÿ—}kýJFDæ___£¯¯¯Oñññ•‘€V;(þX8%þc?*þuK1þ‹[;þ¡kFþ¶yOþƇZþÒ™qþܯŽþèÆ³þîѼþíÒÀþëÓÆþâÐËþ·­ÇþfaÃþC=Âþ]]Æþ«°ÚþáâíþíìðþîìñþéçðþÍÎçþ•—ÕþnjÎþ‹€ÓþÜÇáþôØâþõÕàþóÑÜþòÏÙþòÌØþïË×þñÌÙþóÏÚþòÍÕþëÆÉþã½»þÖ¯§þÉ£‘þ¨ŠrþWNGíVVV­¦¦¦Xîîî”މŒM4!þS3!ÿ\:&ÿjC,ÿ}Q5þ‘]=ÿ¡iFþ¶wNÿÆ…]ÿÎ’jþتŠÿäªÿéÌ·þêνÿçÏÃÿÝÊÇþª¡ÄÿlfÂÿYWÄÿxxÌþ˜šÔÿ¤©Õÿ¤¨Öþ——Öÿ|xÑÿjcËþ‹ÑÿÌ·ÛÿðÔÝþóÓÝÿïÏÙþîÌ×ÿíÇÕÿìÅÓþìÈÔÿòÎÙÿóÏÚþòÎÙÿìÈÏÿå¿ÀþÙ±¨ÿË£’ÿ²tþ]QFðQQQ³   ^ëëëއƒ•G-þN1 ÿV6%ÿ`=)ÿsI0þT6ÿ‘_?þ¤lHÿ¶xPÿƒZþÊŒjÿÑ ÿÞ»Ÿþ寱ÿåȶÿãÊ»þØÅÂÿ·ªÁÿ‰€Áÿg`Áþ^YÃÿ_[Åÿ_[Æþa[ÆÿqhÉÿœŽÐþθÖÿéÌØÿïÍÕþëÈÒÿéÅÑþéÄÑÿéÃÑÿíÆÓþðËÖÿñÍ×ÿïËÖþïËÕÿîÈÒÿèÃÉþص´ÿΦ˜ÿ·tþ_QCòOOO¶žžž`êêꈂ~žA*þH-þQ2 þZ7$þhB+þvL1þ‚U8þ^?þ¢kHþ®tLþ»‚Yþ¿…cþÆš}þÖ»£þßîþßïþÝĵþÚ²þл´þÀ±·þ¯£»þ¥˜Àþ§›Àþµ¦ÆþȳÍþÛÀÏþåÅÎþæÃËþâ½Êþâ¼Éþâ»Éþä½ÉþèÁÌþêÃÎþêÇÐþìÇÐþìÅÏþéÃÍþæ¿Êþå¿ÇþçÁÅþܵ³þœ‡þgWHòOOO¶žžž`êêꇀ| >'þC)ÿK/ÿS4"ÿ`='þkF.ÿxO4þˆW:ÿ—cAÿ£mFþ¬vLÿ¸†cÿ£ˆþ—‰‹ÿ˲ŸÿÑ»©þʸ«ÿÖÀªÿؾ£ÿÖ¼¢þÓ»¦ÿѺ³ÿѺ¯þÑ®µÿ×°ÅÿÛ¹ÅþÛ¹ÃÿܵÂÿܶÂþݶÃÿà¹Æþâ»Èÿã»Èÿã½Êþæ¾Éÿç¿Ëÿç¿Ëþæ¾Êÿç¾ÉÿçÁÇþéÅÆÿçÁÂÿÖ¯¥þn]UòPPPµ   ^ìì숂~=&þ@&ÿG+ÿN1 ÿY9%þb?)ÿmG/þ{P5ÿ‹Z:ÿ–d@þ¢pGÿ°‡fÿŽ~†þŒ‚Žÿµ£šÿ†{€þxpyÿ¤˜’ÿÓ¼¡ÿÕºšþÔ¸žÿÒ¶«ÿË©”þÉ•«ÿЛ·ÿѤ·þÕ­»ÿز½ÿÜ´¿þÞµÂÿÞ·ÃþÞ¶ÃÿÞ¶ÃÿÞ¶ÃþÞ·Âÿà¸Äÿã»Æþæ¾ÈÿèÁÊÿéÂÈþçÂÆÿܵ´ÿÁ›‰þeUIñSSS±¤¤¤Zîî„”>(þ?&þD)þI.þT6#þ]<&þeB+þqJ1þ€S7þ_;þ pGþ«zþ…žþ”ޤþ‚|–þOGkþLD_þ}vþĸ¬þ¤–þ¡”þ¶£•þ½˜”þǦþÌ­þÌ–°þÒ¦´þ×°¹þÛ´¾þݵÀþݵÁþݵÁþÜ´ÀþÜ´ÀþÜ´ÀþÞ·Âþâ»ÆþçÀÉþèÂÊþä½ÃþÒ§®þ½’Šþ¥~`þ[M>îYYY«ªªªSñññ–Œ‰B,þA'ÿD+ÿJ/ÿQ4"þY8$ÿ`>(þkE-ÿyP4ÿa;þ©|Qÿ¬—”ÿ„}ªþƒ}ªÿkeÿwsŸþkgÿ• ÿ£œ¤ÿb^{þ{v…ÿƺ¯ÿvc{þ°¨ÿÒž¸ÿР·þÓ§¹ÿÓ­¸ÿׯºþÚ³¿ÿݶÁþÞ¸ÂÿÞ¶ÂÿÜ´ÀþܵÁÿâ»Åÿå¾Çþå¾Çÿã¼ÄÿÓ¦²þºÿ«kÿxWþ]PCêaaa¡³³³Kõõõ £›™yI.&þ>&ÿD*ÿJ1ÿQ4!þY:#ÿ_=&þiC+ÿ~S4ÿšiAþ¶‹lÿ²¤¯ÿ—µþ—¶ÿ¡šºÿÆÄÉþ~w¨ÿ­¥­ÿ¦¨ÿ{x›þ©¢©ÿƼ»ÿRBqþn_ÿ¶œ³ÿ¤Œ¤þ¤‘¦ÿË­½ÿÒª¹þÕ¯ºÿÚ´¿þܶÁÿß·Áÿá»Æþå¾ÈÿæÁÈÿâ»Ãþݳ¾ÿÏ¢°ÿ¿‘–þ³†xÿª€fÿ—uXþ]RJáooo’ÁÁÁ=»®²`V35÷>&þA(þG,þP3 þX:#þbC)þvO0þ›lDþ¿’iþÒ´“þÏÂÂþ¿¹ÏþÁºËþׯ¼þƽ¿þ¥ž¸þ¾µµþ µþ¢£¹þ¶°¶þ›“¹þbTšþq þº«Âþqf‹þNBgþ©™­þ̲Âþǯ¿þÌ´ÀþÖ¸Âþâ¾ÈþêÉÎþîËÑþåÀÈþÚ±»þËŸ¬þ¸Ž’þ°…{þ°‚rþ©~cþ‡kTüYURч‡‡xÓÓÓ+ÍÄËDdFQÞA'ÿ?'ÿD,ÿL1þW:#ÿfD*þŽb<ÿ™rÿع¦þäǹÿìÑÉÿì×ÐþèÓÉÿâËÀÿʽÃþĶ»ÿ»°ºÿ’гÿ”´þ£¡¹ÿ’Âÿ ”Èþ·£Éÿ±¡Æÿf]þg]ÿÓÁÒÿxp—þTKtÿ„z”þ±¤´ÿ¾­»ÿâÉÐþìÊÐÿä¾Èÿ×­¸þÁ—œÿ±†ÿ²„xþ­€kÿ sWÿt[Hö[[Z¸¡¡¡]ãããàÞá&qw±F/(þ>'þC*þK0þV8$þlI-þ¥}Yþ×¶¡þíÒÆþùàÙþüæßþûåßþøÞ×þîÓËþàËÂþÛ¼¨þůªþ®¡¶þ²«½þ¼´Çþ±¤Îþ¿°ÒþؽÑþ©šËþul¸þœÁþÛ¾Òþ’ˆ³þ{¥þ½´Çþ¤³þf`„þ©³þéÈÑþå¿ÉþÖ¯´þ¿–’þ¶Š}þ´ˆtþ­‚eþ›uPþj[Læmmm—½½½Aðððòòò¨›¦zV=Aï>(ÿA(ÿI/þU8#ÿtP2þ¶’wÿèË¿ÿûäÞþÿïíÿÿôñÿþóñþÿíéÿúáÚÿîÓÇþâ°ÿÕ®–ÿ¡–ÿ¼žŸþÆ®Áÿ¿­ÒÿÁ¬Ñþ×»Õÿ® Ñÿ™Éþʶ×ÿÒ»Õÿµ­Õþ°«ÐÿÁºÕþˆ´ÿ_[‘ÿ›”³þéËÒÿâ¾ÆÿÔ®­þÁ—ÿ·‹zÿ¶‰pþ²‰_ÿ–xQüb\ZÎqÖÖÖ(ÑÎÓ:zeoÄG.(þ>&ÿC*þO4 ÿsN0þ¾™~ÿó×Íÿþíéþÿ÷öÿÿüûÿþùùþÿóòÿþëæÿöÜÕþêÍÁÿá·œÿϘÿÀˆ…þ× ³ÿÝ©ÅÿÛ¤ÃþܲÍÿ¿­Öÿº­ÖþÝÌÞÿ·¯Öÿ¢žÒþ¸³ÙÿÇÀÜþª¦Ñÿ™”ÂÿνÐþéÇÐÿß¼¿ÿÑ®©þ¾”†ÿ¯ƒoÿ¬dþ¨€Vÿ€lWîiii ³³³Kêêêðððž‹£ˆX=Cò>)þ@(þI1þjF*þ¸“wþôÙÎþþñìþþúøþþüüþþûúþþõóþþíéþøÞÙþðÓÅþèÆ§þⲑþˉ‹þÄ~”þÓ©þÝ“·þâ¡Àþá®Îþã¿ÓþéÑÙþÈÁÜþ²­×þÙÓåþËÄßþ¦£ÔþƼØþçÍÖþâ¿ÇþÝ»¼þΪ¡þµvþ¢xaþšpNþpLüYW]ÕoÔÔÔ*öööÛÞÞ+n€ÀM70ü?(þG.ÿ[=$þ£`ÿëÎÀÿþëèþÿöôÿÿùùÿþù÷þÿôñÿÿìçÿúßÙþñÓÇÿìŪÿå§–ÿÏ‹þ§hwÿšWuÿ¢Y|þµiÿÙ—·ÿç¹ÉþêÅÎÿîÑØÿåÓßþÓÉÞÿ»´ÙþŸ›Ðÿ¼²ÖÿçÊÖþâ¿Áÿܶ³ÿ”„þ sZÿˆ`Hÿ^CþoaZîsrr‘¾¾¾@íííø÷÷°§¼heJXéD-þC+ÿP6 þ„];ÿÕ´ ÿúàÜþÿðíÿÿôòÿþóñþÿïìÿþæâÿùÞ×þñÑÈÿð¾°ÿí§¥ÿæ¢þʇ•ÿ§]ƒÿ™Wxþ£b‚ÿЋ©ÿÝ›±þ䣹ÿê´ÉÿìÅÎþîÊÔÿîÐÜþåÐßÿîÐÝÿëÂÉþå·¶ÿÒ§Ÿÿ¢rZþX@ÿtR:ÿoXGýX]e¼¥¥¥Yàààêëë™ N46ü@)þG.þcA)þ¦cþèɽþýåàþþêèþþëèþþèåþýãÞþ÷ÛÓþôÐÆþó²«þ뢟þæ¢þÛ–¡þ¹lþœY€þ±k“þݘ³þà¶þÙ˜³þÜœ²þßž¶þàŸµþ檿þé¶Æþ㮿þÝ£¦þÌ ›þ©zgþ€Y@þnM6þmR@þZU[ÞnÐÐÐ.óóó ÓÕÙ4gXpÐI1/þB+þK1ÿlG,ÿ²ˆjþòÓÊÿûàÛÿþäàþþãàÿüàÝÿùÙÑþùÈÁÿø¶¶ÿñ©­ÿ韨þᚣÿÏ…œÿ¦\‰þÁxŸÿ餾ÿë§Âþàœ·ÿØ”°ÿЋ­þ͉¦ÿ×’©þÐŒœÿȇ‘ÿ½€ƒþˆZOÿyT<ÿnM8þkN=ÿ^UUêy{}’ÅÅÅ9îîî·µÂX_PkØJ30þC+ÿK1ÿkH+þ¼pÿîÎÀÿøÚÑþýÞÒÿüßÕÿüÝÔþþÅÀÿþ¶ºÿü²¼ÿñ§°þ矪ÿä–§ÿ¼m‘þϦÿò©Ãÿñ¬Æþ碻ÿÝ“²ÿÌ‚¨þÁx£ÿÁ|™þ¾}…ÿÀ‰ÿ’]Sþa;,ÿiG4ÿeI9þ\RSïsv| µ¶¶Jéééôôõ ²¯Á^\MlÛJ30þA+þJ1þkH,þª{Yþᬔþôƹþü˾þþÇÅþþ»·þþµ´þþ¶¹þý´¹þöªµþñ¢¯þÞŒ¢þé³þø²Äþô¯Ãþ颼þÝ•·þØŽ³þÇ þ¯n†þžg_þ‚SFþV6(þZ=*þiK;þZOQïrv ¶¶·Iäää÷øø»¿ÏNng†ÂT=CöJ2&þB)ÿQ. ÿl=.þT>ÿÂvmÿ磟þù°²ÿü®­ÿþ¯²ÿþ²ºþþ³½ÿû«¸ÿ÷©´þÿ¾Ëÿû±Æÿî§½þàœ¶ÿו¦ÿÃþ•]WÿrF7þW6)ÿA'ÿE+þlRHüiciÞ€Š’ˆÅÅÅ9éééÒÙÜ6Œ†¤]NgâI02ýB&!ÿA#þJ)ÿd8+ÿ‹T?þ·ngÿÒ…€ÿÞ‘ÿå•“þçš™ÿç™—ÿæž¡þï´­ÿ㟟ÿdžþ«k}ÿYQÿh?4þL."ÿ?$þ<"ÿB+#þSDFópl}Ä›¢£kÑÑÑ-îîîêë륧Ìe{p†¾M8XòI.1ýA&þ>#þF&þZ2'þl=1þxF6þ„M<þŠQ?þ‹R?þ“YIþœaQþ‹VGþm@7þY3-þH* þ7 þ4þ9%þ?19ù]T[Øu~‘›»¼¼Gàààôôô ÷÷÷ ÖÙÞ5ž˜¹~qi‡¿I9XðD-0þ=$þ8 ÿ: ÿ<#ÿ@%þD'ÿF'ÿM/ þQ0#ÿL.!ÿA%þ7ÿ3ÿ:'þA19ùTO\Ø{y†¡¨ª±bÔÔÔ,ïïïóóóÔ×â4¬¬¾nt~–®B;{äC.IûD,+þ>& ÿ9!þ6!ÿ8 ÿ;%þ@&ÿD*!ÿD,&þA,4þ;5Xó]lvÔ±³ºVÕÕÕ.ììì÷÷ø çêîÒÒß1¿ÄJ°¬­a¡œt—““‚‘ŽŠŽ‹ŠŽ‘ŽŒ‰˜”“Ÿœšs¨¥¤e´²´V¿¾ÆFÐÔÖ1åååòòò ÿÿÀÿÿÿÿÿþÿÿÿÿøÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿþ?ÿÿüÿÿüÿÿøÿÿðÿÿðÿÿàÿÿÀÿÿÀÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿðÿÿøÿÿüÿÿü?ÿÿþÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿøÿÿÿÿþÿÿÿnsis-3.11/Contrib/Graphics/Icons/modern-uninstall-blue.ico000077500000000000000000000331161477201124000235460ustar00rootroot00000000000000(vhž è ¨î 00¨– h>!  ¨¦%( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿÿÿüÿÿðÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿÿ( @B)D+L/I0 V9#Y:$^;'[?+W==`<5lF.kL<xI>xP7~T5ZIGePO{\Hsc^|ketklwnq‘_>•b@˜u]‚ni„ww‡|}ˆ|{§nn¢jq»zt˜ˆw¯ƒf¥m¯†u±†qµpÇ`ÂknoÑ£™¶q“¨Ä~zʈˆŽ‡˜”™ŸšŸŸŸ¡ˆ‡±ƒ¹Ž‰¨—Ž š°™–°ž™º¦œˆ‚¤œŽ«¢™ ¯¬ª¨¡½¶¨´½©¹´³³¸¶¶¿º·Ïˆ…—ŒÁœ™Ò‘¢ơ‘Á¦Ø²™É‚£×ŒªÁŸ¡Ê™ªêŸ«Ï©©Å±£Í´¡Ê±¥È²¬Ö² Þ¸¢Ý¾¥Ç¡³Ç¨·Ê¿½Ûµ°Ü²»Ù²¾Ýº½àº æ »î¼°á¼¹û¸¸ÉÿçÁªäÁ±âǸê̼“ÌššË‡†ÕˆŒÒŒÓ——Ô––Ú—˜Üž›Ø§—À¨ŸÃªŸË “Ó¨ŸÛ³¬Ïº·Á¨¥Ô¼¶Ù¦©á«¬â¯´á¼¼åѨËݶÁÛ·Ä߸ÅÚ¹ÌʸÖųßä­ÀáºÄã½Æã»Èæ¿Êà»ÎÃÂÄÆÂÄÉÃÁÆÂÉÜÉÆéÅÅàÉÀçÀÉìÇÌåÏÉñÒÁñÕÅòÖÉòÓÍû×ÏîÉÕîÏÛðÌ×óÐÑõÚÐöÜÔøÞÒö×ÙøÕÛûÚÞûâÛÌÃâìÝàúÚäïàâöäâúåáýæáûåäþæéûèéþñïàáñíìõÿøöøöøùùû7LUU93:Z¢®ªª®œP9k¤­mpp|²¥S]Mš¨z€¸~)©±¡H/#iš¢lµs´y±§e(hœwnr·ˆ«¦”5Cg'b•.qtxŸž —K3E ";TW\„…ŒŒ—^2‘4<01*[`„Š`%?&˜“A@u,=BŠ6i¸¯ZQ‚‡}va%!K³®d-+‰Œ†G>XfROcN D’ FI {ÿÿðàÀ€€€€€ÀÀàø( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆwwwwwwwÿˆˆˆ€wwwwwwøˆÿˆˆ€wwwwwø‡wˆÿˆ€wwwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿ( @€=$9#"D*K0F-"P-"K1"V6#I/3H7<X97a>)ZH=gD+lH5tK5}T8UJFYTVbMJxKDgTIxXFfXVjb[WQl]Nu^W~a_`idezhlxrmsezwww„M=‡Z9‘^>a<VH“_@ŽgI’eF‡iS™dQxZªsK¥hY¦{Z[{ Y|ˆleŸgh“slˆnt…qs„|uŒyw‡}sw¨ldº}­ƒ[¹€X”€ž†žˆy¬„h¿”o¡ƒs®‰w ‰}²†v¨‘v¬”~°—w¾‘vµ“z½–}Ä…[ÃgǃyǘvÖ¢~dZ…vr‘pc¤}u£vl²LKÊXXÉigÈnqÆuwÅqmÑxvцz‹’~€}ƒ¯d»t‚zÁ€yÓ}„Òƒ€„ŠŠŠ–†‡‹†–š‘“““›•’œœœ£††¶–„¼“†¼’ޥޑ²‹–¤˜”Š„¥”Šª™©‰„±ž™³§—£££¢–¬ª–©­˜®±”« š¶¢¡¡¬¥£§©®«««³«¨ª¥´´©¼²²²»³µº¸ºÆ…ŒÂ–†Ëˆ“Ú–Ä¢‰Ùª…Ê¥˜Ó¬•Ö²œß²œÕ¹œÜ½œà°‘ˉªÓ‰¥Ãš¡Ö‘¬Îœ³Ù›µã›¢â›·È¡¡Ò¬¤Ìµ Ö¶©Ç¨¸Ô¬¹Æ¹·Ú³¹ì¥¥ú«¬â«¹ø­·á»¹ý·ºßįÝijä¬âôèűæÉµèȳä»åɼìͼ÷žìнˆˆÆ–ˆÏœÊ‰ˆÔŽ‘Ù”—ܫϟ¥Ý¡¢Æ³¥Ç¾µÍ¨©Ùµ©Ö¯²Üºµ×©­á¯±á²µãůÊÙ­ÎȵÈݵÁðÐÒ¸Ôê¦Áñ«ÂãºÆûµÄ½ÅãÈÃÊ×ÂÉÎÃÛ×Å×ÚÓÙåÀÃéÅÂàÊÄìÌÃåÁËéÃÌãÏÎíËÍóÎÅìÑÃñÔÄñÔÌþÐÉôØËëÈÓñÌ×çØÜ÷ÙÖûâÜÁÃä×ËãØÚëÞÝñçÖäúÛãíâçüççÿñíççóú÷÷‡pnnnp‹„:@BIKJG9h‹„ar–¹âêêêê⸣7"k™ºêñùùùùùùñê´£nA•³éñùùñÞÞÞïùùùêä¦bjÚb¦·éññùÞÅ]\\½Ëøùùðäªqj5¦êéññùï½[ÂÎÎgZ¿úùùðà¤b‡uD³éìñññ¿[ÙüüüÄYZËúù÷ðà¤;ÚF—³¼éññÝ\ÄüüüÌZÁÁgøùù÷î¯tnqN¸º¼éìñÇ[ôüüÎZÁûÙ^öú÷÷ðà¤5+>—¶¼ììðÇ[ûüÎZÁûüõ^óù÷÷ðæ¯s„u*P•µ¼ììÚ[ÙÄZÁûüüÍföù÷÷÷比3"3.P“µéêå½[ZÁõüüô_Ì÷÷÷îîE&.OSµ¼éÚ[YÊôõÙgÀöîîîîîM %.OR™·¸Ñe[\\[¾Ýîîîíîîîä¤N (.OL¥´±¦©‰ŠÏããÐ×Ðíäíäãठ $(.Amwk¥˜¦¤Ÿ¨ÒÒ××Ò×××ãठ$>lxˆkwv›Ÿ¨ÒÒÒÒÒ×ä×0 &Ly{Šx„U©‚§¨ÒÒÒ××Ò=0 6 $D¦ÛÚ©ŠƒƒƒVÆTx€ÑææÒ=C+nŒ>·ðñðᦉŠÉÇÆXÏW|zíªtF>+Œ’ñüúúì´”ÇÐÉÃÝÉË{yí¨sH>8} •ùüüüñ¼šŽž¢ÐÝÜÉóÉÝߦH-+‹Iùúüúñ¼—22œÕîïÜÉåÒ):Ú³úúùñ¼«¡d2œ  ­Õí­”,i)ºññ컬«¡c¢Õ ›œ=‹`)—ëì°°®«œÖÖ¢œd4 †‰ #Q«¬®®ØØ¢4Ú! ',//<#  jÚ! `Úˆwuu…ŒÚÿÿÿÿÿøÿÿÀÿÿÿþ?øððàÀÀÀ€€€€€€€€€€ÀÀààðøü?ÿÿÿ€ÿÿðÿ(0`€ 4<$>& C)J0F,#Q. L2#V7$E-2H45U79b<*j>2hD+jH6tK2yR6D7UKHJWHLLD_SMPVTT`GLiUHxVGfZVs][x`Ntg]RDij\bu[fh^}ihh{ggngtuhwyvy„M<‡V:^>Ža;†YE“YI’[Sˆ`H˜hD•pN„jZdX™vT¢kF§rI¶xN¤wX´{R™Wv¢Y|‡jk‘jjˆvg’}j‡jt†xw•xx·ng¥|d©iz¢}rÂvm¨€V´„\–ƒh›€z«h·ˆf¿’i¨Šz³‡v·’wÄ…[ÉfÊ“iÆšyÓœrZUŒeZ—rkŽ{qªC>ÅNLÇQOÇYXÈa]È^aÈfeÊqhÉlpÏwxÆhhÐxoÑnrÐ{xÒœY€¦\††yƒ˜zƒƒ|˜³l‹‚|¨Â{™Ä{¡€|Å‹Ñz‚І†‡š…‰ƒŽ–”Œ”™—™©†‚·‰ƒ¦’޽”‰¸Ž’¤——½––µ£—•Ž­¤Œ¤°¨§š¥¾– £œµ¶œ³§¦¨´«®µ±¯§¤·¶ªº«°¼¸¶·Æ†‹Ò…€Á™‡Þ‘ˆ–ÐŒœÂ˜˜å™˜Ë¥ˆÕ§†Ù·É¤˜Ó«™Ë²ŸØ·™æ¦šáµ–ˆ§Ô‹¨Ê𫨔¥ØŽ³Ì–°Ú˜´äœ«Çª¤Ô¬§Æ¸¬×·§Ëª¹Ó©¶Ã¹»Ú¶¸í§¥ô¨­å¹¨ó²«ç¦¼÷ª³â¼¹ûµ·Ü­ÄÀ¾ÚͿūçÇ·õʼíн††ÄšŽÅ˜•ć‰ÔœŽÐŒØ˜™Õ¥˜Ä¤›Ö›¢Ú§¤Éµ¦Æ»´È§¦Ö¸­Õ«°Úº²Ö¢¦à«°á³¸âÆ®ÁܦÄÇ·ÅܵÂÁ¬ÑǺ××¼Óä§Åò¬Ää¼ÇûµÇã¿Ó»ÀĽÄãÇÃÆØÄÉÉÃ×ÔÈÔØÐÖ鯯ôÊÆëÒÇòÕÈëÈÓñÍÖéÓÙ÷ÙÖûâÜÇÉè×ÉæÕÕêÝÜñèÚåúÛãßáðæâéüççþðìéêòþìðîñöüøøŒzvv(((((vvŠzllB?KKKKKB%!$(zvlLRœ­­º½¾¾ºº­ª}C$zzl{™ŸºÀêëëïïïïëíêÀ±‚w$ŠŒ({™Ÿ½ÀíïððùððùùððöïêÀ­œml†m“›½Àëïððùùùùüüùùùùùöë鸫‡!$ŠzC™Ÿ½ÀëððùúüõçååãñõüùùùðïéÞ±‡A$ŠyC´½êëððúùøæÁeeeÁÃáøùùùöðìè­‡A$І=ÀêÀëðððúùãÁbbdddbahÎõúùùöðéÞ­=$ã=VèïëëðððúðåÁbdÊñóóÔÄ_aÇøúùðöð鸫‡%vmN¾êëðëðððçÃaeâýþþþ÷Ê^\aÑüüüùöí鸭‡ІMW›½ÀëëððúðáaeâýþþþýÓf^hauõýùùùöï豜{$L“Ÿº½¾ëëëððçÃaÇûþþþýÓf_ÆâÄfâùüùùöïéè«~%z†E™¸À¾¿ÀëëððçÁaâýþþýÔa_ÆóûÒaÎøüùùööí鱜G&@9Vºè¾ëÀëëððåsd÷þþýÔf]ÆóýþñaÉøüùùööï鸫|%ŠŒ-0N™´¾¾ëëëëðæsdôþýÔf]ÆóýþþófÉõüùùööïíè­œGvC*1Nš¡¾¿ëëëðäÁ`â÷Óa]ÆôþþþýÊfÓööööööïíè±|$0:UšŸ½ëëëëîÌatÇf^Æóþþþþñigòöööööíïé踫“3Š *1:TW¡½ëëëëås]]]ÄóýþþýôÊaÉõööööíííí鸫™Czå +18SW¡½ÀÀêêÍa\aÐ÷ýýûóÆdtòööííííííí츫œPv» +68SUš½ÀÀêäc^eÇÎÎÇibtÚööìíììàööí츭™Rv *+78STš¡¾º¾äŽÁ``a_acÅÚíìàììààöììíì豜RlŒ *+77SS“Ÿºººº±¬ÈˆÌ×ÛìÞÞàÞààìßàìßÞÞÞ±“v‹ *167Swyžº¬º­­­­±¯ØØØØØØÞÞÜÞàèèàÞì辫lŒ *17Mvw‚v'€ŸŸŸ¬œ¤§¯¯ØØØØØÞØÞØÞÞèÞ豓v *+1Rnƒn(¬z€‚‡¢§¯¯ØØØØØ±ÖØÞèèÞ«~Ey» ,I€ppYpZƒŠ#(¬'…֧د¯ØØÞØØØÞÞÞÞ¨M5z *1N‹ƒÃˆã[ŠŠZŠ» #‰„„Õ¯±Ø±ØÞÞÞÞØ§QM5Œ  1T›ãÚͼ㈈ÃY[ÌZ ˆÕÕÕØÞéìÞ±¤{MM3'" ,O­¾êêêèã°ƒƒˆÃÂÌÌYYäZ nŽŽàí诇QQM4v† I­êðùððêè­¬ˆÌÍÌÚÛÈcÂÛÂp͈#ˆàÞ±QQM7Š R¾ðúþúúð꽜‚ÕÏÙÛÉÂÚÛÏÌÚƒYˆàè«~|QJ5vy Vðúþþþúúïê¡V‘¨ÖÖÜÚÏìÏÇÑâÎÃãฬ~NMI?zãRëúþþþþùð꽡‘•£¨ÖÜàîâÏóåÎÚìÞ¼«QE12&„  KÀúúþþúúðë½ ”F;ÿÇ`ÿຠÿàÉÀÿzÃÿ——Ôÿž›Øÿ “ÓÿîÏÛÿîÉÕÿðÌ×ÿìÇÌÿÆ¡‘þplhª‡‘L/ÿlF.ÿ•b@ÿ¯ƒfÿº¦œÿű£ÿȲ¬ÿǨ·ÿÛ·Äÿ߸Åÿã»Èÿæ¿ÊÿçÀÉÿÛµ°ÿsnj¬šŠ‡D+ÿZ:%ÿ~T5ÿ¡ˆ‡ÿˆ‚¤ÿއ˜ÿ”™ÿ£™ÿÇ¡³ÿÙ²¾ÿݶÁÿáºÄÿܲ»ÿ¯†uÿ|xt›»°³_B)þY;$ÿµpÿåÏÉÿÜÉÆÿ¶¨´ÿ¨¡½ÿ§—Àÿ¨ÿœŽ«ÿ½©¹ÿã½Æÿ¹Ž‰ÿ—s[û¡¡¡eíëíV?>èV9#ÿâǸÿÿøöÿûçáÿÞ¸¢ÿÊ™ªÿѨËÿʸÖÿ¼¶Ùÿ¨ŸÃÿݺ½ÿ±†qÿ†s_ØÜÜÜ"¯¦®qI0 þ¢ÿþñïÿýæáÿî¼°ÿÄ~ÿ¶q“ÿä­Àÿà»ÎÿÚ¹Ìÿ—ŒÿyZFû¥¤¤f{nx²[?+þÖ² ÿû×Ïÿû¸¸ÿ꟫ÿ׌ªÿæ »ÿÉ‚£ÿ§nnÿjK;ý‰……˜óóó õöø ˜ŒQ66öxI>ÿ»ztÿψ…ÿÒ‘ÿ¢jqÿ`<5ÿN<:í¤¢¤wóóó ÙØá1Š„••dSSÉZGA×bNFÔdVXÅŽ’‰ÙÙÛ*øàÀ€€€ÀÀð( @ €ôôô çççÛÛÛ#ÒÒÒ,ÌÌÌ2ËËË3ÌÌÌ2ÑÑÑ-ÚÚÚ$èèèòòò ëëëÎÎÎ0©©©Uƒƒƒ}mmm–ccc£___ª^^^«^^^©ccc ttt’’’l²²²LÒÒÒ,êêêòòò ÍÍÍ1™˜™jrno¤oecÓŒwv횃sô¦Žr÷®•tøª’{ùž†zø‡tqô`UWëMIJ×QQQ¸uuu‹¥¥¥YÕÕÕ)îîîæææ°°°Nqmq©†prå¶–„ýÖ³žÿçÈ»ÿíÎÅÿðÒÊÿòÕÎÿñÕÏÿðÒÌÿìÍÆÿãļÿĦŸþ‚npøGADçGGG¿}¾¾¾@çççÖÖÖ({ƒovÝ …ÿܽœÿêÌ»ÿóÖÎÿúÞÚÿýäâÿþçæÿýèæÿýéçÿþçæÿýââÿúÞÛÿñÓÍÿã´ÿÈ¡¡þ}fmú;9;Þ]]]£¥¥¥YÞÞÞ ×××'Œ…‹‘–zvëÑ«þæÇ­ÿñÕÅÿùÞÕÿþæâÿüêèÿñããÿÞÖÛÿÕÐØÿÙÒÚÿèÝâÿøéêÿþêéÿýâàÿõÖÔÿéÆÅÿ×±°ÿœ{…üLCHèTTT°   ^ãããèèèЇ˜wyñÜ·¨ÿèɱÿòÕÅÿúßÕÿþæáÿûêèÿÝÕÚÿ¡¢Æÿy|ÃÿnqÆÿqsÇÿ„†Éÿ·µÔÿíâçÿþëëÿýããÿ÷×ÚÿìÊÊÿ×°®ÿ¦‚‡ýMCGêWWW¬³³³Kéééôôô ±°²U‹icðÙ·©ÿò×ÍÿóØÉÿøÞÑÿýäÝÿýèåÿãØÛÿˆ‹ÂÿdgÊÿ”—Üÿ³¶åÿ¯³ãÿ}„Òÿ\_ÈÿŸŸÏÿõèêÿþêëÿþâåÿø×ÚÿêÆÃÿÔ®ªÿŸý>:<ænnnÈÈÈ6óóó ÑÐÑ1txÎÄ•pÿãÀ­ÿðÕÅÿõÚÍÿùߨÿþåßÿïßßÿ›šÅÿgkËÿ½Åãÿö÷ùÿþýýÿóôùÿŸ¥ÝÿLKÊÿUTÊÿ¿¹Ûÿúêïÿÿèíÿþàäÿ÷ÔÖÿéÃÀÿÓ¬¦ÿrvý999ÒqÝÝÝ!ïïï —š„­ˆuûײšÿäÁ¬ÿíνÿòÕÇÿøÞÕÿýåßÿÖËÕÿkmÄÿ¤«Üÿôôøÿýüüÿõõùÿ©­áÿ]^Îÿ‰ŒØÿÙÿ‡…ÒÿðâëÿþêíÿÿäèÿûÚßÿòÎÍÿà»·ÿÀ™ÿYLNóYYYªºººDòòò ÐÏÏ5soÕ›}ÿåúÿë˼ÿïξÿóÖÅÿöÚÑÿøàÚÿÁ¸ÎÿeeÉÿÙÜîÿüûûÿóóøÿ²µãÿYYÌÿ’ÙÿãäòÿÂÇäÿomÎÿáÔæÿþéíÿÿäèÿþÝãÿ÷Ô×ÿêÆÃÿÒ¬¥ÿ•tlýC@AÕqããã©¡¢v†`Mú­€^ÿׯšÿéȶÿïξÿóÔÅÿõÙÎÿõÝÖÿ¾µÍÿjhËÿéçõÿõô÷ÿ²´âÿVVËÿØÿçèóÿüûûÿÞÝñÿqmÑÿÞÎæÿþçêÿÿâæÿþÝãÿùØÛÿîËËÿܵ°ÿ¼“‡ÿXLLïfffœÎÎÎ0ðððƒnn½nK4ÿ‘bCÿÀhÿ×­ÿèİÿñÏÁÿôØÊÿóÙÐÿÏÀÏÿjfÈÿÁÁåÿ¦¨ÝÿXXÊÿ×ÿîîõÿýúúÿùöøÿ¯°àÿ€yÓÿì×èÿûßèÿûÜåÿüÚàÿù×ÚÿïÍÎÿá¼¹ÿÌ£˜ÿ‡jcúKKK¼´´´JæææwYOßdA,ÿ~T8ÿ©uMÿÇ‘fÿÙª…ÿéDzÿñÒÂÿñÖÉÿãÏÎÿŽˆÇÿ_^ÉÿURÇÿ‹Õÿææñÿüùùÿú÷÷ÿÒÔéÿxvÑÿ²£ÛÿöÛæÿùÙãÿöÕàÿöÐÜÿóÑ×ÿïÍÏÿåÀ½ÿѪ ÿ¡ƒrýJHGÓaÝÝÝ&bK<æY9%ÿmF.ÿ\<ÿ¬rJÿŇ\ÿÖ¢~ÿçÄ®ÿìнÿéÒÅÿ;ÈÿicÃÿVTÄÿ¯²ÜÿÛÜêÿÝÜëÿÂÁäÿ‚€Ñÿ‚ÓÿèÐáÿôÕßÿòÏÚÿñË×ÿïË×ÿóÏÚÿñÌÓÿæÀÀÿÔ¬£ÿ´’zþRLFào×××1VA2éQ3!ÿ`=)ÿzN3ÿ‘^>ÿ­rLÿÃ[ÿϘwÿß» ÿæÉµÿä˾ÿĵÃÿ‚zÁÿfbÄÿllÇÿmkÈÿldÉÿ–ˆÏÿÜÃØÿðÎ×ÿëÉÔÿêÆÒÿìÅÒÿïËÖÿðÌ×ÿðËÖÿéÃÉÿÖ°ªÿ½–}ÿULC䉉‰uÓÓÓ9N:.ëI-ÿV5#ÿiD,ÿ}R5ÿ“_@ÿ©qJÿ¹€Xÿ¾‘vÿʲ¡ÿßįÿÝijÿÕ¾®ÿų³ÿµ¦ºÿ·§½ÿʱÉÿÞÀÌÿãÀÉÿà»ÇÿáºÈÿå½ÊÿèÂÍÿêÅÎÿëÄÏÿçÁÌÿæ¿ÈÿæÁÃÿЩœÿ]RJ刈ˆvÔÔÔ7L9-ëC'ÿM0ÿ]<'ÿmG/ÿ‚T8ÿ–d@ÿ¨uLÿž†ÿš‘ÿ§•ÿ•‹Œÿθ ÿÕ¹œÿÒ·©ÿ̨ŸÿО¸ÿÔ«»ÿز½ÿÜ´ÁÿÞ·Ãÿß·Äÿß·Äÿà¹Äÿã»Çÿæ¾ÉÿèÁÈÿæÁÄÿΨœÿ[PIäqÚÚÚ.P=2é@'ÿH-ÿV7$ÿb?)ÿsK1ÿ‰\:ÿ©~WÿŽƒœÿ‡£ÿ^W~ÿWQlÿµ«§ÿ‘†‰ÿ¬ž•ÿ²‹–ÿÊ®ÿΜ³ÿÕ­¸ÿÛ³¾ÿݵÁÿݵÁÿÜ´ÀÿݵÁÿâ»ÅÿæÀÉÿã»ÂÿÇ›ÿ¨€fÿVLCÞ———gããã ZD;äA'ÿH/ÿS5"ÿ]<&ÿmG-ÿa<ÿ·”zÿ–¯ÿއ²ÿ§£½ÿ‡‚§ÿ¦§ÿvr‘ÿ¹µÿ]Nuÿ²•­ÿ±“ªÿǨ¸ÿÔ­ºÿÚ³¿ÿÝ·Áÿà¹Äÿã¼Æÿä½ÅÿÝ´¾ÿÈ›¤ÿ±…wÿxZÿ[TMÑ©©©UñññpPXÓ?&ÿE+ÿQ4 ÿ`A'ÿ†\9ÿ¿”oÿ×¼¨ÿÏÄÌÿÐÄÇÿÍ¿¾ÿ¶­»ÿ¡œ´ÿžœ¶ÿ ˜¸ÿpc¤ÿ³¤ÀÿdZ…ÿ•‡ ÿ­˜®ÿª–©ÿϵÀÿêÊÐÿìÉÏÿÜ´¾ÿØ¡ÿ±…~ÿ­€mÿlTýca`µÆÆÆ8‘‚‰šB+!þB)ÿN2 ÿeD*ÿ®…bÿäÇ·ÿöÜÔÿøáÛÿòØÐÿàÊÄÿÒ¹¬ÿ­ ´ÿ°ª¾ÿ±§ÊÿðÐÿ·¥Íÿvl²ÿůÊÿ}u£ÿŸ–±ÿ™©ÿ¢–¬ÿèÆÏÿÛ³»ÿ¼’Žÿ´‡wÿª~_ÿzbLñ{{{‰ááážÅOU>?í?'ÿJ0ÿkH-ÿÆ¥ŽÿùâÛÿÿóñÿÿõóÿþìèÿôÙÐÿáÀ¬ÿÊ¢ÿÀ ÿʰÎÿѲÐÿ»¨Óÿ«ÏÿÓ¿Øÿ®¨Óÿ½·Öÿ…±ÿ“‹¯ÿçÆÏÿ׳³ÿ½“†ÿ´‡pÿ­†YÿkaYÓ©©©Uóóó ðððƒl~´B+ ÿB+ÿcB(ÿʨ‘ÿþìçÿÿûùÿÿüûÿÿóðÿúãÝÿìνÿà°‘ÿÆ…ŒÿÖ‘¬ÿàš»ÿÙ­ÎÿÛÁ×ÿÎÃÛÿµ±ÙÿÐÉáÿ°«ÖÿÙÅÖÿãÀÆÿÓ°«ÿ³‰uÿ uXÿ†kRûzxx“×××'ÏÍÒ?\DLîB*ÿS7!ÿ¯‹nÿûäßÿÿöôÿÿøöÿÿñíÿüâÝÿïÑÁÿ鯠ÿΊÿŸ]xÿ Y|ÿ̇¨ÿå²ÂÿíÅÒÿåÒÜÿÑÅÝÿ¸¯ÖÿãÈÖÿâ¼½ÿ–†ÿ‘gOÿ~\Bÿfa`˶¶¶Iôôô öö÷ œ¢ŒG/(þG.ÿ|X<ÿàÁ³ÿþéæÿÿíëÿþèåÿúÞ×ÿôÉ¿ÿí§¢ÿ㛢ÿ¿u‘ÿœYÿЊ©ÿÞ›´ÿÞŸ¶ÿâ§»ÿè°Äÿé¾Íÿ㯸ÿΡšÿ“hQÿpO9ÿdTP𔕖mæææèéël]pÉF/'ýN3 ÿŽgIÿëËÀÿûàÛÿýáÜÿúÜÕÿû½ÿõ®³ÿé ©ÿÙ¡ÿ¯dÿ㜹ÿê¦ÁÿÛ•²ÿ̆©ÿÑ‹¦ÿɇ“ÿº}ÿzQBÿnM8ÿgRIôz{~™ÙÙÙ%ÖÕÝ1eWnÐF/&þK2ÿ‘iIÿß²œÿøÏÁÿþÐÉÿÿ¼¸ÿþµ¹ÿø®µÿÿ׆¡ÿò©¿ÿñ«ÂÿᘷÿІ¬ÿ·sÿ¤kfÿtJ@ÿ`@.ÿ`KDøvx€¢ÎÎÎ0ÜÝå(~xŽ®P8:ûD)ÿY1%ÿ„M=ÿǃyÿÿú«¬ÿý¯·ÿü®¸ÿú´½ÿûµÄÿäž´ÿʈ˜ÿŸghÿj@3ÿJ-!ÿF-"ÿj[\ꌒ—ƒÙÙÙ%ìî濫¾paPfÞG-1üC'ÿP-"ÿvD9ÿVHÿŸ`Qÿ£dSÿ¬nbÿ§l_ÿ}LHÿ^71ÿ?%ÿ9$ÿC36öddo³´¶VæææÖÖâ4•‘©ZLfÛB.5÷;#!þ<#ÿ>$ÿA%ÿI,ÿJ- ÿ?%ÿ6#"ýG97ða]lÅœœ¥tÖ××+ööö âæé$«¯Ï_–™‰„yxŸwmj­qhd³ulh¯tq¤Š€€–“¢‚¸ÀÅPâââõõõ ÿàÿÿ€ÿþ?üøðàÀÀ€€€€€€ÀÀàðøü?ÿÿÀÿnsis-3.11/Contrib/Graphics/Icons/modern-uninstall-colorful.ico000077500000000000000000000560061477201124000244470ustar00rootroot00000000000000(†h® è ¨þ 00¨¦ hN!  ¨¶%00 ¨%^6( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿÿÿüÿÿðÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿÿ( @Ú}ÿiÿl ävÿ| ÿs'ÿz!ÿy-«)!ÍMì Ïb=Çe.û}IÑYvØS{Ûp\ònRýuuÿ¥­™•=µ–"”¶#ß‘ûŽÿŒ ÿŒʨÿªø»ÿŒ6ú?ÿ¥&ýª.ÿ¢5›Ä"ŸÞ)ÆØîÈÿÀïÕ>—œD…†g†‹p¸¨j«¿d¤®t¢©Ò©Qÿ³uÿ»r¬Ël±Ïaùd¾÷oÿÈNûÔFéèEßÒaöñbnqЦz’[µo¾†k·v¬¼è› ŧڮzäBþ§vé }þ§±æ¼ë~˜ÇgˆÓzŒÑ ÐÝèß+íÖOù×gëËCÆëRÑîhÙë{Ûæ{áïž›¢Ÿ’‰¼ˆ ¨š¢­žº¯•©¨£ª¬§°°¯ºº°¸¿¶Ç¥žý‚´ýˆµ÷œ¦Ä©¡Ò¼¡Þ½ªòº²ÿ¹þØÄýŒÔî’ìû‹É̵Ìß»þÚ¥ÃáªÉã®Üü­Ìê¿Ðè¼Êõ¾Éþ½Òþ°ëì·üð¹üü¹‡ŽÑŠ‘Ò‰›Ñ•›Ù ›Ä• Ê·È† Ñˆ²Ð¨¤Ë¦ªÕ¥¯Þ«¶ß¼½Ø¥«à‰ÑÏ‚ÝÊ…ÓÙ¯ÌܲÏÞ¿ÚÛéÀûÆŠøÞºîǤûÝ·üÔžéìŽìðËÉÛÊþÃÁþÍÈèÖÞ÷ÖÛ÷ÚþêÄèôÅèÿÄëÿÍäÿÖèÿÓàþÛåúßúòØöÿÚßäíæëãëîåàòäêûáìúâ÷õæøúâøÿçñþëõþëäðñõúðøûúd^^`\h|wp/-ž²®¯´=+b m¢…€Š³~:GJŸ†ŒºŽ>«n,FH–šM¸‹ƒ­‰£t$QS—™ˆO‚¹e43 `“LVYœ›N‡„?!Z’KUWX‘I<#[”PRTCBA6*)dED• ˜kji1.2"(@ l°¡{zxsr_9'0 ª²§¨¦¥¤}; f©¶¶·´¬q% 7go8&5yuvü?ðàÀ€€€€€Ààðü( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆwwwwwwwÿˆˆˆ€wwwwwwøˆÿˆˆ€wwwwwø‡wˆÿˆ€wwwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿ( @€shGwqKffSroX||YP}ojkfou`tylxyuÍtýnÿs& ¶ ›15™- ¾08¬)~„>H­% Ë4É.óÞ(3Ô?õ*#ø!NÓ ~ÑMê xÑ+qù) ¯z/¥k}‹EY¬Ux‡ev‘kY©vo©go¥z~£}y°tÇU-ßJ*ÒT;ï\6û\Îpàp+öoLéKEþ^Pÿ\kÿXkÏ`vÎzCþpYÿurþmlþ{vþw’›º™‡µ µ¡Ž’3…½"˜¢;¢¡%ÌŽýŽ Û¼û®þ‰2ÿ¯-†Í°Ðì´é‚Ò+†Í4–ù5ÏÐðÏÏäÿÊ-Êó%ëã%øå+àê4ûå?ƒŠB´”_³H™ª\Žw©—u¦aš¥r¬¬oý–J˱Yû«Sçcï¬iËMÆj«Òm«Âxèx´ìmÑÐ^ùÏPÓðSïúEýù]ÂÖrÿÓlÐýcÿë`øðcåÿ~rY§tq¸NXÆYjÈipÇ—o—‚z»2±3•³¿µO”’o’‘x£€A°[ £n²ªÚ à&öŠبô¯,õ¦uÓžMþŠqû‘sͪWöµuõ±/ŠÅ¶ÝŸã°é9´ìuŠÍy¶ÈMºì ÏÑêÐ3ôÃÔê-Ñîöè3íè|ÈÊLêÙhóÒMÙéqÎî^ãéoî臇‡‰•ƒ—ˆ„–—´”Ÿ€­š¢’†° ©©©³´®¸½µ’ÿ›§ö…¨ÿ™¸ý‘ŽÐ±µÊµ“ñ¯¢ÿ£®ÿ¹·ø»ÄÅüÏÄé€ÍøÛà•Äþ•ÿè‚óþŠþë’þù•ÆÈ®öØ­Ûê²ÄüºÕûºùç¥îÿ¦úÿªýç¹äÿ·úûº‰Ñ–«Ï²¸Ø­´â“ÒÊ®ÔÉŽöϰõÏŽ×鹯âïë¢ôéÛÛÄÄÃÔÔ×ÜáÛÓÇäÃÔãÃËûÊÕüÆÆæÕÓèÙÈúÓÙûÕûíÍçýÈôþÈïëÞèþÙøù×ÉÕæÛéæçèçéøäõûèãéðì÷ó÷üõ¶¯&&&&% °¶´(8oº¼ÈÈÆÅmc ¶·$4<»ÐÑñôòñ×Ó{s_®*6>Àëôùúúúúõõ×Ìu[#¶)-5=Àêôùùçææøýúõ×ÌyYE¶ˆ.0;¹ÐïùíÙ€€ØÚøúõðËrYE¸,3:”ÁîïíØØáÛÙúúõÕÉWU®"33“ÀßîîÙåýýýÛ~~åóúðÒwLU¶µŒŽ“—¿îîÝ€ÙýýýÛ~ØØØóóðÕwLJ? ƒŽ–—ßßîÜ€æýüÛ~Øûá€çððÕÄhHU·¸ ‘–ÞÞßßÜ€ûüÛ~Øûýû€çÕÕÎÄjHJC®Š ¡¢©ÞÞãßÝáÙ~ØüýýÛ‚ÎÄÄÄÄfKH@ ‰£¥¦­­âããã~÷ýýæ}²jhfjif HG„££¦­­âââãã~Üö÷å‚jfK KKK G˜šœœ««­àââãà€}|iK ˜š›œŸ«««àààââà’ÃjfK „›£¤ª¬­­à§§‹—”ÐùúüúýúýúúúòÊXdl7ÀëïôúõôÖxPMDÍék SSSSOMDnmRQRkÃÿÿÿÿÿàÿÿ€ÿþüøðààÀÀ€€€€€€€€€€ÀÀààðøü?þÿÿÿàÿÿÿÿÿ(0`€ s^.ul4:pt[[V_bSklPPu`eedtihnvdwwwƒ}3ü^Ípünþv+ ”® *° ”7,+ ®-I¿y·~‡9W¯1 Î 3Ëì /õ Â-,Ú8é2/ï8UÐqÐLð kî xÆ&_þ9~û =•R ½I3‰l®g!©jX”Vs„^kš\z™^O«Ks¶Hgª_O˜wy‹ir‘hyŠzf—u}–vf¦dt¡b ÈT$ÕS3öOÑmóx-õnVßNjÀ_UüN~þZnÏtOüopüsŽ˜²“ ˆ¶°¬‹”,‹§-Îû Ͳû®þŒ1þ²,ŽË¬ÒŠí ®ê ‡û ÐÑ÷ÏÓæ ëäÅÝ9þÑ(Ðî/ùì3ŽQ’­L£´[ƒ†c’Œk†•eŒt˜”{ºœm™¹b¶¦zü”KÑ­[ü±NÓvâ—hŶkú³q‰É[³ÖS½ýH€×m¾Äi©Ìp»Ùsér‰þyœúx½þdºãx´úqùËPÚûQ÷óRÆØ{üÒkÉðhÇ÷võøqzWŸEyŠiW­Ig¼sjµ5EÃ~ÌMUÆVeÈhnÉoœ¦qŒp¢Ž“1Œ‘ªˆ °³ªW˜Š`…‡O¢”\”ªl®ªÏ‘í’.ù Ù¯ñ¬+ñ²oÅVþoûP÷¯wõ« ˆÅ µØ˜â±ç8®ër‰Êu²ÆQµìeºë ËÎïÎ1õÎÑç1Ïîíê4îç|ÌÚSðÐoðÎPÐëpÎîSëçrë눈‡ˆ—‹Ÿ—‡–—–­›’©š¯±”ƒ–·©‹ —´±§¨§¬·¥¶µ©»¯¼¬·¸¼¼¼Ùº¤™ÀŽ­Åû“«ý†µþ†¨ÿ”ºÿ˜Ëµ³Ë±ö²°ù³ÏÃŽûÏÅü…Ûý‚ÉÿœøïŽÈÏ­ýܨÐù·òø´Œ’Ë‘®Ï¦±Î¾æ®·á‹ÊײÑËóÓ°óΉÙð·Ëåîì¥óèÊÓÑÑ÷ÎðùÒÐ×èÙìæòùêÓÎÎÇÄÄÄÄÄÇÇÎÓÎÅ9811===220 ÄÎÓÇ;5Ey}ØÙÙÙâ‰{mi  ÇÓÎ8EDJ~Úäèèèééèééããˆwe  ÎÄ3"FJ~Ûèøèùùùùùùéééåã„`eÇÓÎ/ @JJ×ßøøùüüüüüüüùüùéåå…c`0 ÎÉ3"@JJ×ßøùüüüüüüüüüüüüùééå…c^d ÎÉ3?@IJ×ßøøüüüû÷÷÷÷úûüüüüùééå…c_e ÎÏ*?@II×Þèøùüø÷Òê²”êê÷úüüüùééåƒa_O Ó*?CCIª×òøøûû÷ꔓ””””””ìûüüüùç凃a_OÇ:AC@IIÞßèøûû÷Ë“”ìúúúîê’”êüüüùùéåƒaa\ÎÎ.BCC©ªÞòòøøøË“²ôüüüüüê’’’ÑüüüüùçáqV]\ Ó6ABC¤©¬ßòøøøì“”ôüüüüüî”’””êúüüùùçá‡VT]OÇÉš£¤¤©¬ÞòòòøòË“ëûüüüüî“’êôê”îùùùùççáqTT\ Ÿ¦¦¤¤«¬Þñòòøð²“ôüüüüî“’êúüî’ÑüùùùççáqUT]OÎÒœ·£§««¿Þòòòòò²”úüüüî”’êúüüú’êùçúçùçáuURTSÄ¡œ·¦§«¿Þññòòûð²“ûüüî“’êúüüüú”ÑúçççççáuURTT Ó™¹··§¸¿ññööòöò²“ôûí“’²úüüüüîÑçççççáuuURRTKΘ¹»¸¸¾¿Ãññööòö뎲ꓒ²úüüüüú”ÔáuuuuuuooRRLÇ÷›¹»»¼ÂÃÃõññööòñ²’’²úüüüüúêÌuuoooouooRRLÇð­°»»¼ÂÃÃÃõõõõööï““ïûûüüúê‹—ruoUUUooU RQÄì­°°ººÀÃÃõÃõõõöööí““²ëëëê——roo QÄÒ‘¯°°±´µÁÁóóóõõóöóí²“’Ž‹–roU  Ä둯°°±´µµÁÁÁóóóóóöõóóÁ¡Êrsoo   ÄÒ­¯°°º´ÀÁÁÃÃÃÁ³õõóññ¬ª~‰…ƒVVRRRRR  QÄÒ­®°¹ººÂÂÂÃÃõ³³ñ¡¨¬ªªJ€…caVVTTRRRR RQLÇð›®¹¹»¼Â¿¿ó³³³Œ¬¨EH‚„cc]aTVTTTRRRRQSQÇ𘮹»»¸¼¾¿¿ñï³³   ¡¨,6×;|……caa]VTTTRRRRRRTSNϘ¶¶···§«¿Üòðëëëò¡ÞܨÝ2†ztƒaa]VTTRRRRR]SSKg,œ·¶·£§¨ñòòðððòòÜßÜÜßÜžÅæ2z‡ƒƒƒVVVURTT]\\KÄÉš¶¥¦£¤¬ððøûøòßðòðÜÜðÜÍÝÝ97ågdtpqVTUT]^\NÎð,¢¢¢££¬÷øûøûøøßßßððòÒðèÝÅÏåÊkànlqVTT_^XKg:-¢AAC¬èûûûûøøøßßßøððßøÒÍøèæÐÔÆ ȃqV]^XXOÇÝ-A>Aªðøûûûüùøøèèèèèèø÷ðèÓÐææÓÊà‡ƒa_^XMd<>+>Ißùûüùûùøøèøèèèèèéèé÷Óù÷Ðæá‡‡a^XMKÎ@Þøùûüüüùøùøøéøééèéèéø÷æÑæéå‡_^WMjÕ!Ißûùüüùûùûùøùùùùùùøéééùùé銅^XM/!ªøûùûüüùùüùüüùüùùùùùùùéééŠ_XPÏ3"×øüüûüûüüüüüüüüùüüùùùüùécZÊ@×èûüüüüüüüüüüüüüüüüùùé…ZÐ4"JÚøüûüüüüüüüüüüüüùéŠbZPÐÖF~øøüüüüüüüüüùå„bZWe÷v%(GØÛäèääã‰xZY$$4àæv##%%%&&))[[[YYY$eÖè{'###&#&$Y$$fæææÏÖÖÖÏæ÷ÿÿÿÿÿÿÿÿÀÿÿÿÿ?ÿÿüÿÿðÿÿàÿÿ€ÿÿþ?üüøððààÀÀÀÀ€€€€€€€€€ÀÀÀÀààðøø?ü?þÿÿÿ€ÿÿÀÿÿàÿÿø?ÿÿþÿÿÿÿàÿÿÿÿÿÿÿÿ(  @ççç°°°Sƒ‘u†o«ul¯vzrž“““oÉÉÉ5óóó ¿À¾Dc§aÀvÚkõµ÷œþÒþ°ÿÜü­þÔî’ý¨½^õjqPÏqãã㤶§d=ÎNîuÿÿÊþÃÿìúâÿæëãÿëîåÿøúâÿüü¹ÿöñbþ•7îvvt’ãããÉÏË:1Ä[ïRýuÿ²ÿ¹ÿÛ÷Úÿ• ÊÿŠ‘Òÿ‡ŽÑÿ¦ªÕÿ÷õæÿüð¹ÿûÔFþ’/íqóóó ôôô N¯†¿.û}ÿ}þ§ÿÁþÍÿ·Èÿ«¶ßÿøûúÿ¥«àÿnqÐÿËÉÛÿúòØÿþØÿø»þijDÎÊÊÊ4ÄÐÎ@Ú­úBþ§ÿûÆÿ·üÔÿ~˜Çÿäðñÿ¥¯Þÿ•›Ùÿßäíÿ¨¤ËÿþêÄÿþÚ¥ÿÿ¢5ÿ²’õ“““n‹¹¿{èßÿOù×ÿŠøÞÿ¤ûÝÿˆ²ÐÿzŒÑÿ‰›Ñÿõúðÿ¼½ØÿÇ¥žÿÿ»rÿÿ³uÿÿŒ6ÿß‘ýtskz¬Æ’¼ëÿRÑîÿ{áïÿŽìðÿžéìÿgˆÓÿ† Ñÿ ›Äÿ¦z’ÿú?ÿÿz!ÿÿy-ÿÿs'ÿävþsnZ¯w©Ä–±æÿCÆëÿhÙëÿ{Ûæÿ…ÓÙÿ‚ÝÊÿvé ÿßÒaÿýª.ÿÿŒÿÿ| ÿÿl ÿÿiÿÚ}þuq]«ƒ¸º‚ ÐÝÿ+íÖÿgëËÿ‰ÑÏÿv¬¼ÿk·ÿo¾†ÿ±ÏaÿïÕ>ÿÿÀÿÿªÿÿŒ ÿûŽÿʨþ……t·ÍÃL Ŧüè›ÿéÀÿÈèÖÿºîÇÿ¡Þ½ÿ¡Ò¼ÿ¦Ä©ÿ¢©ÿ¸¨jÿÒ©Qÿÿ¥&ÿîÈÿ¡ªô°°¯Qõöõ 6¤eÏÏbÿªòºÿàòäÿÞ÷ÖÿÉþ½ÿÊõ¾ÿÌê¿ÿÌß»ÿÉ̵ÿº¯•ÿÿÈNÿÆØÿ…’D½èèèÀÕ»G©$ù\ònÿåúßÿêûáÿäÿÖÿèÿÓÿëÿÍÿèÿÄÿèôÅÿëì·ÿéèEÿŒ±íÂÁ¾A›ÆŒvÍúý‚ÿàþÛÿñþëÿôþëÿ÷þëÿøÿçÿöÿÚÿìû‹ÿ•Áï´¹bÊݸJZÐ0ÓLìýùdÿ´ýˆÿÄýŒÿ¾÷oÿžÞ%ú’»?ÂÏÑÄ;÷÷ô Îá±Q¤Ô~ƒ›Îp—¢Ïr’±Ó‚}Ó×½Dóóó ðàÀ€€Ààð( @ €éééÐÐÐ.²²²L›››cq„„„z}ƒƒƒ{ŒŒŒr›››c´´´JÌÌÌ2âââñññ æææÀÀÀ>“““ntusdt]Â\zRÔ`‚TÞf†Yãh†Wäg{Sá]hPÙUXSÉ\\\¯qqq•••i½½½Aáááóóó òòò ÑÑÑ-–—•mf{d¯\žSáfÎ[öèwý§ö…þ¸ý‘ÿÁþ–ÿÈþ”ÿÍøþÄé€ý®ÓkûŒ¢Zô]dLâQRNÅhhh™aÍÍÍ1ìììííí½½½A{~x–G£CæKéJýrþmÿ¡ÿ“ÿÆÿ³ÿÙÿÂÿäþËÿêýÏÿïþÍÿîÿÆÿðÿ¸ÿîÿ¦ÿåÿ~ÿÓðSþ›²DùVYGåPPP¶‚‚‚|¾¾¾Aèèèêêê©©¨ZV‡UÂ1Ô=üPÿ\ÿwÿ}ÿ¥ÿ¢ÿÒÿÆÿçþØÿðýãÿõüêÿ÷ûëÿøûëÿúûèÿúüàÿúþÑÿûÿ¸ÿþý“ÿýù]ÿàê4þw†<óIJFÐmmm“±±±Méééóóó °²¯SO‘\Ð+ßHüEþ^ÿoÿ}ÿ ÿ¤ÿËÿÇÿäþÜÿïüçÿêñäÿÛàÝÿÓ×ÛÿÖÚÞÿåææÿôôìÿùùëÿûúÛÿþù¾ÿþö—ÿÿë`ÿëã%þ•Ÿ4öLNFÕnnn’¿¿¿?ìììÍÍÍ3Qˆ[Å)ÒSý6û\ÿYÿuÿ‘ÿžÿ¿ÿÀÿÙþÖÿæüâÿÓàÙÿž¨Æÿx€ÄÿlsÆÿpvÇÿ„‰Êÿµ¹ÕÿéëèÿùøëÿúôÛÿüó¿ÿþë’ÿÿ×LÿòÚþ•›.öIIE΂‚‚|ÍÍÍ1óóó åååz‘•ÆZþ-òdÿCþpÿwÿ“ÿ®ÿ¹ÿÊÿÌÿÜýÛÿÑåÖÿƒÁÿbjÉÿ“™Üÿ²·äÿ®µãÿ|…Òÿ\`Èÿ£ÎÿññëÿùùéÿùôÚÿüîºÿÿÛyÿÿÅ7ÿñÓþx~5óOOO·žžž`áááööö¬µ¯Y" bï!ôuÿ3ütÿYÿ‰ÿ’ÿ¯ÿ¹ÿÅÿÌþÒÿÎñÕÿŽ¡ÁÿcmÊÿ¼ÇãÿõùùÿýÿüÿóöøÿŸ§ÜÿLMÉÿUVÈÿ½¿Øÿ÷ôèÿúõáÿúïÏÿþâ¤ÿÿÉaÿÿ·#ÿæÔþNP=åiii˜¾¾¾@ñññ ßÞÞ!UzµÚþ#üÿBþ‹ÿoÿ¦ÿ›þ¾ÿ¹ýËÿÇýÒÿµÙËÿaqÀÿž­Ùÿð÷õÿûþûÿóøøÿ§¯àÿ\`Íÿ‰Ž×ÿ’×ÿ‡ˆÍÿïëÞÿüõÝÿúðÓÿüå·ÿþÎÿÿ¬6ÿÿµÿ ŸøOOJÄ–––hââ⯷³W"«–ì÷§ÿ*ÿ“ÿRþ¥ÿ}ý¸ÿŸüÈÿ³ýÏÿÀüÓÿ¢ÆÇÿ\iÆÿÑßêÿõþ÷ÿíöôÿ­·áÿW\ÊÿŽ”ØÿâçðÿÁËâÿopÉÿáÛÓÿþñÐÿýìËÿüæºÿþÔ–ÿÿ®MÿÿÿèÂþZX:âqqqÌÌÌ2ôôô r™–œÍÂþû¶ÿ/ÿªÿ^ü»ÿ…úÈÿ›ûÐÿ®üÕÿ¹ü×ÿœÅÉÿ_mÇÿßëðÿëøòÿ©·ÜÿPYÆÿ‰’Ôÿåëðÿüþ÷ÿÞàìÿqpÈÿßÕÈÿþê¼ÿÿã·ÿÿß°ÿÿÏ•ÿÿ­Zÿÿÿû®ÿ%ôYYY¯µµµIêêê:ÓÚÞÿúÎÿ4ýÅÿdùÑÿ†øÙÿ–úÙÿ¥ûÙÿ±üÚÿ¥×Óÿ\nÆÿ¶Æâÿš­×ÿL\Âÿƒ’Ïÿèòïÿûþõÿøúòÿ¯³×ÿ€y¾ÿíÒ«ÿÿÕ•ÿÿÏÿÿË–ÿÿÀ„ÿÿ Vÿÿ†ÿý–ÿ¹˜ûONHÈaÞÞÞ$)‘¦âÔèÿöèÿ;øáÿgõæÿ~öäÿøáÿ˜úáÿ£úàÿ«îÜÿs–ËÿRdÈÿGYÂÿ}“ÍÿÙëçÿ÷þðÿùûîÿÓÖÛÿxt¾ÿ´”Ÿÿú¶pÿÿ©TÿÿŸLÿÿ£]ÿÿŸ]ÿÿŽEÿÿ{ÿü„ÿÊ‘ýYU:ØqÔÔÔ4$µé½èÿÛòÿ?ãðÿfæðÿxîðÿƒòîÿŽõíÿ–÷ëÿ£øéÿÛàÿUpÊÿG]ÅÿžºÖÿÌäßÿÙãàÿÄÃÔÿ„|¸ÿqŸÿî¦iÿþ™?ÿÿ‹,ÿÿ(ÿÿ„1ÿÿ‡@ÿÿƒ;ÿÿsÿúuÿÓ‰þb[3à„„„{ÍÍÍ@"ƒÂí¢åÿµíÿAºíÿeÂíÿuÎîÿ|Öñÿ‡ÞóÿŽåôÿ˜èôÿ¢ëôÿ—ÍèÿhˆÖÿUlÎÿXvÂÿqn³ÿrY§ÿžmÿçcÿþ…5ÿÿv ÿÿpÿÿlÿÿkÿÿp'ÿÿs-ÿÿeÿôdÿÑuÿeV0ä}ËËËD ÁîŸãÿ¯êÿ9´ìÿY»ëÿiÈíÿsÐïÿyØñÿ…ÙîÿŠÖæÿéòÿ”ìîÿ“êæÿ„ÞÕÿsͪÿÈÁÿç¨bÿøžFÿþŽ+ÿÿ~ÿÿvÿÿq ÿÿj ÿÿe ÿÿdÿÿgÿÿa ÿíiÿÉtÿ`S0ã„„„zÑÑÑ<‰³ì®ßÿÇêÿ-ÑîÿMÙéÿ^ãéÿgêæÿtîåÿ{ÎÔÿ~ÃÈÿ|ÉÂÿi®¢ÿxî³ÿkýÿuýrÿÐüaÿûå?ÿÿÇ*ÿÿ³ÿÿ¤ÿÿ˜ ÿÿ ÿÿ† ÿÿx ÿÿq ÿÿmÿÿnÿé…ÿÈ‘þc]1ÞŽŽŽpÚÚÚ.!žç ¾Ûÿ Úçÿ!íçÿBêÞÿWêÔÿlíÓÿƒðÕÿx¸Ëÿz´ÅÿQ‡›ÿC|}ÿuÓžÿX²xÿvÎzÿ´ìmÿïúEÿþå-ÿÿÍ!ÿÿ½ÿÿ³ÿÿªÿÿÿÿŒ ÿÿ ÿÿ{ÿü…ÿä¡ÿ¾¡þbb8Ôaççç*‰Û ÆÕÿ âÝÿïÒÿ3ìÁÿVé¿ÿ„êÇÿ çÑÿŠ´Íÿ€¬ÇÿŽÊÊÿt·²ÿاÿU—„ÿšà¢ÿ^bÿÂÖrÿÑÐ^ÿíÓNÿÿÌ$ÿÿÂÿÿ¹ÿÿ©ÿÿ˜ÿÿ ÿþŽÿõ«ÿÛ¼ÿ­¡ýccIÀ´´´JPŽx¹¿µþ àÅÿê°ÿ)ì¢ÿqê³ÿ¯æÆÿÀçÐÿ½ÝÖÿµäÍÿ¬ëÇÿŸÞÁÿиÿ”иÿ”ʰÿo’‘ÿ·Ð ÿy„dÿ±­lÿÍ·_ÿÉ«Sÿë½Iÿÿº0ÿÿ¤ ÿÿ˜ÿýªÿìÓÿÏÐÿŽ—õqplšÑÑÑ-™°¡p v÷بÿ àÿ&é‹ÿë³ÿÈéÒÿÐíÛÿÒïÙÿÍóÌÿ»ö½ÿ±öºÿ¥ÓÁÿ¯ÜÆÿ«ÓÂÿºÞ¼ÿ¶Òµÿ„–—ÿÛà•ÿ–”yÿ³¨|ÿ¬™mÿ´”_ÿÿ´:ÿÿ¤%ÿúÄÿÔàÿµÈÿrz(à––•kêêêÜàÜ(6‹TÏ¿{þÎpÿàpÿŽñ«ÿÓï×ÿÛðäÿÜòâÿÝôÚÿÔùÊÿÀÿ·ÿÃûºÿÅõ¾ÿÀãÆÿÉéÃÿºÐÄÿ¯ÃºÿÛê²ÿ¾Ã¯ÿÍɨÿ—ˆÿ¦•~ÿÿÅXÿÿ¶4ÿíÜÿºØÿ•²üqtZ«ÃÃÃ;“±u•4ú ÁWÿÎOÿqõ‘ÿÖôÓÿãóäÿåôæÿæöáÿàúÔÿÒÿÅÿÎÿ¾ÿÐÿºÿÕÿ¹ÿÚÿ¶ÿÕñÂÿÕð¿ÿÎàÀÿ½Æ¾ÿÜÞÀÿ¿½µÿëØ˜ÿÿ×lÿÿÏ?ÿÑáÿ¢Éÿsˆä™™–jçççéìèM–F¿Ÿ+þ ¾0ÿ;ï\ÿ¹ü»ÿç÷àÿï÷æÿîøäÿæüÜÿÞÿÑÿßÿÎÿáÿÌÿåÿÊÿæÿÆÿåÿÀÿâÿºÿæÿºÿåôÁÿ×ßÄÿÅɽÿôì¦ÿÿè‚ÿòå)ÿ¯Úÿ€«û€~p’ÔÔÔ*ÌÓÂB#ê ¶þÞ(ÿiýyÿ×þÒÿèüâÿìüäÿêýáÿéÿÝÿéÿÜÿëÿÛÿîÿÚÿðÿÙÿðÿÖÿíÿÐÿìÿËÿðÿÈÿôþÈÿ÷üÄÿýþ¶ÿøðcÿ»ãÿ‡ºûy‡C¿ÀÀÀ?óóó ¤¼’s(¥ëÄ þõ*ÿ”ÿ™ÿØþÕÿéþäÿíÿèÿðþèÿðþèÿñþçÿòÿçÿöþæÿöþåÿ÷ÿãÿöÿáÿöÿÝÿöÿÚÿøÿÑÿúÿªÿÊëÿ…¿ü€•4̯®©Vîîî©Áu:§ìÓþ#ø!ÿwÿwÿÁÿ¾ÿèÿâÿòþìÿôþïÿöþïÿ÷ÿðÿùþðÿùþðÿúÿîÿùÿìÿøÿäÿõÿÍÿóþŠÿÊó%ÿ€Âý…˜9ƶµ¬RìììÒÔÀFoµ>Ä0Èú&ëþ7ûÿkÿXÿ¯ÿŸÿÑÿÄÿâÿÖÿëÿÞÿîÿßÿîÿÛÿêÿÐÿæÿ²ÿÑÿfÿ®ðÿŒÙþ{¯ ñ– l—ÌÌÊ5óóó ëîåªÉˆ€iÃ1ÔJÒøEãþUñÿh÷ ÿzû2ÿŠü;ÿ—ü=ÿù7ÿšô'ÿìÿ~Ñþ}¹î¬H»¶¸¥_ãããäæÚ,¸Î“wÃ?ÁjÉ!ÞfÈçjÎìnÒîvÓíwÎéxÇã…¿'× ­c¤¾Ã§\ÜÜÜ%õõõ ööö çççØØØ.ÎÎÎ<ÈÈÈDÊÊÊ@ÒÒÒ4ÝÝÝ$êêêóóó ÿÀÿÿ?üøðààÀ€€€€€€ÀÀàðøüþÿ€ÿÿàÿ(0` €%ôôô éééÚÚÚ$ÈÈÈ6¸¸¸F¬¬¬S¢¢¢\šššd–––i•••i•••i———gœœœa¥¥¥Y±±±MÁÁÁ=ÏÏÏ/ÝÝÝ!èèèñññ öööòòò ãããÍÍÍ1³³³Kšššd€€€ppp”fff¡```«]]]±[[[µYYY·YYY¶YYY³[[[¬```¤kkk–}}}n¦¦¦X¾¾¾AÓÓÓ+äääðððõõõäääÊÊÊ4ªªªT‰‰‰wnnn›fidºauYÒ^‚Pß\Lça–Pìh›VïnYñoWñs™Vðp‹RífxOè[dOàPROÕPPPÃVVV³fff›~~~€›››c¸¸¸FÕÕÕ)èèèòòò ïïï×××'°°°Oˆˆˆxjmh§_~WÏW¡Næd¾Yõ×lüérþžõyþ©ü€þ±þ†ÿ¶þˆÿºþ†þÂûƒÿÃò~þºãwý©Ïnû—¸^ø‚•Yò\eOçJJJÕMMMÀ___£|||‚£££[ÅÅÅ:ÞÞÞ ïïïçççÈÈÈ6amokŸYQØHºCïTßLûnöbþ‰þyþ¨ÿ”ÿ¾ÿ¤ÿËÿ®ÿÕþµþÝÿ»ÿàÿ¼ÿäþºþåÿ¶ÿåÿ¯ÿåþ¤þâÿ–ÿÛý‚ÿÉðhþ³ÖQüªM÷cjPíGGFÙKKK¾hhh–pµµµIÕÕÕ)ëëëöööâââ¼¼¼BŠŠŠucj]ÅC±<ò8ì=ýTúUþvÿrÿ”ÿ‹ÿ²þ¤þÈÿ·ÿ×ÿÃÿàÿÊÿèþÐþêýÓÿîýÕÿðýÒþóÿÐÿñÿËÿòþÁþôÿ·ÿòÿ¬ÿîþ‘þéþuÿÞøLþÃä;ý EøRTJêBBBÍXXX¨~~~€©©©UÎÎÎ0êêêõõõÛÛÛ#««ªUq{o›D‡Bã+Ú7ý?þLþbþlþxþ|þ“þ’þ¸þ°þÓþÅþáþÒþëþÚþîüáþòüçþõüèþöûêþùüèþùüçþùüäþøüÝþûþÔþøþÉþùþ·þûþ¡þþý‚þþûZþðû5þÅÝ8ýisGóEF?ÞKKK¼mmm’›››cÆÆÆ8êêêööößß߬®¬Uj€lª7Ÿ>í'å=þ?ýUþ]ÿkÿrÿ|ÿ‘þ•þ´ÿ±ÿÒÿÉÿâþ×þíþáÿóýçÿõûëÿôøìþôõëÿòõìÿòôíþööîÿùøîÿùúíþûûèÿüûÞÿüþÏþþý½ÿþû¤þÿöˆÿÿñaÿþî6þÔê!þ†“:÷PSCåIIIÃjjj•œœœbÐÐÐ.ëëëêêê¶·¶Jj‚nª5¡Lñ&äJþ6üUþOþgþlþ|þŒþ•þ¯þ±þËþÇþÝþ×þçþàþðýèþìöæþâèàþÓØØþÈÎÔþÅËÔþÈÌÖþÑÕÛþàâäþïïêþ÷÷ïþùøìþúúãþüøÔþý÷¿þþö¦þþò‰þþæ^þüá.þÞãþ–¡5øPTBæIIIÂoooªªªTÕÕÕ)îîîòòò ÌÌÌ2v†tš/”Gð(ÚRþ/ùVÿAÿaÿ]þvþƒÿ’ÿ¦ÿ­ÿÃþÃþÕÿÒÿáþÝÿêýäþãñáÿËÕÓÿ¥°Æÿ‡Âþv~ÂÿqxÄÿtzÅþ€…Çÿ™žÌÿ¾ÂÖþâäåÿõöíÿùøìþúõâÿúóÕþüóÁÿþð¥ÿþè‚þÿÚPÿýØ&ÿåÞþ”ž0øMP?äKKK»~~~€µµµIÞÞÞ óóó ÜÜÜ#›—q.‡Dê!ÐTþ-ï_þ7ücÿKÿoÿpþŠþšÿ§ÿ¸ÿ½ÿËþÊþÚÿ×ÿâýßÿàòÞþ¼ÊÌÿ‰”ÁÿenÃÿ_eÉþgmÎÿmuÏÿntÏþejÍÿ_cÈÿqvÈþ£¨ÎÿÜßáÿ÷÷íþùøëÿù÷áþúôÔÿüñ¾ÿþëŸþÿÞoÿÿÌ@ÿýÐþçÞþ‰3öDE>ÝXXX¨pÄÄÄ:èèèììì···KFyYÑÊbþ%ífþ1öfþ@ýoþ^þƒþ‰þ¡þ¬þ¸þÀþÇþÏþÐþÛýÛþÝõÝþÂÓÍþ€¿þZaÅþiqÍþ¡¨ßþÈÌìþÑÖîþÏÔíþµ¿ãþŒÐþUZÈþ]aÇþŸ¤Íþèêçþø÷íþùùèþùôàþùñÑþüí¸þþàŒþþÏ^þþ¿2þþÊþÛÛþej=óAAAÎhhh–¤¤¤ZÖÖÖ(ððð öööÏÏÏ1i‡n¥§f÷ïuþ)øpÿ3üpþLÿÿrÿ˜ÿšþ´þ¶ÿÃÿÃÿÊÿÐþÔþÕúÙÿÃÞÏÿ‡™¾þX`Æÿx„Ðÿ½Êãÿíóöþûþüÿýÿýÿúýûþâèñÿš¤ÙÿRUÉþCAÇÿ\^Çÿ·ºÔþðîéÿùöéþúöãÿúóÙÿûíÊþþå©ÿÿÖ€ÿþÃOþÿµ&ÿÿËÿÇÎþHI@êJJJ¾~~~€¹¹¹Eäääöööçç瞤Ÿj/ŒiàÕ}þ÷{þ-ý{ÿ>þþ[ÿ’ÿÿ¨ÿ þºþµþÆÿÃþÏÿÌýÔþÊòÓÿ£½Ãÿ`mÀþgrÌÿ¸Æáÿîôôÿûþûþüÿüÿûþûÿèìôþ«²áÿdiÏÿSUËþnqÑÿ]^Íÿƒ…ËþÞÝÞÿúöæþúõâÿúõÛÿùïÐþüçºÿÿÚ”ÿþÇeþÿ±5ÿÿ°ÿþßþˆ,øBBAØ___¡aÔÔÔ+ñññ ÍÍÍ4^Šw¬±‡øï”þ ü‚þ2þ‡þKþ“þkþ¥þ‰þ·þ¢ýÃþ¶üÌþ¿þÏþÇüÓþ½åÍþ…ž¿þR_Ãþ¢Ôþâìïþøýùþúþúþúþúþëðõþª²àþciÎþVYËþŒ’×þ½ÃäþƒŠÓþgiÉþÅÄÕþøòÞþüõÜþûóÙþùïÑþûéÀþþÛ¢þþË{þþ¯Dþþ¡þþ³ þÔÎ ý\[8ëLLL¾¾¾¾@èèèííí¤«¥d3”„ÜÛ­þùœÿ#þþ:ÿ—ÿWþ¥þuý³ÿý¾ÿ¦üÊþ³ýÎÿºÿÑÿÃûÓþ³ÛÊÿrˆÁÿYdÇþ»Ìáÿðúõÿ÷ÿøÿ÷ýøþçïóÿ°ºáÿ`fÍþTXÊÿŒ’×ÿÓØëþèíñÿ¤°×ÿ_aÈþª©Îÿòë×þþóÔÿþðÑÿüìÌþüéÀÿýߪÿþÐþÿ³Vÿÿ'ÿþ£þõÈþ™—"÷CCCÕfff›¦¦¦XÝÝÝ!ÜÜÝ%r•Ž™«ŸøíÄÿý¥ÿ(þœþ@ÿ¦ÿ^ý³þ{ü¾ÿûÆÿ¢ûÍþ¯ýÒÿ·ýÔÿ½ûÕþ­ØÊÿkÂÿbnÊþÔßìÿôþöÿôþöÿäïðþ¬¹ÞÿajÌÿNSÇþŠ’ÕÿÓÙêÿõùöþøûöÿÈÎäÿdcÉþŸÊÿïæÎþþðÉÿÿëÅÿþçÂþþæºÿþݪÿþÏ‘þÿ¶dÿÿš.ÿþ”þü´ÿȱüUU;çUUU³‘‘‘mÐÐÐ.ÄÇÅAI‰‡Ç ÃÃþòÍþý³þ*þ­þDþ³þiúÃþ‚ùÊþ‘ûÏþûÒþ¬üÕþ²ü×þºûØþ«ÚÍþk„ÂþanÊþÕáîþòþõþãðîþ©¹Ûþ^jÈþFNÃþ†‘ÒþÔÜéþöúõþüþöþûüõþÐÒèþgeÈþ£ ÆþðãÅþþéºþþä³þþà´þþÞ±þþ×£þþËþþ³gþþ˜6þþþý¡þá²þ}w)òJJJÄ€ÂÂÂ<¨·´]"„‰íÎÙÿôÖÿüÈÿ,þÁþIûÂÿlùÑþƒøÙÿùÙÿ™ûØþ¤ûØÿ­üØÿ´ûÙþ®åÔÿw–ÇÿWdÉþºÈäÿ×çëÿŸ²ØÿVfÄþFTÁÿ‚’ÏÿÙäêþöýôÿüÿõÿýþõþíðíÿ ¦ÒÿgbÂþ»¯¼ÿ÷ݯþÿÝ¡ÿÿטÿþÕ›þÿÑŸÿÿÌ—ÿþÁ„þÿ©cÿÿ‘:ÿþ…þþ–ÿóªÿœøFFBÔmmm”±±±Móóó ”¯°pùÎãÿòæÿûÙÿ/üÑþRøØÿmöÝþ€÷ÝÿøÝÿ“ùÝþžúÝÿ¤ûÝÿ­ûÝþ²ñÜÿ¶ÌÿReÆþs‡ÏÿŒ ÓÿVhÅÿFXÀþ~’ÌÿÌÜãÿóýñþúÿóÿüþòÿ÷øîþÐÓßÿzyÅÿxl·þÙº¤ÿüÊ‹þÿÁxÿÿºpÿþ¸pþÿ»}ÿÿ·|ÿþ®nþÿ›TÿÿŠ8ÿþ~þþ‰ÿôšÿ­‹ûRO6àaaa¢§§§Wïï«ƒ­üÊåÿëïÿ÷ëÿ2ùäþUõèÿmôéþzöçÿ…öåÿŒ÷âþ•ùãÿ›úáÿ£úáþ­øàÿ¢ÛÖÿh‰ÉþDUÅÿBSÃÿATÁÿxËþÃÙßÿêúìÿõþðþúþðÿöøêÿ×ÛÛþ—™Åÿg]¶ÿ©‹ þð¶}ÿþ¯^þÿ¤Mÿÿ›Cÿþ–Bþÿ›OÿÿYÿþ—UþÿŽHÿÿ‚3ÿþvþþÿñŒÿ¾ ýa[,èYYY¬žžž`ëëë}œ¨“޹ý»æþÖñþæóþ6êðþUéïþkìðþvñïþôïþ†õêþŽöëþ•÷êþ™øèþ£ùçþªñäþ‘Å×þTmÇþ5EÃþNeÄþ›¸ÔþÐêãþßóåþçóçþéíäþÎÏ×þ—•Àþoe²þp¢þà¦|þû¨Yþþ›?þþ‘2þþ‰,þþ„+þþ‡2þþ‹@þþŠEþþ†@þþ~1þþqþýtþî‚þÈþlc'íUUU²———gçççx—¨ŸŠÆþ¬åÿ¿íÿÈðÿ8ÏðþVÏîÿj×îþuáðÿ~ãñÿ€ëòþ‡ïóÿŽñóÿ’õòþšøñÿ¢øñÿ¥íìþ†¸ÛÿWtÍÿI`Èÿh‚Íþ…¤Íÿ’³Éÿ¡±Êþš™Ãÿuºÿl[­þoœÿÒ”|ÿùžSþþ’;ÿþ‡*þÿ€"ÿÿ{ÿþwþÿx#ÿÿy,ÿþ9þÿ9ÿÿy-ÿþjþüjÿêwÿ̆þrc$ðSSS¶•••iåååq¥ª~Íþ˜ãÿ§éÿ²íÿ;±íþU·íÿi¾ìþsÆíÿxÊðÿ|Óñþ…ÖôÿŠÚóÿßôþ•àôÿ›ãõÿ¢æõþ£Ýòÿ¾æÿnÚÿTlÑþMbÏÿIg¼ÿfd±þiN¦ÿzWŸÿ¦qŒþÛˆoÿ÷ŒOÿþ€2þÿv#ÿþnþÿjÿÿhÿþfþÿgÿÿfÿþl$þÿo+ÿÿi"ÿþ_þø^ÿähÿÈsþqZ#ñRRR·•••iååån‹¢¯~Ìþ™âþ¦èþ¬êþ6¬êþM´ìþa¶êþjÀíþrÅíþvÌðþ{ÑñþØóþŠÙñþÛïþ‘àóþ‘äóþ—æóþ›çñþ–áìþ‹Õåþ€ÁÛþi¹«þµµ‘þΕxþâ—hþò–Sþü‘>þþ„,þþyþþsþþoþþm þþh þþe þþc þþ`þþcþþfþþcþþ] þóaþÞlþÁqþkU"ñTTTµ–––hçççp¢ª †Åþ¢àÿ³çÿ½ìÿ,ÀíþDÆìÿVÍêþaÖìÿiÜíÿkäíþqåîÿ}ìïÿ|ÌÚþu¸Çÿ‹êåÿŠêáþ…ãÔÿŠó×ÿ„ùÌÿxù´þmù’ÿ}÷~ÿÏötþøäXÿþËEÿþº5þÿ¬(ÿÿŸÿþ”þÿÿþ‡ þÿ‚ ÿÿ} ÿþv þÿo ÿÿj ÿþjþÿjÿÿhÿþgþðtÿÞ€ÿÁ…þl]"ïWWW°œœœbêêêu–¢¡ Š·þ¬Üÿ½äÿÐìÿ%Öðþ=ÙìÿPßèþ[æèÿcêçÿfíâþrïâÿ‚îãÿsºÆþw¶Àÿ’áÖÿh§¥þX‘‹ÿk¿¡ÿuö©ÿkþþhÿxÿ}ÿnÿ½þdþîûKÿþæ7ÿþÐ*þÿÃ!ÿÿµÿþ¬þÿ¢ÿþœ þÿ— ÿÿ‘ ÿþˆ þÿ} ÿÿw ÿþr þÿoÿÿl ÿþrþí‡ÿÚÿÁ˜þmf#ì]]]©£££Zîîî|¡• ަý ·Ùþ ÊãþÜêþëíþ5éãþIèàþUéÙþ_ìØþlíÔþyïÕþ‡â×þr®Çþ»Éþp«·þEyŠþ:ptþRš‚þyâ þ`Å€þ`Ãsþ|Ûvþ´úqþÞþUþøø8þþå)þþÓ!þþÆþþ»þþ´þþ®þþ©þþ¢þþ˜ þþŒ þþƒ þþ} þþx þþvþûƒþé›þמþ¸ þhh&çeee ¬¬¬Róóó ˆ¦¥‚ Ž–û ¾Õÿ Õàÿ ååÿñäþ*ïÖÿ?ëÐþPéÉÿdìÊÿyìÌþŠîÎÿ’ÚÔÿu§Éþt§Åÿ^‘µÿf ³þ[— ÿr¾¤ÿqÅ›ÿ?lþV˜tÿ™ä™ÿv¡gþ»ÙsÿðþWÿüõDþÿâ;ÿÿÔ*ÿþÇþÿÂÿþºþÿµÿÿ­ÿþ¢þÿ”ÿÿŒ ÿþ… þÿƒÿÿ‰ÿöþå´ÿÒ­ÿ«Ÿýbd-Þqqq‘ºººD÷÷÷›´®j‰õÀÍÿ Ùàÿ ã×ÿîÑþ"ï¾ÿ5ìºþNêºÿvêÁÿéÆþ¡éÌÿ£ÎÕÿ±ÌþбÉÿŒ¾Éÿ¨éÔþmª²ÿ‘éµÿƒÜ©ÿ]Ÿ’þ}Æ—ÿ¦çªÿPu`þucÿÆØ{ÿ¾Äiþ¹gÿð×SÿþÒ*þÿÆÿþÃþÿ¼ÿÿ´ÿþ¨þÿœÿÿ”ÿþ þÿÿýžÿð¹þÝÁÿιÿš” û^];Ѓƒƒ~ÉÉÉ5¸Æ¾K$fä¹³þ ÝÒþàÅþé»þì¨þ.ì¥þ\ë¯þ”ç¿þ­åÆþ¸èËþ¼Þ×þ±ÏÖþ®ÓÒþ³òÊþ©æÊþ‘Ê¿þ¢ò¼þÓ·þ•Õºþ¢ç´þŽÁ¬þ`…‡þ‚ž‰þÀÕ þ…jþilDþǽpþðÕ`þéÊ_þîÇTþ÷ÅAþý½/þþ³!þþ¤þþ›þþ–þþŸþø¼þéÑþÖÔþÂÄþ€‡ô^]T¶œœœcÛÛÛ#×Û×-R‡l¹ †û Ö½ÿÝ´ÿ æ¥þé—ÿ0ë—þrê¬ÿ¬çÃÿÂæÎþËëÔÿÎîÖÿÍñÖþÆôÌÿºù½ÿ«ãÃþªæÂÿ¦âÂÿ‰¸¸ÿ‘Á»þ£Õ¿ÿ–À¸ÿš¾µþ³Ô°ÿµÎ§ÿv‡þ~‡oÿíê–ÿ’ŒkþofIÿœŒ]þƬkÿÑ­[ÿó¹Jþÿ¯+ÿÿ¡%ÿþ›þÿ¬ÿôÔÿÝÞþÈÔÿ¨¸þpz#ånnn˜¶¶¶Hëëëïïï‡¤Žƒˆ[ðÚþØ þÛþã„þ/êŠþ€ì«þ¼êÉþÍê×þÑíÝþÓîÝþÓïÙþÒòÐþË÷Äþ»øºþ³ûµþ²î½þªÕÄþ²ÞÈþºåÊþ©ÌÁþ·ØÁþÎòºþªÄ¶þ• þ¬¹ þòö”þ©©‰þ˜”{þÏÃŽþ¶¦zþziTþºœmþþ»Fþþ¬2þþ¥#þþ¾ þæãþÇÜþºÌþŽ¢úeh=ÌŒŒŒtÏÏÏ/ôôô ÂËÁF=„RÊ£hüÏŒÿÏxþ Öoÿ(çxþ~ñ¤ÿÂïÉÿÕíÜþÚðäÿÚñãÿÛòáþÜóÛÿÛõÓÿÌûÃþ¾ÿ¶ÿ½þµÿÂ÷¾ÿÂòÀþ¿èÅÿ¸ÖÈÿ»ØÄþÎíÃÿ°ÄÂÿŸ³·þÑâ·ÿßê©ÿÇ˯þÁÁ¨ÿÐʤþŸ—‡ÿtihÿ­›þÿÆ\ÿÿ¸Bÿþ±,þúÓ ÿÒäÿº×þ¥Áþ|ílkd£®®®Qäääìëëu v€2ò¸fþÈgþ ÉZÿßcþnô•ÿ½ôÄÿÚñÛþßñåÿàòæÿáóåþâôàÿãöÚÿØûÍþÍÿÁÿÆÿ¹ÿÉÿ¸ÿËþ¸þÍüºÿÐ÷¿ÿÔø¼þÕôÁÿ¾ÒËÿ»ÎÇþÜðÁÿ½Ë»ÿ­¶´þÆÊµÿÕÓ´þ¹¶¬ÿª¢›ÿáÊþÿÑgÿÿÆTÿþ¾2þêÜÿ¿àÿ­Ïþˆ¬üms4ÒŒŒŒtÍÍÍ1óóó ÌÎÇ>>;ɘ7ü ÁWþ ½IþÐKþRó{þ¯ø¸þÞóØþãóãþæôæþæõåþèöãþæøÝþßûÒþÖþÉþÐþÂþÐþ¿þÑþ½þÓþºþ×þ¹þØþ³þÝý¹þÛù¾þÛøºþáý¸þÊÙÆþ¸Ã¿þáæÉþÖÙÀþµ¶¶þÕаþùâþþÛsþþÓbþþ×2þÙåþ°×þ•¿þ{—ñpoiœ²²²Læææõõõ ˜²y…êž2þ µ8ÿÅ3þ.ìTÿ‹ýœÿÏúËþèöáÿîõæÿïöçþï÷æÿêùáÿäüÙþÝÿÑÿÝÿÍÿÝÿÌÿßþÊþáÿÉÿãÿÇÿãþÃþâÿ¿ÿâÿ»ÿàþ¶þâÿ¶ÿèÿ¼ÿãòÄþÚãÅÿÄÌÃþ­²»ÿËʵÿùí›þÿæ„ÿÿßcÿðæþÀçÿœÈÿ~­ülgGÀ¡¡¡]ÚÚÚ$öööæååi¢X¬ ‰ ú¨#ÿ À'þà3ÿTûmÿ®þ²þÝü×ÿèúàÿîúåþîúäÿìûâÿçüÝþáÿ×ÿåÿ×ÿäÿÕÿæþÔþéÿÓÿëÿÒÿîþÑþíÿÐÿëÿËÿçþÆþæÿÂÿèÿ¿ÿìþ½þòÿÀÿòúÆþîòÈÿùù¹ÿþùªþÿðŽÿúéKÿÕéþ£Óÿƒ·þoƒ#àqËËË4ðððÏÐÄC@-× œ ü¼þ Óþò2þvþ„þÎþËþàýÜþèüâþëüäþìýäþéýáþêþßþëþßþëþÞþìþÝþîþÝþïþÜþñþÜþñþÚþòþØþïþÕþìþÑþîþÏþñþÌþóþËþõþÊþøþÇþúþ¿þýþ¶þûóuþÙìþ£Ùþ…¼þw—ê€k–¿¿¿?éééööö «»›kA˜'Ý«üÄ ÿ åÿ0üAþ˜ÿžÿÒÿÏÿãþßþéþåÿìÿçÿîþæþïÿçÿðþèÿðÿæÿðþæþñÿåÿòÿåÿõþåþõÿäÿöÿãÿ÷þáþöÿàÿöÿÝÿõþÛþöÿÚÿõþ×þ÷ÿÒÿúÿÍÿüþ°þëö-ÿ¦Þÿ‚¿þx\¥°°­Qäääîï쨾”rFŸ$ߢû Éþòþ=ÿEÿŒÿ‘ÿÌþÉþäÿàÿìÿçÿîþêþòþìÿóýìÿóýìÿóýìþôþìÿöÿìÿøþìþøýëÿøþëÿùþêþùÿêÿ÷ÿçÿöþäþøÿãÿùþÝþúÿÖÿúÿ·ÿôþOþ«âÿÀþy¢Z¦²±¬RÞÞÞ ïðì´Ã–n[ª(Ù&¯úØþð þ-þ.þiþiþ£þ¡þÒþÌþèþâþðþêþóþîþôþðþöþðþ÷þñþøþòþøþòþùþòþùþñþùþïþûþîþùþìþùþåþ÷þÛþñþºþôþ{þÛý2þ¨äþy¾þ~¥ê‘b¸¸³Kßßßõõõ ÔÍÂF„·S±D­ì)Ãüëþ!ùþ/ýÿWÿHÿ•þˆþÈÿ»ÿÞÿÓÿèÿÞÿíþäþñÿèÿóÿêÿõþêþõÿêÿõÿçÿôþäþòÿÜÿðÿÍÿãþ¡þÔýSÿ¼øþ ðÿ€Îþs²øƒŸ1П˜vÊÊÊ4êêêåãâ$±Æ„‚l¾5ÐB½ õ9Ôü7éþ7öÿ@úþ_þ9ÿ~þZÿšÿwÿ®þŒþºÿ˜ÿÄÿŸÿÈþ þÍÿžÿÌÿ—ÿÈþ‡þÃþpÿ½ýHÿ¨óþçÿ{Íþt¹ù|«!✞R­µ´³QÚÚÚ$ñññ ôôô ÐÒÂJšÊm™r½8ÏVÇ òGÓüHÞþPéþVîþ`õ þjøþsùþ~û þ‡û þŽúþöþðþ‡éþ€ãþuËþv¼ø€­%ߪR²ª­–rÌËË5éééííìÒÙ¾L«ÊŠŽ¹DÃmÂëXÈùZÎü\ÒþbÚþfÞÿlâÿqâþtÞþq×þoÎýoÅû{» òŽ£5Μ²i ¶¸šjËËË:åååôôô ñðïåâÐ2ÊÛ®R°Ì—lž¼…ƒ®w–‰¨o£…¤i«ƒ¢f¯‡¥iªŽªp •°w“Ÿ¸ƒ¬Ãr¾ËžaÐɺFÜÛÚ)ëëëööö÷÷÷óóó íííéééæææääääääæææêêêîîîóóó ÿþÿÿøÿÿàÿÿÀÿÿ€?ÿ?üüøððàÀÀÀ€€€€€€€ÀÀààðøøü?þÿÿÿÀÿÿàÿÿøÿÿþ?ÿÿÿÀÿÿnsis-3.11/Contrib/Graphics/Icons/modern-uninstall-full.ico000077500000000000000000000560061477201124000235640ustar00rootroot00000000000000(†h® è ¨þ 00¨¦ hN!  ¨¶%00 ¨%^6( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿüðÀ€€€€€Ààÿ( @,|B"uI.rK6{J>Cz@IyC?‚J;†VŒ4b‰-z¹WCŠPMŽJC“H[šPW˜mV’na’ch•oaŸsg—LY¨O]­Q] Sa¦Up¤Ts¯W{­An¸Si´Xh°Tt·_{·ak­vi§yn©ju¡lw§}z¤w|¬l°?nÕcqÂe|ÎysÈilÒgÒruÑtxÔzyÒ”m¢Žz¦‰s³š}È*€ƒ'—,¢1”º[†¶m…¥ašªa‚½S¡­[¦¸w°½XÂP•ÎnÎq‚Áp‚ǃ΅Îk˜Æ|‚Ó}†Õb˜Ðr”ÑÐ|µÅf¢Õi¢Ñu«Ùo³Û|ñ€„­®‡“¼““¾•›¹¢²¬œ±©Ÿ·¸™¿¤¡±§¦¿° ³ˆ›ÅŠ’È”Ç•ŸÄ˜œÃƒŠÒ…‹ÕˆÔ†”ÔŽ•Õ’œÚ¤•Á·Æ¨œÒ•¹Æ®ÞŸ¦Ý™¨Ý§¡É¡¦Ï¦¨Ï©®È«¨Î²®Í¡ºÏ¼³Æ¸´Ç°½È¡§Ý¯¥Þ¡©Þª¹Û¼´Ð²ºÖ´»×€—ꥲ᧴⪸㽾廾鯼ô‰ÀݘÁÑ¿ÁÙžÃåœÊæªÍç´Òë¹ÑêÂÃÈÄÂÈÇÀÌÁÃÛÅÀÜËËãÌËãÍÄèÇÊìÉÍëÎÐãÀÕíÒÓïÒÙïÌÚð××ñÖØóÕÝòØÙñÜÝòÛÜôÎåóÙæõàâòïòø””_(Yvo76]%x™ž™›.$m˜uIiI‰~,[4nyg¬œ/g‡NW5^d‰2§LqM!  =Zu31«¡0RC ” :APOLl-J< a 9@Bp}|b"\8>zŽ‚weF?|;Œ©ªŸ‘“§£¤‹U+` &X*&V)§…F#Sˆ€‡s‡r~k¤E Q’¢¢£§§¤jfDTŠkcƒ„˜þðàÀ€€€€€€€€Ààðþ?( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆwwwwwwwÿˆˆˆ€wwwwwwøˆÿˆˆ€wwwwwø‡wˆÿˆ€wwwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿ( @€ ku8y"s-9n!(|2,yD\EcF%iZ*gH*uK9~S3~`,gd;x J~ ]u%@m%H|:Axz{[BzTY|9ˆ!#€6"€)4…2<ƒH7†P7†A=”%C› iŒmcŸ y•$h‰-I®O¬®ÂÂsppnª¿¨8L¬ËÒØêêÖÊÉrdDm·81O¯ÑãòõõõóóäÖÄfCD·±1-O­ÑäóóôñññóóäÊÄfC7±º-9­ÇãòõÓ¬eceÀØòäÝÄeB7¸55n²ÖãñÑchÝ߯g]ØîßÏšI?7¨koÈÒãÔPÃ÷üü÷hShßßÏΓI0k¿4lqÈÈã¯_òüüùi]Ý]ÏßК•a?¹¨5m°³ááfÃûüùi]ßú˜˜ÞΙ•`Ak->­²ÈâfÄû÷˜]ßûûÆiС™’I0â¿.=O«ÇáÀiòi]ßûûùgš£ F0 «¸&;~„®µÑÑ]]]ÖûûùÏ^¡™’GF/ 6«"wz€ŒÌÍéÁ\hòõòÆ^— ’~JGF2 «%y|ˆ‰ŸŸæçéÅc_g^^•–…~~GGG:. ±%uzˆ‰ŒŸÌÌåèØÑË”…QGF:A33// ±#tx‡Š¶ÍÓØ¿ââÍ”KIA@@32/-, ¸v}ƒ¶Íèãâ⿾¾RPJJEA@20- Ôx€‹éêòñØØÑÑËËÂÁ–•“IHH?0<1${|›ìôø÷÷ôííííô÷÷÷÷÷öàÜÚ§¤ZÑ©!{‘£ðøùùù÷ððííõ÷÷÷÷÷÷öàÚ¦[U *£øðåêµ®=‚:ËãO©>©úöÛ¥V†©'¢øòÅN®QQ–¯Ø0Ë:ú÷äjT0+ðöŘÏÏîÎÅÎÞ_îÝÆÃÆú÷ßbÁ¼?`£ïÝÞòîÙÏßÏòÆòÏßÏÃ÷ä˜I¯?Y¢íôøôöôôô÷÷ú÷÷÷÷óÅH»(Wëðôø÷ø÷ùú÷úúóò˜eL'X‘¢ìíïð÷÷÷òßÃ_®ÑL')XŽœÙÝÆhC†¬PHHH_PeËÿÿÿÿÿðÿÿ€ÿÿÿü?øððàÀÀÀ€€€€€€€€ÀÀààððøü?ÿÿ€ÿÿðÿÿÿÿÿ(0`€ !V!(Y g u uq+{ 1q%/h$6k)'x7?}D VHcG"jH(tP/K9zX0xCx7Exlq*}zFDv_FziL1†=€%*…7!„$5‰)+˜7)‘+8–>7›58¦D)‚J8‡Q9‰E:•X?“d?C?¦T‹*U… n‹2xO²+O¶r­*s½MF‰XEˆJTŠSYˆKI—WG”NT™TX˜jHˆqMgS‰sTˆbK˜iY”sWšUg—diksŽgi—wk™ey{w›GI¦NW¦R[¦MJ°UL²HV¹QZ·yW¤gW¹{[µMg®Tg¦Ww©Lf·Vh¹Ls²Uyµjk§um¥wu¦hu·tz·<8Å+OÉ{Ä5nÒIJÇIUÉTXÉGgÃYcÉVuÈ^kÐdgÈwbÂjrÈuwÉkmÒm~ÐuuÑOxã„]“‡jš‡z›‘}Ÿ‡_µ‡i¤˜l£‰w§–x§b¾~¼¦~±†fÁ‰uÌ–wÍ„”/ГЫ.“²F–SŒ²h¨{„§h™©g‹ºz‚ºdŸ·v²S¤¶q¨¶1‘ÈX‡ÄF™Ë[–É\‰Ðh‡Æx„Èc–Ãu™ÉiƒÔz†ÒdšÒx™ÕV¨Îq®ÑQ‡çu”ð¢ñ‰‡“Ÿ˜–ŸŠ‰¤•Œ¦‹–¬˜–¢…‡·—Š¶Š˜¹–™¸£œ©¥‡³±·§”½¶”¼ª¼¨¢¬¦£µ´«¹¤´¿¸·º†Ä‹”Ç”˜Æ‡ŠÓš‡ÓЕה›Ø¥œÄ¸šÃ¢†Ó¤•زœÜŠ Ç–§Èˆ¸Å•¶Äˆ¦Ú™¥Ù†¸Ø“³ß§§É¸¦É©¸È¸¸È§¨Ø²¦Ü§´×·¹Ö˜£ã¿äœ´á©ò–ªó›°ó¥«á¼§à¨´âµºä¥´ó¶¾òéÉøÈùÔÅ»å’ÃÕ¨ÄÎ¥Å׺ÃÖ–Æã¨Ëæ¹Èç¦Ðé·Óë¾ÇòÆÄÛÇÈçÓÍêÅÖíÓÕëÅÊóÌÛð×ÚñËãòÙåóÞñøâäôìð÷ôõù¸¸®¥££¦¥¦£¤¤§®¸¸´£II]_ªªºº¹|wwxzv´¸®IFF\ª»ÍÍÓÓÎÑÂÂSQt®¶£;A[}¹ÍÓÔÞïïðäÜÜÄý€lRQt¸¸¥D)@\ªÀÍÞäïññóññðäääÄýnRNB§¸£9'A]¹ÀÓãïññóóóóóóññääÒünRN@u¸¸u)'@\ª±ÍÔäñóóïèèèâïðññääÛünhM)z¸£4&)Gz«ÍÜäïóïÐȪ__m—»ÒððäÞÒ¿¼mPM)u©)%5?x«ÀÎãïñïÏŒhhjoohhm»ððäÝÑ¿›mPJ)u¸>%G{¯ÄÎãïïÏ_hoÑðõðÝnefÍðîÞÝʾ–XP(*´u%?x~±ÁÒâäÐ_f›ðûüüüö¾d`hÑëÞÝÊÉ™’XK(=â´&sy~²Îáãâ»fnëûüüüúÊfeof›ÞëÝÊÉ–iKJuG ?ty~²ÁááÐŒfÊúüüüúÕff¿àokÑÞ×Õ•’WJ'<¸´' ?t{~²ÁáãÍkkðüüüûÊff¿ñú¼f¾Ý×Éœ”’XL'&vI 7u{¯°²ááÍknöüüúÛff¿ôûûÛh›×Ìœœ”’ZL8%=â¸>7Ez«¯²ÁáÎkqöüúÑfd¾ñûüûßf¾ÌÉŸœ””’ZT8®®&CDˆ¦«µÁáÎnkäó¿fd¿úûûûú›fËŸœœ””’ZT8&u§--CHˆ‰ª­ÀÎйf›¼fd¾öûûûûähj¢Ÿœž””’ZZU:&?£../††ŠŽŽ³³ÍÏÍkddd¼óûüûúî›e•Ÿœœ”’’ZYVU:4¸u,.‚ƒ†ÇÇÈæÓºf`kÒúúúöäšeiŸŸœ’‡Z‡YVUU:4¶u,.‚…†ŸÇÇÇåæçºffq¿Ê¿›jeiŸ˜‹’‡ZVVVVV6 ¶u.„„……žžŸÇËåéçêÉnhffeeg•™™‹ˆ‡HVHVVVCC6 ´u,‚‚„…ŸÇŸÇÇååææÏÓÀÅ™––‹_VVUUUUUCC:7: ®u,.‚ƒƒÇÇÇÈ·¸ÐâââÏÆ–‹^VLL;L;:::66864 ´u,.‚ƒƒ††ÇÈ·æ¸Ðâ¸âзÈ_ZZTLLKKK::69944 ´£.ƒ††È·ææâèâ¸â¸··­_XXWYTKKKK:K8&' ¶« ††Š·ææèïïâïâÐзϵ}_^Z‡ZYTKKK:844 â´%‚ƒŠÇåèòððïÔÒÎÑ»ÉÅÉÒÊÊÊÕÉ”ggggOJJ#!9Ð@2„…Ÿéò÷÷÷øõòíêêêçêêóóóóóöööõîßÚÚØ¢¡  cªI"2„…“žéì÷÷øøøøõòíêêêêíóöúóúöööúöîßÚØ¢¡ caÀµ'0„…žŸì÷÷ùùùùúøòíííêêíöööööúöúööúôßÙ¡ ccOF 2…‘Ÿì÷÷åæù¨E¨ò¬H¬ˆHÆÍE«ó»‰­«]ÍúöôÙ¡ caŒ´(0…‘žì÷÷ªÆæDè6 ÅC Dª7ó »D7úúöà¡radèI$3“žìùù¾¿_":^ëZXÝZ"[Å"\óT^ÔŒ 6úúúôÙeaŒÐ9$‘“Ö÷øÕ¾mp¿—õ뿾›¼ÝÛO—óðʾp_ÓúööôÕaO¨#1“Ÿí÷×¾¾ëݿ뾛êÞÉÞÞ›¾ö››äݼ¾úöñàpaÍ]+gœŸìÞ×ÞõëÝòÝÛë×ÊàëÊÞöÛÛðÛ›¿úñàp1ª\+a“Ÿéíõöóòõòîòîòõöóóúöñóóôúñä›1_\"a“žéíòõööøõõøõöúúúúúúúúúöà¾g_]$abžŸÖìò÷õööõöøúúúöúúöñôàpeªµL$0b“žÖéìíí÷òõöúöúöôäß¼hTЪP11b‘“žŸŸËÖéõôñäÜÕqhWŒÐªL100bb‘‘‘žÛÕ¾›jOPŒÔ­^O10000aeOOf_»ÐÔÓÔæÔãÿÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿÿüÿÿðÿÿàÿÿ€ÿÿÿþþü?øøððààÀÀÀÀÀÀÀÀÀÀÀÀÀÀààððøøüþ?ÿÿ€ÿÿÀÿÿàÿÿøÿÿüÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿÿÿ(  @ää丸¸F”“šsŠ‹”ƒ‰”ƒ™“q¼¼¼Bçççôôô ºººDrn‡¤mj™ã‘‘½ú¦¨Ïþ¨œÒþ™{Èû}d«æ}n’¨¾¾¾@öööõõõ ¢¡¦_XJƒÕyn©þ«¨ÎÿËËãÿÎÐãÿÌËãÿÍÄèÿ¯¥ÞÿysÈÿaSšÝ¨¥¬^ööö¾¾¾@QA}ÔmV’þ¤•ÁÿÅÀÜÿ¡¦Ïÿ…ÎÿˆÔÿƒÎÿ¿¿äÿ¢§ÜÿcqÂÿ\L“῾ÀAçççjc„ŸK6{þ”m¢ÿ·Æÿ²®ÍÿƒŠÒÿïòøÿÇÊìÿilÒÿ…‹Õÿ¥³áÿr”ÑÿO]­ÿs`‹²ççç¾¾¿@,(sã@IyÿŽz¦ÿ¸™¿ÿ”Çÿ¼½çÿÉÍëÿtxÔÿÜÞòÿ}†Õÿ®Þÿb˜ÐÿTt·ÿO9„ò¼¹¾Gœ™¤e'yù4b‰ÿm…¥ÿ•›¹ÿ§¡ÉÿzyÒÿruÑÿàâòÿÒÙïÿgÒÿi¢ÑÿXÂÿTs¯ÿJ;†þ‘ƒš€“ŽpTŒü,¢ÿ[¦¸ÿ|µÅÿ˜ÁÑÿÐÿ|‚Óÿ’œÚÿe|Îÿk˜Æÿ[†¶ÿW{­ÿUp¤ÿJ>ÿe…•žoT‹ü'—ÿS¡­ÿw°½ÿ•¹Æÿ°½Èÿ¸´Çÿˆ›Åÿ_{·ÿSa¦ÿQ] ÿPW˜ÿPMŽÿI.rÿ{a‚Ÿ ©a?wù*€ƒÿašªÿ¡ºÏÿ¿ÁÙÿ¼´Ðÿ©®Èÿ•ŸÄÿq‚Áÿa‚½ÿSi´ÿLY¨ÿJC“ÿB"uÿ…v˜ŒÇÇÊ71GŽâ1”ºÿ‰ÀÝÿÎåóÿÙæõÿÀÕíÿªÍçÿ¹ÑêÿØØñÿÙÚòÿÖØóÿ¯¼ôÿ|ñÿ   ^†††ysr|–kj|©jk}±mn³no€³qd±te~©zq€—ЉŠu¥¥¥YÄÄÄ:âââöööéééÈÈÈ6šš›dwv}Œd_z¶b]Üsq¢ð‚‚µúŒŽ¿ý•™Çþ–šÈþ“rÅþŒe¾û‚_²òyXšàr^„»yƒŒ Ÿ _ÍÍÍ1ìììààà³³³K‚‚‚|\Wv·XNŽêlf¥þ……¸ÿžŸÊÿ¯°Óÿ¹»Ùÿ½ÀÝÿ¾ÀÞÿ¸¥Ýÿ°™Ûÿ¦ŽÖÿzÎÿ{`ÀþkL¤òlU‚‡‡‡w¹¹¹EäääÙÙÙ%¢¢¢\ljv—OC€Ù]Mšþwp©ÿ”‘¾ÿ¬«ÐÿÀ¿ÝÿÊÉãÿÒÓèÿÖ×êÿרëÿÓÉëÿÍÂéÿÆ»æÿ±¤Ýÿ™ÕÿzqÉÿ^U¹ÿbI–évl€§§§WÝÝÝ!ââ⤤¤Zhdx N7‡èUDýzm¥ÿ•»ÿ­¨ÎÿÁ¾ÝÿÏÎæÿÓÔæÿÌÐàÿÂÈÙÿÀÇØÿÅÄÝÿÐËæÿÐÊëÿüæÿ¯§ßÿ•ÕÿwvÊÿUV¹þXB™ñte„ª¨¨¨Väääìì츸¸Foly”F3€åP;†þs^˜ÿ“´ÿ§œÅÿ¼¶×ÿËÈâÿÏÏâÿ®´Ïÿ€‰ÃÿjqÄÿgnÆÿnrÇÿˆŒËÿµ·ÚÿÊÇéÿ¼ºåÿ¨¨ÝÿŽ“ÕÿgrÇÿOQ°ÿU?”óth¢¹¹¹EìììÎÎÎ0‡‡ˆwI4}ÚH/ýhR‡ÿŠn¥ÿ¤¾ÿ´§ÍÿºØÿÊÇÝÿ¥«ÉÿdkÂÿmsÐÿ¤§âÿ±¶åÿ™ŸÝÿ`gËÿ_bÇÿ±µÙÿÄÆèÿ³¹âÿž§Ûÿ}Ðÿ[oÀÿMM¨ÿZ<ò‡ƒ‹ÎÎÎ0ãã㢢£\WOt³:ü[Bzÿ€^”ÿœw¬ÿ°–Âÿ»§Ìÿ÷Óÿ´µÎÿbhÁÿ€‰ÒÿØßîÿ÷ùûÿøùüÿÔØïÿlqÑÿA?ÉÿinËÿ·½áÿ³»äÿ¬Þÿ„œÕÿc‡ÊÿQf·ÿJB›ÿaDÔ¡Ÿ¢aãããÇÇÇ8zx‚‡3$xå3,sÿdMÿŽfšÿ¥|­ÿ¶•Áÿ½¤ÇÿµÐÿ‘•Âÿ`fÉÿÊÑéÿõöúÿ÷øûÿØÜðÿx|Öÿ[^Îÿž£ßÿ_cÍÿ— Ùÿ®¼äÿ–ªßÿ}×ÿd‘ÎÿTyÀÿMQ¤ÿN/…ú{n†šÅÅÅ9ëëë§§¨WUNu³tü-9nÿ`T…ÿ‰pžÿ£‚®ÿ¶’»ÿ¡ÅÿÀ°Íÿy|Âÿ„‡ÕÿêìôÿõõùÿÜßñÿv|ÔÿZ\Íÿ¯³äÿãçôÿw€Òÿ{†Óÿ¢¸âÿЍÝÿnšÕÿ`•ÏÿUƒÃÿQ_«ÿG8‹ÿ`?|Õ¥¤¦[êêêÛÛÛ#‹‹t8%xÝ kÿ%@mÿOW‚ÿvqœÿ•„®ÿ¬‘¸ÿ½ŸÂÿ¬ËÿxwÄÿ”“Üÿðï÷ÿÛÝðÿ{€ÔÿQUÊÿ°´äÿìíøÿðñùÿ“Þÿr€Óÿ’³ßÿx¤Ùÿ`™Òÿ\–ËÿW‡ÂÿSh­ÿJB‘ÿM,zöˆ|ˆÙÙÙ%ÌÌÌ2uqƒ#xî"sÿ%H|ÿF\‰ÿdq™ÿ‚©ÿ”޳ÿ¬Àÿ¾¬ÊÿˆÆÿvtÒÿÂÄæÿtxÒÿPSÉÿ¸¿åÿìí÷ÿñòùÿÞãóÿdlÐÿuÖÿ|¯Ûÿd¢Óÿ\šÊÿY‘ÄÿVºÿRk«ÿLI’ÿH'xþpZ|¬ÄÄÄ:ÄÄÄ:jc~›|÷ J~ÿ$h‰ÿC{–ÿ]‰£ÿt–¯ÿ‚´ÿ•¥½ÿ©¨Èÿ¨¨ÎÿZXÅÿWUÉÿVVÉÿ¯³áÿìïöÿïïøÿàæóÿ™§ÜÿO`Ìÿs¡×ÿi¢Ðÿ\–ÇÿWŽÀÿU‚¹ÿUx±ÿSi¥ÿLP”ÿG-yÿ]8sÒµµµIÀÀÀ>g]|¡1ƒú iŒÿ †•ÿ<• ÿSŸ¬ÿjª¸ÿx±½ÿ…µÂÿ”¹Èÿ©ÄÑÿ†“ÌÿHHÄÿnqÌÿÆÉçÿÓÙëÿÇÌêÿ‘žÜÿObËÿgÑÿo¦Ïÿ_‘ÂÿW…¹ÿT³ÿTy¯ÿTu«ÿSo¦ÿMW”ÿH,rÿU$g䬬¬R¾¾¾@h[{£<Šû {™ÿŒ¤ÿ7˜°ÿM¢ºÿ`­Âÿs³Éÿ~¹ÍÿŠÀÒÿ™Æ×ÿ¤ÇÛÿ‰žÔÿ_kÌÿ]dÌÿ`lËÿP^ÈÿMbÇÿhŽÊÿsŸÃÿd‹µÿ]ƒ¯ÿ[­ÿY{ªÿYy§ÿXt£ÿThšÿLMˆÿG(lÿRZꨨ¨V¿¿¿?i\{¢<ˆû w‘ÿ›ÿ1—¤ÿJ¡°ÿ\ª¸ÿl±¾ÿ{¶Ãÿ†ºÅÿ¼ÇÿŸÂËÿ®ÃÍÿ·ºËÿ°«Éÿ–¤ÌÿpÇÿi‰¿ÿey´ÿZlªÿUe£ÿSd¡ÿSaŸÿR^›ÿR[—ÿQU”ÿPRÿLAÿE"gÿLVꨨ¨VŠÿM9‚ÿJ*tÿD\ÿL"hà´´´JÓÓÓ+yu‰‰%xð ^vÿ|~ÿ7†ÿV•§ÿy¦½ÿ¤¾ÖÿºÈàÿÆÊãÿÄÂßÿ¹³×ÿ¶¯Ôÿ¨ªÏÿœ§Êÿ–¨ÈÿŸŸÍÿ‘—Ìÿˆ™Ìÿ{œÌÿo—Ëÿd‡ÆÿLl¾ÿJgºÿI`²ÿGP¥ÿEC™ÿA1Šÿ8yÿQ?ÉÃÃÃ;ãã㔓œk:,ÛcŸþ"ްÿ;š¾ÿ\ªÍÿ•ÇãÿÀÚîÿÎâòÿÓâóÿÓßòÿÃÔíÿ±Ìèÿ©Ëæÿ¥Êäÿ¢ÊäÿÌÔîÿÖÖñÿÖ×ñÿÖØñÿרòÿØÚòÿÉÐòÿ¥µôÿ›°ôÿ‰§òÿr›ñÿOŠéÿ4cÐýov£šØØØ&ñññ µµ·ISM³!@šú"Œ´ÿFœÅÿ{¶Ùÿ·ÙíÿÏèôÿÛï÷ÿàïøÿÞéöÿÒßóÿ¼Óìÿ²ÐêÿªÎèÿ¨ÎçÿÏ×ïÿÚÚòÿÚÚòÿÛÛóÿÜÝóÿÜÜóÿÛÛôÿÐÒôÿª·ôÿޤòÿhŽîÿªî^¹ú$zÂý.ŒÊþ9›ÏþJ¦ÓÿŸ³ãþ¦©ãþ’˜ÝýkvÎúCQ·ëOX¤½Œ¬tÎÎÑ0îîîíííÕÕÖ)°°¹O¢PU¯5E¢Ë)B¨Ø'H®Ý)M³ßEQµÝHN°ØHO©Êbh¤¡‘“¯mÄÄÉ:åååòòò äääÔÔÔ*ÈÈÈ6ÂÂÂ<¿¿¿?¾¾¾@ÀÀÀ?ÄÄÄ:ÌÌÌ2ÜÜÜ"ìììÿ€ÿþü?øðàÀÀ€€€€ÀÀàðøü?ÿÿÿÀÿ(0` €%òòò éééÝÝÝ!ÐÐÐ.ÆÆÆ8¿¿¿@ºººD¸¸¸F···G···G¸¸¸F»»»CÀÀÀ=ÈÈÈ6ÓÓÓ+áááìììôôô öööìììÞÞÞ ÍÍÍ1»»»D©©©U˜˜˜fŽŽŽp†††x}€€€€~‚‚‚|‡‡‡wnœœœb­­­Q¿¿¿?ÑÑÑ-âââïïïîîîÜÜÜ"ÅÅÅ9®®®P˜˜˜f„„„zuuvŠkhu¡ebz³cb}¾de€Ãhj„Ækm†Çkm†Çlf…ÆpXƒÄpX€¿o]}µrgz£zxz‡ˆˆˆvœœœb³³³KËËË3ßßßñññ ôôô äääÍÍÍ1®®®P“““l{{{ƒjgr_Z{¼`[…Óif“årp¤òzz°ù€‚·ü‡‹¾þŽ’ÃþŽ“ÄþŒ‚Âþa¾ýˆ\¸ú€Y¯õzY£éuXÕsX…Ärhy €€€———g³³³KÒÒÒ,èèèöööïïïÚÚÚ$½½½Aa}}}‚feoŸ[S~É_Tæd`›õsp¬ýˆ‡ºÿ–—Äÿ ¢Ëÿ§¨Îþ«­Òÿ®²Ôÿ®²Õþ«¥Öÿ¥‰Ôÿ ƒÒþš|Ïÿ’sËÿ†fÁþxX´ùtQŸêrP‹Ôpew¤~£££\ÃÃÃ;ÞÞÞ òòò ëëëÒÒÒ,°°°NŽŽŽppppŽXRt½PGŽè\Q™úlg¤þ~²ÿ‘‘Áþ¡¢Ìÿ®®Óÿ··×ÿ½¿ÜþÂÃÞÿÂÅàÿÄÆàþÁ½áÿ¼§àÿ·¡Þþ²œÜÿ«”Ùÿš‡Óþ‰uÌÿwbÂþiQ´ülGžòhKƒÐtttŠ“““l¶¶¶H×××'îîîèèèÉÉÉ5£££[~}`^l¥NA€ØXDšþ_Uœþvo©þ‰†·þœ™Äþ«ªÐþººÙþÁÀÞþÈÈâþÎÎæþÒÒèþÕÕêþÕÕêþÓÏêþÏÃêþʾèþÈ»çþÁ¶äþ°¢Ýþ¢”×þƒÑþzpÈþd\¿þZK±þiE•ïj]w±ƒ…¨¨¨UÏÏÏ/ëëëíííËËË3¡¡¡]yx|‡[Ss¶G8…æN=ŽýeV™ÿzq¨ÿ‡¶þ ›Åÿ¯¬Ñÿ»ºÙþÈÈâÿÏÍæÿÓÓèÿרéþÙÛéÿÙÛéÿØÝéþØØêÿ×ÎëÿÖÍìþÓÌìÿÊÁéÿ¾µäþ²©ßÿ¡—Ùþ‡ÒÿzuÊÿdcÁþQN´þ_B›ôgRÄ€|„‡¦¦¦XÏÏÏ/ïïïðððÕÕÕ)¥¥¥Yzy~†XOtºK2‰íM6þ_O‘þ{l¤þŒ‚³þ•Áþ­§Íþ»·ØþÇÃàþÏÎæþÓÔèþÒÕäþÉÍÝþ¾ÃÕþ¶¾Ñþ´½Ñþ·¼Óþ¿¾ÙþËÇáþÒÍéþÑËëþÈÁèþ½·äþ®§ßþ—ØþŒˆÒþuvÉþ[`¿þMJ°þW=™øgPƒÌ|…‡©©©TØØØ&òòò õõõ ÞÞÞ µµµIƒ}YTq±C/ƒëI0‡þ]IŠÿu_šþz¯ÿšŒ»ÿ¨ŸÇþ·°Ôÿ¿ÞÿÍÊãþÓÒæÿÌÎàÿµ»Ðÿ”žÄþ{„ÁÿnvÂÿjrÄþntÄÿy}Æÿ”Ëþ®°ÖÿÇÇãÿÌÉêþÄÁéÿ·´ãþ©§Ýÿ™šØÿ…ŠÑþirÈÿR[»ÿLH©þT<•ùdN€É„†···GßßßöööèèèÃÃÃ;’’’l`]o¤D.‚äB+‚ýUBÿoXÿ…l¤þ™†·ÿ¤–Âÿ±¦Ìþ¾·×ÿÇÃÞÿÎÍãþÉÊÜÿ§®ÊÿzƒÀÿ]dÃþ\aÊÿejÎÿjrÏþinÏÿ_bÌÿY]ÈþkpÇÿ˜ÍÿÄÅâþÉÈéÿÀÀæþ³µâÿ¥ªÝÿ“œÖþ{‡ÏÿbrÄÿOYµþKF¤ÿT:øgR}À”””kÃÃÃ;èèèñññ ÓÓÓ+¤¤¤Zttv‹I4|ÙA!…ýO8|þfP„þc™þ‘u©þ¤Œ¼þ®žÇþ·«ÏþÁ·ÖþÈÁÛþÈÆÚþ¨­Èþs{¿þUZÅþkrÏþ¦«âþÇËìþÎÒîþÊÎìþª³àþr~ÎþJNÈþX\Çþ›¡ÎþÃÇäþÃÆèþ·¾äþª²ßþ›¦Úþ„˜Óþl†ËþXo¿þOU¯þJAžþ`9÷sj}œ£££[ÒÒÒ+òòò ááá¶¶¶Hƒƒ„{RLn¶;†ùE+yÿ_FzþwXŽÿŒj ÿ{¯þª‘¾ÿ¶¡Êÿ»ªÍþÁ´ÒÿÇ¿×ÿ³¶Íþt{¾ÿV[Çÿ|‡ÑÿÁËæþíñøÿøúüÿøúüþõöûÿÕÚîÿ‰’×þEFÉÿ<:Èÿ^cÈþ¤ªÖÿÁÆæþ¸¾åÿ©²âÿšªÜþŠžÖÿs’Ïÿ]ÇþQi¹ÿLQ¨ÿH8“þa9€ä‚„‚´´´JáááïïïÍÍÍ1›››dferš9"€è.xþL;vÿiLþ„]“ÿ˜l£ÿ¦~±þ²”Áÿ¹ŸÈÿ¾§ÊþõÑÿÀ»Ñÿ•›ÁþVZÃÿpvÏÿ¾Çäÿíðöþøùûÿøùüÿõ÷úþÝàòÿ› ÞÿXZÍþOPÌÿkmÒÿTUÌþz€Ðÿ³¼áþµ¿æÿ¦³âÿ—¨Ýþ†ŸÙÿt˜Òÿ`ŠÊþTwÀÿP]¯ÿJDœþN/…úiNÁ™˜™fËËË3ïïïâââµµµH€€„~L@tÁ&z÷*'pþKBwþnS‡þ‹d˜þœr¤þ©€°þ¶’¾þ»›Äþ¿¦ÈþÄ´Ðþµ±Ëþy€¾þSWÇþ›¥Ùþäèòþö÷úþ÷øúþö÷ûþÜàñþ›¡ÞþX[ÍþSUÌþŽ“Ûþ¹¾æþjpÏþafÌþ¡«Üþ°¾åþ£´âþ¦Ýþ~žØþp™Ôþ_ÌþU‚ÄþRg´þLN¡þH3ŠþZ4{å~u†´´´Jâââôôô ÓÓÓ+ŸŸŸ_hfv™8${âpý'3lþHDwÿkYŠþ‡l›ÿšy§ÿ¨„°þ¶‘»ÿ¼šÁÿÃ¥ÈþųÎÿ¬¨ÇÿglÁþdgÍÿÃÊæÿñó÷ÿö÷úþõöúÿáåóÿ™ ÝþWZÍÿRTÌÿ“ÛþÒÕïÿÞãòÿ„‘ÓþW]ËÿŒ—×þ¨ºãÿ›²áÿ‡¥Üþtœ×ÿi˜Óÿ^”ÎþVˆÆÿSo·ÿOX¦þH<ÿL*|ùlP}¼žaÒÒÒ,ôôô íííÂÂÂ<ŠŠŒtOCu¾ võ gþ!:jþ@Hvÿ`[‰þ{n›ÿ‘|©ÿ¢†°þ±·ÿº˜½ÿ¡ÅþÇ®Íÿª¤ÆÿbdÂþttÒÿÚÚðÿõõùÿôõøþàãòÿ¡¨ÞÿRVËþORËÿ’ÚÿÑÔïþîïùÿíïøÿ¦­áþW\ÍÿÕþ¶âÿ‘¯ßÿ|£ÚþhšÕÿa˜Ñÿ\–ÌþWŒÆÿSw¹ÿR^ªþJD”ÿH-þY8xÞ†~ކÁÁÁ>ìììäää³³³Kxw€‡A-xÔ tü #jþ=lþ7JuþS\†þmm—þƒz¥þ–‡¯þ¥¶þ³˜½þ¿¢ÃþÆ­Ëþ­£ÈþdeÃþusÒþÛÛñþôóøþßâñþ ¦ÝþUWËþIMÉþŒ“ØþÒÔîþîîøþòòúþîðøþ­°æþX]Îþ{Õþ“³ßþ„¬Üþn¢×þ`šÒþ]—Íþ[•ÊþW‹ÄþTw·þSe©þLJ–þG2ƒþN(wõua‚¦¯¯¯OáááÛÛÛ#¦¦¦Xgcyœ/wä tþ (rÿDxþ6O}ÿL^‰þam•ÿu|¢ÿ†ƒªþ”Œ±ÿ¥—¼ÿ´¡ÃþÁ¬Êÿ¶©ËÿsrÄþe`ÎÿÃÃèÿÖ×íÿ—œÚþQSÊÿHKÇÿ”œÙþÙÝðÿïïùÿñòùþñóùÿÜâòÿ{…ÔþU_Îÿ›Øþ†²Þÿq©ÙÿcŸÓþ\›Íÿ[™ÈÿY’ÅþW…¾ÿTv´ÿQf¨þNN—ÿG7…ÿI"tþhLu¼œžcÕÕÕ)ÕÕÕ)a]Tyª$zðwþ 4yÿ O‚þ5\‰ÿJi“þ[tœÿn€¦ÿzˆ«þ„ޝÿ•–¸ÿ£ŸÀþ´¨Èÿ»°ÎÿŽ‹ÆþUQÆÿ~€Òÿ‰ŒÕÿTVÉþNOÈÿŠ‘ÖÿØÝîþïñ÷ÿñðùÿïðùþçëõÿ¸ÂæÿWaÍþXkÏÿ|¦Úþt­Øÿf¤Óÿ^ŸÍþ[˜ÇÿY‘ÂÿV‡½þV}¸ÿTu°ÿSg¦þNQ–ÿH<†ÿH"rþW2nÙ‡“zÊÊÊ4ÑÑÑ-™™™fXLw±|õ5}þ `‚ÿmˆþ2xÿG…™þXŽ¢ÿh–«ÿv²þ} ´ÿ‰¨¸ÿ”¨¾þ¡¦Äÿ±´Ðÿ¦¨ÎþccÄÿKGÅÿGCÅÿLKÆþŠŽÖÿÑÔìÿïñöþñòøÿîîøÿãèôþ½Êæÿu†ÓÿGVËþf‹Ôÿu©×þj¡Ïÿ_—ÉÿY’ÃþV¾ÿU…»ÿU¶þUy±ÿTpªÿRf¢þMU—ÿID‹ÿG&rþO!jìƒwŠŠÂÂÂ<ÏÏÏ/–––hWIvµ%÷O…þ p‹þƒþ/Ž—þB—ŸþQž§þ`¥°þp¬·þw°ºþ€´½þˆµÀþ“´Åþ¢¾Îþ¬ÀÑþŒ˜ËþUUÅþ<7Ãþ_aÈþ°´ÞþÝßîþãæðþáåñþ×Ûðþ³¾åþt…ÓþIZËþZxÎþt©Öþo§Ñþa•ÆþZŠÀþU„¹þS‚µþS}²þSx¯þSu¬þSq©þRl¥þM]šþJF‡þG$nþKcö}mƒ”¼¼¼BÎÎÎ1”””jXGu·(„ùYÿ w•ÿ›þ+ޤÿ=•«þLš²ÿZ¡¸ÿjªÀþs°Äÿ|³Çÿ‚·Èþ‹¾Ëÿ™ÆÐÿ¤ÉÔþ£ÂÕÿ…–ÍÿX`ÇÿSWÇþwxÑÿ’—Öÿ™¥×þ“Ÿ×ÿ}ˆÖÿ^kÐþFWÉÿVqÌÿrŸÏþq¥Êÿf˜Áþ^¼ÿ[‰¹ÿY…´þX²ÿX~°ÿX{­þXz¬ÿVw¨ÿTm¡þMW‘ÿJ>ÿF!hþI Yüzg}™¸¸¸FÍÍÍ2”””jZFu¸1ˆùe”ÿ…œÿ¤þ)•¬ÿ;´þJ¥»ÿU«Àÿb±Äþp´Êÿz¹Îÿ~»Ðþ†¿ÓÿÂ×ÿ™ÆÙþ¢ÉÞÿ¥ÅÞÿ‘¨Øÿm~ÐþVaËÿR[ËÿQ\ËþLYÆÿCSÅÿLbÆþd‡Èÿv¢ÉÿuŸÀþh¶ÿaƒ®þ]«ÿ[~ªÿZ}¨þYy¦ÿYw¥ÿYv£þXq ÿVlœÿRb–þMQŠÿJ<{ÿE!fþHRþydy›···GÍÍÍ1”””jZFu¸0„ú`Žþ ‚”þœþ%”¢þ5š©þG¢±þT§·þ^­»þi²ÀþuµÄþ|¹Æþƒ»Çþ‹¾Éþ¾ÊþšÃÍþ¥ÅÎþ«ÃÏþ¯ºÏþ®®Ìþ£ Èþ–Ëþz”Éþi„Åþk‡Áþl‡»þi~´þ_t­þYl§þVh£þUg¢þUe¡þUdžþSaœþR_šþR]—þRY•þQV’þPSþMF„þJ7wþEbþCNþvcx›···GÏÏÏ0–––iZHv¶*„ùZ‘ÿ z‘ÿ‡’þ'Ž—ÿ4“þEš¦ÿU¡®ÿ`§³þhª·ÿt¯»ÿ²¾þжÁÿ¶Áÿ—¸Âþ¥¾Çÿ°¼Çÿ¼½ÆÿżÄþÆ»Åÿ¾ºÉÿ±»Ëþ’¬ÇÿnŒÅÿc‹¾þ^}¶ÿYf®ÿT\¨þQ[¤ÿPZ¡þP\¡ÿP\ ÿPZžþPYœÿPV—ÿPR“þPN‘ÿOMÿNLþMAƒÿI3wÿC_þ@Qþvd{š¸¸¸FÑÑÑ-˜˜˜fXJv´"÷OŠþ sÿ‰þ'†Šÿ5Œ“þD”œÿUš¥ÿc ¬þm¦³ÿ}¬ºÿ‹±¿þ›¶Äÿ¤¸Çÿ¬¹Èþ¸»Çÿ»µÂÿ¿´ÀÿÀ³Áþ»µÄÿ°¶Ãÿ¥·Áþ“¦¿ÿlx¾ÿXt»þRx·ÿQj¯ÿO_©þOX¦ÿOS£þOV£ÿOX¢ÿOVŸþOS›ÿOQ—ÿOK’þOGÿOE‹ÿNDˆþK:€ÿI+rÿD]þ?Výwh€—»»»CÔÔÔ*aYOx¯yõ Cxþdxþy{þ'þ7‡‹þDŽ•þU• þlŸ­þ{¨¸þ°Àþž¶Çþ¬ºÍþµ½Ïþ½¼Ïþ»ËþÀµÇþ½²Äþ¸²Ãþ°³Ãþ¨³¿þ¡µ¿þ•¤¼þrrºþ\j¹þOi¶þLk³þLq°þMh­þNW©þNU§þNV¥þNU¢þNQþNNšþNF‘þN?‹þN;†þL8‚þK-xþH!kþDYþ? ]ø|o‡ÀÀÀ=ÚÚÚ%¤¤¤Z^V{¨#uñ 9mþ `gÿtlþ-{uÿB…‡þTŽ–ÿf—¥ÿ~£µþ•²Äÿ¥ºÍÿµ¿Òþ¾ÂÖÿÄÃ×ÿÈÁÕþȽÒÿÅ»ÏÿÁ¹Ìÿº¸Éþ³¶Åÿ¬µÁÿ¨µÁþ ¦¿ÿ~¼ÿpy¹þdz¹ÿ[{¹ÿR¸þN¸ÿMv´þNf¯ÿN\ªÿN]§þO\¤ÿOWžÿNN–þNDŒÿN>„ÿL9~þJ-rÿFdÿCWþAdïƒ{‘†ÉÉÉ5ááᯯ¯Oidš/yç<€ý l€ÿ~†þ*ƒÿ6ŠšþL“©ÿdŸ·ÿ}¬Åþ¡¿Øÿ³Èäÿ¿ÍçþÆÍèÿÆËéÿ¿¼àþ²°Úÿ°¬Øÿ¯¨Öÿ¢£Òþ˜ ÐÿŸÎÿ‰ Ëþ™¨Ðÿ¬©Öÿ¡¢Õþœ£Õÿ™¥Õÿ‘§Õþˆ¤Õÿ} ÓþušÒÿ\‰ÐÿHkÆþFiÅÿHlÃÿFd½þDYµÿBN­ÿAD¥þ>7›ÿ7)‘ÿ1†þ@/ƒÜŽ sÓÓÓ+êêê¿¿¿?}|‹‚A*|Õ!7’ûy¢þ‹«þ-’µþ=›½þP¤Çþo´Ôþ™Éäþ»ÖìþÆÜïþÌßñþÏàòþÑßòþÐÜñþÁÓíþ¸Îèþ­Êæþ¨Éåþ¥Éäþ£ÉãþžÇãþ¯ÌæþÑÔïþÔÓðþÔÔðþÔÔñþÔÖñþÔÕñþÔÖñþÖÙñþÏÔñþ¾Çòþ¢³óþœ°ôþš±óþ©òþ¢ñþpšðþZ‘ìþD‚áþ5aÌýUa¢½§¨¯Xàààòòò ÏÏÏ/••›iMEz¹%!Šók¥þ ޱþ4–¼ÿHžÆþb«ÐÿŒÁàÿ³ÔìþÅáñÿÐçôÿ×êõþÛéöÿÜèöÿØãôþÒÞóÿ¾Ôíÿ³Ïêÿ®Îéþ¬Ïèÿ¨Ìæÿ§Íæþ¶ÒêÿÕÙñÿÚÚòþÚÚòÿÚÚòÿÚÚòþÛÜóÿÝÝóþÝÝóÿÝÝôÿÔØóþÁÈôÿ§µôÿ›¯ôþ©óÿ|œòÿh’ðþG„çÿ8pÜÿ)H¾õip œ¿¿¿?ëëëÞÞÞ ®®°Oheƒ™4#áK üˆ²þ0“¼þNžÈþs±Öþ¤ÎçþÀÞïþÏèõþ×î÷þÞñøþáòùþâîøþÝèöþ×âôþÈÚðþ»ÓìþµÑêþ¯Ïéþ©Íçþ§Îçþ¶ÒêþÖÙñþÚÚòþÚÚòþÛÛòþÜÜóþÜÜóþÜÝóþÜÜóþÜÜóþÜÜóþÚÚôþÅÊôþ¨µôþ”§óþ{˜ñþ_ˆëþ=wßþ-]Òþ5I­Ý‰‹¤xÑÑÑ,óóó ìììÇÇÇ7ŒŒ•rE[¿ôCQžÀ•—«jÏÏÐ/îîîòòò ÝÝÝ!»»½C‡‡™wGF†¸$"•ä&H¹û-yÄþO Ðþo¶Úþ‘Åãþ©ÐêþÄÛîþËÜñþÏÝñþÑÝñþÓÝòþÓÝòþÖÝòþØßóþàáôþááôþááôþááôþááôþààóþÛÛòþÕÕðþÍÍíþ³¶æþk×ý6RºíPYœ´œ®cÏÏÐ/ëëëôôô äääËËË4££©[ih–31Ï(¡íT¸û*{Âþ@—ÊÿZ«Óþ}¾Þÿ™Éäÿ«Ñéÿ¶Õìþ½ÙîÿÂÚïÿÅÜïþÎÝðÿÞàôÿààôþààóÿÝÝóÿÖÖðþÌÍíÿ¾¿èþ¥ªàÿ€ØýNfÉö3J©ÕptœŽ´´¹JÚÚÚ$ïïïöööêêêÖÖÖ(¸¸ºF……šzPOޝ/2—×:ªðX·ú$r¾þ/‹ÇþEžÎÿX¬Ôÿe³ØþpºÜÿu¼Ýÿ€ÀßþžÇåÿËÏîÿËÌíþÈÈìÿÃÃêÿ²´åþ•›Ûþr€ÐüN_Âö;N²àJS¸”•§jÅÅÇ9áááòòò ñññ âââÈÈÉ6¦¦¯Xyy™„QP’®26›Ô4¤ëH±ö\¹ûm¿ýzÄý"‰Èþ)“Ëþ1›Îþ`¥×þ¡«âþœ àþŒ“Üþ{„×ü]jËù=K¹ò5B©ÛMUžµ|~¡‚¯¯¸OÖÖÖ(êêêöööìììÜÜÜ"ÅÅÇ9©©²V„„¡{`_–Ÿ>C˜Á(7ŸØ5¥ç7ªî=¯òD´õI¸ö(N»öEP½ôBI¸ñ!  ¨¦%( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿüðÀ€€€€€Ààÿ( @,|B"uI.rK6{J>Cz@IyC?‚J;†VŒ4b‰-z¹WCŠPMŽJC“H[šPW˜mV’na’ch•oaŸsg—LY¨O]­Q] Sa¦Up¤Ts¯W{­An¸Si´Xh°Tt·_{·ak­vi§yn©ju¡lw§}z¤w|¬l°?nÕcqÂe|ÎysÈilÒgÒruÑtxÔzyÒ”m¢Žz¦‰s³š}È*€ƒ'—,¢1”º[†¶m…¥ašªa‚½S¡­[¦¸w°½XÂP•ÎnÎq‚Áp‚ǃ΅Îk˜Æ|‚Ó}†Õb˜Ðr”ÑÐ|µÅf¢Õi¢Ñu«Ùo³Û|ñ€„­®‡“¼““¾•›¹¢²¬œ±©Ÿ·¸™¿¤¡±§¦¿° ³ˆ›ÅŠ’È”Ç•ŸÄ˜œÃƒŠÒ…‹ÕˆÔ†”ÔŽ•Õ’œÚ¤•Á·Æ¨œÒ•¹Æ®ÞŸ¦Ý™¨Ý§¡É¡¦Ï¦¨Ï©®È«¨Î²®Í¡ºÏ¼³Æ¸´Ç°½È¡§Ý¯¥Þ¡©Þª¹Û¼´Ð²ºÖ´»×€—ꥲ᧴⪸㽾廾鯼ô‰ÀݘÁÑ¿ÁÙžÃåœÊæªÍç´Òë¹ÑêÂÃÈÄÂÈÇÀÌÁÃÛÅÀÜËËãÌËãÍÄèÇÊìÉÍëÎÐãÀÕíÒÓïÒÙïÌÚð××ñÖØóÕÝòØÙñÜÝòÛÜôÎåóÙæõàâòïòø””_(Yvo76]%x™ž™›.$m˜uIiI‰~,[4nyg¬œ/g‡NW5^d‰2§LqM!  =Zu31«¡0RC ” :APOLl-J< a 9@Bp}|b"\8>zŽ‚weF?|;Œ©ªŸ‘“§£¤‹U+` &X*&V)§…F#Sˆ€‡s‡r~k¤E Q’¢¢£§§¤jfDTŠkcƒ„˜þðàÀ€€€€€€€€Ààðþ?( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆwwwwwwwÿˆˆˆ€wwwwwwøˆÿˆˆ€wwwwwø‡wˆÿˆ€wwwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿ( @€ ku8y"s-9n!(|2,yD\EcF%iZ*gH*uK9~S3~`,gd;x J~ ]u%@m%H|:Axz{[BzTY|9ˆ!#€6"€)4…2<ƒH7†P7†A=”%C› iŒmcŸ y•$h‰-I®O¬®ÂÂsppnª¿¨8L¬ËÒØêêÖÊÉrdDm·81O¯ÑãòõõõóóäÖÄfCD·±1-O­ÑäóóôñññóóäÊÄfC7±º-9­ÇãòõÓ¬eceÀØòäÝÄeB7¸55n²ÖãñÑchÝ߯g]ØîßÏšI?7¨koÈÒãÔPÃ÷üü÷hShßßÏΓI0k¿4lqÈÈã¯_òüüùi]Ý]ÏßК•a?¹¨5m°³ááfÃûüùi]ßú˜˜ÞΙ•`Ak->­²ÈâfÄû÷˜]ßûûÆiС™’I0â¿.=O«ÇáÀiòi]ßûûùgš£ F0 «¸&;~„®µÑÑ]]]ÖûûùÏ^¡™’GF/ 6«"wz€ŒÌÍéÁ\hòõòÆ^— ’~JGF2 «%y|ˆ‰ŸŸæçéÅc_g^^•–…~~GGG:. ±%uzˆ‰ŒŸÌÌåèØÑË”…QGF:A33// ±#tx‡Š¶ÍÓØ¿ââÍ”KIA@@32/-, ¸v}ƒ¶Íèãâ⿾¾RPJJEA@20- Ôx€‹éêòñØØÑÑËËÂÁ–•“IHH?0<1${|›ìôø÷÷ôííííô÷÷÷÷÷öàÜÚ§¤ZÑ©!{‘£ðøùùù÷ððííõ÷÷÷÷÷÷öàÚ¦[U *£øðåêµ®=‚:ËãO©>©úöÛ¥V†©'¢øòÅN®QQ–¯Ø0Ë:ú÷äjT0+ðöŘÏÏîÎÅÎÞ_îÝÆÃÆú÷ßbÁ¼?`£ïÝÞòîÙÏßÏòÆòÏßÏÃ÷ä˜I¯?Y¢íôøôöôôô÷÷ú÷÷÷÷óÅH»(Wëðôø÷ø÷ùú÷úúóò˜eL'X‘¢ìíïð÷÷÷òßÃ_®ÑL')XŽœÙÝÆhC†¬PHHH_PeËÿÿÿÿÿðÿÿ€ÿÿÿü?øððàÀÀÀ€€€€€€€€ÀÀààððøü?ÿÿ€ÿÿðÿÿÿÿÿ(0`€ !V!(Y g u uq+{ 1q%/h$6k)'x7?}D VHcG"jH(tP/K9zX0xCx7Exlq*}zFDv_FziL1†=€%*…7!„$5‰)+˜7)‘+8–>7›58¦D)‚J8‡Q9‰E:•X?“d?C?¦T‹*U… n‹2xO²+O¶r­*s½MF‰XEˆJTŠSYˆKI—WG”NT™TX˜jHˆqMgS‰sTˆbK˜iY”sWšUg—diksŽgi—wk™ey{w›GI¦NW¦R[¦MJ°UL²HV¹QZ·yW¤gW¹{[µMg®Tg¦Ww©Lf·Vh¹Ls²Uyµjk§um¥wu¦hu·tz·<8Å+OÉ{Ä5nÒIJÇIUÉTXÉGgÃYcÉVuÈ^kÐdgÈwbÂjrÈuwÉkmÒm~ÐuuÑOxã„]“‡jš‡z›‘}Ÿ‡_µ‡i¤˜l£‰w§–x§b¾~¼¦~±†fÁ‰uÌ–wÍ„”/ГЫ.“²F–SŒ²h¨{„§h™©g‹ºz‚ºdŸ·v²S¤¶q¨¶1‘ÈX‡ÄF™Ë[–É\‰Ðh‡Æx„Èc–Ãu™ÉiƒÔz†ÒdšÒx™ÕV¨Îq®ÑQ‡çu”ð¢ñ‰‡“Ÿ˜–ŸŠ‰¤•Œ¦‹–¬˜–¢…‡·—Š¶Š˜¹–™¸£œ©¥‡³±·§”½¶”¼ª¼¨¢¬¦£µ´«¹¤´¿¸·º†Ä‹”Ç”˜Æ‡ŠÓš‡ÓЕה›Ø¥œÄ¸šÃ¢†Ó¤•زœÜŠ Ç–§Èˆ¸Å•¶Äˆ¦Ú™¥Ù†¸Ø“³ß§§É¸¦É©¸È¸¸È§¨Ø²¦Ü§´×·¹Ö˜£ã¿äœ´á©ò–ªó›°ó¥«á¼§à¨´âµºä¥´ó¶¾òéÉøÈùÔÅ»å’ÃÕ¨ÄÎ¥Å׺ÃÖ–Æã¨Ëæ¹Èç¦Ðé·Óë¾ÇòÆÄÛÇÈçÓÍêÅÖíÓÕëÅÊóÌÛð×ÚñËãòÙåóÞñøâäôìð÷ôõù¸¸®¥££¦¥¦£¤¤§®¸¸´£II]_ªªºº¹|wwxzv´¸®IFF\ª»ÍÍÓÓÎÑÂÂSQt®¶£;A[}¹ÍÓÔÞïïðäÜÜÄý€lRQt¸¸¥D)@\ªÀÍÞäïññóññðäääÄýnRNB§¸£9'A]¹ÀÓãïññóóóóóóññääÒünRN@u¸¸u)'@\ª±ÍÔäñóóïèèèâïðññääÛünhM)z¸£4&)Gz«ÍÜäïóïÐȪ__m—»ÒððäÞÒ¿¼mPM)u©)%5?x«ÀÎãïñïÏŒhhjoohhm»ððäÝÑ¿›mPJ)u¸>%G{¯ÄÎãïïÏ_hoÑðõðÝnefÍðîÞÝʾ–XP(*´u%?x~±ÁÒâäÐ_f›ðûüüüö¾d`hÑëÞÝÊÉ™’XK(=â´&sy~²Îáãâ»fnëûüüüúÊfeof›ÞëÝÊÉ–iKJuG ?ty~²ÁááÐŒfÊúüüüúÕff¿àokÑÞ×Õ•’WJ'<¸´' ?t{~²ÁáãÍkkðüüüûÊff¿ñú¼f¾Ý×Éœ”’XL'&vI 7u{¯°²ááÍknöüüúÛff¿ôûûÛh›×Ìœœ”’ZL8%=â¸>7Ez«¯²ÁáÎkqöüúÑfd¾ñûüûßf¾ÌÉŸœ””’ZT8®®&CDˆ¦«µÁáÎnkäó¿fd¿úûûûú›fËŸœœ””’ZT8&u§--CHˆ‰ª­ÀÎйf›¼fd¾öûûûûähj¢Ÿœž””’ZZU:&?£../††ŠŽŽ³³ÍÏÍkddd¼óûüûúî›e•Ÿœœ”’’ZYVU:4¸u,.‚ƒ†ÇÇÈæÓºf`kÒúúúöäšeiŸŸœ’‡Z‡YVUU:4¶u,.‚…†ŸÇÇÇåæçºffq¿Ê¿›jeiŸ˜‹’‡ZVVVVV6 ¶u.„„……žžŸÇËåéçêÉnhffeeg•™™‹ˆ‡HVHVVVCC6 ´u,‚‚„…ŸÇŸÇÇååææÏÓÀÅ™––‹_VVUUUUUCC:7: ®u,.‚ƒƒÇÇÇÈ·¸ÐâââÏÆ–‹^VLL;L;:::66864 ´u,.‚ƒƒ††ÇÈ·æ¸Ðâ¸âзÈ_ZZTLLKKK::69944 ´£.ƒ††È·ææâèâ¸â¸··­_XXWYTKKKK:K8&' ¶« ††Š·ææèïïâïâÐзϵ}_^Z‡ZYTKKK:844 â´%‚ƒŠÇåèòððïÔÒÎÑ»ÉÅÉÒÊÊÊÕÉ”ggggOJJ#!9Ð@2„…Ÿéò÷÷÷øõòíêêêçêêóóóóóöööõîßÚÚØ¢¡  cªI"2„…“žéì÷÷øøøøõòíêêêêíóöúóúöööúöîßÚØ¢¡ caÀµ'0„…žŸì÷÷ùùùùúøòíííêêíöööööúöúööúôßÙ¡ ccOF 2…‘Ÿì÷÷åæù¨E¨ò¬H¬ˆHÆÍE«ó»‰­«]ÍúöôÙ¡ caŒ´(0…‘žì÷÷ªÆæDè6 ÅC Dª7ó »D7úúöà¡radèI$3“žìùù¾¿_":^ëZXÝZ"[Å"\óT^ÔŒ 6úúúôÙeaŒÐ9$‘“Ö÷øÕ¾mp¿—õ뿾›¼ÝÛO—óðʾp_ÓúööôÕaO¨#1“Ÿí÷×¾¾ëݿ뾛êÞÉÞÞ›¾ö››äݼ¾úöñàpaÍ]+gœŸìÞ×ÞõëÝòÝÛë×ÊàëÊÞöÛÛðÛ›¿úñàp1ª\+a“Ÿéíõöóòõòîòîòõöóóúöñóóôúñä›1_\"a“žéíòõööøõõøõöúúúúúúúúúöà¾g_]$abžŸÖìò÷õööõöøúúúöúúöñôàpeªµL$0b“žÖéìíí÷òõöúöúöôäß¼hTЪP11b‘“žŸŸËÖéõôñäÜÕqhWŒÐªL100bb‘‘‘žÛÕ¾›jOPŒÔ­^O10000aeOOf_»ÐÔÓÔæÔãÿÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿÿüÿÿðÿÿàÿÿ€ÿÿÿþþü?øøððààÀÀÀÀÀÀÀÀÀÀÀÀÀÀààððøøüþ?ÿÿ€ÿÿÀÿÿàÿÿøÿÿüÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿÿÿ(  @ää丸¸F”“šsŠ‹”ƒ‰”ƒ™“q¼¼¼Bçççôôô ºººDrn‡¤mj™ã‘‘½ú¦¨Ïþ¨œÒþ™{Èû}d«æ}n’¨¾¾¾@öööõõõ ¢¡¦_XJƒÕyn©þ«¨ÎÿËËãÿÎÐãÿÌËãÿÍÄèÿ¯¥ÞÿysÈÿaSšÝ¨¥¬^ööö¾¾¾@QA}ÔmV’þ¤•ÁÿÅÀÜÿ¡¦Ïÿ…ÎÿˆÔÿƒÎÿ¿¿äÿ¢§ÜÿcqÂÿ\L“῾ÀAçççjc„ŸK6{þ”m¢ÿ·Æÿ²®ÍÿƒŠÒÿïòøÿÇÊìÿilÒÿ…‹Õÿ¥³áÿr”ÑÿO]­ÿs`‹²ççç¾¾¿@,(sã@IyÿŽz¦ÿ¸™¿ÿ”Çÿ¼½çÿÉÍëÿtxÔÿÜÞòÿ}†Õÿ®Þÿb˜ÐÿTt·ÿO9„ò¼¹¾Gœ™¤e'yù4b‰ÿm…¥ÿ•›¹ÿ§¡ÉÿzyÒÿruÑÿàâòÿÒÙïÿgÒÿi¢ÑÿXÂÿTs¯ÿJ;†þ‘ƒš€“ŽpTŒü,¢ÿ[¦¸ÿ|µÅÿ˜ÁÑÿÐÿ|‚Óÿ’œÚÿe|Îÿk˜Æÿ[†¶ÿW{­ÿUp¤ÿJ>ÿe…•žoT‹ü'—ÿS¡­ÿw°½ÿ•¹Æÿ°½Èÿ¸´Çÿˆ›Åÿ_{·ÿSa¦ÿQ] ÿPW˜ÿPMŽÿI.rÿ{a‚Ÿ ©a?wù*€ƒÿašªÿ¡ºÏÿ¿ÁÙÿ¼´Ðÿ©®Èÿ•ŸÄÿq‚Áÿa‚½ÿSi´ÿLY¨ÿJC“ÿB"uÿ…v˜ŒÇÇÊ71GŽâ1”ºÿ‰ÀÝÿÎåóÿÙæõÿÀÕíÿªÍçÿ¹ÑêÿØØñÿÙÚòÿÖØóÿ¯¼ôÿ|ñÿ   ^†††ysr|–kj|©jk}±mn³no€³qd±te~©zq€—ЉŠu¥¥¥YÄÄÄ:âââöööéééÈÈÈ6šš›dwv}Œd_z¶b]Üsq¢ð‚‚µúŒŽ¿ý•™Çþ–šÈþ“rÅþŒe¾û‚_²òyXšàr^„»yƒŒ Ÿ _ÍÍÍ1ìììààà³³³K‚‚‚|\Wv·XNŽêlf¥þ……¸ÿžŸÊÿ¯°Óÿ¹»Ùÿ½ÀÝÿ¾ÀÞÿ¸¥Ýÿ°™Ûÿ¦ŽÖÿzÎÿ{`ÀþkL¤òlU‚‡‡‡w¹¹¹EäääÙÙÙ%¢¢¢\ljv—OC€Ù]Mšþwp©ÿ”‘¾ÿ¬«ÐÿÀ¿ÝÿÊÉãÿÒÓèÿÖ×êÿרëÿÓÉëÿÍÂéÿÆ»æÿ±¤Ýÿ™ÕÿzqÉÿ^U¹ÿbI–évl€§§§WÝÝÝ!ââ⤤¤Zhdx N7‡èUDýzm¥ÿ•»ÿ­¨ÎÿÁ¾ÝÿÏÎæÿÓÔæÿÌÐàÿÂÈÙÿÀÇØÿÅÄÝÿÐËæÿÐÊëÿüæÿ¯§ßÿ•ÕÿwvÊÿUV¹þXB™ñte„ª¨¨¨Väääìì츸¸Foly”F3€åP;†þs^˜ÿ“´ÿ§œÅÿ¼¶×ÿËÈâÿÏÏâÿ®´Ïÿ€‰ÃÿjqÄÿgnÆÿnrÇÿˆŒËÿµ·ÚÿÊÇéÿ¼ºåÿ¨¨ÝÿŽ“ÕÿgrÇÿOQ°ÿU?”óth¢¹¹¹EìììÎÎÎ0‡‡ˆwI4}ÚH/ýhR‡ÿŠn¥ÿ¤¾ÿ´§ÍÿºØÿÊÇÝÿ¥«ÉÿdkÂÿmsÐÿ¤§âÿ±¶åÿ™ŸÝÿ`gËÿ_bÇÿ±µÙÿÄÆèÿ³¹âÿž§Ûÿ}Ðÿ[oÀÿMM¨ÿZ<ò‡ƒ‹ÎÎÎ0ãã㢢£\WOt³:ü[Bzÿ€^”ÿœw¬ÿ°–Âÿ»§Ìÿ÷Óÿ´µÎÿbhÁÿ€‰ÒÿØßîÿ÷ùûÿøùüÿÔØïÿlqÑÿA?ÉÿinËÿ·½áÿ³»äÿ¬Þÿ„œÕÿc‡ÊÿQf·ÿJB›ÿaDÔ¡Ÿ¢aãããÇÇÇ8zx‚‡3$xå3,sÿdMÿŽfšÿ¥|­ÿ¶•Áÿ½¤ÇÿµÐÿ‘•Âÿ`fÉÿÊÑéÿõöúÿ÷øûÿØÜðÿx|Öÿ[^Îÿž£ßÿ_cÍÿ— Ùÿ®¼äÿ–ªßÿ}×ÿd‘ÎÿTyÀÿMQ¤ÿN/…ú{n†šÅÅÅ9ëëë§§¨WUNu³tü-9nÿ`T…ÿ‰pžÿ£‚®ÿ¶’»ÿ¡ÅÿÀ°Íÿy|Âÿ„‡ÕÿêìôÿõõùÿÜßñÿv|ÔÿZ\Íÿ¯³äÿãçôÿw€Òÿ{†Óÿ¢¸âÿЍÝÿnšÕÿ`•ÏÿUƒÃÿQ_«ÿG8‹ÿ`?|Õ¥¤¦[êêêÛÛÛ#‹‹t8%xÝ kÿ%@mÿOW‚ÿvqœÿ•„®ÿ¬‘¸ÿ½ŸÂÿ¬ËÿxwÄÿ”“Üÿðï÷ÿÛÝðÿ{€ÔÿQUÊÿ°´äÿìíøÿðñùÿ“Þÿr€Óÿ’³ßÿx¤Ùÿ`™Òÿ\–ËÿW‡ÂÿSh­ÿJB‘ÿM,zöˆ|ˆÙÙÙ%ÌÌÌ2uqƒ#xî"sÿ%H|ÿF\‰ÿdq™ÿ‚©ÿ”޳ÿ¬Àÿ¾¬ÊÿˆÆÿvtÒÿÂÄæÿtxÒÿPSÉÿ¸¿åÿìí÷ÿñòùÿÞãóÿdlÐÿuÖÿ|¯Ûÿd¢Óÿ\šÊÿY‘ÄÿVºÿRk«ÿLI’ÿH'xþpZ|¬ÄÄÄ:ÄÄÄ:jc~›|÷ J~ÿ$h‰ÿC{–ÿ]‰£ÿt–¯ÿ‚´ÿ•¥½ÿ©¨Èÿ¨¨ÎÿZXÅÿWUÉÿVVÉÿ¯³áÿìïöÿïïøÿàæóÿ™§ÜÿO`Ìÿs¡×ÿi¢Ðÿ\–ÇÿWŽÀÿU‚¹ÿUx±ÿSi¥ÿLP”ÿG-yÿ]8sÒµµµIÀÀÀ>g]|¡1ƒú iŒÿ †•ÿ<• ÿSŸ¬ÿjª¸ÿx±½ÿ…µÂÿ”¹Èÿ©ÄÑÿ†“ÌÿHHÄÿnqÌÿÆÉçÿÓÙëÿÇÌêÿ‘žÜÿObËÿgÑÿo¦Ïÿ_‘ÂÿW…¹ÿT³ÿTy¯ÿTu«ÿSo¦ÿMW”ÿH,rÿU$g䬬¬R¾¾¾@h[{£<Šû {™ÿŒ¤ÿ7˜°ÿM¢ºÿ`­Âÿs³Éÿ~¹ÍÿŠÀÒÿ™Æ×ÿ¤ÇÛÿ‰žÔÿ_kÌÿ]dÌÿ`lËÿP^ÈÿMbÇÿhŽÊÿsŸÃÿd‹µÿ]ƒ¯ÿ[­ÿY{ªÿYy§ÿXt£ÿThšÿLMˆÿG(lÿRZꨨ¨V¿¿¿?i\{¢<ˆû w‘ÿ›ÿ1—¤ÿJ¡°ÿ\ª¸ÿl±¾ÿ{¶Ãÿ†ºÅÿ¼ÇÿŸÂËÿ®ÃÍÿ·ºËÿ°«Éÿ–¤ÌÿpÇÿi‰¿ÿey´ÿZlªÿUe£ÿSd¡ÿSaŸÿR^›ÿR[—ÿQU”ÿPRÿLAÿE"gÿLVꨨ¨VŠÿM9‚ÿJ*tÿD\ÿL"hà´´´JÓÓÓ+yu‰‰%xð ^vÿ|~ÿ7†ÿV•§ÿy¦½ÿ¤¾ÖÿºÈàÿÆÊãÿÄÂßÿ¹³×ÿ¶¯Ôÿ¨ªÏÿœ§Êÿ–¨ÈÿŸŸÍÿ‘—Ìÿˆ™Ìÿ{œÌÿo—Ëÿd‡ÆÿLl¾ÿJgºÿI`²ÿGP¥ÿEC™ÿA1Šÿ8yÿQ?ÉÃÃÃ;ãã㔓œk:,ÛcŸþ"ްÿ;š¾ÿ\ªÍÿ•ÇãÿÀÚîÿÎâòÿÓâóÿÓßòÿÃÔíÿ±Ìèÿ©Ëæÿ¥Êäÿ¢ÊäÿÌÔîÿÖÖñÿÖ×ñÿÖØñÿרòÿØÚòÿÉÐòÿ¥µôÿ›°ôÿ‰§òÿr›ñÿOŠéÿ4cÐýov£šØØØ&ñññ µµ·ISM³!@šú"Œ´ÿFœÅÿ{¶Ùÿ·ÙíÿÏèôÿÛï÷ÿàïøÿÞéöÿÒßóÿ¼Óìÿ²ÐêÿªÎèÿ¨ÎçÿÏ×ïÿÚÚòÿÚÚòÿÛÛóÿÜÝóÿÜÜóÿÛÛôÿÐÒôÿª·ôÿޤòÿhŽîÿªî^¹ú$zÂý.ŒÊþ9›ÏþJ¦ÓÿŸ³ãþ¦©ãþ’˜ÝýkvÎúCQ·ëOX¤½Œ¬tÎÎÑ0îîîíííÕÕÖ)°°¹O¢PU¯5E¢Ë)B¨Ø'H®Ý)M³ßEQµÝHN°ØHO©Êbh¤¡‘“¯mÄÄÉ:åååòòò äääÔÔÔ*ÈÈÈ6ÂÂÂ<¿¿¿?¾¾¾@ÀÀÀ?ÄÄÄ:ÌÌÌ2ÜÜÜ"ìììÿ€ÿþü?øðàÀÀ€€€€ÀÀàðøü?ÿÿÿÀÿnsis-3.11/Contrib/Graphics/Icons/nsis-menu.ico000077500000000000000000001143171477201124000212470ustar00rootroot00000000000000(v ¨žÈF h ‰v@@ (Bÿ000 ¨%'s( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™™ ™™œ™™™™Ì™™™™œÌ™™™™ÌÌ™™™œÌÌ™™™ÌÌÌ™™œÌÌÌ™™ÌÌÌÌ™œÌÌÌÌ™ÌÌÌÌœÌÌÀ ÌÌÌÿÿ¿žŒ€€€€€€€€€€1€yý( @?3?{X"yªzÓ– ä®,ì»:ôÉV&.¥/9Ì@Fï^cñ}ôÿÿÿ                                         ÿÿÿÿßþÏþÇüÃøÁðÀàÀ@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ?‡ÀÇ€ÿçÿ÷(0@yUxH?EF>I©xÒ”ï®óº&õÈN$+¢-7Ì=Dï\`ñ{}ôÿÿÿ                             ¿ðŸàÀ‡€ƒ€€€€€€€€€€€€€€€ƒ€Àã€óû( yUxH?Edddppp|||©xÒ”ï®óº&õÈN$+¢-7Ì=Dï>Dð\`ñ{}ôÿÿÿ               ÿÿ¿žŒ€€€€€€€€€€1€yý‰PNG  IHDR\r¨fPIDATxœíit\g}‡³J²c[KäŒ[‰Ëq\ÇI $LE œ”´Äá²8R -|)ÈF¡§§§| ÔqBV¶ãPš¦9Ä@ƒLi›&ÎFä8vˆ¼HŠ-YËh™ÍL?hÞXš;w›¹ï}·ÿó%'÷ÍýÛšçñ̽sg"éÞ¾÷xÀ:ò*€OdúŸ=ÑéÞ¾+ìð]ŸÉ ô¹Ï(H~ÝÙà§éÞ¾´èAˆúI÷ö}ÀãXt5àS>ÔèýF±XBoZò5”šZª—éå€Ä„%?°ä5E@1\äÿ_ˆ wNE@!ìä/´¬â²¿e(ŠàQ~E@ œäßÿ¡¯qÙ§å("E@r|ÊÏ È›üÙ3ù¼U§æiŠ€¤Ô)?ƒ" '¢äÎ#R$£Aù"ð Æ%¼!R~Àå®xè.`.Çk6‚ü —ü¤ò $8#Z~ÀÃ;‰#0ø‹ç )Ü(gg‘ûîדŸá€½¾È ?àñ­„N(z‘"À‰rvù{oAéðK–µFägPÄîíû H ?àã½ÄpySþ#-kAÈÏ „Kº·ï:H"?àóbŠ@8„%?ƒ"ùD•w¢äGõ ^ ð%lùoF yeõE d”ÕÃxeI©^£Ô(ù¹sz0rÃ](­°¼í”"вÊ4p=q%7x´z"àÑò3 k»0rÝ€Y~ ÁÈ ô—XÏO"à'ù§ÞqUhò3(Á »ü@Ÿ(âEÀgùÿ§ÒC˜ò3(a'îŒvì¿ZùÎ(N¸ËÿQS†"P®òwÈ!?BŠ@-d—ŸAð‡›ü³­r}/—tN[¶QN£Šü Š€7T“à€®“Ç(6¨&?ƒ"àŒŠò_P¬¨*?ƒ"PUå8 œFuù"p€±„¡²ü@#°ç”³³¼GŽ.ò3\"ð )P]~ ¤³¶x}ù{õŽ@yr ù=_ÖF~†C¢0 :È„À!Gjòäò»w¡tôeMeù¦F ÝÛ÷1h ?b³"ð¦ü£C–5äg˜toß§±øÕÜÊË„ÀŒ˜"?ÔTäÿvõvUåÐ;¦ÉÏ(¬íÂÈõw ¸ª½zI‹è(? (€ž0U~F¡³ #7Ü©]t•`1gMž´lW1¦ËÏXhKiåÖ#5y²]¥8É?ñžk‘Ÿ¡Kt— pÎøˆ²p–ÿ:L¾óS‰GõØÉ?·æ,<»ã6-ä$  fÜåß!`*yP5NòïßqæÖœ%`*>H@­üÞP-nòÏŸaùs(TÔˆÉïU"`šü€„äŽÉ_²GÀDùIÈ’¿1Q?óçþΰ ùëBÛö¨EâĬ9q„÷HDHüÞÐî@5vÇ}ɯh%ù=¢}Š€i$g'°ö¥Ÿ‹C Œ@0ž}?Àú§=†ôh}  §côöP5èÞ÷Î{ú1O·íÙ÷ÀÑ·]Ís$¥1æÃî™@Ëä(.Ù{ š³Öo,&äÀNþìšþ÷½ŸÃì–5z&àŒq(*â$ÿþË>‹éÖsñLú³È®±>»£ØcdŠ€J¸ÉŸoZ È7µbÿe?€" ^ågä›VR|`t€Åt·l§ˆÇ¯ü Š€wŒtNQ$ÃNþÉö xöò¿±•ŸAð E@œäîÝŸF!Ùâé~(îP–@›ü ‰f_÷Gp†PE@AËÏ ØC¨E |xÉÏ Ô†`E ö_öYiåg˜ãШü ŠÃYþz?…bÜù´ª,˜£”ü Š€ùc sÕî06ùx2PùæF@?ù:GÀÈäI ž¼ü ó" ¯ü ]#`\r‰$¬ÛˆBdò3̉€þò3Ü"°ñ×(‡?X€°ägèsäg8EàÜgGOf7TŠ€1[~†SÞò£›qÆÉ#\öËóäg8E`ý ýJEÀˆˆ’ŸaÄÜ4.ùñ­ FÀ\ùºD@ûˆ–Ÿ¡K"å6ÿân£ågè­`'À;³o„&?CõDÊ%lùÙ·p΋¿´¬™&?Cõh'ù/ÅùóÓBæR5LþÔ}–5Såg¨-à&wôÕ"@ò»Ã"pªs£eMæhÙåg¨’ß; ‰f<ÿ®1¾ö|Ëš¬Ð*ªÈÏ=$¿б^èý”2Ð&ªÉÏèÎeqùÔ¢U Ñ ùëG¥hUåg¬ÏÏ಩Qi"à$ÿ‰³·âùwÝHò» J”€êò3d‰€›ü/½ãã(EkG±" tt‘Ÿ!:ÞäqA7d€²È%š´’Ÿ!*$??dŽ€’˜K6cPCùaG€äç¬P.sÉf¼’êÆBÕwõé"?#¬üáá%‘r)Ô™” €)ò3xG€ä·lùÙ·B€20M~†Sþpï—±fäÕºî—ä‡SRö…%`ªü »Äs³Øþ¯·ùŽÉ/Y" }L—Ÿaüœ¯D‹ ØúÄ?’ü C¤€üQ”ÑküŒF#°(ÿ?`í«ÿcY#ùÅ :ÒÀIþ˦Fqžaò3ê“¿óð3–5’_,"# eÜä_ŸŸ4™øÉ/?,'SXÖXx ]H~oxɯÅX/^ú—8qöVËZ­c6A UH~¸E íØ É¯¥h /½ãã5#Ài@ò×Çúü þdr±²5—ìý ɯ aF@Šë:IþÆHæžFfõ:#ÕŸ/d¥óøïpù£Âd„ì@ò‹@õ3‚pBhHþ`¡~’ŸÂBŽÌ4­ÀÁÔy(V„"ùƒÁí˜À‰¶ ˜Zy¦€É?´M¢}ò8×}„€Eù»QŒ.òAò‹SÚ¦F0´þLžÑ)h:ÂöÉatžû~B} @ò‡‹ÝËx±€‹÷S¬Éž4áDûä0¶>‰h©È}_¡€äƒ[Ú'‡MFÔÂNþ…Ÿ÷l„’_,NØ>ø$E@œä®u—}rÉ/vˆ–Š p“2±’Ë~¹ÀNþX™äE@N:&Ž ‘à'ùÓSÃ$¿ (rÑqjÛû…Èp €›ü©ÂÝ¡ÈAÇ©!l?±|ØGXòœ@òËE@,2Èp ɯ1È"?ÂY’_nR…9\1y‰ª#E€2É„ðVàÎ…yŒ&Z0šhá½+¢Öæq,¹bÙ6ç·\ñ5ëM¦²É„€‘D FH~e¡ƒü…hϵnÂT|…ÍOòEø‚òC/ÃIþg[{„ÉPPêÃMþl\ì³c ኀ?d—áÀ–Ò<>š?…èjd¥ˆN´á¥X³ëm阀7TáÀ`´$ÛP„û§ÕáSD$kËÿÖhwÆçÑ»÷ ðý´UQE~ ¤—9aòFkËÿ…X["%|5ž«‹_~§†ÂW T’à€Þè‚eE@.¼ÈÏ^n²‰@¤\ÂöŠ@Õä8às±¼mîO¶¡@ŠùgT”à€(ì#p ÚŒ{“íAÔ#?ƒ"P›3Ç^SR~€ã1§Ž6Qà$ÿÛ\ägP–Óyò.zåWJÊp>H'ù{£ ø¢ùE:O¶ƒO!Rõ÷ Šü@g(âq“ÿs±¼ï‚éÐA~ ¤Ó€qðŸajt‘ñ­Àðá)?cS¤„»â9¬2$:É„|-@Àçcy¼—"À0ägtEJ¸Í€è&? àb €)\ S~†î°“?Mà™¶ÍJʺ"Àò3t€“ü϶mÆŒ‡‹¨dEØåÀà)?C·¸É?k4Y0ý<Š@pÈ ?C—è.? Á‚P§€îK¶K!?Cõ˜ ? AŠ@#Á½ÉvŒZ¢äg¸F`ì5A“9cŠü€$(õÀä?,¡ü Ǽò+tž<$h²Ú˜$? QŠ€TŸa”±íàSÒDÀ4ùÉP¼ ’ü Ù#`¢ü€„Ü#pw²Y9G玊ò3d@jô€‘ò’pŽÀÑh÷%Û‹€Êò3d‹ÀºÑAl=¼ÏHù‰P–â$ÿ{£ ø¼ò3d‰ÀºÑA\xø7–í¦ÈH€"¸Ëc,¯ÜQÑ ùQ“# £ü Q ùO£Œ5&F@gù]‘îŒçÐ '$ÿr”2†EàÊhÁ²¦[LŸqN¤„ÛcóÜ#@ò[QΖ€Ç ¸Jã˜$?#)s€ü³±&<Óv‘ò €±SÓ˜(?ƒWœäßß¶s±d]÷«jZRA·˜,?#è¸É?M44¯ê¨eH t‰Éš "@ò»£†.¨,¢Øì ù—ÐhH~oÈm†T@QÜ—lÇëQëëPSåg¸E 5:XóçH~ïÈiE¨&ÿQ’ß§l=ü¬«ŠÉ﹌U"@ò{Ç.pá’üþ‘Æ€‘=$¿Ü"°õ•_’üu eçìIv`2"æNò×SR5>_äwGÛö8M`OòÌÐ#à$ÿ$¿'œ"°’ßZ°Àh$jœä¿*Z ù}à|4Aò{Dûâ#à&ÿΘu6§$K´å&L¥F’ŸŽ§`ÝÜ S©…1ÂÉÏŸT¤Œ;bó8‹"PFXŒÀÕ!D€ä³*Ï(þ1.pm¬€Ô0¨üáÓA¨ #;¢|"@ò‹ƒ"àc’_< ¸üò@ðŽñÀd$Š=É’_"(Þ T¨7‹òŸ‰ã5ÞuFò‹Å-ëgGL%€%ø“4·ü É/NØœ=† ³#¦’ @^#@ò«ƒSz²ÇŽ n8^ù/ɯÚPlpŠÀ?7­%ù„"`Åú(&ÞdGå-Ãß/.?Àgw%úÏKqü¼D¥²S°¹ðº'{pdE*Ìq„BVì"P‹Yº¢_yL‹½ðÀÑ´Úþ»Oè†I/(.L!‚[š0Aÿº…) —0ù”½u2½ª1jªìüv6#ù×Û™ðr€`ƒ‹üÿàϪ7¾4_À©VtÄ)²òÄÔ\MùS-MHF£š™[¶]÷Ð#µ.òß”èÿ €ÏT/ŒŠØ52±…÷ ÿ<15‡{Ʋ–í©–&|}û¸kûèZÙbY×ùå  òÿ=dúïE@ÜäïhJbu"n\(Kð*?ƒ" ^äg˜ @¿ò3(rãG~†I +GpÓB³où9©G~†)0>cå¾RlÆH¹æy~Wù¹øñälÝò3Ü"pÞÌp ³ŠÄè0ùG”ŸAƒ½³xh|ƲÝü §lœFwöXC³ŠÆØ-?ƒ" –½³xäT0ò3œ"Ð=;ªtŒ /ùn8IàùºFÀ¸ð–Ÿá/?…‘B1ˆÝxÊÏÐ1FÀEþ/%?Ã.ãÅv OP" ùºEÀ˜¸Èÿ™Ì@ÿ7yì—"À;ùÏni\~†N0"ä¿›çþ)|°“¿ke ¾yÉ.ò3t‰€ö-?ƒ",Nòßµý¬Nð¿Ð•Eà\…# ud‘ŸAäg¬NÄñ‹· gÕJËš Ð6²ÉϨì÷ËÎR¼!“üŒñn¿h³’Ð2²ÊÏÈ ô? `'(¾Q~†ªÐ.²ËÏÈ ô?Š€gd–Ÿ¡b´ €*ò3(ÞPA~†jÐ&'“ŸApF%ù*E@‹Œ”#¸YAùÚüHAùªD@ùŒTþåWT~E`9ŒÏàûŠÊÏp‹ÀùÙ£¦ZŽÒÐE~E`‘Ægð“ÉYËv•äg8EàÜÙ7Ð3=$`ªÓ(Ýäg˜äg8E`ÃÜI¡P2ºÊÏpŠÀÍÃòð­6*¢£ü Y# \t—ŸaSž<2©]t–Ÿ!c” €ƒü%ŸÔE~†]¦5‹€ ò3d‹€2p‘gf €±¸£{ìäß´j¥vò3dŠ€ð ÿ#Æ ]#`'Ϫ•¸ã¢ÍZÊÏ%ÒÀtùºEÀIþÛ/ÚŒñ˜€©Â…E`[ë*ËZX:$ÿr*Þk–nW-$ÿiVÄc¸u[°H’¿6™þØE#@ò[iŠF…E@ÊüÎdúƒ‚ ùíé@ò{Cµüî¸E€R€ä÷‡* ù½ãH€¡r”ä¯Ù#@òû'ÌH€¡r·,4‘üu"cÊîÏ’üuV„€É? ’¿dŠ@ÀwNfñøäœeä÷އlK÷öÕ¼(Æ+B@ò‹ `ò?9MòK®pOº·¯î¿Pa ùùà×8F€äçƒK>àÁz# $$?_œ"°kxs…Ú?Ø$?_\"p-êŒ@è ùÃÁ.s¥2n™ 4$8ðˆ@¨p¿àÃ$°„’?\‚Ž@hp‘Gf ÿѰf1 žp’[ë*ܹý’ŸAF ”xÿ±0æ0p“ÿÖm=hŽ ?ˬ-,·­®µì9ÜC$¿/ò7EI~Þ°üQGk­eOàú["ùå¢ò÷ý~ËÌõ’_.â‘nÚz~Ýàö›"ùå$3Ðÿ W¢ŽürÒH¸ü¶H~¹É ôgà3$¿ÜÔ.¿1’_~üD€äWƒz"Àå·Fò«—üjá7 Ÿ¤íîÚx9€ËnBòKÌkC‡_ëîÚø_> Á¶/”™åðŸÙyËÏ‘üòDpigÏÌáøœåww€MÝ]ÿíµ¡Ãµ¿_ËéÞ¾¯¸Õf™äW„to_ÀãZÜn›ŒFqM×:4Ñy~©)”Êxth³Åš_(û=;y~óɯ™þLº·ïJxˆ@¾TÂ#¿?Î`/®0DÂK5¶‘ü bwL€Ð–O€—«þŸäWŠ€QŒ€Ø `Àë®"ùÕ¦÷xUô,7Žø¨è!‚Èÿµ†üù·öIEND®B`‚(@€ BLDOÿxrvÿVP[ÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿH@GÿH@MÿG?EÿmfoÿUNYÿLEZÿLGmÿKDUÿqrÔÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿtuÞÿa^œÿG?FÿH@MÿBBŸÿF?LÿmfoÿQJUÿJD`ÿZ]ãÿ[_êÿLGoÿNH`ÿwxæÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿfcªÿH@GÿH@Mÿ@CÄÿ?CËÿF?LÿmfoÿQJUÿJD`ÿZ]ãÿ\`ñÿ\`ñÿ[_êÿLGoÿNH`ÿwxæÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿfcªÿH@GÿH@Mÿ@CÄÿ=Dïÿ?CËÿF?LÿjdmÿQJUÿJD`ÿZ]ãÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ[_êÿLGoÿNH`ÿvwãÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿfcªÿH@GÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ?CÑÿF?Oÿb[fÿQJUÿJD`ÿZ]ãÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ[_êÿMIxÿLEZÿuváÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿfcªÿG?EÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿb[fÿNFRÿKEfÿ[^çÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\_íÿMIxÿLEZÿuváÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿc`¡ÿH@Gÿ_J#ÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿb[fÿNFRÿKEfÿ[^çÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\_íÿMIxÿLEZÿuváÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿc`¡ÿH@GÿlOÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿb[fÿNFRÿKFhÿ[^çÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\_íÿMIxÿLEZÿtuÞÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿc`¡ÿI@FÿlOÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Tÿ[T_ÿMEQÿKFhÿ[^çÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\_íÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿa^œÿI@FÿlOÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[T_ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[S^ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[S^ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿqrÔÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿUNYÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿPM‹ÿJBQÿqrÔÿ]ZÿIAGÿnPÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿG?FÿF@HÿPM‹ÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿHANÿH@GÿIAGÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿG?FÿF@HÿDBŠÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿF?OÿH@GÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@Yÿ?=mÿ08ºÿF?TÿD@tÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDBŠÿI@FÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ?=oÿ-7Êÿ-7Ìÿ/8ÀÿC>ZÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿH@GÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>ZÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿI@FÿrR ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>[ÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿG?EÿOC<ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>[ÿD@mÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿIAGÿœq ÿ`M3ÿQD:ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Tÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿDAyÿMCDÿœq ÿ©xÿ¥vÿ`M3ÿQD:ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿDAyÿODEÿœq ÿ©xÿ©xÿ©xÿ¥vÿ`M3ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿD@tÿODEÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dáÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿD@tÿPDDÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ?CËÿF?Lÿ<<|ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?_ÿ>Dáÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DèÿD@tÿQFAÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ?CËÿF?Lÿ;;ƒÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?_ÿ>Dáÿ=Dïÿ=Dïÿ=DèÿD@mÿRFCÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿMB?ÿrR ÿyUÿyUÿyUÿyUÿlOÿJACÿH@MÿBBŸÿF?Lÿ;;ƒÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?^ÿ>Dáÿ=DèÿD@mÿRFCÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿyUÿyUÿlOÿJACÿH@MÿG?Eÿ>[ÿE?^ÿD@mÿTGAÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿyUÿlOÿJACÿG@KÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿTGAÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿlOÿJACÿF@HÿG?Fÿ;8eÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ(-™ÿBHÿ:7jÿ%+¡ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ&,žÿA;WÿUG=ÿœq ÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿjS-ÿH?DÿJACÿF@Hÿ%&kÿxÿ!$pÿC:]ÿ&,žÿ$+¢ÿ$+¢ÿ$+¢ÿ(-™ÿD=Pÿt]5ÿë«ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿhT8ÿcP7ÿÊÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ€b)ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:Oÿ>:]ÿ&,žÿ$+¢ÿ*/“ÿF?Oÿw_4ÿë«ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿhT8ÿcP7ÿÊÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿÒš ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:Nÿ>:]ÿ*/“ÿF?Lÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿmX5ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:NÿG?Eÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ„h-ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿГÿqY0ÿYK=ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ„h-ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿu]2ÿXI<ÿÀ‰ ÿqY0ÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>HÿOECÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿI@DÿI@Dÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>HÿIAEÿOECÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿr8ÿJACÿG?Eÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿ$%mÿE>Hÿ’{JÿÔ­LÿRHEÿr8ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ[RRÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿ$%mÿE>Hÿ’{JÿõÈNÿõÈNÿÙ±MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿ$%mÿG?Fÿ’{JÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿ$%mÿH@Gÿ’{JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿ&'kÿG?Fÿ‚JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿSIIÿ`WWÿUI?ÿÕ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿ&'kÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿß¶Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿTJJÿg]]ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿ&'kÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿTJJÿh_^ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿH@Gÿ/.`ÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿè²(ÿiX?ÿTJJÿg_`ÿQFAÿÒš ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@HÿG?Eÿ¨‹JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿìµ'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿå°)ÿbR@ÿVLLÿg_`ÿQFAÿΘÿï®ÿï®ÿÄ’ÿOECÿI@Fÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿäºMÿbTEÿq]=ÿìµ'ÿóº&ÿóº&ÿóº&ÿóº&ÿå°)ÿbR@ÿWMMÿphiÿNCBÿË–ÿï®ÿÄ’ÿOECÿIAEÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿç¼MÿbTEÿq]=ÿìµ'ÿóº&ÿóº&ÿå°)ÿbR@ÿWMMÿphiÿNCBÿË–ÿÄ’ÿOECÿIAEÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿç¼MÿbTEÿq]=ÿìµ'ÿå°)ÿbR@ÿWMMÿphiÿNCBÿ z ÿOECÿI@Fÿ‚Jÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶MÿÔ­LÿWKEÿq]=ÿ\NAÿ[RRÿphiÿG?EÿOECÿIAGÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?Eÿ[RRÿxrvÿQGHÿÿÿÿÿÿÿÿÿóÿÿÿ€ñÿÿÿðÿÿþðÿüð?ÿøðÿððÿàðÿÀðÿ€ðÿðþð|ð8ððððððððððððððððððððððððððððððððððððððð>ððÿ€ðÿÀðÿàðÿððÿøðÿüà?ÿþÀÿÿ€ÿÿÿÿÿÿÏ(0` €%G?JÿG?I­G@H†HAMÿH@JÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿIAJÿH@HÿF?NÿF?TÿG?I­G@H†IBTÿUVºÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCPÿG?E„F?Pÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCPÿG?E„F?Pÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿG?E„F?Pÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿI@CÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?HØIBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿZV†ÿJCOÿfLÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿBA›ÿF?NÿH@LÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHARÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ5:¡ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?OÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?OÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?Oÿ[H)ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@OÿrX&ÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿJ@@ÿF?PÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿJ@@ÿG?JÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿDAƒÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿJ@@ÿE>PÿE?MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>Pÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿJ@@ÿE>GÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿJ@@ÿD=Hÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿI@CÿD=Hÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>JÿNCBÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿRF?ÿD=Hÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿx^1ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿMCCÿD=Hÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿRF@ÿD=Hÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ34yÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ0._ÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿ$%mÿE=Hÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿ$%mÿE=Hÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¦yÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿ$%mÿE>HÿODCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿOECÿPEAÿœw"ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿ$%mÿE=HÿzfGÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJADØUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿRF@ÿE>GÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿRF@ÿG?E„H@Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿRF@ÿG?E„RHFÿЪLÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿRF@ÿG?E„RHFÿЪLÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿ¼“0ÿVJBÿJAD†KBC­UI?ÿPEAÿJBEÿLCEÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿLCDÿOEDÿJAD†KBC­LBCÿçÿÿãÿþáÿüàÿøàðà?ààÀà€ààààààààààààààààààààààààààààààà@àààðàøàüàþÀÿ€?ÿ‡ÿÇÿÿçnsis-3.11/Contrib/Graphics/Icons/nsis1-install.ico000077500000000000000000000020661477201124000220270ustar00rootroot00000000000000(& èN( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxðxðxðxðxðxðxðxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆwz wx÷ˆwwz«°‡wˆw€wwz»îûûûû‡÷wz¾çˆˆˆˆ€wwú¾wpwwøçwpww ðwwp‡wwwwwwwxwªèwwp‡wwwwwwwxz®ë÷÷wp‡wwwwwwwwŠî»ww‡wwwwŽî»ww÷‡wwwwwwwwxë»wwpÿÿÿÿÿÿÿÿÿˆ»wx€ˆˆˆˆˆˆˆˆˆ‡ˆˆ€ˆx€‡wwwwwwwx‡€ÿÿÿÿÿÿÿx€ˆ€‘ˆˆˆˆˆˆx€‘€x€ ‘€x€™€x€ ™€x€ ™‘€x€™‘€x€™™€x€€x€ˆˆˆˆˆˆx€wwwwwwwx€ÿÿÿÿÿÿÿø€‡wwwwww€ˆˆˆˆˆˆˆ€ÿÿü?ð€àÀÀàÀð€ÿÿ€€€À<À<ÀxÀøÀðÀ!ÀÀÀÀÀÀÿÀÿÀÿàÿðÿøÿnsis-3.11/Contrib/Graphics/Icons/nsis1-uninstall.ico000077500000000000000000000020661477201124000223720ustar00rootroot00000000000000(& èN( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwˆwwˆ€wwwˆ€wwwwˆ€wwwwˆ€wwwwˆˆwwwwˆˆ‡wwwÿøˆ‡wwÿ‡ˆ‡wÿˆ‡wÿ‡ÿ€ˆwwðˆ€ˆwðø€‡ÿðøÿÿÿÿüÿÿðÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿÿ( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€wwwwwwwxˆˆ€‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆ‡wwwwwwwxˆˆˆwwwwwwwÿˆˆˆ€wwwwwwøˆÿˆˆ€wwwwwø‡wˆÿˆ€wwwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/nsis3-install-alt.ico000077500000000000000000000314671477201124000226160ustar00rootroot00000000000000 èf(N v00¨ ¨'%hÏ-( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌüÏÌÌÌÌÌÌÌÌÌÌÌÌÌÏüÏüÌÌÌÌÌÌÌÌÌÌÌÌÿüÏÿÌÌÌÌÌÌÌÌÌÌÌÏÿüÏÿüÌÌÌÌÌÌÌÌÌÌÿÿüÏÿÿÌÌÌÌÌÌÌÌÌÌÿÿüÏÿÿÌÌÌÌÌÌÌÌÌüÏÿüÏÿüÏÌÌÌÌÌÌÌÏÿÌÿüÏÿÌÿüÌÌÌÌÌÌÿÿüÏüÏüÏÿÿÌÌÌÌÌÏÿÿÿÌüÏÌÿÿÿüÌÌÌÌÿÿÿÿüÌÌÏÿÿÿÿÌÌÌÏÿÿÿÿÿÌÌÿÿÿÿÿüÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÏÿÿÌÌÿÿüÌÌÌÌÌÌÌÌÏÿüÌÌÏÿüÌÌÌÌÌÌÌÌÏÿÌüÏÌÿüÌÌÌÌÌÌÌÌÏüÏüÏüÏüÌÌÌÌÌÌÌÌÏÌÿüÏÿÌüÌÌÌÌÌÌÌÌÌÏÿüÏÿüÌÌÌÌÌÌÌÌÌÌÿÿüÏÿÿÌÌÌÌÌÌÌÌÌÌÿÿüÏÿÿÌÌÌÌÌÌÌÌÌÌÏÿüÏÿüÌÌÌÌÌÌÌÌÌÏÌÿüÏÿÌüÌÌÌÌÌÌÌÌÏüÏüÏüÏüÌÌÌÌÌÌÌÌÏÿÌüÏÌÿüÌÌÌÌÌÌÌÌÏÿüÌÌÏÿüÌÌÌÌÌÌÌÌÏÿÿÌÌÿÿüÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÏüÌÌÌÌÌÌÿÿÌÌÌÌÌÏÿÿüÌÌÌÌüÿÿÏÌÌÌÏÿÏüÿüÌÌÿÿüÏÿÿÌÌÌÌÌÌÌÌÌÌÌÏüÏüÌÌÌÌÏÏüüÌÌÌÌÌÿÿÌÌÌÌÌÏÏüüÌÌÌÌÏüÏüÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̉PNG  IHDR\r¨fÐIDATxœíÝolÔõÇñG¯Wþ”öZ;asìçѸiš±Ù9©C#þy°5 ÌdIÍžì)|2ÈÌGvY²áL5Ùü1S¤:JÆB”,š6« u©Yiï®…£´½–sŽoýöǵÜýþ}ÿ}^ üìñy{½^¿¿nzá³/@DNJ¨¾"R‡ r@ä0€Èa ‘Ã"‡1DcˆÆ9Œ r@ä0€Èa ‘ÃêT_€ŽÒÉ~½m­êˈ̟O_ÂÙÂü¢ŸkJ%ð«oÛûßü‡¡F§¯¨¾ í0$À“·¦U_F$ºOM\3~ÈÏ–0-¢g{³‚«ŠÞ_þ;ÅTÀOÒ}j½§/Þ½~á矹³pøÌetÈ)¹6Rƒp„wü›×,ü³]7¯Ä‹÷¶`\Ã8`¹ñ E`o6Ök$5ËÉãn{sÅñ rúÎM3`,æÿÛV]÷×0na,ågü#àÀBOàü‚ˆ@:™`,ÆX¦ëD/ ¿Ð±¡‡:2Œ€Å‹tÈáð™Ë‚_hoK1c,ÅøoëG¡X í÷'u Èãÿý÷ÿ Gàäè öÏ1` 'ÿÅ{[°ûëá_`ìÃÌ;þŽ ‘ÿ™Œ€]C©¿À؃0ÐÞþ¬²ñ ím)¼|_ #`8À0{û³è;7 @Ýø…­™zFÀp €At¿àÀÏû³Œ€ACè8~AŽÀçgñÄ{|Ÿ€)ˆñ§“ ¼²£U«ñ r²EFÀ €æäñêÈ ½-¥ú’–ʇИIã³0*Kè @D8þx1bjÃñLj#PÞ„E  M©ÞÜÅ;Ö,…7aQ‡ˆI¥›U|œg8~µ€y#ðÈÑ1 f‹ª/Kyü›×%9~€˜É(Ì•ðø»ãNF@ÿ–Æ$^ßůó«À(àz¼ãmg+šRü«¨?ꊸO ¿Nø‘Wȵ OÎá'GÎsüáG_1ö¶«#0<9‡GûÊ÷YäøõÁG@éúÝÓlm8~}ñQÐD¥œU}Yqüzã#¡oöõgŽ€<þm™z¼¹‹ã×  ÍØïøÿú£¤ëù×M7|D4dz8~sðQÑ”©ø8Ïñ›„ŒÆD~¸q¥ÌñÈQŽß$|t4—®O ÷‡ìøªÞÌñø»ã(Ìqü&á#dˆç;G ÿóÕ—´€ã7%ƒÈøÙßǵˆ€<þ»nLqü†á#eÊ# ¿½­/td8~ÃðÑ2ðŽÿÐ=Í¿øˆJe8~{ðQ3˜Šœåø-ÂGÎpÏwdðЦU¢ÀÉÑYìëÏrüá£gžíÍ‹"ðÎgÓ¡ÿ¿øZBŽÀ/ŽgñƙˡýÞ¿½x «Ez¶7Ÿ¹Œ§Nä_‚_òøw|u%žïȾNÒ3nù™ÀS'rž püöc,F8~70– þÏg8~G0ëÙÞŒŸnY úô>ƒŸý}œãw`¹ßÞµ·T1~¿#üîâô~r隇ãw¿ 舃ß]è=} ÝïO,úgïœÆ3ÿš<´iÕ—É~|àù™€Žß]|PÁ\ øã ª/#ßHסmå ŒN_YôóM©¶eê­ýï¾0[R} Zºá¦>ûBõE‘¾ŸÜœ®Ã-É0¯…b2˜-V|pgkJÑQŸæ1<9çë×ú@~¦„}·¦ÑÞÆ¿4&yãÌeô»ö»ó³%ü`c:7¯QpUä—¸ ‹_¾_Ôùˆjªì 雄’¾IHü¸ûý‰Š_"$= f‹Øsõ> ~ú*#`yü?ݲfÑ«ýÝw¬C×·Ö–üþz†.*¹Fªž8–-ðÅÍÀ_dô'¿ó–5øí]ë¯ùwößþe|xИ|&cP¡¼€Зwüâ A•0ú sü@ˆobôSËøF@_aù€:Þ¶ÊU½Ÿ\ªyü# Ÿ(ÆDðV`n[åªÞO¾|¿­ãöß¾ûïX€P-ªñ~/# Fãºn[Ë(åøˆ¿ˆˆW˜ã¼xvðBàß“ª#ß„%*‘7 #yü]ßZÊø9¿¸ˆ1Q“ÏdŒR,ßÌDË;þý·¯ ýÏ#ÐóoF Jqˆñ<F qŒ_`¢çø˜‰ê¶U®úã ±_`¢÷ø'…}Û*Wõ ]\8É'®ñ ]·­Å3w6–¯ƒ…ŠñŠŽ zÇ×õ ]ÄË£‹{ü“·¦qðîò Œ@0ÿüߌ’ñ  ëÞu®Ñaü‚8; ûý ôü»ü•×c"ù4f”ž ÈÔFÿþ;Ö¡ë¶µŠ¯èÚæJ¡~ ÒfªÇhp*0?¨ŽŽã:7¯Yøt ÷ô%tŸš¸Î¯ Æh€¸Ç/0ÕÓeü€FÇ‚óÓÊž¼€ß \ýüZÓñ ò§½§ËG‹ñÓÅt? É3a©ÛV¹êÀGæŒ_à3¥é6~@³<˜R8ðÑ…/_Y7düBçæ5xîꙃŒ@™Žã4 À˜<~ááM««Þ8sYËñ½àµðm­ŽS/ÿ™;ñä­iÅWäŸx=ç©9ôž¾„Ò¨x ©ÍäcÙt¤å3ÁµgòøÞ½Þèñ ò3—†/¡Kã1„M÷ñšp'ÞñÛôÌGŽÀá3—ˆ€ ã `l¿àRL?`H{ïXÓ}jÂúñ .DÀ¤ñ°ï`ÊîSÒf,¿ðð¦UxñÞöEÀ´ñ†°'.Ž_èØÐ`]L?``ó#àòø›" ß„Å4F07òøŸÛÞìäøoöög_Qíä3Mdló"à?¿ñiqúÎMÓÇÀœpüK316Œ° €þw¬éºúVX€ã_ŠI°eü€%ô½cM׉_=ì„ã_žˆ@:™Ð66°(€~§ÓrüµëØÐ€C-#`ÛøËèŽß¿ö¶”vèºhÝø ¨€<þ?Ý“áø}ðF óX…büçæ‹Ïd´•ÔE@ÿ‹÷¶`××VÆ~ ¶#pldûŽçb€Íã,¼ãïØÐÛŸm+9'Ggb€íã,_~ùŽ?**"àÂø”#å™t{û³øÛ§”⌀+ã ÝÁ”{û³è;W¾å9Ç­ö¶^¾¯%Ò¸4~À¡áG€ãßÖL}dxvð‚Sã ^ÄøÓÉdz(" ß„Å%Îyü‡:2¿Þ<ñÞ¸ïÈg2ºÆÉþ#à{[*‚«£jÈÈ}EÀåñ¨=¿~‚DÀõñŽ(Gàé–@¡XÂc}㿦DšRÕG€ã/s>Àòw¬)KØw<‡“£3¿Æ¶fêñÚÎV47\?ÿ—€«*LÉñ›eKc¯îX>¿ùp’ã—09¿™–‹@÷© ü~¨ ø õ¢íÝUïçŸ.-ŒÿåûZ°5S¯øÊ¨Z"öa [Äž¾qlk©ÇKÃöÞ^Î/ Žß\r†òE 勪/IKü`ß¹1ÅñlKcßû ߤµ`ÇFô8ŽŠüé>5±ðlŽ*c®C—3é¨6ò}hi @³<ýÇ_- JŒ€ºNäøj €0z“Ïd¤ê05bôÄñûÃøÀè…ã÷ðIõÍ*¨Œã†@ÕÍ*¨ŒãŽ(î›UPÇ Œ@¼öög9þ0!aâ!ÅNÁ1!b¢Åñ‡# Ž? @pqüÑa"ôfTÆñG‹ˆß›UPÇ= bŒ@í Å:qüq`bÀTOœÆ|l„ãFàú䣨) @Œ¥qüj01c®Åñ«Ã(0-b÷;cÈÏ2¿Z €"ÓsØsÔípüê1 ¹Ž_ €b.F P,á‰÷Æ9~ 0p)büYÞ«O €&\ˆÇ¯@#6G€ã× ‘©yÕ—Ž__ €††'çðX߸àøõÆhêlaÞøpüúc4frò³¿ Í™ül {ŽŽqü` `RÄø‡'çT_ U0„ àøÍÃDçpüfb s¶0Ýoëõ>Žß\ €F§¯hŽßl €¡tˆ@n†ã7`0•™šÇƒGÎsü†c §"#Så#ÏÔ BÁ0ˆ3¿]KÄŽß> €ED¢ø¼œã·`™Ñé+x´/Üpüöb,”›)…Žßn €¥ÂˆÇo?ÀbA"02U~Ë1Ço7Àr~" Æ?:}%Â+#0¨%¿[Gˆ|œ_:¿{‡äfJxäè+ÕÅñ»‰pLa®„Çß_39~WÝpÓ Ÿ}¡ú"(~éd…¹Ò5?&·ð€£äÁsüîbˆÆ9Œ r@ä0€Èa ‘Ã"‡1DcˆÆ9Œ r@ä0€ÈaÿR,awpbuIEND®B`‚(0` â â¡ã¤#ä¥'ä¦)ä§,ä¨-åª3æ¬7æ­:ç¯>ç°Aé·Qê¹Wê¹Xë¼^ë½`ì¿eìÁjíÃoíÃpîÈxïÊ}ïËðÍ…ñÐñÒñÓ”òÔ”òÖœóÙ¡õÝ­õà²öá¶÷ä¾øèÇùëÏúïØûñÜûòàüôæüöéýøíþýûÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ((ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( ÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿ( ÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿ( ÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿ( ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ """"""""""""""""""  """""""""""""""""""ÿÿÿÿÿÿÿ&&ÿÿÿÿÿÿÿ$"ÿÿÿÿÿÿ&&ÿÿÿÿÿÿ$"ÿÿÿÿÿ&ÿÿ&ÿÿÿÿÿ$"ÿÿÿÿ&ÿÿÿÿ%ÿÿÿÿ$"ÿÿÿ&ÿÿÿÿÿÿ%ÿÿÿ$"ÿÿ&ÿÿÿÿÿÿÿÿ%ÿÿ$"ÿ&ÿÿÿÿÿÿÿÿÿÿ%ÿ$"%ÿÿÿÿÿÿÿÿÿÿÿÿ%$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ (ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ " (ÿÿÿÿÿÿÿÿÿÿÿÿ+ #"ÿ (ÿÿÿÿÿÿÿÿÿÿ* ÿ$"ÿÿ (ÿÿÿÿÿÿÿÿ( ÿÿ$"ÿÿÿ (ÿÿÿÿÿÿ( ÿÿÿ$"ÿÿÿÿ (ÿÿÿÿ( ÿÿÿÿ$"ÿÿÿÿÿ(ÿÿ( ÿÿÿÿÿ$"ÿÿÿÿÿÿ(( ÿÿÿÿÿÿ$"ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ$""""""""  """"""""( @ÿd=ÿiDÿlHÿrOÿtQÿ^â ã£"ã¤#ã¤%ä¥'å©/åª1æ«6æ¬7æ­:æ®<ç°Aç±Dè´KèµLé¶Pê¸Sê¸UêºYë¼_ÿ…gÿŒoÿ“wÿ“xë½`îÈxÿ£Œÿ«–ÿ¬˜ÿ²žÿ¶¤ÿ¼«ïÌ„ðÍ…ðωðÐñÒñÓ”òÕ™òÖœóØ ôÜ©ÿŶöâ·öã¹÷ä¼ÿÏÂÿÐÄúîÕÿãÛÿ÷ôýúòþúöþü÷ÿúøþýûÿÿÿ..:00::ÿ00ÿ::ÿÿ00ÿÿ::ÿÿÿ00ÿÿÿ::ÿÿÿÿ00ÿÿÿÿ: *ÿÿÿÿÿ00ÿÿÿÿÿ* : ,ÿÿÿÿ00ÿÿÿÿ, ::ÿÿ ,ÿÿÿ00ÿÿÿ, ÿÿ::ÿÿÿÿ (ÿÿ00ÿÿ, ÿÿÿÿÿ:ÿÿÿÿÿÿ((ÿ00ÿ, ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ((00* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( ÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿ((ÿÿÿÿÿ ÿÿÿÿ((00((ÿÿÿÿ ÿÿÿ((ÿ00ÿ( ÿÿÿ ÿÿ((ÿÿ00ÿÿ* ÿÿ ÿ'(ÿÿÿ00ÿÿÿ, ÿ (ÿÿÿÿ00ÿÿÿÿ, )ÿÿÿÿÿ00ÿÿÿÿÿ*:ÿÿÿÿ00ÿÿÿÿ: 3:ÿÿÿ00ÿÿÿ:2 ÿ3:ÿÿ00ÿÿ:3ÿ ÿÿ3:ÿ00ÿ:3ÿÿ ÿÿÿ3:00:3ÿÿÿ ÿÿÿÿ3./3ÿÿÿÿ 77777.*77777( â¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/nsis3-install.ico000077500000000000000000000266611477201124000220400ustar00rootroot00000000000000 èf(Nƒ v00¨ù ¨¡hI(( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÏÿÿÿÿüÌÌÌÌÌÏÿÿÿÿÏÿÿÿÿÏÌÌÌÌÌÌÿÿÿÿÏÿÿÿüÿÌÌÌÌÌÌÏÿÿÿÏÿÿÿÏÿÌÌÌÌÌÌÌÿÿÿÏÿÿüÿÿÌÌÌÌÌÌÌÏÿÿÏÿÿÏÿÿÌÌÌÌÌÌÌüÿÿÏÿüÿÿÿÌÌÌÌÌÌÏÿÏÿÏÿÏÿÿÿÌÌÌÌÌÌÿÿüÿÏüÿÿÿÿÌÌÌÌÌÏÿÿÿÏÏÏÿÿÿÿÌÌÌÌÌÿÿÿÿüÌÿÿÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌüÿÿÿÿüÌÿÿÿÿÿÌÌÌÏüÿÿÿÿÏÏÏÿÿÿÿÌÌÌÿüÿÿÿüÿÏüÿÿÿÿÌÌÏÿüÿÿÿÏÿÏÿÏÿÿÿÌÌÿÿüÿÿüÿÿÏÿüÿÿÿÌÌÏÿüÿÿÏÿÿÏÿÿÏÿÿÌÌÌÿüÿüÿÿÿÏÿüÌÿÿÌÌÌÏüÿÏÿÿÿÏÿÌÌÏÿÌÌÌÌüüÿÿÿÿÏüÌÌÌÿÌÌÌÌÌÏÿÿÿÿÏÌÌÌÌÏÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÏÿÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿüÌÌÌÌÌÌÌÌÌÌÌÌÏÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿüÌÌÌÌÌÌÌÌÌÌÌÌÌÌÏÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌÌÌÌÌÌÌÏÿüÿÿÌÌÌÌÿüÿüüÌÌÌÏüÿÏüÌÌÌüüüÿüÌÌÏÿÌÏÿüÌÌÌÌÌÌÌÌÌÌÿÿÌÏÿüÌüÿüüüÿüÏüÿÏüÿÏüÌüüÿüüÌüÌÌÏÿüÌÌÌÌÌÌÌÌÌÌÌÌÌÏÿÌÌÌÌÌÌÌüÌÌÌÌÌÌÌÌÌÌÌ̉PNG  IHDR\r¨f JIDATxœíÝË‹ÞWÇñï\2#c3¡c3ñ ZB(Ù7v%¥ A ºs[ˆúìBºv-X¸º©K¯Ð…‹ª,h]…P1¦&¦<¶q’ô‰‹ä$3OžËïrÎ÷|Ï÷û~­Ú„„_OÎçÝÌ홵ýËWï €Ök?€z#@`Œ 0F€À#@`Œ4bo›?*äÇ­jÀ¥ó'ä7_;#Ÿ>¾YûQà 0îÒùòígvåÌΆ¼þüi"€¬€aiü @nÀ¨Ùñ'D9ƒ?!È…³jü @À®ãOˆÆ"FôB00`èø"€¡@ecÇŸ A*Ê5þ„ /PIîñ'D}€ J?!èŠ(+=þ„   Hkü À*@‰öø"€e€‚ZãOˆ!…ÕB0(ÈÊø"€Y kãOˆ#XB€Ì¬?!!Yµ2þ„€dÒÚø"È Õñ'D .0RëãOˆ@L`/ãOˆ@<` oãOˆ@,`¯ãOˆ@ 'ïãOˆ@  ‡(ãOˆ€ £hãOˆ€o ƒ¨ãOˆ€_`…èãOˆ€O` Æð‡,Àøç#¾€9ÿrDÀ0ƒñwC| ‡0þ~ˆ@ûÀCŒ"Ð6 Œ,"Юð`üy6…ãÏ‹´'ìŸÔþΆ\¿=•—ߺUûQÜùÒÞ–\™Ü«ýè`mÿòÕûµ@aÿ°·½.§w6j?†ïL³þ~ÿü𣬿Ê€»S‘|yOÎܪý(îLîLå ?ù‡ˆˆ¼ráiyõí oæ€ûÿoüغ?¶.“»SùÆ/ß“?ÿûNå'ómŸw ·?âo²!péü yá3;""òÔ±5ùéWOE|t œÃw{÷˜÷¡¾s'·ˆ€2"_Žc»À²"úˆ@>¹>‡ÅmºÐGÆËù l.Ð瀈€>"0\îÏ^u€!DôþJ|꺫Œ9 " tWêëVÜ ëmo¬-ü9" ¬Vò‹Ö\ Ï}lsqDˆ@ D`±Ò_±Ú|JÐGž¤ñåêM ä}Dà1­×ªh6Dôݪi2šDôEŽ€ö«T5€/ãEôEŒ@»ÝTj¾†Ð)µîv3°ðžD@_„Ô¼ÛMÀÂø" Ïsjßmó¨}@ó}#`án›€…Z„èó+wÛl¬Ð2D@Ÿ‡XºÛ&`é€V!úZŽ€µ»m.Ö¨ " ¯ÅX¼Û¦`ñ€º"úZŠ€Õ»m&V¨" ¯…X¾Û&`ù€ú"ú,GÀúÝ®ë4Ðg1-Üíªhဆ"ú,E •»]-­ÐD@Ÿ…´t·« ¥‹è«Öî¶zZ; ˆ€¾hñn« ÅÊ…èÓŒ@«w[-­PND@ŸFZ¾Û*hù€r#úJF õ»]<­P D@_‰x¸ÛEàá€J!úrFÀËÝ./TЗ#žîv‘x: Òˆ€¾1ðv·³ÀÛi ú†DÀãÝΤ…èë¯w;[¼&" ¯K<ßí,ð|@Úˆ€¾eð~·GÀûÕ@ôÙÙ=wòÈE¸Û£á€j!ºnLå;¿½ñèߣÜíÁØÛ^—?ûñœÏ‚D@Ç̓©¼ø‹ëò·ÿÜ‘8〛Sùúϯ˵?Êù<˜AÊŠ<~‘‘o\™Ü# ˆ@ÑÇ/’á€D@È‹ñ?åÀD@ȃñ?–툀"0ã?*ë§D`Æÿ¤ì_ Dt~ÿ|E¾˜è Ý0þÅŠ½ ÐA–cüË}I0" ƒÌÇøW+þ¢ D@8Šñw£ò²àD@x€ñw§öAˆ€Žè`üý¨~k0" #jêß”èˆÆ?L•oNtD‰ã®JDˆ€ï`üãT €Ðâ5Œ¼ª!Z¼E€ñçQ="D@‹—0þ|L@„hi=Œ?/3!ZZãÏÏTDˆ€–Ö"ÀøË0" ¥•0þrL@„h±Æ_–Ùˆ-V#ÀøË3" ÅZ¿ó!Z¬D€ñëi""D@Kí0~]Í@d\v·šúO­ªV¿¾æVÁßthG€ñ×Ñ\Dˆ€­0þzš €ÐR:Œ¿®f B´”Šã¯¯éˆ-¹#Àømh>"D@K®0~;\@„hÆo‹›ˆ-C#Àøíq" ¥o¿Mî B´tã·ËeDˆ€–yøã¡Üüã·ÌmDˆ€–Ù¼ôÆG?÷ý?Übü†mÖ~€ÒR.|rûÑMîL+>‘OŸÛÝ”>÷ yé2¹ûø|Ó?_<»+ßúüSœ½1kû—¯Þ¯ýêpý&€åÜ¿ 0Ï+ž–ýÚáÎäÎT¾÷»[GÞH.žÝ•gOmUx*ÿ^{çùõ»·ýÚxõ퉼þüi9C²™Ü™Ê7õÞÜñ‹ˆüø¯ÿ•>uJÎ$¹½yí@äÝa¿6ä›|t ¯4þ?=üðßųßÓñìnõ×Äb! Br™ÿ¥ó'ä»ÏôóÏž²ñB£˜/lDˆÀXóÆ?ïãüµ_h‹…€ªëø"`Søˆ¾úŽ?!ö€‡ˆ@7CÇŸ[À!D`¹±ãOˆ€`˜/×ø"`˜ƒ•{ü ¨,@(5þ„ÔE–ˆÒãOˆ@=`…¨ÐBê D‹€öø" t%µÆŸ] ï¨=þ„è!=y€•ñ'D@À[¬?!值DÀêø"P¡õXBÊ!#µVÆŸ2@­E µñ'D ?I+huü È‹dd=­?!ù€Ì¬FÀËø"(ÀZ¼?!ã€B¬DÀëø"0(¨v¼?!ÀÂjE Êø"0 P hãOˆ@@‰V¢Ž?!ýE¥#}ü èŽ(+Æè†T;Œ>"°¨$WÿrD`9PÑØ0þnˆÀb ²¡`üýù€}#Àø‡!O"Ftã‡E YÆŸxŒ³(Œ?/"ð0h6Œ¿ "@ÌJøûûwAÑ#@ »2¹'_ùÙ5Æ_Xä€F0þ²¢F€4€ñëˆ`ã×-À0Æ_G¤£]Q"@ bü6Dˆ0†ñÛâ=ÀÆo“ç#¿m^#@ `ümðPão‹·€Š›7¯ ¿ Xì‹{ÇF_DdmÿòÕû™ž@cB¿ DG€À#@`Œ 0F€À#@`ÿ‚¬oÙBIEND®B`‚(0` â â¡⢠ã¥&ä¦(ä¨-åª3å«4æ¬7ç¯@ç±Bç²Eè²Fè´Ké¶Pé¸Tê»\ë½aì¿fìÁjïÊ|ðÍ…ñÓ”òÕ—óÙ¡ôÛ¥ôÜ©õÞ®öâ·øèÇúïØûòàýøíþýûÿþþÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿ !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿ !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ !ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  !ÿÿÿÿÿÿÿÿÿÿÿÿ !ÿÿÿÿÿÿÿÿÿÿ !ÿÿÿÿÿÿÿÿ !ÿÿÿÿÿÿ !ÿÿÿÿ !ÿÿ !( @ÿd=ÿf@ÿkEÿmHÿqMÿtQÿxVÿzXâ â¡ã¤$ä¥'ä§*ä¨-åª1æ¬9ç±Dè³Iè´KèµNêºYë¼^ÿ€`ÿˆkÿŽrÿ’wÿ—}ì¿eìÁjíÄsïÊ~ÿšÿ ˆÿ¨’ÿ­™ÿ±žÿ³ ÿ¹§ÿ¾®ðΆñÐŒòÔ•ó×óÙ¡öâ·öã¹ÿÏÂÿÐÄÿÙÏÿÞÖøèÇùëÏÿäÞúïØÿêåûòàÿ÷ôýúòÿÿÿ  :ÿÿÿÿÿÿÿÿ)-ÿÿÿÿÿÿÿÿ8 :ÿÿÿÿÿÿÿ)-ÿÿÿÿÿÿÿ88 :ÿÿÿÿÿÿ)-ÿÿÿÿÿÿ88ÿ :ÿÿÿÿÿ)-ÿÿÿÿÿ86ÿÿ :ÿÿÿÿ)-ÿÿÿÿ86ÿÿÿ :ÿÿÿ)-ÿÿÿ86ÿÿÿÿ 4.:ÿÿ)-ÿÿ86ÿÿÿÿÿ 4ÿÿ.:ÿ)-ÿ86ÿÿÿÿÿÿ 4ÿÿÿÿ.:)-86ÿÿÿÿÿÿÿ 4ÿÿÿÿÿÿ.*6ÿÿÿÿÿÿÿÿ (-------- )--------- ))))))))) ))))))))) *ÿÿÿÿÿÿÿÿ8:ÿÿÿÿÿÿÿÿ 43ÿÿÿÿÿÿÿ86)-.:ÿÿÿÿÿÿÿ 4ÿ3ÿÿÿÿÿÿ86ÿ)-ÿ.:ÿÿÿÿÿÿ 4ÿÿ3ÿÿÿÿÿ86ÿÿ)-ÿÿ.:ÿÿÿÿÿ 4ÿÿÿ3ÿÿÿÿ86ÿÿÿ)-ÿÿÿ.:ÿÿÿÿ ,ÿÿÿ3ÿÿÿ86ÿÿÿÿ)-ÿÿÿ6 :ÿÿÿ ,ÿÿ3ÿÿ86ÿÿÿÿÿ)-ÿÿ6 :ÿÿ ,ÿ3ÿ86ÿÿÿÿÿÿ)-ÿ6 :ÿ ,386ÿÿÿÿÿÿÿ)-6 : 6ÿÿÿÿÿÿÿÿ))   33333333+ ,ÿÿÿÿÿÿ6 ,ÿÿÿÿ6 ,ÿÿ6 ,6 ( ÿd=ÿf@ÿiDÿmGÿnJÿqNÿwUâ¡ÿ…gÿŒoÿqÿtÿ“xÿ•{ÿš€ÿœƒÿ ˆÿ¦ÿ±žÿ»ªÿÎÂÿàØÿãÜÿæßÿæàÿèâÿêåÿïëÿóðÿõóÿ÷ôÿÿÿÿúøÿÿÿ\ÿÿÿÿÿÿÿÿ                           nsis-3.11/Contrib/Graphics/Icons/nsis3-uninstall.ico000077500000000000000000000303651477201124000223770ustar00rootroot00000000000000 èf(NÇv00¨= ¨å"h+( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ÿ™™™™™™™™™™™™™™Ÿÿù™™™™™™ùŸ™™™™™ÿÿÿ™™™™™ŸùŸù™™™Ÿÿÿÿù™™™™ÿùŸÿ™™™ÿÿÿÿÿ™™™ŸÿùŸÿù™™™™™™™™™™ÿÿùŸÿÿ™™™™™™™™™™ÿÿùŸÿÿ™™ÿÿÿÿÿ™™™ŸÿùŸÿùŸùŸÿÿÿù™™™™ÿùŸÿ™ÿÿ™ÿÿÿ™™™™™ŸùŸùŸÿÿùŸÿù™™™™™™ùŸ™ÿÿÿÿ™ÿ™™™™™™™™™Ÿÿÿÿÿù™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™Ÿÿÿÿÿù™™™™™™™™™ÿ™ÿÿÿÿ™ùŸ™™™™™™ŸÿùŸÿÿùŸùŸù™™™™™ÿÿÿ™ÿÿ™ÿùŸÿ™™™™ŸÿÿÿùŸùŸÿùŸÿù™™™ÿÿÿÿÿ™™ÿÿùŸÿÿ™™™™™™™™™™ÿÿùŸÿÿ™™™™™™™™™™ŸÿùŸÿù™™™ÿÿÿÿÿ™™™ÿùŸÿ™™™™Ÿÿÿÿù™™™ŸùŸù™™™™™ÿÿÿ™™™™™ùŸ™™™™™™Ÿÿù™™™™™™™™™™™™™™ÿ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™™™™™™™™™™™™™™™™™™™™Ÿ™™™ŸŸ™™ÿù™™ÿŸù™™™™™ŸŸŸùÿù™™™™ÿÿŸ™™™™Ÿÿÿù™™™™Ÿÿÿù™™™™ùÿÿ™™™™ŸÿŸùùù™™™™™Ÿùÿ™™Ÿÿ™™ùù™™™ù™™™™™™™™™™™™™™™™™™™™™‰PNG  IHDR\r¨fŽIDATxœíÝMˆgÆñkÒ¤é¤ùhQ[ ®%]ÕŠ¢XÅfciµ-5Kº¢%µt¥à&t!cQiuS\DA¬Ð…PTD’ÒN’Ò´MšÌ¸8¹gÎdΜy?žç¹¿®ÿ*™p&O×/9_ïY8{+`Œ¥l›öczÆGK`,q€±ÄÆGK`,q€±ÄÆGK`,q€±Ä€MÚõà£XضKûŒUÌhïOâ¶ïý~òs"༇Ïü1›DnhïOb÷ßìüÄ"งãà/~·úóÏÿ;ïº[ñDö"SM_">“ñoÛ»oõk ‹»°ÿ¹ÓD`*p½Yã—ˆ€¯f_Ú¶w˜Š`þø%"à£yã—ˆÀZéè2~‰Ø®Ëø%"0)5}Æ/›õ¿D0dü°ÕñKÙH À˜ñKDÀFcÆ/eF %Æ/ÝJŒ_ÊŠ@*JŽ_":•¿”4Ô¿DÚVcüR6RPsühSÍñK™@‹ñKD n-Æ/eA 4-Ç/:µ¿”°hŒ_"eÓ¿hŽ_"eÒ¿pX¿DÆeaüRTB`iü–¥ñK€ÅñKD _Ç/EC –Ç/nY¿ ÷x¿DæçaüR\àiü˜§ñKp €ÇñKD`}Ç/yGÀ%žÇ/IžÇ/yFÀÆ/eG Âø%¯¸ Òø¥¬D¿ä7D¿” ˆã—¼!à€Èã—² yü’'ÌaüRt2Œ_ò‚€i2_ŠŠ@¦ñK0 @ÆñKÑÈ8~É:&È<~) ™Ç/YFÀÿZÞàø×²Š€)8þyE€ãߘEÌÀñož78þͳ†€ 8þ­ó‚Ç¿u–P€ãïžu8þîYA@Ž¿Vàøûg58þáYC€ãž6*pü㳂Ç?>MšÀñ—KŽ¿\Z4€ã/Ÿù4hÇ_¯Öpüõj@8þúµB€ã¯_KªÀñ·«6»Z!PŽ¿}µàøÛ×jpüz•F€ã׫6Uàøõ+…ǯ_MŠÀñÛi,¿j!PŽß^CàøíUbpüvë‹Ço·Ò€ã·_W8~û•D`4¿Ÿ¶B€ã÷S)ÎÄÊÐo¿ãN,>øè¨°ö]ùÃoqù¥×}-òøÏ½cðî]÷ç[~í"Î?|dÃßg×FÀb´°mÞùçà¦wÝ®}”*E˜ ð¿÷½Ë—/ö¾íö1¿ñö;îÄÍøð˜oÁºúÏ¿ãÊËZýùÊò¸ðØg°ÿ¹Ó!½ _x`Ðø‘\=w{>öI,=6æÛ°†]ýÛ_ðʽ0ùoÿî/ ¾òE\~éEœøpÖÒý÷à­ßÿfðíG?xþøãxóÇ?ûmXƒdüË—–Vïó/>ôùÕå׆ýkÂÚ6vü@¡§‰€ýf_þ¥Ÿ~v€ø¨Äø‚/"v›7~‰ø©ÔøÂ/&öê2~‰Ø¯äø o"vê3~‰Ø­ôøJo&ú ¿DìUcü@Å ‚½ÆŒ_"vª5~ ò%Áˆ@ûJŒ_"úÕ?ÐࢠD ]%Ç/½jhtYp"P¿ã—ˆ@ûZŒhøÁ D ^5Ç/vµ?Ðø£Áˆ@ùZŒ_"õk9~@áÃA‰@¹ZŽ_"õj=~@éãÁ‰Àø4Æ/òiŒP cÒ¿DÊ¥5~@€ ÉÂø%"0>ÍñÊD O–Æ/ái0@ºdqü蟅ñFˆÀ¼,_"ݳ2~À˜•‡ñKD`ë,0@¦ó4~‰lžµñˆàsüؘÅñFr#àyüXËêøÃ9ˆ0~‰Ø?` ‘Æ/eFÀúø9ˆ8~)#Æ8ˆ@äñK™ð2~À@L2Œ_Ê€€§ñÎb!iüRd¼pŒã—""àqü€Sßd¿ ¯ãøD€ã_+žÇ8ð…Ç¿1Ïx?ÀÿæyD Âø ¶àø·ÎQư‰Çß=D? Àÿ,#mü@@püóˆ@ÄñAtàøÇg ¨ãè Àñ—Ë‘Çh‹Ç_>M¢HÐŽ¿^d? .ýZ"eü@"€:püíj@¦ñÉÊ"Àñ·¯&ÙÆ$(ƒÇ¯W 2ŽH 0Ž_¿’d?`¿J yü@r€~püöƒ@öñ@78~» A€ãŸD®7Žß~}àø×"SÍB€ã÷Ó–¼}…ã¿¡…³±¢}kí?y ‹GqüN»üëÓXúÜg±²üvÞu7.¿ô"¬û1›D6iÏñ¸ôýg8~§M#À6thûwbaÿíc°ž]û÷,_ZÒ>†éc‰Û®}-¹‹<¢} Ö£•·¯àµo|×^}°°mï̈tèÍÓ/à–{?ţǴÂ:¶tÿ=«ã?pêy,ܺ› ̈OÞÐŽC‡±çø À-ù8n}ä16.4ʺ5ýTßSÏã–û\÷![‹Lµúhÿ¾Û&_¸ùfì{úY"à¨Yã—ˆÀÆÀõæ=ÕG|4oüXÀüñKDÀv]Æ/µÒÐçE>DÀf}Æ/I©ò ?"`«!ã—ˆ@bƼ¼—ØhÌø¥ì¤ Äkû‰€n%Æ/eF %ߨCt*9~)+©¨ñ®>"жã—2"€šoé%mª9~))hñ~~"P·ã—2!€–ó uj9~) ¡и’(›Æø¥ „@ó2^D Lšã—¢# ×ð#ã²0~)2á°0~‰ ËÒø¥¨„ÀÒø%"Ð/‹ã—""‹ã—ˆ@·,_І@,_"óó0~)îð0~‰ÌÎÓø¥(¸ÀÓø%"°>ã—" àã—ˆÀ$Ïã—¼#àÏã—²#aü’gÜaüRV"_òŠ€+"_ʆ@ÄñKp@ÄñKYˆ<~É.ˆ<~):Æ/yBÀ<Æ/EE Óø%/˜ Óø¥hd¿ä³d¿Ìã—¬#`€Ìã—¼#Àñ¯espükyE€ãߘULÀñoÌÿæYDÀ ÿæyA€ãß:k˜€ãß:ëpüݳ„€:÷¬"Àñ÷Ï ªpüý³†Ç?< ¨ÀñÏ ÿø´P€ãŸ6¹4hÇ_.-8þòi!ÐŽ¿|­àøë¥@38þzµB€ã¯_kšÀñׯ6»Z"PŽ¿]µàøÛ× ªpüí+ǯW ªÀñëU Ž_¿ÚT€ã×o,¿j"PŽßNCàøíU ¢püöê‹Ço·€ã·[W8~û•F ¿ý¶B€ã÷SIFÀñûi38~•B`û˜süþÚ÷ô³€K?ý!ί?soÿõåɯ}óÛØñþáÚÏj‘ulû¡ÃØ÷ïâÂ׿4ü{ ½!Çï·idüpñ©¸øÔ ­c1…ßX9¿„•K¯—< kص3ÿÑ>3Ðàÿ\=w¯~êƒ8ø«?â¦ÛßSòL¬rÓ÷ù§ÛòS8Ú[/ü K?4øö£xŸÑO›°qAÖ½±ã < @ü4oüðQ‰ñ…^@ì×eü°]©ñ_ HìÖgü°YÉñ…ß @ì5dü°UéñÞ Hì4fü°Qñ•®@ô+1~‰èVkü@Å+½JŽ_":Õ?Pùš€D }5Æ/¶Õ?ÐàªÀD ]5Ç/6µ?Ðèsˆ@ýZŒ_"uk5~ á'zµ¿DêÔrü@ãÏ$åÓ¿DÊÖzü€Â§riŽ_"eÒ? @Jdaü—Öø%"0&Kã—ˆÀ°4Ç(!Y¿Dú¥=~@€ôÉòø%"Ð- ã .y¿Dægeü€"0/Oã—ˆÀì,0@fåqüXŸµñƈÀtžÇ/IÇ @ŒñKÙ°:~À(@n"_ÊŠ€åñ†r"qüR6¬0 Èã—² àaü€€d¿/ãœÄF Óø¥¨x?à &Ç/ECÀÛøg±È<~) Ç8ˆÇ¿–w¼Žp àŽc^ð<~À1€O8þÍó†€÷ñÎ|!Àño"ŒàŽ¿{Öˆ2~ €m8þþYE Òø@6àø‡g hã‚ØB€ãŸ"Ž`Ž¿\ÚD?@Ž¿|ZD?@Ž¿^­ˆ>~ 8@[8þúµB ÃømàøÛU,ã’ÔE€ão_-2HPŽ_¯Òd?  ,¿~¥È8~ !@8~;E ëø¤ãàøí5Ìã C€ã·[_²HÐŽß~]àø'¥è†Çï§­àø×"×›‡Çï¯Íàø×G¦ZEàܙɮ\áøw#ÿÆÎÄŠö!«Ùþ“§°°{Ç?#ÀXâx€±ÄÆGK`,q€±ÄÆGK`,q€±ÄÆGK`,q€±ÄýÀYvú@HIEND®B`‚(0` ååå æ æ æ%ç&ç)ç*è,è/è"3é#4é):é+<é.>ê1Aê6Fë>Më?NìBQìETìO]íP^í_kïhtðozð‰ò‡óŽ—ô˜ô¤«ö¼ÁøÓÖûäæüñòþÿÿÿ"%$#"ÿÿ%$ÿÿ#"ÿÿÿÿ%$ÿÿÿÿ#"ÿÿÿÿÿÿ%$ÿÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿ%$ÿÿÿÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿ%$ÿÿÿÿÿÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿÿÿ%$ÿÿÿÿÿÿÿÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ% $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ# !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿÿÿÿÿÿÿÿ"ÿÿ#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿÿÿÿÿÿ"ÿÿÿÿ#ÿÿÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿÿÿÿ"ÿÿÿÿÿÿ#ÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿÿ"ÿÿÿÿÿÿÿÿ#ÿÿÿÿÿÿÿÿ"!ÿÿÿÿ"ÿÿÿÿÿÿÿÿÿÿ#ÿÿÿÿÿÿ"!ÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿ#ÿÿÿÿ"!"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ÿÿ" "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#""!!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ" "ÿÿ!!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ" #"ÿÿÿÿ!!ÿÿÿÿÿÿÿÿÿÿÿÿ"ÿ ÿ#"ÿÿÿÿÿÿ!!ÿÿÿÿÿÿÿÿÿÿ"ÿÿ ÿÿ#"ÿÿÿÿÿÿÿÿ!!ÿÿÿÿÿÿÿÿ"ÿÿÿ ÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿ!!ÿÿÿÿÿÿ"ÿÿÿÿ ÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿÿÿ!!ÿÿÿÿ"ÿÿÿÿÿ ÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!!ÿÿ"ÿÿÿÿÿÿ ÿÿÿÿÿÿ#"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!!"ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ#ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ#!ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ$#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ$#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿÿ ÿÿÿÿÿÿ$#ÿÿÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿÿ ÿÿÿÿÿ$#ÿÿÿÿÿÿÿÿÿÿ"!ÿÿÿÿ ÿÿÿÿ$#ÿÿÿÿÿÿÿÿ"!ÿÿÿ ÿÿÿ$#ÿÿÿÿÿÿ"!ÿÿ ÿÿ$#ÿÿÿÿ"!ÿ ÿ$#ÿÿ"! $#" ( @åå!ç%ç&ç*è/è"3é):é/?ê6Fë?NìAPìM[íZgîhtðvñ‡óŒ•ó˜ô–žô™¡õž¦õðñýö÷þ÷øþúúþþþÿÿÿÿ  ÿÿÿÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿ  ÿÿÿ   ( å æ æ&ç-è˜ô™¡õðñýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/orange-install-nsis.ico000077500000000000000000000611761477201124000232260ustar00rootroot00000000000000 (–h¾ è& ¨ 00h¶00¨ hÆ'  ¨.,00 ¨%Ö<( À€€ÿ€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿÿÀÀÀ€€€ÿÿðøˆˆðøˆˆˆˆˆˆøˆˆðˆˆüψˆðøˆÌÌøˆøˆÿÌÌÿˆøˆˆüψˆøˆˆüψˆøˆˆüψˆøˆˆüψˆˆˆüψˆðˆˆÿÿˆˆðøˆˆˆˆøˆˆðÿÿðøîÝàˆÀÌ€ˆð€îÝØÌˆðèÝÝßÌ€ˆð€ˆÝÀÝÝàÌø( @b\cWQW^X^d^d~w~zszjdjgagzvpvsmspjpnhnàááÄÅŦª«€ŠŽMTW¥³ºeknùýÿ;¬í<¦ã@®í= ÙE°îG±î>šÏFªäL³îU·ïW¸ïX¸ï^»ðc½ñf¾ñD}nÂòqÃòrÄòEw“{Çós·ÞGq‰Éó€ÉóÊôj§É„Ëô…ÌôƒÉñ‡Ìô‰Íô‹ÎôX‚š‹Íòh™µ‘ÑõHhz’Ñõ•Òõ—Óõ™ÔöšÕörµœÕöžÖöXv‡¡×ö£Øö¥Ù÷§Ú÷©Úõ«Ü÷J_k®Ýø­Ý÷r¡±Þø³ßø°Ûóµàø™¾Ò«ÓêWkv‰§·½ãù¾äù¶Ùí}•¢KYaÁåùÃæúÂåùn‚ÃæùWem¶ÓãÊéúÌêúaowkz‚ÊåôºÓáÀÙçÖîûÛðüÓä혣©mtxæôüðùþåìð@”ÅRµïN§ÛI˜ÆD‹µC‚§d½ñj¿ñrÃòuÄòsÁï^š¾yÆó†ÉðŽÏõŒÉí_ˆ ”Ñõ—Óö˜Óö“ÉéœÓók¡¦Ù÷©Ú÷«Û÷´ßø·àø¹áù»âù¾ãùÅæú½ÝðÉèúÅâóÌéúÎêûÐëû«ÀÍÓìûÕíûfqxÒèõÚïüÜðü¸ÉÓœ¤ËÝèÎßéÕæðY^aqvyæëîÃÑÚÜêóÙçðŽ•šTU_ÿÿÿüüüúúúùùùöööõõõòòòñññïïïìììëëëéééæææåååãããÞÞÞÜÜÜÚÚÚÙÙÙÖÖÖÕÕÕÒÒÒÐÐÐÎÎÎÌÌÌËËËÉÉÉÆÆÆÃÃÃÁÁÁ¿¿¿¼¼¼»»»¹¹¹¶¶¶µµµ³³³±±±¯¯¯¬¬¬ªªª¨¨¨§§§¥¥¥£££   ŸŸŸœœœššš———”””‘‘‘ŽŽŽŠŠŠ‰‰‰‡‡‡………ƒƒƒ€€€~~~}}}zzzxxxwwwtttrrrooommmkkkiiifffeeebbb```___\\\[[[VVVUUUSSSMMMóWWFcóõ..ótxxxõtø¦xó'­ÕØM.öMÕÈÈÚMóW=ÙÁÁÁÁà.c.+ÿðÈ»»ÈðÿyFF '··'  FF%%%%9ȵµÈ9%%%$gö~€€€„Ʋ²Æ„€€€-óŠ‚‚‚ŠÄ¯¯ÄŠ‚‚:höUIH\ñììò\IHUõ¦š‘‘‘‘‘‘Uö¢–™™›™k¬õöèâìöø àì¶Àq€1}€##ɶ##F ìµ®¯€³¥€€}Àdzà}*ø( @€€€ÿ€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿÿÀÀÀ€€€ÿÿÿÿÿü݈ÿðÿˆˆˆÿÌ݈ˆÿÿˆˆˆˆˆðÿÌ݈ˆˆˆøˆˆÿˆˆüÌ݈ˆˆˆøˆÌøˆüÌ݈ˆˆˆˆüÌψˆðüÌ݈ˆˆˆüÌÏøˆðüî݈ˆˆˆˆÌøˆˆðþîÝØˆˆˆˆÌøˆˆðþîÝÝÝØˆˆÌøˆˆðþèÝÝÝÝ߈ˆÌøˆˆðøˆÝÝÝÝÝøˆÌøˆøˆÝÝÝÝÝøˆÿøˆøˆÝßÝÝÝ߈ˆˆˆˆðøˆÝßßßýÝÿˆˆˆÿøˆÝßßÝßßÝÿÿÿøŽÝßßßÿßßýÞðþîÝßßßÝßÝïÝðþîÝÝÿßÿßßÿÞðþîÝÝÝÝÝßßÝîðþìÝßÿÿþííÿÞðüÌÝýÝÞïÿÿþîðüÌßÝÝÝÝÝÞïÿÿðüÌýÝÝÝÝÝÝÝÝÝðüÌøˆÝÝÝÝÝÝßüψˆˆˆˆÝÝÝðÌÏÝØˆˆˆˆˆˆðÌÿˆÝÝÝˆÝØüÏøˆˆˆˆˆÝøˆˆÿøˆˆˆˆˆˆˆøˆˆðÿÿÿÿˆˆˆˆÿÿÿÿÿÿÿÿðø?ð?ðÀàÀÀÀÀÀÀÀÀÀÀÀÀÀ?ÀÀÀÀÀÀÀÀÀ?À€€??€?ÿ€ÿ( @€`[aWQW^X^d^d~w~zszjdjgagzvpvsmspjpnhnàááÄÅŦª«€ŠŽMTW¥³ºeknùýÿ;¬í<¦ã@®í= ÙE°îG±î>šÏFªäL³îU·ïW¸ïX¸ï^»ðc½ñf¾ñD}nÂòqÃòrÄòEw“{Çós·ÞGq‰Éó€ÉóÊôj§É„Ëô…ÌôƒÉñ‡Ìô‰Íô‹ÎôX‚š‹Íòh™µ‘ÑõHhz’Ñõ•Òõ—Óõ™ÔöšÕörµœÕöžÖöXv‡¡×ö£Øö¥Ù÷§Ú÷©Úõ«Ü÷J_k®Ýø­Ý÷r¡±Þø³ßø°Ûóµàø™¾Ò«ÓêWkv‰§·½ãù¾äù¶Ùí}•¢KYaÁåùÃæúÂåùn‚ÃæùWem¶ÓãÊéúÌêúaowkz‚ÊåôºÓáÀÙçÖîûÛðüÓä혣©mtxæôüðùþåìð@”ÅRµïN§ÛI˜ÆD‹µC‚§d½ñj¿ñrÃòuÄòsÁï^š¾yÆó†ÉðŽÏõŒÉí_ˆ ”Ñõ—Óö˜Óö“ÉéœÓók¡¦Ù÷©Ú÷«Û÷´ßø·àø¹áù»âù¾ãùÅæú½ÝðÉèúÅâóÌéúÎêûÐëû«ÀÍÓìûÕíûfqxÒèõÚïüÜðü¸ÉÓœ¤ËÝèÎßéÕæðY^aqvyæëîÃÑÚÜêóÙçðŽ•šTU_ÿÿÿüüüúúúùùùöööõõõòòòñññïïïìììëëëéééæææåååãããÞÞÞÜÜÜÚÚÚÙÙÙÖÖÖÕÕÕÒÒÒÐÐÐÎÎÎÌÌÌËËËÉÉÉÆÆÆÃÃÃÁÁÁ¿¿¿¼¼¼»»»¹¹¹¶¶¶µµµ³³³±±±¯¯¯¬¬¬ªªª¨¨¨§§§¥¥¥£££   ŸŸŸœœœššš———”””‘‘‘ŽŽŽŠŠŠ‰‰‰‡‡‡………ƒƒƒ€€€~~~}}}zzzxxxwwwtttrrrooommmkkkiiifffeeebbb```___\\\[[[VVVUUUSSSMMM ì Ýó æ¹®ÉÞë ݦ't. óÛ¹ qr³ÉÝëõ í=t¦ ÎÁÁ¸re`N‘fqµÓM§W÷ ÀÀÀ¸r“YRŒG@83PFÐÖ+xõÀÀÀ·r`NIB<65+WÌÅÅØ'ö ¾¾¾·rYRŒE@83~'.ʽ½½½ÜxF ¾Çð¶r“NHB<6/2t'.¸¸Ý'x. Óùì¶®®q`J1}{9###ɶ¶Ü####F âôìµ®®®¯°²³¥Sa€}}2dz³Û}*}}õçÛdµ®®¯±²´µ·¸Þ-<‚2į¯Ú‚‚8C À‰€´¯°²³µ¶¸¹ºÀhKJU¬¢¢IIUõõ‰11µ±²´µ·¸º»½Ëa[ZYZZ’Yšù ‰77µ³µ¶·¹º¼½¾ÀÁÊŸl¡ õK<<¶µÄáºÕÀ½¾ÀÂÃÅÇÏáæç SAA¶·ÊïÚÿÔôÿîÈÝÇÉËÌÎ õŽEd·ºÌøüüÙîËúàÿÛÿýáÏÐõ –oÎÿíñÒõÿÿÛÿÙãßÿÑÒ  áå鸽ËñÅñÔýäïÕÿÛÿÿøÓÕõ ÚíùÀÅÒÈÍÊÛóðÔÿáþãòÕ×  Ƕ²ºÂèÉÚàäéàÛÏÚÒêöïØÚ  ±±±ºßɰ²´µ·ÇÐßæéëæáÚÜ õ°°°ÆÞ¯±³µ·¸º¼½¾ÁÂÐÙäëô  ¯¯¸Dižµ¶¸º»¾ÀÂÄÅÈÉÊÌè  ±»Ìyu~ƒVdkÀÂÄÅÈÈËÔ óº¼äu#%{},3…Vdj¡ÊÍêìÜ·½„}1€,€,}}},38…EJQY“p¸»á2€18>DJN``^‘ˆ@‹Q‘_šìâÞa-)}18>DJN`fœ gDHO^e§ë )))}18<@‹N`fœ CGŒRYš¬ ïïïïïïïïïUˆO^eœ¡ Pañ ì ó óéé§ ìüü?øððàààààààààààà?à?à?à?à?à?à?à?ààààÀ?À€€Àÿàÿ(0`€€ÿ€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿÿÀÀÀ€€€ÿðÿÿðüÍßÿðÿøˆˆÿÌÍÝÝßÿðˆˆˆˆˆˆðüÌ͈ˆÝÝßÿðøˆˆˆˆˆˆüÌ͈ˆˆˆÝÝßÿˆˆˆøˆˆˆðÌÌ͈ˆˆˆˆˆøˆˆˆüψˆˆÌÌ͈ˆˆˆˆˆˆøˆˆÌÌøˆˆÌÌ͈ˆˆˆˆˆˆøˆˆüÌÌψˆÌÌ͈ˆˆˆˆˆˆˆÌÌÌÌøˆˆðÌÌ͈ˆˆˆˆˆˆˆÿÿÌÌÿÿˆˆðÌÌ͈ˆˆˆˆˆˆˆˆÌÌøˆˆˆðÎî͈ˆˆˆˆˆˆˆˆÌÌøˆˆˆðîîÍÝØˆˆˆˆˆˆˆÌÌøˆˆˆðîîÍÝÝÝ݈ˆˆˆˆÌÌøˆˆˆðîîÍÝÝÝÝÝ݈øˆˆÌÌøˆˆîèÍÝÝÝÝÝÝÝøˆˆÌÌøˆˆèˆÍÝÝÝÝÝÝÝøˆˆÌÌøˆˆˆˆÍÝÝÝÝÝÝÝ߈ˆÿÿøˆˆðˆˆÍÝÝÝÝÝÝÝÝøˆˆˆˆˆˆˆˆÍÝßÝÝÝÝÝÝ߈ˆˆˆˆˆðˆˆÍÝßÝïßÿíÝÝÿøˆˆÿˆˆÍÝßÝÿÝÞÿßÝÝßÿÿðˆˆÍÝßÞÿÝÝïßßÿíÝ߈ˆÍÝßßïÝÝïßÝÞÿÞ߈ˆÍÝßïßßÿÿßÝÝïÝïˆîÍÝßþßßíÝßÝÞßÞßîîÍÝßýßßíÝßßÿïíïîîÍÝßíßßÿíßßîÿÞßîîÍÝÝÝÞÝÞÿßßíííïîìÍÝÝÝÝÝÝÝßßÿÞÞïîÌÍÝÿÿÿþíÝÝÝîÿîïÌÌÍßÝÝÞïÿÿîÞÞÞîïÌÌÍßÝÝÝÝÝîÿÿÿîîïÌÌÍýÝÝÝÝÝÝÝÝîÿÿÿÌÌÿÝÝÝÝÝÝÝÝÝÝÝÝîÿðÌÝýÝÝÝÝÝÝÝÝÝÝÝÝÝÝðÍÝøˆˆÝÝÝÝÝÝÝÝÝÝßÝÝøˆˆˆˆˆˆÝÝÝÝÝÝÝðýÝ߈ˆˆˆˆˆˆˆˆˆÝÝÝÝðýÝßÝ݈ˆˆˆˆˆˆˆˆˆˆßÝÝøˆˆÝÝÝÝ݈ˆˆˆÝˆðÝßøˆˆˆˆˆˆˆÝÝÝÝØˆˆýÝÿˆˆˆˆˆˆˆˆˆˆøˆˆˆˆÿÿˆˆˆˆˆˆˆˆˆˆˆøˆˆˆˆˆðÿˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆˆˆÿðÿÿøˆˆˆˆˆˆˆˆˆÿˆˆÿÿðÿÿÿÿÿÿøˆˆˆðÿÿÿÿÿðÿ‡ÿÿÿñìÿü?õþø‘‘üpø™™øøèâøøì¶ø1}øɶøFøìµø³¥ødzøødµøµ·øįøø?€´øÿ¸¹øÿ¬¢øÿøÿ1µøÿº»øÿYZøÿøÿ7µøÿ¼½øÿ©Ÿøÿøÿ<¶øÿ½¾øáæøøÿA¶øÿôÿðÿËÌðÿàÿd·àÿîËÀÿáÏÀ€î¸àÿõÿÿ?ÿÿÑÿÿøÿÿ(0`€ `[a[U\b\cWQW^X^d^d~w~zszjdjgagzvpvsmspjpnhnàááÄÅŦª«€ŠŽMTW¥³ºeknùýÿ;¬í<¦ã@®í= ÙE°îG±î>šÏFªäL³îU·ïW¸ïX¸ï^»ðc½ñf¾ñD}nÂòqÃòrÄòEw“{Çós·ÞGq‰Éó€ÉóÊôj§É„Ëô…ÌôƒÉñ‡Ìô‰Íô‹ÎôX‚š‹Íòh™µ‘ÑõHhz’Ñõ•Òõ—Óõ™ÔöšÕörµœÕöžÖöXv‡¡×ö£Øö¥Ù÷§Ú÷©Úõ«Ü÷J_k®Ýø­Ý÷r¡±Þø³ßø°Ûóµàø™¾Ò«ÓêWkv‰§·½ãù¾äù¶Ùí}•¢KYaÁåùÃæúÂåùn‚ÃæùWem¶ÓãÊéúÌêúaowkz‚ÊåôºÓáÀÙçÖîûÛðüÓä혣©mtxæôüðùþåìð@”ÅRµïN§ÛI˜ÆD‹µC‚§d½ñj¿ñrÃòuÄòsÁï^š¾yÆó†ÉðŽÏõŒÉí_ˆ ”Ñõ—Óö˜Óö“ÉéœÓók¡¦Ù÷©Ú÷«Û÷´ßø·àø¹áù»âù¾ãùÅæú½ÝðÉèúÅâóÌéúÎêûÐëû«ÀÍÓìûÕíûfqxÒèõÚïüÜðü¸ÉÓœ¤ËÝèÎßéÕæðY^aqvyæëîÃÑÚÜêóÙçðŽ•šTU_ÿÿÿüüüúúúùùùöööõõõòòòñññïïïìììëëëéééæææåååãããÞÞÞÜÜÜÚÚÚÙÙÙÖÖÖÕÕÕÒÒÒÐÐÐÎÎÎÌÌÌËËËÉÉÉÆÆÆÃÃÃÁÁÁ¿¿¿¼¼¼»»»¹¹¹¶¶¶µµµ³³³±±±¯¯¯¬¬¬ªªª¨¨¨§§§¥¥¥£££   ŸŸŸœœœššš———”””‘‘‘ŽŽŽŠŠŠ‰‰‰‡‡‡………ƒƒƒ€€€~~~}}}zzzxxxwwwtttrrrooommmkkkiiifffeeebbb```___\\\[[[VVVUUUSSSMMM   â½Íá  =''''MÛó®®®¹Íç ­'.ÎÃó®qqr®®®½ÓçMxt­õÆÂ³® e“Z•›q®®½Óì=M­ÁÁÁÁÁ³®Ÿ•`‘TNJGNYœr®¹]ãò=tÁÁÁÁÁ³®l_ZQIE‡<83‚atMîÎÑ÷+.ÀÀÀÀÀ³®œ^‘TNJGB?‚61-M.òÉÉÉÔýxÀÀÀÀÀ²®›ZQIE‡<83/;y'ùÈÄÄÄÄÔÿ= ¾¾¾¾¾²®™‘ŽNJGA?‚61,9txüË¿¿¿¿¿¿Ø' ¾¾¾Ãò®˜QIE†<83/€WùðÕ»»»»ððÿMx½½Ïüϲ®qeRJGA?‚61,}Wvww.ݸ¸¸¸ÿwwwt ½ßÿã²®®®®rm’E:3/€|Fv!!!!!9ܶ¶¶¶ÿ!!!!!!9 çùÖùβ®®®®®®¯°qžS:)„&&&&&„Ü´´´´ÿ&&&&&&FÖâÿß±®®®®¯¯°±²´µµ¨¡F,€€€€„Û²²²²ÿ€€€€€€­çüͲ®®®¯°±²³´µ¶·¸¹ø-7777ŠÚ±±±±ÿ77777C Ú¿¤5£±®¯¯°±²´µµ¶·¸ººÑhAAAAPâÄÄÄÄÿAAAAˆ º[,,£±¯°±²³´µ¶·¸¹º»¼ìXŒŒXŒŒŒŒh[000¤²°±²³µµ¶·¸¹º»¼½ÃõXY[a[333¤³²³´µ¶·¸¹º»¼½½¿ÀÅîhj————————š”888n´³µµ¶·¸¹º»¼½¾ÀÀÁÂÃÜú𥠠©§”<<@EVdj¡Ìظ¹º¦*€/*€((&%$z{)},04‚>@DHŒNTY_oîµ¶¸Ô9)€/48<†EIJHBD…?6‚>@DHJNTYb•pÆ´µÉô-*€/48<†EIQY_e™l dƒAG‹OŽ‘^•š÷±Ð÷F-)*€/48<†EIQY_e™l oP†EILQZ“f ñ÷„-)))*€/48<†EIQY_e™l oˆBHŒQY_ekc~))))*€/48<†EIQY_e™l ¬a@EINT‘”š¢  F„„„222/48<†EIQ‘^•™l §ˆUX\  cgga\\Xšš¡˜l §    ÿÃÿÿÿÿ?þ°ÿþøµÿü0ðÿøðÿøðÿøñÿøóÿøõÿøöÿøëÿø”ÿømøøøøøñÿø‰ÿøóÿø?õÿøÿ÷ÿøÿ÷ÿøÿ÷ÿøÿöÿøÿöÿøÿøÿøÿïÿøÿ•øÿøÿøÿøÿ>Pø·ÿø?¾ÿøóÿøõÿøÿ÷ÿðÿùÿðÿúÿàÿÛÿàÿöÿÀøÿÀúÿ€?° øÿÿÿÀÿÿ(  @3L[]Q<"  , g$$$«000Î///Ò%%%Ȭ‘o= 3555¹Cn‡ù@”Åÿ;¬íÿ;¬íÿ>šÏÿD}ÿ=DHî·„D1EMQã>šÏÿ;¬íÿ;¬íÿ<¦ãÿ@”Åÿ;¬íÿ;¬íÿ<¦ãÿDh|ûÀ7 CMRÅ>šÏÿ;¬íÿ;¬íÿ;¬íÿOk{ÿqx|ÿ>šÏÿ;¬íÿ;¬íÿ;¬íÿEarû®d:::UBˆ±ÿ;¬íÿ;¬íÿ;¬íÿFq‰ÿ¨¨¨ÿ¶¶¶ÿ_uÿ<¦ãÿ;¬íÿ;¬íÿ= Ùÿ4šÏÿ;¬íÿ;¬íÿ;¬íÿAŽ»ÿA^o÷Ì‘R@@@söÌÌÌÿÔÔÔÿÿÿÿÿÝñüÿÖîûÿÚðüÿçõýÿïòóÿÇÇÇÿ›››ÿVVVî)))Ô777ßBˆ±ÿ;¬íÿ;¬íÿ<¦ãÿEw“ÿ;¬íÿ;¬íÿ;¬íÿD}ÿ###ш< jjjÈÖÖÖÿÖÖÖÿÖÖÖÿÿÿÿÿÙïûÿÃæúÿ¹áùÿ¯Ýøÿ¥Ù÷ÿ­Ü÷ÿºâùÿÑìûÿ¬µ»ÿC‚§ÿ;¬íÿ;¬íÿ;¬íÿOk|ÿ”””ÿFq‰ÿ;¬íÿ;¬íÿ;¬íÿCn†û´fvvvÈØØØÿØØØÿØØØÿÿÿÿÿÕíûÿ¾äùÿ´ßøÿªÛ÷ÿŸ×öÿ•Òõÿ‹ÎõÿÊôÿVw‹ÿ;¬íÿ;¬íÿ;¬íÿFq‰ÿ®®®ÿÃÃÃÿ˜˜˜ÿBˆ±ÿ;¬íÿ;¬íÿ<¦ãÿ4 Ùÿ<¬íÿE}ÿŒ.xxxÈÃÃÃÿhhhÿ¨¨¨ÿÿÿÿÿòúþÿÜðüÿÁåùÿ ×öÿÐõÿ†Ìôÿ{Çóÿi¦ÉÿO›ÆÿPµïÿPµïÿPµïÿOžÿíííÿíííÿíííÿOžÿPµïÿPµïÿPµïÿOžÿ€(yyyÈVVVÿiiiÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿåñøÿÊåõÿ¥ÖòÿÁçÿ\†ŸÿjÀñÿjÀñÿjÀñÿ\†Ÿÿóóóÿóóóÿóóóÿ\†ŸÿjÀñÿjÀñÿjÀñÿOl|ôdzzzÈ```ÿ¡¡¡ÿÔßäÿÿÿÿÿÿÿÿÿþþþÿûûûÿøøøÿõõõÿñññÿïïïÿëëëÿzƒˆÿ…Ëôÿ…Ëôÿ…ËôÿiŒ ÿùùùÿùùùÿùùùÿiŒ ÿ…Ëôÿ…ËôÿÃéÿ:::Ò< zzzÈÂÆÉÿ“Íïÿ®Õìÿÿÿÿÿýýýÿúúúÿ÷÷÷ÿóóóÿðððÿíííÿêêêÿçççÿ¾¾¾ÿu‘¡ÿ ×öÿ ×öÿw’¢ÿ¥¥¥ÿ¥¥¥ÿ¥¥¥ÿw’¢ÿ ×öÿ ×öÿcv€øgzzzȆËòÿÉóÿ³Øíÿûûûÿøøøÿõõõÿòòòÿïïïÿëëëÿèèèÿåååÿâââÿßßßÿ‹‹‹ÿ©¸ÿºâùÿºâùÿºâùÿºâùÿºâùÿºâùÿºâùÿt„ÿ444Ž{{{ȈÍôÿˆÍôÿ¸Ûîÿ÷÷÷ÿóóóÿðððÿíííÿêêêÿçççÿäääÿàààÿÝÝÝÿÚÚÚÿ×××ÿ¡¡¡ÿ~†‹ÿ±ÄÏÿÕíûÿÕíûÿÕíûÿ¨ºÄÿltyë333`|||ÈÐõÿÐõÿ¾ÞðÿòòòÿïïïÿuuuÿèèèÿÉÉÉÿÐÐÐÿßßßÿÛÛÛÿØØØÿÕÕÕÿÒÒÒÿÎÎÎÿÃÃÃÿ™™™ÿˆˆˆÿ‡‡‡ÿiiiÿ"""µ7}}}È™Ôöÿ™ÔöÿÃáòÿíííÿêêêÿMMMÿÈÈÈÿMMMÿ•••ÿqqqÿVVVÿ€€€ÿ¸¸¸ÿ¥¥¥ÿÉÉÉÿÆÆÆÿÃÃÃÿÀÀÀÿ¼¼¼ÿƒƒƒÿ0}}}È¢Ø÷ÿ«ÚöÿÏÚàÿèèèÿåååÿMMMÿiiiÿVVVÿ’’’ÿ€€€ÿ¹¹¹ÿ]]]ÿ|||ÿMMMÿ‚‚‚ÿMMMÿ[[[ÿ¦¦¦ÿ¸¸¸ÿÿ0~~~È¥ÁÒÿ{€ÿ½½½ÿäääÿáááÿMMMÿ^^^ÿŠŠŠÿÿfffÿMMMÿUUUÿ‘‘‘ÿMMMÿ”””ÿ“““ÿoooÿnnnÿ³³³ÿÿ0~~~Èxxxÿ‰‰‰ÿ­­­ÿßßßÿÛÛÛÿŠŠŠÿ»»»ÿÿÿeeeÿ{{{ÿlllÿÿMMMÿ~~~ÿMMMÿZZZÿ‹‹‹ÿ®®®ÿ|||ÿ0Èÿ®®®ÿõõõÿÚÚÚÿ×××ÿ‘‘‘ÿ¨¨¨ÿµµµÿÊÊÊÿ···ÿˆˆˆÿ†††ÿ¡¡¡ÿMMMÿ‚‚‚ÿ```ÿ```ÿˆˆˆÿ©©©ÿzzzÿ0€€€ÈåååÿøøøÿøøøÿÖÖÖÿˆˆˆÿÜÜÜÿÎÎÎÿ¶¶¶ÿŸŸŸÿ‹‹‹ÿ………ÿ………ÿ———ÿ¢¢¢ÿ±±±ÿ‰‰‰ÿ{{{ÿ¢¢¢ÿ¥¥¥ÿwwwÿ›Q Èúúúÿúúúÿúúúÿ°°°ÿ¥¥¥ÿûûûÿ÷÷÷ÿóóóÿðððÿìììÿèèèÿäääÿ»»»ÿ¦¦¦ÿ’’’ÿ€€€ÿzzzÿyyyÿ†††ÿkkkÿ³OÈûûûÿûûûÿíííÿÿüüüÿøøøÿôôôÿðððÿíííÿéééÿåååÿáááÿÝÝÝÿÙÙÙÿÖÖÖÿÒÒÒÿÎÎÎÿÊÊÊÿ¨¨¨ÿ–––ÿ………ÿ@@@åM€€€Ëûûûÿëëëÿ’’’ÿ= ÙÿlÀðÿ|Æðÿ Óðÿ¿ÝïÿÐáëÿæææÿãããÿÞÞÞÿÚÚÚÿ×××ÿÓÓÓÿÏÏÏÿËËËÿÇÇÇÿÃÃÃÿ¿¿¿ÿ’’’ÿ'''&xxxÝçççÿßßßÿZv‡ÿ;¬íÿ=¬íÿE°îÿN´ïÿW¸ïÿ`¼ðÿjÀñÿ‡Éïÿ”Ííÿ¯ÒæÿºÒàÿÂÑÚÿÌÌÌÿÈÈÈÿÄÄÄÿÀÀÀÿµµµÿCCCâX555]°°°ÿèèèÿµµµÿ^”´ÿ\ºðÿa¼ñÿX¸ðÿ]ºðÿX¸ðÿa¼ðÿkÀñÿtÄòÿ}Èóÿ†ÌôÿÐõÿ™Óöÿ¢×öÿ¬Úôÿ¸ØëÿÀÔßÿˆ”ÿ¼m#```Ññññÿíííÿyƒ‰ÿsÄòÿ|Èóÿ†ÌôÿÐõÿšÕöÿ¤Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ ÖöÿžÖöÿ–Óõÿ ×öÿªÛ÷ÿµàøÿ¿äùÿÂßïÿ>AAå•I>>>P£££ÿ···ÿj‹ÿfž¾ÿsÄòÿ|Èóÿ†ÌôÿÐõÿšÕöÿ¤Ù÷ÿ®Ýøÿ¸áùÿÂåúÿÌêúÿÖîûÿÄÒÛÿu˜¬ÿÕöÿ§Ú÷ÿ²Þøÿ½ãùÿÇçúÿŽœ¤ÿ°YLLL²KKKåh¦ÉÿqÃòÿqÃòÿsÄòÿ|Èóÿ†ÌôÿÐõÿšÕöÿ¤Ù÷ÿ®Ýøÿ¸áùÿÂåúÿÌêúÿÖîûÿºÈÐÿKPRó–Ìëÿ¥Ù÷ÿ¯ÝøÿºâùÿÄæúÿ¿×åÿOQSÕ4KKK!KKK„Yv†â_ˆ ÿ_ˆ ÿ`ˆ ÿp©Êÿx¬Êÿ¯ËÿšÕöÿ¤Ù÷ÿ®Ýøÿ¸áùÿÂåúÿÌêúÿÖîûÿºÈÐÿ,,,¦nˆ—ÿ}›¬ÿwŒ˜ÿjw~ËGGG­CCC€>>>P HHHJJJCEEEGEEEYHHHˆGGG‹FFFŒdntÆo{‚Çr{ȉ“™ÿqvyÿ3====EEE6øàðÀààààààààààààààà?à?à?à?à?àààÀÀ€€€€€üÿ(0` €%  BfhT=+2ETXO@.! uAAAâ777ß%%%Ë­”€gN8( Gn¨'''À///Ð À±–„a7 )///œ\\\øÄÄÄÿÞÞÞÿ±±±ÿzzzÿEEE÷222ߍ|eN7%  1###‹===ÝJ_kÿEw“ÿC‚§ÿ@”ÅÿD}ÿFq‰ÿHOTû111à­…U$ 3666¶nnnÿÊÊÊÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ¦¦¦ÿzzzÿBBBó222ÞŤŽx`H6P888ÃIeuÿ@”Åÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿBˆ±ÿGV]û###Ñšb$.AAAÑ€€€ÿÔÔÔÿÔÔÔÿÞÞÞÿÿÿÿÿ÷üþÿÜðüÿäôýÿðùþÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿ›››ÿnnnÿ>>>î---Ù½›—DDDëC‚§ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿBˆ±ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿGkÿ555åšUJJJØ¢¢¢ÿÕÕÕÿÕÕÕÿÕÕÕÿßßßÿÿÿÿÿôúþÿÍêúÿÇçúÿÀäùÿ¹áùÿÁåùÿÐëûÿãóüÿùýþÿÿÿÿÿôôôÿÇÇÇÿ›››ÿnnnÿEEE÷Bˆ±ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿFq‰ÿSSSÿBˆ±ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿGkÿ###ш< oooÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿàààÿÿÿÿÿóúþÿÉèúÿÃæúÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¢Ø÷ÿ›Õöÿ¨Ú÷ÿ¸áùÿÒìûÿïøþÿ¼¼¼ÿGkÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿD}ÿtttÿ­­­ÿaaaÿ>šÏÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿGV]û´fpppÿØØØÿØØØÿØØØÿØØØÿâââÿÿÿÿÿòùþÿÆçúÿÀäùÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿŸÖöÿ˜Óöÿ‘ÐõÿŠÎôÿƒËôÿ}ÈóÿRblÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿAŽ»ÿcccÿ¾¾¾ÿ¾¾¾ÿ©©©ÿSZ^ÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿBˆ±ÿ555å†0pppÿØØØÿØØØÿØØØÿØØØÿâââÿÿÿÿÿñùþÿÃåúÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿ›Õöÿ”ÒõÿÏõÿ‡Ìôÿ€Éóÿl¡¿ÿFq‰ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ>šÏÿ\cgÿÀÀÀÿÈÈÈÿÈÈÈÿÈÈÈÿªªªÿJ_kÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿGV]ûšG pppÿÚÚÚÿÚÚÚÿÚÚÚÿÚÚÚÿãããÿÿÿÿÿðùþÿ¿äùÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ˜Óöÿ‘ÐõÿŠÎôÿƒËôÿ|Èóÿ`‚–ÿ@”Åÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿSbjÿ¼¼¼ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿšššÿFq‰ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿEw“ÿ»ZqqqÿÛÛÛÿÛÛÛÿÛÛÛÿÛÛÛÿäääÿÿÿÿÿïøþÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿšÔöÿ”ÒõÿÏõÿ‡Ìôÿ€ÉóÿyÆóÿWkvÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿJ_kÿ„„„ÿºººÿßßßÿßßßÿßßßÿßßßÿÌÌÌÿºººÿhhhÿD}ÿ;¬íÿ;¬íÿ;¬íÿBˆ±ÿ///Ó`qqqÿÝÝÝÿÝÝÝÿÔÔÔÿ•••ÿåååÿÿÿÿÿîøþÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ—Óõÿ‘ÐõÿŠÎôÿƒËôÿ|ÈóÿuÅòÿVkvÿ>­íÿ>­íÿ>­íÿA›ÏÿG~ÿG~ÿLYaÿèèèÿèèèÿèèèÿèèèÿ›››ÿIq‰ÿG~ÿG~ÿ?§ãÿ>­íÿ>­íÿB•Åÿ///Ò[qqqÿÞÞÞÿºººÿVVVÿŒŒŒÿæææÿÿÿÿÿÿÿÿÿöûþÿáòüÿÎêûÿ³ßøÿšÔöÿ”ÒõÿÏõÿ‡Ìôÿ€ÉóÿyÆóÿrÄòÿVkvÿM³ïÿM³ïÿM³ïÿM³ïÿM³ïÿM³ïÿMguÿíííÿíííÿíííÿíííÿÿMšÆÿM³ïÿM³ïÿM³ïÿM³ïÿM³ïÿMšÆÿ000ÏNrrrÿ–––ÿVVVÿÿ–––ÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûýÿÚîùÿÂä÷ÿ Öõÿ|ÈóÿuÅòÿqÃòÿXrÿ[¦Òÿ_»ðÿ_»ðÿ_»ðÿ_»ðÿ_»ðÿRhvÿðððÿðððÿðððÿðððÿŸŸŸÿ[ŸÇÿ_»ðÿ_»ðÿ_»ðÿ_»ðÿ_»ðÿV„Ÿÿ"""´;rrrÿiiiÿ———ÿVVVÿŽŽŽÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿÑåñÿ°Ùðÿ€š¨ÿaªÿqÃòÿqÃòÿqÃòÿqÃòÿqÃòÿVjvÿôôôÿôôôÿôôôÿôôôÿ¡¡¡ÿh¥ÉÿqÃòÿqÃòÿqÃòÿqÃòÿqÃòÿXr€ÿŠ'rrrÿŽŽŽÿVVVÿªªªÿâââÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿúúúÿøøøÿöööÿôôôÿòòòÿðððÿîîîÿìììÿÖÖÖÿVdlÿÉóÿÉóÿÉóÿÉóÿÉóÿZlwÿùùùÿùùùÿùùùÿùùùÿ£££ÿtªÊÿÉóÿÉóÿÉóÿÉóÿzºÞÿDDDìRsssÿiiiÿÑÑÑÿÏÞæÿ¤Òìÿêêêÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿñññÿïïïÿíííÿëëëÿèèèÿçççÿ†††ÿ}¨Àÿ”Òõÿ”Òõÿ”Òõÿ”Òõÿ_nwÿüüüÿüüüÿüüüÿüüüÿ¤¤¤ÿ‚°Ëÿ”Òõÿ”Òõÿ”Òõÿ”Òõÿg~Œÿ---¥(sssÿåååÿ½ÚêÿÈòÿ”ÎïÿìììÿþþþÿüüüÿúúúÿøøøÿöööÿôôôÿòòòÿðððÿîîîÿìììÿêêêÿçççÿæææÿäääÿÏÏÏÿ[_aÿŸÐìÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿu‹—ÿeqxÿeqxÿeqxÿeqxÿeqxÿ•¿×ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿƒ¤·ÿBBBÝ5 sssÿŸÒïÿ~Éóÿ~Éóÿ˜Ððÿìììÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿñññÿïïïÿíííÿëëëÿéééÿçççÿåååÿãããÿàààÿÞÞÞÿ¸¸¸ÿ`hmÿ¯×îÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿš»ÍÿMPRåD sssÿƒËôÿƒËôÿƒËôÿœÒñÿìììÿùùùÿöööÿôôôÿòòòÿðððÿîîîÿìììÿêêêÿèèèÿæææÿäääÿâââÿßßßÿÝÝÝÿÛÛÛÿÙÙÙÿ¬¬¬ÿ]_`ÿ©ÁÏÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿ‰š£ÿGGGá9 tttÿŠÎôÿŠÎôÿŠÎôÿ¢ÕñÿíííÿõõõÿóóóÿñññÿïïïÿíííÿëëëÿéééÿçççÿåååÿãããÿáááÿÞÞÞÿÜÜÜÿÚÚÚÿØØØÿÖÖÖÿÔÔÔÿÁÁÁÿ~~~ÿouyÿ£±ºÿÐåñÿÙïüÿÙïüÿÙïüÿ¾ÐÛÿš§¯ÿ]`bõ@@@štttÿÐõÿÐõÿÐõÿ¦Öòÿíííÿòòòÿðððÿîîîÿ“““ÿÃÃÃÿèèèÿæææÿäääÿâââÿßßßÿÝÝÝÿÛÛÛÿÙÙÙÿ×××ÿÕÕÕÿÓÓÓÿÑÑÑÿÎÎÎÿÌÌÌÿºººÿŠŠŠÿkkkÿjjjÿjjjÿbbbÿCCCï---£3uuuÿ•Òõÿ•Òõÿ•Òõÿ«ÙóÿíííÿïïïÿíííÿëëëÿMMMÿšššÿåååÿsssÿVVVÿÞÞÞÿÓÓÓÿ···ÿµµµÿÎÎÎÿÔÔÔÿÒÒÒÿÏÏÏÿÍÍÍÿËËËÿÉÉÉÿÇÇÇÿÅÅÅÿÃÃÃÿÁÁÁÿ¾¾¾ÿ   ÿ///Ó`uuuÿšÕöÿšÕöÿšÕöÿ¯ÛôÿîîîÿìììÿêêêÿèèèÿMMMÿ˜˜˜ÿ¡¡¡ÿMMMÿMMMÿÛÛÛÿhhhÿMMMÿMMMÿMMMÿŸŸŸÿ¾¾¾ÿÿºººÿÈÈÈÿÆÆÆÿÄÄÄÿÂÂÂÿ¿¿¿ÿ½½½ÿ»»»ÿžžžÿ///Ó`vvvÿŸ×öÿŸ×öÿŸ×öÿÂáóÿîîîÿéééÿçççÿåååÿMMMÿ„„„ÿVVVÿVVVÿMMMÿÇÇÇÿgggÿÿÉÉÉÿvvvÿMMMÿ¬¬¬ÿMMMÿ©©©ÿ™™™ÿUUUÿTTTÿqqqÿ§§§ÿºººÿ¸¸¸ÿœœœÿ///Ó`vvvÿ¥Ù÷ÿ®ÜöÿÃÐØÿ¢¢¢ÿîîîÿæææÿäääÿâââÿMMMÿMMMÿMMMÿœœœÿMMMÿÕÕÕÿÂÂÂÿÿŽŽŽÿ]]]ÿMMMÿªªªÿMMMÿ¦¦¦ÿMMMÿbbbÿ………ÿ[[[ÿTTTÿ···ÿµµµÿšššÿ///Ó`vvvÿÉåõÿ§ª¬ÿfffÿ¬¬¬ÿîîîÿãããÿáááÿÞÞÞÿMMMÿMMMÿ›››ÿ´´´ÿMMMÿÒÒÒÿfffÿMMMÿMMMÿ\\\ÿ‚‚‚ÿ§§§ÿMMMÿ¤¤¤ÿ©©©ÿ®®®ÿŸŸŸÿ|||ÿMMMÿšššÿ²²²ÿ———ÿ///Ó`vvvÿ€€€ÿxxxÿ¬¬¬ÿ£££ÿîîîÿàààÿÝÝÝÿÛÛÛÿgggÿoooÿÕÕÕÿ²²²ÿMMMÿÏÏÏÿ]]]ÿlllÿÈÈÈÿ’’’ÿ‰‰‰ÿ¥¥¥ÿMMMÿ¡¡¡ÿ‹‹‹ÿMMMÿMMMÿMMMÿSSSÿªªªÿ®®®ÿ•••ÿ///Ó`wwwÿ­­­ÿ¤¤¤ÿfffÿ¶¶¶ÿîîîÿÜÜÜÿÚÚÚÿØØØÿÖÖÖÿÔÔÔÿÒÒÒÿ¿¿¿ÿÿËËËÿšššÿMMMÿMMMÿMMMÿjjjÿ¢¢¢ÿMMMÿŸŸŸÿhhhÿZZZÿ‡‡‡ÿŒŒŒÿ£££ÿ­­­ÿ«««ÿ’’’ÿ///Ó`wwwÿxxxÿÿÚÚÚÿõõõÿïïïÿÙÙÙÿ×××ÿÍÍÍÿ€€€ÿÿ¦¦¦ÿµµµÿÊÊÊÿÈÈÈÿÆÆÆÿ½½½ÿÿ”””ÿ¶¶¶ÿ§§§ÿTTTÿÿ{{{ÿMMMÿyyyÿ```ÿMMMÿªªªÿ¨¨¨ÿÿ///Ó`wwwÿ¸¸¸ÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿïïïÿ×××ÿÔÔÔÿwwwÿ°°°ÿÐÐÐÿ£££ÿÿwwwÿdddÿrrrÿ‡‡‡ÿ›››ÿ¨¨¨ÿºººÿ¸¸¸ÿ¶¶¶ÿ´´´ÿ²²²ÿ„„„ÿeeeÿdddÿ†††ÿ§§§ÿ¥¥¥ÿŽŽŽÿ///Ó`xxxÿøøøÿøøøÿøøøÿøøøÿïïïÿÓÓÓÿ˜˜˜ÿÿüüüÿúúúÿøøøÿõõõÿòòòÿðððÿÚÚÚÿÃÃÃÿšššÿ†††ÿiiiÿaaaÿmmmÿÿÿ¡¡¡ÿªªªÿ¨¨¨ÿ¦¦¦ÿ¤¤¤ÿ¢¢¢ÿ‹‹‹ÿ...Öu7xxxÿúúúÿúúúÿúúúÿúúúÿðððÿ¸¸¸ÿkkkÿòòòÿúúúÿøøøÿöööÿóóóÿðððÿïïïÿìììÿéééÿçççÿåååÿâââÿßßßÿÂÂÂÿ®®®ÿ’’’ÿxxxÿfffÿcccÿnnnÿwwwÿ‹‹‹ÿÿ---Ü¡€a7xxxÿúúúÿúúúÿúúúÿúúúÿçççÿeeeÿÜÜÜÿûûûÿùùùÿöööÿôôôÿñññÿïïïÿíííÿêêêÿçççÿåååÿãããÿàààÿÝÝÝÿÛÛÛÿØØØÿÖÖÖÿÓÓÓÿÑÑÑÿÎÎÎÿ´´´ÿ¢¢¢ÿŠŠŠÿrrrÿcccÿ>>>î666â(((·Fyyyÿüüüÿüüüÿüüüÿ÷÷÷ÿšššÿŒ¡­ÿØíùÿúúúÿ÷÷÷ÿôôôÿòòòÿðððÿíííÿëëëÿèèèÿæææÿãããÿáááÿÞÞÞÿÛÛÛÿÙÙÙÿ×××ÿÔÔÔÿÑÑÑÿÏÏÏÿÌÌÌÿÉÉÉÿÇÇÇÿÅÅÅÿÂÂÂÿ¿¿¿ÿ½½½ÿoooÿ111°*yyyÿýýýÿýýýÿëëëÿ×××ÿT[_ÿ;¬íÿ;¬íÿ=­íÿe½ïÿ~Æðÿ ÒðÿµÙïÿÈßíÿéééÿæææÿäääÿâââÿßßßÿÜÜÜÿÙÙÙÿ×××ÿÕÕÕÿÒÒÒÿÐÐÐÿÍÍÍÿÊÊÊÿÈÈÈÿÆÆÆÿÃÃÃÿÀÀÀÿ¾¾¾ÿ   ÿAAAâ@ yyyÿøøøÿäääÿÝÝÝÿ¥¥¥ÿEw“ÿ;¬íÿ;¬íÿ>­íÿD°îÿJ²îÿPµïÿV·ïÿ\ºðÿb¼ðÿwÃðÿŒÊîÿ£Ðêÿ²ÓçÿÄÖàÿÓ×ÚÿÖÖÖÿÓÓÓÿÐÐÐÿÎÎÎÿËËËÿÈÈÈÿÆÆÆÿÄÄÄÿÁÁÁÿ¾¾¾ÿµµµÿXXXùt222Jÿæææÿäääÿáááÿqqqÿ= Ùÿ;¬íÿ;¬íÿ>­íÿD°îÿK²îÿPµïÿV·ïÿ]ºðÿb¼ðÿi¿ñÿoÂòÿtÄòÿ{Çóÿ€Éóÿ†ÌôÿÎôÿ¢Ñìÿ­ÒçÿµÑáÿÀÍÕÿÃÉÍÿÄÄÄÿÂÂÂÿ¿¿¿ÿ¼¼¼ÿ„„„ÿ000ÍE CCC·ÄÄÄÿéééÿæææÿÑÑÑÿUp€ÿf¿ñÿc½ñÿ_»ðÿZ¹ðÿW¸ðÿO´îÿQµïÿW·ïÿ]ºðÿc½ðÿi¿ñÿoÂòÿuÄòÿ{ÇóÿÉóÿ‡ÌôÿÎôÿ“Ñõÿ™ÔöÿŸÖöÿ¥Ù÷ÿ«Û÷ÿ±Þøÿ¹Ûîÿ¿ØçÿÁÑÚÿMMMÿ£Y***;vvvÿïïïÿìììÿéééÿ‡‡‡ÿfž¾ÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ”Òõÿ–Óõÿ‰ÍôÿÐõÿƒÊôÿ„Ëóÿ{Çóÿ‚Êóÿ‡ÌôÿÏôÿ”Ñõÿ™ÔöÿŸÖöÿ¥Ù÷ÿ«Û÷ÿ²ßøÿ¹âùÿÀäùÿÇçúÿ„’™ÿ###Ñ…6 CCC·ËËËÿòòòÿïïïÿÏÏÏÿ[fkÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿËéúÿÃæùÿÀäùÿ¡Ñìÿ”ÒõÿœÕöÿ£Ø÷ÿ©Û÷ÿ°Þøÿ·áøÿ¾äùÿÅæúÿÄàïÿRTUû¬a,,,8xxxÿøøøÿËËËÿvvvÿVkvÿh¦ÉÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿŽ•šÿŠÁàÿ™Ôöÿ¡×öÿ¨Ú÷ÿ®Ýøÿµàøÿ¼ãùÿÄæúÿÊéúÿ–¦¯ÿ---Ü‹= HHH«ÿcccÿ[y‹ÿj­ÓÿqÃòÿqÃòÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿrvyÿ_nwÿ˜ÓöÿŸÖöÿ¦Ù÷ÿ­Ü÷ÿ´ßøÿºâùÿÂåùÿÈèúÿÏëûÿ[^`ù™LMMMðHHH¼[y‹ÿqÃòÿqÃòÿqÃòÿqÃòÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿrvyÿAAA䄱ËÿÖöÿ¤Ø÷ÿ«Û÷ÿ²Þøÿ¹áùÿ¿äùÿ¿Ýïÿ­ÃÏÿouyÿBBB»+ HHHJJJdVkvÿ_ˆ ÿ_ˆ ÿd—´ÿh¦Éÿh¦Éÿm®Óÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿ]_`úŒ_nwÿ›Õöÿ’¾×ÿ†¥·ÿ•¢ÿhrxÿRUVæIIIÊDDD‘???a====JJJ2HHHEEEEHHHHxHHH‰GGG‹III¨JJJÇJJJÈKKKÖ]nwÿ_nwÿaowÿx“¢ÿ{”¢ÿ~•¢ÿ–²Ãÿ¡¾Îÿ¥¿Îÿ»ÕäÿÐëûÿ×îûÿÞñüÿBBBÞXGGG¬KKKÅHHH«CCC€>>>P...HHHJJJCEEEGDDDIIII‡HHHŠFFFŒJJJÆJJJÇJJJÈ_bcñIIIÉ ÿÿþÿþðüÀ?ððððððððððððððððððððÿðÿðÿðÿðÿðÿðÿðÿðÿðÿððððàÿàÿÀÿÀÿ€ÿ€€€€€àÿÿþÿÿnsis-3.11/Contrib/Graphics/Icons/orange-install.ico000077500000000000000000000611761477201124000222540ustar00rootroot00000000000000 (–h¾ è& ¨ 00h¶00¨ hÆ'  ¨.,00 ¨%Ö<( À€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ »»° »»»»°»»° »»»»ð»» »°ÿÿ »° »ÿÿ»° »»ð»»° »»ð»»° »»ð»»° »»ð»»°»»ð»»»»»» »»»»° »»°øàÀ€€€€Ààø( @2+%3(!-"SVYˆ¥³Ÿ¨¥³À‡‡…TOK*%"($!@>:‹š§sÁïuäÿâÿ èÿ±çÿÊíÿ×õÿª£›”Ýÿ½÷ÿßüÿ™˜–º¸¸êÜÕf¨Ï‡×ÿ‹Õü×ý”×ü¢ÚþŽÐúžÞÿ·ìÿ¹ÍÛÿÿÿ]|™ï-³ÿXÂÿ…ÏùžÑï¹ØéËÐÓÎËȯ­¬0.,$"ÊÃÀÊÞêÿýýÿøõöîëíçäåàÞÔÒЮ¬¬›””“&$"š–”Þàß¶·¹®®¯¥¤£ŒŒ‡††žŸ’Ž10.|zÉÉÊ×××ÉÊȾ¼»¼¼¼²±±¨¨¨ª©©¬«¬™—•-(#ÃíÿÁÂÃãââÌÊɳ²²¾»¹©¨¨±±±½¾¿À¿¾žš/& ¨ñÿÂçýõëçàÖÏɾ·ÌÈÆÔÔÓÓÒÑÍÊÇš™ˆ‚~1' ”ëÿ¼ß÷¬àÿyÏÿ^Íÿ¯Îäèåⵯ«Ÿª²ÎñÿÖöÿ¿ÆÊ.+'ºÄÊÊëþÖîü˜Øü”ÕýãìóßÓÍ}¬Ê•Ìð½µ±®£›çÿŸÄÞ32/rrq°ª¨ÿÿüãðù©àÿˆ¨`ÒÿJ³õñèäÒÇÂRËÿkàÿ:-%('$ø÷÷ÈÅøåÿ ÛüÖý‚ÓÿM”Á%§ù``]ðííäÝÚY}™+±ÿ+*'òòñçååàòþ°âþÛýˆÜÿwŸ¶1ªù+Ïį §š’&Ñ?¿ÿ ¿¾½ìêëòÿÿæÿÿÞ÷ÿÉÌϵ¬Ywˆ5¼ÿF’Ç1‘Í;¾ÿU]cžœª¨§_\["]±^°'!‹½½½Â‹¡½À®®®®À½‹¡¿®®®ÉÉ®®®¿¡¡¿®®®¿¡Â¿®®®¿‹¤®®®À3S®®®®½¡À®®®ÂUMMF®®®À‹½®®®½FNNNN@½®®®‹½®®½ ‹O¨¨O‹ ¤®®½½’’’’¤Y··Y¤’’’’½½¤O§§O¤½¡Ê[™™[Ê‹Ê$$$Ê1881Ê$$$*¡‰##‹LL‹##„¡¡‰qqqqqqqq‰‹¡70@¡¡HGGL¡øàÀ€€€€Ààø( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿw»»»»ÿw»»°»»»»»ÿw»»»» »»»»°ÿw»»»» »°ÿ »°ÿw»»»°»»ÿð»»ÿw»»»°»°ÿ𠻈w»»»°»»°ÿ »»ˆw{»»°»»°ÿ »»ˆwww{°»»°ÿ »»‹wwwwp»»°ÿ »» »w»»ww »°ÿ »° »w»»»w »° »° »w»»»wp»»»»» »ww{»ww»»» »ww‡ˆwww ¸wwxxxˆ‡xxˆwˆ‡ˆwwww‡ˆwwxˆxˆˆxxˆwwwwwwxˆˆwpˆxxˆÿwwx€ˆÿpwwwwwx€ÿwwwwwwwwwÿ »·wwwwwwpð»»»»»·wwwÿðw{»»»»»»·ÿ»·www»·w{°ð »»»»»w »»° »»»»»»» »»°»»»»ø?ð?ðÀàÀÀÀÀÀÀÀÀÀÀÀÀÀ?ÀÀÀÀÀÀÀÀÀ?À€€??€?ÿ€ÿ( @€        !! #""$$#%%$('&)(',*)/-+1/-30.620732742854865865976:98<:9><;@>=D@>FB@JEAIFDHHHDJMBLP>MU8O[0Se,Uj'Xq"\y`ƒa…c‡eŠ!d†'dƒ0d~=dyGcrQ`hW^bZ^_]]]`][b]Zd^Ze`\hb^jebkifnljnoorssuusxvtzwu{xu}xu|yv}zx}{y}}|~~€‚‚‚ƒƒƒƒ†ƒƒˆ„‚‰„‚‰…„‰††Šˆ‡‹‰‰ˆ‹†Œ‡’ˆŽ’Š“’”’”–––—™™šœ››ž ŸŸ¢¡¡£¢¢¤££¥¥¥¥¥¦¨§§ª©©¬««¯®®²±°µ³²·¶µ¹¸¶º¹¸»º¹»»»¼¼½º¼¾¶¼À¬¹ÄŸ¶È…±Ñt«Öi¨Õ\¥×R ÕIŸÚB¢á6¥ë-£ë#¤ï§õ­ý¬þ­þ!­þ#­þ%­þ+¯þ7´þC¹þP¾þVÁþ\ÃþbÅýfÇýhÉýlËýrÌüxÏþ€Ïþ„Ðþ‡Ðþ‰ÒþŒÕþÖþ’×þ•Ùý›Úü Ûü£Ûû¦Üü©ßü¬àþ®áþ°âþ³ãþµãþ¸äþ¼åþ¿èþÃæþÇæýÉæýÉæüÆäúÄâøÂàõ¿Üï¾Úë¿×ç½Õä¿ÓßÁÑÚÃÎÔÄÍÑÆÊÌÆÇÈÆÆÆÆÆÅÿÿÿÊÈÇÍËÊÏÍÌÏÎÍÐÏÎÓÒÑÕÔÓÖÕÕØ×ÖÙÙØÛÚÚÜÜÝÞÞßààáãããæååççéèéìéëîêëïììïííðîîñîðóíòöëõùìøüïúý÷üýûýþúýýùýþfmad‚caaccvðßÜ‚naf‚WUŸ¡¡ŸUab…æðüùùú÷Ü‚nafjV ¡¡Ÿ ¡¡ŸXa•ççñûÏÐÉÅÊÏù÷ŽW¡¡¡ŸdV ¡¡ŸaaéééòûÐÊÇÂÀ¾¹¸{Ÿ¡¡ d‹V¡¡¡ŸaéééôûÐÉÅÁ¿¼¹·V¡¡¡V•ââ‰U¡¡¡aaêêêõÏÊÇÂÀ¾¹¸µU¡¡UÞììì섟¡¡daëádöÏÈÅÁ¿¼¹·œŸ¡¡VVÞññ‚VŸ¡¡VaŽYlößßúùз¶´o¯¯¯žÜööƒ¯¯¯¯dayalöûùûýüøòÏÓoµµµœáøø…µµµµbar†ÕöùÊÆÂÅÒñòñš¹¹šäýý‡¹¹¹›aê¿¶÷ùÅÁ¾¹·½ðîéd™{ƒƒy™aaÀ··öÏÁ¾¹·µ¹îìì•oÔÐÐÐÐÐÐØ[aÀ¹¹öϾ¹·µ¶šìêéèÞfƒØÏÏÚyaa¼¼öõïêåà••éèåäãá’~vr`aÅ¿¿öðíèãÞ”•ãÜäáÜÝÞ••“aaÈÀÖôîêåà•‘àŽŠ‹••“‘aaщfòíèâÞ”Ž’’••’Žaa~xnñëçäÞÜ•ˆ‰†‰Œaa‡fåðé•ÞäáÞ•‘Š‹ˆ‹‹ŠŠaaáöüðçp݇xp‰’‹Ž‰…„†‡aaüüüïÝþü÷öôá€vnmv~†„aaþþþáýü÷öõñïîìêèæ‡xmaadaýýòd¿ÏÏööòðîíëéçåâàÝÞ•qdaüî•U¡¡­®µ¹ÂÕÕéçåãáÜÞ•`cðîz ¡¡­®¯±²µ¶¸¾ÁÖ×ÚÞ•cmmƒôìoµ·µ¶µ¶µµµ·¸¹¾ÀÂÆÊÍdcñ·¹½¿ÂÅÉÐÐÐÊš¿ÂÆÉИcm~z›µµ·¹½¿ÂÅÉÐÏÏùc¿ÁÃÈÐÏmna^œµµµµ·¹½¿ÂÅÉÐÏÏùX›ÀÂÈИ{aeeeeeeeeeš¿ÅÉÐÏÏÚdc{odadmfcaacopefmüü?øððàààààààààààà?à?à?à?à?à?à?à?ààààÀ?À€€Àÿàÿ(0`€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ÷p »»°ÿ÷wwp»»»»»»ÿ÷»»wwp »»»»»»°ÿ÷»»»»wwp»»»° »»»ÿÿ÷»»»»»»· »»»ð»»»°ÿÿ÷»»»»»»» »»°ÿÿ »»°ÿÿ÷»»»»»»» »»ÿÿð»»°ÿÿ÷»»»»»»°»»°ÿÿÿÿ »»ÿÿ÷»»»»»»°»»ÿÿ»»ÿÿ÷»»»»»»°»»»°ÿÿ »»»øˆ÷»»»»»»°»»»°ÿÿ »»»ˆˆ÷w{»»»»°»»»°ÿÿ »»»ˆˆ÷wwww»»°»»»°ÿÿ »»»ˆˆ÷wwwwww» »»°ÿÿ »»°ˆ‹÷wwwwwww »»°ÿÿ »»°‹»÷{»»wwww »»°ÿÿ »»°»»÷{»»»»·wp»»° »»»»÷{»»»»·ww »»»»»»°»»÷{»»»»·wwp»»»»»»»»÷{»»»»·www »»°»»÷{»»»»·wwwwp»»÷www»»·wwwww‡€»»÷wwwxxwˆ‡wwwwp»»÷www‡‡‡wxˆ‡‡‡€»ˆ÷wwxxx‡wwwwwxpˆˆ÷ww‡‡ˆ‡ˆˆw‡‡‡€ˆˆ÷xˆˆxˆ‡wwˆˆˆxpˆˆ÷wwwˆˆ‡ˆw‡‡ˆ‡€ˆ÷wwwwwwwˆˆxxx€ˆÿ÷w‡w‡‡ˆˆˆ€ÿÿ÷pwwx€ˆˆxxˆ€ÿÿ÷pwwwwwˆˆˆ€ÿÿ÷wwwwwwwwˆÿÿwwwwwwwwwwwwˆÿwwwwwwwwwwwwwww÷w »»·wwwwwwwwwwpww »»»»»»wwwwwwwwp»»»»»»»»»»wwwwwpww»»»»»»»»»»»pww »»wwwww»»»»·w»wp »»»»»»»wwww{»»°w»»»»»»»»»» »»»»°»»»»»»»»»»» »»»»»»»»»»»»»»»»»»»»» »»»»»»»»»»» »»»ÿ‡ÿÿÿêõÿü?¹¸þøììüpdødöø¹·øÞñøVølöø·¶øÜöødølöøòÏøáøøbøÕöøñòøäýøø?¶÷øÿ½ðøÿ{ƒøÿøÿ·öøÿ¹îøÿÐÐøÿøÿ¹öøÿšìøÿØÏøÿøÿ¼öøÿ•éø~vøøÿ¿öøÿ•ãðÿ••ðÿàÿÖôàÿ‘àÀÿ“‘À€fòàÿ’ÿ?ÿÿÿøÿÿ(0`€ €€€€€€€ÀÀÀÀÜÀðʦ€€€ÿÿÿÿÿÿÿÿÿÿÿÿðûÿ¤  Ôðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿÿܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÿÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%ÿܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÿÿÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&÷ø÷  ööööõõøôîô÷ø÷ ÷ù÷ øøö øïìíõøøö öø ÷ø ö÷ñïïìîñõøøö öøø ÷øïîîîì  îñöùøøùøø øîîîîîì íùùô÷÷øøîîîîîì  øöñøö÷öøîîîîîìø÷÷ðððòùøøîîîîîìó øïïïïïòúøõøîîîîîì ùîîîîîîòù öøîîîïïì÷ùø÷òíííí÷÷úø÷øîîñùñì ÷÷óííííú÷øîôúôîì÷ óììììú öøõøòøìì õ#õóììììúö øòôúôíììììíðöõììììúøøõùíí ìììííøôúó÷øîîî  ííñöôôïïïïúøõøíî  íííöòò÷÷÷÷÷÷ööø ìîííîïøòõøø ìììîíîîîïö î ÷÷ø ììì"îîîîîîïóøõ ïñöø ø ìììííîîïïðñïîîîîïïïïñõ÷÷÷ù÷ ø ìììííîîïïðñïîîïïïïïïððõöø  ìíííîîïïðññïïðïïïïïððñ öø íííííîîïïðññïðñòññññ öø  òîíííîîïïðññòðïïïïðñòññññ öøï öîíííîîïïðññòðñòòññññññ öøñøòîíîîîîïðññòòïðñòóòòòñò öøñ ÷ííîîîîîïïïñòñòñññññòòóòööøñøóììíîîñïïïïïððñòóòòòòòòòööøïìììîîïøôöøöõóòñññññòòóóóööøîïõñììîðóõöø÷ ôñòòòòòööøîòöìììììíííïô ÷ø÷öõôóööøïøììììììíííííîîîîîðòôö÷øùøö ø÷ïìììììíííííîîîîîïïïïïððòóõùöøìòö íìììíííííîîîîîïïïïïððøøíîö!îîíîîîîîïïïïïððñø øìííïø!ïïïïïïðð ÷ öíííô!!ïïðòøøðíííø òø öììíò  ÷ øïììð÷ ! ðø øñøö óô õöø÷øõ óù îù ù÷ø ôø ó÷öõöù÷õõõ### öø"òô÷øø÷ö  ööö÷÷÷øøøø÷÷ ôôòïööøø÷öõööö÷÷÷øøøøøÿÃÿÿÿÿ?þþøü0øøøøøøøøøøøøøøøøø?øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøø?øøøÿðÿðÿàÿàÿÀÀ€? øÿÿÿÀÿÿ(  @3L[]Q<"  , g$$$«000Î///Ò%%%Ȭ‘o= 3555¹Cn‡ù@”Åÿ;¬íÿ;¬íÿ>šÏÿD}ÿ=DHî·„D1EMQã>šÏÿ;¬íÿ;¬íÿ<¦ãÿ@”Åÿ;¬íÿ;¬íÿ<¦ãÿDh|ûÀ7 CMRÅ>šÏÿ;¬íÿ;¬íÿ;¬íÿOk{ÿqx|ÿ>šÏÿ;¬íÿ;¬íÿ;¬íÿEarû®d:::UBˆ±ÿ;¬íÿ;¬íÿ;¬íÿFq‰ÿ¨¨¨ÿ¶¶¶ÿ_uÿ<¦ãÿ;¬íÿ;¬íÿ= Ùÿ4šÏÿAGLó«bDDDI«««ÿÖÖÖÿÖÖÖÿëëëÿóúþÿÉèúÿ¿äùÿ´àøÿªÛ÷ÿ¦Ù÷ÿ¶àøÿÄæúÿßñüÿaowÿ<¦ãÿ;¬íÿ;¬íÿ@”Åÿ€€€ÿlsxÿ= Ùÿ;¬íÿ;¬íÿ>šÏÿ111á‹7DDDIµµµÿØØØÿØØØÿìììÿòùþÿÄæúÿºâùÿ¯Ýøÿ¥Ù÷ÿ›ÕöÿÐõÿ†Ìôÿq©ÊÿBˆ±ÿ;¬íÿ;¬íÿ>šÏÿry}ÿÃÃÃÿ¼¼¼ÿav‚ÿ<¦ãÿ;¬íÿ;¬íÿFq‰ÿ¥ODDDI¶¶¶ÿÚÚÚÿÚÚÚÿìììÿðùþÿ¾äùÿ´ßøÿªÛ÷ÿ ×öÿ–Òõÿ‹ÎõÿÊôÿa‚–ÿ;¬íÿ;¬íÿ<¦ãÿdy…ÿÌÌÌÿÔÔÔÿÔÔÔÿ¼¼¼ÿPtˆÿ;¬íÿ;¬íÿ>šÏÿ%%%È]DDDI¸¸¸ÿÜÜÜÿ¸¸¸ÿíííÿïøþÿ¹áùÿ¯Ýøÿ¤Ù÷ÿšÔöÿÐõÿ†Ìôÿ{ÇóÿSƒžÿ<¬íÿ<¬íÿHkÿ„„„ÿ¾¾¾ÿåååÿåååÿªªªÿ{{{ÿEw“ÿ<¬íÿ<¬íÿ///Ó]DDDIºººÿ•••ÿ___ÿïïïÿûýÿÿèõýÿÏëûÿ±Þøÿ•Òõÿ‹Îôÿ€ÊóÿvÅòÿV„ŸÿN´ïÿN´ïÿN´ïÿN´ïÿÿíííÿíííÿuÿN´ïÿN´ïÿN´ïÿN´ïÿ000ÏODDDI{{{ÿiiiÿiiiÿðððÿÿÿÿÿùýÿÿÿÿÿÿþþþÿôøûÿÔêöÿ¸Þóÿ’Ïòÿ]•ÿjÀñÿjÀñÿjÀñÿjÀñÿ   ÿóóóÿóóóÿ~“ŸÿjÀñÿjÀñÿjÀñÿdªÒÿ(((·7DDDI………ÿiiiÿ¸ÃÈÿñññÿÿÿÿÿÅæúÿÁäùÿÈçøÿÐè÷ÿáíôÿðððÿíííÿÂÂÂÿo›µÿ…Ëôÿ…Ëôÿ…Ëôÿ£££ÿùùùÿùùùÿ†—¢ÿ…Ëôÿ…Ëôÿ…Ëôÿa|‹ÿ kDDDI¢¢¢ÿÃÛéÿ~Èòÿòòòÿþþþÿ·àøÿ«Û÷ÿžÖöÿ’Ñõÿ…Ëôÿ–Ïðÿèèèÿåååÿ|ƒ‡ÿšÎëÿ ×öÿ ×öÿyyyÿ¥¥¥ÿ¥¥¥ÿx…ÿ ×öÿ ×öÿ¼Öÿ999Á.DDDIšµÅÿÉóÿÉóÿñññÿúúúÿªÛ÷ÿžÖöÿ‘Ðõÿ…ËôÿxÆòÿ‹ÊïÿäääÿàààÿËËËÿiqvÿ³Øîÿºâùÿºâùÿºâùÿºâùÿºâùÿºâùÿ¤ÅØÿNQSâ0 DDDI‘´ÇÿˆÍôÿˆÍôÿðððÿõõõÿÕöÿÐõÿ„ËóÿwÅòÿkÀñÿÅæÿßßßÿÛÛÛÿØØØÿÍÍÍÿvxyÿŸ°ºÿÌãðÿÕíûÿÕíûÿÃÙåÿŽœ¤ÿLNP¬+DDDI–¶ÉÿÐõÿÐõÿïïïÿðððÿéééÿßßßÿÕÕÕÿËËËÿÂÂÂÿÂÂÂÿÚÚÚÿ×××ÿÔÔÔÿÐÐÐÿÍÍÍÿ²²²ÿ‰‰‰ÿ‡‡‡ÿxxxÿ444ÕgDDDI›¹Êÿ™Ôöÿ™ÔöÿîîîÿìììÿäääÿÚÚÚÿÐÐÐÿÇÇÇÿ½½½ÿ½½½ÿÎÎÎÿËËËÿÎÎÎÿËËËÿÈÈÈÿÅÅÅÿÁÁÁÿ¾¾¾ÿŸŸŸÿ´H DDDI »Êÿ¢Ø÷ÿ­ÏãÿìììÿçççÿßßßÿÕÕÕÿËËËÿÂÂÂÿ¸¸¸ÿ¸¸¸ÿÉÉÉÿ²²²ÿ«««ÿ­­­ÿ¬¬¬ÿÀÀÀÿ¼¼¼ÿ¹¹¹ÿœœœÿ´H DDDI­ÀÊÿ™¦­ÿxxxÿëëëÿâââÿÚÚÚÿÐÐÐÿÇÇÇÿ½½½ÿ³³³ÿ³³³ÿ¿¿¿ÿ¨¨¨ÿ°°°ÿ¸¸¸ÿ¼¼¼ÿ»»»ÿ¸¸¸ÿµµµÿ˜˜˜ÿ´H DDDIƒƒƒÿ‰‰‰ÿoooÿéééÿÝÝÝÿÙÙÙÿÒÒÒÿÊÊÊÿ¾¾¾ÿ°°°ÿ®®®ÿÁÁÁÿ¼¼¼ÿ»»»ÿ±±±ÿ©©©ÿ¤¤¤ÿ£££ÿ¥¥¥ÿ•••ÿ´H DDDI•••ÿÿÚÚÚÿèèèÿÙÙÙÿ´´´ÿÿ¯¯¯ÿ»»»ÿÈÈÈÿÅÅÅÿ¼¼¼ÿ­­­ÿ¥¥¥ÿ§§§ÿ¤¤¤ÿ§§§ÿ©©©ÿ©©©ÿ‘‘‘ÿ´H DDDI»»»ÿøøøÿøøøÿçççÿÌÌÌÿ‚‚‚ÿñññÿÍÍÍÿ   ÿ‘‘‘ÿ’’’ÿ~~~ÿŠŠŠÿÿ­­­ÿ°°°ÿ¨¨¨ÿ£££ÿŸŸŸÿŽŽŽÿ»e.DDDIÎÎÎÿúúúÿúúúÿåååÿyyyÿñññÿùùùÿõõõÿñññÿîîîÿêêêÿæææÿÐÐÐÿºººÿ“““ÿ†††ÿ………ÿtttÿ}}}ÿ{{{ÿÈk+CCCJÐÐÐÿûûûÿûûûÿŸŸŸÿÑÑÑÿúúúÿöööÿòòòÿïïïÿëëëÿçççÿãããÿßßßÿÛÛÛÿØØØÿÔÔÔÿÐÐÐÿÌÌÌÿ¸¸¸ÿ¦¦¦ÿ†††ÿfffú!!!•%???NÑÑÑÿõõõÿßßßÿOy‘ÿS¶ïÿnÀðÿ”Îñÿ«ÖðÿÈàíÿßåèÿäääÿàààÿÜÜÜÿØØØÿÕÕÕÿÑÑÑÿÍÍÍÿÉÉÉÿÅÅÅÿÁÁÁÿ¶¶¶ÿPPPäG :::jÆÆÆÿâââÿ§§§ÿ@”Åÿ;¬íÿ@®íÿJ²îÿS¶ïÿ\ºðÿe¾ñÿnÂòÿ’Ìîÿ¢Ðêÿ°ÒåÿÃÒÛÿÅÏÕÿÊÊÊÿÆÆÆÿÂÂÂÿ¾¾¾ÿ}}}ÿ›0 TTTÐêêêÿçççÿw‡ÿd½ñÿ^»ðÿ]ºðÿ]ºðÿX¸ïÿ]ºðÿf¾ñÿoÂòÿxÆóÿÊóÿ‹Îôÿ”ÒõÿÖöÿ¦Ú÷ÿ´Ùîÿ¼ØçÿÂÒÛÿ:::ê“C 333I   ÿïïïÿÄÄÄÿaªÿvÆóÿÊôÿ‹Îôÿ”ÒõÿŸ×öÿ©Û÷ÿ¥Ù÷ÿªÛ÷ÿ ×öÿªÛ÷ÿŸÖöÿ˜Óõÿ›Õöÿ¥Ù÷ÿ°ÞøÿºâùÿÅæúÿ…’™ÿ·n$WWW®ÙÙÙÿŽ“–ÿ]•ÿo¼èÿvÆóÿÊôÿ‹Îôÿ”ÒõÿŸ×öÿ©Û÷ÿ³ßøÿ½ãùÿÇèúÿÑìûÿÛðüÿ„‘™ÿ“Ëëÿ¢Ø÷ÿ­Ü÷ÿ·áùÿÂåùÿÄàïÿEFHây3FFF#LLLâXrÿo¼èÿqÃòÿqÃòÿvÆóÿÊôÿ‹Îôÿ”ÒõÿŸ×öÿ©Û÷ÿ³ßøÿ½ãùÿÇèúÿÑìûÿÛðüÿotwúr¡ÿŸ×öÿªÛ÷ÿµàøÿ¿äùÿÊéúÿ‰Žÿ+++tKKK!FFF#R_gÂZ{Žñ_ˆ ÿ_ˆ ÿd‘ªÿtªÊÿ{®Êÿ‡¹ÖÿŸ×öÿ©Û÷ÿ³ßøÿ½ãùÿÇèúÿÑìûÿÛðüÿlqtÞEJMÁ„«Áÿz”¢ÿm}†æZad¼EEE@@@`777-KKK!HHHDEEEGGGGhHHH‰GGG‹HHHšn{Æq{Èrz~Ö”ž¤ÿDDD¡(EEEHüðø@àààààààààààààààààààààààÀÀ€€€€þÿ(0` €%   ,Ym`H3# +?OZWH6#7999Á@@@ç...×½›Œv[C/! 3]—"""¶000Ï***̺¡ŽsN& OBBBÞ‡‡‡ÿèèèÿÇÇÇÿ›››ÿcccÿ>>>î)))Ô¶—‡qZC/ U444¿FMQóGkÿD}ÿAŽ»ÿBˆ±ÿD}ÿJ_kÿ>>>îÉšo7!!!pMMMé   ÿÒÒÒÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ¼¼¼ÿÿ```û:::é)))Óµ—‡pU=9%%%„FNQñD}ÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ= ÙÿFq‰ÿ>>>î°|< 111~SSSøºººÿÔÔÔÿÔÔÔÿôôôÿÿÿÿÿãóýÿàòüÿêöýÿ÷üþÿÿÿÿÿÿÿÿÿéééÿ¼¼¼ÿÿUUUû:::é$$$Í®”(((¹J_kÿ= Ùÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿAŽ»ÿ= Ùÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿAŽ»ÿELO÷·x1AAA_gggÿÌÌÌÿÕÕÕÿÕÕÕÿÕÕÕÿôôôÿÿÿÿÿÛðüÿÊéúÿÃæúÿ¼ãùÿºâùÿÈèúÿÙïüÿíøýÿÿÿÿÿÿÿÿÿÞÞÞÿ±±±ÿ………ÿQQQ÷J_kÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ>šÏÿX_cÿJ_kÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ>šÏÿBBBó«cFFFŒ´´´ÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿõõõÿÿÿÿÿÙïûÿÇçúÿÀäùÿ¹áùÿ²ßøÿ«Ü÷ÿ¥Ù÷ÿŸÖöÿ˜Óöÿ¬ÜøÿÄæúÿàòüÿÿÿÿÿbimÿ>šÏÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿSZ^ÿ¡¡¡ÿŽŽŽÿFq‰ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿC‚§ÿ111á;FFFŒµµµÿØØØÿØØØÿØØØÿØØØÿõõõÿÿÿÿÿÖîûÿÃæúÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡Øöÿ›Õöÿ”ÒõÿÏõÿ‡Ìôÿ€Éóÿj™µÿD}ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿJ_kÿ›››ÿ¾¾¾ÿ¾¾¾ÿxxxÿD}ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿKYaÿ¯ZFFFŒµµµÿØØØÿØØØÿØØØÿØØØÿõõõÿÿÿÿÿÔíûÿÀäùÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ˜Óöÿ‘ÐõÿŠÎôÿƒËôÿ|ÈóÿUdlÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿFq‰ÿ“““ÿÉÉÉÿÉÉÉÿÉÉÉÿÉÉÉÿeeeÿBˆ±ÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿBˆ±ÿ)))Ôt"FFFŒ¶¶¶ÿÚÚÚÿÚÚÚÿÚÚÚÿÚÚÚÿöööÿÿÿÿÿÑìûÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿ›Õöÿ”ÒõÿÏõÿ‡Ìôÿ€Éóÿv¿éÿIeuÿ;¬íÿ;¬íÿ;¬íÿ;¬íÿC‚§ÿÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÍÍÍÿ]dhÿ>šÏÿ;¬íÿ;¬íÿ;¬íÿ<¦ãÿ>>>î†+FFFŒ¸¸¸ÿÛÛÛÿÛÛÛÿÛÛÛÿÛÛÛÿöööÿÿÿÿÿÏëûÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ—Óöÿ‘ÐõÿŠÎôÿƒËôÿ|Èóÿl§ÉÿD}ÿ;¬íÿ;¬íÿ;¬íÿAŽ»ÿVVVÿºººÿÌÌÌÿßßßÿßßßÿßßßÿßßßÿºººÿŸŸŸÿKYaÿ<¦ãÿ;¬íÿ;¬íÿ;¬íÿGV]ûŽ/FFFŒ¹¹¹ÿÝÝÝÿÝÝÝÿ§§§ÿ§§§ÿöööÿÿÿÿÿÌêûÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿšÔöÿ”ÒõÿÏõÿ‡Ìôÿ€ÉóÿyÆóÿj¦ÉÿF}ÿ>­íÿ>­íÿ>­íÿFƒ§ÿG~ÿIq‰ÿ›››ÿèèèÿèèèÿèèèÿèèèÿLYaÿG~ÿG~ÿD»ÿ>­íÿ>­íÿ>­íÿIeuÿ‹.FFFŒºººÿÕÕÕÿƒƒƒÿVVVÿºººÿ÷÷÷ÿÿÿÿÿÿÿÿÿì÷ýÿÛðüÿÁåùÿ¤Ø÷ÿ—Óõÿ‘ÐõÿŠÎôÿƒËôÿ|ÈóÿuÅòÿh¦ÉÿM€žÿM³ïÿM³ïÿM³ïÿM³ïÿM³ïÿMšÆÿÿíííÿíííÿíííÿíííÿMguÿM³ïÿM³ïÿM³ïÿM³ïÿM³ïÿM³ïÿM`kÿ}'FFFŒŸŸŸÿhhhÿiiiÿÿŸŸŸÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéõûÿËèøÿ²ÝöÿŽÏôÿyÆóÿrÄòÿj­ÓÿRo€ÿ`»ðÿ`»ðÿ`»ðÿ`»ðÿ`»ðÿ[ ÇÿŸŸŸÿðððÿðððÿðððÿðððÿRivÿ`»ðÿ`»ðÿ`»ðÿ`»ðÿ`»ðÿ`»ðÿCCCïgFFFŒrrrÿŽŽŽÿ{{{ÿVVVÿÅÅÅÿ÷÷÷ÿÿÿÿÿùüþÿñùþÿÿÿÿÿþþþÿüüüÿúúúÿøøøÿöööÿôôôÿâìòÿÀßñÿ§ÕðÿY^aÿqÃòÿqÃòÿqÃòÿqÃòÿqÃòÿh¥Éÿ¡¡¡ÿõõõÿõõõÿõõõÿõõõÿVjvÿqÃòÿqÃòÿqÃòÿqÃòÿqÃòÿh¥Éÿ999ØI FFFŒ¡¡¡ÿ```ÿrrrÿÙÙÙÿâââÿøøøÿÿÿÿÿñùþÿÃåùÿ»âùÿÄæùÿÌèøÿÜí÷ÿïóõÿóóóÿñññÿïïïÿíííÿëëëÿ‡‡‡ÿp¢¿ÿÉóÿÉóÿÉóÿÉóÿtªÊÿ£££ÿùùùÿùùùÿùùùÿùùùÿZlwÿÉóÿÉóÿÉóÿÉóÿÉóÿ`{‹ÿ ™(FFFŒsssÿ˜˜˜ÿäääÿ¬Ôëÿ«Ôëÿøøøÿÿÿÿÿïøýÿºâùÿ²Þøÿ©Û÷ÿ¡×öÿ™Ôõÿ‘ÐõÿœÓóÿª×òÿÞçíÿêêêÿçççÿÓÓÓÿZfmÿ•Òõÿ•Òõÿ•Òõÿ•Òõÿƒ±Ëÿ¤¤¤ÿüüüÿüüüÿüüüÿüüüÿ_nwÿ•Òõÿ•Òõÿ•Òõÿ•Òõÿ‡¹ÖÿDDDêHFFFŒ¿¿¿ÿßãæÿ”ÎïÿxÆóÿ¯Öìÿøøøÿýýýÿêôûÿ±Þøÿ©Ú÷ÿ¡×öÿ™Óõÿ‘ÐõÿˆÍôÿ€ÉóÿxÆòÿËßëÿçççÿåååÿãããÿŽŽŽÿx’¢ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ•¿×ÿeqxÿeqxÿeqxÿeqxÿeqxÿu‹—ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿŸÐìÿ]gmÿ'''€FFFŒ³¼Áÿ…Êòÿ~Éóÿ~Éóÿ²×íÿöööÿúúúÿæòùÿ¨Ú÷ÿ ×öÿ˜ÓõÿÐõÿˆÌôÿ€ÉóÿwÅòÿpÂòÿÇÜèÿäääÿâââÿßßßÿÝÝÝÿpppÿ¨¸ÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¶àøÿ¯×îÿfqxÿ222•FFFŒ§¹ÄÿƒËôÿƒËôÿƒËôÿµÙíÿõõõÿ÷÷÷ÿáîöÿ ×öÿ˜ÓõÿÐõÿ‡ÌôÿÉóÿwÅòÿoÂòÿg¾ñÿÂÙæÿàààÿÞÞÞÿÜÜÜÿÚÚÚÿÏÏÏÿxxxÿz‡ŽÿÁÞïÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿÉèúÿ±ÊÙÿcjmÿ555ŠFFFŒª»ÅÿŠÎôÿŠÎôÿŠÎôÿºÜïÿóóóÿôôôÿÝëóÿ—ÓõÿÏôÿ‡ÌôÿÈóÿwÅòÿoÂòÿx¿èÿ|»àÿÊÖÝÿÝÝÝÿÛÛÛÿÙÙÙÿ×××ÿÕÕÕÿÓÓÓÿŸŸŸÿ]_`ÿˆ“™ÿ¾ÐÛÿÙïüÿÙïüÿÙïüÿÐåñÿ¬¼Åÿ€‰ŽÿGGGÐ///N FFFŒ¬½ÆÿÐõÿÐõÿÐõÿ½ÝðÿñññÿñññÿïïïÿèèèÿáááÿÛÛÛÿÕÕÕÿÎÎÎÿÈÈÈÿÂÂÂÿ»»»ÿÓÓÓÿÚÚÚÿØØØÿÖÖÖÿÔÔÔÿÒÒÒÿÏÏÏÿÍÍÍÿËËËÿšššÿ{{{ÿkkkÿjjjÿjjjÿTTTÿ555Ñ%%%d FFFŒ¯¾Çÿ•Òõÿ•Òõÿ•ÒõÿÁßñÿïïïÿîîîÿëëëÿåååÿÞÞÞÿØØØÿÒÒÒÿËËËÿÅÅÅÿ¾¾¾ÿ¸¸¸ÿÐÐÐÿ×××ÿÕÕÕÿÓÓÓÿÑÑÑÿÎÎÎÿÌÌÌÿÊÊÊÿÈÈÈÿÆÆÆÿÄÄÄÿÂÂÂÿ¿¿¿ÿ½½½ÿiiiÿ0FFFŒ±¿ÈÿšÕöÿšÕöÿšÕöÿÄáòÿíííÿëëëÿèèèÿáááÿÛÛÛÿÔÔÔÿÎÎÎÿÈÈÈÿÂÂÂÿ»»»ÿµµµÿÍÍÍÿÍÍÍÿÄÄÄÿÏÏÏÿÍÍÍÿËËËÿÉÉÉÿÇÇÇÿÅÅÅÿÃÃÃÿÁÁÁÿ¾¾¾ÿ¼¼¼ÿºººÿhhhÿ0FFFŒ³ÁÈÿŸ×öÿŸ×öÿ¤ØöÿÛéñÿëëëÿèèèÿåååÿÞÞÞÿØØØÿÑÑÑÿËËËÿÅÅÅÿ¾¾¾ÿ¸¸¸ÿ²²²ÿÉÉÉÿÃÃÃÿ³³³ÿ¦¦¦ÿ¥¥¥ÿ¨¨¨ÿ°°°ÿ···ÿ¿¿¿ÿ¿¿¿ÿ½½½ÿ»»»ÿ¹¹¹ÿ···ÿgggÿ0FFFŒµÂÉÿ¥Ù÷ÿÅãôÿ¦ª«ÿ´´´ÿéééÿåååÿâââÿÛÛÛÿÔÔÔÿÎÎÎÿÈÈÈÿÂÂÂÿ»»»ÿ´´´ÿ¯¯¯ÿÆÆÆÿÍÍÍÿËËËÿÉÉÉÿÇÇÇÿÂÂÂÿ¸¸¸ÿ¯¯¯ÿ¹¹¹ÿ¼¼¼ÿºººÿ¸¸¸ÿ¶¶¶ÿ´´´ÿfffÿ0FFFŒ»ÄÉÿÅÑÙÿ€€€ÿxxxÿ×××ÿçççÿâââÿßßßÿØØØÿÑÑÑÿÊÊÊÿÅÅÅÿ¾¾¾ÿ¸¸¸ÿ±±±ÿ«««ÿÃÃÃÿ¸¸¸ÿ¢¢¢ÿ¥¥¥ÿ¬¬¬ÿ°°°ÿ¶¶¶ÿ½½½ÿ»»»ÿ¹¹¹ÿ···ÿµµµÿ³³³ÿ±±±ÿfffÿ0FFFŒÿfffÿ¤¤¤ÿ£££ÿ¬¬¬ÿåååÿßßßÿÜÜÜÿØØØÿÓÓÓÿËËËÿÄÄÄÿ»»»ÿ´´´ÿ®®®ÿ¨¨¨ÿÀÀÀÿÇÇÇÿÅÅÅÿÃÃÃÿ¹¹¹ÿ°°°ÿªªªÿ¡¡¡ÿ¡¡¡ÿ¢¢¢ÿ§§§ÿ¬¬¬ÿ­­­ÿ­­­ÿeeeÿ0FFFŒ§§§ÿ­­­ÿxxxÿÿÙÙÙÿãããÿÛÛÛÿÙÙÙÿ×××ÿÕÕÕÿÓÓÓÿÑÑÑÿÍÍÍÿÆÆÆÿ¼¼¼ÿ´´´ÿ¿¿¿ÿ´´´ÿ¦¦¦ÿ­­­ÿµµµÿ···ÿ¹¹¹ÿ···ÿµµµÿ±±±ÿªªªÿ£££ÿ¤¤¤ÿªªªÿdddÿ0FFFŒ•••ÿfffÿ®®®ÿõõõÿõõõÿáááÿØØØÿ×××ÿ¢¢¢ÿˆˆˆÿ———ÿ®®®ÿÃÃÃÿÉÉÉÿÇÇÇÿÅÅÅÿÃÃÃÿÁÁÁÿ¼¼¼ÿ³³³ÿ©©©ÿ£££ÿ   ÿ   ÿ¤¤¤ÿ§§§ÿ©©©ÿ«««ÿ©©©ÿ§§§ÿcccÿ0FFFŒ¨¨¨ÿÜÜÜÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿßßßÿÕÕÕÿºººÿnnnÿÑÑÑÿ¹¹¹ÿ¢¢¢ÿwwwÿiiiÿkkkÿÿŽŽŽÿ¢¢¢ÿ´´´ÿ¹¹¹ÿ···ÿµµµÿ³³³ÿ±±±ÿ©©©ÿ¥¥¥ÿ   ÿÿŸŸŸÿ¤¤¤ÿbbbÿ0FFFŒÍÍÍÿøøøÿøøøÿøøøÿøøøÿÝÝÝÿÊÊÊÿfffÿÜÜÜÿûûûÿùùùÿöööÿôôôÿñññÿïïïÿÄÄÄÿ¯¯¯ÿÿsssÿ]]]ÿgggÿ€€€ÿ‹‹‹ÿ–––ÿ«««ÿ©©©ÿ§§§ÿ¥¥¥ÿ£££ÿ¡¡¡ÿbbbÿšN" FFFŒÎÎÎÿúúúÿúúúÿúúúÿúúúÿÛÛÛÿ~~~ÿ°°°ÿüüüÿúúúÿ÷÷÷ÿôôôÿòòòÿðððÿíííÿëëëÿèèèÿæææÿãããÿáááÿÕÕÕÿ···ÿœœœÿ‰‰‰ÿoooÿaaaÿcccÿxxxÿÿŠŠŠÿaaaÿ°sNFFFŒÏÏÏÿúúúÿúúúÿúúúÿúúúÿ±±±ÿ„„„ÿüüüÿúúúÿøøøÿõõõÿòòòÿðððÿîîîÿëëëÿéééÿæææÿäääÿáááÿßßßÿÜÜÜÿÙÙÙÿ×××ÿÕÕÕÿÒÒÒÿÏÏÏÿÅÅÅÿªªªÿ’’’ÿ‚‚‚ÿjjjÿMMM÷>>>í///Ó}!FFFŒÐÐÐÿüüüÿüüüÿüüüÿáááÿW^bÿÂÞîÿïöúÿùùùÿöööÿóóóÿñññÿïïïÿìììÿéééÿçççÿåååÿâââÿßßßÿÝÝÝÿÚÚÚÿØØØÿÖÖÖÿÓÓÓÿÐÐÐÿÍÍÍÿËËËÿÈÈÈÿÆÆÆÿÄÄÄÿÁÁÁÿ¾¾¾ÿ§§§ÿGGGòLFFFŒÑÑÑÿýýýÿöööÿáááÿ£££ÿC‚§ÿ;¬íÿ;¬íÿL²îÿrÂðÿ”Îðÿ¡ÓïÿÈàîÿØäëÿçççÿåååÿãããÿàààÿÝÝÝÿÛÛÛÿØØØÿÖÖÖÿÔÔÔÿÑÑÑÿÎÎÎÿËËËÿÉÉÉÿÇÇÇÿÄÄÄÿÂÂÂÿ¿¿¿ÿ¼¼¼ÿhhhÿ###Œ DDD’ÑÑÑÿðððÿßßßÿÛÛÛÿ^^^ÿ<¦ãÿ;¬íÿ<¬íÿA®íÿG±îÿM³îÿS¶ïÿY¸ðÿ_»ðÿe¾ñÿ‰Éîÿ›Îìÿ«Òèÿ¾ÕãÿÉÖÞÿ×××ÿÔÔÔÿÒÒÒÿÏÏÏÿÌÌÌÿÉÉÉÿÇÇÇÿÅÅÅÿÂÂÂÿÀÀÀÿ½½½ÿ‹‹‹ÿ777É7 CCC·ÌÌÌÿåååÿâââÿ»»»ÿFq‰ÿ;¬íÿ;¬íÿ<¬íÿA®íÿG±îÿN´ïÿS¶ïÿZ¹ðÿ_»ðÿe¾ñÿlÀñÿqÃòÿxÅòÿ~ÈóÿƒÊôÿŠÍôÿœÐîÿ¤ÒìÿµÑâÿ»ÏÛÿÀÍÔÿÆÆÆÿÃÃÃÿÀÀÀÿ¾¾¾ÿ­­­ÿMMMõ |"***;uuuÿêêêÿçççÿåååÿ………ÿb£ÈÿhÀñÿ]ºðÿa¼ñÿT¶ïÿV·ïÿN´ïÿT¶ïÿZ¹ðÿ_»ðÿf¾ñÿlÀñÿrÃòÿxÆóÿ~Èóÿ„ËôÿŠÍôÿÐõÿ–ÓõÿœÕöÿ¢Øöÿ¨Ú÷ÿ®ÜøÿµÝõÿ½ÚêÿÀÔßÿˆ”ÿ---Û‚1 CCC·ÇÇÇÿîîîÿëëëÿÞÞÞÿR\bÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™Ôöÿ•Òõÿ“ÑõÿÐõÿÎõÿ„Ëôÿ†Ëôÿ}Èóÿ~Èóÿ„ËôÿŠÍôÿ‘Ðõÿ–ÓõÿœÕöÿ¢×öÿ¨Ú÷ÿ¯Ýøÿ¶àøÿ½ãùÿÄæúÿºÕäÿEEE÷¢[***;mmmÿóóóÿðððÿîîîÿ’’’ÿd—´ÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿ¿äùÿÇçúÿ¸áùÿŽÉëÿ˜ÔöÿŸÖöÿ¦Ù÷ÿ­Ü÷ÿ´ßøÿ»âùÿÂåùÿÉèúÿœ¤ÿ(((ׇ8 CCC¶¹¹¹ÿíííÿ   ÿY_bÿ_ˆ ÿo¼èÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ×èñÿg~Œÿ–ÓõÿÖöÿ¤Ø÷ÿ«Ü÷ÿ²ßøÿ¹áùÿÀäùÿÇçúÿÅàðÿRTUû­d3330XXXÿŽŽŽÿ\glÿd—´ÿo¼èÿqÃòÿqÃòÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ»ÉÐÿMMMÿƒ±Ëÿ›Õöÿ£Ø÷ÿ©Û÷ÿ°Þøÿ·áøÿ¾äùÿÅæúÿÌêúÿ °ºÿ444Õp)KKK£JJJÇJJJçj­ÓÿqÃòÿqÃòÿqÃòÿqÃòÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ»ÉÐÿ???é_nwÿ™Ôöÿ¡×öÿ§Ú÷ÿ®Ýøÿµàøÿ¼ãùÿÃæúÿ²ËÚÿ °ºÿMMMÿWKKK!LLLá_ˆ ÿfž¾ÿh¦Éÿh¦Éÿh¦Éÿi¦Éÿu¿èÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ©´ºÿ+++Ç@@@À†²Ìÿ™Îëÿ¶Íÿ}•¢ÿt„ÿaimÿJJJØFFF®EEE>>>P,,,KKK!HHHDEEEGEEEYHHHˆGGG‹HHHšJJJÆJJJÈJJJÈYelÿ^nwÿ`owÿlÿz“¢ÿ}•¢ÿ¨¸ÿž½Îÿ£¾Îÿ°ÊÚÿÍêúÿÓìûÿÛðüÿ–Ÿ¥ÿ!!!•PMMMðJJJÇDDD‘BBBp;;;> JJJ2HHHEEEEHHHHxHHH‰GGG‹III¨JJJÇJJJÈKKKä_bcÿ555\ÿÀÿÿÿÿø?þðüøøøøøøøøøøøøøøøøøøøøÿøÿøÿøÿøÿøÿøÿøÿøÿøøøø?ø?ððàà?À?ÀÀÀÀðÿÿÿ€ÿÿnsis-3.11/Contrib/Graphics/Icons/orange-uninstall-nsis.ico000077500000000000000000000611761477201124000235710ustar00rootroot00000000000000 (–h¾ è& ¨ 00h¶00¨ hÆ'  ¨.,00 ¨%Ö<( Àÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿÿÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿúªª¯ÿÿÿúªªªª¯ÿÿª¯ªªúªÿÿªüú¯Ïªÿú¯ÌÏüÌú¯úªüÌÌϪ¯úª¯ÌÌúª¯úª¯ÌÌúª¯úªüÌÌϪ¯ú¯ÌÏüÌú¯ÿªüú¯Ïªÿÿª¯ªªúªÿÿúªªªª¯ÿÿÿúªª¯ÿÿÿÿÿÿÿÿÿÿøàÀ€€€€Ààø( @87“BA“HG†PO“VU“NM}WV†ZY†YX}RQq\[}hg†[Zt^]mˆ‡“wv}€†hgm_^ckjkhghedeÿ ÿ ÿ ÿÿÿéÿÿÿÿéÿÿÿÿô ÿ!!ÿ""ô$$ô$$Þ**ÿ++ÿ&&Þ%%Ó++ô##Ç,,Þ33ÿ//é--Þ44ÿ))Ç,,Ó==ÿ88é>>ÿ??ÿ::ÞFFÿGGÿHHÿ@@ÞBBÞGGÞIIÞVVÿWWÿYYÿ[[ÿ<<¦QQÞ66WWÞ~~ÿ€€ÿvvé‚‚ÿqqÞ??zAAzDDzFFzžžÿ™™ôEEnššôFFn––Þ®®ÿ——Þ°°ÿ««ôœœÞ––Ó¶¶ÿ··ÿ¢¢Þ½½ÿ¥¥Þkk}}¦¨¨Þ\\zÂÂÿÄÄÿ¢¢ÓÅÅÿÇÇÿÈÈÿÊÊÿËËÿÍÍÿµµÞÖÖÿÃÃé××ÿÙÙÿÚÚÿhhz^^nQQ_ÓÓô††›SS`WWcUUa““¦WWbddpggsXXbYYb[[c\\bqqw^^cssxõõõðððêêêåååßßßÖÖÖÕÕÕÑÑÑÐÐÐÍÍÍÇÇÇÃÃÃÀÀÀ¹¹¹¸¸¸¶¶¶®®®«««¡¡¡‡‡‡€€€ L" 0#! 2 9(*T/&%,S'$8J-1[£}63}£Y+);7V¡šŸ€€Ÿš¢U.5<:B…˜–œœ–€>74 A@?D†“’’™‚C=<:IHFK„——„EA@? QNRˆ••‘•‡MHG XWޔЋޠkOPi]aŒ›Œ^\ž|ZWhjfj‰gdce{`_butsrqpomlnƒ~zyxvwø àñ»Ày^€d+€™™»»°— ñº³´€¸\€žŸÀº±à¹¯ø ( @€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿÿÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü݈ÿÿÿÿÿªªªÿÿÿÿÿÌ݈ˆÿÿªªªªªÿÿÿÿÌ݈ˆˆˆúªúª¯ª¯ÿÿüÌ݈ˆˆˆú¯Ïªüú¯ÿÿüÌ݈ˆˆªüÌÿÌϪÿÿüÌ݈ˆˆª¯ÌÌÌúªÿÿüî݈ˆˆªªüÌϪªÿÿþîÝØˆˆªªüÌϪªÿÿþîÝÝÝØª¯ÌÌÌúªÿÿþèÝÝÝÝߪüÌÿÌϪÿÿøˆÝÝÝÝÝú¯Ïªüú¯ÿÿøˆÝÝÝÝÝúªúª¯ª¯ÿÿøˆÝßÝÝÝߪªªªªÿÿÿøˆÝßßßýÝÿªªªÿÿÿÿøˆÝßßÝßßÝÿÿÿÿÿÿÿøŽÝßßßÿßßýÞÿÿÿÿÿþîÝßßßÝßÝïÝÿÿÿÿÿþîÝÝÿßÿßßÿÞÿÿÿÿÿþîÝÝÝÝÝßßÝîÿÿÿÿÿþìÝßÿÿþííÿÞÿÿÿÿÿüÌÝýÝÞïÿÿþîÿÿÿÿÿüÌßÝÝÝÝÝÞïÿÿÿÿÿÿüÌýÝÝÝÝÝÝÝÝÝÿÿÿÿüÌøˆÝÝÝÝÝÝßÿÿÿÿüψˆˆˆˆÝÝÝÿÿÿÿÿÌÏÝØˆˆˆˆˆˆÿÿÿÿÿÌÿˆÝÝÝˆÝØÿÿÿüÏøˆˆˆˆˆÝøˆˆÿÿÿÿøˆˆˆˆˆˆˆøˆˆÿÿÿÿÿÿÿÿˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ð?ðÀàÀÀÀÀÀÀÀÀÀÀÀÀÀ?ÀÀÀÀÀÀÀÀÀ?À€€??€?ÿ€ÿ( @€DB}ZW‡TRcXUg\Yj`]mjimdal_]cmjmlilkhkhehebe|~{~|y|{x{xuxururoroloTRTpnp^]^ÀÃÄÕÚÜ÷üþ†Œîøýíñóoqr;¬í<¦ã?®íQµïZ¹ðg¿ñrÃñtÄòo¼èvÆózÇók­Ó|Èów¿è€ÊôÊó‡ÌôŠÎôÏõ‘Ñõ“Òõq »–ÓõŠÁà™Ôö–Ïð›ÕöœÕöœÖöœÕõ ×ö›Ðî¢Ø÷¤Ù÷¡Ôð¦Ú÷e„•¨Ú÷©Û÷›Èâ®Ýø­Ý÷¯Þø³ßøv’¢·áøµÞõ¹âù¼ãù¿äùÁåùÂåùÆçú^nwËéúÌêúfu}°ÄÏÅØãÒæñÞñüâóüóúþH±îC‚§wÅó~ÈóƒÊô…ËôŒÊ̦Ù÷¨×ó§Òì®Úôµßø¯Øð¸áù»âùÂåúÄãõ¶ÓäËæöÕíûÔèô‡’™ñùþ™¥­úýÿq~ŠsvzÂÇØ}†iksLV™qv™ÿÿÿÿôÿÚ!!ÿ--ÿ((Þ11é88ÿ--¼AAÿBBÿ,,¦DDÿ33¼==ÙLLÿPPÿ66–QQÙGGµssÿzzÿ]]¼II’bb¦œœÿ„„ÓEEn¬¬ÿœœâ´´ÿ‡‡¼¼¼ÿÇÇÿ®®ÚÍÍÿÇÇô~~›ÝÝÿ~~ss••¦yy„ŠŠ•–””™ÿÿÿüüüúúúùùù÷÷÷ôôôóóóñññîîîìììêêêèèèæææäääãããáááÞÞÞÜÜÜÛÛÛÙÙÙ×××ÕÕÕÒÒÒÑÑÑÎÎÎÍÍÍËËËÈÈÈÇÇÇÄÄÄÂÂÂÀÀÀ¿¿¿½½½»»»¹¹¹¶¶¶µµµ²²²±±±¯¯¯­­­«««¨¨¨¤¤¤¢¢¢¡¡¡žžž›››˜˜˜”””’’’ŽŽŽ‹‹‹‰‰‰‡‡‡………~~~}}}{{{xxxwwwuuusssooollljjjiiifff```VVVUUUSSSMMM ã ì¾³Ïã ã ‡‡– áȽ]^¸Ïã …„ƒƒ‚‚‚‡ ÔÇǽ_WTnIoX^Ú ˆˆ–І††Š ÆÆÆ¼_UQLG?73dM‹‰œá­Š’èè’ˆ’ ÆÆÆ¼wTnIB;41cŒ“ëÐЯäÐÐ~‰‰ ÅÅÅ»wQLG?73d.œŽ˜àÇÇÇǬ“ŒŒ ÃÍ »_UIB;41c,—•””œÉ¿¿Ü˜‘œ Úûñ»³³y^TFd+)™™›Ù»»»»°—•• èùñº³³³´µ·¸\m€žŸâ¸º±Ø¸¹¯š™ íàrº³³´¶·¹º»½ã¢¡ªÆ²¢¤ÕÕ¤ž¤ @+¹´µ·¸º»¼¾¿Æ­¥¥ª§££¤¤£¢ C00º¶·¹º»½¾ÀÂÃÒ¬©¨¨¨¦¦¦§ C22º¸º»¼¾¿ÁÃÄÆÇÑ®|««§¬ i44»ºÊæ¾ÜÆÃÅÆÈÉËÍÖçìíû k99»¼ÑõàÿÛùÿóÎâÍÏÐÑÓÕ O?r¼¾ÓûüüßóÑåÿáÿýæÖ× qxó¼ÁÕÿòöÙúÿÿáÿßéäÿØÙ æëî½ÃÒöÌöÛýêõÜÿáÿÿûÚÜ ßòʾÆËÙÎÔÑáø Ûÿçþé÷ÝÞ Í»·¾ÈîÏßåêîåáÖßÙïúôÞß ¶¶¶¿äϵ·¹º¼Í×äìîðìçàâ µµµÌã´¶¸º»½¿ÁÃÅÇÈ×ßêð  ´´¼Y>suº»¼¾ÀÂÄÆÈÊÌÎÏÐÓí ¶ÀÒa!#`$'fjr[ÆÇÊËÎÏÐÒÛ ¾Á"!#`$%&&(-e:jrr|Ôö â¼ÃE*/*-b+*((-e37?FLQU ½¿å,*/25=DKPpTSo8BJNSU{ 6'''*/25=DKPpXt^6?GlRZv ôôôôôôôôôgHKPpXtZ~Mz~   }}{ üü?øððàààààààààààà?à?à?à?à?à?à?à?ààààÀ?À€€Àÿàÿ(0`ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿ€€ÿ€ÿÿÿÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÍßÿÿÿÿÿÿÿÿÿúªª¯ÿÿÿÿÿÿÿÿÌÍÝÝßÿÿÿÿÿÿªªªªªªÿÿÿÿÿÿüÌ͈ˆÝÝßÿÿÿúªªªªªª¯ÿÿÿÿÿüÌ͈ˆˆˆÝÝßÿªªúªª¯ªªÿÿÿÿÿÌÌ͈ˆˆˆˆˆúª¯Ïªªüúª¯ÿÿÿÿÌÌ͈ˆˆˆˆˆˆúªüÌú¯ÌϪ¯ÿÿÿÿÌÌ͈ˆˆˆˆˆˆú¯ÌÌÏüÌÌú¯ÿÿÿÿÌÌ͈ˆˆˆˆˆªªüÌÌÌÌϪªÿÿÿÿÌÌ͈ˆˆˆˆˆªª¯ÌÌÌÌúªªÿÿÿÿÌÌ͈ˆˆˆˆˆªªªüÌÌϪªªÿÿÿÿÎî͈ˆˆˆˆˆªªªüÌÌϪªªÿÿÿÿîîÍÝØˆˆˆˆªª¯ÌÌÌÌúªªÿÿÿÿîîÍÝÝÝ݈ˆªªüÌÌÌÌϪªÿÿÿÿîîÍÝÝÝÝÝ݈ú¯ÌÌÏüÌÌú¯ÿÿÿÿîèÍÝÝÝÝÝÝÝúªüÌú¯ÌϪ¯ÿÿÿÿèˆÍÝÝÝÝÝÝÝúª¯Ïªªüúª¯ÿÿÿÿˆˆÍÝÝÝÝÝÝÝߪªúªª¯ªªÿÿÿÿÿˆˆÍÝÝÝÝÝÝÝÝúªªªªªª¯ÿÿÿÿÿˆˆÍÝßÝÝÝÝÝÝߪªªªªªÿÿÿÿÿÿˆˆÍÝßÝïßÿíÝÝÿúªª¯ÿÿÿÿÿÿÿˆˆÍÝßÝÿÝÞÿßÝÝßÿÿÿÿÿÿÿÿÿÿˆˆÍÝßÞÿÝÝïßßÿíÝßÿÿÿÿÿÿÿÿˆˆÍÝßßïÝÝïßÝÞÿÞßÿÿÿÿÿÿÿÿˆˆÍÝßïßßÿÿßÝÝïÝïÿÿÿÿÿÿÿÿˆîÍÝßþßßíÝßÝÞßÞßÿÿÿÿÿÿÿÿîîÍÝßýßßíÝßßÿïíïÿÿÿÿÿÿÿÿîîÍÝßíßßÿíßßîÿÞßÿÿÿÿÿÿÿÿîîÍÝÝÝÞÝÞÿßßíííïÿÿÿÿÿÿÿÿîìÍÝÝÝÝÝÝÝßßÿÞÞïÿÿÿÿÿÿÿÿîÌÍÝÿÿÿþíÝÝÝîÿîïÿÿÿÿÿÿÿÿÌÌÍßÝÝÞïÿÿîÞÞÞîïÿÿÿÿÿÿÿÿÌÌÍßÝÝÝÝÝîÿÿÿîîïÿÿÿÿÿÿÿÿÌÌÍýÝÝÝÝÝÝÝÝîÿÿÿÿÿÿÿÿÿÿÿÌÌÿÝÝÝÝÝÝÝÝÝÝÝÝîÿÿÿÿÿÿÿÿÌÝýÝÝÝÝÝÝÝÝÝÝÝÝÝÝÿÿÿÿÿÿÿÍÝøˆˆÝÝÝÝÝÝÝÝÝÝßÿÿÿÿÿÿÿÝÝøˆˆˆˆˆˆÝÝÝÝÝÝÝÿÿÿÿÿÿÿýÝ߈ˆˆˆˆˆˆˆˆˆÝÝÝÝÿÿÿÿÿÿÿýÝßÝ݈ˆˆˆˆˆˆˆˆˆˆßÿÿÿÿÿÿÿÝÝøˆˆÝÝÝÝ݈ˆˆˆÝˆÿÿÿÿÿÿÿÝßøˆˆˆˆˆˆˆÝÝÝÝØˆˆÿÿÿÿÿýÝÿˆˆˆˆˆˆˆˆˆˆøˆˆˆˆÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆøˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆˆˆÿÿÿÿÿÿÿÿÿøˆˆˆˆˆˆˆˆˆÿˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿü?þøüpøøøøøøøøøøøøøøøøø?øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøøøÿøÿðÿðÿàÿàÿÀÿÀ€àÿÿ?ÿÿÿøÿÿ(0`€ NJaTRZ`[a[U\b\c~wWQW^X^d^dzszjdjgagzvpvsmspjpnhnàááÊËËÄÅŦª«æìïùýÿšœ=­í>šÏI²î^»ðf¾ñqÃòrÄòxÆó{Çóm¯ÕÉóÊô„Ëô…Ìô‡Ìô…Éð\‰£‹Îô‹Íò‘Ñõ’Ñõ•Òõ—ÓõšÕö^•œÕö“ÉèžÖöWu†¡×ö£Øö¥Ù÷½Ö§Ú÷¨Ú÷©Úõ«Ü÷J_k®Ýø­Ý÷v•¦±Þø³ßø°Ûóµàø«Óê½ãù¾äùlWhqÂæúÊéúaowÊåôÖîûÎàêjsxÓäíØçïæôüðùþT¶ïmÁòrÃòuÄòsÁïÉóŽÏõŒÉí”Ñõ—Óö˜ÓöœÓó¦Ù÷«Û÷´ßø·àø»âù¾ãùºÚíÅæú¿Þñ§µÉèúÅâó¹ÔäÍêû«ÁÏÐëûÓìû¼ÐÜÒèõÚïüÜðüPUXfknÌÝèÜê󎕚Ÿ ¡‚‡qty ÿÿÿéôÿÿô""ÿ%%ô""Ù,,ÿ--é44ÿ11Û<<ÿAAÿ,,¬FFÿMMÿBBÙMMôUUÿCCµggú;;Ž‚‚ýCCzPPwwÍAAn  üFFn~~¼ššâ±±þººÿŽŽ¼SSn¹¹ôÄÄÿËËÿoo‹­­ÓÓÓÿœœ¼ÇÇéKKXÂÂÞÝÝûaan¦¦¼ÐÐÑÿÿÿüüüúúúøøøöööõõõòòòñññîîîíííëëëéééçççåååãããÞÞÞÜÜÜÛÛÛÙÙÙÖÖÖÕÕÕÓÓÓÎÎÎÌÌÌÉÉÉÇÇÇÃÃÃÁÁÁ¿¿¿¼¼¼»»»¹¹¹¶¶¶µµµ³³³±±±¯¯¯¬¬¬ªªª¨¨¨§§§¥¥¥¢¢¢ŸŸŸ™™™———”””‘‘‘ŽŽŽŠŠŠ‰‰‰‡‡‡………‚‚‚€€€~~~|||zzzxxxwwwtttooommmkkkiiifffeeebbb___\\\XXXVVVTTTSSSMMM    äÃÑã   ˜ |ɹ´´´¿Ñé ƒ‚˜ ÒÉɹ´TTU´´´Ã×é ƒ€€€€€€€‰ öËÈÈȹ´vLiHlrT´´Ã×……‰……„„„†‰„„‰ ÇÇÇÇǹ´ulKfE?;6?GOU´¿ˆ‡…ÿ˜‡‡…†Ÿ®‰„…‰ÇÇÇÇǹ´OiHeBc84`,*%,IЇ–þàù˜ŠˆŸñ宇‡˜ÆÆÆÆÆ¹´OKfE?;60.\'$"ŸŒŒ–wÜÑÕø˜ŸðÑÑ⮇‹ÆÆÆÆÆ¸´rHeBc84`,*%!A–ŽŒ–ý×ÍÍÏ÷íÍÍÍî®ŒŠŸ ÅÅÅÅŸ´qfd?:60.\'$!1“–üÓÉÉÉÉÉÉ쮓ŒŒŒ–ÄÄÄÉɸ´oeBc84_,*%# J‘‘‘‘‘–ûÎÃÃÃÃê®“ŽŽŽŽ–ÃÃÓüÓ·´TLC:60.\'$!YJ•••’’”ã¿¿¿¿ô›‘‘‘‘“õÃáÿåÈ·´´´´Uvg4+%# M—————¥ç½½½½½Âô›’’‘’–éùÚùÒ·´´´´´´µ¶TtD+Y)œ™™™¥æ»»»âÉ»»Àó›——•› Úäÿá·´´´´µµ¶·¸º»»p©žž©û¿¹¹æþüȹ¹ÿœ™™éüÑ·´´´µ¶¶·¹º»¼½¾¿ù¡¢žó¼å¡ üÆÆü žž  ÞÅy(y·´µµ¶·¸º»»¼½¾ÀÀÕ©£¢¢±û¡¢¢¤ûü¤¢žž Áh!!y·µ¶¶·¹º»¼½¾¿ÀÁÂí¤§§¦©ª££££¤¤¢¢¢©h###y¸¶·¸¹»»¼½¾¿ÀÁÂÃÉö¬¨¨¨¨¨§§§§§§¦© h%%%P¹·¹º»¼½¾¿ÀÁÂÃÃÅÆÊð­«««««««¨ª±h***Rº¹»»¼½¾¿ÀÁÂÃÄÆÆÇÈÉßú}ª°°°¯²~ j,,,R»»¼×ç¿ÀÁÂÃÃÅÆÇÈɳÊË×çôôôú j...S¼¼½ÿÀÅüÿÃÙÈɳÊÌÌÍÎÏÐÑém000S½¾¿àÿÂíÿÿÉüÿÿÿßÊåÙÌÍÎÏÐÑÒêm44<¾¿Ààÿ|ÿüÿÐùàÌðÿÒÿæØúÿôàÒÓÔêN:mÇ¿ÁÂáÿüùæÿÈÎàä÷ÿÚÿçôÿìõÿáÔÕëzsëðÃÀÂáÿÿÕãÿÉùÿÿÿôÍÿèÚâÒÙÿóÖ×ìÕöÝÙÆÁÃÃâÿçÈãÿÊÿñÏÞ|ÎÿéÛúÿÿÿèרìÝÔëòÂÂÄÅÆÊÈÉÜóêÿ÷ÿýÐÿéêÿñëæØÙÙíÔö½¹ÆÇÑÞ×ÊÊÌÍßèèÚÑÿêçÿëëÿçÚÛîÝɸ¸¸ÃÇËöÝäï÷ñæßÙÐÑÒÓÞÛÖîþÿþÜÝï·····ÃÉè×µ¶·¹ÃÍçñøòêâ|רÙÚÛÜÝÞð¶¶¶¶¶ÄÜîµ¶·¸º»¼½¾ÀÁ³ÒâêòùôîæâÞßñ¶¶¶¶¶Ìùºµ¶¸¹»¼½¾¿ÀÁÃÄÆÇÈÎØåíóúû µµµµ·ô³µ¶·¹º»¼¾¿ÀÁÂÃÄÅÆÇɳÊÌÍÙéúµµµ¼Ù5[aNz»¼½¿ÀÁÂÃÅÆÇȳÊËÌÌÎÏÑ|´¶ÁÆïVZ(FhyÃÅÆÇÈÉÊÊÍÎÏÐÕºÂ>VVY(3Fns³ÊÍÍÎÏÐÑì ñÀÁÂá)VVY!#&*-/4FnsÎÑÜ ¾¿Àú # WWY!#&\,/27;?EGik 𻼾Ø1 #&*,_48c:702^.'\,/27;?EGKlQ  ˺»Íó" #&*,_48cBeGKLqOun]06b@dfKlpø¶Ôø5" #&*,_48cBeGKLqOvA.48=BeHio} òø)" #&*,_48cBeGKLqOv|w]27;BeGiLhJZZZZ#&*,_48cBeGKLqOv{ Ia68?Efhp{x w5))1"""#&*,_48DdEfHlqOv~39kAQ   JMMIAAkppsoOv~   ÿÃÿÿÿÿ?þþøü0øøøøøøøøøøøøøøøøø?øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøø?øøøÿðÿðÿàÿàÿÀÀ€? øÿÿÿÀÿÿ(  @"++"4Xt……tX4Z///¹11dè..Žú33‚û//bî)))Ô¨‚N---ˆ77ƒøéÿ ÿÿ ÿÿ ÿÿ ÿÿéÿ99vûÌ‘N999‚55¦ÿÿÿôÿÿÿÿÿÿÿÿÿôÿÿÿ88ÿÌ‚4!!!%??…õ&&ÿÿ''ôÿWW€ÿBB–ÿ!!ÿÿ!!ÿÿAA–ÿVV€ÿ!!ôÿÿÿ==vû¨XDDD’55éÿ22ôÿ\\„ÿ´´´ÿ§§§ÿGG—ÿGG—ÿ§§§ÿ´´´ÿ[[„ÿ**ôÿ,,éÿ)))Ôt"EE~Ø<<ÿÿ<<ôÿRRvÿ´´´ÿÍÍÍÿ¶¶¶ÿ¶¶¶ÿÍÍÍÿ´´´ÿLL—ÿ22ÿÿ22ÿÿ88bî…+JJ¦ÿGGÿÿFFÿÿFFôÿUUwÿÂÂÂÿßßßÿßßßÿÂÂÂÿQQ˜ÿ>>ÿÿ>>ÿÿ==ÿÿCCû…+WW¦ÿ^^ÿÿ[[ÿÿXXÿÿWWšÿÍÍÍÿëëëÿëëëÿÍÍÍÿUUšÿIIÿÿHHÿÿGGÿÿGGŽút"^^ÔŠŠÿÿ‡‡ÿÿhhšÿÒÒÒÿñññÿÒÒÒÿÒÒÒÿñññÿÒÒÒÿ]]šÿccÿÿ__ÿÿBBdèXKKK“™™éÿžžôÿ}}Žÿìììÿ×××ÿwwšÿggyÿ×××ÿìììÿ{{Žÿ‹‹ôÿ‚‚éÿ///¹4KKK!oo‡ð¶¶ÿÿ®®ôÿ‚‚ÿ›ÿ¯¯ÿÿ¨¨ôÿkkyÿ€€ÿ¤¤ôÿ§§ÿÿffƒøZKKKb™™¼ÿÇÇÿÿ¿¿ôÿÄÄÿÿÂÂÿÿÀÀÿÿ¸¸ôÿ··ôÿ»»ÿÿ‚‚¦ÿ---ˆKKKb‚‚“ðÇÇéÿ××ÿÿÖÖÿÿÔÔÿÿÒÒÿÿ¿¿éÿtt…õ999‚KKK!KKK“xxÔ˜˜¦ÿ˜˜¦ÿuu~ØDDD’!!!%àÀ€xÈÜÿÓÿÁÿÿÿûÿøÿ÷ÿöÿõÿ€ôÿÀóÿàÉÿ( @ € # 8gvdI3$ 4PemcL.RKKKßfffï222Ý¿œŒw`H3#+ b)))³444Ô//dê...×%%%É›}L"""kcccðÊÊÊÿÿÿÿÿôôôÿÇÇÇÿ›››ÿbbbî---Ù½›Œvf000²66ƒùÞÿ ÿÿ ÿÿÿÿÇÿ44s÷Ì‘R@@@söÌÌÌÿÔÔÔÿÿÿÿÿÝñüÿÖîûÿÚðüÿçõýÿïòóÿÇÇÇÿ›››ÿVVVî)))Ô777ß--¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00¦ÿ###ш< jjjÈÖÖÖÿÖÖÖÿÖÖÖÿÿÿÿÿÙïûÿÃæúÿ¹áùÿ¯Ýøÿ¥Ù÷ÿ­Ü÷ÿºâùÿÑìûÿ¬µ»ÿ77±ÿ$$ÿÿ22¼ÿPP^ÿ))Þÿ ÿÿ''ÞÿMMiÿ%%Þÿÿÿ77û´fvvvÈØØØÿØØØÿØØØÿÿÿÿÿÕíûÿ¾äùÿ´ßøÿªÛ÷ÿŸ×öÿ•Òõÿ‹ÎõÿÊôÿUhÿ00ÿÿ88Çÿwwwÿ³³³ÿ``nÿ77¼ÿuu‚ÿ³³³ÿ``nÿ..Þÿ))ôÿ33Båƒ*wwwÈÚÚÚÿÚÚÚÿÚÚÚÿÿÿÿÿÑìûÿ¹áùÿ¯Ýøÿ¤Ù÷ÿšÔöÿÐõÿ†ÌôÿyÀéÿEE¦ÿ<<ÿÿ??Þÿzz†ÿÌÌÌÿÄÄÄÿ———ÿÌÌÌÿÄÄÄÿccoÿ88Þÿ22ÿÿAA‚ûŽ/xxxÈÜÜÜÿÓÓÓÿÁÁÁÿÿÿÿÿÍêûÿ´ßøÿªÛ÷ÿŸ×öÿ•Òõÿ‹Îôÿ€Êóÿm¨ÉÿIIÓÿGGÿÿFFÿÿGGÞÿ‚‚ÿßßßÿßßßÿÕÕÕÿggrÿBBÞÿ>>ÿÿ==ÿÿEE¦ÿŒ.xxxÈÃÃÃÿhhhÿ¨¨¨ÿÿÿÿÿòúþÿÜðüÿÁåùÿ ×öÿÐõÿ†Ìôÿ{Çóÿi¦Éÿ^^Óÿ``ÿÿ\\ÿÿUUÞÿ‰‰”ÿëëëÿëëëÿâââÿkkvÿJJÞÿIIÿÿHHÿÿJJ¦ÿ€(yyyÈVVVÿiiiÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿåñøÿÊåõÿ¥ÖòÿÁçÿoo¦ÿÿÿ||ÞÿŽŽ–ÿñññÿçççÿ©©©ÿñññÿçççÿmmwÿbbÞÿeeÿÿMMôdzzzÈ```ÿ¡¡¡ÿÔßäÿÿÿÿÿÿÿÿÿþþþÿûûûÿøøøÿõõõÿñññÿïïïÿëëëÿŠÿ§§ÿÿ––Þÿ““˜ÿíííÿrrxÿ‚‚¼ÿ’’˜ÿíííÿrrxÿ‰‰Þÿôÿ:::Ò< zzzÈÂÆÉÿ“Íïÿ®Õìÿÿÿÿÿýýýÿúúúÿ÷÷÷ÿóóóÿðððÿíííÿêêêÿçççÿ¾¾¾ÿƒƒ¦ÿ¹¹ÿÿ¥¥Þÿffnÿ¢¢Þÿ²²ÿÿŸŸÞÿeenÿœœÞÿ¬¬ÿÿggƒøgzzzȆËòÿÉóÿ³Øíÿûûûÿøøøÿõõõÿòòòÿïïïÿëëëÿèèèÿåååÿâââÿßßßÿ‹‹‹ÿ››¼ÿÌÌÿÿÊÊÿÿÈÈÿÿÇÇÿÿÄÄÿÿÃÃÿÿÁÁÿÿvvÿ444Ž{{{ȈÍôÿˆÍôÿ¸Ûîÿ÷÷÷ÿóóóÿðððÿíííÿêêêÿçççÿäääÿàààÿÝÝÝÿÚÚÚÿ×××ÿ¡¡¡ÿÿ¸¸ÓÿÜÜÿÿÛÛÿÿÙÙÿÿªªÇÿllyë333`|||ÈÐõÿÐõÿ¾ÞðÿòòòÿïïïÿuuuÿèèèÿÉÉÉÿÐÐÐÿßßßÿÛÛÛÿØØØÿÕÕÕÿÒÒÒÿÎÎÎÿÃÃÃÿ™™™ÿˆˆˆÿ‡‡‡ÿiiiÿ"""µ7}}}È™Ôöÿ™ÔöÿÃáòÿíííÿêêêÿMMMÿÈÈÈÿMMMÿ•••ÿqqqÿVVVÿ€€€ÿ¸¸¸ÿ¥¥¥ÿÉÉÉÿÆÆÆÿÃÃÃÿÀÀÀÿ¼¼¼ÿƒƒƒÿ0}}}È¢Ø÷ÿ«ÚöÿÏÚàÿèèèÿåååÿMMMÿiiiÿVVVÿ’’’ÿ€€€ÿ¹¹¹ÿ]]]ÿ|||ÿMMMÿ‚‚‚ÿMMMÿ[[[ÿ¦¦¦ÿ¸¸¸ÿÿ0~~~È¥ÁÒÿ{€ÿ½½½ÿäääÿáááÿMMMÿ^^^ÿŠŠŠÿÿfffÿMMMÿUUUÿ‘‘‘ÿMMMÿ”””ÿ“““ÿoooÿnnnÿ³³³ÿÿ0~~~Èxxxÿ‰‰‰ÿ­­­ÿßßßÿÛÛÛÿŠŠŠÿ»»»ÿÿÿeeeÿ{{{ÿlllÿÿMMMÿ~~~ÿMMMÿZZZÿ‹‹‹ÿ®®®ÿ|||ÿ0Èÿ®®®ÿõõõÿÚÚÚÿ×××ÿ‘‘‘ÿ¨¨¨ÿµµµÿÊÊÊÿ···ÿˆˆˆÿ†††ÿ¡¡¡ÿMMMÿ‚‚‚ÿ```ÿ```ÿˆˆˆÿ©©©ÿzzzÿ0€€€ÈåååÿøøøÿøøøÿÖÖÖÿˆˆˆÿÜÜÜÿÎÎÎÿ¶¶¶ÿŸŸŸÿ‹‹‹ÿ………ÿ………ÿ———ÿ¢¢¢ÿ±±±ÿ‰‰‰ÿ{{{ÿ¢¢¢ÿ¥¥¥ÿwwwÿ›Q Èúúúÿúúúÿúúúÿ°°°ÿ¥¥¥ÿûûûÿ÷÷÷ÿóóóÿðððÿìììÿèèèÿäääÿ»»»ÿ¦¦¦ÿ’’’ÿ€€€ÿzzzÿyyyÿ†††ÿkkkÿ³OÈûûûÿûûûÿíííÿÿüüüÿøøøÿôôôÿðððÿíííÿéééÿåååÿáááÿÝÝÝÿÙÙÙÿÖÖÖÿÒÒÒÿÎÎÎÿÊÊÊÿ¨¨¨ÿ–––ÿ………ÿ@@@åM€€€Ëûûûÿëëëÿ’’’ÿ= ÙÿlÀðÿ|Æðÿ Óðÿ¿ÝïÿÐáëÿæææÿãããÿÞÞÞÿÚÚÚÿ×××ÿÓÓÓÿÏÏÏÿËËËÿÇÇÇÿÃÃÃÿ¿¿¿ÿ’’’ÿ'''&xxxÝçççÿßßßÿZv‡ÿ;¬íÿ=¬íÿE°îÿN´ïÿW¸ïÿ`¼ðÿjÀñÿ‡Éïÿ”Ííÿ¯ÒæÿºÒàÿÂÑÚÿÌÌÌÿÈÈÈÿÄÄÄÿÀÀÀÿµµµÿCCCâX555]°°°ÿèèèÿµµµÿ^”´ÿ\ºðÿa¼ñÿX¸ðÿ]ºðÿX¸ðÿa¼ðÿkÀñÿtÄòÿ}Èóÿ†ÌôÿÐõÿ™Óöÿ¢×öÿ¬Úôÿ¸ØëÿÀÔßÿˆ”ÿ¼m#```Ññññÿíííÿyƒ‰ÿsÄòÿ|Èóÿ†ÌôÿÐõÿšÕöÿ¤Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ¥Ù÷ÿ ÖöÿžÖöÿ–Óõÿ ×öÿªÛ÷ÿµàøÿ¿äùÿÂßïÿ>AAå•I>>>P£££ÿ···ÿj‹ÿfž¾ÿsÄòÿ|Èóÿ†ÌôÿÐõÿšÕöÿ¤Ù÷ÿ®Ýøÿ¸áùÿÂåúÿÌêúÿÖîûÿÄÒÛÿu˜¬ÿÕöÿ§Ú÷ÿ²Þøÿ½ãùÿÇçúÿŽœ¤ÿ°YLLL²KKKåh¦ÉÿqÃòÿqÃòÿsÄòÿ|Èóÿ†ÌôÿÐõÿšÕöÿ¤Ù÷ÿ®Ýøÿ¸áùÿÂåúÿÌêúÿÖîûÿºÈÐÿKPRó–Ìëÿ¥Ù÷ÿ¯ÝøÿºâùÿÄæúÿ¿×åÿOQSÕ4KKK!KKK„Yv†â_ˆ ÿ_ˆ ÿ`ˆ ÿp©Êÿx¬Êÿ¯ËÿšÕöÿ¤Ù÷ÿ®Ýøÿ¸áùÿÂåúÿÌêúÿÖîûÿºÈÐÿ,,,¦nˆ—ÿ}›¬ÿwŒ˜ÿjw~ËGGG­CCC€>>>P HHHJJJCEEEGEEEYHHHˆGGG‹FFFŒdntÆo{‚Çr{ȉ“™ÿqvyÿ3====EEE6øàðÀààààààààààààààà?à?à?à?à?àààÀÀ€€€€€üÿ(0` €%  BfhT=+2ETXO@.! uAAAâ777ß%%%Ë­”€gN8( Gn¨'''À///Ð À±–„a7 )///œ\\\øÄÄÄÿÞÞÞÿ±±±ÿzzzÿEEE÷222ߍ|eN7%  1###‹===Ý@@nÿ..›ÿ$$±ÿÓÿ((¦ÿ11ÿEEUû111à­…T" 3666¶nnnÿÊÊÊÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ¦¦¦ÿzzzÿBBBó222ÞŤŽx`H6P888Ã==zÿÓÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿ##¼ÿAA`û###Ñ™_".AAAÑ€€€ÿÔÔÔÿÔÔÔÿÞÞÞÿÿÿÿÿ÷üþÿÜðüÿäôýÿðùþÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿ›››ÿnnnÿ>>>î---Ù½›—DDDë..±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿ::…ÿ111á™UJJJØ¢¢¢ÿÕÕÕÿÕÕÕÿÕÕÕÿßßßÿÿÿÿÿôúþÿÍêúÿÇçúÿÀäùÿ¹áùÿÁåùÿÐëûÿãóüÿùýþÿÿÿÿÿôôôÿÇÇÇÿ›››ÿnnnÿEEE÷00¼ÿÿÿÿÿôÿ**Çÿÿÿÿÿÿÿÿÿÿÿ$$Óÿÿÿÿÿÿÿ<<…ÿ###ш< oooÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿàààÿÿÿÿÿóúþÿÉèúÿÃæúÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¢Ø÷ÿ›Õöÿ¨Ú÷ÿ¸áùÿÒìûÿïøþÿ¼¼¼ÿAA…ÿ%%ÿÿ$$ÿÿ%%ôÿEEnÿYYYÿ11¼ÿ!!ÿÿ ÿÿ ÿÿ;;ÿYYYÿ//¼ÿÿÿÿÿôÿDD`û´fpppÿØØØÿØØØÿØØØÿØØØÿâââÿÿÿÿÿòùþÿÆçúÿÀäùÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿŸÖöÿ˜Óöÿ‘ÐõÿŠÎôÿƒËôÿ}ÈóÿQZmÿ//ôÿ,,ÿÿ--ôÿFFnÿÿ¬¬¬ÿaaaÿ55¼ÿ((ÿÿ>>ÿtttÿ³³³ÿtttÿ33¼ÿ##ÿÿ##ÿÿ33¼ÿ555å†0pppÿØØØÿØØØÿØØØÿØØØÿâââÿÿÿÿÿñùþÿÃåúÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿ›Õöÿ”ÒõÿÏõÿ‡Ìôÿ€Éóÿl¡¿ÿDDÿ44ÿÿ44ÿÿEE…ÿ†††ÿ¿¿¿ÿ¿¿¿ÿ¸¸¸ÿcccÿEEzÿyyyÿ¿¿¿ÿ¿¿¿ÿ¿¿¿ÿjjjÿ66Çÿ**ÿÿ**ÿÿFF`ûšG pppÿÚÚÚÿÚÚÚÿÚÚÚÿÚÚÚÿãããÿÿÿÿÿðùþÿ¿äùÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ˜Óöÿ‘ÐõÿŠÎôÿƒËôÿ|Èóÿ`‚–ÿAAÓÿ;;ÿÿ;;ÿÿ??ÞÿTT`ÿ´´´ÿÍÍÍÿÍÍÍÿÅÅÅÿ–––ÿÍÍÍÿÍÍÍÿÍÍÍÿœœœÿIInÿ44ôÿ22ÿÿ11ÿÿAA›ÿ»ZqqqÿÛÛÛÿÛÛÛÿÛÛÛÿÛÛÛÿäääÿÿÿÿÿïøþÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿšÔöÿ”ÒõÿÏõÿ‡Ìôÿ€ÉóÿyÆóÿWkvÿDDôÿCCÿÿBBÿÿBBÿÿDDÞÿUUaÿ½½½ÿØØØÿØØØÿØØØÿØØØÿØØØÿ£££ÿJJnÿ<<ôÿ::ÿÿ99ÿÿ99ÿÿ@@¼ÿ///Ó`qqqÿÝÝÝÿÝÝÝÿÔÔÔÿ•••ÿåååÿÿÿÿÿîøþÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ—Óõÿ‘ÐõÿŠÎôÿƒËôÿ|ÈóÿuÅòÿVkvÿKKÿÿJJÿÿJJÿÿIIÿÿHHÿÿJJÞÿVVVÿÐÐÐÿãããÿãããÿãããÿ´´´ÿLLcÿDDôÿBBÿÿBBÿÿ@@ÿÿ@@ÿÿCCÓÿ///Ò[qqqÿÞÞÞÿºººÿVVVÿŒŒŒÿæææÿÿÿÿÿÿÿÿÿöûþÿáòüÿÎêûÿ³ßøÿšÔöÿ”ÒõÿÏõÿ‡Ìôÿ€ÉóÿyÆóÿrÄòÿVkvÿ``ÿÿ^^ÿÿ\\ÿÿWWÿÿWWÿÿOOÿˆˆˆÿëëëÿëëëÿëëëÿëëëÿáááÿkkkÿKK¼ÿIIÿÿHHÿÿHHÿÿGGÿÿHHÓÿ000ÏNrrrÿ–––ÿVVVÿÿ–––ÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûýÿÚîùÿÂä÷ÿ Öõÿ|ÈóÿuÅòÿqÃòÿXrÿvvÞÿ||ÿÿzzÿÿxxÿÿYYÿŠŠŠÿïïïÿïïïÿïïïÿåååÿïïïÿïïïÿåååÿlllÿQQ¼ÿWWÿÿVVÿÿRRÿÿOO¦ÿ"""´;rrrÿiiiÿ———ÿVVVÿŽŽŽÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿÑåñÿ°Ùðÿ€š¨ÿxx±ÿ˜˜ÿÿ••ÿÿkk›ÿ‹‹‹ÿóóóÿóóóÿóóóÿ´´´ÿWWWÿÓÓÓÿóóóÿóóóÿèèèÿbbbÿffÇÿssÿÿqqÿÿVV…ÿŠ'rrrÿŽŽŽÿVVVÿªªªÿâââÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿúúúÿøøøÿöööÿôôôÿòòòÿðððÿîîîÿìììÿÖÖÖÿ^^nÿ¦¦ÿÿ¤¤ÿÿ„„¼ÿmmmÿíííÿøøøÿ¸¸¸ÿ]]nÿŠŠÓÿ]]cÿØØØÿøøøÿ¸¸¸ÿ\\nÿôÿÿÿ……éÿDDDìRsssÿiiiÿÑÑÑÿÏÞæÿ¤Òìÿêêêÿÿÿÿÿÿÿÿÿýýýÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿñññÿïïïÿíííÿëëëÿèèèÿçççÿ†††ÿ’’Çÿ²²ÿÿ°°ÿÿ‹‹¼ÿnnnÿ¯¯¯ÿ``nÿ¥¥ôÿªªÿÿ™™Þÿ^^cÿ¤¤¤ÿ^^nÿžžôÿ££ÿÿ¡¡ÿÿllÿ---¥(sssÿåååÿ½ÚêÿÈòÿ”ÎïÿìììÿþþþÿüüüÿúúúÿøøøÿöööÿôôôÿòòòÿðððÿîîîÿìììÿêêêÿçççÿæææÿäääÿÏÏÏÿ]]aÿ¶¶ôÿ¾¾ÿÿ¼¼ÿÿ’’¼ÿbbnÿ²²ôÿ¸¸ÿÿ··ÿÿµµÿÿ¢¢Þÿggzÿ¬¬ôÿ±±ÿÿ¯¯ÿÿ‰‰¼ÿBBBÝ5 sssÿŸÒïÿ~Éóÿ~Éóÿ˜Ððÿìììÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿñññÿïïïÿíííÿëëëÿéééÿçççÿåååÿãããÿàààÿÞÞÞÿ¸¸¸ÿddnÿÂÂôÿÊÊÿÿÈÈÿÿÇÇÿÿÆÆÿÿÄÄÿÿÄÄÿÿÂÂÿÿÁÁÿÿÀÀÿÿ¿¿ÿÿ¾¾ÿÿ  ÓÿMMRåD sssÿƒËôÿƒËôÿƒËôÿœÒñÿìììÿùùùÿöööÿôôôÿòòòÿðððÿîîîÿìììÿêêêÿèèèÿæææÿäääÿâââÿßßßÿÝÝÝÿÛÛÛÿÙÙÙÿ¬¬¬ÿ^^aÿ²²ÓÿÖÖÿÿÔÔÿÿÓÓÿÿÒÒÿÿÑÑÿÿÐÐÿÿÏÏÿÿÍÍÿÿÍÍÿÿŠŠ¦ÿGGGá9 tttÿŠÎôÿŠÎôÿŠÎôÿ¢ÕñÿíííÿõõõÿóóóÿñññÿïïïÿíííÿëëëÿéééÿçççÿåååÿãããÿáááÿÞÞÞÿÜÜÜÿÚÚÚÿØØØÿÖÖÖÿÔÔÔÿÁÁÁÿ~~~ÿqqzÿ©©¼ÿ××ôÿßßÿÿßßÿÿÝÝÿÿÀÀÞÿ››±ÿ]]cõ@@@štttÿÐõÿÐõÿÐõÿ¦Öòÿíííÿòòòÿðððÿîîîÿ“““ÿÃÃÃÿèèèÿæææÿäääÿâââÿßßßÿÝÝÝÿÛÛÛÿÙÙÙÿ×××ÿÕÕÕÿÓÓÓÿÑÑÑÿÎÎÎÿÌÌÌÿºººÿŠŠŠÿkkkÿjjjÿjjjÿbbbÿCCCï---£3uuuÿ•Òõÿ•Òõÿ•Òõÿ«ÙóÿíííÿïïïÿíííÿëëëÿMMMÿšššÿåååÿsssÿVVVÿÞÞÞÿÓÓÓÿ···ÿµµµÿÎÎÎÿÔÔÔÿÒÒÒÿÏÏÏÿÍÍÍÿËËËÿÉÉÉÿÇÇÇÿÅÅÅÿÃÃÃÿÁÁÁÿ¾¾¾ÿ   ÿ///Ó`uuuÿšÕöÿšÕöÿšÕöÿ¯ÛôÿîîîÿìììÿêêêÿèèèÿMMMÿ˜˜˜ÿ¡¡¡ÿMMMÿMMMÿÛÛÛÿhhhÿMMMÿMMMÿMMMÿŸŸŸÿ¾¾¾ÿÿºººÿÈÈÈÿÆÆÆÿÄÄÄÿÂÂÂÿ¿¿¿ÿ½½½ÿ»»»ÿžžžÿ///Ó`vvvÿŸ×öÿŸ×öÿŸ×öÿÂáóÿîîîÿéééÿçççÿåååÿMMMÿ„„„ÿVVVÿVVVÿMMMÿÇÇÇÿgggÿÿÉÉÉÿvvvÿMMMÿ¬¬¬ÿMMMÿ©©©ÿ™™™ÿUUUÿTTTÿqqqÿ§§§ÿºººÿ¸¸¸ÿœœœÿ///Ó`vvvÿ¥Ù÷ÿ®ÜöÿÃÐØÿ¢¢¢ÿîîîÿæææÿäääÿâââÿMMMÿMMMÿMMMÿœœœÿMMMÿÕÕÕÿÂÂÂÿÿŽŽŽÿ]]]ÿMMMÿªªªÿMMMÿ¦¦¦ÿMMMÿbbbÿ………ÿ[[[ÿTTTÿ···ÿµµµÿšššÿ///Ó`vvvÿÉåõÿ§ª¬ÿfffÿ¬¬¬ÿîîîÿãããÿáááÿÞÞÞÿMMMÿMMMÿ›››ÿ´´´ÿMMMÿÒÒÒÿfffÿMMMÿMMMÿ\\\ÿ‚‚‚ÿ§§§ÿMMMÿ¤¤¤ÿ©©©ÿ®®®ÿŸŸŸÿ|||ÿMMMÿšššÿ²²²ÿ———ÿ///Ó`vvvÿ€€€ÿxxxÿ¬¬¬ÿ£££ÿîîîÿàààÿÝÝÝÿÛÛÛÿgggÿoooÿÕÕÕÿ²²²ÿMMMÿÏÏÏÿ]]]ÿlllÿÈÈÈÿ’’’ÿ‰‰‰ÿ¥¥¥ÿMMMÿ¡¡¡ÿ‹‹‹ÿMMMÿMMMÿMMMÿSSSÿªªªÿ®®®ÿ•••ÿ///Ó`wwwÿ­­­ÿ¤¤¤ÿfffÿ¶¶¶ÿîîîÿÜÜÜÿÚÚÚÿØØØÿÖÖÖÿÔÔÔÿÒÒÒÿ¿¿¿ÿÿËËËÿšššÿMMMÿMMMÿMMMÿjjjÿ¢¢¢ÿMMMÿŸŸŸÿhhhÿZZZÿ‡‡‡ÿŒŒŒÿ£££ÿ­­­ÿ«««ÿ’’’ÿ///Ó`wwwÿxxxÿÿÚÚÚÿõõõÿïïïÿÙÙÙÿ×××ÿÍÍÍÿ€€€ÿÿ¦¦¦ÿµµµÿÊÊÊÿÈÈÈÿÆÆÆÿ½½½ÿÿ”””ÿ¶¶¶ÿ§§§ÿTTTÿÿ{{{ÿMMMÿyyyÿ```ÿMMMÿªªªÿ¨¨¨ÿÿ///Ó`wwwÿ¸¸¸ÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿïïïÿ×××ÿÔÔÔÿwwwÿ°°°ÿÐÐÐÿ£££ÿÿwwwÿdddÿrrrÿ‡‡‡ÿ›››ÿ¨¨¨ÿºººÿ¸¸¸ÿ¶¶¶ÿ´´´ÿ²²²ÿ„„„ÿeeeÿdddÿ†††ÿ§§§ÿ¥¥¥ÿŽŽŽÿ///Ó`xxxÿøøøÿøøøÿøøøÿøøøÿïïïÿÓÓÓÿ˜˜˜ÿÿüüüÿúúúÿøøøÿõõõÿòòòÿðððÿÚÚÚÿÃÃÃÿšššÿ†††ÿiiiÿaaaÿmmmÿÿÿ¡¡¡ÿªªªÿ¨¨¨ÿ¦¦¦ÿ¤¤¤ÿ¢¢¢ÿ‹‹‹ÿ...Öu7xxxÿúúúÿúúúÿúúúÿúúúÿðððÿ¸¸¸ÿkkkÿòòòÿúúúÿøøøÿöööÿóóóÿðððÿïïïÿìììÿéééÿçççÿåååÿâââÿßßßÿÂÂÂÿ®®®ÿ’’’ÿxxxÿfffÿcccÿnnnÿwwwÿ‹‹‹ÿÿ---Ü¡€a7xxxÿúúúÿúúúÿúúúÿúúúÿçççÿeeeÿÜÜÜÿûûûÿùùùÿöööÿôôôÿñññÿïïïÿíííÿêêêÿçççÿåååÿãããÿàààÿÝÝÝÿÛÛÛÿØØØÿÖÖÖÿÓÓÓÿÑÑÑÿÎÎÎÿ´´´ÿ¢¢¢ÿŠŠŠÿrrrÿcccÿ>>>î666â(((·Fyyyÿüüüÿüüüÿüüüÿ÷÷÷ÿšššÿŒ¡­ÿØíùÿúúúÿ÷÷÷ÿôôôÿòòòÿðððÿíííÿëëëÿèèèÿæææÿãããÿáááÿÞÞÞÿÛÛÛÿÙÙÙÿ×××ÿÔÔÔÿÑÑÑÿÏÏÏÿÌÌÌÿÉÉÉÿÇÇÇÿÅÅÅÿÂÂÂÿ¿¿¿ÿ½½½ÿoooÿ111°*yyyÿýýýÿýýýÿëëëÿ×××ÿT[_ÿ;¬íÿ;¬íÿ=­íÿe½ïÿ~Æðÿ ÒðÿµÙïÿÈßíÿéééÿæææÿäääÿâââÿßßßÿÜÜÜÿÙÙÙÿ×××ÿÕÕÕÿÒÒÒÿÐÐÐÿÍÍÍÿÊÊÊÿÈÈÈÿÆÆÆÿÃÃÃÿÀÀÀÿ¾¾¾ÿ   ÿAAAâ@ yyyÿøøøÿäääÿÝÝÝÿ¥¥¥ÿEw“ÿ;¬íÿ;¬íÿ>­íÿD°îÿJ²îÿPµïÿV·ïÿ\ºðÿb¼ðÿwÃðÿŒÊîÿ£Ðêÿ²ÓçÿÄÖàÿÓ×ÚÿÖÖÖÿÓÓÓÿÐÐÐÿÎÎÎÿËËËÿÈÈÈÿÆÆÆÿÄÄÄÿÁÁÁÿ¾¾¾ÿµµµÿXXXùt222Jÿæææÿäääÿáááÿqqqÿ= Ùÿ;¬íÿ;¬íÿ>­íÿD°îÿK²îÿPµïÿV·ïÿ]ºðÿb¼ðÿi¿ñÿoÂòÿtÄòÿ{Çóÿ€Éóÿ†ÌôÿÎôÿ¢Ñìÿ­ÒçÿµÑáÿÀÍÕÿÃÉÍÿÄÄÄÿÂÂÂÿ¿¿¿ÿ¼¼¼ÿ„„„ÿ000ÍE CCC·ÄÄÄÿéééÿæææÿÑÑÑÿUp€ÿf¿ñÿc½ñÿ_»ðÿZ¹ðÿW¸ðÿO´îÿQµïÿW·ïÿ]ºðÿc½ðÿi¿ñÿoÂòÿuÄòÿ{ÇóÿÉóÿ‡ÌôÿÎôÿ“Ñõÿ™ÔöÿŸÖöÿ¥Ù÷ÿ«Û÷ÿ±Þøÿ¹Ûîÿ¿ØçÿÁÑÚÿMMMÿ£Y***;vvvÿïïïÿìììÿéééÿ‡‡‡ÿfž¾ÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ”Òõÿ–Óõÿ‰ÍôÿÐõÿƒÊôÿ„Ëóÿ{Çóÿ‚Êóÿ‡ÌôÿÏôÿ”Ñõÿ™ÔöÿŸÖöÿ¥Ù÷ÿ«Û÷ÿ²ßøÿ¹âùÿÀäùÿÇçúÿ„’™ÿ###Ñ…6 CCC·ËËËÿòòòÿïïïÿÏÏÏÿ[fkÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿËéúÿÃæùÿÀäùÿ¡Ñìÿ”ÒõÿœÕöÿ£Ø÷ÿ©Û÷ÿ°Þøÿ·áøÿ¾äùÿÅæúÿÄàïÿRTUû¬a***;xxxÿøøøÿËËËÿvvvÿVkvÿh¦ÉÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿŽ•šÿŠÁàÿ™Ôöÿ¡×öÿ¨Ú÷ÿ®Ýøÿµàøÿ¼ãùÿÄæúÿÊéúÿ–¦¯ÿ---Ü‹= GGG­ÿcccÿ[y‹ÿj­ÓÿqÃòÿqÃòÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿrvyÿ_nwÿ˜ÓöÿŸÖöÿ¦Ù÷ÿ­Ü÷ÿ´ßøÿºâùÿÂåùÿÈèúÿÏëûÿ[^`ù™LFFF#MMMðGGG½[y‹ÿqÃòÿqÃòÿqÃòÿqÃòÿqÃòÿuÅòÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿrvyÿAAA䄱ËÿÖöÿ¤Ø÷ÿ«Û÷ÿ²Þøÿ¹áùÿ¿äùÿ¿Ýïÿ­ÃÏÿouyÿBBB»+ HHHEEEJJJdVkvÿ_ˆ ÿ_ˆ ÿd—´ÿh¦Éÿh¦Éÿm®Óÿ{Çóÿ‚ÊôÿˆÍôÿÐõÿ–ÓõÿœÕöÿ£Ø÷ÿ©Û÷ÿ¯Ýøÿ·àøÿ½ãùÿÃæúÿÊéúÿÐëûÿ×îûÿÞñüÿ]_`úŒ_nwÿ›Õöÿ’¾×ÿ†¥·ÿ•¢ÿhrxÿRUVæIIIÊDDD‘???a====JJJ2HHHEEEEHHHHxHHH‰GGG‹III¨JJJÇJJJÈKKKÖ]nwÿ_nwÿaowÿx“¢ÿ{”¢ÿ~•¢ÿ–²Ãÿ¡¾Îÿ¥¿Îÿ»ÕäÿÐëûÿ×îûÿÞñüÿBBBÞXGGG¬KKKÅHHH«CCC€>>>P...HHHJJJCEEEGDDDIIII‡HHHŠFFFŒJJJÆJJJÇJJJÈ_bcñIIIÉ ÿ€ÿÿÿÿø?þàøøøøøøøøøøøøøøøøøøø?øøÿøÿøÿøÿøÿøÿøÿøÿøÿø?ø?ø?ø?ððàÿàÀÀ?€?€?€?€?ðÿÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/orange-uninstall.ico000077500000000000000000000611761477201124000226170ustar00rootroot00000000000000 (–h¾ è& ¨ 00h¶00¨ hÆ'  ¨.,00 ¨%Ö<( À€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ ™™ ™™™™™™™ ™™ ð™ ÿðÿ ™ÿÿð™ ™ÿÿ ™ ™ÿÿ ™ ™ÿÿð™ ÿðÿ ™ ð™™™™ ™ ™™™™ ™™øàÀ€€€€Ààø( @3+'4'".!TU_ˆš¬Œž®ª´½‚…ŒWQN*$$&#$>=;‘—¨u½ìqâÿãÿ¡çÿ®æÿËêÿäøÿž–˜•ØÿÅõÿ×ÿÿ˜”—¼º»èÛÔm¨Ñ‰×ÿŽÕýÕý”Õü›Øÿ˜ÔüœÞÿ¸èÿµÎäÿÿÿw‹š¢ÿ.®þWÃÿƒËó§Óï¹ÙìÅÈÌËËÉ´¯¯./0"ÆÀÁÈÜæÿÿúÿøóóíîêåääãâÒÑϯ®¬œœ›–”–!"$üÿÿš–•ÜÞݹ¹¹´²±§§¥ŽŽŒŠ‰¡ žŒ,.0‚|wËËÎ×רÊÈȽ¼»½¼¼´³²¨§¦ª¨¨­¬«“”–(%%Åêÿ¾½¾áãäÌÉɵ´´»»ºª©§²±°¿¿¾ÀÀ¾™œž*$"¨íÿÁçýòêéßÖÑË¿¸ÎÊÆÔÔÔÔÓÑÌÈÆ ™…‚€,%"–êÿÁåû¶Þ÷yÐÿ]Ëÿ±Ïçèæä´°­™ª¹×íÿÌñÿ«½Ò)(*¸ÃÊÒöÿÎäö˜×ý–ÓþàíöÝÕÏœ¹Ø¤¨­Š¨Ö•™Ÿ¥¬°œ¿Õ./2vur·°¬áî÷¸åÿn—§g~ø´²ÎãáÚöõñ–”¯_gÿ34)#$'ùøøÅÁÅÜóÿ™×ýÕý~ÖÿXvÎ>7ÿAC¸óöæãåÐ88â99ÿ(+%&'*ñóôçååÛñý¯ÜýŸÚýŠÝÿx¨­ÿª«|ts¡‘‘°”•™"ÿ »¼¾ííîîþÿãùÿâ÷ÿÃÈÌÁ¹®JN“ù ÿÿIKlžœ©§¨a]Y''DLµDKµ+,ÿ¿ÃÇ¿ÀÁÁÁÁÀ¿Ç¥°ÀÀÀÀÀÀÀµÇÇ¥µµÃ¥°°µÃ°°¥¢µµÃo¥¥oõµ¿Ç¥¦ÃHbVVbIõ¥¡¡¥ÇP=EE=]¥¦¦¿¡¡¡¥ODD›¥¡¡¡¿¿———¥NggN¥¡¡¡¿’’ =:=ª:= ——ÇLj#]•kÇg•JÇ’’²¬†ÇELjˆ>Lj#²dž††¬†/¬ˆÇÇ“YYYfˆÇzzzz' ÇÇ KKÇøàÀ€€€€Ààø( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿw»™™™ÿw»»°™™™™™ÿw»»»» ™ ™™ÿw»»»» ð™ ÿw»»»°™ÿÿð™ÿw»»»°™ÿÿÿ ™ˆw»»»°™™ÿ𙙈w{»»°™™ÿ𙙈www{°™ÿÿÿ ™‹wwwwp™ÿÿð™ »w»»ww ð™  »w»»»w ™ ™™ »w»»»wp™™™™™ »ww{»ww™™™ »ww‡ˆwww ¸wwxxxˆ‡xxˆwˆ‡ˆwwww‡ˆwwxˆxˆˆxxˆwwwwwwxˆˆwpˆxxˆÿwwx€ˆÿpwwwwwx€ÿwwwwwwwwwÿ »·wwwwwwpð»»»»»·wwwÿðw{»»»»»»·ÿ»·www»·w{°ð »»»»»w »»° »»»»»»» »»°»»»»ø?ð?ðÀàÀÀÀÀÀÀÀÀÀÀÀÀÀ?ÀÀÀÀÀÀÀÀÀ?À€€??€?ÿ€ÿ( @€       #""$$#&%$''&)(',*).,+0/-30/531742743853854864975:97;:8=<:>>;?><>>=>?A=?Kg9>t:?y?ú67ù*,ø"%ùùøôî!æ-å;ã!Zì(~í1–õ5¡÷=¬ûG¶üQ¼ýWÀþ_ÃüfÆûhÇûkÈûpËüwÎþ|Îþ‚Ïþ…Ïþ‡Ñþ‰ÒþÕþÖþ’×þ—×ýÙü¡Ùü¤Ûü§Üü«Þý®Ùþ±Öý³Òý´Õü¶ØýºÝýÀÞþÀâþÁâýÀâûÂáøÈàïÐÜåÔÚß×ÙÛÙÚÚÛÛÛÜÛÜÝÞßßàãßâçàäìáçðÿÿÿâëôåëóéêíëëíììîîîñðïññðòòóõò÷ùðúüòûý÷ýþûþþûþþakV_~^WW^^róð–~lWa~KCº¸¸ºCVX€žóýññûù–~lWa`D···¸¸¸¸ºIWŽççóüâãÞØââñö‰FµµCµ¶¶´´·µXWçççôüââØ×ÕÓÏÌx³´D€_´³xx³µ³WèèèõûãÞØÖÔÑÍËG³²s””m}””Z´´XWéééõûâØ×ÔÓÏÌÊD±±°ççççm²³³ZWë˜^öüâØÖÔÑÍ˨®®¯¯Fží퇯±±±FW‰Uk÷ððþñã×ÌÊÈZ««¬‰ööööu®­®ZWxWkðüûûþúùùïÙ^¨©€ùùyŠùùmªªXWqÝðñâØ×Ùãïõó}¥Ûmè{¨qŒŒmÔmWæÔÊðñØÖÓÏÌÒóíè`ÛÛm¥ÛÛxxÛ¨XWÕÌÌþñÕÓÏÌÉÍììë‘mäßßßßßߥVWÕÏÏ÷äÓÏËÉʦëéèç“`{¢îߣmVW×ÑÑ÷õíéž—‘’èçžžš˜ŒyrqVWÙÓÓöóìçš•ŽŽš–œ˜–•“’WWÞÕ£õìéž—‘‹Œ—‰…‡†ŽŒ‹WWãƒaôìç™•Ž‰‰ŒˆŠŒ‘ŽŒ‹‰‰WWztmóê眕‹ˆˆ–’‹‡ƒƒƒ‡‡WW‚ažó玓œ˜”‘Œ…†ƒ†‡ˆ†……WW—öúóçn•{us‡ŒŠ†ƒ€€‚WWúúúí|•þúù÷õ˜‹|rmlz}€€WWþþþ˜}þúùøõóíìëéçž‹‚ukWWaWþþô\Ôãñøöôóììêççž™—•“‘paWúì‘mÁÁÂÃÉÏ×£åèçžš—–”‘ˆV^óìvÁÁÁÂÃÄÅÈÉËÍÓÖ££¢”^mlõëmÉÌÊËÊËÉÉÉËÍÐÓÔרââ^^óí{§ÉÌÏÒÔÖØââãââ¦ÔÖØââ¤^lx|m§ÉÉÌÏÒÔÖØâââññZÓÕØãââ_mVU¨ÉÉÉÉÌÏÒÔÖØâââññJ¨Õ×Þâ¤zWaaaaaaaaa§¥Øâââñ£_\zm^W_la^WW]mm_alüü?øððàààààààààààà?à?à?à?à?à?à?à?ààààÀ?À€€Àÿàÿ(0`€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ÷p ™™ÿ÷wwp™™™™™™ÿ÷»»wwp ™™™™™™ÿ÷»»»»wwp™™ ™™™™ÿÿ÷»»»»»»· ™ð™™ ™ÿÿ÷»»»»»»» ™ÿ ÿð™ÿÿ÷»»»»»»» ÿÿðÿÿ ÿÿ÷»»»»»»°™™ÿÿÿÿð™™ÿÿ÷»»»»»»°™™ÿÿÿÿ ™™ÿÿ÷»»»»»»°™™™ÿÿð™™™øˆ÷»»»»»»°™™™ÿÿð™™™ˆˆ÷w{»»»»°™™ÿÿÿÿ ™™ˆˆ÷wwww»»°™™ÿÿÿÿ𙙈ˆ÷wwwwww» ÿÿðÿÿ ˆ‹÷wwwwwww ™ÿ ÿ𙋻÷{»»wwww ™ð™™ ™»»÷{»»»»·wp™™ ™™™™»»÷{»»»»·ww ™™™™™™»»÷{»»»»·wwp™™™™™™»»÷{»»»»·www ™™»»÷{»»»»·wwwwp»»÷www»»·wwwww‡p»»÷wwwxxwˆ‡wwwwp»»÷www‡‡‡wxˆ‡‡‡€»ˆ÷wwxxx‡wwwwwxpˆˆ÷ww‡‡ˆ‡ˆˆw‡‡‡€ˆˆ÷xˆˆxˆ‡wwˆˆˆxpˆˆ÷wwwˆˆ‡ˆw‡‡ˆ‡€ˆ÷wwwwwwwˆˆxxx€ˆÿ÷w‡ww‡ˆˆˆ€ÿÿ÷pwwx€ˆxxxˆ€ÿÿ÷pwwwwwˆˆˆ€ÿÿ÷wwwwwwwwˆÿÿwwwwwwwwwwwwˆÿwwwwwwwwwwwwwww÷w »»·wwwwwwwwwwpww »»»»»»wwwwwwwwp»»»»»»»»»»wwwwwpww»»»»»»»»»»»pww »»wwwww»»»»·w»wp »»»»»»»wwww{»»°w»»»»»»»»»» »»»»°»»»»»»»»»»» »»»»»»»»»»»»»»»»»»»»» »»»»»»»»»»» »»»ÿ‡ÿÿÿéõÿü?ÏÌþøççüpZø^öøÍËøžíøFøk÷øÌÊøööøZøkðøùïøùyøXøÝðøïõø{¨øø?ÊðøÿÒóøÿ¥ÛøÿøÿÌþøÿÍìøÿßßøÿøÿÏ÷øÿ¦ëøÿ¢îøÿøÿÑ÷øÿ’èøyrøøÿÓöøÿŽšðÿ’ðÿàÿ£õàÿŒ—ÀÿŒÀ€aôàÿ‰Œÿ?ÿ‹‰ÿÿøÿÿ(0`€ €€€€€€€ÀÀÀÀÜÀðʦ€€€ÿÿÿÿÿÿÿÿÿÿÿÿðûÿ¤  Ôðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿÿܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÿÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%ÿܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÿÿÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&÷ø÷  ööööõõøôîô÷ø÷ øù)))))ûøö øïìíõøøö öù)3)ø ö÷ñïïìîñõøøö öú111ù ÷øïîîîì  îñöùøú11111111111111ù øîîîîîì íú111(ú)1111úú1111øøîîîîîì  111(ùóø)11ú÷ôú111)öøîîîîîìú11(ùòñø)úöôú111øøîîîîîìó(00(ùñððøöðððöú111úõøîîîîîì 00000ùñïïïïïï ú0011(öøîîîïïì÷000000ùðîîîîðú00000(÷øîîñùñì ÷000000ùùîííí÷ú000000÷øîôúôîì÷/////ùõìììììí÷ù0000úöøõøòøìì õö...ùõìììïôììí÷ù///ù øòôúôíììììíð÷""÷ùíììôùùîììïú/./øøõùíí ìììííø"--ø÷ìôù.õùîîù ..ö÷øîîî  ííñ÷---øùù"--ôùùõ--"øõøíî  íííöó!!-ö-----ôô---÷öø ìîííîïøó,,,,!!!!!!!-öøø ìììîíîîîïööï,,,,,,,,ñø÷ø ììì"îîîîîîïóøõñ, ðò÷ø ø ìììííîîïïðñïîîîîïïïïñõ÷÷÷ù÷ ø ìììííîîïïðñïîîïïïïïïððõöø  ìíííîîïïðññïïðïïïïïððñ öø íííííîîïïðññïðñòññññ öø  òîíííîîïïðññòðïïïïðñòññññ öøï öîíííîîïïðññòðñòòññññññ öøñøòîíîîîîïðññòòïðñòóòòòñò öøñ ÷ííîîîîîïïïñòñòñññññòòóòööøñøóììíîîñïïïïðððñòóòòòòòòòööøïìììîîïøôöøöõóòññññòòóóóööøîïõñììîðóõöø÷ ôñòòòòòööøîòöìììììíííïô ÷ø÷öõôóööøïøììììììíííííîîîîîðòôö÷øùøö ø÷ïìììììíííííîîîîîïïïïïððòóõùöøìòö íìììíííííîîîîîïïïïïððøøíîö!îîíîîîîîïïïïïððñø øìííïø!ïïïïïïðð ÷ öíííô!!ïïðòøøðíííø òø öììíò  ÷ øïììð÷ ! ðø øñøö óô õöø÷øõ óù îù ù÷ø ôø ó÷öõöù÷õõõ### öø"òô÷øø÷ö  ööö÷÷÷øøøø÷÷ ôôòïööøø÷öõööö÷÷÷øøøøøÿÃÿÿÿÿ?þTÐþøçÿü0ñÿøðÿøïÿøñÿøóÿøôÿøöÿøîÿøÛÿø“ø øøøø ÿøÄÿøóÿø?ôÿøÿöÿøÿ÷ÿøÿöÿøÿöÿøÿöÿøÿøÿøÿúÿøÿ·øÿ$øÿøÿøÿøÙÿø?•ÿøóÿøôÿøÿöÿðÿøÿðÿúÿàÿüÿàÿëÿÀ÷ÿÀùÿ€?Hâ 3øÿÿÿÀÿÿ(  @"++"4Xt……tX4Z///¹11dè..Žú33‚û//bî)))Ô¨‚N---ˆ77ƒøéÿ ÿÿ ÿÿ ÿÿ ÿÿéÿ99vûÌ‘N999‚55¦ÿÿÿôÿÿÿÿÿÿÿÿÿôÿÿÿ88ÿÌ‚4!!!%??…õ&&ÿÿ''ôÿWW€ÿBB–ÿ!!ÿÿ!!ÿÿAA–ÿVV€ÿ!!ôÿÿÿ==vû¨XDDD’55éÿ22ôÿ\\„ÿ´´´ÿ§§§ÿGG—ÿGG—ÿ§§§ÿ´´´ÿ[[„ÿ**ôÿ,,éÿ)))Ôt"EE~Ø<<ÿÿ<<ôÿRRvÿ´´´ÿÍÍÍÿ¶¶¶ÿ¶¶¶ÿÍÍÍÿ´´´ÿLL—ÿ22ÿÿ22ÿÿ88bî…+JJ¦ÿGGÿÿFFÿÿFFôÿUUwÿÂÂÂÿßßßÿßßßÿÂÂÂÿQQ˜ÿ>>ÿÿ>>ÿÿ==ÿÿCCû…+WW¦ÿ^^ÿÿ[[ÿÿXXÿÿWWšÿÍÍÍÿëëëÿëëëÿÍÍÍÿUUšÿIIÿÿHHÿÿGGÿÿGGŽút"^^ÔŠŠÿÿ‡‡ÿÿhhšÿÒÒÒÿñññÿÒÒÒÿÒÒÒÿñññÿÒÒÒÿ]]šÿccÿÿ__ÿÿBBdèXKKK“™™éÿžžôÿ}}Žÿìììÿ×××ÿwwšÿggyÿ×××ÿìììÿ{{Žÿ‹‹ôÿ‚‚éÿ///¹4KKK!oo‡ð¶¶ÿÿ®®ôÿ‚‚ÿ›ÿ¯¯ÿÿ¨¨ôÿkkyÿ€€ÿ¤¤ôÿ§§ÿÿffƒøZKKKb™™¼ÿÇÇÿÿ¿¿ôÿÄÄÿÿÂÂÿÿÀÀÿÿ¸¸ôÿ··ôÿ»»ÿÿ‚‚¦ÿ---ˆKKKb‚‚“ðÇÇéÿ××ÿÿÖÖÿÿÔÔÿÿÒÒÿÿ¿¿éÿtt…õ999‚KKK!KKK“xxÔ˜˜¦ÿ˜˜¦ÿuu~ØDDD’!!!%àÀ€DI¸ÿÜÿ¸ÿíÿþÿùÿøÿ÷ÿöÿ€õÿÀôÿàóÿ( @ €! !QqkT=+ $BZdbU; )///œgggòCCCá$$$Ì­”‚kT=)?‹111Ê333×333Ù***Ï®c1 %777³˜˜˜ÿèèèÿÿÿÿÿÞÞÞÿ±±±ÿ÷BBBä$$$Ì­’}gz==Ná%%¼ÿôÿ ÿÿ ÿÿéÿ++¦ÿ,,>á«s1111PPPꪪÿÔÔÔÿêêêÿôúþÿÔíûÿÚïüÿàòüÿðùþÿÞÞÞÿ¦¦¦ÿpppó222Þ%%%Ë@@lúôÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿ>>Mó«bDDDI«««ÿÖÖÖÿÖÖÖÿëëëÿóúþÿÉèúÿ¿äùÿ´àøÿªÛ÷ÿ¦Ù÷ÿ¶àøÿÄæúÿßñüÿ__zÿ''ôÿ&&ôÿJJtÿ<<ÿ ÿÿÿÿAA–ÿ::ÿÿÿ%%Þÿ111á‹7DDDIµµµÿØØØÿØØØÿìììÿòùþÿÄæúÿºâùÿ¯Ýøÿ¥Ù÷ÿ›ÕöÿÐõÿ†Ìôÿq©Êÿ;;¼ÿ00ÿÿNNvÿ¥¥¥ÿ’’’ÿ@@ÿFF—ÿ¥¥¥ÿ’’’ÿ>>ÿ''ÿÿ??ÿ¥ODDDI¶¶¶ÿÚÚÚÿÚÚÚÿìììÿðùþÿ¾äùÿ´ßøÿªÛ÷ÿ ×öÿ–Òõÿ‹ÎõÿÊôÿa‚–ÿ<<ÿÿ;;ÿÿNN—ÿ³³³ÿÌÌÌÿ¦¦¦ÿµµµÿÌÌÌÿ›››ÿDDÿ22ÿÿ77Þÿ%%%È]DDDI¸¸¸ÿÜÜÜÿ¸¸¸ÿíííÿïøþÿ¹áùÿ¯Ýøÿ¤Ù÷ÿšÔöÿÐõÿ†Ìôÿ{ÇóÿVj£ÿGGÿÿFFÿÿEEÿÿSS˜ÿÂÂÂÿßßßÿßßßÿ¦¦¦ÿIIÿ>>ÿÿ==ÿÿ==ÿÿ///Ó]DDDIºººÿ•••ÿ___ÿïïïÿûýÿÿèõýÿÏëûÿ±Þøÿ•Òõÿ‹Îôÿ€ÊóÿvÅòÿ\p£ÿaaÿÿ^^ÿÿ[[ÿÿXXšÿÎÎÎÿëëëÿëëëÿ°°°ÿKKÿJJÿÿIIÿÿHHÿÿ000ÏODDDI{{{ÿiiiÿiiiÿðððÿÿÿÿÿùýÿÿÿÿÿÿþþþÿôøûÿÔêöÿ¸Þóÿ’Ïòÿ]•ÿÿÿ‹‹ÿÿjjšÿÓÓÓÿñññÿ½½½ÿÒÒÒÿñññÿ´´´ÿUUÿggÿÿ__Þÿ(((·7DDDI………ÿiiiÿ¸ÃÈÿñññÿÿÿÿÿÅæúÿÁäùÿÈçøÿÐè÷ÿáíôÿðððÿíííÿÂÂÂÿ……¼ÿ§§ÿÿzzšÿØØØÿ¸¸¸ÿmmÿwwšÿØØØÿ¸¸¸ÿjjÿ““ÿÿeeÿ kDDDI¢¢¢ÿÃÛéÿ~Èòÿòòòÿþþþÿ·àøÿ«Û÷ÿžÖöÿ’Ñõÿ…Ëôÿ–Ïðÿèèèÿåååÿ‰ÿ³³ôÿ¸¸ÿÿ›ÿuuÿ³³ÿÿ²²ÿÿ~~›ÿssÿ¬¬ÿÿ˜˜Þÿ999Á.DDDIšµÅÿÉóÿÉóÿñññÿúúúÿªÛ÷ÿžÖöÿ‘Ðõÿ…ËôÿxÆòÿ‹ÊïÿäääÿàààÿËËËÿmmwÿÄÄôÿËËÿÿÉÉÿÿÇÇÿÿÅÅÿÿÄÄÿÿÂÂÿÿ©©ÞÿNNTâ0 DDDI‘´ÇÿˆÍôÿˆÍôÿðððÿõõõÿÕöÿÐõÿ„ËóÿwÅòÿkÀñÿÅæÿßßßÿÛÛÛÿØØØÿÍÍÍÿwwyÿ¦¦¼ÿÔÔôÿÜÜÿÿÚÚÿÿÆÆéÿ¦ÿLLQ¬+DDDI–¶ÉÿÐõÿÐõÿïïïÿðððÿéééÿßßßÿÕÕÕÿËËËÿÂÂÂÿÂÂÂÿÚÚÚÿ×××ÿÔÔÔÿÐÐÐÿÍÍÍÿ²²²ÿ‰‰‰ÿ‡‡‡ÿxxxÿ444ÕgDDDI›¹Êÿ™Ôöÿ™ÔöÿîîîÿìììÿäääÿÚÚÚÿÐÐÐÿÇÇÇÿ½½½ÿ½½½ÿÎÎÎÿËËËÿÎÎÎÿËËËÿÈÈÈÿÅÅÅÿÁÁÁÿ¾¾¾ÿŸŸŸÿ´H DDDI »Êÿ¢Ø÷ÿ­ÏãÿìììÿçççÿßßßÿÕÕÕÿËËËÿÂÂÂÿ¸¸¸ÿ¸¸¸ÿÉÉÉÿ²²²ÿ«««ÿ­­­ÿ¬¬¬ÿÀÀÀÿ¼¼¼ÿ¹¹¹ÿœœœÿ´H DDDI­ÀÊÿ™¦­ÿxxxÿëëëÿâââÿÚÚÚÿÐÐÐÿÇÇÇÿ½½½ÿ³³³ÿ³³³ÿ¿¿¿ÿ¨¨¨ÿ°°°ÿ¸¸¸ÿ¼¼¼ÿ»»»ÿ¸¸¸ÿµµµÿ˜˜˜ÿ´H DDDIƒƒƒÿ‰‰‰ÿoooÿéééÿÝÝÝÿÙÙÙÿÒÒÒÿÊÊÊÿ¾¾¾ÿ°°°ÿ®®®ÿÁÁÁÿ¼¼¼ÿ»»»ÿ±±±ÿ©©©ÿ¤¤¤ÿ£££ÿ¥¥¥ÿ•••ÿ´H DDDI•••ÿÿÚÚÚÿèèèÿÙÙÙÿ´´´ÿÿ¯¯¯ÿ»»»ÿÈÈÈÿÅÅÅÿ¼¼¼ÿ­­­ÿ¥¥¥ÿ§§§ÿ¤¤¤ÿ§§§ÿ©©©ÿ©©©ÿ‘‘‘ÿ´H DDDI»»»ÿøøøÿøøøÿçççÿÌÌÌÿ‚‚‚ÿñññÿÍÍÍÿ   ÿ‘‘‘ÿ’’’ÿ~~~ÿŠŠŠÿÿ­­­ÿ°°°ÿ¨¨¨ÿ£££ÿŸŸŸÿŽŽŽÿ»e.DDDIÎÎÎÿúúúÿúúúÿåååÿyyyÿñññÿùùùÿõõõÿñññÿîîîÿêêêÿæææÿÐÐÐÿºººÿ“““ÿ†††ÿ………ÿtttÿ}}}ÿ{{{ÿÈk+CCCJÐÐÐÿûûûÿûûûÿŸŸŸÿÑÑÑÿúúúÿöööÿòòòÿïïïÿëëëÿçççÿãããÿßßßÿÛÛÛÿØØØÿÔÔÔÿÐÐÐÿÌÌÌÿ¸¸¸ÿ¦¦¦ÿ†††ÿfffú!!!•%???NÑÑÑÿõõõÿßßßÿOy‘ÿS¶ïÿnÀðÿ”Îñÿ«ÖðÿÈàíÿßåèÿäääÿàààÿÜÜÜÿØØØÿÕÕÕÿÑÑÑÿÍÍÍÿÉÉÉÿÅÅÅÿÁÁÁÿ¶¶¶ÿPPPäG :::jÆÆÆÿâââÿ§§§ÿ@”Åÿ;¬íÿ@®íÿJ²îÿS¶ïÿ\ºðÿe¾ñÿnÂòÿ’Ìîÿ¢Ðêÿ°ÒåÿÃÒÛÿÅÏÕÿÊÊÊÿÆÆÆÿÂÂÂÿ¾¾¾ÿ}}}ÿ›0 TTTÐêêêÿçççÿw‡ÿd½ñÿ^»ðÿ]ºðÿ]ºðÿX¸ïÿ]ºðÿf¾ñÿoÂòÿxÆóÿÊóÿ‹Îôÿ”ÒõÿÖöÿ¦Ú÷ÿ´Ùîÿ¼ØçÿÂÒÛÿ:::ê“C 333I   ÿïïïÿÄÄÄÿaªÿvÆóÿÊôÿ‹Îôÿ”ÒõÿŸ×öÿ©Û÷ÿ¥Ù÷ÿªÛ÷ÿ ×öÿªÛ÷ÿŸÖöÿ˜Óõÿ›Õöÿ¥Ù÷ÿ°ÞøÿºâùÿÅæúÿ…’™ÿ·n$WWW®ÙÙÙÿŽ“–ÿ]•ÿo¼èÿvÆóÿÊôÿ‹Îôÿ”ÒõÿŸ×öÿ©Û÷ÿ³ßøÿ½ãùÿÇèúÿÑìûÿÛðüÿ„‘™ÿ“Ëëÿ¢Ø÷ÿ­Ü÷ÿ·áùÿÂåùÿÄàïÿEFHây3FFF#LLLâXrÿo¼èÿqÃòÿqÃòÿvÆóÿÊôÿ‹Îôÿ”ÒõÿŸ×öÿ©Û÷ÿ³ßøÿ½ãùÿÇèúÿÑìûÿÛðüÿotwúr¡ÿŸ×öÿªÛ÷ÿµàøÿ¿äùÿÊéúÿ‰Žÿ+++tKKK!FFF#R_gÂZ{Žñ_ˆ ÿ_ˆ ÿd‘ªÿtªÊÿ{®Êÿ‡¹ÖÿŸ×öÿ©Û÷ÿ³ßøÿ½ãùÿÇèúÿÑìûÿÛðüÿlqtÞEJMÁ„«Áÿz”¢ÿm}†æZad¼EEE@@@`777-KKK!HHHDEEEGGGGhHHH‰GGG‹HHHšn{Æq{Èrz~Ö”ž¤ÿDDD¡(EEEHüðø@àààààààààààààààààààààààÀÀ€€€€þÿ(0` €%   ,Ym`H3# +?OZWH6#7999Á@@@ç...×½›Œv[C/! 3]—"""¶000Ï***̺¡ŽsN& OBBBÞ‡‡‡ÿèèèÿÇÇÇÿ›››ÿcccÿ>>>î)))Ô¶—‡qZC/ U444¿BBSó77…ÿ))¦ÿÇÿ¼ÿ((¦ÿ??nÿ>>>îÉšo7!!!pMMMé   ÿÒÒÒÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ¼¼¼ÿÿ```û:::é)))Óµ—‡pU=9%%%„DDSñ..¦ÿôÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿéÿ44ÿ>>>î°|< 111~SSSøºººÿÔÔÔÿÔÔÔÿôôôÿÿÿÿÿãóýÿàòüÿêöýÿ÷üþÿÿÿÿÿÿÿÿÿéééÿ¼¼¼ÿÿUUUû:::é$$$Í®”(((¹CCnÿéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ##ÇÿBBQ÷·x1AAA_gggÿÌÌÌÿÕÕÕÿÕÕÕÿÕÕÕÿôôôÿÿÿÿÿÛðüÿÊéúÿÃæúÿ¼ãùÿºâùÿÈèúÿÙïüÿíøýÿÿÿÿÿÿÿÿÿÞÞÞÿ±±±ÿ………ÿQQQ÷EEnÿ ôÿÿÿÿÿ**Çÿôÿÿÿÿÿÿÿÿÿ!!Þÿôÿÿÿÿÿ ÞÿBBBó«cFFFŒ´´´ÿÖÖÖÿÖÖÖÿÖÖÖÿÖÖÖÿõõõÿÿÿÿÿÙïûÿÇçúÿÀäùÿ¹áùÿ²ßøÿ«Ü÷ÿ¥Ù÷ÿŸÖöÿ˜Óöÿ¬ÜøÿÄæúÿàòüÿÿÿÿÿaanÿ--Þÿ%%ÿÿ$$ÿÿ22¼ÿYYYÿDDnÿ$$ôÿ!!ÿÿ ÿÿ((ÞÿPP^ÿJJtÿ ôÿÿÿÿÿ22±ÿ111á;FFFŒµµµÿØØØÿØØØÿØØØÿØØØÿõõõÿÿÿÿÿÖîûÿÃæúÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡Øöÿ›Õöÿ”ÒõÿÏõÿ‡Ìôÿ€Éóÿj™µÿ==¦ÿ--ÿÿ,,ÿÿ88¼ÿaaaÿ¬¬¬ÿÿFFnÿ**ôÿ..ÞÿQQ_ÿ   ÿ   ÿLLuÿ''ôÿ##ÿÿ##ÿÿHHcÿ¯ZFFFŒµµµÿØØØÿØØØÿØØØÿØØØÿõõõÿÿÿÿÿÔíûÿÀäùÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ˜Óöÿ‘ÐõÿŠÎôÿƒËôÿ|ÈóÿUdlÿ66ôÿ44ÿÿ88ÞÿTTTÿ¸¸¸ÿ¿¿¿ÿ¿¿¿ÿ–––ÿGGnÿSS`ÿ«««ÿ¿¿¿ÿ¿¿¿ÿ£££ÿFFnÿ++ÿÿ**ÿÿ77¼ÿ)))Ôt"FFFŒ¶¶¶ÿÚÚÚÿÚÚÚÿÚÚÚÿÚÚÚÿöööÿÿÿÿÿÑìûÿ¼ãùÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿ›Õöÿ”ÒõÿÏõÿ‡Ìôÿ€Éóÿv¿éÿIIzÿ<<ÿÿ;;ÿÿ;;ÿÿGGÿ|||ÿÍÍÍÿÍÍÍÿÍÍÍÿ¦¦¦ÿµµµÿÍÍÍÿÍÍÍÿÄÄÄÿdddÿ==¼ÿ22ÿÿ22ÿÿ22ôÿ>>>î†+FFFŒ¸¸¸ÿÛÛÛÿÛÛÛÿÛÛÛÿÛÛÛÿöööÿÿÿÿÿÏëûÿ¹áùÿ²ßøÿ«Ü÷ÿ¤Ù÷ÿžÖöÿ—Óöÿ‘ÐõÿŠÎôÿƒËôÿ|Èóÿl§ÉÿHH¦ÿCCÿÿCCÿÿBBÿÿBBÿÿIIÿ€€€ÿØØØÿØØØÿØØØÿØØØÿØØØÿÏÏÏÿgggÿBB¼ÿ;;ÿÿ99ÿÿ99ÿÿ88ÿÿGG`ûŽ/FFFŒ¹¹¹ÿÝÝÝÿÝÝÝÿ§§§ÿ§§§ÿöööÿÿÿÿÿÌêûÿ¶àøÿ¯Ýøÿ¨Ú÷ÿ¡×öÿšÔöÿ”ÒõÿÏõÿ‡Ìôÿ€ÉóÿyÆóÿj¦ÉÿLL¦ÿJJÿÿJJÿÿJJÿÿHHÿÿHHÿÿLL…ÿŽŽŽÿãããÿãããÿãããÿãããÿiiiÿHH±ÿBBÿÿBBÿÿAAÿÿ@@ÿÿ@@ÿÿJJzÿ‹.FFFŒºººÿÕÕÕÿƒƒƒÿVVVÿºººÿ÷÷÷ÿÿÿÿÿÿÿÿÿì÷ýÿÛðüÿÁåùÿ¤Ø÷ÿ—Óõÿ‘ÐõÿŠÎôÿƒËôÿ|ÈóÿuÅòÿh¦ÉÿWW¦ÿ^^ÿÿ^^ÿÿZZÿÿWWÿÿSSÞÿWWbÿÍÍÍÿëëëÿëëëÿëëëÿëëëÿ°°°ÿLLnÿJJôÿIIÿÿHHÿÿHHÿÿGGÿÿLLnÿ}'FFFŒŸŸŸÿhhhÿiiiÿÿŸŸŸÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéõûÿËèøÿ²ÝöÿŽÏôÿyÆóÿrÄòÿj­Óÿ\\…ÿÿÿzzÿÿzzÿÿllÞÿYYbÿÑÑÑÿïïïÿïïïÿåååÿïïïÿïïïÿïïïÿ³³³ÿMMnÿVVôÿWWÿÿUUÿÿRRÿÿCCCïgFFFŒrrrÿŽŽŽÿ{{{ÿVVVÿÅÅÅÿ÷÷÷ÿÿÿÿÿùüþÿñùþÿÿÿÿÿþþþÿüüüÿúúúÿøøøÿöööÿôôôÿâìòÿÀßñÿ§Õðÿ[[bÿ™™ÿÿ——ÿÿ‹‹éÿ[[cÿÔÔÔÿóóóÿóóóÿèèèÿlllÿ‹‹‹ÿóóóÿóóóÿóóóÿªªªÿSSnÿssÿÿssÿÿggÓÿ999ØI FFFŒ¡¡¡ÿ```ÿrrrÿÙÙÙÿâââÿøøøÿÿÿÿÿñùþÿÃåùÿ»âùÿÄæùÿÌèøÿÜí÷ÿïóõÿóóóÿñññÿïïïÿíííÿëëëÿ‡‡‡ÿŠŠÇÿ¥¥ÿÿžžôÿ^^nÿ¸¸¸ÿøøøÿíííÿmmmÿ€€¼ÿllÿÿøøøÿíííÿmmmÿ||¼ÿ’’ÿÿÿÿeeÿ ™(FFFŒsssÿ˜˜˜ÿäääÿ¬Ôëÿ«Ôëÿøøøÿÿÿÿÿïøýÿºâùÿ²Þøÿ©Û÷ÿ¡×öÿ™Ôõÿ‘ÐõÿœÓóÿª×òÿÞçíÿêêêÿçççÿÓÓÓÿ__nÿ²²ÿÿ±±ÿÿªªôÿ``nÿ¯¯¯ÿnnnÿ‰‰¼ÿªªÿÿªªÿÿqqÿŽŽŽÿnnnÿ„„¼ÿ¤¤ÿÿ¢¢ÿÿÞÿDDDêHFFFŒ¿¿¿ÿßãæÿ”ÎïÿxÆóÿ¯Öìÿøøøÿýýýÿêôûÿ±Þøÿ©Ú÷ÿ¡×öÿ™Óõÿ‘ÐõÿˆÍôÿ€ÉóÿxÆòÿËßëÿçççÿåååÿãããÿŽŽŽÿ……¦ÿ¾¾ÿÿ½½ÿÿ´´ôÿbbnÿ’’¼ÿ¸¸ÿÿ··ÿÿµµÿÿµµÿÿuuÿ¼ÿ²²ÿÿ°°ÿÿ©©ôÿ__nÿ'''€FFFŒ³¼Áÿ…Êòÿ~Éóÿ~Éóÿ²×íÿöööÿúúúÿæòùÿ¨Ú÷ÿ ×öÿ˜ÓõÿÐõÿˆÌôÿ€ÉóÿwÅòÿpÂòÿÇÜèÿäääÿâââÿßßßÿÝÝÝÿpppÿšš¼ÿÊÊÿÿÉÉÿÿÇÇÿÿÇÇÿÿÅÅÿÿÄÄÿÿÃÃÿÿÁÁÿÿÁÁÿÿÀÀÿÿ¾¾ÿÿ¶¶ôÿhhzÿ222•FFFŒ§¹ÄÿƒËôÿƒËôÿƒËôÿµÙíÿõõõÿ÷÷÷ÿáîöÿ ×öÿ˜ÓõÿÐõÿ‡ÌôÿÉóÿwÅòÿoÂòÿg¾ñÿÂÙæÿàààÿÞÞÞÿÜÜÜÿÚÚÚÿÏÏÏÿxxxÿÿÍÍôÿÕÕÿÿÓÓÿÿÓÓÿÿÒÒÿÿÐÐÿÿÐÐÿÿÎÎÿÿÍÍÿÿ³³Þÿddnÿ555ŠFFFŒª»ÅÿŠÎôÿŠÎôÿŠÎôÿºÜïÿóóóÿôôôÿÝëóÿ—ÓõÿÏôÿ‡ÌôÿÈóÿwÅòÿoÂòÿx¿èÿ|»àÿÊÖÝÿÝÝÝÿÛÛÛÿÙÙÙÿ×××ÿÕÕÕÿÓÓÓÿŸŸŸÿ^^`ÿ›ÿÅÅÞÿßßÿÿßßÿÿÞÞÿÿÓÓôÿ®®Çÿ€€ÿGGGÐ///N FFFŒ¬½ÆÿÐõÿÐõÿÐõÿ½ÝðÿñññÿñññÿïïïÿèèèÿáááÿÛÛÛÿÕÕÕÿÎÎÎÿÈÈÈÿÂÂÂÿ»»»ÿÓÓÓÿÚÚÚÿØØØÿÖÖÖÿÔÔÔÿÒÒÒÿÏÏÏÿÍÍÍÿËËËÿšššÿ{{{ÿkkkÿjjjÿjjjÿTTTÿ555Ñ%%%d FFFŒ¯¾Çÿ•Òõÿ•Òõÿ•ÒõÿÁßñÿïïïÿîîîÿëëëÿåååÿÞÞÞÿØØØÿÒÒÒÿËËËÿÅÅÅÿ¾¾¾ÿ¸¸¸ÿÐÐÐÿ×××ÿÕÕÕÿÓÓÓÿÑÑÑÿÎÎÎÿÌÌÌÿÊÊÊÿÈÈÈÿÆÆÆÿÄÄÄÿÂÂÂÿ¿¿¿ÿ½½½ÿiiiÿ0FFFŒ±¿ÈÿšÕöÿšÕöÿšÕöÿÄáòÿíííÿëëëÿèèèÿáááÿÛÛÛÿÔÔÔÿÎÎÎÿÈÈÈÿÂÂÂÿ»»»ÿµµµÿÍÍÍÿÍÍÍÿÄÄÄÿÏÏÏÿÍÍÍÿËËËÿÉÉÉÿÇÇÇÿÅÅÅÿÃÃÃÿÁÁÁÿ¾¾¾ÿ¼¼¼ÿºººÿhhhÿ0FFFŒ³ÁÈÿŸ×öÿŸ×öÿ¤ØöÿÛéñÿëëëÿèèèÿåååÿÞÞÞÿØØØÿÑÑÑÿËËËÿÅÅÅÿ¾¾¾ÿ¸¸¸ÿ²²²ÿÉÉÉÿÃÃÃÿ³³³ÿ¦¦¦ÿ¥¥¥ÿ¨¨¨ÿ°°°ÿ···ÿ¿¿¿ÿ¿¿¿ÿ½½½ÿ»»»ÿ¹¹¹ÿ···ÿgggÿ0FFFŒµÂÉÿ¥Ù÷ÿÅãôÿ¦ª«ÿ´´´ÿéééÿåååÿâââÿÛÛÛÿÔÔÔÿÎÎÎÿÈÈÈÿÂÂÂÿ»»»ÿ´´´ÿ¯¯¯ÿÆÆÆÿÍÍÍÿËËËÿÉÉÉÿÇÇÇÿÂÂÂÿ¸¸¸ÿ¯¯¯ÿ¹¹¹ÿ¼¼¼ÿºººÿ¸¸¸ÿ¶¶¶ÿ´´´ÿfffÿ0FFFŒ»ÄÉÿÅÑÙÿ€€€ÿxxxÿ×××ÿçççÿâââÿßßßÿØØØÿÑÑÑÿÊÊÊÿÅÅÅÿ¾¾¾ÿ¸¸¸ÿ±±±ÿ«««ÿÃÃÃÿ¸¸¸ÿ¢¢¢ÿ¥¥¥ÿ¬¬¬ÿ°°°ÿ¶¶¶ÿ½½½ÿ»»»ÿ¹¹¹ÿ···ÿµµµÿ³³³ÿ±±±ÿfffÿ0FFFŒÿfffÿ¤¤¤ÿ£££ÿ¬¬¬ÿåååÿßßßÿÜÜÜÿØØØÿÓÓÓÿËËËÿÄÄÄÿ»»»ÿ´´´ÿ®®®ÿ¨¨¨ÿÀÀÀÿÇÇÇÿÅÅÅÿÃÃÃÿ¹¹¹ÿ°°°ÿªªªÿ¡¡¡ÿ¡¡¡ÿ¢¢¢ÿ§§§ÿ¬¬¬ÿ­­­ÿ­­­ÿeeeÿ0FFFŒ§§§ÿ­­­ÿxxxÿÿÙÙÙÿãããÿÛÛÛÿÙÙÙÿ×××ÿÕÕÕÿÓÓÓÿÑÑÑÿÍÍÍÿÆÆÆÿ¼¼¼ÿ´´´ÿ¿¿¿ÿ´´´ÿ¦¦¦ÿ­­­ÿµµµÿ···ÿ¹¹¹ÿ···ÿµµµÿ±±±ÿªªªÿ£££ÿ¤¤¤ÿªªªÿdddÿ0FFFŒ•••ÿfffÿ®®®ÿõõõÿõõõÿáááÿØØØÿ×××ÿ¢¢¢ÿˆˆˆÿ———ÿ®®®ÿÃÃÃÿÉÉÉÿÇÇÇÿÅÅÅÿÃÃÃÿÁÁÁÿ¼¼¼ÿ³³³ÿ©©©ÿ£££ÿ   ÿ   ÿ¤¤¤ÿ§§§ÿ©©©ÿ«««ÿ©©©ÿ§§§ÿcccÿ0FFFŒ¨¨¨ÿÜÜÜÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿßßßÿÕÕÕÿºººÿnnnÿÑÑÑÿ¹¹¹ÿ¢¢¢ÿwwwÿiiiÿkkkÿÿŽŽŽÿ¢¢¢ÿ´´´ÿ¹¹¹ÿ···ÿµµµÿ³³³ÿ±±±ÿ©©©ÿ¥¥¥ÿ   ÿÿŸŸŸÿ¤¤¤ÿbbbÿ0FFFŒÍÍÍÿøøøÿøøøÿøøøÿøøøÿÝÝÝÿÊÊÊÿfffÿÜÜÜÿûûûÿùùùÿöööÿôôôÿñññÿïïïÿÄÄÄÿ¯¯¯ÿÿsssÿ]]]ÿgggÿ€€€ÿ‹‹‹ÿ–––ÿ«««ÿ©©©ÿ§§§ÿ¥¥¥ÿ£££ÿ¡¡¡ÿbbbÿšN" FFFŒÎÎÎÿúúúÿúúúÿúúúÿúúúÿÛÛÛÿ~~~ÿ°°°ÿüüüÿúúúÿ÷÷÷ÿôôôÿòòòÿðððÿíííÿëëëÿèèèÿæææÿãããÿáááÿÕÕÕÿ···ÿœœœÿ‰‰‰ÿoooÿaaaÿcccÿxxxÿÿŠŠŠÿaaaÿ°sNFFFŒÏÏÏÿúúúÿúúúÿúúúÿúúúÿ±±±ÿ„„„ÿüüüÿúúúÿøøøÿõõõÿòòòÿðððÿîîîÿëëëÿéééÿæææÿäääÿáááÿßßßÿÜÜÜÿÙÙÙÿ×××ÿÕÕÕÿÒÒÒÿÏÏÏÿÅÅÅÿªªªÿ’’’ÿ‚‚‚ÿjjjÿMMM÷>>>í///Ó}!FFFŒÐÐÐÿüüüÿüüüÿüüüÿáááÿW^bÿÂÞîÿïöúÿùùùÿöööÿóóóÿñññÿïïïÿìììÿéééÿçççÿåååÿâââÿßßßÿÝÝÝÿÚÚÚÿØØØÿÖÖÖÿÓÓÓÿÐÐÐÿÍÍÍÿËËËÿÈÈÈÿÆÆÆÿÄÄÄÿÁÁÁÿ¾¾¾ÿ§§§ÿGGGòLFFFŒÑÑÑÿýýýÿöööÿáááÿ£££ÿC‚§ÿ;¬íÿ;¬íÿL²îÿrÂðÿ”Îðÿ¡ÓïÿÈàîÿØäëÿçççÿåååÿãããÿàààÿÝÝÝÿÛÛÛÿØØØÿÖÖÖÿÔÔÔÿÑÑÑÿÎÎÎÿËËËÿÉÉÉÿÇÇÇÿÄÄÄÿÂÂÂÿ¿¿¿ÿ¼¼¼ÿhhhÿ###Œ DDD’ÑÑÑÿðððÿßßßÿÛÛÛÿ^^^ÿ<¦ãÿ;¬íÿ<¬íÿA®íÿG±îÿM³îÿS¶ïÿY¸ðÿ_»ðÿe¾ñÿ‰Éîÿ›Îìÿ«Òèÿ¾ÕãÿÉÖÞÿ×××ÿÔÔÔÿÒÒÒÿÏÏÏÿÌÌÌÿÉÉÉÿÇÇÇÿÅÅÅÿÂÂÂÿÀÀÀÿ½½½ÿ‹‹‹ÿ777É7 CCC·ÌÌÌÿåååÿâââÿ»»»ÿFq‰ÿ;¬íÿ;¬íÿ<¬íÿA®íÿG±îÿN´ïÿS¶ïÿZ¹ðÿ_»ðÿe¾ñÿlÀñÿqÃòÿxÅòÿ~ÈóÿƒÊôÿŠÍôÿœÐîÿ¤ÒìÿµÑâÿ»ÏÛÿÀÍÔÿÆÆÆÿÃÃÃÿÀÀÀÿ¾¾¾ÿ­­­ÿMMMõ |"***;uuuÿêêêÿçççÿåååÿ………ÿb£ÈÿhÀñÿ]ºðÿa¼ñÿT¶ïÿV·ïÿN´ïÿT¶ïÿZ¹ðÿ_»ðÿf¾ñÿlÀñÿrÃòÿxÆóÿ~Èóÿ„ËôÿŠÍôÿÐõÿ–ÓõÿœÕöÿ¢Øöÿ¨Ú÷ÿ®ÜøÿµÝõÿ½ÚêÿÀÔßÿˆ”ÿ---Û‚1 CCC·ÇÇÇÿîîîÿëëëÿÞÞÞÿR\bÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™Ôöÿ•Òõÿ“ÑõÿÐõÿÎõÿ„Ëôÿ†Ëôÿ}Èóÿ~Èóÿ„ËôÿŠÍôÿ‘Ðõÿ–ÓõÿœÕöÿ¢×öÿ¨Ú÷ÿ¯Ýøÿ¶àøÿ½ãùÿÄæúÿºÕäÿEEE÷¢[***;mmmÿóóóÿðððÿîîîÿ’’’ÿd—´ÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿ¿äùÿÇçúÿ¸áùÿŽÉëÿ˜ÔöÿŸÖöÿ¦Ù÷ÿ­Ü÷ÿ´ßøÿ»âùÿÂåùÿÉèúÿœ¤ÿ(((ׇ8 CCC¶¹¹¹ÿíííÿ   ÿY_bÿ_ˆ ÿo¼èÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ×èñÿg~Œÿ–ÓõÿÖöÿ¤Ø÷ÿ«Ü÷ÿ²ßøÿ¹áùÿÀäùÿÇçúÿÅàðÿRTUû­d3330XXXÿŽŽŽÿ\glÿd—´ÿo¼èÿqÃòÿqÃòÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ»ÉÐÿMMMÿƒ±Ëÿ›Õöÿ£Ø÷ÿ©Û÷ÿ°Þøÿ·áøÿ¾äùÿÅæúÿÌêúÿ °ºÿ444Õp)KKK£JJJÇJJJçj­ÓÿqÃòÿqÃòÿqÃòÿqÃòÿrÄòÿxÆóÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ»ÉÐÿ???é_nwÿ™Ôöÿ¡×öÿ§Ú÷ÿ®Ýøÿµàøÿ¼ãùÿÃæúÿ²ËÚÿ °ºÿMMMÿWKKK!LLLá_ˆ ÿfž¾ÿh¦Éÿh¦Éÿh¦Éÿi¦Éÿu¿èÿÉóÿ…Ìôÿ‹Îôÿ“Ñõÿ™ÔöÿŸ×öÿ¦Ù÷ÿ¬Ü÷ÿ³ßøÿºâùÿÀäùÿÇçúÿÍêúÿÓìûÿÛðüÿ©´ºÿ+++Ç@@@À†²Ìÿ™Îëÿ¶Íÿ}•¢ÿt„ÿaimÿJJJØFFF®EEE>>>P,,,KKK!HHHDEEEGEEEYHHHˆGGG‹HHHšJJJÆJJJÈJJJÈYelÿ^nwÿ`owÿlÿz“¢ÿ}•¢ÿ¨¸ÿž½Îÿ£¾Îÿ°ÊÚÿÍêúÿÓìûÿÛðüÿ–Ÿ¥ÿ!!!•PMMMðJJJÇDDD‘BBBp;;;> JJJ2HHHEEEEHHHHxHHH‰GGG‹III¨JJJÇJJJÈKKKä_bcÿ555\ÿÿþÿþðüàøðððððððððððððððððð?ðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿð?ð?ð?ððàÿàÿÀÿÀ€€?€?€?€?àÿÿÿÿÿnsis-3.11/Contrib/Graphics/Icons/pixel-install.ico000077500000000000000000000124161477201124000221130ustar00rootroot00000000000000h6Èž ¨f ( @½—÷ª€öyKñÃÃÃþþþŠŠŠÞÞÞÿÿÿþ?øà€€Ààðøøøü?(0 ª€ö½—÷yKñÞÞÞÃÃÃþþþŠŠŠÿÿÿÿçÿÿƒÿþÿøÿà€?€ÀàðøüþÿÿÿÿÿÿÿÿƒÿÿÇÿ( @€ª€ö½—÷yKñÞÞÞÃÃÃþþþŠŠŠµµµwwwÿÿÿ                   ÿÿ?ÿÿüÿÿðÿÿÀÿÿÿüðÀ€€€€€€€€Ààðøüþ?ÿÿÿ€ÿÿÀÿÿàÿÿðÿÿðÿÿðÿÿðÿÿøÿÿüÿnsis-3.11/Contrib/Graphics/Icons/pixel-uninstall.ico000077500000000000000000000124161477201124000224560ustar00rootroot00000000000000h6Èž ¨f ( @æÀ’à³Ñ”WÃÃÃþþþŠŠŠÞÞÞÿÿÿþ?øà€€Ààðððø?ü(0 æÀ’à³ÞÞÞÑ”WÃÃÃþþþŠŠŠÿÿÿÿçÿÿƒÿþÿøÿà€?€ÀàðøüþÿþÿþÿÿÿÿƒÿÿÇÿ( @€æÀ’à³ÞÞÞÃÃÃÑ”WµµµþþþŠŠŠwwwÿÿÿ                ÿÿ?ÿÿüÿÿðÿÿÀÿÿÿüðÀ€€€€€€€€Ààðøüþ?ÿÿÿ€ÿÿÀÿÿàÿÿÀÿÿàÿÿðÿÿøÿÿüÿÿþ?ÿnsis-3.11/Contrib/Graphics/Icons/win-install.ico000077500000000000000000000020661477201124000215670ustar00rootroot00000000000000(& èN( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww‡ˆˆˆˆˆ‡€‡ÿÿÿÿÿÿ€ˆwwwwwxÿÿÿÿÿxðxðððxðððxðÿÿxðÿðxðxðxÿÿÿÿÿxˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿ( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡ww€wx÷ˆÿÿˆ‡wˆw€ÿÿ‡€ûûûûÿÿ‡xˆˆˆˆ€ÿÿ‡w€ÿÿ‡w€ÿÿ‡w€LÌÌGw€€¿¿¿¸ˆˆLÌÌDw€ˆˆˆ€ˆˆ€LÌÌDG€ˆp‡÷ˆxˆLÌÌDD€ˆxˆ€LÌÌD@ˆwwwwwxˆ€ÿÿD@wÿÿÿÿÿøˆ€ÿÿ@ˆˆˆˆˆˆ‡ˆ€ˆxˆˆwð@ˆx€‡‡wˆÿˆwwwwx‡€xwpˆˆ€wÿÿÿÿx€ˆ€÷‡ÿÿpˆˆˆx€pÿÿpx€ðˆˆ€ðx€€€ðx€€ÿÿx€€ÿÿx€€ÿx€€ðx€€x€ˆˆˆˆˆˆx€wwwwwwwx€ÿÿÿÿÿÿÿø€‡wwwwww€ˆˆˆˆˆˆˆ€À?À?€ÀÀÀàÀðÀÿÿÀÿÿÀÀÀÀÀÀÀ€€Âãóÿÿÿÿÿÿÿÿ€ÿÀÿànsis-3.11/Contrib/Graphics/Icons/win-uninstall.ico000077500000000000000000000020661477201124000221320ustar00rootroot00000000000000(& èN( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿw€ˆˆÿxwˆÿwwˆ€ÌGwˆ€ÌDwˆˆÿwxˆˆwpwxˆ‡ˆwxˆ€ˆðÿÿÿˆ€‡€ˆÿ{{ø€‡ÿwð·€øüð{ˆwÏð·ˆÿÿˆˆˆˆ†ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÀ ÿÿðÿÿ( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡ww€ˆ€ÿÿˆˆxˆ€ÿÿ‡€ˆwxˆˆ€ÿÿ‡xˆwwxˆˆ€ÿÿ‡w€wwwxˆˆ€ÿÿ‡w€wwwxˆˆ€ÿÿ‡w€wwwxˆˆˆLÌÌGw€wwwxˆˆˆLÌÌDw€wwwxˆˆˆLÌÌDG€wwwxˆˆˆLÌÌDD€wwwxˆˆˆ€LÌÌD@wwwxˆˆˆ€ÿÿD@wwwxˆˆˆ€ÿÿ@wwwxˆˆˆ€ˆxˆˆwð@wwwxˆˆˆˆ‡‡wˆÿwwwxˆˆˆˆxwpˆˆ€wwwxˆˆˆˆ÷‡ÿÿpwwÿÿøˆˆˆpxÿÿpwÿwwÿˆˆ€ðwˆˆÿwÿÿ‡ÿø€€wwˆ÷wÌÌÿ€wð‡wwÿwÿÿÿÿ‡ðwwÿwÌÌÏøˆ‹pø€wÿÿÿÿÿ‡°€ÿˆÿÿÿÿ‡p³‹pøˆÿÿÿÿ‡ s‡°ÿˆÿÿÿÿ€·³‹pˆÿˆˆˆˆˆ‹{s‡°ˆÿ·····³‹ÿÿÿÿÿÿÿ€ˆˆˆˆˆˆˆÀñÿÀ?ÀÀÀ ÀÀÀÀÀÀÀÀÀÀ€€Ààððàààààðüÿ€?ÿÀnsis-3.11/Contrib/Graphics/SConscript000077500000000000000000000035141477201124000175700ustar00rootroot00000000000000checks = Split(""" big.bmp classic-cross.bmp classic.bmp colorful.bmp grey-cross.bmp grey.bmp modern.bmp red-round.bmp red.bmp simple-round.bmp simple-round2.bmp simple.bmp """) headers = Split(""" nsis-r.bmp nsis.bmp nsis3-branding-r.bmp nsis3-branding.bmp nsis3-grey-right.bmp nsis3-grey.bmp nsis3-metro-right.bmp nsis3-metro.bmp nsis3-vintage-right.bmp nsis3-vintage.bmp orange-nsis.bmp orange-r-nsis.bmp orange-r.bmp orange-uninstall-nsis.bmp orange-uninstall-r-nsis.bmp orange-uninstall-r.bmp orange-uninstall.bmp orange.bmp win.bmp """) icons = Split(""" arrow-install.ico arrow-uninstall.ico arrow2-install.ico arrow2-uninstall.ico box-install.ico box-uninstall.ico classic-install.ico classic-uninstall.ico llama-blue.ico llama-grey.ico modern-install-blue-full.ico modern-install-blue.ico modern-install-colorful.ico modern-install-full.ico modern-install.ico modern-uninstall-blue-full.ico modern-uninstall-blue.ico modern-uninstall-colorful.ico modern-uninstall-full.ico modern-uninstall.ico nsis-menu.ico nsis1-install.ico nsis1-uninstall.ico nsis3-install.ico nsis3-install-alt.ico nsis3-uninstall.ico orange-install-nsis.ico orange-install.ico orange-uninstall-nsis.ico orange-uninstall.ico pixel-install.ico pixel-uninstall.ico win-install.ico win-uninstall.ico """) wizards = Split(""" arrow.bmp llama.bmp nsis.bmp nsis3-branding.bmp nsis3-grey.bmp nsis3-metro.bmp nsis3-vintage.bmp nullsoft.bmp orange-nsis.bmp orange-uninstall-nsis.bmp orange-uninstall.bmp orange.bmp win.bmp """) Import('defenv') def join(prefix, list_): return list(map(lambda x: '%s/%s' % (prefix, x), list_)) def dist(dir, files): defenv.DistributeContrib(join(dir, files), path='Graphics/%s' % dir) dist('Checks', checks) dist('Header', headers) dist('Icons', icons) dist('Wizard', wizards) nsis-3.11/Contrib/Graphics/Wizard/000077500000000000000000000000001477201124000170105ustar00rootroot00000000000000nsis-3.11/Contrib/Graphics/Wizard/arrow.bmp000077500000000000000000001465401477201124000206570ustar00rootroot00000000000000BM`Í6(¤:*É  ÿÿÿÿÿÿÿÿÿÿÿÿ  .-.TSTHGH`_`\[\ ,++?>>ONNonnihhZYY''&mml__^nonÍÿÎÿÎÿÏÿÏÿ ÐÿÑÿÒÿÒÿ0×ÿ]àÿÇÿÉÿËÿÄüÃüÂù¾õ¼óÆÿÇÿÈÿ ÈÿÌÿÉÿÊÿÌÿËÿÍÿËÿÍÿËÿÍÿ"ÐÿÅÿÂÿÁþÀý¿üÂû¾ûÁú½úÀù»ù¿ù¼ù½÷¾÷º÷¹öºõ¼õ¸õºó¹ò¶ñ¸ñ¸ï´ï·ï²í´í´ë²ë°é®çÅÿÁÿÃÿÃÿÆÿ ÅÿÆÿÇÿÈÿÉÿÉÿÉÿÊÿÊÿ¾ÿ»ÿºý¼üºû¹û¹ù·ù¶÷µö´ô³ô·ô±ó²óµó¶ó³ñ´ñ±ð¯ï²ï±î­í¯í°í°ë®ë«ê­ê®é¬é«è­ç¯ºÿ¾ÿ¼ÿ»ÿ¼ÿ Àÿ ½ÿ¿ÿÀÿ¿ÿÃÿÁÿÃÿ"Äÿ'Æÿ+Çÿ.Éÿ/Çÿ3Éÿ8Êÿ9Ëÿ:Êÿ<ÊÿNÑÿOÏÿSÑÿbÕÿþþþýýýûûûùùùöööôôôóóóñññïïïìììêêêèèèæææåååãããáááßßßÝÝÝÛÛÛÙÙÙ×××ÕÕÕÓÓÓ©©©kkkiiihhhfffdddbbb```___]]]XXXVVVUUURRRPPPOOOMMMKKKIIIHHHGGGFFFDDDBBBAAA@@@<<<999666333111///***((('''%%%###!!!  ÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÑÑÒÒÒÓÓÔÔÕÕÕÖÖ××× ÙÙÙÚÛÜÜÝÝÝÞÞßàáááââãääåæææççççèèèèéééêêëë ìììíîïïïððññòóóôôõõõö÷÷÷´´øøøøùùùùùùúúúûûûü!!ýý³þþÍÍÍÍÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓ ÕÕÖÖ××ØØ ÙÙÙÚÚÛÜÜÜÝÝÞÞ àááâââãäååæææççççèèèèéééêêë ììíîîïïïðððñò óóôõõöö÷÷÷´´´øøøøùùùùúúúûûûüü!!ýþþÍÍÍÍÍÎÎÏÏÐÐÐÐÑÑÑÑÒÒÒÓÓÔÕÕÖÖÖÖ×ØØ ÙÙÚÚÛÜÜÝÝÝÞÞ àáááââããååææææçççèèèèéééêêêë ìììíîïïðððñò óóôôõõöö÷÷÷´´´øøøùùùùùúúúûû"ü!!ýþþÍÍÍÍÍÎÎÏÏÏÐÐÐÑÑÒÓÓ ØØ ÚÚÛÜÜÝÝÞßàááââãäåææçèèèéééêë ììïïðððóóôõõöö÷÷´´øøøùùúúúûû"ü!!!ýþþ ÍÍÍÍÍÎÎÏÏÏÐÐÑÑÒÒÓÔÕÕÖÖ×× ÙÙÚÛÜÜÝÝÞßàááââãäåæææççèèèéééêê ììíîïïðððñòòóôôõöö÷÷´´øøøùùùùúúûû"üü!!!ý³þ²ÿÍÍÍÍÎÎÏÏÏÏÐÑÑÑÒÒÓ ÕÕÖÖ× ÙÙÚÛÜÝÝÞß àáâââäåæææçèèèééé ììíîïïðððñóóôõõöö÷÷´´øøøùùúúûûûüü!!ýý³þþÍÍÍÍÍÎÏÏÐÐÑÑÒÒÓÓÕÕÖ×ØØ ÙÙÚÚÜÜÝÝÞß áááâãäææççççèèéééêê ììíîïïðððò óóôôõö÷÷÷´´øøøùùùùúúûû""ü!!!ýþþþÿÍÍÍÍÎÏÏÏÐÐÐÑÑÒÒÓÔÕÕÖÖØ ÙÚÛÜÝßßàááâããååæææçèééêë ììíîïïïððñóóõõö÷´øøùùúúûûûü!!!!ýþþ ÍÍÍÍÎÎÎÏÏÐÐÐÐÐÑÑÒÒÒÓÓ ÔÕÖÖÖ×ר ÙÙÙÚÛÜÜÜÝÝÞÞßßàááââããäååææææççççèèèééééêêë ììííîïïðððññòóóôõõõõö÷÷÷´´´øøøøùùùùùúúûûûüü!!ýþþþÿÍÍÍÍÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓ ÔÕÕÖÖ×ר ÙÙÙÚÛÛÜÜÝÝÞÞßßàááââãääååæææççççèèèéééêêêêë ììííîïïïððññòóóôõõõöö÷÷÷´´´øøøøùùùùùúúúûûûüü!!þþþÿÍÍÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÑÒÒÓÓÔÔÕÖÖ×ר ÙÙÙÚÚÛÜÜÝÝÝÞßßàááââããäååææææçççèèèèééêêêë ìììíîîïïðððññòóóôôõõöö÷÷÷´´´øøøøøùùùùúúúúûûüüü!ýþþþ ÍÍÍÍÎÎÏÏÏÐÐÐÑÑÑÒÒÒÒÓÓÔÕÕÕÖÖÖ××ØØ ÙÙÙÚÚÛÜÜÜÝÝÞÞßàááâââãääåæææççççèèèééééêêë ìììíîïïïððñòó óôôõõöö÷÷´´´øøøøùùùùùúúúû""ü!!ý³þ##$$##$$##$$$##$$##$$$$$$$$$$#$$#$$$$#$$##$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$####$#$$$$###$$##$$$##$#$$#$#$$$#$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#######$#$###$##$$$$$###$#$$$$$$$#$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$$$$$$$############$#####$##$#$#$#$$$$$$$###$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#########$######$####$$$$#$#$$$#$###$$#$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##############$#$##$$#$#$$$##$$#$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##########$$########$$$##$##$#$##$###$$$#$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#########$#####$#$$#######$$$$$$$$#$#$#$#$#$$#$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$##################$###$####$##$$####$$$$$##$$$$$$#$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##################$#####$#$###$#####$$$$##$$$$$#$$#$##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$################$##$##$###$####$$$$###$#$#$$####$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$############################$$####$#$##$##$$$$#$$###$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$########################$###$#$$####$##$$$######$$$$$$$#$$$#$$$$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$####################$########$###$$#$$#$#$$#$#$#$###$$$$$$#$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$###################################$##$$#$$#####$$$#$$#$#$####$$$$$$#$#$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############################$#########$$##$##$##$$$$#$#$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############################$$######$$##$$#$#$$#$#$$$$$$$###$$$$$$$$$##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$###############################$#$##############$$###$$#$$####$$$$##$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############################################$#$$$##$$#$#$$$$####$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$########################################$$$##$#######$###$$##$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$$$$$$$$$##########################################$##$###$###$#$$#$$$$$$$#$$$#$$##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############################################$#$######$#####$##$##$$###$$$#$$##$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############################################$$#$$##$$$$##$####$$#$$$##$##$$$$$#$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$####################################################$###$#####$##$######$$$$$$$$$$$$$#$#$$$$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$################################################$#####$$$$$#$$####$#$##$$##$$$$$$$#$##$$$$$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$$$$$#######################################################$#$####$####$$#$$###$##$$$#$$$$#$$$$$$$($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#########################################################$#$$####$###$$$#$$#$#$##$#$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$####################################################$##$##$$#######$$##$#$###$$$$$$$$$$#$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##################################################################$##$##$#$#$##$$$$#####$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$00########################################################$######$##$##$#$#$$$#$$$##$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0##0###############################################################$######$$#$$$$##$$$$$$$$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$#$$$#$$$$$$$$$$$$$$##0#0#0####0##0#####################################################$#$##$##$$##$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#00###0####00#######################################################$#######$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$00#0#0################################################################$##$###$##$###$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##0##00####0#0######0####################################################$###$$##$##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$$$$$$$#$$$$$$$$$$$0000#0#####0####0#########################################################$######$###$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##0000#0####00####0###################################################$#$##$########$$$$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0#0000##0000000#0##0###############################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#0#0#000000#00####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$000000000000000##0##0##########0#################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0000000#000#00#00#0###00####0###################################################$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$000000000000#00000#0#####0000##################################################$$$$$#$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$00000000000#00##00#00#0000###0#0##############################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$/00000000000000###000000#0#########0##0######################################$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$/000000000000#0000000##00#0##00##00#########################################$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$00000000000000000000#0#0#0#0000##0##0######################################%$$$$$$$$$$$$#$#$$$$$$$$$$$$$$$$$$$$$$///0/000/000000#0000000000##0###0##00#########0###########################%$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$$//00/000/0000000000#0#00#00##0####00#0#0########0########################&$$$$##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$/0//000000000000000000000#000##000#0###0##00############################'$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$$$$000/0//00/000000000000000000000#00##0#0#0##00##0#######################($$$$#$##$$#$$$$$$$$$$$$$$$$$$$$$$///0//0/0///00/000000000000#0000##00#0#0#0###00##00###################($$$$$$#$$$$$$$$$$$$$#$$$$$$$$$$$////000//0/00//0/0000000000000#000#0###0000#0#000##0###0##0##########)$$$$$#$#$$$$$$$$$$$$$$$$$$$$$$$///00000/00/000///0000000000000#0#0000000000#0#00#0#####0#0#########)$$$$$$$$#$$$$$$$$#$$$$$$$$$$$$0///000//0/00/000000/0/0/00000000000#00##00#00#00000####0##########*$$$$#$$$$$$$#$$$$$#$$$$$$$$$$/0//////00/00///00/0/0/000/0000000#0000#00###0#000##0#0###0##0####*$$$$$$###$#$$#$##$$$#$#$#$$$////0///0//0/0/00/0000//0000000000##000##00#000#00#0000####0#0###*$$$$$###$$$$$$$$$$$$$$$$$$$////////////00//0/000000000000000000##000#000000#0000##0#0#####0)$$$$$#$#$#$$$$##$$$$$#$$$$/////////0//0/000/0/000//00000/0000000000000000#0#000000##0#000)$$$$$#$$#$$$$$$$$$$$$$$$$////////////0///00//0//000000/0000//00000#0#00000000#0000####0($$$$#$#$####$$#$##$$##$$/////////0/////////0//0000/0////0/000000000000#0#00##0000#####$$$$$####$$$$$$#$$$$$$$////////////////0///00/00//0//0/000/00000000000000000##0000##$$$$$$##$#$##$$$$$$#$$/////////////////0////0/0/////00/0/000000000000#00000000###0$$$$$#$#$##$#$##$$$$#//////////////////0////00////00000/00/00000000000000#000###$$$$###$$###$#$#$$$$/////////////////////////0/00//000000///000000000000000000$$$$##$#$$$#$$$$#$$///////////////////////0//0//000/0///000/000000/00000000#$$$$#$##$$#$$$$$#$////////////////////////////////0/0/00000///000000000000$$$$#$#$$#$$$##$$///////////////////////////0/0/0//00/000/000000/0/0000/$$$$$#########$$///////////////////////////////0///00//0/00/00/0/00000$$$$$####$$#$$#////////////////////////////////0//////00/00/0//0/000$$$$###$#$#$$$///////////////////////////////0//0//00/////000/0000%$$$$###$###$//////////////////////////////////////////0//0000//%$$$###$#$##//////////////////////////////////////0/0/0////0/0&$$$#####$$/////////////////////////////////////////0///00/0'$$$$####$.///..//////////////////////////////////////////($$$####$///////////////////////////////////////////////)$$$#$##./..//////////////////////////////////////////)$$$###..//.////////////////////////////////////////)$$$##../././///..////////////////////////////////*$$$#./.././//////////./////////////////////////*$$$./.../...//.././/.////////////////////////*$$$./.././/..///////////////////////////////?$$$.../....///../..////////////////////////($$$....../..../....///////////////////////($$$......../....//..//..//////////////////$$$............/.././.../////////////////$$$......//.//..///..././/./////////////$$$............../..///./////////././//$$$...............././....//./////////$$$................./..//...//../////$$$................/.....//..../././$$$.........................../././$$$...............................$$$6.............................$$$6............................%$$6...........................%$$6..........................&$$6.........................'$$6........................($$6.......................)$$66.....................)$$66....................)$$66.6.................*$$766.................*$$76666..............*$$77666.............?$$7766.............:$$776..6..........:$$777666..........$$77766.6........$$7776666.......$$j776666......$%j77f6666....$%777666666..$%j77766666.$%8777666f6$%8j767ff6%&98j7766&&987767''98jj7((98jj))988**99+,9D®D-µµø-µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶¶¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶¶¶¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ9µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ9µµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶¶¶¶¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ99µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ99µµµµµµµµµµµµµµµµµµµµµµµµµµµ¶¶¶¶¶¶¶¶¶¶¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ999µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ999µµµµµµµµµµµµµµµµµµµµµµµµµµ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶;;;;¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶::::¶¶¶¶¶¶¶¶¶¶¶µ¶¶¶¶µµµµµµµµµ·¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶;;;;;¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶:::::¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶µµµ··¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶;;;;;;¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶::::::¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶····¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶<<<<<<<¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶:::::<<¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶······¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶<<<<<<<<¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶:<::::==¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶········¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶<<<>><<==¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶=========¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¸···········¶··¶···¶¶··¶¶···¶·¶·¶¶¶¶¶¶···¶·····¶·¶·¶¶·······¶¶·¶·>>>>>>>>>>···¶¶··¶¶··¶·····¶¶····¶·¶¶·····¶¶¶··¶·············¶¶¶·¶··==========¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¸¸······························································>>><>>>>>>>··························································===========············¶¶¶¶¶¶¸¸¸¸···························································>>>>>>>>>>>>··························································>>>>>>>>>>>>···············¶¶¸¸¸¸¸·························································@@@@@@@@@@@@@··························································?????????????················¸¸¸¸¸¸¸¸¸····················································@@@p@p@@@@p@@p··························································@?????????????···············¹¸¸¸¸¸¸¸¸¸¸¸¸¸¸·¸¸¸·¸¸¸¸¸¸¸¸¸¸¸¸··¸¸¸¸¸¸¸¸¸¸¸¸¸···¸¸¸¸¸¸¸¸¸¸@@@@@@@ppp@@@@@¸¸¸¸¸¸¸·¸¸¸¸¸¸¸·¸··¸¸¸¸¸¸¸···¸¸¸·¸¸¸¸·¸¸¸¸¸¸¸¸¸¸¸¸¸···¸¸¸·??@????????????··············¹¹¹¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸pppppp@@BB@p@p@@¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸?@??@???????????¸¸¸¸¸¸¸¸¸¸···¹¹¹¹¹¹¹¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸@@@A@@@@@BBAAAA@@¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸AAAAAAAAAAAAAAA??¸¸¸¸¸¸¸¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸BBBBBBBBBBBBBBBBBB¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸BBAAAABAAAAAAAAA??¸¸¸¸¸¸¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹BBBBBBBBBBBBBBBBBBB¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹BA?BAAA???AA?A?????¹¹¸¹¸¸¸¸¸¸ºº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹BBBBBBBBBBBBBBBBBBBC¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹AAAAAAAAAAAA?AA?A?A?¹¹¹¹¹¹¹¸¹ºº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹rrBrrrBrrBBrBBBrrrCCr¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹CBBCCBABAACCAAAAAAAAA¹¹¹¹¹¹¹¹»ºººº¹º¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹BrrBBrBrrrBBrBBBrrCBrr¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹CBACCAAAABCAAAAAAAAAAA¹¹¹¹¹¹¹»»»»ººººº¹¹¹º¹º¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹rrrrrBrBBrrBBrrBBrrrBrr¹¹¹¹¹¹¹¹¹¹¹º¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹CACACBCABACAAAAABAAAAAA¹¹¹¹¹¹»»»»»»º»ºººººººººººººººº¹ººººººººººº¹ººººººººº¹ººººrrBBBrrrrrBBrrBBrBBBBBsrºººº¹ºº¹º¹ºººººººººººººººº¹¹ºººº¹ººººººººººººººººººººº¹ºº¹CCCCACCAACAAACACCB????AA¹¹¹¹¹»»»»»»»»»»º»ººººººººººººººººººººººººººººººººººººººrrrsBBrBrBBBrBBrrBBrBBBrrººººººººººº»ººººººººººººººººººººººººººººººººººººººººººººººBCCAABCABAABAAAAAAABAABA?ºº¹¹¼¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»rrrrsrrrrrBBrBrrrrrBrBBrrr»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»BBBBBBCABABBBAACAAAB??AA??ººº¼¼¼¼¼¼¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»rrrrrrrrBrrrBrrrrBBBBrrrBBB»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»BAAAAACAAA?????BA?A?A?BA???»º¼¼¼¼¼¼¼¼¼»»¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»qrrrqrrrrrrrrBrrrrBrrBrrBrrB»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»BAAACBBBABA?BA?A?@AAA???????»½¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼rqrqqqrrBBrrrBBrBBBrBBBBrBBBB¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼A@@@ABAAAA@@A@?A@@AAAAA??@?>?½½½½½½½½¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼pppppppppooppppppopopoppop@p@@¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼?@>>??????>>?>>?>>????>>>>==>½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½pppppppoopooooppooopopoo>oo@poo½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¼½½½½>>>>>?>???>>>>>>>>>>>>=>>====½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½oooooooooooooooooooooooooooooooo½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½@>@>@@>@?>>>>>>>>>>>>=>>>>>>=¾½½¾½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½nnnnnnonnoonnooonooooooooooooooo@½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½@>@>>@@>>>>>>>>>>>>>>>>=>>>>=¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½nnnnnnnnnnnnnnnnnnnnonnnnooooonnn>½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½>>>>>>>>>=>>==>=======>><>>><¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾mmmmmmmmmmmnnmmnnnmmnnmmmmnnnnnmmmn¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾=>==>==<<<<<<<<<<<<<<<==<===<¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾mmmmmmmmnnmnmmmnmmmnmmmmnnnmmmmmnnmm¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾<<<<<<<<;<;;<<<;<<<<<;<;;;;;;¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾;;;;;;;;;;;;<;;;<<<<;;;;<;;;;¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾mlmmmmmmmlmmmmllmmmllmmmmmmmmlmmmlmmmm¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾<;;;;<<<;<;;<;;;;<;;;;;;;;;;;¾¾¾¾¾¾¾¾¾¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾mllmmllllllllmmmlllllllllllllllllllllll¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾;;;;;;;;;;9;;;;9;;;;;;;;;9999¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿llllllllllllllllllllllllllllllllllllllll¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿;;;;999999999;99999999999;999¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿lllllllllllll99l99ll99999999l999l999l9999¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿;9999999999899998899998899999¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿kllkkllkkllk9kkk9kk9lkkkkkkkk9kkk9kkk9kkkk¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿99999999999988888888898889998À¿¿¿ÀÀÀ¿ÀÀ¿¿ÀÀÀÀÀÀÀÀ¿À¿¿¿ÀÀÀÀÀÀÀkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkÀÀÀÀÀÀ¿À¿¿¿¿À¿À¿¿ÀÀ¿¿ÀÀ¿ÀÀÀ¿¿¿¿ÀÀ¿¿¿ÀÀ¿À¿¿ÀÀÀÀÀ¿ÀÀÀÀ¿¿¿¿À¿89998889899889898878887878888ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀkkkkkkkkkkkkkkkkkkkkkkkkkkjjkkkkkkjkkkkkkjjkÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀj8888888888888778787877777887ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀkkkkkkkkkkkkkkjkijkkkkkjkjjiijjjjkjijjjjjjiijÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ77jj777777777j777777777777777ÀÀÀÀÀÀÀÀÁÁÀÀÀÁÀÀÀÀÀÀÀÁÀÀÀÀÁÁÀiiiiiiiiiiiiiiiiihiiiiiiiiiiiiiiiiiihiiiiiihhiÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÀÀÀÀÀÀÀÀÀÀÁÁÀÀÀÀÀÀÀÀÀÁÀÀÁÀÀÁÁÀÀÀÀÀÁÀÁÀÀÀÀÀÀ.fff6ff666f666.f66666..6666..ÀÀÀÁÁÁÁÁÁÁÁÁÁÁÁÀÁÀÀÀÁÁÁÁÁÁÁÁiiiiiiiiiiiiiiiiiiihiiiiiihihiihhhihihhhihhhhhhÁÁÁÁÁÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÀÁÁÁÁÁÁÁÁÁÁÁÀÀÁÁÁÁ.E..E.E.EE.E..............66.ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÁÁÁÁÁÁÁiiiiiiiiiiiiiiiiiiiiiiiihhhiihiihiihhhhhhhhiihhhÁÁÁÁÁÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÀÁÁÁÁÁÁÁÁÁÁÁÀÀÁÁÁÁ.EEEEE..........E............ÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁiiiiiiiiiiiiiigiiiiiiigigggigihihFgFFFhiFgFgFFFhhÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁE.EEE.EE....EEEEE............ÁÁÁÂÂÂÁÁÂÂÁÁÂÂÂÂÁÁÁÁÁÁÂÂÁFggFgigFiigggggFiggFigiFgFFFgFgFggFFFFFFFFFFFFFFFFÁÁÁÂÂÁÁÁÂÁÁÁÂÂÂÁÁÂÁÁÂÂÁÁÂÂÁÁÂÁÂÁÁÁÁÁÁÁÂÁÁÂÁÁÂÂÁÂÁÁÂÂÁÁÁÂÁÁEEEEEEEEEE.EE..EE..EE..E..EEEÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂgFFFgggFggFFgFgFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂEEEEEEEEEEE1EEEE1EE11EEEEE11EÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂFGGGGFFFFGFGFFGFFGFGGGGFGFGGGFGGGGGGGGGGGG2GGG2222G2ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ11122122221211111211221121111ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂHHHHHHGGGGGGGGGGGGGGGHHGGGGGGGGGGGGGGGHHGHGGHHHGGGGGGÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ22222222212111212121112121121ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÂÂÂÂÂÂHHHHHHIHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHÂÂÂÂÂÂÂÂÂÂÂÃÃÂÂÂÂÂÂÂÃÂÂÂÂÂÃÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÂÃÂÂÂÂÃÃÂÂÂÂ2222222222JJ2222121J2221112J2ÂÂÂÃÂÃÂÂÂÂÃÃÃÂÃÃÃÂÂÂIIHIIIHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHÂÂÂÃÂÃÃÃÂÂÂÃÃÂÃÂÃÃÂÂÃÃÃÃÃÂÃÃÃÃÃÃÃÂÂÂÃÃÃÃÃÃÃÃÃÃÂÃÃÂÃÃÃÃÂÂÃÃJJJ22JJJJ2JJJJ2222JJJ22JJ2J21ÂÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃIIIIIIIIIIIIIHIIIIHHIHIIHHIHIHIHHHHHHHHHHHHHHHHHHHIHHHHHÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃJJJJJJJJJJJJJJJ2JJJJ2J2JJ2JJJÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃIIIIIIIIIIIIIIIIIIIIIIIIHIIIIIIIIIIIIHIIIIHHIIIHIIIIHIIIIÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃLLJJLJLJJLJJLLJJJLLL3L33L2LL3ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃIIIKKKKKIIIKKKIIKKKKIIKIKIIIKIKIKKIIKKIIIKIIIIIIIIIIIIIIIIÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃLJLLLLJLLLLLLLLLLLLLLLLLLLLLLÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃKKKKKKKKKIKKKKKKKKKKKKKKKKIIKKKKKKKKKKKKIKKKIIIIKIIIIIIIIIIÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃLLLL3LLLL3LLLLLLLLLL33LLLL333ÃÃÃÃÄÃÄÄÄÃÃÃÃÃÄKKMMMKKKKKKKMKMMMKKKKKKMMMKKKMMMKMKMMKMKMKKKKKKKKKMKKMKKKKKKÄÄÄÃÄÃÃÃÄÄÃÃÃÄÃÄÃÃÄÄÄÃÃÃÃÄÄÃÃÃÃÃÃÄÄÄÃÃÃÃÃÃÃÃÃÄÄÄÃÄÃÃÃÃÄÄÃÃLNNNNLL3LNNNLL3NN3L3NN333N33NÄÄÄÄÄÄÄÄÄÄÄÄÄÄMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMPPPMPKKKMPMPKPPPPPKKPÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄNPPPNPNPPNPNNNNNNNNNNNNN3NNNNÄÄÄÄÄÄÄÄÄÄÄÄÄOMMMQMMMMMMMQQMQMMMMMMMMMMQMMMMMMMMMMMMMMMMMMPMMMMMPPMMMPPPPPPÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPPPPPPPPPPPPNPNPNNNPPPPNNNNNNÄÄÄÄÄÄÄÄÄÄÄÄMQQMOQMQMMOOMQQMQMMMMMMMQQMMMMMMMMQMMQMMMMMMMMMMPMMMMMMMMPPPMPMÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPPPPPPPPPPPPPPSPNNPPPNPPNNPPNÄÄÄÄÄÄÄÄÄÄÄOQOQMQQQOQQOOQQQQQQMQMQQMOQQOMMMMMMMMMQMMMMMMMMMMMMMMMMMMMMMMRPMÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPPPPSPPPPSSPPSSPPPPSPPPSPPPSPÄÄÄÄÄÄÄÄÄÄOOOOOOOOOOOOOOOOOOOQOOOOOOQOOOOOOOQQOQQOQQQQQQQQQQQRRQQQQRQRQRRRRÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄSSSSSSSSSSSSSSSSSSSSSSSSSSSSSÄÅÄÄÅÅÄÅÅOOOOOTOOOOOTTOTTOOOOTOTOTTTTTOTQTTTTTTOOTOQTTTTTTTQQTQRTQRRRRQTRQRÅÅÅÅÄÄÅÄÄÅÅÅÄÄÅÅÅÅÅÅÅÅÅÄÅÅÄÄÄÅÅÅÅÅÅÅÅÄÅÄÅÅÄÄÅÅÅÅÅÄÄÄÅÅÅÅÄÅRSSSSSSSSSS4SSSS4SS44SS4SSS4SÅÅÅÅÅÅÅÅTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRTTTRTRTÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅSRRW4S4SR444RRRS4R4S4R4444444ÅÅÅÅÅÅÅTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRTTTTTRTTTÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅRRRW4S4SR444R4RSR444R4R4444R4ÅÅÅÅÅÅTTUUTTTTTUTTTTTTTTTTTTTTUTUTTUUTTUTUTTUTTTTTTTTTTTUTTTTTTTTTTTTTTTVTVÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ444WW4W44WWW4W4444444444WW444ÅÅÅÅÅUUUUUTUUUUUTUUUUUUUUTUUUUUUUUUUUUUUUUUUUUTTTUUTUUTUUVUTTTTTTTVTTTTVVTTÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅWVWW5W5VWV55W5WWWW44W44W55W44ÅÅÅÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUXUUUUUUUXUXXVVVVVUTUUUVUTVVVVVTVVVVÅÅÅÅÅÅÅÅÅÅÅÅÅÆÅÅÅÅÅÅÅÅÅÅÅÅÅÆÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÅÅÅÆÅ555W55555W5555W55W55545W55554ÅÆÆXUXXUXUXXXXUUUUUXUUUUUXUXXUXUXUUXXUXXXXUUXUUXXUUXUUUUXUVXUVUVVUUUUVVUUVUÅÅÅÅÆÆÆÆÆÅÅÅÆÆÅÅÅÅÅÅÅÅÅÆÅÅÆÆÆÅÅÅÅÅÅÆÆÆÅÅÆÆÅÅÅÆÅÅÅÆÅÆÆÆÅÅÆÆ55555555555555555555555555555ÆÆXXXXXX}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXUXXUXUUUVUUUUVVVVÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆY55555Y5555555555555555555555Æ€€XXXX}€XXXXXXXXXXXXXXXX€XX€X€XXXXXXXXXX€XXXXXXXXXVVVXXXVXXXVVUVXVVVVXVVVVÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆZYYYYYY555555Y55555Y5Y5555555€€€}X€€€€€€€€XX€€€€€X€€€€€XX€X€€€€X€€XX€€€€XXXXXXXXXXZXXXZXVVVVVX€XXXXVVZZVÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆZYYYYYZY55ZZ5YYYZ55555Y5YY555€€€€€€€€€€€€€€€€€€€€€€€€€„€€€X€€€€X€„XX€X€XXX€XXXXXXXZX€€€€Z€X€ZXZVZ€XVV€ZVÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆZYYYZYZYZYYZ5Z55ZYZZYYZ5ZZYY5ƒ€€„„€€ƒƒ„ƒ€€„ƒ„„€€€„„€€„„„„„„€€„€€„„€€„€€€€€€€€€€€€€€€€€Z€€ZZ€€ZZ€ZZZZZ€ZZÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆZZZZZZZZZYZYZZZZZYZYYYYZZYYYYƒƒƒƒƒƒƒ„ƒ„ƒƒ„ƒ„„„„„„„ƒ„„ƒƒ„„€„€„€„[[„[€„„€„€„[„„„„€€€€€€€[[[Z€[[€[€[[[€Z€[ZÆÆÆÇÆÆÇÆÇÇÇÇÇÇÇÆÇÇÇÇÇÇÇÇÆÇÇÇÇÆÆÇÇÇÆÆÆÇÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÇÇÇÇZZZZZZZZZZZZZZYZZZZZZYZZYZZYZƒƒƒƒƒƒƒƒƒ„ƒ„ƒƒƒ„ƒ„ƒƒ„ƒ„ƒ„„„„„„„€€€„„„„€„„€€€„„„[€€€€€€„€€[[[€Z[[Z[€[[[€€€[ZÆÆÆÇÆÆÇÆÇÇÇÇÇÇÇÆÇÇÇÇÇÇÇÇÆÇÇÇÇÆÆÇÇÇÆÆÆÇÆÆÆÆÆÆÆÆÇÇÆÆÆÆÆÆÇÇÇÇZZZZZZZZZZZZZZZZZZZZZZZZYZZYZƒƒƒ††ƒƒ†„ƒ„ƒƒ††„†„ƒ„†ƒƒƒƒ„ƒƒ„ƒƒ„„„ƒƒ[ƒ„„„„„„[[ƒƒ[„[„„[[[[[[[[[[[[[[[[[[[[[[ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇZ\\\Z\ZZZZ\Z\ZZ\ZZZ\ZZ\\ZZZZZ††††††[††ƒƒ†[†††[†[ƒ[†[ƒ[ƒ†ƒƒƒƒƒƒƒ[[[[ƒƒƒ[ƒƒ[ƒƒ[ƒ[[[[[[ƒƒ[[[[[[[[[[[[[[[[[[ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ\\\\\\\\\\\\\\\\\\\\\Z\\ZZZ\\†…†††††††[††††††††[†[[[†[[†ƒ[†[†[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ\[[\[[\\[_\[\[\\_\\\\\\\\\\\_††…†††…††[††††[†[†[†[†[[†[ƒ†[†[†[†[[[[[[[†[[[[[[[[†[[[[[[[[[[[[[[[[[[[[[[[[ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ_[\\_\\\__[\\_[\__\\\\\\_\\__…………†……†……†[……[……………[†…††[[[[†††[…††[[††[††[[†[††[††[[†[[[[[†[[[[[[[[[[[[[[ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ________________________]____……‡…………………………………^…^…………†…^^^†…†………^…††^^†^^††^^^^^^^^^^^^^^^^^^^^^[^^^^^^^^ÇÇÈÈÇÈÈÇÈÈÇÈÈÈÈÇÇÈÈÇÇÈÈÈÇÈÈÈÈÈÈÈÈÇÇÇÈÈÈÈÇÇÇÈÈÈÇÈÇÇÇÇÈÈÇÈÇÇ_____________________________‡‡‡‰‡…‡‡……‰‡‰‰‰‰‰‰‰‰…‰^^…‰^^…^…^……‰^…^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ_____________________________………‰‰‡‰‰……‰‰‰‰‰‰‰‰‰^…‰^……^^‰…^…^^^‰‰…^…^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ_____________________________‰‰‡‰‰‰‡‡‰‰‡‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰^^‰^^‰‰‰^…^^^^^^‰^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ^____^_^a__aa^_a^________aaa_‰‰‡‡‰‰‰‡‰‰‰`‡‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰^‰‰`‰^^‰^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈa__^^^^^a^^a^^^a^^aaaaa^_aaaa‡‡‡‡‡‰‰```‰`‰‰Š‰‰```‰‰‰`‰^‰^```‰```‰^`^‰`^^ŠŠ^`^^^^^`^^^^^^^^^`^^^^^^^^^^^^ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈaaaa^aaaa^^^a^aa^aaaaaaaaa^aa`ŠŠ‡‡‡‡ŠŠŠ‡Š‡‡Š‡‡ŠŠŠ```Š``^``ŠŠ``Š``ŠŠŠ^Š^```^`^Š^``Š``^^^^^^^`^``^^^^``^^^ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈaaa^aaaaaaaaaaaaaaaaaaaaaaaaaŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ```ŠŠŠ`ŠŠŠŠ```````Š```````````Š```````````````````````````ÉÉÉÉÉÈÈÉÈÈÉÉÈÈÉÉÈÈÉÉÉÈÈÈÉÈÈÈÉÉÈÈÈÉÉÉÈÈÈÈÈÉÉÉÉÈÉÈÈÈÈÈÉÉÉÉÈÉ`aa`aaaaaaaaaaaaaaaaaaaaaaaaaŠŠ`````ŠŠ`ŠŠ``Š```Š`ŠŠ````````````````````````````````````````````ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÈÉÉÉÉÉÉÉÉÈÈÉÉÉÈÉÉÉÉÉÉÉÈÉÉÉÉÉÉÉÉÉÉÈÉÉÉÉÉÉÈÉa``aaaaaaaaaaaaaa`aaaaaa`aaaaŠŠŠ`Š```Š`Š`````````````````````````````````````````ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÈÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÈÉÉÉÉÉÉÉÉ``````aaaaaa`aaaa`aa`aaabbaabŠŠŠ```````````````````````````````````ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ````a`aa`````a``b```b``a``aa`ŒŒŒŠ````````````````````````ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ```````````b````b``b`bba`b`b`ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŽŒŽŽŒŽŽŽ`````Ž````cc````````````ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉc`````````bcbbc`c`bbbbc`bbbbb‹ŒŒŒŒŒŒŒŽŒŒŒŒŒŒŽŒŒŽŒŽŽŒŽŽŒŽŽŽŽŽŽcŽc`ŽŽŽŽŽcŽ```cŽ`cc`Žccc`cc`ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉcccccccc`cccccccccccbbcbcbccbŒ‹‹ŒŒŒŒŒŽŽŒŒŒŒŽŽŽŒŒŒŽŒŒŽŒŒŒŒŽŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽcŽŽŽŽŽŽŽccŽccŽcccccccc`ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉcccccccccccccccccccccbcccccccŒŽŽŽŽŒŽŽŽŽŽŽŽŽŽŽŽŒŽŽŽŽŽŽŽŒŽŽŽŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽcŽcÉÉÉÉÉÊÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉcccccccccccccccccccccccccccccŽŽŽŽŽŽŽŽŽŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽcŽÊÊÉÉÉÊÉÉÉÊÊÊÊÉÉÊÉÊÉÉÉÉÊÊÉÊÊÊÊÉÊÊÊÊÊÊÉÉÊÊÊÊÊÊÉÉÊÊÉÉÉÉÊÉÉÉÊÉcccccccccccccccccccccccccccccŽŽŽŽŽŽŽŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽÊÊÉÉÉÊÉÉÉÊÊÊÊÉÉÊÉÊÉÉÉÉÊÊÉÊÊÊÊÉÊÊÊÊÊÊÉÉÊÊÊÊÊÊÉÉÊÊÉÉÉÊÊÉÉÉÊÉcccccccccccccccccccccccccccccŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽÊÊÊÊÊÊÉÉÉÊÊÊÊÊÉÊÊÊÉÉÉÉÊÊÉÊÊÊÊÊÊÊÊÊÊÊÊÉÊÊÊÊÊÊÉÉÊÊÊÊÉÊÊÉÊÉÊÊcccccccccccccccccccccccccccccŽŽŽŽŽŽŽddŽŽŽddÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊdcddddcdddccdddcddddddccddddd‘‘’‘‘‘’’Ž’’d’Ždd’dÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘’’‘‘’Žd’d’Ždddd’dÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘’’’’‘‘’’’’’’’’’ddd’ddÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’‘‘’’’‘’’’’’’‘’’’’’’’’’ddddÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’‘‘‘’’‘’’’’’’’’’’’’’’’’’’’ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’‘’‘‘‘‘‘‘’‘’‘‘’’’’’’‘’’’‘‘’’‘’’’’’’’’’’ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’‘‘‘‘‘’‘‘‘’‘’’‘‘‘’’’’’‘‘’’’’’’’’d’d’ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’‘‘‘‘‘‘‘’‘’’’‘‘’’’’‘’’’’’’’’’’ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd‘““““‘‘‘“““‘‘‘“‘‘‘‘‘‘‘‘‘’‘‘‘’‘‘‘•‘’’’’’‘’’’••‘‘••‘’•’’’’’ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd““““““““““““‘‘““““““““‘“‘“‘‘‘‘‘‘‘“‘‘‘‘‘‘‘‘‘‘‘•‘‘••‘‘‘‘‘’‘•‘••••‘••••••••ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddddddd““““““““““‘“““““““‘“““““‘“““‘‘‘““““““““‘‘‘“““““‘‘‘‘‘““•“‘‘‘•‘‘•••••••••••••ËËËËÊÊËÊÊËËËÊËËËËËËËÊËËËÊÊËÊÊËËËËËÊÊÊÊÊÊÊËËËËÊËÊÊÊËËÊÊËÊËËeeeeeeeeeeeeedeedeeeeeeedeedd“““““““““““““““‘“““““‘““““‘‘““““““““‘‘‘“““““‘‘“‘‘““““••‘‘‘‘••“•‘“••“••••ËËËËÊÊËÊÊËËËËËËËËËËËÊËËËÊÊËËÊËËËËËÊÊÊÊÊÊÊËËËËÊËÊÊÊËËÊÊËÊËËeeeeeeeeeeeeedeedeeeeeeedeedd““““““““““““‘“““‘“““““““““““‘““““““““‘‘““““““‘“‘‘“““““‘••“•‘““‘•••••••••ËËËËÊÊËÊÊËËËËËËËËËËËËËËËÊÊËËËËËËËËÊÊËÊËËÊËËËËÊËÊÊËËËËÊËËËËeeeeeeeeeeeeedeedeeeeeeeeeeed““““““““““““““““““““““““‘““‘“““““““”‘“““““““‘“‘‘“““““‘‘•“••““•‘••‘“••“•ËËËËÊÊËÊÊËËËËËËËËËËËËËËËÊÊËËËËËËËËÊÊËÊËËÊËËËËÊËÊÊËËËËÊËËËËeeeeeeeeeeeeedeedeeeeeeeeeeed““““““““““““““““‘“““““““““““‘“““““““”“‘““““““‘“‘‘“““““‘‘““‘•““‘••“•“•••“ËËËËÊÊËÊÊËËËËËËËËËËËËËËËÊÊËËËËËËËËÊÊËÊËËÊËËËËÊËÊÊËËËËÊËËËËee•eeeeeeeeeedeedeeeeeeeeeeed“”“““““““““““““”““““““““““““““““““““““““““““““““““““““•““•“““•““““•“ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•ee•eeeeeeeeeeeeeeeeeeeeeeeee““””““”“””“““““”““““““”“““““““““”““““““““““““““““““““““““•““•““““•“•ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•••eeeeee•eeeeeeeeeeeeeeeeeee”““”““”““”““””““““““”““““““”“”“““““““”“”“““““““““““““““““““““•““““••“•“••ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËeeeeeeeeeeeeeeeeeeeeeeeeeeeee”“””””““””“””““““”””””“““”””“““”“““““””““””““““““““““““”““““““““•“““““•ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•eeeeeeeeeeeee•e•eeeeeeeeeeee“””“”””“”“”””””””””””””””““”””““”””““”“”““””“““““”“““”“““““““““““““““••“““ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•e•e•e•ee••eeeeeeeeeeeeeeeeee”””””“”“”””””””””””””””““””””””””““““”“““““””““”““““““”“”“““““““““““““•“ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•••••e•••ee•••eeeee•eee••eeee””””””““”””””””””””””””““””””””””““”“““”””””“”“””“””““””““““““““““““““““ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË••••e•••••e••eee••eeeeeeeeeee”””””””””””””””””””””””””””””””””””””””“”””””“““““”“““““““”“”““”“““”““““““•ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•••••••••ee••e•e•eee••ee•eeee”””””””””””””””””””””””””””””””””””””””””””””“”””““”“”“””“””““““““”“““”“““•ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË••••••••e•••e•e••e••e•eee•eee””””””””””””””””””””””””””””””””””””””””””””””“”””““””””““””“””“”“”“”““““““ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË••••••••e•••••••••e•ee••ee•ee””””””“””””””””””””””””””””“””””””“”””””””””“”“””””““”””””“”““”““”““”“ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË•••••••••ee•••••••••eeee•••ee“““““““““““““““““““““““““““““““““““““““‘“““““““““““ËËËËËËËËËËËËËÊËËËËËËËËËËËËËËËËËËËËËÊÊËËËËËËËËËËËËËËËËËËËÊË•e•e•eeeeeeeeeeeeeeeeeeeeeeee“““““““““““““““““““““‘““‘‘““““““‘““‘““‘‘“‘‘ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊËÊÊÊee•eeee•eddeeeeeeeeeeeeeeeede““‘‘‘‘‘‘ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ’’dd’dddddddddddddddddddddddd‘‘‘‘‘‘‘‘‘‘‘‘‘ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ’’dd’d’dddddd’dddddddddddddddÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊddddddddddddddddddddddddd‹ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÉÊÊÊŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹ŒŒ‹‹‹‹‹ŒŒŒŒŒ‹ŒŒ‹ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉŽŽŽŽŽŽŽccccŽccccŽccccccccccccˆˆ‹‹‹‹‹‹‹ˆ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œ‹‹‹‹‹‹ŒŒ‹ŒŒ‹ŒŒ‹Œ‹ŒŒŒŒŒŒŒ‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ``````````````````ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŠˆˆŠŠˆˆŠŠÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÉÉÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈŠŠŠ``ŠŠ`ŠŠŠŠŠŠŠŠŠ``Š`````````‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈȉ‰^‰‰‰‰^‰‰^‰‰‰‰^‰^‰^^‰^‰‰^^^^‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡…‡…‡‡…‡‡‡‡‡…‡………………‡…‡……‡………………………………………………………ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÈÇÇÇ……………†…†………†…†…†…†††………†…†^^†‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇdž†††††††[[†††[††[††[ƒƒƒ[[ƒ[[ƒ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆƒƒƒƒƒƒƒƒƒƒ€€ƒ„ƒ„ƒ€ƒƒƒƒƒ„ƒ€„„€}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ}}}}}}}}}}XX}}X}}XXX}}X}}XX}X||{|||||}}}||}|}||}|||||||||||||||||||||||||||||||||||||||||||||||||||||{||ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅUU||XUXUXUUUUUUUUUUUUXXUUUXUU{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{z{{{{{{{{{{{z{{{{{z{{zz{z{{ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅzzzzzUUzUUzzUzzUzzTzUUUUTzUUz{{{{{{y{yy{{{{{{{{{{{y{{{{{{{{{{{{{{{{{{{{y{{{{{{{{{{{{{{y{{zzy{{zy{zzzzzzzÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄOzzzzzzOOzzzzOOOOzzzzOOzzzOOOyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyvyvyvyyvyyyyyyyyvyyyyyyyyÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄxxxxxxxxxxxxxxxxxxxxwxxxxxxwxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃvwwwwwwvvwvwwwwwwwwwwwwwwwwwwuvuu—uu—uuuuuuuuu——vvuuvuu—uuuvuuuuuuuuuuuuuuuvuuuuuuuuuuuuuuuuuuvuuuuuuuuuÃÃÃÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂÃÃÃÃÃÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃwuuwuutuuutttwwwwwwttwwwwwwwI™™š™›™š›™™š››››š›››ššš›šš››š››™›™™››™™››™™›™™›—››››››››˜˜˜›™›™™›™—™›››˜››™˜Â˜˜tt˜˜˜˜˜˜˜˜˜t˜˜˜t˜˜˜˜t˜tttttœœÁÁÁÀÁÁÁÀÀÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÁÁÁÁÁÀÁÁÁÁÁÁÁÁÀÁÁÁÁÁÁÁÀÁÁiœœiœœœiœœœœœiiiiiœœœœii˜iiiižžžžŸžžŸžžžžžžžžžŸžžžžžžŸžžžžŸžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀœœœœœœžœœœžžžœœœœœžžžœœœœœœœœŸ               Ÿ  Ÿ Ÿ     Ÿ Ÿ  Ÿ   ŸŸŸ ŸŸŸŸŸ ŸŸ   ŸŸ ŸŸŸŸŸŸ ŸŸŸŸŸŸŸŸŸŸŸ ŸŸÀÀÀ¿¿¿¿¿¿¿¿¿¿À¿À¿ÀÀ¿¿¿¿¿¿¿ÀÀ¿¿À¿¿À¿¿¿¿¿¿¿¿ÀÀÀ¿¿¿¿ÀÀÀÀ¿¿¿¿¿ŸŸŸŸŸŸŸŸŸŸŸŸŸŸžŸŸŸŸŸŸŸŸžŸŸžžž¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¢¡¢¢¢¢¡¢¢¢¢¢¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¿¿¿¿¿¿¿¿¿¿¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡££££££££££££££££££££¤££££££££¤¤¤££££££¤££££¤£££££££££££££££££££££££££££££££¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾£££££££££££££££££££££££££££££¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¤¤¤¤¤¤¤¤¤¤¤¤¤¤£¤¤¤¤££¤£¤¤¤£¤£¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¨¨¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¨¨¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¦¦¦¦¦¦¦¦¦¦¦¦¥¦¦¦¦¥¦¦¥¦¥¦¦¦¥¦¦¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼§§§§§§§§§§§§§§§§§§§§§§§§§§§§§©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ª¬¬¬ªªª¬ªª¬¬ªª¬ªªªªª¬¬ª¬¬ª¬¬ªªªªªª¬¬ªªª¬¬ªªª¬¬ª¬¬ªªª¬ªªª¬ªªªª¬ªªªªªªªªªªªªª»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ªªª««««««ªª«««ª«ª«««ªª«««««««ª¬¬¬ªªª¬ªª¬¬¬ª¬ª¬¬¬¬¬¬­¬¬¬¬¬ªªªªªª­ª¬ª¬¬¬ªªª¬ª¬ª¬­ªª¬ªªª¬ªªªªªª¬ªªª¬¬¬ªªªªª»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ªªª««««««ª«««««««««««ª«««««««¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®¯¯¯¯¯¯¯¯¯¯®¯¯¯¯¯®®¯¯¯®¯¯¯®¯®¯¯®®®¯®¯¯¯¯®¯®®®®¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸®®®®®®®®®®®®®®®®®®®®®®®®®®®®®±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±µ¶¶¶µµµµµµ¶¶µµµµµµµµµµµµµµ¶µµµµµ¶µµ¶µµµµµµ¶¶µµµµµµµµµµµµµµ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°·¸¸¸······¸¸··············¸·····¸··¸······¸¸··············°°°°°°°°°°°°°°°°°°°°°°°°°°°°°ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË“““““““““““““““““““““““““““““–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ–––––––––––––––––––––––––––––nsis-3.11/Contrib/Graphics/Wizard/llama.bmp000077500000000000000000000635761477201124000206220ustar00rootroot00000000000000BM~gv(¤:L¬–”\64lÔÎÌ\lJL„ìêìIJ´üþül:<Ttdwww5UUU]wwwwwwww}åUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7wwwwwww}UUUUUíwwwwwwww5UUUSww×uUUUU7ww×}w×}w5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU]×w×}w×}wÕUUUUSwww}w×}wÕUUUU×wwwUUUUSw××w×ww×ÜUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSww×w×ww×uUUUU^×w××w}ww~UUUU7w×}uUÅ\UÇ×ww×w××~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^Ýw×w×w××sÅUUUU7w×w}}w}}UU\UÍw×wwUUUUU×w××w×w~\U\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\7w}w×w×wwUUÅ\Uíw×w×ww}wåUUUSw}w×~UUUU^w×ww×w}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUí×}www×w×ÅUUUU\UÅ\UUÅUÅUU\U7ww}}}}}}}w}}}}}}}}}}}}}}}}}}uUUUUÅ\UÅUU\UÇ××w}wåUUUUUÇ××w}}w}~UUUUÅ\UUUUUÅUUUUUUíww××wwwwww}wwwwwwwwwwwwwwwwwsUUU\UUUUUUÅUU]w}}wwÕUUU\US}w××w}}åUU\UUUUUUUUUUÅUÅ\]w}www××××××w××××××××××××××××ÝìU\UUUUUUUUUUUU}ww}}~UÅ\UU]×www}w5UÅ\UUUUU\UÅ\UUUUU^ww×}}}wwwwww×wwwwwwwwwwwwwwww5UUU\U\UÅ\UUUÅUU×}}wwwÅUUU\]}}}}w>ÅUUUU\UÅ\UUUU\UUÅU×}ww×ww~ç××××w×××××××××××××××5UU\UUUUUUUU\UUÅUçwww××5UUUU]3}wwsUUÅUUUUUUUUUUUU\UUçww××w}}Uçwwww×wwwwwwwwwwwwww~UÅ\UUU\UUUUUUUUUUW×××wwu\UÅUU×7}sÅUUUÅ\UÅUUUUÅ\UUUUíw××w}}wåU7××××w×××××××××××××ÓÅUUUUUS35Å\UÅUUUUÅ^www}}}UUUUU]ÝÝåUUUUUUUUU\UÅUUUÅU^w}ww}wwÞUUWwwww×wwwwwwwwwwww}UUUUU\]www5UUUUÅ\UUU×××www5U\UÅUUUUUÅ\UUUUUÅUUUUUUU^×}w}}w}~UÅUW×××ww××××××××××××UU\UÅUSw}wwsUUUUUUUUUçww×××~\UUUUUUUUUUUÅ\UÅUUUU\UÅ\7}w}ww}}UUUUÇww}}}wwwwwwwwwwwÕUÅUUU^×}w}}wÅ\UUUU\UÅ]}wwwwÝUUUUUUÅ\UUUUUUUUUÅ\UUUUçww×w××wU\UUUW××www}}}}}}}}}wÞUUUUU\×ww}ww}åUUUÅ\UUUUw××××wÕUÅ\UÅUUU\UÅUUUUUUUUUU]w××w×wwåUÅUU\UÅUÅUUUUUUUU\Uçwww}uUUUUw×××w×w}}wuUUÅUÅÇwwwwwww}}uUUUÅUUUUUU^×××××w×w}ww}ww}5UUÅUUUUUUÅ\U\UÅ\UUç×××wuUUU^wwww×w××w}~\UUUU\}}}}}}}ww|UUUUÅUÅUÅUU^×www×}}w}}ww}w}î\UUUUUUUUU\UU7w×××ÕUUUW}www}}w×ÕUUUU\UUUçwwwww}w~UUUÅUUUUUUUUUUU7w×}w}}}}}w}wwwwwwwwwww}ÝÓ3îå\U××www|UÅUçw×××ww}wÅÅ\UÅUUUUW×××××w}uUUUUÅUÅUUUUUUUUw×www×wwww}ww}}}}}}w××××wwwwwwwww}}}uUUUW×www}}wwUUUUUUUÅUÍwwww}}w~UUUUUUUÅ\UÅ\UÅSww×××w××××w}}wwwwww}wwww×w×}w×}}}www|UUUWw×××ww××UUUU\UUUU]}}}www×uUUUUUÅUUUUUUUUS}}www}wwww}ww×}}}}}ww×××w×}w×w×ww}}}~U\UÇ}www××wwu\UÅU\U\U^www×××w~UUUÅUUUUUUUUUUSww}}}w}}}}w××w×wwww}www}wwwww×w××www~UUU\w}}ww××}åUUUUUUUUW}}www}}uUÅUUÅUÅ\UÅ\UÅ\^7××www×www×ww×w}w×××}}}w}}}}}w}ww}}}}UÅ\Ýww}|ÇwÕUUUUÅU\UUÇww}}}ww~UUUUUUUUUUUUUUU7ww×××w××ww×ww×w}www×ww}wwwww}w}}www}UÌ\Uw}×u|]}U\UÅUUUU\U]}}www××uUUUUUÅUUUUUUUUUãÓ}www×ww××}}}w}ww××w}}w}}}}}w}ww}}}sÌÅU\}sÇÅU\uUUUUÅU\UUUSwww××ww~UUUÅUUÅ\UÅ\UÅ\UUã=ÝÝÝw××wwwww}w}ww}}ww}wwwww×w××wwwÕ\UUU\UUUUUÅ\UUUUÅUUUÅ]}}ww}}}~UÅUUÅUUUUUUUUUUÅUUU\UÅÅUå>ãí=ÝÝÝ}}ww}}ww××××w×ww×××5UUÅUUUUÅ\UUUU\UUUUUÅU]ww}}wwwsUUUUUUUUUUUUUUUUUU\UUUUUUUUUUU\UÅ\åî3=ÝÝÝwww×}}www~åUUUÅUÅUUUUUU\UUÅUÅUUUW}w×w×××~UUUUUÅ\UÅ\UÅ\UÅUÅ\UUUUUUUUUUU\UUUUUUUUUUUÅÌÌ\îããíÞåUUÅUUUU\UUUÅ\UUUUUUÅUÅ]w×w×wwwsUUUÅUUUUUUUUUUUUUUUUÅ\UÅUU\UÅUUUUUUUUUÅUUUUUUUUUUUU\UUU\UUU\UÅUUUUÅUÅUUUUwww×w×××~UUUUÅUUUUUUUUUUÅUU\UUUUUÅ\UUUUUÅ\UÅ\UÅU\UUUUUUÅUUUÅUUU\UU\UUUUUU\UUUUUUU\\××w×wwwsUUUUUÅ\UÅ\UÅ\UUUÅUUUUUUUUUUU\UUUUUUUUUUU\UÅU\UUÅ\UUU\UUU\UUUUU\UUUUÅUÅ\UUU]w×w×××ÓUÅUUUUUUUUUUUUÅUU\U\UÅ\UUUU\UUÅUUUUUUU\UUUUUUUUUUUU\UUÅUUUU\UÅU\UUÅUUUU\UUW×w}wwwsUUUÅUUUUUUUUUUUUUUUUUUU\UÅ\UUUUÅ\UÅ\UÅUUUUUÅUÅUUUUUUUUUÅUUÅUUUUU\UUUÅUUUUUWw×w}}w~UUUU\UÅ\UÅ\UÅ\U\UÅîîUUUUUUUUUÅUUUUUUUUUU\UÅUUU\UÅ\UÅUÅUUUÅUUUUÅUUUUUUUÅU\Uç×w××w}sUUUUUUUUUUUUUUUUUîÝÝîÅ\UUUUUUUUUUUUUUUÅ\UUUUÅUUUUUUUUUU\UUUÅ\UU\U\UÅUÅUUUU7w×ww×w~UU\UÅUUUUUUUUUUÅ^Ýw×}åUU\UÍw}ÝÝÓ33>îîåUUUUUUUUÅUUUUUÅU\UUUUUUUUUUUUUUUU\UU7×w××}}sUUUUUÅ\UÅ\UÅ\UÅU]}wwwÕU\U^w}wwwwwwwwwwww}ÝÝÓ33å\UÅ\UU\UU\UÅUU\UÅUÅUUÅUUU\U×w×wwww~UUUUUUUUUUUUUUUUWw}w×~\UU7}wwww×}}}}}}}}wwwwwu5UUUUUUUUUUUUU\UUUUUUÅUU\UUU7×w}}}}sUUUÅUUUUUUUUUUUU××w}wÝUU^ww}}}ww×wwwwwww×}w}}ÅUÅUUU\UÅUÅUUUÅUUUUÅUÅUUÅUUUÅ×w×wwww~UUUUÅ\UÅ\UÅ\UÅ\\ww}wwwUU]×××ww××ww××××××}w}wuUUUUÅ\UUUUU\UÅUU\UÅUUUUUUUUÅU××w××××sUUUUUUUUUUUUUUUU}}w××wÅ\]www××w}}}wwwwwww}w}|UÅUÅUUUUUÅUUUUUÅUUUUÅU\U\UÅUUww×www}}UÅUUUUUUUUUUUUU\ww×ww×UUWw}}ww}wwww}}}}}}w}wÅUUUUUU\UÅUUÅUUUUUUUUUUUUUUUU]×}w}}}w}UUUÅ\UÅ\UÅ\UÅ\UU}ww××wUUÇ×ww}}w}}}}wwwwww×wwÅUUÅU\UUUUUÅU\UÅUÅ\UÅUÅUÅUUUU]ww}www×}UUUUUUUUUUUUUU\\ww×ww×åUÇw×××ww×wwww×××××w}uUUÅUUU\UUUUUUUUUUUUUUUUUUUÅ\UÇw××w××w}\UUUUUUUUUUUUUUU}}w××wUUW}www××w××××wwww}}wUUÅUUÅUU\UÅ\U\UUUÅUUUUÅUÅUÅUUU×}ww×w}}}UU\UÅ\UÅ\UÅ\UÅU\wwwwwwåÅ]ww}}ww}wwww}}}}wwwUUUUUUUUUUUUUUUUÅUU\UÅUUUUUUU]}ww}w}ww}UUUUUUUUUUUUUUÅ\}}}}}wUUW}}ww}}w}}}}wwww×××Å\U\U\UÅUUUU\U\UUUÅUUUUÅUÅU\Uww}}w}w××}\UUUUUUUUUUUUUU\wwwww×åU]www××ww×wwww×××wwuUUUUUUUU\UÅ\UUUUUUUUUUUUUUUU]}w×w}w×ww}UUUÅ\UÅ\UÅ\UÅUUU}}}}wwåUW}}}ww××w××××ww}}}ìUÅUÅUÅUUUUUUU\U\UÅUÅ\UÅUÅUÅUww}w×www××ÝUUUUUUUUUUUUUUÅ\wwwww×5\Swwww}ww}wwww}}wwwUUUUUUUU\UUUUUUUUUUUUUUUUUUUU}}www}}}ww}UUUUUUUUUUUU\UUU}}}}wwåU]}}}}w}}w}}}}ww××wÅUUÅUÅUÅU\UÅ\UÅUÅUUÅUUUUÅUÅUwww××××ww}w}UÅ\UÅ\UÅ\UÅ\UU\\wwww××5U]wwwww×ww×wwww×w}|UUÅUUUUUUUUUUUUUUUÅUUÅ\UU\www××wwwww××}}UUUUUUUUUUUUUUUU}}}wwwåU]}}}}ww××w××××w×wÕ\UUUÅUÅUÅUUUUUUÅUÅUUÅUU7åWw××w}}}}}}ww×}UUUUUUUUUUUUU\U\wwww××5\]wwww}}ww}wwww×w\åUUUUUUUUU\UÅ\UÅUUUUUU]wwww}ww}wwwwwww×w}\UUÅ\UÅ\UÅ\UÅUUU××××wwåU]}}}}ww}}w}}}w}wÅUÅ\UÅUÅUÅUUUUUUUUÅU\U}w}}}}w}}w}}}}}}ww×}UUUUUUUUUUUUUUÅ\wwww}wÕU]wwwww××ww×ww}wwUUUUUUUUUUUUUUUUUUUU\ww}wwwww×ww×wwwww××}}UUUUUUUUUUUUUUUU××××w×5UÍ}}}}www××w××w××Å\UUUUÅUÅUÅ\UÅ\UÅ\U\W}}w}}}}ww××w××××wwwwwÅUU\UÅ\UÅ\UÅ\U\UÝwww×wÜU]wwww}}}ww×ww×w}UUU\UÅUUUUUUUUUUUUUSwwww×www}}ww}wwww×××××UUUUUUUUUUUUUUUU×}}w}wÕU]}}}}www}ww××w×UUÅUUUUUÅUÅUUUUUUUU\w}}}ww×××ww}}w}}}wwwwwwÅÅUÅUUUUUUUUU\UU×ww}wwÕU]wwww}}}w}}ww×wUUUUÅUUUUUU\UÅ\UÅ\UÇw×ww}}www×××ww×www×××××UUUUÅ\UÅ\UÅ\UU\U×××w××ÕÅ]}}}}www×ww}w}ÜUÅUÅU\UÅUÅUUUUUUUUUw×w××ww}}www}}ww×××wwwwwÅUUUUUUUUUUU\UUU×ww×wwÕU^wwwww××}}}w}wUUUUUUUUUUUUUUUUUUS××w×ww×××w}}}ww}}www×××××UUUÅUUUUUUUUUUUÅ×××w××ÕUS}}}}wwwwww×w~UÅUÅU\UUUÅUÅ\UÅ\UÅwww×w××www×www××ww}}wwwwwwÅÅUUUÅ\UÅ\UÅUUÅU×ww×wwÕÅ^wwwww×××××w×åUUUUUUUUÅUUUUUUUU×w××w}ww}}}w×××ww×××ww×××××UUUUÅUUUUUUUÅUUU×××w×wÕUS}}}}}wwww}wwÅ\U\U\U\UUUÅUUUUU7w×w}}w}}www}ww}}wwww××wwwwwÅUUÅUUUUUUUUUÅUÅ×ww×w×ÕU^wwwwww}}}w}sUUUUUUUUUUUUUÅ\UÍw}w}ww}ww}}}ww}ww}}}}ww×××××UUUUU\UÅ\UÅUUUUU××ww×w|US}}}}}}www×wÞUU\U\U\U\UÅUÅUUUw}w}w}}w}}www×××}}wwww}wwwwwwÅÅUUÅUUUUUU\UUÅU×}}}w}uU^wwwwwww××w×sÅ\UUUUUUUUUUUUUW}w}w}ww}www××wwwwww××××w×××××UUUUUUUUUUUUUUUÅ×www}w|US}}}}}}ww}ww5UUU\U\U\UUUÅU\]ww}w}w}ww}}ww}}}}}}wwwww×wwww}ÅUUÅUÅ\UÅ\UÅUÅUU×}}}w}uU^wwwwww}}ww×UUUUUUUUUUUÅUUU×}}w}w}w×××w}}wwwwww×××××}}}}}~UUUUUUUUUUUUUUUU×www×w|US}}}}}}ww××~U\UÅU\U\U\UUUÅ]www}w}wwwww×ww×××××wwwwww×wwww|UUUUÅUUUUUUU\U\Uç×××w}uU^wwwwwww×wwuUUUU\UUUUUUUUU×w×××w×w××××w××wwwww××××××ww×××5\UUUUÅ\UÅ\UÅUUUU×ww}}w|U^}}}}}}w}}}Å\UUUUU\U\U\UÅ7w×www×w×www}ww}}}}}wwwwww}}www}åUUUÅUUUUUUUUUUÅU7}}ww}uÅUwwwwww}ww}UUU\UÅUUUUUUUçw×w×}}w}w}}}w}}wwwww}}}}}}ww}}}sUUUUUUUUUUUU\UÅU\7ww××w|U^}}}}}}w××wÕU\UUUÅU\U\U7w×w×w×w}w}www×ww×××××wwwwww××www|\UÅUU\UÅ\UÅ\UUUUU7××ww}uUUwwwwww×ww×5\UUUUU\UUUíw×w×w×ww×w×w××w××wwwww××××××ww×××UUUUUÅUUUUUUUUUU\U7w}}}w|U^}}}}}ww××wÅUUUÅUUUU\^w}w×w×w××w×w×ww×w}}}}}wwwwww}}wwwuUUUUUUUUUUUUUUÅ\UUç}www}uUUwwwww}}ww}UU\UU\UÅUUÇ}www×w}ww×}}w}}w}wwwww}}}}}}ww}}}UUU\UU\UÅ\UÅ\UUUUUU7×}}}w|\^}}}}}ww}}~UUUUUUUUUUçw}}ww×w}wwww}ww}w×××××wwwwww××wwUU\UUUUUUUUUUUUÅUU\Uçwwww}uUUwwwwww}ww~U\U\UÅUUÅ\w××w}}w××}}}}w}}w×wwwww××××××ww×ìUUUUÅUUÅUUUUUUUUÅUUUç××××w|U^}}}}}}w}}|UUUUUUÅUUU×ww×ww}ww×www×ww}w×××××wwwww}}wuU\UÅUUUUUU\UÅ\UÅUU\UUWwwww}uUUwwwwww}wwuUU\UUUUÅU\w××}}}ww×w×××w}}wwwwwww}}}}}wwsÅUUUUU\UUUÅUUUUUUUUU\Uç××××w|\^}}}}}}w}wÕUÅUUÅUUUUU×wwwww××w×ww}}ww×××××××wwwww××UUUUUUÅUUUÅUUUUUUUÅ\UUUWwww}}uU\wwwwww}w×uUUUUU\U\U\w×××××ww×w}}www×wwwwwww×××××w5\UÅ\UÅUUUUUUÅ\UÅ\UUUUUUW×××ww|UU}}}}}}wwwÕ\U\UUUUUUU×wwww}w×w×ww×××}}}}}}}wwwww}ÞÅUUUUUUUUUUUUUUUUUUUU\UÅÇwww}}|U\wwwwwww××}UUUU\UÅUÅ\w}}}}w×w×w××ww}wwwwwww}}}}}sUUUUUUUU\]UUÅ\UUUUU\UÅUUUW×××ww|UU}}}}}}wwwwÕ\U\UUUUUU}wwwwww×w×w}}ww}}}}}}}wwww}åUUÅ\UÅ\USwUUUUU\UÅ\UUUUUUÇww}}}u\\wwwwww××××sUUUUUUÅUUww×××××w×w}ww×××wwwwwww×××U\UÅUUUUU^×w5UUU\UUUUUUUÅ\UW××www|UU}}}}}wwwww×ÅUÅUÅUUÅ]}wwwww}ww×w}wwww×××××××wwÜUUUUUUUUU×w×5UÅ\UUUUU\UÅUUUÇww}}}uU\wwwwww××××wuUUUUÅUU^w}}}}}ww×}}w}}}}wwwwwww}uUUUUUUÅ\Uçw×wÕUUUUUÅ\UUUUUUUW××www|U\}}}}}wwww}w|UUÅUUUU^}wwwww××www×wwww}}}}}}}sUU\UÅ\UUUíwww×|UUU\UUU\UUU\UÅÇw}}}}uU\wwwww}}}}w}sUÅUUUUÅ\ww××××ww×××w×××××wwwwwwìUÅUUUUUU]ww××wuUÅUUUUUU\UÅUUUW×wwwwuUU}}}}}wwww×w}UUUÅ\UUUW×www}}www}wwwwww×××××ìUUUUUUUÅSw}}w}}uUU\U\UÅUUUUUUUÇw}}}}~U\wwwwww×××w}}\UUUUUUUWw}}}ww}}}w}}}}}}wwww~UUUUÅ\UÅU×}ww}wwsUUUUUUU\UUUÅ\UÇ×wwwwuUU××××××ww}}wuUUÅUUÅ\U7×www××www×wwwwww}}}~ÅUUÅUUUUU7w×}ww}w~U\U\UUUUUUÅUUUÇ}}}}}~\U7wwwww}}ww}uUUUUÅUU\ww×××ww×××w×××××××w}åU\UUÅUUUWw×ww}}w}}UUUU\UÅU\UUUUUWwwwwwuUU××××××ww××w|UÅUÅUUU^w×ww}}www}wwwwwwww×åUUUUUUÅ\]w}w××ww×ww\U\UUUU\UUUÅ\UÇ×}}}}~UU×wwwww××ww}uUUUUUUÅW×w}}ww}}}ww×××××××ÞUUUU\UUUSw}wwww××w××UUUUUUUUU\UUUUWw×www~UU××××××w}}}w|\U\U\UUÇw×ww××www××wwwwwwuUUÅ\UUUÅ^×ww}}}ww}wwwU\UUÅ\UÅUUUUUUÇ×ww××sUÅ×wwwww}www}uUUUUUUU7×w××ww×××ww}}}}}}Å\UUU\UUU×w×××ww}}w×××UU\UUUUUÅU\UÅUWw××wwÓUU××××××w×××w|U\U\U\Uww×w}}www}}}wwwwwUUUUUUU\U7w×www××wwwwwwUUUUUUUUU\UUUUÇ×ww××sUU×wwwww×www×åUUUUUUU×}w}ww}}}wwww×××UUÅUUUUU7wwwww×××wwwwwwwwwwUUUUUUUUU\UUUÅSwww}}}UUçwwwww×wwUUUUUUUUÇww×wwww××wwwsUÅUUUUUUÍw}}}}}www××××××××××UÅ\U\UÅUUUU\UU]}}}ww}UU7×××××w×\UU\UÅUUU7××}}}}ww}}}s\UU\U\UÅSw}wwwww×××wwwwwwwwwwUUUUUUU\UÅUUUU]wwww×}ÅUçwwwww×|UUUUUUUÅ\ww}wwww}}wwwåUUUUUUU^×w×w××××www××××××××××UUU\UUUUUUÅU\UÍ}}}wwÝUU7×××××wÅU\UÅU\UUW}ww}}}}ww××ìUU\UÅUÅU×}ww×www}}}wwwwwwwwwwwUÅ\UU\UÅUUU\UU]wwww×}UUçwwwww|UUUUUUUU\ww×××wwww×w~UU\UUUUUçww}}w}}}wwww××××××××××UUUU\UUUÅUUUUU]}}}}w}UU7×××××|UÅUUUÅUUW}wwww××××wÓÅUÅUUUUÅíw××ww×www××××wwwwwwwwwwUUUUUUUUU\UÅU\]wwwww}UUçwwww}uUUÅ\UUÅ\××}}}}wwww×åUUUUU\U]wwww××w×××wwww××××××××××UÅ\UÅUÅUUUUUÅU]}}}}}}UU7××××w|UUUUUUUWww×www}}}wåU\U\UÅUSw}}}}ww×ww}}}}wwwwwwwwwwwUUUUUUU\UÅUUUU]wwwww}ÅUçwwww}wîî3ÞÎUU×w×ww×××wwÞU\UUUUU^×}wwww}}w}}wwwww××××××××××UUUUUÅUUUUÅU\UÍ}}}}}wUUç××××w}wwww|UÍw×w××www×Ó\UUU\UUU×ww}}}www}ww×××××wwwwwwwwwwUÅ\UÅUUÅUUU\UU]wwwwwwUUWwww}}ww×}wUU××w×ww×××}åUUUUUUUçw×××ww××××w×wwwww××××××××××UUUUUUÅU\UUUUU]}}}}}wÅUç×××ww××w×|ÅSww×w××wwwUUU\UÅU\]wwwww×wwww}}w×××××wwwwwwwwwwUUUUUUUUUUUÅU\]wwwwwwÅUWwww××ww×wÅU7w×w}www×ÜUÅ\UUU\Sww××××}}}}}wwwwwwwww×××××××××UÅ\UÅ\U\U\UUÅU]}}}}}wÅUç×××w}}ww×åUw×w××}}}uUUUUUUUSw}wwwwwwwwww×××××××××wwwwwwwwwUUUUUUUUUUUUUU^wwwww×UUWwww}www×wsÇ×w}wwwwsUUUUU\UÅ×}ww×××××××××wwwwwwwww×××××××××UUUUUU\U\U\U\U]}}}}wwÅUç×××w×××w×www×w}}}}åUÅ\UÅUU7ww}}wwwwwwww}}}}}}}}}wwwwwwwwwwUÅ\UÅ\UUUUUUUU^wwwww×UUWwww×www}w}w×w××ww5UÅUUUUUíww××ww}}}}}}}wwwwwwwwww×××××××××UUUUUUU\U\U\UUS}}}}wwÅUç×××}}}}w}w}w×ww×ÞUUUUUUU]w}}ww×××wwwwww××××××××××wwwwwwwwwUUUUUUUUUUUUUU^wwww××UUWww}wwwww×}www××sUÅ\U\UÅ^ww×ww}wwww×××××wwwwwwwwww×××××××××UÅ\UÅ\UÅUÅUÅUÅS}}}wwwÅUç××w}}}}ww×}}wwsåUUUUUU^×}ww××w}}}}wwww}}}}}}}}}}wwwwwwwwwwUUUUUUUUUUUUUU^wwww××\UÇww××www××wwww×5\UUU\UU×ww}}ww××wwww}}}wwwwwwwwwww×××××××××UUUUUUUUÅUÅUÅUS}}}wwwÅUW×}ww××ww}}}}}ÕÅUUÅUU\7w××ww}www×××××ww×××××××××××wwwwwwwwwUÅ\UÅ\UÅUUUUUU^www×××UUÇ}ww×w}}}wwww~UUUUUÅUíw×ww×××}}}wwwwww×wwwwwwwwwww×××××××××UUUUUUUUUÅUÅUUS}}wwwwÅUWw}ww×www×××ÝUUUUUUU]www××www×ww}}}}}}w×××××××××××wwwwwwwwwUUUUUUUUUUUUUÅUwww×××UUÇ}ww×w×××wwwåÅ\UÅ\U^ww}}ww×××ww××wwwwwwwwwwwwwwwww×××××××××UÅ\UÅ\UÅ\U\UUU^}}wwwwÅÅW×}}w×ww}}}Ý7×××××ÝÓªªfffdªªªªffkf¶fffffff¶ff¶fjª¥\UÅUUUUUUÅ\UUU\UÅ\UÅ\UÅ\UÅUUUUUU\UUÅUU\UUUU\UUU\\UUªª²"""*ªª¤""""""""""""""""""*ª¥UUUÅ\UÅUUUUUUUUUUUUUUUUUUU\UUUUUUUUUU\UUUUÅUUÅ\UUUUªªfffffŠªFffffffffffffffffffjª¥UUUUUUUUUUU\UÅUUUUUUUUUUUUU\UÅ\UÅUÅUÅUUUUUUUUUUUUUUªª""""ª’"""""""""""""""""""*ª¥UÅUUUU\UUÅ\UUUUÅ\UÅ\UÅ\UÅ\UUUUUUUUUUUUU\UÅUÅ\UUUUÅUªªffff¦fffffffff¶ffffffffffjª¥UU\UÅ\UUUUUUUUUUUUUUUUUUUUUUUUUUUÅUÅUÅ\UUUUUU\UÅUUUªª""""""""""""""""""""""""""*ª¥UUUUUUUUUUU\UÅ\UUUUUUUUUUUÅ\UÅ\UÅUUUUUUUUUÅUUUUU\UUªªfffffffff¶kfkffffkf¶kf¶kffjª¥\UÅUUU\UUÅUUUUU\UÅ\UÅ\UÅ\UUUUUUUUUÅUÅUUUÅUUÅ\UUUUUUªª²""""²""""""""""""""""²"""*ª¥UUUÅ\UUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUU\UUÅUUUUÅ\UÅUªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª¥UUUUU\UUUUU\UÅ\UUUUUUUUUU\UÅ\UÅ\UÅUÅUÅUUUUUUUUUUUUUªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª¥UÅUUUU\UU\UUUUUUUÅ\UÅ\UÅ\UUUUUUUUUUUUUU\UUÅ\UÅUUUUUªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª¥UU\UÅUUUUUUUUUU\UUUUUUUUUUUUUUUUUUÅUÅUÅUUUUUUUÅ\UÅUªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª¥UUUUU\UUUUÅ\UÅ\UUUUUUUUUU\UÅ\UÅ\UÅUUUUUUUÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UÅUUUUUUUUUUUUU\UÅ\UÅ\UÅUUUUUUUUUUÅUÅUUUUÅ\UÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅ\U\UUÅUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UÅUUUUUU\UÅ\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅ\UÅ\UÅUUUUUUUUÅ\UÅ\UÅ\UÅUÅUUUUUUUUUÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅ\UÅUU\UUUUUUUUUUUUÅ\UÅ\UÅUUUUUUUUUUUUUUU\UÅ\UÅUUUUU\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅUUUUU\UUUUÅUUUUUUUÅUUUUUUUUUUUUUUUUUÅUÅ\UUUUUUUUÅ\UÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅUU\UUUU\UÅ\UÅUUUUUUUUÅ\UÅ\UÅ\UÅUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅ\UÅUUUUUUUÅUUUUUUU\UÅ\UÅUUUUUUUUUUUUÅUUU\UÅ\UÅ\UUUUÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UUUUUUÅ\UUUÅUUUUUUUÅUUUUUUÅUUUUUUUUUUUUUÅUUUUUUUUU\UÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅ\UÅ\UUUUUUUUUÅ\UÅ\UÅ\UÅ\UUU\UUUUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UÅ\UÅUU\UUUUUUUUUUUÅ\UÅ\UUUUUUUUUUUUUU\UUUUÅ\UÅ\UUUUÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UUUUUUU\UUUÅ\UUUUUUUUUUUUUÅUUUUUUUUUUU\UUÅUÅUUUUUUUÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÅUUUUUUU\UÅ\UÅUUUUUUUU\UÅ\UÅ\UÅ\UUUUUUUUUUU\UUÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UÅ\UÅUU\UUUU\UUUUUUÅ\UÅ\UUÅUUUUUUUUUUUUÅUÅU\UÅ\UUUUUÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅUUUUUUUUÅUUUÅ\UUUUUUUUUUUUUÅUUUUUUUUUUU\UUUUUUUUU\U\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UUUUUUUUUUUUUUUÅ\UÅUUUUUUUUUÅ\UÅ\UÅ\UÅUUUÅUÅUUUUUUUUÅUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UÅ\UÅ\UUUUUU\UUUUU\UÅ\UÅ\UUUUUUUUUUUUUUÅUUUÅ\UÅU\UUU\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UÅ\UUUUUUUUU\Unsis-3.11/Contrib/Graphics/Wizard/nsis.bmp000077500000000000000000000635761477201124000205100ustar00rootroot00000000000000BM~gv(¤:\¬ŽŒl:<ÜÎÌôòôtlŒnläÞÜIJ´lJLüþüìæä„üöôdÕÝ]`ÕÝ]ÕÝ]ÕÝUðm]ÕÝ]ÕÝ]ÕõÕÝ]ÕÝ]ÕÝ`ÕÝ]ßmÝ]ÕÝ]ÕÝ]P]ÕÝ]ÕÝÕÝP]Ý]ÕÝ]ÕÝ_UÝÕÝð]]ÝÝÝÝÝÝP]ÕÝÝÝÝÕÝßUÝ]ÝÝÝÝÝÖmÝÕÝß ÝÝÝ]]]]_UÝÝÝ]]]]ÖeÝÝÝÝ]]]UðÕÕÝ]ðUÕÕÕÝÝÝÖeÝ]]]ÝÝÝÝðÝÕÕÕÕÝÝÝ`]ÝÝ]ßÝÝÝÝÝÕÕðõ]ÝÝÝÝ]ÕÕ`ÕÝ]ÝÝÝÝÕ_UÝ]]Ý`]]]]]]`ÕÝ]]]]Ý]ß]ÝÕÝ]]]]UõÝ]ÝÕÕõÝÝÝÝÝßUÝ]ÝÝÝÝ]Ö]ÕÕÝÝÝÝÝÕ`Ý]ÝÕÝÝ]ÕÕÕÕÕ`ýÝÝÝ]]]ÝÝð]]Ý]]]]]`]ÝÝ]]ÕÕÝ]ÝÝÝÖÕÕÕÕÝÝÕÕ`]ÝÝ]ÝÝÝÝ_]ÝÕÕÝÝÝÝ]Ý]]]Ð]ÝÝÝÝÕÝÝV]Ý]ÝÝ]]]UõÕÕÝÝÕÕÕÕÝ]ÝÝÕðÕÝÕÕÕÕÝ]V]Ý]ÕÕÕÝÝÕðÝÝÝÝ]]ÝÝÝmÕÝ]]ÝeÝÕÝÝÝÝÝÕ`]]ÝÝÝÝÕÕP]]]]]ÝÝ]]]UÝÝÝÝVõÝÝ]ÕÕÕÕÕ`]ÝÝÕÕÕÕÝP]ÝÝÝÝÝÕÕÝÝÝ]ÕÕÕÝÐ]ÕÝÝ]ÝÝÝVUÝ]]ÝÝÝÝUõÕÕÕÕÕÕÝÝÕÕÕÕÝÝÝÕP]ÕÝ]]ÝÝ]V]ÕÝÕÕÕÕÕõÝÝÝÝÝÝÝÝ]]ÝÝÝÕÕÕÝðeÝÝÝÝÕÕÕÕðeÕÝÕÝÝÝÝð]ÕÕÕÕÕÕÕÝÝÝ]]Ý]ÝÝÝõÝÕÕÕÕÝÝÝðUÝÕÝÝÕÕPUÝÝÝÝÝÝÝÝÕÕÕÝÝÕÝ]]U]ÕÝÝÝÝ]]PUÕÝ]]]ßUÝÕÕÕÕÕÕÕÕÝÝÝÕÕ ÝÝÝÝßUÝÝÕÝ]]Ýßm]]ÝÝÕõÝÕÝÝÝÝÝÝÝÝÝ]]]ÝeÕÕÕÕÐeÝÕÝÝÕÝÕÖVÕUÕÕP]ÕÝÕÕÕÕÕÕÕÕÝÝÝÝ]mÝÝÝÝPõÕÕÝÕÕÝÕÝðmÝÝP]ÕÝÝ]ÝÝÝÝÝÝÝÕÕÕÕÝUÕÕÕÝÐ]ÝÝÕÝÝÕÝ`UU_UÝÝÕÝÝ]]]]]]]ÝÝÝÝÕ]ÝÝÝÕP]ÕÕÕÝÕÕÝßõÝÕÕÝÕÕÝÝÝÝÝÝÝ]]]]]]]]]Ý`eÝÝÝÝ]ÝÝU]ÕÝÝ]ÝÝÕÕÕÕÕÕÝÝÝÝÝÝÝÝÝÝÕ`eÝÝ]]]Ý]]ð]ÝÝÝ]Ý]]]ÝÝÝÝÝÕÕÕÕÕÕ]]]]]`]ÕÕÝÝÝ]Ý`UÝ]]]Ý]ÝÝÝ]]]]]ÝÝÝÝÝÝÕÝÝÝÝð]ÕÝÝÝ]]Ý_õÝ]ÝÝÝ]ÝÕÕÕÝÝÝÝÝÕÕÕÕÕÕ]ÕÕÕÕðeÝÝÕÕÝÝÕÖ]ÝÝ]]]Ý]ÝÝÝÕÕÕÕÕÝÝÝÝÝÝÝÝÝÝÝUÝÝ]]ÝÕÕÕðÕÝÕÕÝÝÝ]Ý]]]]ÝÝÝÝÕÕÕÕÕÕ]]]]]]ÕÝÝÝ]ÝÝ`m]ÕÝÝÕÕÝÝ]ÝÝÝÝ]]]ÕÝÝÝÝÝÝ]ÝÝÝÕ]ÝÝ]]]ÕÕ_ý]ÝÝÕÕÝÝÕÕÝÕÕÕÕÝÝÕÝÕÕÕÕÕÕÕÕÕÝÝ]ÕÕÝÝÝÝÝÖ]Ý]]ÝÝ]]ÝÝÕÝÝÝÝÕÝÝÕÝÝÝÝÝÝÝÝÝÕÕ]ÕÝÝÝ]]]Uð]ÕÕÝÝ]]ÝÝÕÕÝÕÕÕÕÝÕÕÝÝÕÕÕÕÕ]]]ÝÝ`]Ý]]]ÝÝÝ`eÝÝÝÕÝÝÕÕÕÝÝÕÝÝÝÝ]ÝÝ]]]ÝÝÝÝ]ÝÝ]]ðÝÝ]ÝÝÝÕÕPe]Ý]]]ÕÕÝÝÝÝ]]Ý]]]Ý]]ÝÝÝÕÕÕÕ]]]ÝÕP]]]Ý]]]Ýß]Ý]ÝÝÝ]Ý]]]]ÝÝ]ÝÝÕÝÝÕÕÕÕÝÝÝÝ]ÝÝÕÝPUÝÝÝÕÝÝÝUUÝÝÝ]]]Ý]ÝÝÝÝÕÕÝÕÕÝÕÕÝÝÝÝÕÕÕÕUÕÕÝÕÐÕÕÕÕÝÕÕÝðUÝÕÕÝÝÝÝ]Ý]]]]ÝÝÕÝÝÕÝÝ]]]ÕÝÝÝßmÝÝÕÝPUÝÝÝÝÕÝÝPeÝÕÝÝÝ]]]ÝÕÝÝÝÝ]]]Ý]]Ý]ÝÝÕÝÝ]VõÕÝ]ÝÐ]ÝÕÕÕÕÝÕßÝ]ÝÕÕÕÝÝÕÕÝÕÕÕÝÝÝÝ]ÝÝ]ÕÕÝÝÕÝÕ` Ý]Ý]_UÝÕÝÝÝÝÕÖ]]Ý]]ÝÝÝÕÝÝÝ]ÝÝÝ]]]Ý]]ÕÝÝ]]]Õ`ÝÝ]ÝÕÝ]Ý]]]]ÝðeÝÝ]ÝÝ]]]]ÕÕÝÝ]]]ÝÝÕÝÝÝ]ÕÝÝÝÝPÝ]ÝÕÕÝ]Ý]ÝÝÝÝ`UÝÝÕÝÕÕÝÝÝÝÝÝÕÕÝÝÝÕÕÝÝ]]ÝÝÝ]]_]Ý]ÝÝ]]Ý]ÕÕÕÕß]ÕÕÝÕÝÝÕÕÕÕÕÕÝÝÕÕÕÝÝ]]ÝÕÕÕÝÝÖÝ]Ý]]ðUÝÝÝÕÝÝÝÖ]ÕÝÝÝ]Ý]]ÝÝÝÝÝÝ]]ÝÝÝ]ÝÝÕÝÝÝÕÕð]Ý]ÝÕÐeÝÕÕÕÝÕÕÕð]ÝÝÕÕÕÝ]ÝÝ]]]]]]ÝÝ]]]ÕÕÕÝ]]]Ýð]ÕÝÕÝP]Ý]ÝÝÕÝÝ`UÝ]]]ÝÝÝÝÕÕÝÝÝÝÝÝÕÕÝÝÕÝÝÝ]ÝÝÝPm]ÕÝÝÕeÕÕÝ]]ÝÕ_Ý]ÝÝÕÕÕÕÕÝÝÕÕÕÕÕÕÝÝÕÝÝÕÕÝÝ]]_ ÝÝÕÕÕUÝÝÝÝÝ]UÝÕÝÕÕÝÝÝÝÝÝ]]ÝÝÝÝÝÕÕÝ]]]ÝÕÕÝÕ]]ÝÝÝPÕÕÕÕÕÝÕ`]]ÝÕÝÝ]]]]]]ÝÝ]]]]]ÝÝÝÝÝÝ]ÝÝÕðÝÝ]]]P]ÝÝÝÝÕ`UÝÝ]]Ý]ÝÝÝÝÝÝÕÕÝÝÝÝÝÕÕÕÕÕÕÝÕÕ`UÝÝÝÝÕÕ]]]]VeÝÕÝÝÕÕÖeÕÕÕÕÕÝÝÕÕÕÕÕÝÝÝÝÝÝÕÝ_mÕÕÕÕÝðeÕÝÝÖõÝÕÝÕÕÝÕðmÝÝÝÝÝÝ]]ÝÝÝÝÕÕÕÕÕÕÝ_ÝÝÝÝÕÐU]ÕÕ]]ÝÕÝÝ]`m]]]]]]ÝÝ]]]]ÝÝÝÝÝÝÖÿ`ÝÕÕÕÝUõUUðÕÝÝ]]Ý]_ýÝÝÝÝÝÝÕÕÝÝÝÝ]]]]]UÕÕÕUÝÝÝÝÕ`ðeÝÕÝÝÝ]ÖÕÕÕÕÕÕÝÝÕÕÕÝÝÝÝÝÝð]ÝÝÝßmÕÕÕÕÝPeÝ]]Ý]]Õ ÝÝÝÝÝÝÝ]]ÝÝÕÕÕÕÕP]ÕÕÕÕÕÝÝÝÝÝÕ]ÕÝÝ]ÝÕ`ÕÕÕÕÕÕÝÝÝ]]ÝÝÝÝßm]ÝÝÝÝÕðÕÕÕÕÕÕ`]ÕÝÝÕÝÕ` ÝÝÝÝÝÝÕÕÕÝÝ]]]V ]ÝÕÕÕÕÝðmÝÝÝÝÝß]ÝÝÕÕÝÕß]]]]]]ÝÝÝÕÝÝÝÝðÕÝ]]ÝÝÝ]`ÕÕÕÕÕÕUÝ]]]ÝÕÖÝÝÝÝÝÝÕÕÕÝÕÕÕ`ÕÝ]ÝÝÝ]]Õ`ÝÝÝÝÝÝ_Ý]ÝÝÝ]ÕðÕÕÕÕÕÕÝÝÝ]ÝÝ_UÝÝÝ]]]ÝÝÝ`m]]]]]ÕÝÕÝÕÕÕÝ`]ÝÝÝÝÝÝ]]Ý]_eÝÕÕÕÝÝÝ]]]ðÝÝÝÝÝ]_]]ÝÕÝÝÝPÝ]]]]]]ÝÝ]Õ]ÕÝÝÝÕÕÝÝÝÕP]]]]]ÝÕUÝÝ]]Ý]_]ÝÝÝÝÝÝ]]Õð]ÕÝÕÝ]]ÝÕÕÕÝðýÝÝÝÕÝ]Ð]]]ÝÝ]ÖÕÕÕÕÕÕÝÝÕP]ÝÝÕÝÕÝÝ]ÝÝÝ]`ÕÕÕÝ]ÝÕe]ÝÝÕÕÝðÝÝÝÝÝÝÝ]PUÕÕÕÝÕÝÝ]Ý]]]Ý`mÝÝÝÝ]]VeÕÕÕÝÝ`UÕÕÕÕÕÕßõÝÝÝÝ]ÝÕÝÕÝÝÝÕÕ`ÕÕÕÕÝÝÕU]ÝÝ]_ ÝÝÝÝÝÕÝÕÝ]]Ý]]ÕÝÕÕÕÝÝP]ÝÝÝÕÝÝÕUÕÕÝÖUÕÕÕÕð]]ÝÕÝÝ]ÝÝ]ÕÝÝÝ]]P`ÕÕÕÝÕÕÕ`UÝÕðUÝÝÝðUÝÝÕÝÝ]Ý]]ÝÝÝ]]ÝÝPV]ÝÝ]ÝÝÝÕUUðUUðõÝÕÕÝÕÝÕÝÝÕÕÕÝÝÕÕÕPÕ]]ÝÕÕÕÝ_m]PÝÕÝÝ]]ÕÝÕÕÝÝÝÕÕÝÝÝPÝ_]ÕÕÝÝÝÝÕPm]ÝÕP]]Ý]]ÝÝ]ÕÝÝ]]]ÝÝ]]]P]ÕÝÝÕÕÕÕÝÕm]ÝÕÝP]ÝÝ]ÝÝÝ]ÝÝÝ]ÝÝÝ]]ÝÝÝPÝ]PeÕÝÝÝÝ]ÝÕÝÕÕÝÝÕeÝ]]Ý]]]Ý]]]Ý]]]ÝÕÕÕÕP]ÝÕÝÕÝ]]ÝÕÕP]ÕÝÝÕÕÝeÝ]ÝÝÕÝÝÝÕÝÝÝÕÝÝÝÕÝÝÝÝPÝ]Ý_õÝÕÝÕÕÝÝÝ`]ÕÝÕÕÝÝ]ð]ÝÝ]]ÝÕÕÕÝÕÕÕÝÕÕÕÝ]]]ÕP]Ý]ÕUÝÕÝÝÝ]]Õ`]ÕÝÝ]ÝÝ]Ýð]Ý]]ÝÝ]]ÝÝÝ]ÝÝÕÝÝÝ]ÝÝÕÝPÝ]Ý]_ÕÝÕÕÕÝÝ]Õ`eÝÝÕÝÝ]]Ý]PeÝ]ÝÕÕÝÝÝ]]]Ý]]Ý]]ÝÝ]]ÝÝP]Ý]ÝÕýÕÝÝÝÝ]ÝÝÕõÝÝ]]ÕÕÝÝ]ÝPeÝÝÝÕÝÝÕÕÕÝÝÝÕÝÝ]ÝÕÕÕÝÝ]]PÝ]Ý]ÝÕ]ÕÕÕÝÕÕÕÝUP]]]ÝÝ]ÝÕÝÕÝÐ]ÕÕÕÝÕÕÝÝÝÕÕÕÝÕÝÕÝÝÝÝÕÝÝÕP]Ý]ÕÝ]PÝÝÝÕÝÝÝ]ÝÕ`]ÝÝÝ]]ÝÕÝÕÝ]P]Ý]ÝÝÝ]ÝÝ]]]ÝÝÕÝÕÝÕÕÕÕÝÕÕÝPÝ]ÝÝÕÝÕPõUÕÝÕÕÝÝ]ÝÕ_]ÕÕÕÝÝÕÕÝÕÝÝÝ_õÝ]Ý]]]Ý]]ÝÝÝ]]Ý]]ÕÝÝÝÝ]ÝÝÕP]ÝÕÕÝÝ]ÕmÝÝ]ÝÝ]Ý]]ÝÕV]ÕÝÝÝÕÕÝÝÝ]Ý]]ÐmÝÝÕÝÝÝÕÝÝÕÕÕÝÝ]ÝÝÝÝ]]]ÕÕÕÝÐ]]ÝÝ]]Ý]Õ]]Ý]]Ý]ÝÝ]]ÕÕÝÕÕÕÝÝ]]mÝ]ÝÕÖÕÕÝÕÕÕÝÕÕÝÝÝÕÝÕÕÕÕÝÝÝÝÝÝÝ]PÝ]]ÝÝ]Ý]PÕ]ÝÝ]ÝÕÕÝÝÝÝÝ]ÝÝÝ]ÝP]ÕÕÝUýÝÝÝ]ÝÝÕÝÝÕÕÕÝ]]ÝÝÝ]]]]]]]ÝÐmÝÕÕÝÝ]ÝÝ_ÕÕÝÕÕÝÝÕÕÕÕÝÝ]]]ÝVÝÝÝÝÝÕÕÝÝ]]ÝÕÕÝÝÝÝÝÝ]]ÝÝÝÝÝÝÝÕÕÐUÝÝÝ]ÝÕÕÝPÝÕÝÝÝ]]ÝÝÝÕÕÝÝÝVÕÕÕÕÕ ÝÝÕÕÝÝ]]ÝÝÕÕÕÕÕÝÕÕÕÕÕÕÕÕÝÝPÕÕÕÝ]ÝÝÕÝ_Ý]]]ÝÝ]]]ÝÝÕÕÕ`ÝÝÝÝ]ÕÕÝÝÕÝÝÝ]]]ÝÝÝÝÕÝÝÝÝÝÝÝÝ]ÕÐmÝÝÝÕÕÕÝÕÝPÝÝÝÕÕÝÝÝ]]]Ý`]]]]ÕÝÝÕÕÝÕÕÕÝÝÝÕÕÕÕÝÝ]]]]]]]ÝÝPUÕÕÝÝÝ]ÝÕÝUUÕÝÝÕÕÝÝÝÝ`ÝÝÝÝÝð]]ÝÝÕÝÝÝÕÕÕÝÝÝÝ]]ÝÝÝÝÝÝÕÕÝÐÝÝÝ]]ÝÕÝÕÝU]Ý]]ÝÕÕÕ_]]]]]ðÝÝ]]]Ý]]]ÝÝÝ]]]ÝÝÕÕÕÕÕÕÝÝÝPõ]]ÝÕÕÝÕÝÕÝÕPõÝÝ]ÝÝß]ÝÝÝÕP]ÕÝÝÝ]ÝÝÝ]]]ÝÝÕÕÕÝÝÝÝÝÝ]]]ÐeÝÕÝÝÕÝÕÝÕÝ]_eUÕ_]ÕÕÕÝPÕÝÝÕÕÝÕÕÕÝÝÝÕÕÝÝÝÝ]]]]]ÝÝÝP]]ÕÕÝÕÝÕÝÝÝÝ]`ðeÝÝÝÝÐÝÕÕÝÝÕÝÝÝÕÕÕÝÝ]]]]ÝÝÝÝÕÕÕÝÐ]ÝÝÕÝÕÝÝ]]]ÕÝUðmÝ]]]P]]ÝÝ]]Ý]]]ÝÝÝ]ÝÝÝÝÕÕÕÕÝÝÝ]PUÝ]ÕÝÕÝÝÝÝÝÕÝ]U`õÝÝÝÝ_ÝÝ]]ÝÝ]ÝÝÝ]]]Ý]]]]ÝÕVÕÝÝÐ]ÝÝÕÝÝ]]]]]ÝÝÝUð ]]]]ÐÕÕÝÝÕÕÝÕÕÕÝÝÝÕÝÝÝÝVðmÝ]PUÝÝÕÕÝÝÝÝÝ]]ÕÝP ÝÝÝÕÖ]ÝÕÕÝÝÕÝÝÝÕÕÕÝÕÕÕÕ`]ÝÐm]]ÝÝÕÕÕÕÝÕÝÝßÕÕÕÝÕÝÝ]ÝÝ]]Ý]]]ÝÝÝ]ÝÝðÝ]Pe]]]]ÝÝÝÕÝÕÕÕÝÝÝ]]]]Ý]]ÝÝ]ÝÝÝ]]]Ý]`ÕÝßõÝÝÝÕÕÕÝÝ]ÝÝ]]]ÝÕ]ÝÕÝÝÕÕÝÕÕÕÝÝÝ]ßÝÝPUÕÝÝÝ]]Ý]]ÝÝÕÝ]UÕÝÕÕÝÝÕÝÝÝÕÕÝÕ]]ßÝÝ]]ÝÝÕÝÕÕÕÝ]Õ]ÝÝ]ÝÝ]]Ý]]]ÝÕ`ÝÝ_UÕÝÝÕÕÕÝÕß]ÝÝÝÝðeÕÝÝ]]ÝÝ]ÝÝÝ]ß]Ýß]ÕÝÕÕÝÝÝÝ]PÝÕÕÕÕðmÝÕÕÝÝÕÕÝÕÕÕÝðoÝ]_UÕÝÕÝÝ]]]]ß]ÝÝÝÝPeÕÝÝÕÕÝÝÕÝÝÝß]ÕÕÝße]ÝÝ]Ý]ÝÝÝÕÝUUfÿðUÕÕÕÕPýÝÝ]]ÝÕÕÝÕÕÕð]Ý]õÝÝ_ý]]]Ý]ÕÕÕÝÝÕÝ]ÕÝ]UUUUUUUfoÿ]ÝÝÝÝP ]]ÝÝ]ÝÝ]ÝÝß]ÕÖ]ÕÝß]ÝÝÝ]ÕÝÝÝÕÕÝÝÕÝÕÝÝÝÝÝÝÝÕÝ]ÕÕÕUUÝÝ]]]PýÝÝ]]Ý]]ÝÕÕ`]ÕÝßÕÝ]_ÕÕÕÝÝÝÕÕÕÝÝ]]ÝÕÝÕÝ]]]]]ÝÕÝÝÝÝÝÝÕÕÝÝÝÐÕÝÝÕÝÝÕÕmÕÕÝÕPÝÝÝßÝÝÝÝ]]]ÝÝÝ]ÝÝÕÝÕÝ]ÝÝÝÝÝÕÝÝ]]]]Ý]ÝÝ]]P ÝÕÕÝÕÕÝPßÝÕÕm]]]_]]]]ÝÝÝ]]]ÕÕÕÝÕÝÝÝ]]]]]]ÕÝÝÝÝÝ]Ý]]ÝÝÖÕÝÝÕÝÝ_ `]ÕÝ`]ÝÝÝß]ÝÝÝÕÕÕÝÝÕÝÝÝÕÝÝÕÕÝÝÝÝÝÝÝ]]]]]Ý]ÝÕÝ]UÝÕÕÝÕÖõðÕÝÕÝ]]]_eÕÕÕÝÝÝÕÝÝÕÕÕÝÕÕÝÝÕÕÕÕÕÕÝÝÝÝÝÝ]Ý]ÝÕÝÕ]ÝÝ]Ýð]ÕPmÕÝÝÝßõUÝÝÕÕÕÝ]]]ÝÝÝ]ÝÝ]]ÝÝÝÝÝÕÕÕÕÕÕÝÕÝÕÝÝVÝ]]Õ`ÕÕÕÝÝ]]_õeUUUÝÝÝÝÝ]]]Ý]]ÝÝ]]]]ÕÝÝÝÝÝÝÕÝÕÝÕÝ_]ÝÝßýÕPeÝÖõÝÝÖððÿfVUUUUUÕÕÝÝÝÕÝÕÝ]]]]]Ý]ÕÝ]`ÝÕÕ`UVÝÕðUÝ]VððððÿöfUUUUÝÝÝÝÝ]Ý]ÝÖð]ÝÝ`]ÝðeUðmÕÝÖððÿöfUVðÝ]]`]Ý_U`UÝÝVÕU]`UÝ]ðeVÝÕÝÖÿ`Ý]ÖÖÕÝ]V ÝÝ`]_ÝÝÝÖ ]UeÝPmÝ]]VÝÐÝÕ`]]ÝÝÖ ÕðUÕÕÝÝ]]VUUÕÝÝßý]]ÝÝÖUÝ]ÕUVVV_oöð P ÕÕð]ÝÝ]]VUÕÝ]P]ÝÝ]ÕÕÝ]Ý]ÕÕUUUeeoÿÿPõÝßýÝ]ÝÝÝÖ ÝÝ]ÝPý]]]ÕÝÝ]Ý]ÝÝÝÝÝÝÕÕÝÕÝÕÝ]P ýÖÕÕÝ]]]Vm]ÝÝ]Õ]ÝÝÝÝÕÝÝ]ÕÕÕÕÝ]]ÝÝ]ÝÕÝÕÝfõÝÝÕÝÝÝÖ]Ý]]ÝÕÝ]]]]]Ý]ÕÝÝÝÝ]ÝÝ]]ÝÕÝÕÝÐ]ÕÝÕÕÝÝ]]V]]ÝÕÕÝ]ÝÝÝÝÝ]ÝÝÕÕÕÝÝ]]ÝÕÕÝÕÝÕðUÝ]m]ÝÝÕÝÝÝÕÝÝÕÝÝÕ Ý]]]]]Ý]]]ÝÝÕÕÝÝÕÝÝÕÝÕßÝ]Ö ]ÝÕÕÝ]]]U]]Ý]]]ðÝÝÝÝÝÕÝÝÝÝ]]ÝÝÕÕÝÕÕÝÕÝ`eÝÝ_`]Ý]]ÝÝÝÝÝÕÝÝ]ÝÝÝ ÕÕÕÕÕÝÕÕÕÕÝÝ]]]ÝÕÝÝÕ ÕÝÝ]`ðÕÝÕÝÝÕÕÕÕÕÕ]]ÕÕÕÕðÝÝÝÝÝ]ÝÝÝÝÕÝÝÝÝ]Ý]]ðßÕÕÖõPUÝÕÝÕÕÝÝÝÝÝU]ÕÝÝÝÝð ]]]]]ÝÕÕÕÕÝÕÕÕÕÝ]ÝP `mÝÝP]ðUÝ]]Ý]ÝÝ]]]]ÕÝÝÕÕÕÕðÝÝÝÝÕÕÝÝÝÝ]ÝÝÝÝÕÝV`UÕÖÝ`ßUÝÝÝÝ]Ý]]ÝÝÝÝU]]]ÝÝÝð ÝÕÕÕÝÝÝ]]]ÝÕÕÕÕÝÖ]Ý`]]ð ÝÕÕÝÕÕÕÕÝ]ÝÝ]]]]Õ]ÝÝ]]]`ÕÝÝÝ]]]ÝÝÕÕÝÝÝÝ]ðÝUÝÝ`ÕÝÝÕÝÝÝÝÕÝ]]ÝÝÝÝÕÝÕÕÝÝÕ`ÝÝ]]ÝÝÝÕÕÝÝÝ]]]Ðm]ðUÕÐÝÕÕÝÕÕÕÕÝÝÝÝÕÕÕÕÕ]ÝÝÕÝÝ`]]ÝÕÕÕÕÝÝ]]]ÝÝÕPõÕßUUÕÝÝÕÝÝÝÝ]]]]ÝÝÝÝÕÝ]]]ÕÕ`ÝÝÕÝÝÝÝÝ]ÝÝÝÕÕÝõ]ÝðUUðýÝÕÕÝÝ]]]ÝÝÝÝ]]]]U]ÝÝÝ]Ý`ÕÕÝ]]]]]ÕÕÕÕÝÝU]ÝVÝ``]]ÝÝ]]ÝÝÕÕÕÕÝÝÝÝÝÕÝ]]]ÝÕ`ÝÝ]ÝÝÝÝÕÝÝÝÝÝ]Ð]Ý]ðÕ`ðUÝÝ]]ÝÝÕÕÝÝÝÝÕÕÕÕÕÕUÝÝÝ]Ý`]]Ý]]]]ÝÕÕÕÕÕÝ`Ý]ßõß`eÝÕÝÝÕÕÕÝÝ]]]]ÝÝÝÝÝÕÝÝ]]ÕÕPÝÝ]ÝÝÝÝ]]ÝÝÝÝÕð ]Ý`Ý_ ðõ]ÝÝÕÕÝÝÝÝ]ÝÝÝÝ]]]]]Um]ÝÝÝÝ`ÕÝÝ]]]]ÝÝ]]]]ÕÝUõÝÐõPÝÝ]]ÝÝ]]]]Ý]]]]ÝÝÝÝÝÝ]ÝÕÕÕÕPÝÕÕÝÝÝÝ]ÕVÝÝÕß ]ÐÝÕ`Ýf]]ÕÝÝ]]ÝÝÝÝÕÝÝÝÝÕÕÕÕÕÕUÕÝÝÝÝP]ÝÝÕÕÕÝÝVÕÝÝPÝðeÕÕ]]ÝÝ]ÕÝÝÕÕÕÕÕÝÕÕÕÕÝÝÝÝÝÝ]ÝÝ]]]PÝ]]]ÝÝÝ_ýÝÕÕð ÖÝÝÐUÝÝ]]ÝÝÕÕÝÝÝÝÝÝ]ÝÝÝÕÕÕÕÕÕUÕÝÝÝÝPÝÝÝÝ]]UðõÕÝÝÐÕÕðÝÕÝÝÕÕÕÝÝ]]]]]]Ý]]ÕÝÝÝÝÝÝ]ÝÕÕÕÕPÕÕÕÕÝÝ`ýÝÝV `õÝPmÕÝÕÕÝÝÝÝ]ÝÝÝÝÝÝ]ÝÕÝÝÕÕÕÕÕUÕÝÝÝÝPÝÝÝÝÕ`õÕÝÐ_]]ÕÝÝ]]]]ÕÕÕÕÕÕÝÕÕÝÕÕÝÝÝÝÝ]ÝÝ]]]PÕÕÕÕßýÝÕ`]ÝÝÝÝ]ÝÝÝÕÝÝÝÝÝÝÕÝÝÕÝÝÕÕÕÕÕUÕÝÝÝÝP]ÝÝÝÐõÕÝ]]]]]Ý]]]ÝÕÕÕÕÕÕÝÕÝÝÕÕÝÝÝÝÝ]ÝÕÕÕÕPÝÝ]]PýÝÖðUÝÝÝÝÝÕÝÝÝ]]ÝÝÝÝÝÕÝ]]]ÝÕÕÕÕÕUÕÝÝÝÝÐ]]ÝÝÐõÕÐ_õÝÕÕÕÕÕÝÕÕÝÝÝ]]]]]ÝÝÝÝÝ]ÝÝÝÝÝ]ÝÝ]]]PÝÝ]]PýÝ`PÝÕÝÝÝÝÝÕÝÝÕÕÕÝÝÝÝÝÕÕÕÕÕÝÕÕÕÕÕUÕÝÝÝÝÐ]ÕÝÝP ]_]]ÝÕÕÕÕÕÝÕÕÝÝÝÕÕÕÕÕÝÝÝÝÝÕÝÝÝÝÕ]ÝÝ]]]PÕÝÝ]ÐýÖýÐ]ÝÝ]]ÝÝÝÝÕÝÝÝ]]]ÝÝÝÝÕÕÕÕÕÝ]]]]_UÕÕÝÝÝP]ÕÝÕÐßU_`UÝ]]ÝÝ]]]]Ý]]]ÝÝÝ]]]]ÝÝÝÝÝÕÝÝÝÝÐmÝÝÝ]]ÐÝÝÕÝPý`]Ð Õÿõ]Ý]ÝÝ]ÕÝÝÝÝ]ÝÝÝÕÕÕÝÝÝÝÕÕÕÕÕÝÝÕÕÕ`UÕÕÝÝÕÐ]]ÝÕÐõ`ÝVÝÕÕÝ]Ý]ÝÝ]ÕÕÕÝÕÕÕÕÝÝÝÕÕÕÕÝÝÝÝÝ]]ÝÝÝðmÝÝÕÕÝPÝÕÕÝPõý]Ð ÕÝÝ]Ý]Ý]]ÝÝÝÝÕÝÝÝÝÝ]]]ÝÝÝÝ]]]]ÝÝ]]Vý]]ÝÝÝÐ]ÝÝÝÐÿmÕßÝÕÝÝ]Ý]ÝÕÕÕÕÕÝÕÕÕÕÝÝÝÝ]]]]ÝÝÝÕÕÝÝÝÐmÝÝ]]]PÝ]]]PÕÝÐ ÕÝÝ]ÝÕÝÕÝÝÝÝÝÕÝÝÝÝÕÕÕÕÝÝÝÝÕÕÕÝÝÕÕÕðý]]ÝÝÝÐ]ÝÝÝPÝ]_õÝ]]Ý]ÝÕÝ]]]]]Ý]]]]ÝÝÝÝÕÕÕÕÝÝÝ]]ÝÝßmÝÝ]]]PÝÕÕÕÐ ]ÝßÝ]ÝÝ]ÕÕÝ]ÝÝÝÝÝ]ÝÝÝÝ]]]]]ÝÝÝÝ]]ÝÝ]Uðý]ÝÝÝÝP]ÝÝÝÐmÕÕß]]Ý]]ÝÝÝÕÝ]]]]]Ý]]]]ÝÝÝÝÝ]]]]ÝÕÕÝÝðmÝ]]]]ÐÝ]]]PÕÝÝÐ]ÝÝ]ÝÝÕÕÕÝÝÝÝÝÝÝ]ÝÝÝÝÕÕÕÕÕÝÝÝÝÕÝÝÕ`ÝÝÝÝÕÐ]ÝÝÝP]ÕÕßeÕÕÝÝ]]ÝÝÝ]]]]]]]Ý]]]]ÝÝÝÝÝÕÕÕÕÝ]]ßýÕÕÕÕÝPÝÕÕÕÐ ÝÝÝ_õÝÝÝÕÕÝÝ]]]ÝÝÝÝÝÝÝ]ÝÝÝÝ]]]]]]ÝÝÝ]ÝÖ ]ÝÝÝÝÐ]ÝÝÝÐõÕÕÝÕm]]]ÝÝÕÝÝÝÕÕÕÕÕÕÕÝÝ]]]]ÝÝÝÝÝÝ]]ÝÝ]ðýÝÝ]]]PÝ]]]P]ÝÝÝ]ÝÝÝÝ]]]ÕÕÕÝÝÝÝÝÝÝÕÕÝÝÝÝÕÕÕÕÕÕÝÝ]]`ÕÕÝÝÝÐ]ÝÝÝPÝ]]]Ý]]]]ÝÝÝ]ÝÝ]]]]]]]ÝÝÕÕÕÕÝÝÝÝÝÝÕÝÝVÝÝÝ]]PÝÕÕÕÐÕÝÝÝÕÝÝÝÝ]]]ÝÝ]ÝÝÝÝÝÝÝ]]]ÝÝÝÕÕÕÕÕÕÝ]V ]]]ÝÝP]]ÝÝÐõÝÕÕÕÝÕÕÕÝÝÝÕÕÕÝ]]]]]]]ÝÝÝ]]ÕÝÝÝÝÝÝÝÕ`] ÝÝÝ]]ÐÝÝÝ]P]Ý]ÝÝÝ]ÝÝÕÕÕÝÝÝÝÝÝÝÝÝÝÝÕÕÕÝÕÝÝÕÕÕÕÕÕðUÝ`ÕÝ]ÝÕÐ]]]ÝP]]Ý]]]Ý]]ÝÝÝ]]]]]]]]]]]ÝÝÝÕÝÕÕÝÝÝÝÝ_eÝÕP Ý]ÝÕÝP]ÝÝÕÐÝÝÕÝÝÝ]ÝÝ]]]ÝÝÝÝÝÝÝÝÝÝÝÕÕÕÝÕÝÝÝ]]]_õÝÕÝPÝÝ]ÝÝÐÝ]]]ÐÕÕÝÕÕÝÕÕÝÝÝÕÕÕÕÕÕÕÕÕÕÕÕÝÝÝÕÝÕÕÕÝÝÖÝ]Ý]Ð ÕÕÝ]]PÕÝÝÝP]ÝÝÝ]ÝÕÝÝÕÕÕÝÝÝÝÝÝÝÝÝÝÝÝÕÕÕÝÝ]ÝÝÝÕð]]Ý]ÝPÝÝÕÝÝß]ÕÕÝPeÝ]]]Ý]Ý]]ÝÝÝ]]]]]]]]]]]]ÝÝÝ]]Ý]]]`]ÝÕÕÝ]ß ÕÕÝÝ]PÕÝÝÕÐeÝÝÝÝÝ]Ý]ÝÝ]]]ÝÝÝÝÝÝÝÝÝÝÝÝ]]]ÝÝÕÝÝß]ÕÕÝÝÝÕÖÝÝ]]Ýß]ÕÕÝÐ]ÕÕÕÕÝÕÕÝ]]ÝÝÕÕÕÕÕÕÕÕÕÕÕÕÝÝÝÕÕÕÝÕÖÕÝÝ]]]ÝÖ ]]ÝÕÝ_UÝÝÝP]ÕÝÝÝÝÕÝÝ]ÝÝÕÕÝÝÝÝÝÝÝÝÝÝÝÝÕÕÕÝÝÝÕÕðõ]ÝÝ]ÝÝÝ]UÝÝ]ÝÕß]ÕÕÕß]ÝÝÕÕÕÕÝÕÝÝ]]ÝÝ]]]]]]]]]]]]ÝÝÝ]]]Ý`]Ý]]Ý]]ÕÝÝ Ý]ÝÕÝßUÝÝÝÝÕÝ]]ÝÝÝÕÝÝ]ÝÝ]]ÝÝÝÝÝÝÝÝÝÝÝÝ]]]ÝÝÝ_]Ý]ÝÝ]ÝÕÝÝ]ÕÝ]ÝÕÖ]ÕÕÕÕÝÕÝÝ]]]Ý]]Ý]]ÝÕÕÕÕÕÕÕÕÕÕÕÕÝÝÝÕÕÕßUÝ]Ý]]Ý]ÝÕÝÝÝÝÝ]]Ö]ÝÝÝÝÕÝÝÕÝÝÝ]ÝÝÕÝÝÕÝÝÝÝÝÝÝÝÝÝÝÝÕÕÕÝÝÕ]]ÝÝ]ÝÝÕÝÕÝÕÕ ]]]ÝÝV]]]]]ÝÕÕÝÕÕÝÕÕÕÝÕÕÝÕÕÕÕÕÕÕÕÕÕÕÕÝÝÝ]]ðÕÝ]ÝÝ]]ÝÕÝÕÝÝ ÝÝÝ]]Ö]ÝÝÝÝ]]ÝÕÝÝÕÝÝÝÝ]ÝÝ]ÝÝÝÝÝÝÝÝÝÝÝÝ]]ÝPÝÝÝÕÕÕÝÝ]]ÕÝÕÕÕÕÝÝÝUUÕÕÕÝÝÝ]ÝÕÕÝÕÕÕÝÝ]]Ý]]]]]]]]]]]]ÝÕß]]]]ÝÝÝÕÝÝÝ]ÕÝÝÝÝÕÕÕÖ]ÝÝÝ]]]Ý]]ÝÝ]ÝÝÕÕÝÝÕÝÝÝÝÝÝÝÝÝÝÝÝÕÖ]ÝÝÝÝÕÕÕÝ]]]ÝÝÝ]ÕÕÝÝÝÖ]]]]ÝÝÕÝÝÝ]]Ý]]ÝÝÕÕÝÕÕÕÕÕÕÕÕÕÕÕÕÝðUÝ]]]]]ÝÝÝÝÝÕÕÕÝÕÝÝÕÝ]UmÝÝÝÕÕÝÕÕÕÝÝ]ÝÝ]]]ÝÝ]ÝÝÝÝÝÝÝÝÝÝÝ`eÝ]ÝÝÝÝÝÕÕÕÕÕÝÝÝÕÝÕÝÝÕÝÖeÕÕÕÝÝ]ÝÝÝÕÝÝ]]ÝÝÕÕÝÝ]]]]]]]]]]_õÝÝÝ]]]]]ÝÝÝÝÝ]]]]ÕÝÕÕÝÕÕmÝÝÝÝ]ÝÕÕÕÝÕÕÝÝÕÕÝÝÕÕÝÝÝÝÝÝÝÝÝÖ]ÕÕÕÝÝÝÝÝ]]]]]ÝÝÝÝÝ]ÝÝ]ÝÕeÕÕÕÝÕÕÝÝÝ]ÝÝÕÕÝÝ]]ÝÝÕÕÕÕÕÕÕÕÕ]Ý]ÝÝ]]]]]ÝÝÝÝÕÕÕÕÕÕÝ]]Ý]UmÝÝÝÕÝÝÝ]]Ý]]]ÝÝ]ÝÝ]]]ÝÝÝÝÝÝÝðUÝ]Ý]]ÝÝÝÝÝÕÕÕÕÝÝÝÝÝÝÕÝÝ]ÝÕeÕÕÕÝÕÕÕÝÝ]ÝÝÝ]]Ý]]ÝÝÝ]]]]]]`eÝÕÝ]ÝÕÕÕÕÕÕÝÝÝÝ]]]]]]ÝÝ]ÝÕÕmÝÝÝÝ]ÝÝÕÕÝÕÕÕÝÝÕÝÝÕÕÕÝÝÝÝÝßeÝÕÝÝÝÕÝÝÝÝÝÝÝ]]]ÝÝÝÝÝÝ]]Ý]ÝUeÕÕÕÝÕÕÝÝÝÕÝÝÝÕÕÝÕÕÝÝÝÕÕÕÕÖ]ÕÝÕÕÕÝÕÕÕÕÕÕÝÝÝÕÕÕÕÕÕÕÝÝ]Ý]ÕmÝÝÝÕÝÝ]]]]Ý]]]ÝÝ]ÝÝ]]]ÝÝÝð]ÕÝÝ]ÝÝÝ]ÝÝÝÝÝÕÕÕÝÝÝÝÝÝÝ]ÕÝ]ÝUeÕÕÕÝÕÝÝÝÝÕÝÝÝÝ]]Ý]]ÝÝÝ]]`]ÝÝÕÝÝ]]]Ý]]]]]ÝÝÝ]]]]]]]ÕÝÝÝ]ÕmÝÝÝÕÝÕÕÕÕÝÕÕÕÕÝÝÕÝÝÕÕÕÝ_mÕÕÕÝÕÕÝÝÝÕÝÝÝÝÝ]]]ÝÝÝÝÝÝÝÝÕÕÝÝÝõÕÕÝ]ÕÝÝÝÝ]ÝÝÝÝ]]ÝÕÕÝÝÝÖm]ÝÝÝ]ÝÝÕÕÕÝÕÕÕÕÝÝÝÕÕÕÕÕÕÕÕÝ]ÝÕÕÕýÝÝ]ÝÝÕÝ]]Ý]]]]ÝÝ]]ÝÝ]Uðe]Ý]]]Ý]]]ÝÝÝ]ÝÝÝÕÕÕÝÝÝÝÝÝÝÝ]Ý]ÝÝÝõÕÝÝ]]ÝÕÝÝ]ÝÝÝÕÕÝÝÝ]]Ýð]Ý]ÝÝÕÝÝÝÝ]]]Ý]]]ÝÝÝ]]]]]]]]Ý]ÕÕÕÕýÝÕÕÝÝÕÝÕÕÝÕÕÕÝÝÕÕÕÝÝP]ÝÝÝÕÕÝÕÕÕÕÝÝÝ]ÝÝÝ]]]ÝÝÝÝÝÝÝÝ]ÝÝÝÝÝõÕÝÝÕÕÝÕÝÝÕÝÝÝ]]ÝÝÝÕß]ÕÕÕÕÝÝÕÝÝÝÝÕÕÝÝ]]]ÝÝÕÕÕÕÕÕÕÕÕÝÕÕÕÕÕýÝÕÝ]ÝÕÝÝ]]Ý]]ÝÝÕÕÕÖ]ÕÝÝÝÝÝ]]Ý]]]]ÝÕÕÝÝÝÕÕÝÝÝÝÝÝÝÝÝ]ÝÝÝÝÕõÕÝÕÝ]Ý]]ÝÝ]ÝÕÕÕÝÝÝðõ]ÝÕÕÕÕÝÝÝ]ÝÝÝÝ]ÝÝÕÕÕÝÝ]]]]]]]]]ÕÕÕÕÕÝýÝÕÝÝÝ]ÝÝÕÕÝÕÝÝÝÕÕ`]Ý]]ÝÝÝ]]]Ý]]]]Ý]]]ÝÝÝ]ÝÝÝÝÝÝÝÝÝÝÝÝÝÝ]õÝÝÕÕÝÕÕÕÝÝÕÝ]]]ÝßÕÝ]ÝÝ]]ÝÝÝÕÝÝÝÝÕÝÝÝÝ]]]Ý]]]]]]]]]]]]]]Õý]]]Ý]]ÝÝÕÕÝ]ÝÝÝVÕÝÝÝÕÕÝÕÕÕÕÝÕÕÕÕÝÕÕÕÕÝÝÝÕÝÝÝÝÝÝÝÝÝÝÝÝÝÝ]ýÝÝÝ]ÝÝ]]ÝÝÕÝ]]U`UÝ]]]ÝÝÕÝÝÝÝ]ÝÝÝÝ]ÝÝÝÝÕÕÕÝÕÕÕÕÕÕÕÕÕ]]]]]Ý ]]]Ý]ÕÝÝÕÕÝÝÝÝPUÝ]ÝÝÕÕÕÝÝ]]]Ý]]]]Ý]]]]]ÝÝÝ]ÝÝÝÝÝÝÝÝÝÝÝÝÕÕÝÝÝ]Ý]ÕÕÝÝÕÕÕPõÝÝÝ]]ÝÝÝ]]ÝÝÕÝÝÝÝÕÝÝÝÝÝÝ]]]Ý]]]]]]]]ÕÕÕÕÝÝ Ý]]Ý]ÝÝÝÝ]]ÝÖ]ÕÕÕÝÝ]]]ÝÝÕÕÝÕÕÕÕÝÕÕÕÕÕÕÝÝÝÕÝÝÝÝÝÝÝÝÝÝÝÝ]]ÝÝÕÝÝ]]]]ÝÝUÝÝ]ÝÝÕÝÝÝÕÕÕÝÝÕÝÝÝÝ]ÝÝÝÝÝÝÕÕÕÝÕÕÕÕÕÕÕÕ]]]]ÝÕ ÕÕÝÕÕÝÝÝÝÕÕ`]]]ÝÕÕÝÕÕÕÝÝÝÕÕÝÝ]]]Ý]]]]]]]ÝÝÝ]ÝÝÝÝÝÝÝÝÝÝÝ]ÝÝÝÕÝÝÕÕÕÕÝ`eÝÝÝ]ÝÝ]ÝÝÝ]]]ÝÝ]]ÝÝÕÝÝÝÝÝÝÝÝ]]]Ý]]]]]]]ÕÕÕÕÝÕ ÕÕÝÝ]]ÝÝÝßeÝÝÕÕÝ]]Ý]]]ÝÝÝ]]ÝÝÕÕÝÕÕÕÕÕÕÕÕÝÝÝÕÝÝÝÝÝÝÝÝÝÝÝÕÝÝÝ]]ÝÝ]]U]ÕÕÝÝÕÝÝ]ÝÝÕÕÕÝÝÕÕÕÝÝÕÝÝÝÝÝÝÝÝÕÕÕÝÕÕÕÕÕÕÕ]]]]]Õ]]ÝÝÕÕÝÕ]ÕÝÝÕÕÝÝ]ÝÕÕÝÝÝÕÕÝÝÝÝ]]Ý]]]]]]]]ÝÝÝ]ÝÝÝÝÝÝÝÝÝÝÝ]ÝÕÕÕÝÝÕð]ÝÝÕÕÝÝÕÝÕÕÝÝ]]]ÝÝ]]]]ÝÝ]ÝÝÝÝÝÝÝÝ]]]Ý]]]]]]]]]]]ÝUÝÝÝÝVð]Ý]]]ÝÝ]]ÕÝÝÝ]ÝÝÝ]]ÝÝÝÝÕÕÝÕÕÕÕÕÕÕÕÝÝÝÕÝÝÝÝÝÝÝÝÝÝÕÕ]]]_m]]ÝÝÝ]]ÝÝ]ÕÕÝÕÕÕÝÝÕÕÕÕÕÝÝÕÝÝÝÝÝÝÝÝÕÕÕÝÕÕÕÕÕÕÕÕÕÕÝÝoeÕÝÝÕÕÕÝÝ]]ÕÝÝÕÝÝÝÕÕÝÝÝÝÝÝ]]Ý]]]]]]]]ÝÝÝ]ÝÝÝÝÝ]ÝÝÝ]]]ÝÕÕÝÝÝÕÝÝÝÝÕÕÝ]]]ÝÝ]]]]]]ÝÝ]ÝÝÝÝÝÝÝÝ]]]Ý]]]]]ÕÝ]]ÝÕ]ÝÝ]ÝÝ]]]Ý]]]]Ý]ÝÝÝ]]ÝÝÝÝÝÝÕÕÝÕÕÕÕÕÕÕÕÝÝÝÕÝÝÝÝÝ]ÝÝÝ]Ýð]ÕÕÕÝ]]ÝÝ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»½]]ÝÕÕÕÕÕÝ]]]Ý]]ÕÝÝÝÝÝÝ]]»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»½ÝÝ]]ÝÝÝÝ]ÝÝÕÝÕ`õÕÝÕÕÕÕÕÝÝÝ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»½]]ÝÝ]]]]ÝÕÕÝÕÝÕÝÝ]ÝÝÝÝÝ]]»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»µÝÝÕÕÝÝÝÝ]]ÝÕÝ]ð]Ý]]Ý]]]]]ÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÕÕÕÕ]ÝÕÝ]Ý]Ý]ÝÝÕÝÝÝÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÝ]]ÝÝÝÕÕÝÝÝ]`eÝ]ÕÕÕÝÕÕÕÕÝÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝ]]]ÝÝÝ]]Õ`UÝÝÕÝÝÝÝ]ÝÝÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÕÕÕÝÝÝ]]]ÝÝÝ`ÝÕÕÝÕÕÕÝÝ]]]]ÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÕÕÕ]ÝÝ]]]ðÝ]]ÝÕÝÝÝÕÕÝÝÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÝ]]]ÝÝÕÕÝÝÝÕPUÝÝÝ]ÝÕÕÕÝÝÕÕÕÝÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÝ]]ÝÝÕÕÕÝð]ÝÝ]]Ý]]ÝÝÝ]]ÝÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÕÕÕÕÝÝ]]ÝÝÝ]`eÝ]]ÝÝ]ÝÝ]]]ÝÝ]]]ÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÝÕÕ]Ý]]]Ý`õÝ]ÝÝ]]ÝÕÕÝÝÝÕÕÝÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÝ]]]]Ý]]ÝÝÕÕ`]ÝÝ]]ÝÕÕÝÝÕÕÕÝÝÕÕÝÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÝÝ]]ÝÕÕÝÝUÝÝÕÕÝÝÕÝÝÝ]]ÝÝÝ]]ÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÕÕÕÕÕÝUÕÝÝÕÝÕÕÕÝÝÕÕÝÕÕÝÝÝ]]]ÝÝ]]ÝÝ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÝÝÕ]ÝÝ]]ÕÝÝÝÕÕÝÝÕÝÝÕÕÕÝÝÝÕÕÝÝ]]»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÝ]]]]]UÕÝÝÝ]ÕÕÝÝÝ]]Ý]]ÝÝÝÕÕÕÝÝÕÝÝÕ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÝÝÝ]Ý]]]ÕÝÝ]]]ÝÝ]ÝÝ]]]]ÝÝÕÕÝÕÕÝ»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÕÕÕÕÕÕ]]ÝÝÝÝÕÝÝÝÕÕÝÕÕÝÝÝÝÝ]]ÝÝÕÝÝÕ»»""""""""""""""""""""""""""+»½ÕÕÝÝÝÝÝ`]ÝÕÕÕÕÝÕÕÕÝÝÕÝÝÕÕÕÕÕÝÝÕÕÝÕÕÝ»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»µÝÝÝ]]U`UÕÝÝÝÝ]ÝÝÝ]]Ý]]ÝÝÝÝÝÕÕÝÝÕÝÝÕ»»"332""£33"¡4븗"337"λ‰r"+»½ÕÕÝÝÕ`mÝÝ]]]Ý]]]ÝÝ]ÝÝ]]]]]]ÝÕÕÝÕÕÝ»»ª»»êªª›»¾¡K»»»¾:»»çt»»»»ãª«»µÝÝ]Vý]]ÝÝÕÝÝÝÕÕÝÕÕÝÝÝÝÝÝÝ]ÝÝ]ÝÝÕ»»"»»²"'ë»»t»»»»»³»»±K»»»»»‚+»½ÕÝÖÝÝÕÕÝÕÕÕÝÝÕÝÝÝ]]]]]]Ý]]ÝÕÕÝ»»ª»»ºª¬»»»;»»™›»»»»³»»¹™ë»±«»µÝ_ÕÕÝÝÕÝÝÝ]]Ý]]]ÝÝÝÝÝÕÝÝÕÕÝÝÕ»»"»»²"›»»»»»·"!»»»»¾»»"{»¸+»½oÝÝÕÕÝÝ]]ÝÝÕÝÝÝÕÕÕÕÕÝÕÕÝÝÕÕÝ»»ª»»º§»»»»»»Êª§»»»»»»¼ªª{»»«»°]]ÝÝ]]ÝÕÕÕÝÕÕÕÝÝÝÝÝ]ÝÝ]]ÝÝÕ»»"»»²¬»»»»§w¢"¨»»»»·ww"*;»»+»°mÝ]]ÝÝÕÝÝÝÝ]ÝÝÝ]]]]Ý]]ÝÝÕÕÝ»»ª»»º›»»»»ªª§˜»»»»»·ªªy‹»»³«»°ÝÝÕÕÕÝÕÕÕÝÝ]]]ÝÝÝÕÝÝÕÕÕÝÝÕ»»"»»·»»È»»"¡K»»»»»»·*»»»»·+»°ÕÕÝÝÝÝ]ÝÝÕÕÝÝÝÕÕÕÝÝ]]ÝÝÕÕÝ»»ª»»¸»»s»»§K»»»»±»»·|»»»»»š«»°]Ý]]]]Ý]]ÝÝÕÕÕÝÝÝ]]ÝÝ]]ÝÝÕ»»"»»»»¹#»»®»»»»³r»»·K»»»»7"+»°ý]ÝÝÝÝ]ÝÝ]]]ÝÝÝ]]ÝÝÕÕÝÝÕÕÝ»»ª»»»»Ê£»»›»»¾1zª»»¹»»»ãªª«»°ÕÕÕÕÝÕÕÝÝÝÝ]]]ÝÕÕÕÝÝÕÕÝÝÕ»»"»»»»r#»»;»¹r'w»»³»»—"qz+»°]ÝÝÝÕÝÝÕÕÕÕÝÝÝÕÝÝÝÝ]]ÝÕÕÝ»»ª»»»³ª£»»;»·ª¬»»»»³»»zª‹»·«»°]]]Ý]]ÝÝÝÝÕÕÕÝ]]]]ÝÝ]ÝÝÕ»»"»»»ê"#»»»³w;»¾»»¹»»‡s»»º+»°ÝÝÝ]ÝÝ]]]]]ÝÝ]ÝÝÝÝÕÕÝÕÕÝ»»ª»»»ª£»»¬»»»»»¹»»·‹»»»»»š«»°]]Ý]]ÝÝÝÝÝ]ÝÝ]]]]ÝÝÕÝÝÕ»»"»»³""#»»'Ë»»»»’»»·¨»»»»¹"+»°]Ý]ÝÝ]]]]]ÕÕÕÝÝÝÝ]]]ÕÕÝ»»ª83Šªª©ƒ3ª¡<»¸—ª337ªË»‰zª«»°ÝÕÕÝÝÝÝÝÝÝÝÝÕÕÕÝÝÝÝ]ÝÕ»»""""""""""""""""""""""""""+»°õÝÝÝ]]]]]]]]]ÝÝÝ]]]ÝÕÝ»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°]]]ÝÝÝÝÝÝÝÝÝ]]]ÝÝÕÕÝÕ»»""""""""""""""""""""""""""+»°]ÝÕÕÕÕÕÕÕÕÕÝÝÝÕÕÝÝÕÝ»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°]]ÝÝÝÝÝÝÝÝÕÕÕÝÝÕÕÝÕ»»""""""""""""""""""""""""""+»°]Ý]]]]]]]]ÝÝÝ]]ÝÕÝ»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°eÝÝÝÝÝÝÝÝ]]]ÝÝ]ÝÕ»»""""""""""""""""""""""""""+»°UÕÕÕÕÕÕÝÝÝ]]ÝÕÝ»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°eÝÝÝÝÕÕÝÝÕÕÝÕ»»""""""""""""""""""""""""""+»°ÿfU]ÝÕÕÝÝUU»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°»»""""""""""""""""""""""""""+»°»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°»»""""""""""""""""""""""""""+»°»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°»»""""""""""""""""""""""""""+»°»»ªªªªªªªªªªªªªªªªªªªªªªªªªª«»°»»""""""""""""""""""""""""""+»°»»»¾»ë¾»ë¾»ë¾»ë¾»ë¾»ë¾»ë¾»ë»»»°»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»°»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»°»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»°nsis-3.11/Contrib/Graphics/Wizard/nsis3-branding.bmp000077500000000000000000004556601477201124000223540ustar00rootroot00000000000000BM°[6(¤:z[ . .Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vh}˜s‡™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‡™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‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v“lÊ·ÁñìïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`v‹awîèëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`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Š`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Š`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Š`vŒbxðëîøö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷øö÷Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v”m­¸ØÊÑÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕÛÎÕŠ`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vdyðëîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`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Š`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Š`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Š`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Š`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¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÚß¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œª¶œªŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÄÌŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vdyŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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¨‰™ûùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùú¨‰™Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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¨‰™ûùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùú¨‰™Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÄÌŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÄÌŠ`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Š`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Š`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Š`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Š`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Š`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Š`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®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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´™§þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vi~‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘jϾÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾǑj‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘jh}Š`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Š`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¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÄÌŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÞ㽦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²i~Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`vi~½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²½¦²Š`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Š`vŠ`vŠ`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™t‡Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v™t‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`vŠ`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™t‡Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v™t‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`vŠ`vŠ`vŠ`v¶œªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™t‡Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v™t‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`vŠ`vŠ`vŠ`v¦…–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™t‡Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v™t‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`vŠ`vŠ`vŠ`v‹awêâæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™t‡Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v™t‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`všv‰îéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™t‡Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v™t‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŽezµš¨Ê·Á̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Òk€Š`vŠ`v̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`vŠ`v’k€ÌºÃ̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ã̺Ê`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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̺Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̺Ê`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v‘i~¦‡—¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡¯’¡§‡˜’kŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Á«¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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ÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ´¾Š`vŠ`vŠ`vg|‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘jh}Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿȵ¿Š`vŸ|Žöóôÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`v¨‰™ûùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`v«—q…ŠawϾÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿȵ¿Š`vŸ|Žöóôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`v¨‰™ûùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`v®‘ ýüüïéì—q…ŠawϾÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿȵ¿Š`vŸ|Žöóôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`v¨‰™ûùúÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`v®‘ ýüüÿÿÿÿÿÿïéì—q…ŠawϾÇÿÿÿÿÿÿÿÿÿÿÿÿñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîȵ¿Š`vŸ|Žöóôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`v¨‰™ûùúÿÿÿÿÿÿýüü®‘ Š`v®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ŠawϾÇÿÿÿÿÿÿÿÿÿñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vº¡®Š`vŸ|Žöóôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`v¨‰™ûùúýüü®‘ Š`v®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ŠawϾÇÿÿÿÿÿÿñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŸ|Žöóôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ´™§Š`v¨‰™®‘ Š`v®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ŠawϾÇÿÿÿñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v“l™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡—r†Š`vŠ`vŠ`v®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ŠawϾÇñìîŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v–q… ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~zŠ`vŠ`v®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…ŠawÁª¶Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`v—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`v®‘ ýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïéì—q…Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÁª¶Šaw—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`vŠ`vz ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~–q…Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîϾNJaw—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`vŠ`vŠ`v—r†™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡™t‡“lŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿϾNJaw—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿϾNJaw—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿϾNJaw—q…ïéìÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿÿÿÿϾNJaw—q…ïéìÿÿÿÿÿÿýüü®‘ Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJaw—q…ïéìýüü®‘ Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿϾNJaw—q…«Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vñìîÿÿÿÿÿÿÿÿÿÿÿÿýüü®‘ Š`vŠ`vh}‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘jg|Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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ÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`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Š`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Š`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Š`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ‘jŠ`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vÿÿÿÿÿÿÿÿÿÿÿÿ˜s‡‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘j‘jÿÿÿÿÿÿÿÿÿÿÿÿŠ`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`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Š`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vŠ`vnsis-3.11/Contrib/Graphics/Wizard/nsis3-grey.bmp000077500000000000000000001451701477201124000215260ustar00rootroot00000000000000BMxÊN(¤:*É . .FFÿÿÿþþþýýýüüüûûûøøøöööõõõôôôñññðððïïïîîîíííìììèèèåååâââØØØÕÕÕÐÐÐËËËÉÉÉÈÈÈÅÅÅÄÄÄÃÃÿ¿¿½½½¼¼¼»»»¸¸¸µµµ´´´°°°®®®­­­«««¨¨¨§§§¥¥¥¤¤¤¢¢¢¡¡¡   ŸŸŸžžž›››ššš™™™˜˜˜–––•••‘‘‘ŽŽŽŠŠŠ‰‰‰ˆˆˆ‡‡‡†††„„„ƒƒƒ‚‚‚€€€DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD?8777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777DDDDDDDDDDDDDDD; DDDDDDDDDDDDDD4DDDDDDDDDDDDDC DDDDDDDDDDDDD0DDDDDDDDDDDDD&DDDDDDDDDDDDD&(333333333333333333333333333333333333333333333330DDDDDDDDDDDDD()DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDB DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD2DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDA DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD*DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD0 0DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD00DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD00DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD//DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD++DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'(DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD''DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD&'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$$DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$$DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$$DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$$DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD>============================?DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD">DDDD>DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"7DDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"7DDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"7DDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.7DDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC7DDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD6 7DDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@#-&&&&&&&&&&&&&&&&&-=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDD40D!+DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD+DDDDDDDDDDDDDDDDDD40D'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDDDDDDDDDDDDDD40D'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDDDDDDDDDDDD40D'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDDDDDDDDDD40D'D0DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDDDDDDDD40D'D' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDDDDDD40D'D' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDDDD40D'D' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDDD40D'D' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD $DDD4,,,,,,,,,,,,,,,,3DDD' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD DDD?================?DD' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4%D+'D' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4$D+'D' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4$D+'DD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4$D+'D)9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4$D+'D' 9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4$D+'D' 9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D4$D+'D' 9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD!D4$D+'D' 9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDD4$D+'D' 9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDD;77777777777777779DDD' 9D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDD:33333333333333335DD' 9DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDD9 'D' 9DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDD9 'DD53333333333333333:DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9 'DDD97777777777777777;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9 'D'+D$4DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9 'D'+D$4D!DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9 'D'+D$4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9 'D'+D$4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9 'D'+D$4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD D9)D'+D$4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD DD'+D$4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'D'+D$4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'D'+D%4D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'DD?================?DDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'DDD3,,,,,,,,,,,,,,,,4DDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'D'D04DDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'D'D04DDDDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'D'D04DDDDDDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD 'D'D04DDDDDDDDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD0D'D04DDDDDDDDDDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDD'D04DDDDDDDDDDDDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDD'D04DDDDDDDDDDDDDDDD$ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDD'D04DDDDDDDDDDDDDDDDDD+DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDD+!D04DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD8====================================================DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDnsis-3.11/Contrib/Graphics/Wizard/nsis3-metro.bmp000077500000000000000000004556601477201124000217160ustar00rootroot00000000000000BM°[6(¤:z[ . .×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÙ ܈܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÚƒí‹úïáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×xÞ-üóéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×yùëÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×xß•6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×xä¢Pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×xä¢PÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùëÙãŸJß‘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à•7ðÍ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×xã Ký÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðâŸI×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xØzúîßý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ð×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÚƒê¹{òÒªóÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°óÕ°×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xß“3üõìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xØ{úîßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xâœDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöàÄæ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`æ«`×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xØ{×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xà•7úðâà•7×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xà•7ýøñÿÿÿýøñà•7×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xà•7ýøñÿÿÿÿÿÿÿÿÿýøñà•7×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xà—;ýøñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøñà—:×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöã K×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xä£Qþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüå¨[×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÙÚ€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€ïÈ—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ù ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÍ ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ãÊé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pÙ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×xÙé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³pé³p×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܉ ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x܉ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܉ ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x܉ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xæ«`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܉ ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x܉ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xà˜<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܉ ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x܉ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×yøçÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܉ ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x܉ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÜ‹#ùìÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܉ ×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x܉ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xØ|æ©]í‹îÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄÚ‚×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×xÚ‚îÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xîÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÄ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xë»~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¹{×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xß‘0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß”5×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xè°jþû÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûøé´q×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÙ€á™>ä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pä¢Pá™?Ú×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÞ-ß•6×xç°iý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðüôêá›B×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xá›B×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÞ-üôëýøñà•7×xê¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúíÝå¨[×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿýøñà•7×xê¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿþýå¨[×x×x×x×x×x×x×x×x×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿýøñà•7×xê¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿþýå¨[×x×x×x×x×x×x×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøñà•7×xê¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xà•7×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøñà•7×xê¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡NùëÚ×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøñà•7×xê¸xÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøñà•7×xê¸xÿÿÿþüúã¡N×xã¡Nþüúÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøñà•7×xê¶vã¡N×xã¡Nþüúÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×x×x×xÞ-áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@ß’1×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ쿆×x×x×xÙ~ Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ù ×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÀˆ×xÞ-å¦W×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÀˆ×xÞ-üôëÿþýå¨[×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿìÀˆ×xÞ-üôëÿÿÿÿÿÿÿþýå¨[×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×xîÅ’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿìÀˆ×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xâžHÛ‡×yïÈ—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿìÀˆ×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡NþüúúìÜÛ‡×yïÈ—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿìÀˆ×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×xá›Bþúöÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡NþüúÿÿÿÿÿÿúìÜÛ‡×yïÈ—ÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàìÀˆ×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×xá›Bþúöÿÿÿÿÿÿþüúã¡N×xã¡NþüúÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡×yïÈ—ÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xç°i×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×xá›Bþúöþüúã¡N×xã¡NþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡×yïÈ—ÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×xÞ-üôëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýå¨[×xá›Bã¡N×xã¡NþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡×yïÈ—ÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×xÚƒ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܇×x×x×xã¡NþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡×yïÈ—úïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×xۆߑ0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ÞŽ*×x×xã¡NþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡×yê·w×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×xÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡NþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÜÛ‡×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xê·w×yÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×xÞŽ*ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0ß‘0Û†×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàïÈ—×yÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×x܇܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ ܉ Úƒ×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿïÈ—×yÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Ná›B×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿïÈ—×yÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúþúöá›B×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×xç°i×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿïÈ—×yÛ‡úìÜÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúÿÿÿÿÿÿþúöá›B×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×xìÀˆúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×yÛ‡úìÜÿÿÿÿÿÿþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×xìÀˆÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×yÛ‡úìÜþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×xìÀˆÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÈ—×yÛ‡âžH×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×xìÀˆÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÅ’×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×xå¨[ÿþýÿÿÿÿÿÿüôëÞ-×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×xå¨[ÿþýüôëÞ-×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöá›B×xå¦WÞ-×xìÀˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿÿÿÿþüúã¡N×x×xÙ Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ù~ ×x×x×x쿆ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿÿÿÿþüúã¡N×x×x×xß’1áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@áš@Þ-×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿÿÿÿþüúã¡N×xã¡Nê¶v×xà•7ýøñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàÿÿÿþüúã¡N×xã¡Nþüúÿÿÿê¸x×xà•7ýøñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xúïàþüúã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿê¸x×xà•7ýøñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xùëÚã¡N×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸x×xà•7ýøñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xà•7×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸x×xà•7ýøñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×x×x×x×x×x×x×xå¨[ÿþýÿÿÿúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸x×xà•7ýøñÿÿÿÿÿÿÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×x×x×x×x×x×x×x×x×xå¨[ÿþýúïà×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸x×xà•7ýøñÿÿÿÿÿÿüôëÞ-×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xå¨[úíÝ×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×xã¡Nþüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¸x×xà•7ýøñüôëÞ-×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xá›B×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×xá›Büôêý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðý÷ðç°i×xß•6Þ-×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÚ€×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿ܈Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€Ú€ÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×x×xnsis-3.11/Contrib/Graphics/Wizard/nsis3-vintage.bmp000077500000000000000000001453201477201124000222120ustar00rootroot00000000000000BMÐʦ(¤:*É . .\\ëßàéÝÞâÑÒçÙÚéÜÝèÛÜçÚÛŽOQRTQS”XZ–\^—^`ÙÄÅÝÊË\]]_` a ddeffghiimn o!p!#p"#r%&w,-y/0{23{34}56~78899:<=‚=>‚>?„@A…AC„AB†CE‡EGŠIK‹JLŒLN‹KM™abŸjk kl¤qr¤rs¨xy§wx©yz«|}­€²‡ˆ³‰ŠµŒ¸‘’¹“”½˜™Â¡¡É««Í±±ìááëààìââòêêñééóììòëëöññõððûøøú÷÷ùööüúúþýýýüüÿÿÿ!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DKZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ%OZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ*ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ7&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+HZZZZZZZZZZZZZZZZZZZZZZ6SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS5SSSSSSSSSSSSSSSSSSSSS@IJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ(PZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8ZZZZZZ 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH8ZZZZZZH+M+8ZZZZZZH+RZR+8ZZZZZZH+RZZZR+8ZZZZZZH-RZZZZZR,8ZZZZZZH2VZZZZZZZV28ZZZZZZH2VZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZZZZZZZZZZZV28ZZZZZZH2VZZZZZZZZZZZZZZZZZZZZZZZV28ZZZZZZHVZZZZZZZZZZZZZZZZZZZZZZZZZV68ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZHWZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZW8ZZZZZZH XZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZY 8ZZZZZZH XZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZX 8ZZZZZZH XZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZX 8ZZZZZZH XZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZX 8ZZZZZZHGZZZZZZZZZZZZZZZZZZZZZZZG8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZHEZZZZZZZZZZZZZZZZZZZZZZZE8ZZZZZZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EZZZZZZZZZZZZZZZZZZZZZZZE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"EZZZZZZZZZZZZZZZZZZZZZZZE"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"EZZZZZZZZZZZZZZZZZZZZZZZE"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"EZZZZZZZZZZZZZZZZZZZZZZZE"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ.ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"EZZZZZZZZZZZZZZZZZZZZZZZE"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"EZZZZZZZZZZZZZZZZZZZZZZZE"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ#ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"EZZZZZZZZZZZZZZZZZZZZZZZE"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ DEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEZZZZZZZZZZZZZZZZZZZZZZZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEEZZZZZZZZZZZZZZZZZZZZZZZEAZZZZZZZZZZZZZZZZZZZZZZZ@&ZZZZZZZZZZZZZZZZZZZZZZZ):UZZZZZZZZZZZZZZZZZZZT</ 1ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ%*9SSSSSSSSSSSSSSSN2ZZZZZZZZ2%QR+?ZZZZZZZZZZZZZWZZZZZZZZ %QZZR+?ZZZZZZZZZZZWZZZZZZZZLX %QZZZZR+?ZZZZZZZZZWZZZZZZZZLZX %QZZZZZZR+?ZZZZZZZW+ZZZZZZZZLZZX %QZZZZZZZZR+?ZZZZZWZZZZZZZZLZZZX %QZZZZZZZZZZR+?ZZZWWLZZZZZZZZLZZZZX %QZZZZZZZZZZZZR+?ZWWZLZZZZZZZZLZZZZZX %QZZZZZZZZZZZZZZR+>WZZLZZZZZZZZLZZZZZZX %0000000000000000'WZZZLZZZZZZZZLZZZZZZZBWZZZZLZZZZZZZZLZZZZZZC% 2VZZZZZZZZZZZZZZWWZZZZZLZZZZZZZZLZZZZZC%QX 2VZZZZZZZZZZZZWWZZZZZZLZZZZZZZZLZZZZC%QZZX 2VZZZZZZZZZZWFZZZZZZZLZZZZZZZZLZZZC%QZZZZX 2VZZZZZZZZW4GZZZZZZLZZZZZZZZLZZC%QZZZZZZX 2VZZZZZZWWGZZZZZLZZZZZZZZLZC%QZZZZZZZZX 2VZZZZWWZZGZZZZLZZZZZZZZLC%QZZZZZZZZZZX 2VZZWWZZZZGZZZLZZZZZZZZ9%QZZZZZZZZZZZZX 2VWWZZZZZZGZZLZZZZZZZZ%QZZZZZZZZZZZZZZX 2WZZZZZZZZGZLZZZZZZZZ"""""""""""""""" WZZZZZZZZZZGLZZZZZZZZ&&&&&&&&&&&&&&&&$WZZZZZZZZZZZZ=ZZZZZZZZZZZZZZZZZZZZZZWWZZZZZZZZZZZZZZZZZZZZZZ=ZZZZZZZZZZZZW$&&&&&&&&&&&&&&&&ZZZZZZZZLGZZZZZZZZZZW """"""""""""""""ZZZZZZZZLZGZZZZZZZZW2 XZZZZZZZZZZZZZZQ%ZZZZZZZZLZZGZZZZZZWWV2 XZZZZZZZZZZZZQ%9ZZZZZZZZLZZZGZZZZWWZZV2 XZZZZZZZZZZQ%CLZZZZZZZZLZZZZGZZWWZZZZV2 XZZZZZZZZQ%CZLZZZZZZZZLZZZZZGWWZZZZZZV2 XZZZZZZQ%CZZLZZZZZZZZLZZZZZZG4WZZZZZZZZV2 XZZZZQ%CZZZLZZZZZZZZLZZZZZZZFWZZZZZZZZZZV2 XZZQ%CZZZZLZZZZZZZZLZZZZZZWWZZZZZZZZZZZZV2 XQ%CZZZZZLZZZZZZZZLZZZZZWWZZZZZZZZZZZZZZV2 %CZZZZZZLZZZZZZZZLZZZZWBZZZZZZZLZZZZZZZZLZZZW'0000000000000000% XZZZZZZLZZZZZZZZLZZW>+RZZZZZZZZZZZZZZQ% XZZZZZLZZZZZZZZLZWWZ?+RZZZZZZZZZZZZQ% XZZZZLZZZZZZZZLWWZZZ?+RZZZZZZZZZZQ% XZZZLZZZZZZZZWZZZZZ?+RZZZZZZZZQ% XZZLZZZZZZZZ+WZZZZZZZ?+RZZZZZZQ% XZLZZZZZZZZWZZZZZZZZZ?+RZZZZQ% XLZZZZZZZZWZZZZZZZZZZZ?+RZZQ% ZZZZZZZZWZZZZZZZZZZZZZ?+RQ%2ZZZZZZZZ2NSSSSSSSSSSSSSSS9*%ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ!ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZnsis-3.11/Contrib/Graphics/Wizard/nullsoft.bmp000077500000000000000000000635761477201124000214020ustar00rootroot00000000000000BM~gv(¤:T´¢¤l:<l\T ÜÒÔ”nl„üþülJL\ Ltdˆˆˆ4DDDMˆˆˆˆˆˆˆˆäDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD8ˆˆˆˆˆˆˆDDDDD툈ˆˆˆˆˆˆ4DDDCˆˆØ„DDDD8ˆˆØˆØˆ4DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDM؈؈؈ÔDDDDCˆˆˆˆØˆÔDDDD؈ˆˆDDDDCˆØØˆØˆˆØÐDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCˆˆØˆØˆˆØ„DDDDNØˆØØˆˆˆŽDDDD8ˆØ„D@D؈ˆØˆØØŽDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDNÝˆØˆØˆØØƒDDDD8ˆØˆˆDD@D ˆØˆˆDDDDDØˆØØˆØˆŽ@D@D@D@D@D@D@D@D@D@D@D@D@8ˆˆØˆØˆˆDD@DíˆØˆØˆˆˆäDDDCˆˆØŽDDDDNˆØˆˆØˆDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDíØˆˆˆØˆØ0DDDDNˆØˆØˆÞDDD݈ˆˆ4D@DMˆˆØˆˆØäDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCˆˆØˆˆØ„DDDDN؈ˆØˆˆˆˆŽDDD8ˆˆˆD@DDDHˆØØŽDDDDD@D@D@D@D@D@D@D@D@D@D؈؈ˆˆˆØƒDD@D؈ˆØˆDDDDMˆØˆˆˆDDDDD؈ˆˆˆ@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD8ˆØˆØØØØˆD@DDíˆØØˆØˆˆˆäD@DCˆˆˆØ@D@DDˆˆŽDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDíˆØˆˆˆˆˆ0DDDDCˆˆˆˆØˆØØÔDDDDØˆØØˆˆˆDDDDMˆˆˆ€DDDD@D@D@D@D@D@D@D@D@D@DMˆˆˆØˆÔD@DDNˆˆˆŽD@D8ˆˆˆˆD@DDˆˆˆäDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDˆˆØØˆƒDDDD@؈؈ˆˆˆDDDDMˆˆˆˆØØØˆˆDD@D8ˆˆØØ@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD؈ˆˆˆˆˆÝäDD@íˆØˆØØˆØØäD@DCˆˆˆˆDDDD݈ˆØˆƒDDDDDD@D@D@D@D@D@D@D@D@DHˆˆˆØ4@DDMˆˆˆØˆˆØˆÔDDDD؈؈ˆˆˆˆDDDˆˆˆØ€D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDMˆØˆˆˆˆØØÞDDDDDÝˆØØˆØØˆÓDDD8ˆˆØØˆˆˆØØˆDDDDˆˆÔDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCˆˆˆØØØØˆƒD@D@DMØØˆˆˆˆD@DDHˆˆˆØØØˆˆØDDCˆˆˆäDDD@D@D@D@D@D@D@D@D@D؈ˆˆˆƒDDDDDD؈ˆØØˆDDDDCˆˆˆˆˆˆˆˆˆ@DDMˆˆDDD@DDDDDDDDDDDDDDDDDDDDDDDDDD8ˆˆˆäD@D@DDӈ؈ˆÔDDD؈ˆˆˆˆˆØDDDHˆˆˆƒDDDDDDDDDDDDDDDDDDDDDDDDDDDDDMˆˆˆˆˆˆ4DDDD@DØÝˆØˆˆ„DDDØˆØØˆˆˆˆˆØØØˆDDDHˆŽDDDD@D@D@D@D@D@D@D@DNˆˆˆŽDD@D@DDD8ØØˆDDDHˆˆˆˆˆØØˆØØˆˆˆØDD8ˆØˆˆ€DDD@DDDDDDDDDDDDDDDDDDDDDDDDD݈ˆˆØØˆˆŽ@DDDDDDDDÓ݈äDDMˆØˆˆˆˆØˆˆˆDDDèØˆ„DDD@DDDDDDDDDDDDDDDDDDDDDDD8ˆˆØØˆˆØØDDDDD@D@DM8ˆˆ0DDDDˆˆˆØØˆˆˆˆˆˆˆØD@DØˆØØˆ€@DDDD@D@D@D@D@D@D@D@íØˆˆˆ4DD@DDDDDDDÝÝÔDDD؈ˆˆØØˆˆˆØØˆˆDDD؈ˆØÔDDDDDDDDDDDDDDDDDDDDDDDDDDCˆˆˆˆˆŽ@DDD@D@DDDDDDDDDHˆˆˆˆˆØØØˆˆˆˆˆØØDDˆØˆˆäD@D@DDDDDDDDDDDDDDDDDDDDN؈ˆˆˆƒDDDDDDDD@DDDDDDDMˆØØØˆˆˆˆˆˆˆˆˆDDD؈ˆˆØ4@DDDDDD@D@D@D@D@D@DèˆˆØØØˆäDDD@DD@DD@D@DDDDˆˆˆˆˆˆˆˆˆˆˆˆØØDDˆØØØˆäDDDDD@DDDDDDDDDDDDDDDDDDíˆØØˆˆˆˆˆàD@DDDDDDDDDDDD@DD؈ˆˆØˆˆˆØØØØØØˆˆ@D@ˆˆˆˆäD@D@DDDDDDDDDDDDDDDDDDMˆˆˆˆˆØØØÔDDDD@DDD@DDDDDDHˆˆˆˆˆˆˆØØˆØØØˆˆˆˆˆˆØDDDˆˆäDDDDDD@D@D@D@D@D@N؈ˆŽDDDDD@DD@DDDDDDDMˆØØØØØØØˆˆØˆˆˆˆˆDD@ˆˆˆD@DDDDDDDDDDDDDDDDDDDDD؈ˆˆˆˆDDDDDDDDDDDDDDDNˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDˆˆDD@D@DDDDDDDDDDDDDDD興ˆˆäD@DDD@DD@DDDDDD؈ˆˆˆØØØØØˆˆØØDD@ˆˆˆ@DDDDDDD@D@D@D@D@MˆØØˆˆˆØÔDDDDD@DDDD@DDDD8ˆˆˆˆˆˆˆˆˆˆˆØØˆØˆˆˆˆˆØØˆˆD@DˆˆDDDDDDDDDDDDDDDDDDDDCˆˆˆˆØØˆŽDDDDD@DDDDDDDDDDDDMˆØØØØØØØØØØØˆˆØˆˆˆDD@ˆˆˆä@D@D@DDDDDDDDDDDD؈ˆˆØˆDDD@DDD@DDD@D@DNˆˆˆˆˆˆˆˆˆˆˆˆˆØØˆˆˆˆˆˆˆˆDDˆˆˆˆäDDDDDDD@D@D@D@D8ˆØØˆˆØˆäD@DDDDDDDDDDDDDDDD؈ˆˆØˆˆØØØDD@ˆØØØØ4DDDDDDDDDDDDDDDDDMˆˆˆˆˆÐDDDDDD@DDDDDD興ˆˆˆˆˆˆˆˆˆˆˆˆØØˆˆˆˆˆˆˆØˆˆˆDDD؈ˆˆˆÔ@D@D@DDDDDDDDDCˆØØˆˆ„DDDDDDDD@DDDDDDDHˆØØØØØØØØØØØØØØˆˆØØØ@DØØØØØÔDDDDDDDD@D@D@DÝØˆˆˆˆˆØƒ@DDDDDDDDD@D@D@DNˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDD؈ˆˆˆ€DDDDDDD@DDDDDDD8ˆˆØØØØˆˆDD@D@DDDDD@DDDDDDDˆˆˆØØØØØØØØØØØØØØØ„DDDè„@D@D@DDDDDDDíØˆØˆˆˆˆØ4DDDDDD@DDDDDD@D@D؈ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆƒDDD興ˆˆ€DDDDDDDDD@DCˆˆØˆØØØØ„DD@D@D@DDDDDDDDDD興ƒäDDDDƒDDDDDDD@DDDDNÝØˆˆˆˆƒDDDDDDDDDDDD@DDMˆˆˆØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ4@DD@DH؈ˆˆD@D@DDDDDD8ˆˆØˆàD@DDDDD@D@DDDDN؈ˆˆØØØØØØØØØØØØØØØØØØØØØØ4DDDDD ˆˆDDDDDD@DD@툈؈ˆˆˆ4DDDDDDDDDDDDDDDD@D؈ˆØˆˆˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŽDDDDDDCˆˆˆØDDDDDDD@DDMˆˆˆØØˆ„DDDDDDD@D@DDDèˆØØˆØØØˆØØØØØØØØØØØØØØØØØØØØÓDDDDDDDDˆˆØØˆ4D@DDDDN؈ˆˆƒDDD@DDDDDDDDDDDDMˆØˆˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆäDD@DDDDˆˆˆ€DDDDD@D@؈ˆˆˆäD@DDDDDDDD@D@DCˆˆØØØˆäD@DDDDDD@؈ŽDDDDDDDHØˆØØˆØØˆ4DDDDDDDDDDDD@DDDN݈ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÔDDDDDDDDDD8ˆˆØˆƒD@DD@݈؈ˆØˆˆ>DDDD@D@DDDDD@D8ˆˆˆ„DDDD@DDD@DØØˆˆäDDDDDØØˆˆŽDDDD@DDDDDDDDDDDíˆˆØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆƒDDD@DDDDDDDDMˆˆˆÔDDD@DCˆØØˆäDD@DDDDDDDDDDD@MˆˆˆˆØØØØØØˆØØØØØØØØØØØØØØØØÝàD@DDDDDDDDDDDDˆˆŽD@DDM؈ˆˆˆ4D@DDDDD@D@DDDDDNˆˆØˆˆˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ4DDD@D@D@DDDDD؈ˆˆDDD@Mˆ>DDDD@D@DDDD@DDD؈ˆØˆˆŽèØØØØˆØØØØØØØØØØØØØØØ4DD@DDDDDDDD@DDD興ˆØØ4DDDDM3ˆˆƒDDDDDDDDDDDDDD@DDèˆˆØØˆD興ˆˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆŽD@DDD@DDDDDDDDDDHØØØˆˆ„@DDDØ8ƒDDD@DDDDD@DDDDíˆØØˆˆäD8ØØØØˆØØØØØØØØØØØØØÓDDDDDC34@DDDDDNˆˆˆDDDDDMÝÝäDDDDDDDDD@DDDDDNˆˆˆˆˆÞDDHˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆˆDDDDD@Mˆˆˆ4DDDD@DDDØØØˆˆˆ4D@DDDDDD@DDDDDDDDDDDDN؈ˆŽDDHØØØˆˆØØØØØØØØØØØØDD@DDCˆˆˆƒDDDDDDDDDèˆˆØØØŽ@DDDDDDDDDDD@DDDDD@D@8ˆˆˆDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆÔDDDDN؈ˆ@DDDD@DMˆˆˆˆÝDDDDDD@DDDDDDDDD@DDDDèˆˆØˆØØˆD@DDDHØØˆˆˆˆÞDDDDD@؈ˆˆˆäDDD@DDDDˆØØØØˆÔD@DDDD@DDDDDDDDDDDMˆØØˆØˆˆ0DD@DˆˆØØØØˆˆˆˆˆˆˆˆƒDDD@興ˆ4DDDDDDDDD8ˆˆˆˆˆƒDDDDDDDDDD@D@DD@Cˆˆˆˆ„DDDDDDMˆˆˆˆˆØØØØØØØØ@DDDDMˆˆˆØˆˆˆä@DDDDD@DCˆäDDDDDDDDDDDDDDDDDN݈ˆƒDDDDDCˆˆˆˆˆˆˆˆ4DDDDDNˆˆØˆØˆØØØ4DDD@DDDDNˆˆˆˆˆØ„@D@DDD@DDDDDD@DD8ˆˆˆˆØˆÝDDDDD@DMˆØˆˆˆˆˆ4DDD@D؈ˆØˆØˆˆˆäDDDDDDDDDèØØØØˆäDDDDDDDDDD@DD@íˆˆØØˆØ4DDDDDDM؈ˆØØØˆˆˆˆ„DDD@D8ˆˆˆØˆØØØ4@DDDDDD@DMˆˆˆˆˆˆ„DDD@DDD@DDDDDDCˆˆˆˆØÔDDDDDDDDCˆØˆˆˆˆØØØŽDDDDDíˆØØˆˆˆØˆˆˆäDDD@DDDDDD8ˆàDDDD@DDDDD@D݈ˆˆØ„DDDD@DDDˆˆˆˆˆˆDDD@DCˆØˆˆˆˆˆØØ4DDDDDDDDDDD興ˆˆˆˆŽDDDDDDDD@DDDM؈ˆˆŽDDDDDDDDDDˆØØØˆˆäDDDDDN؈ˆØˆˆˆØØØØˆˆäDDDD@D@DNˆàDD@DDDDDD@D8؈ˆØDDDDDDDDDDD@ˆˆØˆˆˆˆÐDDDDDDØˆØØˆØØØˆˆˆˆØØ4@DDDDDDDDDDD8ˆˆˆˆˆØƒ@DDD@DDDDDD݈ˆˆˆ0D@DDDD@D@DDØØˆØØØˆ„DD@D@8ˆØˆˆØˆˆˆˆˆäDDDD@DDDDDD@CØØØØØˆˆ4DDDDDD@D@݈ˆÔDDDDDDD@DDDDDˆØˆˆˆŽDDDDMˆØˆˆˆˆˆˆˆÔDDDD@D@DDD؈ˆˆˆ@DDDDDDDDD݈ŽDDDDD@DDDDDDDDMˆØØÝDDDDDDCˆˆˆˆˆˆØØØØˆˆØÔDDÔDDDDDDDDDDMˆˆˆÞDDD@DDDD@DCÝäD@D@DDDDD@D@DDÝØˆˆäDDD@؈ˆˆØØˆØˆˆˆˆØØˆÔ@DƒDDDDDD@D@؈ˆØØˆˆäDD@DDDDDØÝä@DDDDDDD@NîäDDD@DDÝÝDDDDDDD8ˆˆˆØØØˆˆØˆØØØØˆˆØÔDDˆäDD@D@DDDDCˆØˆˆˆƒDDDDDDD@DDD@DDDDDC؈ŽäDDDDDDDD@DDíˆˆØØˆˆˆˆˆˆˆˆØØˆÔDDˆ„D@DDDDDDDDD8ˆØˆˆØØˆÞDDDDDDDDD@DDD@D@DN؈؈ÐDDDD@DDDDCˆˆˆˆˆˆˆˆØÔDˆäDDDDDD@DDØˆØØˆˆØˆ4DD@D@D@DDDDDDDDD؈؈؎DDDDDDDDDDDˆˆØˆˆˆˆˆˆØØˆØˆˆˆØØˆÔDDˆˆÞD@DDDDDD8؈ˆˆDDDDDDDDDDD@DDDD8ˆˆˆØˆØDDDDDDD@؈؈ˆˆˆØˆØØØˆˆØÔDˆäDDDDDDDD@DDˆˆˆˆˆØƒDD@D@DDD@DDDDíØØØØˆØˆäDDDD@DD8ˆˆˆˆˆØØˆˆˆˆˆˆˆØØˆÔDDˆˆˆ„DDDD@D@DDDMˆØØˆØØˆØÞDDDD@DDDDDDCˆˆˆˆˆˆDDDDDDDDMˆˆˆˆØØØˆˆˆØˆˆˆˆØÔDDˆˆàD@DDDDD@DD8ˆˆØˆˆØˆˆÞD@DDDDDDDDNˆˆˆˆˆ4DDDD@DDCˆˆØˆˆˆˆˆˆØØØˆØØˆˆØØˆÔ@DˆˆˆŽDDDDDDDDDDDCˆˆˆØˆˆäDDDDD@DD؈ˆˆˆØØÔ@DDD@D؈ˆØØØˆˆˆˆˆˆˆˆˆØØˆˆØÔDDˆˆ0DDD@D@DD@HˆˆˆØˆØØˆ4@DDDD@D8ˆˆØˆØˆˆ„DDDDD8ˆˆˆˆØØØØˆˆˆˆØØˆÔDDˆØˆˆØä@DDDD@DDD@؈؈ˆØˆÞDDDDDDíØˆˆˆØˆˆˆØØ€DDDD툈ˆˆˆˆˆˆˆØˆˆˆØˆˆˆˆˆˆØÔ@DØˆØØˆˆŽDDDDDDDDDDDNˆˆˆˆˆØØˆØˆÞD@DMˆˆˆˆØˆˆ„D@DDMˆˆˆØØˆˆØØØˆØØØØˆØØˆÔDDˆˆˆˆØÔDD@DD@DDDMØØØØˆˆˆØˆŽîDCˆˆØˆØˆˆˆˆ„DD@D8ˆˆˆØØˆˆØˆˆˆˆˆˆˆˆØˆˆˆˆØˆˆØÔDDˆˆØˆˆ4DDDDD@DD=ˆˆˆˆˆØˆˆˆÝ؈؈ˆˆˆˆˆˆŽ@DDD8ØØØˆˆØØˆˆˆˆØØˆ„@D؈ˆØˆˆØäDDDDDDDDDDDØØØˆØØˆˆˆˆˆˆˆˆØØØØØèˆˆØØÓDDD興ˆˆˆˆˆˆˆˆˆØØØˆˆˆˆˆˆˆÔDDCØØˆØØˆˆƒD@DDDDD@DNˆØˆˆˆˆØØØˆˆˆˆÐMØØˆˆDDDHˆˆˆØØØØØØØØˆˆˆˆˆˆØ„DDD8ˆØˆˆˆˆˆŽDD@DD@DDDDˆØˆˆˆˆˆˆˆˆ„DMˆˆØØˆDDDHØˆØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÔ@DDN݈ˆˆƒDDDDDDDD@DD ˆˆˆˆˆˆØØØØˆƒDDCˆØˆˆDDDDˆØˆˆˆˆˆˆˆˆˆˆØØ„DDDMˆˆˆØˆˆˆŽD@DDDDDDDD ˆØØˆˆˆØØˆˆˆˆÝDDDCˆˆD@DHˆˆØØØˆˆˆˆˆˆˆØØØˆˆˆˆˆØØˆˆ€DDDDDèˆØØˆˆˆˆƒDDDD@D@DDD؈ˆØØØˆˆØØØØ4DDDˆˆˆˆäDDDCˆˆˆØØØØØØØˆˆˆˆˆØØØˆˆ„@DDDDN؈ˆˆØØØˆäDDDDD@DDDC݈ˆˆˆˆˆäDDDDˆØØØØDDDDMˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€DDD@D@NˆˆˆØˆˆˆØØˆ4D@D@DDDDDD؈ˆˆØØÔDDDDD؈ˆˆˆ4D@MˆØØˆˆˆˆˆˆˆˆ„DDDDDDDíØØØˆˆˆØˆÞäDDDDDDDD@툈ˆ„DDDD@DØØØØØÔDDDMˆˆˆØˆˆˆˆˆˆˆØØˆˆØˆØˆˆˆØØØˆˆ€DDæ@D@D@D3ˆˆˆˆˆØØˆØˆƒîD@D@DDDDD@=ØØÔDDDDDD؈ˆˆˆ„@DDNˆØØØØØØØˆˆØØˆØˆØØØˆˆˆ„@DDDDDDDD؈ˆˆØˆØˆˆÞDDDDD@DDDDDD@DD@DDDDDD8ØØØØ€D@DCˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€DDDDDDD8؈ˆˆˆØˆˆˆ>äDDD@DDDDDDDDDD@D興ˆ„DD@Nˆˆˆˆˆˆˆˆˆˆ„DDDDDDDDDNØØØØØˆØˆˆˆˆˆ4DDDDDDDD@D@D@DDèØØØˆ„DDDNˆˆˆØØØˆˆˆˆØØˆˆØØˆˆˆØØØØˆˆ€DDDDDDDDN؈ˆˆØˆˆˆˆ0DDDD@D@DDDDDDDDDDˆˆˆŽDDDˆØØˆˆˆˆØØØˆˆØØˆˆˆˆØØˆˆˆˆ„@DDDDDDDD@DØØˆˆˆØˆˆØØØˆ„D@DDDDDDD@DDDDDDHØØØˆŽDDDˆˆˆˆˆˆˆˆˆ€DDDDDDDDDDD=ˆˆØØˆØØˆˆˆˆˆƒDDDD@DD@DD@D@D ˆˆDDD@ˆˆ؈ˆˆˆˆˆØØˆˆˆˆˆˆˆˆ„DDDDDDDDDDDDDD=؈ˆˆˆDDDDD@DDDD@DDDDDMˆˆˆˆD@D€N0@ØØØØˆˆØØØˆˆØØØÝ؈ˆ„DDDDDD@D@DD@CˆˆˆˆˆˆˆˆDD@DDDDDDDDDDD@CˆØØØØD@DDÝ@@DDˆˆˆˆˆˆˆˆˆˆØØˆˆˆDÝŽ@DDDDDDDDDDDD@DDDN؈ˆØØØØØØØDDDDDD@DDD@DDCˆˆˆˆˆDD@ƒDDDDDˆˆˆàˆˆˆ„DDDDDDDDDDDDDDDØØˆˆˆˆˆˆ@DDDDDDDDDDDD@DDˆØØØØDD@DÓND@D興ˆˆˆˆˆˆˆˆ„D@ˆŽDDDDDDD@D@DDDC݈ˆ„DDD@DDDDD@DDDDDDDˆˆˆˆDDDD8ˆ4DDCˆˆˆØØDDDˆˆ„DDDDDDDDDDDDDN؈ˆˆˆˆˆˆØÔDD@DDDDD@DDDDD@@ˆˆØØØ4@DDèØŽDDD@ˆˆˆˆˆˆˆØˆˆØˆˆä@ˆŽ@DDDDDDDDDDDDDDD؈ˆˆ„DDDDDD@DDDD@DDDDDˆˆˆˆÔD@D8ˆˆ@DHØØØØØØˆØØˆDDDˆH„DDDDDD@D@DD=؈ˆˆˆˆˆˆÝ3>î@DDDDDDDDD@DD8ˆØØØÐDDDHˆØ4DDDDˆˆˆˆˆˆØˆˆˆˆäD@ˆ4ŽDDDDDDDDDDDDDD8ˆØˆˆˆˆˆˆˆˆˆˆˆˆˆÝÓ3îä@DØØˆˆˆ„@DDèØˆ€DDDNˆˆØˆäD€H„DDDDDDDDDDDDDˆØˆˆˆØˆˆˆˆˆˆˆØØØØˆˆˆˆˆˆˆˆˆØØØ€DDDHˆˆD@DHˆˆˆˆˆˆˆˆäDDDŽDDDDDDD@D@DCˆˆØØØˆØØØØˆˆˆˆˆˆˆˆˆˆˆØˆØˆØˆØˆˆ€DDHØØˆDDDHØØØØˆˆˆØØˆDDDDDèÞDDDDDDDDDDDDCˆˆˆˆˆˆˆˆˆØˆˆØØØˆØˆØˆØˆˆŽDDDˆˆØDDDNˆˆˆˆØÝˆØˆˆØä@DDˆŽDDDDDDDDDDDDDCˆˆˆˆØØˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆØˆˆØŽDDDH؈@DDDˆ€ÈˆˆØØˆDDDˆØ„DDDDD@D@D@N8ØØˆˆˆØˆˆˆØˆˆØˆˆØØØˆˆØØˆD@DMƒDDDD@؈ˆ„H„Ȉ„DDˆˆˆŽDDDDDDDDDDDDDDD8ˆˆØØØˆØØˆˆØˆˆØˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆDD@Mˆˆ€DDDDHØØD„@HÓDD8„DDDDDDDDDDDDDãÓˆˆˆØˆˆØØˆˆˆØØˆˆˆˆˆƒ@DDMˆØäDDD@DHˆ€DDDäDDHˆˆˆˆŽDDDDD@D@D@DDã=ÝÝÝˆØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÞDDDCˆˆ@D@DDèØ€DDDDNƒDDMˆØØØØŽDDDDDDDDDDDDDDDDD@DDä>ãí=ÝÝ݈ˆˆˆˆˆˆ4DD@CØØDDDDDDMè„DDDD8@DˆˆˆˆˆˆƒDDDDDDDDDDDDDDDDDD@DDDDDDDDDDD@D@äî3=Ý=݈ˆˆˆˆˆØˆŽä@DDCˆD@DDD@0D@èDDDˆŽDDDD@D@D@DD@DDDDDDDDDDD@DDDDDDDDDDD@DC3íÓäDD@DDˆƒDDDDD4DDDD0D@ˆˆˆˆˆˆˆƒDDDDDDDDDDDDDDDDDDD@DDD@DDDDDDDDDDDDDDDD@DDDDDDDDDNƒDDD@Dˆ€DDDDDDDHˆˆƒDDDDDDDDDDDDDDDD@DDDDD@DDDDD@D@D@D@DDDDD@DDDˆˆDD@D8Ø„D@DDDCˆØØØˆˆˆˆˆƒ@DDDD@D@D@DDDDDDDDDDDDDD@DDDDDDDDDDDDDD@DD@DDD€@DH„@€DDDDDNˆˆˆˆƒDDDDDDDDDDDDDDDD@D@D@DDDD@DDDDDDDDDDDDDDDDDD@DDˆDD@ˆD4DDD@D興ˆˆˆˆƒDDDDDDDDDDDDDDDDDDDDD@D@DDD@D@D@D@DD@DDDLDDDäDDDH€DDà@ND興ˆˆˆØØØØØØƒDDDD@D@D@D@D@DîîDDDDDDDDD@DDDDDDDDDDDDDDDD D@DD@D@ˆDDäDäDˆˆØØØØˆˆˆˆˆˆƒ@DDDDDDDDDDDDDDDDîÝÝî@DDDDDDDDDDDDDDDDDD@DDDD@DDDDDC„DDäD€NˆˆˆˆŽDD@DDDDDDDDDDDN݈ØäDD@D ˆÝÝÓ33>îîä@DDDD@DDDD@DDDDDD„DDäNˆèˆØˆˆˆˆˆˆˆˆˆƒDDDDD@D@D@DDMˆˆˆÔD@DNˆˆˆˆˆˆˆˆˆˆˆˆˆˆÝØÓ3D@DDDDDD@Dî8€DDC„HˆØˆØØØˆØØØØØØØƒDDDDDDDDDDDDDDDDHˆˆØŽ@DD8ˆØØØˆˆØØØØØØØˆˆˆˆˆD@DDDDDD8ˆàƒ„@Dè4ˆˆˆˆˆˆØˆˆˆˆˆˆˆƒ@DDDDDDDDDDDDDDØØˆˆÝDDNˆØˆˆˆØØˆˆˆˆˆˆˆØˆØˆˆDDDDDD@DˆˆØäˆ„DC„DHØØØˆˆˆØØØØØØØÓDDDD@D@D@D@@ˆˆˆˆˆD@MˆˆˆØØØØØØØˆØˆØØDDDDDDDDD0HˆDˆ3ˆäD興ˆØØˆˆˆˆˆˆˆˆƒDDDDDDDDDDDDDDDDˆØØˆDMˆˆˆˆˆˆˆˆˆˆˆˆØˆˆˆˆˆ@D@DDNŽHÞDˆˆˆàDD8ØØØˆˆØˆˆˆ@DDDDDDDDDDDDDD@ˆˆØˆˆØDDˆˆØØØØØØØØˆŽDDDDDDDDHäDè4@ˆØ0D@D興ˆØØˆØØØˆˆˆˆˆDDD@D@D@D@DDˆˆØØˆDDHˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ„DDDDDD@CˆCƒDDDDD8ØØØˆˆØˆˆˆØØØØØˆƒDDDDDDDDDDDDDD@@ˆˆØˆˆäDˆØˆˆØ„DD@DD€DØ4DDDDDDD؈ˆˆˆˆˆˆˆˆDDDDDDDDDDDDDDDDˆØˆäDH؈ˆØˆˆˆˆˆˆˆˆˆØˆˆØˆŽ@DDDDCD8H€DãDDDD@DˆØØØˆˆˆˆˆˆD@D@D@D@DD@ˆˆˆˆˆäˆØØˆˆØØØØØØØØˆØØˆØ4DDDDD@ˆ4@ˆD@„@D@DDN؈ˆˆØØØˆØØØˆˆˆˆØDDDDDDDDDDDDDD@ˆˆDDHˆˆˆˆˆˆˆˆˆˆˆˆØˆDDD@Dè€DH€èDDDDDDCˆØØØˆˆˆˆˆˆØØØˆˆÝDDDDDDDDDDDDDDD@ˆˆˆˆˆØäDMˆˆˆˆˆØØØˆƒD@DDHŽD@ˆN„DDDDDDèØˆˆˆˆˆˆˆØØDDD@D@D@DDDDˆäDHˆˆØØØØØˆˆˆˆˆˆˆˆ€@DDDCDDH„Dè@D@DNˆˆØØØˆˆØˆˆˆˆˆˆˆDDDDDDDDDDDDD@ˆˆˆˆˆˆ4DMØØˆˆˆˆˆˆˆDDDDˆäD@DHí0DDDDDDDèØˆˆˆØØˆØØØØØˆDDDDDDDDDDDD@DDDˆäDMˆˆØØØØØˆˆˆˆˆˆˆˆØˆDDˆ€DDDDˆØ„DDDDDDDDˆˆØˆˆˆˆˆˆˆˆØˆˆˆDD@D@D@D@DD@@ˆˆˆˆˆˆ4DMˆˆˆˆˆˆØØØØØØØØˆŽD@Dˆ„DDDDØ„D@D@DˆØˆˆˆˆˆØØØØØ@DDDDDDDDDDDDDDDˆäD ˆˆˆˆˆˆˆˆˆ€DDDHØÔ@DDDDDDDDCˆˆØˆØØØˆˆØØˆˆˆˆˆˆˆˆˆDDDDDDDDDDDDD@D@ˆˆˆˆˆˆ4DMˆˆØˆˆˆˆˆ„DC4ˆ„DDDDDDD@DDNäHˆˆˆˆˆØØˆˆDDD@D@D@DDDDØØØØØØ4MˆˆØØØˆˆˆˆˆˆˆˆØØ@ˆäHØ€DDDDD@DD@興ˆØØˆˆˆˆˆˆˆˆˆˆˆˆ@DDDDDDDDDDDDD@ˆˆˆˆˆˆÔDMˆˆˆˆØØØØØØØØˆƒNè€@ˆ„D@D@DDN؈؈ˆˆˆˆˆˆˆDDDDDDDDDDDDDDDDØØØØØØ4DMˆˆˆˆˆˆˆˆˆˆƒNH„DHØÔ@DDDDD@興ˆØˆˆˆØØØˆˆˆˆˆˆˆˆˆˆDD@D@D@D@D@D݈ˆˆˆˆÔ@MˆˆØØˆˆ„@ˆDDˆ„DDDDDDCˆˆˆˆˆˆˆˆØˆˆØˆˆˆØØØØØØØØØØDDDDDDDDDDDDDDDD؈ÔDMˆˆˆØˆˆˆˆˆˆˆˆÝˆ@DDDHØ€DD@DˆˆˆØØØØØØØˆØØˆØØØˆˆˆˆˆˆˆˆˆˆDDDDDDDDDDD@DD؈ˆˆˆˆÔMˆØØØˆØØØØØØØØ„àŽDDDˆäDDDDˆˆØˆˆˆˆˆˆˆˆˆˆˆˆØØØØØØØØØØDDDD@D@D@DD@DØØØØØØÔDMˆˆˆˆˆˆˆˆˆˆˆˆDD€DDDDHÞDDDDDNˆˆØØˆØØØØØØØˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDDDDDD@DDD؈ˆˆˆˆÔ@Cˆ@ˆ€DDDDDDNˆˆØˆˆˆˆˆˆˆˆˆØØˆˆØˆˆØØØØØØØØØØDDDDDDDDDDDDDDØØØØØØÔDCˆˆˆˆˆˆˆˆˆ„@@Cˆ€DDD@@DDDDˆˆØØØˆˆˆØØˆØØˆˆˆˆˆˆˆˆˆˆDDDD@D@DDDD؈ˆˆˆˆÔDC؈ƒDDD„DDD@DDDD8ˆˆØˆˆˆˆˆˆˆˆˆˆˆØˆˆØØØØØØØØØØDDDDDDDDDDDDDDØØØØØˆÔCˆˆˆØˆˆˆˆˆDDDNˆ€DDDDDDDMˆˆˆˆØØØØØØØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDDDDDDD؈ˆˆˆØÔDNˆØØˆØØØØàDDDDN„@DDDDD؈ˆˆˆˆˆˆˆˆˆØØØØˆˆˆØØØØØØØØØØDDDDD@D@DDDDDDØØØØØˆ€DCˆˆˆˆˆˆ„DD@DNˆ€DDDD@D興ˆØˆˆˆˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆDDDDDDDDD@DDD؈ˆˆˆ„DCˆˆØØØDDNäDND„DDDDDDDˆØØØˆØØØˆˆˆˆˆˆˆˆØØØØˆˆØØØØØØØØØØØDDDDDDDDDDDDDDDØØØØØˆ€@CˆˆØØˆˆ„DDˆ€DãNˆä@DDD8ˆˆˆˆˆˆˆØØØØØØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDD@D@DDDD؈ˆˆ„DNˆØˆˆØØ4DØ4@ŽC„DDDDDDˆˆˆˆˆˆˆˆˆˆˆŽDDDDDDDDDDDDDDDDØØØØˆˆ€DCˆˆ€èD8ˆäCƒDDDDD ˆØˆˆˆØˆˆˆˆˆˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆ€DDDDDDDDDD@D@D興ˆ„DNˆˆ„DDèˆ4NDDD@DˆˆˆØØØˆØØØØØˆˆˆˆˆˆˆˆØØØØˆØØØØØØØØØØØäDDDDD@D@DDDDDØØØØˆˆ€DNˆDDäDèØ4N4D@DDDDØˆØØˆˆˆˆˆˆˆˆØØØØØØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDDDDDDDDDDD興€DDˆ„DDäDDHˆ4@DDDDDCˆˆˆˆˆˆˆˆˆˆˆˆˆƒD@DDDDDDDDDD@DDD8ØØˆˆˆ€DNˆ€D@DDèØÔDDD@DHˆˆˆˆˆˆˆˆˆˆˆˆØˆˆˆˆˆˆˆˆˆˆˆÔDDDDD@D@D@DDDDD興„DNˆDDDDDHˆƒDDDDDDDMˆˆˆˆˆØØØØØØˆˆˆˆˆˆˆˆØØˆØØØØØØØØØØØäDDDDDDDDDDDDD@D8ˆˆˆ€DØ„D@DàDDèØŽD@DDDDHˆˆˆØØˆˆˆˆˆˆØØØØØØØØˆˆØˆˆˆˆˆˆˆˆˆˆ„DDDDDDDDDDDD@DDD=ˆˆ„DHÔDDDDDDHˆŽDDDD@DMˆˆˆˆØˆˆˆˆˆˆˆˆˆˆØØˆØDDDDDD@D@D@DDDDDD8ˆˆˆ€@Dè@D@@DD8ØÞDDD@DDDHˆˆˆØØˆˆˆˆˆˆˆˆˆˆØˆˆˆˆˆˆˆDD@D@DDDDDDDDD@DDD@D興ˆ€DDíDDDDä@DˆˆƒD@DDDDˆˆˆˆˆØØØØØØØˆˆˆˆˆˆˆˆØˆˆØØØØàDDDDDDDDDDDDDD@DDDèØØØØˆ€DD4@@DDDDˆˆˆDDDDD8؈ˆˆˆˆˆˆˆˆˆˆØØØØØØˆˆØØˆØˆˆˆˆ„D@DDDDD@D@DDDDDDDHˆˆˆˆ„DäDäDNHˆˆØØŽDD@DDDèˆØØˆˆØØˆˆˆˆˆˆØØˆˆˆˆˆƒDDDDDDDDDDDDDDD@DD@DèØØØØˆ€DD@D€DD8ˆØØˆˆØDDD@D8؈ˆØØˆˆØˆˆˆˆˆˆˆˆˆˆˆØØˆ@DDDDDDDDDDDDDDDDD@DDDHˆˆˆ„@DDD„DˆØˆˆˆØˆäDDD興ˆØØˆˆØØØØØØØˆˆˆˆˆˆˆˆØˆˆ0DDD@DD@DD@D@DD@DDDDHØØØˆˆ€DDDH€@ˆˆˆØØØˆØ€DDDDDH؈ˆˆˆˆˆˆˆˆˆˆØØØØˆˆØØØˆˆˆØ4DD@DDDDDDDDDDDDDDD@DDDDˆˆˆ„DDè8ˆˆˆˆØˆ„DDD@DNˆˆˆˆˆˆˆˆˆˆØØˆˆˆØØØƒDDDDDDDDMDDDDDDDDDDDDDDDHØØØˆˆ€DDDˆˆˆØØˆˆ€D@DDHˆˆˆˆØØØØØˆˆˆˆˆˆˆˆˆˆƒäD@D@DDCˆäD@D@D@D@DDˆˆ„Dˆˆˆˆˆˆ4DDDDDíˆˆØØˆØˆˆˆˆˆˆØØØØØˆˆˆˆˆˆØØDDDDDDDDN؈4DDDDDDDDDDDDDDHØØˆˆˆ€DDHˆˆˆˆˆˆDDDD8ˆˆØˆˆˆˆˆØØˆˆØØØØˆÐDDDDD@DD@؈ØäDDDDDDD@DDDDˆˆ„DˆØØØˆˆØˆˆØˆäD@D@ˆˆˆˆØˆˆˆˆˆˆˆˆˆˆØØˆˆˆˆ„DDDD@DD@8ˆØˆÔDD@D@DD@DDDDHØØˆˆˆ€@ˆˆˆˆØØˆØØˆØäDDDDNˆˆˆˆˆˆˆˆˆŽD@DDDDD@툈ˆØ„DDDDDDD@DDDDˆ€@ˆˆˆˆØˆˆØˆD@DDDˆˆˆØØØØˆˆˆˆˆˆˆˆˆˆˆˆäDDDDDDDMˆˆØØˆ„DDDDDDDDDDDDDH؈ˆˆˆ€DDˆˆˆˆˆØØˆØD@DHØØˆˆˆˆˆØØØØØØØˆˆˆˆØˆˆØØØàDDDDD@Cˆˆˆ„DDD@DD@DDDˆŽD@ˆØˆˆˆˆØˆDDDDD興ˆˆˆˆˆˆØØØØˆØØˆˆŽDDDDDDDD؈ˆˆƒDDDDDDDDDDDDHØØˆˆˆ„DD؈؈ˆØˆˆˆˆÞ@DDDˆØˆˆˆˆˆˆˆˆˆˆˆˆŽD@DDDDD8ˆˆˆˆØØƒDDDDDD@DDDDDˆˆŽDDØØˆØØˆˆØ4DDDNˆˆØØØØØØØˆˆˆˆˆˆˆäDDDDDD@DHˆØØØˆØˆˆDDD@D@DDDDDDØØˆˆˆ„D؈؈ˆˆˆˆØØ0DDDDDHˆˆˆˆˆˆˆˆØØØØØˆˆˆˆØˆˆØäD@DDD@DDMˆØˆˆˆØˆDDDDDDDDDD@DˆˆŽDDØØˆØØØØØˆ0DD@D@ˆˆˆˆˆˆØØØØˆØØÞDDD@DD@CˆˆˆˆØØˆˆˆˆDDDDDDDDDDDDDHØØØˆˆŽDD؈؈ˆˆˆŽDDDDDDCˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ„DDDDDDDN؈ˆØˆ@D@D@D@DDDDDˆˆˆƒD؈ˆ„DDDDD@8ˆˆØØØØØØØˆˆˆˆ@DDDDD@D؈ˆˆˆˆØˆˆˆˆˆDDDDDDDDDDDDHØØØˆˆŽDD؈ˆˆˆˆØäD@DNˆˆˆˆˆˆˆˆˆˆØØØˆˆˆˆØˆDDDD@DDD8ˆˆˆD@DDDDDDDDDDDˆˆˆØØƒDDØØØˆØØØˆ€DDDDD興ˆˆˆˆØØØØˆà@DDDDDíˆˆØØˆˆˆˆˆˆˆˆˆDD@D@D@DDDDHØØˆˆÓD؈ˆØˆˆˆã8ƒ€NˆˆˆØˆˆˆˆˆˆˆˆˆˆˆ„DDDDDDDDMˆˆˆØØØˆØØØØØˆDDDDDDDDDDDDDˆˆˆØƒDD؈ˆˆˆˆDØØØˆØØˆˆØØØØØØˆƒDDDDD@CˆˆØˆˆˆˆˆˆˆˆˆˆØDDDDDDDDDDDDDMˆˆˆÓDD؈ˆˆˆˆˆˆ€ˆˆˆˆˆˆØØˆˆˆˆˆˆØˆˆˆˆD@DDDDDDN؈ˆØØˆˆˆˆDDD@D@D@D@DˆˆˆØØ@DèØØØˆØØˆØˆØîˆˆˆˆØØØØØØˆØØØ0DDDDDD8ˆˆˆØØˆˆˆØˆˆˆˆØDDDDDDDDDDDDDMˆˆˆƒDD8ˆˆˆˆˆØˆØˆÔH؈ˆØˆˆˆˆˆˆˆˆˆˆˆˆÔDDDDDD8ˆˆˆˆˆˆˆØØØˆØØØØˆDDDDDDDDD@DDDM؈DD興ˆØˆˆˆØØˆˆˆŽDDDDDDDMˆˆˆØØˆˆˆˆˆˆˆØDDD@D@DDDDMˆØˆˆˆDD8ˆˆØˆˆˆØˆˆØØØˆˆˆˆØˆˆˆˆˆˆØˆD@DDDDCˆØˆˆØØˆˆØˆˆˆˆˆDDDDDDDDDDDDD@MˆˆD8ØØˆØØØˆˆˆˆˆˆˆˆØØˆØØØØØØˆØDDDDDD@NØØˆØØˆˆØØˆˆØØˆˆˆØˆˆˆØD@DDDDDDD@DDMˆˆˆDD8ˆˆØˆˆˆˆˆØØØØØØˆˆˆˆˆˆˆˆˆäDDDDDDD؈ˆØˆˆˆˆˆØØØˆØØØˆDDDD@D@DDDDDMˆˆDèØØˆØØØØØˆˆˆˆˆˆˆˆˆˆ„D@DD@DD8ˆˆØˆˆˆˆˆˆˆˆˆˆˆˆˆØDDD@DDDDDDDD@DMˆˆˆDD8ˆˆØˆˆˆˆˆˆˆˆˆˆˆˆÓDDDDDDDíˆØØˆØˆØØˆˆØØØØØˆˆˆD@DDDDDDDDD@MˆˆˆD8ˆˆˆˆˆˆˆˆˆˆˆØØˆØØØØØäDDD@DDMˆØˆˆØˆØˆˆØØˆˆˆˆˆˆˆˆˆØˆˆØDDDDD@D@DDDDMˆˆDD8ˆˆˆˆˆˆØØØØØØØØØØˆˆØˆˆˆˆäDDDDD@CˆˆˆØØˆØˆˆˆˆØØˆDDD@DDDDDDDDDMˆˆˆDDèØØØˆØØØˆˆˆˆˆˆˆˆˆˆØØˆØØØ>D@DDDDN؈ˆØˆˆˆˆˆˆˆˆˆˆˆˆˆØDDDDDDDDDDDMˆˆˆD興ˆØˆˆˆˆˆØˆˆŽDDDDDDD؈ˆˆˆˆˆˆˆˆØØØØØØØØØˆˆˆˆDDD@D@DDDDMˆˆˆˆØDDHˆˆˆˆˆˆˆˆˆˆˆˆƒäD@D@DDDèˆˆØØØØˆØØØˆˆØˆˆˆˆˆˆˆˆˆØØØˆØDDDDDDDDDDDDD@MˆˆˆD興ˆˆˆØØØØØØØØØØˆˆˆˆDDDDDDDMˆØØˆˆˆˆØˆˆˆØØˆØØØØØØØØØˆˆˆØˆDDDDDDDD@DD@DMˆˆˆˆDDHØØØØˆØˆˆˆˆˆˆˆˆˆˆˆÔDD@D@DDCˆˆˆˆØØØØˆˆˆˆˆˆˆˆˆˆˆØØØˆØDDD@DDD@DDDMˆˆØØD興ˆˆØØØØØØØØØØˆˆˆ„@D@DDD@CˆˆˆˆˆˆØˆˆˆˆˆˆˆˆˆDDDDDDD@DDDDNˆˆˆØˆˆDDHˆˆˆˆˆˆˆˆˆˆˆˆŽDDDD@DD؈ˆˆˆØØØØˆˆØØØˆˆØˆˆˆˆˆˆˆˆˆØDDDDDDDDDDDDDMˆØØD興ˆØØØØØØØØØØØØˆˆˆDDD@DDDD8ˆØˆˆˆˆˆˆˆØØˆØØØØØØØˆˆˆØØˆDDD@D@D@DDDCˆˆˆˆˆˆDDHØØØˆˆˆˆˆˆˆˆˆˆˆˆØØ0DD@DDDDíˆØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆØØØˆˆØDDDDDDDDDDDD@CˆD興ˆˆ„DD@DD@D ˆˆØØØØØØØˆØØˆˆˆˆØØˆˆˆˆˆˆDDDDDDD@DDDDNˆˆˆˆˆˆDDHˆˆˆˆˆˆˆˆˆˆˆˆƒDDDDDDCˆˆˆˆˆˆˆˆˆˆØˆˆØØØØˆˆØØˆˆˆˆˆˆˆˆØDDD@DDD@DDDDCˆØØØØØDèˆˆØØØØØØØØØØØØDD@DDN؈ˆˆˆØØˆˆˆˆˆˆØØØØØˆˆˆØØØˆDDDDDDD@DDDDC؈ˆˆˆˆDDØØˆˆˆˆˆˆˆˆˆˆˆˆäDDDDDDDØˆØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆØØØˆˆˆØDDDDDDDDDDDDDCˆØØØØØDHˆÔD@DDD@D8ˆØˆˆˆØØØØØØØˆˆˆˆˆØØˆˆˆˆˆˆˆˆDD@D@D@DDDNˆˆˆˆˆˆDDˆˆˆˆˆˆˆˆˆˆˆŽ@DDD@DíˆØˆˆˆˆˆˆˆˆØØØˆˆØØˆˆØØØØˆˆˆˆˆˆˆØDDDDDDDDDDDDDCˆØDH؃DDDDDDMˆˆØˆˆˆˆˆˆˆØØˆˆˆˆˆˆØØØˆˆˆØØØØˆDDDDDDD@DDDDDDˆˆˆˆØˆDˆˆˆˆˆˆˆˆˆˆˆäDDDDDDCˆˆˆˆØØØØˆˆˆˆˆˆˆˆˆˆˆˆØØØˆˆˆˆØD@D@DD@DDDDDNˆØˆØDHØØØØØØØØØØàD@DD@؈ˆˆˆˆˆˆØØØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDD@DD@D@DDˆˆØˆØˆDDˆˆˆˆˆˆˆˆˆŽDDDDDD8ˆØØØˆˆˆˆˆˆØØØØØˆˆØˆˆØØØØØˆˆˆˆˆˆØDDDDDDDDDDDDDDNˆˆØˆØDMŽDDDDDD툈ˆˆØˆˆˆˆˆˆˆˆˆˆˆØØˆØØˆˆˆˆˆØˆˆˆØØØØØˆ@D@DDDD@DDD@ˆˆØˆØˆDCˆˆˆˆˆˆˆDD@DMˆˆˆˆØØØØØØˆˆˆˆˆØˆˆØØØØØˆØØØˆˆˆˆˆØDDDDDDDDDD@DDˆˆØˆØDDƒäDDDDDDCˆˆˆˆˆˆˆˆˆˆØØØˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDDD@D@DDDD@ˆØØˆØˆDDD興ˆˆƒäDDD@DDN؈ˆØˆˆˆˆˆˆØØØØØØØˆˆˆˆˆˆˆˆˆØD@DDDDDDDDDDDˆˆˆˆØDN8ØØ>@D@DD@D؈؈ˆØˆˆØØØˆˆˆˆˆˆˆˆˆˆˆˆØˆˆˆˆˆØˆˆˆØØØØØØˆDDDDD@D@D@D@@ˆˆØˆDDDD@î@DDDDD@DD8ˆØˆˆˆØØˆˆˆˆØØØØˆˆØØØØØØØˆˆˆØØØˆØØØˆˆˆˆˆˆØDDDDDDDDDDDDDDDˆˆØØˆØ@DDDDDD@D@DDDíˆØˆØØˆˆˆˆˆˆˆØØˆˆˆˆˆˆˆˆˆˆˆˆˆØˆˆˆˆ@D@DDD@D@DDDD@ˆØˆˆØˆDDD@DDDDDDDDDCˆØˆØˆˆˆˆˆˆˆˆˆˆˆˆˆØØˆˆˆˆˆˆˆˆØDDDD@DDDD@D@DˆˆˆDD@DD@DDDˆˆˆØˆØˆˆˆ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜ˆˆDDDDDDDD@DDDDD@ˆˆˆˆä@DDDDDDDDDDØˆØØˆØˆØØØ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ˆˆˆˆˆˆØØD@DDDDDDDDDDDDˆØØˆØØDDDDDDDDD8ˆØˆˆØˆØˆˆˆ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜ˆˆˆDDDD@D@DD@DD؈ˆØˆˆäD@DDD@DDíˆØˆØØˆØˆØØ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜ˆˆˆˆˆˆØØDDDDDDD@DDDDDDˆØØˆØØDDDDDDDDMˆˆØˆˆØˆˆˆˆ™™"""""""""""""""""""""""""")™˜ØØØØØØˆˆ@DDDDDDDDDDD@D؈ˆØˆˆä@DDDDDCˆˆˆˆØØˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆØDDDD@DD@DDDˆØØˆØˆäD@DDDN؈ˆˆˆˆˆˆ™™"""""""""""""""""""""""""")™˜ØØØØØˆˆDDDDDDDDDDDDDD@ˆˆˆØˆØ4DDDDDD؈ˆˆˆˆˆˆØ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆD@DDDDDDDDDDDˆˆØˆäDD@D8ˆˆˆˆˆØØˆˆØØˆ™™"""""""""""""""""""""""""")™˜ØØØØØØˆDDDD@DDD@D@@ˆˆˆØˆ4DDDMˆˆˆØˆˆØˆˆØØˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆˆDDDDDDDDDDDDDDˆˆ4DDDCˆØØˆØØˆØØˆØØˆˆ™™"""""""""""""""""""""""""")™˜ØØØØØØØØ@D@DDDDDDDDDD@ˆˆˆˆ4@DNˆØˆˆØˆˆˆˆˆˆˆˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆˆDDDD@D@D@D@DˆˆˆˆäDD؈ˆØˆˆØØˆˆˆˆ™™"""""""""""""""""""""""""")™˜ØØØØØØØØDDDDDDDDDDDDDD@ØˆØØØØ4D興؈ˆØØˆˆØˆˆØˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆˆD@DDDDDDDDDDDˆØˆˆˆˆäíˆØØˆˆˆˆˆˆˆØØˆØØˆØØØ™™"""""""""""""""""""""""""")™˜ØØØØØØØˆDDDD@DDD@DD8ˆˆÝˆˆˆˆØØØØØˆˆˆˆˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆØDDDDDDDDDDDDDDØØˆˆˆØˆˆˆˆˆˆˆØˆˆˆˆˆ™™"""""""""""""""""""""""""")™˜ØØØØØØØˆ@D@DDDDDDDDD@DØˆØØØˆˆˆˆˆØØØØØˆˆØØˆˆØˆˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆDDDD@D@DD@DDD؈ˆˆØˆˆˆˆˆˆˆˆØØˆØˆØØØ™™"""""""""""""""""""""""""")™˜ØØØØØØˆDDDDDDDDD@DDDDD݈ˆˆØØˆˆˆˆˆˆˆˆØˆØˆˆˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆˆˆD@DDDDDDDDDDD؈ˆˆˆØØˆˆˆˆˆØØØØØˆˆØØˆ™™"""""""""""""""""""""""""")™˜ØØØØØØˆäDDDD@DDD@D@D؈ˆˆˆØˆˆØØØØØˆˆˆˆˆˆˆˆØˆˆØ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™˜ˆˆˆˆˆ0DDDDDDDDDDDDDDDØØØˆˆØØˆØØˆˆˆˆˆˆˆØØˆ™™"ffb""¦ff"!i™–"ffg*vi™ar")™˜ØØØØÝDDD@D@DDDDDDDDDDDèˆˆØØˆˆˆˆˆˆˆˆˆˆˆˆØˆˆˆ™™ª™™šªª™™§™™™™™j™™—y™™™™–ª©™˜ˆˆˆƒDDDDDDD@D@DD@DD8؈ˆˆˆˆˆØØØØØØØˆˆˆØˆ™™"™™’"'™™™y™™™™™–™™—™™™™™™b)™˜ØØÓDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆØØˆˆˆˆˆˆˆØØØˆˆˆˆ™™ª™™šª©™™™i™™ai™™™™–™™‘™™‘©™˜ˆÞDDDD@DD@DDDDDDDDDD@DMˆˆˆˆˆˆˆˆˆ™™"™™’"™™™™™—"!™™™™™™™"y™–)™˜îDDDDDDDDD@D@DD@DDNˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™ª™™š§™™™™™™jª§™™™™™™–ªªy™™©™”DDDDD@DDDDDDDDDDD@DDDD@DˆˆˆˆˆˆˆˆˆˆØØØØØ™™"™™’©™™™™§w¢"¦™™™™—ww"*i™™)™”DDDD@D@D@DDDDDDDDDDD@=ˆˆØˆØØØˆˆˆˆˆˆˆˆˆØØˆˆˆˆˆ™™ª™™š™™™™ªª§™™™™™—ªªqi™™–©™”DDDD@DDDDDDD@D@DD@DDDHˆˆØˆˆˆØˆˆˆˆˆ™™"™™—™™–™™"!™™™™™™™—"™™™™—)™”DDDDDDDDDDDDDDDDDDDDDDNˆØØˆˆØØˆˆˆØˆˆˆˆˆˆˆˆˆˆˆˆ™™ª™™–™™v™™§™™™™™‘™™—y™™™™™©™”DDDD@DD@DDDDDDDDDD@DD؈ˆˆØØˆˆØØØØØØˆˆØØØØØØ™™"™™™™‘&™™©™™™™–r™™—™™™™™g")™”DDDDDDDDDDD@D@DD@DDDDHˆˆˆˆˆˆˆˆˆˆˆˆØØˆˆˆˆˆˆ™™ª™™™™š¦™™™™™aªª™™‘™™™–ªª©™”DDDDDDDDDDDDDDDD@DDDDDDDCˆØØØˆˆˆˆˆˆˆØ™™"™™™™r&™™i™–r'w™™–™™g"qwz)™”@DDD@D@D@DDDDDDDDDD@D8ˆˆˆØØØˆˆˆØØˆˆˆˆˆˆˆˆˆØˆ™™ª™™™–ª¦™™i™—ª©™™™™–™™zªi™—©™”DDDDDDDDDDDD@D@DD@DDDDDDMˆˆˆˆØØØˆˆØØØØˆˆØØØØˆˆØ™™"™™™š"&™™™–wi™™™™‘™™gv™™š)™”DDD@DDDDDDDDDDDDDDDDDDD@ˆˆˆˆˆˆˆˆˆØØˆˆˆˆØØˆ™™ª™™™zª¦™™©™™™™™‘™™—i™™™™™©™”@DDDD@DD@DDDDDDDDDDD@DD ˆˆˆˆˆˆˆˆˆˆˆØ™™"™™–""&™™'i™™™™™™—¦™™™™‘")™”DDDDD@DDDDDD@D@D@DDDDDDD@ØˆØØØˆˆˆØØˆˆˆˆˆˆˆØØˆ™™ªffjªª¡ffª¡f™–ªffgªvi™azª©™”DDD@DDDDDDDDDDDDDDDDDDDD@DDMˆˆˆˆØØØˆˆØØˆˆØØØØØˆˆØ™™"""""""""""""""""""""""""")™”DDDDDDD@D@DDDDD@DDD@DD@D@툈ˆˆˆˆˆØØˆˆˆˆˆØØˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”DDDDD@DDDDD@D@DD@DDDDDDDDDDDØØˆˆˆˆˆˆˆˆˆØ™™"""""""""""""""""""""""""")™”DDD@DDDDDDDDDDD@DDDDDDDD@DDDØØØØˆˆˆˆˆˆˆˆˆØØˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”DDDDDDDD@DDDDDDDDDD@DDDDD@DDN؈ˆØØˆˆˆˆØØØØØØˆˆØ™™"""""""""""""""""""""""""")™”@DDDDDDDDDD@DD@DDDDDD@DDDDN݈ˆØØØˆØˆˆˆˆˆˆØØˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”DDD@D@DDDDDDDDDDDDDDDDDDDDDDDDD=ˆˆˆˆØˆˆˆØ™™"""""""""""""""""""""""""")™”DDDDDDDD@D@DDDD@DDD@DDDD@DDD@DDN8ØØØˆˆˆˆˆˆˆØØˆ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”D@DDDDDDDDD@D@DDDDDDDD@DDDDDDDDDDC툈ˆˆØ™™"""""""""""""""""""""""""")™”DDD@D@DDDDDDDDDDDDDDDDD@D@DDDD@DDD@D3ÝØˆˆˆˆˆÝÓ™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”DDDDDDDDD@DDDDDDDDD@DDDDDDDDDDDDDD@DDDD@D™™"""""""""""""""""""""""""")™”@DDDDDDDDD@D@D@DDDDDDD@DDDDDDDD@DDDDDDDDDDDDDD™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”DDD@D@DDDDDDDDDDDDDDDDDDDD@DDD@DDDD@DDDDDDDDD™™"""""""""""""""""""""""""")™”DDDDDDDD@DDDDDDDDDD@DDD@DDDDDDDDDDDDDD@DDDDDDD™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”D@DDDDDDDD@D@DDDDDDDDDDDDDDDDDD@D@DDDD@D@DD™™"""""""""""""""""""""""""")™”DDD@D@DDDDDDDDDDD@DDDDDDD@DDDD@DDDDD@DDDDDDDD™™ªªªªªªªªªªªªªªªªªªªªªªªªªª©™”DDDDDDDDDDDDDDDDDDD@DDDD@DDD@DDDDDDDDDDDDDDDDDD™™"""""""""""""""""""""""""")™”@DDDDDDDD@D@D@DDDDDD@DDDDDDDDDDDD@DDD@D@D@D™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”DDD@D@DDDDDDDDDD@DDDDDDDD@DDDDD@DDDDDDDDDDDDDD™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”DDDDDDDD@DDDDDDDDDDDDDD@DD@DDDDDDDDDD@DDDDDDDD™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”D@DDDDDDDD@D@DDDDDDD@DDDDDDDDDDDDD@DDD@D@D@D™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”DDD@D@DDDDDDDDDD@DDD@DDDDDDD@DDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDD@DD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDD@D@D@DDDDDDDDDDDDDDDDD@D@D@D@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDDDDDDDDD@DDDDD@DDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDD@D@DDDDD@DDDD@DDDDDDDDD@D@D@D@D@D@D@D@D@D@DDD@DDDDDDDD@D@DDDDDDDD@DDDDDDDDDD@DDD@D@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDDDDDDDDD@DDDDD@DDDDD@DD@DDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDDDDDDDDDDDDDDDDDD@D@D@D@D@D@D@D@D@D@D@DD@DDDDDDDD@D@D@DDDD@DDDDDDDDD@DD@DD@D@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DD@D@DDDDDDDDDD@DD@DDDD@DDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDD@DDDDDDDDDDDDDDDDD@DDDDDDDDDD@DDDDDDDDD@D@D@D@D@D@D@D@D@D@DDDDDDDDDDDDD@D@DDDD@DDDDDDDDDDD@D@D@DD@D@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DD@DDDDDDDDD@D@DDDDDDDDD@DDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDD@D@DDDDD@DDDDDDDDDDDDDD@D@D@D@D@D@D@D@D@D@D@DDD@DDDDDDD@D@DDDDDDDDD@DDDD@DDDD@DD@DDD@D@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DD@D@DDDDDDDDD@D@D@DDDDDDD@DDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDD@DDDDDDDDDDDD@DDDDDDDDD@D@D@D@D@D@D@D@D@D@DDDDDDDDDnsis-3.11/Contrib/Graphics/Wizard/orange-nsis.bmp000077500000000000000000001465341477201124000217550ustar00rootroot00000000000000BM\Í2(¤:*É  ÿÿY[[ z}~µéý»êýÃíþÍðþÇãî¡Þú­ãû°æýÙòý²ÇÐáõþÅÖÞ5bykÄò6bymÅòoÆópÇóqÇô9dzsÈôtÉôwÊõxËõ`¡Ã=f{{Ìö}ÍöÎ÷‚Ï÷ÎõƒÐø~ÇíQ€˜„Ïö‚Ìòbš·‡Òù-FS~Ãçm©Èv¶×ÖûŽÓ÷%+’Õ÷–×ø›ÚùžÛúŸÜú¡Üú¢Ýú£Þú¥Þû§àû§ßûƒ®Ä©àû©ßûªàû-;B­áû®áû°ãü¯âû™ÅÛ²ãüžÊàœÈݳäü°àø²âúª×î¢Îãµäü¨Óé¦ÑæªÕê¬×ì®Ùî°Úï¶ßô´Ýò¹â÷·àõ»äùºãø®Ïß ¦¿Ì‡›¥Õåíåíñprs;¬íAY4ŽÂ(m”E°îPµï\ºðf¾ñlÁñnÃòoÄò8czl¾êrÇôqÃòqÄòrÅòsÆótÄòl¸ávÉõuÆó;dzvÇóyËöwÈówÅòzËöi¯ÔyÈózÉô{Çó~Í÷}Êô€Î÷WŒ¨Jw@g|Ïø€ÌõÉó‚ÏøÍö]“°@ey„Ïø„ÐøƒÎöƒÍõGo…†Ñù„Íõ…ÎõCh|<]oˆÒù‰Óú†ÎõŠÓú‰ÑøˆÏö‡Ìô|½à@bt9Wg‹Óù‰Ðö5P_ÔûŒÔúŽÕûŒÑö‹ÎôˆËïÖüÖû†ÇêÔù’×üÐõ”Òõ`‰Ÿc‹ t¡¹qš±–ÍêŸ×ö¤Ù÷¡Òí©Û÷“¾Õ¹Ï—ÂÙ®Ý÷§Óì²ßø[q}¶àø±Ûñ³Üò¹âø¾åú½ãùRcl¸Úí²Óæ¾ÞðÃáñÍêúž±¼ºÏÛÆÜèéöý:¡Ý.~­TsmÁò‚Êô 1;…ËôšÔö³×ìÃåùÇçúÊäôÓìû  !úýÿòùþ+,-Š‹ŒííîÿÿÿüüüúúúöööñññéééæææâââÞÞÞÙÙÙÓÓÓËËËÃÃúºº«««ŸŸŸgggKKK‡€mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm)mmmmmmmmmm€mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmˆwmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm€€mmmmmmmmˆpmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmkˆ•kmmmmmmm€ˆpmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmˆˆmmmmmmmwˆpmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm‡‡mmmmmmjˆˆpmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm&wmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm€€mmmmwØmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmw€mm€€mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmkˆˆkmmkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm&&&mˆmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm‡&¿&‡m&mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmˆ¿¿¿ˆ€ˆknnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn€•>¿¿¿>ˆkˆ€nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnk‰·¿¿¿¿¿·nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnpˆ¸¿¿¿¿¿¿¿¸€‡nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn‡¿¿¿¿¿¿¿¿¿ˆ•knnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn&¿¿¿¿¿¿¿¿¿¿¿&€nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn•¿¿¿¿¿¿¿¿¿¿¿¿¿•wnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn€¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿•&ˆnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnp•>¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿>€€nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnˆ¸¿¾¿¾¿¾¿¾¿¾¿¾¿¾¿¾¿¸ˆ‡nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn‡¶¾¿¾¿¾¿¾¿¾¿¾¿¾¿¾¿¾¿¾¶pnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn)&¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾&•nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnˆ¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿ˆˆnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn€>¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿•€nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkˆ>¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾>&nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmˆ¸¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¸•wnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnm‡µ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾‡sssssssssssssssssssssssssssssssssssssssssssssssssssssssssss&ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ•wssssssssssssssssssssssssssssssssssssssssssssssssssssssssss€ˆ¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ€‡ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssw‰>ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ&wtttttttttttttttttttttttttttttttttttttttttttttttttttttttttpˆ>ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀp&tttttttttttttttttttttttttttttttttttttttttttttttttttttttttt&·ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ‡€ttttttttttttttttttttttttttttttttttttttttttttttttttttttttt‡µGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGˆuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuoˆGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGoouuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuwo•¾GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG&quuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupo‰>GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGp‡vuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupˆ·GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGwyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy‡¸JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ&ˆuyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuµJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJpuyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuoˆJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJw{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{woÀJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ&ˆ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{p•‰¿IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIy{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{uuˆ·IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIw}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}‡¸IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII‡oooooˆ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}oooµIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIˆooooooo‡}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}y-ooooˆGIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlooooooo€}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}woooo‰¾OIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOooooooov•oooo¿OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO‡oooooo&ˆooo·OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOˆooooooo}‡o¶OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooo€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ooooµOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO€oooooo‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€ooooˆJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooˆ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒwoooooooooo‰¾OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO‡oooooo‡‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚vˆooooooooo¿RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRˆooooooo‚…………………………………………………………………………………………………………………‚‚&ooooooooooo>ORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR‰ooooooo€………………………………………………………………………………………………………………………ooooooooooo¶RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRoooooooo~……………………………………………………………………………………………………………………ooooooooooo&RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR€ooooooo……………………………………………………………………………………………………………………woooooooooooˆIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR€ooooooo&…………………………………………………………………………………………………………………p‰oooooooooo‰¾QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq‡‚……………………………………………………………………………………………………………~ˆo>QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo)……………………………………………………………………………………………………………‚‡·QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq&……………………………………………………………………………………………………………)¶SSSSSSSSSSSSSSSSSSSSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqˆo€‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸JSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq•o€‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Œw‰¿SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹~‰¿SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ˆ¿TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‡¿TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTw‰ ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹Ž¿TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT€&‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹-¿UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€&””””””””””””””””””””””””””””””””””‹w‰¿TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT€&‹”””””””””””””””””””””””””””””””””%•¿TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT€&‹”””””””””””””””””””””””””””””””””)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&¿UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€&””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””¿UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€&¦”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””¿UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€&40————————————————————————————————————————————————————————————————¾UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€&443——————————————————————————————————————————————————————————————¾UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€&44440—————————————————————————————————————————————————————————————¿VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVp‰444443 ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜¾VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV44444440˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜¾VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV666666663«¾VÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx44666666643¦¾ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx•¾666666666662                                                     ¾ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&oz¢76666666666642                                                   ¾ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&-6666666666666642¦                                                ¾ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)·666666666666666642¦                                              ¾ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzz66666666666666666663«                                            zzzzzzzzz¾ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx€zzzzzzz&66666666666666666666640                                          zzzzzzzzz¾ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx€zzzzzzz•66666666666666666666666630                                       zzzzzzzzz¾ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzÝ766666666666666666666666642«¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦zzzzzzzzz¾ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx‰zzzzzzz¢666666666666666666666666666642«¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦zzzzzzzzz¾XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx&zzzzzz·7777777777777777777777777777777430¦¦¦¦¦¦¦  ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦zzzzzzzzz¾XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWWWWWWzzzzzz87777777777777777777777777777777777430««««««««««««««««««««««««««zzzzzzzzz¾XXXXXXXXXXXXXXXXXXXXXXWWWWWWWWWWWWWWWzzzzzzzˆ777777777777777777777777777777777777777432««««««««««««««««««««««zzzzzzzzz¾XXXXXXXXXXXXXXXXXWWWWWWWWWWWWWWWWWWWWwzzzzzzzz888888888888888888888888888888888888888888874322««««««««««««««««zzzzzzzz¾XXXXXXXXXXXWWWWWWWWWWWWWWWWWWWWWWWWWWzzzzzz¢888888888888888888888888888888888888888888888888844332220««««««zzzzzz¾WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW&zzzzzz·888888888888888888888888888888888888888888888888888888888888874&&&&µµµµµIWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW‡zzzzzzz&888888888888888888888888888888888888888888888888888888888888888µµµµµµµµµIZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ}€zzzzzzz888888888888888888888888888888888888888888888888888888888888888µµµµµµµµµIZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZvzzzzzzzz¢99999999999999999999999999999999999999999999999999999999999999µµµµµµµµµIZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZˆzzzzzzz¸99999999999999999999999999999999999999999999999999999999999999µµµµµµµµµIZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ‡zzzzzzˆ99999999999999999999999999999999999999999999999999999999999999µµµµµµµµµIZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ€zzzzzz¹9999999999999999999999999999999999999999999999999999999999999µµµµµµµµµIZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ•zzzzzz·9999999999999999999999999999999999999999999999999999999999999µµµµµµµµµIYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&zzzzzz&:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::µµµµµµµµµOYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|||||||||||||||||||||||||||||||||||||||||||||||¹::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::µµµµµµµµµOYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|||||||||||||||||||||||||||||||||||||||||||||||v·;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµOYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY||||||||||||||||||||||||||||||||||||||||||||||||&z& ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµOÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ||||||||||||||||||||||||||||||||||||||||||||||||G:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµOÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ||||||||||||||||||||||||||||||||||||||||||||||||v ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµOÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ&z•º;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµO\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\€z>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµO\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\•&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµO\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)z¾;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµO\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\p&=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµO\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\&¹=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;µµµµµµµµµO\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\€========================================================¶¶¶¶¶¶¶¶¶O\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ˆ¼=======================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[=======================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[•¼======================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[&======================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[•¾=====================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[-&;====================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[•>====================================================¶¶¶¶¶¶¶¶¶O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[€•¼A==================================================¶¶¶¶¶¶¶¶¶OÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ&===================================================¶¶¶¶¶¶¶¶¶OÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ€¾@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@¶¶¶¶¶¶¶¶µOÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ ‡ˆ»?????????????????????????????????????????????????¶¶¶¶¶¶¶¶¶RÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ ~•¸AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶RÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ ¾AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶>¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ ˆˆ»AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ w¶AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ )>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ˆ‰‰‰‰‰‰‰‰JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„w‰‰‰‰‰‰‰ˆ»AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„‰‰‰‰‰‰‰µ?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„‡z‰‰‰‰‰‰‰‰¸A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„%•‰‰‰‰‰‰‰‰‰>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„w‰‰‰‰‰‰‰‰¿ACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC···············································!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!‰‰‰‰‰‰‰‰‰•I?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!‡‰‰‰‰‰‰‰‰‰•JCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%ˆ‰‰‰‰‰‰‰•¼CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%•‰‰‰‰‰‰‰&NCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!w•‰‰‰‰‰&NCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††.‰‰‰‰‰‰‰‰‰&¼DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††-‰‰‰‰‰‰•IDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††-‰‰‰‰‰‰‰‰‰‰•IDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††-‰‰‰‰‰‰‰‰‰•¿FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††-‰‰‰‰‰‰‰‰‰‰>FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††-‰‰‰‰‰‰‰‰‰‰¸FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ-‰‰‰‰‰‰‰‰‰‰‰µ½EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ-‰‰‰‰‰‰‰‰‰‰‰ˆIDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ-‰‰‰‰‰‰‰‰‰‰‰‰>EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ.•‰‰‰‰‰‰‰‰‰‰‰¶½EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ¢ˆ‰‰‰‰‰‰‰‰‰‰‰ˆÀEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŒˆ‰‰‰‰‰‰‰‰‰‰‰‰¸½EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEŒ‡™‰‰‰‰‰‰‰‰‰‰‰ˆÀFMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE‰‰‰‰‰‰‰‰‰‰‰‰‰¸½HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH¢•‰‰‰‰‰‰‰‰‰‰‰•>HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###Œ‡‰‰‰‰‰‰‰‰‰‰‰‰ˆÀHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH†Ž(…ƒƒƒ……ކ•‰‰‰‰‰‰‰‰‰‰‰‰‰µIEEMMEHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#‹ƒ~,¢¢¢,,%%……Ž#¢ˆ‰‰‰‰‰‰‰‰zz¶I½NUÁÁLLMFMHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#…%,..€€-€.w¢,,%ƒ…‹“"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$)‰‰‰‰‰zzšššššµ¿ORRQNNÆLLMHKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"#(%¢.-)--€.w¢,,%Œ…#""$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$¢&£šš¤š¤¤¤¤§¤§•·¾ÀÀJRQUÁLMEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"#…,w€&&ˆˆ&&‡--€.w¢,%~Œ…#""$$$$$$$$$$$$$$$$$$$$$$$$$$$"#…%)z𤤧§++++++++++¤µ>¿¾ÀJRNÆLMHKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"(,.-)‡ˆ™zššz‰•ˆ&&‡)--€.¢¢,%%…‹#""$$$$$$$$$$$$$$$$$$$$$"#(%,¢.-•§++++BBÛÛBÛBBÛBB+™¶>¿¾JONÆLMHKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK$$$$$$$$$$$$$$$$$$$$$$$$$$$$"‹%,.-)&•¤+§++§¤š•ˆ&&‡)--€.¢¢,%%…‹#""$$$$$$$$$$$$$$$$"#…%¢.-‡•§ÛÛÛÛÛÛ11111ÛÛÛÛÛB§Ä¸>_JRNÁLHKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK’’’’’’’’’’’’’’’’’’’’’’’’’’"“Œ%¢.&ÛB++BB++++§§¤š‰•ˆ&‡‡)-€..¢¢,%%…#“""’’’’’’’’’’’"‹%¢.€‡ˆ•‰£+Û1111111111111ÛÛÛÛ+§&·À]SÆLKPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP’’’’’’’’’’’’’’’’’’’’’’’’’"#Œ%¢€‡&šþþþ^åÛÛBBBB+++§§¤šz‰•ˆ&‡‡)-€..¢¢,%%Œ#“"'’’’’’"“(%¢.-)‡ˆ•£¤§+++ÛÚÚÚÚÚååååååå111ÛÛÛB+¤&·QUÃMKPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP’’’’’’’’’’’’’’’’’’’’’’’’"(Œ,.-)‡ˆ§þ^åþþþþèåÛBÛBÛ++++§§¤šz™•ˆ&‡‡))-€..¢,,%Œ…‹“"''#…%¢€&•z¤§Ûåèþþþþþþþþè5ãÚåååå111ÛÛÛ++§¤ˆ¸¾UPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP’’’’’’’’’’’’’’’’’’’’’’’"”ƒ¢.-)&ˆBþþéùìôûüåþþþþèåÛBÛBB++++§§šš™•ˆ&‡‡))-€..¢,,%ŒŒ…%,.-)‡ˆ‰šBÚèþþþþþã1Û1ÛãþþþþþäÚÚååå11ÛÛB+§¤š£&¸·GÆPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP’’’’’’’’’’’’’’’’’’’’’’“‹%¢.-&•1þþýøöìììììöêýþþþþ5ÚåÛÛBBB++++§¤š™ˆˆ&‡‡))---..¢,¢¢.-)&•ÛäþþþÚegfddddddddÖgeÚþþþÚåå11ÛÛB+§¤š£‰™™™™µ¶·>GGÂPPPPPPPPPPPPPPPÂGG>·¶µ’’’’’’’’’’’’’’’’’’’’’"(%¢.&þþüöööìììììììììöêýþþþþ5ÚåÛÛBBB++++§¤šz•ˆˆ&‡)---€-&•+äþþã×fddddddddddddddddÖeãþþÚååå11ÛB+§¤šz™™™™™™™™™™™™™™ˆµµµµµµµˆ™™™™™™™™™™’’’’’’’’’’’’’’’’’’’’‘”%¢.‡ˆ¤äþ^êööööìììììììììììììøýþþþþþäÚ1ÛÛBBB++++§¤šz‰•ˆ&&‡)‡ˆåþþã×ÕddddddddddddddddddddÕ×ãþþãÚÚå11ÛÛ+§¤š™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™––––––––––––––––––––’‹,.-‡ˆ+þéúöööööìììììììììììììììììøýþþþþþäÚ1BÛBB+++++§¤šz‰•ˆˆ&ˆ•§þþ×ÕddddddddddddddddddddddddÕeþþèÚåå11ÛÛ+§¤š‰™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™––––––––––––––––––––'%¢€&Ûþþé÷ööööööììììììììììììììììììììëúcéþþþþþ^Ú1ÛBBB++++§§¤šš£šBþþ1fddddddddddddddddddddddddddddÖÚþÚå11ÛB+§š£‰™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™––––––––––––––––––––“%.-&1þþööööööööìììììç Ôçììììììììììììììëúcéþþþþþ^Ú1ÛBBBB+++§§ÚþþeÕddddddddddddddggddddddddddddddÕÛþþÚååå1ÛB+§š£™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™––––––––––––––––––––#,.&ÚþþêöööööööööìììììçâÐÐÐÐâçììììììììììììììëûüåþþþþèåÛBÛBBBÚþþ×dddddddddddddddÖþþfdddddddddddddddeþþåÛÛ1ÛÛ+§¤š‰™™™™™™™™™™™™™™™™™™™™™™™™™™™™™––––––––––––––––––––”,&äþ^úööööööööööìììììçâÐÐàààßÉÊÐâÔæìììììììììììììôûüåþþþþèåÛ1þþgdddddddddddddddfãþþãÕdddddddddddddddeþþ1Û++§š™™£™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™––––––––––––––––––––”ˆþþé÷öõöõöõöõöõöìììììçÐÐÐààßßÉÊ\ÅÅÃÉÐçìììììììììììììôêýþþþþþþ×dddddddddddddddÕÚþþþþ1ÕdddddddddddddddeþèÛB+§‰&€¢€.))‡&&™™™™™™™™™™™™™™™™™&&‡)).––––––––––––––––––––”ÛþýöööööööööööööìììììçÐÐàààßÉÊ\ÈÅÃÃÁÁ½½ÃÉâÔìììììììììììììöêýþþedddddddddddddddd1þþýéþþeddddddddddddddddÛþ5ÛB+¤•‡-.%—’––––––––.........––––––––––––––––––––––––––––––”ÛþûõöõöõöõöõöõõöìììììçÐÐààßßÉÊ\ÅÅÃLÁ½½½»»ºººÃÐìììììììììììýþ1Õdddddddddddddddeþþåúúåþþ×dddddddddddddddÕãþÚB+§&)€¢(’–––––––––––––––––––––––––––––––––––––––––––––––”ÛþûöõöõöõöõöõöõõìììììçÐàààßÉÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³½É æìììììúþþfdddddddddddddddgþþúúúû^þþgdddddddddddddddÖþþ1B+šˆ‡-¢%'–––––––––––––––––––––––––––––––––––––––––––––––”ÛþûõöõöõöõöõöõöõìììììçÐààßßÉÊ\ÅÅÃLÁ½½½»»ººÝÝ´´³³¬¬¡ÜÝÁÐçìåþ×dddddddddddddddÖþþ^ûùùùùêþþãfdddddddddddddddeþ^B+§™&).,”–––––––––––––––––––––––––––––––––––––––––––––––”ÛþûõõõõõõõõõõõõõìììììçàààÉÉÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒƒ&þãÕddddddddddddddfãþþùùùùùùcþþãÕddddddddddddddfãþ1++£ˆ)€¢(’––––––––––––––––––––––––––––––––––––––––––––––”ÛþûõõõõõõõõõõõõõìììììçààßßÉÊ\ÅÅÃLÁ½½½»»ººÝÝ´´³³¬¬¡ÜÙŒŒƒ~Úþ×hdhhdhhdhhdhhdÕ1þþüùùùùùùùùþþ1Õdhhdhhdhhdhhdh×þãB+¤•‡-¢%’––––––––––––––––––––––––––********************—ÛþûõõõõõõõõõõõõõìììììçààßÉÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒ‡þäÕhhhhhhhhhhhhhhÛþþýøøøøøøøøøøéþþehhhhhhhhhhhhhhÕþþÛ+¤™µ.%'**********************************************—ÛþûõõõõõõõõõõõõõìììììçàßßÉÊ\ÅÅÃLÁ½½½»»ººÝÝ´´³³¬¬¡ÜÙŒŒƒ+þ×hhhhhhhhhhhhiheþþéøøøøøøøøøøøùéþþhhhhhhhhhhhhhheþÚ+§&).,˜**********************************************—ÛþûõõõõõõõõõõõõõìììììçßßÉÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒƒ~ãþfiiiiiiiiiiihigþþåù÷÷÷÷÷÷÷÷÷÷÷÷û^þþÖiiiiiiiiiiiiiÖþ5B§£&).¢—**********************************************—ÛþûõõõõõõõõõõõõõìììììçßßÉÊ\ÅÅÃLÁ½½»»ºººÝÝ´´³³¬¬¡ÜÙŒŒƒ{‡þÚiiiiiiiiiiiijfþþ^ú÷÷÷÷÷÷÷÷÷÷÷÷÷÷ûþþãfiiiiiiiiiiiiiãþÛ+šˆ)€,(**********************************************—ÛþûõõõõõõõõõõõõõìììììçßÉÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒƒ~zþ×iiiiiiiiiiiiÕãþþööööööööööööööööêþþÚhiiiiiiiiiiiieþ1+šˆ-¢(**********************************************—ÛþûõõõõõõõõõõõõõìììììçßÉÊÈÅÅÃLÁ½½»»ºººÝÝ´´³³¬¬¡ÜÙŒŒƒ~Ûþgjjjjjjjjjjii1þþüõõõõõõõõõõõõõõõõõõýþþ1ijjjjjjjjjjiþÚ+š•-¢(**************************››››››››››››››››››››˜ÛþûõõõõõõõõõõõõõìììììçÉÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒƒ~vãþjjjjjjjjjjjBþþýõõõõõõõõõõõõõõõõõõõõéþþ+jjjjjjjjjjj‡þ+¤•-¢(››››››››››››››››››››››››››››››››››››››››››››››˜ÛþúõôõôõôõôõôõôõìììììçÉÊÈÅÅÃLÁ½½»»ºººÝÝ´´³³¬¬¡ÜÙŒŒƒ~vþþjjjjjjjjjjj×þþéöôôóôôôôôôôôôôôôôôôôôöåþþjjjjjjjjjjiþþ+š•-¢(››››››››››››››››››››››››››››››››››››››››››››››˜ÛþûõõõõõõõõõõõõõìììììçÊ\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒƒ~sþãkkkkkkkkkjˆþþþéBBBéüóóóóóóóóóóóóBBBBBåþþþ‡jkkkkkkkkkþþ+¤ˆ-¢(››››››››››››››››››››››››››››››››››››››››››››››˜Ûþûôõõôõõôôõôùôôìììììç\ÈÅÅÃLÁ½½»»ºººÝÝ´´³³¬¬¡ÜÙŒŒƒ~vþÛkkkkkkkkkþþþþþþþþþBòòòòòòòòòòòòþþþþþþþþþãkkkkkkkkkþþ+šˆ-,(››››››››››››››››››››››››››››››››››››››››››››››˜Ûþúôôôôôôôõøüûôôìììììç\ÈÅÃÃÁÁ½½»»ººÝÝ´´´³³¬¡¡ÜÙŒƒƒ~vvþÛlllllllllBÛÛÛÛÛÛÛãþBññññññññññññþþÚÛÛÛÛÛÛÛ¤lllllllllÚþÛšˆ)-,—››››››››››››››››››››››››››››››››››››››››››››››˜ÛþûôôôôôôõúýêôôìììììæâßÃLÁ½½»»ºººÝÝ´´³³¬¬¡ÜÙŒŒƒ~vmþB±vrrrrrrrrrrrrrrmÛþBññññññññññññþþrrrrrrrrrrrrrrrrrÚþ+£&).,˜››››››››››››››››››››››››››œœœœœœœœœœœœœœœœœœœœÛþúôôôôôöêýýýúôôìììììììììæÔâɽ»»ººÝÝ´´´³³¬¡¡ÙÙŒƒƒ{vvrþB <”vvvvvvvvvvvvvvÛþBñëëëëëëëëëëëþþvvvvvvvvvvvvvvvvvþþ§™&.% œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÛþúôôôôøüýýúôôôììììììììììììììÔâÅ»ÝÝ´´³³¬¬¡ÜÙŒƒƒ~vrr€þ^ —~~~~~~~~~~~~ÛþBëëëëëëëëëëëëþþz~~~~~~~~~~~~~~~~~þþ¤™µ-.°ŸœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÛþúôôôûýýýc÷ôôôôììììììììììììììììììÔâú³¬¬¡¡ÙÙŒƒƒ{vvrrrþþK ;0ƒƒƒƒƒƒƒƒƒƒÛþBðëëëëëëëëëëëþþƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ€þšˆ-¢(›œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÛþúôõýýýûôôûûôôììììììììììììììììììììííÔâWÝÜÙŒƒƒ~vrrrrÚþ> 70ÙŒŒŒŒŒŒÛþBððððððððððððýý` <<64«ÙŒŒŒŒŒŒŒ)þÚ£&).,—›œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÛþú÷ýýùóõýêôóììììììììììììììììììííííîîîîïâX݃{vvrrrrBþ¶ ;430´Býððððïðïðïðïðýý` 4¬ÙÙÙÙþ1™µ.% œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÛþúêýýöôùýýûôóìììììììììììììììììíííîîîîîïïïïïðaƳ~rrroþ¤Äýcïïïïïïïïïïïïýý` ´¡¬ÛþBˆ-¢(ŸœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÛþúûýûóóûýýýõóóìììììììììììììììííííîîîîîïïïïïððððððaÌ´-þcýcïïïïïïïïïïïïýý`@,þþš&).,—›œœœœœœœœœœœœœœœœœœœœœœœœœœœžžžžžžžžžžžžžžžžžžžžÛþúúøóöcýýýûóóóóììììììììììììììííííîîïîïïïïïððððððëëëëëñþ`Äýcîîîîîîîîîîîïýý`¶þˆ‡-¢° žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÛþúóóùýýøóóóóóììììììììììììííííîîîîîïïïïïððððððëëëëëññþ¤cýcîîîîîîîîîîîîýý`BþB&).,¡›žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÛþúóêýýýêõóóóóóóìììììììììììííííîîîîïïïïïððððððëëëëëññññùþþÌÄýcîîîîîîîîîîîîýý`Oþþ™-¢° ›žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÛþúûýýúóóóóóóóóìììììììììííííîîîîîïïïïïððððððëëëëëñññññòBþÄcýcííííííííííííýý`þ1µ.,¡ŸžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÛþúûýü÷óóóóóÓÞóóììììììììííííîîïîïïïïïðððððððëëëëñññññòòòúþ^]cýcííííííííííííýý`_þþš)-¢( ›žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÛþúûêõóòóòóÂvSóòììììììííííîîîîîïïïïïððððððëëëëëñññññòòòòòBþýÄýcìììììììììììíýý`Bþ1-¢°›žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžÛþúõòóòóòÓ­vvSóòìììììííííîîîîïïïïïðððððððëëëëñññññòòòòòòóúþþ`cýü÷÷÷÷÷÷÷÷÷÷÷÷ýý`þ5&-.,¡Ÿžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžž ÛþúòòòóòÌŒ{{{TòòìììííííîîîîîïïïïïððððððëëëëëñññññòòòòòòóóóüþÎcýýýýýýýýýýýýýýýý`_þ+.,­¦žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžž Ûþúòòò󼃃ƒƒƒTòòììííííîîîïîïïïïðððððððëëëëñññññòòòòòóòóóóôöéþéÏâcýýýýýýýýýýýýýýýý` âÏéþ1·.,­¦žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžž©©©©©©©©©©©©©©©©©©©© Ûþúòòa­ƒƒƒƒƒƒÞòòííííîîîîîïïïïïððððððëëëëëñññññòòòòòòóóóóóôôùþ âÒ ÓâÏéþ5).¢­ ž©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©© Ûþúò̃ƒƒƒƒƒƒƒÞòòíííîîîîîïïïïðððððððëëëëëññññòòòòòòòóóóóôôôôôûþþ    éþäµ.,­ž©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©© ÛþúÌŒŒŒŒŒŒŒŒŒÞòòíîîîîîïïïïïððððððëëëëëñññññòòòòòòóóóóóôôôôôõõêþþý éþäµ.,­ ž©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©© ÛþúÞÙÙÙÙÙÙÙÙÙÞòòîîîïîïïïïïððððððëëëëëññññòòòòòóòóóôóôôôôôõõõõöêþþéÒ åþ䇢,­¦ž©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©© ÛþúÌÜÜÜÜÜÜÜÜÜÞòòîîîïïïïïððððððëëëëëñññññòòòòòòóóóóóôôôôôõõõõõõõú^þê  êþþÚ¢°¡¦ž©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¦ÛþúÌÜÜÜÜÜÜÜÜÜÌññîîïïïïïððððððëëëëëññññòòòòòòòóóóóôôôôôõõõõõõõõõöùéþþB ÑéþþÛ.,­ ¥¥©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¦ÛþúΡ¡¡¡¡¡¡¡¡Ìññïïïïïððððððëëëëëñññññòòòòòòóóóóóôôôôôõõõõõõõõõööööüþþþ ÑBþþä™,°¡¦¥©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¦ÛþúÌ¡¡¡¡¡¡¡¡¡Ìññïïïïððððëëëëëëëñññññòòòòóòóóóôóôôôôõõõõõõõöõöööööö÷ùýþþþé`êéþþþ+.­¡¦¥¥©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¦Ûþúά¬¬¬¬¬¬¬¬Îññïïðððððëûüêúôñññññòòòòòòóóóóóôôôôôõõõõõõõõõöööööö÷ö÷÷ùýþþþþéü`ùaÔÔÔÔaù`üéþþþþ+-­ ¦¥¥©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¦Ûþúγ³³³³³³³³ÎññïððððððëcþþþþB÷ñòòòóóóóóóóóôôôôõõõõõõõõõööööööööö÷÷÷÷÷ùcéþþþþþþþþþþþþþþþþ1¤).°¦¥©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦Ûþúγ³³³³³³³³ÎñëðððððëëëþþþþþþúòòõBýcûùóóôôôôôõõõõõõöõõöööööö÷÷÷÷÷÷÷÷÷÷ø÷ùêüééþþþþþþé^þ1§•¶-¢­ž¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦Ûþúδ³´³´³´³´Îññððððëëëëcþþ`þþúòòýþþþþþþôôôôõõõõõõõõööööööö÷öö÷÷÷÷÷÷÷ø÷ø÷øøøøøøøùøøùéþÛ¤•‡-¢­ž¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦Ûþúδ´´´´´´´´ÎëëððëëëëëëcþþÐÑþþúòþþþþþþþcôøéþþéBüúõöööööö÷ö÷÷÷÷÷÷÷÷÷ø÷÷øøøøøùøøùøùùùéþÛ¤•¶-¢­ž¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦ÛþúÏ´´´´´´´´´ÏëëðëëëëëññcþþâÑþþú÷^þ]Í>þþcê^þþþþþþþþåêööù÷öö÷÷÷÷÷÷÷÷ø÷÷øøøøøøøøøùøùùùùéþÛ¤•‡-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦ÛþúÏÝÝÝÝÝÝÝÝÝÏëëëëëëññññcþþâÑþþúBþþ¶ßÉÊþþBþþþé§ÄBåþþþþýøüþéBüêú÷÷÷÷ø÷øøøøøøøøøùùøùùùùùéþÛ¤•¶-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦ÛþùÏÝÝÝÝÝÝÝÝÝÏëëëëëñññññcþþâÑþþBþþýß[[Êþþþþþ¶ÁÁ½½½¾Ë^þþéüþþþþþþé÷øø÷øøøøøøøøùøøùùùùùùùéþÛ¤•‡-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦ÛþúÏÝÝÝÝÝÝÝÝÝÏëëëñññññòòcþþÐÑþþþþÞÉÉÊþþþþ§MöBB+¶»¾1þþ^þþåþþþé÷êéþþþþåBcùøùùùùùùùùùùéþÛ¤•¶-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦ÛþùϺººººººÝºÏëðñññññòòòcþþâÑþþþþ`à`þÉÊþþþþ¿ÇÄþþþþþ1¹¹Úþþþþ´°1þéýþþþþþþþþþ^øùùùùùùùùùéþÛ¤•‡-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦ÛþúẺººººººáëëëñññòòòòòcþþâÑþþþËàÌ^þÉÊþþþþBÄ^þ^éþþ+ºµþþþþ´´Ûþþþþ^§Ûþþþþ1úùùùùùùùúéþÛ¤•¶-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦Ûþùá»»º»º»ÁbððððññòòòóòòcþþâÑþþåÌá+þþÉÊþþþþþþþþýc^þþººþþþþ´´Ûþþþ^.ÜÙÙŒ…w&^þþ1úùùùùúùùéþÛ¤•¶-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¦Ûþúá»»»»½áðëõøððòòòòòòóócþþÐÑþþÑß`þþþÉÊþþýýåþþþþþþþþ^ººþþþþ´´Ûþþþ&¡¢§þþ1ww1þþùùúùùúùéþÛ¤•‡-¢­©¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ªªªªªªªªªªªªªªªªªªªª«Ûþùá»»½ZbððúüúððòòòòòóóócþþâÑþÄÐ]^þþþÉÊþþüêþþþþþþþþ+>º¹þþþþ´´Ûþþþ¡¡+þþþþþã€wÚþ^úùùùúùúéþÛ¤•¶-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«Ûþúá½Ááðð÷cüüúððòòóóóóóôcþþâÑéÐàBþþþþÉÊþþéþþþ+Ä>¾½»»»»™þþþþ´´Ûþþ^Û§þþéýåþþBuˆþþêúùúùúùéþÛ¤•¶-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«ÛþùáÊbðñûüüü÷ððòòóóôóóôcþþâ__àþþþþþÉÊþþþþþ>ÁÁ½½»»»·§þþþþþ´´ÛþþþþþþþBýéþþÚ~wþþùúùúúúéþÛ¤•‡-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«ÛþùðððøcüüüûñðððóóóóóôôôcþþââÐ_þþþþÉÊþþþþ§ÃW¶ËBBåþþþþþéþþ´´Ûþ1üþþþþþþþþþÛvvþþùúúùúúéþÛ¤•¶-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«Ûþùðñêüüü÷ððóððóóóóôôôôcþþÐâÐéþþêcþþÉÊþþþþÄÁ¶þþþþþþþþþBéþþ´´ÛþéýþþþþþþÛÛ¤w~þþcúùúúúúéþÛ¤•¶-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«Ûþù÷cüüüúððóêúððóóôôôôôõcþþcÑËþþýöüþþÉÊþþþþ¤WÄþþþþþþþþþþþþþ´´ÛþþþþÚ•)ÙŒƒƒyyÛþþûúúúúúúéþÛ¤•‡-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«ÛþùúüüõðïúüüúððóôôôôôõõüþþþþþþåøöüþþÊÊþþþþ^R¸þþþþþþ˧åþþþþ´´ÛþþþÚ,ÜÙÙŒƒƒ•ÚþþéúúúúúúúéþÛ¤•¶-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«ÛþùúcúððõüüüùððôôôôõõõõêéþþþþþûööüþþBÄþþÚþþ+Ǹ1þþþ§ºº+þþþþ´´Ûþþþ™¡,¤1þþþþþþþåûúúúúúúúéþÛ¤•-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª«Ûþùöóðëúüüüc÷ðïïôôôõõõõõõõõùûüê÷ö÷üþþþþþþü1þþ1>ÁO·>»º>þþþþþ´´Ûþþþ&¡§þþþþþþþþþåúúúúúúûéþÛ¤•¶-¢­¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª////////////////////«Ûþùïðöcüüüêëïðïðôõõõõõõõõõööööööööúüéåþþþüùéþþþ1ĸ··Ëãþþéþþ´´Ûþþþš¡ÛþþþþþþþþþþþúúúúúúúéþÛ¤•¶-¢­¨///////////////////////////////////////////////////////////////////«Ûþùñúüüücöïïïïïïõõõõõõöõööùööööö÷÷÷÷÷÷÷ûû÷ùýþþþþþþþþþþþþ´´Ûþþþ^,‡þþþþþþ‡•ÚþþúúúúúûúéþÛ¤•¶-¢­¨///////////////////////////////////////////////////////////////////«Ûþùúüüüúëïïïïïïïõõõõõõõöõþþéýüûù÷÷÷ø÷÷ø÷ø÷÷øúÚþþþþþåùþþåÛÚþþþþ1¢-§^þã&{yÚþåúúúûúúûéþÛ¤•¶-¢­¨///////////////////////////////////////////////////////////////////«Ûþùúüöïïïïïïïïïõõõõõöööêþþþþþþþþþéýüûú÷÷øøøøøøøúêêêúùùùþþþþþþéåþþÚ&Œ%ƒƒ~•þþúúúúúûûéþÛ¤•‡-¢­¨///////////////////////////////////////////////////////////////////«Ûþùúúïïïïïïïïïïïõõõõöööù^þcëùêcBþþþþþþþéýüêúøøøøùùùùùùùûcéÚþþéú1þþþ^+zÛþþäûúúûúûûúéþÛ¤•µ-¢°0///////////////////////////////////////////////////////////////////«ÛþùïïïïïïïïïïïïïõõöööööéþéìíííîîîñùêüBþþþþþþþéýêúùùùùùùùùùúùêúú^þþþþþþþþ^êûúûúûúûûéþÛ¤™µ·.°­¬«0±ªª/////////////////////////////////////////////////////////////«ÛþùïïïïïïïïïïïïïõöööööüþôíííîîîîïïïïððöùBþþþþþþþþéýüêúùùùùúùúùúúûüé^þþþäBêúúúûúûûûûéþÛ§£&-.,°°­­«0ª////////////////////////////////////////////////////////////«Ûþùîïîïîïîïîïîïîöööööûþþûíííîîîîïïïïðððððëëëë÷úcBþþþþþþþ^éýüêûúúúúúúúúúúúúúúúûûúûûûûûéþÛ+š•µ)·-..¢°°¬0ª///////////////////////////////////////////////////////////«Ûþùîïîïîïîïîïîïîööööø^þíííîîîîïïïïïðððððëëëëññññòò÷úcBþþþþþþþ^éýüûúúúúúûúûúûúûûûûûûåþÛ+§£•&¶¸--¢°­«±///////////////////////////////////////////////////////////«Ûþùîîîîîîîîîîîîîö÷ö÷ýþéëíííîîïîïïðïðððððëëëëññññòòòòóóóóôøúcýBþþþþþþþ^éýûúûûûûûûûûûûéþÛ++§š™•ˆ&¶)-¢°¬ª///////////////////////////////////////////////////////////«Ûþùîîîîîîîîîîîîîöööcþþ÷íííîîîîïïïïðððððëëëëññññòòòòòòóóóóôôôôõõùûüýéþþþþþþþäéýcûûûûûûéþ1B+++§¤£•&¶-.°¬±///////////////////////////////////////¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯«Ûþùîîîîîîîîîîîîî÷÷úþþêíííîîîîïïïðïðððððëëëëññññòòòòòóóóóôôôôõõõõõõöõöúêüý1þþþþþþþéýücéþ1BBB+++§£ˆµ·.°¬/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯«Ûþùîîîîîîîîîîîîîöøéþýíííîîîîîïïïïðððððëëëëññññòòòòòóóóóôôôõõõõõõõõõööööö÷ö÷úêüBéþþþþþþþþäå11BB+§š•¶-¢°«/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯«Ûþùîîîîîîîîîîîîî÷ýþëíííîîïîïïïïðððððëëëëññññòòòòóóóóôóôôôôõõõõõöõöööö÷öö÷÷÷÷÷÷÷÷ûêüBéþþþþþþþ51Bˆ-¢­0/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯«Ûþùíííííííííííííþþùíííîîîîïïðïðððððëëëëëññññòòòòòóóóóôôôôõõõõõõõöööööö÷ö÷÷÷÷÷ø÷ø÷÷øøøøûêüB1þþþþ^&·.°«±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯«Ûþùííííííííííííõ^þíííîîîîïïïïïðððððëëëëññññòòòòòóóóóôôôôõõõõõõöõööööö÷ö÷÷÷÷÷ø÷ø÷øøøøøøøùùùùùüþþ£¸.,­0/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯«ÛþùíííííííííííòýþÛÝÎâîîîîîïïïïðððððëëëëññññòòòòòóóóóôôôõõõõõõõõõööööö÷ö÷÷÷÷÷÷÷÷÷øøøøøøùøùøùùù1þÛ-¢°«/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®®®®®®®®®®®®®®®®®®®«Ûþùíííííííííðôø^þÖddddil¹Uábððððððëëëñëñññòòòòóòóóôóôôôôõõõõõöõöööö÷öö÷÷÷÷÷÷ø÷øøøøøøøøøùùùùùþ5&·.°¬±®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®/¬ÛþùíííííííîòööêþÚdddddddhdhhiv­¼aëëëëññññòòòòòóóóóôôôôõõõõõõõöööööö÷ö÷÷÷÷÷÷÷÷÷÷øøøøøùøøùùùûþþ¤)-,¬0/®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®±¬Ûþùííííííðõõõõåþgdddddddddhhhhiiiiiv°¼ÌÓòòòòòòóóóóôôôôõõõõõõöõööööö÷ö÷÷÷÷÷÷ø÷øøøøøøøøøùùùùù1þ1·¢°«/®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®/0°ÛþùììììîòõõõõûþãÕddddddddhhhhihiiiijjjjjkv°RÍÓôóóôôôôôõõõõõõõööööö÷ö÷÷÷÷÷÷ø÷ø÷øøøøøùøùùùùùüþ5•·.°¬±®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®/¬,ÛþùìììëôôôõõõýþedddddddddhhhhhiiiijijjjjjkkkllØv­O]õõõõõöõöööö÷öö÷÷÷÷÷÷ø÷÷øøøøøøøøùùøùùû^þ+-¢­0/®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®/0­¢1þøìîòóóôôôõ÷þþfddddddddddhhhhhiiiiijjjkjkkkllmrvv~ƒƒ¹OÍÒöööööö÷ö÷÷÷÷÷÷÷ø÷÷øøøøøùøøùùùùéþå&).,¬/®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¯³°.åþùëòóóóóôôôcþÛddddddddddhhhhhiiiiijjjjjjkkkllmrvv~ƒƒŒŒÙÜ¡¡¬¹¼]ÒÒ÷÷÷÷÷÷÷ø÷÷øøøøøøøøùùùùùcþ¤&¸.°¬¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¯0­¢&þþ÷òòòòóóóóôåþgddddddddddhhhhiiiiijijjjjkkkkllmrv~~ƒƒŒŒÙÜ¡¡¬¬³³´´ÝÝÂ]ÒÒ÷÷øøøøøøøùøùùùùùú^þ1£&¸.°¬¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¯³°.Bþñòòòòòóóóûþãdddddddddddhhhhhiiiiijjjjjkkkkllmrv~~ƒƒŒŒÙÜ¡¡¬¬³³´´ÝÝݺº»»»Í]Ò øøøøùøùùùùBþ^+šˆ-¢­0¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¯±­¢þþ÷ññòòòòòóóýþ¤kkjjihdddddhhhhhiiiiiijjjjjkkkllmrv~~ƒƒŒÙÙÜ¡¡¬¬³³´´ÝÝݺº»»½½ÁÁÁÃÅÞÍÒ ùùþþÛ+¤™µ·.°¬±®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¯³°.Bþññññòòòòò÷þþ€rv{ƒŒŒ…rlkjjhhhiiiiijjjjjkkkklØmrv~~ƒƒŒÙÙÜ¡¡¬¬³´´´ÝÝݺº»»½½½ÁÁÃÃÅÈ\ÊßàÏËþ5B++šˆ¶-¢°2¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®0­¢þþöëëññññòòòcþBrsv{ƒŒŒÙÜ¡¬¬³³´¡ÜvykkjjjjjkkkklØmrv~~ƒƒŒÙÙÜ¡¡¬¬³´´´ÝÝݺº»»½½ÁÁÁÃÅÈ\ÉßßààÌþ1B+¤™µ).°¬0®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¯³°.Bþýëëëëññññòòþ‡rsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»º´³¡Œ~lklØrrv~~ƒƒŒÙÙÜ¡¡¬³³´´´Ýݺºº»»½½ÁÁÃÃÅÈ[ÊÉßßàÐþèÛ++š•¶·¢°0¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®²²²²²²²²²²²²²²0­¢)þþùðëëëëññññêþÚrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃŽ½´´¡Ü~ƒƒŒÙÙÜ¡¡¬³³´´´Ýݺºº»»½½ÁÁÃÃÅÈ\ÊÉßàààÐåþÚB+§™&).,¬±²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯³°.BþBðððëëëëñññBþorrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßàÉÈL½Ýݬ¬¬¬³³´´ÝÝÝݺº»»½½ÁLÃÅÅ\ÊÉßßààÐ`þþÛB+¤•µ·¢°³¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²±­,)þþùððððëëëëë÷þþwrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐââââ áÐZÁ³³´´Ýݺº»»½½ÁÁÃÃÅÈÊÉßßààÐÐBþÚB+§£&-°­0¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯³°.BþBïïðððððëëûéþ+rrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââ  ˆ³´´Ýݺº»»½½ÁÁÃÃÅÈ[ÊÉßßàÐÐ_þþ1B+¤•µ·.°³¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²±­¢·äþùïïïïððëûåþþþrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐââââ ù^°´´´Ýݺº»»½½ÁLÃÅÈ\ÊÉßàààÐÐþãB+§£ˆ-¢­±¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯0­¢¤þBîïïïïòþþão€rrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐÐâââ Ñþ™´´ÝÝݺº»»½½ÁÁÃÅÅÈÊÉßßààÐÐÒþ1B+¤•µ·.°³¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯«°-äþùîîîõþþÚ•wrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââ cþ^°´´Ýݺº»»½½ÁÁÃÃÅÈÊÊßßààÐÐÐcþ5++¤•&).°¬¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯¬°šþBííùþþþ1ˆrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââââ b þþ§´´Ýݺºº»½½ÁÁÃÃÅÈ\ÊÉßààÐÐÐÓåþ1¤£•µ·.,¬¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²±¬¢äþûúBþþþÛrrrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââ þþþ.´´Ýݺº»»½½ÁLÃÅÈ\ÊÉßßààÐÐÐ`þ£•&·.°¬¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯«þþåþþþÛ€rrrrrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐÐââââ Bþäþ+´ÝÝݺº»»½½ÁÁÃÅÅÈÊÉßßààÐÐââéþÛµ)·.¢°«¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¯°^þþþäþþrrrrrrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââ BþÛþþ·´ÝÝݺ»»½½ÁÁÃÃÅÈ[ÊÉßààÐÐÐâÑþþ>.¢°¬±¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²™þþÚ&¢þþwrrrrrrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐââââ bþ+1þÛ´Ýݺºº»»½ÁÁÃÃÅÅ\ÊÊÉàààÐÑËþþÛ¢°­¬0¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²ãÛµ±±¸þÚrrrrrrrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââ â þþ§¤5þ¶ÝÝݺº»»½½ÁÁÃ\Y\È_`Äýåþþþþþþ^.¬0±¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¢·²²²¯ˆþÛrrrrrrrrrrrrrrsv{ƒŒŒÙÜ¡¬¬³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐÐâââ aþþš•+þÚ´Ýݺº»»»½ÁR>ĤBþþþþþþþ1+™)¢0¯¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²+þþþþþþþ1ÛÛ+ooˆnv{ƒŒŒÙÜ¡¬³³³´´ÝÝݺº»»½½ÁÁÃÃÅÈ\ÊÉßßààÐÐâââ Ñþ™&µäþµÝººº>¸ÄBåþþþþþþ^Ûš&·0±¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²µ§ÛÛ1þþþþþþþþþþþþþþþãÛÛÛ™‡))°³´´ÝÝݺº»½ÁÁÁÁÃÃÅÈ\ÊÉßßààÐÐââââ Ñþ刵)£þ^ˆ§Ûþþþþþþþ1§™)°±¯¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²···™™™+ÛÛåþþþþþþþþþþþþþþþåÛÛ+ĕķ··ÁÁÁÃÅÈ\ÊÊYÊßàÐÐââââ `þÛ·>¢Úþþþþþ^Û™&-±±¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¢··™™™ÛÛÛþþþþþþþþþþþþþþþþéBBËÄÄ`ÑÑ_ÐÐââ â cþ§-.¢°&1§™·°¯¯¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²².··µ™™§ÛÛ1þþþþþþþþþþþþþþþBBBcþ𢰰¬³¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²···™™™+ÛÛ^þþþþþþþþþþþ&­¬³0¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²¢··™™šÛÛ-±±¯¯¯²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžnsis-3.11/Contrib/Graphics/Wizard/orange-uninstall-nsis.bmp000077500000000000000000001465341477201124000237640ustar00rootroot00000000000000BM\Í2(¤:*É  ÿÿ{||`aa¤¥¥˜™™5bykÄòmÅólÅòoÆópÇóqÇô8cy9dzsÈôtÉôwÊõxËõ{Ìö}ÍöÎ÷@g{XŒ§ƒÐøÍôFo„@ex~Æë‡Òù…ÏõW†žŠÓù‰ÑöÖûŽÓ÷ŠÍðaŠŸ]„˜—ÂØžÊߢÍã¥ÐæªÕê®Øí±Ûð´Þó³Ýò¶ßô«Òæ·àõ 2’ÈX¸ïc½ðkÀñ7byh·áqÃòo¿êtÄòvÉõ;dzvÅòyËözËöK}˜zÇó@j€>f{~Í÷€Î÷\”²Ïø~Éòh¦Ç‚ÏøÊó„Ðø†Ñùp¯Ñ„ËôCh|ˆÒù{¾â‰Óú<\m8VfŠÓúy¸ÚAcu5P_ÔûŒÔúV™ŽÕûŒÒ÷†ÈìÖüÖûŒÏôÔùl ¼S{’×ü…Âå`‰Ÿ“Îïf¦™ÔöcŠŸE`o'6>->GŸ×öSn}¥Ù÷ŠµÍ‘¼ÔªÛ÷®ÝøšÅÜ±Þø§Òé°Úð¸á÷ºâø¸ßõ¼äù¾äù}’žÌêú×îû=¬íK²î:f€JtŽ.FTˆÌô“Ñõ"(m˜±k‰›ªÖò²Üöµßø¹âüŒ«¾Äæú¿Úêiv~ëöý œÊè°Ýü³Þü´ßü¯Ùô¶àüVdmÑáìÚèñ«Ùû¬Úû®Ûû$+0œÌõ¢Òû¦Õû©×û>j“–Êú•Çó›ÍúžÐû’ÆùÇÓß¹ÉÚæñþMxÃwDpÇ[†×cŽál–é{¢ð޳ûâìÿP|ÝZ†édñj•ñošúrúv úq›ñ|¥úÊÛÿ}†š×äÿDqÝT€ðY…ñ^Šù_Šñdùj•ú¿ÑþHtðKxðQ}ùP|ñUùY…ù´Èýª¸ÝDqùFsùHtùJvùNzùÿ ;''Í88þaEE×^^ÿ::—ttÿaaÏ……ÿoopÿÿÿüüüùùùõõõðððëëëäääÞÞÞÙÙÙÒÒÒÉÉÉ¿¿¿±±±‹‹‹LLLL¸ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛLˆ¸ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛLˆËÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ:ˆˆËÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ:ˆˆËÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ7¬ˆËÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜCˆËÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ7ˆËÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝLËÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݸÓÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ:ˆ¸ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݸ¬ÓÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ7E¸ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݸ¬ÓÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝC¬ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¸¬ÓÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ L¬ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¸¬ÓÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ :ˆˆÔÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¸¬ÓÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ ¬ËÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞ߸¬ÔÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞßÞß I¸ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß߸¬Ôßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß :¬ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß߸¬Ôßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß CˆÔßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß߸¬Ôßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß I¸ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß߸¬Ôßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß 7ˆ¸ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÕ¸¬Ößßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ˆÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ¸¬ÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ :ËÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ¸hE9¬ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ C¬ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ¸_vgE¬ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ LˆÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ×Õ¸_vvwgˆ¬ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ E¸ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ¸_vvvvv”ˆ¬ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ LˆÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ׸_vvvvvvv”ˆ¬ÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ E¿×××××××××××××××××××××××××××××××××׸_vwvwvwvwv”ˆ¬Ö××××××××××××××××××××××××××Ö¬ L¬×××××××××××××××××××××××××××××××××׸_wvwvwvwvwwv”E¬Ö××××××××××××××××××××××××Ö¬ Eˆ¿×××××××××××××××××××××××××××××××××¶_wvwvwvwvwvwvwgˆ¬Ì××××××××××××××××××××××̬ L99999999¬×××××××××××××××××××××××××××××××××¶999999999999_wwwwwwwwwwwwwww”ˆ99999999999¬Ì××××××××××××××××××××̬999 8‰99999999Ì××××××××××××××××××××××××××××××××¶999999999999_wwwwwwwwwwwwwwwww”ˆ99999999999¬Ì××××××××××××××××××̬9999 :99999999¬××××××××××××××××××××××××××××××××¶999999999999 wwwwwwwwwwwwwwwwwww”ˆ99999999999¬Ì××××××××××××××××̬99999 C99999999ÌØ×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø×Ø¶999999999999 wwwwwwwwwwwwwwwwwwwww”ˆ99999999999¬ÌØ×Ø×Ø×Ø×Ø×Ø×ØØÌ¬999999 :99999999¬ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ¶999999999999 wwwwwwwwwwwwwwwwwwwwwww”ˆ99999999999¬ÌØØØØØØØØØØØØÌ¬9999999 I¿ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ¶ wwwwwwwwwwwwwwwwwwwwwwwww”ˆ¬ÌØØØØØØØØØØÌ¬ ˆ¬ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ¶ wwwwwwwwwwwwwwwwwwwwwwwwwww”ˆ¬ÍØØØØØØØØÍ¬ L¶ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ¶ (w(w(w(w(w(w(w(w(w(w(w(w(w(w(”ˆ¬ÍØØØØØØÍ¬ CÍØØØØØØØØØØØØØØØØØØØØØØØØØØØØ¶ (((((((((((((((((((((((((((((((”ˆ¬ÍØØØØÍ¬ <¶ÎØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎÎØÎ¶ (((((((((((((((((((((((((((((((((vˆ¬ÍÎÎͬF L¿ØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎØÎζ (((((((((((((((((((((((((((((((((((vF¬Íͬv C¬ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎζ (((((((((((((((((((((((((((((((((((((v¬¬ˆv( <¶ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎζ (((((((((((((((((((((((((((((((((((((((vFv(( LÀÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎάv((((((((((((((((((((((((((((((((((((((((vFv((( C¬ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎͬˆv((z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(vˆFv(z(z ¶ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎϬEv(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvFˆv(zzzz LÀÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎϬEv(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvFEvzzzzzz ¬ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎϬEvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvFvzzzzzzz ‰¶ÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÐϬFvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvEEvzzzzzzzz 8¹ÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎÐÎϬEvzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvEEvzzzzzzzzz LˆÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϬEv))))))))))))))))))))))))))))))))))))))))vEEv)))))))))) ¬ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϬEv))))))))))))))))))))))))))))))))))))))))vEEv))))))))))) C¶ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϬEv))))))))))))))))))))))))))))))))))))))))vEEv)))))))))))) ¹ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁ¬Ev))))))))))))))))))))))))))))))))))))))))vEEv))))))))))))) :ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁ¬Ev))))))))))))))))))))))))))))))))))))))))vv)))))))))))))) I¬ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁ¬Ev))))))))))))))))))))))))))))))))))))))))))))))))))))))) ¶ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁ¬Ev****************************************************** C¶ÑÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÁ¬Ev***************************************************** ˆ¹ÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÑÐÁ¬Ev**************************************************** 8ÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÁ¬Ew*************************************************** L¬ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÁ¬Ew************************************************** L‰ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÁ¬Ew*+*++++++++++++++++++++++++++++++++++++++++++++++ I¶ÂÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑѬEw++++++++++++++++++++++++++++++++++++++++++++++++ ¶ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑѬEw+++++++++++++++++++++++++++++++++++++++++++++++ C¹ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑѬEw++++++++++++++++++++++++++++++++++++++++++++++ C¹ÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃѬ?Ew+++++++++++++++++++++++++++++++++++++++++++++ ˆºÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑÃÑì?Ew||||||||||||||||||||||||||||||||||||||||||||ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃìEw|||||||||||||||||||||||||||||||||||||||||||ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃìEw||||||||||||||||||||||||||||||||||||||||||ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÉEw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Q¬ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃìEw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Q¬ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃìE(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,QCÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÃÆ¬E(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Q¬ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÆ¬E(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:CÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÆ¬E(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, QCÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ»------------------------------------ Q‰IÇÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅĉE(------------------------------------ Q‰Ž²ÇÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÄÆ‰E(-------------------------------------Q‰Ž²²½ÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ‰E(-------------------------------------- Q‰Ž²²²²ÇÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ¬?E(---------------------------------------Qm²²²²‹½ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ‰E(----------------------------------------Ek²²²²²²²ÇÅÇÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ‰E(-----------------------------------------k²²²²²²²²½ÇÅÅÅÅÇÅÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÅÆ‰E(}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Ek²²²²²²²²²²½ÇÅÅÅÇÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ‰?E(}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EFkj²²²²²²²²²²²½ÇÅÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÆ‰?Ez}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Ckj²²²²²²²²²²²²²½ÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇÅÇǼ‰Ez}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C'Z²²²²²²²²²²²²²²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇǼ¬?Ez..............................................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>I?hQ²²²²²²²²²²²²²²²²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÆ‰?Ez...............................................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>I??????_g²²²²²²²²²²²²²²²²²²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇǼ‰???????????Ez................................................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>L??????‰Ž²²²²²²²²²²²²²²²²²²²²²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇǼ‰???????????Ez.................................................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Q??????m²²²²²²²²²²²²²²²²²²²²²²²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇǼ‰???????????Ez..................................................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;??????k²²­²­²­²­²­²­²­²­²­²­²­²­²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇǼ‰???????????Ez...................................................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>E??????kj²²²²²²²²²²²²²²²²²²²²²²²²²²²²²½ÇÇÇÇÇÇÇÇÇÇÇÇÇǼ‰???????????Ez..............................................00000/C?????'v²­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­²½½ÇÇÇÇÇÇÇÇǼ‰???????????Ez00000000000000000000000000000000000000000000/////////I?????hL­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­²½½ÇÇÇǼ‰???????????Ez00000000000000000000000000000000000000////////////////L??????‰Ž­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­²½ÇC???????????z0000000000000000000000000000000000/////////////////////:??????k­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®Žkk_h‰E????Ez0000000000000000000000000000////1111111/*+11111111111111??????Fkj­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®Žkkkkkkkkk'__)/////0000000000000////////1111111111111/+mm*/111111111111C?????_Q­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®Žkkkkkkkkkkkm+111111111111111111111111111111111111111/+mkkm+/11111111111I??????hŽ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®Žkkkkkkkkkkkm+1111111111111111111111111111111111111111+mkkkkm+11111111111L??????k¯­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®Žkkkkkkkkkkkm+1111111111111111111111111111111111111111+mkkkkkkm+1111111111=??????Fkj­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­®Žkkkkkkkkkkkm+1111111111111111111111111111111111111111+mkkkkkkkkm+111111111‰?????_L¯­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®Žkkkkkkkkkkkm+3333333333333333333333333333333333333333+mkkkkkkkkkkm+33333333I??????hŽ­­­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯¯­¯®Žkkkkkkkkkkkm+3333333333333333333333333333333333333333+mkkkkkkkkkkkkm+3333333AL??????Ek®¯¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯­¯¯®Žkkkkkkkkkkkm+3333333333333333333333333333333333333333+mkkkkkkkkkkkkkkm+333333??????'v­¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®Ž&&&&&&&&&&&m+3333333333333333333333333333333333333333+m&&&&&&&&&&&&&&&&m+33333 ?????hޝ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®Ž&&&&&&&&&&&m+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+m&&&&&&&&&&&&&&&&&&m+~~~~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL??????&®¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯Ž&&&&&&&&&&&&+3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+m&&&&&&&&&&&&&&&&&&&&m+~~~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=?????? v¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯v&&&&&&&&&&&&”~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+m&&&&&&&&&&&&&&&&&&&&&&m+~~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ?????hm¨¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯Z&&&&&&&&&&&&”{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+m&&&&&&&&&&&ŽŽ&&&&&&&&&&&m+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL?????E&®¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯v&&&&&&&&&&&&”’~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+m&&&&&&&&&&&Ž®®Ž&&&&&&&&&&&m+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@???????'g¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯v&&&&&&&&&&&&”~~~2m&&&&&&&&&&&ލ¯¯¨Ž&&&&&&&&&&&mBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFF‰m­°°°°°°°°°°°°°°°°°°°°°°°°°°°°v&&&&&&&&&&&&”2m&&&&&&&&&&&ލ°°°°®Ž&&&&&&&&&&&BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBL?FFFFFkv°°°°°°°°°°°°°°°°°°°°°°°°°°°°°v&&&&&&&&&&&&”2m&&&&&&&&&&&ލ¯°°°°°¨Ž&&&&&&&&&&BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB‰?FFFFFhm°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°v&&&&&&&&&&&&”~~2m&&&&&&&&&&&ލ°°°°°°°°¨Ž&&&&&&&&&BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBIFFFFFFE&j°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°v&&&&&&&&&&&&”~~2m&&&&&&&&&&&ލ°°°°°°°°°°¨Ž&&&&&&&&BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBQrþþþûùúùúùúúþ\S gZba]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]a[þ£uuuuu„òòöúòòóôôôôôôôþþú„þþƒ„”þþþ”‚qþ§§þþþþþþþþþwsqþþþgŒSþþþ\‹RrþþþrDCþþ ùúùúúúúþ\S gZba]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````````````````````a[þ£uuu€óòòúûòòóôôôôôôôþþ”…þü•–þþþ”‚qþqûþþþþþþþqŠgusþþþgŒSþþþ‹SþþþþþþC@þþùúúúúúþ\S gZba```````````````````````````````````````````````````````````````````a[þ£xx¢òò÷íûòòóôôôôôôõþþú„ –„¡þþþþ”‚qþ4þþ\ƒ(xxuusu'þþþþgŒSþþþþ4þüþþ™@:þþüúúúúúúüþ\S gZba```````````````````````````````````````````````````````````````````a[þ£‚óòôííøòòôôôõôôõõþþ”…”„”þþ4þþ”‚qþþþþ{yxxxuwŽ\þþþþþgŒSþþþþþþþ§§þþþL=þ§úúúúúúþ\S gZba```````````````````````````````````````````````````````````````````a[þòòò÷íóòòòôôôôõõõõþþú„„–4þþþþ”‚qþþþ{{ƒŠþþþþþþþüþþgŒSþþûþþþþþþþþ@=qþ§úúúúúúüþ\S gZba```````````````````````````````````````````````````````````````````a[þòó÷òò÷òòôôôõõõõõþþ”„„üþþíþþ”‚qþþþq{vþþþþþþþþþ4rþþgŒSþþüþþþþ4qqŠ<@:þþüúúúúúúþ\S gZba```````````````````````````````````````````````````````````````````a[þõííúôòõûûòòôõõõõõõöþþü—·þþ§÷þþ”‚qþþþ{”þþþþþþþþþþþþþgŒSþþþþ4_UNNKDDD@Šþþíúúúúúúüþ\S gZba```````````````````````````````````````````````````````````````````a[þ÷öòñúíûññôõõõõõööþþþþþþ™ù÷þþ”•qþþþþ{§þþþþþphrþþþþgŒSþþþþL‹RNKLI?þþ úúúúúþ\S gZba```````````````````````````````````````````````````````````````````a[þ÷íúòñöíòñôõõõööööùq4þþþ÷÷þþqþ4þ4v+pþþqšstþþþþgŒSþþþq‹RW4þþþþþþþ4ûúúúúüþ\S gZba```````````````````````````````````````````````````````````````````a[þõôññúíøñññôõõöööööööö÷ù÷÷÷þþþþþþqíþþþt+xxuusv™þþþþgŒSþþþq‹_þþþþþþþþþ4§úúúþ\S gZba```````````````````````````````````````````````####################a[þññ÷óññññôööööööööö÷÷÷÷÷÷÷øùûüþþ§øüþþþþŠtp4þþüþþgŒSþþþ‹_þþþþþþþþþþþúúúúüþ\S gZba###################################################################a[þóíøññññññôööööö÷ö÷÷ú÷÷÷÷÷÷ø÷ø÷øøøøûþþþþþþþþþüûþþgŒSþþþþ‹þþþþþIqþþúüþ\S gZba###################################################################a[þ÷óñññññññôöööööö÷÷þþþüûøøøøøøøøøøøùrþþþþíùûþþþþþ4þ4NCqqq?@@Šþþúúüþ\S gZba###################################################################a[þ÷÷ñññññññññõöööö÷÷÷úþþþþþþþþþþ§rûøøøùùøùùùùùùùùûþþþþþþþíþþþ\LKKDDDCþþqüþ\S gZba###################################################################a[þöúñññññññññññõööö÷÷÷øþüïóùûír þþþþþþþ§üùùùùùùùùúùùqþþúíþþþþr?Xþþþûüþ\S'gZjaf##################################################################$[þññðñðñðñðñðñðõö÷÷÷÷÷üþ òïïïððððôùûír4þþþþþþþ§üûùùùúúùúùúúúûúúû§þþþþþþþþþíüþ\[_ŽQjb%%a$f``############################################################$[þðñðñðñðñðñðñðõö÷÷÷÷ûþþùïïïðððððññòñòòôúûr4þþþþþþþ§üûúúúúúúúúúúûü§þþüüþ\p‰gQZjjbb%$f`###########################################################$[þðððððððððððððõ÷÷÷÷ú4þïïïðððððñññññòòòòòòóóõúr4þþþþþþþ§üúúúúúúúúúüþŠXS_mgLQZZjb%$`###########################################################$[þðððððððððððððõ÷÷÷ø§þrïïïïðððððññññòòòòòòóóóóóóôôôøúíüqþþþþþþþþ§üüüþŠ\WSh_mIgLZUbef###########################################################$[þðððððððððððððõ÷÷÷þ õïïïðððñðññòñòòòòòòóóóóôóôôôôôôôõôõùíüqþþþþþþþ4§üüþrŠ\XpSh ŽLZj%$###########################################################$[þðððððððððððððö÷÷ûþþúïïïðððððññññòòòòòóòóóóóóóóôôôôôôôõõõõõöööùíüqþþþþþþþ™§üüþqrŠŠ\\W[‰ gQj%$#######################################dddddddddddddddddddd$[þðððððððððððððö÷ù4þíïïïðððððñññññòòòòòòóóóóóóôôôôôôôôõõõõõöööööö÷ö÷÷ùüqþþþþþþþ™§üürþqqrrŠŠ\W'ŽQj%$ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd$[þðððððððððððððö÷qþ§îïïïðððððññññòòòòòòóóóóóóôôôôôôôõõõõõõõööööö÷ö÷÷÷÷÷÷ø÷øúü§þþþþþþþ±4§qrŠX gZjefddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd$[þðððððððððððððöþ øïïïðððñðññòñòòòòòòóóóóôóôôôôôôôõôõõõöõööööööö÷÷÷÷÷÷ø÷øø÷øøøøøûrþþþþþþþ± §XmgZba#ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd$[þïïïïïïïïïïïïïþþïïïðððððññññòòòòòòòóóóóóóóôôôôôôôõõõõõöööööö÷ö÷÷÷÷÷ø÷ø÷øøøøøøøøùøøùùqþþþ‰gZj%$dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd$[þïïïïïïïïïïïïóþüïïïððððððññññòòòòòòóóóóóóôôôôôôôôõõõõöõööööööö÷÷÷÷÷÷÷÷øøøøøøøøøùøùùùùùùùùù™þŠŽQU%$#dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd$[þïïïïïïïïïïïôûþ 6n‘•ñðððñññññòòòòòòóóóóóôôôôôôôôõõõõõõõööööö÷ö÷÷÷÷÷÷ø÷øøøøøøøøøùøùùùùùùùùùùrþkgZbe#dddddddddddddddddddddddddddddddddddddddddcccccccccccccccccccc$[þïïïïïïïïïòõ÷§þ†††††‡8l,•óñòòòòòòóóóóóôóôôôôôôõôõõõõõööööööö÷÷÷÷÷÷ø÷øø÷øøøøøùøøùùøùùùùùùùþþSgQj%fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccca[þïïïïïïïïôö÷þ†††††††††††‡‡=b–¢òóóóóóóóôôôôôôôõõõõõöööööö÷ö÷÷÷÷÷÷÷ø÷øøøøøøøøùøøùùùùùùùùú4þrŽQU%$#ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc#e[þïïïïïïòööööüþІ†††††††††‡†‡‡‡‡‡66fzÎ÷Dm‚ƒÐøÍô‡Òù…Ìñ‰Ñö<\lÖûƒÅçŽÓ÷aŠŸ —ÂØžÊߢÍã¥Ðæ§ÒèªÕë®Øí±Ûð°Úï´Þó³Ýò¶ßô·àõwyz.‡ºX¸ïc½ðkÀñ7byg¶à9d{qÃò9cysÄòo¿évÉõJ}™;dzyËöwÅòzËö{Çó~Í÷Z’°€Î÷Ïø‚ÏøÉòWŠ¥ƒÏ÷‚Îö„Ðø‚Êó~Æìk¨È†ÑùfŸ¾q°ÑCh|.GUˆÒù‰Óú†Ìô}Àäy¹ÜLtŠŠÓú‡Îô5Q`‹ÓùU™ÔûŒÔúX…ŽÕûŠÎôR{‘(>›ssþYY½ÿÿÿüüüøøøòòòìììåååÞÞÞÙÙÙÔÔÔÈÈÈ»»»²²²¨¨¨JJJPµàààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààP6µààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààN6Ëààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà566Ëàààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà566Ëááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááá2¨6Ëáááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááá<6ËâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââH6ËââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââPÀââââââââââââââââââââââââââââââââââââââáÀÖââââââââââââââââââââââââââââââââââââââââââââââ56µáâââââââââââââââââââââââââââââââââââââᵨÖâââââââââââââââââââââââââââââââââââââââââââââ2µââââââââââââââââââââââââââââââââââââââᵨÖââââââââââââââââââââââââââââââââââââââââââââ<¨ãããããããããããããããããããããããããããããããããããããã⵨ÖãããããããããããããããããããããããããããããããããããããããããããP¨ãããããããããããããããããããããããããããããããããããããã㵨Öãããããããããããããããããããããããããããããããããããããããããã 56Ø×××××××××××××××××××××××××××××××××××××㵨Ö××××××××××××××××××××××××××××××××××××××××× ¨À××××××××××××××××××××××××××××××××××××××µ¨Ö×××××××××××××××××××××××××××××××××××××××× Cµ×××××××××××××××××××××××××××××××××××××㵨Ø××××××××××××××××××××××××××××××××××××××× 5¨äääääääääääääääääääääääääääääääääääää䵨Öääääääääääääääääääääääääääääääääääääää <6Øääääääääääääääääääääääääääääääääääää䵨Öäääääääääääääääääääääääääääääääääääää Cµääääääääääääääääääääääääääääääääääää䵨Øääääääääääääääääääääääääääääääääääää 2µääääääääääääääääääääääääääääääääääää䵨Øäääääääääääääääääääääääääääääääääää H¨ØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµ¨ØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙ5ÀÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµd¨ØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙ<¨ÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµ^vu6¨ÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙ N6ÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµ4^vvvu¨ÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµ^vxvxvu6¨ÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙP¨ÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙµ^vvvvvvvu¨ÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚ¨4ÀÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛµ^xvxvxvxvxu¨ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÙÛÛÚ¨P¨ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛµ8^xvxvxvxvxvxu¨ÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚ¨6ÌÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛµ^vxvxvxvxvxvxvu¨ÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛܨP44444444¨ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛµ444444444444axxxxxxxxxxxxxxxu44444444444¨ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛܨ444¨44444444ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛµ444444444444^xxxxxxxxxxxxxxxxxu44444444444¨ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛܨ4444544444444¨ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛݵ444444444444axxxxxxxxxxxxxxxxxxxu44444444444¨ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛܨ44444<44444444ÌÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÝݵ444444444444axxxxxxxxxxxxxxxxxxxxxu44444444444¨ÜÝÛÝÛÝÛÝÛÝÛÝÛÝÝܨ444444544444444¨ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݵ444444444444axxxxxxxxxxxxxxxxxxxxxxxu44444444444¨ÜÝÝÝÝÝÝÝÝÝÝÝÝܨ4444444 C444444ÌÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݵ444444444444axxxxxxxxxxxxxxxxxxxxxxxx"u44444444444¨ÜÛÝÝÝÝÝÝÝÝÝܨ44444444 4444444¨ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝε444444444444axxxxxxxxxxxxxxxxxxxxxxxxxxxu44444444444¨ÍÝÝÝÝÝÝÝÝͨ444444444 N4444444µÎÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݵ844444444444a"x"x"x"x"x"x"x"x"x"x"x"x"x"x"u4444444444¨ÍÝÝÝÝÝÝͨ4444444444 <44444448ÍÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝε844444444444a"""""""""""""""""""""""""""""""u6444444444¨ÍÝÎÝÝͨ44444444444 34444444µÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÎÝÎε444444444444a"""""""""""""""""""""""""""""""""u4444444444¨ÍÝÎͨ44444444444 P44444444ÌÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÝÎÎε444444444448a"""""""""""""""""""""""""""""""""""v44444444444¨Íͨ44444444446v <4444444¨ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎε844444444444a"""""""""""""""""""""""""""""""""""""u44444444444¨¨4444444444v" 34444444µÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎε844444444444a"""""""""""""""""""""""""""""""""""""""v6444444444444444444444v"" P44444444ÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎΨ44444444444v""""""""""""""""""""""""""""""""""""""""v4444444444444444446v""" <4444444¨ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎͨ4444444444v""z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"v4444444444444444v"z"z 4444444µÐÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎϨ44444444444v"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzv44444444444444v"zzzz N44444ÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎϨ44444444444v"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzv4444444444444vzzzzzz C888888ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎϨ88888888888vzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzv888888888888vzzzzzzz ¨8888884µÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϨ88888888888vzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzv8888888888vzzzzzzzz 288888844·ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϨ88888888888vzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzv88888888vzzzzzzzzz N488888ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϨ88888888888v########################################v888888v########## C8888886¨ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϨ88888888888v########################################v8888v########### <8888888µÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐϨ88888888888v########################################v88v############ 88888888·ÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞϨ88888888888v########################################vv############# 58888886ÞÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞÐÞ¨88888888888v########################################vv############## C888886¨ÐÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¨88888888888v####################################################### C8888884HÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¨88888888888v$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ <888888µÑÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¨88888888888v$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 8888888·ÞÑÞÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞ¨88888888888x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ :48888888ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ¨88888888888x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 58888884¨ÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑÑÞÑѨ88888888888x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ P888884¨ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑѨ88888888888x$%$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C888888HÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑè88888888888x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C888888=µÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑè88888888888x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <8888888·ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑè88888888888x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <8888888·ÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑÄÑè68888888888x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8888888¸ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑè=8888888888x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 66666666ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄè=6666666666x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 66666666ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄè=6666666666x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 66666688ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄè=6666666666x'}'}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}' Q666666¨ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄè=6666666666x'}'''''''''''''''''''''''''''''''''''''' 56666666¨ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄè66666666666"''''''''''''''''''''''''''''''''''''''' N6666688<ÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅŨ=6666666666"'''''''''''''''''''''''''''''''''''''' 58666668¨ÅÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅŨ=6666666666x('''''''''''''''''''''''''''''''''''' N666666<ÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅŹ¨=6666666666x'''''''''''''''''''''''''''''''''''' 56====6<ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅź===========8Y(((((((((((((((((((((((((((((((((((( N======YlÇÆÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ¹¨==========8"(((((((((((((((((((((((((((((((((((( 58=====Yl°ÇÅÆÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÆÆ¹¨==========="((((((((((((((((((((((((((((((((((((( N4=====Yl°°¼ÅÅÆÆÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆ¹¨==========="(((((((((((((((((((((((((((((((((((((( 956=====Yl°°°°ÇÅÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ¹¨==========6"(((((((((((((((((((((((((((((((((((((((Q=====6p°°°°°¼ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ»¨==========6"((((((((((((((((((((((((((((((((((((((((======n°°°°°°°ÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ»¨==========="(((((((((((((((((((((((((((((((((((((((((======n°°°°°°°°¼ÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ»¨==========="******************************************;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6=====n°°°°°°°°°°¼ÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ»¨==========6"*******************************************;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=====r°°°°°°°°°°°¼ÇÆÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÆÇ»¨==========6z********************************************;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<6=====nX°°°°°°°°°°°°°¼ÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÆÇÇ»¨===========z*********************************************;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<6=====aX°°°°°°°°°°°°°°°¼ÇÆÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»¨===========z))))))))))))))))))))))))))))))))))))))))))))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; C6=====^u°°°°°°°°°°°°°°°°°¼ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»¨==========6z)))))))))))))))))))))))))))))))))))))))))))))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C======dN°°°°°°°°°°°°°°°°°°°¼ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»¨===========z))))))))))))))))))))))))))))))))))))))))))))))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;N======Yl°°°°°°°°°°°°°°°°°°°°°°¼ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»Y===========z)))))))))))))))))))))))))))))))))))))))))))))))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Q======Yp°°°°°°°°°°°°°°°°°°°°°°°°¼ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»Y===========z))))))))))))))))))))))))))))))))))))))))))))))))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7======n©°©°©°©°©°©°©°©°©°©°©°©°©°°¼ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»¨===========z)))))))))))))))))))))))))))))))))))))))))))))))))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;======rW°°°°°°°°°°°°°°°°°°°°°°°°°°°°°¼ÇÇÇÇÇÇÇÇÇÇÇÇÇÇ»Y===========z)))))))))))))))))))))))))))))))))))))))))))))),,,,,+;<======aQ©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©°¼¼ÇÇÇÇÇÇÇÇÇ»¨==========z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+++++++++C4=====du°©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©°¼¼ÇÇÇÇ»Y===========z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++N======Yl©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©°°Ç<===========z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+++++++++++++++++++++5======n©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ªlnn^dY====z,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++-------+$%--------------======n©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ªlnnnnnnnnna^^#+++++,,,,,,,,,,,,,++++++++-------------+%pp$+------------<======^u©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ªlnnnnnnnnnnnp%---------------------------------------+%pnnp%+-----------C======dl©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ªlnnnnnnnnnnnp%----------------------------------------%pnnnnp%-----------N======Yn«©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ªlnnnnnnnnnnnp%----------------------------------------%pnnnnnnp%----------9======nW«©«©«©«©«©«©«©«©«©«©«©«©«©«©«©«©«ªlnnnnnnnnnnnp%----------------------------------------%pnnnnnnnnp%---------Y6=====^u©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ªlnnnnnnnnnnnp%........................................%pnnnnnnnnnnp%........C======dl©©©«©«©«©«©«©«©«©«©«©«©«©«©««©«ªlnnnnnnnnnnnp%........................................%pnnnnnnnnnnnnp%.......N======nª««©«©«©«©«©«©«©«©«©«©«©«©«©««ªlnnnnnnnnnnnp%........................................%pnnnnnnnnnnnnnnp%......======sv©«««««««««««««««««««««««««««ªl p%........................................%p p%.....<======dl«««««««««««««««««««««««««««¬l p%.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.}p p}.~~~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>N======Y ª««««««««««««««««««««««««««l &~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~..&p p&.~~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?======av««««««««««««««««««««««««««X u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&p p&~~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><=====dp«««««««««««««««««««««««««««v u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&p ll p&~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>N6===== ª«««««««««««««««««««««««««««v u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&p l¬¬l p&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?=======^u««««««««««««««««««««««««««««v u}p l¬««¬l p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HYp©­­­­­­­­­­­­­­­­­­­­­­­­­­­­v u}p l¬­­­­¬l @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N6nv­«­­­­­­­­­­­­­­­­­­­­­­­­­­­v u}p l¬­­­­­­¬l @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Y6dp­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­v u€}p l¬­­­­­­­­¬l @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C "­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­v u}p l¬­­­­­­­­­­¬l @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:=sl­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­v u}p l¬­­­­­­­­­­­­¬l >H6 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­v u€}p l¬­­­­­­­­­­­­­­¬l Q^u­¡¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­xnn u€}p l¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢l <=r¬¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­xn u}p ql¬­­­­­­­­­­­­­­­­­­¢l N===sP­¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡­x u€€€€€€€€€€€€€€€}p l¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢l Y6qz¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡vn u€€€€€€€€€€€€€}p l¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢lq N6^l¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡xnn u€€€€€€€€€€€}p ql¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢lqY= x¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡xn u€€€€€€€€€}p qql¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢lNdp¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡xn u€€€€€€€}p qql¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢<Rrv¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡xnr u€€€€€}p ql¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Qdpª¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡xn u€€}p ql¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡<su£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡x qu€}p qql¢¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£: x£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡x up qql¢£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£Cdp¢££££££££££££££££££££££££££££££££££££x qqqqqqqqqqqqqqqqqqqqqql¢££££££££££££££££££££££££££££££££££?ru£££££££££££££££££££££££££££££££££££££x qqqqqqqqqqqqqqqqqqqql”£££££££££££££££££££££££££££££££££££N "£££££££££££££££££££££££££££££££££££££x qqqqqqqqqqqqqqqqqql¢££££££££££££££££££££££££££££££££££££B<dp”£££££££££££££££££££££££££££££££££££££x qqqqqqqqqqqqqqqql”£££££££££££££££££££££££££££££££££££££:sl££££££££££££££££££££££££££££££££££££££x qqqqqqqqqqqqqql”££££££££££££££££££££££££££££££££££££££Pqv£¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤x qqqqqqqqqqqql”¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB<Yqz¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤xqqqqqqqqqqql”¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB:dp¢¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤xqqqqqqqqql”¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBQsl”¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤x qqqqqql”¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBHru¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤x qqqql”¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?dquxqqql”BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB5Yqxxql”Q=dqx"”P=dq•Hdp•?ddp•žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžAdp•žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDXRdp•žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDXRdpzžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDQRRdqxŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDNRdqxŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDNRYquŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDNYqlŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEENrl•–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEXRsp"––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEXdqu––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEXdRrl•–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGdRsqv˜–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEHYrl%˜–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNRRRRRRsqv˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFXRRRRYrl$˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFG^RRRRRRsqu'˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFPRRRRrqv›˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDJGGGGDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFXYRRRRRRRYrpv›™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDJGMW:W:W?MGDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGCRRRRRYsqv'›››˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™JJGM:XQQQQQXX:W?MGJFXYR884448dsu#%}''›˜™˜™ššššššššššššššššššššššššššššššššššššššššššššFGMXQNPlCPPPNQQXXW?MAAJFFJGP88\\Yd´vz$$}'(›Ž™šššššššššššššššššššššššššššššššššššššššššššFGWXQPCa>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$ ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~ 2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!š ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~ ‘>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!š È>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#~ ‘<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÁP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!š Å=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀP\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!‡y šÃ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀPÓ\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!‘ 2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ÀÀÀÀÀÀÀÀÀPÓ\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!‡ È@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÀÀÀÀÀÀÀÀÀPÓ\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó#########################################################ƒ $Ã?????????????????????????????????????????????????ÁÁÁÁÁÁÁÁÁSÑÓ\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\Ó\ÓÓ#########################################################}š ÂAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁSÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ##########################################################~ ÈAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁÅDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD###########################################################$ $ÃAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ###########################################################£ ÁAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ############################################################™ ÅAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„$ ‹‹‹‹‹‹‹ LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„£‹‹‹‹‹‹‹‹)$ÃAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„~)‹‹‹‹‹‹‹‹À? ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ƒ) ‹‹‹‹‹‹‹Â? ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„}š‹‹‹‹‹‹‹‹‹Å ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„£ ‹‹‹‹‹‹‹‹ D BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB44444444444444444444444444444444444444444444444%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%~‹‹‹‹‹‹‹‹‹šK?BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ƒ‹‹‹‹‹)‹)‹šLBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Š$ ‹‹‹‹‹‹ šÆBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%€š ‹‹‹‹‹‹‹)‘IBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%£š ‹‹‹)‹)‹)‘IBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‹‹‹‹‹‹‹‹‹‹‘ÆEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ-‹‹‹)‹)‹)‹)šKEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ-‹‹‹‹‹‹‹‹‹‹šKEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ- ‹‹‹‹‹‹‹‹‹šDGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ- ‹‹‹‹‹‹‹‹‹‹ÅGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ-‹‹‹‹‹‹‹‹‹‹‹2GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ-‹‹‹‹‹‹‹‹‹‹‹ÀIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ-‹‹‹‹‹‹‹‹‹‹‹$KEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ-‹‹‹‹‹‹‹‹‹‹‹‹ÅFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ£š‹‹‹‹‹‹‹‹‹‹‹ÁIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ£$‹‹‹‹‹‹‹‹‹‹‹$CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŠ$‹‹‹‹‹‹‹‹‹‹‹‹ÂIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŠ†) ‹‹‹‹‹‹‹‹‹‹$CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ~‹‹‹‹‹‹‹‹‹‹‹‹ 2IJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ£$‹‹‹‹‹‹‹‹‹‹‹‹šÅJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ'ˆˆˆ'ˆ'ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŠƒ)‹‹‹‹‹‹‹‹‹‹‹‹$CJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽˆŠŠŠŸŠ……'ˆŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ~š‹‹‹‹‹‹‹‹‹‹‹‹‹ÀKGGNNNNNNJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ'˜Š}¢..p..¢ŠŠ…‰''ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ£$‹‹‹‹‹‹‹‹)))y«yÁKOIIIÉÉÉÊNNNJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ((((((((((((((((((((((((((((((((&&€¢.‡‡---‡‡£..¢ŠŠ#'&&((((((((((((((((((((((((((((((((((™‹‹‹‹))y+l+l+++ÀDKPSROVIÉÊNNJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM(((((((((((((((((((((((((((((((&–…Š.£-~™†††™~--‡££..¢€Š…''&&((((((((((((((((((((((((((((((&£‘))y+++++/////// 4DÈKPSOIÉÊNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM((((((((((((((((((((((((((((((&'‰¢.‡~†ƒ‘$$$‘‘ƒ†™™--‡££.¢¢ŠŠ…'&&&((((((((((((((((((((((((&&'ŠŠ™«++///,,,,,,,,,,/‘4ÅDLPRVÉÊNJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM(((((((((((((((((((((((((((((&'…¢£‡™†‘š++ly‹š$‘ƒƒ†™™-‡‡££.¢¢ŠŠ#'&&((((((((((((((((((((&'…Š¢££-š,,,ÞÞÞ½½½½½½½½ÞÞ,«ÁÅÅDHPRIÊNJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM(((((((((((((((((((((((((((&&Š.£-™ƒ$ +/,,,,//+)‹š$‘ƒƒ†™~-‡‡££.¢¢ŠŠ'&&((((((((((((((&&Š¢.£-~†ƒ$,½½½½^^^’^’^^^½½½½,šÁÅDHPUIÊNJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM””””””””””””””””””””””””””&–—Ÿ.£-™ƒš,^ÞÞÞÞÞÞ,,,,//+y‹š$‘ƒ††™~-‡‡££¢¢¢ŸŠ–––”””””””””&–Ÿ.£‡~†ƒ$šy+,½’’’’’’’’’’’’’^^½½Þ/ÒÂDLSWÊNMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ”””””””””””””””””””””””””&–¢.‡-†‘š’ÿÿÿéT^½½ÞÞÞ,,,///ly‹š$‘ƒ††™---‡£..¢¢Š‰'–––””””&–¢.£-™ƒ‘ «//,,½’TTTTT’’’’^½½Þ,/‘ÂPVZNMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ””””””””””””””””””””””””&'¢£‡~†‘)ÿÿÞÿÿÿÿ’½½½ÞÞÞ,,,//++ šš$‘ƒ†™™~-‡££..¢ŸŠ‰––&'Š¢£‡~†‘š)+,½Tÿÿÿÿÿÿÿÿÿÿ"ÝTTT’’’’½½Þ,//$ÂÈVQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ”””””””””””””””””””””””&—Š¢£‡™ƒ$/"ÿ_ñíùþÿÿÿÿ’½½½ÞÞÞ,,,,/++  š‘‘ƒ†™™--‡‡£..¢ŠŠŸŠ¢£‡™ƒ$ +½ÿÿÿÿÿÿ’½’’½’Ýÿÿÿÿÿ"TT’’’^½½,,/+«)‘24HÌQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ”””””””””””””””””””””&&Š.£-™ƒ$Þ"ÿ^ýøñíííííøÞÿÿÿÿÿ’½½ÞÞÞ,,,,//+l)š$$‘ƒ†™~--‡££..££-™ƒ$«½ÿÿÿØÙÚcccccccccÙØ’ÿÿÿÝT’’’½½Þ,/+l)‹    ÀÁ4ÅHHOQQQQQQQQQQQQQQQOHHÅ4ÁÀ”””””””””””””””””””””&—Ÿ.‡-†‘š^ÿÿþúøøðíííííííííûþÿÿÿÿÿÝ’½½½ÞÞ,,,,//+y‹š$‘‘ƒ†™™----~2‘š,ÝÿÿÝØÚccccccccccccccccdeÿÿÝTTT’’½½f,/+« ‹             $ÀÀÀÀÀÀÀ$          ””””””””””””””””””””“–¢£-†‘‹Tÿÿbøøøøðíííííííííííííû^ÿÿÿÿÿÝT’½½ÞÞÞ,,,,//+)‹š$‘ƒƒ†††ƒ‘‹TÿÿÝØdcccccccccccccccccccccÙ’ÿÿ"TT’’^½Þ,/+«)‹                               ››››››››››››››››››››”¢£-™‘/ÿøøøøøðííííííííííííííííñü^ÿÿÿÿÿÝT’½½ÞÞÞÞ,,,//+y š$$$š/ÝÿÿØdccccccccccccccccccccccccceÝÿÿ_T’’^½,,/+))                               ››››››››››››››››››››”.‡™‘,1ÿ_ý÷ø÷ø÷øðíííííêííííííííííííííñüTÿÿÿÿÿÝT^½½ÞÞÞ,,,,//+++½"ÿÙccccccccccccccccccccccccccccdfÿÿÝTT’’½½,,++)‹                              ››››››››››››››››››››•Ÿ.-†,ÿÿ^úøøøøøøøðíííííä×èííííííííííííííõýbTÿÿÿÿéT^½½ÞÞÞ,,,,½ÿÿ’dccccccccccccccefcccccccccccccccØÿÿÝT’’½Þ,/+«)‹                             ››››››››››››››››››››&¢£™½ÿÿþ÷ø÷ø÷ø÷ø÷ðíííííäããããä×ííííííííííííííõýbÿÿÿÿé’½½½ÞÞ’ÿÿfcccccccccccccccÚÿÿØccccccccccccccceÿÿ½^^’½Þ,/+))                             ››››››››››››››››››››—¢-Tÿÿ÷ø÷ø÷ø÷ø÷øðíííííäãããããÓÑÑã×êíííííííííííííùþÿÿÿÿ’TÿÿfcccccccccccccccdÝÿÿÿeccccccccccccccceÿÿ½Þ,/+)«y«)‹                            ››››››››››››››››››››œ~_ÿ_ýø÷÷÷÷÷÷÷÷÷÷ðíííííäãããÓÓÓÑ]ÍËËÊÑäèíííííííííííííøþÿÿÿÿÿÿfcccccccccccccccd’ÿÿÿÿÝÚccccccccccccccceÿÿ’½Þ,l$2-.‡£™™ƒ‘‘                 ‘‘ƒ™™£››››››››››››››››››››œ«ÿ^û÷÷÷÷÷÷÷÷÷÷÷÷ðíííííããããÓÓÑÑáÍËÊÊÉÇÇÄÉÓä×íííííííííííííûÿÿ’ccccccccccccccccfÿÿ½ëÿÿÝdcccccccccccccccØÿÿ^Þ,/ ƒ™‡¢˜”››››››››£££££££££››››››››››››››››››››››››››››››œ«ÿë÷÷÷÷÷÷÷÷÷÷÷÷÷ðíííííããÓãÓÓÑ]ÍËËÊÉÇÇÄÄÄÃÃßÃÍãííííííííííÿÝÚcccccccccccccccØÿÿTýüþÿÿ’dccccccccccccccc’ÿݽÞ,«$†-.Ÿ•›››››››››››››››››››››››››››››››››››››››››››››››–«ÿë÷÷÷÷÷÷÷÷÷÷÷÷÷ðíííííãããÓÓÑÑáÍËÊÊÉÇÇÄÄÃÃßßß¾¾»»ÇÓèííííôÿÿÙccccccccccccccceÿÿ_üüüÞÿÿfcccccccccccccccdÝÿTÞ,/šÀ~£¢œ”››››››››››››››››››››››››››››››››››››››››››››››œ«ÿë÷÷÷÷÷÷÷÷÷÷÷÷÷ðíííííãããÓÓÑ]ÍËÊÊÉÇÇÄÄÄÃÃßß¾¾»»°²¨¨žßÍä×þÿ’cccccccccccccccÚÝÿÿüûüûýTÿÿØccccccccccccccceÿé½Þ/)‘™‡¢˜”››››››››››››››››››››››››››››››››››››››››››››››œ«ÿëö÷÷÷÷÷÷÷÷÷÷÷÷ðíííííäãÓÓÓÑÑáÍËÊÊÉÇÇÄÄÃÃßßß¾¾»»°¨¨ž˜Š‚~ÿÿÚccccccccccccccdÝÿÿûûûûûû_ÿÿÙcccccccccccccccÿTÞ,+$†-.Ÿ”››››››››››››››››››››››››››››››››››››››››››››››œ«ÿëöööööööööööööðíííííäããÓÓÑ]ÍËÊÊÉÇÇÄÄÄÃÃßß¾¾»»°²¨¨ž‰Š‚,ÿfÛÛcÛcÛcÛcÛcÛÛÛc’ÿÿþûûûûûûûûÿÿÝÚÛÛcÛcÛcÛcÛcÛcÛeÿé½,/šƒ-£¢•››››››››››››››››››››››››››********************«ÿëöööööööööööööðíííííäãÓÓÑÑáÍËÊÊÉÇÇÄÄÃÃßßß¾¾»»°¨¨ž˜Š‚pÿÿÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛfÿÿ^úúúúúúúúúúÿÿdÛÛÛÛÛÛÛÛÛÛÛÛÛÛÿ’Þ/)‘™£¢**********************************************«ÿëöööööööööööööðíííííäãÓÓÑ]ÍËÊÊÉÇÇÄÄÄÃÃßß¾¾»»°²¨¨ž‰Š‚šÿ’ÛÛÛÛÛÛÛÛÛÛÛÛÛÛeÿÿ^ûìììììììììììþÿÿ’ÛÛÛÛÛÛÛÛÛÛÛÛÛÛeÿÞ/«‘™‡¢ž**********************************************«ÿëöööööööööööööðíííííäÓÓÑÑáÍËÊÊÉÇÇÄÄÃÃßßß¾¾»»°¨¨ž˜Š‚|½ÿgggggggggggggÙÿÿ_ýììùììùììùììùì^ÿÿfgggggggggggggdÿÿÞ,+$™‡.˜›*********************************************«ÿëöööööööööööööðíííííäÓÓÑ]ÍËÊÊÉÇÇÄÄÄÃÃßß¾¾»»°²¨¨ž‰Š‚zÿÿdggggggggggggÚÝÿÿøøøøøøøøøøøøøøú^ÿÿeggggggggggggg’ÿ’,+š†-.Ÿ›*********************************************«ÿöööööööööööööðíííííäÓÑÑáÍËÊÊÉÇÇÄÄÃÃßßß¾¾»»°¨¨ž˜Š‚z†ÿggggggggggggÛÿÿøøøøøøøøøøøøøøø÷ý_ÿÿÙÜgggggggggggØÿ,+šÀ-.Ÿ›*********************************************«ÿëöööööööööööööðíííííäÑÑ]ÍËÊÊÉÇÇÄÄÄÃÃßß¾¾»»°²¨¨ž‰Š‚zoÿfÜÜÜÜÜÜÜÜÜÜÜÜ’ÿÿþö÷÷÷÷÷÷÷÷÷÷÷÷÷öö÷÷ýÿÿÝÚÜÜÜÜÜÜÜÜÜÜ܃ÿ,/š†-.Ÿ›*************************¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥«ÿëöõöõöõöõöõöõöðíííííä\ÑáÍËÊÊÉÇÇÄÄÃÃßßß¾¾»»²¨¨ž˜Š‚|w,ÿeÜÜÜÜÜÜÜÜÜÜÜfÿÿÞööööööööööööööööööõöÿÿ’gÜÜÜÜÜÜÜÜÜÜgÿÿ,/šƒ-£Ÿ*¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥«ÿöööööööööööööðíííííä\]ÍËÊÊÉÇÇÄÄÃÃÃßß¾¾»»°²¨¨ž‰‚‚zw½ÿƒÜhhhhhhhhÜ$ÿÿTøõõõõõõõõõõõõõõõõõõõõõbÿÿ½hÜhhhhhhhhhÿÿÞ/šÀ-£Ÿ*¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥«ÿëõöõöõöõöõöõöõðíííííäÑáÍËÊÊÉÇÇÄÄÃÃßß¾¾¾»»²¨¨ž˜Š‚|ww’ÿ†hhhhhhhh܆ÿÿÿÿÿÿÿÿÿóóóóóóóóóôóôÞÿÿÿÿÿÿÿÿ,hhhhhhhhhh’ÿ½/š†-.Ÿ*¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥«ÿöõöõöõöõöõýõõðíííííã]ÍËÊÊÉÇÇÄÄÃÃÃßß¾¾»»°²¨¨ž‰‚‚}wsÿÿiiiiiiiii~ÝÿÿÿÿÿÿÿÿÿóóóóóóóóóóóóÞÿÿÿÿÿÿÿÿÿ$iiiiiiiii½ÿ½+š†-.Ÿ*¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥«ÿëõõõõõõõöøþõõðíííííãáÍËÊÊÉÇÇÄÄÃÃßß¾¾¾»»²¨¨ž˜Š‚|wwrÿÿrkkkkkkkkƒlllllll½ÿÿòóòóòóòóòóòóÞÿllllllllkkkkkkkkk½ÿ½+$2-.ž*¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥«ÿõõõõõõõûbþþõõðíííííê×äÓÊÉÇÇÄÄÃÃÃßß¾¾»»°²¨¨˜‰‚‚}wsrÿÿ rrrrrrrrrrrrrrrlÿÿòòòòòòòòòòòòÞÿ½mrrrrrrrrrrrrrrrj½ÿÞ«$™‡¢ž¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿõõõõõõþþþõõðíííííííííí×äÑÄÄÃÃßß¾¾¾»»²¨¨ž˜Š‚|wwrrÝÿD 3‚wwwwwwwwwwwwwÿÿòòòòòòòòòòòòÞÿ½wwwwwwwwwwwwwwwww½ÿÞ)‘™£¢¥¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿõõõõ÷þþþýõõõðíííííííííííííí×äÑÃß¾¾»»°²¨¨˜‰‚€}wsrr½ÿÅF ¼‰‚‚‚‚‚‚‚‚‚‚‚yÿÿòñòòñòòñòòñòÞÿ½|‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚Ýÿ, À~£¢§¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿõõõübþþëúõùõõðííííííííííííííííííèä]ò²¨¨ž˜Š‚|wwrrr½ÿÁ 6¶ŠŠŠŠŠŠŠŠŠ ÿÿññññññññññññþÞ¥§ŠŠŠŠŠŠŠŠŠŠŠŠŠŠÿÿ+š†-.˜ª¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿõõþþþ÷öübõõðíííííííííííííííííííîîïèä[ߘ˜‚€}wsrrroÿÒ F9¼¥‹ÿÿññññññññññññþ :5¶˜™ÿÝ«$2‡.œ¡¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿôëþþbýõõþþõôðíííííííííííííííííîîîîïïïïïðäYß‚wwrrrr$ÿÞ :66ÒT^ñññðñðñðñðñðþÒ 5¨žžœšÿ ƒ™£¢¥¡¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿõþþëùôúëþþbõôðííííííííííííííííîîîîïïïïðððððññÔ¾}rr‡ÿÿ þþñðððððððððððþë =°¨Þÿ½$2-.Ÿ*¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤§«ÿôþõôýbþþëùôôðííííííííííííííîîîîïïïïïðððððñññññññçÔÆTÿ þþððððððððððððþÒ ¼_ÿ/‘™‡¢ž¡¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿôüôöþþþôôôôïííííííä×èííîîîîïïïïðððððññññññòññòòòëÿ/     þþïïïïïïïïïïïïþ      ÿÝ$Á-£Ÿ§¡¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿôôìbþþbûôôôôôïííííííãÓÓÑÑã×ïïïïððððððññññññññòòòòòûÿÿZþþïïïïïïïïïïïïþÒ,ÿ^‘™‡.³®¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿôýþþþöôôôôôôïííííííãÓÑ]ÍËÊÉÇÍãç×ðððñññññññññòòòòòòóTÿÒþþïïïïïïïïïïïïþëPÿÿ †-£Ÿ¥¡¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿôþþþôôôôôôôôïííííííÑÑ]ÍËÊÉÇÇÄÄÃÃÄÐÖçñññññòòòòòòòòóóÿÔþþïîîîîîîîîîîîþÒbÿTƒ4£¢³®¡¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿôþbûôôôôôåŸôôïííííííÑ]ÍËÊÉÇÇÄÄÃÃß¾¾»»»IÔñòòòòóòóóóóóTÿÒþþîîîîîîîîîîîîþÿÿ«™-.Ÿ§¡¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿôöóóôôóUwwóôïíííííîáÍËÊÉÇÇÄÄÃßß¾¾»»²¨ž˜Š¾òòòòóóóóóôÿ_ÕþþïïïïïïïïïïïîþÞÿ’2-£Ÿ¥¡¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦§«ÿóôôôôóô¿}}}óôïííííîîÐËÊÉÇÇÄÄÃßß¾¾»»²¨ž˜Š‚}òòóóóóóóóôôÞÿÞþþýýýýýýýýýýýýbþÒÿ‘-£¢¨ª¡¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ª«ÿóóóóóåŠ||||óóïíííîîîäËÊÉÇÇÄÃÃßß¾¾»»²¨ž˜Š‚}wòóóóóóóóôôôú_ÿÒþþþþþþþþþþþþþþþþÿÿ/™£.³ª©¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ª«ÿóóóóO‚‚‚‚‚‚óóïíîîîîïäÊÉÇÇÄÃÃßß¾¾»»²¨ž˜Š‚}wmóóóóôóôôôôõõÿÿþþþþþþþþþþþþþþþþÖTÿ’4£.³ª©¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦­­­­­­­­­­­­­­­­­­­­ª«ÿóó¿ŠŠŠŠŠŠŠóóïîîîïïïäÉÇÄÄÃÃßß¾¾»»²¨ž˜‚‚}wmkóóóóóôôôôôõõõþÿÖ^ÿ™£.Ÿ§©¦­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ª«ÿóÔ˜ŠŠŠŠŠŠŠŠóóðîîïïïðäÇÄÄÃÃßß¾¾»²²¨žŠ‚‚}rmkióóóôôôôôõõõõõöÞÿ`Ö^ÿÀ£.Ÿ§©¦­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ª«ÿóóóðïïïïïðäÄÄÃÃßß¾¾»²²¨žŠ‚}wrmkiióôôôôôôõõõõõööù^ÿÕ^ÿ݃£¢³§©¦­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ª«ÿ󘘘˜˜˜˜˜˜˜óóðïïðïððãÄÃÃßß¾»»²²¨žŠ‚}wrmkiihóôôõôõõõõõöööö÷ù½ÿÿëýÿÝ2.¢³ª¦¦­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ª«ÿóžžžžžžžžžžóóñïïððððÖÃÃßß¾»»²¨¨žŠ‚}wrmkiihhôôôôõõõõõöööööö÷÷þÿÿ^`Öëÿÿ’4.·¥ª¦­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®«ÿ󨨨¨¨¨¨¨¨¨óóðïðððððÖÃßß¾»»²¨¨˜Š‚}wrmkiihhÜôôõõõõõöööööö÷÷÷÷÷ÿÿbÖÿÿ/‡·³ª©©­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®«ÿò¨¨¨¨¨¨¨¨¨¨òóðððððññÖßß¾»»²¨¨˜Š‚}wrmkihhhÜhõõõõõõöööööö÷÷÷÷÷øøûþÿÿbaTÿÿ2¢³¨®©©­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®«ÿò²²²²²²²²²²òòñðððñññÖß¾»»»³³˜Š‚zwrmki¢.ÈÈûõõõõöööööö÷÷÷÷÷øøøøøø^ÿÿÿ^a××ýbÿÿÝ+·³¨®©©­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®«ÿò²²²²²²²²²²òòñðññññññòóååååaaaaææææììúúúûûüõõõöööööö÷÷÷÷÷øøøøøøùùùÞÿÿÿÿTþb^ÿÿÿÿš£³ª®©©­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­®«ÿò»»»»»»»»»»òòñññññññòòóóôôõõöö÷øøùùìììúúûûûûõööööööö÷÷÷÷øøøøøøøùùùùùùüÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½š-£·ª©­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿò»»»»»»»»»»òòñññññññòóóóôõõöö÷÷øøùùììúúúûûüüöööööö÷÷÷÷÷øøøøøøùùùùùùììììììbþ^^^^^bTÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿò»»»»»»»»»»òòññññòñòòóóôôõõöö÷øøùùìììúúûûûûüööööö÷÷÷÷øøøøøøøùùùùùùììììììúúúúúûúûûûû^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿò¾¾¾¾¾¾¾¾¾¾òòòññññòòòóóôõõöö÷÷øøùùììúúúûûüûüööö÷÷÷÷÷øøøøøøùùùùùùììììììúúúúúúúúúûûûû^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿñ¾¾¾¾¾¾¾¾¾¾òòñññòòòòóóôôõõöö÷øøùùìììúúûûûûüüöö÷÷÷÷øøøøøøøùùùùùùììììììúúúúúúúûûûûûûû^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿòßßßßßßßßßßòòññòòòòòóóôõõöö÷÷øøùùììúúúûûüüüü÷÷÷÷÷øøøøøøùùùùùùììììììúúúúúúúúûûûûûûûü^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿñßßßßßßßßßßòñòòòòòòóóôôõööö÷øøùùììúúúûûûûüüü÷÷÷÷øøøøøøùùùùùùììììììúúúúúûúûûûûûûûûûû^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿòßßßßßßßßßßòñòòòòòóóóôõõöö÷÷øøùùììúúúûûüûüüü÷÷øúýýüûìùùìùììììììúúúúúúúúúûûûûûûûüüû^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿñÃÃÃÃÃÃÃÃÃÄññòòòóóóóóõõööö÷øøùùììúúúûûûûüüüý÷øøìüýýüüûììììúúúúúúúûûûûûûûûüûûûü^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿñÃÃÃÃÃÃÃÃÖñòñòòóóóóóôõõöö÷÷øøùùììúúûûûüüüüüüøøøøøùùìûüýýýüüûúúúúûûûûûûüûüûûüüü^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿñÃÃÃÃÃÄÉçññññòóóóóóóôõööö÷øøùùììúúúûûûûüüüýüøøøøùùùùùùìììûüüýûûûûûûûûûûüûüüûüü^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®«ÿñÄÄÄÄÇÖñò÷ññòóóóóóôôõöö÷÷øøùùììúúûûûüûüüüüýøøùùùùùùììììììúúúúúüüýûûûûûûûûûûûûûüüüü^ÿ½/šÁ-.³©¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñÄÄÄÐçñóýëëññòóóóóôôõööö÷øøùùììúúúûûûûüüüüýýøùùùìùìùìììììúúúúúúúûûûûûûûûûüûüüüüüüüü^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñÇÇññùëëëññóóóôôôôõöö÷÷øøùùììúúûûûüüüüüýüýùùùúýüûûìììúúúúúúúúûûûûûûûûüüûüüûüüüüüü^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñÑññóëëëùññóóôôõôôõöö÷øøùùììúúúûûûûüüüüýýýùùùúýýýüûúúúûûûûûûûûûûüûûüûüüüüüüüü^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñññìëëëëýòñññóôôôôõõõö÷øøøùùììúúûûüûüüüüüüýýùùìììúûüýýýüüûûûûûûûüûüûüüüüüüüüüý^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñóëëëöññûññóôôôõõõõö÷÷øùùììúúúûûûûüüüüýýýýìììììììúúúúûüüýýýýüüûüûüüüüüüüüüýü^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñëëëýññöbññóôõõõõõööööö÷øùùúúûûûûüüüüüýýýýììììììúúúúûúúûûûûüýýýýýüüüüüüüýüü^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñëëôðñýbbbññóõõõõõöööööö÷÷÷÷÷øùìúûüüüüýýýýýììììúúúúúúúúûûûûûûûûûûüüýýýýýüüýý^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñüññùbbbññóõõõöööööö÷÷÷÷÷øøøøøøùùìúûüüýýýìììûüûúúûúûûûûûûûûüûüûûüüüüüýýýüýüý^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¶«ÿñôðòýbbbúðñðôõõöööööö÷÷÷÷÷øøøøøøùùùùùùìììûüìúúûýýüüûûûûûüüûüûüüüüüüüüüüüüýýýýýý^ÿ½/šÁ-.³±¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯00000000000000000000¶«ÿññúbbbýòðñðñôöööööö÷÷÷ø÷÷øøøøøùùùùùùìììììììúúúúüüýýýýüüûûüüüüüüüüüýüýüýýüýýýý^ÿ½/šÁ-.³±0000000000000000000000000000000000000000000000000000000000000000000¶«ÿñbbbøððððððôööööö÷÷÷÷øøøøùùùùìùììììììúúúúúúúûûûûûüýýýýüüüüüüüüýüýüýýýýýý^ÿ½/šÁ-.³±0000000000000000000000000000000000000000000000000000000000000000000¶«ÿðbbbýððððððððôööö÷÷÷÷÷ÿÿÿÿT^ëùùùììììììúúúúúúûúûûûûûüûûüûüýýýýýýýüüýýýýýýýýý^ÿ½/šÁ-.³±0000000000000000000000000000000000000000000000000000000000000000000¶«ÿðböðððððððððôöö÷÷÷÷÷ýÿÿ^^ÿÿÿÿÿÿÿT^ëúúúúúúúúûúûûûûûûûûüûûüüüüüüýýýýýýýýýýý^ÿ½/šÁ-.³±0000000000000000000000000000000000000000000000000000000000000000000¶«ÿðüðððððððððððô÷÷÷÷÷øúTÿþîîîùüþ^ÿÿÿÿÿÿÿT^ëûûûûûûûûüûûüûüüüüüüüüüýüüýýýýýýýý^ÿ½/šÀ-£·¶±¬±±000000000000000000000000000000000000000000000000000000000000000¶«ÿðððððððððððððõ÷÷÷÷ø÷þÿTñîîîïïðïððüÞTÿÿÿÿÿÿÿT^bûûûüûüüûüüüüüüüüüýüýýüýýýýýýýýý^ÿ½/)À‡.··³²¶¶±¯¯00000000000000000000000000000000000000000000000000000000000¶«ÿïïïïïïïïïïïïðõ÷÷øøøÿÿûîîîïïïïððððñññññüÞTÿÿÿÿÿÿÿTÞbüüüüýüüüýüýüýüýýýýýýýýýýý^ÿ½/«$24-£..··³²¶¯00000000000000000000000000000000000000000000000000000000000¶«ÿððððððððððððïõ÷øøøý_ÿîîîïïïïðððñðñññññññòòòòüÞTÿÿÿÿÿÿÿTÞbüüüýüüýýýýýýýýýýýýýý^ÿ^,+ ‘Á™4-‡£.·³¶¯00000000000000000000000000000000000000000000000000000000000¶«ÿïïïïïïïïïïïïïöøøøø^ÿþïîîîïïïïððððñññññòñòòòòòóóóóóóýÞTÿÿÿÿÿÿÿT½býýýýýýýýýýýý^ÿ^,,+ $‘À2Â-‡.·²±¯0000000000000000000000000000000000000000000000000000000000¶«ÿïïïïïïïïïïïïïõøøùbÿñîîîïïðïððððñññññññòòòóòóóóóóôôôôõõõõý½_ÿÿÿÿÿÿÿT½þýýýýýý^ÿ^Þ,//+« $‘24£¢³±¯0000000000000000000000000000000000000000000000000000000000¶«ÿïïïïïïïïïïïïïöøùÿÿüîîîïïïïððñðñññññòñòòòòòòóóóóóóôôôôõõõõööööùb½_ÿÿÿÿÿÿÿTÞþ^ÿ^ÞÞÞ,,/+«šƒÂ£¢³±¯00000000000000000000000000000000000000µµµµµµµµµµµµµµµµµµµµ¶«ÿïïïïïïïïïïïïïöøú_ÿîîîïïïïðððððñññññññòòòòòóóóóóóôôôôõõõõööööö÷÷÷÷øøúb^ÿÿÿÿÿÿÿ^Þÿ’½½ÞÞÞ,,+šÀ™£.²±µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶«ÿïïïïïïïïïïïïïöù^ÿ^íîîîïïïïððððñññññòñòòòòòóóóóóóôôôôõõõööööööö÷÷÷÷øøøøøùùùûb^_ÿÿÿÿÿÿÿ_T^½,+šÁ4£·²¸µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶«ÿïïïïïïïïïïïïï÷ëÿ_ùîîîïïðïððñðñññññññòòòòòóóóóóôôôôõôõõõõööööö÷÷ø÷øøøùøùùùìùììììúûëb^_ÿÿÿÿÿÿÿ/2-.·¶¸µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶«ÿîîîîîîîîîîîîîýÿÿýîîîïïïïððððññññññòñòòòòòóóóóóóôôôôõõõõööööö÷÷÷÷øøøøøùùùùùììììììúúúúúúüëþ^ÿÿÁ4£·°±µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶«ÿîîîîîîîîîîîîñTÿbíîïïïïðïððððñññññññòòòòòóóóóóóôôôôõõõõööööö÷÷÷ø÷øøøøøùùùùùìììììúúúúúúûûûûûÿÿ Â‡.²¶¸µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¶«ÿîîîîîîîîîîïóÿdÜ}ßÑãïïððððñññññòñòòòòòóóóóóóôôôôõõõööööööö÷÷÷÷øøøøøùùùùùìììììúúúúúúûûûûûüÿ½2-.·¶¸µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ´´´´´´´´´´´´´´´´´´´´±«ÿîîîîîîîîîñ÷÷½ÿØcccccccgkßIÖçñññññòòòòóòóóóóôóôôõôõõõõööööö÷÷÷÷øøøùøùùùìùìììììúúúúûúûûûûûûþÿ‘4£·°¸0´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´0¶«ÿîîîîîîîïô÷÷ûÿÿÚccccccccÛÛÛÛÛÜ}³ÆÖòòòòóóóóóóôôôôõõõõööööö÷÷ø÷øøøøøùùùùùììììììúúúúúúúûûûûÿÿ+‡.³±0´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´0²«ÿîîîîîîòööö÷bÿfccccccccÛcÛÛÛgÛggggÜÜŸ·ÆÔåóóóôôôõõõõõööööö÷÷÷÷÷øøøøøùùùùùìììììúúúúúúûûûûûûÿ½2-.·¶0´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´0±³+ÿííííðôõöööùÿÙcccccccccÛÛÛÛÛggggÜÜÜÜÜhhhi}·Râåõõõõõööööö÷÷÷÷øøøøøùùùùùìììììúúúúúûûûûûûûbÿ1‘4£¢²±0´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´0¶·+ÿííîòôõõõöõÿccccccccÛcÛÛÛÛggggggÜÜÜhhhhiikmmrwŠ¿SRa÷öö÷÷ø÷øøøùøùùùùùìììììúúúúûúúûûûûûÿÿ/2-.³±0´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´0±²./ÿíðóôôôõõõö^ÿeccccccccccÛÛÛÛÛÛggÜgÜÜÜÜhhhiikmmrw}‚‚Šž;ÆRaaøøøøùùùùùùìììììúúúúúûúûûûûûTÿT‘™Å¢²¸´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µ»·£/ÿòóóôôôôõõüÿÿdccccccccccÛÛÛÛÛgggggÜÜÜhhhiiikmmrw}‚‚Šž¨¨²²»»ßÆÕÕæùùùìììììúúúúúûúûûûûüëÿ"+$2‡.»¸´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µ±².ÅÿóóóóóôôôôbÿfccccccccccÛÛÛÛÛgggggÜÜÜÜhÜhiiikmrrw}‚‚Š˜ž¨¨²²»»¾¾¾ßßÃÃUÕÕæìúúúúúûúûûûûûý_ÿ^+$2-.·ºµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µ»¿£ ÿTóóóóóóóôôøÿÿÚÛccccccccccÛÛÛÛÛgggggÜÜÜhhhiiikmrww}‚‚Š˜ž¨¨²²»»¾¾¾ßßÃÃÃÄÄÇÇÉââÕæúûûûûûû^ÿ,+ À4£·»¸´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µº².‡ÿòòóóóóóóôÿ’rw}wiiÜggÛcÛÛÛÛÛggggggÜÜÜÜhhiiikmrww}‚‚Š˜ž¨¨²²»»¾¾ßßßÃÃÃÄÄÇÇÉÉÊËËÍ]ÔÔææÿÿ½Þ,«$2-.¿ºµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µ¶·£)ÿTòòòòóóóóóôTÿ$rw}|‚Š˜ž¨¨Š‚mkÜÜggggÜÜÜÜhhhiiikmrww}‚‚Š˜ž¨¨²²»»¾¾ßßßÃÃÄÄÄÇÇÉÊÊËËÍÑÓÓããÕÿÿ^Þ,/ À4£¢»ºµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µ±².ÅÿñòòòòòóóóüÿÝprw}|‚Š˜ž¨¨²»»»¾¾ß¾²¨Šwjhhhhiikkmrw}}‚‚Š˜ž¨¨²²»»¾¾ßßßÃÃÄÄÄÇÇÉÊÊËÍ\ÑÓÓãÓãàÿÞÞ,«$2-.·»µ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´µ»·. ÿ_õñòòòòòòóóþÿ/rrw}}‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÃò»Š‚mrw}}‚ŠŠ˜ž¨¨²²»»¾¾ßßßÃÃÄÄÄÇÇÉÊÊËÍ]ÑÓÓãããÔÿ’Þ,/ ‘£¢²±µ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´¹¹¹¹¹¹¹¹¹¹¹¹¹µº³¢‡ÿññññòòòòòùÿÿ‡rrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]Ñ]ÉÄþ»˜˜ž¨¨²»»»¾¾ßßßÃÃÃÄÄÇÇÉÉÊËÍÏÑÓÓÓãããÿé½Þ,+šÁ4.·¶µ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µ¶³. ÿ_ôññññòòòòòÿ½rrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããäÓÓÉÊÃß»»»¾¾¾ßßÃÃÃÄÄÇÇÉÊËËáÑÑÓÓãããäTÿTÞ,/«‘™‡.»ºµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µ±².ÅTÿðñññññòñòõTÿ$rrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääçD»¾¾ßßßÃÃÄÄÇÇÉÊÊËÍ\ÑÓÓããããÿÿ½Þ,+šÀ4.·¶µ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µ¶·.‘ÿóððñññññøÿrrrrw}}‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääç_¢¾¾¾ßßÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓãããäÞÿÞÞ/«‘2-.¿ºµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸»¢£’ÿïððððñøbÿÿÿƒrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓãããããäääÿ »¾¾ßßÃÃÄÄÇÇÉÉÊËÍÏÑÑÓÓããããÿÿ^Þ,/šÀ4£·»µ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µº².ÀÿòïïððûÞÿÿÿ½†rrrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääÿ_·¾¾ßßÃÃÃÄÄÇÇÉÊËËá\ÑÓÓÓãããäbÿ_Þ,/ ‘™£¢»¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µº³.^ÿïïïTÿÿÿ,~rrrrrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääçÿÿ+¾¾¾ßßÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓããããäÕÿ^,+ ‘Â-¢¿±¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µ¶³2ÿÿöòTÿÿÝ/‡rrrrrrrrrrw}}‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääÿÿÿ£¾¾ßßÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓãããããäÒÿÝ+ šÀ™£.³ºµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µº³½ÿþÿÿlprrrrrrrrrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓãããããäääÿÿÿ/¾¾ßßÃÃÄÄÇÇÉÉÊËÍÏÑÑÓÓÓãããäåTÿ½‘À24£¢²ºµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µº™ÿÿÿÿÿÿrrrrrrrrrrrrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääÿÿÿ4¾ßßÃÃÃÄÄÇÇÉÊÊËÍ\ÑÓÓããããääÿÝÁ4-£.·¶¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹µ3½ÿÿÿ½ÞÿÞrrrrrrrrrrrrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääçÿ’’ÿ½¾¾ßßÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓãããããääÿ,£..·²ºµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹-ÿÿ/-²,ÿšrrrrrrrrrrrrrrrw}}‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääçÞÿ½/ÿÿ4¾ßßÃÃÄÄÇÇÉÉÊËËÑÓÓÓÓÕÒþTÿÿÿÿÅ·³»º¸µ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹+ .µ¸ºTÿ†rrrrrrrrrrrrrrrw}|‚Š˜ž¨¨²»»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓãããããäääÞÿÞ«Þÿ¾ßßÃÃÄÄÄÇIÇÎË[ÅÒàÞÿÿÿÿÿÿÿÞ -ºº¸µµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·ÿÿ,looo$††‡rrrrrrrw}z‚‚Š˜ž¨¨²²»»¾¾ßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓãããããääää^ÿ, ‘ÿÀ¾ßßÃÄÄÄCÂÒ,Tÿÿÿÿÿÿ_½+‘4ºº¸µµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹4ÿÿÿÿÿÿÿÿÿÿÿÿÿݽ½½y††™.‰ž¨¨²²¾¾¾ßßßÃÃÃÄÄÇÇÉÊÊËÍ]ÑÓÓÓããããääääçÿÿš‘2/ÿT¾¿4Ò+½ÿÿÿÿÿÿÿ’Þ ™£º¸µµµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·444   ,½½_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½½/  $444ÃÃÃÄÇÇÇÉÊÉËÍÑÑÓÓÓÓãããääääÿÿ‘24£ÿ_ÿÿÿÿÿÿ_½+‘4ºº¸µµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹.442  +½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½½½àÒÒÅÅLÑÓÓÖããããäãäää`ÿÂ-Å.‘ÿÿÿ’Þ 4£º¸µµµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹‡44$  /½½TÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÞþÒÒÒÖÿ^££.·²‘-¹µµµµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·444   ½½½_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTÿ½¢·³²º¸µ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹.44À  +½½½ÿÿÿÿÿ+»»ºº¸µ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹44.µµµµ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽnsis-3.11/Contrib/Graphics/Wizard/win.bmp000077500000000000000000000635761477201124000203310ustar00rootroot00000000000000BM~gv(¤:g  €€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿDDD@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@DDDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@DDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@@DDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@DDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@DDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@DDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDD@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDD@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDD@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDDD@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@DDDDDD@@@@@@@DDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDD@@@@@@DDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDD@@@@@DDDDDD@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@DDDDDD@@@@@DDDD@@@@@@@@@@@@@@@@@DDDDDDDDDD@DDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@DDDDDDDDDDDDDDDDDDD@@@@@@DDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@DDDDDD@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@DDDDDDDDDDDDDDDDD@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@DDDDDDD@@@@@@@@@@@@@@@@@@@@DDDDDDDDD@@@@@@DDDDDDDDDDDDDDD@@@@@@@DDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@DDDDDDD@@@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@DDDDDDDDDDDDDD@@@@@@DDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@DDDDDDD@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@DDDDDDDDDDD@@@@@@@DDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDD@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@@@DDDDDDDDD@@@@@@@DDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDD@@@@@@@@@@@DDDDDDDD@@@@@@@@@@@@@DDDDDDDD@@@@@@@DDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@DDDDDDDD@@@@@@@@@@DDDDDD@@@@@@@@@@@@@@@DDDDDD@@@@@@@DDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDD@@@@@@@@@@DDDD@@@@@@@@@@@@@@@@@DDDD@@@@@@DDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDD@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDD@@@@@@@@@@@@@@@@@DDDDDDD@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@@@@DDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@DDDDDDDDDDD@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDDD@@@@@@DDDDDDDDDDDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDDDD@DDDDDDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDD@DDDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDDDDDDDDD@@DDDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDD@@@@@@@@@@@@@@DDDDDDDDDDDD@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDD@@@@@@@@@@@@@@DDDDDDDD@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDDDDDDDD@@@@@@@@@@@@@@DDDD@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@DDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@DDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDD@@@@@@@@@@@@@@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@@DD@@@@@@DD@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDD@@@@DDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@DDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@DDDDDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@DDD@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@@@@@@@@@DDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôDDDDDDDDDDDDDDDDDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@@@@@@@DDDDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôDDDDDDDDDDDDDDDDDDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@@@@@DDDDDDDDDDDDDÿÿ@@@@@@@@@@@@@@@@@@@@@@@@@@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@@@@DDDDDDDDDDDDDDÿÿ@@@@@@@@@@@@@@@@@@@@@@@@@@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@@DDDDDDDDDDDDDDDDÿÿ@@@@@@@@@@@@@@@@@@@@@@@@@@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿxð÷ÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@@@DDDDDDDDDDDDDDDDDÿÿ@@@@@@xÿø€@@Gÿÿ÷@@@@@@@@@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿøw‡ˆwðxøpÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@@@DDDDDDDDDDDDDDDDDDDÿÿ@@@@ÿp@@@@@pGð@Gÿp@@@@@@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿwð‡wð‡ÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@@DDDDDDDDDDDDDDDDDDDDDÿÿ@@@÷Hp@@@@G÷x÷G÷@@@@÷@@@@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿpø÷ÿÿ÷wøpÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDD@DDDDDDDDDDDDDDDDDDDDDDÿÿ@@O@‡@@@@pxGÿÿÿøp@@@G€@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿw÷pÿÿÿÿÿÿpˆÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@÷@÷@@H÷@@ÿÿÿ÷ÿÿÿ‡@@@x@OÿôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ÷‡÷xÿÿÿwðÿÿÿ÷pÿôDDDDDDDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@÷@@ø@@Gÿÿÿ€Gð@Gÿÿÿÿÿp@OÿôDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿxpp÷ÿ÷ðÿÿÿÿÿøÿôDDDDDDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@O@@÷@@ÿpO÷@pð@@Owÿÿÿ÷@OÿôDDDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ€ppÿpð€ÿ÷pÿôDDDDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@ˆ@Gø@G÷@xÿÿpð@@@÷@H÷@@@OÿôDDDD@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ÷øÿÿÿpðxpÿôDDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@‡@GpOGÿÿÿpð@@@O@@@@@OÿôDD@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿxøÿÿÿpðpwÿôDD@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Høw@OGÿÿÿpð@@@@ð‡@@@@Oÿô@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿÿÿÿÿÿÿÿpð‡€ÿô@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@@@@@@Gÿÿÿpð@@@@ð@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDÿÿpwwwwÿÿÿpð€ÿô@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Hpÿÿÿÿÿÿÿpð@@@@H€@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDÿÿpÿÿÿÿÿÿÿpððÿô@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Hpÿÿÿÿÿÿÿpð@@@@Gð@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDÿÿpÿÿÿÿÿÿÿpððÿô@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Hpÿÿÿÿÿÿø@ð@@@@@ð@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDÿÿpÿÿÿÿÿÿpððÿô@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Hpÿÿÿÿÿ€@÷@@@@Gð@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDÿÿpÿÿÿÿ÷ÿÿ÷wwwpÿô@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Hpÿÿÿ÷@ÿÿÿÿÿÿÿ÷@@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDÿÿpÿÿøÿÿÿÿÿÿÿ÷ÿô@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDÿÿ@@@@@HpÿÿpGÿÿÿÿÿÿÿø@@@@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDDDÿÿpÿpÿÿÿÿÿÿÿpÿô@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDÿÿ@@@@@Hp‡@ÿÿÿÿÿÿÿp@@@@@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDDDDDÿÿpÿÿÿÿÿÿÿ€ÿô@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDÿÿ@@@@@H€xÿÿÿÿÿÿÿ÷@@@@@@@@@@Oÿð@@@@@@@@DDDDDDDDDDDDDDDÿÿ‡ÿÿÿÿÿÿÿ÷ÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDÿÿ@@@@@Gÿÿÿÿÿÿÿøp@@@@@@@@@@@Oÿð@@@@@@@@ÿÿÿÿÿÿÿÿÿpÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÿ@@@@@@ÿÿÿÿÿ€@@@@@@@@@@@@@Oÿð@@@@@@@@ÿÿxˆˆˆ‡ÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÿ@@@@@@@@@@@@@@@@@@@@@@@@@@Oÿð@@@@@@@@ÿÿÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÿ@@@@@@@@@@@@@@@@@@@@@@@@@@Oÿð@@@@@@@@ÿÿÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÿ@@@@@@@@@@@@@@@@@@@@@@@@@@Oÿð@@@@@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð@@@@@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@nsis-3.11/Contrib/InstallOptions/000077500000000000000000000000001477201124000167725ustar00rootroot00000000000000nsis-3.11/Contrib/InstallOptions/Changelog.txt000077500000000000000000000142521477201124000214310ustar00rootroot00000000000000DLL version 2.47 (4/27/2007) * Line breaks support in Link control * Added HLine and VLine controls DLL version 2.46 (3/31/2007) * Use installer's name for message boxes DLL version 2.45 (1/23/2007) * Added FOCUS flag for setting focus to a control other than the first DLL version 2.44 (10/11/2005) * Added HWND and HWND2 entries to the INI file to avoid messy calculations of the correct control id DLL version 2.43 (10/4/2005) * Fixed alteration of the working directory by FileRequest * Added WS_EX_LEFTSCROLLBAR in RTL mode DLL version 2.42 (1/21/2005) * Added TRANSPARENT flag for BITMAP fields (funded by Chris Morgan) DLL version 2.41 (8/5/2004) * Bitmaps are now automatically centered * Fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages * Fixed a rare freeze DLL version 2.4 (1/4/2004) * Initial focus is set in "initDialog" making it possible to override it from NSIS prior to calling "show" * When initial focus is to a Text field InstallOptions now follows standard Windows behaviour by having the text selected * Label and other static fields no longer have State= written to the INI file when leaving the dialog * NOTIFY flag can now be used with Link fields (State should be omitted in this case) * Likewise, State can now be used with Button fields (behaves the same as with Link fields) * NOTIFY flag can also now be used with ListBox and DropList fields to have NSIS notified when the selection changes * Meaning of RIGHT flag is now reversed in right-to-left language mode * HSCROLL and VSCROLL flags are no longer restricted to Text fields * Various Link field fixes DLL version 2.3 (12/4/2003) * Added new control type "Button" * Added new flag "NOTIFY" * Added new flag "NOWORDWRAP" for multi-line text boxes * Reduced size down to 12K * Better RTL support DLL version 2.2 (6/10/2003) * Added New control type LINK * \r\n converts to newline in Multiline edit box * Support for multiline edit box * Better tab order in DirRequest and FileRequest * Added READONLY option to text box * Minor fixes DLL version 2.1 (3/15/2003) * \r\n converts to newline in both label Text and ValidateText * New browse dialog style (modern) * Word wrapping for check boxes and radio buttons * No ugly border for edit fields under XP * Scroll bar for list boxes * Works with SetStaticBkColor * DISABLED dir and file request fields now disable the browse button too * No more STATE value for labels * Minor fixes DLL version 2.0 (1/4/2003) * Supports custom font and DPI settings (by Joost Verburg) * INI files should contain dialog units now, no pixels (by Joost Verburg) * RESIZETOFIT flag for Bitmap control (by Amir Szekely) * New documentation (by Joost Verburg) * New GROUP/NOTABSTOP/DISABLED flags DLL version 1.7 beta (11/2/2002) * Added initDialog and show DLL functions DLL version 1.6 beta (9/30/2002) * CancelConfirmIcon becomes CancelConfirmFlags and can now take the other common MessageBox flags DLL version 1.5 beta (9/26/2002) * Made close [x] button behave like Cancel (thanks brainsucker) DLL version 1.4 beta (9/4/2002) * Added Icon and Bitmap controls (by Amir Szekely) DLL version 1.3 beta (8/15/2002) * Added CancelShow (by ORTIM) * Added pixel transformation for widgets (by ORTIM) DLL version 1.2 beta (7/31/2002) * Added CancelEnabled (by ORTIM) * Added CancelConfirmCaption and CancelConfirmIcon (by Amir Szekely) DLL version 1.1 beta (7/22/2002) * Font is now taken from the main NSIS window (by Amir Szekely) DLL version 1.0 beta (12/16/2001) * Moved to DLL, no longer need parentwnd ini writing * Tons of changes - no longer fully compatible (see source for a big list) * removed support for silent installers (it seems the old version would bring up it's own dialog) version 1.4 (11/18/2001) * Added Listbox controls. * Added MULTISELECT flag. * Made the HWND list for the parent window controls dynamically allocated. This prevents a crash if NSIS ever gets more than 150 controls on it's main window. * The TEXT property of DirRequest control can be used to specify an initial directory. The current directory is automatically selected when clicking the browse button of the DirRequest control. * Added ROOT property to DirRequest which can be used to set the root directory (mostly due to felfert) * Edit controls will now auto scroll (thanks felfert) * Fixed a problem where the window wouldn't draw properly on some systems (thanks felfert) version 1.3 (11/03/2001) * Got rid of the call to RedrawWindow() because it's no longer needed with the WS_CLIPCHILDREN flag for NSIS. * Removed a few hardcoded limits of buffer sizes * Added Checkbox and RadioButton controls * Added RIGHT and CHECKED flags version 1.2.2 (10/30/2001) * Additional size reductions. Further reduced the size down to 8k. * The text parameter to a combobox can now be used to specify the initial value * Changed from InvalidateRect() to RedrawWindow() to force a redraw after a browse dialog * On startup, set the flags of the NSIS window to include WS_CLIPCHILDREN. Otherwise, our controls don't get drawn right. version 1.2.1 (10/28/2001) * Bug fix. ControlID for the caption and the OK button were reused by the first two controls. (Thanks Schultz) version 1.2j (10/28/2001) * 8.5kb from 44kb. heh. (by Justin Frankel) version 1.2 (10/28/2001) * Still 44k * Added the "FileRequest" and "DirRequest" control types (thanks Schultz) * Added "MinLen", "MaxLen", and "ValidateText" properties to fields * Added "Flags" as a way to specify additional parameters for controls * Few more changes to the documentation * Cleaned the code in a few places...still trying to make it smaller version 1.1 (10/27/2001) * Added the "Title" option (thanks Alex) * Moved the OK button so it is in the same location as the buttons on the main NSIS window (thanks Alex) * Pressing "ENTER" will now automatically select the OK button (thanks Alex) * Slightly improved the documentation version 1.01 (10/25/2001) * Fixed the SetFocus loop so it exits after the first control like it was supposed to * Added the license to the documentation version 1.0 (10/25/2001) * Barely qualifies as a distribution nsis-3.11/Contrib/InstallOptions/InstallOptions.nsh000077500000000000000000000113241477201124000224720ustar00rootroot00000000000000/* InstallOptions.nsh Macros and conversion functions for InstallOptions */ !ifndef ___NSIS__INSTALL_OPTIONS__NSH___ !define ___NSIS__INSTALL_OPTIONS__NSH___ !include LogicLib.nsh !macro INSTALLOPTIONS_FUNCTION_READ_CONVERT !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS "" !macroend !macro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS un. !macroend !macro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO "" !macroend !macro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO un. !macroend !macro INSTALLOPTIONS_FUNCTION_NSIS2IO UNINSTALLER_FUNCPREFIX ; Convert an NSIS string to a form suitable for use by InstallOptions ; Usage: ; Push ; Call Nsis2Io ; Pop Function ${UNINSTALLER_FUNCPREFIX}Nsis2Io Exch $0 ; The source Push $1 ; The output Push $2 ; Temporary char Push $3 ; Length Push $4 ; Loop index StrCpy $1 "" ; Initialise the output StrLen $3 $0 IntOp $3 $3 - 1 ${For} $4 0 $3 StrCpy $2 $0 1 $4 ${If} $2 == '\' StrCpy $2 '\\' ${ElseIf} $2 == '$\r' StrCpy $2 '\r' ${ElseIf} $2 == '$\n' StrCpy $2 '\n' ${ElseIf} $2 == '$\t' StrCpy $2 '\t' ${EndIf} StrCpy $1 $1$2 ${Next} StrCpy $0 $1 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 FunctionEnd !macroend !macro INSTALLOPTIONS_FUNCTION_IO2NSIS UNINSTALLER_FUNCPREFIX ; Convert an InstallOptions string to a form suitable for use by NSIS ; Usage: ; Push ; Call Io2Nsis ; Pop Function ${UNINSTALLER_FUNCPREFIX}Io2Nsis Exch $0 ; The source Push $1 ; The output Push $2 ; Temporary char Push $3 ; Length Push $4 ; Loop index StrCpy $1 "" ; Initialise the output StrLen $3 $0 IntOp $3 $3 - 1 ${For} $4 0 $3 StrCpy $2 $0 2 $4 ${If} $2 == '\\' StrCpy $2 '\' IntOp $4 $4 + 1 ${ElseIf} $2 == '\r' StrCpy $2 '$\r' IntOp $4 $4 + 1 ${ElseIf} $2 == '\n' StrCpy $2 '$\n' IntOp $4 $4 + 1 ${ElseIf} $2 == '\t' StrCpy $2 '$\t' IntOp $4 $4 + 1 ${EndIf} StrCpy $2 $2 1 StrCpy $1 $1$2 ${Next} StrCpy $0 $1 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 FunctionEnd !macroend !macro INSTALLOPTIONS_EXTRACT FILE InitPluginsDir File "/oname=$PLUGINSDIR\${FILE}" "${FILE}" !ifdef NSIS_UNICODE InstallOptions::make_unicode "$PLUGINSDIR\${FILE}" !endif !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "Settings" "RTL" "$(^RTL)" !macroend !macro INSTALLOPTIONS_EXTRACT_AS FILE FILENAME InitPluginsDir File "/oname=$PLUGINSDIR\${FILENAME}" "${FILE}" !ifdef NSIS_UNICODE InstallOptions::make_unicode "$PLUGINSDIR\${FILENAME}" !endif !insertmacro INSTALLOPTIONS_WRITE "${FILENAME}" "Settings" "RTL" "$(^RTL)" !macroend !macro INSTALLOPTIONS_DISPLAY FILE Push $0 InstallOptions::dialog "$PLUGINSDIR\${FILE}" Pop $0 Pop $0 !macroend !macro INSTALLOPTIONS_DISPLAY_RETURN FILE InstallOptions::dialog "$PLUGINSDIR\${FILE}" !macroend !macro INSTALLOPTIONS_INITDIALOG FILE InstallOptions::initDialog "$PLUGINSDIR\${FILE}" !macroend !macro INSTALLOPTIONS_SHOW Push $0 InstallOptions::show Pop $0 Pop $0 !macroend !macro INSTALLOPTIONS_SHOW_RETURN InstallOptions::show !macroend !macro INSTALLOPTIONS_READ VAR FILE SECTION KEY ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" !macroend !macro INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" "${VALUE}" !macroend !macro INSTALLOPTIONS_READ_CONVERT VAR FILE SECTION KEY ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" Push ${VAR} Call Io2Nsis Pop ${VAR} !macroend !macro INSTALLOPTIONS_READ_UNCONVERT VAR FILE SECTION KEY ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" Push ${VAR} Call un.Io2Nsis Pop ${VAR} !macroend !macro INSTALLOPTIONS_WRITE_CONVERT FILE SECTION KEY VALUE Push $0 StrCpy $0 "${VALUE}" Push $0 Call Nsis2Io Pop $0 WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" $0 Pop $0 !macroend !macro INSTALLOPTIONS_WRITE_UNCONVERT FILE SECTION KEY VALUE Push $0 StrCpy $0 "${VALUE}" Push $0 Call un.Nsis2Io Pop $0 WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" $0 Pop $0 !macroend !endif # ___NSIS__INSTALL_OPTIONS__NSH___ nsis-3.11/Contrib/InstallOptions/InstallerOptions.cpp000077500000000000000000001533261477201124000230240ustar00rootroot00000000000000/********************************************************* * * InstallOptions version 2.0 - Plugin for custom pages * * See Readme.html for documentation and license * * Unicode support by Jim Park -- 08/01/2007 * *********************************************************/ #include #include #include #include #include #include #include "resource.h" #include // nsis plugin #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #ifndef min #include #define min std::min // mingw64? #endif // Use for functions only called from one place to possibly reduce some code // size. Allows the source code to remain readable by leaving the function // intact. #ifdef _MSC_VER #define INLINE __forceinline #else #define INLINE inline #endif void *WINAPI MALLOC(int len) { return (void*)GlobalAlloc(GPTR,len); } void WINAPI FREE(void *d) { if (d) GlobalFree((HGLOBAL)d); } #define strcpy(x,y) lstrcpy(x,y) //#define strncpy(x,y,z) lstrcpyn(x,y,z) #define strdup(x) STRDUP(x) #define stricmp(x,y) lstrcmpi(x,y) //#define abs(x) ((x) < 0 ? -(x) : (x)) TCHAR *WINAPI STRDUP(const TCHAR *c) { TCHAR *t=(TCHAR*)MALLOC((lstrlen(c)+1)*sizeof(TCHAR)); return lstrcpy(t,c); } // Field types // NB - the order of this list is important - see below #define FIELD_INVALID (0) #define FIELD_HLINE (1) #define FIELD_VLINE (2) #define FIELD_LABEL (3) #define FIELD_ICON (4) #define FIELD_BITMAP (5) #define FIELD_BROWSEBUTTON (6) #define FIELD_LINK (7) #define FIELD_BUTTON (8) #define FIELD_GROUPBOX (9) #define FIELD_CHECKBOX (10) #define FIELD_RADIOBUTTON (11) #define FIELD_TEXT (12) #define FIELD_FILEREQUEST (13) #define FIELD_DIRREQUEST (14) #define FIELD_COMBOBOX (15) #define FIELD_LISTBOX (16) #define FIELD_SETFOCUS FIELD_CHECKBOX // First field that qualifies for having the initial keyboard focus #define FIELD_CHECKLEN FIELD_TEXT // First field to have length of state value checked against MinLen/MaxLen //--------------------------------------------------------------------- // settings #define IO_ENABLE_LINK //#define IO_LINK_UNDERLINED // Uncomment to show links text underlined //--------------------------------------------------------------------- // Flags // LBS_NOTIFY 0x00000001 // LISTBOX/CHECKBOX/RADIOBUTTON/BUTTON/LINK - Notify NSIS script when control is "activated" (exact meaning depends on the type of control) // OFN_OVERWRITEPROMPT 0x00000002 // FILEREQUEST // OFN_HIDEREADONLY 0x00000004 // FILEREQUEST // LBS_MULTIPLESEL 0x00000008 // LISTBOX #define FLAG_READONLY 0x00000010 // TEXT/FILEREQUEST/DIRREQUEST // BS_LEFTTEXT 0x00000020 // CHECKBOX/RADIOBUTTON #define TRANSPARENT_BMP 0x00000020 // BITMAP #define FLAG_PASSWORD 0x00000040 // TEXT/FILEREQUEST/DIRREQUEST #define FLAG_ONLYNUMBERS 0x00000080 // TEXT/FILEREQUEST/DIRREQUEST #define FLAG_MULTILINE 0x00000100 // TEXT/FILEREQUEST/DIRREQUEST #define FLAG_NOWORDWRAP 0x00000200 // TEXT/FILEREQUEST/DIRREQUEST - Disable word-wrap in multi-line text boxes #define FLAG_WANTRETURN 0x00000400 // TEXT/FILEREQUEST/DIRREQUEST // LBS_EXTENDEDSEL 0x00000800 // LISTBOX // OFN_PATHMUSTEXIST 0x00000800 // FILEREQUEST // OFN_FILEMUSTEXIST 0x00001000 // FILEREQUEST // OFN_CREATEPROMPT 0x00002000 // FILEREQUEST #define FLAG_DROPLIST 0x00004000 // COMBOBOX #define FLAG_RESIZETOFIT 0x00008000 // BITMAP // WS_TABSTOP 0x00010000 // *ALL* // WS_GROUP 0x00020000 // *ALL* #define FLAG_SAVEAS 0x00040000 // FILEREQUEST - Show "Save As" instead of "Open" for FileRequest field // OFN_EXPLORER 0x00080000 // FILEREQUEST // WS_HSCROLL 0x00100000 // *ALL* // WS_VSCROLL 0x00200000 // *ALL* // WS_DISABLED 0x08000000 // *ALL* #define FLAG_FOCUS 0x10000000 // Controls that can receive focus struct TableEntry { const TCHAR *pszName; int nValue; }; int WINAPI LookupToken(TableEntry*, TCHAR*); int WINAPI LookupTokens(TableEntry*, TCHAR*); void WINAPI ConvertNewLines(TCHAR *str); // all allocated buffers must be first in the struct // when adding more allocated buffers to FieldType, don't forget to change this define #define FIELD_BUFFERS 6 struct FieldType { TCHAR *pszText; TCHAR *pszState; TCHAR *pszRoot; TCHAR *pszListItems; TCHAR *pszFilter; TCHAR *pszValidateText; int nMinLength; int nMaxLength; int nType; RECT rect; int nFlags; HWND hwnd; UINT nControlID; INT_PTR nParentIdx; // this is used to store original windowproc for LINK HANDLE hImage; // this is used by image/icon field to save the handle to the image int nField; // field number in INI file const TCHAR *pszHwndEntry; // "HWND" or "HWND2" WNDPROC wndProc; }; // initial buffer size. buffers will grow as required. // use a value larger than MAX_PATH to prevent need for excessive growing. #define BUFFER_SIZE 8192 // 8kb of mem is max char count in multiedit TCHAR szBrowseButtonCaption[] = _T("..."); HWND hConfigWindow = NULL; HWND hMainWindow = NULL; HWND hCancelButton = NULL; HWND hNextButton = NULL; HWND hBackButton = NULL; HINSTANCE m_hInstance = NULL; struct _stack_t *pFilenameStackEntry = NULL; TCHAR *pszFilename = NULL; TCHAR *pszTitle = NULL; TCHAR *pszCancelButtonText = NULL; TCHAR *pszNextButtonText = NULL; TCHAR *pszBackButtonText = NULL; int bBackEnabled = FALSE; int bCancelEnabled = FALSE; // by ORTIM: 13-August-2002 int bCancelShow = FALSE; // by ORTIM: 13-August-2002 int bRTL = FALSE; FieldType *pFields = NULL; #define DEFAULT_RECT 1018 int nRectId = 0; int nNumFields = 0; int g_done; int g_NotifyField; // Field number of notifying control int WINAPI FindControlIdx(UINT id) { for (int nIdx = 0; nIdx < nNumFields; nIdx++) if (id == pFields[nIdx].nControlID) return nIdx; return -1; } LRESULT WINAPI mySendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return SendMessage(hWnd, Msg, wParam, lParam); } void WINAPI mySetFocus(HWND hWnd) { mySendMessage(hMainWindow, WM_NEXTDLGCTL, (WPARAM)hWnd, TRUE); } void WINAPI mySetWindowText(HWND hWnd, LPCTSTR pszText) { if (pszText) SetWindowText(hWnd, pszText); } static COLORREF GetLinkColor() { COLORREF clr = GetSysColor(COLOR_HOTLIGHT); #ifndef _WIN64 // COLOR_HOTLIGHT is Win98/2000+. GetSysColorBrush is the correct way to // detect valid colors but here we just assume nobody uses black. if (!clr) clr = RGB(0,0,255); #endif return clr; } int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) { static TCHAR szDir[MAX_PATH]; if (uMsg == BFFM_INITIALIZED && GetWindowText(pFields[(int)pData].hwnd, szDir, MAX_PATH) > 0) mySendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)szDir); return 0; } bool INLINE ValidateFields() { int nIdx; INT_PTR nLength; // In the unlikely event we can't allocate memory, go ahead and return true so we can get out of here. // May cause problems for the install script, but no memory is problems for us. for (nIdx = 0; nIdx < nNumFields; nIdx++) { FieldType *pField = pFields + nIdx; // this if statement prevents a stupid bug where a min/max length is assigned to a label control // where the user obviously has no way of changing what is displayed. (can you say, "infinite loop"?) if (pField->nType >= FIELD_CHECKLEN) { nLength = mySendMessage(pField->hwnd, WM_GETTEXTLENGTH, 0, 0); if (((pField->nMaxLength > 0) && (nLength > pField->nMaxLength)) || ((pField->nMinLength > 0) && (nLength < pField->nMinLength))) { if (pField->pszValidateText) { TCHAR szTitle[1024]; GetWindowText(hMainWindow, szTitle, COUNTOF(szTitle)); MessageBox(hConfigWindow, pField->pszValidateText, szTitle, MB_OK|MB_ICONWARNING); } mySetFocus(pField->hwnd); return false; } } } return true; } bool WINAPI SaveSettings(void) { static TCHAR szField[25]; int nBufLen = BUFFER_SIZE; TCHAR *pszBuffer = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR)); if (!pszBuffer) return false; int nIdx; int CurrField; for (nIdx = 0, CurrField = 1; nIdx < nNumFields; nIdx++, CurrField++) { FieldType *pField = pFields + nIdx; HWND hwnd = pField->hwnd; switch (pField->nType) { case FIELD_BROWSEBUTTON: if (g_NotifyField > CurrField) --g_NotifyField; --CurrField; default: continue; case FIELD_CHECKBOX: case FIELD_RADIOBUTTON: wsprintf(pszBuffer, _T("%d"), !!mySendMessage(hwnd, BM_GETCHECK, 0, 0)); break; case FIELD_LISTBOX: { // Ok, this one requires a bit of work. // First, we allocate a buffer long enough to hold every item. // Then, we loop through every item and if it's selected we add it to our buffer. // If there is already an item in the list, then we prepend a | character before the new item. // We could simplify for single-select boxes, but using one piece of code saves some space. int nLength = lstrlen(pField->pszListItems) + 10; if (nLength > nBufLen) { FREE(pszBuffer); nBufLen = nLength; pszBuffer = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR)); if (!pszBuffer) return false; } TCHAR *pszItem = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR)); if (!pszItem) return false; *pszBuffer = _T('\0'); INT_PTR nNumItems = mySendMessage(hwnd, LB_GETCOUNT, 0, 0); for (int nIdx2 = 0; nIdx2 < nNumItems; nIdx2++) { if (mySendMessage(hwnd, LB_GETSEL, nIdx2, 0) > 0) { if (*pszBuffer) lstrcat(pszBuffer, _T("|")); mySendMessage(hwnd, LB_GETTEXT, (WPARAM)nIdx2, (LPARAM)pszItem); lstrcat(pszBuffer, pszItem); } } FREE(pszItem); break; } case FIELD_TEXT: case FIELD_FILEREQUEST: case FIELD_DIRREQUEST: case FIELD_COMBOBOX: { int nLength = (int) mySendMessage(pField->hwnd, WM_GETTEXTLENGTH, 0, 0); if (nLength > nBufLen) { FREE(pszBuffer); // add a bit extra so we do this less often nBufLen = nLength + 20; pszBuffer = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR)); if (!pszBuffer) return false; } *pszBuffer=_T('"'); GetWindowText(hwnd, pszBuffer+1, nBufLen-1); pszBuffer[nLength+1]=_T('"'); pszBuffer[nLength+2]=_T('\0'); if (pField->nType == FIELD_TEXT && (pField->nFlags & FLAG_MULTILINE)) { TCHAR *pszBuf2 = (TCHAR*)MALLOC(nBufLen*2*sizeof(TCHAR)); // double the size, consider the worst case, all chars are \r\n TCHAR *p1, *p2; for (p1 = pszBuffer, p2 = pszBuf2; *p1; p1 = CharNext(p1), p2 = CharNext(p2)) { switch (*p1) { case _T('\t'): *p2++ = _T('\\'); *p2 = _T('t'); break; case _T('\n'): *p2++ = _T('\\'); *p2 = _T('n'); break; case _T('\r'): *p2++ = _T('\\'); *p2 = _T('n'); break; case _T('\\'): *p2 = _T('\\'); // Jim Park: used to be p2++ but that's a bug that works because // CharNext()'s behavior at terminating null char. But still // definitely, unsafe. default: lstrcpyn(p2, p1, (int)(CharNext(p1) - p1) + 1); break; } } *p2 = 0; nBufLen = nBufLen*2; FREE(pszBuffer); pszBuffer=pszBuf2; } break; } } wsprintf(szField, _T("Field %d"), CurrField); WritePrivateProfileString(szField, _T("State"), pszBuffer, pszFilename); } // Tell NSIS which control was activated, if any wsprintf(pszBuffer, _T("%d"), g_NotifyField); WritePrivateProfileString(_T("Settings"), _T("State"), pszBuffer, pszFilename); FREE(pszBuffer); return true; } #define BROWSE_WIDTH 15 static TCHAR szResult[BUFFER_SIZE]; const TCHAR *pszAppName; DWORD WINAPI myGetProfileString(LPCTSTR lpKeyName) { *szResult = _T('\0'); return GetPrivateProfileString(pszAppName, lpKeyName, _T(""), szResult, BUFFER_SIZE, pszFilename); } TCHAR * WINAPI myGetProfileStringDup(LPCTSTR lpKeyName) { int nSize = myGetProfileString(lpKeyName); if (nSize) return strdup(szResult); // uses STRDUP else return NULL; } UINT WINAPI myGetProfileInt(LPCTSTR lpKeyName, INT nDefault) { return GetPrivateProfileInt(pszAppName, lpKeyName, nDefault, pszFilename); } int WINAPI ReadSettings(void) { static TCHAR szField[25]; int nIdx, nCtrlIdx; pszAppName = _T("Settings"); pszTitle = myGetProfileStringDup(_T("Title")); pszCancelButtonText = myGetProfileStringDup(_T("CancelButtonText")); pszNextButtonText = myGetProfileStringDup(_T("NextButtonText")); pszBackButtonText = myGetProfileStringDup(_T("BackButtonText")); nNumFields = myGetProfileInt(_T("NumFields"), 0); nRectId = myGetProfileInt(_T("Rect"), DEFAULT_RECT); bBackEnabled = myGetProfileInt(_T("BackEnabled"), -1); // by ORTIM: 13-August-2002 bCancelEnabled = myGetProfileInt(_T("CancelEnabled"), -1); bCancelShow = myGetProfileInt(_T("CancelShow"), -1); bRTL = myGetProfileInt(_T("RTL"), 0); if (nNumFields > 0) { // make this twice as large for the worst case that every control is a browse button. // the structure is small enough that this won't waste much memory. // if the structure gets much larger, we should switch to a linked list. pFields = (FieldType *)MALLOC(sizeof(FieldType)*2*nNumFields); } for (nIdx = 0, nCtrlIdx = 0; nCtrlIdx < nNumFields; nCtrlIdx++, nIdx++) { // Control types static TableEntry TypeTable[] = { { _T("LABEL"), FIELD_LABEL }, { _T("TEXT"), FIELD_TEXT }, { _T("PASSWORD"), FIELD_TEXT }, { _T("LISTBOX"), FIELD_LISTBOX }, { _T("COMBOBOX"), FIELD_COMBOBOX }, { _T("DROPLIST"), FIELD_COMBOBOX }, { _T("FILEREQUEST"), FIELD_FILEREQUEST }, { _T("DIRREQUEST"), FIELD_DIRREQUEST }, { _T("CHECKBOX"), FIELD_CHECKBOX }, { _T("RADIOBUTTON"), FIELD_RADIOBUTTON }, { _T("ICON"), FIELD_ICON }, { _T("BITMAP"), FIELD_BITMAP }, { _T("GROUPBOX"), FIELD_GROUPBOX }, #ifdef IO_ENABLE_LINK { _T("LINK"), FIELD_LINK }, #else { _T("LINK"), FIELD_LABEL }, #endif { _T("BUTTON"), FIELD_BUTTON }, { _T("HLINE"), FIELD_HLINE }, { _T("VLINE"), FIELD_VLINE }, { NULL, 0 } }; // Control flags static TableEntry FlagTable[] = { { _T("NOTIFY"), LBS_NOTIFY }, { _T("WARN_IF_EXIST"), OFN_OVERWRITEPROMPT }, { _T("FILE_HIDEREADONLY"), OFN_HIDEREADONLY }, { _T("MULTISELECT"), LBS_MULTIPLESEL }, { _T("READONLY"), FLAG_READONLY }, { _T("RIGHT"), BS_LEFTTEXT }, { _T("PASSWORD"), FLAG_PASSWORD }, { _T("ONLY_NUMBERS"), FLAG_ONLYNUMBERS }, { _T("MULTILINE"), FLAG_MULTILINE }, { _T("NOWORDWRAP"), FLAG_NOWORDWRAP }, { _T("WANTRETURN"), FLAG_WANTRETURN }, { _T("EXTENDEDSELCT"), LBS_EXTENDEDSEL }, { _T("PATH_MUST_EXIST"), OFN_PATHMUSTEXIST }, { _T("FILE_MUST_EXIST"), OFN_FILEMUSTEXIST }, { _T("PROMPT_CREATE"), OFN_CREATEPROMPT }, { _T("DROPLIST"), FLAG_DROPLIST }, { _T("RESIZETOFIT"), FLAG_RESIZETOFIT }, { _T("NOTABSTOP"), WS_TABSTOP }, { _T("GROUP"), WS_GROUP }, { _T("REQ_SAVE"), FLAG_SAVEAS }, { _T("FILE_EXPLORER"), OFN_EXPLORER }, { _T("HSCROLL"), WS_HSCROLL }, { _T("VSCROLL"), WS_VSCROLL }, { _T("DISABLED"), WS_DISABLED }, { _T("TRANSPARENT"), TRANSPARENT_BMP }, { _T("FOCUS"), FLAG_FOCUS }, { NULL, 0 } }; FieldType *pField = pFields + nIdx; pField->nField = nCtrlIdx + 1; pField->pszHwndEntry = _T("HWND"); wsprintf(szField, _T("Field %d"), nCtrlIdx + 1); pszAppName = szField; // Get the control type myGetProfileString(_T("TYPE")); pField->nType = LookupToken(TypeTable, szResult); if (pField->nType == FIELD_INVALID) continue; // Lookup flags associated with the control type pField->nFlags = LookupToken(FlagTable, szResult); myGetProfileString(_T("Flags")); pField->nFlags |= LookupTokens(FlagTable, szResult); // pszState must not be NULL! myGetProfileString(_T("State")); pField->pszState = strdup(szResult); // uses STRDUP // ListBox items list { int nResult = myGetProfileString(_T("ListItems")); if (nResult) { // add an extra | character to the end to simplify the loop where we add the items. pField->pszListItems = (TCHAR*)MALLOC((nResult + 2)*sizeof(TCHAR)); lstrcpy(pField->pszListItems, szResult); pField->pszListItems[nResult] = _T('|'); pField->pszListItems[nResult + 1] = _T('\0'); } } // Label Text - convert newline pField->pszText = myGetProfileStringDup(_T("TEXT")); if (pField->nType == FIELD_LABEL || pField->nType == FIELD_LINK) ConvertNewLines(pField->pszText); // Dir request - root folder pField->pszRoot = myGetProfileStringDup(_T("ROOT")); // ValidateText - convert newline pField->pszValidateText = myGetProfileStringDup(_T("ValidateText")); ConvertNewLines(pField->pszValidateText); { int nResult = GetPrivateProfileString(szField, _T("Filter"), _T("All Files|*.*"), szResult, COUNTOF(szResult), pszFilename); if (nResult) { // Convert the filter to the format required by Windows: NULL after each // item followed by a terminating NULL pField->pszFilter = (TCHAR*)MALLOC((nResult + 2)*sizeof(TCHAR)); lstrcpy(pField->pszFilter, szResult); TCHAR *pszPos = pField->pszFilter; while (*pszPos) { if (*pszPos == _T('|')) *pszPos++ = 0; else pszPos = CharNext(pszPos); } } } pField->rect.left = myGetProfileInt(_T("LEFT"), 0); pField->rect.top = myGetProfileInt(_T("TOP"), 0); pField->rect.right = myGetProfileInt(_T("RIGHT"), 0); pField->rect.bottom = myGetProfileInt(_T("BOTTOM"), 0); pField->nMinLength = myGetProfileInt(_T("MinLen"), 0); pField->nMaxLength = myGetProfileInt(_T("MaxLen"), 0); // Text color for LINK control, default is the system default link color pField->hImage = (HANDLE)(UINT_PTR) myGetProfileInt(_T("TxtColor"), GetLinkColor()); pField->nControlID = 1200 + nIdx; if (pField->nType == FIELD_FILEREQUEST || pField->nType == FIELD_DIRREQUEST) { FieldType *pNewField = &pFields[nIdx+1]; pNewField->nControlID = 1200 + nIdx + 1; pNewField->nType = FIELD_BROWSEBUTTON; pNewField->nFlags = pField->nFlags & (WS_DISABLED | WS_TABSTOP); pNewField->pszText = STRDUP(szBrowseButtonCaption); // needed for generic FREE pNewField->rect.right = pField->rect.right; pNewField->rect.left = pNewField->rect.right - BROWSE_WIDTH; pNewField->rect.bottom = pField->rect.bottom; pNewField->rect.top = pField->rect.top; pField->rect.right = pNewField->rect.left - 3; pNewField->nField = nCtrlIdx + 1; pNewField->pszHwndEntry = _T("HWND2"); nNumFields++; nIdx++; } } return nNumFields; } LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) { int nIdx = FindControlIdx(id); // Ignore if the dialog is in the process of being created if (g_done || nIdx < 0) return 0; switch (pFields[nIdx].nType) { case FIELD_BROWSEBUTTON: --nIdx; case FIELD_LINK: case FIELD_BUTTON: case FIELD_CHECKBOX: case FIELD_RADIOBUTTON: if (codeNotify != BN_CLICKED) return 0; break; case FIELD_COMBOBOX: case FIELD_LISTBOX: if (codeNotify != LBN_SELCHANGE) // LBN_SELCHANGE == CBN_SELCHANGE return 0; break; default: return 0; } FieldType *pField = pFields + nIdx; TCHAR szBrowsePath[MAX_PATH]; switch (pField->nType) { case FIELD_FILEREQUEST: { OPENFILENAME ofn={0,}; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hConfigWindow; ofn.lpstrFilter = pField->pszFilter; ofn.lpstrFile = szBrowsePath; ofn.nMaxFile = COUNTOF(szBrowsePath); ofn.Flags = pField->nFlags & (OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_CREATEPROMPT | OFN_EXPLORER); GetWindowText(pField->hwnd, szBrowsePath, COUNTOF(szBrowsePath)); tryagain: GetCurrentDirectory(BUFFER_SIZE, szResult); // save working dir if ((pField->nFlags & FLAG_SAVEAS) ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn)) { mySetWindowText(pField->hwnd, szBrowsePath); SetCurrentDirectory(szResult); // restore working dir // OFN_NOCHANGEDIR doesn't always work (see MSDN) break; } else if (szBrowsePath[0] && CommDlgExtendedError() == FNERR_INVALIDFILENAME) { szBrowsePath[0] = _T('\0'); goto tryagain; } break; } case FIELD_DIRREQUEST: { BROWSEINFO bi; bi.hwndOwner = hConfigWindow; bi.pidlRoot = NULL; bi.pszDisplayName = szBrowsePath; bi.lpszTitle = pField->pszText; #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif bi.ulFlags = BIF_STATUSTEXT | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn = BrowseCallbackProc; bi.lParam = nIdx; bi.iImage = 0; if (pField->pszRoot) { LPSHELLFOLDER sf; ULONG eaten; LPITEMIDLIST root; SHGetDesktopFolder(&sf); #ifdef _UNICODE sf->ParseDisplayName(hConfigWindow, NULL, pField->pszRoot, &eaten, &root, NULL); #else int ccRoot = (lstrlen(pField->pszRoot) * 2) + 2; LPWSTR pwszRoot = (LPWSTR) MALLOC(ccRoot); MultiByteToWideChar(CP_ACP, 0, pField->pszRoot, -1, pwszRoot, ccRoot); sf->ParseDisplayName(hConfigWindow, NULL, pwszRoot, &eaten, &root, NULL); FREE(pwszRoot); #endif bi.pidlRoot = root; sf->Release(); } //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); LPITEMIDLIST pResult = SHBrowseForFolder(&bi); if (!pResult) break; if (SHGetPathFromIDList(pResult, szBrowsePath)) { mySetWindowText(pField->hwnd, szBrowsePath); } CoTaskMemFree(pResult); break; } case FIELD_LINK: case FIELD_BUTTON: // Allow the state to be empty - this might be useful in conjunction // with the NOTIFY flag if (*pField->pszState) ShellExecute(hMainWindow, NULL, pField->pszState, NULL, NULL, SW_SHOWDEFAULT); break; } if (pField->nFlags & LBS_NOTIFY) { // Remember which control was activated then pretend the user clicked Next g_NotifyField = nIdx + 1; mySendMessage(hMainWindow, WM_NOTIFY_OUTER_NEXT, 1, 0); } return 0; } static WNDPROC lpWndProcOld; int g_is_cancel,g_is_back; INT_PTR CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { INT_PTR bRes; if (message == WM_NOTIFY_OUTER_NEXT && wParam == 1) { // Don't call leave function if fields aren't valid if (!g_NotifyField && !ValidateFields()) return 0; // Get the settings ready for the leave function verification SaveSettings(); // Reset the record of activated control g_NotifyField = 0; } bRes = CallWindowProc(lpWndProcOld,hwnd,message,wParam,lParam); if (message == WM_NOTIFY_OUTER_NEXT && !bRes) { // if leave function didn't abort (bRes != 0 in that case) if (wParam == (WPARAM)-1) g_is_back++; if (wParam == NOTIFY_BYE_BYE) g_is_cancel++; g_done++; PostMessage(hConfigWindow,WM_CLOSE,0,0); } return bRes; } INT_PTR CALLBACK cfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_COMMAND, WMCommandProc); case WM_DRAWITEM: { DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; int nIdx = FindControlIdx(lpdis->CtlID); #ifdef IO_LINK_UNDERLINED HFONT OldFont; LOGFONT lf; #endif if (nIdx < 0) break; FieldType *pField = pFields + nIdx; #ifdef IO_LINK_UNDERLINED GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); lf.lfUnderline = TRUE; OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); #endif // We need lpdis->rcItem later RECT rc = lpdis->rcItem; // Calculate needed size of the control DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_VCENTER | DT_WORDBREAK | DT_CALCRECT); // Make some more room so the focus rect won't cut letters off rc.right = min(rc.right + 2, lpdis->rcItem.right); // Move rect to right if in RTL mode if (bRTL) { rc.left += lpdis->rcItem.right - rc.right; rc.right += lpdis->rcItem.right - rc.right; } if (lpdis->itemAction & ODA_DRAWENTIRE) { // Get TxtColor unless the user has set another using SetCtlColors if (!GetWindowLongPtr(lpdis->hwndItem, GWLP_USERDATA)) SetTextColor(lpdis->hDC, (COLORREF)(INT_PTR) pField->hImage); // Draw the text DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_CENTER | DT_VCENTER | DT_WORDBREAK | (bRTL ? DT_RTLREADING : 0)); } // Draw the focus rect if needed if (((lpdis->itemState & ODS_FOCUS) && (lpdis->itemAction & ODA_DRAWENTIRE)) || (lpdis->itemAction & ODA_FOCUS)) { // NB: when not in DRAWENTIRE mode, this will actually toggle the focus // rectangle since it's drawn in a XOR way DrawFocusRect(lpdis->hDC, &rc); } pField->rect = rc; #ifdef IO_LINK_UNDERLINED DeleteObject(SelectObject(lpdis->hDC, OldFont)); #endif break; } case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: case WM_CTLCOLORBTN: case WM_CTLCOLORLISTBOX: // let the NSIS window handle colors, it knows best return mySendMessage(hMainWindow, uMsg, wParam, lParam); } return 0; } #ifdef IO_ENABLE_LINK #ifndef IDC_HAND #define IDC_HAND MAKEINTRESOURCE(32649) #endif #ifndef BS_TYPEMASK #define BS_TYPEMASK 0x0000000FL #endif // pFields[nIdx].nParentIdx is used to store original windowproc LRESULT CALLBACK StaticLINKWindowProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam) { int StaticField = FindControlIdx(GetDlgCtrlID(hWin)); if (StaticField < 0) return 0; FieldType *pField = pFields + StaticField; switch(uMsg) { case WM_GETDLGCODE: // Pretend we are a normal button/default button as appropriate return DLGC_BUTTON | ((pField->nFlags & FLAG_WANTRETURN) ? DLGC_DEFPUSHBUTTON : DLGC_UNDEFPUSHBUTTON); case BM_SETSTYLE: // Detect when we are becoming the default button but don't lose the owner-draw style if ((wParam & BS_TYPEMASK) == BS_DEFPUSHBUTTON) pField->nFlags |= FLAG_WANTRETURN; // Hijack this flag to indicate default button status else pField->nFlags &= ~FLAG_WANTRETURN; wParam = (wParam & ~BS_TYPEMASK) | BS_OWNERDRAW; break; case WM_NCHITTEST: { POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; MapWindowPoints(0, hWin, &pt, 1); if (PtInRect(&pField->rect, pt)) return HTCLIENT; else return HTNOWHERE; } case WM_SETCURSOR: { if ((HWND)wParam == hWin && LOWORD(lParam) == HTCLIENT) { HCURSOR hCur = LoadCursor(NULL, IDC_HAND); if (hCur) { SetCursor(hCur); return 1; // halt further processing } } } } return CallWindowProc((WNDPROC)pField->nParentIdx, hWin, uMsg, wParam, lParam); } #endif LRESULT CALLBACK NumbersOnlyPasteWndProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam) { int nIdx = FindControlIdx(GetDlgCtrlID(hWin)); if (nIdx < 0) return 0; FieldType *pField = pFields + nIdx; if (uMsg == WM_PASTE) { if (OpenClipboard(hWin)) { #ifdef _UNICODE HGLOBAL hData = GetClipboardData(CF_UNICODETEXT); #else HGLOBAL hData = GetClipboardData(CF_TEXT); #endif if (hData) { TCHAR *lpData = (TCHAR *) GlobalLock(hData); if (lpData) { int iLen = lstrlen(lpData); TCHAR *lpFilteredData = (TCHAR *) MALLOC((iLen + 1)*sizeof(TCHAR)); if (lpFilteredData) { for (int i = 0, j = 0; i < iLen; i++) { if (lpData[i] >= _T('0') && lpData[i] <= _T('9')) { lpFilteredData[j] = lpData[i]; j++; } lpFilteredData[j] = 0; } SendMessage(hWin, EM_REPLACESEL, TRUE, (LPARAM) lpFilteredData); FREE(lpFilteredData); } GlobalUnlock(hData); } } CloseClipboard(); return 0; } } return CallWindowProc(pField->wndProc, hWin, uMsg, wParam, lParam); } int old_cancel_visible; int WINAPI createCfgDlg() { g_is_back=0; g_is_cancel=0; HWND mainwnd = hMainWindow; if (!mainwnd) { popstring(NULL); pushstring(_T("error finding mainwnd")); return 1; // cannot be used in silent mode unfortunately. } if (!g_stacktop || !*g_stacktop || !(pszFilename = (*g_stacktop)->text) || !pszFilename[0] || !ReadSettings()) { popstring(NULL); pushstring(_T("error finding config")); return 1; } HWND childwnd=GetDlgItem(mainwnd,nRectId); if (!childwnd) { popstring(NULL); pushstring(_T("error finding childwnd")); return 1; } hCancelButton = GetDlgItem(mainwnd,IDCANCEL); hNextButton = GetDlgItem(mainwnd,IDOK); hBackButton = GetDlgItem(mainwnd,3); mySetWindowText(hCancelButton,pszCancelButtonText); mySetWindowText(hNextButton,pszNextButtonText); mySetWindowText(hBackButton,pszBackButtonText); if (bBackEnabled!=-1) EnableWindow(hBackButton,bBackEnabled); if (bCancelEnabled!=-1) { EnableWindow(hCancelButton,bCancelEnabled); if (bCancelEnabled) EnableMenuItem(GetSystemMenu(mainwnd, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_ENABLED); else EnableMenuItem(GetSystemMenu(mainwnd, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); } if (bCancelShow!=-1) old_cancel_visible=ShowWindow(hCancelButton,bCancelShow?SW_SHOWNA:SW_HIDE); HFONT hFont = (HFONT)mySendMessage(mainwnd, WM_GETFONT, 0, 0); // Prevent WM_COMMANDs from being processed while we are building g_done = 1; int mainWndWidth, mainWndHeight; hConfigWindow=CreateDialog(m_hInstance,MAKEINTRESOURCE(IDD_DIALOG1),mainwnd,cfgDlgProc); if (hConfigWindow) { RECT dialog_r; GetWindowRect(childwnd,&dialog_r); MapWindowPoints(0, mainwnd, (LPPOINT) &dialog_r, 2); mainWndWidth = dialog_r.right - dialog_r.left; mainWndHeight = dialog_r.bottom - dialog_r.top; SetWindowPos( hConfigWindow, 0, dialog_r.left, dialog_r.top, mainWndWidth, mainWndHeight, SWP_NOZORDER|SWP_NOACTIVATE ); // Sets the font of IO window to be the same as the main window mySendMessage(hConfigWindow, WM_SETFONT, (WPARAM)hFont, TRUE); } else { popstring(NULL); pushstring(_T("error creating dialog")); return 1; } BOOL fFocused = FALSE; BOOL fFocusedByFlag = FALSE; #define DEFAULT_STYLES (WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS) #define RTL_EX_STYLES (WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR) for (int nIdx = 0; nIdx < nNumFields; nIdx++) { static struct { const TCHAR* pszClass; DWORD dwStyle; DWORD dwRTLStyle; DWORD dwExStyle; DWORD dwRTLExStyle; } ClassTable[] = { { _T("STATIC"), // FIELD_HLINE DEFAULT_STYLES | SS_ETCHEDHORZ | SS_SUNKEN, DEFAULT_STYLES | SS_ETCHEDHORZ | SS_SUNKEN, WS_EX_TRANSPARENT, WS_EX_TRANSPARENT | RTL_EX_STYLES }, { _T("STATIC"), // FIELD_VLINE DEFAULT_STYLES | SS_ETCHEDVERT | SS_SUNKEN, DEFAULT_STYLES | SS_ETCHEDVERT | SS_SUNKEN, WS_EX_TRANSPARENT, WS_EX_TRANSPARENT | RTL_EX_STYLES }, { _T("STATIC"), // FIELD_LABEL DEFAULT_STYLES, DEFAULT_STYLES | SS_RIGHT, WS_EX_TRANSPARENT, WS_EX_TRANSPARENT | RTL_EX_STYLES }, { _T("STATIC"), // FIELD_ICON DEFAULT_STYLES | SS_ICON, DEFAULT_STYLES | SS_ICON, 0, RTL_EX_STYLES }, { _T("STATIC"), // FIELD_BITMAP DEFAULT_STYLES | SS_BITMAP, DEFAULT_STYLES | SS_BITMAP, 0, RTL_EX_STYLES }, { _T("BUTTON"), // FIELD_BROWSEBUTTON DEFAULT_STYLES | WS_TABSTOP, DEFAULT_STYLES | WS_TABSTOP, 0, RTL_EX_STYLES }, { _T("BUTTON"), // FIELD_LINK DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW, DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW | BS_RIGHT, 0, RTL_EX_STYLES }, { _T("BUTTON"), // FIELD_BUTTON DEFAULT_STYLES | WS_TABSTOP, DEFAULT_STYLES | WS_TABSTOP, 0, RTL_EX_STYLES }, { _T("BUTTON"), // FIELD_GROUPBOX DEFAULT_STYLES | BS_GROUPBOX, DEFAULT_STYLES | BS_GROUPBOX | BS_RIGHT, WS_EX_TRANSPARENT, WS_EX_TRANSPARENT | RTL_EX_STYLES }, { _T("BUTTON"), // FIELD_CHECKBOX DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT, 0, RTL_EX_STYLES }, { _T("BUTTON"), // FIELD_RADIOBUTTON DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT, 0, RTL_EX_STYLES }, { _T("EDIT"), // FIELD_TEXT DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | RTL_EX_STYLES }, { _T("EDIT"), // FIELD_FILEREQUEST DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | RTL_EX_STYLES }, { _T("EDIT"), // FIELD_DIRREQUEST DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | RTL_EX_STYLES }, { _T("COMBOBOX"), // FIELD_COMBOBOX DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS, DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RIGHT | RTL_EX_STYLES }, { _T("LISTBOX"), // FIELD_LISTBOX DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | LBS_DISABLENOSCROLL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT, DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | LBS_DISABLENOSCROLL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RIGHT | RTL_EX_STYLES } }; FieldType *pField = pFields + nIdx; #undef DEFAULT_STYLES if (pField->nType < 1 || pField->nType > (int)(COUNTOF(ClassTable))) continue; DWORD dwStyle, dwExStyle; if (bRTL) { dwStyle = ClassTable[pField->nType - 1].dwRTLStyle; dwExStyle = ClassTable[pField->nType - 1].dwRTLExStyle; } else { dwStyle = ClassTable[pField->nType - 1].dwStyle; dwExStyle = ClassTable[pField->nType - 1].dwExStyle; } // Convert from dialog units RECT rect = pField->rect; // MapDialogRect uses the font used when a dialog is created, and ignores // any subsequent WM_SETFONT messages (like we used above); so use the main // NSIS window for the conversion, instead of this one. MapDialogRect(mainwnd, &rect); if (pField->rect.left < 0) rect.left += mainWndWidth; if (pField->rect.right < 0) rect.right += mainWndWidth; if (pField->rect.top < 0) rect.top += mainWndHeight; if (pField->rect.bottom < 0) rect.bottom += mainWndHeight; if (bRTL) { int right = rect.right; rect.right = mainWndWidth - rect.left; rect.left = mainWndWidth - right; } TCHAR *title = pField->pszText; switch (pField->nType) { case FIELD_ICON: case FIELD_BITMAP: title = NULL; // otherwise it is treated as the name of a resource break; case FIELD_CHECKBOX: case FIELD_RADIOBUTTON: dwStyle ^= pField->nFlags & BS_LEFTTEXT; break; case FIELD_TEXT: case FIELD_FILEREQUEST: case FIELD_DIRREQUEST: if (pField->nFlags & FLAG_PASSWORD) dwStyle |= ES_PASSWORD; if (pField->nFlags & FLAG_ONLYNUMBERS) dwStyle |= ES_NUMBER; if (pField->nFlags & FLAG_WANTRETURN) dwStyle |= ES_WANTRETURN; if (pField->nFlags & FLAG_READONLY) dwStyle |= ES_READONLY; title = pField->pszState; if (pField->nFlags & FLAG_MULTILINE) { dwStyle |= ES_MULTILINE | ES_AUTOVSCROLL; // Enable word-wrap unless we have a horizontal scroll bar // or it has been explicitly disallowed if (!(pField->nFlags & (WS_HSCROLL | FLAG_NOWORDWRAP))) dwStyle &= ~ES_AUTOHSCROLL; ConvertNewLines(pField->pszState); // If multiline-readonly then hold the text back until after the // initial focus has been set. This is so the text is not initially // selected - useful for License Page look-a-likes. if (pField->nFlags & FLAG_READONLY) title = NULL; } break; case FIELD_COMBOBOX: dwStyle |= (pField->nFlags & FLAG_DROPLIST) ? CBS_DROPDOWNLIST : CBS_DROPDOWN; title = pField->pszState; break; case FIELD_LISTBOX: dwStyle |= pField->nFlags & (LBS_NOTIFY | LBS_MULTIPLESEL | LBS_EXTENDEDSEL); break; } dwStyle |= pField->nFlags & (WS_GROUP | WS_HSCROLL | WS_VSCROLL | WS_DISABLED); if (pField->nFlags & WS_TABSTOP) dwStyle &= ~WS_TABSTOP; HWND hwCtrl = pField->hwnd = CreateWindowEx( dwExStyle, ClassTable[pField->nType - 1].pszClass, title, dwStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hConfigWindow, (HMENU)(UINT_PTR) pField->nControlID, m_hInstance, NULL ); { TCHAR szField[64]; TCHAR szHwnd[64]; wsprintf(szField, _T("Field %d"), pField->nField); wsprintf(szHwnd, _T("%d"), hwCtrl); WritePrivateProfileString(szField, pField->pszHwndEntry, szHwnd, pszFilename); } if (hwCtrl) { // Sets the font of IO window to be the same as the main window mySendMessage(hwCtrl, WM_SETFONT, (WPARAM)hFont, TRUE); // make sure we created the window, then set additional attributes switch (pField->nType) { case FIELD_TEXT: case FIELD_FILEREQUEST: case FIELD_DIRREQUEST: mySendMessage(hwCtrl, EM_LIMITTEXT, (WPARAM)pField->nMaxLength, (LPARAM)0); if (dwStyle & ES_NUMBER) { pField->wndProc = (WNDPROC) GetWindowLongPtr(hwCtrl, GWLP_WNDPROC); SetWindowLongPtr(hwCtrl, GWLP_WNDPROC, (LONG_PTR) NumbersOnlyPasteWndProc); } break; case FIELD_CHECKBOX: case FIELD_RADIOBUTTON: if (pField->pszState[0] == _T('1')) mySendMessage(hwCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0); break; case FIELD_COMBOBOX: case FIELD_LISTBOX: // if this is a listbox or combobox, we need to add the list items. if (pField->pszListItems) { UINT nAddMsg, nFindMsg, nSetSelMsg; if (pField->nType == FIELD_COMBOBOX) { nAddMsg = CB_ADDSTRING; nFindMsg = CB_FINDSTRINGEXACT; nSetSelMsg = CB_SETCURSEL; } else { nAddMsg = LB_ADDSTRING; nFindMsg = LB_FINDSTRINGEXACT; nSetSelMsg = LB_SETCURSEL; } TCHAR *pszStart, *pszEnd, *pszList; pszStart = pszEnd = pszList = STRDUP(pField->pszListItems); // pszListItems has a trailing pipe while (*pszEnd) { if (*pszEnd == _T('|')) { *pszEnd = _T('\0'); if (*pszStart) mySendMessage(hwCtrl, nAddMsg, 0, (LPARAM) pszStart); pszStart = ++pszEnd; } else pszEnd = CharNext(pszEnd); } FREE(pszList); if (pField->pszState) { if (pField->nFlags & (LBS_MULTIPLESEL|LBS_EXTENDEDSEL) && nFindMsg == LB_FINDSTRINGEXACT) { mySendMessage(hwCtrl, LB_SETSEL, FALSE, (LPARAM)-1); pszStart = pszEnd = pField->pszState; for (;;) { TCHAR c = *pszEnd; if (c == _T('|') || c == _T('\0')) { *pszEnd = _T('\0'); if (*pszStart) { INT_PTR nItem = mySendMessage(hwCtrl, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)pszStart); if (nItem != LB_ERR) mySendMessage(hwCtrl, LB_SETSEL, TRUE, nItem); } if (!c) break; pszStart = ++pszEnd; } else pszEnd = CharNext(pszEnd); } } else { INT_PTR nItem = mySendMessage(hwCtrl, nFindMsg, (WPARAM)-1, (LPARAM)pField->pszState); if (nItem != CB_ERR) { // CB_ERR == LB_ERR == -1 mySendMessage(hwCtrl, nSetSelMsg, nItem, 0); } } } } break; case FIELD_ICON: case FIELD_BITMAP: { UINT nImageType = pField->nType == FIELD_BITMAP ? IMAGE_BITMAP : IMAGE_ICON; LPARAM nImage = 0; if (pField->pszText) { pField->hImage = LoadImage( m_hInstance, pField->pszText, nImageType, (pField->nFlags & FLAG_RESIZETOFIT) ? (rect.right - rect.left) : 0, (pField->nFlags & FLAG_RESIZETOFIT) ? (rect.bottom - rect.top) : 0, LR_LOADFROMFILE ); nImage = (LPARAM)pField->hImage; } else nImage = (LPARAM)LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(103)); if ((pField->nFlags & TRANSPARENT_BMP) && nImageType == IMAGE_BITMAP) { // based on AdvSplash's SetTransparentRegion BITMAP bm; HBITMAP hBitmap = (HBITMAP) nImage; if (GetObject(hBitmap, sizeof(bm), &bm)) { HDC dc; int x, y; HRGN region, cutrgn; BITMAPINFO bmi; int size = bm.bmWidth * bm.bmHeight * sizeof(int); int *bmp = (int *) MALLOC(size); if (bmp) { bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biHeight = bm.bmHeight; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = bm.bmWidth; bmi.bmiHeader.biClrUsed = 0; bmi.bmiHeader.biClrImportant = 0; dc = CreateCompatibleDC(NULL); SelectObject(dc, hBitmap); x = GetDIBits(dc, hBitmap, 0, bm.bmHeight, bmp, &bmi, DIB_RGB_COLORS); region = CreateRectRgn(0, 0, bm.bmWidth, bm.bmHeight); int keycolor = *bmp & 0xFFFFFF; // Search for transparent pixels for (y = bm.bmHeight - 1; y >= 0; y--) { for (x = 0; x < bm.bmWidth;) { if ((*bmp & 0xFFFFFF) == keycolor) { int j = x; while ((x < bm.bmWidth) && ((*bmp & 0xFFFFFF) == keycolor)) { bmp++, x++; } // Cut transparent pixels from the original region cutrgn = CreateRectRgn(j, y, x, y + 1); CombineRgn(region, region, cutrgn, RGN_XOR); DeleteObject(cutrgn); } else { bmp++, x++; } } } // Set resulting region. SetWindowRgn(hwCtrl, region, TRUE); DeleteObject(region); DeleteObject(dc); FREE(bmp); } } } mySendMessage( hwCtrl, STM_SETIMAGE, nImageType, nImage ); if (pField->nType == FIELD_BITMAP) { // Centre the image in the requested space. // Cannot use SS_CENTERIMAGE because it behaves differently on XP to // everything else. (Thank you Microsoft.) RECT bmp_rect; GetClientRect(hwCtrl, &bmp_rect); bmp_rect.left = (rect.left + rect.right - bmp_rect.right) / 2; bmp_rect.top = (rect.top + rect.bottom - bmp_rect.bottom) / 2; SetWindowPos(hwCtrl, NULL, bmp_rect.left, bmp_rect.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER); } break; } #ifdef IO_ENABLE_LINK case FIELD_LINK: pField->nParentIdx = (INT_PTR) SetWindowLongPtr(hwCtrl, GWLP_WNDPROC, (LONG_PTR)StaticLINKWindowProc); break; #endif } // Set initial focus to the first appropriate field ( with FOCUS flag) if (!fFocusedByFlag && (dwStyle & (WS_TABSTOP | WS_DISABLED)) == WS_TABSTOP && pField->nType >= FIELD_SETFOCUS) { if (pField->nFlags & FLAG_FOCUS) { fFocusedByFlag = TRUE; } if (!fFocused || fFocusedByFlag) { fFocused = TRUE; mySetFocus(hwCtrl); } } // If multiline-readonly then hold the text back until after the // initial focus has been set. This is so the text is not initially // selected - useful for License Page look-a-likes. if ((pField->nFlags & (FLAG_MULTILINE | FLAG_READONLY)) == (FLAG_MULTILINE | FLAG_READONLY)) mySetWindowText(hwCtrl, pField->pszState); } } if (!fFocused) mySetFocus(hNextButton); mySetWindowText(mainwnd,pszTitle); pFilenameStackEntry = *g_stacktop; *g_stacktop = (*g_stacktop)->next; static TCHAR tmp[32]; wsprintf(tmp,_T("%d"),hConfigWindow); pushstring(tmp); return 0; } void WINAPI showCfgDlg() { lpWndProcOld = (WNDPROC) SetWindowLongPtr(hMainWindow,DWLP_DLGPROC,(LONG_PTR)ParentWndProc); // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog mySendMessage(hMainWindow, WM_NOTIFY_CUSTOM_READY, (WPARAM)hConfigWindow, 0); ShowWindow(hConfigWindow, SW_SHOWNA); g_done = g_NotifyField = 0; while (!g_done) { MSG msg; GetMessage(&msg, NULL, 0, 0); if (!IsDialogMessage(hConfigWindow,&msg) && !IsDialogMessage(hMainWindow,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } // we don't save settings on cancel since that means your installer will likely // quit soon, which means the ini might get flushed late and cause delete issues? if (!g_is_cancel) SaveSettings(); SetWindowLongPtr(hMainWindow,DWLP_DLGPROC,(LONG_PTR)lpWndProcOld); DestroyWindow(hConfigWindow); // by ORTIM: 13-August-2002 if (bCancelShow!=-1) ShowWindow(hCancelButton,old_cancel_visible?SW_SHOWNA:SW_HIDE); FREE(pFilenameStackEntry); FREE(pszTitle); FREE(pszCancelButtonText); FREE(pszNextButtonText); FREE(pszBackButtonText); int i = nNumFields; while (i--) { FieldType *pField = pFields + i; int j = FIELD_BUFFERS; while (j--) FREE(((TCHAR **) pField)[j]); if (pField->nType == FIELD_BITMAP) { DeleteObject(pField->hImage); } if (pField->nType == FIELD_ICON) { DestroyIcon((HICON)pField->hImage); } } FREE(pFields); pushstring(g_is_cancel?_T("cancel"):g_is_back?_T("back"):_T("success")); } int initCalled; #ifdef _UNICODE // convert ini file to Unicode so that WritePrivateProfileString can write Unicode strings in it extern "C" void __declspec(dllexport) make_unicode(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { EXDLL_INIT(); TCHAR filename[MAX_PATH]; popstring(filename); HANDLE hFile = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile != INVALID_HANDLE_VALUE) { DWORD fSize = GetFileSize(hFile, NULL); LPSTR lpBuffer = (LPSTR) MALLOC(fSize); if (lpBuffer) { DWORD bytes; ReadFile(hFile, lpBuffer, fSize, &bytes, NULL); if ((bytes < 2) || (lpBuffer[0] != '\xFF') || (lpBuffer[1] != '\xFE')) // file is not already Unicode { LPWSTR lpWide = (LPWSTR) MALLOC((bytes+1)*2); if (lpWide) { int cch = MultiByteToWideChar(CP_ACP, 0, lpBuffer, bytes, lpWide, bytes+1); if (cch) { SetFilePointer(hFile, 0, NULL, FILE_BEGIN); WriteFile(hFile, "\xFF\xFE", 2, &bytes, NULL); // write Unicode BOM WriteFile(hFile, lpWide, cch*2, &bytes, NULL); SetEndOfFile(hFile); } FREE(lpWide); } } FREE(lpBuffer); } CloseHandle(hFile); } } #endif extern "C" void __declspec(dllexport) dialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { hMainWindow=hwndParent; EXDLL_INIT(); if (initCalled) { pushstring(_T("error")); return; } if (createCfgDlg()) return; popstring(NULL); showCfgDlg(); } static UINT_PTR PluginCallback(enum NSPIM msg) { return 0; } extern "C" void __declspec(dllexport) initDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { hMainWindow=hwndParent; EXDLL_INIT(); extra->RegisterPluginCallback(m_hInstance, PluginCallback); if (initCalled) { pushstring(_T("error")); return; } if (createCfgDlg()) return; initCalled++; } extern "C" void __declspec(dllexport) show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { EXDLL_INIT(); if (!initCalled) { pushstring(_T("error")); return; } initCalled--; showCfgDlg(); } extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { m_hInstance=hInst; return TRUE; } /** * Looks up a single token in the psTable_ and returns its mapped numerical value. * * @param psTable_ The lookup table. * @param pszToken_ The token to lookup. * @return The integer value related to the token, otherwise 0. */ int WINAPI LookupToken(TableEntry* psTable_, TCHAR* pszToken_) { for (int i = 0; psTable_[i].pszName; i++) if (!lstrcmpi(pszToken_, psTable_[i].pszName)) return psTable_[i].nValue; return 0; } /** * In a string of tokens separated by vertical bars '|', look them up in the * Lookup Table psTable and return their logical OR of their subsequent * integer values. * * @param psTable_ The lookup table to search in. * @param pszToken String of tokens separated by '|' whose values are to be * ORed together. * @return The ORed value of the token values. If no tokens were found, it * will return 0. */ int WINAPI LookupTokens(TableEntry* psTable_, TCHAR* pszTokens_) { int n = 0; TCHAR *pszStart = pszTokens_; TCHAR *pszEnd = pszTokens_; for (;;) { TCHAR c = *pszEnd; if (c == _T('|') || c == _T('\0')) { *pszEnd = _T('\0'); n |= LookupToken(psTable_, pszStart); *pszEnd = c; if (!c) break; pszStart = ++pszEnd; } else pszEnd = CharNext(pszEnd); } return n; } /** * ConvertNewLines takes a string and turns escape sequences written * as separate chars e.g. "\\t" into the special char they represent * '\t'. The transformation is done in place. * * @param str [in/out] The string to convert. */ void WINAPI ConvertNewLines(TCHAR *str) { TCHAR *p1, *p2, *p3; TCHAR tch0, tch1, nch; if (!str) return; p1 = p2 = str; while ((tch0 = *p1) != 0) { nch = 0; // new translated char if (tch0 == _T('\\')) { tch1 = *(p1+1); if (tch1 == _T('t')) nch = _T('\t'); else if (tch1 == _T('n')) nch = _T('\n'); else if (tch1 == _T('r')) nch = _T('\r'); else if (tch1 == _T('\\')) nch = _T('\\'); } // Was it a special char? if (nch) { *p2++ = nch; p1 += 2; } else { // For MBCS p3 = CharNext(p1); while (p1 < p3) *p2++ = *p1++; } } *p2 = 0; } nsis-3.11/Contrib/InstallOptions/Readme.html000077500000000000000000001456141477201124000210730ustar00rootroot00000000000000 InstallOptions 2

InstallOptions 2

The InstallOptions plug-in is deprecated. For new scripts, it is recommended to use the new nsDialogs plug-in instead.

Introduction

InstallOptions is an NSIS plugin which allows you to create custom pages for NSIS installers, to prompt the user for extra information.

The dialogs created by InstallOptions are based on INI files which define the controls on the dialog and their properties. These INI files can be modified from the script to adjust the dialogs at runtime.

The format of INI files is described in a Wikipedia article.

INI file structure

The INI file has one required section. This section includes the number of controls to be created as well as general window attributes. The INI file also includes a variable number of Field sections which are used to create the controls to be displayed.

The required section is named "Settings". It can contain the following values:

NumFields (required) The number of control elements to be displayed on the dialog window.
Title (optional) If specified, gives the text to set the titlebar to. Otherwise, the titlebar text is not changed.
CancelEnabled (optional) If specified, overrides NSIS settings and enables or disables the cancel button. If set to 1, the cancel button will be enabled. If set to 0, the cancel button will be disabled.
CancelShow (optional) If specified, overrides NSIS settings and shows or hides the cancel button If set to 1, the cancel button will be shown. If set to 0, the cancel button will be hidden.
BackEnabled (optional) If specified, overrides NSIS settings and enables or disables the back button. If set to 1, the back button will be enabled. If set to 0, the back button will be disabled.
CancelButtonText (optional) Overrides the text for the cancel button. If not specified, the cancel button text will not be changed.
NextButtonText (optional) Overrides the text for the next button. If not specified, the next button text will not be changed.
BackButtonText (optional) Overrides the text for the back button. If not specified, the back button text will not be changed.
Rect (optional) Overrides the default rect ID to run over. This will make IO resize itself according to a different rect than NSIS's dialogs rect.
RTL (optional) If 1 is specified the dialog will be mirrored and all texts will be aligned to the right. The INSTALLOPTIONS_EXTRACT macros automatically set this field to the right value for the current installer language as given by the NSIS string $(^RTL).
State (output) This is not something you have to supply yourself but is set by InstallOptions, before calling your custom page validation function, to the field number of the custom Button control (or other control having the Notify flag) the user pressed, if any.

Each field section has the heading "Field #" where # must be sequential numbers from 1 to NumFields. Each Field section can contain the following values:

Type (required) Type of control to be created. Valid values are "Label", "Text", "Password", "Combobox", "DropList", "Listbox", "CheckBox", "RadioButton", "FileRequest", "DirRequest" "Icon", "Bitmap", "GroupBox", "HLine", "VLine", "Link" or "Button".

A "Label" is used to display static text. (i.e. a caption for a textbox)
A "Text" and "Password" accept text input from the user. "Password" masks the input with * characters.
A "Combobox" allows the user to type text not in the popup list, a "Droplist" only allows selection of items in the list.
A "Listbox" shows multiple items and can optionally allow the user to select more than one item.
A "CheckBox" control displays a check box with label.
A "RadioButton" control displays a radio button with label.
A "FileRequest" control displays a textbox and a browse button. Clicking the browse button will display a file requester where the user can browse for a file.
A "DirRequest" control displays a textbox and a browse button. Clicking the browse button will display a directory requester where the user can browse for a directory.
An "Icon" control displays an icon. Use no Text to use the installer icon.
A "Bitmap" control displays a bitmap.
A "GroupBox" control displays a frame to group controls.
A "HLine" control displays a horizontal line to separate controls.
A "VLine" control displays a vertical line to separate controls.
A "Link" control displays a static hot text. When the user clicks the control the contents of State (e.g. http://...) will be executed using ShellExecute. Alternatively State can be omitted and the NOTIFY flag used to have your NSIS script called. See the "NOTIFY" flag below for more information.
A "Button" control displays a push button that can be used in the same way as the "Link" control above.
Text (optional) Specifies the caption of a label, checkbox, or radio button control. For DirRequest control this specifies the title of the browse dialog. For icon and bitmaps control this specifies the path to the image.

Note: For labels, \r\n will be converted to a newline. To use a back-slash in your text you have to escape it using another back-slash - \\. Described below are NSIS functions for converting text to/from this format.
State (optional) Specifies the state of the control. This is updated when the user closes the window, so you can read from it from NSIS. For edit texts and dir and file request boxes, this is the string that is specified. For radio button and check boxes, this can be '0' or '1' (for unchecked or checked). For list boxes, combo boxes and drop lists this is the selected items separated by pipes ('|'). For Links and Buttons this can specify something to be executed or opened (using ShellExecute).

Note: For Text fields with the MULTILINE flag, \r\n will be converted to a newline. To use a back-slash in your text you have to escape it using another back-slash - \\. Described below are NSIS functions for converting text to/from this format.
ListItems (optional) A list of items to display in a combobox, droplist, or listbox.
This is a single line of text with each item separated by a pipe character '|'
MaxLen (optional) Causes validation on the selected control to limit the maximum length of text.
If the user specifies more text than this, a message box will appear when they click "OK" and the dialog will not be dismissed.
You should not use this on a "combobox" since the user can not control what is selected.
This should be set to a maximum of 260 for "FileRequest" and "DirRequest" controls.
Ignored on "Label" controls.
MinLen (optional) Causes validation on the selected control to force the user to enter a minimum amount of text.
If the user specifies less text than this, a message box will appear when they click "OK" and the dialog will not be dismissed.
Unlike MaxLen, this is useful for "Combobox" controls. By setting this to a value of "1" the program will force the user to select an item.
Ignored on "Label" controls.
ValidateText (optional) If the field fails the test for "MinLen" or "MaxLen", a messagebox will be displayed with this text.

Note: \r\n will be converted to a newline, two back-slashes will be converted to one - \\. Described below are NSIS functions for converting text to/from this format.
Left
Right
Top
Bottom
(required) The position on the dialog where this control appears. All sizes should be set in dialog units. To get the right dimensions for your controls, design your dialog using a resource editor and copy the dimensions to the INI file.

Note: You can specify negative coordinates to specify the distance from the right or bottom edge.

Note (2): For combobox or droplist, the "bottom" value is not used in the same way.
In this case, the bottom value is the maximum size of the window when the pop-up list is being displayed. All other times, the combobox is automatically sized to be one element tall. If you have trouble where you can not see the combobox drop-down, then check the bottom value and ensure it is large enough. A rough guide for the height required is the number of items in the list multiplied by 8, plus 20.

Note (3): FileRequest and DirRequest controls will allocate 15 dialog units to the browse button. Make this control wide enough the contents of the textbox can be seen.
Filter (optional) Specifies the filter to be used in the "FileRequest" control.
This is constructed by putting pairs of entries together, each item separated by a | character.
The first value in each pair is the text to display for the filter.
The second value is the pattern to use to match files.
For example, you might specify:
Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*
If not specified, then the filter defaults to All Files|*.*

Note: you should not put any extra spaces around the | characters.
Root (optional) Used by DirRequest controls to specify the root directory of the search. By default, this allows the user to browse any directory on the computer. This will limit the search to a particular directory on the system.
Flags (optional) This specifies additional flags for the display of different controls. Each value should be separated by a | character, and you should be careful not to put any spaces around the | character.
Value Meaning
REQ_SAVE This causes "FileRequest" controls to display a Save As dialog. If not specified, an Open dialog is used.
FILE_MUST_EXIST Used by "FileRequest" to determine if the selected file must exist.
This only applies if an "Open" dialog is being displayed.
This currently does not force the file to exist other than through the browse button.
FILE_EXPLORER Used by "FileRequest", enables new file request look (recommended)
FILE_HIDEREADONLY Used by "FileRequest", hides "open read only" checkbox in open dialog.
WARN_IF_EXIST Used by "FileRequest" to display a warning message if the selected file already exists.
The warning message is only displayed for files selected with the browse button.
PATH_MUST_EXIST Used by "FileRequest" to force the path to exist. Prevents the user from typing a non-existent path into the browse dialog window.
This only validates path's selected with the browse button.
PROMPT_CREATE Used by "FileRequest" to display a warning if the selected file does not exist. However, it still allows the user to select the file.
This only displays the warning for files selected with the browse button.
Doesn't work along with REQ_SAVE.
RIGHT Used by "Checkbox" and "Radiobutton" controls to specify you want the checkbox to the right of the text instead of the left as is the default.
MULTISELECT Used by "Listbox" controls. Turns string selection on or off each time the user clicks or double-clicks a string in the list box. The user can select any number of strings. If this flag and EXTENDEDSELCT are not specified, only one item can be selected from the list.
EXTENDEDSELCT Used by "Listbox" controls. Allows multiple items to be selected by using the SHIFT key and the mouse or special key combinations. If this flag and MULTISELECT are not specified, only one item can be selected from the list.
RESIZETOFIT This causes "Bitmap" controls to resize the image to the size of the control. Also useful to support custom DPI settings. Without this, the image will be centered within the specified area.
TRANSPARENT Used by "Bitmap" controls. Hides every pixel with the same color as of the top left pixel. This allows to see-through to controls behind it. This flag doesn't work well with a combination of the RESIZETOFIT flag and bitmaps with more than 256 colors.
GROUP Add this flag to the first control of a group of controls to group them. Grouping controls allows you to create multiple groups of radio button and makes keyboard navigation using arrow keys easier.
FOCUS Sets focus on the specified control, instead of the first focusable control. If more than one field is specified with this flag, only the first one will receive focus.
NOTABSTOP Do not stop on the control when the user pressed the Tab key. Add NOTABSTOP to all controls of a group except the first one to allow navigation between groups with the Tab key.
DISABLED Causes a control to be disabled.
ONLY_NUMBERS Used by "Text" controls. Forces the user to enter only numbers into the edit box.
MULTILINE Used by "Text" controls. Causes the control to accept multiple-lines.
WANTRETURN Used by "Text" controls with multiple-line. Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into the text box.
NOWORDWRAP Used by "Text" controls with multiple-line. Disables the word-wrap that occurs when long lines are entered. Long lines instead scroll off to the side. Specifying the HSCROLL flag also has this effect.
HSCROLL Show a horizontal scrollbar. When used by "Text" controls with multiple-lines this also disables word-wrap.
VSCROLL Show a vertical scrollbar.
READONLY Used by "Text" controls. Prevents the user from entering or editing text in the edit control, but allow the user to select and copy the text.
NOTIFY Used by "Button", "Link", "CheckBox", "RadioButton", "ListBox" and "DropList" controls. Causes InstallOptions to call your NSIS custom page validation/leave function whenever the control's selection changes. Your validation/leave function can read the "State" value from the "Settings" section to determine which control caused the notification, if any, and perform some appropriate action followed by an Abort instruction (to tell NSIS to return to the page). The Examples\InstallOptions folder contains an example script showing how this might be used.
TxtColor (optional) Used by Link controls to specify the foreground color of the text. Format: 0xBBGGRR (hexadecimal).
HWND
HWND2
(output) After initDialog returns, this will contain the HWND of the control created by this field. It can be used instead of FindWindow and GetDlgItem. HWND2 contains the HWND of an additional control, such as the browse button.

Header file

The InstallOptions header files provides macros and functions to easily create custom dialogs. You can include it on the top of your script as follows:

!include InstallOptions.nsh

Creating dialogs

Extracting the INI file

First, you have to extract your InstallOptions INI files in the .onInit function (or un.onInit for the uninstaller) using the INSTALLOPTIONS_EXTRACT macro. The files will be extracted to a temporary folder (the NSIS plug-ins folder) that is automatically created.

Function .onInit
  !insertmacro INSTALLOPTIONS_EXTRACT "ioFile.ini"
FunctionEnd

If the INI file is located in another directory, use INSTALLOPTIONS_EXTRACT_AS. The second parameter is the filename in the temporary folder, which is the filename that should be used as input for the other macros.

Function .onInit
  !insertmacro INSTALLOPTIONS_EXTRACT_AS "..\ioFile.ini" "ioFile.ini"
FunctionEnd

Displaying the dialog

You can call InstallOptions in a page function defined with the Page or UninstPage command. Check the NSIS documentation (Scripting Reference -> Pages) for information about the page system.

Page custom CustomPageFunction

To display the dialog, use the INSTALLOPTIONS_DISPLAY macro:

Function CustomPageFunction ;Function name defined with Page command
  !insertmacro INSTALLOPTIONS_DISPLAY "ioFile.ini"
FunctionEnd

User input

To get the input of the user, read the State value of a Field using the INSTALLOPTIONS_READ macro:

!insertmacro INSTALLOPTIONS_READ $VAR "ioFile.ini" "Field #" "Name"

Writing to INI files

The INSTALLOPTIONS_WRITE macro allows you to write values to the INI file to change texts or control settings at runtime:

!insertmacro INSTALLOPTIONS_WRITE "ioFile.ini" "Field #" "Name" "Value"

Escaped values

Some InstallOptions values are escaped (in a similar manner to "C" strings) to allow characters to be used that are not normally valid in INI file values. The affected values are:

  • The ValidateText field
  • The Text value of Label fields
  • The State value of Text fields that have the MULTILINE flag

The escape character is the back-slash character ("\") and the available escape sequences are:

"\\" Back-slash
"\r" Carriage return (ASCII 13)
"\n" Line feed (ASCII 10)
"\t" Tab (ASCII 9)

The INSTALLOPTIONS_READ_CONVERT and INSTALLOPTIONS_WRITE_CONVERT macros automatically convert these characters in installer code. In uninstaller code, use INSTALLOPTIONS_READ_UNCONVERT and INSTALLOPTIONS_WRITE_UNCONVERT.

To use these macros in your script, the conversion functions need to be included:

;For INSTALLOPTIONS_READ_CONVERT
  !insertmacro INSTALLOPTIONS_FUNCTION_READ_CONVERT
;For INSTALLOPTIONS_WRITE_CONVERT
  !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT
;For INSTALLOPTIONS_READ_UNCONVERT
  !insertmacro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT
;For INSTALLOPTIONS_WRITE_UNCONVERT
  !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT

Input validation

To validate the user input (for example, to check whether the user has filled in a textbox) use the leave function of the Page command and Abort when the validation has failed:

Function ValidateCustom

  !insertmacro INSTALLOPTIONS_READ $R0 "test.ini" "Field 1" "State"
  StrCmp $R0 "" 0 +3
    MessageBox MB_ICONEXCLAMATION|MB_OK "Please enter your name."
    Abort

FunctionEnd

Return value

After a dialog is created (using display or show), a return value is available:

  • success - The user has pressed the Next button
  • back - The user has pressed the Back button
  • cancel - The user has pressed the Cancel button
  • error - An error has occurred, the dialog cannot be displayed.

You only have to check this value if you need something really special, such as doing something when the user pressed the Back button.

If you need the return value, use the INSTALLOPTIONS_DISPLAY_RETURN or INSTALLOPTIONS_SHOW_RETURN macro. The return value will be added to the stack, so you can use the Pop command to get it.

Reserve files

When using solid compression, it's important that files which are being extracted in user interface functions are located before other files in the data block. Otherwise there may be a delay before a page can be displayed.

To ensure that this is the case, add ReserveFile commands for InstallOptions and the INI files before all sections and functions:

ReserveFile "test.ini"
ReserveFile /plugin InstallOptions.dll

Fonts and colors

To customize fonts or colors on InstallOptions dialogs, the INSTALLOPTIONS_INITDIALOG and INSTALLOPTIONS_SHOW macro can be used.

INSTALLOPTIONS_INITDIALOG creates the dialog in memory, but does not show it. After inserting this macro, you can set the fonts and colors, and then insert INSTALLOPTIONS_SHOW to show the dialog.

The INSTALLOPTIONS_INITDIALOG macro also pushes the HWND of the custom dialog to the stack. Control HWND's are available for each control in the HWND entry of the corresponding field in the INI file.

Example of using a custom font:

Var HWND
Var DLGITEM
Var FONT

Function FunctionName ;FunctionName defined with Page command

  !insertmacro INSTALLOPTIONS_INITDIALOG "ioFile.ini"
  Pop $HWND ;HWND of dialog
    
  !insertmacro INSTALLOPTIONS_READ $DLGITEM "ioFile.ini" "Field 1" "HWND"
    
  ;$DLGITEM contains the HWND of the first field
  CreateFont $FONT "Tahoma" 10 700 
  SendMessage $DLGITEM ${WM_SETFONT} $FONT 0
        
  !insertmacro INSTALLOPTIONS_SHOW

FunctionEnd

Credits

Original version by Michael Bishop
DLL version by Nullsoft, Inc.
DLL version 2 by Amir Szekely, ORTIM, Joost Verburg
New documentation by Joost Verburg

License

Original version Copyright © 2001 Michael Bishop
DLL version 1 Copyright © 2001-2002 Nullsoft, Inc., ORTIM
DLL version 2 Copyright © 2003-2025 Amir Szekely, Joost Verburg, Dave Laundon

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented;
   you must not claim that you wrote the original software.
   If you use this software in a product, an acknowledgment in the
   product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
   and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
nsis-3.11/Contrib/InstallOptions/SConscript000077500000000000000000000013041477201124000210050ustar00rootroot00000000000000target = 'InstallOptions' files = Split(""" InstallerOptions.cpp """) resources = Split(""" ioptdll.rc """) libs = Split(""" kernel32 user32 gdi32 shell32 comdlg32 ole32 """) examples = Split(""" test.nsi test.ini testimgs.nsi testimgs.ini testlink.nsi testlink.ini testnotify.nsi testnotify.ini """) docs = Split(""" Changelog.txt Readme.html """) includes = Split(""" InstallOptions.nsh """) Import('BuildPlugin env PerformPluginExtrasDistOperationOnce') unicodetarget = 'UNICODE' in env['CPPDEFINES'] BuildPlugin(target, files, libs, examples, docs, res = resources, cppused = True) if PerformPluginExtrasDistOperationOnce(env, unicodetarget): env.DistributeInclude(includes) nsis-3.11/Contrib/InstallOptions/ioptdll.rc000077500000000000000000000035751477201124000210040ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 57, 41 STYLE DS_CONTROL | WS_CHILD FONT 8, "MS Sans Serif" BEGIN END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 50 TOPMARGIN, 7 BOTTOMMARGIN, 34 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/InstallOptions/resource.h000077500000000000000000000006701477201124000210000ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by ioptdll.rc // #define IDD_DIALOG1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/InstallOptions/test.ini000077500000000000000000000017651477201124000204660ustar00rootroot00000000000000[Settings] NumFields=8 [Field 1] Type=GroupBox Left=0 Right=-1 Top=0 Bottom=-5 Text=" This is a group box... " [Field 2] Type=checkbox Text=Install support for X Left=10 Right=-10 Top=17 Bottom=25 State=0 Flags=GROUP [Field 3] Type=checkbox Text=Install support for Y Left=10 Right=-10 Top=30 Bottom=38 State=1 Flags=NOTABSTOP [Field 4] Type=checkbox Text=Install support for Z Left=10 Right=-10 Top=43 Bottom=51 State=0 Flags=NOTABSTOP [Field 5] Type=FileRequest State=C:\dummy.xyz Left=10 Right=-10 Top=56 Bottom=68 Filter=XYZ Files|*.xyz|All files|*.* Flags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY [Field 6] Type=DirRequest Left=10 Right=-10 Top=73 Bottom=85 Text=Select a directory... State=C:\Program Files\NSIS [Field 7] Type=Label Left=10 Right=-10 Top=90 Bottom=98 Text=This is a label... [Field 8] Type=Text Left=10 Right=-10 Top=98 Bottom=120 State="Multiline\r\nedit..." Flags=MULTILINE|VSCROLL|WANTRETURNnsis-3.11/Contrib/InstallOptions/test.nsi000077500000000000000000000042051477201124000204700ustar00rootroot00000000000000;InstallOptions Test Script ;Written by Joost Verburg ;-------------------------- !define TEMP1 $R0 ;Temp variable ;The name of the installer Name "InstallOptions Test" ;The file to write OutFile "Test.exe" ; Show install details ShowInstDetails show ;Things that need to be extracted on startup (keep these lines before any File command!) ;Only useful for BZIP2 compression ;Use ReserveFile for your own InstallOptions INI files too! ReserveFile /plugin InstallOptions.dll ReserveFile "test.ini" ;Order of pages Page custom SetCustom ValidateCustom ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom. Page instfiles Section "Components" ;Get Install Options dialog user input ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 2" "State" DetailPrint "Install X=${TEMP1}" ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State" DetailPrint "Install Y=${TEMP1}" ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 4" "State" DetailPrint "Install Z=${TEMP1}" ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 5" "State" DetailPrint "File=${TEMP1}" ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 6" "State" DetailPrint "Dir=${TEMP1}" ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 8" "State" DetailPrint "Info=${TEMP1}" SectionEnd Function .onInit ;Extract InstallOptions files ;$PLUGINSDIR will automatically be removed when the installer closes InitPluginsDir File /oname=$PLUGINSDIR\test.ini "test.ini" FunctionEnd Function SetCustom ;Display the InstallOptions dialog Push ${TEMP1} InstallOptions::dialog "$PLUGINSDIR\test.ini" Pop ${TEMP1} Pop ${TEMP1} FunctionEnd Function ValidateCustom ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 2" "State" StrCmp ${TEMP1} 1 done ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State" StrCmp ${TEMP1} 1 done ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 4" "State" StrCmp ${TEMP1} 1 done MessageBox MB_ICONEXCLAMATION|MB_OK "You must select at least one install option!" Abort done: FunctionEnd nsis-3.11/Contrib/InstallOptions/testimgs.ini000077500000000000000000000036201477201124000213360ustar00rootroot00000000000000[Settings] NumFields=8 [Field 1] Type=GroupBox Left=0 Right=-1 Top=0 Bottom=-5 Text=" Images " [Field 2] Type=Bitmap Left=10 Right=-10 Top=10 Bottom=30 Flags=TRANSPARENT [Field 3] Type=Bitmap Left=10 Right=-10 Top=35 Bottom=45 Flags=TRANSPARENT [Field 4] Type=Bitmap Left=10 Right=-10 Top=50 Bottom=70 Flags=RESIZETOFIT|TRANSPARENT [Field 5] Type=Bitmap Left=10 Right=-10 Top=75 Bottom=95 Flags=RESIZETOFIT|TRANSPARENT [Field 6] Type=Icon Left=10 Right=40 Top=100 Bottom=120 [Field 7] Type=Icon Left=50 Right=80 Top=100 Bottom=120 [Field 8] Type=Label Left=10 Right=-10 Top=10 Bottom=-10 Text=ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ nsis-3.11/Contrib/InstallOptions/testimgs.nsi000077500000000000000000000036641477201124000213600ustar00rootroot00000000000000;InstallOptions Test Script ;Written by Joost Verburg ;-------------------------- ;The name of the installer Name "InstallOptions Test" ;The file to write OutFile "Test.exe" ; Show install details ShowInstDetails show ;Things that need to be extracted on startup (keep these lines before any File command!) ;Only useful for BZIP2 compression ;Use ReserveFile for your own InstallOptions INI files too! ReserveFile /plugin InstallOptions.dll ReserveFile "testimgs.ini" ReserveFile "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp" ReserveFile "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" ReserveFile "${NSISDIR}\Contrib\Graphics\Icons\pixel-install.ico" ;Order of pages Page custom SetCustom "" ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom. Page instfiles Section SectionEnd Function .onInit ;Extract InstallOptions files ;$PLUGINSDIR will automatically be removed when the installer closes InitPluginsDir File /oname=$PLUGINSDIR\testimgs.ini "testimgs.ini" File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp" File /oname=$PLUGINSDIR\image2.bmp "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" File /oname=$PLUGINSDIR\icon.ico "${NSISDIR}\Contrib\Graphics\Icons\pixel-install.ico" ;Write image paths to the INI file WriteINIStr $PLUGINSDIR\testimgs.ini "Field 2" "Text" $PLUGINSDIR\image.bmp WriteINIStr $PLUGINSDIR\testimgs.ini "Field 3" "Text" $PLUGINSDIR\image2.bmp WriteINIStr $PLUGINSDIR\testimgs.ini "Field 4" "Text" $PLUGINSDIR\image.bmp WriteINIStr $PLUGINSDIR\testimgs.ini "Field 5" "Text" $PLUGINSDIR\image2.bmp WriteINIStr $PLUGINSDIR\testimgs.ini "Field 6" "Text" $PLUGINSDIR\icon.ico ;No Text for Field 7 so it'll show the installer's icon FunctionEnd Function SetCustom ;Display the InstallOptions dialog InstallOptions::dialog "$PLUGINSDIR\testimgs.ini" Pop $0 FunctionEnd nsis-3.11/Contrib/InstallOptions/testlink.ini000077500000000000000000000011461477201124000213350ustar00rootroot00000000000000[Settings] NumFields=5 [Field 1] Type=Label Left=10 Right=-40 Top=10 Bottom=18 Text=This custom page demonstrates the "Link" control [Field 2] Type=Link Left=20 Right=-40 Top=40 Bottom=50 Text=* Run notepad [Field 3] Type=Link Left=20 Right=-40 Top=55 Bottom=65 State=mailto:someone@anywhere.com Text=* Send E-mail [Field 4] Type=Link Left=20 Right=-40 Top=70 Bottom=80 State=https://nsis.sourceforge.io/ Text=* Homepage https://nsis.sourceforge.io/ [Field 5] Type=Text Left=20 Right=-40 Top=85 Bottom=98 State=Just to test proper interaction with the other fields nsis-3.11/Contrib/InstallOptions/testlink.nsi000077500000000000000000000024021477201124000213430ustar00rootroot00000000000000;InstallOptions Test Script ;Written by Ramon ;This script demonstrates the power of the new control "LINK" ;that allows you to execute files, send mails, open wepsites, etc. ;-------------------------- !define TEMP1 $R0 ;Temp variable ;The name of the installer Name "InstallOptions Test Link" ;The file to write OutFile "TestLink.exe" ; Show install details ShowInstDetails show ;Things that need to be extracted on startup (keep these lines before any File command!) ;Only useful for BZIP2 compression ;Use ReserveFile for your own InstallOptions INI files too! ReserveFile /plugin InstallOptions.dll ReserveFile "testlink.ini" ;Order of pages Page custom SetCustom Page instfiles Section "Components" ;Get Install Options dialog user input SectionEnd Function .onInit ;Extract InstallOptions files ;$PLUGINSDIR will automatically be removed when the installer closes InitPluginsDir File /oname=$PLUGINSDIR\test.ini "testlink.ini" WriteIniStr $PLUGINSDIR\test.ini "Field 2" "State" "$WINDIR\Notepad.exe" FunctionEnd Function SetCustom ;Display the InstallOptions dialog Push ${TEMP1} InstallOptions::dialog "$PLUGINSDIR\test.ini" Pop ${TEMP1} Pop ${TEMP1} FunctionEnd nsis-3.11/Contrib/InstallOptions/testnotify.ini000077500000000000000000000025631477201124000217140ustar00rootroot00000000000000[Settings] NumFields=11 [Field 1] Type=Groupbox Text="This is a group box..." Left=0 Right=-1 Top=0 Bottom=-4 [Field 2] Type=Checkbox Text=Install support for X Flags=NOTIFY State=1 Left=10 Right=100 Top=17 Bottom=25 [Field 3] Type=Checkbox Text=Install support for Y State=0 Left=10 Right=100 Top=30 Bottom=38 [Field 4] Type=Checkbox Text=Install support for Z Flags=RIGHT State=0 Left=10 Right=100 Top=43 Bottom=51 [Field 5] Type=FileRequest Flags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY State=C:\dummy.xyz Filter=XYZ Files|*.xyz|All files|*.* Left=10 Right=-10 Top=56 Bottom=69 [Field 6] Type=DirRequest Text=Select a directory... State=C:\Program Files\NSIS Left=10 Right=-10 Top=74 Bottom=87 [Field 7] Type=Label Text=This is a label... Left=10 Right=-10 Top=89 Bottom=97 [Field 8] Type=Text Flags=MULTILINE|VSCROLL|WANTRETURN|NOWORDWRAP State="Multiline\r\nedit..." Left=10 Right=-10 Top=97 Bottom=118 MinLen=1 ValidateText=Please enter some text before proceeding. [Field 9] Type=Button Flags=NOTIFY Text=&Clear Left=-60 Right=-10 Top=19 Bottom=33 [Field 10] Type=Button Text=&Email State=mailto:someone@anywhere.com Left=-60 Right=-10 Top=35 Bottom=49 [Field 11] Type=DROPLIST ListItems=Show|Hide State=Show Flags=NOTIFY Left=120 Right=-80 Top=20 Bottom=56 nsis-3.11/Contrib/InstallOptions/testnotify.nsi000077500000000000000000000104321477201124000217200ustar00rootroot00000000000000; InstallOptions script demonstrating custom buttons ;---------------------------------------------------- !include WinMessages.nsh ; The name of the installer Name "InstallOptions Test" ; The file to write OutFile "TestNotify.exe" ; Show install details ShowInstDetails show ; Called before anything else as installer initialises Function .onInit ; Extract InstallOptions files ; $PLUGINSDIR will automatically be removed when the installer closes InitPluginsDir File /oname=$PLUGINSDIR\test.ini "testnotify.ini" FunctionEnd ; Our custom page Page custom ShowCustom LeaveCustom ": Testing InstallOptions" Function ShowCustom ; Initialise the dialog but don't show it yet MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Test the right-to-left version?" IDNO +2 WriteINIStr "$PLUGINSDIR\test.ini" "Settings" "RTL" "1" InstallOptions::initDialog "$PLUGINSDIR\test.ini" ; In this mode InstallOptions returns the window handle so we can use it Pop $0 ; Now show the dialog and wait for it to finish InstallOptions::show ; Finally fetch the InstallOptions status value (we don't care what it is though) Pop $0 FunctionEnd Function LeaveCustom ; At this point the user has either pressed Next or one of our custom buttons ; We find out which by reading from the INI file ReadINIStr $0 "$PLUGINSDIR\test.ini" "Settings" "State" StrCmp $0 0 validate ; Next button? StrCmp $0 2 supportx ; "Install support for X"? StrCmp $0 9 clearbtn ; "Clear" button? StrCmp $0 11 droplist ; "Show|Hide" drop-list? Abort ; Return to the page supportx: ; Make the FileRequest field depend on the first checkbox ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State" ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND" EnableWindow $1 $0 ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND2" EnableWindow $1 $0 ; Add the disabled flag too so when we return to this page it's disabled again StrCmp $0 0 0 +3 WriteINIStr "$PLUGINSDIR\test.ini" "Field 5" "Flags" "GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY|DISABLED" Goto +2 WriteINIStr "$PLUGINSDIR\test.ini" "Field 5" "Flags" "GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY" Abort ; Return to the page clearbtn: ; Clear all text fields ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND" SendMessage $1 ${WM_SETTEXT} 0 "STR:" ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND" SendMessage $1 ${WM_SETTEXT} 0 "STR:" ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 8" "HWND" SendMessage $1 ${WM_SETTEXT} 0 "STR:" Abort ; Return to the page droplist: ; Make the DirRequest field depend on the droplist ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 11" "State" StrCmp $0 "Show" +3 StrCpy $0 0 Goto +2 StrCpy $0 1 ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND" EnableWindow $1 $0 ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND2" EnableWindow $1 $0 ; Add the disabled flag too so when we return to this page it's disabled again StrCmp $0 0 0 +3 WriteINIStr "$PLUGINSDIR\test.ini" "Field 6" "Flags" "DISABLED" Goto +2 WriteINIStr "$PLUGINSDIR\test.ini" "Field 6" "Flags" "" Abort ; Return to the page validate: ; At this point we know the Next button was pressed, so perform any validation ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State" StrCmp $0 1 done ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 3" "State" StrCmp $0 1 done ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 4" "State" StrCmp $0 1 done MessageBox MB_ICONEXCLAMATION|MB_OK "You must select at least one install option!" Abort done: FunctionEnd ; Installation page Page instfiles Section ;Get Install Options dialog user input ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State" DetailPrint "Install X=$0" ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 3" "State" DetailPrint "Install Y=$0" ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 4" "State" DetailPrint "Install Z=$0" ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 5" "State" DetailPrint "File=$0" ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 6" "State" DetailPrint "Dir=$0" ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 8" "State" DetailPrint "Info=$0" SectionEnd nsis-3.11/Contrib/LangDLL/000077500000000000000000000000001477201124000152255ustar00rootroot00000000000000nsis-3.11/Contrib/LangDLL/LangDLL.c000077500000000000000000000164711477201124000166220ustar00rootroot00000000000000#include #include "resource.h" #include // JF> updated usage // call like this: // LangDLL:LangDialog "Window Title" "Window subtext" [C][F] language_text language_id [codepage] ... [font_size font_face] // ex: // LangDLL:LangDialog "Language Selection" "Choose a language" "2" French 1036 English 1033 // or (the F after the 2 means we're supplying font information) // LangDLL:LangDialog "Language Selection" "Choose a language" "2F" French 1036 English 1033 12 Garamond // // Unicode support added by Jim Park -- 07/27/2007 #include // nsis plugin #define NSIS_DECLSPEC_DLLEXPORT __declspec(dllexport) // BUGBUG: Compiler specific HINSTANCE g_hInstance; HWND g_hwndParent; TCHAR temp[1024]; TCHAR g_wndtitle[1024], g_wndtext[1024]; int dofont; int docp; int langs_num; int visible_langs_num; struct lang { TCHAR *name; TCHAR *id; UINT cp; } *langs; #ifndef UNICODE static UINT AllowLang(struct lang*pL) { UINT acp = GetACP(), lcp = pL->cp, allow = lcp == acp; /* ** Workaround for bug #1185: ** English and German can be displayed in cp1250 */ if (acp == 1250 && lcp == 1252) { const UINT lid = myatou(pL->id); if (lid == 1033 // English || lid == 1031 // German ) ++allow; } return allow; } #endif INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR i; int size; TCHAR *selected_language = NULL; static HFONT font; switch (uMsg) { case WM_INITDIALOG: // add languages for (i = visible_langs_num - 1; i >= 0; i--) { INT_PTR cbi; cbi = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_ADDSTRING, 0, (LPARAM) langs[i].name); SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_SETITEMDATA, cbi, (LPARAM) langs[i].id); // remember selected language if (!lstrcmp(langs[i].id, getuservariable(INST_LANG))) { selected_language = langs[i].name; } } // select the current language if (selected_language) SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) selected_language); else SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_SETCURSEL, 0, 0); // set texts SetDlgItemText(hwndDlg, IDC_TEXT, g_wndtext); SetWindowText(hwndDlg, g_wndtitle); SendDlgItemMessage(hwndDlg, IDC_APPICON, STM_SETICON, (LPARAM)LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(103)), 0); // set font if (dofont && !popstring(temp)) { size = myatou(temp); if (!popstring(temp)) { LOGFONT f = {0,}; if (lstrcmp(temp, _T("MS Shell Dlg"))) { f.lfHeight = -MulDiv(size, GetDeviceCaps(GetDC(hwndDlg), LOGPIXELSY), 72); lstrcpy(f.lfFaceName, temp); font = CreateFontIndirect(&f); SendMessage(hwndDlg, WM_SETFONT, (WPARAM)font, 1); SendDlgItemMessage(hwndDlg, IDOK, WM_SETFONT, (WPARAM)font, 1); SendDlgItemMessage(hwndDlg, IDCANCEL, WM_SETFONT, (WPARAM)font, 1); SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, WM_SETFONT, (WPARAM)font, 1); SendDlgItemMessage(hwndDlg, IDC_TEXT, WM_SETFONT, (WPARAM)font, 1); } } } // show window ShowWindow(hwndDlg, SW_SHOW); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: // push result on the stack i = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_GETCURSEL, 0, 0); i = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_GETITEMDATA, i, 0); if (i != CB_ERR && i) { pushstring((TCHAR *) i); } else { // ?! pushstring(_T("cancel")); } // end dialog EndDialog(hwndDlg, 0); break; case IDCANCEL: // push "cancel" on the stack pushstring(_T("cancel")); // end dialog EndDialog(hwndDlg, 0); break; } break; case WM_DESTROY: // clean up if (font) DeleteObject(font); break; default: return FALSE; // message not processed } return TRUE; // message processed } void NSIS_DECLSPEC_DLLEXPORT LangDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent=hwndParent; EXDLL_INIT(); { int i; int doauto = 0; BOOL pop_empty_string = FALSE; // get texts if (popstring(g_wndtitle)) return; if (popstring(g_wndtext)) return; // get flags if (popstring(temp)) return; // parse flags { TCHAR *p=temp; while (*p) { if (*p == _T('A')) doauto=1; // parse auto count flag if (*p == _T('F')) dofont=1; // parse font flag if (*p == _T('C')) docp=1; // parse codepage flag p++; } } if (doauto) { // automatic language count stack_t *th; langs_num=0; th=(*g_stacktop); while (th && th->text[0]) { langs_num++; th = th->next; } if (!th) return; if (docp) langs_num /= 3; else langs_num /= 2; pop_empty_string = TRUE; } else { // use counts languages langs_num = myatou(temp); } // zero languages? if (!langs_num) return; // initialize visible languages count visible_langs_num = 0; // allocate language struct langs = (struct lang *)GlobalAlloc(GPTR, langs_num*sizeof(struct lang)); if (!langs) return; // fill language struct for (i = 0; i < langs_num; i++) { if (popstring(temp)) { visible_langs_num = 0; break; } langs[visible_langs_num].name = (TCHAR*) GlobalAlloc(GPTR, (lstrlen(temp)+1)*sizeof(TCHAR)); if (!langs[visible_langs_num].name) { visible_langs_num = 0; break; } lstrcpy(langs[visible_langs_num].name, temp); if (popstring(temp)) { visible_langs_num = 0; break; } langs[visible_langs_num].id = (TCHAR*) GlobalAlloc(GPTR, (lstrlen(temp)+1)*sizeof(TCHAR)); if (!langs[visible_langs_num].id) { visible_langs_num = 0; break; } lstrcpy(langs[visible_langs_num].id, temp); if (docp) { if (popstring(temp)) { visible_langs_num = 0; break; } langs[visible_langs_num].cp = myatou(temp); } // If Unicode, show everything. #ifdef UNICODE visible_langs_num++; #else if (!docp || AllowLang(&langs[visible_langs_num]) || langs[visible_langs_num].cp == 0) { visible_langs_num++; } else { GlobalFree(langs[visible_langs_num].name); GlobalFree(langs[visible_langs_num].id); } #endif } // pop the empty string to keep the stack clean if (pop_empty_string) { if (popstring(temp)) { visible_langs_num = 0; } } // start dialog if (visible_langs_num > 1) { DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0, DialogProc); } else if (visible_langs_num == 0) { pushstring(_T("")); } else { pushstring(langs[0].id); } // free structs for (i = 0; i < visible_langs_num; i++) { if (langs[i].name) GlobalFree(langs[i].name); if (langs[i].id) GlobalFree(langs[i].id); } GlobalFree(langs); } } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; return TRUE; } nsis-3.11/Contrib/LangDLL/SConscript000077500000000000000000000003311477201124000172370ustar00rootroot00000000000000target = 'LangDLL' files = Split(""" LangDLL.c """) resources = Split(""" resource.rc """) libs = Split(""" kernel32 user32 gdi32 """) Import('BuildPlugin') BuildPlugin(target, files, libs, res = resources) nsis-3.11/Contrib/LangDLL/resource.h000077500000000000000000000011001477201124000172200ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by resource.rc // #define IDD_DIALOG 101 #define IDC_LANGUAGE 1002 #define IDC_TEXT 1007 #define IDC_APPICON 1008 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1010 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/LangDLL/resource.rc000077500000000000000000000051611477201124000174100ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_DIALOG DIALOGEX DISCARDABLE 0, 0, 192, 79 STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 8, "MS Shell Dlg" BEGIN COMBOBOX IDC_LANGUAGE,45,39,140,100,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "OK",IDOK,75,59,50,14 PUSHBUTTON "Cancel",IDCANCEL,135,59,50,14 LTEXT "",IDC_TEXT,45,10,140,27 ICON "",IDC_APPICON,10,10,20,20 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 185 TOPMARGIN, 7 BOTTOMMARGIN, 72 END END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Unknown language: 0xD, 0x1 resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HEB) #ifdef _WIN32 LANGUAGE 0xD, 0x1 #pragma code_page(1255) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Unknown language: 0xD, 0x1 resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/Language files/000077500000000000000000000000001477201124000166165ustar00rootroot00000000000000nsis-3.11/Contrib/Language files/Afrikaans.nlf000077500000000000000000000114141477201124000212220ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1078 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Friedel Wolff # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Installasie # ^UninstallCaption $(^Name) Verwydering # ^LicenseSubCaption : Lisensie-ooreenkoms # ^ComponentsSubCaption : Installasiekeuses # ^DirSubCaption : Installasiegids # ^InstallingSubCaption : Installeer tans # ^CompletedSubCaption : Voltooid # ^UnComponentsSubCaption : Verwyderingkeuses # ^UnDirSubCaption : Verwyderinggids # ^ConfirmSubCaption : Bevestiging # ^UninstallingSubCaption : Verwyder tans # ^UnCompletedSubCaption : Voltooid # ^BackBtn < V&orige # ^NextBtn &Volgende > # ^AgreeBtn &Regso # ^AcceptBtn Ek &aanvaar die ooreenkoms # ^DontAcceptBtn Ek aan vaar &nie die ooreenkoms nie # ^InstallBtn &Installeer # ^UninstallBtn &Verwyder # ^CancelBtn Kanselleer # ^CloseBtn &Sluit af # ^BrowseBtn &Blaai... # ^ShowDetailsBtn &Wys detail # ^ClickNext Klik op Volgende om verder te gaan. # ^ClickInstall Klik op Installeer om die installasie te begin. # ^ClickUninstall Klik op Verwyder om die verwydering te begin. # ^Name Naam # ^Completed Voltooid # ^LicenseText Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Klik op Regso as u die ooreenkoms aanvaar. # ^LicenseTextCB Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK # ^LicenseTextRB Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK # ^UnLicenseText Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Klik op Regso als u die ooreenkoms aanvaar. # ^UnLicenseTextCB Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK # ^UnLicenseTextRB Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. KIes die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK # ^Custom Aangepast # ^ComponentsText Kies die komponente wat u wil installeer en deselekteer dié wat u nie wil installeer nie. $_CLICK # ^ComponentsSubText1 Kies die installasietipe: # ^ComponentsSubText2_NoInstTypes Kies die komponente wat geïnstalleer moet word: # ^ComponentsSubText2 Of kies die komponente wat geïnstalleer moet word: # ^UnComponentsText Kies die komponente wat u wil verwyder en deselekteer dié wat u nie wil verwyder nie. $_CLICK # ^UnComponentsSubText1 Kies die verwyderingstipe: # ^UnComponentsSubText2_NoInstTypes Kies die komponente wat verwyder moet word: # ^UnComponentsSubText2 Of kies die komponente wat verwyder moet word: # ^DirText $(^NameDA) sal in die volgende gids geïnstalleer word. Om elders te installeer, klik op Blaai en kies 'n ander een. $_CLICK # ^DirSubText Installasiegids # ^DirBrowseText Kies die gids om $(^NameDA) in te installeer: # ^UnDirText $(^NameDA) gaan uit die volgende gids verwyder word. Om van elders af te verwyder, klik op Blaai en kies 'n ander gids. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Kies die gids om $(^NameDA) uit te verwyder: # ^SpaceAvailable "Beskikbare spasie: " # ^SpaceRequired "Vereiste spasie: " # ^UninstallingText $(^NameDA) sal uit die volgende gids verwyder word. $_CLICK # ^UninstallingSubText Verwydering uit: # ^FileError Fout met skryf na lêer: \r\n\r\n$0\r\n\r\nKlik Staak om de installasie te stop,\r\nProbeer weer om weer te probeer of\r\nIgnoreer om dié lêer oor te slaan. # ^FileError_NoIgnore Fout met skryf na lêer: \r\n\r\n$0\r\n\r\nKlik Probeer weer om op nuut te probeer, of \r\nKanselleer om die installasie te stop. # ^CantWrite "Kon nie skyf nie: " # ^CopyFailed Kopiëring het misluk # ^CopyTo "Kopieer na " # ^Registering "Registreer tans: " # ^Unregistering "Deregistreer tans: " # ^SymbolNotFound "Kon nie simbool vind nie: " # ^CouldNotLoad "Kon nie laai nie: " # ^CreateFolder "Skep gids: " # ^CreateShortcut "Maak kortpad: " # ^CreatedUninstaller "Verwyderingsprogram gemaak: " # ^Delete "Verwyder lêer: " # ^DeleteOnReboot "Verwyder na herbegin van rekenaar: " # ^ErrorCreatingShortcut "Fout met maak van kortpad: " # ^ErrorCreating "Fout met skep: " # ^ErrorDecompressing Fout met uitpak van data! Korrupte installasielêer? # ^ErrorRegistering Fout met registrasie van DLL # ^ExecShell "ExecShell: " # ^Exec "Voer uit: " # ^Extract "Pak uit: " # ^ErrorWriting "Uitpak: fout met skryf na lêer " # ^InvalidOpcode Installasieprogram korrup: ongeldige opcode # ^NoOLE "Geen OLE vir: " # ^OutputFolder "Afvoergids: " # ^RemoveFolder "Verwyder gids: " # ^RenameOnReboot "Hernoem na herbegin van rekenaar: " # ^Rename "Hernoem: " # ^Skipped "Oorgeslaan: " # ^CopyDetails Kopieer detail na knipbord # ^LogInstall Boekstaaf die installasieproses # ^Byte G # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Afrikaans.nsh000077500000000000000000000157331477201124000212430ustar00rootroot00000000000000;Language: Afrikaans (1078) ;By Friedel Wolff !insertmacro LANGFILE "Afrikaans" = "Afrikaans" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom by die $(^NameDA) Installasieslimmerd" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Hierdie slimmerd lei mens deur die installasie van $(^NameDA).$\r$\n$\r$\nDit word aanbeveel dat u alle ander programme afsluit voor die begin van die installasie. Dit maak dit moontlik om die relevante stelsellêers op te dateer sonder om die rekenaar te herlaai.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom by die $(^NameDA) Verwyderingslimmerd" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Hierdie slimmerd lei mens deur die verwydering van $(^NameDA).$\r$\n$\r$\nVoor die verwydering begin word, maak seker dat $(^NameDA) nie loop nie.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensie-ooreenkoms" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lees die lisensie-ooreenkoms voordat u $(^NameDA) installeer." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Merk die blokkie hier onder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensie-ooreenkoms" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lees die lisensie-ooreenkoms voordat u $(^NameDA) verwyder." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Merk die kiesblokkie hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder." !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Druk op Page Down om die res van die ooreenkoms te sien." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Kies komponente" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies watter komponente van $(^NameDA) geïnstalleer moet word." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Kies komponente" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies watter komponente van $(^NameDA) verwyder moet word." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrywing" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg die muis oor 'n komponent om sy beskrywing te sien." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Kies 'n komponent om sy beskrywing te sien." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Kies installasieplek" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies die gids waarin u $(^NameDA) wil installeer." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kies verwyderinggids" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies die gids waaruit u $(^NameDA) wil verwyder." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installeer tans" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Wag asb. terwyl $(^NameDA) geïnstalleer word." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installasie voltooid" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Die installasie is suksesvol voltooi." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installasie gestaak" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Die installasie is nie suksesvol voltooi nie." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Verwyder tans" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Wag asb. terwyl $(^NameDA) van u rekenaar verwyder word." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Verwydering voltooi" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Verwydering is suksesvol voltooi." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Verwydering gestaak" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Verwydering is nie suksesvol voltooi nie." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooi van die $(^NameDA) Installasieslimmerd" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geïnstalleer op uw rekenaar.$\r$\n$\r$\nKlik op Voltooi om hierdie slimmerd af te sluit." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Die rekenaar moet oorbegin word om die installasie van $(^NameDA) te voltooi. Wil u nou oorbegin?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooi van die $(^NameDA) Verwyderingslimmerd" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is van u rekenaar verwyder.$\r$\n$\r$\nKlik op Voltooi om hierdie slimmerd af te sluit." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Die rekenaar moet oorbegin word om die verwydering van $(^NameDA) te voltooi. Wil u nou oorbegin?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Begin nou oor" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ek wil later self oorbegin" ${LangFileString} MUI_TEXT_FINISH_RUN "&Laat loop $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Wys Leesmy-lêer" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Voltooi" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Kies gids in Begin-kieslys" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies 'n gids in die Begin-kieslys vir $(^NameDA) se kortpaaie." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies die gids in die Begin-kieslys waarin die program se kortpaaie geskep moet word. U kan ook 'n nuwe naam gee om 'n nuwe gids te skep." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Moenie kortpaaie maak nie" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Verwyder $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Verwyder $(^NameDA) van u rekenaar." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Wil u definitief die installasie van $(^Name) afsluit?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Wil u definitief die verwydering van $(^Name) afsluit?" !endif nsis-3.11/Contrib/Language files/Albanian.nlf000077500000000000000000000126411477201124000210330ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1052 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Përkthimi nga Besnik Bleta, besnik@programeshqip.org # ^Branding Nullsoft Install System %s # ^SetupCaption Rregullimi i $(^Name) # ^UninstallCaption Çinstalimi i $(^Name) # ^LicenseSubCaption : Marrëveshje Licence # ^ComponentsSubCaption : Mundësi Instalimi # ^DirSubCaption : Dosje Instalimi # ^InstallingSubCaption : Po instalohet # ^CompletedSubCaption : U plotësua # ^UnComponentsSubCaption : Mundësi Çinstalimi # ^UnDirSubCaption : Dosje Çinstalimi # ^ConfirmSubCaption : Ripohim # ^UninstallingSubCaption : Po çinstalohet # ^UnCompletedSubCaption : U plotësua # ^BackBtn < &Mbrapsht # ^NextBtn &Pasuesi > # ^AgreeBtn &Pajtohem # ^AcceptBtn &I pranoj kushtet e Marrëveshjes së Licencës # ^DontAcceptBtn &Nuk i pranoj kushtet e Marrëveshjes së Licencës # ^InstallBtn &Instaloje # ^UninstallBtn &Çinstaloje # ^CancelBtn Anuloje # ^CloseBtn &Mbylle # ^BrowseBtn Sh&fletoni… # ^ShowDetailsBtn Shfaq &hollësi # ^ClickNext Që të vazhdohet, klikoni Pasuesi. # ^ClickInstall Që të fillojë instalimi, klikoni Instaloje. # ^ClickUninstall Që të fillojë çinstalimi, klikoni Çinstaloje. # ^Name Emër # ^Completed U plotësua # ^LicenseText Ju lutemi, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni Pajtohem. # ^LicenseTextCB Ju lutemi, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni kutizën më poshtë. $_CLICK # ^LicenseTextRB Ju lutemi, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. $_CLICK # ^UnLicenseText Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni Pajtohem. # ^UnLicenseTextCB Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni kutizën më poshtë. $_CLICK # ^UnLicenseTextRB Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. $_CLICK # ^Custom Vetjake # ^ComponentsText U vini shenjë përbërësve që doni të instalohen dhe hiquani shenjën përbërësve që s’doni të instalohen. $_CLICK # ^ComponentsSubText1 Përzgjidhni llojin e instalimit: # ^ComponentsSubText2_NoInstTypes Përzgjidhni përbërësit për instalim: # ^ComponentsSubText2 Ose, përzgjidhni përbërësit e mundshëm që doni të instalohen: # ^UnComponentsText U vini shenjë përbërësve që doni të çinstalohen dhe hiquni shenjën përbërësve që s’doni të çinstalohen. $_CLICK # ^UnComponentsSubText1 Përzgjidhni llojin e çinstalimit: # ^UnComponentsSubText2_NoInstTypes Përzgjidhni përbërësit për çinstalim: # ^UnComponentsSubText2 Ose, përzgjidhni përbërësit e mundshëm që doni të çinstalohen: # ^DirText Rregullimi do ta instalojë $(^NameDA) në dosjen vijuese. Për instalim në një dosje tjetër, klikoni Shfletoni dhe përzgjidhni një tjetër dosje. $_CLICK # ^DirSubText Dosje Vendmbërritje # ^DirBrowseText Përzgjidhni dosjen ku të instalohet $(^NameDA): # ^UnDirText Rregullimi do të çinstalojë $(^NameDA) prej dosjes vijuese. Për çinstalim prej një dosjeje tjetër, klikoni Shfletoni dhe përzgjidhni një tjetër dosje. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Përzgjidhni dosjen prej nga ku të çinstalohet $(^NameDA): # ^SpaceAvailable "Hapësirë e mundshme: " # ^SpaceRequired "Hapësirë e nevojshme: " # ^UninstallingText $(^NameDA) do të çinstalohet prej dosjes vijuese. $_CLICK # ^UninstallingSubText Po çinstalohet prej: # ^FileError Gabim në hapje kartele për shkrim: \r\n\r\n$0\r\n\r\nKlikoni Ndërprite për të ndalur instalimin,\r\nRiprovo për të provuar sërish, ose\r\nShpërfille për të anashkaluar këtë kartelë. # ^FileError_NoIgnore Gabim në hapje kartele për shkrim: \r\n\r\n$0\r\n\r\nKlikoni Riprovo për të provuar sërish, ose\r\nAnuloje për të ndalur instalimin. # ^CantWrite "S’shkruhet dot: " # ^CopyFailed Kopjimi dështoi # ^CopyTo "Kopjoje tek " # ^Registering "Regjistrim: " # ^Unregistering "Çregjistrim: " # ^SymbolNotFound "S’u gjet dot simbol: " # ^CouldNotLoad "S’u ngarkua dot: " # ^CreateFolder "Krijo dosje: " # ^CreateShortcut "Krijo shkurtore: " # ^CreatedUninstaller "Krijo çinstalues: " # ^Delete "Fshi kartelë: " # ^DeleteOnReboot "Fshi gjatë rinisjes: " # ^ErrorCreatingShortcut "Gabim në krijim shkurtoresh: " # ^ErrorCreating "Gabim në krijimin e: " # ^ErrorDecompressing Gabim në çngjeshje të dhënash! Instalues i dëmtuar? # ^ErrorRegistering Gabim në regjistrim DLL-je # ^ExecShell "ExecShell: " # ^Exec "Ekzekuto: " # ^Extract "Përfto: " # ^ErrorWriting "Përftim: gabim në shkrim te kartela " # ^InvalidOpcode Instalues i dëmtuar: opcode i pavlefshëm # ^NoOLE "Pa OLE për: " # ^OutputFolder "Dosje përfundimesh: " # ^RemoveFolder "Hiq dosjen: " # ^RenameOnReboot "Riemërtoje gjatë rinisjes: " # ^Rename "Riemërtoje: " # ^Skipped "U anashkalua: " # ^CopyDetails Kopjo Hollësira Te E Papastra # ^LogInstall Regjistroje procesin e instalimit # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Albanian.nsh000077500000000000000000000176011477201124000210450ustar00rootroot00000000000000;Language: Albanian (1052) ;Translation Besnik Bleta, besnik@programeshqip.org !insertmacro LANGFILE "Albanian" = "Shqip" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Mirë se vini te Rregullimi i $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ky do t’ju udhëheqë gjatë instalimit të $(^NameDA).$\r$\n$\r$\nKëshillohet që të mbyllni tërë aplikacionet e tjera, para se të nisni Rregullimin. Kjo bën të mundur përditësimin e kartelave të rëndësishme të sistemit pa u dashur të riniset kompjuteri juaj.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Mirë se vini te Çinstalimi i $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ky do t’ju udhëheqë gjatë çinstalimit të $(^NameDA).$\r$\n$\r$\nPara nisjes së çinstalimit, sigurohuni se $(^NameDA) s’është duke xhiruar.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Marrëveshje Licence" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ju lutemi, para se të instaloni $(^NameDA), shqyrtoni kushtet e licencës." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Nëse i pranoni kushtet e marrëveshjes, klikoni Pajtohem, që të vazhdohet. Që të instalohet $(^NameDA), duhet të pranoni marrëveshjen." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nëse pranoni kushtet e marrëveshjes, klikoni kutizën më poshtë. Që të instalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nëse pranoni kushtet e marrëveshjes, përzgjidhni më poshtë mundësinë e parë. Që të instalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Marrëveshje Licence" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni kushtet e licencës." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Nëse i pranoni kushtet e marrëveshjes, klikoni Pajtohem, që të vazhdohet. Që të çinstalohet $(^NameDA), duhet të pranoni marrëveshjen." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nëse pranoni kushtet e marrëveshjes, klikoni kutizën më poshtë. Që të çinstalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nëse pranoni kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. Që të çinstalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Për të parë pjesën e mbetur të marrëveshjes, shtypni tastin Page Down." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Përzgjidhni Përbërës" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zgjidhni cilat anë të $(^NameDA) doni të instalohen." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Zgjidhni Përbërës" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zgjidhni cilat anë të $(^NameDA) doni të çinstalohen." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Përshkrim" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Për të parë përshkrimin e një përbërësi, vendosni kursorin përsipër tij." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zgjidhni Vend Instalimi" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Zgjidhni dosjen tek e cila të instalohet $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Zgjidhni Vend Çinstalimi" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Zgjidhni dosjen prej së cilës të çinstalohet $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Po instalohet" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ju lutemi, prisni, ndërkohë që $(^NameDA) instalohet." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalim i Plotësuar" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Rregullimi u plotësua me sukses." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalimi u Ndërpre" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Rregullimi s’u plotësua me sukses." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Çinstalim" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ju lutemi, prisni, ndërsa $(^NameDA) çinstalohet." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Çinstalim i Plotë" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Çinstalimi u plotësua me sukses." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Çinstalimi u Ndërpre" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Çinstalimi s’u plotësua me sukses." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Po plotësohet Rregullimi i $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) u instalua në kompjuterin tuaj.$\r$\n$\r$\nPër mbylljen e procesit, klikoni Përfundoje." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Që të mund të plotësohet instalimi i $(^NameDA), kompjuteri juaj duhet të riniset. Doni të riniset tani?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Po plotësohet Çinstalimi i $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) u çinstalua prej kompjuterit tuaj.$\r$\n$\r$\nPër mbylljen e procesit, klikoni Përfundoje." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Kompjuteri juaj duhet të riniset, që të mund të plotësohet çinstalimi i $(^NameDA). Doni të riniset tani?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Rinise tani" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Dua ta rinis dorazi më vonë" ${LangFileString} MUI_TEXT_FINISH_RUN "&Nis $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Shfaq Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Përfundoje" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Zgjidhni Dosje Menuje Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Zgjidhni një dosje Menuje Start për shkurtore $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Përzgjidhni dosjen e Menusë Start në të cilën do të donit të krijohen shkurtoret për programin. Mundeni edhe të jepni një emër për të krijuar një dosje të re." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Mos krijo shkurtore" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Çinstalo $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Hiqeni $(^NameDA) prej kompjuterit tuaj." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Jeni i sigurt se doni të dilet nga Rregullimi i $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeni i sigurt se doni të dilet nga Çinstalimi i $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Zgjidhni Përdorues" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Zgjidhni për cilët përdorues doni të instalohet $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Përzgjidhni nëse doni të instalohet $(^NameDA) vetëm për veten tuaj apo për tërë përdoruesit e këtij kompjuteri. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instaloje për këdo në këtë kompjuter" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instaloje vetëm për mua" !endif nsis-3.11/Contrib/Language files/Arabic.nlf000077500000000000000000000142221477201124000205040ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1025 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1256 # RTL - anything else than RTL means LTR RTL # Translation by asdfuae@msn.com, updated by Rami Kattan # ^Branding Nullsoft Install System %s # ^SetupCaption تنصيب $(^Name) # ^UninstallCaption إزالة $(^Name) # ^LicenseSubCaption Ø¥ØªÙØ§Ù‚ية†الترخيص : # ^ComponentsSubCaption خيارات التنصيب : # ^DirSubCaption مجلد التنصيب : # ^InstallingSubCaption تنصيب : # ^CompletedSubCaption إنتهى : # ^UnComponentsSubCaption خيارات الإزالة : # ^UnDirSubCaption مجلد الإزالة : # ^ConfirmSubCaption تأكيد : # ^UninstallingSubCaption إزالة : # ^UnCompletedSubCaption إنتهى : # ^BackBtn < ال&سابق # ^NextBtn ال&تالي > # ^AgreeBtn مواÙÙ‚& # ^AcceptBtn &أواÙÙ‚ على شروط Ø§ØªÙØ§Ù‚ية الترخيص # ^DontAcceptBtn &لا أواÙÙ‚ على شروط Ø§ØªÙØ§Ù‚ية الترخيص # ^InstallBtn &تنصيب # ^UninstallBtn &إزالة # ^CancelBtn إلغاء # ^CloseBtn Ø¥&غلاق # ^BrowseBtn &عرض... # ^ShowDetailsBtn Ø¥&ظهار Ø§Ù„ØªÙØ§ØµÙŠÙ„ # ^ClickNext إضغط على التالي للمتابعة. # ^ClickInstall إضغط على تنصيب لتشغيل التنصيب. # ^ClickUninstall إضغط على إزالة لتشغيل الإزالة. # ^Name الإسم # ^Completed إنتهى # ^LicenseText الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية الترخيص قبل تنصيب $(^NameDA). عند المواÙقة على جميع شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إضغط مواÙÙ‚. # ^LicenseTextCB الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية الترخيص قبل تنصيب $(^NameDA). عند المواÙقة على جميع شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إضغط على مربع المؤشر التالي. $_CLICK. # ^LicenseTextRB الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية الترخيص قبل تنصيب $(^NameDA). عند المواÙقة على جميع شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إختر الخيار الأول التالي. $_CLICK # ^UnLicenseText الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية الترخيص قبل إزالة $(^NameDA). عند المواÙقة على جميع شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إضغط مواÙÙ‚. # ^UnLicenseTextCB الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية الترخيص قبل إزالة $(^NameDA). عند المواÙقة على جميع شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، اضغط على مربع المؤشر التالي. $_CLICK # ^UnLicenseTextRB الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية الترخيص قبل إزالة $(^NameDA). عند المواÙقة على جميع شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إختر الخيار الأول التالي. $_CLICK # ^Custom إختياري # ^ComponentsText علّم المكونات المراد تنصيبها وإزل العلامة عن المكونات الغير مراد تنصيبها. $_CLICK # ^ComponentsSubText1 إختر نوع التنصيب: # ^ComponentsSubText2_NoInstTypes إختر المكونات للتنصيب: # ^ComponentsSubText2 أو، قم بإختيار المكونات الإختيارية المراد تنصيبها: # ^UnComponentsText علّم المكونات المراد إزالتها وأزل العلامة عن المكونات الغير مراد إزالتها. $_CLICK # ^UnComponentsSubText1 إختر نوع الإزالة: # ^UnComponentsSubText2_NoInstTypes إختر المكونات للإزالة: # ^UnComponentsSubText2 أو، إختر المكونات الإختيارية المراد إزالتها: # ^DirText سيتم تنصيب $(^NameDA) ÙÙŠ المجلد التالي. للتنصيب ÙÙŠ مجلد آخر، إضغط عرض وإختر مجلد آخر. $_CLICK # ^DirSubText مجلد الهد٠# ^DirBrowseText إختر المجلد لتنصيب $(^NameDA) Ùيه: # ^UnDirText سيتم إزالة $(^NameDA) من المجلد التالي. للإزالة من مجلد آخر، إضغط عرض وأختر مجلد آخر. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText إختر المجلد لإزالة $(^NameDA) منه: # ^SpaceAvailable "المساحة Ø§Ù„Ù…ØªÙˆÙØ±Ø©: " # ^SpaceRequired "المساحة المطلوبة: " # ^UninstallingText سيتم إزالة $(^NameDA) من المجلد التالي. $_CLICK # ^UninstallingSubText إزالة من: # ^FileError حدث خلل أثناء ÙØªØ­ مل٠للكتابة: \r\n\t\"$0\"\r\nإضغط إلغاء لإلغاء التنصيب،\r\nمحاولة لإعادة محاولة كتابة Ø§Ù„Ù…Ù„ÙØŒ\r\n تجاهل لتخطي المل٠# ^FileError_NoIgnore حدث خلل أثناء ÙØªØ­ مل٠للكتابة: \r\n\t\"$0\"\r\nإضغط محاولة لإعادة محاولة كتابة Ø§Ù„Ù…Ù„ÙØŒ أو\r\nإلغاء لإلغاء التنصيب # ^CantWrite "لا يستطيع الكتابة: " # ^CopyFailed ÙØ´Ù„ النسخ # ^CopyTo "نسخ إلى" # ^Registering "تسجيل: " # ^Unregistering "إلغاء تسجيل: " # ^SymbolNotFound "لم يتمكن من إيجاد الرمز :" # ^CouldNotLoad "لم يتمكن من تحميل :" # ^CreateFolder "إنشاء مجلد" # ^CreateShortcut "إنشاء إختصار: " # ^CreatedUninstaller "إنشاء مزيل: " # ^Delete "حذ٠ملÙ: " # ^DeleteOnReboot "حذ٠بعد إعادة التشغيل: " # ^ErrorCreatingShortcut "خلل أثناء إنشاء إختصار: " # ^ErrorCreating "خلل أثناء إنشاء :" # ^ErrorDecompressing خلل أثناء ÙØªØ­ البيانات المضغوطة! منصب ØªØ§Ù„ÙØŸ # ^ErrorRegistering خلل أثناء تسجيل DLL # ^ExecShell "تنÙيذ ExecShell:" # ^Exec "تنÙيذ: " # ^Extract "إستخراج: " # ^ErrorWriting "إستخراج: خلل أثناء الكتابة إلى مل٠" # ^InvalidOpcode المنصّب تالÙ: Ø´ÙØ±Ø© غير صالحة # ^NoOLE "لا توجد OLE لـÙ: " # ^OutputFolder "مجلد الإخراج: " # ^RemoveFolder "إزالة مجلد: " # ^RenameOnReboot "إعادة تسمية بعد إعادة التشغيل: " # ^Rename "إعادة تسمية: " # ^Skipped "تخطى: " # ^CopyDetails نسخ Ø§Ù„ØªÙØ§ØµÙŠÙ„ إلى الذاكرة # ^LogInstall سجّل عملية التنصيب # ^Byte بايت # ^Kilo كيلو # ^Mega ميغا # ^Giga جيغا nsis-3.11/Contrib/Language files/Arabic.nsh000077500000000000000000000207721477201124000205240ustar00rootroot00000000000000;Language: Arabic (1025) ;Translation by asdfuae@msn.com ;updated by Rami Kattan !insertmacro LANGFILE "Arabic" = "العربية" "Al-Arabiyyah" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "مرحبا بك ÙÙŠ مرشد إعداد $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "سيساعدك هذا المرشد ÙÙŠ تنصيب $(^NameDA).$\r$\n$\r$\nمن Ø§Ù„Ù…ÙØ¶Ù„ إغلاق جميع البرامج قبل التنصيب. سيساعد هذا ÙÙŠ تجديد Ù…Ù„ÙØ§Øª النظام دون الحاجة لإعادة تشغيل الجهاز.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "مرحبا بك ÙÙŠ مرشد إزالة $(^NameDA) " ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "هذا المرشد سيدلّك أثناء إزالة $(^NameDA).$\r$\n$\r$\n قبل البدء بالإزالة، يرجى التأكد من أن $(^NameDA) غير شغّال.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ø¥ØªÙØ§Ù‚ية†الترخيص" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "الرجاء مراجعة Ø¥ØªÙØ§Ù‚ية†الترخيص قبل تنصيب $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "عند المواÙقة على شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ÙŠØ©â€ØŒ إضغط أواÙÙ‚ للمتابعة. يجب المواÙقة على Ø§Ù„Ø¥ØªÙØ§Ù‚ية†لتنصيب $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "عند المواÙقة على شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ÙŠØ©â€ØŒ علّم مربع العلامة التالي. يجب المواÙقة على Ø§Ù„Ø¥ØªÙØ§Ù‚ية†لتنصيب $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "عند المواÙقة على شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إختر الخيار الأول من التالي. يجب المواÙقة على Ø§Ù„Ø¥ØªÙØ§Ù‚ية لتنصيب $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ø¥ØªÙØ§Ù‚ية الترخيص" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "الرجاء مراجعة شروط الترخيص قبل إزالة $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "عند المواÙقة على شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إضغط على مواÙÙ‚. يجب المواÙقة على Ø§Ù„Ø¥ØªÙØ§Ù‚ية لإزالة $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "عند المواÙقة على شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، علّم المربع العلامة التالي. يجب المواÙقة على Ø§Ù„Ø¥ØªÙØ§Ù‚ية لإزالة $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "عند المواÙقة على شروط Ø§Ù„Ø¥ØªÙØ§Ù‚ية، إختر الخيار الأول من التالي. يجب المواÙقة على Ø§Ù„Ø¥ØªÙØ§Ù‚ية لإزالة $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "إضعط Ù…ÙØªØ§Ø­ ØµÙØ­Ø© للأسÙÙ„ لرؤية باقي Ø§Ù„Ø¥ØªÙØ§Ù‚ية" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "إختر المكونات" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "إختر ميزات $(^NameDA) المراد تنصيبها." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "إختر المكونات" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "إختر ميزات $(^NameDA) المراد إزالتها." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "الوصÙ" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "أشر Ø¨Ø§Ù„ÙØ£Ø±Ø© Ùوق أحد المكونات لرؤية الوصÙ" !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "إختر موقع التنصيب" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "إختر المجلد المراد تنصيب $(^NameDA) Ùيه." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "إختر موقع المزيل" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "إختر المجلد الذي سيزال منه $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "تنصيب" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "الرجاء الإنتظار أثناء تنصيب $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "إنتهى التنصيب" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "إنتهت عملية التنصيب بنجاح." ${LangFileString} MUI_TEXT_ABORT_TITLE "إلغاء التنصيب" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "لم ينتهي التنصيب بنجاح." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "إزالة" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "الرجاء الإنتظار أثناء إزالة $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "إنتهى" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "إنتهت عملية الإزالة بنجاح." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "إلغاء الإزالة" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "لم تنتهي الإزالة بنجاح." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "إنهاء مرشد إعداد $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "لقد تم تنصيب $(^NameDA) على الجهاز$\r$\n$\r$\nإضغط إنهاء لإغلاق مرشد الإعداد." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "يجب إعادة تشغيل الجهاز لإنهاء تنصيب $(^NameDA). هل تريد إعادة التشغيل الآن؟" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "إنهاء مرشد إزالة $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "لقد تم إزالة $(^NameDA) من الجهاز.$\r$\n$\r$\n إضغط إنهاء لإغلاق المرشد." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "يجب إعادة تشغيل الجهاز لإنهاء إزالة $(^NameDA). هل تريد إعادة التشغيل الآن؟" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "أعد التشغيل الآن" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "أرغب ÙÙŠ إعادة تشغيل الجهاز ÙÙŠ وقت لاحق" ${LangFileString} MUI_TEXT_FINISH_RUN "&شغل $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "اعرض& أقرأني" ${LangFileString} MUI_BUTTONTEXT_FINISH "&إنهاء" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "إختر مجلد قائمة ابدأ" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "إختر مجلد قائمة ابدأ لإختصارات $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "إختر المجلد ÙÙŠ قائمة ابدأ الذي ستنشأ Ùيه إختصارات البرنامج. يمكن أيضا كتابة إسم لإنشاء مجلد جديد." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "لا تنشئ إختصارات" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "إزالة $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "إزالة $(^NameDA) من الجهاز." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "هل أنت متأكد من إغلاق منصّب $(^Name)ØŸ" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "هل أنت متأكد من أنك الخروج من مزيل $(^Name)ØŸ" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "اختر المستخدمين" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "حدد لمن من المستخدمين تريد تركيب $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "حدد لمن تريد تركيب $(^NameDA) Ù„Ù†ÙØ³Ùƒ Ùقط أم لجميع مستخدمي الحاسب. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "تركيب لجميع مستخدمي هذا الحاسب" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "تركيب لي Ùقط" !endif nsis-3.11/Contrib/Language files/Armenian.nlf000077500000000000000000000160761477201124000210660ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1067 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1200 # RTL - anything else than RTL means LTR - # Translation by Hrant Ohanyan (h.ohanyan@haysoft.org) # ^Branding Nullsoft Install System %s # ^SetupCaption ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ $(^Name)-Õ¨ # ^UninstallCaption Õ‹Õ¶Õ»Õ¥Õ¬ $(^Name)-Õ¨ # ^LicenseSubCaption : Ô±Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ # ^ComponentsSubCaption : ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨ # ^DirSubCaption : ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ # ^InstallingSubCaption : Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ¨ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ # ^CompletedSubCaption : Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö # ^UnComponentsSubCaption : ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ # ^UnDirSubCaption : Õ‹Õ¶Õ»Õ¾Õ¸Õ² Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ # ^ConfirmSubCaption : Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ # ^UninstallingSubCaption : Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ»Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ # ^UnCompletedSubCaption : Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö # ^BackBtn « &Õ†Õ¡Õ­Õ¸Ö€Õ¤Õ¨ # ^NextBtn &Õ€Õ¡Õ»Õ¸Ö€Õ¤Õ¨ » # ^AgreeBtn Õ€Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶& Õ¥Õ´ # ^AcceptBtn ÔµÕ½ &Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Õ´ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ« ÕºÕ¡ÕµÕ´Õ¡Õ¶Õ¶Õ¥Ö€Õ¨ # ^DontAcceptBtn ÔµÕ½ &Õ¹Õ¥Õ´ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ« ÕºÕ¡ÕµÕ´Õ¡Õ¶Õ¶Õ¥Ö€Õ¨ # ^InstallBtn &ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ # ^UninstallBtn Õ‹Õ¶&Õ»Õ¥Õ¬ # ^CancelBtn Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬ # ^CloseBtn &Õ“Õ¡Õ¯Õ¥Õ¬ # ^BrowseBtn Ô´&Õ«Õ¿Õ¥Õ¬ ... # ^ShowDetailsBtn &Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶... # ^ClickNext Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'Ô±Õ¼Õ¡Õ»'Ö‰ # ^ClickInstall ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬'Ö‰ # ^ClickUninstall Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'Õ‹Õ¶Õ»Õ¥Õ¬'Ö‰ # ^Name Ô±Õ¶Õ¸Ö‚Õ¶Õ¨ # ^Completed ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿ Õ§ # ^LicenseText $(^NameDA)-Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰ ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶Õ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'Õ€Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶ Õ¥Õ´'Ö‰ # ^LicenseTextCB $(^NameDA)-Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰ ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶Õ Õ¤Ö€Õ¥Ö„ Õ¶Õ«Õ·Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´Ö‰ $_CLICK # ^LicenseTextRB $(^NameDA)-Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰ ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶Õ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¶Õ¥Ö€Ö„Õ¸Õ¶Õ·ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ«Ö Õ¡Õ¼Õ¡Õ»Õ«Õ¶Õ¨Ö‰ $_CLICK # ^UnLicenseText $(^NameDA)-Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰ ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶Õ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'Õ€Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶ Õ¥Õ´'Ö‰ # ^UnLicenseTextCB $(^NameDA)-Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰ ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶Õ Õ¤Ö€Õ¥Ö„ Õ¶Õ«Õ·Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´Ö‰ $_CLICK # ^UnLicenseTextRB $(^NameDA)-Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰ ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶Õ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¶Õ¥Ö€Ö„Õ¸Õ¶Õ·ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ«Ö Õ¡Õ¼Õ¡Õ»Õ«Õ¶Õ¨Ö‰ $_CLICK # ^Custom Õ€Õ¡Ö€Õ´Õ¡Ö€Õ¥ÖÕ¾Õ¡Õ® # ^ComponentsText Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ¶ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Ö‰ $_CLICK # ^ComponentsSubText1 Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨. # ^ComponentsSubText2_NoInstTypes ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨. # ^ComponentsSubText2 Õ¯Õ¡Õ´ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¬Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€. # ^UnComponentsText Õ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨Ö‰ $_CLICK # ^UnComponentsSubText1 Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨. # ^UnComponentsSubText2_NoInstTypes Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨. # ^UnComponentsSubText2 Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¬Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Ö‰ # ^DirText Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ« $(^NameDA)-Õ¨ Õ¶Õ·Õ¾Õ¡Õ® Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´Ö‰ Ô±ÕµÕ¬ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'Ô¸Õ¶Õ¿Ö€Õ¥Õ¬' Ö‡ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ¶Ö‰ $_CLICK # ^DirSubText ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¯Õ¨ # ^DirBrowseText Õ†Õ·Õ¥Ö„ $(^NameDA)-Õ« Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨. # ^UnDirText Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ»Õ¶Õ»Õ« $(^NameDA)-Õ¨ Õ¶Õ·Õ¾Õ¡Õ® Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ«ÖÖ‰ Ô±ÕµÕ¬ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ«Ö Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ 'Ô¸Õ¶Õ¿Ö€Õ¥Õ¬' Ö‡ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ¶Ö‰ $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨, Õ¸Ö€Õ«Ö ÕºÕ¥Õ¿Ö„ Õ§ Õ»Õ¶Õ»Õ¥Õ¬ $(^NameDA)-Õ¨. # ^SpaceAvailable "Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§. " # ^SpaceRequired "ÕŠÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ§. " # ^UninstallingText $(^NameDA) Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ»Õ¶Õ»Õ¾Õ« ÕÕ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«ÖÖ‰ $_CLICK # ^UninstallingSubText Õ‹Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ§Õ # ^FileError Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ¢Õ¡ÖÕ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ¨Õ Õ£Ö€Õ¡Õ¶ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰ \r\n\t"$0"\r\n'Ô´Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬'Õ Õ¨Õ¶Õ¤Õ°Õ¡Õ¿Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ¨,\r\n"Ô¿Ö€Õ¯Õ¶Õ¥Õ¬"Õ Õ¯Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Õ¬,\r\n"Ô²Õ¡Ö Õ©Õ¸Õ²Õ¶Õ¥Õ¬"Õ Õ¢Õ¡Ö Õ©Õ¸Õ²Õ¶Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨Ö‰ # ^FileError_NoIgnore Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ¢Õ¡ÖÕ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ¨Õ Õ£Ö€Õ¡Õ¶ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰ \r\n\t"$0"\r\n'Ô¿Ö€Õ¯Õ¶Õ¥Õ¬'Õ Õ¯Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Õ¬,\r\n'Ô´Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬'Õ Õ¨Õ¶Õ¤Õ°Õ¡Õ¿Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ¨Ö‰ # ^CantWrite "Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ£Ö€Õ¡Õ¶ÖÕ¥Õ¬ " # ^CopyFailed ÕÕ­Õ¡Õ¬Õ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬Õ¸Ö‚ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ # ^CopyTo "ÕŠÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬Õ " # ^Registering "Ô³Ö€Õ¡Õ¶ÖÕ¸Ö‚Õ´. " # ^Unregistering "ÕŽÕ¥Ö€Õ¡Õ£Ö€Õ¡Õ¶ÖÕ¸Ö‚Õ´. " # ^SymbolNotFound "Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ£Õ¿Õ¶Õ¥Õ¬Õ " # ^CouldNotLoad "Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ¢Õ¡ÖÕ¥Õ¬. " # ^CreateFolder "ÕÕ¿Õ¥Õ²Õ®Õ¾Õ¸Ö‚Õ´ Õ§ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯ " # ^CreateShortcut "ÕÕ¿Õ¥Õ²Õ®Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ ÕºÕ«Õ¿Õ¡Õ¯Õ¶Õ¥Ö€." # ^CreatedUninstaller "ÕÕ¿Õ¥Õ²Õ®Õ¾Õ¸Ö‚Õ´ Õ»Õ¶Õ»Õ´Õ¡Õ¶ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨. " # ^Delete "Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´. " # ^DeleteOnReboot "Ô¿Õ»Õ¶Õ»Õ¾Õ« Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸. " # ^ErrorCreatingShortcut "ÕÕ­Õ¡Õ¬Õ ÕºÕ«Õ¿Õ¡Õ¯Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ«Õ½. " # ^ErrorCreating "ÕÕ­Õ¡Õ¬. " # ^ErrorDecompressing ÕÕ­Õ¡Õ¬Õ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Ö‰ # ^ErrorRegistering Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ£Ö€Õ¡Õ¶ÖÕ¥Õ¬ Õ£Ö€Õ¡Õ¤Õ¡Ö€Õ¡Õ¶Õ¨(DLL) # ^ExecShell "Õ–Õ¡ÕµÕ¬Õ« Õ¯Õ«Ö€Õ¡Õ¼Õ¸Ö‚Õ´. " # ^Exec "Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¸Ö‚Õ´ Õ§. " # ^Extract "Õ€Õ¡Õ¶Õ¸Ö‚Õ´ Õ§. " # ^ErrorWriting "Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ½Õ­Õ¡Õ¬. " # ^InvalidOpcode ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ«Õ¹Õ¨ Õ¾Õ¶Õ¡Õ½Õ¾Õ¡Õ® Õ§. # ^NoOLE "Õ‰Õ¯Õ¡ OLEÕ" # ^OutputFolder "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨. " # ^RemoveFolder "Ô¹Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´. " # ^RenameOnReboot "Ô¿Õ¡Õ¶Õ¾Õ¡Õ¶Õ¡ÖƒÕ¸Õ­Õ¾Õ« Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸. " # ^Rename "Ô±Õ¶Õ¾Õ¡Õ¶Õ¡ÖƒÕ¸Õ­Õ¸Ö‚Õ´. " # ^Skipped "Ô²Õ¡Ö Õ©Õ¸Õ²Õ¶Õ¡Õ®. " # ^CopyDetails ÕŠÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ # ^LogInstall ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ´Õ¡Õ¶ Õ°Õ¡Õ·Õ¾Õ¥Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ # byte Õ¢Õ¡ÕµÕ© # kilo Ô¿ # mega Õ„ # giga Ô³nsis-3.11/Contrib/Language files/Armenian.nsh000077500000000000000000000233111477201124000210650ustar00rootroot00000000000000;Language: Armenian (1067) ;Translation by Hrant Ohanyan (h.ohanyan@haysoft.org) !insertmacro LANGFILE "Armenian" = "Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶" "Hayeren" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ÕÕ¥Õ¦ Õ¸Õ²Õ»Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ§ $(^NameDA) Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ«Õ¹Õ¨" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ô±ÕµÕ½ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ« $(^NameDA)-Õ¨ ÕÕ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´Ö‰$\r$\n$\r$\nÔ½Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ¥Õ¶Ö„ Õ¿Õ¡Õ¬Õ«Õ½ ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ¢Õ¸Õ¬Õ¸Ö€ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨Ö‰ Ô´Õ¡ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¯Õ¿Õ¡ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸ Õ­Õ¸Ö‚Õ½Õ¡ÖƒÕ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¨ Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚ÖÖ‰$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ÕÕ¥Õ¦ Õ¸Õ²Õ»Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ§ $(^NameDA)-Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ô±ÕµÕ½ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ»Õ¶Õ»Õ« $(^NameDA)-Õ¨ ÕÕ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«ÖÖ‰$\r$\n$\r$\nÕ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Ö„, Õ¸Ö€ $(^NameDA) Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¢Õ¡ÖÕ¡Õ® Õ¹Õ§Ö‰$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ô±Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)-Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Õ«Ö€Õ¨, Õ¡ÕºÕ¡ Õ½Õ¥Õ²Õ´Õ¥Ö„ $\"Õ€Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶ Õ¥Õ´$\"Ö‰ Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„Ö‰" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Õ«Ö€Õ¨Õ Õ¤Ö€Õ¥Ö„ Õ¶Õ«Õ·Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´Ö‰ Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„: $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Õ«Ö€Õ¨Õ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¶Õ¥Ö€Ö„Õ¸Õ¶Õ·ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ«Ö Õ¡Õ¼Õ¡Õ»Õ«Õ¶Õ¨Ö‰ Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„: $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ô±Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)-Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ®Õ¡Õ¶Õ¸Õ©Õ¡ÖÕ¥Ö„ Õ¡Ö€Õ¿Õ¸Õ¶Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨Ö‰" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Õ«Ö€Õ¨Õ Õ½Õ¥Õ²Õ´Õ¥Ö„ $\"Õ€Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶ Õ¥Õ´$\" Õ¯Õ¸Õ³Õ¡Õ¯Õ¨Ö‰ Õ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„Ö‰ $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Õ«Ö€Õ¨Õ Õ¤Ö€Õ¥Ö„ Õ¶Õ«Õ·Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´Ö‰ Õ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„Ö‰ $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÔµÕ©Õ¥ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¡Õ£Õ«Ö€Õ¨Õ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¶Õ¥Ö€Ö„Õ¸Õ¶Õ·ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ«Ö Õ¡Õ¼Õ¡Õ»Õ«Õ¶Õ¨Ö‰ Õ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„Ö‰ $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÕÕ¥Ö„Õ½Õ¿Õ¨ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ $\"PageUp$\" Ö‡ $\"PageDown$\"Ö‰" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¾Õ¸Õ² Õ®Ö€Õ¡Õ£Ö€Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ $(^NameDA)-Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Ö‰" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Ô¾Ö€Õ¡Õ£Ö€Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ $(^NameDA)-Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬Ö‰" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Õ„Õ¯Õ¶Õ«Õ¯Õ« Õ½Õ¬Õ¡Ö„Õ¨ Õ¸Ö‚Õ²Õ²Õ¥Ö„ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ« Õ¾Ö€Õ¡Õ Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰" !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Õ„Õ¯Õ¶Õ«Õ¯Õ« Õ½Õ¬Õ¡Ö„Õ¨ Õ¸Ö‚Õ²Õ²Õ¥Ö„ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ« Õ¾Ö€Õ¡Õ Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰" !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬Õ¸Ö‚ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨, Õ¸Ö€Õ¿Õ¥Õ² ÕºÕ¥Õ¿Ö„ Õ§ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ $(^NameDA)-Õ¨Ö‰" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Õ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨, Õ¸Ö€Õ¿Õ¥Õ²Õ«Ö ÕºÕ¥Õ¿Ö„ Õ§ Õ»Õ¶Õ»Õ¥Õ¬ $(^NameDA)-Õ¨Ö‰" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ¨ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "ÕÕºÕ¡Õ½Õ¥Ö„, ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¸Ö‚Õ´ Õ§ $(^NameDA)-Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨..." ${LangFileString} MUI_TEXT_FINISH_TITLE "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¾Õ¥Ö" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Õ€Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¾Õ¥Ö" ${LangFileString} MUI_TEXT_ABORT_TITLE "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ¨ Õ¨Õ¶Õ¤Õ°Õ¡Õ¿Õ¾Õ¥Õ¬ Õ§Ö‰" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ¨ Õ¹Õ« Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Õ¬Ö‰" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Õ‹Õ¶Õ»Õ¸Ö‚Õ´ Õ§" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "ÕÕºÕ¡Õ½Õ¥Ö„, Õ»Õ¶Õ»Õ¸Ö‚Õ´ Õ§ $(^NameDA)-Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Õ‹Õ¶Õ»Õ¾Õ¥Ö" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ»Õ¶Õ»Õ¾Õ¥ÖÖ‰" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Õ‹Õ¶Õ»Õ´Õ¡Õ¶ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¨Õ¶Õ¤Õ°Õ¡Õ¿Õ¾Õ¥Õ¬ Õ§Ö‰" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ô¾Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¹Õ« Õ»Õ¶Õ»Õ¾Õ¥Õ¬Ö‰" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)-Õ« Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ´Õ¡Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ« Õ¡Õ¾Õ¡Ö€Õ¿Õ¸Ö‚Õ´" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)-Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¾Õ¥ÖÖ‰$\r$\n$\r$\nÕÕ¥Õ²Õ´Õ¥Ö„ $\"ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿ Õ§$\" Õ¯Õ¸Õ³Õ¡Õ¯Õ¨Õ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ«Õ¹Õ¨ ÖƒÕ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)-Õ« Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¸Ö‚Õ´: ÕŽÕ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥ÕžÕ¬Ö‰" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)-Õ« Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¡Õ´ÖƒÕ¸ÖƒÕ¸Ö‚Õ´ " ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ§ ÕÕ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«ÖÖ‰ $\r$\n$\r$\nÕÕ¥Õ²Õ´Õ¥Ö„ $\"ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿ Õ§ $\" Õ¯Õ¸Õ³Õ¡Õ¯Õ¨Õ Õ®Ö€Õ¡Õ£Ö€Õ«Ö Õ¤Õ¸Ö‚Ö€Õ½ Õ£Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)-Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¸Ö‚Õ´: ÕŽÕ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥ÕžÕ¬Ö‰" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ô±ÕµÕ¸, Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Õ¹Õ¨Ö‰" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ÕˆÕ¹, Õ¥Õ½ Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ¸Ö‚Õ·Ö‰" ${LangFileString} MUI_TEXT_FINISH_RUN "&Ô²Õ¡ÖÕ¥Õ¬$(^NameDA)-Õ¨" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ ReadMe Ö†Õ¡ÕµÕ¬Õ¨" ${LangFileString} MUI_BUTTONTEXT_FINISH "&ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿ Õ§" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Ô¹Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ $\"Start$\" Õ¨Õ¶Õ¿Ö€Õ¡ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ $\"Start$\"-Õ« Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨Õ Õ®Ö€Õ¡Õ£Ö€Õ« ÕºÕ«Õ¿Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ $\"Start$\"-Õ« Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨, Õ¸Ö€Õ¿Õ¥Õ² Õ¯Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ« ÕºÕ«Õ¿Õ¡Õ¯Õ¶Õ¥Ö€Õ¨Ö‰" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Õ‰Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ÕºÕ«Õ¿Õ¡Õ¯Õ¶Õ¥Ö€" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)-Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)-Õ¨ Õ»Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«ÖÖ‰" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ô¸Õ¶Õ¤Õ°Õ¡Õ¿Õ¥ÕžÕ¬ $(^Name)-Õ« Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ¨Ö‰" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ô¿Õ¡Õ¶Õ£Õ¶Õ¥ÖÕ¶Õ¥ÕžÕ¬ $(^Name)-Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¨Ö‰" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Ô¸Õ¶Õ¿Ö€Õ¥Ö„, Õ©Õ¥ Õ¸Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ $(^NameDA)-Õ¨:" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Ô¸Õ¶Õ¿Ö€Õ¥Ö„, Õ©Õ¥ Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ $(^NameDA)-Õ¨Õ Õ´Õ«Õ¡ÕµÕ¶ ÕÕ¥Õ¦ Õ°Õ¡Õ´Õ¡Ö€, Õ©Õ¥ Õ¢Õ¸Õ¬Õ¸Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ«: $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ«Õ¶Õ± Õ°Õ¡Õ´Õ¡Ö€" !endif nsis-3.11/Contrib/Language files/Asturian.nlf000077500000000000000000000127471477201124000211230ustar00rootroot00000000000000# Header, don't edit ;Asturian - Asturies NLF v6 # Language ID (none exists at the moment) 9997 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Marcos (marcoscostales@gmail.com). # ^Branding Nullsoft Install System %s # ^SetupCaption Instalación de $(^Name) # ^UninstallCaption Desinstalación de $(^Name) # ^LicenseSubCaption : Alcuerdu de Llicencia # ^ComponentsSubCaption : Opciones d'Instalación # ^DirSubCaption : Direutoriu d'Instalación # ^InstallingSubCaption : Instalando # ^CompletedSubCaption : Completáu # ^UnComponentsSubCaption : Opciones de Desinstalación # ^UnDirSubCaption : Direutoriu de Desinstalación # ^ConfirmSubCaption : Confirmación # ^UninstallingSubCaption : Desinstalando # ^UnCompletedSubCaption : Completáu # ^BackBtn < &Atrás # ^NextBtn &Siguiente > # ^AgreeBtn A&ceuto # ^AcceptBtn A&ceuto los términos de la llicencia # ^DontAcceptBtn &Non aceuto los términos de la llicencia # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Encaboxar # ^CloseBtn &Zarrar # ^BrowseBtn &Restolar... # ^ShowDetailsBtn Ver &detalles # ^ClickNext Calca Siguiente pa siguir. # ^ClickInstall Calca Instalar pa entamar la instalación. # ^ClickUninstall Calca Desinstalar pa entamar la desinstalación. # ^Name Nome # ^Completed Completáu # ^LicenseText Por favor, revisa l'acuerdu de llicencia enantes d'instalar $(^NameDA). Si aceutes tolos términos del alcuerdu, calca Aceuto. # ^LicenseTextCB Por favor, revisa l'alcuerdu de llicencia enantes d'instalar $(^NameDA). Si aceutes tolos términos del alcuerdu, marca embaxo la caxella. $_CLICK # ^LicenseTextRB Por favor, revisa l'alcuerdu de llicencia enantes d'instalar $(^NameDA). Si aceutes tolos términos del alcuerdu, seleiciona embaxo la primer opción. $_CLICK # ^UnLicenseText Por favor, revisa l'alcuerdu de llicencia enantes de desinstalar $(^NameDA). Si aceutes tolos términos del alcuerdu, calca Aceuto. # ^UnLicenseTextCB Por favor, revisa l'alcuerdu de llicencia enantes de desinstalar $(^NameDA). Si aceutes tolos términos del alcuerdu, marca embaxo la caxella. $_CLICK. # ^UnLicenseTextRB Por favor, revisa l'alcuerdu de llicencia enantes de desinstalar $(^NameDA). Si aceutes tolos términos del alcuerdu, seleiciona embaxo la primer opción. $_CLICK # ^Custom Personalizada # ^ComponentsText Conseña los componentes que deseyes instalar y desconseña los componentes que nun quies instalar. $_CLICK # ^ComponentsSubText1 Tipos d'instalación: # ^ComponentsSubText2_NoInstTypes Seleiciona los componentes a instalar: # ^ComponentsSubText2 O selecciona los componentes opcionales que deseyes instalar: # ^UnComponentsText Conseña los componentes que deseyes desinstalar y desconseña los componentes que nun quieras desinstalar. $_CLICK # ^UnComponentsSubText1 Tipos de desinstalación: # ^UnComponentsSubText2_NoInstTypes Seleiciona los componentes a desinstalar: # ^UnComponentsSubText2 O seleiciona los componentes opcionales que deseyes desinstalar: # ^DirText El programa d'instalación instalará $(^NameDA) nel siguiente direutoriu. Pa instalar nun direutoriu distintu, calca Restolar y seleiciona otru direutoriu. $_CLICK # ^DirSubText Direutoriu de Destín # ^DirBrowseText Seleiciona'l direutoriu nel qu'instalará $(^NameDA): # ^UnDirText El programa d'instalación desinstalará $(^NameDA) del siguiente direutoriu. Pa desinstalar d'un direutoriu distintu, calca Restolar y seleiciona otru direutoriu. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Seleiciona'l direutoriu dende'l cual desinstalará $(^NameDA): # ^SpaceAvailable Espaciu disponible: # ^SpaceRequired Espaciu requeríu: # ^UninstallingText $(^NameDA) sedrá desinstaláu del siguiente direutoriu. $_CLICK # ^UninstallingSubText Desinstalando dende: # ^FileError Error abriendo ficheru pa escritura: \r\n\t"$0"\r\nCalca albortar p'anular la instalación,\r\nreintentar pa volver a intentar escribir el ficheru, u\r\nomitir pa inorar esti ficheru # ^FileError_NoIgnore Error abriendo ficheru pa escritura: \r\n\t"$0"\r\nCalca reintentar pa volver a intentar escribir el ficheru, o\r\nencaboxar p'anular la instalación # ^CantWrite "Nun pudo escribise: " # ^CopyFailed Falló la copia # ^CopyTo "Copiar a " # ^Registering "Rexistrando: " # ^Unregistering "Desaniciando rexistru: " # ^SymbolNotFound "Nun pudo atopase símbolu: " # ^CouldNotLoad "Nun pudo cargase: " # ^CreateFolder "Criar direutoriu: " # ^CreateShortcut "Criar accesu direutu: " # ^CreatedUninstaller "Criar desinstalador: " # ^Delete "Desaniciar ficheru: " # ^DeleteOnReboot "Desaniciar al reaniciu: " # ^ErrorCreatingShortcut "Fallu criando accesu direutu: " # ^ErrorCreating "Fallu criando: " # ^ErrorDecompressing ¡Error descomprimiendo datos! ¿Instalador corruptu? # ^ErrorRegistering Fallu rexistrando DLL # ^ExecShell "Executar comandu: " # ^Exec "Executar: " # ^Extract "Estrayer: " # ^ErrorWriting "Extrayer: fallu escribiendo al ficheru " # ^InvalidOpcode Instalador corruptu: códigu d'operación non válidu # ^NoOLE "Ensin OLE pa: " # ^OutputFolder "Direutoriu de salida: " # ^RemoveFolder "Desaniciar direutoriu: " # ^RenameOnReboot "Renomar al reaniciu: " # ^Rename "Renomar: " # ^Skipped "Omitíu: " # ^CopyDetails Copiar Detalles al Cartafueyu # ^LogInstall Rexistrar procesu d'instalación # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Asturian.nsh000077500000000000000000000175321477201124000211310ustar00rootroot00000000000000;Language: Asturian (1150) ;By Marcos (marcoscostales@gmail.com). !insertmacro LANGFILE "Asturian" = "Asturies" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienveníu al Asistente d'Instalación de $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Esti programa instalará $(^NameDA) nel to ordenador.$\r$\n$\r$\nEncamiéntase que zarres toles demás aplicaciones enantes d'aniciar la instalación. Esto faerá posible anovar ficheros rellacionaos col sistema ensin tener que reaniciar el to ordenador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienveníu al Asistente de Desinstalación de $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Esti asistente guiaráte durante la desinstalación de $(^NameDA).$\r$\n$\r$\nEnantes d'aniciar la desinstalación, asegúrate de que $(^NameDA) nun se ta executando.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Alcuerdu de llicencia" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revisa los términos de la llicencia enantes d'instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si aceutes tolos términos del alcuerdu, seleiciona Aceuto pa siguir. Tienes d'aceutar l'alcuerdu pa instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si aceutes los términos del alcuerdu, conseña embaxo la caxella. Tienes d'aceutar los términos pa instalar $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si aceutes los términos del alcuerdu, seleiciona embaxo la primer opción. Tienes d'aceutar los términos pa instalar $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Alcuerdu de llicencia" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revisa los términos de la llicencia enantes de desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si aceutes tolos términos del alcuerdu, seleiciona Aceuto pa siguir. Tienes d'aceutar l'alcuerdu pa desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si aceutes los términos del alcuerdu, conseña embaxu la caxella. Tienes d'aceutar los términos pa desinstalar $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si aceutes los términos del alcuerdu, seleccione embaxu la primer opción. Tienes d'aceutar los términos pa desinstalar $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Calca Avanzar Páxina pa ver el restu del alcuerdu." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Seleición de componentes" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleicione qué carauterístiques de $(^NameDA) deseyes instalar." ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Seleición de componentes" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleicione qué carauterístiques de $(^NameDA) quies desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Allugue'l mur enriba d'un componente pa ver la so descripción." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escoyer llugar d'instalación" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escueye'l direutoriu pa instalar $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escoyer llugar de desinstalación" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escueye'l direutoriu dende'l cual se desinstalará $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espera mientres $(^NameDA) s'instala." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Completada" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación completóse correutamente." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Desaniciada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación nun se completó correutamente." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espera mientres $(^NameDA) se desinstala." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Completada" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación completóse correutamente." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Desaniciada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación nun se completó correutamente." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando l'Asistente d'Instalación de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) foi instaláu nel to sistema.$\r$\n$\r$\nCalca Finar pa zarrar esti asistente." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "El to sistema tien de reaniciase pa que pueda completase la instalación de $(^NameDA). ¿Quies reaniciar agora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando l'Asistente de Desinstalación de $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) foi desinstaláu del to sistema.$\r$\n$\r$\nCalca Finar pa zarrar esti asistente." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "El to ordenador tien que reaniciar pa finar la desinstalación de $(^NameDA). ¿Quies reiniciar agora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reaniciar agora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reaniciar manualmente más sero" ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ver Lléame" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finar" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escoyer Carpeta del Menú Aniciu" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escueye una Carpeta del Menú Aniciu pa los accesos direutos de $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleiciona una carpeta del Menú Aniciu na que quieras criar los accesos direutos del programa. Tamién puedes introducir un nome pa criar una nueva carpeta." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non criar accesos direutos" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Desaniciar $(^NameDA) del to sistema." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "¿De xuru que quies colar de la instalación de $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿De xuru que quies colar de la desinstalación de $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escoyer Usuarios" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escueye los usuarios pa los cuales quies instalar $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleiciona si quies instalar $(^NameDA) namái pa tí o pa tolos usuarios d'esti Ordenador.$(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalación pa cualisquier usuariu d'esti ordenador" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación namái pa mí" !endif nsis-3.11/Contrib/Language files/Basque.nlf000077500000000000000000000122011477201124000205360ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1069 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Iñaki San Vicente # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) -ren Instalazioa # ^UninstallCaption $(^Name) -ren Ezabaketa # ^LicenseSubCaption : Lizentzia hitzarmen agiria # ^ComponentsSubCaption : Instalazio aukerak # ^DirSubCaption : Instalazio karpeta # ^InstallingSubCaption : Instalatzen # ^CompletedSubCaption : Instalazioa burututa # ^UnComponentsSubCaption : Ezabaketa aukerak # ^UnDirSubCaption : Ezabaketa direktorioa # ^ConfirmSubCaption : Berretsi ezabaketa # ^UninstallingSubCaption : Ezabatzen # ^UnCompletedSubCaption : Ezabaketa burututa # ^BackBtn < &Atzera # ^NextBtn &Aurrera > # ^AgreeBtn Onartu # ^AcceptBtn Lizentzia hitzarmenaren baldintzak onartzen ditut. # ^DontAcceptBtn Ez ditut lizentzia hitzarmenaren baldintzak onartzen. # ^InstallBtn &Instalatu # ^UninstallBtn &Ezabatu # ^CancelBtn Ezeztatu # ^CloseBtn &Itxi # ^BrowseBtn &Arakatu... # ^ShowDetailsBtn Ikusi &zehaztasunak # ^ClickNext Sakatu Aurrera jarraitzeko. # ^ClickInstall Sakatu Instalatu instalazioarekin hasteko. # ^ClickUninstall Sakatu Ezabatu ezabaketarekin hasteko. # ^Name Izena # ^Completed Osatuta # ^LicenseText Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu. # ^LicenseTextCB Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK # ^LicenseTextRB Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK # ^UnLicenseText Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu. # ^UnLicenseTextCB Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK. # ^UnLicenseTextRB Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK # ^Custom Norberaren nahien arabera # ^ComponentsText Nabarmendu instalatu nahi diren osagaiak, eta utzi zuri instalatu nahi ez direnak. $_CLICK # ^ComponentsSubText1 Hautatu instalazio mota: # ^ComponentsSubText2_NoInstTypes Hautatu instalatu beharreko osagaiak: # ^ComponentsSubText2 Edo hautatu instalatu beharreko aukerazko osagaiak: # ^UnComponentsText Nabarmendu ezabatu nahi diren osagaiak, eta utzi zuri ezabatu nahi ez direnak. $_CLICK # ^UnComponentsSubText1 Hautatu ezabaketa mota: # ^UnComponentsSubText2_NoInstTypes Hautatu ezabatu beharreko osagaiak: # ^UnComponentsSubText2 Edo hautatu ezabatu beharreko aukerazko osagaiak: # ^DirText Instalazio programak $(^NameDA) honako karpetan instalatuko du. Beste karpeta batean instalatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK # ^DirSubText Helburu karpeta # ^DirBrowseText Aukeratu $(^NameDA) instalatuko den karpeta: # ^UnDirText Instalazio programak $(^NameDA) honako karpetatik ezabatuko du. Beste karpeta batetik ezabatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Aukeratu $(^NameDA) zein karpetatik ezabatuko den: # ^SpaceAvailable Leku erabilgarria: # ^SpaceRequired Behar den lekua: # ^UninstallingText $(^NameDA) ondorengo karpetan instalatuko da. $_CLICK # ^UninstallingSubTex Ezabatzen honako karpetatik: # ^FileError Hutsegitea idazteko fitxategia irekitzean: \r\n\t"$0"\r\nSakatu Irten instalazioa ,\r\nsaiatu berriz fitxategi hau berriz idazten saiatzeko, u\r\njarraitu fitxategi hau alde batera utzita aurrera egiteko # ^FileError_NoIgnore Hutsegitea idazteko fitxategia irekitzean: \r\n\t"$0"\r\nsaiatu berriz fitxategi hau berriz idazten saiatzeko ,\r\nSakatu Irten instalazioa # ^CantWrite "Ezin izan da idatzi: " # ^CopyFailed Kopiatzeak hutsegin du # ^CopyTo "Kopiatu hona " # ^Registering "Erregistratzen: " # ^Unregistering "Erregistroa ezabatzen: " # ^SymbolNotFound "Ikurra ezin izan da aurkitu: " # ^CouldNotLoad "Ezin izan da kargatu: " # ^CreateFolder "Sortu karpeta: " # ^CreateShortcut "Sortu lasterbidea: " # ^CreatedUninstaller "Sortu ezabatzailea: " # ^Delete "Ezabatu fitxategia: " # ^DeleteOnReboot "Ezabatu berrabiarazitakoan: " # ^ErrorCreatingShortcut "Hutsegitea lasterbidea sortzerakoan: " # ^ErrorCreating "Hutsegitea sortzerakoan: " # ^ErrorDecompressing ¡Hutsegitea datuak deskomprimatzean! Instalatzailea okerra? # ^ErrorRegistering Hutsegitea DLL erregistratzerakoan # ^ExecShell "Exekutatu agindua: " # ^Exec "Exekutatu: " # ^Extract "Kanporatu: " # ^ErrorWriting "Kanporaketa: hutsegitea fitxategira idazterakoan " # ^InvalidOpcode Instalatzailea okerra: ekintza kodea ez da baliozkoa # ^NoOLE "OLE-rik ez honentzako: " # ^OutputFolder "Irteera karpeta: " # ^RemoveFolder "Ezabatu karpeta: " # ^RenameOnReboot "Berrizendatu berrabiarazitakoan: " # ^Rename "Berrizendatu: " # ^Skipped "Alde batera utzitakoa: " # ^CopyDetails Kopiatu xehetasunak arbelera # ^LogInstall Instalazio prozesuaren erregistroa gorde # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Basque.nsh000077500000000000000000000172451477201124000205640ustar00rootroot00000000000000;Language: Basque (1069) ;By Iñaki San Vicente !insertmacro LANGFILE "Basque" = "Euskera" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ongi etorri $(^NameDA) -ren instalazio programara" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Programa honek $(^NameDA) zure ordenagailuan instalatuko du.$\r$\n$\r$\nAholkatzen da instalazioarekin hasi aurretik beste aplikazio guztiak ixtea. Honek sistemarekin erlazionatuta dauden fitxategien eguneratzea ahalbidetuko du, ordenagailua berrabiarazi beharrik izan gabe.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ongi etorri $(^NameDA) -ren ezabaketa programara" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Laguntzaile honek $(^NameDA)-ren ezabaketa prozesuan zehar gidatuko zaitu.$\r$\n$\r$\nEzabaketa hasi aurretik, ziurtatu $(^NameDA) martxan ez dagoela .$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizentzia hitzarmena" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Mesedez aztertu lizentziaren baldintzak $(^NameDA) instalatu aurretik." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizentzia hitzarmena" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Mesedez aztertu lizentziaren baldintzak $(^NameDA) ezabatu aurretik." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sakatu Av Pág hitzarmenaren gainontzeko atalak ikusteko." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Osagaien hautatzea" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Hautatu $(^NameDA)-ren zein ezaugarri instalatu nahi duzun." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Osagaien hautatzea" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Hautatu $(^NameDA)-ren zein ezaugarri ezabatu nahi duzun." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Azalpena" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Jarri sagua osagai baten gainean dagokion azalpena ikusteko." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Hautatu osagai bat bere azalpena ikusteko." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hautatu instalazioaren lekua" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Aukeratu $(^NameDA) instalatzeko karpeta." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Aukeratu ezabatuko den karpeta" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Aukeratu $(^NameDA) zein karpetatik ezabatuko den." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalatzen" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mesedez itxoin $(^NameDA) instalatzen den bitartean." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalazioa burututa" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalazioa zuzen burutu da." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalazioa ezeztatua" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalazioa ez da zuzen burutu." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ezabatzen" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mesedez itxoin $(^NameDA) ezabatzen den bitartean." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ezabatzea burututa" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ezabatzea zuzen burutu da." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ezabatzea ezeztatuta" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ezabatzea ez da zuzen burutu." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)-ren instalazio laguntzailea osatzen" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) zure sisteman instalatu da.$\r$\n$\r$\nSakatu Amaitu laguntzaile hau ixteko." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Zure sistema berrabiarazi behar duzu $(^NameDA)-ren instalazioa osatzeko. Orain Berrabiarazi nahi duzu?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)-ren ezabaketa laguntzailea osatzen" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) zure sistematik ezabatu da.$\r$\n$\r$\nSakatu Amaitu laguntzaile hau ixteko." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Zure ordenagailuak berrabiarazia izan behar du $(^NameDA)-ren ezabaketa osatzeko. Orain Berrabiarazi nahi duzu?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Berrabiarazi orain" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Neuk berrabiarazi geroago" ${LangFileString} MUI_TEXT_FINISH_RUN "&Exekutatu $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ikusi Readme.txt" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Amaitu" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Aukeratu Hasiera Menuko karpeta" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Aukeratu Hasiera Menuko karpeta bat $(^NameDA)-ren lasterbideentzako." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Aukeratu Hasiera Menuko karpeta bat, non programaren lasterbideak instalatu nahi dituzun. Karpeta berri bat sortzeko izen bat ere adierazi dezakezu." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ez sortu lasterbiderik" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Ezabatu $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) zure sistematik ezabatzen du." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ziur zaude $(^Name)-ren instalaziotik irten nahi duzula?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ziur zaude $(^Name)-ren ezabaketa laguntzailetik irten nahi duzula?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Hautatu Erabiltzaileak" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Hautatu zein erabiltzailerentzat ezartzea nahi duzun $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Hautatu norentzat ezartzea nahi duzun $(^NameDA) zuretzat bakarrik edo ordenagailu honetako erabiltzaile guztientzat. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Ezarri ordenagailu hau erabiltzen duen edonorentzat" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Ezarri niretzat bakarrik" !endif nsis-3.11/Contrib/Language files/Belarusian.nlf000077500000000000000000000204621477201124000214130ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1059 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by PrydesparBLR [ prydespar@outlook.com ] # ^Branding Nullsoft Install System %s # ^SetupCaption УÑталÑванне $(^Name) # ^UninstallCaption Выдаленне $(^Name) # ^LicenseSubCaption : ЛіцÑнзійнае пагадненне # ^ComponentsSubCaption : Параметры ÑžÑталÑÐ²Ð°Ð½Ð½Ñ # ^DirSubCaption : Папка ÑžÑталÑÐ²Ð°Ð½Ð½Ñ # ^InstallingSubCaption : КапіÑванне файлаў # ^CompletedSubCaption : ПрацÑдура завершена # ^UnComponentsSubCaption : Параметры Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ # ^UnDirSubCaption : Папка Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ # ^ConfirmSubCaption : ПацвÑрджÑнне # ^UninstallingSubCaption : Выдаленне файлаў # ^UnCompletedSubCaption : ПрацÑдура завершана # ^BackBtn < &Ðазад # ^NextBtn &Далей > # ^AgreeBtn &ПрынÑць # ^AcceptBtn Я &прымаю ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ # ^DontAcceptBtn Я н&е прымаю ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ # ^InstallBtn &УÑталÑваць # ^UninstallBtn Выд&аліць # ^CancelBtn СкаÑаваць # ^CloseBtn За&крыць # ^BrowseBtn Ð&глÑд ... # ^ShowDetailsBtn Падра&бÑзнаÑці... # ^ClickNext ÐаціÑніце кнопку "Далей", каб працÑгнуць уÑталÑванне праграмы. # ^ClickInstall ÐаціÑніце кнопку "УÑталÑваць", каб пачаць працÑÑ ÑžÑталÑÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. # ^ClickUninstall ÐаціÑніце кнопку "Выдаліць", каб пачаць працÑÑ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. # ^Name Ð†Ð¼Ñ # ^Completed Завершана # ^LicenseText Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ пачаткам уÑталÑÐ²Ð°Ð½Ð½Ñ $(^NameDA). Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, націÑніце кнопку "ПрынÑць". # ^LicenseTextCB Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ пачаткам уÑталÑÐ²Ð°Ð½Ð½Ñ $(^NameDA). Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, націÑніце на ÑцÑжок ніжÑй. $_CLICK # ^LicenseTextRB Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ пачаткам уÑталÑÐ²Ð°Ð½Ð½Ñ $(^NameDA). Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, выберыце першы варыÑнт з прапанаваных нiжÑй. $_CLICK # ^UnLicenseText Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ пачаткам Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA). Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, нацiÑнiце кнопку "ПрынÑць". # ^UnLicenseTextCB Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ пачаткам Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA). Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, націÑніце на ÑцÑжок ніжÑй. $_CLICK # ^UnLicenseTextRB Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ пачаткам Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA). Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, выберыце першы варыÑнт з прапанаваных нiжÑй. $_CLICK # ^Custom Выбарачна # ^ComponentsText Выберыце кампаненты праграмы, ÑкiÑ Ð’Ñ‹ жадаеце ÑžÑталÑваць. $_CLICK # ^ComponentsSubText1 Выберыце тып уÑталÑваннÑ: # ^ComponentsSubText2_NoInstTypes Выберыце кампаненты праграмы, каб уÑталÑваць iÑ…: # ^ComponentsSubText2 або выберыце кампаненты праграмы, каб уÑталÑваць iÑ… па Ñвайму жаданню: # ^UnComponentsText Выберыце кампаненты, ÑкiÑ Ð’Ñ‹ жадаеце выдалiць, i знiмiце ÑцÑжкі, Ð²Ñ‹Ð±Ñ€Ð°Ð½Ñ‹Ñ Ð´Ð»Ñ Ñ‚Ñ‹Ñ… кампанентаў, ÑкiÑ Ð½Ðµ трÑба выдалÑць. $_CLICK # ^UnComponentsSubText1 Выберыце тып выдаленнÑ: # ^UnComponentsSubText2_NoInstTypes Выберыце кампаненты Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ: # ^UnComponentsSubText2 або выберыце кампаненты праграмы Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ: # ^DirText Праграма ÑžÑталюе $(^NameDA) у выбраную папку. Каб уÑталÑваць праграму Ñž iншай папкі, нацiÑнiце кнопку "ÐглÑд" i выберыце патрÑбную папку. $_CLICK # ^DirSubText Папка ÑžÑталÑÐ²Ð°Ð½Ð½Ñ # ^DirBrowseText Выберыце папку Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½Ð½Ñ $(^NameDA): # ^UnDirText Праграма выдалiць $(^NameDA) з выбранай папкі. Каб выдаліць праграму з iншай папкі, нацiÑнiце кнопку "ÐглÑд" i выберыце патрÑбную папку. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Выберыце папку, з Ñкой Ð’Ñ‹ жадаеце выдалiць $(^NameDA): # ^SpaceAvailable "ДаÑтупна на дыÑку: " # ^SpaceRequired "ПатрÑбна меÑца на дыÑку: " # ^UninstallingText Праграма выдалiць $(^NameDA) з Вашага камп'ютара. $_CLICK # ^UninstallingSubText Выдаленне з: # ^FileError Ðемагчыма адкрыць файл Ð´Ð»Ñ Ð·Ð°Ð¿iÑу: \r\n\r\n$0\r\n\r\nÐацiÑнiце кнопку "Перапынiць", каб перапынiць уÑталÑванне;\r\n"Паўтарыць", каб паўтарыць Ñпробу запiÑу Ñž файл;\r\n"Ігнараваць", каб прапуÑцiць гÑта дзеÑнне. # ^FileError_NoIgnore Ðемагчыма адкрыць файл Ð´Ð»Ñ Ð·Ð°Ð¿iÑу: \r\n\r\n$0\r\n\r\nÐацiÑнiце кнопку "Паўтарыць", каб паўтарыць Ñпробу запiÑу Ñž файл;\r\n"СкаÑаваць", каб перапынiць уÑталÑванне. # ^CantWrite "Ðемагчыма запiÑаць: " # ^CopyFailed Памылка пры капіÑванні # ^CopyTo "КапіÑванне Ñž " # ^Registering "РÑгiÑтрацыÑ: " # ^Unregistering "Выдаленне Ñ€ÑгiÑтрацыi: " # ^SymbolNotFound "Ðемагчыма знайÑці Ñiмвал: " # ^CouldNotLoad "Ðемагчыма загрузiць: " # ^CreateFolder "СтварÑнне папкі: " # ^CreateShortcut "СтварÑнне Ñрлыка: " # ^CreatedUninstaller "СтварÑнне праграмы выдаленнÑ: " # ^Delete "Выдаленне файла: " # ^DeleteOnReboot "Выдаленне паÑÐ»Ñ Ð¿ÐµÑ€Ð°Ð·Ð°Ð¿ÑƒÑку камп'ютара: " # ^ErrorCreatingShortcut "Памылка ÑтварÑÐ½Ð½Ñ Ñрлыка: " # ^ErrorCreating "Памылка ÑтварÑннÑ: " # ^ErrorDecompressing Ðемагчыма выцÑгнуць дадзеныÑ. Магчыма пашкоджаны дыÑтрыбутыў. # ^ErrorRegistering Ðемагчыма зарÑгіÑтраваць бібліÑÑ‚Ñку (DLL) # ^ExecShell "Выкананне каманды абалонкі: " # ^Exec "Выкананне: " # ^Extract "Выманне: " # ^ErrorWriting "Выманне: памылка запiÑу файла" # ^InvalidOpcode дыÑтрыбутыў пашкоджаны: код памылкi # ^NoOLE "ÐÑма OLE длÑ: " # ^OutputFolder "Папка уÑталÑваннÑ: " # ^RemoveFolder "Выдаленне папкі: " # ^RenameOnReboot "Перайменаванне паÑÐ»Ñ Ð¿ÐµÑ€Ð°Ð·Ð°Ð¿ÑƒÑку камп'ютара: " # ^Rename "Перайменаванне: " # ^Skipped "Прапушчана: " # ^CopyDetails КапіÑваць звеÑткi Ñž буфер абмена # ^LogInstall ЗапiÑваць у лог працÑÑ ÑƒÑталÑÐ²Ð°Ð½Ð½Ñ # byte Б # kilo К # mega М # giga Г nsis-3.11/Contrib/Language files/Belarusian.nsh000077500000000000000000000247021477201124000214250ustar00rootroot00000000000000;Language: Belarusian (1059) ;Translated by PrydesparBLR [ prydespar@outlook.com.by ] !insertmacro LANGFILE "Belarusian" = "БеларуÑкаÑ" "Bielaruskaja" ; BieÅ‚aruskaja !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ð’Ð°Ñ Ð²iтае ÑžÑталёўшчык $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ГÑта праграма ÑžÑталюе $(^NameDA) на Ваш камп'ютар.$\r$\n$\r$\nПерад уÑталÑваннем прапануем закрыць уÑе праграмы, ÑÐºÑ–Ñ Ð²Ñ‹ÐºÐ¾Ð½Ð²Ð°ÑŽÑ†Ñ†Ð° на дадзены момант. ГÑта дапаможа ÑžÑталёўшчыку абнавіць ÑÑ–ÑÑ‚ÑÐ¼Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ без перазапуÑку камп'ютара.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ð’Ñ‹ вырашылі выдаліць $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ГÑта праграма выдаліць $(^NameDA) з Вашага камп'ютара.$\r$\n$\r$\nПерад выдаленнем пераканайцеÑÑ Ñž тым, што праграма $(^NameDA) не запушчана.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лiцензiйнае пагадненне" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ уÑталÑваннем $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Калi Ð’Ñ‹ прымаеце ўмовы Лiцензiйнага пагадненнÑ, націÑніце кнопку $\"ПрынÑць$\". ГÑта неабходна Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Калi Ð’Ñ‹ прымаеце ўмовы Лiцензiйнага пагадненнÑ, націÑніце на ÑцÑжок ніжÑй. ГÑта неабходна Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Калi Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, выберыце першы варыÑнт з прапанаваных ніжÑй. ГÑта неабходна Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "ЛіцÑнзійнае пагадненне" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Калі лаÑка, прачытайце ўмовы ЛіцÑнзійнага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð°Ð´ выдаленнем $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, націÑніце кнопку $\"ПрынÑць$\". ГÑта неабходна Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, націÑніце на ÑцÑжок ніжÑй. ГÑта неабходна Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Калі Ð’Ñ‹ прымаеце ўмовы ЛіцÑнзійнага пагадненнÑ, выберыце першы варыÑнт з прапанаваных ніжÑй. ГÑта неабходна Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ñ‹. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ВыкарыÑтоўвайце кнопкi $\"PageUp$\" i $\"PageDown$\" Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð¼ÑшчÑÐ½Ð½Ñ Ð¿Ð° Ñ‚ÑкÑце." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Кампаненты праграмы, ÑÐºÐ°Ñ ÑžÑталёўваецца" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Выберыце кампаненты $(^NameDA), ÑÐºÑ–Ñ Ð’Ñ‹ жадаеце ÑžÑталÑваць." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Кампаненты праграмы" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Выберыце кампаненты $(^NameDA), ÑÐºÑ–Ñ Ð’Ñ‹ жадаеце выдаліць." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ÐпіÑанне" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ПерамÑÑціце курÑор мышы на назву кампанента, каб прачытаць Ñго апіÑанне." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Выберыце кампанент, каб прачытаць Ñго апіÑанне." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Выбар папкі Ð´Ð»Ñ ÑžÑталÑваннÑ" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Выберыце папку, у Ñкую патрÑбна ÑžÑталÑваць $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Выбар папкі Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Выберыце папку, з Ñкой патрÑбна выдаліць $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "КапіÑванне файлаў" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Пачакайце, калі лаÑка, выконваецца капіÑванне файлаў $(^NameDA) на Ваш камп'ютар..." ${LangFileString} MUI_TEXT_FINISH_TITLE "УÑталÑванне завершана" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "УÑталÑванне паÑпÑхова завершана." ${LangFileString} MUI_TEXT_ABORT_TITLE "УÑталÑванне перарвана" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "УÑталÑванне не завершана." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Выдаленне" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Пачакайце, калі лаÑка, выконваецца выдаленне файлаў $(^NameDA) з Вашага камп'ютара..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Выдаленне завершана" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Выдаленне праграмы паÑпÑхова завершана." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Выдаленне перарвана" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Выдаленне выканана не поўнаÑцю." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ЗаканчÑнне ÑžÑталÑÐ²Ð°Ð½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "УÑталÑванне $(^NameDA) выканана.$\r$\n$\r$\nÐаціÑніце кнопку $\"Гатова$\", каб выйÑці." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Каб завершыць уÑталÑванне $(^NameDA), неабходна перазапуÑціць камп'ютар. Ці жадаеце Ð’Ñ‹ зрабіць гÑта зараз?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ЗаканчÑнне Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Выдаленне $(^NameDA) з Вашага камп'ютара выканана.$\r$\n$\r$\nÐаціÑніце кнопку $\"Гатова$\"каб выйÑці." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Каб завершыць выдаленне $(^NameDA), неабходна перазапуÑціць камп'ютар. Ці жадаеце Ð’Ñ‹ зрабіць гÑта зараз?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Так, перазапуÑціць камп'ютар зараз" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ðе, перазапуÑціць камп'ютар пазней" ${LangFileString} MUI_TEXT_FINISH_RUN "&ЗапуÑціць $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Паказаць інфармацыю аб праграме" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Гатова" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Папка Ñž меню $\"ПуÑк$\"" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Выберыце папку Ñž меню $\"ПуÑк$\" Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÑшчÑÐ½Ð½Ñ Ñрлыкоў праграмы." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Выберыце папку Ñž меню $\"ПуÑк$\", куды будуць змешчаны Ñрлыкі праграмы. Ð’Ñ‹ такÑама можаце ўвеÑці іншае Ñ–Ð¼Ñ Ð¿Ð°Ð¿ÐºÑ–." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ðе Ñтвараць Ñрлыкі" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Выдаленне $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Выдаленне $(^NameDA) з Вашага камп'ютара." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ð’Ñ‹ Ñапраўды жадаеце ÑкаÑаваць уÑталÑванне $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ð’Ñ‹ Ñапраўды жадаеце ÑкаÑаваць выдаленне $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Выбраць карыÑтальнікаў" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Выберыце, Ð´Ð»Ñ Ñкіх карыÑтальнікаў Ð’Ñ‹ хочаце уÑталÑваць $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Выберыце, ÑžÑталёўваць $(^NameDA) толькі Ð´Ð»Ñ ÑÑбе або Ð´Ð»Ñ ÑžÑÑ–Ñ… карыÑтальнікаў гÑтага камп'ютара. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "УÑталÑваць Ð´Ð»Ñ ÑžÑÑ–Ñ… карыÑтальнікаў" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "УÑталÑваць толькі Ð´Ð»Ñ Ð±Ñгучага карыÑтальніка" !endif nsis-3.11/Contrib/Language files/Bosnian.nlf000077500000000000000000000123241477201124000207150ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 5146 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Salih CAVKIC, cavkic@skynet.be # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Instalacija # ^UninstallCaption $(^Name) Uklanjanje # ^LicenseSubCaption : Licencno pravo koriÅ¡tenja # ^ComponentsSubCaption : Opcije instalacije # ^DirSubCaption : Izbor mape za instalaciju # ^InstallingSubCaption : Instaliranje # ^CompletedSubCaption : ZavrÅ¡eno # ^UnComponentsSubCaption : Opcije uklanjanja # ^UnDirSubCaption : Mapa uklanjanja # ^ConfirmSubCaption : Potvrda # ^UninstallingSubCaption : Uklanjanje # ^UnCompletedSubCaption : ZavrÅ¡eno uklanjanje # ^BackBtn < &Nazad # ^NextBtn &Dalje > # ^AgreeBtn &Prihvatam # ^AcceptBtn &Prihvatam uvjete licencnog ugovora # ^DontAcceptBtn &Ne prihvatam uvjete licencnog ugovora # ^InstallBtn &Instaliraj # ^UninstallBtn &Ukloni # ^CancelBtn Odustani # ^CloseBtn &Zatvori # ^BrowseBtn &Pregledaj... # ^ShowDetailsBtn Prikaži &detalje # ^ClickNext Pritisnite dugme 'Dalje' za nastavak. # ^ClickInstall Pritisnite dugme 'Instaliraj' za poÄetak instalacije. # ^ClickUninstall Pritisnite dugme 'Ukloni' za poÄetak uklanjanja. # ^Name Ime # ^Completed ZavrÅ¡eno # ^LicenseText Molim proÄitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'. # ^LicenseTextCB Molim proÄitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, oznaÄite donji kvadratić. $_CLICK # ^LicenseTextRB Molim proÄitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK # ^UnLicenseText Molim proÄitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'. # ^UnLicenseTextCB Molim proÄitajte licencu prije uklanjanja programa $(^NameDA). Ako prihvatate sve uvjete ugovora, obilježite donji kvadratić. $_CLICK # ^UnLicenseTextRB Molim proÄitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu opciju ispod. $_CLICK # ^Custom PodeÅ¡avanje # ^ComponentsText OznaÄite komponente koje želite instalirati. Instaliraju se samo oznaÄene komponente. Uklonite oznaku sa onih koje ne želite instalirati. $_CLICK # ^ComponentsSubText1 Izaberite tip instalacije: # ^ComponentsSubText2_NoInstTypes Odaberite komponente za instalaciju: # ^ComponentsSubText2 Ili po izboru oznaÄite komponente koje želite instalirati: # ^UnComponentsText OznaÄite komponente koje želite ukloniti. Uklonite oznaku sa onih koje ne želite ukloniti. $_CLICK # ^UnComponentsSubText1 Izaberite tip uklanjanja: # ^UnComponentsSubText2_NoInstTypes Izaberite komponente za uklanjanje: # ^UnComponentsSubText2 Ili po izboru odaberite komponente koje želite da uklonite: # ^DirText Program $(^NameDA) će biti instaliran u sljedeću mapu. Za instalaciju na neku drugu mapu odaberite 'Pregledaj...' i odaberite drugu mapu. $_CLICK # ^DirSubText OdrediÅ¡na mapa # ^DirBrowseText Izaberite mapu u koju želite instalirati program $(^NameDA): # ^UnDirText Program $(^NameDA) će biti uklonjen iz navedene mape. Za uklanjanje iz druge mape odaberite 'Pregledaj...' i oznaÄite drugu mapu. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Izaberite mapu iz koje ćete program $(^NameDA) ukloniti: # ^SpaceAvailable "Slobodno prostora na disku: " # ^SpaceRequired "Potrebno prostora na disku: " # ^UninstallingText Program $(^NameDA) će biti uklonjen iz sljedeće mape. $_CLICK # ^UninstallingSubText Uklanjanje iz: # ^FileError GreÅ¡ka prilikom otvaranja datoteke za upisivanje: \r\n\t"$0"\r\n\"Odustani\" za prekid instalacije,\r\n\"Ponovi\" za ponovni pokuÅ¡aj upisivanja, ili\r\n\"IgnoriÅ¡i\" za zanemarenje te datoteke # ^FileError_NoIgnore GreÅ¡ka prilikom otvaranja datoteke za upisivanje: \r\n\t"$0"\r\n\"Ponovi\" za ponovni pokuÅ¡aj zapisivanja, ili\r\n\"Odustani\" za prekid instalacije # ^CantWrite "Nemoguće upisati: " # ^CopyFailed GreÅ¡ka prilikom kopiranja # ^CopyTo "Kopiraj u " # ^Registering "Prijava: " # ^Unregistering "Odjava: " # ^SymbolNotFound "Nemoguće naći simbol: " # ^CouldNotLoad "Nemoguće uÄitavanje: " # ^CreateFolder "Napravi mapu: " # ^CreateShortcut "Napravi preÄicu: " # ^CreatedUninstaller "Program za uklanjanje: " # ^Delete "ObriÅ¡i datoteku: " # ^DeleteOnReboot "ObriÅ¡i prilikom ponovnog pokretanja: " # ^ErrorCreatingShortcut "GreÅ¡ka prilikom kreiranja preÄica: " # ^ErrorCreating "GreÅ¡ka prilikom kreiranja: " # ^ErrorDecompressing GreÅ¡ka prilikom otpakivanja podataka! OÅ¡tećen instalacijski program? # ^ErrorRegistering GreÅ¡ka prilikom prijavljivanja DLLa # ^ExecShell "ExecShell: " # ^Exec "IzvrÅ¡i: " # ^Extract "Otpakuj: " # ^ErrorWriting "Otpakivanje: greÅ¡ka upisivanja u datoteku " # ^InvalidOpcode OÅ¡tećena instalacijska datoteka: neispravna opkoda # ^NoOLE "Nema OLE za: " # ^OutputFolder "Izlazna mapa: " # ^RemoveFolder "ObriÅ¡i mapu: " # ^RenameOnReboot "Preimenuj prilikom ponovnog startovanja: " # ^Rename "Preimenuj: " # ^Skipped "PreskoÄeno: " # ^CopyDetails Kopiraj detalje na Klembord # ^LogInstall Logiraj zapisnik procesa instalacije # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Bosnian.nsh000077500000000000000000000170471477201124000207350ustar00rootroot00000000000000;Language: Bosnian (5146) ;By Salih ÄŒavkić, cavkic@skynet.be !insertmacro LANGFILE "Bosnian" = "Bosanski" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li u program za instalaciju $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ovaj program će instalirati $(^NameDA) na VaÅ¡ sistem. $\r$\n$\r$\nPreporuÄujemo da neizostavno zatvorite sve druge otvorene programe prije nego Å¡to definitivno zapoÄnete sa instaliranjem. To će omogućiti bolju nadogradnju odreÄ‘enih sistemskih datoteka bez potrebe da VaÅ¡ raÄunar ponovo startujete. Instaliranje programa možete prekinuti pritiskom na dugme 'Odustani'.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li u postupak uklanjanja programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ovaj će Vas vodiÄ provesti kroz postupak uklanjanja programa $(^NameDA).$\r$\n$\r$\nPrije samog poÄetka, molim zatvorite program $(^NameDA) ukoliko je sluÄajno otvoren.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licencni ugovor" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Molim proÄitajte licencni ugovor $(^NameDA) prije instalacije programa." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za instalaciju programa $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate uslove licence, oznaÄite donji kvadratić. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licencni ugovor o pravu koriÅ¡tenja" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Molim proÄitajte licencu prije uklanjanja programa $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za uklanjanje programa $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate uslove licence, oznaÄite donji kvadratić. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pritisnite 'Page Down' na tastaturi za ostatak licence." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti za instalaciju" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izaberite komponente programa $(^NameDA) koje želite instalirati." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti za uklanjanje" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izaberite komponente programa $(^NameDA) koje želite ukloniti." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite kursor od miÅ¡a iznad komponente da biste vidjeli njezin opis." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selektirajte jednu komponentu da vidite njezin opis." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Odaberite odrediÅ¡te za instalaciju" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Odaberite mapu u koju želite instalirati program $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izaberite polaziÅ¡te za uklanjanje" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Selektirajte mapu iz koje želite ukloniti program $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instaliranje" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Molim priÄekajte na zavrÅ¡etak instalacije programa $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Kraj instalacije" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je u potpunosti uspjeÅ¡no zavrÅ¡ila." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacija je prekinuta" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija nije zavrÅ¡ila uspjeÅ¡no." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uklanjanje" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Molim Vas priÄekajte da vodiÄ zavrÅ¡i uklanjanje $(^NameDA) programa." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uklanjanje je zavrÅ¡eno" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uklanjanje je u potpunosti zavrÅ¡ilo uspjeÅ¡no." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uklanjanje je prekinuto" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uklanjanje nije zavrÅ¡ilo uspjeÅ¡no." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "DovrÅ¡avanje instalacije programa $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na VaÅ¡e raÄunar.$\r$\n$\r$\nPritisnite dugme 'Kraj' za zavrÅ¡etak." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "RaÄunar treba ponovno startovati za dovrÅ¡avanje instalacije programa $(^NameDA). Želite li to uÄiniti sada?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ZavrÅ¡etak uklanjanja programa $(^NameDA) sa VaÅ¡eg sistema." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je uklonjen sa VaÅ¡eg raÄunara.$\r$\n$\r$\nPritisnite dugme 'Kraj' za zatvaranje ovog prozora." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "VaÅ¡ raÄunar trebate ponovno startovati da dovrÅ¡ite uklanjanje programa $(^NameDA). Želite li da odmah sad ponovo startujete raÄunar?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Startuj raÄunar odmah sad" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ponovno ću pokrenuti raÄunar kasnije" ${LangFileString} MUI_TEXT_FINISH_RUN "&Pokreni program $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži datoteku &Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Kraj" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor mape u Start meniju" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izaberite ime za programsku mapu unutar Start menija." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izaberite jednu mapu u Start meniju u kojoj želite da se kreiraju preÄice programa. Možete takoÄ‘er unijeti ime za novu mapu ili selektirati već postojeću." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nemojte praviti preÄice" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uklanjanje programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Program $(^NameDA) će biti uklonjen sa VaÅ¡eg raÄunara." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti instalaciju programa $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti uklanjanje $(^Name) programa?" !endif nsis-3.11/Contrib/Language files/Breton.nlf000077500000000000000000000126621477201124000205620ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1150 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by KAD-Korvigelloù an Drouizig (drouizig@drouizig.org) # ^Branding Nullsoft Install System %s # ^SetupCaption Staliañ ha kefluniañ $(^Name) # ^UninstallCaption Distaliañ $(^Name) # ^LicenseSubCaption : Aotre arverañ # ^ComponentsSubCaption : Dibaboù staliañ # ^DirSubCaption : Kavlec'h staliañ # ^InstallingSubCaption : O staliañ ar restroù # ^CompletedSubCaption : Echu eo # ^UnComponentsSubCaption : Dibaboù distaliañ # ^UnDirSubCaption : Kavlec'h distaliañ # ^ConfirmSubCaption : Kadarnañ # ^UninstallingSubCaption : O tistaliañ ar restroù # ^UnCompletedSubCaption : Echu eo # ^BackBtn < &Kent # ^NextBtn &War-lerc'h > # ^AgreeBtn &A-du emaon # ^AcceptBtn &Degemer holl dermoù al lañvaz emglev # ^DontAcceptBtn &Chom hep degemer termoù al lañvaz emglev # ^InstallBtn &Staliañ # ^UninstallBtn &Distaliañ # ^CancelBtn Nullañ # ^CloseBtn &Serriñ # ^BrowseBtn F&urchal... # ^ShowDetailsBtn Muioc'h a &ditouroù # ^ClickNext Klikit war « War-lerc'h » evit mont war-raok. # ^ClickInstall Klikit war « Staliañ » evit kregiñ gant ar staliadur. # ^ClickUninstall Klikit war « Distaliañ » evit kregiñ gant an distaliadur. # ^Name Anv # ^Completed Echu eo # ^LicenseText Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war « A-du emaon ». # ^LicenseTextCB Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK # ^LicenseTextRB Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, dizuzit an dibab kentañ a-zindan. $_CLICK # ^UnLicenseText Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war « A-du emaon ». # ^UnLicenseTextCB Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK # ^UnLicenseTextRB Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, diuzit an dibab kentañ a-zindan. $_CLICK # ^Custom Diouzh ho kiz # ^ComponentsText Dibabit an elfennoù a fell deoc'h staliañ pe diziuzit an elfennoù a fell deoc'h leuskel a-gostez. $_CLICK # ^ComponentsSubText1 Dibabit pe seurt staliañ a vo : # ^ComponentsSubText2_NoInstTypes Dibabit an elfennoù da staliañ : # ^ComponentsSubText2 Pe dibabit an elfennoù diret a fell deoc'h staliañ : # ^UnComponentsText Dibabit an elfennoù a fell deoc'h distaliañ pe diziuzit an elfennoù a fell deoc'h mirout. $_CLICK # ^UnComponentsSubText1 Dibabit peseurt distaliañ a vo : # ^UnComponentsSubText2_NoInstTypes Dibabit an elfennoù da zistaliañ : # ^UnComponentsSubText2 Pe dibabit an elfennoù diret a fell deoc'h distaliañ : # ^DirText Staliet e vo $(^NameDA) gant ar goulev-mañ er c'havlec'h da-heul. Mar fell deoc'h dibab ur c'havlec'h all, klikit war « Furchal » ha dibabit ur c'havlec'h all. $_CLICK # ^DirSubText Kavlec'h bukenn # ^DirBrowseText Dibabit ar c'havlec'h e vo diazezet $(^NameDA) ennañ : # ^UnDirText Distaliet e vo $(^NameDA) gant ar goulev-mañ adalek ar c'havlec'h da heul. Ma fell deoc'h distaliañ adalek ur c'havlec'h all, klikit war « Furchal » ha diuzit ur c'havlec'h all. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Diuzit ar c'havlec'h evit distaliañ $(^NameDA) adalek : # ^SpaceAvailable "Egor kantenn vak : " # ^SpaceRequired "Egor kantenn rekis : " # ^UninstallingText Distaliet e vo $(^NameDA) adalek ar c'havelec'h da-heul. $_CLICK # ^UninstallingSubText Distaliañ adalek : # ^FileError Fazi en ur zigeriñ ur restr evit skrivañ : \r\n\r\n$0\r\n\r\nKlikit war « Paouez » evit paouez gant ar staliañ,\r\n« Adober » evit eseañ en-dro, pe\r\n« Tremen » evit leuskel a-gostez ar restr-mañ. # ^FileError_NoIgnore Fazi en ur zigeriñ ur restr a-benn skrivañ : \r\n\r\n$0\r\n\r\nKlikit war « Adober » evit esaeañ en-dro, pe\r\nwar « Nullañ » evit paouez gant ar staliañ. # ^CantWrite "N'haller ket skrivañ : " # ^CopyFailed Kopiañ faziet # ^CopyTo "Kopiañ da " # ^Registering "Oc'h enskrivañ : " # ^Unregistering "O tienskrivañ : " # ^SymbolNotFound "N'haller ket kavout ur simbolenn : " # ^CouldNotLoad "N'haller ket kargañ : " # ^CreateFolder "Krouiñ kavlec'h : " # ^CreateShortcut "Krouiñ berradenn : " # ^CreatedUninstaller "Skoazeller distaliañ krouet : " # ^Delete "Dilemel restr : " # ^DeleteOnReboot "Dilemel en ur adloc'hañ : " # ^ErrorCreatingShortcut "Fazi en ur grouiñ berradenn : " # ^ErrorCreating "Fazi en ur grouiñ : " # ^ErrorDecompressing Fazi en ur ziwaskañ stlenn ! Skoazeller staliañ gwastet ? # ^ErrorRegistering Fazi en ur enskrivañ an DLL # ^ExecShell "ExecShell : " # ^Exec "Lañsañ : " # ^Extract "Eztennañ : " # ^ErrorWriting "Eztennañ : fazi en ur skrivañ restr " # ^InvalidOpcode Skoazeller staliañ gwastet : opcode direizh # ^NoOLE "OLE ebet evit : " # ^OutputFolder "Kavlec'h ec'hank : " # ^RemoveFolder "Dilemel ar c'havlec'h : " # ^RenameOnReboot "Adenvel pa vez adloc'het : " # ^Rename "Adenvel : " # ^Skipped "Laosket a-gostez: " # ^CopyDetails Kopiañ ar munudoù er golver # ^LogInstall Tresañ an argerzh staliañ # ^Byte E # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Breton.nsh000077500000000000000000000166151477201124000205750ustar00rootroot00000000000000;Language: Breton (1150) ;By KAD-Korvigelloù An Drouizig !insertmacro LANGFILE "Breton" = "Brezhoneg" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Degemer mat e skoazeller staliañ $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Sturiet e viot gant ar skoazeller-mañ evit staliañ $(^NameDA).$\r$\n$\r$\nGwelloc'h eo serriñ pep arload oberiant er reizhiad a-raok mont pelloc'h gant ar skoazeller-mañ. Evel-se e c'heller nevesaat ar restroù reizhiad hep rankout adloc'hañ hoc'h urzhiataer.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Degemer mat er skoazeller distaliañ $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Sturiet e viot gant ar skoazeller-mañ a-benn distaliañ $(^NameDA).$\r$\n$\r$\nEn em asurit n'eo ket lañset $(^NameDA) a-raok mont pelloc'h gant an distaliañ.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lañvaz emglev" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bezit aketus en ur lenn pep term eus al lañvaz a-raok staliañ $(^NameDA), mar plij." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Mar degemerit pep term eus al lañvaz, klikit war « War-lerc'h ». Ret eo deoc'h degemer al lañvaz evit staliañ $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Mar degemerit pep term eus al lañvaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lañvaz a-benn staliañ $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Mar degemerit pep term eus al lañvaz, diuzit an dibab kentañ a-zindan. Ret eo deoc'h degemer al lañvaz a-benn staliañ $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lañvaz emglev" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Trugarez da lenn al lañvaz a-raok distaliañ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Mar degemerit pep term eus al lañvaz, klikit war « A-du emaon » evit kenderc'hel. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Mar degemerit pep term eus al lañvaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Mar degemerit pep term eus al lañvaz, dizuit an dibab kentañ a-zindan. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pouezit war « Pajenn a-raok » evit lenn ar pajennoù eus al lañvaz da-heul." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Dibab elfennoù" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Dibabit pe elfenn(où) $(^NameDA) a fell deoc'h staliañ." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dibabit elfennoù" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Dibabit pe elfenn(où) $(^NameDA) a fell deoc'h distaliañ." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Deskrivadenn" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Lakait ho logodenn a-zioc'h an elfenn evit gwelout he deskrivadenn." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Diuzuit an elfenn evit gwelout he deskrivadenn." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Dibabit al lec'hiadur staliañ" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Dibabit ar c'havlec'h ma vo lakaet $(^NameDA) ennañ." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dibabit al lec'hiadur distaliañ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Dibabit ar c'havlec'h e vo dilamet $(^NameDA) dioutañ." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "O staliañ" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Gortozit mar plij, emañ $(^NameDA) o vezañ staliet." ${LangFileString} MUI_TEXT_FINISH_TITLE "Echu eo gant ar staliañ" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Kaset eo bet da benn mat ar staliañ." ${LangFileString} MUI_TEXT_ABORT_TITLE "Staliañ paouezet" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "N'eo ket bet kaset da benn mat ar staliañ." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O tistaliañ" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Gortozit mar plij, emañ $(^NameDA) o vezañ distaliet." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Echu eo gant an distaliañ" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Gant berzh eo bet kaset da benn an distaliañ." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Distaliañ paouezet" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "N'eo ket bet kaset da benn mat an distaliañ." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Oc'h echuiñ staliañ $(^NameDA) gant ar skoazeller" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Staliet eo bet $(^NameDA) war hoc'h urzhiataer.$\r$\n$\r$\nKlikit war « Echuiñ » evit serriñ ar skoazeller-mañ." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ret eo hoc'h urzhiataer bezañ adloc'het evit ma vez kaset da benn staliañ $(^NameDA). Ha fellout a ra deoc'h adloc'hañ diouzhtu ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Oc'h echuiñ distaliañ $(^NameDA) gant ar skoazeller" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Distaliet eo bet $(^NameDA) diouzh hoc'h urzhiataer.$\r$\n$\r$\nKlikit war « Echuiñ » evit serriñ ar skoazeller-mañ." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ret eo hoc'h urzhiataer bezañ adloc'het evit ma vez kaset da benn distaliañ $(^NameDA). Ha fellout a ra deoc'h adloc'hañ diouzhtu ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Adloc'hañ diouzhtu" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Fellout a ra din adloc'hañ diwezatoc'h dre zorn" ${LangFileString} MUI_TEXT_FINISH_RUN "&Lañsañ $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Diskouez ar restr Malennit" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Echuiñ" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Diskouez kavlec'h al Lañser loc'hañ" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dibabit ur c'havlec'h Lañser loc'hañ evit berradennoù $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Diuzit ar c'havlec'h Lañser loc'hañ e vo savet ennañ berradennoù ar goulevioù. Gallout a rit ingal reiñ un anv evit sevel ur c'havlec'h nevez." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Chom hep sevel berradennoù" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Distaliañ $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dilemel $(^NameDA) adalek hoc'h urzhiataer." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ha sur oc'h e fell deoc'h kuitaat staliañ $(^Name) ?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ha sur oc'h e fell deoc'h kuitaat distaliañ $(^Name) ?" !endif nsis-3.11/Contrib/Language files/Bulgarian.nlf000077500000000000000000000177171477201124000212430ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1026 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Asparouh Kalyandjiev # Updated v2 to v6 by Plamen Penkov # Updated by Кирил Кирилов (DumpeR) # # ^Branding Nullsoft Install System %s # ^SetupCaption ИнÑталиране на $(^Name) # ^UninstallCaption Изтриване на $(^Name) #^LicenseSubCaption : Лицензионно Ñпоразумение #^ComponentsSubCaption : Опции за инÑталиране # ^DirSubCaption : ИнÑталиране в папка #^InstallingSubCaption : ИнÑталиране #^CompletedSubCaption : Завършване # ^UnComponentsSubCaption : Опции за изтриване # ^UnDirSubCaption : Изтриване от папка # ^ConfirmSubCaption : Потвърждение #^UninstallingSubCaption : Изтриване #^UnCompletedSubCaption : Завършване # ^BackBtn < &Ðазад #^NextBtn Ð&апред > # ^AgreeBtn &СъглаÑен # ^AcceptBtn &СъглаÑен Ñъм Ñ ÑƒÑловиÑта на Лицензионното Ñпоразумение. # ^DontAcceptBtn &Ðе Ñъм ÑъглаÑен Ñ ÑƒÑловиÑта на Лицензионното Ñпоразумение. # ^InstallBtn &ИнÑталирай #^UninstallBtn &Изтрий # ^CancelBtn &Отказ #^CloseBtn &Затвори #^BrowseBtn П&реглед... #^ShowDetailsBtn &Детайли # ^ClickNext ÐатиÑнете "Ðапред", за да продължите. # ^ClickInstall ÐатиÑнете "ИнÑталирай", за да започне инÑталирането. # ^ClickUninstall ÐатиÑнете "Изтрий", за да започне изтриването. # ^Name Име #^Completed Край # ^LicenseText ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÑ‚Ðµ Лицензионното Ñпоразумение преди да инÑталирате $(^NameDA). Ðко приемате вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° Ñпоразумението, натиÑнете "СъглаÑен". # ^LicenseTextCB ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÑ‚Ðµ Лицензионното Ñпоразумение преди да инÑталирате $(^NameDA). Ðко приемате вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° Ñпоразумението, Ñложете отметка в полето по-долу. $_CLICK # ^LicenseTextRB ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÑ‚Ðµ Лицензионното Ñпоразумение преди да инÑталирате $(^NameDA). Ðко приемате вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° Ñпоразумението, изберете първата Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾-долу. $_CLICK # ^UnLicenseText ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÑ‚Ðµ Лицензионното Ñпоразумение преди да изтриете $(^NameDA). Ðко приемате вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° Ñпоразумението, натиÑнете "СъглаÑен". # ^UnLicenseTextCB ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÑ‚Ðµ Лицензионното Ñпоразумение преди да изтриете $(^NameDA). Ðко приемате вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° Ñпоразумението, Ñложете отметка в полето по-долу. $_CLICK # ^UnLicenseTextRB ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÑ‚Ðµ Лицензионното Ñпоразумение преди да изтриете $(^NameDA). Ðко приемате вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° Ñпоразумението, изберете първата Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾-долу. $_CLICK # ^Custom ИнÑталиране по избор #^ComponentsText Изберете компонентите, които иÑкате да бъдат инÑталирани. $_CLICK #^ComponentsSubText1 Изберете тип инÑталиране: #^ComponentsSubText2_NoInstTypes Изберете компоненти: #^ComponentsSubText2 Или изберете компонентите, които иÑкате да бъдат инÑталирани: # ^UnComponentsText Сложете отметка пред компонентите, които иÑкате да изтриете, а тези които не иÑкате да изтриете оÑтавете без отметка. $_CLICK # ^UnComponentsSubText1 Изберете типа на изтриване: # ^UnComponentsSubText2_NoInstTypes Изберете компонентите за изтриване: # ^UnComponentsSubText2 Или, изберете допълнителни компоненти за изтриване: # ^DirText Програмата ще инÑталира $(^NameDA) в поÑочената папка. За да инÑталирате в друга папка, натиÑнете "Преглед" и изберете друга папка. $_CLICK # ^DirSubText Целева папка # ^DirBrowseText Изберете папка, в коÑто да Ñе инÑталира $(^NameDA): # ^UnDirText Програмата ще изтрие $(^NameDA) от Ñледната папка. За да изтриете от друга папка, натиÑнете "Преглед" и изберете друга папка. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Изберете папката от коÑто да Ñе изтрие $(^NameDA): # ^SpaceAvailable "Свободно проÑтранÑтво: " #^SpaceRequired "Ðеобходимо проÑтранÑтво: " # ^UninstallingText $(^NameDA) ще бъде изтрита от Ñледната папка. $_CLICK # ^UninstallingSubText Изтриване от: # ^FileError Грешка при отварÑне на файла за запиÑ: \r\n\t"$0"\r\nÐатиÑнете "Прекрати", за да прекратите инÑталирането, "Повтори", за да опитате отново или "Игнорирай", за да пропуÑнете този файл # ^FileError_NoIgnore Грешка при отварÑне на файла за запиÑ: \r\n\t"$0"\r\nÐатиÑнете "Повтори", за да опитате отново или "Прекрати", за да прекратите инÑталирането. # ^CantWrite "ÐеуÑпешно запиÑване на: " #^CopyFailed Копирането неуÑпешно # ^CopyTo "Копиране на " # ^Registering "РегиÑтриране на: " # ^Unregistering "ДерегиÑтриране на: " #^SymbolNotFound "Символът не е намерен: " # ^CouldNotLoad "ÐеуÑпешно зареждане на: " # ^CreateFolder "Създаване на папка: " # ^CreateShortcut "Създаване на прÑк път: " #^CreatedUninstaller "Създаване на програма за изтриване: " # ^Delete "Изтриване на: " #^DeleteOnReboot "Изтриване Ñлед реÑтарт: " #^ErrorCreatingShortcut "Грешка при Ñъздаване на Ð¿Ñ€ÐµÐºÐ¸Ñ Ð¿ÑŠÑ‚: " #^ErrorCreating "Грешка при Ñъздаване на: " # ^ErrorDecompressing Грешка при декомпреÑиране на данните! ВероÑтно инÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚ е повреден. # ^ErrorRegistering Грешка при региÑтриране на DLL #^ExecShell "ExecShell: " #^Exec "Изпълнение на: " #^Extract "Извличане на: " #^ErrorWriting "Извличане на: грешка при Ð·Ð°Ð¿Ð¸Ñ Ð²ÑŠÐ² файл " #^InvalidOpcode Пакета е повреден: грешен код на Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ # ^NoOLE "ÐÑма OLE за: " #^OutputFolder "ИнÑталиране в папка: " #^RemoveFolder "Изтриване на папка: " #^RenameOnReboot "Преименуване при реÑтарт: " # ^Rename "Преименуване на: " #^Skipped "ПропуÑкане на: " # ^CopyDetails Копиране на данните в буфера # ^LogInstall ЗапиÑване на отчет за инÑталирането # ^Byte Б # ^Kilo К # ^Mega М # ^Giga Г nsis-3.11/Contrib/Language files/Bulgarian.nsh000077500000000000000000000240051477201124000212400ustar00rootroot00000000000000;Language: Bulgarian (1026) ;Translated by Asparouh Kalyandjiev [acnapyx@sbline.net] ;Review and update from v1.63 to v1.68 by Plamen Penkov [plamen71@hotmail.com] ;Updated by Кирил Кирилов (DumpeR) [dumper@data.bg] ; !insertmacro LANGFILE "Bulgarian" = "БългарÑки" "Balgarski" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Добре дошли в Съветника за инÑталиране на $(^NameDA)!" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Той ще инÑталира $(^NameDA) на Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€.$\r$\n$\r$\nПрепоръчва Ñе да затворите вÑички други приложениÑ, преди да продължите. Това ще позволи на програмата да обнови нÑкои ÑиÑтемни файлове, без да Ñе реÑтартира компютъра.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Добре дошли в Съветника за изтриване на $(^NameDA)!" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Той ще ви помогне да изтриете $(^NameDA) от Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€.$\r$\n$\r$\nПреди да продължите, уверете Ñе че $(^NameDA) не е Ñтартирана в момента.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензионно Ñпоразумение" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ÐœÐ¾Ð»Ñ Ð·Ð°Ð¿Ð¾Ð·Ð½Ð°Ð¹Ñ‚Ðµ Ñе Лицензионното Ñпоразумение преди да продължите." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ðко приемате уÑловиÑта на Ñпоразумението, натиÑнете $\"СъглаÑен$\", за да продължите. ТрÑбва да приемете Ñпоразумението, за да инÑталирате $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ðко приемате уÑловиÑта на Ñпоразумението, Ñложете отметка в полето по-долу. ТрÑбва да приемете Ñпоразумението, за да инÑталирате $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ðко приемате уÑловиÑта на Ñпоразумението, изберете първата Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾-долу. ТрÑбва да приемете Ñпоразумението, за да инÑталирате $(^NameDA) $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензионно Ñпоразумение" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ÐœÐ¾Ð»Ñ Ð·Ð°Ð¿Ð¾Ð·Ð½Ð°Ð¹Ñ‚Ðµ Ñе лицензионните уÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¸ да изтриете $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ðко приемате уÑловиÑта на Ñпоразуменито, натиÑнете $\"СъглаÑен$\" за да продължите. ТрÑбва да приемете Ñпоразумението, за да изтриете $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ðко приемате уÑловиÑта на Ñпоразумението, Ñложете отметка в полето по-долу. ТрÑбва да приемете Ñпоразумението, за да изтриете $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ðко приемате уÑловиÑта на Ñпоразуменито, изберете първата Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾-долу. ТрÑбва да приемете Ñпоразумението, за да изтриете $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÐатиÑнете клавиша $\"Page Down$\", за да видите оÑтаналата чаÑÑ‚ от Ñпоразумението." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Избор на компоненти" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Изберете кои компоненти на $(^NameDA) иÑкате да инÑталирате." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Избор на компоненти" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Изберете кои компоненти на $(^NameDA) иÑкате да изтриете." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ОпиÑание" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Преминете Ñ Ð¼Ð¸ÑˆÐºÐ°Ñ‚Ð° над определен компонент, за да видите опиÑанието му." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Изберете компонент, за да видите опиÑанието му." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Избор на папка за инÑталиране" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Изберете папката, в коÑто да Ñе инÑталира $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Избор на папка за изтриване" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Изберете папката, от коÑто да Ñе изтрие $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ИнÑталиране" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Изчакайте, инÑталират Ñе файловете на $(^NameDA)..." ${LangFileString} MUI_TEXT_FINISH_TITLE "ИнÑталирането завърши." ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ИнÑталирането завърши уÑпешно." ${LangFileString} MUI_TEXT_ABORT_TITLE "ИнÑталирането прекратено." ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ИнÑталирането не завърши уÑпешно." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Изтриване" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Изчакайте, изтриват Ñе файловете на $(^NameDA)..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Край" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Изтриването завърши уÑпешно." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Изтриването прекратено." ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Изтриването не завърши напълно." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Приключване на Съветника за инÑталиране на $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "ИнÑталирането на $(^NameDA) е завършено.$\r$\n$\r$\nÐатиÑнете бутона $\"Край$\", за да затворите Съветника." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Компютърът трÑбва да бъде реÑтартиран, за да завърши инÑталирането на $(^NameDA). ИÑкате ли да реÑтартирате Ñега?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Приключване на Съветника за изтриване на $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Програмата $(^NameDA) беше изтрита от Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€.$\r$\n$\r$\nÐатиÑнете $\"Край$\" за да затворите този Съветник." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Компютърът ви трÑбва да Ñе реÑтартира, за да приключи уÑпешно изтриването на $(^NameDA). ИÑкате ли да реÑтартирате Ñега?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Да, реÑтартирай Ñега" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ðе, ще реÑтартирам по-къÑно" ${LangFileString} MUI_TEXT_FINISH_RUN "Стартирай $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Покажи файла $\"ReadMe$\"" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Край" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Избор на папка в менюто $\"Старт$\"" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Изберете папка в менюто $\"Старт$\" за преки пътища към програмата." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Изберете папка в менюто $\"Старт$\", в коÑто иÑкате да Ñъздадете преки пътища към програмата. Можете Ñъщо така да въведете име, за да Ñъздадете нова папка." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ðе Ñъздавай преки пътища" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Изтриване на $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Изтриване на $(^NameDA) от Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Сигурни ли Ñте, че иÑкате да прекратите инÑталирането на $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Сигурни ли Ñте, че иÑкате да прекратите изтриването на $(^Name)?" !endif nsis-3.11/Contrib/Language files/Catalan.nlf000077500000000000000000000133061477201124000206700ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1027 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by falanko # Corrections by Toni Hermoso Pulido # ^Branding Nullsoft Install System %s # ^SetupCaption Instal·lació de l'aplicació $(^Name) # ^UninstallCaption Desinstal·lació de l'aplicació $(^Name) # ^LicenseSubCaption : Acord de llicència # ^ComponentsSubCaption : Opcions d'instal·lació # ^DirSubCaption : Carpeta d'instal·lació # ^InstallingSubCaption : S'està instal·lant # ^CompletedSubCaption : S'ha acabat # ^UnComponentsSubCaption : Opcions de desinstal·lació # ^UnDirSubCaption : Carpeta de desinstal·lació # ^ConfirmSubCaption : Confirmació # ^UninstallingSubCaption : S'està desinstal·lant # ^UnCompletedSubCaption : No s'ha acabat # ^BackBtn < En&rere # ^NextBtn En&davant > # ^AgreeBtn Hi estic d'a&cord # ^AcceptBtn &Accepto els termes de l'acord de llicència # ^DontAcceptBtn &No accepto els termes de l'acord de llicència # ^InstallBtn &Instal·la # ^UninstallBtn &Desinstal·la # ^CancelBtn &Cancel·la # ^CloseBtn &Tanca # ^BrowseBtn &Navega... # ^ShowDetailsBtn &Mostra els detalls # ^ClickNext Feu clic a Endavant per a continuar. # ^ClickInstall Feu clic a Instal·la per a iniciar la instal·lació. # ^ClickUninstall Feu clic a Desinstal·la per a iniciar la desinstal·lació. # ^Name Nom # ^Completed S'ha acabat # ^LicenseText Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord. # ^LicenseTextCB Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, activeu la casella de sota. $_CLICK # ^LicesnseTextRB Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. $_CLICK # ^UnLicenseText Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord. # ^UnLicenseTextCB Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, activeu la la casella de sota. $_CLICK # ^UnLicesnseTextRB Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. $_CLICK # ^Custom Personalitzada # ^ComponentsText Activeu els components que voleu instal·lar i desactiveu els que no. $_CLICK # ^ComponentsSubText1 Seleccioneu el tipus d'instal·lació: # ^ComponentsSubText2_NoInstTypes Seleccioneu els components per instal·lar: # ^ComponentsSubText2 O bé, seleccioneu els components opcionals que desitgéssiu instal·lar: # ^UnComponentsText Activeu els components que voleu desinstal·lar i desactiveu els que no. $_CLICK # ^UnComponentsSubText1 Seleccioneu el tipus de desinstal·lació: # ^UnComponentsSubText2_NoInstTypes Seleccioneu els components per desinstal·lar: # ^UnComponentsSubText2 O bé, seleccioneu els components opcionals per desinstal·lar: # ^DirText El programa d'instal·lació instal·larà l'aplicació $(^NameDA) en la següent carpeta. Per a instal·lar-lo en una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK # ^DirSubText Carpeta de destinació # ^DirBrowseText Seleccioneu la carpeta on s'instal·larà l'aplicació $(^NameDA): # ^UnDirText El programa d'instal·lació desinstal·larà l'aplicació $(^NameDA) de la següent carpeta. Per a desinstal·lar-lo d'una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Seleccioneu la carpeta des d'on es desinstal·larà l'aplicació $(^NameDA): # ^SpaceAvailable "Espai lliure: " # ^SpaceRequired "Espai necessari: " # ^UninstallingText Es desinstal·larà l'aplicació $(^NameDA) de la següent carpeta. $_CLICK # ^UninstallingSubTex S'està desinstal·lant de: # ^FileError S'ha produït un error en obrir el fitxer en mode d'escriptura: \r\n\t"$0"\r\nFeu clic a Abandona per a aturar la instal·lació,\r\nReintenta per a tornar-ho a provar, o\r\Ignora per a ometre aquest fitxer. # ^FileError_NoIgnore S'ha produït un error en obrir el fitxer en mode d'escriptura: \r\n\t"$0"\r\nFeu clic a Reintenta per a tornar-ho a provar, o\r\Cancel·la per a aturar la instal·lació. # ^CantWrite "No s'ha pogut escriure: " # ^CopyFailed Ha fallat la còpia # ^CopyTo "Copia a " # ^Registering "S'esta registrant:" # ^Unregistering "S'està suprimint el registre: " # ^SymbolNotFound "No s'ha trobat el símbol: " # ^CouldNotLoad "No s'ha pogut carregar: " # ^CreateFolder "Crea la carpeta: " # ^CreateShortcut "Crea la drecera: " # ^CreatedUninstaller "S'ha creat el desinstal·lador: " # ^Delete "S'ha suprimit el fitxer: " # ^DeleteOnReboot "Suprimeix en reiniciar: " # ^ErrorCreatingShortcut "S'ha produït un error en crear la drecera: " # ^ErrorCreating S'ha produït un error en crear: # ^ErrorDecompressing S'ha produït un error en descomprimir les dades! L'instal·lador està corrupte? # ^ErrorRegistering S'ha produït un error en registrar una DLL # ^ExecShell "Executa l'ordre: " # ^Exec "Executa:" # ^Extract "Extreu: " # ^ErrorWriting "Extreu: s'ha produït un error en escriure el fitxer " # ^InvalidOpcode L'instal·lador està corrupte: el codi d'operació no és vàlid # ^NoOLE "No hi ha OLE per a: " # ^OutputFolder "Carpeta de sortida: " # ^RemoveFolder "Suprimeix la carpeta: " # ^RenameOnReboot "Reanomena en reiniciar: " # ^Rename "Reanomena: " # ^Skipped "S'ha omès: " # ^CopyDetails Copia els detalls al porta-retalls # ^LogInstall Registra el procés d'instal·lació # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Catalan.nsh000077500000000000000000000175341477201124000207100ustar00rootroot00000000000000;Language: Catalan (1027) ;By falanko, corrections by Toni Hermoso Pulido !insertmacro LANGFILE "Catalan" = "Català" "Catala" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvinguts a l'auxiliar d'instal·lació de l'aplicació $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Aquest auxiliar us guiarà durant el procés d'instal·lació de l'aplicació $(^NameDA).$\r$\n$\r$\nEs recomana tancar la resta d'aplicacions abans de començar la instal·lació. Això permetrà al programa d'instal·ació actualitzar fitxers del sistema rellevants sense haver de reiniciar l'ordinador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvinguts a l'auxiliar de desinstal·lació de l'aplicació $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Aquest auxiliar us guiarà a través de la desinstal·lació de l'aplicació $(^NameDA).$\r$\n\rAbans de començar la desinstal·lació, assegureu-vos que l'aplicació $(^NameDA) no s'està executant.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acord de Llicència" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Reviseu els termes de la llicència abans d'instal·lar l'aplicació $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si accepteu tots els termes de l'acord, premeu Hi estic d'acord per a continuar. Heu d'acceptar l'acord per a poder instal·lar l'aplicació $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per poder instal·lar l'aplicació $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. Heu d'acceptar l'acord per a poder instal·lar $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acord de llicència" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Reviseu els termes de la llicència abans de desinstal·lar l'aplicació $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si accepteu tots els termes de l'acord, premeu Hi estic d'Acord per a continuar. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premeu AvPàg per a veure la resta de l'acord." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selecció de components" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccioneu quines característiques de l'aplicació $(^NameDA) desitgeu instal·lar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selecció de components" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccioneu quines característiques de l'aplicació $(^NameDA) desitgeu desinstal·lar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripció" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Situeu el ratolí damunt d'un component per a veure'n la descripció." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Trieu una ubicació d'instal·lació" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Trieu la carpeta on instal·lar-hi l'aplicació $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Trieu la ubicació de desinstal·lació" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Trieu la carpeta d'on desinstal·lar l'aplicació $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "S'està instal·lant" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Si us plau, espereu mentre l'aplicació $(^NameDA) s'instal·la." ${LangFileString} MUI_TEXT_FINISH_TITLE "S'ha acabat la instal·lació" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instal·lació ha acabat correctament." ${LangFileString} MUI_TEXT_ABORT_TITLE "S'ha abandonat la instal·lació" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instal·lació no ha acabat correctament." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "S'està desinstal·lant" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Si us plau, espereu mentre l'aplicació $(^NameDA) es desinstal·la." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "S'ha acabat la desinstal·lació" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstal·lació s'ha realitzat correctament." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "S'ha abandonat la desinstal·lació" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstal·lació no ha acabat correctament." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "S'està acabant l'auxiliar d'instal·lació de l'aplicació $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "L'aplicació $(^NameDA) s'ha instal·lat a l'ordinador.$\r$\n$\r$\nFeu clic a Finalitza per a tancar aquest auxiliar." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Cal reiniciar l'ordinador perquè pugui acabar-se la instal·lació de l'aplicació $(^NameDA). Voleu reiniciar-lo ara?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "S'està acabant l'auxiliar de desinstal·lació de l'aplicació $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "L'aplicació $(^NameDA) s'ha desinstal·lat de l'ordinador.$\r$\n$\r$\nFeu clic a Finalitza per a tancar aquest auxiliar." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Cal reiniciar l'ordinador perquè pugui acabar-se la desinstal·lació de l'aplicació $(^NameDA). Voleu reiniciar-lo ara?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reinicia ara" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reinicia més tard manualment" ${LangFileString} MUI_TEXT_FINISH_RUN "Executa l'aplicació $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostra el Llegeix-me" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finalitza" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Tria la carpeta del menú Inicia" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Tria una carpeta del menú Inicia per a les dreceres de l'aplicació $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccioneu la carpeta del Menú Inicia en la que hi vulgueu crear les dreceres del programa. Podeu introduir-hi un altre nom si voleu crear una carpeta nova." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No creïs les dreceres" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstal·la l'aplicació $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Suprimeix l'aplicació $(^NameDA) de l'ordinador." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Esteu segur que voleu sortir del programa d'instal·lació de l'aplicació $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Esteu segur que voleu sortir del programa de desinstal·lació de l'aplicació $(^Name)?" !endif nsis-3.11/Contrib/Language files/Cibemba.nlf000077500000000000000000000123071477201124000206470ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1537 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page - # RTL - anything else than RTL means LTR - # Translation by ..... (any credits should go here) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Apa Kutampila # ^UninstallCaption $(^Name) Ukufuuta # ^LicenseSubCaption : Ukusuminishanya # ^ComponentsSubCaption : Ifya Kusalapo # ^DirSubCaption : Umuli Ifya Kucita pa Kukopolola # ^InstallingSubCaption : Ilekopolola # ^CompletedSubCaption : Capwa # ^UnComponentsSubCaption : Ifya Kusalapo pa Kufuuta # ^UnDirSubCaption : Umuli Ifya Kucita pa Kufuuta # ^ConfirmSubCaption : Confirmation # ^UninstallingSubCaption : Ilefuuta # ^UnCompletedSubCaption : Capwa # ^BackBtn < &Ku Numa # ^NextBtn &Ifyakonkapo > # ^AgreeBtn Nasumina # ^AcceptBtn Nasumina Ifili mu Kusuminishanya # ^DontAcceptBtn Nakaana Ifili mu Kusuminishanya # ^InstallBtn &Ukukopolola # ^UninstallBtn &Ukufuuta # ^CancelBtn Ukuleka # ^CloseBtn &Ukwisala # ^BrowseBtn Ukufwaya... # ^ShowDetailsBtn Ukumona Fyonse # ^ClickNext Tinikeni pa Ifyakonkapo pa kuti mutwalilile. # ^ClickInstall Tinikeni pa Ukukopolola pa kuti mutendeke ukukopolola. # ^ClickUninstall Tinikeni pa Ukufuuta pa kuti mutendeke ukufuuta. # ^Name Ishina # ^Completed Capwa # ^LicenseText Mukwai pitulukeni mu kusuminishanya ilyo mushilatendeka ukukopolola $(^NameDA). Nga mulesumina fyonse ifili mu kusuminishanya, tinikeni pali Nasumina. # ^LicenseTextCB Mukwai pitulukeni mu kusuminishanya ilyo mushilatendeka ukukopolola $(^NameDA). Nga mulesumina fyonse ifili mu kusuminishanya, tinikeni pa kabokoshi kali pe samba. $_CLICK # ^LicenseTextRB Mukwai pitulukeni mu kusuminishanya ilyo mushilatendeka ukukopolola $(^NameDA). Nga mulesumina fyonse ifili mu kusuminishanya, tinikeni apa kubalilapo pe samba. $_CLICK # ^UnLicenseText Mukwai pitulukeni mu kusuminishanya ilyo mushilatendeka ukufuuta $(^NameDA). Nga mulesumina fyonse ifili mu kusuminishanya, tinikeni pali Nasumina. # ^UnLicenseTextCB Mukwai pitulukeni mu kusuminishanya ilyo mushilatendeka ukufuuta $(^NameDA). Nga mulesumina fyonse ifili mu kusuminishanya, tinikeni pa kabokoshi kali pe samba. $_CLICK # ^UnLicenseTextRB Mukwai pitulukeni mu kusuminishanya ilyo mushilatendeka ukufuuta $(^NameDA). Nga mulesumina fyonse ifili mu kusuminishanya, tinikeni apa kubalilapo pe samba. $_CLICK # ^Custom Custom # ^ComponentsText Saleni ifyo mulefwaya ukukopolola kabili mwisala ifyo mushilefwaya ukukopolola. $_CLICK # ^ComponentsSubText1 Saleni umusango wa kukopolwelamo: # ^ComponentsSubText2_NoInstTypes Saleni ifyo mulefwaya ukukopolola: # ^ComponentsSubText2 Nelyo, saleni ifishikabilwa ifyo mulefwaya ukukopolola: # ^UnComponentsText Saleni ifyo mulefwaya ukufuuta kabili mwisala ifyo mushilefwaya ukufuuta. $_CLICK # ^UnComponentsSubText1 Saleni umusango wa kufuutilamo: # ^UnComponentsSubText2_NoInstTypes Saleni ifyo mulefwaya ukufuuta: # ^UnComponentsSubText2 Nelyo, saleni ifishikabilwa ifyo mulefwaya ukufuuta: # ^DirText Nomba programu yalakopolwela $(^NameDA) mu. Nga mulefwaya ukukopolwela kumbi, tinikeni pa Ukufwaya no kusala kumbi. $_CLICK # ^DirSubText Ukwa Kukopolwela # ^DirBrowseText Saleni ukwa $(^NameDA) kukopolwela: # ^UnDirText Nomba programu yalafuuta $(^NameDA) ukufuma mu. Nga mulefwaya ukufuuta ukufuma kumbi, tinikeni pa Ukufwaya no kusala kumbi. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Saleni ukwa $(^NameDA) kufuutila: # ^SpaceAvailable "Incende iilipo: " # ^SpaceRequired "Incende iilekabilwa: " # ^UninstallingText $(^NameDA) yalafuutwa mu. $_CLICK # ^UninstallingSubText Ukufuuta mu: # ^FileError Tafilekopololwa bwino: \r\n\r\n$0\r\n\r\nTinikeni pa Ukuleka pa kuti muleke ukukopolola,\r\nTinikeni pali Na Kabili pa kuti mweshe na kabili, nelyo\r\n pa Ukutwalilila pa kuti mutwalilile. # ^FileError_NoIgnore Tafilekopololwa bwino: \r\n\r\n$0\r\n\r\nTinikeni pali Na Kabili pa kuti mweshe na kabili, nelyo\r\npa Ukuleka pa kuti muleke ukukopolola. # ^CantWrite "Yakaana: " # ^CopyFailed Yafilwa ukukopolola # ^CopyTo "Ukukopolwela ku " # ^Registering "Registering: " # ^Unregistering "Unregistering: " # ^SymbolNotFound "Could not find symbol: " # ^CouldNotLoad "Could not load: " # ^CreateFolder "Create folder: " # ^CreateShortcut "Create shortcut: " # ^CreatedUninstaller "Created uninstaller: " # ^Delete "Ukufuuta: " # ^DeleteOnReboot "Ikafuuta ilyo mwa-asha kompyuta: " # ^ErrorCreatingShortcut "Error creating shortcut: " # ^ErrorCreating "Error creating: " # ^ErrorDecompressing Error decompressing data! Corrupted installer? # ^ErrorRegistering Error registering DLL # ^ExecShell "ExecShell: " # ^Exec "Execute: " # ^Extract "Extract: " # ^ErrorWriting "Extract: error writing to file " # ^InvalidOpcode Installer corrupted: invalid opcode # ^NoOLE "No OLE for: " # ^OutputFolder "Output folder: " # ^RemoveFolder "Remove folder: " # ^RenameOnReboot "Ukwinika ishina limbi pa kwasha: " # ^Rename "Inikeni Ishina Limbi: " # ^Skipped "Ifikeene: " # ^CopyDetails Copy Details To Clipboard # ^LogInstall Log install process # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Cibemba.nsh000077500000000000000000000112571477201124000206630ustar00rootroot00000000000000;Language: Cibemba (1033) !insertmacro LANGFILE "Cibemba" = "Cibemba" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Apa Kutendekela $(^NameDA) Ukukopolola" #FIXME:MUI_TEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_UNWELCOMEPAGE #FIXME:MUI_UNTEXT_WELCOME_INFO_TITLE #FIXME:MUI_UNTEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ukusuminishanya" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Mukwai belengeni ifili mu kusuminishanya ilyo mushilatendeka ukukopolola $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Nga mwasumina ifili mu kusuminishanya, tinikeni pali Nasumina pa kuti mutwalilile. Mufwile ukusumina ifili mu kusuminishanya pa kuti mukopolole $(^NameDA)." #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_UNLICENSEPAGE #FIXME:MUI_UNTEXT_LICENSE_TITLE #FIXME:MUI_UNTEXT_LICENSE_SUBTITLE #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Kabiyeni pe samba pa kuti mumone fimbi ifili mu kusuminishanya." !endif !ifdef MUI_COMPONENTSPAGE #FIXME:MUI_TEXT_COMPONENTS_TITLE #FIXME:MUI_TEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_UNCOMPONENTSPAGE #FIXME:MUI_UNTEXT_COMPONENTS_TITLE #FIXME:MUI_UNTEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Ubulondoloshi" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE #FIXME:MUI_TEXT_DIRECTORY_TITLE #FIXME:MUI_TEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_UNDIRECTORYPAGE #FIXME:MUI_UNTEXT_DIRECTORY_TITLE #FIXME:MUI_UNTEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ilekopolola" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mukwai loleleni ilyo $(^NameDA) ilekopolola." ${LangFileString} MUI_TEXT_FINISH_TITLE "Yapwa Ukukopolola" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Yakopolola." ${LangFileString} MUI_TEXT_ABORT_TITLE "Yaleka Ukukopolola" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Taikopolwele." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ilefuuta" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mukwai loleleni ilyo $(^NameDA) ilefuuta." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Yapwa Ukufuuta" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Yafuuta." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Yaleka Ukufuuta" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Taifuutike." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ilepwisha $(^NameDA) Ukukopolola" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) Yakopolwela pa kompyuta yenu.$\r$\n$\r$\nTinikeni pa Ukwisala pa kuti mupwishe." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Mufwile ukushimya kompyuta no kuyasha na kabili pa kuti mupwishe ukukopolola $(^NameDA). Bushe mulefwaya ukucita ifi nomba?" !endif !ifdef MUI_UNFINISHPAGE #FIXME:MUI_UNTEXT_FINISH_INFO_TITLE #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT #FIXME:MUI_UNTEXT_FINISH_INFO_REBOOT !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ndefwaya ukushimya no kwasha ili line" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nalacita ifi limbi" ${LangFileString} MUI_TEXT_FINISH_RUN "&Tampeni $(^NameDA)" #FIXME:MUI_TEXT_FINISH_SHOWREADME ${LangFileString} MUI_BUTTONTEXT_FINISH "&Capwa" !endif !ifdef MUI_STARTMENUPAGE #FIXME:MUI_TEXT_STARTMENU_TITLE #FIXME:MUI_TEXT_STARTMENU_SUBTITLE #FIXME:MUI_INNERTEXT_STARTMENU_TOP #FIXME: MUI_INNERTEXT_STARTMENU_CHECKBOX !endif !ifdef MUI_UNCONFIRMPAGE #FIXME:MUI_UNTEXT_CONFIRM_TITLE #FIXME:MUI_UNTEXT_CONFIRM_SUBTITLE !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Bushe ca cine mulefwaya ukuleka $(^Name) Ukukopolola?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Bushe ca cine mulefwaya ukuleka $(^Name) Ukufuuta?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Language files/Corsican.nlf000077500000000000000000000144071477201124000210710ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1155 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything other than RTL means LTR - # Translation by Patriccollu di Santa Maria è Sichè - # Updated on August 9th, 2020 for version 3.06.1 # Created on April 24th, 2016 for version 3.0rc1 # Traduzzione corsa creata è mantinuta da Patriccollu di Santa Maria è Sichè # ^Branding Nullsoft Install System %s # ^SetupCaption Assistente d’installazione di $(^Name) # ^UninstallCaption Disinstallazione di $(^Name) # ^LicenseSubCaption : Cuntrattu di licenza # ^ComponentsSubCaption : Ozzioni d’installazione # ^DirSubCaption : Cartulare d’installazione # ^InstallingSubCaption : Installazione in corsu # ^CompletedSubCaption : Installazione compia # ^UnComponentsSubCaption : Ozzioni di disinstallazione # ^UnDirSubCaption : Cartulare di disinstallazione # ^ConfirmSubCaption : Cunfirmazione # ^UninstallingSubCaption : Disinstallazione in corsu # ^UnCompletedSubCaption : Disinstallazione compia # ^BackBtn < &Precedente # ^NextBtn &Seguente > # ^AgreeBtn &Accunsentu # ^AcceptBtn Sò d’&accunsentu cù i termini di u cuntrattu di licenza # ^DontAcceptBtn Ùn sò &micca d’accunsentu cù i termini di u cuntrattu di licenza # ^InstallBtn &Installà # ^UninstallBtn &Disinstallà # ^CancelBtn Abbandunà # ^CloseBtn &Chjode # ^BrowseBtn &Sfuglià... # ^ShowDetailsBtn Affissà i &ditaglii # ^ClickNext Sciglite Seguente per cuntinuà. # ^ClickInstall Sciglite Installà per principià l’installazione. # ^ClickUninstall Sciglite Disinstallà per principià a disinstallazione. # ^Name Nome # ^Completed Compiu # ^LicenseText Ci vole à leghje u cuntrattu di licenza nanzu d’installà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite Accunsentu. # ^LicenseTextCB Ci vole à leghje u cuntrattu di licenza nanzu d’installà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a casella inghjò. $_CLICK # ^LicenseTextRB Ci vole à leghje u cuntrattu di licenza nanzu d’installà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a prima ozzione inghjò. $_CLICK # ^UnLicenseText Ci vole à leghje u cuntrattu di licenza nanzu di disinstallà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite Accunsentu. # ^UnLicenseTextCB Ci vole à leghje u cuntrattu di licenza nanzu di disinstallà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a casella inghjò. $_CLICK # ^UnLicenseTextRB Ci vole à leghje u cuntrattu di licenza nanzu di disinstallà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a prima ozzione inghjò. $_CLICK # ^Custom Persunalizata # ^ComponentsText Selezziunà i cumpunenti chì voi vulete installà è viutà a casella di quelli ch’ellu ùn ci vole micca à installà. $_CLICK # ^ComponentsSubText1 Selezziunà u tipu d’installazione : # ^ComponentsSubText2_NoInstTypes Selezziunà i cumpunenti à installà : # ^ComponentsSubText2 Osinnò, selezziunà i cumpunenti addizziunali chì voi vulete installà : # ^UnComponentsText Selezziunà i cumpunenti chì voi vulete disinstallà è viutà a casella di quelli ch’ellu ùn ci vole à disinstallà. $_CLICK # ^UnComponentsSubText1 Selezziunà u tipu di disinstallazione : # ^UnComponentsSubText2_NoInstTypes Selezziunà i cumpunenti à disinstallà : # ^UnComponentsSubText2 Osinnò, selezziunà i cumpunenti addizziunali chì voi vulete disinstallà : # ^DirText L’assistente hà da installà $(^NameDA) in quessu cartulare. Per installà in un altru cartulare, sciglite Sfuglià è selezziunà un altru cartulare. $_CLICK # ^DirSubText Cartulare di destinazione # ^DirBrowseText Selezziunà u cartulare d’installazione di $(^NameDA) : # ^UnDirText L’assistente hà da disinstallà $(^NameDA) da quessu cartulare. Per disinstallà da un altru cartulare, sciglite Sfuglià è selezziunà un altru cartulare. $_CLICK # ^UnDirSubText Cartulare d’installazione # ^UnDirBrowseText Selezziunà u cartulare di disinstallazione di $(^NameDA) : # ^SpaceAvailable Spaziu dispunibule : # ^SpaceRequired Spaziu richiestu : # ^UninstallingText $(^NameDA) serà disinstallatu da quessu cartulare. $_CLICK # ^UninstallingSubText Disinstallazione da : # ^FileError Sbagliu durante l’accessu in scrittura di u schedariu : \r\n\r\n$0\r\n\r\nSciglite Interrompe per piantà l’installazione,\r\nTorna per pruvà torna, o\r\nIgnurà per ignurà stu schedariu. # ^FileError_NoIgnore Sbagliu durante l’accessu in scrittura di u schedariu : \r\n\r\n$0\r\n\r\nSciglite Torna per pruvà torna, o\r\nAbbandunà per piantà l’installazione. # ^CantWrite Ùn pò micca scrive : # ^CopyFailed Fiascu di a copia # ^CopyTo Cupià ver di # ^Registering Arregistramentu : # ^Unregistering Disarregistramentu : # ^SymbolNotFound Impussibule di truvà un simbolu : # ^CouldNotLoad Impussibule di caricà : # ^CreateFolder Creazione di u cartulare : # ^CreateShortcut Creazione di l’accurtatoghju : # ^CreatedUninstaller Creazione di l’assistente di disinstallazione : # ^Delete Squassatura di schedariu : # ^DeleteOnReboot Squassatura à l’avviu di l’urdinatore : # ^ErrorCreatingShortcut Sbagliu durante a creazione di l’accurtatoghju : # ^ErrorCreating Sbagliu durante a creazione di : # ^ErrorDecompressing Sbagliu durante a scumprezzione di i dati ! Stalladore alteratu ? # ^ErrorRegistering Sbagliu durante l’arregistramentu di DLL # ^ExecShell ExecShell : # ^Exec Eseguisce : # ^Extract Estrazzione : # ^ErrorWriting Estrazzione : sbagliu di scrittura ver di u schedariu # ^InvalidOpcode Stalladore alteratu : opcode micca accettevule # ^NoOLE Alcunu OLE per : # ^OutputFolder Cartulare di destinazione : # ^RemoveFolder Cacciatura di u cartulare : # ^RenameOnReboot Rinumà à l’avviu di l’urdinatore : # ^Rename Rinumà : # ^Skipped Tralasciatu : # ^CopyDetails Cupià i detaglii ver di u preme’papei # ^LogInstall Arregistrà u ghjurnale d’installazione # ^Byte o # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Corsican.nsh000077500000000000000000000205711477201124000211010ustar00rootroot00000000000000/* ** Language: Corsican (1155) ** Traduzzione corsa da Patriccollu di Santa Maria è Sichè - ** ISO 639-1: co ** ISO 639-2: cos */ !insertmacro LANGFILE "Corsican" "Corsican" "Corsu" "Corsu" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvenuta in l’assistente d’installazione di $(^NameDA)m" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "L’assistente d’installazione hà da aiutavvi à installà $(^NameDA).$\r$\n$\r$\nHè ricumandatu di chjode tutte l’altre appiecazioni nanzu di avvià st’assistente. Quessu permetterà di mudificà i schedarii di u sistema senza riavvià l’urdinatore.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvenuta in l’assistente di disinstallazione di $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "L’assistente hà da aiutavvi à disinstallà $(^NameDA).$\r$\n$\r$\nNanzu di principià a disinstallazione, ci vole à assicurassi chì $(^NameDA) ùn sia micca in funzione.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Cuntrattu di licenza" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ci vole à leghje i termini di a licenza nanzu d’installà $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite Accunsentu per cuntinuà. Ci vole à accettà u cuntrattu per installà $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a casella inghjò. Ci vole à accettà u cuntrattu per installà $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a prima ozzione inghjò. Ci vole à accettà u cuntrattu per installà $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Cuntrattu di licenza" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ci vole à leghje i termini di a licenza nanzu di disinstallà $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite Accunsentu per cuntinuà. Ci vole à accettà u cuntrattu per disinstallà $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a casella inghjò. Ci vole à accettà u cuntrattu per disinstallà $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a prima ozzione inghjò. Ci vole à accettà u cuntrattu per disinstallà $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sciglite Pagina Seguente per fighjà a seguita di u ducumentu." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Sciglite i cumpunenti" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Sciglite e funzioni di $(^NameDA) chì voi vulete installà." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Sciglite i cumpunenti" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Sciglite e funzioni di $(^NameDA) chì voi vulete disinstallà." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Discrizzione" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Piazzà u topu nant’à un cumpunentu per fighjà a so discrizzione." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selezziunà un cumpunentu per fighjà a so discrizzione." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Sciglite u cartulare d’installazione" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Sciglite u cartulare induve installà $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Sciglite u cartulare di disinstallazione" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Sciglite u cartulare di disinstallazione di $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione in corsu" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Aspettate per piacè chì $(^NameDA) sia installatu." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installazione compia" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L’installazione hè compia bè." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installazione interrotta" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L’installazione ùn hè micca compia bè." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione in corsu" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Aspettate per piacè chì $(^NameDA) sia disinstallatu." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Disinstallazione compia" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A disinstallazione hè compia bè." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Disinstallazione interrotta" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A disinstallazione ùn hè micca compia bè." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Fine d’installazione di $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) hè statu installatu nant’à l’urdinatore.$\r$\n$\r$\nSciglite Piantà per chjode l’assistente." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "L’urdinatore deve esse piantatu è rilanciatu per compie l’installazione di $(^NameDA). Vulete piantalu è rilancialu avà ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fine di disinstallazione di $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) hè statu disinstallatu da l’urdinatore.$\r$\n$\r$\nSciglite Piantà per chjode l’assistente." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "L’urdinatore deve esse piantatu è rilanciatu per compie a disinstallazione di $(^NameDA). Vulete piantalu è rilancialu avà ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Rilancià subitu" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Vogliu fallu dopu dapermè" ${LangFileString} MUI_TEXT_FINISH_RUN "&Eseguisce $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Affissà u schedariu LisezMoi/Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Piantà" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Sciglite un cartulare in u listinu « Démarrer »" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Sciglite un cartulare in u listinu « Démarrer » per l’accurtatoghjii di $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Sciglite un cartulare in u listinu « Démarrer » induve l’accurtatoghjii di u prugramma seranu creati. Pudete dinù scrive un nome per creà un novu cartulare." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ùn creà micca d’accurtatoghji" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstallà $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Caccià $(^NameDA) da l’urdinatore." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Site sicuru di vulè chità l’assistente d’installazione di $(^Name) ?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Site sicuru di vulè chità l’assistente di disinstallazione di $(^Name) ?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Scelta di l’utilizatori" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Sciglite l’utilizatori chì puderanu impiegà $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selezziunà s’èllu ci vole à installà $(^NameDA) solu per voi o per tutti l’utilizatori di l’urdinatore. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installà per tutti l’utilizatori di l’urdinatore" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installà solu per mè" !endif nsis-3.11/Contrib/Language files/Croatian.nlf000077500000000000000000000121571477201124000210700ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1050 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Igor Ostriz # ^Branding Nullsoft Install System %s # ^SetupCaption Instalacija programa $(^Name) # ^UninstallCaption Uklanjanje programa $(^Name) # ^LicenseSubCaption : Uvjeti Ugovora o licenci # ^ComponentsSubCaption : Instalacijske opcije # ^DirSubCaption : Instalacijska mapa # ^InstallingSubCaption : Instaliranje # ^CompletedSubCaption : ZavrÅ¡eno # ^UnComponentsSubCaption : Opcije uklanjanja # ^UnDirSubCaption : Mapa uklanjanja # ^ConfirmSubCaption : Potvrda # ^UninstallingSubCaption : Uklanjanje # ^UnCompletedSubCaption : ZavrÅ¡eno # ^BackBtn < &Natrag # ^NextBtn &Dalje > # ^AgreeBtn &Prihvaćam # ^AcceptBtn &Prihvaćam uvjete Ugovora o licenci # ^DontAcceptBtn &Ne prihvaćam uvjete Ugovora o licenci # ^InstallBtn &Instaliraj # ^UninstallBtn &Ukloni # ^CancelBtn Odustani # ^CloseBtn &Zatvori # ^BrowseBtn &Pregledaj... # ^ShowDetailsBtn Prikaži &detalje # ^ClickNext Za nastavak odaberite 'Dalje'. # ^ClickInstall Za poÄetak instalacije odaberite 'Instaliraj'. # ^ClickUninstall Za poÄetak uklanjanja odaberite 'Ukloni'. # ^Name Ime # ^Completed ZavrÅ¡eno # ^LicenseText ProÄitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite 'Prihvaćam'. # ^LicenseTextCB ProÄitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, oznaÄite donji kvadratić. $_CLICK # ^LicenseTextRB ProÄitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK # ^UnLicenseText ProÄitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite 'Prihvaćam'. # ^UnLicenseTextCB ProÄitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, oznaÄite donji kvadratić. $_CLICK # ^UnLicenseTextRB ProÄitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK # ^Custom Posebna # ^ComponentsText OznaÄite komponente koje želite instalirati i uklonite oznaku s onih koje ne želite instalirati. $_CLICK # ^ComponentsSubText1 Izaberite tip instalacije: # ^ComponentsSubText2_NoInstTypes Odaberite komponente za instalaciju: # ^ComponentsSubText2 Ili po izboru oznaÄite komponente koje želite instalirati: # ^UnComponentsText OznaÄite komponente koje želite ukloniti i uklonite oznaku s onih koje ne želite ukloniti. $_CLICK # ^UnComponentsSubText1 Izaberite tip uklanjanja: # ^UnComponentsSubText2_NoInstTypes Odaberite komponente za uklanjanje: # ^UnComponentsSubText2 Ili po izboru oznaÄite komponente koje želite ukloniti: # ^DirText Program $(^NameDA) bit će instaliran u sljedeću mapu. Ako želite promijeniti odrediÅ¡te, pritisnite dugme za traženje mape i oznaÄite drugu mapu. $_CLICK # ^DirSubText OdrediÅ¡na mapa # ^DirBrowseText Odaberite mapu u koju želite instalirati program $(^NameDA): # ^UnDirText Program $(^NameDA) bit će uklonjen iz sljedeće mape. Za uklanjanje s drugog mjesta odaberite 'Pregledaj' i oznaÄite drugu mapu. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Mapa iz koje će program $(^NameDA) biti uklonjen: # ^SpaceAvailable "Slobodno prostora na disku: " # ^SpaceRequired "Potrebno prostora na disku: " # ^UninstallingText Program $(^NameDA) bit će uklonjen iz sljedeće mape. $_CLICK # ^UninstallingSubText Uklanjam iz: # ^FileError GreÅ¡ka prilikom otvaranja datoteke za zapisivanje: \r\n\r\n$0\r\n\r\nPritisnite "Abort" ako želite prekinuti instalaciju,\r\n"Retry" ako želite pokuÅ¡ati ponovno, ili\r\n"Ignore" ako želite zanemariti tu datoteku # ^FileError_NoIgnore GreÅ¡ka prilikom otvaranja datoteke za zapisivanje: \r\n\r\n$0\r\n\r\nPritisnite "Retry" za ponovni pokuÅ¡aj zapisivanja, ili\r\n"Cancel" za prekid instalacije # ^CantWrite "Ne mogu zapisati: " # ^CopyFailed GreÅ¡ka prilikom kopiranja # ^CopyTo "Kopiraj u " # ^Registering "Prijava: " # ^Unregistering "Odjava: " # ^SymbolNotFound "Ne mogu naći simbol: " # ^CouldNotLoad "Ne mogu uÄitati: " # ^CreateFolder "Stvori mapu: " # ^CreateShortcut "Stvori preÄac: " # ^CreatedUninstaller "Program za uklanjanje: " # ^Delete "IzbriÅ¡i datoteku: " # ^DeleteOnReboot "IzbriÅ¡i prilikom ponovnog pokretanja: " # ^ErrorCreatingShortcut "GreÅ¡ka prilikom stvaranja preÄaca: " # ^ErrorCreating "GreÅ¡ka prilikom stvaranja: " # ^ErrorDecompressing GreÅ¡ka dekompresije podataka! OÅ¡tećena instalacijska datoteka? # ^ErrorRegistering GreÅ¡ka prilikom prijavljivanja DLL-a # ^ExecShell "ExecShell: " # ^Exec "IzvrÅ¡i: " # ^Extract "Otpakiraj: " # ^ErrorWriting "Otpakiranje: greÅ¡ka zapisivanja u datoteku " # ^InvalidOpcode OÅ¡tećena instalacijska datoteka: neispravan opkod # ^NoOLE "Nema OLE za: " # ^OutputFolder "Izlazna mapa: " # ^RemoveFolder "IzbriÅ¡i mapu: " # ^RenameOnReboot "Preimenuj prilikom ponovnog pokretanja: " # ^Rename "Preimenuj: " # ^Skipped "PreskoÄeno: " # ^CopyDetails Kopiraj detalje u meÄ‘uspremnik # ^LogInstall Logiraj instalacijski proces # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Croatian.nsh000077500000000000000000000166721477201124000211070ustar00rootroot00000000000000;Language: Croatian (1050) ;By Igor Ostriz !insertmacro LANGFILE "Croatian" = "Hrvatski" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li u instalaciju programa $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Instalacija programa $(^NameDA) na VaÅ¡e raÄunalo sastoji se od nekoliko jednostavnih koraka kroz koje će Vas provesti ovaj Äarobnjak.$\r$\n$\r$\nPreporuÄamo zatvaranje svih ostalih aplikacija prije samog poÄetka instalacije. To će omogućiti nadogradnju nekih sistemskih datoteka bez potrebe za ponovnim pokretanjem VaÅ¡eg raÄunala. U svakom trenutku instalaciju možete prekinuti pritiskom na 'Odustani'.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li u postupak uklanjanja programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ovaj će Vas Äarobnjak provesti kroz postupak uklanjanja programa $(^NameDA).$\r$\n$\r$\nPrije samog poÄetka, molim zatvorite program $(^NameDA) ukoliko je sluÄajno otvoren.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ugovor o licenci" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ProÄitajte licencu prije instalacije programa $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvaćate uvjete licence, pritisnite 'Prihvaćam' za nastavak. Da biste instalirali program $(^NameDA), morate prihvatiti licencu." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ukoliko prihvaćate uvjete licence, oznaÄite donji kvadratić. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ukoliko prihvaćate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ugovor o licenci" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ProÄitajte licencu prije uklanjanja programa $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvaćate uvjete licence, pritisnite 'Prihvaćam' za nastavak. Da biste instalirali program $(^NameDA), morate prihvatiti licencu." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ukoliko prihvaćate uvjete licence, oznaÄite donji kvadratić. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ukoliko prihvaćate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Služite se tipkom 'Page Down' da biste vidjeli ostatak licence." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Odaberite komponente programa $(^NameDA) koje želite instalirati." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Odaberite koje komponente programa $(^NameDA) želite ukloniti." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite pokazivaÄ iznad komponente za njezin opis." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "OznaÄite komponentu za njezin opis." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Odaberite odrediÅ¡te za instalaciju" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Odaberite mapu u koju želite instalirati program $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Odaberite polaziÅ¡te za uklanjanje" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Odaberite mapu iz koje želite ukloniti program $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacija u tijeku..." ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "PriÄekajte zavrÅ¡etak instalacije programa $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Kraj instalacije" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je u potpunosti zavrÅ¡ila uspjeÅ¡no." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacija je prekinuta" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija nije zavrÅ¡ila uspjeÅ¡no." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uklanjanje u tijeku..." ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "PriÄekajte zavrÅ¡etak uklanjanja programa $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uklanjanje zavrÅ¡eno" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uklanjanje je u potpunosti zavrÅ¡ilo uspjeÅ¡no." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uklanjanje je prekinuto" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uklanjanje nije zavrÅ¡ilo uspjeÅ¡no." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "DovrÅ¡etak instalacije programa $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) upravo je instaliran.$\r$\n$\r$\nOdaberite 'Kraj' za zavrÅ¡etak." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Da bi se dovrÅ¡ila instalacija programa $(^NameDA), trebate ponovno pokrenuti raÄunalo. Želite li to uÄiniti sada?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ZavrÅ¡etak uklanjanja programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) uklonjen je s VaÅ¡eg raÄunala.$\r$\n$\r$\nOdaberite 'Kraj' za zatvaranje ovog Äarobnjaka." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Da bi se dovrÅ¡io postupka uklanjanja programa $(^NameDA), trebate ponovno pokrenuti raÄunalo. Želite li to uÄiniti sada?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ponovno pokreni raÄunalo sada" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ponovno ću pokrenuti raÄunalo kasnije" ${LangFileString} MUI_TEXT_FINISH_RUN "&Pokreni program $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Otvori datoteku '&Readme'" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Kraj" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor mape u izborniku 'Start'" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Odaberite ime za programsku mapu unutar izbornika 'Start'." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Program će pripadati odabranoj programskoj mapi u izborniku 'Start'. Možete odrediti novo ime za mapu ili odabrati već postojeću." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nemoj napraviti preÄace" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uklanjanje programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Program $(^NameDA) bit će uklonjen s VaÅ¡eg raÄunala." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti instalaciju programa $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti uklanjanje programa $(^Name)?" !endif nsis-3.11/Contrib/Language files/Czech.nlf000077500000000000000000000133551477201124000203650ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1029 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Václav PavlíÄek (v.pavlicek@centrum.cz), dříve SELiCE # ^Branding Nullsoft Install System %s # ^SetupCaption Instalace $(^Name) # ^UninstallCaption Odinstalace $(^Name) # ^LicenseSubCaption : LicenÄní smlouva # ^ComponentsSubCaption : Možnosti instalace # ^DirSubCaption : InstalaÄní složka # ^InstallingSubCaption : Instalace # ^CompletedSubCaption : DokonÄeno # ^UnComponentsSubCaption : Možnosti odinstalace # ^UnDirSubCaption : OdinstalaÄní složka # ^ConfirmSubCaption : Potvrzení # ^UninstallingSubCaption : Odinstalace # ^UnCompletedSubCaption : DokonÄeno # ^BackBtn < &ZpÄ›t # ^NextBtn &Další > # ^AgreeBtn Souhl&asím # ^AcceptBtn Souhl&asím s podmínkami licenÄní smlouvy # ^DontAcceptBtn &Nesouhlasím s podmínkami licenÄní smlouvy # ^InstallBtn &Instalovat # ^UninstallBtn &Odinstalovat # ^CancelBtn Storno # ^CloseBtn &Zavřít # ^BrowseBtn P&rocházet... # ^ShowDetailsBtn &Podrobnosti # ^ClickNext PokraÄujte kliknutím na tlaÄítko Další. # ^ClickInstall Instalaci spustíte kliknutím na tlaÄítko Instalovat. # ^ClickUninstall Odinstalaci spustíte kliknutím na tlaÄítko Odinstalovat. # ^Name Název # ^Completed DokonÄeno # ^LicenseText PÅ™ed instalací programu $(^NameDA) si prosím pÅ™eÄtÄ›te licenÄní smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, kliknÄ›te na tlaÄítko Souhlasím. # ^LicenseTextCB PÅ™ed instalací programu $(^NameDA) si prosím pÅ™eÄtÄ›te licenÄní smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, zaÅ¡krtnÄ›te políÄko níže. $_CLICK # ^LicenseTextRB PÅ™ed instalací programu $(^NameDA) si prosím pÅ™eÄtÄ›te licenÄní smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, vyberte níže první možnost. $_CLICK # ^UnLicenseText PÅ™ed odinstalací programu $(^NameDA) si prosím pÅ™eÄtÄ›te licenÄní smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, kliknÄ›te na tlaÄítko Souhlasím. # ^UnLicenseTextCB PÅ™ed odinstalací programu $(^NameDA) si prosím pÅ™eÄtÄ›te licenÄní smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, zaÅ¡krtnÄ›te políÄko níže. $_CLICK # ^UnLicenseTextRB PÅ™ed odinstalací programu $(^NameDA) si prosím pÅ™eÄtÄ›te licenÄní smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, vyberte níže první možnost. $_CLICK # ^Custom Vlastní # ^ComponentsText ZaÅ¡krtnÄ›te souÄásti, které chcete nainstalovat a zruÅ¡te zaÅ¡krtnutí souÄástí, které nechcete nainstalovat. $_CLICK # ^ComponentsSubText1 Zvolte způsob instalace: # ^ComponentsSubText2_NoInstTypes Vyberte souÄásti, které chcete nainstalovat. # ^ComponentsSubText2 Nebo vyberte volitelné souÄásti, které chcete nainstalovat. # ^UnComponentsText ZaÅ¡krtnÄ›te souÄásti, které chcete odinstalovat a zruÅ¡te zaÅ¡krtnutí souÄástí, které nechcete odinstalovat. $_CLICK # ^UnComponentsSubText1 Zvolte způsob odinstalace: # ^UnComponentsSubText2_NoInstTypes Vyberte souÄásti, které chcete odinstalovat. # ^UnComponentsSubText2 Nebo vyberte volitelné souÄásti, které chcete odinstalovat. # ^DirText InstalaÄní program nainstaluje program $(^NameDA) do následující složky. Chcete-li instalovat do jiné složky, kliknÄ›te na tlaÄítko Procházet a vyberte jinou složku. $_CLICK # ^DirSubText Cílová složka # ^DirBrowseText VýbÄ›r instalaÄní složky programu $(^NameDA). # ^UnDirText OdinstalaÄní program odinstaluje program $(^NameDA) z následující složky. Chcete-li odinstalovat z jiné složky, kliknÄ›te na tlaÄítko Procházet a vyberte jinou složku. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Vyberte odinstalaÄní složku programu $(^NameDA): # ^SpaceAvailable "Volné místo: " # ^SpaceRequired "Požadované místo: " # ^UninstallingText Program $(^NameDA) bude odinstalován z následující složky. $_CLICK # ^UninstallingSubText Odinstalovat z: # ^FileError Soubor nelze otevřít pro zápis: \r\n\t"$0"\r\nKliknÄ›te na tlaÄítko PÅ™eruÅ¡it k ukonÄení instalace,\r\nnebo na tlaÄítko Opakovat k zopakování akce, nebo\r\n na tlaÄítko Ignorovat k pÅ™eskoÄení souboru. # ^FileError_NoIgnore Soubor nelze otevřít pro zápis: \r\n\t"$0"\r\nKliknÄ›te na tlaÄítko Opakovat k zopakování akce, nebo\r\n na tlaÄítko Storno k ukonÄení instalace. # ^CantWrite "Nelze zapsat: " # ^CopyFailed Kopírování se nezdaÅ™ilo. # ^CopyTo "Kopírování do " # ^Registering "Registrace: " # ^Unregistering "RuÅ¡ení registrace: " # ^SymbolNotFound "Nelze najít symbol: " # ^CouldNotLoad "Nelze naÄíst: " # ^CreateFolder "Vytváření složky: " # ^CreateShortcut "Vytváření zástupce: " # ^CreatedUninstaller "Vytváření odinstalaÄního programu: " # ^Delete "Odstraňování souboru: " # ^DeleteOnReboot "Odstranit pÅ™i restartování: " # ^ErrorCreatingShortcut "PÅ™i vytváření zástupce doÅ¡lo k chybÄ›: " # ^ErrorCreating "PÅ™i vytváření doÅ¡lo k chybÄ›: " # ^ErrorDecompressing PÅ™i dekompresi dat doÅ¡lo k chybÄ›. Byl poÅ¡kozen instalaÄní program? # ^ErrorRegistering PÅ™i registraci souborů DLL doÅ¡lo k chybÄ›. # ^ExecShell "SpouÅ¡tÄ›ní prostÅ™edí: " # ^Exec "SpouÅ¡tÄ›ní: " # ^Extract "Extrahování: " # ^ErrorWriting "Extrakce: PÅ™i zápisu souboru doÅ¡lo k chybÄ› " # ^InvalidOpcode InstalaÄní program byl poÅ¡kozen: neplatný operaÄní kód. # ^NoOLE "Nedostupné OLE pro: " # ^OutputFolder "Výstupní složka: " # ^RemoveFolder "Odstraňování složky: " # ^RenameOnReboot "PÅ™ejmenovat pÅ™i restartování: " # ^Rename "PÅ™ejmenováno: " # ^Skipped "PÅ™eskoÄeno: " # ^CopyDetails Zkopírovat podrobnosti do schránky # ^LogInstall Protokolovat proces instalace # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Czech.nsh000077500000000000000000000201501477201124000203650ustar00rootroot00000000000000;Language: Czech (1029) ;By Václav PavlíÄek (v.pavlicek@centrum.cz), dříve SELiCE !insertmacro LANGFILE "Czech" = "ÄŒeÅ¡tina" "Cestina" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Vítejte v průvodci instalace programu $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tento průvodce vás provede instalací programu $(^NameDA).$\r$\n$\r$\nPÅ™ed spuÅ¡tÄ›ním instalaÄního programu je doporuÄeno ukonÄit vÅ¡echny ostatní aplikace. Umožní to aktualizovat související systémové soubory bez restartování poÄítaÄe.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Vítejte v průvodci odinstalace programu $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tento průvodce vás provede odinstalací programu $(^NameDA).$\r$\n$\r$\nPÅ™ed spuÅ¡tÄ›ním odinstalace se pÅ™esvÄ›dÄte, zda program $(^NameDA) není spuÅ¡tÄ›n.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "LicenÄní smlouva" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "PÅ™ed instalací programu $(^NameDA) si prosím projdÄ›te licenÄní podmínky." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jestliže souhlasíte s podmínkami smlouvy, kliknÄ›te na tlaÄítko Souhlasím. Chcete-li nainstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jestliže souhlasíte s podmínkami smlouvy, zaÅ¡krtnÄ›te políÄko níže. Chcete-li nainstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jestliže souhlasíte s podmínkami smlouvy, vyberte níže první možnost. Chcete-li nainstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "LicenÄní smlouva" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "PÅ™ed odinstalací programu $(^NameDA) si prosím projdÄ›te licenÄní podmínky." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jestliže souhlasíte s podmínkami smlouvy, kliknÄ›te na tlaÄítko Souhlasím. Chcete-li odinstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jestliže souhlasíte s podmínkami smlouvy, zaÅ¡krtnÄ›te políÄko níže. Chcete-li odinstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jestliže souhlasíte s podmínkami smlouvy, vyberte níže první možnost. Chcete-li odinstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Zbytek textu zobrazíte stisknutím klávesy Page Down." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Volba souÄástí" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "VýbÄ›r souÄástí programu $(^NameDA) pro instalaci." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Volba souÄástí" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "VýbÄ›r souÄástí programu $(^NameDA) pro odinstalaci." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Popis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Chcete-li zobrazit popis souÄásti, umístÄ›te na ní ukazatel myÅ¡i." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Chcete-li zobrazit popis souÄásti, vyberte ji." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Volba umístÄ›ní instalace" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "VýbÄ›r instalaÄní složky programu $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Volba umístÄ›ní odinstalace" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "VýbÄ›r odinstalaÄní složky programu $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalace" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "PoÄkejte prosím na dokonÄení instalace programu $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalace dokonÄena" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalace byla úspěšnÄ› dokonÄena." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalace pÅ™eruÅ¡ena" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalace nebyla úspěšnÄ› dokonÄena." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odinstalace" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "PoÄkejte prosím na dokonÄení odinstalace programu $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Odinstalace dokonÄena" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinstalace byla úspěšnÄ› dokonÄena." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Odinstalace pÅ™eruÅ¡ena" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odinstalace nebyla úspěšnÄ› dokonÄena." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "DokonÄení instalace programu $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) byl nainstalován do poÄítaÄe.$\r$\n$\r$\nKliknutím na tlaÄítko DokonÄit ukonÄíte tohoto průvodce." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "K dokonÄení instalace programu $(^NameDA) je nutné restartovat poÄítaÄ. Chcete jej restartovat nyní?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "DokonÄení odinstalace programu $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) byl odinstalován z poÄítaÄe.$\r$\n$\r$\nKliknutím na tlaÄítko DokonÄit ukonÄíte tohoto průvodce." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "K dokonÄení odinstalace $(^NameDA) je nutné restartovat poÄítaÄ. Chcete jej restartovat nyní?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Restartovat nyní" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Restartovat pozdÄ›ji ruÄnÄ›" ${LangFileString} MUI_TEXT_FINISH_RUN "&Spustit program $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Zobrazit soubor Readme (ÄŒti mÄ›)" ${LangFileString} MUI_BUTTONTEXT_FINISH "&DokonÄit" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Volba složky v Nabídce Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "VýbÄ›r složky v Nabídce Start pro zástupce programu $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vyberte složku v Nabídce Start, ve které chcete vytvoÅ™it zástupce programu. Chcete-li vytvoÅ™it novou složku, zadejte její název." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "NevytvoÅ™it zástupce" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinstalace programu $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odebere program $(^NameDA) z poÄítaÄe." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Opravdu chcete instalaci programu $(^Name) ukonÄit?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Opravdu chcete odinstalaci programu $(^Name) ukonÄit?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Volba uživatelů" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "VýbÄ›r uživatelů, kterým bude program $(^NameDA) nainstalován." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vyberte, zda chcete program $(^NameDA) nainstalovat pouze pro sebe, nebo pro vÅ¡echny uživatele poÄítaÄe. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalovat pro vÅ¡echny uživatele poÄítaÄe" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalovat pouze pro sebe" !endif nsis-3.11/Contrib/Language files/Danish.nlf000077500000000000000000000124131477201124000205310ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1030 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Claus Futtrup, scootergrisen # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Installation # ^UninstallCaption $(^Name) Afinstallation # ^LicenseSubCaption : Licensaftale # ^ComponentsSubCaption : Installationsvalgmuligheder # ^DirSubCaption : Installationsmappe # ^InstallingSubCaption : Installerer # ^CompletedSubCaption : Gennemført # ^UnComponentsSubCaption : Afinstallationsvalgmuligheder # ^UnDirSubCaption : Afinstallationsmappe # ^ConfirmSubCaption : Bekræft # ^UninstallingSubCaption : Afinstallerer # ^UnCompletedSubCaption : Gennemført # ^BackBtn < &Tilbage # ^NextBtn &Næste > # ^AgreeBtn Jeg &accepterer # ^AcceptBtn Jeg &accepterer vilkÃ¥rene i licensaftalen # ^DontAcceptBtn Jeg &accepterer ikke vilkÃ¥rene i licensaftalen # ^InstallBtn &Installer # ^UninstallBtn &Afinstaller # ^CancelBtn Annuller # ^CloseBtn &Luk # ^BrowseBtn G&ennemse... # ^ShowDetailsBtn Vis &detaljer # ^ClickNext Tryk pÃ¥ Næste for at fortsætte. # ^ClickInstall Tryk pÃ¥ Installer for at starte installationen. # ^ClickUninstall Tryk pÃ¥ Afinstaller for at starte afinstallationen. # ^Name Navn # ^Completed Gennemført # ^LicenseText Gennemlæs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle vilkÃ¥r i aftalen, skal du klikke pÃ¥ Jeg accepterer. # ^LicenseTextCB Gennemlæs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle vilkÃ¥r i aftalen, skal du klikke pÃ¥ afkrydsningsfeltet nedenfor. $_CLICK # ^LicenseTextRB Gennemlæs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle vilkÃ¥r i aftalen, skal du vælge den første valgmulighed nedenfor. $_CLICK # ^UnLicenseText Gennemlæs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle vilkÃ¥r i aftalen, skal du trykke pÃ¥ Jeg accepterer. # ^UnLicenseTextCB Gennemlæs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle vilkÃ¥r i aftalen, skal du klikke pÃ¥ afkrydsningsfeltet nedenfor. $_CLICK # ^UnLicenseTextRB Gennemlæs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle vilkÃ¥r i aftalen, skal du vælge den første valgmulighed nedenfor. $_CLICK # ^Custom Brugerdefineret # ^ComponentsText Tilvælg de komponenter du vil installere, og fravælg de komponenter du ikke vil installere. $_CLICK # ^ComponentsSubText1 Vælg installationstype: # ^ComponentsSubText2_NoInstTypes Vælg de komponenter der skal installeres: # ^ComponentsSubText2 Eller vælg de valgfrie komponenter du ønsker at installere: # ^UnComponentsText Tilvælg de komponenter du vil afinstallere, og fravælg de komponenter du ikke vil afinstallere. $_CLICK # ^UnComponentsSubText1 Vælg afinstallationstype: # ^UnComponentsSubText2_NoInstTypes Vælg de komponenter der skal afinstalleres: # ^UnComponentsSubText2 Eller vælg de valgfrie komponenter du ønsker at afinstallere: # ^DirText Installationsguiden vil installere $(^NameDA) i følgende mappe. For at installere i en anden mappe, tryk pÃ¥ Gennemse og vælg en anden mappe. $_CLICK # ^DirSubText Destinationsmappe # ^DirBrowseText Vælg den mappe hvori $(^NameDA) skal installeres: # ^UnDirText Installationsguiden vil afinstallere $(^NameDA) fra følgende mappe. For at afinstallere fra en anden mappe, tryk pÃ¥ Gennemse og vælg en anden mappe. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Vælg den mappe hvorfra $(^NameDA) skal afinstalleres: # ^SpaceAvailable "Ledig plads: " # ^SpaceRequired "Nødvendig plads: " # ^UninstallingText $(^NameDA) vil blive afinstalleret fra følgende mappe. $_CLICK # ^UninstallingSubText Afinstallerer fra: # ^FileError Fejl ved skrivning af fil til skrivning: \r\n\r\n$0\r\n\r\nTryk pÃ¥ Annuller for at stoppe installationen,\r\nPrøv igen for at prøve igen, eller\r\nIgnorer for at springe over denne fil. # ^FileError_NoIgnore Fejl ved Ã¥bning af fil til skrivning: \r\n\r\n$0\r\n\r\nTryk pÃ¥ Prøv igen for at prøve igen, eller\r\nAnnuller for at stoppe installationen. # ^CantWrite "Kan ikke skrive: " # ^CopyFailed Kopiering mislykkedes # ^CopyTo "Kopier til " # ^Registering "Registrerer: " # ^Unregistering "Afregisterer: " # ^SymbolNotFound "Kunne ikke finde symbol: " # ^CouldNotLoad "Kunne ikke indlæse: " # ^CreateFolder "Opret mappe: " # ^CreateShortcut "Opret genvej: " # ^CreatedUninstaller "Afinstallationsguide oprettet: " # ^Delete "Slet fil: " # ^DeleteOnReboot "Slet ved genstart: " # ^ErrorCreatingShortcut "Fejl ved oprettelse af genvej: " # ^ErrorCreating "Fejl ved oprettelse: " # ^ErrorDecompressing Fejl ved udpakning af data! Beskadiget installationsguide? # ^ErrorRegistering Fejl ved registrering af DLL # ^ExecShell "ExecShell: " # ^Exec "Kør: " # ^Extract "Udpak: " # ^ErrorWriting "Udpak: fejl ved skrivning til fil " # ^InvalidOpcode Beskadiget installationsguide: ugyldig opcode # ^NoOLE "Ingen OLE for: " # ^OutputFolder "Outputmappe: " # ^RemoveFolder "Slet mappe: " # ^RenameOnReboot "Omdøb ved genstart: " # ^Rename "Omdøb: " # ^Skipped "Sprunget over: " # ^CopyDetails Kopier detaljer til udklipsholderen # ^LogInstall Log installationsproces # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Danish.nsh000077500000000000000000000174661477201124000205570ustar00rootroot00000000000000;Language: Danish (1030) ;By Claus Futtrup, scootergrisen !insertmacro LANGFILE "Danish" = "Dansk" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til installationsguiden for $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne guide hjælper dig gennem installationen af $(^NameDA).$\r$\n$\r$\nDet anbefales, at du lukker alle kørende programmer inden start af installationsguiden. Det gør det muligt at opdatere de nødvendige systemfiler uden at skulle genstarte din computer.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til $(^NameDA) afinstallationsguiden" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne guide hjælper dig gennem afinstallationen af $(^NameDA).$\r$\n$\r$\nFør start af afinstallationen skal du være sikker pÃ¥ at $(^NameDA) ikke kører.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licensaftale" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Læs venligst licensaftalen før installationen af $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Hvis du accepterer vilkÃ¥rene i aftalen, skal du klikke pÃ¥ Jeg accepterer for at fortsætte. Du skal acceptere aftalen for at installere $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du accepterer vilkÃ¥rene i aftalen, skal du klikke pÃ¥ afkrydsningsfeltet nedenfor. Du skal acceptere aftalen for at installere $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du accepterer vilkÃ¥rene i aftalen, skal du vælge den første valgmulighed nedenfor. Du skal acceptere aftalen for at installere $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licensaftale" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Læs venligst licensaftalen før afinstallationen af $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Hvis du accepterer vilkÃ¥rene i aftalen, skal du klikke pÃ¥ Jeg accepterer for at fortsætte. Du skal acceptere aftalen for at afinstallere $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du accepterer vilkÃ¥rene i aftalen, skal du klikke pÃ¥ afkrydsningsfeltet nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du accepterer vilkÃ¥rene i aftalen, skal du vælge den første valgmulighed nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tryk pÃ¥ Page Down for at se resten af aftalen." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vælg komponenter" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vælg hvilke faciliteter af $(^NameDA) du vil installere." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vælg komponenter" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vælg hvilke faciliteter af $(^NameDA) du vil afinstallere." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivelse" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Placer musemarkøren over en komponent for at se dens beskrivelse." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vælg en komponent for at se dens beskrivelse." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vælg installationsmappe" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vælg den mappe hvori du vil installere $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vælg afinstallationsmappe" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vælg den mappe hvorfra du vil afinstallere $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerer" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vent venligst mens $(^NameDA) bliver installeret." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation gennemført" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installationsguiden blev gennemført." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation afbrudt" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installationsguiden blev ikke gennemført." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Afinstallerer" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vent venligst mens $(^NameDA) bliver afinstalleret." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Afinstallation gennemført" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Afinstallationen blev gennemført." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Afinstallation afbrudt" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Afinstallationen blev ikke gennemført." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Gennemfører $(^NameDA) installationsguiden" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er blevet installeret pÃ¥ din computer.$\r$\n$\r$\nTryk pÃ¥ Afslut for at lukke installationsguiden." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Din computer skal genstartes for at gennemføre installationen af $(^NameDA). Vil du genstarte nu?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Gennemfører $(^NameDA) afinstallationsguiden" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) er blevet afinstalleret fra din computer.$\r$\n$\r$\nTryk pÃ¥ Afslut for at lukke installationsguiden." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Din computer skal genstartes for at gennemføre afinstallationen af $(^NameDA). Vil du genstarte nu?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Genstart nu" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Jeg genstarter selv pÃ¥ et senere tidspunkt" ${LangFileString} MUI_TEXT_FINISH_RUN "&Kør $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vis Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Afslut" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vælg mappe i menuen Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vælg en mappe i menuen Start til programmets genveje." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vælg mappe i menuen Start hvori du vil oprette programmets genveje. Du kan ogsÃ¥ skrive et navn for at oprette en ny mappe." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Opret ikke genveje" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Afinstaller $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Slet $(^NameDA) fra din computer." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Er du sikker pÃ¥, at du vil afslutte installationen af $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du sikker pÃ¥, at du vil afslutte afinstallationen af $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Vælg brugere" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vælg de brugere som skal have installeret $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vælg hvorvidt du vil installere $(^NameDA) kun for dig selv eller for alle brugere pÃ¥ denne computer. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer for alle som bruger denne computer" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer kun for mig" !endif nsis-3.11/Contrib/Language files/Dutch.nlf000077500000000000000000000122361477201124000203750ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1043 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Joost Verburg & Hendri Adireans, fixes by Milan Bast # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name)-installatie # ^UninstallCaption $(^Name)-deïnstallatie # ^LicenseSubCaption : Licentieovereenkomst # ^ComponentsSubCaption : Installatieopties # ^DirSubCaption : Installatiemap # ^InstallingSubCaption : Bezig met installeren # ^CompletedSubCaption : Voltooid # ^UnComponentsSubCaption : Verwijderingsopties # ^UnDirSubCaption : Te verwijderen map # ^ConfirmSubCaption : Bevestiging # ^UninstallingSubCaption : Bezig met verwijderen # ^UnCompletedSubCaption : Voltooid # ^BackBtn < V&orige # ^NextBtn &Volgende > # ^AgreeBtn &Akkoord # ^AcceptBtn Ik &accepteer de overeenkomst # ^DontAcceptBtn Ik accepteer de overeenkomst &niet # ^InstallBtn &Installeren # ^UninstallBtn &Verwijderen # ^CancelBtn Annuleren # ^CloseBtn &Afsluiten # ^BrowseBtn &Bladeren... # ^ShowDetailsBtn &Details tonen # ^ClickNext Klik op Volgende om verder te gaan. # ^ClickInstall Klik op Installeren om de installatie te beginnen. # ^ClickUninstall Klik op Verwijderen om de deïnstallatie te beginnen. # ^Name Naam # ^Completed Voltooid # ^LicenseText Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Klik op Akkoord als u de overeenkomst accepteert. # ^LicenseTextCB Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK # ^LicenseTextRB Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK # ^UnLicenseText Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Klik op Akkoord als u de overeenkomst accepteert. # ^UnLicenseTextCB Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK # ^UnLicenseTextRB Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK # ^Custom Aangepast # ^ComponentsText Selecteer de onderdelen die u wilt installeren en deselecteer welke u niet wilt installeren. $_CLICK # ^ComponentsSubText1 Selecteer het installatietype: # ^ComponentsSubText2_NoInstTypes Selecteer de onderdelen die moeten worden geïnstalleerd: # ^ComponentsSubText2 Of selecteer de optionele onderdelen die moeten worden geïnstalleerd: # ^UnComponentsText Selecteer de onderdelen die u wilt verwijderen en deselecteer welke u niet wilt verwijderen. $_CLICK # ^UnComponentsSubText1 Selecteer het type verwijdering: # ^UnComponentsSubText2_NoInstTypes Selecteer de onderdelen die moeten worden verwijderd: # ^UnComponentsSubText2 Of selecteer de optionele onderdelen die moeten worden verwijderd: # ^DirText Setup zal $(^NameDA) in de volgende map installeren. Klik op Bladeren als u $(^NameDA) in een andere map wilt installeren en selecteer deze. $_CLICK # ^DirSubText Installatiemap # ^DirBrowseText Selecteer de map om $(^NameDA) in te installeren: # ^UnDirText Setup zal $(^NameDA) uit de volgende map verwijderen. Klik op Bladeren als u $(^NameDA) uit een andere map wilt verwijderen en selecteer deze. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Selecteer de map om $(^NameDA) uit te verwijderen: # ^SpaceAvailable "Beschikbare ruimte: " # ^SpaceRequired "Vereiste ruimte: " # ^UninstallingText $(^NameDA) zal uit de volgende map worden verwijderd. $_CLICK # ^UninstallingSubText Verwijderen uit: # ^FileError Fout bij het schrijven naar bestand: \r\n\r\n$0\r\n\r\nKlik op Afbreken om de installatie te stoppen,\r\nOpnieuw om het opnieuw te proberen of\r\nNegeren om dit bestand over te slaan. # ^FileError_NoIgnore Fout bij het schrijven naar bestand: \r\n\r\n$0\r\n\r\nKlik op Opnieuw om het opnieuw te proberen of \r\nAnnuleren om de installatie te stoppen. # ^CantWrite "Kon niet schrijven: " # ^CopyFailed Kopiëren mislukt # ^CopyTo "Kopiëren naar " # ^Registering "Registreren: " # ^Unregistering "Deregistreren: " # ^SymbolNotFound "Kon symbool niet vinden: " # ^CouldNotLoad "Kon niet laden: " # ^CreateFolder "Map maken: " # ^CreateShortcut "Snelkoppeling maken: " # ^CreatedUninstaller "Deïnstallatieprogramma gemaakt: " # ^Delete "Bestand verwijderen: " # ^DeleteOnReboot "Verwijderen na opnieuw opstarten: " # ^ErrorCreatingShortcut "Fout bij maken snelkoppeling: " # ^ErrorCreating "Fout bij maken: " # ^ErrorDecompressing Fout bij uitpakken van gegevens! Gegevens beschadigd? # ^ErrorRegistering Fout bij registreren DLL # ^ExecShell "ExecShell: " # ^Exec "Uitvoeren: " # ^Extract "Uitpakken: " # ^ErrorWriting "Uitpakken: fout bij schrijven naar bestand " # ^InvalidOpcode Installatieprogramma beschadigd: ongeldige opcode # ^NoOLE "Geen OLE voor: " # ^OutputFolder "Uitvoermap: " # ^RemoveFolder "Map verwijderen: " # ^RenameOnReboot "Hernoemen na opnieuw opstarten: " # ^Rename "Hernoemen: " # ^Skipped "Overgeslagen: " # ^CopyDetails Details kopiëren naar klembord # ^LogInstall Gegevens over installatie bewaren # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Dutch.nsh000077500000000000000000000173651477201124000204160ustar00rootroot00000000000000;Language: Dutch (1043) ;By Joost Verburg !insertmacro LANGFILE "Dutch" = "Nederlands" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA)-installatiewizard" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Deze wizard zal $(^NameDA) op uw systeem installeren.$\r$\n$\r$\nHet wordt aanbevolen alle overige toepassingen af te sluiten alvorens de installatie te starten. Dit maakt het mogelijk relevante systeembestanden bij te werken zonder uw systeem opnieuw op te moeten starten.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA)-deïnstallatiewizard" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Deze wizard zal $(^NameDA) van uw syteem verwijderen.$\r$\n$\r$\nControleer voordat u begint met verwijderen of $(^NameDA) is afgesloten.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licentieovereenkomst" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lees de licentieovereenkomst voordat u $(^NameDA) installeert." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op Akkoord om verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren." !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licentieovereenkomst" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op Akkoord op verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen." !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Druk op Page Down om de rest van de overeenkomst te zien." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Onderdelen kiezen" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies de onderdelen die u wilt installeren." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Onderdelen kiezen" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies de onderdelen die u wilt verwijderen." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschrijving" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg uw muis over een onderdeel om de beschrijving te zien." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selecteer een onderdeel om de beschrijving te zien." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Installatielocatie kiezen" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies de map waarin u $(^NameDA) wilt installeren." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Locatie kiezen" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies de map waaruit u $(^NameDA) wilt verwijderen." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Bezig met installeren" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Een ogenblik geduld terwijl $(^NameDA) wordt geïnstalleerd." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installatie voltooid" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "De installatie is succesvol voltooid." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installatie afgebroken" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "De installatie is niet voltooid." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Bezig met verwijderen" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Een ogenblik geduld terwijl $(^NameDA) van uw systeem wordt verwijderd." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Verwijderen gereed" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "$(^NameDA) is van uw systeem verwijderd." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Verwijderen afgebroken" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "$(^NameDA) is niet volledig van uw systeem verwijderd." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA)-installatiewizard" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geïnstalleerd op uw systeem.$\r$\n$\r$\nKlik op Voltooien om deze wizard te sluiten." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Uw systeem moet opnieuw worden opgestart om de installatie van $(^NameDA) te voltooien. Wilt u nu herstarten?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA)-deïnstallatiewizard" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is van uw systeem verwijderd.$\r$\n$\r$\nKlik op Voltooien om deze wizard te sluiten." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Uw systeem moet opnieuw worden opgestart om het verwijderen van $(^NameDA) te voltooien. Wilt u nu herstarten?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Nu herstarten" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ik wil later handmatig herstarten" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &starten" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Leesmij weergeven" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Voltooien" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenumap kiezen" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies een map in het menu Start voor de snelkoppelingen van $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies een map in het menu Start waarin de snelkoppelingen moeten worden aangemaakt. U kunt ook een naam invoeren om een nieuwe map te maken." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Geen snelkoppelingen aanmaken" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) verwijderen" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) van uw systeem verwijderen." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Weet u zeker dat u de $(^Name)-installatie wilt afsluiten?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Weet u zeker dat u de $(^Name)-deïnstallatie wilt afsluiten?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Gebruikers kiezen" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Kies voor welke gebruikers u $(^NameDA) wilt installeren." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selecteer of u $(^NameDA) alleen voor uzelf of voor alle gebruikers van deze computer wilt installeren. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installeer voor alle gebruikers van deze computer" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installeer alleen voor mijzelf" !endif nsis-3.11/Contrib/Language files/Efik.nlf000077500000000000000000000130331477201124000202000ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1538 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page (I don't know the correct codepage, forcing Unicode for now) 1200 # RTL - anything else than RTL means LTR - # Translation by ..... (any credits should go here) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Nte EtiÌ£mde # ^UninstallCaption $(^Name) Sio Fep # ^LicenseSubCaption : Ediomi UnyiÌ£me # ^ComponentsSubCaption : Mme UsuÌ£nÌ„ EÌ£dade EÌ£siÌ£n # ^DirSubCaption : NtoÌ£t EdisiÌ£n Odu Mi # ^InstallingSubCaption : EdisiÌ£n # ^CompletedSubCaption : EsiÌ£n Ama # ^UnComponentsSubCaption : Mme UsuÌ£nÌ„ Edisio Mfep # ^UnDirSubCaption : NtoÌ£t Edisio Mfep Odu Mi # ^ConfirmSubCaption : Fiak Se # ^UninstallingSubCaption : Edisio Mfep # ^UnCompletedSubCaption : Osio Efep # ^BackBtn < &Fiak Edem # ^NextBtn &Ka Iso > # ^AgreeBtn Ami &MmenyiÌ£me # ^AcceptBtn Ami &mmenyiÌ£me se eÌ£tiÌ£nÌ„de ke Ediomi UnyiÌ£me # ^DontAcceptBtn Ami &nnyiÌ£meke se eÌ£tiÌ£nÌ„de ke Ediomi UnyiÌ£me # ^InstallBtn &SiÌ£n # ^UninstallBtn &Sio Fep # ^CancelBtn Kûnam # ^CloseBtn &Men Fep # ^BrowseBtn Y&om... # ^ShowDetailsBtn WuÌ£t &oÌ£yoÌ£hoÌ£ ntoÌ£t # ^ClickNext FiÌ£k Ka Iso man aka iso. # ^ClickInstall FiÌ£k SiÌ£n man oÌ£toÌ£nÌ„oÌ£ ndisiÌ£n. # ^ClickUninstall FiÌ£k Sio Fep man oÌ£toÌ£nÌ„oÌ£ ndisio mfep. # ^Name EnyiÌ£nÌ„ # ^Completed Osio Efep # ^LicenseText MboÌ£k kot ediomi unyiÌ£me mbemiso esiÌ£nde $(^NameDA). Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, fiÌ£k Ami MmenyiÌ£me. # ^LicenseTextCB MboÌ£k kot ediomi unyiÌ£me mbemiso esiÌ£nde $(^NameDA). Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, fiÌ£k ekebe odude mi ke idak. $_CLICK # ^LicenseTextRB MboÌ£k kot ediomi unyiÌ£me mbemiso esiÌ£nde $(^NameDA). Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, mek akpa nÌ„kpoÌ£ mi ke idak. $_CLICK # ^UnLicenseText MboÌ£k kot ediomi unyiÌ£me mbemiso osiode efep $(^NameDA). Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, fiÌ£k Ami MmenyiÌ£me. # ^UnLicenseTextCB MboÌ£k kot ediomi unyiÌ£me mbemiso osiode efep $(^NameDA). Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, fiÌ£k ekebe odude mi ke idak. $_CLICK # ^UnLicenseTextRB MboÌ£k kot ediomi unyiÌ£me mbemiso osiode efep $(^NameDA). Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, mek akpa nÌ„kpoÌ£ mi ke idak. $_CLICK # ^Custom Nte oyomde etie # ^ComponentsText SiÌ£n idioÌ£nÌ„oÌ£ ke mme ikpehe oro oyomde ndisiÌ£n nyuÌ£nÌ„ sio idioÌ£nÌ„oÌ£ ke mme ikpehe oro mûyomke ndisiÌ£n. $_CLICK # ^ComponentsSubText1 Mme usuÌ£nÌ„ edida nsiÌ£n: # ^ComponentsSubText2_NoInstTypes Mek mme ikpehe oro edisiÌ£nde: # ^ComponentsSubText2 MîdiÌ£ghe, mek mme ikpehe oro eÌ£mekde-mek emi amade ndisiÌ£n: # ^UnComponentsText SiÌ£n idioÌ£nÌ„oÌ£ ke mme ikpehe oro oyomde ndisio mfep nyuÌ£nÌ„ sio idioÌ£nÌ„oÌ£ ke mme ikpehe oro mûyomke ndisio mfep. $_CLICK # ^UnComponentsSubText1 Mek usuÌ£nÌ„ edisio mfep: # ^UnComponentsSubText2_NoInstTypes Mek mme ikpehe oro edisiode ifep: # ^UnComponentsSubText2 MîdiÌ£ghe, mek mme ikpehe oro eÌ£mekde-mek emi amade ndisio mfep: # ^DirText Nte EtiÌ£mde oÌ£moÌ£nÌ„ esiÌ£n $(^NameDA) ke ebiet etienede mi. Man esiÌ£n ke ebiet enÌ„wen, fiÌ£k Yom nyuÌ£nÌ„ mek ebiet enÌ„wen. $_CLICK # ^DirSubText Ebiet Oro Oyomde EsiÌ£n # ^DirBrowseText Mek ebiet man esiÌ£n $(^NameDA) ke: # ^UnDirText Nte EÌ£tiÌ£mde oÌ£moÌ£nÌ„ osio $(^NameDA) efep ke ebiet etienede mi. Man osio efep ke ebiet enÌ„wen, fiÌ£k Yom nyuÌ£nÌ„ mek ebiet enÌ„wen. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Mek ebiet man osio $(^NameDA) efep ke: # ^SpaceAvailable "UfanÌ„ oro osuÌ£hoÌ£de: " # ^SpaceRequired "UfanÌ„ oro oyomde: " # ^UninstallingText $(^NameDA) oÌ£moÌ£nÌ„ oÌ£woÌ£roÌ£ ke ebiet oro etienede mi. $_CLICK # ^UninstallingSubText Ke osionÌ„o nÌ„kpoÌ£: # ^FileError MfiÌ£na odu ikemeke ndikuÌ£boÌ£de: \r\n\r\n$0\r\n\r\nFiÌ£k Tre man etre ndisiÌ£n,\r\nFiak Domo man esiÌ£n, mÌ€mê\r\nFuÌ£mi man ebe ebiet emi. # ^FileError_NoIgnore MfiÌ£na odu ikemeke ndikuÌ£boÌ£de: \r\n\r\n$0\r\n\r\nFiÌ£k Fiak Domo, mÌ€mê\r\nKûnam man etre ndisiÌ£n. # ^CantWrite "Ikemeke ndisiÌ£n: " # ^CopyFailed Ikemeke ndikoÌ£pi # ^CopyTo "KoÌ£pi ka " # ^Registering "Ke anam: " # ^Unregistering "Inamke: " # ^SymbolNotFound "Ikwe idionÌ„oÌ£: " # ^CouldNotLoad "Ikemeke ndikuÌ£boÌ£de: " # ^CreateFolder "Nam ebiet ndisiÌ£n: " # ^CreateShortcut "KoÌ£pi nị̣m ke ebiet eÌ£disoÌ£pde ikuÌ£t: " # ^CreatedUninstaller "Se eÌ£dade eÌ£sio nÌ„kpoÌ£ eÌ£fep: " # ^Delete "SoÌ£hi udoÌ£nÌ„nÌ„kpoÌ£: " # ^DeleteOnReboot "SoÌ£hi ama afiak oÌ£toÌ£nÌ„oÌ£: " # ^ErrorCreatingShortcut "MfiÌ£na odu ikemeke ndikọ̣pi nniÌ£m ke ebiet eÌ£disoÌ£pde ikuÌ£t: " # ^ErrorCreating "MfiÌ£na odu ikemeke ndinam: " # ^ErrorDecompressing MfiÌ£na odu ikemeke ndifiak ntie nte eketiede! Se eÌ£dade eÌ£sio nÌ„kpoÌ£ abiara? # ^ErrorRegistering MfiÌ£na odu ikemeke ndinam DLL # ^ExecShell "EbietEdimekSeEÌ£yomde: " # ^Exec "Nam: " # ^Extract "Sio di: " # ^ErrorWriting "Sio di: mfiÌ£na odu ikemeke ndisio ndi " # ^InvalidOpcode Se eÌ£dade eÌ£sio nÌ„kpoÌ£ abiara: idioÌ£k usuÌ£nÌ„ edinam # ^NoOLE "OLE iduÌ£he ke: " # ^OutputFolder "Ebiet ntoÌ£t oÌ£doÌ£nÌ„oÌ£de: " # ^RemoveFolder "Sio ebiet fep: " # ^RenameOnReboot "KpuÌ£hoÌ£ enyiÌ£nÌ„ ama afiak oÌ£toÌ£nÌ„oÌ£: " # ^Rename "KpuÌ£hoÌ£ enyiÌ£nÌ„: " # ^Skipped "Be kpoÌ£nÌ„: " # ^CopyDetails KoÌ£pi OÌ£yoÌ£hoÌ£ NtoÌ£t Kama # ^LogInstall NtoÌ£t ndutiÌ£m edisiÌ£n nÌ„kpoÌ£ # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Efik.nsh000077500000000000000000000114271477201124000202160ustar00rootroot00000000000000;Language: EfiÌ£k (1033) !insertmacro LANGFILE "Efik" = "EfiÌ£k" "Efik" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Emi edi $(^NameDA) Nte EÌ£tiÌ£mde" #FIXME:MUI_TEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_UNWELCOMEPAGE #FIXME:MUI_UNTEXT_WELCOME_INFO_TITLE #FIXME:MUI_UNTEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ediomi UnyiÌ£me" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "MboÌ£k kot ediomi unyÌ£me mbemiso esiÌ£nde $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Edieke enyiÌ£mede kpukpru se eÌ£tiÌ£nÌ„de ke ediomi emi, fiÌ£k Ami MmenyiÌ£me man aka iso. Ana enyiÌ£me ediomi emi mîdiÌ£ghe idisiÌ£nke $(^NameDA)." #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_UNLICENSEPAGE #FIXME:MUI_UNTEXT_LICENSE_TITLE #FIXME:MUI_UNTEXT_LICENSE_SUBTITLE #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "FiÌ£k Ka IsoÌ£nÌ„ man okuÌ£t ediomi emi osuÌ£hoÌ£de." !endif !ifdef MUI_COMPONENTSPAGE #FIXME:MUI_TEXT_COMPONENTS_TITLE #FIXME:MUI_TEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_UNCOMPONENTSPAGE #FIXME:MUI_UNTEXT_COMPONENTS_TITLE #FIXME:MUI_UNTEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "EditiÌ£nÌ„ nte etiede" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE #FIXME:MUI_TEXT_DIRECTORY_TITLE #FIXME:MUI_TEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_UNDIRECTORYPAGE #FIXME:MUI_UNTEXT_DIRECTORY_TITLE #FIXME:MUI_UNTEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ke esiÌ£n" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "MboÌ£k bet ke ini esiÌ£nde $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "EsiÌ£n OkuÌ£re" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Nte EÌ£tiÌ£mde okuÌ£re uforo uforo." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Nte EÌ£tiÌ£mde ikuÌ£reke uforo uforo." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ke osio" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "MboÌ£k bet ke ini osiode $(^NameDA) efep." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Osio Efep OkuÌ£re" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Osio Efep OkuÌ£re Uforo Uforo." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Etre Ndisio Mfep" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Isioho Ifep Uforo Uforo." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Nte EÌ£tiÌ£mde $(^NameDA) OÌ£moÌ£nÌ„ OkuÌ£re" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "EsiÌ£n $(^NameDA) ke koÌ£mputa fo.$\r$\n$\r$\nFiÌ£k OkuÌ£re man emen Nte EÌ£tiÌ£mde efep." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ana afiak oÌ£toÌ£nÌ„oÌ£ koÌ£mputa fo man okuÌ£re edisiÌ£n $(^NameDA). Ndi omoyom ndifiak ntoÌ£nÌ„o koÌ£mputa?" !endif !ifdef MUI_UNFINISHPAGE #FIXME:MUI_UNTEXT_FINISH_INFO_TITLE #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT #FIXME:MUI_UNTEXT_FINISH_INFO_REBOOT !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Fiak toÌ£nÌ„oÌ£ idahaemi" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nyom ndifiak ntoÌ£nÌ„oÌ£ ke idemmi ama ekem" ${LangFileString} MUI_TEXT_FINISH_RUN "&KuÌ£boÌ£de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&WuÌ£t Kot-emi" ${LangFileString} MUI_BUTTONTEXT_FINISH "&OkuÌ£re" !endif !ifdef MUI_STARTMENUPAGE #FIXME:MUI_TEXT_STARTMENU_TITLE #FIXME:MUI_TEXT_STARTMENU_SUBTITLE #FIXME:MUI_INNERTEXT_STARTMENU_TOP #FIXME:MUI_INNERTEXT_STARTMENU_CHECKBOX !endif !ifdef MUI_UNCONFIRMPAGE #FIXME:MUI_UNTEXT_CONFIRM_TITLE #FIXME:MUI_UNTEXT_CONFIRM_SUBTITLE !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ndi emenenÌ„ede oyom ndiwoÌ£roÌ£ ke Nte EÌ£tiÌ£mde $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ndi emenenÌ„ede oyom ndiwoÌ£roÌ£ ke Edisio $(^Name) Mfep?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE " #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Language files/English.nlf000077500000000000000000000115211477201124000207130ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1033 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page - # RTL - anything else than RTL means LTR - # Translation by ..... (any credits should go here) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Setup # ^UninstallCaption $(^Name) Uninstall # ^LicenseSubCaption : License Agreement # ^ComponentsSubCaption : Installation Options # ^DirSubCaption : Installation Folder # ^InstallingSubCaption : Installing # ^CompletedSubCaption : Completed # ^UnComponentsSubCaption : Uninstallation Options # ^UnDirSubCaption : Uninstallation Folder # ^ConfirmSubCaption : Confirmation # ^UninstallingSubCaption : Uninstalling # ^UnCompletedSubCaption : Completed # ^BackBtn < &Back # ^NextBtn &Next > # ^AgreeBtn I &Agree # ^AcceptBtn I &accept the terms of the License Agreement # ^DontAcceptBtn I &do not accept the terms of the License Agreement # ^InstallBtn &Install # ^UninstallBtn &Uninstall # ^CancelBtn Cancel # ^CloseBtn &Close # ^BrowseBtn B&rowse... # ^ShowDetailsBtn Show &details # ^ClickNext Click Next to continue. # ^ClickInstall Click Install to start the installation. # ^ClickUninstall Click Uninstall to start the uninstallation. # ^Name Name # ^Completed Completed # ^LicenseText Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click I Agree. # ^LicenseTextCB Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK # ^LicenseTextRB Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK # ^UnLicenseText Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click I Agree. # ^UnLicenseTextCB Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK # ^UnLicenseTextRB Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK # ^Custom Custom # ^ComponentsText Check the components you want to install and uncheck the components you don't want to install. $_CLICK # ^ComponentsSubText1 Select the type of install: # ^ComponentsSubText2_NoInstTypes Select components to install: # ^ComponentsSubText2 Or, select the optional components you wish to install: # ^UnComponentsText Check the components you want to uninstall and uncheck the components you don't want to uninstall. $_CLICK # ^UnComponentsSubText1 Select the type of uninstall: # ^UnComponentsSubText2_NoInstTypes Select components to uninstall: # ^UnComponentsSubText2 Or, select the optional components you wish to uninstall: # ^DirText Setup will install $(^NameDA) in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK # ^DirSubText Destination Folder # ^DirBrowseText Select the folder to install $(^NameDA) in: # ^UnDirText Setup will uninstall $(^NameDA) from the following folder. To uninstall from a different folder, click Browse and select another folder. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Select the folder to uninstall $(^NameDA) from: # ^SpaceAvailable "Space available: " # ^SpaceRequired "Space required: " # ^UninstallingText $(^NameDA) will be uninstalled from the following folder. $_CLICK # ^UninstallingSubText Uninstalling from: # ^FileError Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Abort to stop the installation,\r\nRetry to try again, or\r\nIgnore to skip this file. # ^FileError_NoIgnore Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Retry to try again, or\r\nCancel to stop the installation. # ^CantWrite "Can't write: " # ^CopyFailed Copy failed # ^CopyTo "Copy to " # ^Registering "Registering: " # ^Unregistering "Unregistering: " # ^SymbolNotFound "Could not find symbol: " # ^CouldNotLoad "Could not load: " # ^CreateFolder "Create folder: " # ^CreateShortcut "Create shortcut: " # ^CreatedUninstaller "Created uninstaller: " # ^Delete "Delete file: " # ^DeleteOnReboot "Delete on reboot: " # ^ErrorCreatingShortcut "Error creating shortcut: " # ^ErrorCreating "Error creating: " # ^ErrorDecompressing Error decompressing data! Corrupted installer? # ^ErrorRegistering Error registering DLL # ^ExecShell "ExecShell: " # ^Exec "Execute: " # ^Extract "Extract: " # ^ErrorWriting "Extract: error writing to file " # ^InvalidOpcode Installer corrupted: invalid opcode # ^NoOLE "No OLE for: " # ^OutputFolder "Output folder: " # ^RemoveFolder "Remove folder: " # ^RenameOnReboot "Rename on reboot: " # ^Rename "Rename: " # ^Skipped "Skipped: " # ^CopyDetails Copy Details To Clipboard # ^LogInstall Log install process # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/English.nsh000077500000000000000000000171011477201124000207240ustar00rootroot00000000000000;Language: English (1033) ;By Joost Verburg !insertmacro LANGFILE "English" "English" "English" "English" ; See \Include\LangFile.nsh for a description of these parameters !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welcome to $(^NameDA) Setup" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Setup will guide you through the installation of $(^NameDA).$\r$\n$\r$\nIt is recommended that you close all other applications before starting Setup. This will make it possible to update relevant system files without having to reboot your computer.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welcome to $(^NameDA) Uninstall" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Setup will guide you through the uninstallation of $(^NameDA).$\r$\n$\r$\nBefore starting the uninstallation, make sure $(^NameDA) is not running.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "License Agreement" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Please review the license terms before installing $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to install $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to install $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to install $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "License Agreement" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Please review the license terms before uninstalling $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to uninstall $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to uninstall $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to uninstall $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Press Page Down to see the rest of the agreement." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Choose Components" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to install." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Choose Components" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to uninstall." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Position your mouse over a component to see its description." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Select a component to see its description." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Choose Install Location" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Choose the folder in which to install $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Choose Uninstall Location" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Choose the folder from which to uninstall $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installing" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Please wait while $(^NameDA) is being installed." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation Complete" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup was completed successfully." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup was not completed successfully." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstalling" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Please wait while $(^NameDA) is being uninstalled." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uninstallation Complete" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall was completed successfully." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uninstallation Aborted" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall was not completed successfully." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completing $(^NameDA) Setup" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) has been installed on your computer.$\r$\n$\r$\nClick Finish to close Setup." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the installation of $(^NameDA). Do you want to reboot now?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completing $(^NameDA) Uninstall" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) has been uninstalled from your computer.$\r$\n$\r$\nClick Finish to close Setup." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the uninstallation of $(^NameDA). Do you want to reboot now?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot now" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "I want to manually reboot later" ${LangFileString} MUI_TEXT_FINISH_RUN "&Run $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Show Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finish" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Choose Start Menu Folder" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Choose a Start Menu folder for the $(^NameDA) shortcuts." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Select the Start Menu folder in which you would like to create the program's shortcuts. You can also enter a name to create a new folder." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Do not create shortcuts" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uninstall $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remove $(^NameDA) from your computer." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Setup?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Uninstall?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choose Users" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Choose for which users you want to install $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Select whether you want to install $(^NameDA) only for yourself or for all users of this computer. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Install for anyone using this computer" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Install just for me" !endif nsis-3.11/Contrib/Language files/Esperanto.nlf000077500000000000000000000123351477201124000212660ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID (none exists for Esperanto at the moment) 9998 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page - # RTL - anything else than RTL means LTR - # Translation v4.0.3 by Felipe Castro # ^Branding Nullsoft Install System %s # ^SetupCaption Instalado de $(^Name) # ^UninstallCaption Malinstalado de $(^Name) # ^LicenseSubCaption : Permes-Kontrakto # ^ComponentsSubCaption : Instaladaj Opcioj # ^DirSubCaption : Instalada Dosierujo # ^InstallingSubCaption : Oni Instalas Dosierojn # ^CompletedSubCaption : Kompletite # ^UnComponentsSubCaption : Malinstaladaj Opcioj # ^UnDirSubCaption : Malinstalada Dosierujo # ^ConfirmSubCaption : Konfirmo # ^UninstallingSubCaption : Oni malinstalas # ^UnCompletedSubCaption : Kompletite # ^BackBtn < &Antauxe # ^NextBtn &Sekve > # ^AgreeBtn &Akceptite # ^AcceptBtn Mi &akceptas la kondicxojn de la Permes-Kontrakto # ^DontAcceptBtn Mi &ne akceptas la kondicxojn de la Permes-Kontrakto # ^InstallBtn &Instali # ^UninstallBtn &Malinstali # ^CancelBtn Nuligi # ^CloseBtn &Fermi # ^BrowseBtn &Sercxi... # ^ShowDetailsBtn Vidi &Detalojn # ^ClickNext Musklaku en 'Sekve' por dauxrigi. # ^ClickInstall Musklaku en 'Instali' por ekigi la instaladon. # ^ClickUninstall Musklaku en 'Malinstali' por ekigi la malinstaladon. # ^Name Nomo # ^Completed Kompletite # ^LicenseText Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'. # ^LicenseTextCB Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK # ^LicenseTextRB Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK # ^UnLicenseText Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'. # ^UnLicenseTextCB Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK # ^UnLicenseTextRB Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK # ^Custom Personigite # ^ComponentsText Marku la konsisterojn, kiujn vi deziras instali kaj malmarku tiujn, kiujn vi ne deziras instali. $_CLICK # ^ComponentsSubText1 Elektu la tipon de instalado: # ^ComponentsSubText2_NoInstTypes Elektu la konsisterojn por instali: # ^ComponentsSubText2 Aux, elektu la nedevigajn konsisterojn, kiujn vi deziras instali: # ^UnComponentsText Marku la konsisterojn, kiujn vi volas malinstali aux male. $_CLICK # ^UnComponentsSubText1 Elektu la tipon de malinstalado: # ^UnComponentsSubText2_NoInstTypes Elektu la konsisterojn por malinstali: # ^UnComponentsSubText2 Aux, elektu la nedevigajn konsisterojn, kiujn vi deziras malinstali: # ^DirText $(^NameDA) estos instalita en la jena dosierujo. Por instali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK # ^DirSubText Celota Dosierujo # ^DirBrowseText Elektu dosierujon por instali $(^NameDA): # ^UnDirText $(^NameDA) estos malinstalita el la jena dosierujo. Por malinstali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Elektu dosierujon el kie $(^NameDA) estos malinstalita: # ^SpaceAvailable "Disponebla spaco: " # ^SpaceRequired "Postulata spaco: " # ^UninstallingText $(^NameDA) estos malinstalita el la jena dosierujo. $_CLICK # ^UninstallingSubText Malinstalado el: # ^FileError Eraro dum malfermo de dosiero por skribi: \r\n\t"$0"\r\nMusklaku en Cxesigi por finigi la instaladon,\r\Ripeti por provi refoje skribi sur la dosiero, aux\r\nPreteratenti por preteratenti tiun cxi dosieron. # ^FileError_NoIgnore Eraro dum malfermo de dosierujo por skribi: \r\n\t"$0"\r\nMusklaku en Ripeti por provi refoje skribi sur la dosiero, aux\r\nNuligi por cxesigi la instaladon. # ^CantWrite "Ne eblis skribi: " # ^CopyFailed Malsukceso dum kopio # ^CopyTo "Kopii al " # ^Registering "Oni registras: " # ^Unregistering "Oni malregistras: " # ^SymbolNotFound "Ne trovita simbolo: " # ^CouldNotLoad "Ne eblis sxargi: " # ^CreateFolder "Oni kreas subdosierujon: " # ^CreateShortcut "Oni kreas lancxilon: " # ^CreatedUninstaller "Oni kreas malinstalilon: " # ^Delete "Oni forigas dosieron: " # ^DeleteOnReboot "Forigi je restarto: " # ^ErrorCreatingShortcut "Eraro dum kreo de lancxilo: " # ^ErrorCreating "Eraro dum kreo: " # ^ErrorDecompressing Eraro dum malkompaktigo de datumaro! Cxu misrompita instalilo? # ^ErrorRegistering Eraru dum registro de DLL # ^ExecShell "ExecShell: " # ^Exec "Lancxi: " # ^Extract "Eltiri: " # ^ErrorWriting "Eltirado: eraro dum skribo de dosiero " # ^InvalidOpcode Misrompita instalilo: malvalida operaci-kodo # ^NoOLE "Sen OLE por: " # ^OutputFolder "Celota dosierujo: " # ^RemoveFolder "Oni forigas la dosierujon: " # ^RenameOnReboot "Renomigi je restarto: " # ^Rename "Oni renomigas: " # ^Skipped "Preterpasita: " # ^CopyDetails Kopii detalojn al la tondejo # ^LogInstall Registri instalad-procezo # ^Byte B # ^Kilo k # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Esperanto.nsh000077500000000000000000000174721477201124000213060ustar00rootroot00000000000000;Language: Esperanto (0) ;By Felipe Castro !insertmacro LANGFILE "Esperanto" = "Esperanto" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bonvenon al la Gvidilo por Instalado de $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tiu cxi gvidilo helpos vin dum la instalado de $(^NameDA).$\r$\n$\r$\nOni rekomendas fermi cxiujn aliajn aplikajxojn antaux ol ekigi la Instaladon. Tio cxi ebligos al la Instalilo gxisdatigi la koncernajn dosierojn de la sistemo sen bezono restartigi la komputilon.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bonvenon al la Gvidilo por Malinstalado de $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tiu cxi gvidilo helpos vin dum la malinstalado de $(^NameDA).$\r$\n$\r$\nAntaux ol ekigi la malinstalado, certigxu ke $(^NameDA) ne estas plenumata nun.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Permes-Kontrakto" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bonvole, kontrolu la kondicxojn de la permesilo antaux ol instali la programon $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por instali la programon $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Permes-Kontrakto" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Bonvole, kontrolu la kondicxojn de la permesilo antaux ol malinstali la programon $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premu 'Page Down' por rigardi la reston de la permeso." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Elekto de Konsisteroj" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Elektu kiujn funkciojn de $(^NameDA) vi deziras instali." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Elekto de Konsisteroj" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Elektu kiujn funkciojn de $(^NameDA) vi deziras malinstali." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Priskribo" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Poziciu la muson sur konsistero por rigardi ties priskribon." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elekto de la Instalada Loko" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elektu la dosierujon en kiun vi deziras instali la programon $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elekto de la Malinstalada Loko" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elektu la dosierujon el kiu vi deziras malinstali la programon $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Oni instalas" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Bonvole, atendu dum $(^NameDA) estas instalata." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalado Plenumite" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalado sukcese plenumigxis." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalado Cxesigite" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalado ne plenumigxis sukcese." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Oni malinstalas" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bonvole, atendu dum $(^NameDA) estas malinstalata." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Malinstalado Plenumite" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La malinstalado sukcese plenumigxis." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Malinstalado Cxesigxite" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La malinstalado ne plenumigxis sukcese." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Oni finigas la Gvidilon por Instalado de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) estas instalita en via komputilo.$\r$\n$\r$\nMusklaku en Finigi por fermi tiun cxi gvidilon." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Via komputilo devas esti restartigita por kompletigi la instaladon de $(^NameDA). Cxu restartigi nun?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Oni finigas la Gvidilon por Malinstalado de $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) estis forigita el via komputilo.$\r$\n$\r$\nMusklaku en Finigi por fermi tiun cxi gvidilon." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Via komputilo devas esti restartigita por kompletigi la malinstaladon de $(^NameDA). Cxu restartigi nun?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Restartigi Nun" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Mi volas restartigi permane poste" ${LangFileString} MUI_TEXT_FINISH_RUN "&Lancxi $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Montri Legumin" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finigi" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elektu Dosierujon de la Ek-Menuo" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elektu dosierujon de la Ek-Menuo por la lancxiloj de la programo." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Elektu dosierujon de la Ek-Menuo en kiu vi deziras krei la lancxilojn de la programo. Vi povas ankaux tajpi nomon por krei novan ujon." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne krei lancxilojn" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Malinstali $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Forigi $(^NameDA) el via komputilo." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Cxu vi certe deziras nuligi la instaladon de $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Cxu vi certe deziras nuligi la malinstaladon de $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elekti Uzantojn" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elekti por kiuj uzantoj vi deziras instali $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Elektu cxu vi volas instali $(^NameDA) por vi mem aux por cxiuj uzantoj de tiu cxi komputilo. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instali por iu ajn uzanto de tiu cxi komputilo" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instali nur por mi" !endif nsis-3.11/Contrib/Language files/Estonian.nlf000077500000000000000000000114411477201124000211030ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1061 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1257 # RTL - anything else than RTL means LTR - # Translation by izzo (izzo@hot.ee) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Paigaldamine # ^UninstallCaption $(^Name) Eemaldamine # ^LicenseSubCaption : Litsentsileping # ^ComponentsSubCaption : Paigaldusvalikud # ^DirSubCaption : Paigalduskaust # ^InstallingSubCaption : Paigaldan # ^CompletedSubCaption : Valmis # ^UnComponentsSubCaption : Eemaldusvalikud # ^UnDirSubCaption : Eemalduskaust # ^ConfirmSubCaption : Kinnitus # ^UninstallingSubCaption : Eemaldan # ^UnCompletedSubCaption : Valmis # ^BackBtn < Tagasi # ^NextBtn Edasi > # ^AgreeBtn Nõustun # ^AcceptBtn Nõustun litsentsilepingu tingimustega # ^DontAcceptBtn Ei nõustu litsentsilepingu tingimustega # ^InstallBtn Paigalda # ^UninstallBtn Eemalda # ^CancelBtn Loobu # ^CloseBtn Sule # ^BrowseBtn Sirvi... # ^ShowDetailsBtn Detailid # ^ClickNext Jätkamiseks vajuta Edasi. # ^ClickInstall Paigaldamise alustamiseks vajuta Paigalda. # ^ClickUninstall Eemaldamise alustamiseks vajuta Eemalda. # ^Name Nimi # ^Completed Valmis # ^LicenseText Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vajuta Nõustun. # ^LicenseTextCB Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vali allolev märkeruut. $_CLICK # ^LicenseTextRB Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, märgi allpool esimene valik. $_CLICK # ^UnLicenseText Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vajuta Nõustun. # ^UnLicenseTextCB Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vali allolev märkeruut. $_CLICK # ^UnLicenseTextRB Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, märgi allpool esimene valik. $_CLICK # ^Custom Kohandatud # ^ComponentsText Märgista komponendid mida soovid paigaldada ja eemalda märgistus neilt, mida ei soovi paigaldada. $_CLICK # ^ComponentsSubText1 Vali paigalduse tüüp: # ^ComponentsSubText2_NoInstTypes Vali paigaldatavad komponendid: # ^ComponentsSubText2 või vali lisakomponendid mida soovid paigaldada: # ^UnComponentsText Märgista komponendid mida soovid eemaldada ja eemalda märgistus neilt, mida ei soovi eemaldada. $_CLICK # ^UnComponentsSubText1 Vali eemalduse tüüp: # ^UnComponentsSubText2_NoInstTypes Vali eemaldatavad komponendid: # ^UnComponentsSubText2 või vali lisakomponendid mida soovid eemaldada: # ^DirText $(^NameDA) paigaldatakse järgmisse kausta. Et mujale paigaldada, vajuta sirvi ja vali teine kaust. $_CLICK # ^DirSubText Sihtkaust # ^DirBrowseText Vali kaust kuhu $(^NameDA) paigaldada: # ^UnDirText $(^NameDA) eemaldatakse järgmisest kaustast. Et mujalt eemaldada, vajuta sirvi ja vali teine kaust. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Vali kaust kust $(^NameDA) eemaldada: # ^SpaceAvailable "Vaba ruum: " # ^SpaceRequired "Vajalik ruum: " # ^UninstallingText $(^NameDA) eemaldatakse järgmisest kaustast. $_CLICK # ^UninstallingSubText Eemaldan sealt: # ^FileError Tõrge faili avamisel kirjutamiseks: \r\n\t"$0"\r\nPaigalduse katkestamiseks vajuta Katkesta,\r\nvajuta Ürita uuesti, et faili kirjutamist uuesti proovida, või\r\nIgnoreeri, et see fail vahele jätta. # ^FileError_NoIgnore Tõrge faili avamisel kirjutamiseks: \r\n\t"$0"\r\nVajuta Ürita uuesti, et faili kirjutamist uuesti proovida, või\r\nLoobu, et paigaldamine katkestada # ^CantWrite "Ei saa kirjutada: " # ^CopyFailed Kopeerimine ebaõnnestus # ^CopyTo "Kopeeri sinna " # ^Registering "Registreerin: " # ^Unregistering "Deregistreerin: " # ^SymbolNotFound "Ei leidnud sümbolit: " # ^CouldNotLoad "Ei saanud laadida: " # ^CreateFolder "Loo kaust: " # ^CreateShortcut "Loo otsetee: " # ^CreatedUninstaller "Loodud eemaldaja: " # ^Delete "Kustuta fail: " # ^DeleteOnReboot "Kustuta taaskäivitamisel: " # ^ErrorCreatingShortcut "Tõrge otsetee loomisel: " # ^ErrorCreating "Tõrge loomisel: " # ^ErrorDecompressing Tõrge andmete lahtipakkimisel! Vigane paigaldaja? # ^ErrorRegistering Tõrge DLL-i registreerimisel # ^ExecShell "ExecShell: " # ^Exec "Käivita: " # ^Extract "Paki lahti: " # ^ErrorWriting "Paki lahti: viga faili kirjutamisel " # ^InvalidOpcode Paigaldaja kõlbmatu: vigane opkood # ^NoOLE "No OLE for: " # ^OutputFolder "Väljastatav kaust: " # ^RemoveFolder "Eemalda kaust: " # ^RenameOnReboot "Taaskäivitusel nimeta ümber: " # ^Rename "Nimeta ümber: " # ^Skipped "Vahele jäetud: " # ^CopyDetails Kopeeri detailid lõikelauale # ^LogInstall Logi paigaldusprotsess # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Estonian.nsh000077500000000000000000000152401477201124000211150ustar00rootroot00000000000000;Language: Estonian (1061) ;Translated by johnny izzo (izzo@hot.ee) !insertmacro LANGFILE "Estonian" = "Eesti keel" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) paigaldamine!" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "See abiline aitab paigaldada $(^NameDA).$\r$\n$\r$\nEnne paigaldamise alustamist on soovitatav kõik teised programmid sulgeda, see võimaldab teatud süsteemifaile uuendada ilma arvutit taaskäivitamata.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) eemaldamine!" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "See abiline aitab eemaldada $(^NameDA).$\r$\n$\r$\nEnne eemaldamist vaata, et $(^NameDA) oleks suletud.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Litsentsileping" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Kui sa oled lepingu tingimustega nõus, vali jätkamiseks Nõustun. $(^NameDA) paigaldamiseks pead sa lepinguga nõustuma." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Kui nõustud lepingu tingimustega, vali allolev märkeruut. $(^NameDA) paigaldamiseks pead lepinguga nõustuma. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kui nõustud lepingu tingimustega, märgi allpool esimene valik. $(^NameDA) paigaldamiseks pead lepinguga nõustuma. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Litsentsileping" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Kui sa oled lepingu tingimustega nõus, vali jätkamiseks Nõustun. $(^NameDA) eemaldamiseks pead sa lepinguga nõustuma." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Kui nõustud lepingu tingimustega, vali allolev märkeruut. $(^NameDA) eemaldamiseks pead lepinguga nõustuma. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kui nõustud lepingu tingimustega, märgi allpool esimene valik. $(^NameDA) eemaldamiseks pead lepinguga nõustuma. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Vajuta Page Down, et näha ülejäänud teksti." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vali komponendid" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vali millised $(^NameDA) osad sa soovid paigaldada." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vali komponendid" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vali millised $(^NameDA) osad sa soovid eemaldada." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Kirjeldus" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Nihuta hiir komponendile, et näha selle kirjeldust." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vali komponent, et näha selle kirjeldust." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vali asukoht" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vali kaust kuhu paigaldada $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vali asukoht" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vali kaust kust $(^NameDA) eemaldada." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Paigaldan..." ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Palun oota kuni $(^NameDA) on paigaldatud." ${LangFileString} MUI_TEXT_FINISH_TITLE "Programm paigaldatud" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Paigaldus edukalt sooritatud." ${LangFileString} MUI_TEXT_ABORT_TITLE "Paigaldus katkestatud" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Paigaldamine ebaõnnestus." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Eemaldan..." ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Palun oota kuni $(^NameDA) on eemaldatud." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Eemaldamine lõpetatud" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Eemaldamine edukalt lõpule viidud." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Eemaldamine katkestatud" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Eemaldamine ebaõnestus." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) paigalduse lõpule viimine." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) on sinu arvutisse paigaldatud.$\r$\n$\r$\nAbilise sulgemiseks vajuta Lõpeta." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) täielikuks paigaldamiseks tuleb arvuti taaskäivitada. Kas soovid arvuti kohe taaskäivitada ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) eemaldamise lõpule viimine." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) on sinu arvutist eemaldatud.$\r$\n$\r$\nAbilise sulgemiseks vajuta Lõpeta." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) täielikuks eemaldamiseks tuleb arvuti taaskäivitada. Kas soovid arvuti kohe taaskäivitada ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Taaskäivita kohe" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Taaskäivitan hiljem käsitsi" ${LangFileString} MUI_TEXT_FINISH_RUN "Käivita $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Kuva Loemind" ${LangFileString} MUI_BUTTONTEXT_FINISH "Lõpeta" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vali Start-menüü kaust" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vali $(^NameDA) otseteede jaoks Start-menüü kaust." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vali Start-menüü kaust, kuhu soovid paigutada programmi otseteed. Võid ka sisestada nime, et luua uus kaust." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ära loo otseteid" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Eemalda $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Eemalda $(^NameDA) oma arvutist." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Oled sa kindel et soovid $(^Name) paigaldamise katkestada?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Oled sa kindel et soovid $(^Name) eemaldamise katkestada?" !endif nsis-3.11/Contrib/Language files/Farsi.nlf000077500000000000000000000154471477201124000204010ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1065 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1256 # RTL - anything else than RTL means LTR RTL # Translation By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com, Elnaz Sarbar # ^Branding Nullsoft Install System %s # ^SetupCaption نصب $(^Name) # ^UninstallCaption حذ٠$(^Name) # ^LicenseSubCaption : مجوز نصب # ^ComponentsSubCaption : گزینه‌های نصب # ^DirSubCaption : پوشه نصب # ^InstallingSubCaption : در حال نصب # ^CompletedSubCaption : پایان ÛŒØ§ÙØª # ^UnComponentsSubCaption : گزینه‌های حذ٠# ^UnDirSubCaption : پوشه‌ی حذ٠# ^ConfirmSubCaption : تأیید # ^UninstallingSubCaption : در حال حذ٠# ^UnCompletedSubCaption : پایان ÛŒØ§ÙØª # ^BackBtn &قبل # ^NextBtn &بعد # ^AgreeBtn &مواÙقم # ^AcceptBtn من همه‌ی بندهای مجوز را قبول &دارم # ^DontAcceptBtn من بندهای مجوز را قبول &ندارم # ^InstallBtn &نصب # ^UninstallBtn &حذ٠# ^CancelBtn انصرا٠# ^CloseBtn &بستن # ^BrowseBtn &مرور... # ^ShowDetailsBtn نمایش جزئیات # ^ClickNext برای ادامه روی دکمه‌ی بعد کلیک کنید. # ^ClickInstall برای شروع نصب روی دکمه‌ی نصب کلیک کنید. # ^ClickUninstall برای شروع حذ٠روی دکمه‌ی حذ٠کلیک کنید. # ^Name نام # ^Completed پایان ÛŒØ§ÙØª # ^LicenseText Ù„Ø·ÙØ§Ù‹ قبل از نصب $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی دکمه‌ی مواÙقم کلیک کنید. # ^LicenseTextCB Ù„Ø·ÙØ§Ù‹ قبل از نصب $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی جعبه نشانه‌زنی زیر کلیک کنید. $_CLICK # ^LicenseTextRB Ù„Ø·ÙØ§Ù‹ قبل از نصب $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید گزینه‌ی اول را انتخاب کنید. $_CLICK # ^UnLicenseText Ù„Ø·ÙØ§Ù‹ قبل از حذ٠$(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی دکمه‌ی مواÙقم کلیک کنید. # ^UnLicenseTextCB Ù„Ø·ÙØ§Ù‹ قبل از حذ٠$(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی جعبه نشانه‌زنی زیر کلیک کنید. $_CLICK # ^UnLicenseTextRB Ù„Ø·ÙØ§Ù‹ قبل از حذ٠$(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید گزینه‌ی اول را انتخاب کنید. $_CLICK # ^Custom Ø³ÙØ§Ø±Ø´ÛŒ # ^ComponentsText کنار بخش‌هایی Ú©Ù‡ می‌خواهید نصب شوند نشانه بزنید Ùˆ نشانه بخش‌هایی را Ú©Ù‡ نمی‌خواهید نصب شوند بردارید. $_CLICK # ^ComponentsSubText1 نوع نصب را مشخص کنید: # ^ComponentsSubText2_NoInstTypes بخش‌هایی را Ú©Ù‡ می‌خواهید نصب شوند انتخاب کنید: # ^ComponentsSubText2 یا، بخش‌های اختیاری را Ú©Ù‡ می‌خواهید نصب شوند انتخاب کنید: # ^UnComponentsText کنار بخش‌هایی Ú©Ù‡ می‌خواهید حذ٠شوند نشانه بزنید Ùˆ نشانه بخش‌هایی را Ú©Ù‡ نمی‌خواهید حذ٠شوند بردارید. $_CLICK # ^UnComponentsSubText1 نوع حذ٠را انتخاب کنید: # ^UnComponentsSubText2_NoInstTypes بخش‌هایی را Ú©Ù‡ می‌خواهید حذ٠شوند انتخاب کنید: # ^UnComponentsSubText2 یا، بخش‌های اختیاری را Ú©Ù‡ می‌خواهید حذ٠شوند انتخاب کنید: # ^DirText برنامه نصب، $(^NameDA) را در پوشه‌ی زیر نصب خواهد کرد. برای نصب در پوشه‌ی دیگر روی دکمه مرور کلیک کنید Ùˆ پوشه‌ی دیگری انتخاب کنید. $_CLICK # ^DirSubText پوشه‌ی مقصد # ^DirBrowseText انتخاب پوشه برای نصب $(^NameDA): # ^UnDirText برنامه نصب، $(^NameDA) را از پوشه‌ی زیر حذ٠خواهد کرد. برای نصب در پوشه‌ی دیگر روی دکمه مرور کلیک کنید Ùˆ پوشه‌ی دیگری انتخاب کنید. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText انتخاب پوشه برای حذ٠$(^NameDA): # ^SpaceAvailable "ÙØ¶Ø§ÛŒ موجود: " # ^SpaceRequired "ÙØ¶Ø§ÛŒ مورد نیاز: " # ^UninstallingText $(^NameDA) از پوشه‌ی زیر حذ٠خواهد شد. $_CLICK # ^UninstallingSubText حذ٠از: # ^FileError خطا هنگام باز کردن پرونده برای نوشتن: \r\n\r\n$0\r\n\n برای توق٠نصب روی Abort \r\n برای تلاش مجدد روی Retry \r\n Ùˆ برای صرÙ‌نظر از این پرونده روی Ignore کلیک کنید. # ^FileError_NoIgnore خطا هنگام باز کردن پرونده برای نوشتن: \r\n\r\n$0\r\n\nبرای تلاش مجدد روی Retry\r\nÙˆ برای انصرا٠روی Cancel کلیک کنید. # ^CantWrite "نوشتن ممکن نیست: " # ^CopyFailed نسخه‌برداری ناموÙÙ‚ بود. # ^CopyTo "نسخه‌برداری در: " # ^Registering "در حال ثبت: " # ^Unregistering "در حال حذ٠ثبت: " # ^SymbolNotFound "علامت پیدا نشد: " # ^CouldNotLoad "بارگذاری ممکن نیست: " # ^CreateFolder "ایجاد پوشه: " # ^CreateShortcut "ایجاد Ù…ÛŒØ§Ù†â€ŒØ¨ÙØ±: " # ^CreatedUninstaller "حذÙ‌کننده ایجاد شد: " # ^Delete "حذ٠پرونده: " # ^DeleteOnReboot "حذ٠هنگام راه اندازی مجدد: " # ^ErrorCreatingShortcut "خطا هنگام ایجاد Ù…ÛŒØ§Ù†â€ŒØ¨ÙØ±: " # ^ErrorCreating "خطا هنگام ایجاد: " # ^ErrorDecompressing خطا هنگام باز کردن اطلاعات! نصب‌کننده خراب است؟ # ^ErrorRegistering خطا هنگام ثبت DLL # ^ExecShell "پوسته اجرایی: " # ^Exec "اجرا: " # ^Extract "استخراج: " # ^ErrorWriting "استخراج: خطا هنگام نوشتن در پرونده" # ^InvalidOpcode نصب‌کننده خراب است: کد عملیاتی نامعتبر. # ^NoOLE "â€OLE وجود ندارد: " # ^OutputFolder "پوشه‌ی خروجی: " # ^RemoveFolder "حذ٠پوشه: " # ^RenameOnReboot "تغییر نام هنگام راه اندازی مجدد: " # ^Rename "تغییر نام: " # ^Skipped "چشم پوشی شد: " # ^CopyDetails نسخه‌برداری جزئیات در کلیپ‌برد # ^LogInstall ثبت روند نصب # ^Byte بایت # ^Kilo کیلو # ^Mega مگا # ^Giga گیگا nsis-3.11/Contrib/Language files/Farsi.nsh000077500000000000000000000224421477201124000204030ustar00rootroot00000000000000;Language: Farsi (1065) ;By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com !insertmacro LANGFILE "Farsi" "Persian" "ÙØ§Ø±Ø³ÛŒ" "Farsi" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "به برنامه نصب $(^NameDA) خوش آمدید." ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "این برنامه شما را در نصب $(^NameDA) یاری می‌کند.$\r$\n$\r$\nتوصیه می‌کنیم کلیه برنامه‌های در حال اجرا را ببندید. این به برنامه نصب اجازه می‌دهد Ú©Ù‡ ÙØ§ÛŒÙ„‌های لازم را بدون نیاز به راه اندازی دوباره‌ی کامپیوتر شما به روز کند.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "به برنامه حذ٠$(^NameDA) خوش آمدید." ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT " این برنامه برای حذ٠$(^NameDA) به شما Ú©Ù…Ú© می‌کند.$\r$\n$\r$\nقبل از حذ٠$(^NameDA) مطمئن شوید این برنامه در حال اجرا نباشد.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "تواÙقنامه نصب" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ù„Ø·ÙØ§ پیش از نصب $(^NameDA) Ù…ÙØ§Ø¯ تواÙقنامه را مرور کنید." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "اگر کلیه بندهای تواÙقنامه را قبول دارید دکمه‌ی مواÙقم را Ø¨ÙØ´Ø§Ø±ÛŒØ¯. برای نصب $(^NameDA) شما بایست این تواÙقنامه را قبول کنید." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "اگر کلیه بندهای تواÙقنامه را قبول دارید تیک زیر را انتخاب کنید. برای نصب $(^NameDA) شما بایست این تواÙقنامه را قبول کنید. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "اگر کلیه بندهای تواÙقنامه را قبول دارید گزینه اول را انتخاب کنید. برای نصب $(^NameDA) شما بایست این تواÙقنامه را قبول کنید. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "تواÙقنامه حذÙ" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ù„Ø·ÙØ§ کلیه بندهای این تواÙقنامه را قبل ار حذ٠$(^NameDA) مرور کنید." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "اگر کلیه بندهای تواÙقنامه را قبول دارید دکمه‌ی مواÙقم را Ø¨ÙØ´Ø§Ø±ÛŒØ¯. برای حذ٠$(^NameDA) شما بایست این تواÙقنامه را قبول کنید." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "اگر کلیه بندهای تواÙقنامه را قبول دارید تیک زیر را انتخاب کنید. برای حذ٠$(^NameDA) شما بایست این تواÙقنامه ر قبول کنید. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "اگر کلیه بندهای تواÙقنامه را قبول دارید گزینه اول را انتخاب کنید. برای حذ٠$(^NameDA) شما بایست این تواÙقنامه ر قبول کنید. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "برای دیدن متن به صورت کامل از کلید Page Down Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "انتخاب اجزای برنامه " ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "اجزایی از $(^NameDA) Ú©Ù‡ می‌خواهید نصب شوند را انتخاب کنید." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "انتخاب اجزای برنامه" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "اجزایی از $(^NameDA) را Ú©Ù‡ می‌خواهید حذ٠کنید انتخاب کنید." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "توضیحات" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "نشانگر ماوس را بر روی اجزایی Ú©Ù‡ می‌خواهید ببرید تا توضیحات آن را ببینید." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "يكي از گزينه هاي نصب را انتخاب كنيد تا توضيحات مربوط به آن را ببينيد." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "انتخاب پوشه نصب" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "پوشه‌ای Ú©Ù‡ می‌خواهید $(^NameDA) در آن نصب شود را انتخاب کنید." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "پوشه حذ٠را انتخاب کنید" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "پوشه‌ای Ú©Ù‡ می‌خواهید $(^NameDA) را از آن حذ٠کنید انتخاب کنید." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "نصب برنامه" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ù„Ø·ÙØ§ مدت زمانی Ú©Ù‡ $(^NameDA) در حال نصب است را صبر کنید." ${LangFileString} MUI_TEXT_FINISH_TITLE "نصب پایان ÛŒØ§ÙØª" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "برنامه نصب با موÙقیت پایان ÛŒØ§ÙØª." ${LangFileString} MUI_TEXT_ABORT_TITLE "برنامه نصب لغو شد." ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "برنامه نصب به صورت نیمه تمام پایان ÛŒØ§ÙØª." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "حذ٠برنامه" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ù„Ø·ÙØ§ مدت زمانی Ú©Ù‡ $(^NameDA) در حال حذ٠است را صبر کنید." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "حذ٠پایان ÛŒØ§ÙØª" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "برنامه حذ٠با موÙقیت پایان ÛŒØ§ÙØª." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "برنامه حذ٠لغو شد" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "برنامه حذ٠به صورت نیمه تمام پایان ÛŒØ§ÙØª" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "برنامه نصب $(^NameDA) پایان ÛŒØ§ÙØª" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) بر روی کامپیوتر شما نصب شد.$\r$\n$\r$\nبر روی دکمه‌ی پایان برای خروج از این برنامه کلیک کنید." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "کامپیوتر شما برای تکمیل نصب $(^NameDA) بایستی دوباره راه اندازی شود. آیا می‌خواهید این کار را الان انجام دهید؟" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "برنامه حذ٠$(^NameDA) پایان ÛŒØ§ÙØª" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) از روی کامپیوتر شما حذ٠شد.$\r$\n$\r$\nبر روی دکمه‌ی پایان برای خروج از این برنامه کلیک کنید." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "کامپیوتر شما برای تکمیل حذÙ$(^NameDA) بایست دوباره راه اندازی شود.آیا می‌خواهید این کار را الان انجام دهید؟" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "راه اندازی مجدد." ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "من خودم این کار را انجام خواهم داد." ${LangFileString} MUI_TEXT_FINISH_RUN "&اجرای $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&نمایش ÙØ§ÛŒÙ„ توضیحات" ${LangFileString} MUI_BUTTONTEXT_FINISH "&پایان" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "انتخاب پوشه در منوی برنامه‌ها" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "پوشه‌ای Ú©Ù‡ می‌خواهید میانبرهای $(^NameDA) در آن قرار بگیرند را انتخاب کنید." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "پوشه‌ای در منوی برنامه‌ها Ú©Ù‡ می‌خواهید میانبرهای برنامه در آنجا ایجاد شوند را انتخاب کنید. برای ایجاد یک پوشه جدید میتوانید یک نام تایپ کنید." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "میانبری نساز" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "حذ٠$(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "پاک کردن $(^NameDA) از روی کامپیوتر شما." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "آیا مطمئنید Ú©Ù‡ می‌خواهید از برنامه نصب $(^Name) خارج شوید؟" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "آیا مطمئنید Ú©Ù‡ می‌خواهید از برنامه حذ٠$(^Name) خارج شوید؟" !endif nsis-3.11/Contrib/Language files/Finnish.nlf000077500000000000000000000116331477201124000207240ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1035 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Eclipser (Jonne Lehtinen) # Corrections by the Mozilla.fi crew # Upd 11/08 by WTLib Team # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) -asennus # ^UninstallCaption $(^Name) -poisto # ^LicenseSubCaption : Lisenssisopimus # ^ComponentsSubCaption : Asennusvalinnat # ^DirSubCaption : Asennuskansio # ^InstallingSubCaption : Asennetaan # ^CompletedSubCaption : Valmis # ^UnComponentsSubCaption : Poistovalinnat # ^UnDirSubCaption : Poistokansio # ^ConfirmSubCaption : Varmistus # ^UninstallingSubCaption : Poistetaan # ^UnCompletedSubCaption : Valmis # ^BackBtn < &Edellinen # ^NextBtn &Seuraava > # ^AgreeBtn &Hyväksyn # ^AcceptBtn Hyväksyn lisenssisopimuksen ehdot # ^DontAcceptBtn En hyväksy sopimuksen ehtoja # ^InstallBtn &Asenna # ^UninstallBtn &Poista # ^CancelBtn Peruuta # ^CloseBtn &Sulje # ^BrowseBtn S&elaa... # ^ShowDetailsBtn &Näytä tiedot # ^ClickNext Jatka valitsemalla Seuraava. # ^ClickInstall Aloita asennus valitsemalla Asenna. # ^ClickUninstall Aloita asennuksen poisto valitsemalla Poista. # ^Name Nimi # ^Completed Valmis # ^LicenseText Lue lisenssisopimus ennen asennusta ja jos hyväksyt sopimuksen kaikki ehdot, valitse Hyväksyn. # ^LicenseTextCB Lue lisenssisopimus ennen asennusta ja jos hyväksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK # ^LicenseTextRB Lue lisenssisopimus ennen asennusta ja jos hyväksyt sopimuksen kaikki ehdot, valitse alta ensimmäinen valinta. $_CLICK # ^UnLicenseText Lue lisenssisopimus ennen asennuksen poistoa ja jos hyväksyt sopimuksen kaikki ehdot, valitse Hyväksyn. # ^UnLicenseTextCB Lue lisenssisopimus ennen asennuksen poistoa ja jos hyväksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK # ^UnLicenseTextRB Lue lisenssisopimus ennen asennuksen poistoa ja jos hyväksyt sopimuksen kaikki ehdot, valitse alta ensimmäinen valinta. $_CLICK # ^Custom Mukautettu # ^ComponentsText Valitse asennettavat komponentit ja poista valinnat niistä, joita et halua asentaa. $_CLICK # ^ComponentsSubText1 Valitse asennustyyppi: # ^ComponentsSubText2_NoInstTypes Valitse asennettavat komponentit: # ^ComponentsSubText2 Tai valitse valinnaiset komponentit, jotka haluat asentaa: # ^UnComponentsText Valitse poistettavat komponentit ja poista valinnat niistä, joita et haluat poistaa. $_CLICK # ^UnComponentsSubText1 Valitse poistotyyppi: # ^UnComponentsSubText2_NoInstTypes Valitse poistettavat komponentit: # ^UnComponentsSubText2 Tai valitse valinnaiset komponentit, jotka haluat poistaa # ^DirText $(^NameDA) -asennetaan seuraavaan kansioon. Jos haluat asentaa sen eri kansioon, valitse kansio painamalla Selaa. $_CLICK # ^DirSubText Kohdekansio # ^DirBrowseText Valitse kansio, johon $(^NameDA) asennetaan: # ^UnDirText $(^NameDA) poistetaan seuraavasta kansiosta. Jos haluat poistaa sen eri kansiosta, valitse kansio painamalla Selaa. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Valitse kansio, josta $(^NameDA) poistetaan: # ^SpaceAvailable "Tilaa vapaana: " # ^SpaceRequired "Tarvittava tila: " # ^UninstallingText Tämä asentaja poistaa $(^NameDA) -asennuksen tietokoneelta. $_CLICK # ^UninstallingSubText Poistetaan kansiosta: # ^FileError Tiedostomuutoksia ei voida tallentaa: \r\n\t"$0"\r\nLopeta asennus valitsemalla Keskeytä,\r\nyritä uudelleen valitsemalla Uudelleen, tai\r\nohita tiedosto valitsemalla Ohita. # ^FileError_NoIgnore Tiedostomuutoksia ei voida tallentaa: \r\n\t"$0"\r\nYritä uudelleen valitsemalla Uudelleen tai\r\nlopeta asennus valitsemalla Keskeytä. # ^CantWrite "Tiedostomuutoksia ei voida tallentaa: " # ^CopyFailed Kopiointi epäonnistui # ^CopyTo "Kopioidaan kohteeseen " # ^Registering "Rekisteröidään: " # ^Unregistering "Poistetaan rekisteröinti: " # ^SymbolNotFound "Symbolia ei löytynyt: " # ^CouldNotLoad "Lataus epäonnistui: " # ^CreateFolder "Luo kansio: " # ^CreateShortcut "Luo pikakuvake: " # ^CreatedUninstaller "Asennuksen poisto luotiin: " # ^Delete "Poista: " # ^DeleteOnReboot "Poista uudelleenkäynnistyksen yhteydessä: " # ^ErrorCreatingShortcut "Virhe luotaessa pikakuvaketta: " # ^ErrorCreating "Virhe luotaessa: " # ^ErrorDecompressing Pakettia ei voitu purkaa. Onko asennuksen poisto vioittunut? # ^ErrorRegistering Virhe rekisteröitäessä DLL-tiedostoa # ^ExecShell "ExecShell: " # ^Exec "Suorita: " # ^Extract "Pura: " # ^ErrorWriting "Pura: tiedostomuutoksia ei voitu tallentaa " # ^InvalidOpcode Asennuspaketti on vioittunut: virheellinen opcode # ^NoOLE "OLE puuttuu: " # ^OutputFolder "Kansio: " # ^RemoveFolder "Poista kansio: " # ^RenameOnReboot "Nimeä uudelleen uudelleenkäynnistyksen yhteydessä: " # ^Rename "Nimeä uudelleen: " # ^Skipped "Ohitettiin: " # ^CopyDetails Kopioi tiedot leikepöydälle # ^LogInstall Tallenna asennusloki # ^Byte t # ^Kilo k # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Finnish.nsh000077500000000000000000000161171477201124000207370ustar00rootroot00000000000000;Compatible with Modern UI 1.86 ;Language: Finnish (1035) ;By Eclipser (Jonne Lehtinen) ;Updated by Puuhis (puuhis@puuhis.net) ;Updated 11/08 by WTLib Team ;Updated 01/24 by olavinto (Oskari Lavinto) (l18npub@olavinto.simplelogin.com) !insertmacro LANGFILE "Finnish" = "Suomi" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Tervetuloa $(^NameDA) -asennukseen" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Näet tarpeellisia ohjeita $(^NameDA) -asennuksen edistyessä.$\r$\n$\r$\nKaikki muut sovellukset kannattaa sulkea ennen asennuksen aloitusta, jotta asennus voi päivittää järjestelmätiedostoja käynnistämättä tietokonetta uudelleen.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Tervetuloa $(^NameDA) -asennuksen poistoon" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Saat tarvittavia ohjeita sitä mukaa kuin $(^NameDA) -asennuksen poisto edistyy.$\r$\n$\r$\nVarmista ennen asennuksen poiston aloitusta, ettei $(^NameDA) ole käynnissä.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Käyttöoikeussopimus" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lue käyttöehdot huolellisesti ennen $(^NameDA) -asennusta." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jos hyväksyt ehdot, valitse Hyväksyn. Asennus edellyttää käyttöehtojen hyväksyntää." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jos hyväksyt ehdot, laita rasti ruutuun. Asennus edellyttää käyttöehtojen hyväksyntää. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jos hyväksyt ehdot, valitse alta ensimmäinen valinta. Asennus edellyttää käyttöehtojen hyväksyntää. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Käyttöoikeussopimus" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lue käyttöehdot huolellisesti ennen $(^NameDA) -asennuksen poistoa." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jos hyväksyt ehdot, valitse Hyväksyn. Asennuksen poisto edellyttää käyttöehtojen hyväksyntää." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jos hyväksyt ehdot, laita rasti ruutuun. Asennuksen poisto edellyttää käyttöehtojen hyväksyntää. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jos hyväksyt ehdot, valitse alta ensimmäinen valinta. Asennuksen poisto edellyttää käyttöehtojen hyväksyntää. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Vieritä ja näytä sopimusta lisää painamalla Page Down -näppäintä." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Valitse komponentit" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Valitse asennettavat $(^NameDA) -ominaisuudet." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Valitse komponentit" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Valitse $(^NameDA) -ominaisuudet, jotka haluat poistaa." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Kuvaus" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Näytä komponentin kuvaus osoittamalla sitä hiirellä." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Näytä komponentin kuvaus valitsemalla se." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Valitse asennuskansio" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Valitse kansio, johon $(^NameDA) asennetaan." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Valitse poistokansio" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Valitse kansio, josta $(^NameDA) poistetaan." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Asennetaan" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Odota... $(^NameDA) asennetaan..." ${LangFileString} MUI_TEXT_FINISH_TITLE "Asennus on valmis" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Asennus onnistui." ${LangFileString} MUI_TEXT_ABORT_TITLE "Asennus keskeytettiin" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Asennus epäonnistui." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Asennusta poistetaan" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Odota... $(^NameDA) poistetaan." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Asennuksen poisto on valmis" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Asennuksen poisto onnistui." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Asennuksen poisto keskeytettiin" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Asennuksen poisto epäonnistui." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) on asennettu" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) on asennettu tietokoneelle.$\r$\n$\r$\nSulje asentaja valitsemalla Valmis." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) -asennuksen viimeisteleminen edellyttää tietokoneen uudelleenkäynnistämistä. Haluatko käynnistää tietokoneen uudelleen nyt?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) on poistettu" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) on poistettu tietokoneelta.$\r$\n$\r$\nSulje asentaja valitsemalla Lopeta." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) -asennuksen poiston viimeisteleminen edellyttää tietokoneen uudelleenkäynnistystä. Haluatko käynnistää tietokoneen uudelleen nyt?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Käynnistä uudelleen nyt" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Käynnistän uudelleen myöhemmin" ${LangFileString} MUI_TEXT_FINISH_RUN "Käynnistä $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Näytä Lueminut-tiedosto" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Valmis" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Valitse Käynnistä-valikon kansio" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Valitse Käynnistä-valikon kansio, johon pikakuvakkeet asennetaan." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Valitse Käynnistä-valikon kansio, johon pikakuvakkeet asennetaan. Voit luoda myös uuden kansion kirjoittamalla sen nimen." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Älä luo pikakuvakkeita." !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Poista $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Poista $(^NameDA) tietokoneesta." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Haluatko varmasti keskeyttää $(^Name) -asennuksen?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Haluatko varmasti keskeyttää $(^Name) -asennuksen poiston?" !endif nsis-3.11/Contrib/Language files/French.nlf000077500000000000000000000132741477201124000205360ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1036 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by the French NSIS team - http://www.winampfr.com/nsis. # Updated to v6 by Jerome Charaoui (lavamind@inetflex.com) # ^Branding Nullsoft Install System %s # ^SetupCaption Installation de $(^Name) # ^UninstallCaption Désinstallation de $(^Name) # ^LicenseSubCaption : Licence # ^ComponentsSubCaption : Options d'installation # ^DirSubCaption : Dossier d'installation # ^InstallingSubCaption : Installation des fichiers # ^CompletedSubCaption : Terminé # ^UnComponentsSubCaption : Options de désinstallation # ^UnDirSubCaption : Dossier de désinstallation # ^ConfirmSubCaption : Confirmation # ^UninstallingSubCaption : Désinstallation des fichiers # ^UnCompletedSubCaption : Terminé # ^BackBtn < &Précédent # ^NextBtn &Suivant > # ^AgreeBtn J'a&ccepte # ^AcceptBtn J'a&ccepte les termes de la licence # ^DontAcceptBtn Je &n'accepte pas les termes de la licence # ^InstallBtn &Installer # ^UninstallBtn &Désinstaller # ^CancelBtn Annuler # ^CloseBtn &Fermer # ^BrowseBtn P&arcourir... # ^ShowDetailsBtn P&lus d'infos # ^ClickNext Cliquez sur Suivant pour continuer. # ^ClickInstall Cliquez sur Installer pour démarrer l'installation. # ^ClickUninstall Cliquez sur Désinstaller pour démarrer la désinstallation. # ^Name Nom # ^Completed Terminé # ^LicenseText Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte. # ^LicenseTextCB Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la boîte de contrôle ci-dessous. $_CLICK # ^LicesnseTextRB Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, sélectionnez la première option ci-dessous. $_CLICK # ^UnLicenseText Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte. # ^UnLicenseTextCB Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la boîte de contrôle ci-dessous. $_CLICK # ^UnLicesnseTextRB Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, sélectionnez la première option ci-dessous. $_CLICK # ^Custom Personnalisée # ^ComponentsText Cochez les composants que vous désirez installer et décochez ceux que vous ne désirez pas installer. $_CLICK # ^ComponentsSubText1 Type d'installation : # ^ComponentsSubText2_NoInstTypes Sélectionnez les composants à installer : # ^ComponentsSubText2 Ou, sélectionnez les composants optionnels que vous voulez installer : # ^UnComponentsText Cochez les composants que vous désirez désinstaller et décochez ceux que vous ne désirez pas désinstaller. $_CLICK # ^UnComponentsSubText1 Sélectionnez le type de désinstallation : # ^UnComponentsSubText2_NoInstTypes Sélectionnez les composants à désinstaller : # ^UnComponentsSubText2 Ou, sélectionnez les composants optionnels que vous voulez désinstaller : # ^DirText Ceci installera $(^NameDA) dans le dossier suivant. Pour installer dans un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK # ^DirSubText Dossier d'installation # ^DirBrowseText Sélectionnez le dossier d'installation pour $(^NameDA) : # ^UnDirText Ceci désinstallera $(^NameDA) du dossier suivant. Pour désinstaller d'un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Sélectionnez le dossier de désinstallation pour $(^NameDA) : # ^SpaceAvailable "Espace disponible : " # ^SpaceRequired "Espace requis : " # ^UninstallingText Ce programme désinstallera $(^NameDA) de votre ordinateur. $_CLICK # ^UninstallingSubText Désinstallation à partir de : # ^FileError Erreur lors de l'ouverture du fichier en écriture : \r\n\t"$0"\r\nAppuyez sur Abandonner pour annuler l'installation,\r\nRéessayer pour réessayer l'écriture du fichier, ou\r\nIgnorer pour passer ce fichier # ^FileError_NoIgnore Erreur lors de l'ouverture du fichier en écriture : \r\n\t"$0"\r\nAppuyez sur Réessayez pour re-écrire le fichier, ou\r\nAnnuler pour abandonner l'installation # ^CantWrite "Impossible d'écrire : " # ^CopyFailed Échec de la copie # ^CopyTo "Copier vers " # ^Registering "Enregistrement : " # ^Unregistering "Suppression de l'enregistrement : " # ^SymbolNotFound "Impossible de trouver un symbole : " # ^CouldNotLoad "Impossible de charger : " # ^CreateFolder "Création du dossier : " # ^CreateShortcut "Création du raccourci : " # ^CreatedUninstaller "Création de la désinstallation : " # ^Delete "Suppression : " # ^DeleteOnReboot "Suppression au redémarrage : " # ^ErrorCreatingShortcut "Erreur lors de la création du raccourci : " # ^ErrorCreating "Erreur de la création : " # ^ErrorDecompressing Erreur lors de la décompression des données ! Installation corrompue ? # ^ErrorRegistering Erreur lors de l'enregistrement de la DLL # ^ExecShell "ExecShell: " # ^Exec "Exécution : " # ^Extract "Extraction : " # ^ErrorWriting "Extraction : erreur d'écriture du fichier " # ^InvalidOpcode Installation corrompue : opcode incorrect # ^NoOLE "Pas de OLE pour : " # ^OutputFolder "Destination : " # ^RemoveFolder "Suppression du dossier : " # ^RenameOnReboot "Renommer au redémarrage : " # ^Rename "Renommer : " # ^Skipped "Passé : " # ^CopyDetails Copier les Détails dans le Presse-papier # ^LogInstall Enregistrer le déroulement de l'installation # ^Byte o # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/French.nsh000077500000000000000000000207001477201124000205370ustar00rootroot00000000000000;Language: French (1036) ;By Sébastien Delahaye !insertmacro LANGFILE "French" = "Français" "Francais" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenue dans le programme d'installation de $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Vous êtes sur le point d'installer $(^NameDA) sur votre ordinateur.$\r$\n$\r$\nAvant de démarrer l'installation, il est recommandé de fermer toutes les autres applications. Cela permettra la mise à jour de certains fichiers système sans redémarrer votre ordinateur.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenue dans le programme de désinstallation de $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Vous êtes sur le point de désinstaller $(^NameDA) de votre ordinateur.$\r$\n$\r$\nAvant d'amorcer la désinstallation, assurez-vous que $(^NameDA) ne soit pas en cours d'exécution.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licence utilisateur" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Veuillez examiner les termes de la licence avant d'installer $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si vous acceptez les conditions de la licence utilisateur, sélectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)." !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licence utilisateur" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Veuillez examiner les conditions de la licence avant de désinstaller $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin de désinstaller $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin de désintaller $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si vous acceptez les conditions de la licence utilisateur, sélectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin de désinstaller $(^NameDA)." !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Appuyez sur Page Suivante pour lire le reste de la licence utilisateur." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Choisissez les composants" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Choisissez les composants de $(^NameDA) que vous souhaitez installer." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Choisissez les composants" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Cochez les composants de $(^NameDA) que vous souhaitez désinstaller." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Passez le curseur de votre souris sur un composant pour en voir la description." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sélectionnez un composant pour en voir la description." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Choisissez le dossier d'installation" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Choisissez le dossier dans lequel installer $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Choisissez le dossier de désinstallation" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Choisissez le dossier à partir duquel vous voulez désinstaller $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installation en cours" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Veuillez patienter pendant l'installation de $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation terminée" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installation s'est terminée avec succès." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation interrompue" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installation n'a pas été terminée." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Désinstallation en cours" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Veuillez patienter pendant la désinstallation de $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Désinstallation terminée" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La désinstallation s'est terminée avec succès." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Désinstallation interrompue" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La désinstallation n'a pas été terminée." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Fin de l'installation de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) a été installé sur votre ordinateur.$\r$\n$\r$\nCliquez sur Fermer pour quitter le programme d'installation." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Votre ordinateur doit être redémarré afin de compléter l'installation de $(^NameDA). Souhaitez-vous redémarrer maintenant ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fin de la désinstallation de $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) a été supprimé de votre ordinateur.$\r$\n$\r$\nCliquez sur Fermer pour quitter le programme d'installation." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Votre ordinateur doit être redémarré pour terminer la désinstallation de $(^NameDA). Souhaitez-vous redémarrer maintenant ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Redémarrer maintenant" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Je souhaite redémarrer moi-même plus tard" ${LangFileString} MUI_TEXT_FINISH_RUN "Lancer $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Afficher le fichier Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fermer" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Choisissez un dossier dans le menu Démarrer" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Choisissez un dossier dans le menu Démarrer pour les raccourcis de l'application." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Choisissez le dossier du menu Démarrer dans lequel vous voulez placer les raccourcis du programme. Vous pouvez également entrer un nouveau nom pour créer un nouveau dossier." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne pas créer de raccourcis" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Désinstaller $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Supprimer $(^NameDA) de votre ordinateur." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Êtes-vous sûr de vouloir quitter l'installation de $(^Name) ?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Êtes-vous sûr de vouloir quitter la désinstallation de $(^Name) ?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choix des utilisateurs" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Sélection des utilisateurs désirant utiliser $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Choix entre installer $(^NameDA) seulement pour vous-même ou bien pour tous les utilisateurs du système. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer pour tous les utilisateurs" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer seulement pour moi" !endif nsis-3.11/Contrib/Language files/Galician.nlf000077500000000000000000000124641477201124000210400ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1110 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation v 1.0.0 by Ramon Flores # ^Branding Nullsoft Install System %s # ^SetupCaption Instalación de $(^Name) # ^UninstallCaption Desinstalación de $(^Name) # ^LicenseSubCaption : Contrato de licenza # ^ComponentsSubCaption : Opcións de instalación # ^DirSubCaption : Diretória de instalación # ^InstallingSubCaption : Instalando ficheiros # ^CompletedSubCaption : Concluído # ^UnComponentsSubCaption : Opcións de desinstalación # ^UnDirSubCaption : Cartafol de desinstalación # ^ConfirmSubCaption : Confirmación # ^UninstallingSubCaption : Desinstalando # ^UnCompletedSubCaption : Concluído # ^BackBtn < &Anterior # ^NextBtn &Seguinte > # ^AgreeBtn &Aceito # ^AcceptBtn Eu &aceito os termos do Contrato de licenza # ^DontAcceptBtn Eu &non aceito os termos do Contrato de licenza # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Cancelar # ^CloseBtn &Fechar # ^BrowseBtn &Procurar... # ^ShowDetailsBtn Ver &Detalles # ^ClickNext Clique en 'Seguinte' para continuar. # ^ClickInstall Clique en 'Instalar' para iniciar a instalación. # ^ClickUninstall Clique en 'Desinstalar' para iniciar a desinstalación. # ^Name Nome # ^Completed Concluído # ^LicenseText Por favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'. # ^LicenseTextCB Por favor reveja o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de selección abaixo. $_CLICK # ^LicenseTextRB Por favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opción abaixo. $_CLICK # ^UnLicenseText Por favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'. # ^UnLicenseTextCB Por favor reveja o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de selección abaixo. $_CLICK # ^UnLicenseTextRB Por favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opción abaixo. $_CLICK # ^Custom Personalizado # ^ComponentsText Marque os componentes que desexa instalar e desmarque os componentes que non desexa instalar. $_CLICK # ^ComponentsSubText1 Escolla o tipo de instalación: # ^ComponentsSubText2_NoInstTypes Escolla os componentes para instalar: # ^ComponentsSubText2 Ou, escolla os componentes opcionais que desexa instalar: # ^UnComponentsText Marque os componentes que queira desinstalar e vice versa. $_CLICK # ^UnComponentsSubText1 Escolla o tipo de desinstalación: # ^UnComponentsSubText2_NoInstTypes Escolla os componentes para desinstalar: # ^UnComponentsSubText2 Ou, escolla os componentes opcionais que queira desinstalar: # ^DirText O $(^NameDA) será instalado na seguinte directória. Para instalar nunha directória diferente, clique en 'Procurar...' e escolla outra directória. $_CLICK # ^DirSubText Directória de destino # ^DirBrowseText Escolla unha directória para instalar o $(^NameDA): # ^UnDirText O $(^NameDA) será desinstalado da seguinte directória. Para desinstalar dunha pasta diferente, clique en 'Procurar...' e escolla outra directória. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Escolla a directória de onde vai ser desinstalado o $(^NameDA): # ^SpaceAvailable "Espazo disponíbel: " # ^SpaceRequired "Espazo necesário: " # ^UninstallingText $(^NameDA) vai ser desinstalado da seguinte directória. $_CLICK # ^UninstallingSubText Desinstalando de: # ^FileError Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique en Abortar para abortar a instalación,\r\nRepetir para tentar novamente a escrita do ficheiro, ou\r\nIgnorar para ignorar este ficheiro. # ^FileError_NoIgnore Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique en Repetir para tentar novamente a gravación do ficheiro, ou\r\nCancelar para abortar a instalación. # ^CantWrite "Non foi posíbel escreber: " # ^CopyFailed Falla ao copiar # ^CopyTo "Copiar para " # ^Registering "Rexistando: " # ^Unregistering "Desrexistando: " # ^SymbolNotFound "Símbolo non achado: " # ^CouldNotLoad "Non foi posíbel carregar: " # ^CreateFolder "Criando diretória: " # ^CreateShortcut "Criando atallo: " # ^CreatedUninstaller "Criando desinstalador: " # ^Delete "Eliminando ficheiro: " # ^DeleteOnReboot "Eliminar ao reiniciar: " # ^ErrorCreatingShortcut "Erro ao criar atallo: " # ^ErrorCreating "Erro ao criar: " # ^ErrorDecompressing Erro ao descomprimir dados! Instalador corrompido? # ^ErrorRegistering Erro ao rexistar DLL # ^ExecShell "Executando polo Shell: " # ^Exec "Executando: " # ^Extract "Extraindo: " # ^ErrorWriting "Extraindo: erro ao escreber ficheiro " # ^InvalidOpcode Instalador corrompido: código de operación inválido # ^NoOLE "Sen OLE para: " # ^OutputFolder "Cartafol de destino: " # ^RemoveFolder "Removendo cartafol: " # ^RenameOnReboot "Renomear ao reiniciar: " # ^Rename "Renomeando: " # ^Skipped "Ignorado: " # ^CopyDetails Copiar detalles para a Ãrea de transférencia # ^LogInstall Rexistar proceso de instalación # ^Byte B # kilo K # mega M # giga G nsis-3.11/Contrib/Language files/Galician.nsh000077500000000000000000000163731477201124000210540ustar00rootroot00000000000000;Language: Galician (1110) ;Ramon Flores !insertmacro LANGFILE "Galician" = "Galego" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvindo ao Asistente de Instalación do $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este asistente vai axudá-lo durante a instalación do $(^NameDA).$\r$\n$\r$\nRecomenda-se fechar todas as outras aplicacións antes de iniciar a instalación. Isto posibilita actualizar os ficheiros do sistema relevantes sen ter que reiniciar o computador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvindo ao Asistente de desinstalación do $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente vai axudá-lo durante a desinstalación do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalación, certifique-se de que o $(^NameDA) non está a executar-se.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contrato de licenza" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licenza antes de instalar o $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para instalar o $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licenza, clique na caixa de selección abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licenza, seleccione a primeira opción abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contrato de licenza" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licenza antes de desinstalar o $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para desinstalar o $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licenza, clique na caixa de selección abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licenza, seleccione a primeira opción abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Prema Page Down para ver o restante da licenza." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolla de componentes" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolla que características do $(^NameDA) que desexa instalar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escoller componentes" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolla que características do $(^NameDA) desexa desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrición" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre un componente para ver a sua descrición." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un componente para ver a sua descrición." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolla do local da instalación" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolla a directória na cal desexa instalar o $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolla o Local de desinstalación" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolla a directória de onde pretende desinstalar o $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor, agarde entanto o $(^NameDA) está sendo instalado." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación completa" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalación concluiu con suceso." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Abortada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalación concluiu sen suceso." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor, agarde entanto se desinstala o $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación completa" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalación concluiu con suceso." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación abortada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalación non concluiu con suceso" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Concluindo o Asistente de instalación do $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Instalou-se o $(^NameDA) no seu computador.$\r$\n$\r$\nClique en Rematar para fechar este asistente." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Cumpre reiniciar o seu computador para concluír a instalación do $(^NameDA). Desexa reiniciar agora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Concluíndo o asistente de desinstalación do $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Eliminou-se $(^NameDA) do seu computador.$\r$\n$\r$\nClique em Rematar para fechar este asistente." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Cumpre reiniciar o seu computador para concluír a desinstalación do $(^NameDA). Desexa reiniciá-lo agora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar agora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Prefiro reinicia-lo manualmente despois" ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Leame" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Rematar" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolla un cartafol do Menu Iniciar" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolla un cartafol do Menu Iniciar para os atallos do programa." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione o cartafol do Menu Iniciar no que desexa criar os atallos do programa. Tamén é posíbel dixitar un nome para criar un novo cartafol. " ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non criar atallos" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Eliminar o $(^NameDA) do seu computador." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Realmente desexa cancelar a instalación do $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Realmente desexa cancelar a desinstalación do $(^Name)?" !endif nsis-3.11/Contrib/Language files/Georgian.nlf000077500000000000000000000235241477201124000210630ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1079 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1200 # RTL - anything else than RTL means LTR - #Translation by David Huriev # ^Branding Nullsoft Install System %s # ^SetupCaption ჩáƒáƒ¢áƒ•ირთვრ$(^Name) # ^UninstallCaption $(^Name)–ის წáƒáƒ¨áƒšáƒ # ^LicenseSubCaption : სáƒáƒšáƒ˜áƒªáƒ”ნზირშეთáƒáƒœáƒ®áƒ›áƒ”ბრ# ^ComponentsSubCaption : ჩáƒáƒ¢áƒ•ირთვის მáƒáƒœáƒáƒªáƒ”მები # ^DirSubCaption : სáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒáƒªáƒ˜áƒ ფáƒáƒšáƒ“ერი # ^InstallingSubCaption : ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბრ# ^CompletedSubCaption : áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულირ# ^UnComponentsSubCaption : წáƒáƒ¨áƒšáƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მები # ^UnDirSubCaption : წáƒáƒ¨áƒšáƒ˜áƒ¡ ფáƒáƒ£áƒšáƒ“ერი # ^ConfirmSubCaption : თáƒáƒœáƒ®áƒ›áƒáƒ‘რ# ^UninstallingSubCaption : ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ # ^UnCompletedSubCaption : áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულირ# ^BackBtn < &უკáƒáƒœ # ^NextBtn &შემდეგ > # ^AgreeBtn ვეთáƒáƒœáƒ®áƒ›áƒ”&ბი # ^AcceptBtn &ვეთáƒáƒœáƒ®áƒ›áƒ”ბი სáƒáƒšáƒ˜áƒªáƒ”ნზირპირáƒáƒ‘ებს # ^DontAcceptBtn &áƒáƒ  ვეთáƒáƒœáƒ®áƒ›áƒ”ბი სáƒáƒšáƒ˜áƒªáƒ”ნზირპირáƒáƒ‘ებს # ^InstallBtn &ჩáƒáƒ¢áƒ•ირთვრ# ^UninstallBtn წáƒáƒ¨&ლრ# ^CancelBtn უáƒáƒ áƒ˜ # ^CloseBtn &დáƒáƒ®áƒ£áƒ áƒ•რ# ^BrowseBtn დáƒáƒ—&ვáƒáƒšáƒ˜áƒ”რებáƒ... # ^ShowDetailsBtn &დეტáƒáƒšáƒ”ბი... # ^ClickNext გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“ დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'შემდეგ'. # ^ClickInstall დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'ჩáƒáƒ¢áƒ•ირთვáƒ', პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“. # ^ClickUninstall დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'წáƒáƒ¨áƒšáƒ', პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“. # ^Name სáƒáƒ®áƒ”ლი # ^Completed ჩáƒáƒ˜áƒ¢áƒ•ირთრ# ^LicenseText სáƒáƒœáƒáƒ› ჩáƒáƒ˜áƒ¢áƒ•ირთებრ$(^NameDA) გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირხელშეკრულებáƒáƒ¡. თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'თáƒáƒœáƒ®áƒ›áƒáƒ‘áƒ'. # ^LicenseTextCB სáƒáƒœáƒáƒ› ჩáƒáƒ˜áƒ¢áƒ•ირთებრ$(^NameDA) გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირხელშეკრულებáƒáƒ¡. თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ფáƒáƒœáƒ¯áƒáƒ áƒ ქვემáƒáƒ—. $_CLICK # ^LicenseTextRB სáƒáƒœáƒáƒ› ჩáƒáƒ˜áƒ¢áƒ•ირთებრ$(^NameDA) გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირხელშეკრულებáƒáƒ¡. თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მული პირველი ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜. $_CLICK # ^UnLicenseText სáƒáƒœáƒáƒ› წáƒáƒ¨áƒšáƒ˜áƒ— $(^NameDA) გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირხელშეკრულებáƒáƒ¡. თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'თáƒáƒœáƒ®áƒ›áƒáƒ‘áƒ'. # ^UnLicenseTextCB სáƒáƒœáƒáƒ› წáƒáƒ¨áƒšáƒ˜áƒ— $(^NameDA) გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირხელშეკრულებáƒáƒ¡. თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ფáƒáƒœáƒ¯áƒáƒ áƒ ქვემáƒáƒ—. $_CLICK # ^UnLicenseTextRB სáƒáƒœáƒáƒ› წáƒáƒ¨áƒšáƒ˜áƒ— $(^NameDA) გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირხელშეკრულებáƒáƒ¡. თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მული პირველი ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜. $_CLICK # ^Custom სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ # ^ComponentsText áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ის კáƒáƒ›áƒžáƒáƒœáƒ”ნტები, რáƒáƒ›áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვáƒáƒª გსურთ. $_CLICK # ^ComponentsSubText1 áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ჩáƒáƒ¢áƒ•ირთვის მეთáƒáƒ“ი: # ^ComponentsSubText2_NoInstTypes ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“ áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტები: # ^ComponentsSubText2 áƒáƒœ ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“ áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბითი კáƒáƒ›áƒžáƒáƒœáƒ”ნტები: # ^UnComponentsText áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ის კáƒáƒ›áƒžáƒáƒœáƒ”ნტები, რáƒáƒ›áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒáƒª გსურთ. $_CLICK # ^UnComponentsSubText1 áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ წáƒáƒ¨áƒšáƒ˜áƒ¡ მეთáƒáƒ“ი: # ^UnComponentsSubText2_NoInstTypes წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტები: # ^UnComponentsSubText2 áƒáƒœ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბითი კáƒáƒ›áƒžáƒáƒœáƒ”ნტები: # ^DirText პრáƒáƒ’რáƒáƒ›áƒ ჩáƒáƒ’იტვირთáƒáƒ•თ $(^NameDA)–ის მითითებულ ფáƒáƒšáƒ“ერში. სხვრáƒáƒ“გილზე ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“ დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რებáƒ' დრმიუთითეთ áƒáƒ“გილი. $_CLICK # ^DirSubText ჩáƒáƒ¢áƒ•ირთვის ფáƒáƒšáƒ“ერი # ^DirBrowseText მითითეთ ფáƒáƒšáƒ“ერი სáƒáƒ“áƒáƒª უნდრჩáƒáƒ˜áƒ¢áƒ•ირთáƒáƒ¡ $(^NameDA): # ^UnDirText პრáƒáƒ’რáƒáƒ›áƒ წáƒáƒ¨áƒšáƒ˜áƒ¡ $(^NameDA)–ის მითითებული ფáƒáƒšáƒ“ერიდáƒáƒœ. სხვრფáƒáƒšáƒ“ერიდáƒáƒœ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე 'დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რებáƒ' დრმიუთითეთ áƒáƒ“გილი. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText მიუთითეთ ფáƒáƒšáƒ“ერი სáƒáƒ˜áƒ“áƒáƒœáƒáƒª უნდრწáƒáƒ˜áƒ¨áƒáƒšáƒáƒ¡ $(^NameDA): # ^SpaceAvailable "ДоÑтупно на диÑке: " # ^SpaceRequired "ТребуетÑÑ Ð½Ð° диÑке: " # ^UninstallingText პრáƒáƒ’რáƒáƒ›áƒ $(^NameDA) წáƒáƒ˜áƒ¨áƒšáƒ”ბრთქვენი კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ. $_CLICK # ^UninstallingSubText წáƒáƒ¨áƒšáƒ: # ^FileError áƒáƒ  იხსნებრფáƒáƒ˜áƒšáƒ”ბი ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“: \r\n\t"$0"\r\n'შეჩერებáƒ': შეჩერდეს ჩáƒáƒ¢áƒ•ირთვáƒ;\r\n"გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ": მცდელáƒáƒ‘ის გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ;\r\n"გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ": áƒáƒ› მáƒáƒ¥áƒ›áƒ”დების გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ. # ^FileError_NoIgnore áƒáƒ  იხსნებრფáƒáƒ˜áƒšáƒ”ი ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“: \r\n\t"$0"\r\n'გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ': მცდელáƒáƒ‘ის გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ;\r\n'უáƒáƒ áƒ˜': ჩáƒáƒ¢áƒ•ირთვის პრáƒáƒªáƒ”სის შეწყვეტáƒ. # ^CantWrite "áƒáƒ  იწერებáƒ: " # ^CopyFailed შეცდáƒáƒ›áƒ ჩáƒáƒ¬áƒ”რის დრáƒáƒ¡ # ^CopyTo "კáƒáƒžáƒ˜áƒ áƒ”ბáƒ: " # ^Registering "რეგისტრირებáƒ: " # ^Unregistering "რეგისტრირებიდáƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ: " # ^SymbolNotFound "ვერ მáƒáƒ˜áƒ«áƒ”ბნრსიმბáƒáƒšáƒ: " # ^CouldNotLoad "ჩáƒáƒ¢áƒ•ირთვრშეუძლებელიáƒ: " # ^CreateFolder "ფáƒáƒšáƒ“ერის შექმნáƒ: " # ^CreateShortcut "იáƒáƒ áƒšáƒ˜áƒ§áƒ˜áƒ¡ შექმნáƒ: " # ^CreatedUninstaller "წáƒáƒ¨áƒšáƒ˜áƒ¡ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ შექმნáƒ: " # ^Delete "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ: " # ^DeleteOnReboot "წáƒáƒ˜áƒ¨áƒšáƒ”ბრკáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რის გáƒáƒ“áƒáƒ¢áƒ•ირთვის დრáƒáƒ¡: " # ^ErrorCreatingShortcut "იáƒáƒ áƒšáƒ˜áƒ§áƒ˜áƒ¡ შექმნისáƒáƒ¡ დáƒáƒ¨áƒ•ებულირშეცდáƒáƒ›áƒ: " # ^ErrorCreating "შექმნისáƒáƒ¡ დáƒáƒ¨áƒ•ებულირშეცდáƒáƒ›áƒ: " # ^ErrorDecompressing შეცდáƒáƒ›áƒ მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡! შესáƒáƒ«áƒšáƒáƒ სáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒáƒªáƒ˜áƒ პრáƒáƒ’რáƒáƒ›áƒáƒ დáƒáƒ–იáƒáƒœáƒ”ბული. # ^ErrorRegistering áƒáƒ  რეგისტრირდებრ(DLL) # ^ExecShell "ExecShell: " # ^Exec "შესრულებáƒ: " # ^Extract "áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რი: " # ^ErrorWriting "áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რი: შეცდáƒáƒ›áƒáƒ დáƒáƒ¨áƒ•ებული ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რისáƒáƒ¡ " # ^InvalidOpcode სáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒáƒªáƒ˜áƒ პრáƒáƒ’რáƒáƒ›áƒ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ: კáƒáƒ“ი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს # ^NoOLE "OLE áƒáƒ  áƒáƒ áƒ˜áƒ¡: " # ^OutputFolder "ჩáƒáƒ¢áƒ•ირთვის ფáƒáƒšáƒ“ერი: " # ^RemoveFolder "ფáƒáƒšáƒ“ერის წáƒáƒ¨áƒšáƒ: " # ^RenameOnReboot "სáƒáƒ®áƒ”ლის შეცვლრკáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რის გáƒáƒ“áƒáƒ•ირთვისáƒáƒ¡: " # ^Rename "სáƒáƒ®áƒ”ლის შეცვლáƒ: " # ^Skipped "გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ: " # ^CopyDetails მáƒáƒœáƒáƒªáƒ”მების ბუფერში კáƒáƒžáƒ˜áƒ áƒ”ბრ# ^LogInstall ჩáƒáƒ¢áƒ•ირთვის áƒáƒ¦áƒ¬áƒ”რრ# byte B # kilo K # mega M # giga G nsis-3.11/Contrib/Language files/Georgian.nsh000077500000000000000000000267261477201124000211030ustar00rootroot00000000000000;Language: Georgian (1079) ;Translation by David Huriev and format updated by Jim Park !insertmacro LANGFILE "Georgian" = "ქáƒáƒ áƒ—ული" "Kartuli" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბáƒáƒ— $(^NameDA)–ის სáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒáƒªáƒ˜áƒ პრáƒáƒ’რáƒáƒ›áƒ" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ეს პრáƒáƒ’რáƒáƒ›áƒ ჩáƒáƒ¢áƒ•ირთáƒáƒ•ს $(^NameDA)–ს თქვენს კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რში.$\r$\n$\r$\nჩáƒáƒ¢áƒ•ირთვáƒáƒ›áƒ“ე რეკáƒáƒ›áƒ”ნდირებულირყველრპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ სისტემურ ფáƒáƒ˜áƒšáƒ”ბს ისე შეცვლის, რáƒáƒ› კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რს გáƒáƒ“áƒáƒ¢áƒ•ირთვრáƒáƒ  დáƒáƒ¡áƒ­áƒ˜áƒ áƒ“ებáƒ.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბáƒáƒ— $(^NameDA)–ის დეინსტáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒœáƒ¯áƒáƒ áƒ" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ეს პრáƒáƒ’რáƒáƒ›áƒ წáƒáƒ¨áƒšáƒ˜áƒ¡ $(^NameDA)–ს კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ.$\r$\n$\r$\nწáƒáƒ¨áƒšáƒáƒ›áƒ“ე დáƒáƒ®áƒ£áƒ áƒ”თ პრáƒáƒ’რáƒáƒ›áƒ $(^NameDA).$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "სáƒáƒšáƒ˜áƒªáƒ”ნზირშეთáƒáƒœáƒ®áƒ›áƒ”ბáƒ" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "სáƒáƒœáƒáƒ› $(^NameDA)–ს ჩáƒáƒ¢áƒ•ირთáƒáƒ•თ გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირშეთáƒáƒœáƒ®áƒ›áƒ”ბáƒáƒ¡." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს, დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე $\"ვეთáƒáƒœáƒ®áƒ›áƒ”ბი$\". პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირდáƒáƒ—áƒáƒœáƒ®áƒ›áƒ”ბáƒ." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს, მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ფáƒáƒœáƒ¯áƒáƒ áƒ ქვემáƒáƒ—. $(^NameDA)–ის ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირპირáƒáƒ‘ებზე დáƒáƒ—áƒáƒœáƒ®áƒ›áƒ”ბáƒ. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მული პირველი ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜. $(^NameDA)–ის ჩáƒáƒ¡áƒáƒ¢áƒ•ირთáƒáƒ“ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირპირáƒáƒ‘ებზე დáƒáƒ—áƒáƒœáƒ®áƒ›áƒ”ბáƒ. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "სáƒáƒšáƒ˜áƒªáƒ”ნზირშეთáƒáƒœáƒ®áƒ›áƒ”ბáƒ" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "სáƒáƒœáƒáƒ› წáƒáƒ¨áƒšáƒ˜áƒ— $(^NameDA)–ს გáƒáƒ”ცáƒáƒœáƒ˜áƒ— სáƒáƒšáƒ˜áƒªáƒ”ნზირშეთáƒáƒœáƒ®áƒ›áƒ”ბáƒáƒ¡." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე $\"თáƒáƒœáƒ®áƒ›áƒáƒ‘áƒ$\". $(^NameDA)–ის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ პირáƒáƒ”ბებზე დáƒáƒ—áƒáƒœáƒ®áƒ›áƒ”ბáƒ. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ფáƒáƒœáƒ¯áƒáƒ áƒ ქვემáƒáƒ—. $(^NameDA)–ს წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ პირáƒáƒ”ბებზე დáƒáƒ—áƒáƒœáƒ®áƒ›áƒ”ბáƒ. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "თუ ეთáƒáƒœáƒ®áƒ›áƒ”ბით პირáƒáƒ‘ებს მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მული პირველი ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜. $(^NameDA)–ს წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ პირáƒáƒ”ბებზე დáƒáƒ—áƒáƒœáƒ®áƒ›áƒ”ბáƒ. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ტექსტის წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ღილáƒáƒ™áƒ”ბი $\"PageUp$\" დრ$\"PageDown$\"." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ჩáƒáƒ¡áƒáƒ¢áƒ•ირთი პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტები" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ $(^NameDA)–ის კáƒáƒ›áƒžáƒáƒœáƒ”ნტები, რáƒáƒ›áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთáƒáƒª გსურთ." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტები" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ $(^NameDA)–ის კáƒáƒ›áƒžáƒáƒœáƒ”ნტები, რáƒáƒ›áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒáƒª გსურთ." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "შემáƒáƒ“გენლáƒáƒ‘áƒ" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "მიიყვáƒáƒœáƒ”თ მáƒáƒ£áƒ¡áƒ˜ კáƒáƒ›áƒžáƒáƒœáƒ”ნტის სáƒáƒ®áƒ”ლწáƒáƒ“ებáƒáƒ¡áƒ—áƒáƒœ მის სრულáƒáƒ“ წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ კáƒáƒ›áƒžáƒáƒœáƒ”ნტი, შემáƒáƒ“გენლáƒáƒ‘ის დáƒáƒ¡áƒáƒœáƒáƒ®áƒáƒ“." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ჩáƒáƒ¡áƒáƒ¢áƒ•ირთი ფáƒáƒšáƒ“ერის მáƒáƒœáƒ˜áƒ¨áƒ•ნáƒ" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ $(^NameDA)–ს ჩáƒáƒ¡áƒáƒ¢áƒ•ირთი ფáƒáƒšáƒ“ერი." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლი ფáƒáƒšáƒ“ერის მáƒáƒœáƒ˜áƒ¨áƒ•ნáƒ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "მიუთითეთ ფáƒáƒšáƒ“ერი, სáƒáƒ˜áƒ“áƒáƒœáƒáƒª უნდრწáƒáƒ˜áƒ¨áƒáƒšáƒáƒ¡ $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ჩáƒáƒ¢áƒ•ირთვáƒ" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "დáƒáƒ”ლáƒáƒ“ეთ, მიმდინáƒáƒ áƒ”áƒáƒ‘ს $(^NameDA)–ის ჩáƒáƒ¢áƒ•ირთვáƒ..." ${LangFileString} MUI_TEXT_FINISH_TITLE "ჩáƒáƒ¢áƒ•ირთვრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "პრáƒáƒ’რáƒáƒ›áƒ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით ჩáƒáƒ˜áƒ¢áƒ•ირთáƒ." ${LangFileString} MUI_TEXT_ABORT_TITLE "ჩáƒáƒ¢áƒ•ირთვრშეწყდáƒ" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ჩáƒáƒ¢áƒ•ირთვრáƒáƒ  დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულáƒ." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "წáƒáƒ¨áƒšáƒ" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "დáƒáƒ”ლáƒáƒ“ეთ, მიმდინáƒáƒ áƒ”áƒáƒ‘ს $(^NameDA)–ის წáƒáƒ¨áƒšáƒ..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "წáƒáƒ˜áƒ¨áƒáƒšáƒ" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "პრáƒáƒ’რáƒáƒ›áƒ სრულáƒáƒ“ წáƒáƒ˜áƒ¨áƒáƒšáƒ." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "შეწყდრწáƒáƒ¨áƒšáƒ" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "სრულáƒáƒ“ áƒáƒ  წáƒáƒ¨áƒšáƒ˜áƒšáƒ." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "დáƒáƒ¡áƒ áƒ£áƒšáƒ“რ$(^NameDA)–ის სáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒáƒªáƒ˜áƒ პრáƒáƒ’რáƒáƒ›áƒ" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ჩáƒáƒ˜áƒ¢áƒ•ირთრკáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რში.$\r$\n$\r$\nდáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე $\"მზáƒáƒ“áƒáƒ$\" სáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒáƒªáƒ˜áƒ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ“áƒáƒœ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ•ლელáƒáƒ“." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)–ის ჩáƒáƒ¢áƒ•ირთვის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ”ბლáƒáƒ“ გáƒáƒ“áƒáƒ¢áƒ•ირთეთ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რი. áƒáƒ®áƒšáƒáƒ•ე გსურთ მისი გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)–ის წáƒáƒ¨áƒšáƒ˜áƒ¡ პრáƒáƒ’რáƒáƒ›áƒ" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) წáƒáƒ˜áƒ¨áƒáƒšáƒ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ.$\r$\n$\r$\nდáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”თ ღილáƒáƒ™áƒ–ე $\"მზáƒáƒ“áƒáƒ$\" წáƒáƒ¨áƒšáƒ˜áƒ¡ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ“áƒáƒœ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ•ლელáƒáƒ“." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)–ის სრულáƒáƒ“ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ“áƒáƒ¢áƒ•ირთეთ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რი. áƒáƒ®áƒšáƒáƒ•ე გსურთ მისი გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "დიáƒáƒ®, áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ“áƒáƒ˜áƒ¢áƒ•ირთáƒáƒ¡" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "áƒáƒ áƒ, მáƒáƒ’ვიáƒáƒœáƒ”ბით გáƒáƒ“áƒáƒ•ტვირთáƒáƒ• კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რს" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA)–ის &ჩáƒáƒ áƒ—ვáƒ" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "ReadMe &ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩვენებáƒ" #FIXME: BUGBUG "ReadMe"? ${LangFileString} MUI_BUTTONTEXT_FINISH "&მზáƒáƒ“áƒáƒ" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "მენიუში áƒáƒ áƒ¡áƒ”ბული ფáƒáƒšáƒ“ერი $\"სტáƒáƒ áƒ¢áƒ˜$\"" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒšáƒ“ერი მენიუში $\"სტáƒáƒ áƒ¢áƒ˜$\" $(^NameDA)–ის იáƒáƒ áƒšáƒ˜áƒ§áƒ”ბის გáƒáƒœáƒ¡áƒáƒ—áƒáƒ•სებლáƒáƒ“." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒšáƒ“ერი მენიუში $\"სტáƒáƒ áƒ¢áƒ˜$\", სáƒáƒ“áƒáƒª გáƒáƒœáƒ—áƒáƒ•სდებრპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ იáƒáƒ áƒšáƒ˜áƒ§áƒ”ბი. თქვენ სხვრსáƒáƒ®áƒ”ლიც შეგიძლიáƒáƒ— მიუთითáƒáƒ— áƒáƒ®áƒáƒšáƒ˜ ფáƒáƒšáƒ“ერის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "áƒáƒ  შეიქმნáƒáƒ¡ იáƒáƒ áƒšáƒ˜áƒ§áƒ˜" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)–ის წáƒáƒ¨áƒšáƒ" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)–ის კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ წáƒáƒ¨áƒšáƒ." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "ნáƒáƒ›áƒ“ვილáƒáƒ“ გსურთ უáƒáƒ áƒ˜ თქვáƒáƒ— $(^Name)–ის ჩáƒáƒ¢áƒ•ირთვáƒáƒ–ე?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "ნáƒáƒ›áƒ“ვილáƒáƒ“ გსურთ უáƒáƒ áƒ˜ თქვáƒáƒ— $(^Name)–ის წáƒáƒ¨áƒšáƒáƒ–ე?" !endif nsis-3.11/Contrib/Language files/German.nlf000077500000000000000000000132211477201124000205320ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1031 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by L.King, changes by R. Bisswanger, Tim Kosse, Frederik Schwarzer & Sebastian Stange # ^Branding Nullsoft Install System %s # ^SetupCaption Installation von $(^Name) # ^UninstallCaption Deinstallation von $(^Name) # ^LicenseSubCaption : Lizenzabkommen # ^ComponentsSubCaption : Installationsoptionen # ^DirSubCaption : Zielverzeichnis # ^InstallingSubCaption : Wird installiert # ^CompletedSubCaption : Fertig # ^UnComponentsSubCaption : Deinstallationsoptionen # ^UnDirSubCaption : Quellverzeichnis # ^ConfirmSubCaption : Bestätigung # ^UninstallingSubCaption : Wird entfernt # ^UnCompletedSubCaption : Fertig # ^BackBtn < &Zurück # ^NextBtn &Weiter > # ^AgreeBtn &Annehmen # ^AcceptBtn Lizenzabkommen &akzeptieren # ^DontAcceptBtn Lizenzabkommen ab&lehnen # ^InstallBtn &Installieren # ^UninstallBtn &Deinstallieren # ^CancelBtn Abbrechen # ^CloseBtn &Beenden # ^BrowseBtn &Durchsuchen ... # ^ShowDetailsBtn &Details anzeigen # ^ClickNext Klicken Sie auf Weiter, um fortzufahren. # ^ClickInstall Klicken Sie auf Installieren, um die Installation zu starten. # ^ClickUninstall Klicken Sie auf Deinstallieren, um die Deinstallation zu starten. # ^Name Name # ^Completed Fertig # ^LicenseText Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. # ^LicenseTextCB Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkästchen. $_CLICK # ^LicenseTextRB Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie die entsprechende Option. $_CLICK # ^UnLicenseText Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. # ^UnLicenseTextCB Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkästchen. $_CLICK # ^UnLicenseTextRB Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie die entsprechende Option. $_CLICK # ^Custom Benutzerdefiniert # ^ComponentsText Wählen Sie die Komponenten, welche Sie installieren wollen. $_CLICK # ^ComponentsSubText1 Installationstyp bestimmen: # ^ComponentsSubText2_NoInstTypes Wählen Sie die zu installierenden Komponenten: # ^ComponentsSubText2 oder wählen Sie zusätzliche zu installierende Komponenten: # ^UnComponentsText Wählen Sie die Komponenten, welche Sie entfernen wollen. $_CLICK # ^UnComponentsSubText1 Deinstallationstyp bestimmen: # ^UnComponentsSubText2_NoInstTypes Wählen Sie die zu entfernenden Komponenten: # ^UnComponentsSubText2 oder wählen Sie zusätzliche Komponenten, welche Sie entfernen möchten: # ^DirText $(^NameDA) wird in das unten angegebene Verzeichnis installiert. Falls Sie in ein anderes Verzeichnis installieren möchten, klicken Sie auf Durchsuchen und wählen Sie ein anderes Verzeichnis aus. $_CLICK # ^DirSubText Zielverzeichnis # ^DirBrowseText Wählen Sie das Verzeichnis aus, in das Sie $(^NameDA) installieren möchten: # ^UnDirText $(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. Falls sich $(^NameDA) in einem anderen Verzeichnis befindet, klicken Sie auf Durchsuchen und wählen Sie das richtige Verzeichnis aus. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Wählen Sie das Verzeichnis aus, in dem sich $(^NameDA) befindet: # ^SpaceAvailable "Verfügbarer Speicher: " # ^SpaceRequired "Benötigter Speicher: " # ^UninstallingText $(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. $_CLICK # ^UninstallingSubText Wird entfernt aus: # ^FileError Fehler beim Überschreiben der Datei: \r\n\t"$0"\r\nKlicken Sie auf Abbrechen, um abzubrechen,\r\nauf Wiederholen, um den Schreibvorgang erneut zu versuchen,\r\noder auf Ignorieren, um diese Datei zu überspringen. # ^FileError_NoIgnore Fehler beim Überschreiben der Datei: \r\n\t"$0"\r\nKlicken Sie auf Wiederholen, um den Schreibvorgang erneut zu versuchen,\r\noder auf Abbrechen, um die Installation zu beenden. # ^CantWrite "Fehler beim Schreiben: " # ^CopyFailed Kopieren fehlgeschlagen # ^CopyTo "Wird kopiert nach " # ^Registering "Wird registriert: " # ^Unregistering "Wird deregistriert: " # ^SymbolNotFound "Symbol ist nicht vorhanden: " # ^CouldNotLoad "Fehler beim Laden von " # ^CreateFolder "Verzeichnis wird erstellt: " # ^CreateShortcut "Verknüpfung wird erstellt: " # ^CreatedUninstaller "Deinstallationsprogramm wird erstellt: " # ^Delete "Datei wird gelöscht: " # ^DeleteOnReboot "Datei wird nach Neustart gelöscht: " # ^ErrorCreatingShortcut "Fehler beim Erstellen der Verknüpfung: " # ^ErrorCreating "Fehler beim Erstellen: " # ^ErrorDecompressing Fehler beim Entpacken. Ist das Installationsprogramm beschädigt? # ^ErrorRegistering Fehler beim Registrieren der DLL # ^ExecShell "ExecShell: " # ^Exec "Wird gestartet: " # ^Extract "Wird entpackt: " # ^ErrorWriting "Entpacken: Fehler beim Schreiben der Datei " # ^InvalidOpcode Beschädigtes Installationsprogramm: ungültiger Befehlscode # ^NoOLE "Kein OLE für: " # ^OutputFolder "Zielverzeichnis: " # ^RemoveFolder "Verzeichnis wird entfernt: " # ^RenameOnReboot "Umbenennen nach Neustart: " # ^Rename "Umbenennen: " # ^Skipped "Übersprungen: " # ^CopyDetails Details in die Zwischenablage kopieren # ^LogInstall Installationsverlauf protokollieren # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/German.nsh000077500000000000000000000211671477201124000205530ustar00rootroot00000000000000;Language: German (1031) ;By L.King, changes by K. Windszus, R. Bisswanger, M. Simmack, D. Weiß, Frederik Schwarzer & S. Stange !insertmacro LANGFILE "German" = "Deutsch" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Willkommen zur Installation$\r$\nvon $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Installation von $(^NameDA) begleiten.$\r$\n$\r$\nEs wird empfohlen, vor der Installation alle anderen Programme zu schließen, damit bestimmte Systemdateien ohne Neustart ersetzt werden können.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Willkommen zur Deinstallation$\r$\nvon $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Deinstallation von $(^NameDA) begleiten.$\r$\n$\r$\nBitte beenden Sie $(^NameDA), bevor Sie mit der Deinstallation fortfahren.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizenzabkommen" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Installation fortfahren." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizenzabkommen" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Deinstallation von $(^NameDA) fortfahren." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Drücken Sie die BILD-AB-Taste, um den Rest des Abkommens zu lesen." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Komponenten auswählen" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie installieren möchten." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswählen" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie entfernen möchten." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreibung" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bewegen Sie den Mauszeiger über eine Komponente, um die Beschreibung zu lesen." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Wählen Sie eine Komponente, um die Beschreibung zu lesen." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zielverzeichnis auswählen" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, in das $(^NameDA) installiert werden soll." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Verzeichnis für Deinstallation auswählen" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, aus dem $(^NameDA) entfernt werden soll." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Wird installiert ..." ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) installiert wird." ${LangFileString} MUI_TEXT_FINISH_TITLE "Die Installation ist vollständig" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Die Installation wurde erfolgreich abgeschlossen." ${LangFileString} MUI_TEXT_ABORT_TITLE "Abbruch der Installation" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Die Installation wurde nicht vollständig abgeschlossen." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Wird deinstalliert ..." ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) entfernt wird." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Die Deinstallation ist vollständig" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Die Deinstallation wurde erfolgreich abgeschlossen." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Abbruch der Deinstallation" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Die Deinstallation wurde nicht vollständig abgeschlossen." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Die Installation von $(^NameDA) wird abgeschlossen" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) wurde auf Ihrem Computer installiert.$\r$\n$\r$\nKlicken Sie auf Fertigstellen, um den Installationsassistenten zu schließen." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Installation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Die Deinstallation von $(^NameDA) wird abgeschlossen" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ist von Ihrem Computer entfernt worden.$\r$\n$\r$\nKlicken Sie auf Fertigstellen, um den Assistenten zu schließen." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Deinstallation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Jetzt neu starten" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Windows später selbst neu starten" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) ausführen" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Liesmich-Datei anzeigen" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fertigstellen" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenü-Ordner bestimmen" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Bestimmen Sie einen Startmenü-Ordner für die Programmverknüpfungen." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Wählen Sie den Startmenü-Ordner für die Programmverknüpfungen aus. Falls Sie einen neuen Ordner erstellen möchten, geben Sie dessen Namen ein." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Keine Verknüpfungen erstellen" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deinstallation von $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) wird von Ihrem Computer entfernt." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Installation von $(^Name) abbrechen möchten?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Deinstallation von $(^Name) abbrechen möchten?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Benutzer auswählen" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Wählen Sie die Benutzer aus, für die Sie $(^NameDA) installieren möchten." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Wählen Sie aus, ob Sie $(^NameDA) nur für den eigenen Gebrauch oder für die Nutzung durch alle Benutzer dieses Systems installieren möchten. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installation für alle Benutzer dieses Computers" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installation nur für mich" !endif nsis-3.11/Contrib/Language files/Greek.nlf000077500000000000000000000204351477201124000203630ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1032 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1253 # RTL - anything else than RTL means LTR - # Translation by Makidis N. Michael - http://dias.aueb.gr/~p3010094/ # ^Branding Nullsoft Install System %s # ^SetupCaption Εγκατάσταση του '$(^Name)' # ^UninstallCaption Απεγκατάσταση του '$(^Name)' # ^LicenseSubCaption : Συμφωνία Άδειας ΧÏήσης # ^ComponentsSubCaption : Επιλογές Εγκατάστασης # ^DirSubCaption : Φάκελος Εγκατάστασης # ^InstallingSubCaption : Εγκατάσταση σε εξέλιξη # ^CompletedSubCaption : ΟλοκληÏώθηκε # ^UnComponentsSubCaption : Επιλογές Απεγκατάστασης # ^UnDirSubCaption : Φάκελος Απεγκατάστασης # ^ConfirmSubCaption : Επιβεβαίωση # ^UninstallingSubCaption : Απεγκατάσταση σε εξέλιξη # ^UnCompletedSubCaption : ΟλοκληÏώθηκε # ^BackBtn < &Πίσω # ^NextBtn &Επόμενο > # ^AgreeBtn &Συμφωνώ # ^AcceptBtn &Αποδέχομαι τους ÏŒÏους της άδειας χÏήσης # ^DontAcceptBtn &Δεν αποδέχομαι τους ÏŒÏους της άδειας χÏήσης # ^InstallBtn &Εγκατάσταση # ^UninstallBtn Απε&γκατάστ. # ^CancelBtn ΆκυÏο # ^CloseBtn &Κλείσιμο # ^BrowseBtn Α&ναζήτηση... # ^ShowDetailsBtn &ΛεπτομέÏειες # ^ClickNext Κάντε κλικ στο Επόμενο για να συνεχίσετε. # ^ClickInstall Κάντε κλικ στο Εγκατάσταση για να αÏχίσετε την εγκατάσταση. # ^ClickUninstall Κάντε κλικ στο Απεγκατάσταση για να αÏχίσετε την απεγκατάσταση. # ^Name Όνομα # ^Completed ΟλοκληÏώθηκε # ^LicenseText Ελέγξτε την άδεια χÏήσης Ï€Ïιν εγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους ÏŒÏους, κάντε κλικ στο Συμφωνώ. # ^LicenseTextCB Ελέγξτε την άδεια χÏήσης Ï€Ïιν εγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους ÏŒÏους, κάντε κλικ στην επιλογή παÏακάτω. $_CLICK # ^LicenseTextRB Ελέγξτε την άδεια χÏήσης Ï€Ïιν εγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους ÏŒÏους, κάντε κλικ στην Ï€Ïώτη επιλογή παÏακάτω. $_CLICK # ^UnLicenseText Ελέγξτε την άδεια χÏήσης Ï€Ïιν απεγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους ÏŒÏους, κάντε κλικ στο Συμφωνώ. # ^UnLicenseTextCB Ελέγξτε την άδεια χÏήσης Ï€Ïιν απεγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους ÏŒÏους, κάντε κλικ στην επιλογή παÏακάτω. $_CLICK # ^UnLicenseTextRB Ελέγξτε την άδεια χÏήσης Ï€Ïιν απεγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους ÏŒÏους, κάντε κλικ στην Ï€Ïώτη επιλογή παÏακάτω. $_CLICK # ^Custom ΠÏοσαÏμοσμένη # ^ComponentsText Επιλέξτε τα στοιχεία που θέλετε να εγκαταστήσετε και αποεπιλέξτε τα στοιχεία που δε θέλετε να εγκαταστήσετε. $_CLICK # ^ComponentsSubText1 Επιλέξτε Ï„Ïπο εγκατάστασης: # ^ComponentsSubText2_NoInstTypes Επιλέξτε τα στοιχεία που θέλετε να εγκαταστήσετε: # ^ComponentsSubText2 Ή, επιλέξτε τα Ï€ÏοαιÏετικά στοιχεία που θέλετε να εγκαταστήσετε: # ^UnComponentsText Επιλέξτε τα στοιχεία που θέλετε να απεγκαταστήσετε και αποεπιλέξτε τα στοιχεία που δε θέλετε να απεγκαταστήσετε. $_CLICK # ^UnComponentsSubText1 Επιλέξτε Ï„Ïπο απεγκατάστασης: # ^UnComponentsSubText2_NoInstTypes Επιλέξτε τα στοιχεία που θέλετε να απεγκαταστήσετε: # ^UnComponentsSubText2 Ή, επιλέξτε τα Ï€ÏοαιÏετικά στοιχεία που θέλετε να απεγκαταστήσετε: # ^DirText Το Ï€ÏόγÏαμμα εγκατάστασης θα εγκαταστήσει το '$(^NameDA)' στον παÏακάτω φάκελο. Για να το εγκαταστήσετε σε έναν άλλο φάκελο, κάντε κλικ στο Αναζήτηση και επιλέξτε κάποιον άλλο φάκελο. $_CLICK # ^DirSubText Φάκελος Εγκατάστασης # ^DirBrowseText Επιλέξτε το φάκελο εγκατάστασης για το '$(^NameDA)': # ^UnDirText Το Ï€ÏόγÏαμμα εγκατάστασης θα απεγκαταστήσει το '$(^NameDA)' από τον παÏακάτω φάκελο. Για να απεγκαταστήσετε από έναν άλλο φάκελο, κάντε κλικ στο Αναζήτηση και επιλέξτε κάποιον άλλο φάκελο. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Επιλέξτε το φάκελο απεγκατάστασης για το '$(^NameDA)': # ^SpaceAvailable "Διαθέσιμος χώÏος: " # ^SpaceRequired "ΑπαιτοÏμενος χώÏος: " # ^UninstallingText Το '$(^NameDA)' θα απεγκατασταθεί από τον ακόλουθο φάκελο. $_CLICK # ^UninstallingSubText Απεγκατάστ. από: # ^FileError Σφάλμα κατά το άνοιγμα αÏχείου για εγγÏαφή: \r\n\t"$0"\r\nΕπιλέξτε ματαίωση για να ματαιώσετε την εγκατάσταση,\r\nεπανάληψη για να δοκιμάσετε να γÏάψετε το αÏχείο πάλι, ή\r\nπαÏάβλεψη για να παÏαλείψετε αυτό το αÏχείο. # ^FileError_NoIgnore Σφάλμα κατά το άνοιγμα αÏχείου για εγγÏαφή: \r\n\t"$0"\r\nΕπιλέξτε επανάληψη για να δοκιμάσετε να γÏάψετε το αÏχείο πάλι, ή\r\nματαίωση για να ματαιώσετε την εγκατάσταση. # ^CantWrite "Αδυναμία εγγÏαφής: " # ^CopyFailed ΑντιγÏαφή απέτυχε # ^CopyTo "ΑντιγÏαφή στο " # ^Registering "ΚαταχώÏηση: " # ^Unregistering "ΚατάÏγηση καταχώÏησης: " # ^SymbolNotFound "Αδυναμία εÏÏεσης συμβόλου: " # ^CouldNotLoad "Αδυναμία φόÏτωσης: " # ^CreateFolder "ΔημιουÏγία φακέλου: " # ^CreateShortcut "ΔημιουÏγία συντόμευσης: " # ^CreatedUninstaller "ΔημιουÏγία Ï€ÏογÏάμματος απεγκατάστασης: " # ^Delete "ΔιαγÏαφή αÏχείου: " # ^DeleteOnReboot "ΔιαγÏαφή στην επανεκκίνηση: " # ^ErrorCreatingShortcut "Σφάλμα στη δημιουÏγία συντόμευσης: " # ^ErrorCreating "Σφάλμα στη δημιουÏγία: " # ^ErrorDecompressing Σφάλμα στην αποσυμπίεση δεδομένων! ΚατεστÏαμμένο Ï€ÏόγÏαμμα εγκατάστασης; # ^ErrorRegistering Σφάλμα καταχώÏησης του DLL # ^ExecShell "Εκτέλεση (ExecShell): " # ^Exec "Εκτέλεση: " # ^Extract "Αποσυμπίεση: " # ^ErrorWriting "Αποσυμπίεση: σφάλμα εγγÏαφής στο αÏχείο " # ^InvalidOpcode Εγκατάσταση κατεστÏαμμένη: μη-έγκυÏο opcode # ^NoOLE "Όχι OLE για το: " # ^OutputFolder "Φάκελος εξόδου: " # ^RemoveFolder "ΔιαγÏαφή φακέλου: " # ^RenameOnReboot "Μετονομασία στην επανεκκίνηση: " # ^Rename "Μετονομασία: " # ^Skipped "ΠαÏαλείφθηκε: " # ^CopyDetails ΑντιγÏαφή λεπτομεÏειών στο ΠÏόχειÏο # ^LogInstall ΚαταγÏαφή διαδικασίας εγκατάστασης # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Greek.nsh000077500000000000000000000252221477201124000203730ustar00rootroot00000000000000;Language: Greek (1032) ;By Makidis N. Michael - http://dias.aueb.gr/~p3010094/ !insertmacro LANGFILE "Greek" = "Ελληνικά" "Ellinika" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Καλώς ήλθατε στην Εγκατάσταση του '$(^NameDA)'" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ο οδηγός αυτός θα σας καθοδηγήσει κατά τη διάÏκεια της εγκατάστασης του '$(^NameDA)'.$\r$\n$\r$\nΣυνιστάται να κλείσετε όλες τις άλλες εφαÏμογές Ï€Ïιν ξεκινήσετε την Εγκατάσταση. Αυτό θα επιτÏέψει στην Εγκατάσταση να ενημεÏώσει τα σχετικά αÏχεία συστήματος χωÏίς την επανεκκίνηση του υπολογιστή σας.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Καλώς ήλθατε στον οδηγό απεγκατ. του '$(^NameDA)'" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ο οδηγός αυτός θα σας καθοδηγήσει κατά τη διάÏκεια της απεγκατάστασης του '$(^NameDA)'.$\r$\n$\r$\nΠÏιν ξεκινήσετε την απεγκατάσταση, βεβαιωθείτε ότι το '$(^NameDA)' δεν Ï„Ïέχει.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Συμφωνία Άδειας ΧÏήσης" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ελέγξτε την άδεια χÏήσης Ï€Ïιν εγκαταστήσετε το '$(^NameDA)'." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Εάν αποδέχεστε τους ÏŒÏους της άδειας χÏήσης, κάντε κλικ στο Συμφωνώ για να συνεχίσετε. ΠÏέπει να αποδεχθείτε τη συμφωνία για να εγκαταστήσετε το '$(^NameDA)'." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Εάν αποδέχεστε τους ÏŒÏους της άδειας χÏήσης, κάντε κλικ στην επιλογή παÏακάτω. ΠÏέπει να αποδεχθείτε τη συμφωνία για να εγκαταστήσετε το '$(^NameDA)'. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Εάν αποδέχεστε τους ÏŒÏους της άδειας χÏήσης, κάντε κλικ στην Ï€Ïώτη επιλογή παÏακάτω. ΠÏέπει να αποδεχθείτε τη συμφωνία για να εγκαταστήσετε το '$(^NameDA)'. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Συμφωνία Άδειας ΧÏήσης" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ελέγξτε την άδεια χÏήσης Ï€Ïιν απεγκαταστήσετε το '$(^NameDA)'." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Εάν αποδέχεστε τους ÏŒÏους της άδειας χÏήσης, κάντε κλικ στο Συμφωνώ για να συνεχίσετε. ΠÏέπει να αποδεχθείτε τη συμφωνία για να απεγκαταστήσετε το '$(^NameDA)'." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Εάν αποδέχεστε τους ÏŒÏους της άδειας χÏήσης, κάντε κλικ στην επιλογή παÏακάτω. ΠÏέπει να αποδεχθείτε τη συμφωνία για να απεγκαταστήσετε το '$(^NameDA)'. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Εάν αποδέχεστε τους ÏŒÏους της άδειας χÏήσης, κάντε κλικ στην Ï€Ïώτη επιλογή παÏακάτω. ΠÏέπει να αποδεχθείτε τη συμφωνία για να απεγκαταστήσετε το '$(^NameDA)'. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Πατήστε το Page Down για να δείτε το υπόλοιπο της άδειας χÏήσης." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Επιλογή Στοιχείων" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Επιλέξτε τα στοιχεία του '$(^NameDA)' που θέλετε να εγκαταστήσετε." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Επιλογή Στοιχείων" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Επιλέξτε τα στοιχεία του '$(^NameDA)' που θέλετε να απεγκαταστήσετε." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ΠεÏιγÏαφή" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ΠεÏάστε το δείκτη του Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Ï€Î¬Î½Ï‰ από ένα στοιχείο για να δείτε την πεÏιγÏαφή του." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Επιλέξτε ένα στοιχείο για να δείτε την πεÏιγÏαφή του." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Επιλογή Θέσης Εγκατάστασης" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Επιλέξτε το φάκελο μέσα στον οποίο θα εγκατασταθεί το '$(^NameDA)'." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Επιλογή Θέσης Απεγκατάστασης" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Επιλέξτε το φάκελο από τον οποίο θα απεγκατασταθεί το '$(^NameDA)'." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Εγκατάσταση Σε Εξέλιξη" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "ΠαÏακαλώ πεÏιμένετε όσο το '$(^NameDA)' εγκαθίσταται." ${LangFileString} MUI_TEXT_FINISH_TITLE "Η Εγκατάσταση ΟλοκληÏώθηκε" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Η εγκατάσταση ολοκληÏώθηκε επιτυχώς." ${LangFileString} MUI_TEXT_ABORT_TITLE "Η Εγκατάσταση Διακόπηκε" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Η εγκατάσταση δεν ολοκληÏώθηκε επιτυχώς." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Απεγκατάσταση Σε Εξέλιξη" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "ΠαÏακαλώ πεÏιμένετε όσο το '$(^NameDA)' απεγκαθίσταται." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Η Απεγκατάσταση ΟλοκληÏώθηκε" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Η απεγκατάσταση ολοκληÏώθηκε επιτυχώς." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Η Απεγκατάσταση Διακόπηκε" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Η απεγκατάσταση δεν ολοκληÏώθηκε επιτυχώς." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ΟλοκλήÏωση της Εγκατάστασης του '$(^NameDA)'" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Το '$(^NameDA)' εγκαταστάθηκε στον υπολογιστή σας.$\r$\n$\r$\nΚάντε κλικ στο Τέλος για να κλείσετε αυτόν τον οδηγό." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "ΠÏέπει να γίνει επανεκκίνηση του υπολογιστή σας για να ολοκληÏωθεί η εγκατάσταση του '$(^NameDA)'. Θέλετε να επανεκκινήσετε τον υπολογιστή σας τώÏα;" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ΟλοκλήÏωση της Απεγκατάστασης του '$(^NameDA)'" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Το '$(^NameDA)' απεγκαταστάθηκε από τον υπολογιστή σας.$\r$\n$\r$\nΚάντε κλικ στο Τέλος για να κλείσετε αυτόν τον οδηγό." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "ΠÏέπει να γίνει επανεκκίνηση του υπολογιστή σας για να ολοκληÏωθεί η απεγκατάσταση του '$(^NameDA)'. Θέλετε να επανεκκινήσετε τον υπολογιστή σας τώÏα;" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Îα γίνει επανεκκίνηση τώÏα" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Θα επανεκκινήσω τον υπολογιστή μου αÏγότεÏα" ${LangFileString} MUI_TEXT_FINISH_RUN "&Εκτέλεση του '$(^NameDA)'" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Εμφάνιση του &αÏχείου Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Τέλος" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Επιλογή Φακέλου για το ÎœÎµÎ½Î¿Ï ÎˆÎ½Î±Ïξη" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Επιλέξτε ένα φάκελο του Î¼ÎµÎ½Î¿Ï ÎˆÎ½Î±Ïξη για τις συντομεÏσεις του '$(^NameDA)'." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Επιλέξτε ένα φάκελο του Î¼ÎµÎ½Î¿Ï ÎˆÎ½Î±Ïξη για τις συντομεÏσεις του Ï€ÏογÏάμματος. ΜποÏείτε επίσης να εισάγετε ένα όνομα για να δημιουÏγήσετε ένα νέο φάκελο." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Îα μη δημιουÏγηθοÏν συντομεÏσεις" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Απεγκατάσταση του '$(^NameDA)'" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "ΑφαίÏεση του '$(^NameDA)' από τον υπολογιστή σας." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Είστε σίγουÏοι πως θέλετε να τεÏματίσετε την εγκατάσταση του '$(^Name)';" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Είστε σίγουÏοι πως θέλετε να τεÏματίσετε την απεγκατάσταση του '$(^Name)';" !endif nsis-3.11/Contrib/Language files/Hebrew.nlf000077500000000000000000000134751477201124000205500ustar00rootroot00000000000000# Hebrew NSIS language file NLF v6 # Language ID 1037 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1255 # RTL - anything else than RTL means LTR RTL # Translation by Amir Szekely (aka KiCHiK), fixed by Yaron Shahrabani # ^Branding Nullsoft Install System %s # ^SetupCaption התקנת $(^Name) # ^UninstallCaption הסרת $(^Name) # ^LicenseSubCaption : ×”×¡×›× ×¨×™×©×•×™ # ^ComponentsSubCaption : ×פשרויות התקנה # ^DirSubCaption : תיקיית התקנה # ^InstallingSubCaption : מתקין # ^CompletedSubCaption : ההתקנה הושלמה # ^UnComponentsSubCaption : ×פשרויות הסרה # ^UnDirSubCaption : תיקייה להסרה # ^ConfirmSubCaption : ×ישור הסרה # ^UninstallingSubCaption : מסיר # ^UnCompletedSubCaption : ההסרה הושלמה # ^BackBtn < ×”&×§×•×“× # ^NextBtn ×”&×‘× > # ^AgreeBtn ×× ×™ &×ž×¡×›×™× # ^AcceptBtn ×× ×™ &×ž×¡×›×™× ×œ×ª× ××™ ×”×¡×›× ×”×¨×™×©×•×™ # ^DontAcceptBtn ×× ×™ &×œ× ×ž×¡×›×™× ×œ×ª× ××™ ×”×¡×›× ×”×¨×™×©×•×™ # ^InstallBtn &התקן # ^UninstallBtn &הסר # ^CancelBtn ביטול # ^CloseBtn סגור& # ^BrowseBtn &עיין... # ^ShowDetailsBtn ×”&צג ×¤×¨×˜×™× # ^ClickNext לחץ על ×”×‘× ×›×“×™ להמשיך. # ^ClickInstall לחץ על התקן כדי להתחיל ×ת ההתקנה. # ^ClickUninstall לחץ על הסר כדי להתחיל ×ת ההסרה. # ^Name ×©× # ^Completed הפעולה הושלמה # ^LicenseText ×× × ×¡×§×•×¨ ×ת ×”×¡×›× ×”×¨×™×©×•×™ לפני התקנת $(^NameDA). ×× ×”×™× ×š מקבל ×ת כל תנ××™ ההסכ×, לחץ '×× ×™ מסכי×'. # ^LicenseTextCB ×× × ×¡×§×•×¨ ×ת ×”×¡×›× ×”×¨×™×©×•×™ לפני התקנת $(^NameDA). ×× ×”×™× ×š מקבל ×ת כל תנ××™ ההסכ×, סמן ×ת תיבת הסימון שלהלן. $_CLICK # ^LicenseTextRB ×× × ×¡×§×•×¨ ×ת ×”×¡×›× ×”×¨×™×©×•×™ לפני התקנת $(^NameDA). ×× ×”×™× ×š מקבל ×ת כל תנ××™ ההסכ×, בחר ב×פשרות הר×שונה שלהלן. $_CLICK # ^UnLicenseText ×× × ×¡×§×•×¨ ×ת ×”×¡×›× ×”×¨×™×©×•×™ לפני הסרת $(^NameDA). ×× ×”×™× ×š ×ž×¡×›×™× ×œ×›×œ תנ××™ ההסכ×, לחץ '×× ×™ מסכי×'. # ^UnLicenseTextCB ×× × ×¡×§×•×¨ ×ת ×”×¡×›× ×”×¨×™×©×•×™ לפני הסרת $(^NameDA). ×× ×”×™× ×š ×ž×¡×›×™× ×œ×›×œ תנ××™ ההסכ×, סמן ×ת תיבת הסימון שלהלן. $_CLICK # ^UnLicenseTextRB ×× × ×¡×§×•×¨ ×ת ×”×¡×›× ×”×¨×™×©×•×™ לפני הסרת $(^NameDA). ×× ×”×™× ×š ×ž×¡×›×™× ×œ×›×œ תנ××™ ההסכ×, בחר ב×פשרות הר×שונה שלהלן. $_CLICK # ^Custom מות×× ×ישית # ^ComponentsText סמן ×ת ×”×¨×›×™×‘×™× ×©×‘×¨×¦×•× ×š להתקין ובטל ×ת הסימון של ×¨×›×™×‘×™× ×©×ין ברצונך להתקין. $_CLICK # ^ComponentsSubText1 בחר סוג התקנה: # ^ComponentsSubText2_NoInstTypes בחר ×¨×›×™×‘×™× ×œ×”×ª×§× ×”: # ^ComponentsSubText2 ×ו, בחר רכיבי רשות להתקנה: # ^UnComponentsText סמן ×ת ×”×¨×›×™×‘×™× ×©×‘×¨×¦×•× ×š להסיר ובטל ×ת הסימון של ×¨×›×™×‘×™× ×©×ין ברצונך להסיר. $_CLICK # ^UnComponentsSubText1 בחר סוג הסרה: # ^UnComponentsSubText2_NoInstTypes בחר ×¨×›×™×‘×™× ×œ×”×¡×¨×”: # ^UnComponentsSubText2 ×ו, בחר רכיבי רשות להסרה: # ^DirText תוכנית זו תתקין ×ת $(^NameDA) לתיקייה שלהלן. כדי להתקין לתיקייה ×חרת, לחץ על 'עיין' ובחר תיקייה ×חרת. $_CLICK # ^DirSubText תיקיית יעד # ^DirBrowseText בחר תיקייה להתקנת $(^NameDA): # ^UnDirText תוכנית זו תסיר ×ת $(^NameDA) מהתיקייה שלהלן. כדי להסיר מתיקייה ×חרת, לחץ על 'עיין' ובחר תיקייה ×חרת. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText בחר תיקייה ממנה תוסר $(^NameDA): # ^SpaceAvailable "×ž×§×•× ×¤× ×•×™: " # ^SpaceRequired "×ž×§×•× ×“×¨×•×©: " # ^UninstallingText הסרת $(^NameDA) תתבצע מהתיקייה שלהלן. $_CLICK # ^UninstallingSubText מסיר מ: # ^FileError ×רעה שגי××” בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על ביטול כדי לבטל ×ת ההתקנה,\r\nנסה שנית כדי לנסות לפתוח ×ת הקובץ שוב, ×ו\r\n×”×ª×¢×œ× ×›×“×™ לדלג על הקובץ # ^FileError_NoIgnore ×רעה שגי××” בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על נסה שנית כדי לנסות לפתוח ×ת הקובץ שוב, ×ו\r\nביטול כדי לבטל ×ת התתקנה # ^CantWrite "×œ× × ×™×ª×Ÿ לכתוב: " # ^CopyFailed ההעתקה נכשלה # ^CopyTo העתק ל- # ^Registering "רוש×: " # ^Unregistering "ביטול רישו×: " # ^SymbolNotFound "סמל ×œ× × ×ž×¦×: " # ^CouldNotLoad "×œ× × ×™×ª×Ÿ לטעון: " # ^CreateFolder "צור תיקייה: " # ^CreateShortcut "צור קיצור דרך: " # ^CreatedUninstaller "מסיר התקנה נוצר: " # ^Delete "מחק קובץ: " # ^DeleteOnReboot "מחק ×חרי ×תחול: " # ^ErrorCreatingShortcut "שגי××” בעת יצירת קיצור דרך: " # ^ErrorCreating "שגי××” בעת יצירת: " # ^ErrorDecompressing שגי××” בעת פרישת מידע! התקנה פגומה? # ^ErrorRegistering שגי××” בעת ×¨×™×©×•× DLL # ^ExecShell "בצע פעולת-קובץ: " # ^Exec "בצע: " # ^Extract "פרוש: " # ^ErrorWriting "פרוש: שגי××” בעת כתיבה לקובץ " # ^InvalidOpcode התקנה פגומה! פקודת ביצוע שגויה # ^NoOLE "×ין OLE ל: " # ^OutputFolder "תיקיית פלט: " # ^RemoveFolder "הסר תיקייה: " # ^RenameOnReboot "שנה ×©× ×œ×חר ×תחול: " # ^Rename "שנה ש×: " # ^Skipped "דלג: " # ^CopyDetails העתק ×¤×¨×˜×™× ×œ×œ×•×— # ^LogInstall שמור ×¨×™×©×•× ×¤×¢×™×œ×•×™×•×ª ההתקנה # ^Byte "ב # ^Kilo " ×§" # ^Mega " מ" # ^Giga " ×’"nsis-3.11/Contrib/Language files/Hebrew.nsh000077500000000000000000000211431477201124000205500ustar00rootroot00000000000000;Language: Hebrew (1037) ;By Yaron Shahrabani !insertmacro LANGFILE "Hebrew" = "עברית" "Ivrit" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "×‘×¨×•×›×™× ×”×‘××™× ×œ×שף ההתקנה של $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "×שף ×–×” ×™× ×—×” ××ª×›× ×‘×ž×”×œ×š ההתקנה של $(^NameDA).$\r$\n$\r$\nמומלץ לסגור כל תוכנית ×חרת לפני התחלת ההתקנה. פעולה זו ת×פשר ל×שף לעדכן קבצי מערכת ×œ×œ× ×יתחול המחשב.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "×‘×¨×•×›×™× ×”×‘××™× ×œ×שף ההסרה של $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "×שף ×–×” ×™× ×—×” ××ª×›× ×‘×ž×”×œ×š ההסרה של $(^NameDA).$\r$\n$\r$\nמומלץ לסגור כל תוכנית ×חרת לפני התחלת ההסרה. פעולה זו ת×פשר ל×שף לעדכן קבצי מערכת ×œ×œ× ×יתחול המחשב.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "×”×¡×›× ×¨×™×©×•×™" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "× × ×¢×™×™×Ÿ בתנ××™ ×”×¡×›× ×”×¨×™×©×•×™ לפני התקנת $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "×× ×תה מקבל ×ת תנ××™ ההסכ×, לחץ על '×× ×™ מסכי×' כדי להמשיך. ×× ×œ× ×ª×¡×›×™× ×œ×ª× ××™ ×”×”×¡×›× ×œ× ×ª×•×›×œ להתקין ×ת $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "×× ×תה מקבל ×ת תנ××™ ההסכ×, סמן ×ת תיבת הבחירה שלהלן. עלייך לקבל ×ת תנ××™ ×”×”×¡×›× ×‘×›×“×™ להתקין ×ת $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "×× ×תה מקבל ×ת תנ××™ ההסכ×, בחר ב×פשרות הר×שונה שלהלן. עלייך לקבל ×ת ×”×”×¡×›× ×›×“×™ להתקין ×ת $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "×”×¡×›× ×¨×™×©×•×™" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "× × ×¢×™×™×Ÿ בתנ××™ ×”×¡×›× ×”×¨×™×©×•×™ לפני הסרת $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "×× ×תה מקבל ×ת תנ××™ ההסכ×, לחץ על '×× ×™ מסכי×' כדי להמשיך. ×× ×œ× ×ª×§×‘×œ ×ת תנ××™ ×”×”×¡×›× ×œ× ×ª×•×›×œ להסיר ×ת $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "×× ×תה מקבל ×ת תנ××™ ההסכ×, סמן ×ת תיבת הבחירה שלהלן. עלייך לקבל ×ת תנ××™ ×”×”×¡×›× ×›×“×™ להסיר ×ת $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "×× ×תה מקבל ×ת תנ××™ ההסכ×, בחר ב×פשרות הר×שונה שלהלן. עלייך לקבל ×ת ×”×”×¡×›× ×›×“×™ להסיר ×ת $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "כדי לצפות בש×ר ×”×¡×›× ×”×¨×™×©×•×™ לחץ על Page Down." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "בחר רכיבי×" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "בחר ×ילו ×¨×›×™×‘×™× ×©×œ $(^NameDA) ברצונך להתקין." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "בחר רכיבי×" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "בחר ×ילו תכונות של $(^NameDA) ברצונך להסיר." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "תי×ור" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "העבר ×ת העכבר מעל רכיב כלשהו בכדי לצפות בתי×ורו." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "בחר רכיב כלשהו בכדי לצפות בתי×ורו." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "בחר ×ž×™×§×•× ×œ×”×ª×§× ×”" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "בחר ×ת התיקייה בה ×תה מעוניין להתקין ×ת $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "בחר ×ž×™×§×•× ×œ×”×¡×¨×”" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "בחר ×ת התיקייה ממנה ×תה מעוניין להסיר ×ת $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "מתקין" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "×× × ×”×ž×ª×Ÿ בזמן ש-$(^NameDA) מותקן." ${LangFileString} MUI_TEXT_FINISH_TITLE "ההתקנה הושלמה" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ההתקנה הושלמה במלו××”." ${LangFileString} MUI_TEXT_ABORT_TITLE "ההתקנה בוטלה" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ההתקנה ×œ× ×”×•×©×œ×ž×” המלו××”." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "מסיר" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "×× × ×”×ž×ª×Ÿ בזמן ש-$(^NameDA) מוסר מהמחשב." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ההסרה הושלמה" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ההסרה הושלמה במלו××”." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ההסרה בוטלה" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ההסרה ×œ× ×”×•×©×œ×ž×” במלו××”." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "×ž×©×œ×™× ×ת ×שף ההתקנה של $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) הותקן בהצלחה.$\r$\n$\r$\nלחץ על ×¡×™×•× ×›×“×™ לסגור ×ת ×”×שף." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "עלייך ל×תחל ×ת המחשב כדי ×œ×¡×™×™× ×ת התקנת $(^NameDA). ×”×× ×‘×¨×¦×•× ×š ל×תחל כעת?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "×ž×©×œ×™× ×ת ×שף ההסרה של $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) הוסר בהצלחה.$\r$\n$\r$\nלחץ על ×¡×™×•× ×›×“×™ לסגור ×ת ×”×שף." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "עלייך ל×תחל ×ת המחשב כדי ×œ×¡×™×™× ×ת הסרת $(^NameDA). ×”×× ×‘×¨×¦×•× ×š ל×תחל כעת?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "×תחל כעת" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ברצוני ל×תחל ידנית מ×וחר יותר" ${LangFileString} MUI_TEXT_FINISH_RUN "&הרץ ×ת $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&הצג מסמך '×§×¨× ×ותי'" ${LangFileString} MUI_BUTTONTEXT_FINISH "&סיי×" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "בחר תיקייה בתפריט ההתחלה" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "בחר בתיקיית תפריט ההתחלה בה יווצרו קיצורי הדרך של התוכנית." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "בחר בתיקייה מתפריט ההתחלה בה ברצונך ליצור ×ת קיצורי הדרך עבור התוכנית. ב×פשרותך ×’× ×œ×”×§×œ×™×“ ×ת ×©× ×”×ª×™×§×™×™×” כדי ליצור תיקייה חדשה." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "×ל תיצור קיצורי דרך" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "הסר ×ת $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "הסר ×ת $(^NameDA) מהמחשב." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "×”×× ×תה בטוח שברצונך לצ×ת מהתקנת $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "×”×× ×תה בטוח שברצונך לצ×ת מהסרת $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "בחר משתמשי×" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "בחר ל×ילו ×ž×©×ª×ž×©×™× ×œ×”×ª×§×™×Ÿ ×ת $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "בחר ×”×× ×œ×”×ª×§×™×Ÿ ×ת $(^NameDA) לעצמך ×ו לכל ×”×ž×©×ª×ž×©×™× ×©×œ המחשב. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "התקן לכל משתמשי המחשב" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "התקן רק למשתמש שלי" !endif nsis-3.11/Contrib/Language files/Hindi.nlf000077500000000000000000000245621477201124000203660ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1081 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1200 # RTL - anything else than RTL means LTR - # Translation by Ryan Pretorius # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) सेटअप # ^UninstallCaption $(^Name) अनइनसà¥à¤Ÿà¥‰à¤² करें # ^LicenseSubCaption : लाइसेंस समà¤à¥Œà¤¤à¤¾ # ^ComponentsSubCaption : इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ के विकलà¥à¤ª # ^DirSubCaption : इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ फोलà¥à¤¡à¤° # ^InstallingSubCaption : इनसà¥à¤Ÿà¥‰à¤² कर रहे हैं # ^CompletedSubCaption : संपनà¥à¤¨ # ^UnComponentsSubCaption : अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ के विकलà¥à¤ª # ^UnDirSubCaption : अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ फोलà¥à¤¡à¤° # ^ConfirmSubCaption : पà¥à¤·à¥à¤Ÿà¤¿à¤•रण # ^UninstallingSubCaption : अनइनसà¥à¤Ÿà¥‰à¤² कर रहे हैं # ^UnCompletedSubCaption : समà¥à¤ªà¤¨à¥à¤¨ # ^BackBtn < &पीछे # ^NextBtn &आगे > # ^AgreeBtn मैं &सहमत हूठ# ^AcceptBtn मैं लाइसेंस समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡à¤‚ &सà¥à¤µà¥€à¤•ार करता हूठ# ^DontAcceptBtn मैं लाइसेंस समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार नहीं &करता हूठ# ^InstallBtn &इनसà¥à¤Ÿà¥‰à¤² करें # ^UninstallBtn &अनइनसà¥à¤Ÿà¥‰à¤² करें # ^CancelBtn रदà¥à¤¦ करें # ^CloseBtn &बंद करें # ^BrowseBtn बà¥à¤°à¤¾&उज करें... # ^ShowDetailsBtn &विवरण दिखाà¤à¤‚ # ^ClickNext जारी रखने के लिठआगे पर कà¥à¤²à¤¿à¤• करें। # ^ClickInstall इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ शà¥à¤°à¥‚ करने के लिठइनसà¥à¤Ÿà¥‰à¤² करें पर कà¥à¤²à¤¿à¤• करें। # ^ClickUninstall अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ शà¥à¤°à¥‚ करने के लिठअनइनसà¥à¤Ÿà¥‰à¤² करें पर कà¥à¤²à¤¿à¤• करें। # ^Name म # ^Completed समà¥à¤ªà¤¨à¥à¤¨ # ^LicenseText $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस समà¤à¥Œà¤¤à¥‡ की समीकà¥à¤·à¤¾ करें। यदि आप समà¤à¥Œà¤¤à¥‡ की सभी शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार करते हैं तो मैं सहमत हूठपर कà¥à¤²à¤¿à¤• करें। # ^LicenseTextCB $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस समà¤à¥Œà¤¤à¥‡ की समीकà¥à¤·à¤¾ करें। यदि आप समà¤à¥Œà¤¤à¥‡ की सभी शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठचेक बॉकà¥à¤¸ पर कà¥à¤²à¤¿à¤• करें। $_CLICK # ^LicenseTextRB $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस समà¤à¥Œà¤¤à¥‡ की समीकà¥à¤·à¤¾ करें। यदि आप समà¤à¥Œà¤¤à¥‡ की सभी शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठपहले विकलà¥à¤ª का चयन करें। $_CLICK # ^UnLicenseText $(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस समà¤à¥Œà¤¤à¥‡ की समीकà¥à¤·à¤¾ करें। यदि आप समà¤à¥Œà¤¤à¥‡ की सभी शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार करते हैं तो मैं सहमत हूठपर कà¥à¤²à¤¿à¤• करें। # ^UnLicenseTextCB $(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस समà¤à¥Œà¤¤à¥‡ की समीकà¥à¤·à¤¾ करें। यदि आप समà¤à¥Œà¤¤à¥‡ की सभी शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठचेक बॉकà¥à¤¸ पर कà¥à¤²à¤¿à¤• करें। $_CLICK # ^UnLicenseTextRB $(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस समà¤à¥Œà¤¤à¥‡ की समीकà¥à¤·à¤¾ करें। यदि आप समà¤à¥Œà¤¤à¥‡ की सभी शरà¥à¤¤à¥‡à¤‚ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठपहले विकलà¥à¤ª का चयन करें। $_CLICK # ^Custom कसà¥à¤Ÿà¤® # ^ComponentsText आप जो घटक इनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं उनà¥à¤¹à¥‡à¤‚ चेक करें और आप जो घटक इनसà¥à¤Ÿà¥‰à¤² नहीं करना चाहते हैं उनà¥à¤¹à¥‡à¤‚ अनचेक करें। $_CLICK # ^ComponentsSubText1 इनसà¥à¤Ÿà¥‰à¤² के पà¥à¤°à¤•ार का चयन करें: # ^ComponentsSubText2_NoInstTypes इनसà¥à¤Ÿà¥‰à¤² करने के लिठघटकों का चयन करें: # ^ComponentsSubText2 या उन वैकलà¥à¤ªà¤¿à¤• घटकों का चयन करें जिनà¥à¤¹à¥‡à¤‚ आप इनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं: # ^UnComponentsText आप जो घटक अनइनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं उनà¥à¤¹à¥‡à¤‚ चेक करें और आप जो घटक अनइनसà¥à¤Ÿà¥‰à¤² नहीं करना चाहते हैं उनà¥à¤¹à¥‡à¤‚ अनचेक करें। $_CLICK # ^UnComponentsSubText1 अनइनसà¥à¤Ÿà¥‰à¤² के पà¥à¤°à¤•ार का चयन करें: # ^UnComponentsSubText2_NoInstTypes अनइनसà¥à¤Ÿà¥‰à¤² करने के लिठघटकों का चयन करें: # ^UnComponentsSubText2 या उन वैकलà¥à¤ªà¤¿à¤• घटकों का चयन करें जिनà¥à¤¹à¥‡à¤‚ आप अनइनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं: # ^DirText सेटअप $(^NameDA) को निमà¥à¤¨à¤²à¤¿à¤–ित फोलà¥à¤¡à¤° में इनसà¥à¤Ÿà¥‰à¤² करेगा। किसी भिनà¥à¤¨ फोलà¥à¤¡à¤° में इनसà¥à¤Ÿà¥‰à¤² करने के लिठबà¥à¤°à¤¾à¤‰à¤œ करें पर कà¥à¤²à¤¿à¤• करें और किसी अनà¥à¤¯ फोलà¥à¤¡à¤° का चयन करें। $_CLICK # ^DirSubText गंतवà¥à¤¯ फोलà¥à¤¡à¤° # ^DirBrowseText $(^NameDA) को जिस फोलà¥à¤¡à¤° में इनसà¥à¤Ÿà¥‰à¤² करना है उसका चयन करें: # ^UnDirText सेटअप $(^NameDA) को निमà¥à¤¨à¤²à¤¿à¤–ित फोलà¥à¤¡à¤° से अनइनसà¥à¤Ÿà¥‰à¤² करेगा। किसी भिनà¥à¤¨ फोलà¥à¤¡à¤° से अनइनसà¥à¤Ÿà¥‰à¤² करने के लिठबà¥à¤°à¤¾à¤‰à¤œ करें पर कà¥à¤²à¤¿à¤• करें और किसी अनà¥à¤¯ फोलà¥à¤¡à¤° का चयन करें। $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA) को जिस फोलà¥à¤¡à¤° से अनइनसà¥à¤Ÿà¥‰à¤² करना है उसका चयन करें: # ^SpaceAvailable "उपलबà¥à¤§ जगह: " # ^SpaceRequired "अपेकà¥à¤·à¤¿à¤¤ जगह: " # ^UninstallingText $(^NameDA) को निमà¥à¤¨à¤²à¤¿à¤–ित फोलà¥à¤¡à¤° से अनइनसà¥à¤Ÿà¥‰à¤² किया जाà¤à¤—ा। $_CLICK # ^UninstallingSubText इस से अनइनसà¥à¤Ÿà¥‰à¤² कर रहे हैं: # ^FileError लिखने के लिठफ़ाइल खोलने में तà¥à¤°à¥à¤Ÿà¤¿: \r\n\r\n$0\r\n\r\nइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ रोकने के लिठनिरसà¥à¤¤ करें पर कà¥à¤²à¤¿à¤• करें,\r\nफिर से पà¥à¤°à¤¯à¤¾à¤¸ करने के लिठपà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें, या\r\nइस फाइल को छोड़ने के लिठनजरंदाज करें। # ^FileError_NoIgnore लिखने के लिठफ़ाइल खोलने में तà¥à¤°à¥à¤Ÿà¤¿: \r\n\r\n$0\r\n\r\nफिर से पà¥à¤°à¤¯à¤¾à¤¸ करने के लिठपà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें पर कà¥à¤²à¤¿à¤• करें, या\r\nइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ रोकने के लिठरदà¥à¤¦ करें। # ^CantWrite "नहीं लिख सकते: " # ^CopyFailed" कॉपी करना विफल रहा # ^CopyTo" "में कॉपी करें " # ^Registering "पंजीकृत कर रहे हैं: " # ^Unregistering "पंजीकरण रदà¥à¤¦ कर रहे हैं: " # ^SymbolNotFound "पà¥à¤°à¤¤à¥€à¤• नहीं ढूंढ सके: " # ^CouldNotLoad "लोड नहीं कर सके: " # ^CreateFolder "फोलà¥à¤¡à¤° बनाà¤à¤‚: " # ^CreateShortcut "शॉरà¥à¤Ÿà¤•ट बनाà¤à¤‚: " # ^CreatedUninstaller "अनइंसà¥à¤Ÿà¤¾à¤²à¤° बनाया: " # ^Delete "फाइल हटाà¤à¤‚: " # ^DeleteOnReboot" "रीबूट करने पर हटाà¤à¤‚: " # ^ErrorCreatingShortcut "शॉरà¥à¤Ÿà¤•ट बनाने में तà¥à¤°à¥à¤Ÿà¤¿: " # ^ErrorCreating "बनाने में तà¥à¤°à¥à¤Ÿà¤¿: " # ^ErrorDecompressing डेटा असंपीड़ित करने पर तà¥à¤°à¥à¤Ÿà¤¿! दूषित इंसà¥à¤Ÿà¤¾à¤²à¤°? # ^ErrorRegistering DLL पंजीकृत करने पर तà¥à¤°à¥à¤Ÿà¤¿ # ^ExecShell "शेल निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें: " # ^Exec निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें: " # ^Extract "निकालें: " # ^ErrorWriting "निकालें: फाइल में लिखते समय तà¥à¤°à¥à¤Ÿà¤¿ " # ^InvalidOpcode इंसà¥à¤Ÿà¤¾à¤²à¤° दूषित: अवैध ऑपकोड # ^NoOLE "इसके लिठकोई OLE नहीं: " # ^OutputFolder "आउटपà¥à¤Ÿ फोलà¥à¤¡à¤°: " # ^RemoveFolder "फोलà¥à¤¡à¤° निकालें: " # ^RenameOnReboot "रीबूट करने पर नाम बदलें: " # ^Rename "नाम बदलें: " # ^Skipped "छोड़ा गया: " # ^CopyDetails कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर विवरण कॉपी करें # ^LogInstall लॉग इनसà¥à¤Ÿà¥‰à¤² पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ # ^Byte B # ^Kilo K # ^Mega M # ^Giga Gnsis-3.11/Contrib/Language files/Hindi.nsh000077500000000000000000000321661477201124000203760ustar00rootroot00000000000000;Language: HindÄ« (Devanagari script) (1081) ;By Ryan Pretorius !insertmacro LANGFILE "Hindi" = "हिनà¥à¤¦à¥€" "Hindi" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) सेटअप में आपका सà¥à¤µà¤¾à¤—त है" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "सेटअप $(^NameDA) के इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ के दौरान आपका मारà¥à¤—दरà¥à¤¶à¤¨ करेगा।$\r$\n$\r$\nयह सिफारिश की जाती है कि सेटअप शà¥à¤°à¥‚ करने से पहले आप अनà¥à¤¯ सभी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— बंद कर दें। इससे आपके कंपà¥à¤¯à¥‚टर को रीबूट किठबिना पà¥à¤°à¤¾à¤¸à¤‚गिक सिसà¥à¤Ÿà¤® फ़ाइलों को अपडेट करना संभव हो जाà¤à¤—ा।$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) के अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ में आपका सà¥à¤µà¤¾à¤—त है" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "सेटअप $(^NameDA) के अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ के दौरान आपका मारà¥à¤—दरà¥à¤¶à¤¨ करेगा।$\r$\n$\r$\nअनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ शà¥à¤°à¥‚ करने से पहले सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि $(^NameDA) चल न रहा हो।$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "लाइसेंस समà¤à¥Œà¤¤à¤¾" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस शरà¥à¤¤à¥‹à¤‚ की समीकà¥à¤·à¤¾ करें।" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "यदि आप समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡ सà¥à¤µà¥€à¤•ार करते हैं तो जारी रखने के लिठमैं सहमत हूठपर कà¥à¤²à¤¿à¤• करें। आपको $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने के लिठसमà¤à¥Œà¤¤à¥‡ को सà¥à¤µà¥€à¤•ार करना होगा।" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "यदि आप समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठचेक बॉकà¥à¤¸ पर कà¥à¤²à¤¿à¤• करें। आपको $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने के लिठसमà¤à¥Œà¤¤à¥‡ को सà¥à¤µà¥€à¤•ार करना होगा। $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "यदि आप समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठपहले विकलà¥à¤ª का चयन करें। आपको $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करने के लिठसमà¤à¥Œà¤¤à¥‡ को सà¥à¤µà¥€à¤•ार करना होगा। $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "लाइसेंस समà¤à¥Œà¤¤à¤¾" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने से पहले लाइसेंस शरà¥à¤¤à¥‹à¤‚ की समीकà¥à¤·à¤¾ करें।" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "यदि आप समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡ सà¥à¤µà¥€à¤•ार करते हैं तो जारी रखने के लिठमैं सहमत हूठपर कà¥à¤²à¤¿à¤• करें। आपको $(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने के लिठसमà¤à¥Œà¤¤à¥‡ को सà¥à¤µà¥€à¤•ार करना होगा।" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "यदि आप समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठचेक बॉकà¥à¤¸ पर कà¥à¤²à¤¿à¤• करें। आपको $(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने के लिठसमà¤à¥Œà¤¤à¥‡ को सà¥à¤µà¥€à¤•ार करना होगा। $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "यदि आप समà¤à¥Œà¤¤à¥‡ की शरà¥à¤¤à¥‡ सà¥à¤µà¥€à¤•ार करते हैं तो नीचे दिठगठपहले विकलà¥à¤ª का चयन करें। आपको $(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करने के लिठसमà¤à¥Œà¤¤à¥‡ को सà¥à¤µà¥€à¤•ार करना होगा। $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "शेष समà¤à¥Œà¤¤à¤¾ देखने के लिठपेज नीचे करें को दबाà¤à¤‚।" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "घटक चà¥à¤¨à¥‡à¤‚" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA) की वे विशेषताà¤à¤‚ चà¥à¤¨à¥‡à¤‚ जो आप इनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं।" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "घटक चà¥à¤¨à¥‡à¤‚" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA) की वे विशेषताà¤à¤‚ चà¥à¤¨à¥‡à¤‚ जो आप अनइनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं।" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "विवरण" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "उस घटक पर अपना माउस रखें जिसका आप विवरण देखना चाहते हैं।" !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "उस घटक का चयन करें जिसका आप विवरण देखना चाहते हैं।" !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "इनसà¥à¤Ÿà¥‰à¤² करने का सà¥à¤¥à¤¾à¤¨ चà¥à¤¨à¥‡à¤‚" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "वह फोलà¥à¤¡à¤° चà¥à¤¨à¥‡à¤‚ जिसमें $(^NameDA) को इनसà¥à¤Ÿà¥‰à¤² करना है।" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "अनइनसà¥à¤Ÿà¥‰à¤² करने का सà¥à¤¥à¤¾à¤¨ चà¥à¤¨à¥‡à¤‚" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "वह फोलà¥à¤¡à¤° चà¥à¤¨à¥‡à¤‚ जिससे $(^NameDA) को इनसà¥à¤Ÿà¥‰à¤² करना है।" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "इनसà¥à¤Ÿà¥‰à¤² कर रहे हैं" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) इनसà¥à¤Ÿà¥‰à¤² होने तक पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें।" ${LangFileString} MUI_TEXT_FINISH_TITLE "इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ समà¥à¤ªà¤¨à¥à¤¨" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "सेटअप सफलतापूरà¥à¤µà¤• पूरà¥à¤£ हà¥à¤†à¥¤" ${LangFileString} MUI_TEXT_ABORT_TITLE "इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ निरसà¥à¤¤ किया गया" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "सेटअप सफलतापूरà¥à¤µà¤• पूरà¥à¤£ नहीं हà¥à¤†à¥¤" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "अनइनसà¥à¤Ÿà¥‰à¤² कर रहे हैं" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² होने तक पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें।" ${LangFileString} MUI_UNTEXT_FINISH_TITLE "अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ समà¥à¤ªà¤¨à¥à¤¨" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ सफलतापूरà¥à¤µà¤• पूरà¥à¤£ हà¥à¤†à¥¤" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ निरसà¥à¤¤ किया गया" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ सफलतापूरà¥à¤µà¤• पूरà¥à¤£ नहीं हà¥à¤†à¥¤" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) का सेटअप पूरा कर रहे हैं" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "आपके कंपà¥à¤¯à¥‚टर पर $(^NameDA) को इनसà¥à¤Ÿà¥‰à¤² कर दिया गया है।$\r$\n$\r$\nसेटअप बंद करने के लिठसमापà¥à¤¤ करें पर कà¥à¤²à¤¿à¤• करें।" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) के इंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ को पूरा करने के लिठआपके कंपà¥à¤¯à¥‚टर को फिर से शà¥à¤°à¥‚ करना होगा। कà¥à¤¯à¤¾ आप अभी रीबूट करना चाहते हैं?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) का अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ पूरा कर रहे हैं" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "आपके कंपà¥à¤¯à¥‚टर पर $(^NameDA) को अनइनसà¥à¤Ÿà¥‰à¤² कर दिया गया है।$\r$\n$\r$\nसेटअप बंद करने के लिठसमापà¥à¤¤ करें पर कà¥à¤²à¤¿à¤• करें।" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) के अनइंसà¥à¤Ÿà¤¾à¤²à¥‡à¤¶à¤¨ को पूरा करने के लिठआपके कंपà¥à¤¯à¥‚टर को फिर से शà¥à¤°à¥‚ करना होगा। कà¥à¤¯à¤¾ आप अभी रीबूट करना चाहते हैं?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "अभी रीबूट करें" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "मैं बाद में मैनà¥à¤¯à¥à¤…ली रीबूट करना चाहता हूà¤" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &चलाà¤à¤‚" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "रीडमी &दिखाà¤à¤‚" ${LangFileString} MUI_BUTTONTEXT_FINISH "&समापà¥à¤¤ करें" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ मेनू फोलà¥à¤¡à¤° चà¥à¤¨à¥‡à¤‚" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) के शॉरà¥à¤Ÿà¤•ट के लिठसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ मेनू फोलà¥à¤¡à¤° चà¥à¤¨à¥‡à¤‚।" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "उस सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ मेनू फोलà¥à¤¡à¤° का चयन करें जिसमें आप पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® के शॉरà¥à¤Ÿà¤•ट बनाना चाहते हैं। आप नया फोलà¥à¤¡à¤° बनाने के लिठनाम भी पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ कर सकते हैं।" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "शॉरà¥à¤Ÿà¤•ट न बनाà¤à¤‚" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) अनइनसà¥à¤Ÿà¥‰à¤² करें" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "अपने कंपà¥à¤¯à¥‚टर से $(^NameDA) निकालें।" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "कà¥à¤¯à¤¾ आप वाकई $(^Name) का सेटअप छोड़ना चाहते हैं?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "कà¥à¤¯à¤¾ आप वाकई $(^Name) को अनइनसà¥à¤Ÿà¥‰à¤² करना छोड़ना चाहते हैं?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "उपयोगकरà¥à¤¤à¤¾ चà¥à¤¨à¥‡à¤‚" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "वे उपयोगकरà¥à¤¤à¤¾ चà¥à¤¨à¥‡à¤‚ जिनके लिठआप $(^NameDA) इनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं।" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "चयन करें कि कà¥à¤¯à¤¾ आप $(^NameDA) को केवल अपने लिठइनसà¥à¤Ÿà¥‰à¤² करना चाहते हैं या इस कंपà¥à¤¯à¥‚टर के सभी उपयोगकरà¥à¤¤à¤¾à¤“ं के लिà¤à¥¤ $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "इस कंपà¥à¤¯à¥‚टर का उपयोग करने वाले किसी भी वà¥à¤¯à¤•à¥à¤¤à¤¿ के लिठइनसà¥à¤Ÿà¥‰à¤² करें" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "केवल मेरे लिठइनसà¥à¤Ÿà¥‰à¤² करें" !endif nsis-3.11/Contrib/Language files/Hungarian.nlf000077500000000000000000000132561477201124000212450ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1038 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Soft-Trans Bt. (V2) # Translation by Orfanik Kft. (V3-V6) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) TelepítÅ‘ # ^UninstallCaption $(^Name) Eltávolító # ^LicenseSubCaption : LicencszerzÅ‘dés # ^ComponentsSubCaption : Telepítési lehetÅ‘ségek # ^DirSubCaption : Célmappa # ^InstallingSubCaption : Fájlok telepítése # ^CompletedSubCaption : Kész # ^UnComponentsSubCaption : Eltávolítási lehetÅ‘ségek # ^UnDirSubCaption : Eltávolítás mappája # ^ConfirmSubCaption : MegerÅ‘sítés # ^UninstallingSubCaption : Fájlok eltávolítása # ^UnCompletedSubCaption : Kész # ^BackBtn < &Vissza # ^NextBtn &Tovább > # ^AgreeBtn &Elfogadom # ^AcceptBtn &Elfogadom a LicencszerzÅ‘dés feltételeit # ^DontAcceptBtn &Nem fogadom el a LicencszerzÅ‘dés feltételeit # ^InstallBtn &Telepítés # ^UninstallBtn &Eltávolítás # ^CancelBtn &Mégse # ^CloseBtn &Bezárás # ^BrowseBtn &Tallózás... # ^ShowDetailsBtn &Részletek # ^ClickNext Kattintson a Tovább-ra a folytatáshoz. # ^ClickInstall Kattintson a Telepítésre a telepítéshez. # ^ClickUninstall Kattintson az Eltávolításra az eltávolításhoz. # ^Name Név # ^Completed Kész # ^LicenseText A(z) $(^NameDA) telepítése elÅ‘tt tekintse át a szerzÅ‘dés feltételeit. Ha elfogadja a szerzÅ‘dés valamennyi feltételét, az Elfogadom gombbal folytathatja. # ^LicenseTextCB A(z) $(^NameDA) telepítése elÅ‘tt tekintse át a szerzÅ‘dés feltételeit. Ha elfogadja a szerzÅ‘dés valamennyi feltételét, jelölje be a JelölÅ‘négyzeten. $_CLICK # ^LicenseTextRB A(z) $(^NameDA) telepítése elÅ‘tt tekintse át a szerzÅ‘dés feltételeit. Ha elfogadja a szerzÅ‘dés valamennyi feltételét, válassza az elsÅ‘ lehetÅ‘séget. $_CLICK # ^UnLicenseText A(z) $(^NameDA) eltávolítása elÅ‘tt tekintse át a szerzÅ‘dés feltételeit. Ha elfogadja a szerzÅ‘dés valamennyi feltételét, az Elfogadom gombbal folytathatja. # ^UnLicenseTextCB A(z) $(^NameDA) eltávolítása elÅ‘tt tekintse át a szerzÅ‘dés feltételeit. Ha elfogadja a szerzÅ‘dés valamennyi feltételét, jelölje be a JelölÅ‘négyzeten. $_CLICK # ^UnLicenseTextRB A(z) $(^NameDA) eltávolítása elÅ‘tt tekintse át a szerzÅ‘dés feltételeit. Ha elfogadja a szerzÅ‘dés valamennyi feltételét, válassza az elsÅ‘ lehetÅ‘séget. $_CLICK # ^Custom Egyéni # ^ComponentsText Jelölje be azokat az összetevÅ‘ket amelyeket telepíteni kíván és törölje a jelölést a nem kívánt összetevÅ‘knél. $_CLICK # ^ComponentsSubText1 Válassza ki a telepítés típusát: # ^ComponentsSubText2_NoInstTypes Válassza ki a telepítendÅ‘ összetevÅ‘ket: # ^ComponentsSubText2 vagy, jelölje ki a választható összetevÅ‘k közül a telepíteni kívánta(ka)t: # ^UnComponentsText Jelölje be azokat az összetevÅ‘ket amelyeket el kíván távolítani és törölje a jelölést az eltávolítani nem kívánt összetevÅ‘knél. $_CLICK # ^UnComponentsSubText1 Válassza ki az Eltávolítás típusát: # ^UnComponentsSubText2_NoInstTypes Válassza ki az eltávolítandó összetevÅ‘ket: # ^UnComponentsSubText2 vagy, jelölje ki a választható összetevÅ‘k közül az eltávolítani kívánta(ka)t: # ^DirText A $(^NameDA) a következÅ‘ mappába kerül. Másik mappa választásához kattintson a Tallózás gombra. $_CLICK # ^DirSubText Telepítés helye # ^DirBrowseText A(z) $(^NameDA) telepítési helyének kiválasztása: # ^UnDirText A(z) $(^NameDA) eltávolítása a következÅ‘ mappából. Másik mappa választásához kattintson a Tallózás gombra. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Válassza ki, hogy a $(^NameDA) melyik mappából kerüljön eltávolításra: # ^SpaceAvailable "Szabad terület: " # ^SpaceRequired "Helyigény: " # ^UninstallingText A(z) $(^NameDA) eltávolítása következik a számítógéprÅ‘l. $_CLICK # ^UninstallingSubText Eltávolítás helye: # ^FileError Hiba történt a fájl írásra történÅ‘ megnyitásakor: \r\n\t"$0"\r\nA Mégse gomb megnyomásával megszakíthatja a telepítést,\r\naz Ismét gombbal megismételheti a fájl írását,\r\na Kihagyás gombbal kihagyhatja ezt a fájlt. # ^FileError_NoIgnore Hiba történt a fájl írásra történÅ‘ megnyitásakor: \r\n\t"$0"\r\nAz Újra gomb megnyomásával megismételheti a műveletet, vagy \r\na Mégse gombbal megszakíthatja a telepítést. # ^CantWrite "Nem írható: " # ^CopyFailed A másolás megszakadt # ^CopyTo "Másolás ide: " # ^Registering "Bejegyzés: " # ^Unregistering "Eltávolítás: " # ^SymbolNotFound "A következÅ‘ szimbólum nem található: " # ^CouldNotLoad "Nem tölthetÅ‘ be: " # ^CreateFolder "Mappa létrehozás: " # ^CreateShortcut "Parancsikon létrehozása: " # ^CreatedUninstaller "Létrehozott eltávolító: " # ^Delete "Törölt fájl: " # ^DeleteOnReboot "Rendszerindításkor törlendÅ‘: " # ^ErrorCreatingShortcut "Hiba a parancsikon létrehozásakor: " # ^ErrorCreating "Hiba a létrehozáskor: " # ^ErrorDecompressing Hiba az adatok kibontásakor! Megsérült a TelepítÅ‘? # ^ErrorRegistering Hiba a DLL regisztrálásakor # ^ExecShell "Végrehajtás a hozzárendeléseken keresztül: " # ^Exec "Végrehajtás: " # ^Extract "Kibontás: " # ^ErrorWriting "Kibontás: Hiba a fájl írásakor " # ^InvalidOpcode Sérült a telepítÅ‘: hibás utasítás # ^NoOLE "Nincs OLE: " # ^OutputFolder "Kimeneti mappa: " # ^RemoveFolder "Mappa eltávolítása: " # ^RenameOnReboot "Ãtnevezés rendszerindításkor: " # ^Rename "Ãtnevezés: " # ^Skipped "Kihagyott: " # ^CopyDetails Adatok vágólapra másolása # ^LogInstall TelepítÅ‘ ellenÅ‘rzÅ‘lista # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Hungarian.nsh000077500000000000000000000167501477201124000212600ustar00rootroot00000000000000;Language: Hungarian (1038) ;Translation by Jozsef Tamas Herczeg ( - 1.61-ig), ; Lajos Molnar (Orfanik) ( 1.62 - tÅ‘l) !insertmacro LANGFILE "Hungarian" = "Magyar" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Üdvözli a(z) $(^NameDA) TelepítÅ‘ Varázsló" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "A(z) $(^NameDA) telepítése következik a számítógépre.$\r$\n$\r$\nJavasoljuk, hogy indítás elÅ‘tt zárja be a futó alkalmazásokat. Ãgy a telepítÅ‘ a rendszer újraindítása nélkül tudja frissíteni a szükséges rendszerfájlokat.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Üdvözli a(z) $(^NameDA) Eltávolító Varázsló" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ez a varázsló segíti a(z) $(^NameDA) eltávolításában.$\r$\n$\r$\nMielÅ‘tt elkezdi az eltávilítást gyÅ‘zÅ‘djön meg arról, hogy a(z) $(^NameDA) nem fut.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "LicencszerzÅ‘dés" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "A(z) $(^NameDA) telepítése elÅ‘tt tekintse át a szerzÅ‘dés feltételeit." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ha elfogadja a szerzÅ‘dés valamennyi feltételét, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) telepítéséhez." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Amennyiben elfogadja a feltételeket, jelölje be a jelölÅ‘nényzeten. A(z) $(^NameDA) telepítéséhez el kell fogadnia a feltételeket. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Amennyiben elfogadja a feltételeket, válassza az elsÅ‘ opciót. A(z) $(^NameDA) telepítéséhez el kell fogadnia a feltételeket. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "LicencszerzÅ‘dés" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "A(z) $(^NameDA) eltávolítása elÅ‘tt tekintse át a szerzÅ‘dés feltételeit." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ha elfogadja a szerzÅ‘dés valamennyi feltételét, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) eltávolításához." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Amennyiben elfogadja a feltételeket, jelölje be a jelölÅ‘nényzeten. A(z) $(^NameDA) eltávolításához el kell fogadnia a feltételeket. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Amennyiben elfogadja a feltételeket, válassza az elsÅ‘ opciót. A(z) $(^NameDA) eltávolításához el kell fogadnia a feltételeket. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "A PageDown gombbal olvashatja el a szerzÅ‘dés folytatását." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ÖsszetevÅ‘k kiválasztása" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Válassza ki, hogy a(z) $(^NameDA) mely funkcióit kívánja telepíteni." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ÖsszetevÅ‘k kiválasztása" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Válassza ki, hogy a(z) $(^NameDA) mely funkcióit kívánja eltávolítani." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Leírás" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vigye rá az egeret az összetevÅ‘re, hogy megtekinthesse a leírását." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Telepítési hely kiválasztása" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Válassza ki a(z) $(^NameDA) telepítésének mappáját." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Telepítési hely kiválasztása" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Válassza ki a(z) $(^NameDA) telepítésének mappáját." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Telepítési folyamat" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Kis türelmet a(z) $(^NameDA) telepítéséig." ${LangFileString} MUI_TEXT_FINISH_TITLE "Telepítés befejezÅ‘dött" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A telepítés sikeresen befejezÅ‘dött." ${LangFileString} MUI_TEXT_ABORT_TITLE "A telepítés megszakadt" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A telepítés sikertelen volt." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Eltávolítási folyamat" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Kis türelmet a(z) $(^NameDA) eltávolításáig." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Az eltávolítás befejezÅ‘dött" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Az eltávolítás sikeresen befejezÅ‘dött." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Az eltávolítás megszakadt" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Az eltávolítás sikertelen volt." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A(z) $(^NameDA) telepítése megtörtént." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "A(z) $(^NameDA) telepítése megtörtént.$\r$\n$\r$\nA Befejezés gomb megnyomásával zárja be a varázslót." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "A(z) $(^NameDA) telepítésének befejezéséhez újra kell indítani a rendszert. Most akarja újraindítani?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A(z) $(^NameDA) eltávolítás varázslójának befejezése." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "A(z) $(^NameDA) eltávolítása sikeresen befejezÅ‘dött.$\r$\n$\r$\nA Finish-re kattintva bezárul ez a varázsló." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "A számítógépet újra kell indítani, hogy a(z) $(^NameDA) eltávolítása teljes legyen. Akarja most újraindítani a rendszert?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Most indítom újra" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "KésÅ‘bb fogom újraindítani" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) futtatása" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "OlvassEl fájl megjelenítése" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Befejezés" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Start menü mappa kijelölése" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Start menü mappa kijelölése a program parancsikonjaihoz." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Jelöljön ki egy mappát a Start menüben, melybe a program parancsikonjait fogja elhelyezni. Beírhatja új mappa nevét is." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nincs parancsikon elhelyezés" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "A(z) $(^NameDA) Eltávolítása." ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "A(z) $(^NameDA) eltávolítása következik a számítógéprÅ‘l." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Biztos, hogy ki akar lépni a(z) $(^Name) TelepítÅ‘bÅ‘l?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Biztos, hogy ki akar lépni a(z) $(^Name) Eltávolítóból?" !endif nsis-3.11/Contrib/Language files/Icelandic.nlf000077500000000000000000000130761477201124000212040ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1039 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Gretar Orri Kristinsson # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Uppsetning # ^UninstallCaption $(^Name) Fjarlæging # ^LicenseSubCaption : Notandaleyfissamningur # ^ComponentsSubCaption : Uppsetningarvalmöguleikar # ^DirSubCaption : Uppsetningarskráarsafn # ^InstallingSubCaption : Set upp # ^CompletedSubCaption : Lokið # ^UnComponentsSubCaption : Fjarlægingarvalmöguleikar # ^UnDirSubCaption : Fjarlægingarskráarsafn # ^ConfirmSubCaption : Staðfesting # ^UninstallingSubCaption : Fjarlægi # ^UnCompletedSubCaption : Lokið # ^BackBtn < &Til baka # ^NextBtn &Ãfram > # ^AgreeBtn Ég &Samþykki # ^AcceptBtn Ég &samþykki skilmála leyfissamningsins # ^DontAcceptBtn Ég samþykki &ekki skilmála leyfissamningsins # ^InstallBtn &Setja upp # ^UninstallBtn &Fjarlægja # ^CancelBtn Hætta við # ^CloseBtn &Loka # ^BrowseBtn &Vafra... # ^ShowDetailsBtn Sýna &upplýsingar # ^ClickNext Smelltu á 'Ãfram' til að halda áfram. # ^ClickInstall Smelltu á 'Setja upp' til þess að hefja uppsetninguna. # ^ClickUninstall Smelltu á 'Fjarlægja' til að hefja fjarlægingar ferlið. # ^Name Nafn # ^Completed Lokið # ^LicenseText Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki'. # ^LicenseTextCB Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. $_CLICK # ^LicenseTextRB Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. $_CLICK # ^UnLicenseText Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki'. # ^UnLicenseTextCB Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. $_CLICK # ^UnLicenseTextRB Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. $_CLICK # ^Custom Sjálfval # ^ComponentsText Hakaðu við þá íhluti sem þú vilt setja upp og taktu hakið af þeim íhlutum sem þú vilt ekki setja upp. $_CLICK # ^ComponentsSubText1 Veldu tegund uppsetningar: # ^ComponentsSubText2_NoInstTypes Veldu þá íhluti sem á að setja upp: # ^ComponentsSubText2 Eða, veldu valfrjálsa íhluti á að setja upp: # ^UnComponentsText Hakaðu við þá íhluti sem þú vilt fjarlægja og taktu hakið af þeim íhlutum sem þú vilt ekki fjarlægja. $_CLICK # ^UnComponentsSubText1 Veldu tegund fjarlægingar: # ^UnComponentsSubText2_NoInstTypes Veldu íhluti sem á að fjarlægja: # ^UnComponentsSubText2 Eða, veldu valfrjálsa íhluti sem á að fjarlægja: # ^DirText Uppsetningin mun setja $(^NameDA) upp í eftirfarandi skráarsafn. Til að setja forritið upp í annað skráarsafn, smelltu á 'Vafra...' og veldu annað skráarsafn. $_CLICK # ^DirSubText Uppsetningarskráarsafn # ^DirBrowseText Veldu það skráarsafn sem þú vilt setja $(^NameDA) upp í: # ^UnDirText Uppsetningin mun fjarlægja $(^NameDA) úr eftirfarandi skráarsafni. Til að fjarlægja forritið úr öðru skráarsafni, smelltu á 'Vafra...' og veldu annað skráarsafn. $_CLICK # ^UnDirSubText "Fjarlægingarskráarsafn" # ^UnDirBrowseText Veldu það skráarsafn sem þú vilt fjarlægja $(^NameDA) úr: # ^SpaceAvailable "Tiltækt rými: " # ^SpaceRequired "Nauðsynlegt rými: " # ^UninstallingText $(^NameDA) verður fjarlægt úr eftirfarandi skráarsafni. $_CLICK # ^UninstallingSubText Fjarlægi úr: # ^FileError Villa við að skrifa í skrá: \r\n\r\n$0\r\n\r\nSmelltu á 'Hætta við' til að stoppa uppsetninguna,\r\n'Reyna aftur' til að gera aðra tilraun, eða\r\n'Hunsa' til sleppa þessari skrá. # ^FileError_NoIgnore Villa við að skrifa í skrá: \r\n\r\n$0\r\n\r\nSmelltu á 'Reyna aftur' til að gera aðra tilraun, eða\r\n'Hætta við' til að stoppa uppsetninguna. # ^CantWrite "Get ei skrifað: " # ^CopyFailed Afritun mistókst # ^CopyTo "Afrita til " # ^Registering "Skrásetja: " # ^Unregistering "Afskrá: " # ^SymbolNotFound "Fann ekki tákn: " # ^CouldNotLoad "Gat ekki hlaðið inn: " # ^CreateFolder "Búa til skráarsafn: " # ^CreateShortcut "Búa til flýtileið: " # ^CreatedUninstaller "Bjó til fjarlægingarhjálp: " # ^Delete "Eyða skrá: " # ^DeleteOnReboot "Eyða við endurræsingu: " # ^ErrorCreatingShortcut "Villa við gerð flýtileiðar: " # ^ErrorCreating "Villa við gerð: " # ^ErrorDecompressing Villa við afþjöppun gagna! Biluð uppsetningarhjálp? # ^ErrorRegistering Villa við skrásetningu DLL # ^ExecShell "Keyrslugluggi: " # ^Exec "Keyra: " # ^Extract "Færa út: " # ^ErrorWriting "Færa út: villa við að skrifa í skrá " # ^InvalidOpcode Uppsetningarhjálp biluð: rangur stýrikóði # ^NoOLE "Engin OLE fyrir: " # ^OutputFolder "Útskráarsafn: " # ^RemoveFolder "Fjarlægja skráarsafn: " # ^RenameOnReboot "Endurskíra við endurræsingu: " # ^Rename "Endurskíra: " # ^Skipped "Sleppt: " # ^CopyDetails Afrita upplýsingar til skrifbrettis # ^LogInstall Skrá uppsetningarferli # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Icelandic.nsh000077500000000000000000000167571477201124000212260ustar00rootroot00000000000000;Language: Icelandic (15) ;By Gretar Orri Kristinsson !insertmacro LANGFILE "Icelandic" = "Ãslenska" "Islenska" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkominn til $(^NameDA) uppsetningarhjálparinnar" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Þessi hjálp mun leiða þig í gegnum uppsetninguna á $(^NameDA).$\r$\n$\r$\nMælt er með því að þú lokir öllum öðrum forritum áður en uppsetningin hefst. Þetta mun gera uppsetningarforritinu kleyft að uppfæra kerfiskrár án þess að endurræsa tölvuna.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkomin(n) til $(^NameDA) fjarlægingarhjálparinnar" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Þessi hjálp mun leiða þig í gegnum fjarlæginguna á $(^NameDA).$\r$\n$\r$\nÃður en fjarlæging hefst skal ganga úr skugga um að $(^NameDA) sé ekki opið.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Notandaleyfissamningur" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vinsamlegast skoðaðu Notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki' til að halda áfram. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Leyfissamningur" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vinsamlegast skoðaðu leyfissamninginn vel áður en fjarlæging á $(^NameDA) hefst." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki' til að halda áfram. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Smelltu á 'PageDown' takkann á lyklaborðinu til að sjá afganginn af samningnum." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Velja íhluti" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Veldu hvaða $(^NameDA) íhluti þú vilt setja upp." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Velja íhluti" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Velja hvaða $(^NameDA) íhluti þú vilt fjarlægja." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Lýsing" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Færðu músina yfir íhlut til að fá lýsinguna á honum." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Veldu íhlut til þess að fá lýsinguna á honum." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Veldu uppsetningarskáarsafn" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Veldu það skráarsafn sem þú vilt setja $(^NameDA) upp í." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Velja fjarlægingarskáarsafn" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Veldu það skráarsafn sem þú vilt fjarlægja $(^NameDA) úr." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Set upp" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vinsamlegast dokaðu við meðan $(^NameDA) er sett upp." ${LangFileString} MUI_TEXT_FINISH_TITLE "Uppsetningu lokið" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Uppsetning tókst." ${LangFileString} MUI_TEXT_ABORT_TITLE "Hætt við uppsetningu" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Uppsetningu lauk ekki sem skildi." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Fjarlægi" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vinsamlegast dokaðu við á meðan $(^NameDA) er fjarlægt." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Fjarlægingu lokið" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Fjarlæging tókst." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Hætt við fjarlægingu" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Fjarlægingu lauk ekki sem skildi." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ljúka $(^NameDA) uppsetningarhjálpinni" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er nú upp sett á tölvunni þinni.$\r$\n$\r$\nSmelltu á 'Ljúka' til að loka þessari hjálp." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Til að ljúka uppsetningunni á $(^NameDA) verður að endurræsa tölvuna. Viltu endurræsa núna?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Ljúka $(^NameDA) fjarlægingarhjálpinni" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) hefur nú verið fjarlægt úr tölvunni.$\r$\n$\r$\nSmelltu á 'Ljúka' til að loka þessari hjálp." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Til að ljúka fjarlægingunni á $(^NameDA) verður að endurræsa tölvuna. Viltu endurræsa núna?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Endurræsa núna" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ég vil endurræsa seinna" ${LangFileString} MUI_TEXT_FINISH_RUN "&Keyra $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Skoða LestuMig" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ljúka" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Velja skráarsafn 'Start' valmyndar" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Veldu skráarsafn $(^NameDA) flýtileiða fyrir 'Start' valmyndina." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Veldu skráarsafn flýtileiða forritsins fyrir 'Start' valmyndina. Þú getur einnig búið til nýtt skráarsafn með því að setja inn nýtt nafn." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ekki búa til flýtileiðir í 'Start' valmyndinni" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Fjarlægja $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Fjarlægja $(^NameDA) úr tölvunni." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ertu viss um að þú viljir loka $(^Name) uppsetningarhjálpinni?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ertu viss um að þú viljir loka $(^Name) fjarlægingarhjálpinni?" !endif nsis-3.11/Contrib/Language files/Igbo.nlf000077500000000000000000000133431477201124000202060ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1136 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1200 # RTL - anything else than RTL means LTR - # Translation by ..... (any credits should go here) # ^Branding Nullsoft Install System %s # ^SetupCaption Ntinye $(^Name) # ^UninstallCaption MwepuÌ£ $(^Name) # ^LicenseSubCaption : NkwekoÌ£riÌ£ta AkwuÌ£kwoÌ£ Ikike # ^ComponentsSubCaption : UÌ£zoÌ£ Isi Tinye Ya # ^DirSubCaption : Ebe E Debere UÌ£zoÌ£ Isi Tinye Ya # ^InstallingSubCaption : O Tinyewela Ya # ^CompletedSubCaption : OÌ£ GwuÌ£la # ^UnComponentsSubCaption : UÌ£zoÌ£ Isi WepuÌ£ Ya # ^UnDirSubCaption : Ebe E Debere UÌ£zoÌ£ Isi WepuÌ£ Ya # ^ConfirmSubCaption : ÃŒ Kwere? # ^UninstallingSubCaption : O WepuÌ£wala Ya # ^UnCompletedSubCaption : OÌ£ GwuÌ£la # ^BackBtn < &AzuÌ£ # ^NextBtn &OÌ£zoÌ£ > # ^AgreeBtn M &Kwere # ^AcceptBtn M &nabatara ihe e dere ná NkwekoÌ£riÌ£ta AkwuÌ£kwoÌ£ Ikike # ^DontAcceptBtn A&nabataghiÌ£ m ihe e dere ná NkwekoÌ£riÌ£ta AkwuÌ£kwoÌ£ Ikike # ^InstallBtn &Tinye Ya # ^UninstallBtn &WepuÌ£ Ya # ^CancelBtn Kagbuo Ya # ^CloseBtn &Mechie # ^BrowseBtn C&hoÌ£oÌ£... # ^ShowDetailsBtn Gosi &nkoÌ£wa # ^ClickNext PiÌ£a OÌ£zoÌ£ iji gaa n'ihu. # ^ClickInstall PiÌ£a Tinye Ya iji malite itinye ya. # ^ClickUninstall PiÌ£a WepuÌ£ Ya iji malite iwepuÌ£ ya. # ^Name Aha # ^Completed OÌ£ GwuÌ£la # ^LicenseText Biko guÌ£ghariÌ£a nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i tinyewe ya $(^NameDA). OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe niile e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a M Kwere. # ^LicenseTextCB Biko guÌ£ghariÌ£a nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i tinyewe ya $(^NameDA). OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe niile e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a igbe nta diÌ£ n'okpuru. $_CLICK # ^LicenseTextRB Biko guÌ£ghariÌ£a nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i tinyewe ya $(^NameDA). OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe niile e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a nhoÌ£roÌ£ nke mbuÌ£ diÌ£ n'okpuru. $_CLICK # ^UnLicenseText Biko guÌ£ghariÌ£a nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i wepuÌ£wa ya $(^NameDA). OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe niile e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a M Kwere. # ^UnLicenseTextCB Biko guÌ£ghariÌ£a nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i wepuÌ£wa ya $(^NameDA). OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe niile e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a igbe nta diÌ£ n'okpuru. $_CLICK # ^UnLicenseTextRB Biko guÌ£ghariÌ£a nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i wepuÌ£wa ya $(^NameDA). OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe niile e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a nhoÌ£roÌ£ nke mbuÌ£ diÌ£ n'okpuru. $_CLICK # ^Custom Otú IÌ£ ChoÌ£roÌ£ # ^ComponentsText PiÌ£nye akara n'ihe ndiÌ£ iÌ£ choÌ£roÌ£ itinye, piÌ£puÌ£kwa akara n'ihe ndiÌ£ iÌ£ na-achoÌ£ghiÌ£ itinye. $_CLICK # ^ComponentsSubText1 HoÌ£roÌ£ uÌ£zoÌ£ isi tinye ya: # ^ComponentsSubText2_NoInstTypes HoÌ£roÌ£ ihe ndiÌ£ iÌ£ choÌ£roÌ£ itinye: # ^ComponentsSubText2 Ma oÌ£ buÌ£, hoÌ£roÌ£ ihe ndiÌ£ oÌ£zoÌ£ iÌ£ choÌ£roÌ£ itinye: # ^UnComponentsText PiÌ£nye akara n'ihe ndiÌ£ iÌ£ choÌ£roÌ£ iwepuÌ£, piÌ£puÌ£kwa akara n'ihe ndiÌ£ iÌ£ na-achoÌ£ghiÌ£ iwepuÌ£. $_CLICK # ^UnComponentsSubText1 HoÌ£roÌ£ uÌ£zoÌ£ isi wepuÌ£ ya: # ^UnComponentsSubText2_NoInstTypes HoÌ£roÌ£ ihe ndiÌ£ iÌ£ choÌ£roÌ£ iwepuÌ£: # ^UnComponentsSubText2 Ma oÌ£ buÌ£, hoÌ£roÌ£ ihe ndiÌ£ oÌ£zoÌ£ iÌ£ choÌ£roÌ£ iwepuÌ£: # ^DirText Ntinye ga-etinye $(^NameDA) n'ebe ndebe na-esonu. Iji tinye ya n'ebe ndebe oÌ£zoÌ£, piÌ£a ChoÌ£oÌ£ ma hoÌ£roÌ£ ebe ndebe oÌ£zoÌ£. $_CLICK # ^DirSubText Ebe Ndebe OÌ£ Ga-abanye # ^DirBrowseText HoÌ£roÌ£ ebe ndebe iÌ£ ga-etinye $(^NameDA) na ya: # ^UnDirText Ntinye ga-ewepuÌ£ $(^NameDA) n'ebe ndebe na-esonuÌ£. Iji wepuÌ£ ya n'ebe ndebe oÌ£zoÌ£, piÌ£a ChoÌ£oÌ£ ma hoÌ£roÌ£ ebe ndebe oÌ£zoÌ£. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText HoÌ£roÌ£ ebe ndebe iÌ£ ga-ewepuÌ£ $(^NameDA) na ya: # ^SpaceAvailable "Ohere diÌ£nuÌ£: " # ^SpaceRequired "Ohere a choÌ£roÌ£: " # ^UninstallingText A ga-ewepuÌ£ $(^NameDA) n'ebe ndebe na-esonuÌ£. $_CLICK # ^UninstallingSubText O wepuÌ£wala ya na: # ^FileError Nsogbu imepe faiÌ£luÌ£ ide ihe na ya: \r\n\r\n$0\r\n\r\nPiÌ£a KwuÌ£siÌ£ iji kwuÌ£siÌ£ itinye ya,\r\nNwaa OÌ£zoÌ£ iji nwaa oÌ£zoÌ£, ma oÌ£ buÌ£\r\nLeghara Ya iji mafee faiÌ£luÌ£ a. # ^FileError_NoIgnore Nsogbu imepe faiÌ£luÌ£ ide ihe na ya: \r\n\r\n$0\r\n\r\nPiÌ£a Nwaa OÌ£zoÌ£ iji nwaa oÌ£zoÌ£, ma oÌ£ buÌ£\r\nKagbuo Ya iji kwuÌ£siÌ£ itinye ya. # ^CantWrite "O denyelighiÌ£: " # ^CopyFailed OÌ£ depuÌ£taghachighiÌ£ # ^CopyTo "DepuÌ£taghachi ya na " # ^Registering "OÌ£ banyewala: " # ^Unregistering "OÌ£ puÌ£wala: " # ^SymbolNotFound "OÌ£ huÌ£ghiÌ£ akara: " # ^CouldNotLoad "O bupuÌ£talighiÌ£: " # ^CreateFolder "MepuÌ£ta ebe ndebe: " # ^CreateShortcut "MepuÌ£ta uÌ£zoÌ£ ka mfe: " # ^CreatedUninstaller "Ihe mwepuÌ£ o mepuÌ£tara: " # ^Delete "KachapuÌ£ faiÌ£luÌ£: " # ^DeleteOnReboot "KachapuÌ£ ya ná mmaliteghachi: " # ^ErrorCreatingShortcut "Nsogbu imepuÌ£ta uÌ£zoÌ£ ka mfe: " # ^ErrorCreating "Nsogbu imepuÌ£ta: " # ^ErrorDecompressing Nsogbu iÌ£gbasa ihe odide! Ihe na-etinye ya ò mebiela? # ^ErrorRegistering Nsogbu ime ka DLL banye # ^ExecShell "ExecShell: " # ^Exec "Mewe: " # ^Extract "WepuÌ£tasiÌ£a: " # ^ErrorWriting "WepuÌ£tasiÌ£a: nsogbu idenye ihe na faiÌ£luÌ£ " # ^InvalidOpcode Ihe na-etinye ihe emebiela: akara op adiÌ£ghiÌ£zi mma # ^NoOLE "E nweghiÌ£ OLE maka: " # ^OutputFolder "Ebe ndebe na-ebupuÌ£ta ihe: " # ^RemoveFolder "WepuÌ£ ebe ndebe: " # ^RenameOnReboot "GuÌ£ghariÌ£a ya aha ná mmaliteghachi: " # ^Rename "GuÌ£ghariÌ£a aha: " # ^Skipped "A mafere: " # ^CopyDetails DepuÌ£taghachi NkoÌ£wa n'Igbe Ncheta # ^LogInstall NdepuÌ£ta otú e si tinye ya # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Igbo.nsh000077500000000000000000000115141477201124000202150ustar00rootroot00000000000000;Language: Igbo (1136) !insertmacro LANGFILE "Igbo" = "Igbo" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "AnyiÌ£ na-anabata giÌ£ ná Ntinye $(^NameDA)" #FIXME:MUI_TEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_UNWELCOMEPAGE #FIXME:MUI_UNTEXT_WELCOME_INFO_TITLE #FIXME:MUI_UNTEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "NkwekoÌ£riÌ£ta AkwuÌ£kwoÌ£ Ikike" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Biko guÌ£ghariÌ£a ihe e dere ná nkwekoÌ£riÌ£ta akwuÌ£kwoÌ£ ikike tupu i tinyewe $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "OÌ£ buÌ£ruÌ£ na iÌ£ nabatara ihe e dere ná nkwekoÌ£riÌ£ta ahuÌ£, piÌ£a M Kwere iji gaa n'ihu. IÌ£ ga-anabatariÌ£riÌ£ nkwekoÌ£riÌ£ta ahuÌ£ iji tinye $(^NameDA)." #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_UNLICENSEPAGE #FIXME:MUI_UNTEXT_LICENSE_TITLE #FIXME:MUI_UNTEXT_LICENSE_SUBTITLE #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "PiÌ£a Page Down iji huÌ£ ihe ndiÌ£ oÌ£zoÌ£ diÌ£ ná nkwekoÌ£riÌ£ta a." !endif !ifdef MUI_COMPONENTSPAGE #FIXME:MUI_TEXT_COMPONENTS_TITLE #FIXME:MUI_TEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_UNCOMPONENTSPAGE #FIXME:MUI_UNTEXT_COMPONENTS_TITLE #FIXME:MUI_UNTEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "NkoÌ£wa" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE #FIXME:MUI_TEXT_DIRECTORY_TITLE #FIXME:MUI_TEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_UNDIRECTORYPAGE #FIXME:MUI_UNTEXT_DIRECTORY_TITLE #FIXME:MUI_UNTEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "O Tinyewela Ya" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Biko chere ka a na-etinyere giÌ£ $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "O Tinyechaala Ya" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ntinye gara nke ọ̣ma." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Ntinye agaghiÌ£ nke oÌ£ma." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O WepuÌ£wala Ya" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Biko chere ka a na-ewepuÌ£ruÌ£ giÌ£ $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "O WepuÌ£chaala Ya" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "O wepuÌ£chara ya nke oÌ£ma." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "O WepuÌ£lighiÌ£ Ya" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "O wepuÌ£chaghiÌ£ ya nke oÌ£ma." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Itinyecha $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "E tinyela $(^NameDA) na koÌ£mputa giÌ£.$\r$\n$\r$\nPiÌ£a Mechaa iji mechie Ntinye." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "IÌ£ ga-amaliteghachiriÌ£riÌ£ koÌ£mputa giÌ£ iji tinyechaa $(^NameDA). Ị̀ choÌ£roÌ£ iÌ£maliteghachi ya ugbu a?" !endif !ifdef MUI_UNFINISHPAGE #FIXME:MUI_UNTEXT_FINISH_INFO_TITLE #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT #FIXME:MUI_UNTEXT_FINISH_INFO_REBOOT !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Maliteghachi ugbu a" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "M choÌ£roÌ£ iji aka m maliteghachi ya ma e mechaa" ${LangFileString} MUI_TEXT_FINISH_RUN "&Malite $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Gosi GuÌ£oÌ£" ${LangFileString} MUI_BUTTONTEXT_FINISH "&O mechaala" !endif !ifdef MUI_STARTMENUPAGE #FIXME:MUI_TEXT_STARTMENU_TITLE #FIXME:MUI_TEXT_STARTMENU_SUBTITLE #FIXME:MUI_INNERTEXT_STARTMENU_TOP #FIXME:MUI_INNERTEXT_STARTMENU_CHECKBOX !endif !ifdef MUI_UNCONFIRMPAGE #FIXME:MUI_UNTEXT_CONFIRM_TITLE #FIXME:MUI_UNTEXT_CONFIRM_SUBTITLE !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "ÃŒ ji n'aka ka iÌ£ choÌ£ghiÌ£ ka Ntinye $(^Name) ruo n'isi?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "ÃŒ ji n'aka na iÌ£ choÌ£roÌ£ ka MwepuÌ£ $(^Name) kwuÌ£siÌ£?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Language files/Indonesian.nlf000077500000000000000000000131761477201124000214210ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1057 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Revision date: 2009 April # Translators: ## Ariel , ## was.uthm@gmail.com # # ^Branding Nullsoft Install System %s # ^SetupCaption Instalasi Program $(^Name) # ^UninstallCaption Penghapusan Program $(^Name) # ^LicenseSubCaption : Perihal Lisensi # ^ComponentsSubCaption : Pilihan Instalasi # ^DirSubCaption : Lokasi Instalasi # ^InstallingSubCaption : Proses Instalasi # ^CompletedSubCaption : Selesai # ^UnComponentsSubCaption : Pilihan Penghapusan # ^UnDirSubCaption : Berkas Lokasi yang dihapus # ^ConfirmSubCaption : Konfirmasi # ^UninstallingSubCaption : Proses Penghapusan # ^UnCompletedSubCaption : Selesai # ^BackBtn < &Mundur # ^NextBtn &Lanjut > # ^AgreeBtn Saya &Setuju # ^AcceptBtn Saya s&etuju dengan Perihal Lisensi # ^DontAcceptBtn Saya &tidak setuju dengan Perihal Lisensi # ^InstallBtn &Instal # ^UninstallBtn &Hapus # ^CancelBtn Batalkan # ^CloseBtn &Tutup # ^BrowseBtn Ca&ri... # ^ShowDetailsBtn Lihat &perincian # ^ClickNext Tekan tombol Lanjut untuk melanjutkan. # ^ClickInstall Tekan tombol Instal untuk memulai instalasi. # ^ClickUninstall Tekan tombol Hapus untuk memulai penghapusan. # ^Name Nama # ^Completed Selesai # ^LicenseText Silahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, tekan tombol Saya Setuju. # ^LicenseTextCB Silahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, beri tanda centang. $_CLICK # ^LicenseTextRB Silahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. $_CLICK # ^UnLicenseText Silahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, tekan tombol Saya Setuju. # ^UnLicenseTextCB Silahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, beri tanda centang. $_CLICK # ^UnLicenseTextRB Silahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. $_CLICK # ^Custom Tentukan Sendiri # ^ComponentsText Beri tanda centang pada komponen yang akan di instal and hilangkan tanda centang pada komponen yang tidak perlu di instal. $_CLICK # ^ComponentsSubText1 Pilih tipe instalasi: # ^ComponentsSubText2_NoInstTypes Pilih komponen-komponen yang akan di instal: # ^ComponentsSubText2 Atau, pilih komponen tambahan yang akan di instal: # ^UnComponentsText Beri tanda centang pada komponen yang akan dihapus and hilangkan tanda centang pada komponen yang tidak ingin dihapus. $_CLICK # ^UnComponentsSubText1 Pilih tipe penghapusan: # ^UnComponentsSubText2_NoInstTypes Pilih komponen-komponen yang ingin dihapus: # ^UnComponentsSubText2 Atau, pilih komponen tambahan yang ingin dihapus: # ^DirText Program $(^NameDA) akan di instal pada lokasi berikut. Untuk memilih lokasi, tekan tombol Cari kemudian pilih lokasi yang anda kehendaki. $_CLICK # ^DirSubText Lokasi instalasi # ^DirBrowseText Pilih lokasi instalasi program $(^NameDA): # ^UnDirText Proses penghapusan program $(^NameDA) dari lokasi instalasi berikut. Untuk memilih lokasi lainnya, tekan tombol Cari kemudian pilih lokasi yang anda kehendaki. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Pilih lokasi instalasi program $(^NameDA) yang akan dihapus: # ^SpaceAvailable "Ruang yang tersedia: " # ^SpaceRequired "Ruang yang dibutuhkan: " # ^UninstallingText $(^NameDA) akan dihapus dari lokasi berikut. $_CLICK # ^UninstallingSubText Proses penghapusan dari: # ^FileError Tidak dapat membuka berkas untuk menulis: \r\n\t"$0"\r\nTekan tombol Abort untuk membatalkan instalasi,\r\nRetry untuk mencoba lagi, atau\r\nIgnore untuk melewati file ini. # ^FileError_NoIgnore Tidak dapat membuka berkas untuk menulis: \r\n\t"$0"\r\nTekan tombol Retry untuk mencoba lagi, atau\r\nCancel untuk membatalkan instalasi. # ^CantWrite "Tidak bisa menulis pada berkas: " # ^CopyFailed Gagal menyalin berkas # ^CopyTo "Menyalin ke " # ^Registering "Memasukkan dalam daftar: " # ^Unregistering "Menghapus dari daftar: " # ^SymbolNotFound "Tidak dapat menemukan simbol: " # ^CouldNotLoad "Tidak dapat memuat: " # ^CreateFolder "Membuat tempat menyimpan berkas: " # ^CreateShortcut "Membuat shortcut: " # ^CreatedUninstaller "Program penghapusan yang dibuat: " # ^Delete "Menghapus berkas: " # ^DeleteOnReboot "Akan dihapus saat reboot: " # ^ErrorCreatingShortcut "Tidak dapat membuat shortcut: " # ^ErrorCreating "Ada kesalahan saat membuat: " # ^ErrorDecompressing Ada kesalahan saat membuka data! Program Instalasi tidak lengkap? # ^ErrorRegistering Ada kesalahan ketika mendaftarkan modul DLL # ^ExecShell "Perintah: " # ^Exec "Menjalankan: " # ^Extract "Proses ekstraksi berkas: " # ^ErrorWriting "Ekstraksi: ada kesalahan saat menulis ke berkas " # ^InvalidOpcode Program instalasi rusak: kode program tidak lengkap # ^NoOLE "OLE tidak ditemukan: " # ^OutputFolder "Lokasi tujuan: " # ^RemoveFolder "Menghapus lokasi penyimpanan: " # ^RenameOnReboot "Memberi nama baru saat reboot: " # ^Rename "Memberi nama baru: " # ^Skipped "Dilewati: " # ^CopyDetails Salin perincian ke Clipboard # ^LogInstall Catat proses instalasi # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Indonesian.nsh000077500000000000000000000200341477201124000214210ustar00rootroot00000000000000;Language: Indonesian (1057) ;By Ariel825010106@yahoo.com modified by was.uthm@gmail.com in April 2009 !insertmacro LANGFILE "Indonesian" = "Bahasa Indonesia" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Selamat datang di program instalasi $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Program ini akan membantu anda dalam proses instalasi $(^NameDA).$\r$\n$\r$\nAnda sangat disarankan untuk menutup program lainnya sebelum memulai proses instalasi. Hal ini diperlukan agar berkas yang terkait dapat diperbarui tanpa harus booting ulang komputer anda.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Selamat datang di program penghapusan $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Program ini akan membantu anda pada proses penghapusan $(^NameDA).$\r$\n$\r$\nSebelum memulai proses penghapusan, pastikan dulu $(^NameDA) tidak sedang digunakan.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Perihal Lisensi" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Silahkan membaca perihal lisensi sebelum memulai proses instalasi $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jika anda setuju dan menerima semua pernyataan, tekan tombol Saya Setuju untuk melanjutkan. Anda harus setuju untuk memulai instalasi $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda setuju dan menerima semua pernyatan, beri tanda centang. Anda harus setuju untuk memulai instalasi $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda setuju dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. Anda harus setuju untuk memulai instalasi $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Perihal Lisensi" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Silahkan membaca lisensi berikut sebelum melakukan penghapusan $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jika anda setuju dan menerima semua pernyataan, tekan tombol Saya Setuju untuk melanjutkan. Anda harus setuju untuk memulai proses penghapusan $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda setuju dan menerima semua pernyataan, beri tanda centang. Anda harus setuju untuk memulai proses penghapusan $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda setuju dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. Anda harus setuju untuk memulai proses penghapusan $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tekan tombol Page Down untuk melihat pernyataan berikutnya." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pilih Komponen" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pilih komponen fitur tambahan dari $(^NameDA) yang ingin di instal." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pilih Komponen" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pilih komponen fitur tambahan dari $(^NameDA) yang ingin dihapus." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Deskripsi" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tunjuk ke salah satu komponen untuk melihat deskripsi tentang komponen itu." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pilih Lokasi Instalasi" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pilih lokasi untuk instalasi program $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pilih Lokasi berkas yang akan dihapus" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pilih lokasi instalasi program $(^NameDA) yang akan dihapus." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Proses instalasi " ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mohon tunggu sejenak, instalasi program $(^NameDA) sedang berlangsung." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalasi Selesai" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Seluruh proses instalasi sudah paripurna." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalasi Dibatalkan" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Proses instalasi tidak selesai dengan sempurna." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Proses penghapusan" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mohon tunggu sejenak, penghapusan program $(^NameDA) sedang berlangsung." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Proses Penghapusan Selesai" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Seluruh proses penghapusan sudah paripurna." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Penghapusan Dibatalkan" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Proses penghapusa tidak selesai dengan sempurna." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Menutup Instalasi Program $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) sudah di instal di komputer anda.$\r$\n$\r$\nTekan tombol Selesai untuk menutup program." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Komputer anda memerlukan booting ulang untuk menyempurnakan proses instalasi $(^NameDA). Apakah anda akan melakukan booting ulang sekarang juga?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Menutup program penghapusan $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dihapus dari komputer anda.$\r$\n$\r$\nTekan tombol Selesai untuk menutup." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Komputer anda memerlukan booting untuk menyempurnakan proses penghapusan $(^NameDA). Apakah anda akan melakukan booting ulang sekarang juga?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Booting ulang sekarang" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Booting ulang nanti" ${LangFileString} MUI_TEXT_FINISH_RUN "&Jalankan $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Buka berkas Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Selesai" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pilih lokasi dari Menu Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pilih lokasi dari Menu Start untuk meletakkan shortcut $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pilih lokasi dari Menu Start untuk meletakkan shortcut program ini. Anda bisa juga membuat lokasi baru dengan cara menulis nama lokasi yang dikehendaki." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Tidak perlu membuat shortcut" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Penghapusan $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Menghapus $(^NameDA) dari komputer anda." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Apakah anda yakin ingin menghentikan proses instalasi $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Apakah anda yakin ingin menghentikan proses penghapusan $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Pilihan Pemakai" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Pilihlah pemakai komputer yang akan menggunakan program $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Apakah anda akan melakukan instalasi $(^NameDA) untuk anda sendiri atau untuk semua pemakai komputer ini. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalasi untuk semua pemakai komputer ini" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalasi hanya untuk saya sendiri" !endif nsis-3.11/Contrib/Language files/Irish.nlf000077500000000000000000000133611477201124000204040ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 2108 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Kevin P. Scannell < scannell at slu dot edu > # ^Branding Nullsoft Install System %s # ^SetupCaption Socrú $(^Name) # ^UninstallCaption Díshuiteáil $(^Name) # ^LicenseSubCaption : Comhaontú um Cheadúnas # ^ComponentsSubCaption : Roghanna Suiteála # ^DirSubCaption : Fillteán Suiteála # ^InstallingSubCaption : Suiteáil # ^CompletedSubCaption : Críochnaithe # ^UnComponentsSubCaption : Roghanna Díshuiteála # ^UnDirSubCaption : Fillteán Díshuiteála # ^ConfirmSubCaption : Deimhniú # ^UninstallingSubCaption : Díshuiteáil # ^UnCompletedSubCaption : Críochnaithe # ^BackBtn < Ar Ai&s # ^NextBtn Ar &Aghaidh > # ^AgreeBtn Gl&acaim Leis # ^AcceptBtn Táim toilteanach &glacadh le coinníollacha an Chomhaontú um Cheadúnas # ^DontAcceptBtn Nílim &toilteanach glacadh le coinníollacha an Chomhaontú um Cheadúnas # ^InstallBtn &Suiteáil # ^UninstallBtn &Díshuiteáil # ^CancelBtn Cealaigh # ^CloseBtn &Dún # ^BrowseBtn B&rabhsáil... # ^ShowDetailsBtn Taispeáin &sonraí # ^ClickNext Cliceáil "Ar Aghaidh" chun leanúint ar aghaidh. # ^ClickInstall Cliceáil "Suiteáil" chun tosú. # ^ClickUninstall Cliceáil "Díshuiteáil" chun tosú. # ^Name Ainm # ^Completed Críochnaithe # ^LicenseText Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil "Glacaim Leis". # ^LicenseTextCB Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil an ticbhosca thíos. $_CLICK # ^LicenseTextRB Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, roghnaigh an chéad rogha thíos. $_CLICK # ^UnLicenseText Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil "Glacaim Leis". # ^UnLicenseTextCB Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil an ticbhosca thíos. $_CLICK # ^UnLicenseTextRB Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, roghnaigh an chéad rogha thíos. $_CLICK # ^Custom Saincheaptha # ^ComponentsText Roghnaigh na comhpháirteanna is mian leat a shuiteáil, agus díroghnaigh na comhpháirteanna nach mian leat a shuiteáil. $_CLICK # ^ComponentsSubText1 Roghnaigh cineál na suiteála: # ^ComponentsSubText2_NoInstTypes Roghnaigh na comhpháirteanna is mian leat a shuiteáil: # ^ComponentsSubText2 Nó, roghnaigh na comhpháirteanna roghnacha is mian leat a shuiteáil: # ^UnComponentsText Roghnaigh na comhpháirteanna is mian leat a dhíshuiteáil, agus díroghnaigh na comhpháirteanna nach mian leat a dhíshuiteáil. $_CLICK # ^UnComponentsSubText1 Roghnaigh cineál na díshuiteála: # ^UnComponentsSubText2_NoInstTypes Roghnaigh comhpháirteanna le díshuiteáil: # ^UnComponentsSubText2 Nó, roghnaigh na comhpháirteanna roghnacha is mian leat a dhíshuiteáil: # ^DirText Cuirfidh an Suiteálaí $(^NameDA) san fhillteán seo a leanas. Más mian leat suiteáil i bhfillteán difriúil, cliceáil "Brabhsáil" agus roghnaigh fillteán eile. $_CLICK # ^DirSubText Sprioc-Fhillteán # ^DirBrowseText Roghnaigh an fillteán inar mian leat $(^NameDA) a shuiteáil: # ^UnDirText Bainfidh an Suiteálaí $(^NameDA) amach as an bhfillteán seo a leanas. Más mian leat é a dhíshuiteáil ó fhillteán difriúil, cliceáil "Brabhsáil" agus roghnaigh fillteán eile. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Roghnaigh an fillteán ar mian leat $(^NameDA) a dhíshuiteáil as: # ^SpaceAvailable "Spás le fáil: " # ^SpaceRequired "Spás de dhíth: " # ^UninstallingText Díshuiteálfar $(^NameDA) ón fhillteán seo a leanas. $_CLICK # ^UninstallingSubText à dhíshuiteáil ó: # ^FileError Earráid agus comhad á scríobh: \r\n\r\n$0\r\n\r\nCliceáil "Abort" chun an tsuiteáil a stopadh,\r\n"Retry" chun iarracht eile a dhéanamh, nó\r\n"Ignore" chun neamhaird a dhéanamh den chomhad seo. # ^FileError_NoIgnore Earráid agus comhad á scríobh: \r\n\r\n$0\r\n\r\nCliceáil "Retry" chun iarracht eile a dhéanamh, nó\r\n"Cancel" chun an tsuiteáil a stopadh. # ^CantWrite "Ní féidir scríobh: " # ^CopyFailed Theip ar an gcóipeáil # ^CopyTo "Cóipeáil go " # ^Registering "Clárú: " # ^Unregistering "Díchlárú: " # ^SymbolNotFound "Níorbh fhéidir siombail a aimsiú: " # ^CouldNotLoad "Níorbh fhéidir luchtú: " # ^CreateFolder "Cruthaigh fillteán: " # ^CreateShortcut "Cruthaigh aicearra: " # ^CreatedUninstaller "Cruthaíodh díshuiteálaí: " # ^Delete "Scrios comhad: " # ^DeleteOnReboot "Scrios ag am atosaithe: " # ^ErrorCreatingShortcut "Earráid agus aicearra á chruthú: " # ^ErrorCreating "Earráid le linn cruthaithe: " # ^ErrorDecompressing Earráid agus sonraí á ndíchomhbhrú! Suiteálaí truaillithe? # ^ErrorRegistering Earráid agus DLL á chlárú # ^ExecShell "Blaosc: " # ^Exec "Rith: " # ^Extract "Bain Amach: " # ^ErrorWriting "Extract: earráid le linn scríofa " # ^InvalidOpcode Díshuiteálaí truaillithe: cód neamhbhailí oibríochta # ^NoOLE "Gan OLE le haghaidh: " # ^OutputFolder "Fillteán aschurtha: " # ^RemoveFolder "Bain fillteán: " # ^RenameOnReboot "Athainmnigh ag am atosaithe: " # ^Rename "Athainmnigh: " # ^Skipped "Neamhaird déanta de: " # ^CopyDetails Cóipeáil Sonraí go dtí an Ghearrthaisce # ^LogInstall Logáil an próiseas suiteála # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Irish.nsh000077500000000000000000000171371477201124000204220ustar00rootroot00000000000000;Language: Irish (2108) ;By Kevin P. Scannell < scannell at slu dot edu > !insertmacro LANGFILE "Irish" = "Gaeilge" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fáilte go dtí Draoi Suiteála $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Déanfaidh an draoi seo treorú duit tríd an suiteáil de $(^NameDA).$\r$\n$\r$\nMoltar duit gach feidhmchlár eile a dhúnadh sula dtosaíonn tú an Suiteálaí. Cinnteoidh sé seo gur féidir na comhaid oiriúnacha a nuashonrú gan do ríomhaire a atosú.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fáilte go dtí Draoi Díshuiteála $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Déanfaidh an draoi seo treorú duit tríd an díshuiteáil de $(^NameDA).$\r$\n$\r$\nBí cinnte nach bhfuil $(^NameDA) ag rith sula dtosaíonn tú an díshuiteáil.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Comhaontú um Cheadúnas" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Déan iniúchadh ar choinníollacha an cheadúnais sula suiteálann tú $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil $\"Glacaim Leis$\" chun leanúint ar aghaidh. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a shuiteáil." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil an ticbhosca thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a shuiteáil. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Má ghlacann tú le coinníollacha an chomhaontaithe, roghnaigh an chéad rogha thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Comhaontú um Cheadúnas" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Déan iniúchadh ar choinníollacha an cheadúnais sula ndíshuiteálann tú $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil $\"Glacaim Leis$\" chun leanúint ar aghaidh. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil an ticbhosca thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Má ghlacann tú le coinníollacha an chomhaontaithe, roghnaigh an chéad rogha thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Brúigh $\"Page Down$\" chun an chuid eile den cheadúnas a léamh." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Roghnaigh Comhpháirteanna" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Roghnaigh na gnéithe $(^NameDA) ba mhaith leat suiteáil." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Roghnaigh Comhpháirteanna" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Roghnaigh na gnéithe $(^NameDA) ba mhaith leat díshuiteáil." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Cur Síos" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Cuir do luch os cionn comhpháirte chun cur síos a fheiceáil." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Roghnaigh comhpháirt chun cur síos a fheiceáil." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Roghnaigh Suíomh na Suiteála" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Roghnaigh an fillteán inar mian leat $(^NameDA) a shuiteáil." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Roghnaigh Suíomh na Díshuiteála" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Roghnaigh an fillteán ar mian leat $(^NameDA) a dhíshuiteáil as." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "à Shuiteáil" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fan go fóill; $(^NameDA) á shuiteáil." ${LangFileString} MUI_TEXT_FINISH_TITLE "Suiteáil Críochnaithe" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "D'éirigh leis an tsuiteáil." ${LangFileString} MUI_TEXT_ABORT_TITLE "Suiteáil Tobscortha" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Níor éirigh leis an tsuiteáil." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "à Dhíshuiteáil" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fan go fóill; $(^NameDA) á dhíshuiteáil." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Díshuiteáil Críochnaithe" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "D'éirigh leis an díshuiteáil." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Díshuiteáil Tobscortha" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Níor éirigh leis an díshuiteáil." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Draoi Suiteála $(^NameDA) á Chríochnú" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Suiteáladh $(^NameDA) ar do ríomhaire.$\r$\n$\r$\nCliceáil $\"Críochnaigh$\" chun an draoi seo a dhúnadh." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ní mór duit do ríomhaire a atosú chun suiteáil $(^NameDA) a chur i gcrích. Ar mhaith leat atosú anois?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Draoi Díshuiteála $(^NameDA) á Chríochnú" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Díshuiteáladh $(^NameDA) ó do ríomhaire.$\r$\n$\r$\nCliceáil $\"Críochnaigh$\" chun an draoi seo a dhúnadh." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ní mór duit do ríomhaire a atosú chun díshuiteáil $(^NameDA) a chur i gcrích. Ar mhaith leat atosú anois?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Atosaigh anois" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Atosóidh mé de láimh níos déanaí" ${LangFileString} MUI_TEXT_FINISH_RUN "&Rith $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Tai&speáin comhad README" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Críochnaigh" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Roghnaigh Fillteán sa Roghchlár Tosaigh" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Roghnaigh fillteán sa Roghchlár Tosaigh a gcuirfear aicearraí $(^NameDA) ann." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Roghnaigh an fillteán sa Roghchlár Tosaigh inar mian leat aicearraí an chláir a chruthú. Is féidir freisin fillteán nua a chruthú trí ainm nua a iontráil." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ná cruthaigh aicearraí" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Díshuiteáil $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Bain $(^NameDA) ó do ríomhaire." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "An bhfuil tú cinnte gur mian leat Suiteálaí $(^Name) a scor?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "An bhfuil tú cinnte gur mian leat Díshuiteálaí $(^Name) a scor?" !endif nsis-3.11/Contrib/Language files/Italian.nlf000077500000000000000000000127361477201124000207140ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1040 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation orginally started by Orfanik - http://www.orfanik.hu # Updated v2 to v6 by Alessandro Staltari < staltari (a) geocities.com > # Revised by < mdalco@gmail.com > and bovirus < bovirus@gmail.com > # ^Branding Nullsoft Install System %s # ^SetupCaption Installazione di $(^Name) # ^UninstallCaption Disinstallazione di $(^Name) # ^LicenseSubCaption : Accordo di licenza # ^ComponentsSubCaption : Opzioni installazione # ^DirSubCaption : Cartella installazione # ^InstallingSubCaption : Installazione # ^CompletedSubCaption : Installazione completata # ^UnComponentsSubCaption : Opzioni disinstallazione # ^UnDirSubCaption : Cartella disinstallazione # ^ConfirmSubCaption : Conferma # ^UninstallingSubCaption : Disinstallazione # ^UnCompletedSubCaption : Disisntallazione completata # ^BackBtn < &Indietro # ^NextBtn &Avanti > # ^AgreeBtn &Accetto # ^AcceptBtn &Accetto le condizioni della licenza # ^DontAcceptBtn &Non accetto le condizioni della licenza # ^InstallBtn Ins&talla # ^UninstallBtn &Disinstalla # ^CancelBtn Annulla # ^CloseBtn &Fine # ^BrowseBtn S&foglia... # ^ShowDetailsBtn Visualizza &dettagli # ^ClickNext Per proseguire, seleziona 'Avanti'. # ^ClickInstall Per avviare l'installazione, seleziona 'Installa'. # ^ClickUninstall Per avviare la disinstallazione, seleziona 'Disinstalla'. # ^Name Nome # ^Completed Installazione completata # ^LicenseText Leggi la licenza prima di procedere con l'installazione di $(^NameDA). Se accetti le condizioni della licenza, seleziona 'Accetto'. # ^LicenseTextCB Leggi licenza prima di procedere con l'installazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la casella sottostante. $_CLICK # ^LicesnseTextRB Leggi la licenza prima di procedere con l'installazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la prima delle opzioni sottoindicate. $_CLICK # ^UnLicenseText Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona 'Accetto'. $_CLICK # ^UnLicenseTextCB Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la casella sottostante. $_CLICK # ^UnLicesnseTextRB Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la prima delle opzioni sottoindicate. $_CLICK # ^Custom Personalizzata # ^ComponentsText Seleziona componenti da installare. # ^ComponentsSubText1 Seleziona tipo installazione: # ^ComponentsSubText2_NoInstTypes Seleziona componenti da installare: # ^ComponentsSubText2 Oppure, seleziona componenti opzionali da installare: # ^UnComponentsText Seleziona componenti da disinstallare. # ^UnComponentsSubText1 Seleziona tipo disinstallazione: # ^UnComponentsSubText2_NoInstTypes Seleziona componenti da disinstallare: # ^UnComponentsSubText2 Oppure, seleziona componenti opzionali da disinstallare : # ^DirText Questa procedura installerà $(^NameDA) in questa cartella.\r\nPer installare in una cartella diversa, seleziona 'Sfoglia' e scegli un'altra cartella.\r\n$_CLICK # ^DirSubText Cartella destinazione # ^DirBrowseText Seleziona la cartella dove installare $(^NameDA): # ^UnDirText Questa procedura disinstallerà $(^NameDA) da questa cartella.\r\nPer disinstallare da una cartella diversa, seleziona 'Sfoglia' e scegli un'altra cartella.\r\n$_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Seleziona la cartella dalla quale disinstallare $(^NameDA): # ^SpaceAvailable "Spazio disponibile: " # ^SpaceRequired "Spazio richiesto: " # ^UninstallingText $(^NameDA) verrà disinstallato da questa cartella.\r\n$_CLICK # ^UninstallingSubText Rimozione da: # ^FileError Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona 'Termina' per interrompere l'installazione,\r\n'Riprova' per ritentare, oppure\r\n'Ignora' per saltare questo file. # ^FileError_NoIgnore Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona 'Riprova' per ritentare, oppure\r\n'Termina' per interrompere l'installazione # ^CantWrite "Impossibile scrivere: " # ^CopyFailed Copia fallita # ^CopyTo "Copia in " # ^Registering "Registrazione di: " # ^Unregistering "Deregistrazione di: " # ^SymbolNotFound "Impossibile trovare il simbolo: " # ^CouldNotLoad "Impossibile caricare: " # ^CreateFolder "Creazione cartella: " # ^CreateShortcut "Creazione collegamento: " # ^CreatedUninstaller "Creazione programma disinstallazione: " # ^Delete "Eliminazione file: " # ^DeleteOnReboot "Elimina al riavvio: " # ^ErrorCreatingShortcut "Errore nella creazione del collegamento: " # ^ErrorCreating "Errore nella creazione di: " # ^ErrorDecompressing Errore nella decompressione dei dati! Probabile programma di installazione corrotto. # ^ErrorRegistering Errore nella registrazione della DLL # ^ExecShell "ExecShell: " # ^Exec "Esecuzione di: " # ^Extract "Estrazione di: " # ^ErrorWriting "Estrazione: errore nella scrittura nel file " # ^InvalidOpcode Programma di installazione corrotto: opcode non valido # ^NoOLE "Nessuna OLE per: " # ^OutputFolder "Cartella destinazione: " # ^RemoveFolder "Rimozione cartella: " # ^RenameOnReboot "Al riavvio rinomina: " # ^Rename Rinomina # ^Skipped "Saltato: " # ^CopyDetails Copia i dettagli negli Appunti # ^LogInstall Registro eventi processo installazione # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Italian.nsh000077500000000000000000000206251477201124000207210ustar00rootroot00000000000000;Language: Italian (1040) ;By SANFACE Software v1.67 accents ;Review and update from v1.65 to v1.67 by Alessandro Staltari < staltari (a) geocities.com > ;Review and update from v1.67 to v1.68 by Lorenzo Bevilacqua < meow811@libero.it > !insertmacro LANGFILE "Italian" = "Italiano" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Installazione di $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Questo programma installerà $(^NameDA) nel computer.$\r$\n$\r$\nSi raccomanda di chiudere tutte le altre applicazioni prima di iniziare l'installazione. Questo permetterà al programma di installazione di aggiornare i file di sistema senza dover riavviare il computer.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Disinstallazione di $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Questa programma ti guiderà nella disinstallazione di $(^NameDA).$\r$\n$\r$\nPrima di iniziare la disinstallazione, assicurati che $(^Name) non sia in esecuzione.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Accordo di licenza" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Leggi le condizioni dell'accordo di licenza prima di installare $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se accetti tutti i termini dell'accordo di licenza, seleziona 'Accetto' per continuare. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se accetti i termini dell'accordo di licenza, seleziona la casella sottostante. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se accetti i termini dell'accordo di licenza, seleziona la prima opzione sottostante. Per installare $(^NameDA) è necessario accettare i termini della licenza d'uso. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Accordo di licenza" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Leggi le condizioni dell'accordo di licenza prima di installare $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se accetti tutti i termini dell'accordo di licenza, seleziona 'Accetto' per continuare. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se accetti i termini dell'accordo di licenza, seleziona la casella sottostante. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se accetti i termini dell'accordo di licenza, seleziona la prima opzione sottostante. Per installare $(^NameDA) è necessario accettare i termini della licenza d'uso. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premi 'PagGiù' per visualizzare il resto dell'accordo di licenza." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selezione componenti" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleziona i componenti di $(^NameDA) da installare." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selezione componenti" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleziona i componenti di $(^NameDA) da disinstallare." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrizione" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posiziona il puntatore del mouse sul componente per visualizzare la relativa descrizione." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleziona un componente per visualizzare la relativa descrizione." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Selezione cartella installazione" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Seleziona la cartella nella quale installare $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Selezione cartella da cui disinstallare" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Seleziona la cartella dalla quale disinstallare $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Attendi il completamento dell'installazione di $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installazione completata" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installazione è stata completata correttamente." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installazione interrotta" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installazione non è stata completata correttamente." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Attendi il completamento della disinstallazione di $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Disinstallazione completata" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La disinstallazione è stata completata correttamente." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Disinstallazione interrotta" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La disintallazione non è stata completata correttamente." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Installazione di $(^NameDA) completata." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) è stato installato.$\r$\n$\r$\nScegli 'Chiudi' per chiudere il programma di installazione." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Per completare l'installazione di $(^NameDA) il computer deve essere riavviato. Vuoi riavviarlo ora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Disinstallazione di $(^NameDA) completata." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) è stato disinstallato.$\r$\n$\r$\nSeleziona 'Chiudi' per chiudere questa procedura." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Per completare la disinstallazione di $(^NameDA) il computer deve essere riavviato. Vuoi riavviarlo ora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Riavvia ora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Preferisco riavviarlo manualmente più tardi" ${LangFileString} MUI_TEXT_FINISH_RUN "Esegui $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Visualizza il file Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Chiudi" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Selezione cartella menu Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Seleziona la cartella del menu Start in cui creare i collegamenti del programma." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleziona la cartella del menu Start in cui verranno creati i collegamenti del programma. È possibile inserire un nome per creare una nuova cartella." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non creare i collegamenti del programma." !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstallazione" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Disinstalla il programma $(^NameDA)." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Sei sicuro di voler interrompere l'installazione di $(^Name) ?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sei sicuro di voler interrompere la disinstallazione di $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Configurazione profilo utenti" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Seleziona per quali utenti vuoi installare $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleziona se vuoi installare $(^NameDA) solo per questo utente o per tutti gli utenti di questo sistema. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installazione per tutti gli utenti" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installazione per il singolo utente" !endif nsis-3.11/Contrib/Language files/Japanese.nlf000077500000000000000000000147261477201124000210620ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1041 # Font and size - dash (-) means default ï¼­ï¼³ Pゴシック 9 # Codepage - dash (-) means ASCII code page 932 # RTL - anything else than RTL means LTR - # Translation by Dnanako(2002), Updated by Takahiro Yoshimura(2003) , maboroshin(2020) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) セットアップ # ^UninstallCaption $(^Name) アンインストール # ^LicenseSubCaption :使用許諾契約 # ^ComponentsSubCaption :インストール オプション # ^DirSubCaption :インストール フォルダ # ^InstallingSubCaption :インストール # ^CompletedSubCaption :完了 # ^UnComponentsSubCaption : アンインストール オプション # ^UnDirSubCaption : アンインストール フォルダ # ^ComfirmSubCaption :ç¢ºèª # ^UninstallingSubCaption :アンインストール # ^UnCompletedSubCaption :完了 # ^BackBtn < 戻る(&B) # ^NextBtn 次ã¸(&N) > # ^AgreeBtn åŒæ„ã™ã‚‹(&A) # ^AcceptBtn ã“ã®ä½¿ç”¨è¨±è«¾å¥‘ç´„ã«åŒæ„ã™ã‚‹(&A) # ^DontAcceptBtn ã“ã®ä½¿ç”¨è¨±è«¾å¥‘ç´„ã«åŒæ„ã—ã¾ã›ã‚“(&D) # ^InstallBtn インストール(&I) # ^UninstallBtn ï½±ï¾ï½²ï¾ï½½ï¾„ï½°ï¾™(&U) # ^CancelBtn キャンセル # ^CloseBtn é–‰ã˜ã‚‹(&C) # ^BrowseBtn å‚ç…§(&R)... # ^ShowDetailsBtn 詳細を表示(&D) # ^ClickNext 「次ã¸ã€ã‚’クリックã—続行ã—ã¾ã™ã€‚ # ^ClickInstall 「インストールã€ã‚’クリックã—インストールを開始ã—ã¾ã™ã€‚ # ^ClickUninstall 「アンインストールã€ã‚’クリックã—アンインストールを開始ã—ã¾ã™ã€‚ # ^Name アプリケーション # ^Completed 完了 # ^LicenseText $(^NameDA) をインストールã™ã‚‹å‰ã«ã€ä½¿ç”¨è¨±è«¾å¥‘約を確èªã—ã¦ãã ã•ã„。契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ã€ŒåŒæ„ã™ã‚‹ã€ã‚’クリックã—ã¦ãã ã•ã„。 # ^LicenseTextCB $(^NameDA) をインストールã™ã‚‹å‰ã«ã€ä½¿ç”¨è¨±è«¾å¥‘約を確èªã—ã¦ãã ã•ã„。契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’クリックã—ã¦ãã ã•ã„。 $_CLICK # ^LicenseTextRB $(^NameDA) をインストールã™ã‚‹å‰ã«ã€ä½¿ç”¨è¨±è«¾å¥‘約を確èªã—ã¦ãã ã•ã„。契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®é¸æŠžè‚¢ã‹ã‚‰æœ€åˆã®ã‚‚ã®ã‚’é¸æŠžã—ã¦ãã ã•ã„。 $_CLICK # ^UnLicenseText $(^NameDA) をアンインストールã™ã‚‹å‰ã«ã€ä½¿ç”¨è¨±è«¾å¥‘約を確èªã—ã¦ãã ã•ã„。契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ã€ŒåŒæ„ã™ã‚‹ã€ã‚’クリックã—ã¦ãã ã•ã„。 # ^UnLicenseTextCB $(^NameDA) をアンインストールã™ã‚‹å‰ã«ã€ä½¿ç”¨è¨±è«¾å¥‘約を確èªã—ã¦ãã ã•ã„。契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’クリックã—ã¦ãã ã•ã„。 $_CLICK # ^UnLicenseTextRB $(^NameDA) をアンインストールã™ã‚‹å‰ã«ã€ä½¿ç”¨è¨±è«¾å¥‘約を確èªã—ã¦ãã ã•ã„。契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®é¸æŠžè‚¢ã‹ã‚‰æœ€åˆã®ã‚‚ã®ã‚’é¸æŠžã—ã¦ãã ã•ã„。 $_CLICK # ^Custom カスタム # ^ComponentsText インストールã—ãŸã„æ§‹æˆè¦ç´ ã«ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。ä¸è¦ãªã‚‚ã®ã¯ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。 $_CLICK # ^ComponentsSubText1 インストールã®ç¨®é¡žã‚’é¸æŠž: # ^ComponentsSubText2_NoInstTypes インストールã™ã‚‹æ§‹æˆè¦ç´ ã‚’é¸æŠž: # ^ComponentsSubText2 ã¾ãŸã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸã„æ§‹æˆè¦ç´ ã‚’é¸æŠž: # ^UnComponentsText アンインストールã—ãŸã„æ§‹æˆè¦ç´ ã«ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。ãã†ã§ãªã„ã‚‚ã®ã¯ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。 $_CLICK # ^UnComponentsSubText1 アンインストールã®ç¨®é¡žã‚’é¸æŠž: # ^UnComponentsSubText2_NoInstTypes アンインストールã™ã‚‹æ§‹æˆè¦ç´ ã‚’é¸æŠž: # ^UnComponentsSubText2 ã¾ãŸã¯ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸã„æ§‹æˆè¦ç´ ã‚’é¸æŠž: # ^DirText $(^NameDA) を以下ã®ãƒ•ォルダã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¾ã™ã€‚別ã®ãƒ•ォルダã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã«ã¯ã€ã€Œå‚照〠を押ã—ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 $_CLICK # ^DirSubText インストール先ã®ãƒ•ォルダ # ^DirBrowseText $(^NameDA) をインストールã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž: # ^UnDirText $(^NameDA) を以下ã®ãƒ•ォルダã‹ã‚‰ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¾ã™ã€‚別ã®ãƒ•ォルダã‹ã‚‰ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã«ã¯ã€ã€Œå‚照〠を押ã—ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA) をアンインストールã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž: # ^SpaceAvailable 空ã容é‡: # ^SpaceRequired å¿…è¦å®¹é‡: # ^UninstallingText $(^NameDA) を以下ã®ãƒ•ォルダã‹ã‚‰ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã™ã€‚ $_CLICK # ^UninstallingSubText アンインストール元: # ^FileError 書ãè¾¼ã¿ãƒ•ァイルオープンã®ã‚¨ãƒ©ãƒ¼:\r\n\t"$0"\r\nインストールを中止ã™ã‚‹ã«ã¯ã€Œä¸­æ­¢ã€ã€\r\nå†ã³ã“ã®ãƒ•ァイルã®ä½œæˆã‚’試ã¿ã‚‹ã«ã¯ã€Œå†è©¦è¡Œã€ã€\r\nã“ã®ãƒ•ァイルをスキップã—ã¦ç¶šã‘ã‚‹ã«ã¯ã€Œç„¡è¦–ã€ã‚’押ã—ã¦ãã ã•ã„。 # ^FileError_NoIgnore 書ãè¾¼ã¿ãƒ•ァイルオープンã®ã‚¨ãƒ©ãƒ¼: \r\n\t"$0"\r\nå†ã³ã“ã®ãƒ•ァイルã®ä½œæˆã‚’試ã¿ã‚‹ã«ã¯ã€Œå†è©¦è¡Œã€ã€\r\nインストールを中止ã™ã‚‹ã«ã¯ã€Œã‚­ãƒ£ãƒ³ã‚»ãƒ«ã€ã‚’押ã—ã¦ãã ã•ã„。 # ^CantWrite 書ãè¾¼ã‚ã¾ã›ã‚“: # ^CopyFailed コピー失敗 # ^CopyTo コピー # ^Registering 登録中: # ^Unregistering 登録解除中: # ^SymbolNotFound シンボルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: # ^CouldNotLoad 読ã¿è¾¼ã¿ã«å¤±æ•—: # ^CreateFolder フォルダ作æˆ: # ^CreateShortcut ショートカット作æˆ: # ^CreatedUninstaller アンインストーラ作æˆ: # ^Delete ファイル削除: # ^DeleteOnReboot å†èµ·å‹•時ã«å‰Šé™¤: # ^ErrorCreatingShortcut ショートカット作æˆã‚¨ãƒ©ãƒ¼: # ^ErrorCreating 作æˆã‚¨ãƒ©ãƒ¼: # ^ErrorDecompressing データã®å±•開エラー\r\n\r\nインストーラãŒç ´æã—ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ # ^ErrorRegistering DLL ã®ç™»éŒ²ã‚¨ãƒ©ãƒ¼ # ^ExecShell æ‹¡å¼µå­ã®é–¢é€£ä»˜ã‘実行: # ^Execute 実行: # ^Extract 展開: # ^ErrorWriting 展開:ファイルã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼ # ^InvalidOpcode インストーラーãŒå£Šã‚Œã¦ã„ã‚‹:無効㪠opcode # ^NoOLE OLE ãŒã‚りã¾ã›ã‚“: # ^OutputFolder 出力先フォルダ: # ^RemoveFolder フォルダ削除: # ^RenameOnReboot å†èµ·å‹•時ã«åå‰ã®å¤‰æ›´: # ^Rename åå‰ã®å¤‰æ›´: # ^Skipped çœç•¥: # ^CopyDetails クリップボードã¸è©³ç´°ã‚’コピー # ^LogInstall インストールã®çµŒéŽã‚’ログヘ記録 # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Japanese.nsh000077500000000000000000000230701477201124000210630ustar00rootroot00000000000000;Language: Japanese (1041) ; 1st translation by Dnanako Dnanako (2002, r1537), 2nd update by Takahiro Yoshimura (2003, r2489) , 3rd update by maboroshin (July 2020) !insertmacro LANGFILE "Japanese" = "日本語" "Nihongo" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) セットアップã¸ã‚ˆã†ã“ã" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "セットアップã¯ã€$(^NameDA) ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã”æ¡ˆå†…ã—ã¾ã™ã€‚$\r$\n$\r$\nセットアップを開始ã™ã‚‹å‰ã«ã€ä»–ã®ã™ã¹ã¦ã®ã‚¢ãƒ—リケーションを終了ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ã“れã«ã‚ˆã£ã¦ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ãŒã‚³ãƒ³ãƒ”ュータをå†èµ·å‹•ã›ãšã«ã€ã‚·ã‚¹ãƒ†ãƒ  ファイルを更新ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) アンインストールã¸ã‚ˆã†ã“ã" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "セットアップã¯ã€$(^NameDA) ã®ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã”æ¡ˆå†…ã—ã¾ã™ã€‚$\r$\n$\r$\nアンインストールを開始ã™ã‚‹å‰ã«ã€$(^NameDA) ãŒèµ·å‹•ã—ã¦ã„ãªã„ã“ã¨ã‚’確èªã—ã¦ä¸‹ã•ã„。$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "使用許諾契約" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) をインストールã™ã‚‹å‰ã«ã€ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ã‚’確èªã—ã¦ãã ã•ã„。" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ã€ŒåŒæ„ã™ã‚‹ã€ ã‚’é¸æŠžã—インストールを続行ã—ã¾ã™ã€‚$(^NameDA) をインストールã™ã‚‹ã«ã¯ã€å¥‘ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’クリックã—ã¦ãã ã•ã„。$(^NameDA) をインストールã™ã‚‹ã«ã¯ã€å¥‘ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã«è¡¨ç¤ºã•れã¦ã„るオプションã®ã†ã¡ã€æœ€åˆã®ã‚‚ã®ã‚’é¸æŠžã—ã¦ãã ã•ã„。$(^NameDA) をインストールã™ã‚‹ã«ã¯ã€å¥‘ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "使用許諾契約" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) をアンインストールã™ã‚‹å‰ã«ã€ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ã‚’確èªã—ã¦ãã ã•ã„。" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ã€ŒåŒæ„ã™ã‚‹ã€ ã‚’é¸æŠžã—アンインストールを続行ã—ã¾ã™ã€‚$(^NameDA) をアンインストールã™ã‚‹ã«ã¯ã€å¥‘ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’クリックã—ã¦ãã ã•ã„。$(^NameDA) をアンインストールã™ã‚‹ã«ã¯ã€å¥‘ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "契約ã®ã™ã¹ã¦ã®æ¡ä»¶ã«åŒæ„ã™ã‚‹ãªã‚‰ã€ä¸‹ã®é¸æŠžè‚¢ã‹ã‚‰æœ€åˆã®ã‚‚ã®ã‚’é¸æŠžã—ã¦ãã ã•ã„。$(^NameDA) をアンインストールã™ã‚‹ã«ã¯ã€å¥‘ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "[Page Down] を押ã—契約をã™ã¹ã¦ãŠèª­ã¿ãã ã•ã„。" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "æ§‹æˆè¦ç´ ã®é¸æŠž" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "インストールã—ãŸã„ $(^NameDA) ã®æ©Ÿèƒ½ã‚’é¸æŠžã—ã¦ãã ã•ã„。" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "æ§‹æˆè¦ç´ ã®é¸æŠž" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "アンインストールã—ãŸã„ $(^NameDA) ã®æ©Ÿèƒ½ã‚’é¸æŠžã—ã¦ãã ã•ã„。" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "説明" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "æ§‹æˆè¦ç´ ã«ãƒžã‚¦ã‚¹ カーソルを載ã›ã‚‹ã¨ã€èª¬æ˜ŽãŒè¡¨ç¤ºã•れã¾ã™ã€‚" !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "æ§‹æˆè¦ç´ ã‚’é¸æŠžã™ã‚‹ã¨ã€èª¬æ˜ŽãŒè¡¨ç¤ºã•れã¾ã™ã€‚" !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "インストール先ã®é¸æŠž" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) をインストールã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "アンインストール元ã®é¸æŠž" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) をアンインストールã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "インストール" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) をインストール中ã§ã™ã€‚ãŠå¾…ã¡ãã ã•ã„。" ${LangFileString} MUI_TEXT_FINISH_TITLE "インストールã®å®Œäº†" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚" ${LangFileString} MUI_TEXT_ABORT_TITLE "インストールã®ä¸­æ­¢" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã¯æ­£å¸¸ã«å®Œäº†ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "アンインストール" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) をアンインストール中ã§ã™ã€‚ãŠå¾…ã¡ãã ã•ã„。" ${LangFileString} MUI_UNTEXT_FINISH_TITLE "アンインストールã®å®Œäº†" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "アンインストールã®ä¸­æ­¢" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯æ­£å¸¸ã«å®Œäº†ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) セットアップã®å®Œäº†" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ã¯ã€ã“ã®ã‚³ãƒ³ãƒ”ュータã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã—ãŸã€‚$\r$\n$\r$\n「完了ã€ã‚’クリックã—セットアップを閉ã˜ã¾ã™ã€‚" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’完了ã™ã‚‹ã«ã¯ã€ã“ã®ã‚³ãƒ³ãƒ”ュータをå†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚今ã™ãå†èµ·å‹•ã—ã¾ã™ã‹ï¼Ÿ" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) アンインストールã®å®Œäº†" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ã¯ã€ã“ã®ã‚³ãƒ³ãƒ”ュータã‹ã‚‰ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã—ãŸã€‚$\r$\n$\r$\n「完了ã€ã‚’クリックã—セットアップを閉ã˜ã¾ã™ã€‚" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) ã®ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’完了ã™ã‚‹ã«ã¯ã€ã“ã®ã‚³ãƒ³ãƒ”ュータをå†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚今ã™ãå†èµ·å‹•ã—ã¾ã™ã‹ï¼Ÿ" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "今ã™ãå†èµ·å‹•" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "å¾Œã§æ‰‹å‹•ã§å†èµ·å‹•" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) を実行(&R)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Readme を表示(&S)" ${LangFileString} MUI_BUTTONTEXT_FINISH "完了(&F)" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "スタートメニューã®ãƒ•ォルダã®é¸æŠž" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’作æˆã™ã‚‹ã‚¹ã‚¿ãƒ¼ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "ã“ã®ãƒ—ログラムã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’作æˆã—ãŸã„スタートメニューã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã¾ãŸã€æ–°è¦ãƒ•ォルダã®åå‰ã‚’入力ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ショートカットを作æˆã—ãªã„" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) ã®ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) ã‚’ã“ã®ã‚³ãƒ³ãƒ”ュータã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) セットアップを中止ã—ã¾ã™ã‹ï¼Ÿ" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) アンインストールを中止ã—ã¾ã™ã‹ï¼Ÿ" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "ユーザーã®é¸æŠž" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "ã©ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãŸã‚ã« $(^NameDA) をインストールã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„。" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA) を自分自身ã®ãŸã‚ã ã‘ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã®ã‹ã€ã“ã®ã‚³ãƒ³ãƒ”ューターã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã®ã‹é¸æŠžã—ã¦ãã ã•ã„。$(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "ã“ã®ã‚³ãƒ³ãƒ”ューターを使用ã™ã‚‹å…¨å“¡ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "自分ã«ã®ã¿ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" !endif nsis-3.11/Contrib/Language files/Khmer.nlf000077500000000000000000000264561477201124000204050ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1107 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1200 # RTL - anything else than RTL means LTR - # Translation by .....សុផល្លី (yi sophally, yi.sophally at gmail dot com) # ^Branding Nullsoft Install System %s # ^SetupCaption ដំឡើងកម្មវិធី $(^Name) # ^UninstallCaption លុប​ $(^Name) áž…áŸáž‰ #^LicenseSubCaption : កិច្ចសន្យា​អាជ្ញាបបáŸážŽáŸ’ណ # ^ComponentsSubCaption : ជំរើស​នៃ​ការ​ដំឡើង # ^DirSubCaption : ážážâ€‹ážŠáž¾áž˜áŸ’បី​ដំឡើង # ^InstallingSubCaption : កំពុងដំឡើង​ # ^CompletedSubCaption : ដំឡើង​រួចរាល់​ # ^UnComponentsSubCaption : ជំរើស​នៃការ​លុបកម្មវិធី​ចáŸáž‰â€‹ # ^UnDirSubCaption : ážážâ€‹ážŠáŸ‚ល​ážáŸ’រូវលុបកម្មវិធី​ចáŸáž‰â€‹ # ^ConfirmSubCaption : ការបញ្ជាក់​ទទួលយក​ # ^UninstallingSubCaption : កំពុង​លុប​ចáŸáž‰â€‹ # ^UnCompletedSubCaption : លុបចáŸáž‰â€‹ážšáž½áž…រាល់​ # ^BackBtn < &ážáŸ’រលប់​ក្រោយ​ # ^NextBtn &ទៅ​មុážâ€‹â€‹ > # ^AgreeBtn #FIXME? I &យល់​ព្រម​ # ^AcceptBtn ážáŸ’ញុំ​ &យល់ព្រមážáž¶áž˜â€‹áž€áž·áž…្ច​ព្រម​ព្រាង​អាជ្ញាបáŸážŽáŸ’ណ # ^DontAcceptBtn &ážáŸ’ញុំ​មិន​យល់ព្រមážáž¶áž˜â€‹áž€áž·áž…្ច​ព្រម​ព្រាង​អាជ្ញាបáŸážŽáŸ’ណទáŸâ€‹ # ^InstallBtn &ដំឡើង​ # ^UninstallBtn &លុប​ចáŸáž‰â€‹ # ^CancelBtn បដិសáŸáž’​ # ^CloseBtn &បិទ​ # ^BrowseBtn ស្វែង​&រក​... # ^ShowDetailsBtn បង្ហាញ​ &​លំអិážâ€‹ážŸáŸáž…ក្ážáž¸â€‹ # ^ClickNext ចុច​ទៅមុážâ€‹ážŠáž¾áž˜áŸ’បី​បន្ážâ€‹ # ^ClickInstall ចុច​លើ​ដំឡើង​ដើម្បី​ចាប់​ផ្ážáž¾áž˜â€‹ážŠáŸ†ážŽáž¾ážšâ€‹áž€áž¶ážš # ^ClickUninstall ចុច​លើ​លុប​ចáŸáž‰â€‹ážŠáž¾áž˜áŸ’បី​ចាប់​ផ្ážáž¾áž˜â€‹áž›áž»áž”​​ # ^Name ឈ្មោះ​ # ^Completed រួចរាល់​ # ^LicenseText សូម​អាន​កិច្ចព្រមព្រាង​អាជ្ញាបáŸážŽáŸ’ណ​មុន​ពáŸáž›â€‹ážŠáŸ†áž¡áž¾áž„​កម្មវិធី​​ $(^NameDA) áž“áŸáŸ‡áŸ” ប្រសិន​បើ​អ្នក​យល់​ស្រប​សូម​ចុច​យក​ ážáŸ’ញុំ​យល់​ព្រម​ # ^LicenseTextCB សូម​អាន​កិច្ចព្រមព្រាង​អាជ្ញាបáŸážŽáŸ’ណ​មុន​ពáŸáž›â€‹ážŠáŸ†áž¡áž¾áž„​កម្មវិធី​​ $(^NameDA) áž“áŸáŸ‡áŸ” ប្រសិន​បើ​អ្នក​យល់​ស្រប​សូម​ធិក​យក​ប្រអប់​ážáž¶áž„​ក្រោម​$_CLICK # ^LicenseTextRB សូម​អាន​កិច្ចព្រមព្រាង​អាជ្ញាបáŸážŽáŸ’ណ​មុន​ពáŸáž›â€‹ážŠáŸ†áž¡áž¾áž„​កម្មវិធី​​ $(^NameDA) áž“áŸáŸ‡áŸ” ប្រសិន​បើ​អ្នក​យល់​ស្រប​សូម​ជ្រើស​​យក​ជំរើស​ទី​មួយ​​ážáž¶áž„​ក្រោម​ $_CLICK # ^UnLicenseText សូម​អាន​កិច្ចព្រមព្រាង​អាជ្ញាបáŸážŽáŸ’ណ​មុន​ពáŸáž›áž›áž»áž”​កម្មវិធី​​ $(^NameDA) áž“áŸáŸ‡áŸ” ប្រសិន​បើ​អ្នក​យល់​ស្រប​សូម​ចុច​យក​ ážáŸ’ញុំ​យល់​ព្រម​ # ^UnLicenseTextCB សូម​អាន​កិច្ចព្រមព្រាង​អាជ្ញាបáŸážŽáŸ’ណ​មុន​ពáŸáž›â€‹áž›áž»áž”​កម្មវិធី​​ $(^NameDA) áž“áŸáŸ‡áŸ” ប្រសិន​បើ​អ្នក​យល់​ស្រប​សូម​ធិក​យក​ប្រអប់​ážáž¶áž„​ក្រោម​$_CLICK # ^UnLicenseTextRB សូម​អាន​កិច្ចព្រមព្រាង​អាជ្ញាបáŸážŽáŸ’ណ​មុន​ពáŸáž›â€‹áž›áž»áž”​កម្មវិធី​​ $(^NameDA) áž“áŸáŸ‡áŸ” ប្រសិន​បើ​អ្នក​យល់​ស្រប​សូម​ជ្រើស​​យក​ជំរើស​ទី​មួយ​​ážáž¶áž„​ក្រោម​ $_CLICK # ^Custom ជំរើសផ្ទាល់​ážáŸ’លួន​ # ^ComponentsText ធិក​យកសមាសភាគ​ដែល​អ្នក​ចង់​ដំឡើង​និង​ដោះធិក​ពី​សមាស​ភាគ​ដែល​អ្នក​មិន​ចង់​ដំឡើង​ ​$_CLICK # ^ComponentsSubText1 សូមជ្រើស​រើស​ប្រភáŸáž‘​នៃ​ការ​ដំឡើង​: # ^ComponentsSubText2_NoInstTypes សូមជ្រើសរើស​សមាសភាគ​ដើម្បី​ដំឡើង​: # ^ComponentsSubText2 ឬ ជ្រើស​រើស​សមាសភាគ​ជាជំរើស​ណាមួយ​ដែល​អ្នក​ចង់​ដំឡើង​: # ^UnComponentsText ធិក​យកសមាសភាគ​ដែល​អ្នក​ចង់លុបចáŸáž‰â€‹áž“ិង​ដោះធិក​ពី​សមាស​ភាគ​ដែល​អ្នក​មិន​ចង់លុបចáŸáž‰â€‹â€‹ ​$_CLICK # ^UnComponentsSubText1 សូមជ្រើស​រើស​ប្រភáŸáž‘​នៃ​ការលុបកម្មវិធី​: # ^UnComponentsSubText2_NoInstTypes សូមជ្រើសរើស​សមាសភាគ​ដើម្បីកាážáŸ‹áž…áŸáž‰â€‹â€‹: # ^UnComponentsSubText2 ឬ ជ្រើស​រើស​សមាសភាគ​ជាជំរើស​ណាមួយ​ដែល​អ្នក​ចង់​កាážáŸ‹áž…áŸáž‰â€‹â€‹: # ^DirText កម្មវិធី​ជំនួយ​នáŸáŸ‡â€‹áž“ឹង​ដំឡើង​$(^NameDA)នៅក្នុង​ážážâ€‹ážáž¶áž„​ក្រោម​នáŸáŸ‡â€‹áŸ” ដើម្បី​ដំឡើង​នៅ​ក្នុង​ážážâ€‹ážŠáž‘ៃ​ទៀážâ€‹ážŸáž¼áž˜â€‹áž…ុច​លើ​ស្វែងរក​ ហើយ​ជ្រើសរើស​ážážâ€‹áž•្សáŸáž„​ទៀážâ€‹áŸ” ​$_CLICK # ^DirSubText ážážâ€‹áž‚ោល​ដៅ​ # ^DirBrowseText ជ្រើសរើស​ážážâ€‹ážŠáž¾áž˜áŸ’បី​ដំឡើង​កម្មវិធី​$(^NameDA): # ^UnDirText កម្មវិធី​ជំនួយ​នáŸáŸ‡â€‹áž“ឹងលុប​​$(^NameDA)áž…áŸáž‰áž–ី​ážážâ€‹ážáž¶áž„​ក្រោម​នáŸáŸ‡â€‹áŸ” ដើម្បី​ចáŸáž‰áž–ី​ក្នុង​ážážâ€‹ážŠáž‘ៃ​ទៀážâ€‹ážŸáž¼áž˜â€‹áž…ុច​លើ​ស្វែងរក​ ហើយ​ជ្រើសរើស​ážážâ€‹áž•្សáŸáž„​ទៀážâ€‹áŸ” ​$_CLICK # ^UnDirSubText "" # ^UnDirBrowseText ជ្រើសរើស​ážážâ€‹ážŠáž¾áž˜áŸ’បី​លុប​​កម្មវិធី​$(^NameDA)áž…áŸáž‰â€‹: # ^SpaceAvailable "ចណ្លោះទំហំ​ដែលអាចប្រើប្រាស់បាន​: " # ^SpaceRequired "ážáŸ†ážšáž¼ážœáž€áž¶ážšâ€‹áž‘ំហំ​: " # ^UninstallingText $(^NameDA) នឹង​ážáŸ’រូវ​បាន​លុប​ចáŸáž‰â€‹áž–ី​ážážâ€‹ážáž¶áž„​ក្រោម​នáŸáŸ‡â€‹áŸ” $_CLICK # ^UninstallingSubText កំពុង​លុប​ចáŸáž‰áž–ី:​ # ^FileError #FIXME? មាន​កំហុស​ក្នុង​ការ​បើក​ឯកសារ​ដើម្បី​សរសáŸážšâ€‹áž…ូល​:\r\n\r\n$0\r\n\r\n​ សូមចុចលើ​ បញ្ឈប់​ ដើម្បី​បញ្ចប់ការ​ដំឡើង​ \r\n Retry ដើម្បី​ព្យាយាម​ម្ážáž„​ទៀážâ€‹ áž« បដិសáŸáž’​ដើម្បី​បញ្ឈប់​ឯកសារនáŸáŸ‡â€‹áŸ”​ # ^FileError_NoIgnore #FIXME? មាន​កំហុស​ក្នុង​ការ​បើក​ឯកសារ​ដើម្បី​សរសáŸážšâ€‹áž…ូល​:​\r\n\r\n$0\r\n\r\n សូមចុចលើ​ Retry ដើម្បី​ព្យាយាម​ម្ážáž„​ទៀហឫ \r\nបដិសáŸáž’ ដើម្បី​បញ្ឈប់​ការ​ដំឡើង​។​ # ^CantWrite "មិនអាច​សរសáŸážšâ€‹áž…ូល​បាន​: " # ^CopyFailed ការចំលងបរាជáŸáž™ ​# ^CopyTo "ចំលង​ទៅកាន់ " # ^Registering "កំពុង​ចុះឈ្មោះ​: " # ^Unregistering "កំពុង​លុប​ឈ្មោះ​: " # ^SymbolNotFound "មិនអាច​រក​និមិážáŸ’ážâ€‹ážŸáž‰áŸ’ញាឃើញ​: " # ^CouldNotLoad "មិន​អាច​ទាញមក​បាន: " # ^CreateFolder "​បង្កើážâ€‹ážážâ€‹: " # ^CreateShortcut "បង្កើážâ€‹áž•្លូវកាážáŸ‹â€‹: " # ^CreatedUninstaller "កម្មវិធី​ដើម្បី​លុប​ážáŸ’រូវបាន​បង្កើážâ€‹: " # ^Delete "លុប​ឯកសា​: " # ^DeleteOnReboot "លុប​ពáŸáž›áž€áž»áŸ†áž–្យូទáŸážšâ€‹â€‹ážŠáŸ†ážŽáž¾ážšáž€áž¶ážšâ€‹áž¡áž¾áž„​វិញ: " # ^ErrorCreatingShortcut "មានកំហុស​ក្នុងការ​បង្កើážâ€‹áž•្លូវកាážáŸ‹â€‹: " # ^ErrorCreating "មាន​កំហុស​ក្នុង​ការ​បង្កើážâ€‹: " # ^ErrorDecompressing មាន​កំហុស​ក្នុង​ការ​ពន្លា​ទិន្ននáŸáž™! កម្មវិធី​ដំឡើង​មាន​បញ្ហា​? # ^ErrorRegistering មាន​កំហុស​ក្នុង​ការ​ចុះឈ្មោះ​ ឌីអិល​អិល​ # ^ExecShell "ប្រážáž·áž”áŸážáŸ’ážážŸáŸ‚ល​: " # ^Exec "ប្រážáž·áž”áŸážáŸ’áž: " # ^Extract "ពន្លា: " # ^ErrorWriting "ពន្លា​ឯកសារ​: មាន​បញ្ហាពáŸáž›â€‹ážŸážšážŸáŸážšâ€‹áž…ូល​ឯកសារ​ " # ^InvalidOpcode កម្មវិធី​ដំឡើង​មាន​បញ្ហា​: opcode មិនážáŸ’រឹមážáŸ’រូវ​ # ^NoOLE "អážáŸ‹áž˜áž¶áž“​ OLE សំរាប់​: " # ^OutputFolder "ážážážŸáŸ†ážšáž¶áž”់ដាក់​ទិន្នផល​: " # ^RemoveFolder "លុបážážâ€‹áž¯áž€ážŸáž¶ážšâ€‹: " # ^RenameOnReboot "ប្ážáž¼ážšážˆáŸ’មោះ​នៅពáŸáž›â€‹áž€áž»áŸ†áž–្យូទáŸážšâ€‹ážŠáŸ†ážŽáž¾ážšâ€‹áž€áž¶ážšâ€‹áž¡áž¾áž„​វិញ​: " # ^Rename "ប្ážáž¼ážšâ€‹ážˆáŸ’មោះ​: " # ^Skipped "ážáŸ’រូវបាន​រំលង​: " # ^CopyDetails #FIXME? ចំលង​ពិពណ៌នាទៅ​ Clipboard # ^LogInstall កážáŸ‹ážáŸ’រា​ដំណើរការ​ដំឡើង​ # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Khmer.nsh000077500000000000000000000365171477201124000204150ustar00rootroot00000000000000;Language: Khmer (1033) ;By yi.sophally !insertmacro LANGFILE "Khmer" = "ភាសាážáŸ’មែរ" "Khmer" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "សូមស្វាគមនáŸáž…ំពោះការ​ដំឡើង​កម្មវិធី​ $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "កម្មវិធីជំនួយនáŸáŸ‡áž“ឹងនាំអ្នកដល់​ការ​ដំឡើង​កម្មវិធី​នៃកម្មវិធី $(^NameDA).$\r$\n$\r$\nIt ដែល​សូម​អោយ​អ្នក​បិទ​នូវ​កម្ម​វិធី​ទាំងឡាយ​ផ្សáŸáž„​ទៀážâ€‹áž˜áž»áž“​ពáŸáž›â€‹áž…ាប់ផ្ážáž¾áž˜â€‹áž€áž¶ážšâ€‹ážŠáŸ†áž¡áž¾áž„​។ ដើម្បី​ងាយ​ស្រួល​ក្នុង​ការ​កែប្រែ​ឯកសារ​នៃប្រពáŸáž“្ធប្រážáž·áž”ážáŸ’ážáž€áž¶ážšâ€‹ážŠáŸ„យ​មិន​ចាំបាច់​ចាប់​ផ្ážáž¾áž˜â€‹ážŠáŸ†ážŽáž¾ážšâ€‹áž€áž¶ážšâ€‹áž˜áŸ‰áž¶ážŸáŸŠáž¸áž“របស់​អ្នក​​សារ​ជា​ážáŸ’មី។​ $\r$\n$\r$\n$_CLICK" #FIXME? BUGBUG: "It"? !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ស្វាគមនáŸâ€‹áž…ំពោះ​ការ​លុបកម្មវិធី​ $(^NameDA)​ áž“áŸáŸ‡" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "កម្មវិធីជំនួយនáŸáŸ‡áž“ឹងនាំអ្នកដល់​ការលុបចáŸáž‰â€‹â€‹áž“ៃកម្មវិធី$(^NameDA).$\r$\n$\r$\n​ មុន​ពáŸáž›â€‹áž…ាប់​ផ្ážáž¾áž˜â€‹áž›áž»áž”​ចáŸáž‰â€‹ សូម​អោយ​ប្រាកដ​ážáž¶â€‹áž€áž˜áŸ’មវិធី​ $(^NameDA) មិនមែន​កំពុង​ដំណើរ​ការ​$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "កិច្ចព្រមព្រាង​អាជ្ញា​បáŸážŽáŸ’ណ" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "សូម​អាន​អាជ្ញាបáŸážŽáŸ’ណ​អោយ​បាន​ážáŸ’រឹម​ážáŸ’រូវ​មុន​ពáŸáž›â€‹ážŠáŸ†áž¡áž¾áž„​កម្មវិធី​ $(^NameDA)។​" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ប្រសិន​បើ​អ្នក​យល់​ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រម​ព្រាង​ សូម​ចុច​ ážáŸ’ញុំយល់ព្រម​ ដើម្បី​ដំណើរការ​បន្ážáŸ” ដើម្បីដំឡើង​​កម្មវិធី​ $(^NameDA) áž“áŸáŸ‡â€‹áž¢áŸ’នក​ážáŸ’រូវ​ážáŸ‚​យល់ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រមព្រាង​។" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ប្រសិន​បើ​អ្នក​យល់​ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រម​ព្រាង​សូម​ចុច​ធិច​ប្រអប់​ážáž¶áž„ក្រោម​។ ដើម្បីដំឡើង​កម្មវិធី​ $(^NameDA) áž“áŸáŸ‡â€‹áž¢áŸ’នក​ážáŸ’រូវ​ážáŸ‚​យល់ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រមព្រាង​ $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ប្រសិន​បើ​អ្នក​យល់​ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រម​ព្រាង​សូមជ្រើសរើស​ជំរើស​ទីមួយ​ážáž¶áž„​ក្រោម​។ ដើម្បីដំឡើង​កម្មវិធី​ $(^NameDA) áž“áŸáŸ‡â€‹áž¢áŸ’នក​ážáŸ’រូវ​ážáŸ‚​យល់ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រមព្រាង $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "កិច្ចព្រមព្រាង​អាជ្ញា​បáŸážŽáŸ’ណ" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "សូម​អាន​អាជ្ញាបáŸážŽáŸ’ណ​អោយ​បាន​ážáŸ’រឹម​ážáŸ’រូវ​មុន​ពáŸáž›â€‹áž›áž»áž”​កម្មវិធី​ $(^NameDA)áž…áŸáž‰áŸ”​" #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM "ប្រសិន​បើ​អ្នក​យល់​ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រម​ព្រាង​ សូម​ចុច​ I Agree ដើម្បី​ដំណើរការ​បន្ážáŸ” ដើម្បីលុប​កម្មវិធី​ $(^NameDA) áž“áŸáŸ‡â€‹áž¢áŸ’នក​ážáŸ’រូវ​ážáŸ‚​យល់ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រមព្រាង​ $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ប្រសិន​បើ​អ្នក​យល់​ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រម​ព្រាង​សូម​ចុច​ធិច​ប្រអប់​ážáž¶áž„ក្រោម​។ ដើម្បីលុបកម្មវិធី​ $(^NameDA) áž“áŸáŸ‡â€‹áž¢áŸ’នក​ážáŸ’រូវ​ážáŸ‚​យល់ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រមព្រាង​ $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ប្រសិន​បើ​អ្នក​យល់​ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រម​ព្រាង​សូមជ្រើសរើស​ជំរើស​ទីមួយ​ážáž¶áž„​ក្រោម​។ ដើម្បីលុប​កម្មវិធី​ $(^NameDA) áž“áŸáŸ‡â€‹áž¢áŸ’នក​ážáŸ’រូវ​ážáŸ‚​យល់ព្រម​ážáž¶áž˜â€‹áž€áž·áž…្ចព្រមព្រាង $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "សូម​ចុច Page Down ដើម្បី​មើល​កិច្ច​ព្រម​ព្រាង​ដែល​នៅសល់​" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ជ្រើសរើស​សមាសភាគ" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "ជ្រើសរើស​ដំណើរ​ការ​នៃកម្មវិធី​ $(^NameDA) ​ដែល​អ្នក​ចង់​ដំឡើង​" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ជ្រើសរើស​សមាសភាគ" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "ជ្រើសរើស​ដំណើរ​ការ​នៃកម្មវិធី​ $(^NameDA) ​ដែល​អ្នក​ចង់​លប់​​" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ការពិពណáŸáž“áž¶" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ដាក់កណ្ážáž»ážšâ€‹áž”ញ្ជារបស់​អ្នក​លើ​សមាសភាគ​ណា​មួយ​ដើម្បី​មើល​ការ​ពិពណáŸáž“ារបស់​វា​​។" !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ជ្រើសរើស​កន្លែង​ដើម្បី​ដំឡើង​" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "ជ្រើសរើសážážâ€‹ážŠáž¾áž˜áŸ’បី​ដំឡើង​កម្មវិធី​ $(^NameDA)​ ។" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "ជ្រើសរើស​កន្លែង​ដែលážáŸ’រូវ​លប់​ចáŸáž‰â€‹" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "ជ្រើសរើសážážâ€‹ážŠáž¾áž˜áŸ’បី​លប់​កម្មវិធី​ $(^NameDA)​ áž…áŸáž‰áŸ”" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "កំពុងដំឡើង​" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "សូម​មáŸážáŸ’ážáž¶â€‹ážšáž„់ចាំ​ážážŽáŸ‡ážŠáŸ‚ល​កម្មវិធី​ $(^NameDA) កំពុង​ážáŸ’រូវបាន​ដំឡើង​។" ${LangFileString} MUI_TEXT_FINISH_TITLE "ការដំឡើង​រួចរាល់​" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ការ​ដំឡើង​ážáŸ’រូវ​បាន​បញ្ចប់ដោយ​ជោគជáŸáž™â€‹" ${LangFileString} MUI_TEXT_ABORT_TITLE "ការដំឡើង​ážáŸ’រូវបាន​បញ្ឈប់​" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ការ​ដំឡើង​ážáŸ’រូវបានបរាជáŸáž™áŸ”" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "កំពុងដំណើរការ​លុប​" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "សូមមáŸážáŸ’ážáž¶ážšáž„់ចាំ​ážážŽáŸ‡ážŠáŸ‚ល​កម្មវិធី​ $(^NameDA) កំពុង​ážáŸ’រូវ​បាន​លុប​។" ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ការ​លុប​ចáŸáž‰â€‹ážšáž½áž…​រាល់​" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ការ​លុប​ចáŸáž‰â€‹ážáŸ’រូវបាន​បរាជáŸáž™â€‹â€‹áŸ”" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ការ​លុប​ចáŸáž‰â€‹ážáŸ’រូវបាន​បញ្ឈប់​" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ការ​លុប​ចáŸáž‰â€‹ážáŸ’រូវបាន​បរាជáŸáž™" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "កម្មវិធី​ជំនួយ​ក្នុងការ​ដំឡើង​ $(^NameDA) កំពុងážáŸ’រូវ​បាន​បញ្ចប់​" #FIXME:MUI_TEXT_FINISH_INFO_TEXT "កម្មវិធី​ $(^NameDA) បាន​ážáŸ’រូវ​ដំឡើង​រួចរាល់​នៅក្នុង​កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​។ $\r$\n$\r$\nចុច​ Finish ដើម្បីបិទកម្មវិធីជំនួយ​នáŸáŸ‡â€‹" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​ážáŸ’រូវážáŸ‚​ចាប់​ដំណើរ​ការ​សារ​ជាážáŸ’មី​ដើម្បី​បំពáŸáž‰â€‹áž€áž¶ážšâ€‹ážŠáŸ†áž¡áž¾áž„​កម្មវិធី​ $(^NameDA)​ áž“áŸáŸ‡áŸ” ážáž¾â€‹áž¢áŸ’នក​ចង់ចាប់ផ្ážáž¾áž˜ážŠáŸ†ážŽáž¾ážšáž€áž¶ážšâ€‹â€‹áž€áž»áŸ†áž–្យូទáŸážšáž¢áŸ’នក​ឡើង​វិញ​ពáŸáž›â€‹áž“áŸáŸ‡â€‹?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "កម្មវិធី​ជំនួយ​ក្នុងការ​លុប​ $(^NameDA) កំពុងážáŸ’រូវ​បាន​បញ្ចប់" #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT "កម្មវិធី​ $(^NameDA) បាន​ážáŸ’រូវ​លុប​រួចរាល់​ពី​ក្នុង​កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​។ $\r$\n$\r$\nចុច​ Finish ដើម្បីបិទកម្មវិធីជំនួយ​នáŸáŸ‡â€‹" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​ážáŸ’រូវážáŸ‚​ចាប់​ដំណើរ​ការ​សារ​ជាážáŸ’មី​ដើម្បី​បំពáŸáž‰â€‹áž€áž¶ážšâ€‹ážŠáŸ†áž¡áž¾áž„​កម្មវិធី​ $(^NameDA)​ áž“áŸáŸ‡áŸ” ážáž¾â€‹áž¢áŸ’នក​ចង់ចាប់ផ្ážáž¾áž˜ážŠáŸ†ážŽáž¾ážšáž€áž¶ážšâ€‹â€‹áž€áž»áŸ†áž–្យូទáŸážšáž¢áŸ’នក​ឡើង​វិញ​ពáŸáž›â€‹áž“áŸáŸ‡â€‹?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ចាប់ផ្ážáž¾áž˜ážŠáŸ†ážŽáž¾ážšáž€áž¶ážšâ€‹â€‹áž€áž»áŸ†áž–្យូទáŸážšáž¡áž¾áž„​វិញ​ពáŸáž›â€‹áž“áŸáŸ‡â€‹" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ចង់​ដំណើរការ​កុំព្យូទáŸážšâ€‹ážŠáŸ„យ​ážáŸ’លួន​ឯង​ពáŸáž›â€‹áž€áŸ’រោយ​" #FIXME:MUI_TEXT_FINISH_RUN #FIXME:MUI_TEXT_FINISH_SHOWREADME #FIXME:MUI_BUTTONTEXT_FINISH !endif !ifdef MUI_STARTMENUPAGE #FIXME? ${LangFileString} MUI_TEXT_STARTMENU_TITLE "ជ្រើសរើស​ážážâ€‹áž˜áŸ‰ážºáž“ុយ Start " ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "ជ្រើសរើស​ážážâ€‹áž˜áŸ‰ážºáž“ុយ Start ដើម្បី​បង្កើážâ€‹áž•្លូវ​កាážáŸ‹â€‹áž‘ៅ​កម្ម​វិធី​ $(^NameDA) ។" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "ជ្រើសរើស​ážážâ€‹áž˜áŸ‰ážºáž“ុយ Start ដែល​អ្នក​ចង់​បង្កើážâ€‹áž•្លូវកាážáŸ‹â€‹áž‘ៅ​កម្មវិធី​​នáŸáŸ‡â€‹áŸ”​ អ្នក​កáŸâ€‹áž¢áž¶áž…​បញ្ចូលឈ្មោះមួយ​ដើម្បី​បង្កើážâ€‹ážážâ€‹ážáŸ’មីមួយទៀážâ€‹áŸ”" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "មិនបាច់​បង្កើážâ€‹áž•្លូវកាážáŸ‹â€‹" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "លុបកម្មវិធី​ $(^NameDA)​​ áž…áŸáž‰â€‹" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "លុបកម្មវិធី​ $(^NameDA) áž…áŸáž‰áž–ីកុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​។​" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "ážáž¾â€‹áž¢áŸ’នក​ប្រាកដ​ážáž¶â€‹áž“ឹង​ចាក​ចáŸáž‰â€‹áž–ី​ការ​ដំឡើង​កម្មវិធី​​ $(^Name) áž“áŸáŸ‡â€‹áž˜áŸ‚ន​ទáŸâ€‹?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "ážáž¾â€‹áž¢áŸ’នក​ប្រាកដ​ážáž¶â€‹áž“ឹង​ចាក​ចáŸáž‰â€‹áž–ី​ការ​លុបកម្មវិធី​​ $(^Name) áž“áŸáŸ‡â€‹áž˜áŸ‚ន​ទáŸâ€‹?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "ជ្រើសរើស​អ្នក​ប្រើប្រាស់​" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "ជ្រើសរើស​អ្នក​ប្រើប្រាស់​ទាំង​ឡាយណា​ដែល​អ្នក​ចង់​អោយ​ប្រើ​កម្មវិធី​ $(^NameDA)​ áž“áŸáŸ‡áŸ”​" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "សូមជ្រើសរើស​ážáž¶ážáž¾â€‹áž¢áŸ’នក​ចង់​ដំឡើង​កម្មវិធី $(^NameDA) សំរាប់​ážáŸ‚ážáŸ’លួន​អ្នក​ រឺ សំរាប់​អ្នករាល់​គ្នា​ដែល​ប្រើ​កុំព្យូទáŸážšâ€‹áž“áŸáŸ‡â€‹áŸ” $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "ដំឡើង​សំរាប់​អ្នកទាំង​ឡាយដែល​ប្រើ​កុំព្យូទáŸážšáž“áŸáŸ‡" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "ដំឡើងសំរាប់ážáŸ‚ážáŸ’ញុំម្នាក់​" !endif nsis-3.11/Contrib/Language files/Korean.nlf000077500000000000000000000125731477201124000205510ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1042 # Font and size - dash (-) means default 굴림 9 # Codepage - dash (-) means ASCII code page 949 # RTL - anything else than RTL means LTR - # Translation by dTomoyo dtomoyo@empal.com ( ~V2.0 BETA2 ) / By hardkoder@gmail.com (V2.0 BETA3 ~ ) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) 설치 # ^UninstallCaption $(^Name) 제거 # ^LicenseSubCaption : 사용권 계약 ë™ì˜ # ^ComponentsSubCaption : 설치 옵션 # ^DirSubCaption : í´ë” 지정 # ^InstallingSubCaption : íŒŒì¼ ì„¤ì¹˜ì¤‘ # ^CompletedSubCaption : 설치 완료 # ^UnComponentsSubCaption : 제거 옵션 # ^UnDirSubCaption : 제거 í´ë” # ^ConfirmSubCaption : í™•ì¸ # ^UninstallingSubCaption : 제거중 # ^UnCompletedSubCaption : 제거 완료 # ^BackBtn < 뒤로 # ^NextBtn ë‹¤ìŒ > # ^AgreeBtn ë™ì˜í•¨ # ^AcceptBtn 위 ì‚¬í•­ì— ë™ì˜í•©ë‹ˆë‹¤. # ^DontAcceptBtn ë™ì˜í•˜ì§€ 않습니다. # ^InstallBtn 설치 # ^UninstallBtn 제거 # ^CancelBtn 취소 # ^CloseBtn ë‹«ìŒ # ^BrowseBtn 찾아보기... # ^ShowDetailsBtn ìžì„¸ížˆ 보기 # ^ClickNext 계ì†í•˜ì‹œë ¤ë©´ '다ìŒ' ë²„íŠ¼ì„ ëˆŒëŸ¬ 주세요. # ^ClickInstall 설치를 시작하시려면 '설치' ë²„íŠ¼ì„ ëˆŒëŸ¬ 주세요. # ^ClickUninstall '제거' ë²„íŠ¼ì„ ëˆ„ë¥´ë©´ 제거가 시작ë©ë‹ˆë‹¤. # ^Name ì´ë¦„ # ^Completed 완료 # ^LicenseText $(^NameDA)(ì„)를 설치하기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤. ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 'ë™ì˜í•¨'ì„ ëˆŒëŸ¬ 주세요. # ^LicenseTextCB $(^NameDA)(ì„)를 설치하기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤. ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 아래 ì‚¬í•­ì„ ì²´í¬í•´ 주세요. $_CLICK # ^LicesnseTextRB $(^NameDA)(ì„)를 설치하기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤. ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 아래 ì˜µì…˜ì„ ì„ íƒí•´ 주세요. $_CLICK # ^UnLicenseText $(^NameDA)(ì„)를 제거하기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤. ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 'ë™ì˜í•¨'ì„ ëˆŒëŸ¬ 주세요. # ^UnLicenseTextCB $(^NameDA)(ì„)를 제거하기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤. ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 아래 ì‚¬í•­ì„ ì²´í¬í•´ 주세요. $_CLICK # ^UnLicesnseTextRB $(^NameDA)(ì„)를 제거하기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤. ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 아래 ì˜µì…˜ì„ ì„ íƒí•´ 주세요. $_CLICK # ^Custom ì‚¬ìš©ìž ì •ì˜ # ^ComponentsText 설치를 ì›í•˜ì‹œëŠ” 구성 요소를 ì„ íƒí•˜ì—¬ 주시기 ë°”ëžë‹ˆë‹¤. $_CLICK # ^ComponentsSubText1 설치 형태 ì„ íƒ: # ^ComponentsSubText2_NoInstTypes 설치하려는 구성 요소 ì„ íƒ: # ^ComponentsSubText2 구성요소 ì§ì ‘ ì„ íƒ: # ^UnComponentsText 제거를 ì›í•˜ëŠ” 구성 요소를 ì²´í¬í•´ 주시기 ë°”ëžë‹ˆë‹¤. $_CLICK # ^UnComponentsSubText1 제거 형태 ì„ íƒ: # ^UnComponentsSubText2_NoInstTypes 제거하려는 구성 요소 ì„ íƒ: # ^UnComponentsSubText2 제거하려는 구성요소 ì§ì ‘ ì„ íƒ: # ^DirText $(^NameDA)(ì„)를 ë‹¤ìŒ í´ë”ì— ì„¤ì¹˜í•  예정입니다. \r\n다른 í´ë”ì— ì„¤ì¹˜í•˜ê³  싶으시면 '찾아보기' ë²„íŠ¼ì„ ëˆŒëŸ¬ì„œ 다른 í´ë”를 ì„ íƒí•´ 주세요. $_CLICK # ^DirSubText 설치 í´ë” # ^DirBrowseText $(^NameDA)(ì„)를 ë‹¤ìŒ í´ë”ì— ì„¤ì¹˜í•©ë‹ˆë‹¤: # ^UnDirText $(^NameDA)(ì„)를 ë‹¤ìŒ í´ë”ì—서 제거할 예정입니다. \r\n다른 í´ë”ì—서 제거하고 싶으시면 '찾아보기' ë²„íŠ¼ì„ ëˆŒëŸ¬ì„œ 다른 í´ë”를 ì„ íƒí•´ 주세요. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA)(ì„)를 ë‹¤ìŒ í´ë”ì—서 제거 합니다: # ^SpaceAvailable "ë‚¨ì€ ë””ìŠ¤í¬ ê³µê°„: " # ^SpaceRequired "필요한 ë””ìŠ¤í¬ ê³µê°„: " # ^UninstallingText 시스템ì—서 $(^NameDA)(ì„)를 제거 í•  것입니다. $_CLICK # ^UninstallingText 제거 대ìƒ: # ^FileError ë‹¤ìŒ íŒŒì¼ì„ ì—´ 수 없습니다.: \r\n\t"$0"\r\n'중단'ì„ ëˆŒëŸ¬ 설치를 종료하거나,\r'다시 시ë„'를 눌러 다시 시ë„í•´ 보거나,\r'무시'를 눌러 ì´ íŒŒì¼ì„ 건너 뛰세요. # ^FileError_NoIgnore ë‹¤ìŒ íŒŒì¼ì„ ì—´ 수 없습니다.: \r\n\t"$0"\r\n'다시 시ë„'를 눌러 다시 시ë„í•´ 보거나,\r'취소'를 눌러 설치를 종료하세요. # ^CantWrite "기ë¡í•  수 ì—†ìŒ: " # ^CopyFailed 복사 실패 # ^CopyTo "íŒŒì¼ ë³µì‚¬ " # ^Registering "등ë¡ì¤‘: " # ^Unregistering "ë“±ë¡ í•´ì œì¤‘: " # ^SymbolNotFound "ì‹¬ë³¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: " # ^CouldNotLoad "불러올 수 ì—†ìŒ: " # ^CreateFolder "í´ë” ìƒì„±: " # ^CreateShortcut "바로 가기 ìƒì„±: " # ^CreatedUninstaller "ì–¸ì¸ìŠ¤í†¨ëŸ¬ ìƒì„±: " # ^Delete "íŒŒì¼ ì‚­ì œ: " # ^DeleteOnReboot "재부팅시 ì‚­ì œ: " # ^ErrorCreatingShortcut "바로 가기 ìƒì„± 오류: " # ^ErrorCreating "ìƒì„± 실패: " # ^ErrorDecompressing ì••ì¶• 해제중 오류 ë°œìƒ! 설치 파ì¼ì´ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤. # ^ErrorRegistering DLL ë“±ë¡ ì‹¤íŒ¨ # ^ExecShell "쉘 실행: " # ^Exec "실행: " # ^Extract "ì••ì¶• í•´ì œ: " # ^ErrorWriting "ì••ì¶• í•´ì œ: 파ì¼ì„ 기ë¡í•˜ëŠ” ë„중 오류 ë°œìƒ " # ^InvalidOpcode ì¸ìŠ¤í†¨ëŸ¬ ì†ìƒë¨: ìž˜ëª»ëœ ì‹¤í–‰ì½”ë“œ # ^NoOLE "OLE ì •ë³´ ì—†ìŒ: " # ^OutputFolder "ëŒ€ìƒ í´ë”: " # ^RemoveFolder "í´ë” ì‚­ì œ: " # ^RenameOnReboot "재부팅시 ì´ë¦„ 변경: " # ^Rename "ì´ë¦„ 변경: " # ^Skipped "건너뜀: " # ^CopyDetails ìžì„¸í•œ ë‚´ìš©ì„ í´ë¦½ë³´ë“œë¡œ 복사 # ^LogInstall 설치 로그 작성 # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Korean.nsh000077500000000000000000000174731477201124000205660ustar00rootroot00000000000000;Language: Korean (1042) ;By linak linak@korea.com ( ~ V2.0 BETA3 ) By kippler@gmail.com(www.kipple.pe.kr) ( V2.0 BETA3 ~ ) (last update:2007/09/05) !insertmacro LANGFILE "Korean" = "한국어" "Hangugeo" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) 설치를 시작합니다." ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ì´ í”„ë¡œê·¸ëž¨ì€ ë‹¹ì‹ ì˜ ì»´í“¨í„°ì— $(^NameDA)(ì„)를 설치할 것입니다.$\r$\n$\r$\n설치를 시작하기 ì „ 가능한 한 모든 í”„ë¡œê·¸ëž¨ì„ ì¢…ë£Œí•˜ì—¬ 주시기 ë°”ëžë‹ˆë‹¤. ì´ëŠ” ìž¬ë¶€íŒ…ì„ í•˜ì§€ ì•Šê³ ì„œë„ ì‹œìŠ¤í…œ 파ì¼ì„ 수정할 수 있게 í•´ì¤ë‹ˆë‹¤.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) 제거를 시작합니다." ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ì´ í”„ë¡œê·¸ëž¨ì€ ë‹¹ì‹ ì˜ ì»´í“¨í„°ì—서 $(^NameDA)(ì„)를 제거할 것입니다.$\r$\n$\r$\n제거를 시작하기 ì „ì— $(^NameDA)(ì„)를 종료하여 주시기 ë°”ëžë‹ˆë‹¤.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "사용권 계약" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)(ì„)를 설치하시기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 'ë™ì˜í•¨'ì„ ëˆŒëŸ¬ 주세요. $(^NameDA)(ì„)를 설치하기 위해서는 반드시 ë‚´ìš©ì— ë™ì˜í•˜ì…”야 합니다." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 아래 ì‚¬í•­ì„ ì„ íƒí•´ 주세요. $(^NameDA)(ì„)를 설치하기 위해서는 반드시 ë‚´ìš©ì— ë™ì˜í•˜ì…”야 합니다. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 첫 번째 ì‚¬í•­ì„ ì„ íƒí•´ 주세요. $(^NameDA)(ì„)를 설치하기 위해서는 반드시 ë‚´ìš©ì— ë™ì˜í•˜ì…”야 합니다. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "사용권 계약 ë™ì˜" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)(ì„)를 제거하시기 ì „ì— ì‚¬ìš©ê¶Œ 계약 ë‚´ìš©ì„ ì‚´íŽ´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 'ë™ì˜í•¨'ì„ ëˆŒëŸ¬ 주세요. $(^NameDA)(ì„)를 제거하기 위해서는 반드시 ë‚´ìš©ì— ë™ì˜í•˜ì…”야 합니다." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 아래 ì‚¬í•­ì„ ì„ íƒí•´ 주세요. $(^NameDA)(ì„)를 제거하기 위해서는 반드시 ë‚´ìš©ì— ë™ì˜í•˜ì…”야 합니다. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ë‚´ìš©ì— ë™ì˜í•˜ì…¨ë‹¤ë©´ 첫 번째 ì‚¬í•­ì„ ì„ íƒí•´ 주세요. $(^NameDA)(ì„)를 제거하기 위해서는 반드시 ë‚´ìš©ì— ë™ì˜í•˜ì…”야 합니다. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "사용권 계약 ë™ì˜ ì‚¬í•­ì˜ ë‚˜ë¨¸ì§€ ë¶€ë¶„ì„ ë³´ì‹œë ¤ë©´ [Page Down] 키를 눌러 주세요." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "구성 요소 ì„ íƒ" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "ì„¤ì¹˜í•˜ê³ ìž í•˜ëŠ” $(^NameDA)ì˜ êµ¬ì„± 요소를 ì„ íƒí•´ 주세요." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "구성 요소 ì„ íƒ" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "ì œê±°í•˜ê³ ìž í•˜ëŠ” $(^NameDA)ì˜ êµ¬ì„± 요소를 ì„ íƒí•´ 주세요." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ìƒì„¸ 설명" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ìƒì„¸ ì„¤ëª…ì„ ë³´ê³  싶으신 ë¶€ë¶„ì— ë§ˆìš°ìŠ¤ë¥¼ 올려놓으세요." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ìƒì„¸ ì„¤ëª…ì„ ë³´ê³  싶으신 ë¶€ë¶„ì„ ì„ íƒí•˜ì„¸ìš”." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "설치 위치 ì„ íƒ" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)(ì„)를 설치할 í´ë”를 ì„ íƒí•´ 주세요." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "제거 위치 ì„ íƒ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)(ì„)를 제거할 í´ë”를 ì„ íƒí•´ 주세요." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "설치중" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)(ì„)를 설치하는 ë™ì•ˆ 잠시 기다려 주세요." ${LangFileString} MUI_TEXT_FINISH_TITLE "설치 완료" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "설치가 성공ì ìœ¼ë¡œ 완료ë˜ì—ˆìŠµë‹ˆë‹¤." ${LangFileString} MUI_TEXT_ABORT_TITLE "설치 취소" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "프로그램 설치가 취소ë˜ì—ˆìŠµë‹ˆë‹¤." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "제거중" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA)(ì„)를 제거하는 ë™ì•ˆ 잠시 기다려 주시기 ë°”ëžë‹ˆë‹¤." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "제거 마침" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "í”„ë¡œê·¸ëž¨ì„ ì„±ê³µì ìœ¼ë¡œ 제거하였습니다." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "프로그램 제거 취소" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "프로그램 제거가 취소ë˜ì—ˆìŠµë‹ˆë‹¤." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) 설치 완료" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)ì˜ ì„¤ì¹˜ê°€ 완료ë˜ì—ˆìŠµë‹ˆë‹¤.$\r$\n$\r$\n설치 í”„ë¡œê·¸ëž¨ì„ ë§ˆì¹˜ë ¤ë©´ '마침' ë²„íŠ¼ì„ ëˆŒëŸ¬ 주세요." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)ì˜ ì„¤ì¹˜ë¥¼ 완료하기 위해서는 ì‹œìŠ¤í…œì„ ë‹¤ì‹œ 시작해야 합니다. 지금 재부팅 하시겠습니까?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) 제거 완료" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA)ì˜ ì œê±°ê°€ 완료 ë˜ì—ˆìŠµë‹ˆë‹¤.$\r$\n$\r$\n설치 í”„ë¡œê·¸ëž¨ì„ ë§ˆì¹˜ë ¤ë©´ '마침' ë²„íŠ¼ì„ ëˆŒëŸ¬ 주세요." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)ì˜ ì œê±°ë¥¼ 완료하기 위해서는 ì‹œìŠ¤í…œì„ ë‹¤ì‹œ 시작해야 합니다. 지금 재부팅 하시겠습니까?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "지금 재부팅 하겠습니다." ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ë‚˜ì¤‘ì— ìž¬ë¶€íŒ… 하겠습니다." ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) 실행하기(&R)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Readme íŒŒì¼ ë³´ê¸°(&S)" ${LangFileString} MUI_BUTTONTEXT_FINISH "마침" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "시작 메뉴 í´ë” ì„ íƒ" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "í”„ë¡œê·¸ëž¨ì˜ ë°”ë¡œ 가기 ì•„ì´ì½˜ì´ ìƒì„±ë  시작 메뉴 í´ë” ì„ íƒ." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "í”„ë¡œê·¸ëž¨ì˜ ë°”ë¡œ 가기 ì•„ì´ì½˜ì´ ìƒì„±ë  시작 메뉴 í´ë”를 ì„ íƒí•˜ì„¸ìš”. 새로운 í´ë”를 ìƒì„±í•˜ë ¤ë©´ í´ë” ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "바로 가기 ì•„ì´ì½˜ì„ 만들지 않겠습니다." !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) 제거" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) 제거하기" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) 설치를 취소하시겠습니까?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) 제거를 취소하시겠습니까?" !endif nsis-3.11/Contrib/Language files/Kurdish.nlf000077500000000000000000000133351477201124000207400ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID (none exists for Kurdish at this time) 9999 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1254 # RTL - anything else than RTL means LTR - # Translation by Rêzan Tovjîn(chagy) (retovjin@hotmail.com.com) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Sazkirin # ^UninstallCaption $(^Name) Rakirin # ^LicenseSubCaption : Peymana Lîsansê # ^ComponentsSubCaption : Vebijêrkên Sazkirinê # ^DirSubCaption : Peldanka Sazkirinê # ^InstallingSubCaption : Tê Sazkirin # ^CompletedSubCaption : Qediya # ^UnComponentsSubCaption : Vebijêrkên Rakirinê # ^UnDirSubCaption : Peldanka Rakirinê # ^ConfirmSubCaption : Erêkirin # ^UninstallingSubCaption : Tê Rakirin # ^UnCompletedSubCaption : Qediya # ^BackBtn < &Vegere # ^NextBtn &Bidomîne > # ^AgreeBtn &Ez Dipejirînim # ^AcceptBtn Åžertên Peymanê &Dipejirînim # ^DontAcceptBtn Åžertên Peymanê Napejirînim # ^InstallBtn &Saz Bike # ^UninstallBtn &Rake # ^CancelBtn Betal # ^CloseBtn &Bigire # ^BrowseBtn &Çavlêgerîn... # ^ShowDetailsBtn Hûragahiyan &Nîşan Bide # ^ClickNext Ji bo berdewamê 'Bidomîne'yê bitikîne. # ^ClickInstall Ji bo destpêka sazkirinê 'Saz Bike'yê bitikîne. # ^ClickUninstall Ji bo destpêka rakirinê 'Rake' bitikîne. # ^Name nav # ^Completed Qediya # ^LicenseText Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, çavekî li peymana lîsansê bigerîne. Heke tu hemû ÅŸertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîne. # ^LicenseTextCB Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, çavekî li peymana lîsansê bigerîne. Heke tu hemû ÅŸertan dipejirînî, zeviya erêkirinê ya jêrîn dagire. $_CLICK # ^LicenseTextRB Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî çavekî li peymana lîsansê bigerîne. Heke tu hemû ÅŸertên peymanê dipejirînî, zeviya vebijêrkê ya jêrîn dagire. $_CLICK # ^UnLicenseText Ji kerema xwe re berî tu bernameya $(^NameDA) rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû ÅŸertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîn. # ^UnLicenseTextCB Ji kerema xwe re berî tu bernameya $(^NameDA) ji pergala xwe rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû ÅŸertên peymanê dipejirînî, zeviya jêrîn a erêkirinê dagire. $_CLICK # ^UnLicenseTextRB Ji kerema xwe re berî tu bernameya $(^NameDA) ji pergala xwe rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû ÅŸertên peymanê dipejirînî, zeviya vebijêrkê ya jêrîn dagire. $_CLICK # ^Custom Taybet # ^ComponentsText Beşên tu dixwazî saz bikî hilbijêre û niqirên 'check' beşên tu naxwazî werin sazkirin rake. $_CLICK # ^ComponentsSubText1 Awayê sazkirinê hilbijêre: # ^ComponentsSubText2_NoInstTypes Beşên dê werin sazkirin hilbijêre: # ^ComponentsSubText2 an jî, beşên beşên tu dixwazî werin sazkirin hilbijêre: # ^UnComponentsText Beşên tu dixwazî rakî hilbijêre, an jî niqira 'check'a ber beşên tu daxwazî were rakirin, rake. $_CLICK # ^UnComponentsSubText1 Awayê rakirinê hilbijêre: # ^UnComponentsSubText2_NoInstTypes Beşên dê werin rakirin hilbijêre: # ^UnComponentsSubText2 an jî beşên tu dixwazî werin rakirin hilbijêre: # ^DirText $(^NameDA) dê ji aliyê sazkirinê ve li peldanka jêrîn were sazkirin. Ji bo tu li peldankeke din saz bikî 'Çavlêgerîn'ê bitikîne û peldankeke din hilbijêre. $_CLICK # ^DirSubText Peldanka Armanckirî # ^DirBrowseText Peldanka tu dixwazî bernameya $(^NameDA) lê were sazkirin hilbijêre: # ^UnDirText $(^NameDA) dê ji aliyê sazkirinê ve ji peldanka jêrîn were rakirin. Ji bo tu ji peldankeke cuda rakî 'Çavlêgerîn'ê bitikîne û peldankeke din hilbijêre. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Peldanka tu dixwazî bernameya $(^NameDA) jê were rakirin hilbijêre: # ^SpaceAvailable "Herêma vala ku dikare were bikaranîn: " # ^SpaceRequired "Herêma vala ya pêwist: " # ^UninstallingText Bernameya $(^NameDA) dê ji peldanka jêrîn were rakirin. $_CLICK # ^UninstallingSubText tê rakirin: # ^FileError Dosya ji bo nivîsandinê venebû: \r\n\t"$0"\r\nJi bo destjêberdana sazkirinê abort'ê bitikîne,\r\nji bo ceribandina ji nû ve retry'ê , an jî\r\nji bo tu dosiyê tune bihesibînî û berdewam bikî ignore'yê bitikîne # ^FileError_NoIgnore Dosya ji bo nivîsandinê vebenebû: \r\n\t"$0"\r\nJi bo nivîsandina ji nû ve retry'yê, an jî\r\nJi bo destjêberdana sazkirinê abort'ê hilbijêre # ^CantWrite "Nehate Nivîsandin: " # ^CopyFailed Çewtiya Jibergirtinê # ^CopyTo "Ji Ber Bigire " # ^Registering "Tê Tomarkirin: " # ^Unregistering "Tomarî Tê Jêbirin: " # ^SymbolNotFound "Dawêr Nehate Dîtin: " # ^CouldNotLoad "Nehate Barkirin: " # ^CreateFolder "Peldankê Çêke: " # ^CreateShortcut "Kineriyê Çêke: " # ^CreatedUninstaller "Sêrbazê Rakirinê Hate Çêkirin: " # ^Delete "Dosyayê Jê Bibe: " # ^DeleteOnReboot "Dema ji nû ve dest pê kir dosiyê jê bibe: " # ^ErrorCreatingShortcut "Dema çêkirina kineriyê çewtî derket: " # ^ErrorCreating "Çewtiya çêkirinê: " # ^ErrorDecompressing Di dema vekirina daneyan de çewtî derket! Sazkirina Çewt? # ^ErrorRegistering Çewtiya tomariya DLL # ^ExecShell "Qalikê Xebatê: " # ^Exec "Bixebitîne: " # ^Extract "Veke: " # ^ErrorWriting "Veke: Dema li dosiyê hate nivîsîn çewtiyek derket " # ^InvalidOpcode Sazkirina Xirabe: koda nerast pêkanînê # ^NoOLE "OLE nehate dîtin: " # ^OutputFolder "Peldanka derketinê: " # ^RemoveFolder "Peldankê jê bibe: " # ^RenameOnReboot "Dema ji nû hate destpêkirin ji nû ve bi nav bike: " # ^Rename "Nav Biguhere: " # ^Skipped "Hate gavkirin: " # ^CopyDetails Hûragahiyan li Pano'yê binivîse # ^LogInstall Pêkanîna sazkirinê li lênûska rewşê binivîse # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Kurdish.nsh000077500000000000000000000174461477201124000207600ustar00rootroot00000000000000;Language: Kurdish ;By Rêzan Tovjîn ;Updated by Erdal Ronahî (erdal.ronahi@gmail.com) !insertmacro LANGFILE "Kurdish" = "Kurdî" "Kurdi" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Tu bi xêr hatî sêrbaziya sazkirinê" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ev sêrbaz dê di dema sazkirina $(^NameDA) de rêberiya te bike.$\r$\n$\r$\nBerî tu dest bi sazkirinê bikî, em pêşniyar dikin tu hemû bernameyên vekirî bigirî. Bi vî rengî beyî tu komputera ji nû ve vekî dê hinek dosiyên pergalê bêpirsgirêk werin sazkirin.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Tu bi xêr hatî sêrbaziya rakirina bernameya $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ev sêrbaz ji bo rakirina bernameya $(^NameDA) dê alîkariya te bike.$\r$\n$\r$\nBerî tu dest bi rakirina bernameyê bikî, bernameyên vekirî hemûyan bigire. Bi vî rengî dû re tu mecbûr namînî ku komputera xwe bigirî û ji nû ve veki.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Peymana Lîsansê" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, peymana lîsansê bixwîne." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Heke tu ÅŸertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîne. Ji bo sazkirina bernameya $(^NameDA) divê tu ÅŸertên peymanê bipejirînî." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Heke tu ÅŸertên peymanê dipejirînî, zeviya piÅŸtrastkirinê ya jêrîn dagire. Ji bo tu bikarî bernameya $(^NameDA) saz bikî divê tu ÅŸertên peymanê bipejirînî. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Heke tu ÅŸertên peymanê dipejirînî, biÅŸkojka erêkirinê ya jêrîn bitikîne. Ji bo sazkirina bernameya $(^NameDA) divê tu ÅŸertên peymanê bipejirînî. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Peymana Lîsansê" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Berî tu bernameya $(^NameDA) ji pergala xwe rakî peymanê bixwîne." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Heke tu ÅŸertên peymanê dipejirînî, 'Dipejirînim'ê bitikîne. Ji bo rakirina bernameya $(^NameDA) divê tu ÅŸertên peymanê bipejirînî." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Heke tu ÅŸertên peymanê dipejirînî, zeviya erêkirinê ya jêrîn dagire. Ji bo tu bernameya $(^NameDA) ji pergala xwe rakî divê tu peymanê bipejirînî. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Heke tu ÅŸertên peymanê dipejirînî, biÅŸkojka erêkirinê ya jêrîn hilbijêre. Ji bo tu bernameya $(^NameDA) ji pergala xwe rakî divê tu ÅŸertên peymanê bipejirînî. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ji bo dûmahîka peymanê biÅŸkojka 'page down' bitikîne." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Hilbijartina pareyan" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Ji bo sazkirina $(^NameDA) pareyên tu dixwazî hilbijêre." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Hilbijartina Pareyan" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pareya bernameya $(^NameDA) ku tu dixwazî rakî hilbijêre." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Dazanîn" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ji bo tu der barê pareyan de agahiyan bistînî nîşanekê bibe ser pareyekê." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ji bo tu der barê pareyan de agahiyan bistînî pareyekê hilbijêre." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hilbijartina peldanka armanckirî" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Peldanka tu dixwazî bernameya $(^NameDA) tê de were sazkirin hilbijêre." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Hilbijartina Peldanka Dê Were Rakirin" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Peldanka bernameya $(^NameDA) ku tudixwazî rakî hilbijêre." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Tê sazkirin" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ji kerema xwe re heta sazkirina $(^NameDA) biqede raweste." ${LangFileString} MUI_TEXT_FINISH_TITLE "Sazkirin Qediya" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Sazkirin bi serkeftinî qediya." ${LangFileString} MUI_TEXT_ABORT_TITLE "Sazkirin hate betalkirin" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Sazkirin be tevahî qediya." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Tê rakirin" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Heta bernameya $(^NameDA) ji pergala te were rakirin raweste." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Rakirina Bernameyê Biqedîne" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Rakirina bernameyê bi serkeftin pêk hat." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Rakirina bernameyê hate betalkirin" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Rakirina bernameyê neqediya." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Sêrbaziya sazkirina $(^NameDA) diqede." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) li komputera te hate barkirin.$\r$\n$\r$\n'Biqedîne'yê bitikîne û sazkirinê bi dawî bîne." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ji bo bidawîkirina sazkirina $(^NameDA) divê tu komputerê ji nû ve vekî.Tu dixwazî komputerê ji nû ve vekî?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Sêrbaziya Rakirina Bernameya $(^NameDA) Tê Temamkirin" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Bernameya $(^NameDA) ji pergale hate rakirin.$\r$\n$\r$\nJi bo girtina sêrbaz 'biqedîne'yê bitikîne." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ji bo rakirina bernameya $(^NameDA) biqede divê tu komputera xwe ji nû ve vekî. Tu dixwazî niha komputera te were girtin û ji nû ve dest pê bike?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ji nû ve veke" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ezê paşê ji nû ve vekim." ${LangFileString} MUI_TEXT_FINISH_RUN "Bernameya $(^NameDA) bixebitîne" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Dosiya min bixwîne/readme &nîşan bide" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Biqedîne" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Hilbijartina Peldanka Pêşeka Destpêkê" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Peldanka pêşeka destpêkê ya ku dê kineriya $(^NameDA) tê de were bikaranîn hilbijêre." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Peldanka pêşeka destpêkê ya ku dê kineriya bernameyê tê de were bicihkirin hilbijêre. Tu dikarî bi navekî nû peldankeke nû ava bikî." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Bêyî çêkirina kineriyê bidomîne" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Bernameya $(^NameDA) Rake" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Rakirina bernameya $(^NameDA) ji pergala te." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Tu bawer î ku dixwazî ji sazkirina $(^Name) derkevî?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Tu bawer î ku dixwazî dest ji rakirina bernameya $(^Name) berdî?" !endif nsis-3.11/Contrib/Language files/Latvian.nlf000077500000000000000000000127451477201124000207310ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1062 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1257 # RTL - anything else than RTL means LTR - # Translation by Valdis GriÄ·is (valmiera-9@inbox.lv) # Corrections by Kristaps Meņģelis / x-f (x-f 'AT' inbox.lv) # ^Branding Nullsoft Install System %s # ^SetupCaption '$(^Name)' UzstÄdīšana # ^UninstallCaption '$(^Name)' Atinstalēšana # ^LicenseSubCaption : Licences lÄ«gums # ^ComponentsSubCaption : UzstÄdīšanas opcijas # ^DirSubCaption : UzstÄdīšanas mape # ^InstallingSubCaption : Notiek uzstÄdīšana # ^CompletedSubCaption : UzstÄdīšana pabeigta. # ^UnComponentsSubCaption : Atinstalēšanas opcijas # ^UnDirSubCaption : Atinstalēšanas mape # ^ConfirmSubCaption : ApstiprinÄÅ¡ana # ^UninstallingSubCaption : Notiek atinstalēšana # ^UnCompletedSubCaption : Atinstalēšana pabeigta # ^BackBtn < &Atpakaļ # ^NextBtn &TÄlÄk > # ^AgreeBtn Es &piekrÄ«tu # ^AcceptBtn Es &piekrÄ«tu licences lÄ«guma noteikumiem # ^DontAcceptBtn Es &nepiekrÄ«tu licences lÄ«guma noteikumiem # ^InstallBtn &UzstÄdÄ«t # ^UninstallBtn &AtinstalÄ“t # ^CancelBtn Atcelt # ^CloseBtn Ai&zvÄ“rt # ^BrowseBtn PÄ&rlÅ«kot... # ^ShowDetailsBtn ParÄdÄ«t &detaļas # ^ClickNext Spiediet 'TÄlÄk', lai turpinÄtu. # ^ClickInstall Spiediet 'UzstÄdÄ«t', lai sÄktu uzstÄdīšanas procesu. # ^ClickUninstall Spiediet 'AtinstalÄ“t', lai sÄktu atinstalēšanas procesu. # ^Name VÄrds # ^Completed UzstÄdīšana pabeigta # ^LicenseText LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' uzstÄdīšanas. Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad spiediet 'Es piekrÄ«tu'. # ^LicenseTextCB LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' uzstÄdīšanas. Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad atzÄ«mÄ“jiet izvÄ“les rÅ«tiņu. $_CLICK # ^LicenseTextRB LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' uzstÄdīšanas. Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad izvÄ“lieties pirmo zemÄkesoÅ¡o opciju. $_CLICK # ^UnLicenseText LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' atinstalēšanas. Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad spiediet 'Es piekrÄ«tu'. # ^UnLicenseTextCB LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' atinstalēšanas. Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad atzÄ«mÄ“jiet izvÄ“les rÅ«tiņu. $_CLICK # ^UnLicenseTextRB LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' atinstalēšanas. Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad izvÄ“lieties zemÄkesoÅ¡o opciju. $_CLICK # ^Custom PielÄgots # ^ComponentsText IzvÄ“lieties, kurus komponentus vÄ“laties uzstÄdÄ«t un neiezÄ«mÄ“jiet tos, kurus nevÄ“laties uzstÄdÄ«t. $_CLICK # ^ComponentsSubText1 IzvÄ“lieties uzstÄdīšanas veidu: # ^ComponentsSubText2_NoInstTypes IzvÄ“lieties uzstÄdÄmos komponentus: # ^ComponentsSubText2 Vai arÄ« – izvÄ“lieties tikai nepiecieÅ¡amos komponentus, kurus vÄ“laties uzstÄdÄ«t: # ^UnComponentsText IzvÄ“lieties, kurus komponentus atinstalÄ“t un neiezÄ«mÄ“jiet tos, kurus nevÄ“laties atinstalÄ“t. $_CLICK # ^UnComponentsSubText1 IzvÄ“lieties atinstalēšanas veidu: # ^UnComponentsSubText2_NoInstTypes IzvÄ“lieties atinstalÄ“jamos komponentus: # ^UnComponentsSubText2 Vai arÄ« – izvÄ“lieties tikai nepiecieÅ¡amos komponentus, kurus vÄ“laties atinstalÄ“t: # ^DirText '$(^NameDA)' tiks uzstÄdÄ«ta Å¡ajÄ mapÄ“. Lai to uzstÄdÄ«tu citÄ mapÄ“, nospiediet 'PÄrlÅ«kot' un izvÄ“lieties citu mapi. $_CLICK # ^DirSubText UzstÄdīšanas mape # ^DirBrowseText IzvÄ“lieties mapi, kurÄ uzstÄdÄ«t '$(^NameDA)': # ^UnDirText '$(^NameDA)' tiks atinstalÄ“ta no šīs mapes. Lai to atinstalÄ“tu no citas mapes, nospiediet 'PÄrlÅ«kot' un izvÄ“lieties citu mapi. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText IzvÄ“lieties mapi, no kuras atinstalÄ“t '$(^NameDA)': # ^SpaceAvailable "Pieejamais diska apjoms: " # ^SpaceRequired "NepiecieÅ¡amais diska apjoms: " # ^UninstallingText '$(^NameDA)' tiks atinstalÄ“ta no šīs mapes. $_CLICK # ^UninstallingSubText Atinstalēšana no: # ^FileError Kļūda atverot failu rakstīšanai: \r\n\t"$0"\r\nNospiediet 'Atcelt', lai atceltu uzstÄdīšanas procesu,\r\n'MēģinÄt vÄ“lreiz', lai atkÄrtoti mēģinÄtu rakstÄ«t failÄ vai\r\n'IgnorÄ“t', lai izlaistu šī faila uzstÄdīšanu # ^FileError_NoIgnore Kļūda atverot failu rakstīšanai: \r\n\t"$0"\r\nNospiediet 'Atcelt', lai pÄrtrauktu uzstÄdīšanas procesu # ^CantWrite "Nevar ierakstÄ«t: " # ^CopyFailed Kopēšana neizdevÄs # ^CopyTo "KopÄ“ uz " # ^Registering "ReÄ£istrÄ“: " # ^Unregistering "AtreÄ£istrÄ“: " # ^SymbolNotFound "Simbols nav atrasts: " # ^CouldNotLoad "Nav iespÄ“jams ielÄdÄ“t: " # ^CreateFolder "Izveido mapi: " # ^CreateShortcut "Izveido saÄ«sni: " # ^CreatedUninstaller "Izveidots atinstalÄ“tÄjs: " # ^Delete "Dzēš failu: " # ^DeleteOnReboot "DzÄ“st pÄ“c pÄrstartēšanas: " # ^ErrorCreatingShortcut "Kļūda veidojot saÄ«sni: " # ^ErrorCreating "Kļūda veidojot: " # ^ErrorDecompressing Kļūda atkompresÄ“jot datus! BojÄta instalÄcija? # ^ErrorRegistering Kļūda reÄ£istrÄ“jot DLL failu # ^ExecShell "Izpilda ÄaulÄ: " # ^Exec "Izpilda: " # ^Extract "Atspiež: " # ^ErrorWriting "AtspieÅ¡ana: kļūda rakstot failÄ " # ^InvalidOpcode InstalÄcija bojÄta: nederÄ«gs CRC kods # ^NoOLE "Nav OLE priekÅ¡: " # ^OutputFolder "Izvades mape: " # ^RemoveFolder "Dzēš mapi: " # ^RenameOnReboot "PÄrsaukt pÄ“c pÄrstartēšanas: " # ^Rename "PÄrsaukt: " # ^Skipped "Izlaists: " # ^CopyDetails IekopÄ“t detaļas starpliktuvÄ“ # ^LogInstall IerakstÄ«t žurnÄla failÄ uzstÄdīšanas procesu # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Latvian.nsh000077500000000000000000000167661477201124000207510ustar00rootroot00000000000000;Language: LatvieÅ¡u [Latvian] - (1062) ;By Valdis GriÄ·is ;Corrections by Kristaps Meņģelis / x-f (x-f 'AT' inbox.lv) !insertmacro LANGFILE "Latvian" = "LatvieÅ¡u" "Latviesu" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Esiet sveicinÄti '$(^NameDA)' uzstÄdīšanas vednÄ«" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Å is uzstÄdīšanas vednis jums palÄ«dzÄ“s veikt '$(^NameDA)' uzstÄdīšanu.$\r$\n$\r$\nÄ»oti ieteicams aizvÄ“rt citas programmas pirms šīs programmas uzstÄdīšanas veikÅ¡anas. Tas ļaus atjaunot svarÄ«gus sistÄ“mas failus bez datora pÄrstartēšanas.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Esiet sveicinÄti '$(^NameDA)' atinstalēšanas vednÄ«" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Å is vednis jums palÄ«dzÄ“s veikt '$(^NameDA)' atinstalēšanu.$\r$\n$\r$\nPirms sÄkt atinstalēšanas procesu, pÄrliecinieties, vai '$(^NameDA)' paÅ¡laik nedarbojas.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licences lÄ«gums" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' uzstÄdīšanas." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ja piekrÄ«tat licences lÄ«guma noteikumiem, spiediet 'PiekrÄ«tu', lai turpinÄtu uzstÄdīšanu. Jums ir jÄpiekrÄ«t licences noteikumiem, lai uzstÄdÄ«tu '$(^NameDA)'." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad atzÄ«mÄ“jiet izvÄ“les rÅ«tiņu. Jums ir jÄpiekrÄ«t licences noteikumiem, lai uzstÄdÄ«tu '$(^NameDA)'. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad izvÄ“lieties pirmo zemÄkesoÅ¡o opciju. Jums ir jÄpiekrÄ«t licences noteikumiem, lai uzstÄdÄ«tu '$(^NameDA)'. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licences lÄ«gums" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "LÅ«dzu izlasiet licences lÄ«gumu pirms '$(^NameDA)' atinstalēšanas." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ja piekrÄ«tat licences noteikumiem, spiediet 'PiekrÄ«tu', lai turpinÄtu. Jums ir jÄpiekrÄ«t licences noteikumiem, lai atinstalÄ“tu '$(^NameDA)'." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad iezÄ«mÄ“jiet izvÄ“les rÅ«tiņu. Jums ir jÄpiekrÄ«t licences noteikumiem, lai atinstalÄ“tu '$(^NameDA)'. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ja piekrÄ«tat licences lÄ«guma noteikumiem, tad izvÄ“lieties pirmo zemÄkesoÅ¡o opciju. Jums ir jÄpiekrÄ«t licences noteikumiem, lai atinstalÄ“tu '$(^NameDA)'. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Spiediet 'Page Down', lai aplÅ«kotu visu lÄ«gumu." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "IzvÄ“lieties komponentus" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "IzvÄ“lieties nepiecieÅ¡amÄs '$(^NameDA)' sastÄvdaļas, kuras uzstÄdÄ«t." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "IzvÄ“lieties komponentus" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "IzvÄ“lieties nepiecieÅ¡amÄs '$(^NameDA)' sastÄvdaļas, kuras atinstalÄ“t." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Apraksts" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Novietojiet peles kursoru uz komponenta, lai tiktu parÄdÄ«ts tÄ apraksts." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "IzvÄ“lieties uzstÄdīšanas mapi" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "IzvÄ“lieties mapi, kurÄ uzstÄdÄ«t '$(^NameDA)'." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "IzvÄ“lieties atinstalēšanas mapi" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "IzvÄ“lieties mapi, no kuras notiks '$(^NameDA)' atinstalēšana." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Notiek uzstÄdīšana" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "LÅ«dzu uzgaidiet, kamÄ“r notiek '$(^NameDA)' uzstÄdīšana." ${LangFileString} MUI_TEXT_FINISH_TITLE "UzstÄdīšana pabeigta" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "UzstÄdīšana noritÄ“ja veiksmÄ«gi." ${LangFileString} MUI_TEXT_ABORT_TITLE "UzstÄdīšana atcelta" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "UzstÄdīšana nenoritÄ“ja veiksmÄ«gi." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Notiek atinstalēšana" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "LÅ«dzu uzgaidiet, kamÄ“r '$(^NameDA)' tiek atinstalÄ“ta." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Atinstalēšana pabeigta" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Atinstalēšana noritÄ“ja veiksmÄ«gi." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Atinstalēšana atcelta" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Atinstalēšana nenoritÄ“ja veiksmÄ«gi." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Tiek pabeigta '$(^NameDA)' uzstÄdīšana" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "'$(^NameDA)' tika veiksmÄ«gi uzstÄdÄ«ta jÅ«su datorÄ.$\r$\n$\r$\nNospiediet 'Pabeigt', lai aizvÄ“rtu vedni." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "JÅ«su datoru ir nepiecieÅ¡ams pÄrstartÄ“t, lai pabeigtu '$(^NameDA)' uzstÄdīšanu. Vai vÄ“laties pÄrstartÄ“t datoru tÅ«lÄ«t?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Tiek pabeigta '$(^NameDA)' atinstalÄcija" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "'$(^NameDA)' tika veiksmÄ«gi izdzÄ“sta no jÅ«su datora.$\r$\n$\r$\nNospiediet 'Pabeigt', lai aizvÄ“rtu vedni." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "JÅ«su datoru nepiecieÅ¡ams pÄrstartÄ“t, lai pabeigtu '$(^NameDA)' atinstalēšanu. Vai vÄ“laties pÄrstartÄ“t datoru tÅ«lÄ«t?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "PÄrstartÄ“t tÅ«lÄ«t" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Es vÄ“los pÄrstartÄ“t pats vÄ“lÄk" ${LangFileString} MUI_TEXT_FINISH_RUN "P&alaist '$(^NameDA)'" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Pa&rÄdÄ«t LasiMani failu" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Pabeigt" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "IzvÄ“lieties 'Start Menu' folderi" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "IzvÄ“lieties 'Start Menu' mapi '$(^NameDA)' saÄ«snÄ“m." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "IzvÄ“lieties 'Start Menu' mapi, kurÄ tiks izveidotas programmas saÄ«snes. Varat arÄ« pats izveidot jaunu mapi." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Neveidot saÄ«snes" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "'$(^NameDA)' atinstalēšana" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "DzÄ“st '$(^NameDA)' no jÅ«su datora." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Vai tieÅ¡Äm vÄ“laties pÄrtraukt '$(^Name)' uzstÄdīšanu?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Vai tieÅ¡Äm vÄ“laties pÄrtraukt '$(^Name)' atinstalēšanu?" !endif nsis-3.11/Contrib/Language files/Lithuanian.nlf000077500000000000000000000123221477201124000214160ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1063 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1257 # RTL - anything else than RTL means LTR - # Translation by Vytautas Krivickas (Vytautas) # Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.03.24 # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Ä®diegimas # ^UninstallCaption $(^Name) Å alinti # ^LicenseSubCaption : Naudojimo sutartis # ^ComponentsSubCaption : Ä®diegimo nustatymai # ^DirSubCaption : Ä®diegimo katalogas # ^InstallingSubCaption : Ä®diegiama # ^CompletedSubCaption : Baigta # ^UnComponentsSubCaption : IÅ¡trinimo nustatymai # ^UnDirSubCaption : IÅ¡trinimo katalogas # ^ConfirmSubCaption : Patvirtinimas # ^UninstallingSubCaption : Panaikinama # ^UnCompletedSubCaption : Baigta # ^BackBtn < &Atgal # ^NextBtn &Toliau > # ^AgreeBtn AÅ¡ &sutinku # ^AcceptBtn AÅ¡ &sutinku su naudojimo sutarties sÄ…lygomis # ^DontAcceptBtn AÅ¡ &nesutinku su naudojimo sutarties sÄ…lygomis # ^InstallBtn &Ä®diegti # ^UninstallBtn &Panaikinti # ^CancelBtn Nutraukti # ^CloseBtn &Uždaryti # ^BrowseBtn P&asirinkti... # ^ShowDetailsBtn Parodyti &detales # ^ClickNext Paspauskite toliau # ^ClickInstall Paspauskite įdiegti # ^ClickUninstall Paspauskite iÅ¡trinti # ^Name Vardas # ^Completed Baigta # ^LicenseText PraÅ¡ome perskaityti sutartį prieÅ¡ įdiegdami $(^NameDA). Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, spauskite Sutinku. # ^LicenseTextCB PraÅ¡ome perskaityti sutartį prieÅ¡ įdiegdami $(^NameDA). Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, padÄ—kite varnelÄ™ tam skirtame laukelyje. $_CLICK # ^LicenseTextRB PraÅ¡ome perskaityti sutartį prieÅ¡ įdiegdami $(^NameDA). Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, pasirinkite pirmÄ… pasirinkimÄ… esantį žemiau. $_CLICK # ^UnLicenseText PraÅ¡ome perskaityti sutartį prieÅ¡ iÅ¡trinant $(^NameDA). Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, spauskite Sutinku. # ^UnLicenseTextCB PraÅ¡ome perskaityti sutartį prieÅ¡ iÅ¡trinant $(^NameDA). Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, padÄ—kite varnelÄ™ tam skirtame laukelyje. $_CLICK # ^UnLicenseTextRB PraÅ¡ome perskaityti sutartį prieÅ¡ iÅ¡trinant $(^NameDA). Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, pasirinkite pirmÄ… pasirinkimÄ… esantį žemiau. $_CLICK # ^Custom Kitoks # ^ComponentsText PadÄ—kite varneles laukeliuose komponentų kuriuos norite įdiegti ir nuimkite nuo kurių nenorite įdiegti. $_CLICK # ^ComponentsSubText1 Pasirinkite įdiegimo bÅ«dÄ…: # ^ComponentsSubText2_NoInstTypes Pasirinkite komponentus, kuriuos įdiegti: # ^ComponentsSubText2 Arba, pasirinkite neprivalomus komponentus, kuriuos jÅ«s norite įdiegti: # ^UnComponentsText PadÄ—kite varneles laukeliuose komponentų kuriuos norite paÅ¡alinti ir nuimkite nuo kurių nenorite paÅ¡alinti. $_CLICK # ^UnComponentsSubText1 Pasirinkite Å¡alinimo bÅ«dÄ…: # ^UnComponentsSubText2_NoInstTypes Pasirinkite komponentus, kuriuos Å¡alinti: # ^UnComponentsSubText2 Arba, pasirinkite neprivalomus komponentus, kuriuos jÅ«s norite paÅ¡alinti: # ^DirText Ä®diegimas dabar įdiegs $(^NameDA) Å¡iame kataloge. Jeigu norite pakeisti šį katalogÄ…, paspauskite Pasirinkti. $_CLICK # ^DirSubText Ä®diegimo katalogas # ^DirBrowseText Pasirinkite katalogÄ…, kur įdiegti $(^NameDA): # ^UnDirText Ä®diegimas dabar paÅ¡alins $(^NameDA) iÅ¡ Å¡io katalogo. Jeigu norite pakeisti šį katalogÄ… paspauskite Pasirinkti. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Pasirinkite katalogÄ… iÅ¡ kurio paÅ¡alinti $(^NameDA): # ^SpaceAvailable Yra vietos: # ^SpaceRequired Reikia vietos: # ^UninstallingText $(^NameDA) dabar bus paÅ¡alintas iÅ¡ Å¡io katalogo. $_CLICK # ^UninstallingSubText Trinama iÅ¡: # ^FileError Klaida atidarant failÄ… įraÅ¡ymui: \r\n\t"$0"\r\nPaspauskite Nutraukti, jei norite nutraukti įdiegimÄ…,\r\nPakartoti, jei norite pabandyti dar kartÄ… įraÅ¡yti failÄ…, ar\r\nIgnoruoti, jei norite praleisti šį failÄ… # ^FileError_NoIgnore Klaida atidarant failÄ… įraÅ¡ymui: \r\n\t"$0"\r\nPaspauskite Pakartoti, jei norite pabandyti dar kartÄ… įraÅ¡yti failÄ…, ar\r\nNutraukti, jei norite nutraukti įdiegimÄ…. # ^CantWrite "Negalima įraÅ¡yti: " # ^CopyFailed Kopijavimas nepavyko # ^CopyTo Kopijuoti į # ^Registering "Užregistruojama: " # ^Unregistering "IÅ¡registruojama: " # ^SymbolNotFound Nerastas simbolis: # ^CouldNotLoad Negaliu įkrauti: # ^CreateFolder Sukurti katalogÄ…: # ^CreateShortcut Sukurti nuorodÄ…: # ^CreatedUninstaller Sukurti panaikinimo programÄ…: # ^Delete IÅ¡trinti failÄ…: # ^DeleteOnReboot "IÅ¡trinti perkraunant: " # ^ErrorCreatingShortcut "Klaida kuriant nuorodÄ…: " # ^ErrorCreating "Klaida kuriant: " # ^ErrorDecompressing Klaida iÅ¡skleidžiant duomenis! Sugadintas įdiegimo failas? # ^ErrorRegistering Klaida užregistruojant DLL # ^ExecShell "VykdytiShell: " # ^Exec "Vykdyti: " # ^Extract "IÅ¡skleisti: " # ^ErrorWriting IÅ¡skleisti: klaida įraÅ¡ant į failÄ… # ^InvalidOpcode Ä®diegimo failas sugadintas: neteisingas opkodas # ^NoOLE "NÄ—ra OLE dÄ—l: " # ^OutputFolder "Paskirties katalogas: " # ^RemoveFolder "Panaikinti katalogÄ…: " # ^RenameOnReboot "Pervardinti perkraunant: " # ^Rename "Pervardinti: " # ^Skipped "Praleista: " # ^CopyDetails Kopijuoti detales į atmintį # ^LogInstall Ä®raÅ¡yti įdiegimo detales # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Lithuanian.nsh000077500000000000000000000161101477201124000214260ustar00rootroot00000000000000;Language: Lithuanian (1063) ;By Vytautas Krivickas (Vytautas). Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.01.09 !insertmacro LANGFILE "Lithuanian" = "Lietuvių" "Lietuviu" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Sveiki atvykÄ™ į $(^NameDA) įdiegimo programÄ…." ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Å i programa jums padÄ—s lengvai įdiegti $(^NameDA).$\r$\n$\r$\nRekomenduojama iÅ¡jungti visas programas, prieÅ¡ pradedant įdiegimÄ…. Tai leis atnaujinti sistemos failus neperkraunat kompiuterio.$\r$\n$\r$\n" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Sveiki atvykÄ™ į $(^NameDA) paÅ¡alinimo programÄ…." ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Å i programa jums padÄ—s lengvai iÅ¡trinti $(^NameDA).$\r$\n$\r$\nPrieÅ¡ pradedant pasitikrinkite kad $(^NameDA) yra iÅ¡jungta.$\r$\n$\r$\n" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Naudojimo sutartis" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "PraÅ¡ome perskaityti sutartį prieÅ¡ įdiegdami $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, spauskite Sutinku. JÅ«s privalote sutikti, jei norite įdiegti $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, padÄ—kite varnelÄ™ tam skirtame laukelyje. JÅ«s privalote sutikti, jei norite įdiegti $(^NameDA). " ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, pasirinkite pirmÄ… pasirinkimÄ… esantį žemiau. JÅ«s privalote sutikti, jei norite įdiegti $(^NameDA). " !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Naudojimo sutartis" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "PraÅ¡ome perskaityti sutartį prieÅ¡ $(^NameDA) paÅ¡alinimÄ…." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, spauskite Sutinku. JÅ«s privalote sutikti, jei norite iÅ¡trinti $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "s, padÄ—kite varnelÄ™ tam skirtame laukelyje. JÅ«s privalote sutikti, jei norite iÅ¡trinti $(^NameDA). " ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jei jÅ«s sutinkate su nurodytomis sÄ…lygomis, pasirinkite pirmÄ… pasirinkimÄ… esantį žemiau. JÅ«s privalote sutikti, jei norite iÅ¡trinti $(^NameDA)." !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Paspauskite Page Down ir perskaitykite visÄ… sutartį." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pasirinkite" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pasirinkite kokias $(^NameDA) galimybes jÅ«s norite įdiegti." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pasirinkite" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pasirinkite kokias $(^NameDA) galimybes jÅ«s norite paÅ¡alinti." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "PaaiÅ¡kinimas" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Užveskite pelÄ—s žymeklį ant komponento ir pamatysite jo apraÅ¡ymÄ…." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pasirinkite komponentį ir pamatysite jo apraÅ¡ymÄ…." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pasirinkite įdiegimo vietÄ…" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pasirinkite katalogÄ… į kÅ«ri įdiegsite $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pasirinkite iÅ¡trinimo vietÄ…" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pasirinkite katalogÄ… iÅ¡ kurio iÅ¡trinsite $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Diegiama" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "PraÅ¡ome palaukti, kol $(^NameDA) bus įdiegtas." ${LangFileString} MUI_TEXT_FINISH_TITLE "Ä®diegimas baigtas" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ä®diegimas baigtas sekmingai." ${LangFileString} MUI_TEXT_ABORT_TITLE "Ä®diegimas nutrauktas" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Ä®diegimas nebuvo baigtas sekmingai." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Å alinama" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "PraÅ¡ome palaukti, kol $(^NameDA) bus paÅ¡alinta." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Programos paÅ¡alinimas baigtas" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "IÅ¡trynimas baigtas sekmingai." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "IÅ¡trynimas nutrauktas" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "IÅ¡trynimas nebuvo baigtas sekmingai." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Baigiu $(^NameDA) įdiegimo procesÄ…" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) buvo įdiegtas į jÅ«sų kompiuterį.$\r$\n$\r$\nPaspauskite Baigti." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "JÅ«sų kompiuteris turi bÅ«ti perkrautas, kad bÅ«tų baigtas $(^NameDA) įdiegimas. Ar jÅ«s norite perkrauti dabar?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Baigiu $(^NameDA) paÅ¡alinimo programÄ…." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) buvo iÅ¡trinta iÅ¡ jÅ«sų kompiuterio.$\r$\n$\r$\nPaspauskite Baigti." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "JÅ«sų kompiuteris turi bÅ«ti perkrautas, kad bÅ«tų baigtas $(^NameDA) paÅ¡alinimas. Ar jÅ«s norite perkrauti dabar?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Perkrauti dabar" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "AÅ¡ noriu perkrauti veliau pats" ${LangFileString} MUI_TEXT_FINISH_RUN "&Leisti $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Parodyti dokumentacijÄ…" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Baigti" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pasirinkite Start Menu katalogÄ…" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pasirinkite Start Menu katalogÄ…, kuriame bus sukurtos programos nuorodos." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pasirinkite Start Menu katalogÄ…, kuriame bus sukurtos programos nuorodos. JÅ«s taip pat galite sukurti naujÄ… katalogÄ…." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nekurti nuorodų" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Panaikinti $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "IÅ¡trinti $(^NameDA) iÅ¡ jÅ«sų kompiuterio." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ar jÅ«s tikrai norite iÅ¡jungti $(^Name) įdiegimo programÄ…?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ar jÅ«s tikrai norite iÅ¡jungti $(^Name) paÅ¡alinimo programÄ…?" !endif nsis-3.11/Contrib/Language files/Luxembourgish.nlf000077500000000000000000000131221477201124000221560ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 4103 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Jo Hoeser # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Installatioun # ^UninstallCaption $(^Name) Desinstallatioun # ^LicenseSubCaption : Lizenzofkommes # ^ComponentsSubCaption : Installatiouns-Optiounen # ^DirSubCaption : Zielverzeechnis # ^InstallingSubCaption : Installéieren # ^CompletedSubCaption : Färdeg # ^UnComponentsSubCaption : Desinstallatiuons-Optiounen # ^UnDirSubCaption : Quellverzeechnes # ^ConfirmSubCaption : Bestätegung # ^UninstallingSubCaption : Läschen # ^UnCompletedSubCaption : Färdeg # ^BackBtn < &Zréck # ^NextBtn &Weider > # ^AgreeBtn &Unhuelen # ^AcceptBtn Ech &huelen d'Lizenzofkommes un. # ^DontAcceptBtn Ech &lehnen d'Lizenzofkommes of. # ^InstallBtn &Installéieren # ^UninstallBtn &Desinstalléieren # ^CancelBtn Ofbriechen # ^CloseBtn &Zou maan # ^BrowseBtn &Duerchsichen... # ^ShowDetailsBtn &Details uweisen # ^ClickNext Klick op weider fir weiderzefueren # ^ClickInstall Klick op Installéieren, fir d'Installatioun unzefänken. # ^ClickUninstall Klick op Desinstalléieren, fir d'Desinstallatioun unzefänken. # ^Name Numm # ^Completed Färdeg # ^LicenseText W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. # ^LicenseTextCB W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Kontrollkeschtchen. $_CLICK # ^LicenseTextRB W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, wiel d'entsprichend Optioun. $_CLICK # ^UnLicenseText W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. # ^UnLicenseTextCB W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Kontrollkeschtchen. $_CLICK # ^UnLicenseTextRB W.e.g. d'Lizenzoofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Oofkommes akzeptéiers, wiel d'entspriechend Optioun. $_CLICK # ^Custom Benutzerdefiniert # ^ComponentsText Wiel d'Komponenten aus, déis de wëlls installéieren an wiel déijéineg of, déis de net installéieren wëlls. $_CLICK # ^ComponentsSubText1 Installatiouns-Typ bestëmmen: # ^ComponentsSubText2_NoInstTypes Wiel d'Komponenten aus, déis de installéieren wëlls: # ^ComponentsSubText2 oder wiel zousätzlech Komponenten aus déis de installéieren wëlls: # ^UnComponentsText Wiel d'Komponenten aus déis de desinstalléieren wëlls an wiel déijéineg of, déis de net desinstalléieren wëlls. $_CLICK # ^UnComponentsSubText1 Deinstallatiouns-Typ bestëmmen: # ^UnComponentsSubText2_NoInstTypes Wiel d'Komponenten aus, déis de desinstalléieren wëlls: # ^UnComponentsSubText2 oder wiel zusätzlech Komponenten aus, déis de desinstalléieren wëlls: # ^DirText $(^NameDA) gëtt an den Dossier installéiert deen fierginn gouf. Wanns de et an een aneren Dossier installéieren wëlls, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK # ^DirSubText Zielverzeechnes # ^DirBrowseText Wiel en Dossier aus wuers de $(^NameDA) installéieren wëlls: # ^UnDirText $(^NameDA) gëtt an deem Dossier desinstalléiert, deen uginn gouf. Wann $(^NameDA) an engem aneren Dossier ass, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Wiel den Dossier aus wou $(^NameDA) dran installéiert ass: # ^SpaceAvailable "Verfügbaren Späicher: " # ^SpaceRequired "Gebrauchten Späicher: " # ^UninstallingText $(^NameDA) gëtt aus dem ausgewielten Dossier desinstalléiert. $_CLICK # ^UninstallingSubText Desinstalléieren aus: # ^FileError Fehler beim Iwwerschreiwen vun der Datei: \r\n\t"$0"\r\nKlick op ofbriechen fir den Setup ze verloossen,\r\nop Widderhuelen fir den Setup nach eng Kéier duechzeféieren\r\n oder op Ignoréieren fir des Datei ze iwwersprengen an weiderzefueren. # ^FileError_NoIgnore Fehler beim Iwwerschreiwen vun der Datei: \r\n\t"$0"\r\nKlick op Widderhuelen fir den Setup nach eng Kéier duechzeféieren,\r\noder op ofbriechen fir den Setup ze verloossen. # ^CantWrite "Fehler beim Schreiwen: " # ^CopyFailed Kopéieren fehlgeschloen # ^CopyTo "Kopéiere an " # ^Registering "Registréieren: " # ^Unregistering "Deregistréieren: " # ^SymbolNotFound "Symbol ass net do: " # ^CouldNotLoad "Fehler beim Lueden vun: " # ^CreateFolder "Maan Dossier: " # ^CreateShortcut "Maan Oofkierzung: " # ^CreatedUninstaller "Man Desinstallatiouns-Programm: " # ^Delete "Läschen Datei: " # ^DeleteOnReboot "Läschen Datei no engem Neistart: " # ^ErrorCreatingShortcut "Fehler beim man vun enger Oofkierzung: " # ^ErrorCreating "Fehler beim maan: " # ^ErrorDecompressing Fehler beim Dekompriméieren. Installations-Programm beschiedegt? # ^ErrorRegistering Fehler beim Registréieren vun der DLL # ^ExecShell "ExecShell: " # ^Exec "Starten: " # ^Extract "Dekompriméieren: " # ^ErrorWriting "Dekompriméierung: Fehler beim Schreiwen vun der Datei " # ^InvalidOpcode Installations-Programm Beschiedegt: net zoulässegen Befehlscode # ^NoOLE "Keen OLE fier: " # ^OutputFolder "Zieldossier: " # ^RemoveFolder "Läschen Dossier: " # ^RenameOnReboot "Gett no Neistart embenannt: " # ^Rename "Embenennen: " # ^Skipped "Iwwersprongen: " # ^CopyDetails Detailler an d'Zwëschenooflag kopéieren # ^LogInstall Installatioun protokolléieren # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Luxembourgish.nsh000077500000000000000000000172321477201124000221750ustar00rootroot00000000000000;Language: Luxembourgish (1031) ;By Snowloard, changes by Philo !insertmacro LANGFILE "Luxembourgish" = "Lëtzebuergesch" "Letzebuergesch" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Wëllkomm beim Installatiouns-$\r$\nAssistent vun $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Dësen Assistent wärt dech duech d'Installatioun vun $(^NameDA) begleeden.$\r$\n$\r$\nEt gëtt ugeroden alleguer d'Programmer di am Moment lafen zouzemaan, datt bestëmmt Systemdateien ouni Neistart ersat kënne ginn.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Wëllkomm am Desinstallatiouns-$\r$\n\Assistent fir $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Desen Assistent begleet dech duech d'Desinstallatioun vun $(^NameDA).$\r$\n$\r$\nW.e.g. maach $(^NameDA) zu, ierts de mat der Desinstallatioun ufänks.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizenzofkommes" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "W.e.g. d'Lizenzoofkommes liesen, ierts de mat der Installatioun weiderfiers." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Këschtchen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, wiel ënnen di entspriechend Äntwert aus. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizenzofkommes" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "W.e.g. lies d'Lizenzofkommes duech ierts de mat der Desinstallatioun vun $(^NameDA) weiderfiers." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, klick op unhuelen. Du muss d'Ofkommes akzeptéieren, fir $(^NameDA) kënnen ze desinstalléieren." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, aktivéier d'Këschtchen. Du muss d'Ofkommes akzeptéieren, fir $(^NameDA) kënnen ze desinstalléieren. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, wiel ënnen di entspriechend Optioun. Du muss d'Oofkommes akzeptéieren, fir $(^NameDA) kennen ze desinstalléieren. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Dréck d'PageDown-Tast fir den Rescht vum Ofkommes ze liesen." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Komponenten auswielen" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wiel d'Komponenten aus, déis de wëlls installéieren." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswielen" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wiel eng Komponent aus, déis de desinstalléieren wëlls." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreiwung" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Hal den Mausfeil iwwer eng Komponent, fir d'Beschreiwung dervun ze gesinn." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zielverzeechnes auswielen" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wiel den Dossier aus, an deen $(^NameDA) installéiert soll ginn." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dossier fir d'Desinstallatioun wielen" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wiel den Dossier aus, aus dem $(^NameDA) desinstalléiert soll ginn." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installéieren..." ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Waard w.e.g während deem $(^NameDA) installéiert gëtt." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installatioun färdeg" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "D'Installatioun ass feelerfräi oofgeschloss ginn." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installatioun ofgebrach" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "D'Installatioun ass net komplett ofgeschloss ginn." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalléieren..." ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "W.e.g. waard, während deems $(^NameDA) desinstalléiert gëtt." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstallatioun ofgeschloss" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "D'Desinstallatioun ass erfollegräich ofgeschloss ginn." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstallatioun oofbriechen" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Desinstallatioun ass net erfollegräich ofgeschloss ginn." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "D'Installatioun vun $(^NameDA) gëtt ofgeschloss." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ass um Computer installéiert ginn.$\r$\n$\r$\nKlick op färdeg maan, fir den Installatiouns-Assistent zou ze maan.." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Den Windows muss nei gestart ginn, fir d'Installatioun vun $(^NameDA) ofzeschléissen. Wëlls de Windows lo néi starten?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Desinstallatioun vun $(^NameDA) gëtt ofgeschloss" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ass vum Computer desinstalléiert ginn.$\r$\n$\r$\nKlick op Ofschléissen fir den Assistent zou ze maan." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss néi gestart gin, fir d'Desinstallatioun vun $(^NameDA) ze vervollstännegen. Wëlls de Windows lo néi starten?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Lo néi starten" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Spéider manuell néi starten" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) op maan" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Liesmech op maan" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Färdeg man" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenü-Dossier bestëmmen" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Bestëmm een Startmanü-Dossier an deen d'Programmofkierzungen kommen." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Bestëmm een Startmanü-Dossier an deen d'Programmofkierzungen kommen. Wanns de een néien Dossier man wells, gëff deem säin zukünftegen Numm an." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Keng Ofkierzungen man" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstallatioun vun $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) gett vum Computer desinstalléiert." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Bass de sécher, dass de d'Installatioun vun $(^Name) ofbriechen wëlls?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Bass de sécher, dass de d'Desinstallatioun vun $(^Name) ofbriechen wëlls?" !endif nsis-3.11/Contrib/Language files/Macedonian.nlf000077500000000000000000000200771477201124000213660ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1071 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Sasko Zdravkin [wingman2083@yahoo.com] # ^Branding Nullsoft Install System %s # ^SetupCaption ИнÑталирање на $(^Name) # ^UninstallCaption ДеинÑталирање на $(^Name) # ^LicenseSubCaption : Лиценцен Договор # ^ComponentsSubCaption : ИнÑталациони Опции # ^DirSubCaption : ИнÑталационен Директориум # ^InstallingSubCaption : ИнÑталира # ^CompletedSubCaption : Завршено # ^UnComponentsSubCaption : ДеинÑталациони Опции # ^UnDirSubCaption : ДеинÑталационен Директориум # ^ConfirmSubCaption : Потврда # ^UninstallingSubCaption : ДеинÑталира # ^UnCompletedSubCaption : Завршено # ^BackBtn < &Ðазад # ^NextBtn Ð&апред > # ^AgreeBtn &Да # ^AcceptBtn &Ги прифаќам уÑловите од Лиценцниот Договор # ^DontAcceptBtn Ð&е ги прифаќам уÑловите од Лиценцниот Договор # ^InstallBtn &ИнÑталирај # ^UninstallBtn &ДеинÑталирај # ^CancelBtn Откажи # ^CloseBtn &Затвори # ^BrowseBtn &Пребарувај... # ^ShowDetailsBtn П&окажи Детали # ^ClickNext ПритиÑнете 'Ðапред' за да продолжите. # ^ClickInstall ПритиÑнете 'ИнÑталирај' за да Ñе инÑталира. # ^ClickUninstall ПритиÑнете 'ДеинÑталирај' за да Ñе деинÑталира. # ^Name Име # ^Completed Завршено # ^LicenseText Ве молиме прочитајте го Лиценцниот Договор пред да Ñе инÑталира $(^NameDA). Ðко ги прифаќате Ñите уÑлови, притиÑнете 'Да'. # ^LicenseTextCB Ве молиме прочитајте го Лиценцниот Договор пред да Ñе инÑталира $(^NameDA). Ðко ги прифаќате Ñите уÑлови, притиÑнете го Check box-от подоле. $_CLICK # ^LicenseTextRB Ве молиме прочитајте го Лиценцниот Договор пред да Ñе инÑталира $(^NameDA). Ðко ги прифаќате Ñите уÑлови, одберете ја првата опција подоле. $_CLICK # ^UnLicenseText Ве молиме прочитајте го Лиценцниот Договор пред да Ñе деинÑталира $(^NameDA). Ðко ги прифаќате Ñите уÑлови, притиÑнете 'Да'. # ^UnLicenseTextCB Ве молиме прочитајте го Лиценцниот Договор пред да Ñе деинÑталира $(^NameDA). Ðко ги прифаќате Ñите уÑлови, притиÑнете го Check box-от подоле. $_CLICK # ^UnLicenseTextRB Ве молиме прочитајте го Лиценцниот Договор пред да Ñе деинÑталира $(^NameDA). Ðко ги прифаќате Ñите уÑлови, одберете ја првата опција подоле. $_CLICK # ^Custom ПодеÑено # ^ComponentsText Чекирајте ги компонентите што Ñакате да Ñе инÑталираат или дечекирајте ги тие што не Ñакате да Ñе инÑталираат. $_CLICK # ^ComponentsSubText1 Одберете вид на инÑталација: # ^ComponentsSubText2_NoInstTypes Одберете ги компонентите што ќе Ñе инÑталираат: # ^ComponentsSubText2 или, одберете други компоненти што Ñакате да Ñе инÑталираат: # ^UnComponentsText Чекирајте ги компонентите што Ñакате да Ñе деинÑталираат или дечекирајте ги тие што не Ñакате да Ñе деинÑталираат. $_CLICK # ^UnComponentsSubText1 Одберете го видот на деинÑталацијата: # ^UnComponentsSubText2_NoInstTypes Одберете ги компонентите што ќе Ñе деинÑталираат: # ^UnComponentsSubText2 или, одберете други компоненти што Ñакате да Ñе деинÑталираат: # ^DirText ИнÑталациониот програм ќе го инÑталира $(^NameDA) во Ñледниов директориум. За да инÑталирате во друг, притиÑнете 'Пребарувај' и одберете друг директориум. $_CLICK # ^DirSubText Директориум каде што ќе Ñе инÑталира # ^DirBrowseText Одберете директориум за инÑталирање на $(^NameDA): # ^UnDirText ИнÑталациониот програм ќе го деинÑталира $(^NameDA) од Ñледниов директориум. За да деинÑталирате од друг, притиÑнете 'Пребарувај' и одберете друг директориум. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Одберете го директориумот за деинÑталирање на $(^NameDA): # ^SpaceAvailable "Слободен проÑтор: " # ^SpaceRequired "Потребен проÑтор: " # ^UninstallingText $(^NameDA) ќе биде деинÑталиран од Ñледниов директориум. $_CLICK # ^UninstallingSubText ДеинÑталира од: # ^FileError Грешка при отварањето на датотеката за запишување: \r\n\t"$0"\r\nПритиÑнете 'Откажи' за да ја откажете инÑталацијата,\r\n'Пробај' за да проба да ја запише датотеката, или\r\n'Игнорирај' за да ја прерипа датотеката # ^FileError_NoIgnore Грешка при отварањето на датотеката за запишување: \r\n\t"$0"\r\nПритиÑнете 'Пробај' за да проба да ја запише датотеката, или\r\n'Откажи' за да ја откаже инÑталацијата # ^CantWrite "Ðе може да запише: " # ^CopyFailed Копирањето не уÑпеа # ^CopyTo "Копирај до " # ^Registering "РегиÑтрира: " # ^Unregistering "ДерегиÑтрира: " # ^SymbolNotFound "Ðе може да го најде Ñимболот: " # ^CouldNotLoad "Ðе може да лоадира: " # ^CreateFolder "Создади директориум: " # ^CreateShortcut "Создади кратеница: " # ^CreatedUninstaller "Создаден деинÑталатор: " # ^Delete "Избришана датотека: " # ^DeleteOnReboot "Избриши поÑле реÑтартирање: " # ^ErrorCreatingShortcut "Грешка при Ñоздавањето на Ñкратеницата: " # ^ErrorCreating "Грешка при Ñоздавањето: " # ^ErrorDecompressing Грешка при отпакувањето на податоците! РаÑипан инÑталационен програм? # ^ErrorRegistering Грешка при региÑтрирањето на DLL # ^ExecShell "ExecShell: " # ^Exec "Покрени: " # ^Extract "Отпакувано: " # ^ErrorWriting "Отпакувај: грешка при Ñнимањето во датотеката " # ^InvalidOpcode РаÑипан инÑталационен програм: погрешен код # ^NoOLE "Ðема OLE за: " # ^OutputFolder "ИнÑталационен директориум: " # ^RemoveFolder "Избришан директориум: " # ^RenameOnReboot "Преименувај поÑле реÑтартирање: " # ^Rename "Преименувај: " # ^Skipped "Прерипано: " # ^CopyDetails Копирај ги Деталите во Clipboard-от # ^LogInstall Сними лог за инÑталационите процеÑи # ^Byte б # ^Kilo К # ^Mega М # ^Giga Г nsis-3.11/Contrib/Language files/Macedonian.nsh000077500000000000000000000241151477201124000213740ustar00rootroot00000000000000;Language: Macedonian (1071) ;By Sasko Zdravkin [wingman2083@yahoo.com] !insertmacro LANGFILE "Macedonian" = "МакедонÑки" "Makedonski" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Добро дојдовте во инÑталацијата на $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Овој програм ќе ве води низ инÑталацијата на $(^NameDA).$\r$\n$\r$\nПрепорачано е да ги затворите Ñите програми пред да инÑталирате. Ова ќе дозволи инÑталациониот програм да обнови некои ÑиÑтемÑки датотеки без да го реÑтартира компјутерот.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Добро дојдовте во деинÑталацијата на $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Овој програм ќе ве води низ деинÑталацијата на $(^NameDA).$\r$\n$\r$\nПред да ја почнете деинÑталацијата на $(^NameDA) проверете дали е иÑклучена програмата.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лиценцен Договор" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ве молиме проверете ги лиценцните уÑлови пред да го инÑталирате $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ðко ги прифаќате уÑловите од договорот, притиÑнете 'Да' за да продолжите. Мора да го прифатите договорот за да го инÑталирате $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ðко ги прифаќате уÑловите од договорот, чекирајте го check box-от подоле. Мора да го прифатите договорот за го инÑталирате $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ðко ги прифаќате уÑловите од договорот, одберете ја првата опција подоле. Мора да го прифатите договорот за го инÑталирате $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лиценцен Договор" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ве молиме проверете ги лиценцните уÑлови пред да го деинÑталирате $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ðко ги прифаќате уÑловите од договорот, притиÑнете 'Да' за да продолжите. Мора да го прифатите договорот за да го деинÑталирате $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ðко ги прифаќате уÑловите од договорот, чекирајте го check box-от подоле. Мора да го прифатите договорот за го деинÑталирате $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ðко ги прифаќате уÑловите од договорот, одберете ја првата опција подоле. Мора да го прифатите договорот за го деинÑталирате $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ПритиÑнете 'Page Down' за да го видете оÑтанатиот дел од договорот." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Одберете Компоненти" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Одберете кои работи од $(^NameDA) Ñакате да Ñе инÑталираат." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Одберете Компоненти" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Одберете кои работи од $(^NameDA) Ñакате да Ñе деинÑталираат." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ОбјаÑнение" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ОднеÑете го курÑорот до компонентата за да го видете нејзиното објаÑнение." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Одберете ја компонентата за да го видете нејзиното објаÑнение." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Одберете ја локацијата за инÑталирање" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Одберете го директориумот каде што Ñакате да Ñе инÑталира $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Одберете ја локацијата за деинÑталирање" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Одберете го директориумот од кој Ñакате да Ñе деинÑталира $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ИнÑталира" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ве молиме почекајте додека $(^NameDA) Ñе инÑталира." ${LangFileString} MUI_TEXT_FINISH_TITLE "ИнÑталацијата е завршена" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ИнÑталирањето беше уÑпешно." ${LangFileString} MUI_TEXT_ABORT_TITLE "ИнÑталацијата е откажана" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ИнÑталирањето не беше уÑпешно завршено." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ДеинÑталира" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ве молиме почекајте додека $(^NameDA) Ñе деинÑталира." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ДеинÑталацијата е завршена" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ДеинÑталирањето беше уÑпешно." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ДеинÑталацијата е откажана" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ДеинÑталирањето не беше уÑпешно завршено." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завршува инÑталирањето на $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) е инÑталиран на вашиот компјутер.$\r$\n$\r$\nПритиÑнете 'Крај' за да го затворите инÑталациониот програм." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Вашиот компјутер мора да Ñе реÑтартира за да заврши инÑталацијата на $(^NameDA). Дали Ñакате да Ñе реÑтартира Ñега?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завршува деинÑталирањето на $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) е деинÑталиран од вашиот компјутер.$\r$\n$\r$\nПритиÑнете 'Крај' за да го затворите деинÑталациониот програм." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Вашиот компјутер мора да Ñе реÑтартира за да заврши деинÑталацијата на $(^NameDA). Дали Ñакате да Ñе реÑтартира Ñега?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "РеÑтартирај Ñега" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ðко Ñакате да го реÑтартирате подоцна" ${LangFileString} MUI_TEXT_FINISH_RUN "Пок&рени го $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Отвор&и 'Прочитај Ме'" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Крај" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Одберете директориум за Старт Менито" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Одберете директориум во Старт Менито за креирање Ñкратеница на $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Одберете го директориумот во Старт Менито во кој Ñакате да Ñе креира Ñкратеница за програмата. ИÑто така можете да внеÑете друго име за да Ñе креира нов директориум." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ðе креирај Ñкратеница" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ДеинÑталирај го $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "ОдÑтранете го $(^NameDA) од вашиот компјутер." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Сигурни ли Ñте дека Ñакате да Ñе откажете од инÑталацијата на $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Сигурни ли Ñте дека Ñакате да Ñе откажете од деинÑталацијата на $(^Name)?" !endif nsis-3.11/Contrib/Language files/Malagasy.nlf000077500000000000000000000131131477201124000210570ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1536 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page - # RTL - anything else than RTL means LTR - # Translation by ..... (any credits should go here) # ^Branding Nullsoft Install System %s # ^SetupCaption Fampidirana ny $(^Name) # ^UninstallCaption Fanesorana ny $(^Name) # ^LicenseSubCaption : Fifanekena # ^ComponentsSubCaption : Safidy # ^DirSubCaption : Toerana Fampirimana # ^InstallingSubCaption : Eo Am-panaovana Azy # ^CompletedSubCaption : Vita # ^UnComponentsSubCaption : Safidy # ^UnDirSubCaption : Toerana Fampirimana # ^ConfirmSubCaption : Hanamafy # ^UninstallingSubCaption : Eo Am-panaovana Azy # ^UnCompletedSubCaption : Vita # ^BackBtn < &Hiverina # ^NextBtn &Manaraka > # ^AgreeBtn &Ekeko # ^AcceptBtn E&keko izay voalaza ao amin'ny Fifanekena # ^DontAcceptBtn &Tsy ekeko izay voalaza ao amin'ny Fifanekena # ^InstallBtn &Hampiditra # ^UninstallBtn &Hanaisotra # ^CancelBtn Hanafoana # ^CloseBtn &Hanidy # ^BrowseBtn &Toerana... # ^ShowDetailsBtn Ha&moaka ny tsipiriany # ^ClickNext Tsindrio ny Manaraka raha te hanohy. # ^ClickInstall Tsindrio ny Hampiditra raha te hanomboka ny fampidirana an'ity programa ity. # ^ClickUninstall Tsindrio ny Hanaisotra raha te hanomboka ny fanesorana an'ity programa ity. # ^Name Anarana # ^Completed Vita # ^LicenseText Jereo aloha ny fifanekena, alohan'ny hampidirana ny $(^NameDA). Tsindrio ny Ekeko raha ekenao daholo izay voalazan'ny fifanekena. # ^LicenseTextCB Jereo aloha ny fifanekena, alohan'ny hampidirana ny $(^NameDA). Mariho ny efajoro kely eto ambany raha ekenao daholo izay voalazan'ny fifanekena. $_CLICK # ^LicenseTextRB Jereo aloha ny fifanekena, alohan'ny hampidirana ny $(^NameDA). Mariho ilay safidy voalohany eto ambany raha ekenao daholo izay voalazan'ny fifanekena. $_CLICK # ^UnLicenseText Jereo aloha ny fifanekena, alohan'ny hanesorana ny $(^NameDA). Tsindrio ny Ekeko raha ekenao daholo izay voalazan'ny fifanekena. # ^UnLicenseTextCB Jereo aloha ny fifanekena, alohan'ny hanesorana ny $(^NameDA). Mariho ny efajoro kely eto ambany raha ekenao daholo izay voalazan'ny fifanekena. $_CLICK # ^UnLicenseTextRB Jereo aloha ny fifanekena, alohan'ny hanesorana ny $(^NameDA). Mariho ilay safidy voalohany eto ambany raha ekenao daholo izay voalazan'ny fifanekena. $_CLICK # ^Custom Mahazatra # ^ComponentsText Mariho izay tianao hampidirina, ary aza marihina izay tsy tianao hampidirina. $_CLICK # ^ComponentsSubText1 Fidio ny fomba fampidirana tianao: # ^ComponentsSubText2_NoInstTypes Fidio izay tianao hampidirina: # ^ComponentsSubText2 Na, afaka mampiditra izay tianao amin'ireto ianao: # ^UnComponentsText Mariho izay tianao hesorina, ary aza marihina izay tsy tianao hesorina. $_CLICK # ^UnComponentsSubText1 Fidio ny fomba fanesorana tianao: # ^UnComponentsSubText2_NoInstTypes Fidio izay tianao hesorina: # ^UnComponentsSubText2 Na, afaka manaisotra izay tianao amin'ireto ianao: # ^DirText Ato amin'ity toerana fampirimana ity no hisy ny $(^NameDA). Tsindrio ny Toerana ary mifidiana toerana fampirimana hafa raha te hametraka azy any an-toerana-kafa ianao. $_CLICK # ^DirSubText Toerana Hametrahana Azy # ^DirBrowseText Fidio ilay toerana fampirimana tianao hampidirana ny $(^NameDA): # ^UnDirText Hesorina ato amin'ity toerana fampirimana ity ny $(^NameDA). Tsindrio ny Toerana ary mifidiana toerana fampirimana hafa raha te hanaisotra azy any an-toerana-kafa ianao. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Fidio ilay toerana fampirimana tianao hanesorana ny $(^NameDA): # ^SpaceAvailable "Toerana malalaka: " # ^SpaceRequired "Toerana ilaina: " # ^UninstallingText Hesorina ato amin'ity toerana fampirimana ity ny $(^NameDA). $_CLICK # ^UninstallingSubText Hesorina ao amin'ny: # ^FileError Misy olana ny: \r\n\r\n$0\r\n\r\nTsindrio ny Hamarana mba hampijanonana ny fampidirana, ny\r\nHaverina mba hamerenana ny fampidirana, na ny\r\nTsy Hiraharaha mba hanohizana indray. # ^FileError_NoIgnore Misy olana ny: \r\n\r\n$0\r\n\r\nTsindrio ny Haverina mba hamerenana ny fampidirana, na ny\r\nHanafoana mba hampijanonana ny fampidirana. # ^CantWrite "Tsy voafindra: " # ^CopyFailed Tsy voadika # ^CopyTo "Hadika ao amin'ny " # ^Registering "Eo am-pandraketana ny fanazavana: " # ^Unregistering "Eo am-pamafana ny fanazavana: " # ^SymbolNotFound "Tsy hita ny: " # ^CouldNotLoad "Tsy azo ny: " # ^CreateFolder "Hamorona toerana fampirimana: " # ^CreateShortcut "Hamorona hitsin-dalana: " # ^CreatedUninstaller "Programa fanesorana efa misy: " # ^Delete "Hamafa ny rakitra: " # ^DeleteOnReboot "Ho voafafa rehefa mamelona ordinatera indray: " # ^ErrorCreatingShortcut "Olana rehefa namorona hitsin-dalana: " # ^ErrorCreating "Olana rehefa namorona ny: " # ^ErrorDecompressing Nisy olana rehefa naka rakitra! Sao dia simba ny programa fampidirana? # ^ErrorRegistering Nisy olana teo am-pandraketana ny fanazavana momba ny DLL # ^ExecShell "ExecShell: " # ^Exec "Mandefa: " # ^Extract "Maka: " # ^ErrorWriting "Maka: Nisy olana rehefa nandika " # ^InvalidOpcode Simba ny programa fampidirana: tsy mety ny opcode # ^NoOLE "Tsy misy OLE ho an'ny: " # ^OutputFolder "Toerana fampirimana ny asa vita: " # ^RemoveFolder "Hanala an'ity toerana fampirimana ity: " # ^RenameOnReboot "Hanova anarana rehefa mamelona ordinatera indray: " # ^Rename "Hanova anarana: " # ^Skipped "Nodinganina: " # ^CopyDetails Handika ny Tsipiriany ho ao Amin'ny Fitehirizana # ^LogInstall Log install process # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Malagasy.nsh000077500000000000000000000120011477201124000210630ustar00rootroot00000000000000;Language: Malagasy (1033) !insertmacro LANGFILE "Malagasy" = "Malagasy" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Tonga soa eto Amin'ny Fampidirana ny $(^NameDA)" #FIXME:MUI_TEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_UNWELCOMEPAGE #FIXME:MUI_UNTEXT_WELCOME_INFO_TITLE #FIXME:MUI_UNTEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Fifanekena" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Jereo aloha izay voalaza ao amin'ny fifanekena, alohan'ny hampidirana ny $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Raha ekenao izay voalaza ao amin'ny fifanekena ary te hanohy ianao, dia tsindrio ny Ekeko. Tsy maintsy manaiky an'io fifanekena io ianao vao afaka mampiditra ny $(^NameDA)." #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_UNLICENSEPAGE #FIXME:MUI_UNTEXT_LICENSE_TITLE #FIXME:MUI_UNTEXT_LICENSE_SUBTITLE #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tsindrio ny bokotra mampidina ho eo amin'ny pejy ambany, eo amin'ny klavie, raha te hahita ny ambin'ny fifanekena ianao." !endif !ifdef MUI_COMPONENTSPAGE #FIXME:MUI_TEXT_COMPONENTS_TITLE #FIXME:MUI_TEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_UNCOMPONENTSPAGE #FIXME:MUI_UNTEXT_COMPONENTS_TITLE #FIXME:MUI_UNTEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Mombamomba Azy" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE #FIXME:MUI_TEXT_DIRECTORY_TITLE #FIXME:MUI_TEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_UNDIRECTORYPAGE #FIXME:MUI_UNTEXT_DIRECTORY_TITLE #FIXME:MUI_UNTEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Fampidirana" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mahandrasa kely, azafady, mandra-pampiditra ny $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Vita ny Fampidirana" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Vita soa aman-tsara ny fampidirana." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Tsy vita hatramin'ny farany ny fampidirana." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Fanesorana" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mahandrasa kely, azafady, mandra-panaisotra ny $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Vita ny Fanesorana" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Vita soa aman-tsara ny fanesorana." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Notapahina ny Fanesorana" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Tsy vita hatramin'ny farany ny fanesorana." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Eo Am-pamitana ny Fampidirana ny $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Tafiditra ato amin'ny ordinateranao ny $(^NameDA).$\r$\n$\r$\nTsindrio ny Vita mba hanakatonana ny Fampidirana." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Tsy maintsy velomina indray ny ordinateranao vao ho vita tanteraka ny fampidirana ny $(^NameDA). Tianao hatao izao ve izany?" !endif !ifdef MUI_UNFINISHPAGE #FIXME:MUI_UNTEXT_FINISH_INFO_TITLE #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT #FIXME:MUI_UNTEXT_FINISH_INFO_REBOOT !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Hamelona izao" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Tiako haverina velomina aoriana kely" ${LangFileString} MUI_TEXT_FINISH_RUN "&Handefa ny $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "H&iseho ny VakioAho" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Vita" !endif !ifdef MUI_STARTMENUPAGE #FIXME:MUI_TEXT_STARTMENU_TITLE #FIXME:MUI_TEXT_STARTMENU_SUBTITLE #FIXME:MUI_INNERTEXT_STARTMENU_TOP #FIXME: MUI_INNERTEXT_STARTMENU_CHECKBOX !endif !ifdef MUI_UNCONFIRMPAGE #FIXME:MUI_UNTEXT_CONFIRM_TITLE #FIXME:MUI_UNTEXT_CONFIRM_SUBTITLE !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Tena te hiala ato amin'ny Fampidirana ny $(^Name) ve ianao?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Tena te hiala ato amin'ny Fanesorana ny $(^Name) ve ianao?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Language files/Malay.nlf000077500000000000000000000112711477201124000203670ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1086 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation muhammadazwa@yahoo.com # ^Branding Nullsoft Install System %s # ^SetupCaption Setup $(^Name) # ^UninstallCaption Uninstall $(^Name) # ^LicenseSubCaption : Perlesenan # ^ComponentsSubCaption : Pilihan kemasukan # ^DirSubCaption : Folder kemasukan # ^InstallingSubCaption : Memasang # ^CompletedSubCaption : Selesai # ^UnComponentsSubCaption : Pilihan membuang # ^UnDirSubCaption : Folder Uninstal # ^ConfirmSubCaption : Kepastian # ^UninstallingSubCaption : Membuang # ^UnCompletedSubCaption : Tidak Selesai # ^BackBtn < &Ke Belakang # ^NextBtn &Ke Depan > # ^AgreeBtn Saya &setuju # ^AcceptBtn Saya s&etuju dengan Perlesenan # ^DontAcceptBtn Saya &tidak setuju dengan Perlesenan # ^InstallBtn &Masukkan # ^UninstallBtn &Buang # ^CancelBtn Batal # ^CloseBtn &Tutup # ^BrowseBtn S&elusur... # ^ShowDetailsBtn Buka &lagi # ^ClickNext Klik Ke Depan untuk teruskan. # ^ClickInstall Klik Masukkan untuk kemasukkan. # ^ClickUninstall Klik Uninstall untuk membuang. # ^Name Nama # ^Completed Selesai # ^LicenseText Sila baca lesen sebelum memasukkan $(^NameDA). Jika anda terima perlesenan, klik Saya setuju. # ^LicenseTextCB Sila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK # ^LicenseTextRB Sila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK # ^UnLicenseText Sila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, klik Saya setuju. # ^UnLicenseTextCB Sila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK # ^UnLicenseTextRB Sila baca lesen sebelum sebelum membuang $(^NameDA).Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK # ^Custom Custom # ^ComponentsText Beri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK # ^ComponentsSubText1 Pilih kemasukan: # ^ComponentsSubText2_NoInstTypes Pilih komponen-komponen untuk dimasukkan: # ^ComponentsSubText2 Atau, pilih komponen berikut untuk dimasukkan: # ^UnComponentsText Beri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK # ^UnComponentsSubText1 Pilih tipe un-kemasukan: # ^UnComponentsSubText2_NoInstTypes Pilih komponen-komponen untuk di buang: # ^UnComponentsSubText2 Atau, pilih komponen berikut untuk di buang: # ^DirText Setup akan memasukkan $(^NameDA) pada folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK # ^DirSubText Folder tujuan # ^DirBrowseText Pilih folder untuk memasukkan $(^NameDA): # ^UnDirText Setup akan membuang $(^NameDA) dari folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Pilih folder untuk dibuang $(^NameDA): # ^SpaceAvailable "Ruang cakera keras yang ada: " # ^SpaceRequired "Ruang cakera keras yang diperlukan: " # ^UninstallingText $(^NameDA) akan buang dari folder berikut. $_CLICK # ^UninstallingSubText Membuang: # ^FileError Tidak dapat menulis pada fail: \r\n\t"$0"\r\nKlik abort untuk membatalkan kemasukan,\r\nretry untuk cuba lagi, atau\r\nignore untuk abaikan fail ini. # ^FileError_NoIgnore Tidak dapat menulis pada fail: \r\n\t"$0"\r\nKlik retry untuk cuba lagi, atau\r\ncancel untuk batalkan kemasukan # ^CantWrite "Gagal menulis pada: " # ^CopyFailed Gagal menyalin # ^CopyTo "Menyalin ke " # ^Registering "Mendaftarkan modul: " # ^Unregistering "Melepaskan modul: " # ^SymbolNotFound "Symbol tidak jumpa : " # ^CouldNotLoad "Tidak dapat membuka: " # ^CreateFolder "Membuat folder: " # ^CreateShortcut "Membuat pintasan: " # ^CreatedUninstaller "Membuat program unistall: " # ^Delete "Memadam fail: " # ^DeleteOnReboot "Akan dipadam ketika reboot: " # ^ErrorCreatingShortcut "Tidak dapat membuat pintasan: " # ^ErrorCreating "Ralat penciptaan: " # ^ErrorDecompressing Ralat ketika membuka data! Program Installer rosak # ^ErrorRegistering Ralat mendaftarkan modul DLL # ^ExecShell "ExecShell: " # ^Exec "Menjalankan: " # ^Extract "Mengekstrak: " # ^ErrorWriting "Ekstrak: ralat ketika menulis ke fail " # ^InvalidOpcode Installer rosak: opcode tidak lengkap # ^NoOLE "OLE tidak ditemukan: " # ^OutputFolder "Folder tujuan: " # ^RemoveFolder "Menghapuskan folder: " # ^RenameOnReboot "Menamakan semula pada reboot: " # ^Rename "Menamakan semula: " # ^Skipped "Diabaikan: " # ^CopyDetails Salin terperinci ke clipboard # ^LogInstall Catat proses kemasukan # ^Byte Bait # ^Kilo Kilo # ^Mega Mega # ^Giga Giga nsis-3.11/Contrib/Language files/Malay.nsh000077500000000000000000000154131477201124000204020ustar00rootroot00000000000000;Language: Malay (1086) ;By muhammadazwa@yahoo.com !insertmacro LANGFILE "Malay" = "Bahasa Melayu" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Assalamualaikum, Selamat datang ke $(^NameDA) Setup Wizard" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Setup Wizard akan membantu anda untuk memasukkan $(^NameDA).$\r$\n$\r$\nSila tutup program aplikasi yang lain sebelum Setup ini dimulakan. Ini supaya tiada proses reboot komputer diperlukan.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Selamat datang ke $(^NameDA) Uninstall Wizard" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Uninstall Wizard akan membantu anda pada proses membuang $(^NameDA).$\r$\n$\r$\nSebelum membuang, pastikan dulu $(^NameDA) dimatikan.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Perlesenan" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Sila baca teks lesen berikut sebelum memasukkan $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jika anda bersetuju, klik Saya setuju untuk teruskan. Anda mesti setuju untuk sebelum aplikasi dapat dimasukkan $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda bersetuju dengan syarat-syarat lesen, sila tanda dicheckbox. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda terima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Tentang Lesen" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Sila baca teks lesen sebelum membuang $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jika anda menerima lesen, klik Saya setuju untuk teruskan. Anda mesti setuju untuk dapat membuang $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda menerima semua yang ada di lesen, beri tanda dicheckbox. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda menerima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tekan Page Down untuk melihat teks selebihnya." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pilih Komponen" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pilih fungsi-fungsi dari $(^NameDA) yang ingin dimasukkan." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pilih Komponen" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pilih fungsi-fungsi $(^NameDA) yang ingin dibuang." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Penerangan" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Alihkan tetikus ke komponen untuk mengetahui penerangannya." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pilih komponen untuk mengetahui penerangannya." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pilih Lokasi Kemasukan" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pilih folder untuk memasukkan $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pilih Lokasi Uninstall" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pilih folder untuk meng-uninstall $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Pemasangan" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Sila tunggu ketika $(^NameDA) sedang dimasukkan." ${LangFileString} MUI_TEXT_FINISH_TITLE "Proses Selesai" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup sudah selesai." ${LangFileString} MUI_TEXT_ABORT_TITLE "Proses Dibatalkan" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup terbatal." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstall" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Sila tunggu ketika $(^NameDA) sedang di-buang." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Proses Uninstall Selesai" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall sudah selesai." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Proses Uninstall Dibatalkan" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall belum selesai secara sempurna." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Setup Wizard" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dimasukkan di komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Komputer anda harus direboot untuk menyelesaikan proses memasukkan $(^NameDA). Apakah anda hendak reboot sekarang juga?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Uninstall Wizard" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dibuang dari komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Komputer anda harus di reboot untuk menyelesaikan proses membuang $(^NameDA). Reboot sekarang?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot sekarang" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reboot nanti" ${LangFileString} MUI_TEXT_FINISH_RUN "&Jalankan $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Buka fail Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Selesai" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pilih Folder Start Menu" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pilih folder Start Menu untuk meletakkan pintasan $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pilih folder Start Menu untuk perletakkan pintasan aplikasi ini. Boleh cipta nama folder anda sendiri." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Tidak perlu pintasan" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Buang $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Padam $(^NameDA) dari komputer anda." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Adakan anda yakin ingin membatalkan Setup $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Adakan anda yakin ingin membatalkan proses buang $(^Name)?" !endif nsis-3.11/Contrib/Language files/Mongolian.nlf000077500000000000000000000160741477201124000212550ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1104 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Bayarsaikhan Enkhtaivan. ebayaraa@gmail.com # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Суулгац # ^UninstallCaption $(^Name) СуулгаÑныг уÑтгах # ^LicenseSubCaption : Лицензийн зөвшөөрөл # ^ComponentsSubCaption : Суулгах Ñонголт # ^DirSubCaption : Суулгах Ð¥Ð°Ð²Ñ‚Ð°Ñ # ^InstallingSubCaption :Суулгаж байна # ^CompletedSubCaption : ДууÑлаа # ^UnComponentsSubCaption : СуулгаÑныг уÑтгахын Сонголт # ^UnDirSubCaption : СуулгаÑныг уÑтгах Ð¥Ð°Ð²Ñ‚Ð°Ñ # ^ConfirmSubCaption : Батламж # ^UninstallingSubCaption : СуулгаÑныг уÑтгаж байна # ^UnCompletedSubCaption : ДууÑлаа # ^BackBtn < &Буцах # ^NextBtn &Цааш> # ^AgreeBtn &Зөвшөөрлөө # ^AcceptBtn Би Лицензийн Зөвшөөрлийн зүйлүүдийг &зөвшөөрч байна # ^DontAcceptBtn Би Лицензийн Зөвшөөрлийн зүйлүүдийг &зөвшөөрөхгүй байна # ^InstallBtn &Суулга # ^UninstallBtn &УÑтга # ^CancelBtn Болих # ^CloseBtn &Xaax # ^BrowseBtn Ð¥&өтлөх... # ^ShowDetailsBtn &ДÑлгÑÑ€Ñнгүй # ^ClickNext Цааш дÑÑÑ€ дарвал үргÑлжилнÑ. # ^ClickInstall Суулга дÑÑÑ€ дарвал Ñуулгац ÑÑ…ÑлнÑ. # ^ClickUninstall УÑтга дÑÑÑ€ дарвал Ñуулгацын уÑтгалт ÑÑ…ÑлнÑ. # ^Name ÐÑÑ€ # ^Completed ДууÑлаа # ^LicenseText $(^NameDA)-г Ñуулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Ð¥ÑÑ€Ñв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, Зөвшөөрлөө-г дарна уу. # ^LicenseTextCB $(^NameDA)-г Ñуулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Ð¥ÑÑ€Ñв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх нүдийг чагтална уу. $_CLICK # ^LicenseTextRB $(^NameDA)-г Ñуулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Ð¥ÑÑ€Ñв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх Ñхний Ñонголтыг Ñонгоно уу. $_CLICK # ^UnLicenseText $(^NameDA)-г Ñуулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Ð¥ÑÑ€Ñв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, Зөвшөөрлөө-г дарна уу. # ^UnLicenseTextCB $(^NameDA)-г Ñуулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Ð¥ÑÑ€Ñв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх нүдийг чагтална уу. $_CLICK # ^UnLicenseTextRB $(^NameDA)-г Ñуулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Ð¥ÑÑ€Ñв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх Ñхний Ñонголтыг Ñонгоно уу. $_CLICK # ^Custom БуÑад # ^ComponentsText Суулгахыг Ñ…Ò¯ÑÑÑн нÑгдлÑÑ Ñ‡Ð°Ð³Ñ‚Ð»Ð°Ð°Ð´, Ñуулгахыг Ñ…Ò¯ÑÑхгүй буйгаа бүү чагтлаарай. $_CLICK # ^ComponentsSubText1 Суулгах төрлийг Ñонгоно уу: # ^ComponentsSubText2_NoInstTypes Суулгах нÑгдлийг Ñонгоно уу: # ^ComponentsSubText2 ЭÑвÑл, заавал Ñуулгахгүй байх нÑгдлүүдийг Ñонго: # ^UnComponentsText УÑтгахыг Ñ…Ò¯ÑÑÑн нÑгдлÑÑ Ñ‡Ð°Ð³Ñ‚Ð»Ð°Ð°Ð´, уÑтгахыг Ñ…Ò¯ÑÑхгүй байгаагаа бүү чагтлаарай. $_CLICK # ^UnComponentsSubText1 УÑтгах төрлийг Ñонгоно уу: # ^UnComponentsSubText2_NoInstTypes УÑтгах нÑгдлүүдийг Ñонгоно ууl: # ^UnComponentsSubText2 ЭÑвÑл, заавал уÑтгахгүй байх нÑгдлүүдийг Ñонго: # ^DirText $(^NameDA) нь дараах хавтÑанд Ñууна. Ó¨Ó©Ñ€ газар Ñуулгахыг Ñ…Ò¯ÑвÑл Хөтлөх товч дÑÑÑ€ даран Ó©Ó©Ñ€ Ñ…Ð°Ð²Ñ‚Ð°Ñ Ñонгоно уу. $_CLICK # ^DirSubText Зорилтот Ð¥Ð°Ð²Ñ‚Ð°Ñ # ^DirBrowseText $(^NameDA)-ыг Ñуулгах хавтÑыг Ñонгох: # ^UnDirText $(^NameDA)-г уг хавтаÑÐ½Ð°Ð°Ñ ÑƒÑтгана. Ó¨Ó©Ñ€ Ð³Ð°Ð·Ñ€Ð°Ð°Ñ ÑƒÑтгахыг Ñ…Ò¯ÑвÑл Хөтлөх товч дÑÑÑ€ даран Ó©Ó©Ñ€ Ñ…Ð°Ð²Ñ‚Ð°Ñ Ñонгоно уу. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA)-г уÑтгах хавтÑыг Ñонгох: # ^SpaceAvailable "Боломжит зай: " # ^SpaceRequired "Шаардагдах зай: " # ^UninstallingText $(^NameDA) нь уг хавтаÑÐ½Ð°Ð°Ñ ÑƒÑтгагдлаа. $_CLICK # ^UninstallingSubText УÑтгагдах газар: # ^FileError Файл бичихÑÑÑ€ нÑÑÑ…Ñд алдлаа: \r\n\t"$0"\r\nТаÑлах дарвал Ñуулгалт таÑлагдана,\r\nÐ”Ð°Ñ…ÑŒÑ Ð´Ð°Ñ€Ð²Ð°Ð» файлыг бичихÑÑÑ€ дахин оролдоно,\r\nÑÑвÑл Үл тоох дарвал уг файлыг алгаÑна # ^FileError_NoIgnore Файл бичихÑÑÑ€ нÑÑÑ…Ñд алдлаа: \r\n\t"$0"\r\nÐ”Ð°Ñ…Ð¸Ñ Ð´Ð°Ñ€Ð²Ð°Ð» файлыг бичихÑÑÑ€ дахин оролдоно, \r\nÑÑвÑл болих дарвал Ñуулгалт таÑлагдана # ^CantWrite "Бичиж чадÑангүй: " # ^CopyFailed Хуулалт бүтÑÑнгүй # ^CopyTo "Хуулах нь " # ^Registering "БүртгÑж байна: " # ^Unregistering "БүртгÑлийг арилгаж байна: " # ^SymbolNotFound "ТÑмдÑг хайгдÑангүй: " # ^CouldNotLoad "ДуудагдÑангүй: " # ^CreateFolder "Ò®Ò¯ÑгÑÑ… хавтаÑ: " # ^CreateShortcut "Ò®Ò¯ÑгÑÑ… shortcut: " # ^CreatedUninstaller "Ò®Ò¯ÑÑÑн uninstaller: " # ^Delete "Файл уÑтгах: " # ^DeleteOnReboot "Д.ачаалахад уÑтгах: " # ^ErrorCreatingShortcut "Shortcut Ò¯Ò¯ÑгÑÑ…Ñд алдлаа: " # ^ErrorCreating "Ò®Ò¯ÑгÑÑ… алдаа: " # ^ErrorDecompressing Өгөгдөл задлахад алдлаа! Суулгац ÑвдÑрчÑÑ? # ^ErrorRegistering DLL бүртгүүлÑÑ…Ñд алдлаа # ^ExecShell "Ðжиллуулах команд(ExecShell): " # ^Exec "Ðжиллуулах: " # ^Extract "Задлах: " # ^ErrorWriting "Задлалт:файл руу бичихÑд алдаа " # ^InvalidOpcode Суулгац ÑвдÑрчÑÑ: задлах код буруу # ^NoOLE "OLE байхгүй: " # ^OutputFolder "Гаргах хавтаÑ: " # ^RemoveFolder "УÑтгах хавтаÑ: " # ^RenameOnReboot "Д.ачаалахад дахин нÑрлÑÑ…: " # ^Rename "Дахин нÑрлÑÑ…: " # ^Skipped "ÐлгаÑÑан: " # ^CopyDetails ДÑлгÑÑ€Ñнгүйг Clipboard руу хуулах # ^LogInstall Суулгах Ñвцын баримт # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Mongolian.nsh000077500000000000000000000233761477201124000212710ustar00rootroot00000000000000;Language: Mongolian (1104) ;By Bayarsaikhan Enkhtaivan !insertmacro LANGFILE "Mongolian" "Mongolian (Cyrillic)" "Монгол Кирилл" "Mongol kirill" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Суулгацад тавтай морил" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "$(^NameDA) Ñуулгацын илбÑчинг та шууд ашиглаж болно.$\r$\n$\r$\nҮүнийг Ñуулгахын өмнө буÑад бүх програмуудаа хаахыг зөвлөж байна. СиÑтемийн файлуудыг шинÑчилбÑл компьютерÑÑ Ð´Ð°Ñ…Ð¸Ð½ ачаалахгүй байх боломжтой.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Суулгацыг уÑтгах илбÑчинд тавтай морил" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "$(^NameDA) уÑтгацын илбÑчинг та шууд ашиглаж болно.$\r$\n$\r$\nУÑтгахын өмнө $(^NameDA) нь ажиллаагүй ÑÑÑхийг шалга.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензийн зөвшөөрөл" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)-ыг Ñуулгахынхаа өмнө зөвшилцлийн зүйлүүдийг уншина уу." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ð¥ÑÑ€Ñв зөвшилцлийн зүйлÑийг зөвшөөрч байвал, Зөвшөөрлөө товчийг даран үргÑÐ»Ð¶Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. $(^NameDA)-ыг Ñуулгахын тулд заавал зөвшөөрөх шаардлагатай." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ð¥ÑÑ€Ñв зөвшилцлийн зүйлÑийг зөвшөөрч байвал, Зөвлөх хайрцгийг даран үргÑÐ»Ð¶Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. $(^NameDA)-ыг Ñуулгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ð¥ÑÑ€Ñв зөвшилцлийн зүйлÑийг зөвшөөрч байвал, Ð´Ð¾Ð¾Ñ€Ñ…Ð¾Ð¾Ñ Ñхнийг нь Ñонгон үргÑÐ»Ð¶Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. $(^NameDA)-ыг Ñуулгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензийн зөвшөөрөл" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) уÑтгахын өмнө зөвшилцлийн зүйлÑийг уншина уу." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ð¥ÑÑ€Ñв зөвшилцлийн зүйлÑийг зөвшөөрч байвал, Зөвшөөрлөө товчийг даран үргÑÐ»Ð¶Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. $(^NameDA)-ыг уÑтгахын тулд заавал зөвшөөрөх шаардлагатай." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ð¥ÑÑ€Ñв зөвшилцлийн зүйлÑийг зөвшөөрч байвал, Зөвлөх хайрцгийг даран үргÑÐ»Ð¶Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. $(^NameDA)-ыг уÑтгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ð¥ÑÑ€Ñв зөвшилцлийн зүйлÑийг зөвшөөрч байвал, Ð´Ð¾Ð¾Ñ€Ñ…Ð¾Ð¾Ñ Ñхнийг нь Ñонгон үргÑÐ»Ð¶Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. $(^NameDA)-ыг уÑтгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Page Down товчийг даран зөвшилцлийг доош гүйлгÑÐ½Ñ Ò¯Ò¯." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ÐÑгдлийг Ñонгох" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA)-ыг Ñуулгахад шаардагдах Ñ…ÑÑгийг Ñонгоно уу." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ÐÑгдлийг Ñонгох" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)-ын уÑтгах шаардлагатай нÑгдлийг Ñонгох." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Тайлбар" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Та хулганаараа нÑгдлийн дÑÑÑ€ очиход түүний тайлбарыг харуулна." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÐÑгдлийг Ñонговол түүний тайлбарыг харна." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Суулгах байрлалыг Ñонгох" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) Ñуулгацын Ñуулгах замыг Ñонго." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "УÑтгацын байрлалыг Ñонгох" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)-ыг уÑтгах хавтÑыг Ñонгох." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Суулгаж байна" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)-ыг Ñуулгаж дууÑтал түр хүлÑÑÐ½Ñ Ò¯Ò¯." ${LangFileString} MUI_TEXT_FINISH_TITLE "Суулгаж дууÑлаа" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Суулгац амжилттай болов." ${LangFileString} MUI_TEXT_ABORT_TITLE "Суулгалт таÑлагдлаа" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Суулгалт амжилтгүй болов." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "УÑтгаж байна" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) -ыг зайлуулж дууÑтал түр хүлÑÑÐ½Ñ Ò¯Ò¯." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "УÑтгаж дууÑлаа" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "УÑтгалт амжилттай дууÑлаа." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "УÑтгац таÑлагдлаа" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "УÑтгалт амжилтгүй боллоо." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) Суулгацын илбÑчин дууÑлаа" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) нь таны компьютерт Ñуулаа.$\r$\n$\r$\nТөгÑгөл дÑÑÑ€ дарвал хаана." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)-ын Ñуулгацын дараалалд та компьютерÑÑ Ð´Ð°Ñ…Ð¸Ð½ ачаалÑнаар дууÑна. Та дахин ачаалахыг Ñ…Ò¯ÑÑж байна уу?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) УÑтгацын илбÑчин дууÑлаа" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) нь таны компьютерÑÑÑ Ð·Ð°Ð¹Ð»ÑƒÑƒÐ»Ð°Ð³Ð´Ð»Ð°Ð°.$\r$\n$\r$\nТөгÑгөл дÑÑÑ€ дарвал хаана." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) УÑтгацын дараалалд та компьютерÑÑ Ð´Ð°Ñ…Ð¸Ð½ ачаалÑнаар дууÑна. Та д.ачаалмаар байна уу?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Д.Ðчаал" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Би дараа д.ачаалахыг Ñ…Ò¯ÑÑж байна." ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) ажиллуулах" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Readme харуулах" ${LangFileString} MUI_BUTTONTEXT_FINISH "&ТөгÑгөл" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Start цÑÑний хавтÑыг Ñонго" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Start цÑÑ Ð´ÑÑ… $(^NameDA) shortcut-ын хавтÑыг Ñонго." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Start цÑÑÑнд програмын shortcut Ò¯Ò¯ÑгÑÑ… хавтÑыг Ñонго. ЭÑвÑл та ÑˆÐ¸Ð½Ñ Ð½ÑÑ€ÑÑÑ€ Ò¯Ò¯ÑгÑж болно." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Shortcut Ò¯Ò¯ÑгÑхгүй" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)--ын УÑтгац" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) -ыг таны компьютерÑÑÑ Ð·Ð°Ð¹Ð»ÑƒÑƒÐ»Ð°Ñ…." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) -ын ÑÑƒÑƒÐ»Ð³Ð°Ñ†Ð°Ð°Ñ Ð³Ð°Ñ€Ð¼Ð°Ð°Ñ€ байна уу?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) УÑÑ‚Ð³Ð°Ñ†Ð°Ð°Ñ Ð³Ð°Ñ€Ð¼Ð°Ð°Ñ€ байна уу?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Ð¥ÑÑ€ÑглÑгч Ñонгох" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "$(^NameDA)-ыг аль Ñ…ÑÑ€ÑглÑгчид зориулж Ñуулгах вÑ." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA)-ыг зөвхөн өөртөө ÑÑвÑл ÑÐ½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ дÑÑрх бүх Ñ…ÑÑ€ÑглÑгчдÑд зориулж Ñуулгахыг Ñонго. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ дÑÑрх бүх Ñ…ÑÑ€ÑглÑчдÑд Ñуулгах" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Зөвхөн өөртөө Ñуулгах" !endif nsis-3.11/Contrib/Language files/Norwegian.nlf000077500000000000000000000117221477201124000212560ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1044 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Jonas Lindstrøm (jonasc_88@hotmail.com). Reviewed and fixed by Jan Ivar Beddari # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) installasjon # ^UninstallCaption $(^Name) avinstallasjon # ^LicenseSubCaption : Lisensavtale # ^ComponentsSubCaption : Installasjonsvalg # ^DirSubCaption : Installasjonsmappe # ^InstallingSubCaption : Installerer # ^CompletedSubCaption : Ferdig # ^UnComponentsSubCaption : Avinstallasjonsvalg # ^UnDirSubCaption : Avinstallasjonsmappe # ^ConfirmSubCaption : Bekreft # ^UninstallingSubCaption : Avinstallerer # ^UnCompletedSubCaption : Ferdig # ^BackBtn < &Tilbake # ^NextBtn &Neste > # ^AgreeBtn &Godta # ^AcceptBtn Jeg &godtar vilkÃ¥rene i lisensavtalen # ^DontAcceptBtn Jeg godtar &ikke vilkÃ¥rene i lisensavtalen # ^InstallBtn &Installer # ^UninstallBtn &Avinstaller # ^CancelBtn Avbryt # ^CloseBtn &Lukk # ^BrowseBtn Bla &gjennom... # ^ShowDetailsBtn Vis &detaljer # ^ClickNext Trykk Neste for Ã¥ fortsette. # ^ClickInstall Trykk Installer for Ã¥ starte installasjonen. # ^ClickUninstall Trykk Avinstaller for Ã¥ starte avinstallasjonen. # ^Name Navn # ^Completed Ferdig # ^LicenseText Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkÃ¥rene i avtalen, trykk pÃ¥ Godta. # ^LicenseTextCB Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkÃ¥rene i avtalen, merk av under. $_CLICK # ^LicenseTextRB Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkÃ¥rene i avtalen, velg det første alternativet. $_CLICK # ^UnLicenseText Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkÃ¥rene i avtalen, trykk pÃ¥ Godta. # ^UnLicenseTextCB Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkÃ¥rene i avtalen, merk av under. $_CLICK # ^UnLicenseTextRB Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkÃ¥rene i avtalen, velg det første alternativet. $_CLICK # ^Custom Egendefinert # ^ComponentsText Merk komponentene du vil installere og fjern merkingen for de du ikke vil installere. $_CLICK # ^ComponentsSubText1 Velg hvilken mÃ¥te du vil installere pÃ¥: # ^ComponentsSubText2_NoInstTypes Merk komponenter du vil installere: # ^ComponentsSubText2 Eller merk de valgfrie komponentene du ønsker Ã¥ installere: # ^UnComponentsText Merk komponentene du vil avinstallere og fjern merkingen for de du vil beholde. $_CLICK # ^UnComponentsSubText1 Velg hvilken mÃ¥te du vil avinstallere pÃ¥: # ^UnComponentsSubText2_NoInstTypes Merk komponenter du vil avinstallere: # ^UnComponentsSubText2 Eller merk de valgfrie komponentene du ønsker Ã¥ avinstallere: # ^DirText $(^Name) vil bli installert i følgende mappe. For Ã¥ velge en annen mappe, trykk Bla gjennom. $_CLICK # ^DirSubText MÃ¥lmappe # ^DirBrowseText Velg mappe du vil installere $(^Name) i: # ^UnDirText $(^Name) i følgende mappe vil bli avinstallert. For Ã¥ velge en annen mappe, trykk Bla gjennom. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Velg mappe du vil avinstallere $(^Name) fra: # ^SpaceAvailable "Ledig plass: " # ^SpaceRequired "Nødvendig plass: " # ^UninstallingText Denne veiviseren vil avinstallere $(^Name) fra din datamaskin. $_CLICK # ^UninstallingSubText Avinstallerer fra: # ^FileError Feil under Ã¥pning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Avbryt for Ã¥ avbryte installasjonen,\r\nPrøv igjen for Ã¥ prøve igjen, eller\r\nIgnorer for Ã¥ hoppe over denne filen # ^FileError_NoIgnore Feil under Ã¥pning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Prøv igjen for Ã¥ prøve igjen, or\r\neller Avbryt for Ã¥ avbryte installasjonen # ^CantWrite "Kan ikke skrive: " # ^CopyFailed Kopiering mislyktes # ^CopyTo "Kopier til " # ^Registering "Registrerer: " # ^Unregistering ""Avregistrerer: " # ^SymbolNotFound "Kunne ikke finne symbol: " # ^CouldNotLoad "Kunne ikke laste: " # ^CreateFolder "Lag mappe: " # ^CreateShortcut "Lag snarvei: " # ^CreatedUninstaller "Avinstallasjon laget: " # ^Delete "Slett fil: " # ^DeleteOnReboot "Slett ved omstart: " # ^ErrorCreatingShortcut "Feil under opprettelse av snarvei: " # ^ErrorCreating "Feil under opprettelse av: " # ^ErrorDecompressing Feil under utpakking av data! Installasjonsprogrammet kan være skadet. # ^ErrorRegistering Feil under registrering av DLL # ^ExecShell "ExecShell: " # ^Exec "Kjøre: " # ^Extract "Pakk ut: " # ^ErrorWriting "Pakk ut: Feil under skriving til fil " # ^InvalidOpcode Installasjonsprogrammet er skadet: ukjent kode # ^NoOLE "Ingen OLE for: " # ^OutputFolder "Ut-mappe: " # ^RemoveFolder "Fjern mappe: " # ^RenameOnReboot "Gi nytt navn ved omstart: " # ^Rename "Gi nytt navn: " # ^Skipped "Hoppet over: " # ^CopyDetails Kopier detaljer til utklippstavlen # ^LogInstall Loggfør installasjonsprosessen # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Norwegian.nsh000077500000000000000000000174761477201124000213030ustar00rootroot00000000000000;Language: Norwegian (2068) ;By Jonas Lindsrøm (jonasc_88@hotmail.com) Reviewed and fixed by Jan Ivar Beddari, d0der at online.no !insertmacro LANGFILE "Norwegian" = "Norsk" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til veiviseren for installasjon av $(^NameDA) " ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne veiviseren vil lede deg gjennom installasjonen av $(^NameDA).$\r$\n$\r$\nDet anbefales at du avslutter alle andre programmer før du fortsetter. Dette vil la installasjonsprogrammet forandre pÃ¥ systemfiler uten at du mÃ¥ starte datamaskinen pÃ¥ nytt.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til veiviseren for avinstallasjon av $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne veiviseren vil lede deg gjennom avinstallasjonen av $(^NameDA).$\r$\n$\r$\nFør du fortsetter mÃ¥ du forsikre deg om at $(^NameDA) ikke kjører.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensavtale" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vennligst les gjennom lisensavtalen før du starter installasjonen av $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Hvis du godtar lisensavtalen trykk Godta for Ã¥ fortsette. Du mÃ¥ godta lisensavtalen for Ã¥ installere $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du godtar lisensavtalen, kryss av pÃ¥ merket under. Du mÃ¥ godta lisensavtalen for Ã¥ installere $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du godtar lisensavtalen, velg det første alternativet ovenfor. Du mÃ¥ godta lisensavtalen for Ã¥ installere $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensavtale" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vennligst les gjennom lisensavtalen før du avinstallerer $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Hvis du godtar lisensavtalen trykk Godta for Ã¥ fortsette. Du mÃ¥ godta lisensavtalen for Ã¥ avintallere $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du godtar lisensavtalen, kryss av pÃ¥ merket under. Du mÃ¥ godta lisensavtalen for Ã¥ avinstallere $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du godtar lisensavtalen, velg det første alternativet ovenfor. Du mÃ¥ godta lisensavtalen for Ã¥ avinstallere $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Trykk Page Down knappen for Ã¥ se resten av lisensavtalen." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Velg komponenter" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Velg hvilke deler av $(^NameDA) du ønsker Ã¥ installere." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Velg komponenter" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Velg hvilke deler av $(^NameDA) du ønsker Ã¥ avinstallere." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivelse" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musen over komponentene for Ã¥ se beskrivelsen." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Velg en komponent for Ã¥ se beskrivelsen." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Velg installasjonsmappe" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Velg hvilken mappe du vil installere $(^NameDA) i." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Velg mappe for avinstallasjon" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Velg mappen du vil avinstallere $(^NameDA) fra." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installasjonen pÃ¥gÃ¥r" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vennligst vent mens $(^NameDA) blir installert." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installasjonen er ferdig" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installasjonen ble fullført uten feil." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installasjonen er avbrutt" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installasjonen ble ikke fullført riktig." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallasjon pÃ¥gÃ¥r" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vennligst vent mens $(^NameDA) blir avinstallert." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallasjon ferdig" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallasjonen ble utført uten feil." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallasjon avbrutt" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallasjonen ble ikke utført riktig." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Avslutter $(^NameDA) installasjonsveiviser" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er klart til bruk pÃ¥ din datamskin.$\r$\n$\r$\nTrykk Ferdig for Ã¥ avslutte installasjonsprogrammet." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Du mÃ¥ starte datamaskinen pÃ¥ nytt for Ã¥ fullføre installasjonen av $(^NameDA). Vil du starte datamaskinen pÃ¥ nytt nÃ¥?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fullfører avinstallasjonen av $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) har blitt avinstallert fra din datamaskin.$\r$\n$\r$\nTrykk pÃ¥ ferdig for Ã¥ avslutte denne veiviseren." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Datamaskinen mÃ¥ starte pÃ¥ nytt for Ã¥ fullføre avinstallasjonen av $(^NameDA). Vil du starte datamaskinen pÃ¥ nytt nÃ¥?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ja. Start datamaskinen pÃ¥ nytt nÃ¥" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nei. Jeg vil starte datamaskinen pÃ¥ nytt senere" ${LangFileString} MUI_TEXT_FINISH_RUN "&Kjør $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vis Readme filen" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ferdig" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Velg plassering pÃ¥ startmenyen" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Velg hvilken mappe snarveiene til $(^NameDA) skal ligge i." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Velg mappe for snarveiene til programmet. Du kan ogsÃ¥ skrive inn et nytt navn for Ã¥ lage en ny mappe." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ikke lag snarveier" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstaller $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Fjern $(^NameDA) fra din datamaskin." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Er du sikker pÃ¥ at du vil avslutte installasjonen av $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du sikker pÃ¥ at du vil avbryte avinstallasjonen av $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Velg brukere" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Velg hvilke brukere du vil installere $(^NameDA) for." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Velg om du vil installere $(^NameDA) bare for deg selv, eller for alle som bruker denne maskinen. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer for alle som bruker denne maskinen" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer bare for meg" !endif nsis-3.11/Contrib/Language files/NorwegianNynorsk.nlf000077500000000000000000000116411477201124000226420ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 2068 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Vebjørn Sture, vsture gmail com # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) installasjon # ^UninstallCaption $(^Name) avinstallasjon # ^LicenseSubCaption : Lisensavtale # ^ComponentsSubCaption : Installasjonsval # ^DirSubCaption : Installasjonsmappe # ^InstallingSubCaption : Installerer # ^CompletedSubCaption : Ferdig # ^UnComponentsSubCaption : Avinstallasjonsval # ^UnDirSubCaption : Avinstallasjonsmappe # ^ConfirmSubCaption : Stadfest # ^UninstallingSubCaption : Avinstallerer # ^UnCompletedSubCaption : Ferdig # ^BackBtn < &Attende # ^NextBtn &Neste > # ^AgreeBtn &Godta # ^AcceptBtn Eg &godtek vilkÃ¥ra i lisensavtalen # ^DontAcceptBtn Eg godtek &ikkje vilkÃ¥ra i lisensavtalen # ^InstallBtn &Installer # ^UninstallBtn &Avinstaller # ^CancelBtn Avbryt # ^CloseBtn &Lat att # ^BrowseBtn Bla &gjennom ... # ^ShowDetailsBtn Syn &detaljar # ^ClickNext Trykk Neste for Ã¥ halda fram. # ^ClickInstall Trykk Installer for Ã¥ starta installasjonen. # ^ClickUninstall Trykk Avinstaller for Ã¥ starta avinstallasjonen. # ^Name Namn # ^Completed Ferdig # ^LicenseText Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkÃ¥ra i avtalen, trykk pÃ¥ Godta. # ^LicenseTextCB Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkÃ¥ra i avtalen, merk av under. $_CLICK # ^LicenseTextRB Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkÃ¥ra i avtalen, vel det fyrste alternativet. $_CLICK # ^UnLicenseText Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkÃ¥ra i avtalen, trykk pÃ¥ Godta. # ^UnLicenseTextCB Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkÃ¥ra i avtalen, merk av under. $_CLICK # ^UnLicenseTextRB Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkÃ¥ra i avtalen, vel det fyrste alternativet. $_CLICK # ^Custom Eigendefinert # ^ComponentsText Merk komponentane du vil installera og fjern merkinga for dei du ikkje vil installera. $_CLICK # ^ComponentsSubText1 Vel kva mÃ¥te du vil installera pÃ¥: # ^ComponentsSubText2_NoInstTypes Merk komponentar du vil installera: # ^ComponentsSubText2 Eller merk dei valfrie komponentane du ynskjer Ã¥ installera: # ^UnComponentsText Merk komponentane du vil avinstallera og fjern merkinga for dei du vil ta vare pÃ¥. $_CLICK # ^UnComponentsSubText1 Vel kva mÃ¥te du vil avinstallera pÃ¥: # ^UnComponentsSubText2_NoInstTypes Merk komponentar du vil avinstallera: # ^UnComponentsSubText2 Eller merk dei valfrie komponentane du ynskjer Ã¥ avinstallera: # ^DirText $(^NameDA) vil verta installert i fylgjande mappe. For Ã¥ velja ei anna mappe, trykk Bla gjennom. $_CLICK # ^DirSubText MÃ¥lmappe # ^DirBrowseText Vel mappe du vil installera $(^NameDA) i: # ^UnDirText $(^NameDA) i fylgjande mappe vil verta avinstallert. For Ã¥ velja ei anna mappe, trykk Bla gjennom. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Vel mappe du vil avinstallera $(^NameDA) frÃ¥: # ^SpaceAvailable "Ledig plass: " # ^SpaceRequired "Naudsynt plass: " # ^UninstallingText Denne vegvisaren vil avinstallera $(^NameDA) frÃ¥ din datamaskin. $_CLICK # ^UninstallingSubText Avinstallerer frÃ¥: # ^FileError Feil under opning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Avbryt for Ã¥ avbryta installasjonen,\r\nPrøv igjen for Ã¥ prøva igjen, eller\r\nIgnorer for Ã¥ hoppa over denne fila # ^FileError_NoIgnore Feil under opning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Prøv igjen for Ã¥ prøva igjen, or\r\neller Avbryt for Ã¥ avbryta installasjonen # ^CantWrite "Kan ikkje skriva: " # ^CopyFailed Kopiering mislukka # ^CopyTo "Kopier til " # ^Registering "Registrerer: " # ^Unregistering ""Avregistrerer: " # ^SymbolNotFound "Kunne ikkje finna symbol: " # ^CouldNotLoad "Kunne ikkje lasta: " # ^CreateFolder "Lag mappe: " # ^CreateShortcut "Lag snarveg: " # ^CreatedUninstaller "Avinstallasjon laga: " # ^Delete "Slett fil: " # ^DeleteOnReboot "Slett ved omstart: " # ^ErrorCreatingShortcut "Feil under oppretting av snarveg: " # ^ErrorCreating "Feil under oppretting av: " # ^ErrorDecompressing Feil under utpakking av data! Installasjonsprogrammet kan vera skadd. # ^ErrorRegistering Feil under registrering av DLL # ^ExecShell "ExecShell: " # ^Exec "Køyra: " # ^Extract "Pakk ut: " # ^ErrorWriting "Pakk ut: Feil under skriving til fil " # ^InvalidOpcode Installasjonsprogrammet er skadd: ukjend kode # ^NoOLE "Ingen OLE for: " # ^OutputFolder "Ut-mappe: " # ^RemoveFolder "Fjern mappe: " # ^RenameOnReboot "Gje nytt namn ved omstart: " # ^Rename "Gje nytt namn: " # ^Skipped "Hoppa over: " # ^CopyDetails Kopier detaljar til utklyppstavla # ^LogInstall Loggfør installasjonsprosessen # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/NorwegianNynorsk.nsh000077500000000000000000000171501477201124000226540ustar00rootroot00000000000000;Language: Norwegian nynorsk (2068) ;By Vebjoern Sture and HÃ¥vard Mork (www.firefox.no) !insertmacro LANGFILE "NorwegianNynorsk" "Norwegian (Nynorsk)" "Norsk (nynorsk)" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til $(^NameDA) innstallasjonsvegvisar" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne vegvisaren vil leie deg gjennom installeringa av $(^NameDA).$\n$\nDet er tilrÃ¥dd at du avsluttar alle andre program før du held fram. Dette vil la installeringsprogrammet oppdatera systemfiler utan at du mÃ¥ starta datamaskinen pÃ¥ nytt.$\n$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til avinstallering av $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne vegvisaren vil leie deg gjennom avinstalleringen av $(^NameDA).$\n$\nFør du fortsetter mÃ¥ du forsikre deg om at $(^NameDA) ikkje er opent.$\n$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensavtale" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Les gjennom lisensavtalen før du startar installeringa av $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Trykk pÃ¥ «Godta» dersom du godtar betingelsane i avtala. Du mÃ¥ godta avtala for Ã¥ installere $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Trykk pÃ¥ avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du mÃ¥ godta avtala for Ã¥ installere $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Vel det første alternativet nedanfor dersom du godtek vilkÃ¥ra i avtala. Du mÃ¥ godta avtala for Ã¥ installera $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensavtale" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Les gjennom lisensavtalen før du startar avinstalleringa av $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Trykk pÃ¥ «Godta» dersom du godtar betingelsane i avtala. Du mÃ¥ godta avtala for Ã¥ avinstallera $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Trykk pÃ¥ avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du mÃ¥ godta avtala for Ã¥ avinstallera $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Vel det første alternativet nedanfor dersom du godtar betingelsane i avtala. Du mÃ¥ godta avtala for Ã¥ avinstallera $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Trykk Page Down-knappen for Ã¥ sjÃ¥ resten av lisensavtala." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vel komponentar" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vel kva delar av $(^NameDA) du ynskjer Ã¥ installera." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vel funksjonar" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vel kva for funksjonar du vil avinstallera i $(^NameDA)." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskriving" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musa over komponentene for Ã¥ sjÃ¥ beskrivinga." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vel ein komponent for Ã¥ sjÃ¥ beskrivinga." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vel installasjonsmappe" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vel kva mappe du vil installera $(^NameDA) i." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vel avinstalleringplassering" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vel mappa du vil avinstallere $(^NameDA) frÃ¥." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerer" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vent mens $(^NameDA) blir installert." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installeringa er fullført" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installeringa vart fullført." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installeringa vart avbroten" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installeringa vart ikkje fullført." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallerer" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vent medan $(^NameDA) vert avinstallert." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallering ferdig" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallering ble utført uten feil." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallering broten" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallering ble ikkje utført riktig." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Installering fullført" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er installert og klar til bruk.$\n$\nTrykk pÃ¥ «Fullfør» for Ã¥ avslutte installeringa." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Du mÃ¥ starta datamaskinen pÃ¥ nytt for Ã¥ fullføra installeringa av $(^NameDA). Vil du starta pÃ¥ nytt no?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fullfører avinstalleringa av $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) er no avinstallert frÃ¥ datamaskina di.$\n$\nTrykk pÃ¥ «Fullfør» for Ã¥ avslutta denne vegvisaren." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Datamaskinen mÃ¥ starta pÃ¥ nytt for Ã¥ fullføra avinstalleringa av $(^NameDA). Vil du starta datamaskina pÃ¥ nytt no?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Start pÃ¥ nytt no" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eg vil starta pÃ¥ nytt seinare" ${LangFileString} MUI_TEXT_FINISH_RUN "&Køyr $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Syn lesmeg" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fullfør" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vel mappe pÃ¥ startmenyen" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vel kva mappe snarvegane til $(^NameDA) skal liggja i." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vel mappa du vil oppretta snarvegane til programmet i. Du kan òg skriva inn eit nytt namn for Ã¥ laga ei ny mappe." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ikkje opprett snarvegar" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstaller $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Slett $(^NameDA) frÃ¥ datamaskinen." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Er du viss pÃ¥ at du vil avslutta installeringa av $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du viss pÃ¥ at du vil avbryta avinstalleringa av $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Vel brukarar" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vel kva brukarar du vil installere $(^NameDA) for." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vel om du vil installere $(^NameDA) berre for deg, eller for alle som nyttar denne maskina. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer for alle som nyttar maskina" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer berre for me" !endif nsis-3.11/Contrib/Language files/Pashto.nlf000077500000000000000000000144601477201124000205650ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1123 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1256 # RTL - anything else than RTL means LTR RTL # Translation by Pakhtosoft (www.pakhtosoft.com) # ^Branding Nullsoft Install System %s # ^SetupCaption امسته $(^Name) # ^UninstallCaption نالګاو $(^Name) # ^LicenseSubCaption : منښتليک تړون # ^ComponentsSubCaption : لګاو غوراوي # ^DirSubCaption : لګاو Ù¾ÙˆÚšÛ # ^InstallingSubCaption : Ù„Ú«ÙŠÚ–ÙŠ # ^CompletedSubCaption : بشپړ # ^UnComponentsSubCaption : نالګاو غوراوي # ^UnDirSubCaption : نالګاو Ù¾ÙˆÚšÛ # ^ConfirmSubCaption : باورول # ^UninstallingSubCaption : نالګيږي # ^UnCompletedSubCaption : بشپړ # ^BackBtn < &وروسته # ^NextBtn &Ù…Ø®Ú©ÚšÛ > # ^AgreeBtn زه &منم # ^AcceptBtn زه &د منښتليک توکي منم # ^DontAcceptBtn زه &د منښتليک توکي نه منم # ^InstallBtn &لګول # ^UninstallBtn &نالګول # ^CancelBtn بندول # ^CloseBtn &بندول # ^BrowseBtn ...Ú†&Ú¼Ù„ # ^ShowDetailsBtn Ø®Ø¨Ø±ØªÙŠØ§ÙˆÛ &ښودل # ^ClickNext .Ù…Ø®Ú©ÚšÛ ØªÙ„Ùˆ لپاره Ù…Ø®Ú©ÚšÛ Ù¼Ú© وهئ # ^ClickInstall .لګاو Ù¾Ûلولو لپاره لګول Ù¼Ú© وهئ # ^ClickUninstall .نالګاو Ù¾Ûلولو لپاره نالګول Ù¼Ú© وهئ # ^Name نوم # ^Completed بشپړ # ^LicenseText .د لګولو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© وګورئ. Ú©Ù‡ Ú†ÛØ±Û ØªØ§Ø³Û Ø¯ منښتليک ټول توکي منئ، زه منم Ù¼Ú© وهئ $(^NameDA) د # ^LicenseTextCB $_CLICK .د لګولو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© وګورئ. Ú©Ù‡ Ú†ÛØ±Û ØªØ§Ø³Û Ø¯ منښتليک ټول توکي منئ، Ù„Ø§Ù†Ø¯Û Ø®ÙˆÚšØ¨Ú©Ø³ Ù¼Ú© وهئ $(^NameDA) د # ^LicenseTextRB $_CLICK .د لګولو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© وګورئ. Ú©Ù‡ Ú†ÛØ±Û ØªØ§Ø³Û Ø¯ منښتليک ټول توکي منئ، Ù„Ø§Ù†Ø¯Û Ù„Ù…Ú“ÛŒ غوراوی خوښ کړئ $(^NameDA) د # ^UnLicenseText .د نالګاو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© وګورئ. Ú©Ù‡ Ú†ÛØ±Û ØªØ§Ø³Û Ø¯ منښتليک ټول توکي منئ، زه منم Ù¼Ú© وهئ $(^NameDA) د # ^UnLicenseTextCB $_CLICK .د نالګاو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© وګورئ. Ú©Ù‡ Ú†ÛØ±Û ØªØ§Ø³Û Ø¯ منښتليک ټول توکي منئ، Ù„Ø§Ù†Ø¯Û Ø®ÙˆÚšØ¨Ú©Ø³ Ù¼Ú© وهئ $(^NameDA) د # ^UnLicenseTextRB $_CLICK .د نالګاو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© وګورئ. Ú©Ù‡ Ú†ÛØ±Û ØªØ§Ø³Û Ø¯ منښتليک ټول توکي منئ، Ù„Ø§Ù†Ø¯Û Ù„Ù…Ú“ÛŒ غوراوي خوښ کړئ $(^NameDA) د # ^Custom دوديز # ^ComponentsText $_CLICK .کوم رغتوکي Ú†Û Ù„Ú«ÙˆÙ„ غواړئ خوښ ÙŠÛ Ú©Ú“Ø¦ او کوم رغتوکي Ú†Û Ù†Ù‡ غواړئ ÙˆÙŠÛ Ù„Ú«ÙˆØ¦ مه ÙŠÛ Ø®ÙˆÚšÙˆØ¦ # ^ComponentsSubText1 :د لګاو ډول وټاکئ # ^ComponentsSubText2_NoInstTypes :د لګولو لپاره رغتوکي خوښ کړئ # ^ComponentsSubText2 :يا، هغه غوراويز رغتوکي Ú†Û Ù„Ú«ÙˆÙ„ ÙŠÛ ØºÙˆØ§Ú“Ø¦ وټاکئ # ^UnComponentsText $_CLICK .کوم رغتوکي Ú†Û Ù†Ø§Ù„Ú«ÙˆÙ„ غواړئ خوښ ÙŠÛ Ú©Ú“Ø¦ او کوم رغتوکي Ú†Û Ù†Ù‡ غواړئ ÙˆÙŠÛ Ù†Ø§Ù„Ú«ÙˆØ¦ مه ÙŠÛ Ø®ÙˆÚšÙˆØ¦ # ^UnComponentsSubText1 :د نالګاو ډول وټاکئ # ^UnComponentsSubText2_NoInstTypes :د نالګولو لپاره رغتوکي وټاکئ # ^UnComponentsSubText2 :يا، هغه غوراويز رغتوکي Ú†Û Ù†Ø§Ù„Ú«ÙˆÙ„ ÙŠÛ ØºÙˆØ§Ú“Ø¦ وټاکئ # ^DirText $_CLICK .په Ù„Ø§Ù†Ø¯Û Ù¾ÙˆÚšÛ Ú©ÚšÛ ÙˆÙ„Ú«ÙˆÙŠ. په Ø¨Ù„Û Ù¾ÙˆÚšÛ Ú©ÚšÛ ÙŠÛ Ø¯ لګولو لپاره، Ú†Ú¼Ù„ Ù¼Ú© وهئ او بله Ù¾ÙˆÚšÛ ÙˆÙ¼Ø§Ú©Ø¦ $(^NameDA) امسته به # ^DirSubText موخه Ù¾ÙˆÚšÛ # ^DirBrowseText :Ù¾Ú©ÚšÛ Ù„Ú«ÙˆÙ„ غواړئ وټاکئ $(^NameDA) هغه Ù¾ÙˆÚšÛ Ú†Û # ^UnDirText $_CLICK .د Ù„Ø§Ù†Ø¯Û Ù¾ÙˆÚšÛ Ù†Ù‡ ونالګوي. د Ø¨Ù„Û Ù¾ÙˆÚšÛ Ù†Û Ø¯ نالګولو لپاره، Ú†Ú¼Ù„ Ù¼Ú© وهئ او بله Ù¾ÙˆÚšÛ ÙˆÙ¼Ø§Ú©Ø¦ $(^NameDA) امسته به # ^UnDirSubText "" # ^UnDirBrowseText :ØªØ±Û Ù†Ø§Ù„Ú«ÙˆÙ„ غواړئ وټاکئ $(^NameDA) هغه Ù¾ÙˆÚšÛ Ú†Û # ^SpaceAvailable " :شته تشه" # ^SpaceRequired " :اړينه تشه" # ^UninstallingText $_CLICK .به د Ù„Ø§Ù†Ø¯Û Ù¾ÙˆÚšÛ Ù†Ù‡ ونالګول شي $(^NameDA) # ^UninstallingSubText :نالګيږي له # ^FileError :د ليکلو لپاره د Ø¯ÙˆØªÙ†Û Ù¾Ø±Ø§Ù†ÙŠØ³ØªÙ„Ùˆ Ú©ÚšÛ Ø³ØªÙˆÙ†Ø²Ù‡ \r\n\r\n$0\r\n\r\n،د لګاو د بندولو لپاره بندول Ù¼Ú© وهئ\r\nبياهڅه د بيا Ù‡Ú…Û Ú©ÙˆÙ„Ùˆ لپاره، يا\r\n.پرÛږده د Ø¯Û Ø¯ÙˆØªÙ†Û Ù¾Ø±Ûښودلو لپاره # ^FileError_NoIgnore :د ليکلو لپاره د Ø¯ÙˆØªÙ†Û Ù¾Ø±Ø§Ù†ÙŠØ³ØªÙ„Ùˆ Ú©ÚšÛ Ø³ØªÙˆÙ†Ø²Ù‡ \r\n\r\n$0\r\n\r\nد بيا Ù‡Ú…Û Ú©ÙˆÙ„Ùˆ لپاره بياهڅه Ù¼Ú© وهئ، يا\r\n.بندول د لګاو د بندولو لپاره # ^CantWrite " :نشي ليکلی" # ^CopyFailed Ù„Ù…ÛØ³Ù„Ùˆ پاتÛينه # ^CopyTo "ته Ù„Ù…ÛØ³Ù„ " # ^Registering " :نومکښليږي" # ^Unregistering " :نانومکښليږي" # ^SymbolNotFound " :Ù¾Ûلام نشي Ù¾ÛØ¯Ø§ کولی" # ^CouldNotLoad " :نشي راوستلی" # ^CreateFolder " :Ù¾ÙˆÚšÛ Ø¬ÙˆÚ“ÙˆÙ„" # ^CreateShortcut " :لنډلاری جوړول" # ^CreatedUninstaller " :جوړ شوی نالګاند" # ^Delete " :Ø¯ÙˆØªÙ†Û Ú“Ù†Ú«ÙˆÙ„" # ^DeleteOnReboot " :پر بياپÛلات ړنګول" # ^ErrorCreatingShortcut " :د لنډاري جوړولو ستونزه" # ^ErrorCreating " :جوړولو ستونزه" # ^ErrorDecompressing اومتوک Ù†Ø§Ø²ÛØ±Ù„Ùˆ ستونزه! اندرغل لګاند؟ # ^ErrorRegistering د ډلل نومکښلو ستونزه # ^ExecShell " :اکزک شل" # ^Exec " :Ù¾Ûلول" # ^Extract " :ÙˆÛØ³ØªÙ„" # ^ErrorWriting "ÙˆÛØ³ØªÙ„: Ø¯ÙˆØªÙ†Û Ú©ÚšÛ Ù„ÙŠÚ©Ù„Ùˆ ستونزه " # ^InvalidOpcode اندرغل لګاند: ناسم اپکوډ # ^NoOLE "No OLE for: " # ^OutputFolder " :ÙˆØªÙ†Û Ù¾ÙˆÚšÛ" # ^RemoveFolder " :Ù¾ÙˆÚšÛ Ú“Ù†Ú«ÙˆÙ„" # ^RenameOnReboot " :پر بياپÛلات بيانومول" # ^Rename " :بيانومول" # ^Skipped " :پرÛښودلي" # ^CopyDetails Ø®Ø¨Ø±ØªÙŠØ§ÙˆÛ Ù¼ÙˆÙ¼Û Ú‰Ú“Û ØªÙ‡ Ù„Ù…ÛØ³Ù„ # ^LogInstall د لګاو بهير خبرالول # ^Byte ب # ^Kilo Ú© # ^Mega Ù… # ^Giga Ú« nsis-3.11/Contrib/Language files/Pashto.nsh000077500000000000000000000207151477201124000205760ustar00rootroot00000000000000;Language: Pashto (1123) ;By Pakhtosoft - www.pakhtosoft.com !insertmacro LANGFILE "Pashto" = "پښتو" "Pashto" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "امسته اسانګر ته ÚšÙ‡ راغلاست $(^NameDA) د " ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT ".Ù„Ú«ÙˆÙ†Û ØªÙ‡ يوسي $(^NameDA) دا اسانګر به ØªØ§Ø³Û Ø¯$\r$\n$\r$\n.د Ø§Ù…Ø³ØªÛ Ø¯ Ù¾Ûلولو نه Ù…Ø®Ú©ÚšÛ Ø¯ نورو ساوترو د بندولو سپارښتنه کوو. د Ø¯Û Ú©Ø§Ø± په کولو سره به دا شونه شي Ú†Û Ù¾Ø±ØªÙ‡ له کمپيوټر د بياپيلاته Ø§Ú“ÙŠÙ†Û ØºÙˆÙ†Ú‰Ø§Ù„ Ø¯ÙˆØªÙ†Û Ø§ÙˆØ³Ù…Ù‡Ø§Ù„Ù‡ شي$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "نالګاو اسانګر ته ÚšÙ‡ راغلاست $(^NameDA) د" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT ".Ù†Ø§Ù„Ú«ÙˆÙ†Û ØªÙ‡ يوسي $(^NameDA) دا اسانګر به ØªØ§Ø³Û Ø¯$\r$\n$\r$\n.نه وي پرانيستل شوی $(^NameDA) د نالګاو د Ù¾Ûلولو نه Ù…Ø®Ú©ÚšÛØŒ ÚØ§Ù† ډاډمن کړﺉ Ú†Û$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "منښتليک تړون" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE ".لګولو نه Ù…Ø®Ú©ÚšÛ Ù…Ù†ÚšØªÙ„ÙŠÚ© توکي وګورﺉ $(^NameDA) د" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM ".د Ù„Ú«Ø§ÙˆÙ†Û Ù„Ù¾Ø§Ø±Ù‡ د تړون منل اړين دي $(^NameDA) Ú©Ù‡ Ú†ÛØ±Û تړون توکي منئ، زه منم Ù¼Ú© وهئ Ú†Û Ù…Ø®Ú©ÚšÛ ÙˆÙ„Ø§Ú“ شئ. د" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX ".لګولو لپاره د تړون منل اړين دي $(^NameDA) Ú©Ù‡ Ú†ÛØ±Û د تړون توکي منئ، نو Ù„Ø§Ù†Ø¯Û Ø®ÙˆÚšØ¨Ú©Ø³ Ù¼Ú© وهئ. د $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS ".لګولو لپاره د تړون منل اړين دي $(^NameDA) Ú©Ù‡ Ú†ÛØ±Û د تړون توکي منئ، نو Ù„Ø§Ù†Ø¯Û Ù„Ù…Ú“ÛŒ غوراوی Ù¼Ú© وهئ. د $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "منښتليک تړون" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE ".نالګولو نه Ù…Ø®Ú©ÚšÛ Ø¯ منښتليک توکي وګورﺉ $(^NameDA) د" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM ".نالګولو لپاره د تړون منل اړين دي $(^NameDA) Ú©Ù‡ Ú†ÛØ±Û د تړون توکي منئ، زه منم Ù¼Ú© وهئ Ú†Û Ù…Ø®Ú©ÚšÛ ÙˆÙ„Ø§Ú“ شئ. د" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX ".نالګولو لپاره د تړون منل اړين دي $(^NameDA) Ú©Ù‡ Ú†ÛØ±Û د تړون توکي منئ، نو Ù„Ø§Ù†Ø¯Û Ø®ÙˆÚšØ¨Ú©Ø³ Ù¼Ú© وهئ. د $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS ".نالګولو لپاره د تړون منل اړين دي $(^NameDA) Ú©Ù‡ Ú†ÛØ±Û د تړون توکي منئ، نو Ù„Ø§Ù†Ø¯Û Ù„Ù…Ú“ÛŒ غوراوی Ù¼Ú© وهئ. د $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP ".د تړون د Ù†ÙˆØ±Û Ø¨Ø±Ø®Û Ú©ØªÙ„Ùˆ لپاره Ù¾ÛØ¬ ډاون Ú©ÙŠÙ„Û ÙˆÙˆÙ‡Ø¦" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "رغتوکي خوښ کړﺉ" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE ".Ú©ÙˆÙ…Û ÚØ§Ù†Ú«Ú“ØªÙŠØ§ÙˆÛ Ú†Û Ù„Ú«ÙˆÙ„ غواړﺉ، خوښ ÙŠÛ Ú©Ú“ïº‰ $(^NameDA) د" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "رغتوکي خوښ کړﺉ" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE ".Ú©ÙˆÙ…Û ÚØ§Ù†Ú«Ú“ØªÙŠØ§ÙˆÛ Ú†Û Ù†Ø§Ù„Ú«ÙˆÙ„ غواړﺉ، خوښ ÙŠÛ Ú©Ú“ïº‰ $(^NameDA) د" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "سپړاوي" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO ".د رغتوکي سپړاوي کتلو لپاره موږک د Ù‡ØºÛ Ø¯Ù¾Ø§Ø³Ù‡ ودروﺉ" !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "لګاو ÚØ§ÛŒ وټاکئ" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE ".لګول غواړﺉ ÙˆÙŠÛ Ù¼Ø§Ú©Ø¦ $(^NameDA) په کومه Ù¾ÙˆÚšÛ Ú©ÚšÛ Ú†Û" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "نالګاو ÚØ§ÛŒ وټاکئ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE ".نالګول غواړﺉ ÙˆÙŠÛ Ù¼Ø§Ú©Ø¦ $(^NameDA) د Ú©ÙˆÙ…Û Ù¾ÙˆÚšÛ Ù†Ù‡ Ú†Û" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ù„Ú«ÙŠÚ–ÙŠ" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE ".په بشپړه توګه ولګول شي $(^NameDA) مهرباني وکړﺉ Ù„Ú–Ù‡ تمه وکړﺉ ترڅو" ${LangFileString} MUI_TEXT_FINISH_TITLE "لګونه بشپړه شوه" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE ".امسته په برياليتوب سرته ÙˆØ±Ø³ÛØ¯Ù‡" ${LangFileString} MUI_TEXT_ABORT_TITLE "لګونه بنده شوه" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE ".امسته په برياليتوب سرته ونه Ø±Ø³ÛØ¯Ù‡" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "نالګيږي" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE ".په بشپړه توګه ونالګول شي $(^NameDA) مهرباني وکړﺉ Ù„Ú–Ù‡ تمه وکړﺉ ترڅو" ${LangFileString} MUI_UNTEXT_FINISH_TITLE "نالګونه بشپړه شوه" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE ".نالګاو په برياليتوب سرته ÙˆØ±Ø³ÛØ¯Ùˆ" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "نالګونه بنده شوه" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE ".نالګاو په برياليتوب سرته ونه Ø±Ø³ÛØ¯Ùˆ" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "امسته اسانګر بشپړيږي $(^NameDA) د" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT ".Ø³ØªØ§Ø³Û Ù¾Ù‡ کمپيوټر Ú©ÚšÛ ÙˆÙ„Ú«ÙˆÙ„ شو $(^NameDA)$\r$\n$\r$\nد Ø¯Û Ø§Ø³Ø§Ù†Ú«Ø± د بندولو لپاره پای ته Ù¼Ú© ورکړﺉ" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "لګاو بشپړولو لپاره Ø³ØªØ§Ø³Û Ú©Ù…Ù¾ÙŠÙˆÙ¼Ø± بياپÛلات ته اړتيا لري. ايا اوس بياپÛلون کول غواړﺉ؟ $(^NameDA) د" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "نالګاو اسانګر بشپړيږي $(^NameDA) د" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT ".Ø³ØªØ§Ø³Û Ù„Ù‡ کمپيوټر نه ونالګول شو $(^NameDA)$\r$\n$\r$\nد Ø¯Û Ø§Ø³Ø§Ù†Ú«Ø± د بندولو لپاره پای ته Ù¼Ú© ورکړﺉ" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT " نالګاو بشپړولو لپاره Ø³ØªØ§Ø³Û Ú©Ù…Ù¾ÙŠÙˆÙ¼Ø± بياپÛلات ته اړتيا لري. ايا اوس بياپÛلون کول غواړﺉ؟ $(^NameDA) د" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "سمدستي بياپÛلون" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "وروسته زه پخپله بياپÛلون کول غواړم" ${LangFileString} MUI_TEXT_FINISH_RUN "&پرانيستل $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&ماولوله ښودل" ${LangFileString} MUI_BUTTONTEXT_FINISH "&پای" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Ù¾ÛÙ„ ØºÙˆØ±Ù†Û Ù¾ÙˆÚšÛ Ø®ÙˆÚšÙ‡ کړﺉ" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "د لنډلارو لپاره يو Ù¾ÛÙ„ ØºÙˆØ±Ù†Û Ù¾ÙˆÚšÛ Ø®ÙˆÚšÙ‡ کړﺉ $(^NameDA) د" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP ".د Ù¾ÛÙ„ ØºÙˆØ±Ù†Û Ù‡ØºÙ‡ Ù¾ÙˆÚšÛ Ú†Û Ø¯ ساوتري لنډلاري Ù¾Ú©ÚšÛ Ø¬ÙˆÚ“ÙˆÙ„ غواړﺉ خوښه کړﺉ. Ù†ÙˆÛ Ù¾ÙˆÚšÛ Ø¬ÙˆÚ“ÙˆÙ„Ùˆ لپاره نوم هم ليکلی شئ" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "لنډلاري مه جوړوه" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "نالګول $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE ".د خپل کمپيوټر نه ړنګول $(^NameDA)" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "امسته بندول غواړﺉ؟ $(^Name) ايا په ډاډمنه توګه د" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "نالګاو بندول غواړﺉ؟ $(^Name) ايا په ډاډمنه توګه د" !endif nsis-3.11/Contrib/Language files/Polish.nlf000077500000000000000000000127471477201124000205730ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1045 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Piotr Murawski & RafaÅ‚ Lampe # Updated by cube and SYSTEMsoft Group # Corrected by Marek StÄ™pieÅ„ - http://www.aviary.pl # Corrected by Mateusz Gola (aka Prozac) - http://www.avirecomp.com # Updated by PaweÅ‚ Porwisz (http://www.pawelporwisz.pl) # ^Branding Nullsoft Install System %s # ^SetupCaption Instalator $(^Name) # ^UninstallCaption Deinstalator $(^Name) # ^LicenseSubCaption : Umowa licencyjna # ^ComponentsSubCaption : Opcje instalacji # ^DirSubCaption : Folder instalacyjny # ^InstallingSubCaption : Instalowanie plików # ^CompletedSubCaption : ZakoÅ„czono # ^UnComponentsSubCaption : Opcje deinstalacji # ^UnDirSubCaption : Folder deinstalacyjny # ^ConfirmSubCaption : Potwierdzenie # ^UnDirSubCaption : Deinstalowanie plików # ^UnCompletedSubCaption : ZakoÅ„czono # ^BackBtn < &Wstecz # ^NextBtn &Dalej > # ^AgreeBtn &Zgadzam siÄ™ # ^AcceptBtn &AkceptujÄ™ warunki umowy licencyjnej # ^DontAcceptBtn &Nie akceptujÄ™ warunków umowy licencyjnej # ^InstallBtn &Zainstaluj # ^UninstallBtn &Odinstaluj # ^CancelBtn Anuluj # ^CloseBtn &Zamknij # ^BrowseBtn &PrzeglÄ…daj... # ^ShowDetailsBtn Pokaż &szczegóły # ^ClickNext Kliknij przycisk 'Dalej', aby kontynuować. # ^ClickInstall Kliknij przycisk 'Zainstaluj', aby rozpocząć instalacjÄ™. # ^ClickUninstall Kliknij przycisk 'Odinstaluj', aby rozpocząć deinstalacjÄ™. # ^Name Nazwa # ^Completed ZakoÅ„czono # ^LicenseText Przed instalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji. JeÅ›li akceptujesz wszystkie warunki umowy, kliknij przycisk 'Zgadzam siÄ™'. # ^LicenseTextCB Przed instalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji. JeÅ›li akceptujesz wszystkie warunki umowy, kliknij poniższe pole wyboru. $_CLICK. # ^LicenseTextRB Przed instalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji. JeÅ›li akceptujesz wszystkie warunki umowy, wybierz pierwszÄ… z poniższych opcji. $_CLICK. # ^UnLicenseText Przed deinstalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji. JeÅ›li akceptujesz wszystkie warunki umowy, kliknij przycisk 'Zgadzam siÄ™'. # ^UnLicenseTextCB Przed deinstalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji. JeÅ›li akceptujesz wszystkie warunki umowy, kliknij poniższe pole wyboru. $_CLICK. # ^UnLicenseTextRB Przed deinstalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji. JeÅ›li akceptujesz wszystkie warunki umowy, wybierz pierwszÄ… z poniższych opcji. $_CLICK. # ^Custom Użytkownika # ^ComponentsText Zaznacz komponenty, które chcesz zainstalować i odznacz te, których nie chcesz instalować. $_CLICK # ^ComponentsSubText1 Wybierz typ instalacji: # ^ComponentsSubText2_NoInstTypes Wybierz komponenty do zainstalowania: # ^ComponentsSubText2 Albo wybierz opcjonalne komponenty, które chcesz zainstalować: # ^UnComponentsText Zaznacz komponenty, które chcesz odinstalować i odznacz te, które nie zostanÄ… odinstalowane. $_CLICK # ^UnComponentsSubText1 Wybierz typ deinstalacji: # ^UnComponentsSubText2_NoInstTypes Wybierz komponenty do odinstalowania: # ^UnComponentsSubText2 Albo wybierz opcjonalne komponenty, które chcesz odinstalować: # ^DirText Instalator zainstaluje $(^NameDA) w podanym poniżej folderze docelowym (możesz także kliknąć przycisk 'PrzeglÄ…daj...' i wybrać inny folder). $_CLICK # ^DirSubText Folder docelowy # ^DirBrowseText Wybierz folder instalacyjny $(^NameDA): # ^UnDirText Deinstalator usunie $(^NameDA) z nastÄ™pujÄ…cego folderu. Aby odinstalować z innego folderu, kliknij przycisk 'PrzeglÄ…daj...' i wybierz folder. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Wybierz folder, z którego zostanie odinstalowany $(^NameDA): # ^SpaceAvailable "DostÄ™pne miejsce: " # ^SpaceRequired "Wymagane miejsce: " # ^UninstallingText Ten kreator odinstaluje $(^NameDA) z Twojego komputera. $_CLICK # ^UninstallingSubText Deinstalacja z: # ^FileError Błąd otwarcia pliku do zapisu: \r\n\r\n$0\r\n\r\nWybierz 'Anuluj', aby przerwać instalacjÄ™,\r\n'Ponów', aby ponowić zapis do pliku lub\r\n'Ignoruj', aby pominąć ten plik. # ^FileError_NoIgnore Błąd otwarcia pliku do zapisu: \r\n\r\n$0\r\n\r\nWybierz 'Ponów', aby ponowić zapis do pliku lub\r\n'Anuluj', aby przerwać instalacjÄ™. # ^CantWrite "Nie można zapisać: " # ^CopyFailed Błąd kopiowania # ^CopyTo "Kopiuj do " # ^Registering "Rejestrowanie: " # ^Unregistering "Wyrejestrowywanie: " # ^SymbolNotFound "Nie można odnaleźć symbolu: " # ^CouldNotLoad "Nie można wczytać: " #^CreateFolder "Utwórz folder: " # ^CreateShortcut "Utwórz skrót: " # ^CreatedUninstaller "Utworzono deinstalator: " # ^Delete "UsuÅ„ plik: " # ^DeleteOnReboot "UsuÅ„ przy ponownym uruchomieniu: " # ^ErrorCreatingShortcut "Błąd tworzenia skrótu: " # ^ErrorCreating "Błąd tworzenia: " # ^ErrorDecompressing Błąd wyodrÄ™bniania danych! Uszkodzony instalator? # ^ErrorRegistering Błąd rejestracji pliku DLL # ^ExecShell "ExecShell: " # ^Exec "Uruchom: " # ^Extract "WyodrÄ™bnij: " # ^ErrorWriting "WyodrÄ™bnij: błąd zapisu do pliku " # ^InvalidOpcode Instalator uszkodzony: nieprawidÅ‚owy kod operacji # ^NoOLE "Brak OLE dla: " # ^OutputFolder "Folder wyjÅ›ciowy: " # ^RemoveFolder "UsuÅ„ folder: " # ^RenameOnReboot "ZmieÅ„ nazwÄ™ przy ponownym uruchomieniu: " # ^Rename "ZmieÅ„ nazwÄ™: " # ^Skipped "PominiÄ™te: " # ^CopyDetails Kopiuj szczegóły do schowka # ^LogInstall Rejestruj przebieg instalacji # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Polish.nsh000077500000000000000000000204271477201124000205760ustar00rootroot00000000000000;Language: Polish (1045) ;By Piotr Murawski & RafaÅ‚ Lampe ;Updated by cube and SYSTEMsoft Group ;Updated by Mateusz Gola (aka Prozac) - http://www.avirecomp.com ;Updated by PaweÅ‚ Porwisz (http://www.pawelporwisz.pl) !insertmacro LANGFILE "Polish" = "Polski" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Witamy w kreatorze instalacji $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Kreator ten pomoże Ci zainstalować $(^NameDA).$\r$\n$\r$\nZalecane jest zamkniÄ™cie wszystkich uruchomionych programów przed rozpoczÄ™ciem instalacji. Pozwoli to na uaktualnienie niezbÄ™dnych plików systemowych bez koniecznoÅ›ci ponownego uruchamiania komputera.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Witamy w kreatorze deinstalacji $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Kreator ten pomoże Ci odinstalować $(^NameDA).$\r$\n$\r$\nPrzed rozpoczÄ™ciem deinstalacji, upewnij siÄ™, że $(^NameDA) nie jest uruchomiony.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Umowa licencyjna" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Przed instalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jeżeli akceptujesz warunki umowy, kliknij przycisk 'Zgadzam siÄ™', aby kontynuować. Musisz zaakceptować warunki umowy, aby zainstalować $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jeżeli akceptujesz warunki umowy, zaznacz poniższe pole wyboru, aby kontynuować. Musisz zaakceptować warunki umowy, aby zainstalować $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jeżeli akceptujesz warunki umowy, wybierz pierwszÄ… z poniższych opcji, aby kontynuować. Musisz zaakceptować warunki umowy, aby zainstalować $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Umowa licencyjna" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Przed deinstalacjÄ… $(^NameDA) zapoznaj siÄ™ z warunkami licencji." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jeżeli akceptujesz warunki umowy, kliknij przycisk 'Zgadzam siÄ™', aby kontynuować. Musisz zaakceptować warunki umowy, aby odinstalować $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jeżeli akceptujesz warunki umowy, zaznacz poniższe pole wyboru, aby kontynuować. Musisz zaakceptować warunki umowy, aby odinstalować $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jeżeli akceptujesz warunki umowy, wybierz pierwszÄ… z poniższych opcji, aby kontynuować. Musisz zaakceptować warunki umowy, aby odinstalować $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "NaciÅ›nij klawisz Page Down, aby zobaczyć dalszÄ… część umowy." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Wybierz komponenty" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wybierz komponenty $(^NameDA), które chcesz zainstalować." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Wybierz komponenty" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wybierz, które elementy $(^NameDA) chcesz odinstalować." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "PrzesuÅ„ kursor myszy nad komponent, aby zobaczyć jego opis." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Wybierz komponent, aby zobaczyć jego opis." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Wybierz lokalizacjÄ™ dla instalacji" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wybierz folder, w którym chcesz zainstalować $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Wybierz lokalizacjÄ™ dla deinstalacji" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wybierz folder, z którego chcesz odinstalować $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacja" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "ProszÄ™ czekać, trwa instalacja $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "ZakoÅ„czono instalacjÄ™" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacja zakoÅ„czona pomyÅ›lnie." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacja przerwana" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacja nie zostaÅ‚a zakoÅ„czona pomyÅ›lnie." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalacja" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "ProszÄ™ czekać, trwa deinstalacja $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ZakoÅ„czono deinstalacjÄ™" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinstalowanie zakoÅ„czone pomyÅ›lnie." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Deinstalacja przerwana" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deinstalacja nie zostaÅ‚a zakoÅ„czona pomyÅ›lnie." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "KoÅ„czenie pracy kreatora instalacji $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) zostaÅ‚ pomyÅ›lnie zainstalowany na Twoim komputerze.$\r$\n$\r$\nKliknij przycisk 'ZakoÅ„cz', aby zakoÅ„czyć dziaÅ‚anie instalatora." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Twój komputer musi zostać ponownie uruchomiony, aby zakoÅ„czyć instalacjÄ™ $(^NameDA). Czy chcesz teraz ponownie uruchomić komputer?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "KoÅ„czenie pracy kreatora deinstalacji $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) zostaÅ‚ odinstalowany z Twojego komputera.$\r$\n$\r$\nKliknij przycisk 'ZakoÅ„cz', aby zakoÅ„czyć dziaÅ‚anie deinstalatora." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Twój komputer musi zostać ponownie uruchomiony w celu zakoÅ„czenia deinstalacji $(^NameDA). Czy chcesz teraz ponownie uruchomić komputer?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Uruchom ponownie teraz" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Sam uruchomiÄ™ ponownie komputer później" ${LangFileString} MUI_TEXT_FINISH_RUN "&Uruchom $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Pokaż plik ReadMe" ${LangFileString} MUI_BUTTONTEXT_FINISH "&ZakoÅ„cz" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Wybierz folder w menu Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Wybierz folder menu Start, w którym zostanÄ… umieszczone skróty do $(^NameDA)" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Wybierz folder w menu Start, w którym chciaÅ‚byÅ› umieÅ›cić skróty do programu. Możesz także utworzyć nowy folder wpisujÄ…c jego nazwÄ™." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nie twórz skrótów" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinstaluj $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "UsuÅ„ $(^NameDA) z Twojego komputera." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Czy na pewno chcesz zakoÅ„czyć dziaÅ‚anie instalatora $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Czy na pewno chcesz przerwać proces deinstalacji $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Wybierz użytkowników" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Wybierz, dla których użytkowników chcesz zainstalować $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Wybierz, czy chcesz zainstalować $(^NameDA) tylko dla siebie, czy dla wszystkich użytkowników tego komputera. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Zainstaluj dla wszystkich użytkowników tego komputera" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Zainstaluj tylko dla mnie" !endif nsis-3.11/Contrib/Language files/Portuguese.nlf000077500000000000000000000124621477201124000214710ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 2070 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation v4.0.3 by DragonSoull with help from Dre` - Updated by Ramon # ^Branding Nullsoft Install System %s # ^SetupCaption Instalação de $(^Name) # ^UninstallCaption Desinstalação de $(^Name) # ^LicenseSubCaption : Contrato de Licença # ^ComponentsSubCaption : Opções de instalação # ^DirSubCaption : Diretório de instalação # ^InstallingSubCaption : Instalando Ficheiros # ^CompletedSubCaption : Concluído # ^UnComponentsSubCaption : Opções de Desinstalação # ^UnDirSubCaption : Pasta de Desinstalação # ^ConfirmSubCaption : Confirmação # ^UninstallingSubCaption : Desinstalando # ^UnCompletedSubCaption : Concluído # ^BackBtn < &Anterior # ^NextBtn &Seguinte > # ^AgreeBtn &Aceito # ^AcceptBtn Eu &aceito os termos do Contrato de Licença # ^DontAcceptBtn Eu &não aceito os termos do Contrato de Licença # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Cancelar # ^CloseBtn &Fechar # ^BrowseBtn &Procurar... # ^ShowDetailsBtn Ver &Detalhes # ^ClickNext Clique em 'Seguinte' para continuar. # ^ClickInstall Clique em 'Instalar' para iniciar a instalação. # ^ClickUninstall Clique em 'Desinstalar' para iniciar a desinstalação. # ^Name Nome # ^Completed Concluído # ^LicenseText Por favor reveja o acordo de licença antes de instalar $(^NameDA). Se concorda com todos os termos da licença, clique em 'Aceito'. # ^LicenseTextCB Por favor reveja o acordo de licença antes de instalar $(^NameDA). Se concorda com todos os termos da licença, clique na caixa de seleção abaixo. $_CLICK # ^LicenseTextRB Por favor reveja o acordo de licença antes de instalar $(^NameDA). Se concorda com todos os termos da licença, escolha a primeira opção abaixo. $_CLICK # ^UnLicenseText Por favor reveja o acordo de licença antes de desinstalar $(^NameDA). Se concorda com todos os termos da licença, clique em 'Aceito'. # ^UnLicenseTextCB Por favor reveja o acordo de licença antes de desinstalar $(^NameDA). Se concorda com todos os termos da licença, clique na caixa de seleção abaixo. $_CLICK # ^UnLicenseTextRB Por favor reveja o acordo de licença antes de desinstalar $(^NameDA). Se concorda com todos os termos da licença, escolha a primeira opção abaixo. $_CLICK # ^Custom Personalizado # ^ComponentsText Marque os componentes que deseja instalar e desmarque os componentes que não deseja instalar. $_CLICK # ^ComponentsSubText1 Escolha o tipo de instalação: # ^ComponentsSubText2_NoInstTypes Escolha os componentes para instalar: # ^ComponentsSubText2 Ou, escolha os componentes opcionais que deseja instalar: # ^UnComponentsText Marque os componentes que queira desinstalar e vice versa. $_CLICK # ^UnComponentsSubText1 Escolha o tipo de desinstalação: # ^UnComponentsSubText2_NoInstTypes Escolha os componentes para desinstalar: # ^UnComponentsSubText2 Ou, escolha os componentes opcionais que queira desinstalar: # ^DirText O $(^NameDA) será instalado na seguinte pasta. Para instalar numa pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK # ^DirSubText Pasta de Destino # ^DirBrowseText Escolha uma pasta para instalar o $(^NameDA): # ^UnDirText O $(^NameDA) será desinstalado da seguinte pasta. Para desinstalar de uma pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Escolha uma pasta de onde será desinstalado o $(^NameDA): # ^SpaceAvailable "Espaço disponível: " # ^SpaceRequired "Espaço necessário: " # ^UninstallingText $(^NameDA) será desinstalado da seguinte pasta. $_CLICK # ^UninstallingSubText Desinstalando de: # ^FileError Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique em Abortar para abortar a instalação,\r\nRepetir para tentar novamente a escrita do ficheiro, ou\r\nIgnorar para ignorar este ficheiro. # ^FileError_NoIgnore Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique em Repetir para tentar novamente a gravação do ficheiro, ou\r\nCancelar para abortar a instalação. # ^CantWrite "Não foi possível escrever: " # ^CopyFailed Falha ao copiar # ^CopyTo "Copiar para " # ^Registering "Registando: " # ^Unregistering "Desregistando: " # ^SymbolNotFound "Símbolo não encontrado: " # ^CouldNotLoad "Não foi possível carregar: " # ^CreateFolder "Criando diretório: " # ^CreateShortcut "Criando atalho: " # ^CreatedUninstaller "Criando desinstalador: " # ^Delete "Apagando ficheiro: " # ^DeleteOnReboot "Apagar ao reiniciar: " # ^ErrorCreatingShortcut "Erro ao criar atalho: " # ^ErrorCreating "Erro ao criar: " # ^ErrorDecompressing Erro ao descomprimir dados! Instalador corrompido? # ^ErrorRegistering Erro ao registar DLL # ^ExecShell "Executando pelo Shell: " # ^Exec "Executando: " # ^Extract "Extraindo: " # ^ErrorWriting "Extraindo: erro ao escrever ficheiro " # ^InvalidOpcode Instalador corrompido: código de operação inválido # ^NoOLE "Sem OLE para: " # ^OutputFolder "Pasta de destino: " # ^RemoveFolder "Removendo pasta: " # ^RenameOnReboot "Renomear ao reiniciar: " # ^Rename "Renomeando: " # ^Skipped "Ignorado: " # ^CopyDetails Copiar detalhes para a Ãrea de Transfêrencia # ^LogInstall Registar processo de instalação # ^Byte B # kilo K # mega M # giga G nsis-3.11/Contrib/Language files/Portuguese.nsh000077500000000000000000000177061477201124000215100ustar00rootroot00000000000000;Language: Portuguese (2070) ;By Ramon !insertmacro LANGFILE "Portuguese" = "Português" "Portugues" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bem vindo ao Assistente de Instalação do $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este assistente ajudá-lo-á durante a instalação do $(^NameDA).$\r$\n$\r$\nÉ recomendado que feche todas as outras aplicações antes de iniciar a Instalação. Isto permitirá que o Instalador actualize ficheiros relacionados com o sistema sem necessidade de reiniciar o computador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bem vindo ao Assistente de desinstalação do $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este assistente ajudá-lo-á durante a desinstalação do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalação, certifique-se de que o $(^NameDA) não está em execução.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contrato de Licença" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licença antes de instalar o $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licença, clique em 'Aceito' para continuar. Deverá aceitar o contrato para instalar o $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licença, clique na caixa de seleção abaixo. Deverá aceitar o contrato para instalar o $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licença, selecione a primeira opção abaixo. Você deve aceitar o contrato para instalar o $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contrato de Licença" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licença antes de desinstalar o $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licença, clique em 'Aceito' para continuar. Deverá aceitar o contrato para desinstalar o $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licença, clique na caixa de seleção abaixo. Deverá aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licença, selecione a primeira opção abaixo. Você deve aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tecle Page Down para ver o restante da licença." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolha de Componentes" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolha quais as características do $(^NameDA) que deseja instalar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escolher Componentes" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolha quais as características do $(^NameDA) que deseja desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrição" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre um componente para ver a sua descrição." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione um componente para ver a sua descrição." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolha do Local da Instalação" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolha a pasta na qual deseja instalar o $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolha o Local de desinstalação" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolha a pasta de onde pretende desinstalar o $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor, aguarde enquanto o $(^NameDA) está sendo instalado." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalação Completa" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalação foi concluída com sucesso." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalação Abortada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalação não foi concluída com sucesso." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor, aguarde enquanto o $(^NameDA) está sendo desinstalado." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalação Completa" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalação foi concluída com sucesso." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalação Abortada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalação não foi concluída com sucesso" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Concluindo o Assistente de Instalação do $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) foi instalado no seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "O seu computador deve ser reiniciado para concluír a instalação do $(^NameDA). Deseja reiniciar agora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Concluíndo o assistente de desisntalação do $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) foi removido do seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "O seu computador deve ser reiniciado para concluír a desinstalação do $(^NameDA). Deseja reiniciar agora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar Agora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eu quero reiniciar manualmente depois" ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Leiame" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolha uma Pasta do Menu Iniciar" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolha uma pasta do Menu Iniciar para os atalhos do programa." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selecione uma pasta do Menu Iniciar em que deseja criar os atalhos do programa. Você pode também digitar um nome para criar uma nova pasta. " ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Não criar atalhos" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remover o $(^NameDA) do seu computador." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Deseja realmente cancelar a instalação do $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Deseja realmente cancelar a desinstalação do $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escolha utilizadores" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escolha para quais utilizadores deseja instalar o $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Escolha se deseja instalar o $(^NameDA) apenas para si ou para todos os utilizadores. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalar para todos os utilizadores" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalar apenas para si" !endif nsis-3.11/Contrib/Language files/PortugueseBR.nlf000077500000000000000000000126611477201124000217160ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1046 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Diego Pedroso and Felipe, reviewed by Georger Araújo # ^Branding Nullsoft Install System %s # ^SetupCaption Instalação do $(^Name) # ^UninstallCaption Desinstalação do $(^Name) # ^LicenseSubCaption : Acordo de Licença # ^ComponentsSubCaption : Opções da Instalação # ^DirSubCaption : Pasta da Instalação # ^InstallingSubCaption : Instalando # ^CompletedSubCaption : Completado # ^UnComponentsSubCaption : Opções da Desinstalação # ^UnDirSubCaption : Pasta da Desinstalação # ^ConfirmSubCaption : Confirmação # ^UninstallingSubCaption : Desinstalando # ^UnCompletedSubCaption : Completado # ^BackBtn < &Voltar # ^NextBtn &Próximo > # ^AgreeBtn Eu &Concordo # ^AcceptBtn Eu &aceito os termos do Acordo de Licença # ^DontAcceptBtn Eu &não aceito os termos do Acordo de Licença # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Cancelar # ^CloseBtn &Fechar # ^BrowseBtn P&rocurar... # ^ShowDetailsBtn Mostrar &detalhes # ^ClickNext Clique em Próximo pra continuar. # ^ClickInstall Clique em Instalar pra iniciar a instalação. # ^ClickUninstall Clique em Desinstalar pra iniciar a desinstalação. # ^Name Nome # ^Completed Completado # ^LicenseText Por favor reveja o acordo de licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo clique em Eu Concordo. # ^LicenseTextCB Por favor reveja o acordo de licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo clique na caixa de seleção abaixo. $_CLICK # ^LicenseTextRB Por favor reveja o acordo de licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo selecione a primeira opção abaixo. $_CLICK # ^UnLicenseText Por favor reveja o acordo de licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo clique em Eu Concordo. # ^UnLicenseTextCB Por favor reveja o acordo de licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo clique na caixa de seleção abaixo. $_CLICK # ^UnLicenseTextRB Por favor reveja o acordo de licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo selecione a primeira opção abaixo. $_CLICK # ^Custom Personalizar # ^ComponentsText Marque os componentes que você quer instalar e desmarque os componentes que você não quer instalar. $_CLICK # ^ComponentsSubText1 Selecione o tipo de instalação: # ^ComponentsSubText2_NoInstTypes Selecione os componentes a instalar: # ^ComponentsSubText2 Ou selecione os componentes opcionais que você deseja instalar: # ^UnComponentsText Marque os componentes que você quer desinstalar e desmarque os componentes que você não quer desinstalar. $_CLICK # ^UnComponentsSubText1 Selecione o tipo de desinstalação: # ^UnComponentsSubText2_NoInstTypes Selecione os componentes a desinstalar: # ^UnComponentsSubText2 Ou selecione os componentes opcionais que você deseja desinstalar: # ^DirText O Instalador instalará o $(^NameDA) na seguinte pasta. Pra instalar em uma pasta diferente clique em Procurar e selecione outra pasta. $_CLICK # ^DirSubText Pasta Destino # ^DirBrowseText Selecione a pasta pra instalar o $(^NameDA): # ^UnDirText O Instalador desinstalará o $(^NameDA) da seguinte pasta. Pra desinstalar de uma pasta diferente clique em Procurar e selecione outra pasta. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Selecione a pasta pra desinstalar o $(^NameDA): # ^SpaceAvailable "Espaço disponível: " # ^SpaceRequired "Espaço requerido: " # ^UninstallingText O $(^NameDA) será desinstalado da seguinte pasta. $_CLICK # ^UninstallingSubText Desinstalando de: # ^FileError Erro ao abrir o arquivo pra gravação: \r\n\r\n$0\r\n\r\nClique em Abortar pra parar a instalação,\r\nRepetir pra tentar de novo ou em\r\nIgnorar pra ignorar este arquivo. # ^FileError_NoIgnore Erro ao abrir o arquivo pra gravação: \r\n\r\n$0\r\n\r\nClique em Repetir pra tentar de novo ou em\r\nCancelar pra parar a instalação. # ^CantWrite "Não pôde gravar: " # ^CopyFailed Falhou em copiar # ^CopyTo "Copiar para " # ^Registering "Registrando: " # ^Unregistering "Desfazendo o registro: " # ^SymbolNotFound "Não pôde achar o símbolo: " # ^CouldNotLoad "Não pôde carregar: " # ^CreateFolder "Criar pasta: " # ^CreateShortcut "Criar atalho: " # ^CreatedUninstaller "Desinstalador criado: " # ^Delete "Apagar o arquivo: " # ^DeleteOnReboot "Apagar ao reiniciar: " # ^ErrorCreatingShortcut "Erro ao criar o atalho: " # ^ErrorCreating "Erro ao criar: " # ^ErrorDecompressing Erro ao descomprimir os dados! Instalador corrompido? # ^ErrorRegistering Erro ao registar a DLL # ^ExecShell "ExecShell: " # ^Exec "Executar: " # ^Extract "Extrair: " # ^ErrorWriting "Extrair: erro ao gravar no arquivo " # ^InvalidOpcode Instalador corrompido: opcode inválido # ^NoOLE "Sem OLE para: " # ^OutputFolder "Pasta de saída: " # ^RemoveFolder "Remover a pasta: " # ^RenameOnReboot "Renomear ao reiniciar: " # ^Rename "Renomear: " # ^Skipped "Ignorado: " # ^CopyDetails Copiar os Detalhes pra Ãrea de Transferência # ^LogInstall Gravar no log o processo de instalação # ^Byte B # ^Kilo K # ^Mega M # ^Giga Gnsis-3.11/Contrib/Language files/PortugueseBR.nsh000077500000000000000000000200451477201124000217220ustar00rootroot00000000000000;Language: Brazilian Portuguese (1046) ;By Diego Pedroso and Felipe !insertmacro LANGFILE "PortugueseBR" "Brazilian Portuguese" "Português Brasileiro" "Portugues Brasileiro" ; Veja \Include\LangFile.nsh pra uma descriçaõ destes parâmetros !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bem-vindo ao Instalador do $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "O instalador guiará você através da instalação do $(^NameDA).$\r$\n$\r$\nÉ recomendado que você feche todos os outros aplicativos antes de iniciar o instalador. Isto tornará possível atualizar os arquivos de sistema relevantes sem ter que reiniciar seu computador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bem-vindo ao Desinstalador do $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este assistente guiará você através da desinstalação do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalação tenha certeza de que o $(^NameDA) não está em execução.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acordo de Licença" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor reveja os termos da licença antes de instalar o $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se você aceita os termos do acordo clique em Eu Concordo pra continuar. Você deve aceitar o acordo pra instalar o $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se você aceita os termos do acordo clique na caixa de seleção abaixo. Você deve aceitar o acordo pra instalar o $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se você aceita os termos do acordo selecione a primeira opção abaixo. Você deve aceitar o acordo pra instalar o $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acordo de Licença" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor reveja os termos da licença antes de desinstalar o $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se você aceita os termos do acordo clique em Eu Concordo pra continuar. Você deve aceitar o acordo pra desinstalar o $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se você aceita os termos do acordo clique na caixa de seleção abaixo. Você deve aceitar o acordo pra desinstalar o $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se você aceita os termos do acordo selecione a primeira opção abaixo. Você deve aceitar o acordo pra desinstalar o $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pressione Page Down pra ver o resto do acordo." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolher Componentes" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolha quais funções do $(^NameDA) você quer instalar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escolher Componentes" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolha quais funções do $(^NameDA) você quer desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrição" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione seu mouse sobre um componente pra ver a descrição dele." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selecione um componente pra ver a descrição dele." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolha o Local da Instalação" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolha a pasta na qual instalar o $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolha o Local da Desinstalação" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolha a pasta da qual desinstalar o $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere enquanto o $(^NameDA) está sendo instalado." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalação Completa" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalação foi completada com sucesso." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalação Abortada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalação não foi completada com sucesso." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere enquanto o $(^NameDA) está sendo desinstalado." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalação Completa" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalação foi completada com sucesso." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalação Abortada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalação não foi completada com sucesso." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando a instalação do $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "O $(^NameDA) foi instalado no seu computador.$\r$\n$\r$\nClique em Concluir pra fechar o instalador." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Seu computador deve ser reiniciado a fim de completar a instalação do $(^NameDA). Você quer reiniciar agora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando a desinstalação do $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "O $(^NameDA) foi desinstalado do seu computador.$\r$\n$\r$\nClique em Concluir pra fechar o instalador." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Seu computador deve ser reiniciado a fim de completar a desinstalação do $(^NameDA). Você quer reiniciar agora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar agora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eu quero reiniciar manualmente mais tarde" ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar o $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar o Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Concluir" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolha a Pasta do Menu Iniciar" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolha uma pasta do Menu Iniciar para os atalhos do $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selecione a pasta do Menu Iniciar na qual você gostaria de criar os atalhos do programa. Você pode também inserir um nome pra criar uma nova pasta." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Não criar atalhos" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar o $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remover o $(^NameDA) do seu computador." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Você tem certeza que você quer sair da Instalação do $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Você tem certeza que você quer sair da Desinstalação do $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escolher Usuários" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escolha pra quais usuários você quer instalar o $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selecione se você quer instalar o $(^NameDA) só pra si mesmo ou pra todos os usuários deste computador. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalar pra qualquer um usando este computador" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalar apenas pra mim" !endif nsis-3.11/Contrib/Language files/Romanian.nlf000077500000000000000000000141421477201124000210700ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1048 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Cristian Pirvu (pcristip@yahoo.com) v6 # Revision by Sorin Sbarnea (sorin@intersol.ro) v5.1 # and Sorin Sbarnea INTERSOL SRL (sorin@intersol.ro) v4 # New revision by George Radu (georadu@hotmail.com) # New revision by Iulian Dogariu (iulian@jayomega.net) # - Use Romanian letters ăâîşţ # - Use imperative forms on buttons # - Replace some neologisms # New revision by Vlad Rusu (vlad@bitattack.ro) # - "RasfoieÅŸte" replaced with "Alege" - more appropriate # - "Elimină" related terms replaced with more appropriate "Dezinstalează" # - Fixed: Wrong translation in ^FileError and ^FileError_NoIgnore -> no translation # needed Abort/Retry/Ignore, as these are not translated into local language, OS related # ^Branding Nullsoft Install System %s # ^SetupCaption Instalare $(^Name) # ^UninstallCaption Dezinstalare $(^Name) # ^LicenseSubCaption : Contract de licenţă # ^ComponentsSubCaption : OpÅ£iuni instalare # ^DirSubCaption : Directorul destinaÅ£ie # ^InstallingSubCaption : ÃŽn curs de instalare # ^CompletedSubCaption : Instalare terminată # ^UnComponentsSubCaption : OpÅ£iuni dezinstalare # ^UnDirSubCaption : Directorul de dezinstalare # ^ConfirmSubCaption : Confirmă # ^UninstallingSubCaption : ÃŽn curs de dezinstalare # ^UnCompletedSubCaption : Termină # ^BackBtn < ÃŽna&poi # ^NextBtn ÃŽna&inte > # ^AgreeBtn &De acord # ^AcceptBtn &Accept termenii contractului de licenţă # ^DontAcceptBtn Nu accept termenii contractului de licenţă # ^InstallBtn &Instalează # ^UninstallBtn &Dezinstalează # ^CancelBtn &Renunţă # ^CloseBtn ÃŽn&chide # ^BrowseBtn &Alege... # ^ShowDetailsBtn Arată &detalii # ^ClickNext ApăsaÅ£i ÃŽnainte pentru a continua. # ^ClickInstall ApăsaÅ£i Instalează pentru a începe instalarea. # ^ClickUninstall ApăsaÅ£i Dezinstalează pentru a începe dezinstalarea. # ^Name Nume # ^Completed Terminat # ^LicenseText CitiÅ£i cu atenÅ£ie contractul de licenţă înainte de a instala $(^NameDA). Dacă acceptaÅ£i termenii contractului de licenţă, apăsaÅ£i butonul De acord. # ^LicenseTextCB CitiÅ£i cu atenÅ£ie contractul de licenţă înainte de a instala $(^NameDA). Dacă acceptaÅ£i termenii contractului de licenţă, bifaÅ£i căsuÅ£a de mai jos. $_CLICK # ^LicenseTextRB CitiÅ£i cu atenÅ£ie contractul de licenţă înainte de a instala $(^NameDA). Dacă acceptaÅ£i termenii contractului de licenţă, selectaÅ£i prima opÅ£iune de mai jos. $_CLICK # ^UnLicenseText CitiÅ£i cu atenÅ£ie contractul de licenţă înainte de a dezinstala $(^NameDA). Dacă acceptaÅ£i termenii contractului de licenţă, apăsaÅ£i butonul De acord. # ^UnLicenseTextCB CitiÅ£i cu atenÅ£ie contractul de licenţă înainte de a dezinstala $(^NameDA). Dacă acceptaÅ£i termenii contractului de licenţă, bifaÅ£i căsuÅ£a de mai jos. $_CLICK # ^UnLicenseTextRB CitiÅ£i cu atenÅ£ie contractul de licenţă înainte de a dezinstala $(^NameDA). Dacă acceptaÅ£i termenii contractului de licenţă, selectaÅ£i prima opÅ£iune de mai jos. $_CLICK # ^Custom Personalizată # ^ComponentsText AlegeÅ£i componentele pe care doriÅ£i să le instalaÅ£i. $_CLICK # ^ComponentsSubText1 AlegeÅ£i tipul instalării: # ^ComponentsSubText2_NoInstTypes AlegeÅ£i componentele ce urmează a fi instalate: # ^ComponentsSubText2 Sau, alegeÅ£i componentele opÅ£ionale pe care doriÅ£i să le instalaÅ£i: # ^UnComponentsText AlegeÅ£i componentele pe care doriÅ£i să le dezinstalaÅ£i. $_CLICK # ^UnComponentsSubText1 AlegeÅ£i tipul de dezinstalare: # ^UnComponentsSubText2_NoInstTypes AlegeÅ£i componentele ce urmează a fi dezinstalate: # ^UnComponentsSubText2 Sau, alegeÅ£i componentele opÅ£ionale pe care doriÅ£i să le dezinstalaÅ£i: # ^DirText $(^NameDA) se va instala în următorul director. Pentru a alege altă destinaÅ£ie, apăsaÅ£i Alege ÅŸi alegeÅ£i alt director. $_CLICK # ^DirSubText Director destinaÅ£ie # ^DirBrowseText AlegeÅ£i directorul în care doriÅ£i să instalaÅ£i $(^NameDA): # ^UnDirText $(^NameDA) se va dezinstala din următorul director. Pentru a dezinstala din alt director, apăsaÅ£i Alege ÅŸi alegeÅ£i alt director. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText AlegeÅ£i directorul de dezinstalare al $(^NameDA): # ^SpaceAvailable "SpaÅ£iu disponibil: " # ^SpaceRequired "SpaÅ£iu necesar: " # ^UninstallingText Această aplicaÅ£ie va dezinstala $(^NameDA) din computerul Dv. $_CLICK # ^UninstallingSubText Dezinstalare din: # ^FileError Eroare la scrierea fiÅŸierului: \r\n\t"$0"\r\nApăsaÅ£i Abort pentru oprirea instalării,\r\nRetry pentru a mai încerca o dată scrierea fiÅŸierului, \r\nIgnore pentru a trece peste acest fiÅŸier. # ^FileError_NoIgnore Eroare la scrierea fiÅŸierului: \r\n\t"$0"\r\nApăsaÅ£i Retry pentru a mai încerca o dată, sau\r\nAbort pentru oprirea instalării. # ^CantWrite "Nu am putut scrie: " # ^CopyFailed Copierea a eÅŸuat # ^CopyTo "Copiere în " # ^Registering "Se înregistrează: " # ^Unregistering "Se dezînregistrează din registru: " # ^SymbolNotFound "Simbolul nu a fost găsit: " # ^CouldNotLoad "Nu am putut încărca: " # ^CreateFolder "Creare director: " # ^CreateShortcut "Creare comandă rapidă: " # ^CreatedUninstaller "S-a creat aplicaÅ£ia de dezinstalare: " # ^Delete "Åžtergere fiÅŸier: " # ^DeleteOnReboot "Åžtergere la repornire: " # ^ErrorCreatingShortcut "Eroare la crearea comenzii rapide: " # ^ErrorCreating "Eroare la creare: " # ^ErrorDecompressing Eroare la dezarhivarea datelor! Aplicatia de instalare este defectă? # ^ErrorRegistering Eroare la ÃŽnregistrarea DLL-ului # ^ExecShell "ExecShell: " # ^Exec "Executare: " # ^Extract "Extragere: " # ^ErrorWriting "Extragere: eroare la scriere în fiÅŸier " # ^InvalidOpcode AplicaÅ£ie de instalare defectă: opcode incorect # ^NoOLE "Nu există OLE pentru: " # ^OutputFolder "Directorul destinaÅ£ie: " # ^RemoveFolder "Åžtergere destinaÅ£ie: " # ^RenameOnReboot "Redenumire la repornirea computerului: " # ^Rename "Redenumire: " # ^Skipped "Sărite: " # ^CopyDetails Copiere detalii în clipboard # ^LogInstall Jurnal proces instalare # ^Byte O # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Romanian.nsh000077500000000000000000000200211477201124000210720ustar00rootroot00000000000000;Language: Romanian (1048) ;Translated by Cristian Pirvu (pcristip@yahoo.com) ;Updates by Sorin Sbarnea - INTERSOL SRL (sbarneasorin@intersol.ro) - ROBO Design (www.robodesign.ro) ;New revision by George Radu (georadu@hotmail.com) http://mediatae.3x.ro ;New revision by Vlad Rusu (vlad@bitattack.ro) ; - Use Romanian letters ăâîşţ ; - ".. produsului" removed as unnecessary ; - "Elimină" related terms replaced with more appropriate "Dezinstalează" ; - Misc language tweaks !insertmacro LANGFILE "Romanian" = "Română" "Romana" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bine aÅ£i venit la instalarea $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Această aplicaÅ£ie va instala $(^NameDA).$\r$\n$\r$\nEste recomandat să închideÅ£i toate aplicaÅ£iile înainte de începerea procesului de instalare. Acest lucru vă poate asigura un proces de instalare fără erori sau situaÅ£ii neprevăzute.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bine aÅ£i venit la dezinstalarea $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Această aplicaÅ£ie va dezinstala $(^NameDA).$\r$\n$\r$\nEste recomandat să închideÅ£i toate aplicaÅ£iile înainte de începerea procesului de dezinstalare. Acest lucru vă poate asigura un proces de dezinstalare fără erori sau situaÅ£ii neprevăzute.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contract de licenţă" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "CitiÅ£i cu atenÅ£ie termenii contractului de licenţă înainte de a instala $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Dacă acceptaÅ£i termenii contractului de licenţă, apăsati De Acord. Pentru a instala $(^NameDA) trebuie să acceptaÅ£i termenii din contractul de licenţă." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Dacă acceptaÅ£i termenii contractului de licenţă, bifaÅ£i căsuÅ£a de mai jos. Pentru a instala $(^NameDA) trebuie să acceptaÅ£i termenii din contractul de licenţă. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Dacă acceptaÅ£i termenii contractului de licenţă, selectaÅ£i prima opÅ£iune de mai jos. Pentru a instala $(^NameDA) trebuie să acceptaÅ£i termenii din contractul de licenţă. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contract de licenţă" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "CitiÅ£i cu atenÅ£ie termenii contractului de licenţă înainte de a dezinstala $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Dacă acceptaÅ£i termenii contractului de licenţă, apăsati De Acord. Pentru a dezinstala $(^NameDA) trebuie să acceptaÅ£i termenii din contractul de licenţă." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Dacă acceptaÅ£i termenii contractului de licenţă, bifaÅ£i căsuÅ£a de mai jos. Pentru a dezinstala $(^NameDA) trebuie să acceptaÅ£i termenii din contractul de licenţă. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Dacă acceptaÅ£i termenii contractului de licenţă, selectaÅ£i prima opÅ£iune de mai jos. Pentru a dezinstala $(^NameDA) trebuie să acceptaÅ£i termenii din contractul de licenţă. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ApăsaÅ£i Page Down pentru a vizualiza restul contractului de licenţă." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selectare componente" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "SelectaÅ£i componentele $(^NameDA) pe care doriÅ£i să le instalaÅ£i." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selectare componente" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "SelectaÅ£i componentele $(^NameDA) pe care doriÅ£i să le dezinstalaÅ£i." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descriere" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "AÅŸezaÅ£i mouse-ul deasupra fiecărei componente pentru a vizualiza descrierea acesteia." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Selectare director destinaÅ£ie" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "SelectaÅ£i directorul în care doriÅ£i să instalaÅ£i $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Selectare director de dezinstalat" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "SelectaÅ£i directorul din care doriÅ£i să dezinstalaÅ£i $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ÃŽn curs de instalare" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vă rugăm să aÅŸteptaÅ£i, $(^NameDA) se instalează." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalare terminată" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalarea s-a terminat cu succes." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalare anulată" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalarea a fost anulată de utilizator." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ÃŽn curs de dezinstalare" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vă rugăm să aÅŸteptaÅ£i, $(^NameDA) se dezinstalează." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dezinstalare terminată" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Dezinstalarea s-a terminat cu succes." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Dezinstalare anulată" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Dezinstalarea fost anulată de utilizator." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Terminare instalare $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) a fost instalat.$\r$\n$\r$\nApăsaÅ£i Terminare pentru a încheia instalarea." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Trebuie să reporniÅ£i calculatorul pentru a termina instalarea. DoriÅ£i să-l reporniÅ£i acum?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Terminare dezinstalare $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) a fost dezinstalat.$\r$\n$\r$\nApăsaÅ£i Terminare pentru a încheia dezinstalarea." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Trebuie să reporniÅ£i calculatorul pentru a termina dezinstalarea. DoriÅ£i să-l reporniÅ£i acum?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ReporneÅŸte acum" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Repornesc eu mai târziu" ${LangFileString} MUI_TEXT_FINISH_RUN "Executare $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "AfiÅŸare fiÅŸier readme (citeÅŸte-mă)." ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminare" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Selectare grup Meniul Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "SelectaÅ£i un grup in Meniul Start pentru a crea comenzi rapide pentru produs." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "SelectaÅ£i grupul din Meniul Start în care vor fi create comenzi rapide pentru produs. PuteÅ£i de asemenea să creaÅ£i un grup nou." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nu doresc comenzi rapide" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dezinstalare $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dezinstalare $(^NameDA) din calculatorul dumneavoastră." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "SunteÅ£i sigur(ă) că doriÅ£i să anulaÅ£i instalarea $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "SunteÅ£i sigur(ă) că doriÅ£i să anulaÅ£i dezinstalarea $(^Name)?" !endif nsis-3.11/Contrib/Language files/Russian.nlf000077500000000000000000000170041477201124000207500ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1049 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Timon [ timon@front.ru ] + 20030919 # Translation updated by Dmitry Yerokhin [erodim@mail.ru] (20050424) # Minor updates by Oleksandr Gavenko (20100514 - patch #226) # ^Branding Nullsoft Install System %s # ^SetupCaption УÑтановка $(^Name) # ^UninstallCaption Удаление $(^Name) # ^LicenseSubCaption : Лицензионное Ñоглашение # ^ComponentsSubCaption : Параметры уÑтановки # ^DirSubCaption : Папка уÑтановки # ^InstallingSubCaption : Копирование файлов # ^CompletedSubCaption : ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð° # ^UnComponentsSubCaption : Параметры ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ # ^UnDirSubCaption : Папка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ # ^ConfirmSubCaption : Подтверждение # ^UninstallingSubCaption : Удаление файлов # ^UnCompletedSubCaption : ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð° # ^BackBtn < &Ðазад # ^NextBtn &Далее > # ^AgreeBtn Принима&ÑŽ # ^AcceptBtn Я &принимаю уÑÐ»Ð¾Ð²Ð¸Ñ ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ # ^DontAcceptBtn Я &не принимаю уÑÐ»Ð¾Ð²Ð¸Ñ ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ # ^InstallBtn &УÑтановить # ^UninstallBtn Уд&алить # ^CancelBtn Отмена # ^CloseBtn &Закрыть # ^BrowseBtn О&бзор ... # ^ShowDetailsBtn &Детали... # ^ClickNext Ðажмите кнопку "Далее" Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ. # ^ClickInstall Ðажмите кнопку "УÑтановить", чтобы уÑтановить программу. # ^ClickUninstall Ðажмите кнопку "Удалить", чтобы удалить программу. # ^Name Ð˜Ð¼Ñ # ^Completed Готово # ^LicenseText Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением. ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, нажмите кнопку "Принимаю". # ^LicenseTextCB Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением. ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, уÑтановите флажок ниже. $_CLICK # ^LicenseTextRB Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением. ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, выберите первый вариант из предложенных ниже. $_CLICK # ^UnLicenseText Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением. ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, нажмите кнопку "Принимаю". # ^UnLicenseTextCB Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением. ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, уÑтановите флажок ниже. $_CLICK # ^UnLicenseTextRB Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением. ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, выберите первый вариант из предложенных ниже. $_CLICK # ^Custom По выбору # ^ComponentsText Выберите компоненты программы, которые вы хотите уÑтановить. $_CLICK # ^ComponentsSubText1 Выберите тип уÑтановки: # ^ComponentsSubText2_NoInstTypes Выберите компоненты программы Ð´Ð»Ñ ÑƒÑтановки: # ^ComponentsSubText2 или выберите дополнительные компоненты Ð´Ð»Ñ ÑƒÑтановки: # ^UnComponentsText Выберите компоненты, которые вы хотите удалить. $_CLICK # ^UnComponentsSubText1 Выберите тип удалениÑ: # ^UnComponentsSubText2_NoInstTypes Выберите компоненты Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ: # ^UnComponentsSubText2 или выберите дополнительные компоненты Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ: # ^DirText Программа уÑтановит $(^NameDA) в указанную папку. Чтобы уÑтановить приложение в другую папку, нажмите кнопку "Обзор" и укажите ее. $_CLICK # ^DirSubText Папка уÑтановки # ^DirBrowseText Укажите папку Ð´Ð»Ñ ÑƒÑтановки $(^NameDA): # ^UnDirText Программа удалит $(^NameDA) из указанной папки. Чтобы выполнить удаление из другой папки, нажмите кнопку "Обзор" и укажите ее. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Укажите папку, из которой нужно удалить $(^NameDA): # ^SpaceAvailable "ДоÑтупно на диÑке: " # ^SpaceRequired "ТребуетÑÑ Ð½Ð° диÑке: " # ^UninstallingText Программа $(^NameDA) будет удалена из вашего ПК. $_CLICK # ^UninstallingSubText Удаление из: # ^FileError Ðевозможно открыть файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: \r\n\t"$0"\r\n"Прервать": оÑтановить уÑтановку;\r\n"Повтор": повторить попытку;\r\n"ПропуÑк": пропуÑтить Ñто дейÑтвие. # ^FileError_NoIgnore Ðевозможно открыть файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: \r\n\t"$0"\r\n"Повтор": повторить попытку;\r\n"Отмена": прервать процеÑÑ ÑƒÑтановки. # ^CantWrite "Ðевозможно запиÑать: " # ^CopyFailed Ошибка при копировании # ^CopyTo "Копирование в " # ^Registering "РегиÑтрациÑ: " # ^Unregistering "Де-региÑтрациÑ: " # ^SymbolNotFound "Ðевозможно найти Ñимвол: " # ^CouldNotLoad "Ðевозможно загрузить: " # ^CreateFolder "Создание папки: " # ^CreateShortcut "Создание Ñрлыка: " # ^CreatedUninstaller "Создание программы удалениÑ: " # ^Delete "Удаление файла: " # ^DeleteOnReboot "Удаление при перезагрузке ПК: " # ^ErrorCreatingShortcut "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñрлыка: " # ^ErrorCreating "Ошибка ÑозданиÑ: " # ^ErrorDecompressing Ошибка раÑпаковки данных! Возможно, повреждён диÑтрибутив. # ^ErrorRegistering Ðевозможно зарегиÑтрировать библиотеку (DLL) # ^ExecShell "Выполнение команды оболочки: " # ^Exec "Выполнение: " # ^Extract "Извлечение: " # ^ErrorWriting "Извлечение: ошибка запиÑи файла " # ^InvalidOpcode ДиÑтрибутив поврежден: недопуÑтимый код # ^NoOLE "Ðет OLE длÑ: " # ^OutputFolder "Папка уÑтановки: " # ^RemoveFolder "Удаление папки: " # ^RenameOnReboot "Переименование при перезагрузке ПК: " # ^Rename "Переименование: " # ^Skipped "ПропуÑк: " # ^CopyDetails Копировать ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² буфер обмена # ^LogInstall ВеÑти отчет уÑтановки # byte байт # kilo К # mega М # giga Гnsis-3.11/Contrib/Language files/Russian.nsh000077500000000000000000000244241477201124000207650ustar00rootroot00000000000000;Language: Russian (1049) ;Translation updated by Dmitry Yerokhin [erodim@mail.ru] (050424) !insertmacro LANGFILE "Russian" = "РуÑÑкий" "Russkij" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ð’Ð°Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚Ñтвует маÑтер уÑтановки $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Эта программа уÑтановит $(^NameDA) на ваш компьютер.$\r$\n$\r$\nПеред началом уÑтановки рекомендуетÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ‚ÑŒ вÑе работающие приложениÑ. Это позволит программе уÑтановки обновить ÑиÑтемные файлы без перезагрузки компьютера.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ð’Ð°Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚Ñтвует маÑтер ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Эта программа удалит $(^NameDA) из вашего компьютера.$\r$\n$\r$\nПеред началом ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑƒÐ±ÐµÐ´Ð¸Ñ‚ÐµÑÑŒ, что программа $(^NameDA) не запущена.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензионное Ñоглашение" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Перед уÑтановкой $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, нажмите кнопку $\"Принимаю$\". Чтобы уÑтановить программу, необходимо принÑть Ñоглашение." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, уÑтановите флажок ниже. Чтобы уÑтановить программу, необходимо принÑть Ñоглашение. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, выберите первый вариант из предложенных ниже. Чтобы уÑтановить программу, необходимо принÑть Ñоглашение. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензионное Ñоглашение" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Перед удалением $(^NameDA) ознакомьтеÑÑŒ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, нажмите кнопку $\"Принимаю$\". Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ принÑть Ñоглашение. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, уÑтановите флажок ниже. Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ принÑть Ñоглашение. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ЕÑли вы принимаете уÑÐ»Ð¾Ð²Ð¸Ñ ÑоглашениÑ, выберите первый вариант из предложенных ниже. Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ принÑть Ñоглашение. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ текÑту иÑпользуйте клавиши $\"PageUp$\" и $\"PageDown$\"." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Компоненты уÑтанавливаемой программы" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Выберите компоненты $(^NameDA), которые вы хотите уÑтановить." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Компоненты программы" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Выберите компоненты $(^NameDA), которые вы хотите удалить." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ОпиÑание" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ðаведите курÑор мыши на название компонента, чтобы прочеÑть его опиÑание." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Выберите компонент, чтобы увидеть его опиÑание." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Выбор папки уÑтановки" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Выберите папку Ð´Ð»Ñ ÑƒÑтановки $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Выбор папки Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Укажите папку, из которой нужно удалить $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Копирование файлов" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Подождите, идет копирование файлов $(^NameDA)..." ${LangFileString} MUI_TEXT_FINISH_TITLE "УÑтановка завершена" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "УÑтановка уÑпешно завершена." ${LangFileString} MUI_TEXT_ABORT_TITLE "УÑтановка прервана" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "УÑтановка не завершена." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Удаление" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Подождите, идет удаление файлов $(^NameDA)..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Удаление завершено" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Удаление программы уÑпешно завершено." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Удаление прервано" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Удаление произведено не полноÑтью." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завершение работы маÑтера уÑтановки $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "УÑтановка $(^NameDA) выполнена.$\r$\n$\r$\nÐажмите кнопку $\"Готово$\" Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из программы уÑтановки." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÑтановки $(^NameDA) необходимо перезагрузить компьютер. Хотите Ñделать Ñто ÑейчаÑ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завершение работы маÑтера ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Программа $(^NameDA) удалена из вашего компьютера.$\r$\n$\r$\nÐажмите кнопку $\"Готово$\"Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из программы удалениÑ." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ $(^NameDA) нужно перезагрузить компьютер. Хотите Ñделать Ñто ÑейчаÑ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Да, перезагрузить ПК ÑейчаÑ" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ðет, Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ¶Ñƒ ПК позже" ${LangFileString} MUI_TEXT_FINISH_RUN "&ЗапуÑтить $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Показать файл ReadMe" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Готово" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Папка в меню $\"ПуÑк$\"" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Выберите папку в меню $\"ПуÑк$\" Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñрлыков программы." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Выберите папку в меню $\"ПуÑк$\", куда будут помещены Ñрлыки программы. Ð’Ñ‹ также можете ввеÑти другое Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ðе Ñоздавать Ñрлыки" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Удаление $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Удаление $(^NameDA) из компьютера." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ð’Ñ‹ дейÑтвительно хотите отменить уÑтановку $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ð’Ñ‹ дейÑтвительно хотите отменить удаление $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Режим уÑтановки" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Выберите, Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ… пользователей вы хотите уÑтановить $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Выберите, будете ли вы уÑтанавливать $(^NameDA) только Ð´Ð»Ñ ÑÐµÐ±Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ Ð²Ñех пользователей данного компьютера. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "УÑтановить Ð´Ð»Ñ Ð²Ñех пользователей" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "УÑтановить только Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ" !endif nsis-3.11/Contrib/Language files/SConscript000077500000000000000000000016331477201124000206360ustar00rootroot00000000000000languages = Split(""" Albanian Afrikaans Arabic Armenian Asturian Basque Belarusian Bosnian Breton Bulgarian Catalan Corsican Croatian Czech Danish Dutch English Esperanto Estonian Farsi Finnish French Galician Georgian German Greek Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Kurdish Latvian Lithuanian Luxembourgish Macedonian Malay Mongolian Norwegian NorwegianNynorsk Pashto Polish Portuguese PortugueseBR Romanian Russian ScotsGaelic Serbian SerbianLatin SimpChinese Slovak Slovenian Spanish SpanishInternational Swedish Tatar Thai TradChinese Turkish Ukrainian Uzbek Vietnamese Welsh """) language_files = Flatten([(i + '.nlf', i + '.nsh') for i in languages]) Import('defenv') defenv.DistributeContrib(language_files, path='Language files') nsis-3.11/Contrib/Language files/ScotsGaelic.nlf000077500000000000000000000136261477201124000215320ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1169 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by GunChleoc # ^Branding Nullsoft Install System %s # ^SetupCaption A’ stàladh $(^Name) # ^UninstallCaption A’ dì-stàladh $(^Name) # ^LicenseSubCaption : Aonta ceadachais # ^ComponentsSubCaption : Roghainnean an stàlaidh # ^DirSubCaption : Pasgan an stàlaidh # ^InstallingSubCaption : ’Ga stàladh # ^CompletedSubCaption : Deiseil # ^UnComponentsSubCaption : Roghainnean an dì-stàlaidh # ^UnDirSubCaption : Pasgan an dì-stàlaidh # ^ConfirmSubCaption : Dearbhadh # ^UninstallingSubCaption : ’Ga dhì-stàladh # ^UnCompletedSubCaption : Deiseil # ^BackBtn < Air ai&s # ^NextBtn Air adha&rt > # ^AgreeBtn &Gabhaidh mi ris # ^AcceptBtn &Gabhaidh mi teirmichean an aonta cheadachais # ^DontAcceptBtn &Diùltaidh mi teirmichean an aonta ceadachais # ^InstallBtn &Stàlaich # ^UninstallBtn &Dì-stàlaich # ^CancelBtn Sguir dheth # ^CloseBtn &Dùin # ^BrowseBtn &Rùraich… # ^ShowDetailsBtn &Mion-fhiosrachadh # ^ClickNext Briog air “Air adhart†gus leantainn air adhart. # ^ClickInstall Briog air “Stàlaich†gus tòiseachadh air an stàladh. # ^ClickUninstall Briog air “Dì-stàlaich†gus tòiseachadh air an dì-stàladh. # ^Name Ainm # ^Completed Coileanta # ^LicenseText Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, briog air “Gabhaidh mi risâ€. # ^LicenseTextCB Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK # ^LicenseTextRB Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, tagh a’ chiad roghainn gu h-ìosal. $_CLICK # ^UnLicenseText Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, Briog air “Gabhaidh mi risâ€. # ^UnLicenseTextCB Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK # ^UnLicenseTextRB Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, tagh a’ chiad roghainn gu h-ìosal. $_CLICK # ^Custom Gnàthaichte # ^ComponentsText Thoir cromag ann am bogsaichean nan co-phàirtean a tha thu airson stàladh is thoir air falbh i o bhogsaichean nan co-phàirtean nach eil thu ag iarraidh. $_CLICK # ^ComponentsSubText1 Tagh an seòrsa dhen stàladh: # ^ComponentsSubText2_NoInstTypes Tagh na co-phàirtean a tha thu airson stàladh: # ^ComponentsSubText2 No tagh na co-phàirtean roghainneil a tha thu airson stàladh: # ^UnComponentsText Thoir cromag ann am bogsaichean nan co-phàirtean a tha thu airson dì-stàladh is thoir air falbh i o bhogsaichean nan co-phàirtean a tha thu airson cumail. $_CLICK # ^UnComponentsSubText1 Tagh an seòrsa dhen dì-stàladh: # ^UnComponentsSubText2_NoInstTypes Tagh na co-phàirtean a tha thu airson dì-stàladh: # ^UnComponentsSubText2 No tagh na co-phàirtean roghainneil a tha thu airson dì-stàladh: # ^DirText Thèid $(^NameDA) a stàladh sa phasgan seo. Gus stàladh ann am pasgan eile, briog air “Rùraich†is tagh pasgan eile. $_CLICK # ^DirSubText Pasgan-uidhe # ^DirBrowseText Tagh am pasgan san dèid $(^NameDA) a stàladh: # ^UnDirText Thèid $(^NameDA) a dhì-stàladh on phasgan seo. Gus dì-stàladh o phasgan eile, briog air “Rùraich†is tagh pasgan eile. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Tagh am pasgan on a tha thu airson $(^NameDA) a dhì-stàladh: # ^SpaceAvailable "Àite ri fhaighinn: " # ^SpaceRequired "Àite air a bheil feum: " # ^UninstallingText Thèid $(^NameDA) a dhì-stàladh on phasgan seo. $_CLICK # ^UninstallingSubText ’Ga dhì-stàladh o: # ^FileError Thachair mearachd a’ fosgladh an fhaidhle a chum sgrìobhaidh: \r\n\r\n$0\r\n\r\nBriog air “Sguir dheth†gus sgur dhen stàladh, air\r\n“Feuch ris a-rithist†gus feuchainn ris a-rithist no air\r\n“Leig seachad†gus leum a ghearradh thairis air an fhaidhle seo. # ^FileError_NoIgnore Thachair mearachd a’ fosgladh an fhaidhle seo a chum sgrìobhaidh: \r\n\r\n$0\r\n\r\nBriog air “Feuch ris a-rithist†gus feuchainn ris a-rithist no air\r\n“Sguir dheth†gus sgur dhen stàladh. # ^CantWrite "Cha ghabh sgrìobhadh ann: " # ^CopyFailed Cha deach leinn lethbhreac dheth a dhèanamh # ^CopyTo "Cuir lethbhreac gu " # ^Registering "A’ clàradh: " # ^Unregistering "A’ neo-chlàradh: " # ^SymbolNotFound "Cha deach an samhla a lorg: " # ^CouldNotLoad "Cha b’ urrainn dhuinn a luchdadh: " # ^CreateFolder "Cruthaich pasgan: " # ^CreateShortcut "Cruthaich ath-ghoirid: " # ^CreatedUninstaller "Dì-stàlaichear air a chruthachadh: " # ^Delete "Sguab às dhan fhaidhle: " # ^DeleteOnReboot "Sguab às leis an ath-thòiseachadh: " # ^ErrorCreatingShortcut "Mearachd le cruthachadh na h-ath-ghoirid: " # ^ErrorCreating "Mearachd le cruthachadh: " # ^ErrorDecompressing Thachair mearachd a’ dì-dhùmhlachadh an dàta! ’S dòcha gu bheil an t-inneal-stàlaidh coirbte. # ^ErrorRegistering Mearachd le clàradh DLL # ^ExecShell "ExecShell: " # ^Exec "Cuir àithne an gnìomh: " # ^Extract "Dì-dhùmhlaich: " # ^ErrorWriting "Dì-dhùmhlachadh: mearachd a’ sgrìobhadh gu faidhle " # ^InvalidOpcode Stàlaichear coirbte: opcode mì-dhligheach # ^NoOLE "Chan eil OLE ann airson: " # ^OutputFolder "Pasgan às-chuir: " # ^RemoveFolder "Thoir pasgan air falbh: " # ^RenameOnReboot "Cuir ainm ùr air leis an ath-thòiseachadh: " # ^Rename "Cuir ainm ùr air: " # ^Skipped "Air leum a ghearradh: " # ^CopyDetails Cuir lethbhreac dhen mhion-fhiosrachadh san stòr-bhòrd # ^LogInstall Dèan loga dhen stàladh # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/ScotsGaelic.nsh000077500000000000000000000205171477201124000215400ustar00rootroot00000000000000;Language: Gàidhlig (1169) ;Le GunChleoc !insertmacro LANGFILE "ScotsGaelic" "Scottish Gaelic" "Gàidhlig" "Gaidhlig" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fàilte gu stàladh $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Stiùiridh sinn tron stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMholamaid gun dùin thu a h-uile aplacaid eile mus tòisich thu air an stàladh. Mar sin, ’s urrainn dhuinn faidhlichean iomchaidh an t-siostaim ùrachadh gun fheum air ath-thòiseachadh a’ choimpiutair agad.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fàilte gun dì-stàladh aig $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Stiùiridh sinn tron dì-stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMus tòisich thu air an dì-stàladh, dèan cinnteach nach eil $(^NameDA) a’ ruith.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Aonta ceadachais" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "An doir thu sùil air teirmichean a’ cheadachais mus stàlaich thu $(^NameDA)?" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris†gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ma ghabhas tu ri teirmichean an aonta, thoir cromag sa bhogsa gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a’ chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Aonta ceadachais" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "An doir thu sùil air teirmichean a’ cheadachais mus dì-stàlaich thu $(^NameDA)?" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris†gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ma ghabhas tu ri teirmichean an aonta, cuir cromag sa bhogsa gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a’ chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Brùth air Page Down gus an corr dhen aonta a shealltainn." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Tagh co-phàirtean" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Tagh na gleusan aig $(^NameDA) a tha thu airson stàladh." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Tagh co-phàirtean" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Tagh na gleusan aig $(^NameDA) a tha thu airson dì-stàladh." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Tuairisgeul" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Cuir an luchag agad air co-phàirt gus a tuairisgeul a shealltainn." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tagh co-phàirt gus a tuairisgeul a shealltainn." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Tagh ionad an stàlaidh" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Tagh am pasgan san dèid $(^NameDA) a stàladh." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Tagh ionad an dì-stàlaidh" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Tagh am pasgan on a thèid $(^NameDA) a dhì-stàladh." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "’Ga stàladh" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fuirich ort fhad ’s a tha $(^NameDA) ’ga stàladh." ${LangFileString} MUI_TEXT_FINISH_TITLE "Stàladh deiseil" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Tha an stàladh deiseil." ${LangFileString} MUI_TEXT_ABORT_TITLE "Chaidh sgur dhen stàladh" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Cha deach an stàladh a choileanadh." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "’Ga dhì-stàladh" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fuirich ort fhad ’s a tha $(^NameDA) ’ga dhì-stàladh." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dì-stàladh deiseil" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Chaidh a dhì-stàladh." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Chaidh sgur dhen dì-stàladh" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Cha deach an dì-stàladh a choileanadh." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A’ coileanadh an stàlaidh aig $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a stàladh air a’ choimpiutair agad.$\r$\n$\r$\nBriog air “Crìochnaich†gus an t-inneal-stàlaidh a dhùnadh." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a’ choimpiutair agad gus an stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A’ coileanadh an dì-stàlaidh aig $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a dhì-stàladh on choimpiutair agad.$\r$\n$\r$\nBriog air “Crìochnaich†gus an t-inneal-stàlaidh a dhùnadh." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a’ choimpiutair agad gus an dì-stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ath-tòisich an-dràsta" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nì mi fhìn ath-thòiseachadh a làimh uaireigin eile" ${LangFileString} MUI_TEXT_FINISH_RUN "&Ruith $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Seall am faidhle “Leughmiâ€" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Crìochnaich" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Tagh pasgan sa chlàr-taice tòiseachaidh" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Tagh pasgan sa chlàr-taice tòiseachaidh airson na h-ath-ghoiridean aig $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Tagh pasgan sa chlàr-taice tòiseachaidh sa bheil thu airson na h-ath-ghoiridean aig a’ phrògram a chruthachadh. ’S urrainn dhut cuideachd ainm a chur a-steach gus pasgan ùr a chruthachadh." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Na cruthaich ath-ghoiridean" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dì-stàlaich $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Thoir $(^NameDA) air falbh on choimpiutair agad." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "A bheil thu cinnteach gu bheil thu airson an stàladh aig $(^Name) fhàgail?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "A bheil thu cinnteach gu bheil thu airson an dì-stàladh aig $(^Name) fhàgail?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Tagh cleachdaichean" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Tagh na cleachdaichean dhan a thèid $(^NameDA) a stàladh." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Tagh an stàlaich thu $(^NameDA) air do shon fhìn a-mhàin no airson a h-uile cleachdaiche air a’ choimpiutair seo. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Stàlaich airson duine sam bith a chleachdas an coimpiutair seo" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Na stàlaich ach air mo shon-sa" !endif nsis-3.11/Contrib/Language files/Serbian.nlf000077500000000000000000000200011477201124000206760ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 3098 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Срђан Обућина # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) ИнÑталација # ^UninstallCaption $(^Name) ДеинÑталација # ^LicenseSubCaption : Договор о праву коришћења # ^ComponentsSubCaption : Опције инÑталације # ^DirSubCaption : Избор фолдера за инÑталацију # ^InstallingSubCaption : ИнÑталација # ^CompletedSubCaption : Завршена инÑталација # ^UnComponentsSubCaption : Опције деинÑталације # ^UnDirSubCaption : Избор фолдера за деинÑталацију # ^ConfirmSubCaption : Потврђивање # ^UninstallingSubCaption : ДеинÑталација # ^UnCompletedSubCaption : Завршена деинÑталација # ^BackBtn < Ðазад # ^NextBtn Ðапред > # ^AgreeBtn Прихватам # ^AcceptBtn Прихватам уÑлове договора о праву коришћења # ^DontAcceptBtn Ðе прихватам уÑлове договора о праву коришћења # ^InstallBtn ИнÑталирај # ^UninstallBtn ДеинÑталирај # ^CancelBtn ОдуÑтани # ^CloseBtn Затвори # ^BrowseBtn Избор... # ^ShowDetailsBtn Детаљи # ^ClickNext ПритиÑните дугме „Ðапред“ за наÑтавак. # ^ClickInstall ПритиÑните дугме „ИнÑталирај“ за почетак инÑталације. # ^ClickUninstall ПритиÑните дугме „ДеинÑталирај“ за почетак деинÑталације. # ^Name Име # ^Completed Завршено # ^LicenseText Пажљиво прочитајте договор о праву коришћења пре инÑталације програма $(^NameDA). Ðко прихватате Ñве уÑлове договора, притиÑните дугме „Прихватам“. # ^LicenseTextCB Пажљиво прочитајте договор о праву коришћења пре инÑталације програма $(^NameDA). Ðко прихватате Ñве уÑлове договора, обележите квадратић иÑпод. $_CLICK # ^LicenseTextRB Пажљиво прочитајте договор о праву коришћења пре инÑталације програма $(^NameDA). Ðко прихватате Ñве уÑлове договора, изаберите прву опцију иÑпод. $_CLICK # ^UnLicenseText Пажљиво прочитајте договор о праву коришћења пре деинÑталације програма $(^NameDA). Ðко прихватате Ñве уÑлове договора, притиÑните дугме „Прихватам“. # ^UnLicenseTextCB Пажљиво прочитајте договор о праву коришћења пре деинÑталације програма $(^NameDA). Ðко прихватате Ñве уÑлове договора, обележите квадратић иÑпод. $_CLICK # ^UnLicenseTextRB Пажљиво прочитајте договор о праву коришћења пре деинÑталације програма $(^NameDA). Ðко прихватате Ñве уÑлове договора, изаберите прву опцију иÑпод. $_CLICK # ^Custom Прилагођавање # ^ComponentsText Изаберите компоненте за инÑталацију. ИнÑталирају Ñе Ñамо означене компоненте. $_CLICK # ^ComponentsSubText1 Изаберите тип инÑталације: # ^ComponentsSubText2_NoInstTypes Изаберите компоненте за инÑталацију: # ^ComponentsSubText2 Или, изаберите опционе компоненте које желите да инÑталирате: # ^UnComponentsText Изаберите компоненте за деинÑталацију. ДеинÑталирају Ñе Ñамо означене компоненте. $_CLICK # ^UnComponentsSubText1 Изаберите тип деинÑталације: # ^UnComponentsSubText2_NoInstTypes Изаберите компоненте за деинÑталацију: # ^UnComponentsSubText2 Или, изаберите опционе компоненте које желите да деинÑталирате: # ^DirText Програм $(^NameDA) ће бити инÑталиран у наведени фолдер. За инÑталацију у други фолдер притиÑните дугме „Избор...“ и изаберите фолдер. $_CLICK # ^DirSubText Фолдер # ^DirBrowseText Изаберите фолдер у који ћете инÑталирати програм $(^NameDA): # ^UnDirText Програм $(^NameDA) ће бити деинÑталиран из наведеног фолдера. За деинÑталацију из другог фолдера притиÑните дугме „Избор...“ и изаберите фолдер. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Изаберите фолдер из кога ћете деинÑталирати програм $(^NameDA): # ^SpaceAvailable "Слободан проÑтор: " # ^SpaceRequired "Потребан проÑтор: " # ^UninstallingText Програм $(^NameDA) ће бити деинÑталиран из наведеног фолдера. $_CLICK # ^UninstallingSubText ДеинÑталација из: # ^FileError Грешка при отварању фајла за пиÑање: \r\n\t"$0"\r\nПритиÑните дугме „ОдуÑтани“ за прекид инÑталације,\r\n„Понови“ за поновни покушај пиÑања у фајл, или\r\n„Игнориши“ за преÑкакање овог фајла. # ^FileError_NoIgnore Грешка при отварању фајла за пиÑање: \r\n\t"$0"\r\nПритиÑните дугме „Понови“ за поновни покушај пиÑања у фајл, или\r\n„ОдуÑтани“ за прекид инÑталирања. # ^CantWrite "Ðемогуће пиÑање: " # ^CopyFailed ÐеуÑпешно копирање # ^CopyTo "Копирање у " # ^Registering "РегиÑтровање: " # ^Unregistering "ДерегиÑтровање: " # ^SymbolNotFound "Симбол није нађен: " # ^CouldNotLoad "Ðемогуће учитавање: " # ^CreateFolder "Креирање фолдера: " # ^CreateShortcut "Креирање пречице: " # ^CreatedUninstaller "Креирање деинÑталера: " # ^Delete "БриÑање фајла: " # ^DeleteOnReboot "БриÑање при реÑтарту: " # ^ErrorCreatingShortcut "Грешка при креирању пречице: " # ^ErrorCreating "Грешка при креирању: " # ^ErrorDecompressing Грешка при отпакивању података! Оштећен инÑталациони програм? # ^ErrorRegistering Грешка при региÑтровању библиотеке # ^ExecShell "Извршавање у окружењу: " # ^Exec "Извршавање: " # ^Extract "Отпакивање: " # ^ErrorWriting "Отпакивање: грешка при упиÑу у фајл " # ^InvalidOpcode Оштећен инÑталациони програм: неиÑправна команда # ^NoOLE "Ðема OLE подршке за: " # ^OutputFolder "Излазни фолдер: " # ^RemoveFolder "БриÑање фолдера: " # ^RenameOnReboot "Преименовање при реÑтартовању: " # ^Rename "Преименован: " # ^Skipped "ПреÑкочен: " # ^CopyDetails Копирај детаље у клипборд # ^LogInstall Води запиÑник о процеÑу инÑталације # ^Byte B # ^Kilo k # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Serbian.nsh000077500000000000000000000242201477201124000207160ustar00rootroot00000000000000;Language: Serbian (3098) ;Translation by Срђан Обућина !insertmacro LANGFILE "Serbian" "Serbian (Cyrillic)" "СрпÑки" "Srpski (Cyrillic)" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Добродошли у водич за инÑталацију програма $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Бићете вођени кроз Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¸Ð½Ñталације програма $(^NameDA).$\r$\n$\r$\nПрепоручљиво је да иÑкључите Ñве друге програме пре почетка инÑталације. Ово може омогућити ажурирање ÑиÑтемÑких фајлова без потребе за поновним покретањем рачунара.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Добродошли у деинÑталацију програма $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Бићете вођени кроз Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´ÐµÐ¸Ð½Ñталације програма $(^NameDA).$\r$\n$\r$\nПре почетка деинÑталације, уверите Ñе да је програм $(^NameDA) иÑкључен. $_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Договор о праву коришћења" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Пажљиво прочитајте договор о праву коришћења пре инÑталације програма $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ðко прихватате Ñве уÑлове договора, притиÑните дугме „Прихватам“ за наÑтавак. Морате прихватити договор да биÑте инÑталирали програм $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ðко прихватате Ñве уÑлове договора, обележите квадратић иÑпод. Морате прихватити договор да биÑте инÑталирали програм $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ðко прихватате Ñве уÑлове договора, изаберите прву опцију иÑпод. Морате прихватити договор да биÑте инÑталирали програм $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Договор о праву коришћења" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Пажљиво прочитајте договор о праву коришћења пре деинÑталације програма $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ðко прихватате Ñве уÑлове договора, притиÑните дугме „Прихватам“ за наÑтавак. Морате прихватити договор да биÑте деинÑталирали програм $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ðко прихватате Ñве уÑлове договора, обележите квадратић иÑпод. Морате прихватити договор да биÑте деинÑталирали програм $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ðко прихватате Ñве уÑлове договора, изаберите прву опцију иÑпод. Морате прихватити договор да биÑте деинÑталирали програм $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ПритиÑните Page Down да биÑте видели оÑтатак договора." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Избор компоненти за инÑталацију" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Изаберите компоненте за инÑталацију. ИнÑталирају Ñе Ñамо означене компоненте." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Избор компоненти за деинÑталацију" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Изаберите компоненте за деинÑталацију. ДеинÑталирају Ñе Ñамо означене компоненте." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ОпиÑ" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Пређите курÑором миша преко имена компоненте да биÑте видели њен опиÑ." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Изаберите компоненту да биÑте видели њен опиÑ." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Избор фолдера за инÑталацију" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Изаберите фолдер у који ћете инÑталирати програм $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Избор фолдера за деинÑталaцију" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Изаберите фолдер из кога ћете деинÑталирати програм $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ИнÑталација" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Сачекајте док Ñе програм $(^NameDA) инÑталира." ${LangFileString} MUI_TEXT_FINISH_TITLE "Завршена инÑталација" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ИнÑталација је уÑпешно завршена." ${LangFileString} MUI_TEXT_ABORT_TITLE "Прекинута инÑталација" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ИнÑталација је прекинута и није уÑпешно завршена." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ДеинÑталација" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Сачекајте док Ñе програм $(^NameDA) деинÑталира." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Завршена деинÑталација" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ДеинÑталација је уÑпешно завршена." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Прекинута деинÑталација" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ДеинÑталација је прекинута и није уÑпешно завршена." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завршена инÑталација програма $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Програм $(^NameDA) је инÑталиран на рачунар.$\r$\n$\r$\nПритиÑните дугме „Крај“ за затварање овог прозора." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Рачунар мора бити поново покренут да би Ñе Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¸Ð½Ñталације програма $(^NameDA) уÑпешно завршио. Желите ли то одмах да урадите?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завршена деинÑталација програма $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Програм $(^NameDA) је деинÑталиран Ñа рачунара.$\r$\n$\r$\nПритиÑните дугме „Крај“ за затварање овог прозора." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Рачунар мора бити поново покренут да би Ñе Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´ÐµÐ¸Ð½Ñталације програма $(^NameDA) уÑпешно завршио. Желите ли то да урадите одмах?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Одмах поново покрени рачунар" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Без поновног покретања" ${LangFileString} MUI_TEXT_FINISH_RUN "Покрени програм $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Прикажи ПрочитајМе фајл" ${LangFileString} MUI_BUTTONTEXT_FINISH "Крај" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Избор фолдера у Старт менију" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Изаберите фолдер у Старт менију у коме ћете креирати пречице." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Изаберите фолдер у Старт менију у коме желите да буду креиране пречице програма. Можете упиÑати и име за креирање новог фолдера." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Без креирања пречица" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ДеинÑталација програма $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "ДеинÑталација програма $(^NameDA) Ñа рачунара." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Сигурно желите да прекинете инÑталацију програма $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Сигурно желите да прекинете деинÑталацију програма $(^Name)?" !endif nsis-3.11/Contrib/Language files/SerbianLatin.nlf000077500000000000000000000126631477201124000217050ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 2074 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by SrÄ‘an Obućina # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Instalacija # ^UninstallCaption $(^Name) Deinstalacija # ^LicenseSubCaption : Dogovor o pravu korišćenja # ^ComponentsSubCaption : Opcije instalacije # ^DirSubCaption : Izbor foldera za instalaciju # ^InstallingSubCaption : Instalacija # ^CompletedSubCaption : ZavrÅ¡ena instalacija # ^UnComponentsSubCaption : Opcije deinstalacije # ^UnDirSubCaption : Izbor foldera za deinstalaciju # ^ConfirmSubCaption : PotvrÄ‘ivanje # ^UninstallingSubCaption : Deinstalacija # ^UnCompletedSubCaption : ZavrÅ¡ena deinstalacija # ^BackBtn < Nazad # ^NextBtn Napred > # ^AgreeBtn Prihvatam # ^AcceptBtn Prihvatam uslove dogovora o pravu korišćenja # ^DontAcceptBtn Ne prihvatam uslove dogovora o pravu korišćenja # ^InstallBtn Instaliraj # ^UninstallBtn Deinstaliraj # ^CancelBtn Odustani # ^CloseBtn Zatvori # ^BrowseBtn Izbor... # ^ShowDetailsBtn Detalji # ^ClickNext Pritisnite dugme „Napred“ za nastavak. # ^ClickInstall Pritisnite dugme „Instaliraj“ za poÄetak instalacije. # ^ClickUninstall Pritisnite dugme „Deinstaliraj“ za poÄetak deinstalacije. # ^Name Ime # ^Completed ZavrÅ¡eno # ^LicenseText Pažlivo proÄitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“. # ^LicenseTextCB Pažlivo proÄitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. $_CLICK # ^LicenseTextRB Pažlivo proÄitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK # ^UnLicenseText Pažlivo proÄitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“. # ^UnLicenseTextCB Pažlivo proÄitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. $_CLICK # ^UnLicenseTextRB Pažlivo proÄitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK # ^Custom PrilagoÄ‘avanje # ^ComponentsText Izaberite komponente za instalaciju. Instaliraju se samo oznaÄene komponente. $_CLICK # ^ComponentsSubText1 Izaberite tip instalacije: # ^ComponentsSubText2_NoInstTypes Izaberite komponente za instalaciju: # ^ComponentsSubText2 Ili, izaberite opcione komponente koje želite da instalirate: # ^UnComponentsText Izaberite komponente za deinstalaciju. Deinstaliraju se samo oznaÄene komponente. $_CLICK # ^UnComponentsSubText1 Izaberite tip deinstalacije: # ^UnComponentsSubText2_NoInstTypes Izaberite komponente za deinstalaciju: # ^UnComponentsSubText2 Ili, izaberite opcione komponente koje želite da deinstalirate: # ^DirText Program $(^NameDA) će biti instaliran u navedeni folder. Za instalaciju u drugi folder pritisnite dugme „Izbor...“ i izaberite folder. $_CLICK # ^DirSubText Folder # ^DirBrowseText Izaberite folder u koji ćete instalirati program $(^NameDA): # ^UnDirText Program $(^NameDA) će biti deinstaliran iz navedenog foldera. Za deinstalaciju iz drugog foldera pritisnite dugme „Izbor...“ i izaberite folder. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Izaberite folder iz koga ćete deinstalirati program $(^NameDA): # ^SpaceAvailable "Slobodan prostor: " # ^SpaceRequired "Potreban prostor: " # ^UninstallingText Program $(^NameDA) će biti deinstaliran iz navedenog foldera. $_CLICK # ^UninstallingSubText Deinstalacija iz: # ^FileError GreÅ¡ka pri otvaranju fajla za pisanje: \r\n\t"$0"\r\nPritisnite dugme „Odustani“ za prekid instalacije,\r\n„Ponovi“ za ponovni pokuÅ¡aj pisanja u fajl, ili\r\n„IgnoriÅ¡i“ za preskakanje ovog fajla. # ^FileError_NoIgnore GreÅ¡ka pri otvaranju fajla za pisanje: \r\n\t"$0"\r\nPritisnite dugme „Ponovi“ za ponovni pokuÅ¡aj pisanja u fajl, ili\r\n„Odustani“ za prekid instaliranja. # ^CantWrite "Nemoguće pisanje: " # ^CopyFailed NeuspeÅ¡no kopiranje # ^CopyTo "Kopiranje u " # ^Registering "Registrovanje: " # ^Unregistering "Deregistrovanje: " # ^SymbolNotFound "Simbol nije naÄ‘en: " # ^CouldNotLoad "Nemoguće uÄitavanje: " # ^CreateFolder "Kreiranje foldera: " # ^CreateShortcut "Kreiranje preÄice: " # ^CreatedUninstaller "Kreiranje deinstalera: " # ^Delete "Brisanje fajla: " # ^DeleteOnReboot "Brisanje pri restartu: " # ^ErrorCreatingShortcut "GreÅ¡ka pri kreiranju preÄice: " # ^ErrorCreating "GreÅ¡ka pri kreiranju: " # ^ErrorDecompressing GreÅ¡ka pri otpakivanju podataka! OÅ¡tećen instalacioni program? # ^ErrorRegistering GreÅ¡ka pri registrovanju biblioteke # ^ExecShell "IzvrÅ¡avanje u okruženju: " # ^Exec "IzvrÅ¡avanje: " # ^Extract "Otpakivanje: " # ^ErrorWriting "Otpakivanje: greÅ¡ka pri upisu u fajl " # ^InvalidOpcode OÅ¡tećen instalacioni program: neispravna komanda # ^NoOLE "Nema OLE podrÅ¡ke za: " # ^OutputFolder "Izlazni folder: " # ^RemoveFolder "Brisanje foldera: " # ^RenameOnReboot "Preimenovanje pri restartu: " # ^Rename "Preimenovan: " # ^Skipped "PreskoÄen: " # ^CopyDetails Kopiraj detalje u klipbord # ^LogInstall Vodi zapisnik o procesu instalacije # ^Byte B # ^Kilo k # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/SerbianLatin.nsh000077500000000000000000000170171477201124000217140ustar00rootroot00000000000000;Language: Serbian Latin (2074) ;Translation by SrÄ‘an Obućina !insertmacro LANGFILE "SerbianLatin" "Serbian (Latin)" "Srpski" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li u vodiÄ za instalaciju programa $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bićete voÄ‘eni kroz proces instalacije programa $(^NameDA).$\r$\n$\r$\nPreporuÄljivo je da iskljuÄite sve druge programe pre poÄetka instalacije. Ovo može omogućiti ažuriranje sistemskih fajlova bez potrebe za ponovnim pokretanjem raÄunara.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li u deinstalaciju programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bićete voÄ‘eni kroz proces deinstalacije programa $(^NameDA).$\r$\n$\r$\nPre poÄetka deinstalacije, uverite se da je program $(^NameDA) iskljuÄen. $_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Dogovor o pravu korišćenja" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pažljivo proÄitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“ za nastavak. Morate prihvatiti dogovor da biste instalirali program $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Dogovor o pravu korišćenja" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pažlivo proÄitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“ za nastavak. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pritisnite Page Down da biste videli ostatak dogovora." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti za instalaciju" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izaberite komponente za instalaciju. Instaliraju se samo oznaÄene komponente." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti za deinstalaciju" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izaberite komponente za deinstalaciju. Deinstaliraju se samo oznaÄene komponente." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "PreÄ‘ite kursorom miÅ¡a preko imena komponente da biste videli njen opis." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Izaberite komponentu da biste videli njen opis." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izbor foldera za instalaciju" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izaberite folder u koji ćete instalirati program $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izbor foldera za deinstalaciju" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izaberite folder iz koga ćete deinstalirati program $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacija" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "SaÄekajte dok se program $(^NameDA) instalira." ${LangFileString} MUI_TEXT_FINISH_TITLE "ZavrÅ¡ena instalacija" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je uspeÅ¡no zavrÅ¡ena." ${LangFileString} MUI_TEXT_ABORT_TITLE "Prekinuta instalacija" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija je prekinuta i nije uspeÅ¡no zavrÅ¡ena." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalacija" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "SaÄekajte dok se program $(^NameDA) deinstalira." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ZavrÅ¡ena deinstalacija" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Deinstalacija je uspeÅ¡no zavrÅ¡ena." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Prekinuta deinstalacija" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deinstalacija je prekinuta i nije uspeÅ¡no zavrÅ¡ena." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ZavrÅ¡ena instalacija programa $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na raÄunar.$\r$\n$\r$\nPritisnite dugme „Kraj“ za zatvaranje ovog prozora." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "RaÄunar mora biti ponovo pokrenut da bi se proces instalacije programa $(^NameDA) uspeÅ¡no zavrÅ¡io. Želite li to odmah da uradite?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ZavrÅ¡ena deinstalacija programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je deinstaliran sa raÄunara.$\r$\n$\r$\nPritisnite dugme „Kraj“ za zatvaranje ovog prozora." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "RaÄunar mora biti ponovo pokrenut da bi se proces deinstalacije programa $(^NameDA) uspeÅ¡no zavrÅ¡io. Želite li to da uradite odmah?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Odmah ponovo pokreni raÄunar" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Bez ponovnog pokretanja" ${LangFileString} MUI_TEXT_FINISH_RUN "Pokreni program $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži ProÄitajMe fajl" ${LangFileString} MUI_BUTTONTEXT_FINISH "Kraj" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor foldera u Start meniju" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izaberite folder u Start meniju u kome ćete kreirati preÄice." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izaberite folder u Start meniju u kome želite da budu kreirane preÄice programa. Možete upisati i ime za kreiranje novog foldera." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Bez kreiranja preÄica" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deinstalacija programa $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Deinstalacija programa $(^NameDA) sa raÄunara." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Sigurno želite da prekinete instalaciju programa $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sigurno želite da prekinete deinstalaciju programa $(^Name)?" !endif nsis-3.11/Contrib/Language files/SimpChinese.nlf000077500000000000000000000116721477201124000215400ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 2052 # Font and size - dash (-) means default 字体åç§°ä¸Žå¤§å° å®‹ä½“ 9 # Codepage - dash (-) means ASCII code page ASCII å­—ç é¡µ 936 # RTL - anything else than RTL means LTR ç”±å³è‡³å·¦ä¹¦å†™ - # Revision date: 2020-06-03 # Translator: Kii Ali , , , Tyson Tan # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) 安装 # ^UninstallCaption $(^Name) å¸è½½ # ^LicenseSubCaption : 许å¯è¯åè®® # ^ComponentsSubCaption : 安装选项 # ^DirSubCaption : 安装目录 # ^InstallingSubCaption : 正在安装 # ^CompletedSubCaption : å·²å®Œæˆ # ^UnComponentsSubCaption : å¸è½½é€‰é¡¹ # ^UnDirSubCaption : å¸è½½æ–‡ä»¶å¤¹ # ^ConfirmSubCaption : 确认 # ^UninstallingSubCaption : 正在å¸è½½ # ^UnCompletedSubCaption : å®Œæˆ # ^BackBtn < 上一步(&P) # ^NextBtn 下一步(&N) > # ^AgreeBtn 我接å—(&I) # ^AcceptBtn 我接å—许å¯è¯åè®®ä¸­çš„æ¡æ¬¾(&A) # ^DontAcceptBtn æˆ‘ä¸æŽ¥å—许å¯è¯åè®®ä¸­çš„æ¡æ¬¾(&N) # ^InstallBtn 安装(&I) # ^UninstallBtn å¸è½½(&U) # ^CancelBtn å–æ¶ˆ(&C) # ^CloseBtn 关闭(&L) # ^BrowseBtn æµè§ˆ(&B)... # ^ShowDetailsBtn 显示详情(&D) # ^ClickNext 点击 [下一步(N)] 继续。 # ^ClickInstall 点击 [安装(I)] 开始安装。 # ^ClickUninstall 点击 [å¸è½½(U)] 开始å¸è½½ã€‚ # ^Name åç§° # ^Completed å·²å®Œæˆ # ^LicenseText 请在安装 $(^NameDA) 之å‰é˜…读许å¯è¯å议。如果你接å—åè®®ä¸­æ‰€æœ‰æ¡æ¬¾ï¼Œç‚¹å‡» [æˆ‘åŒæ„(I)] 。 # ^LicenseTextCB 请在安装 $(^NameDA) 之å‰é˜…读许å¯è¯å议。如果你接å—åè®®ä¸­æ‰€æœ‰æ¡æ¬¾ï¼Œç‚¹å‡»ä¸‹æ–¹çš„选框。 $_CLICK # ^LicenseTextRB 请在安装 $(^NameDA) 之å‰é˜…读许å¯è¯å议。如果你接å—åè®®ä¸­æ‰€æœ‰æ¡æ¬¾ï¼Œé€‰æ‹©ä¸‹æ–¹çš„第一个选项。 $_CLICK # ^UnLicenseText 请在å¸è½½ $(^NameDA) 之å‰é˜…读许å¯è¯å议。如果你接å—åè®®ä¸­æ‰€æœ‰æ¡æ¬¾ï¼Œç‚¹å‡» [æˆ‘åŒæ„(I)] 。 # ^UnLicenseTextCB 请在å¸è½½ $(^NameDA) 之å‰é˜…读许å¯è¯å议。如果你接å—åè®®ä¸­æ‰€æœ‰æ¡æ¬¾ï¼Œç‚¹å‡»ä¸‹æ–¹çš„选框。 $_CLICK # ^UnLicenseTextRB 请在å¸è½½ $(^NameDA) 之å‰é˜…读许å¯è¯å议。如果你接å—åè®®ä¸­æ‰€æœ‰æ¡æ¬¾ï¼Œé€‰æ‹©ä¸‹æ–¹çš„第一个选项。 $_CLICK # ^Custom 自定义 # ^ComponentsText è¯·å‹¾é€‰ä½ æƒ³å®‰è£…çš„ç»„ä»¶ï¼Œå¹¶å–æ¶ˆå‹¾é€‰ä½ ä¸æƒ³å®‰è£…的组件。 $_CLICK # ^ComponentsSubText1 选定的安装的类型: # ^ComponentsSubText2_NoInstTypes 选定安装的组件: # ^ComponentsSubText2 或者,自定义选定想安装的组件: # ^UnComponentsText 请勾选你想å¸è½½çš„ç»„ä»¶ï¼Œå¹¶å–æ¶ˆå‹¾é€‰ä½ ä¸æƒ³å¸è½½çš„组件。 $_CLICK # ^UnComponentsSubText1 选择å¸è½½çš„类型: # ^UnComponentsSubText2_NoInstTypes 选择è¦å¸è½½çš„组件: # ^UnComponentsSubText2 或是,选择想è¦è§£é™¤å®‰è£…çš„å¯é€‰é¡¹ç»„ä»¶: # ^DirText 安装程åºå°†æŠŠ $(^NameDA) 安装到以下目录。è¦å®‰è£…到å¦ä¸€ä¸ªç›®å½•,请点击 [æµè§ˆ(B)...] 并选择其他的文件夹。 $_CLICK # ^DirSubText 安装目录 # ^DirBrowseText 选择安装此软件的 $(^NameDA) çš„ä½ç½®: # ^UnDirText 安装程åºå°†æŠŠ $(^NameDA) 从以下目录å¸è½½ã€‚è¦ä»Žå¦ä¸€ä¸ªç›®å½•å¸è½½ï¼Œç‚¹å‡» [æµè§ˆ(B)...] 并选择其他目录。 $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText 选择è¦å¸è½½ $(^NameDA) 的目录: # ^SpaceAvailable "å¯ç”¨ç©ºé—´: " # ^SpaceRequired "所需空间: " # ^UninstallingText æ­¤å‘导将从本机å¸è½½ $(^NameDA) 。 $_CLICK # ^UninstallingSubText å¸è½½ç›®å½•: # ^FileError 无法打开è¦å†™å…¥çš„æ–‡ä»¶: \r\n\t"$0"\r\n点击 [Abort] åœæ­¢å®‰è£…,\r\n [Retry] 釿–°å°è¯•写入文件,或者\r\n [Ignore] 忽略这个文件。 # ^FileError_NoIgnore 无法打开è¦å†™å…¥çš„æ–‡ä»¶: \r\n\t"$0"\r\n点击 [Retry] 釿–°å°è¯•写入文件,或者\r\n [Cancel] åœæ­¢å®‰è£…。 # ^CantWrite "无法写入: " # ^CopyFailed "å¤åˆ¶å¤±è´¥ " # ^CopyTo "å¤åˆ¶åˆ°: " # ^Registering "正在注册: " # ^Unregistering "æ­£åœ¨å–æ¶ˆæ³¨å†Œ: " # ^SymbolNotFound "无法找到符å·: " # ^CouldNotLoad "无法加载: " # ^CreateFolder "创建文件夹: " # ^CreateShortcut "åˆ›å»ºå¿«æ·æ–¹å¼: " # ^CreatedUninstaller "创建å¸è½½ç¨‹åº: " # ^Delete "删除文件: " # ^DeleteOnReboot "釿–°å¯åЍåŽåˆ é™¤: " # ^ErrorCreatingShortcut "åˆ›å»ºå¿«æ·æ–¹å¼æ—¶å‘生错误: " # ^ErrorCreating "创建时å‘生错误: " # ^ErrorDecompressing "è§£åŽ‹ç¼©æ•°æ®æ—¶å‘生错误ï¼è¯·æ£€æŸ¥å®‰è£…ç¨‹åºæ˜¯å¦æŸå。" # ^ErrorRegistering "注册 DLL æ—¶å‘生错误" # ^ExecShell "执行外壳程åº: " # ^Exec "执行: " # ^Extract "解压缩: " # ^ErrorWriting "抽å–: 无法写入文件 " # ^InvalidOpcode "å®‰è£…ç¨‹åºæŸå: 无效的æ“ä½œä»£ç  " # ^NoOLE "没有 OLE 用于: " # ^OutputFolder "输出目录: " # ^RemoveFolder "删除目录: " # ^RenameOnReboot "釿–°å¯åЍ之åŽé‡å‘½å: " # ^Rename "é‡å‘½å: " # ^Skipped "已跳过: " # ^CopyDetails "å¤åˆ¶è¯¦æƒ…åˆ°å‰ªè´´æ¿ " # ^LogInstall "记录安装过程到日志" # byte B # kilo K # mega M # giga G nsis-3.11/Contrib/Language files/SimpChinese.nsh000077500000000000000000000170031477201124000215430ustar00rootroot00000000000000;Language: 'Chinese (Simplified)' (2052) ;Translator: Kii Ali , , , Tyson Tan ;Revision date: 2020-06-03 !insertmacro LANGFILE "SimpChinese" "Chinese (Simplified)" "中文(简体)" "Hanyu (Jiantizi)" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "欢迎使用 $(^NameDA) 安装程åº" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "此程åºå°†å¼•å¯¼ä½ å®Œæˆ $(^NameDA) 的安装。$\r$\n$\r$\n在安装之å‰ï¼Œè¯·å…ˆå…³é—­å…¶ä»–所有应用程åºã€‚这将确ä¿å®‰è£…程åºèƒ½å¤Ÿæ›´æ–°æ‰€éœ€çš„系统文件,从而é¿å…在安装åŽé‡æ–°å¯åŠ¨è®¡ç®—æœºã€‚$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "欢迎使用 $(^NameDA) å¸è½½ç¨‹åº" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "此程åºå°†å¼•å¯¼ä½ å®Œæˆ $(^NameDA) çš„å¸è½½ã€‚$\r$\n$\r$\n在å¸è½½ä¹‹å‰ï¼Œè¯·ç¡®è®¤ $(^NameDA) å·²ç»å…³é—­ã€‚$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "许å¯è¯åè®®" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "在安装 $(^NameDA) 之å‰ï¼Œè¯·é˜…读许å¯è¯æ¡æ¬¾ã€‚" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "如果你接å—许å¯è¯çš„æ¡æ¬¾ï¼Œè¯·ç‚¹å‡» [æˆ‘åŒæ„(I)] ç»§ç»­å®‰è£…ã€‚ä½ å¿…é¡»åœ¨åŒæ„åŽæ‰èƒ½å®‰è£… $(^NameDA) 。" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果你接å—许å¯è¯çš„æ¡æ¬¾ï¼Œè¯·ç‚¹å‡»å‹¾é€‰ä¸‹æ–¹çš„é€‰æ¡†ã€‚ä½ å¿…é¡»åœ¨åŒæ„åŽæ‰èƒ½å®‰è£… $(^NameDA)。$_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果你接å—许å¯è¯çš„æ¡æ¬¾ï¼Œè¯·é€‰æ‹©ä¸‹æ–¹ç¬¬ä¸€ä¸ªé€‰é¡¹ã€‚ä½ å¿…é¡»åœ¨åŒæ„åŽæ‰èƒ½å®‰è£… $(^NameDA)。$_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "许å¯è¯åè®®" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "在å¸è½½ $(^NameDA) 之å‰ï¼Œè¯·é˜…读许å¯è¯æ¡æ¬¾ã€‚" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "如果你接å—许å¯è¯çš„æ¡æ¬¾ï¼Œè¯·ç‚¹å‡» [æˆ‘åŒæ„(I)] ç»§ç»­å¸è½½ã€‚如果你点击 [å–æ¶ˆ(C)] ,å¸è½½ç¨‹åºå°†ä¼šå…³é—­ã€‚ä½ å¿…é¡»åœ¨åŒæ„åŽæ‰èƒ½å¸è½½ $(^NameDA) 。" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果你接å—许å¯è¯çš„æ¡æ¬¾ï¼Œç‚¹å‡»å‹¾é€‰ä¸‹æ–¹çš„é€‰æ¡†ã€‚ä½ å¿…é¡»åœ¨åŒæ„åŽæ‰èƒ½å¸è½½ $(^NameDA)。$_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果你接å—许å¯è¯çš„æ¡æ¬¾ï¼Œè¯·é€‰æ‹©ä¸‹æ–¹ç¬¬ä¸€ä¸ªé€‰é¡¹ã€‚ä½ å¿…é¡»åœ¨åŒæ„åŽæ‰èƒ½å¸è½½ $(^NameDA)。$_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "è¦é˜…读å议的其余部分,请按 [PgDn] é”®å‘下翻页。" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "选择组件" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "选择你想安装的 $(^NameDA) 功能组件。" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "选择组件" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "选择你想å¸è½½çš„ $(^NameDA) 功能组件。" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "组件æè¿°" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "将光标悬åœåœ¨ç»„ä»¶å称之上,å³å¯æ˜¾ç¤ºå®ƒçš„功能æè¿°ã€‚" !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "点击选中组件,å³å¯æ˜¾ç¤ºå®ƒçš„功能æè¿°ã€‚" !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "选择安装ä½ç½®" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "选择 $(^NameDA) 的安装文件夹。" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "选择å¸è½½ä½ç½®" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "选择 $(^NameDA) çš„å¸è½½æ–‡ä»¶å¤¹ã€‚" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "正在安装" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) 正在安装,请ç¨å€™ã€‚" ${LangFileString} MUI_TEXT_FINISH_TITLE "安装完æˆ" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "å®‰è£…ç¨‹åºæˆåŠŸå®Œæˆå®‰è£…。" ${LangFileString} MUI_TEXT_ABORT_TITLE "安装中止" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "å®‰è£…ç¨‹åºæœªèƒ½å®Œæˆå®‰è£…。" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "正在å¸è½½" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) 正在å¸è½½ï¼Œè¯·ç¨å€™ã€‚" ${LangFileString} MUI_UNTEXT_FINISH_TITLE "å¸è½½å®Œæˆ" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "å¸è½½ç¨‹åºæˆåŠŸå®Œæˆå¸è½½ã€‚" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "å¸è½½ä¸­æ­¢" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "å¸è½½ç¨‹åºæœªèƒ½å®Œæˆå¸è½½ã€‚" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) 安装程åºç»“æŸ" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) å·²ç»æˆåŠŸå®‰è£…åˆ°æœ¬æœºã€‚$\r$\n点击 [完æˆ(F)] 关闭安装程åºã€‚" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "å¿…é¡»é‡æ–°å¯åŠ¨æœ¬æœºæ‰èƒ½å®Œæˆ $(^NameDA) 的安装。是å¦ç«‹å³é‡æ–°å¯åŠ¨ï¼Ÿ" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) å¸è½½ç¨‹åºç»“æŸ" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) å·²ç»æˆåŠŸä»Žæœ¬æœºå¸è½½ã€‚$\r$\n$\r$\n点击 [完æˆ] 关闭å¸è½½ç¨‹åºã€‚" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "å¿…é¡»é‡æ–°å¯åŠ¨æœ¬æœºæ‰èƒ½å®Œæˆ $(^NameDA) çš„å¸è½½ã€‚是å¦ç«‹å³é‡æ–°å¯åŠ¨ï¼Ÿ" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "是,立å³é‡æ–°å¯åЍ(&Y)" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "å¦ï¼Œæˆ‘会在之åŽé‡æ–°å¯åЍ(&N)" ${LangFileString} MUI_TEXT_FINISH_RUN "è¿è¡Œ $(^NameDA)(&R)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "显示自述文件(&M)" ${LangFileString} MUI_BUTTONTEXT_FINISH "完æˆ(&F)" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "选择开始èœå•文件夹" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "选择开始èœå•文件夹,用于创建程åºçš„å¿«æ·æ–¹å¼ã€‚" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "选择开始èœå•文件夹,用于创建程åºçš„å¿«æ·æ–¹å¼ã€‚你也å¯ä»¥è¾“入自定义å称,创建新文件夹。" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ä¸è¦åˆ›å»ºå¿«æ·æ–¹å¼(&N)" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "å¸è½½ $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "从本机å¸è½½ $(^NameDA) 。" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "确定è¦é€€å‡º $(^Name) 安装程åºå—?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "确定è¦é€€å‡º $(^Name) å¸è½½ç¨‹åºå—?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "选择用户" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "选择为哪些用户安装 $(^NameDA) 。" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "选择åªä¸ºè‡ªå·±å®‰è£… $(^NameDA) ,还是为本机的所有用户安装。 $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "为本机所有用户安装(&A)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "åªä¸ºæˆ‘自己安装(&M)" !endif nsis-3.11/Contrib/Language files/Slovak.nlf000077500000000000000000000145301477201124000205640ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1051 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - #Translated by: Kypec (peter.dzugas@mahe.sk); edited by: Marián Hikaník (podnety@mojepreklady.net), Ivan Masár , 2008. # ^Branding Nullsoft Install System %s # ^SetupCaption InÅ¡talácia programu $(^Name) # ^UninstallCaption OdinÅ¡talovanie programu $(^Name) # ^LicenseSubCaption : LicenÄná zmluva # ^ComponentsSubCaption : Možnosti inÅ¡talácie # ^DirSubCaption : InÅ¡talaÄný prieÄinok # ^InstallingSubCaption : Prebieha inÅ¡talácia # ^CompletedSubCaption : Hotovo # ^UnComponentsSubCaption : Možnosti odinÅ¡talovania # ^UnDirSubCaption : PrieÄinok s informáciami pre odinÅ¡talovanie # ^ConfirmSubCaption : Potvrdenie # ^UninstallingSubCaption : Prebieha odinÅ¡talácia # ^UnCompletedSubCaption : Hotovo # ^BackBtn < &Späť # ^NextBtn ÄŽ&alej > # ^AgreeBtn &Súhlasím # ^AcceptBtn &Súhlasím s podmienkami licenÄnej zmluvy # ^DontAcceptBtn N&esúhlasím s podmienkami licenÄnej zmluvy # ^InstallBtn &NainÅ¡talovaÅ¥ # ^UninstallBtn &OdinÅ¡talovaÅ¥ # ^CancelBtn ZruÅ¡iÅ¥ # ^CloseBtn &ZatvoriÅ¥ # ^BrowseBtn &PrehľadávaÅ¥... # ^ShowDetailsBtn &Podrobnosti # ^ClickNext V inÅ¡talácii pokraÄujte kliknutím na tlaÄidlo ÄŽalej. # ^ClickInstall Pre spustenie inÅ¡talácie kliknite na tlaÄidlo NainÅ¡talovaÅ¥. # ^ClickUninstall Pre spustenie procesu odinÅ¡talovania kliknite na tlaÄidlo OdinÅ¡talovaÅ¥. # ^Name Názov # ^Completed Hotovo # ^LicenseText Pred inÅ¡taláciou programu si prosím dôkladne preÄítajte licenÄnú zmluvu $(^NameDA). Ak súhlasíte so vÅ¡etkými jej podmienkami, kliknite na tlaÄidlo Súhlasím. # ^LicenseTextCB Pred inÅ¡taláciou programu si prosím dôkladne preÄítajte licenÄnú zmluvu $(^NameDA). Ak súhlasíte so vÅ¡etkými jej podmienkami, zaÅ¡krtnite nasledujúce políÄko. $_CLICK # ^LicenseTextRB Pred inÅ¡taláciou programu si prosím dôkladne preÄítajte licenÄnú zmluvu $(^NameDA). Ak súhlasíte so vÅ¡etkými jej podmienkami, oznaÄte prvú z nasledujúcich možností. $_CLICK # ^UnLicenseText Pred odinÅ¡talovaním programu si prosím dôkladne preÄítajte licenÄnú zmluvu $(^NameDA). Ak súhlasíte so vÅ¡etkými jej podmienkami, kliknite na tlaÄidlo Súhlasím. # ^UnLicenseTextCB Pred odinÅ¡talovaním programu si prosím dôkladne preÄítajte licenÄnú zmluvu $(^NameDA). Ak súhlasíte so vÅ¡etkými jej podmienkami, zaÅ¡krtnite nasledujúce políÄko. $_CLICK # ^UnLicenseTextRB Pred odinÅ¡talovaním programu si prosím dôkladne preÄítajte licenÄnú zmluvu $(^NameDA). Ak súhlasíte so vÅ¡etkými jej podmienkami, oznaÄte prvú z nasledujúcich možností. $_CLICK # ^Custom Voliteľná # ^ComponentsText OznaÄte súÄasti programu, ktoré chcete nainÅ¡talovaÅ¥ a odznaÄte tie, ktoré nainÅ¡talovaÅ¥ nechcete. $_CLICK # ^ComponentsSubText1 Vyberte si typ inÅ¡talácie: # ^ComponentsSubText2_NoInstTypes Vyberte si tie súÄasti programu, ktoré chcete nainÅ¡talovaÅ¥: # ^ComponentsSubText2 Alebo oznaÄte voliteľné doplnky, ktoré chcete nainÅ¡talovaÅ¥: # ^UnComponentsText OznaÄte súÄasti programu, ktoré chcete odinÅ¡talovaÅ¥ a odznaÄte tie, ktoré chcete ponechaÅ¥ nainÅ¡talované. $_CLICK # ^UnComponentsSubText1 Zvoľte typ deinÅ¡talácie: # ^UnComponentsSubText2_NoInstTypes Vyberte súÄasti, ktoré chcete odinÅ¡talovaÅ¥: # ^UnComponentsSubText2 Alebo oznaÄte voliteľné súÄasti, ktoré chcete odinÅ¡talovaÅ¥: # ^DirText $(^NameDA) bude nainÅ¡talovaný do nasledujúceho prieÄinka. InÅ¡talovaÅ¥ do iného prieÄinka môžete po kliknutí na tlaÄidlo PrehľadávaÅ¥ a vybraní iného prieÄinka. $_CLICK # ^DirSubText Cieľový prieÄinok # ^DirBrowseText Zvoľte prieÄinok, do ktorého sa nainÅ¡taluje program $(^NameDA): # ^UnDirText InÅ¡talátor odinÅ¡taluje program $(^NameDA) z nasledovného prieÄinka. Ak ho chcete odinÅ¡talovaÅ¥ z iného prieÄinka, kliknite na tlaÄidlo PrehľadávaÅ¥ a vyberte iný prieÄinok. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Zvoľte prieÄinok, z ktorého sa odinÅ¡taluje program $(^NameDA): # ^SpaceAvailable "Voľné miesto na disku: " # ^SpaceRequired "Potrebné miesto na disku: " # ^UninstallingText Program $(^NameDA) sa odinÅ¡taluje z nasledovného prieÄinka. $_CLICK # ^UninstallingSubText Prebieha odinÅ¡talovanie z: # ^FileError Chyba pri otváraní súboru na zápis: \r\n\r\n$0\r\n\r\n. Ak chcete inÅ¡taláciu ukonÄiÅ¥, kliknite na tlaÄidlo UkonÄiÅ¥,\r\ ak chcete zápis súboru zopakovaÅ¥, kliknite na tlaÄidlo OpakovaÅ¥ alebo kliknite na tlaÄidlo \r\nIgnorovaÅ¥, ak chcete inÅ¡taláciu tohto súboru vynechaÅ¥. # ^FileError_NoIgnore Chyba pri otváraní súboru na zápis: \r\n\r\n$0\r\n\r\n. Ak chcete zopakovaÅ¥ zápis súboru, kliknite na tlaÄidlo OpakovaÅ¥, alebo kliknite na tlaÄidlo \r\nZruÅ¡iÅ¥, v prípade, že chcete inÅ¡taláciu ukonÄiÅ¥. # ^CantWrite "Nemožno zapísaÅ¥ súbor: " # ^CopyFailed Kopírovanie zlyhalo. # ^CopyTo "KopírovaÅ¥ do " # ^Registering "Registruje sa: " # ^Unregistering "Vymazáva sa z registra: " # ^SymbolNotFound "Nemožno nájsÅ¥ symbol: " # ^CouldNotLoad "Nemožno naÄítaÅ¥: " # ^CreateFolder "Vytvorený prieÄinok: " # ^CreateShortcut "Vytvorený odkaz: " # ^CreatedUninstaller "Program pre odinÅ¡talovanie: " # ^Delete "Vymazaný súbor: " # ^DeleteOnReboot "VymazaÅ¥ po reÅ¡tartovaní systému: " # ^ErrorCreatingShortcut "Chyba pri vytváraní odkazu: " # ^ErrorCreating "Chyba pri vytváraní: " # ^ErrorDecompressing Chyba pri dekomprimovaní dát! InÅ¡talátor je pravdepodobne poÅ¡kodený... # ^ErrorRegistering Chyba pri registrácii súÄasti # ^ExecShell "VykonaÅ¥ príkaz: " # ^Exec "SpustiÅ¥: " # ^Extract "Extrahuje sa: " # ^ErrorWriting "Chyba pri zápise do súboru " # ^InvalidOpcode InÅ¡talátor je pravdepodobne poÅ¡kodený, pretože obsahuje neplatný operaÄný kód. # ^NoOLE "Žiadny zápis OLE pre: " # ^OutputFolder "Výstupný prieÄinok: " # ^RemoveFolder "OdstrániÅ¥ prieÄinok: " # ^RenameOnReboot "PremenovaÅ¥ po reÅ¡tartovaní systému: " # ^Rename "PremenovaÅ¥: " # ^Skipped "Vynechané: " # ^CopyDetails SkopírovaÅ¥ podrobnosti do schránky # ^LogInstall ZaznamenaÅ¥ priebeh inÅ¡talácie # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Slovak.nsh000077500000000000000000000213121477201124000205710ustar00rootroot00000000000000;Language: Slovak (1051) ;Translated by: ; Kypec (peter.dzugas@mahe.sk) ;edited by: ; Marián Hikaník (podnety@mojepreklady.net) ; Ivan Masár , 2008. !insertmacro LANGFILE "Slovak" = "SlovenÄina" "Slovencina" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Vitajte v sprievodcovi inÅ¡taláciou programu $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tento sprievodca vás prevedie inÅ¡taláciou $(^NameDA).$\r$\n$\r$\nPred zaÄiatkom inÅ¡talácie sa odporúÄa ukonÄiÅ¥ vÅ¡etky ostatné programy. Tým umožníte aktualizovanie systémových súborov bez potreby reÅ¡tartovania vášho poÄítaÄa.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Vitajte v sprievodcovi odinÅ¡talovaním programu $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tento sprievodca vás prevedie procesom odinÅ¡talovania programu $(^NameDA).$\r$\n$\r$\nPred spustením procesu odinÅ¡talovania sa uistite, že program $(^NameDA) nie je práve aktívny.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "LicenÄná zmluva" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pred inÅ¡taláciou $(^NameDA) si prosím preÅ¡tudujte licenÄné podmienky." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ak súhlasíte s podmienkami zmluvy, kliknite na tlaÄidlo Súhlasím a môžete pokraÄovaÅ¥ v inÅ¡talácii. Ak chcete v inÅ¡talácii pokraÄovaÅ¥, musíte odsúhlasiÅ¥ podmienky licenÄnej zmluvy $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ak súhlasíte s podmienkami zmluvy, zaÅ¡krtnite nižšie uvedené políÄko. Ak chcete v inÅ¡talácii pokraÄovaÅ¥, musíte odsúhlasiÅ¥ podmienky licenÄnej zmluvy $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ak súhlasíte s podmienkami zmluvy, oznaÄte prvú z nižšie uvedených možností. Ak chcete v inÅ¡talácii pokraÄovaÅ¥, musíte odsúhlasiÅ¥ podmienky licenÄnej zmluvy $(^NameDA)." !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "LicenÄná zmluva" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pred odinÅ¡talovaním programu $(^NameDA) si prosím preÄítajte licenÄné podmienky." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ak súhlasíte s podmienkami zmluvy, zvoľte Súhlasím. LicenÄnú zmluvu musíte odsúhlasiÅ¥, ak chcete v odinÅ¡talovaní programu $(^NameDA) pokraÄovaÅ¥." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ak súhlasíte s podmienkami zmluvy, zaÅ¡krtnite nižšie uvedené políÄko. LicenÄnú zmluvu musíte odsúhlasiÅ¥, ak chcete pokraÄovaÅ¥ v odinÅ¡talovaní programu $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ak súhlasíte s podmienkami licenÄnej zmluvy, oznaÄte prvú z nižšie uvedených možností. LicenÄnú zmluvu musíte odsúhlasiÅ¥, ak chcete pokraÄovaÅ¥ v odinÅ¡talovaní programu $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "StlaÄením klávesu Page Down posuniete text licenÄnej zmluvy." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Voľba súÄastí programu" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zvoľte si tie súÄasti programu $(^NameDA), ktoré chcete nainÅ¡talovaÅ¥." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Voľba súÄastí" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zvoľte súÄasti programu $(^NameDA), ktoré chcete odinÅ¡talovaÅ¥." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Popis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pri prejdení kurzorom myÅ¡i nad názvom súÄasti sa zobrazí jej popis." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "OznaÄte nejakú súÄasÅ¥, ak chcete zobraziÅ¥ jej podrobnejší popis." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Voľba umiestnenia programu" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vyberte si prieÄinok, do ktorého chcete nainÅ¡talovaÅ¥ program $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Umiestenie programu pre odinÅ¡talovanie" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vyberte si prieÄinok, z ktorého chcete odinÅ¡talovaÅ¥ program $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "InÅ¡talácia" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "PoÄkajte prosím, kým prebehne inÅ¡talácia programu $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "UkonÄenie inÅ¡talácie" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "InÅ¡talácia bola dokonÄená úspeÅ¡ne." ${LangFileString} MUI_TEXT_ABORT_TITLE "PreruÅ¡enie inÅ¡talácie" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "InÅ¡taláciu sa nepodarilo dokonÄiÅ¥." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "OdinÅ¡talovanie" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "ÄŒakajte prosím, kým prebehne odinÅ¡talovanie programu $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "UkonÄenie odinÅ¡talovania" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "OdinÅ¡talovanie bolo úspeÅ¡ne dokonÄené." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "PreruÅ¡enie odinÅ¡talovania" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "OdinÅ¡talovanie sa neukonÄilo úspeÅ¡ne." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "DokonÄenie inÅ¡talácie programu $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) bol nainÅ¡talovaný do vášho poÄítaÄa.$\r$\nKliknite na tlaÄidlo DokonÄiÅ¥ a tento sprievodca sa ukonÄí." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Pre úplné dokonÄenie inÅ¡talácie programu $(^NameDA) je potrebné reÅ¡tartovaÅ¥ váš poÄítaÄ. Chcete ho reÅ¡tartovaÅ¥ ihneÄ?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "DokonÄenie sprievodcu odinÅ¡talovaním" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) bol odinÅ¡talovaný z vášho poÄítaÄa.$\r$\n$\r$\nKliknite na tlaÄidlo DokonÄiÅ¥ a tento sprievodca sa ukonÄí." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Pre úplné dokonÄenie odinÅ¡talovania programu $(^NameDA) je nutné reÅ¡tartovaÅ¥ váš poÄítaÄ. Chcete ho reÅ¡tartovaÅ¥ ihneÄ?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ReÅ¡tartovaÅ¥ teraz" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ReÅ¡tartovaÅ¥ neskôr (manuálne)" ${LangFileString} MUI_TEXT_FINISH_RUN "&SpustiÅ¥ program $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&ZobraziÅ¥ súbor s informáciami" ${LangFileString} MUI_BUTTONTEXT_FINISH "&DokonÄiÅ¥" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Voľba umiestnenia v ponuke Å tart" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vyberte si prieÄinok v ponuke Å tart, kam sa umiestnia odkazy na program $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vyberte si prieÄinok v ponuke Å tart, v ktorom chcete vytvoriÅ¥ odkazy na program. Takisto môžete napísaÅ¥ názov nového prieÄinka." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "NevytváraÅ¥ odkazy" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "OdinÅ¡talovanie programu $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odstránenie programu $(^NameDA) z vášho poÄítaÄa." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Naozaj chcete ukonÄiÅ¥ inÅ¡taláciu programu $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Naozaj chcete ukonÄiÅ¥ proces odinÅ¡talovania programu $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "VybraÅ¥ používateľov" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vyberte pre ktorých používateľov chcete nainÅ¡talovaÅ¥ $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vyberte, Äi chcete nainÅ¡talovaÅ¥ program $(^NameDA) iba pre seba alebo pre vÅ¡etkých používateľov tohto poÄítaÄa. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "NainÅ¡talovaÅ¥ pre vÅ¡etkých používateľov tohto poÄítaÄa" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "NainÅ¡talovaÅ¥ iba pre mňa" !endifnsis-3.11/Contrib/Language files/Slovenian.nlf000077500000000000000000000120631477201124000212620ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1060 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1250 # RTL - anything else than RTL means LTR - # Translation by Janez Dolinar, edited by Martin Srebotnjak - Lugos.si # ^Branding Nullsoft Install System %s # ^SetupCaption Namestitev $(^Name) # ^UninstallCaption Odstranitev $(^Name) # ^LicenseSubCaption : LicenÄna pogodba # ^ComponentsSubCaption : Možnosti namestitve # ^DirSubCaption : Mapa namestitve # ^InstallingSubCaption : NameÅ¡Äanje poteka # ^CompletedSubCaption : DokonÄano # ^UnComponentsSubCaption : Možnosti odstranitve # ^UnDirSubCaption : Mapa odstranitve # ^ConfirmSubCaption : Potrditev # ^UninstallingSubCaption : Odstranjevanje poteka # ^UnCompletedSubCaption : DokonÄano # ^BackBtn < &Nazaj # ^NextBtn N&aprej > # ^AgreeBtn Se &strinjam # ^AcceptBtn &Sprejmem pogoje licenÄne pogodbe # ^DontAcceptBtn &Ne sprejmem pogojev licenÄne pogodbe # ^InstallBtn &Namesti # ^UninstallBtn &Odstrani # ^CancelBtn PrekliÄi # ^CloseBtn &Zapri # ^BrowseBtn Prebrsk&aj ... # ^ShowDetailsBtn &Podrobnosti # ^ClickNext Kliknite Naprej za nadaljevanje. # ^ClickInstall Kliknite Namesti za zaÄetek namestitve. # ^ClickUninstall Kliknite Odstrani za odstranitev. # ^NameIme Ime # ^Completed DokonÄano # ^LicenseText Prosimo, da pred namestitvijo $(^NameDA) pregledate licenÄno pogodbo. ÄŒe se z njo strinjate, pritisnite Se strinjam. # ^LicenseTextCB Prosimo, da pred namestitvijo $(^NameDA) pregledate licenÄno pogodbo. ÄŒe sprejmete vse naÅ¡tete pogoje, potrdite spodnje polje. $_CLICK # ^LicenseTextRB Prosimo, da pred namestitvijo $(^NameDA) pregledate licenÄno pogodbo. ÄŒe sprejmete vse naÅ¡tete pogoje, izberite prvo spodaj podano možnost. $_CLICK # ^UnLicenseText Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenÄno pogodbo. ÄŒe se z njo strinjate, pritisnite Se strinjam. # ^UnLicenseTextCB Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenÄno pogodbo. ÄŒe sprejmete vse naÅ¡tete pogoje, potrdite spodnje polje. $_CLICK # ^UnLicenseTextRB Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenÄno pogodbo. ÄŒe sprejmete vse naÅ¡tete pogoje, izberite prvo spodaj podano možnost. $_CLICK # ^Custom Po meri ... # ^ComponentsText OznaÄite komponente, ki jih želite namestiti, in pustite neoznaÄene tiste, katerih ne želite namestiti. $_CLICK # ^ComponentsSubText1 Izberite vrsto namestitve: # ^ComponentsSubText2_NoInstTypes Izberite komponente namestitve: # ^ComponentsSubText2 Ali pa izberite komponente, ki jih želite namestiti: # ^UnComponentsText OznaÄite komponente, ki jih želite odstraniti, in pustite neoznaÄene tiste, ki jih ne želite odstraniti. $_CLICK # ^UnComponentsSubText1 Izberite vrsto odstranitve: # ^UnComponentsSubText2_NoInstTypes Izberite komponente za odstranitev: # ^UnComponentsSubText2 Ali pa izberite komponente namestitve, ki jih želite odstraniti: # ^DirText $(^NameDA) boste namestili v sledeÄo mapo. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK # ^DirSubText Ciljna mapa # ^DirBrowseText Izberite mapo, kamor želite namestiti $(^NameDA): # ^UnDirText Odstranili boste $(^NameDA) iz sledeÄe mape. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Izberite mapo, od koder želite odstraniti $(^NameDA): # ^SpaceAvailable "Prostor na disku: " # ^SpaceRequired "Potreben prostor: " # ^UninstallingText $(^NameDA) bo odstranjen iz naslednje mape. $_CLICK # ^UninstallingSubText Odstranjevanje iz: # ^FileError Napaka pri odpiranju datoteke za pisanje: \r\n\r\n$0\r\n\r\nPritisnite Prekini za prekinitev namestitve,\r\nPonovi za ponoven poskus ali\r\nPrezri za izpust te datoteke. # ^FileError_NoIgnore Napaka pri odpiranju datoteke za pisanje: \r\n\r\n$0\r\n\r\nPritisnite Ponovi za ponoven poskus pisanja ali\r\PrekliÄi za prekinitev namestitve. # ^CantWrite "Ni mogoÄe pisati: " # ^CopyFailed Kopiranje neuspeÅ¡no # ^CopyTo "Kopiranje v " # ^Registering "Registracija: " # ^Unregistering "Preklic registracije: " # ^SymbolNotFound "Ni mogoÄe najti simbola: " # ^CouldNotLoad "Ni mogoÄe naložiti: " # ^CreateFolder "Ustvarjanje mape: " # ^CreateShortcut "Ustvarjanje bližnjice: " # ^CreatedUninstaller "Ustvarjena odstranitev: " # ^Delete "Brisanje datoteke: " # ^DeleteOnReboot "Brisanje ob ponovnem zagonu: " # ^ErrorCreatingShortcut "Napaka ustvarjanja bližnjice: " # ^ErrorCreating "Napaka ustvarjanja: " # ^ErrorDecompressing Napaka pri razÅ¡irjanju podatkov! Je namestitvena datoteka okvarjena? # ^ErrorRegistering Napaka registracije DLL # ^ExecShell "Izvajanje v lupini: " # ^Exec "Izvajanje: " # ^Extract "RazÅ¡irjanje: " # ^ErrorWriting "RazÅ¡irjanje: napaka pri pisanju v datoteko " # ^InvalidOpcode Namestitev neveljavna: napaÄen ukaz # ^NoOLE "NeobstojeÄi OLE za: " # ^OutputFolder "Ciljna mapa: " # ^RemoveFolder "Odstranjevanje mape: " # ^RenameOnReboot "Preimenovanje ob zagonu: " # ^Rename "Preimenovanje: " # ^Skipped "IzpuÅ¡Äeno: " # ^CopyDetails Kopiraj podrobnosti v odložiÅ¡Äe # ^LogInstall Shrani potek namestitve # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Slovenian.nsh000077500000000000000000000176331477201124000213030ustar00rootroot00000000000000;Language: Slovenian (1060) ;By Janez Dolinar, edited by Martin Srebotnjak - Lugos.si # We use "slovenski", the other alternative is "slovenÅ¡Äina" (Note: "slovenÄina" is the native name of Slovak) !insertmacro LANGFILE "Slovenian" = "Slovenski" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li v Äarovniku namestitve $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ta Äarovnik vas vodi skozi namestitev programa $(^NameDA).$\r$\n$\r$\nPred namestitvijo je priporoÄeno zapreti vsa ostala okna in programe. S tem omogoÄite nemoteno namestitev programa in potrebnih sistemskih datotek brez ponovnega zagona raÄunalnika.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "DobrodoÅ¡li v Äarovniku za odstranitev $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ta Äarovnik vas bo vodil skozi odstranitev $(^NameDA).$\r$\n$\r$\nPreden priÄnete z odstranitvijo, se prepriÄajte, da program $(^NameDA) ni zagnan.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "LicenÄna pogodba" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Prosimo, da si ogledate pogoje licenÄne pogodbe pred namestitvijo $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ÄŒe se strinjate s pogoji, pritisnite Se strinjam. Da bi lahko namestili $(^NameDA), se morate s pogodbo strinjati." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÄŒe se strinjate z licenÄnimi pogoji pogodbe, spodaj izberite ustrezno okence. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÄŒe se strinjate z licenÄnimi pogoji pogodbe, spodaj izberite prvo možnost. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "LicenÄna pogodba" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Prosimo, da pred odstranitvijo $(^NameDA) pregledate pogoje licenÄne pogodbe." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ÄŒe se strinjate s pogoji licenÄne pogodbe, izberite Se strinjam. Za odstranitev $(^NameDA) se morate strinjati s pogoji." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÄŒe se strinjate s pogoji licenÄne pogodbe, kliknite na okence spodaj. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÄŒe se strinjate s pogoji licenÄne pogodbe, spodaj izberite prvo podano možnost. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Za preostali del pogodbe pritisnite tipko 'Page Down'." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponent" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izberite, katere komponente izdelka $(^NameDA) želite namestiti." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponent" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izberite komponente $(^NameDA), ki jih želite odstraniti." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Povlecite miÅ¡ko nad komponento, da vidite njen opis." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Izberite komponento za prikaz njenega opisa." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izberite pot namestive" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izberite mapo, v katero želite namestiti $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izbor mape" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izberite mapo, iz katere želite odstraniti $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "NameÅ¡Äanje poteka" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Prosimo, poÄakajte, $(^NameDA) se nameÅ¡Äa." ${LangFileString} MUI_TEXT_FINISH_TITLE "DokonÄana namestitev" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Namestitev je uspeÅ¡no zakljuÄena." ${LangFileString} MUI_TEXT_ABORT_TITLE "Prekinjena namestitev" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Namestitev ni bila uspeÅ¡no zakljuÄena." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odstranjevanje poteka" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Prosimo, poÄakajte, dokler se program $(^NameDA) odstranjuje." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Odstranitev konÄana" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odstranitev je uspeÅ¡no konÄana." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Odstranitev prekinjena" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odstranitev ni bila konÄana uspeÅ¡no." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ZakljuÄevanje namestitve $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je bil nameÅ¡Äen na vaÅ¡ raÄunalnik.$\r$\n$\r$\nPritisnite DokonÄaj za zaprtje Äarovnika." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Za dokonÄanje namestitve $(^NameDA) morate ponovno zagnati raÄunalnik. Želite zdaj ponovno zagnati raÄunalnik?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ÄŒarovnik za odstranitev $(^NameDA) se zakljuÄuje" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je odstranjen z vaÅ¡ega raÄunalnika.$\r$\n$\r$\nKliknite DokonÄaj, da zaprete Äarovnika." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Da bi se namestitev $(^NameDA) dokonÄala, morate ponovno zagnati raÄunalnik. Želite zdaj znova zagnati raÄunalnik?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ponovni zagon" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "RaÄunalnik želim znova zagnati kasneje" ${LangFileString} MUI_TEXT_FINISH_RUN "&Zaženi $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Pokaži BeriMe" ${LangFileString} MUI_BUTTONTEXT_FINISH "Do&konÄaj" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izberite mapo menija Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izberite mapo menija Start za bližnjice do $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izberite mapo menija Start, kjer želite ustvariti bližnjico do programa. ÄŒe vpiÅ¡ete novo ime, boste ustvarili istoimensko mapo." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne ustvari bližnjic" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odstranitev $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odstrani $(^NameDA) z vaÅ¡ega raÄunalnika." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ste prepriÄani, da želite prekiniti namestitev $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ste prepriÄani, da želite zapustiti odstranitev $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Izberite uporabnike" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Izberite uporabnike, za katere želite namestiti $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Izberite, ali želite namestiti $(^NameDA) le zase ali za vse uporabnike tega raÄunalnika. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Namesti za vse uporabnike tega raÄunalnika" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Namesti le zame" !endif nsis-3.11/Contrib/Language files/Spanish.nlf000077500000000000000000000126621477201124000207360ustar00rootroot00000000000000# Header, don't edit ;Español - España (Alfabetización Tradicional) NLF v6 # Language ID 1034 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by MoNKi & Joel # Review and minor corrections Darwin Rodrigo Toledo Cáceres (niwrad777@gmail.com) www.winamp-es.com # ^Branding Nullsoft Install System %s # ^SetupCaption Instalación de $(^Name) # ^UninstallCaption Desinstalación de $(^Name) # ^LicenseSubCaption : Acuerdo de Licencia # ^ComponentsSubCaption : Opciones de Instalación # ^DirSubCaption : Directorio de Instalación # ^InstallingSubCaption : Instalando # ^CompletedSubCaption : Completado # ^UnComponentsSubCaption : Opciones de Desinstalación # ^UnDirSubCaption : Directorio de Desinstalación # ^ConfirmSubCaption : Confirmación # ^UninstallingSubCaption : Desinstalando # ^UnCompletedSubCaption : Completado # ^BackBtn < &Atrás # ^NextBtn &Siguiente > # ^AgreeBtn A&cepto # ^AcceptBtn A&cepto los términos de la licencia # ^DontAcceptBtn &No acepto los términos de la licencia # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Cancelar # ^CloseBtn &Cerrar # ^BrowseBtn &Examinar... # ^ShowDetailsBtn Ver &detalles # ^ClickNext Presione Siguiente para continuar. # ^ClickInstall Presione Instalar para comenzar la instalación. # ^ClickUninstall Presione Desinstalar para comenzar la desinstalación. # ^Name Nombre # ^Completed Completado # ^LicenseText Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, presione Acepto. # ^LicenseTextCB Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, marque abajo la casilla. $_CLICK # ^LicenseTextRB Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, seleccione abajo la primera opción. $_CLICK # ^UnLicenseText Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, presione Acepto. # ^UnLicenseTextCB Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, marque abajo la casilla. $_CLICK. # ^UnLicenseTextRB Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, seleccione abajo la primera opción. $_CLICK # ^Custom Personalizada # ^ComponentsText Marque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK # ^ComponentsSubText1 Tipos de instalación: # ^ComponentsSubText2_NoInstTypes Seleccione los componentes a instalar: # ^ComponentsSubText2 O seleccione los componentes opcionales que desee instalar: # ^UnComponentsText Marque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK # ^UnComponentsSubText1 Tipos de desinstalación: # ^UnComponentsSubText2_NoInstTypes Seleccione los componentes a desinstalar: # ^UnComponentsSubText2 O seleccione los componentes opcionales que desee desinstalar: # ^DirText El programa de instalación instalará $(^NameDA) en el siguiente directorio. Para instalar en un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK # ^DirSubText Directorio de Destino # ^DirBrowseText Seleccione el directorio en el que instalará $(^NameDA): # ^UnDirText El programa de instalación desinstalará $(^NameDA) del siguiente directorio. Para desinstalar de un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Seleccione el directorio desde el cual desinstalará $(^NameDA): # ^SpaceAvailable Espacio disponible: # ^SpaceRequired Espacio requerido: # ^UninstallingText $(^NameDA) será desinstalado del siguiente directorio. $_CLICK # ^UninstallingSubText Desinstalando desde: # ^FileError Error abriendo archivo para escritura: \r\n\t"$0"\r\nPresione abortar para anular la instalación,\r\nreintentar para volver a intentar escribir el archivo, u\r\nomitir para ignorar este archivo # ^FileError_NoIgnore Error abriendo archivo para escritura: \r\n\t"$0"\r\nPresione reintentar para volver a intentar escribir el archivo, o\r\ncancelar para anular la instalación # ^CantWrite "No pudo escribirse: " # ^CopyFailed Falló la copia # ^CopyTo "Copiar a " # ^Registering "Registrando: " # ^Unregistering "Eliminando registro: " # ^SymbolNotFound "No pudo encontrarse símbolo: " # ^CouldNotLoad "No pudo cargarse: " # ^CreateFolder "Creando directorio: " # ^CreateShortcut "Creando acceso directo: " # ^CreatedUninstaller "Creando desinstalador: " # ^Delete "Borrar archivo: " # ^DeleteOnReboot "Borrar al reinicio: " # ^ErrorCreatingShortcut "Error creando acceso directo: " # ^ErrorCreating "Error creando: " # ^ErrorDecompressing ¡Error descomprimiendo datos! ¿Instalador corrupto? # ^ErrorRegistering Error registrando DLL # ^ExecShell "Extrayendo comando: " # ^Exec "Extrayendo : " # ^Extract "Extraer: " # ^ErrorWriting "Extraer: error escribiendo al archivo " # ^InvalidOpcode Instalador corrupto: código de operación no válido # ^NoOLE "Sin OLE para: " # ^OutputFolder "Directorio de salida: " # ^RemoveFolder "Eliminar directorio: " # ^RenameOnReboot "Renombrar al reinicio: " # ^Rename "Renombrar: " # ^Skipped "Omitido: " # ^CopyDetails Copiar Detalles al Portapapeles # ^LogInstall Registrar proceso de instalación # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Spanish.nsh000077500000000000000000000200251477201124000207370ustar00rootroot00000000000000;Language: Spanish (1034) ;By MoNKi & Joel ;Updates & Review Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - niwrad777@gmail.com !insertmacro LANGFILE "Spanish" = "Español" "Espanol" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Instalación de $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este programa instalará $(^NameDA) en su ordenador.$\r$\n$\r$\nSe recomienda que cierre todas las demás aplicaciones antes de iniciar la instalación. Esto hará posible actualizar archivos relacionados con el sistema sin tener que reiniciar su ordenador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Desinstalación de $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente le guiará durante la desinstalación de $(^NameDA).$\r$\n$\r$\nAntes de comenzar la desinstalación, asegúrese de que $(^NameDA) no se está ejecutando.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acuerdo de licencia" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revise los términos de la licencia antes de instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si acepta todos los términos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para instalar $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para instalar $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acuerdo de licencia" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revise los términos de la licencia antes de desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si acepta todos los términos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Presione Avanzar Página para ver el resto del acuerdo." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selección de componentes" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea instalar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selección de componentes" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un componente para ver su descripción." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elegir lugar de instalación" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elija el directorio para instalar $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elegir lugar de desinstalación" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elija el directorio desde el cual se desinstalará $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se instala." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Completada" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación se ha completado correctamente." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Anulada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación no se completó correctamente." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se desinstala." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Completada" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación se ha completado correctamente." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Anulada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación no se completó correctamente." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando el Asistente de Instalación de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido instalado en su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Su sistema debe ser reiniciado para que pueda completarse la instalación de $(^NameDA). ¿Desea reiniciar ahora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando el Asistente de Desinstalación de $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido desinstalado de su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Su ordenador debe ser reiniciado para completar la desinstalación de $(^NameDA). ¿Desea reiniciar ahora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ahora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reiniciar manualmente más tarde" ${LangFileString} MUI_TEXT_FINISH_RUN "&Ejecutar $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ver Léame" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elegir Carpeta del Menú Inicio" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elija una Carpeta del Menú Inicio para los accesos directos de $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menú Inicio en la que quiera crear los accesos directos del programa. También puede introducir un nombre para crear una nueva carpeta." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear accesos directos" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de su sistema." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "¿Está seguro de que desea salir de la instalación de $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Está seguro de que desea salir de la desinstalación de $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elegir Usuarios" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elija los usuarios para los cuales Ud. desea instalar $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleccione si desea instalar $(^NameDA) sólo para Ud. o para todos los usuarios de este Ordenador.$(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instación para cualquier usuario de este ordenador" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación solo para mí" !endif nsis-3.11/Contrib/Language files/SpanishInternational.nlf000077500000000000000000000126621477201124000234660ustar00rootroot00000000000000# Header, don't edit ;Español (Alfabetización Internacional) NLF v6 # Language ID 3082 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - nwrad777@gmail.com # Base traslation by MoNKi & Joel # ^Branding Nullsoft Install System %s # ^SetupCaption Instalación de $(^Name) # ^UninstallCaption Desinstalación de $(^Name) # ^LicenseSubCaption : Acuerdo de Licencia # ^ComponentsSubCaption : Opciones de Instalación # ^DirSubCaption : Carpeta de Instalación # ^InstallingSubCaption : Instalando # ^CompletedSubCaption : Finalizado # ^UnComponentsSubCaption : Opciones de Desinstalación # ^UnDirSubCaption : Carpeta de Desinstalación # ^ConfirmSubCaption : Confirmación # ^UninstallingSubCaption : Desinstalando # ^UnCompletedSubCaption : Finalizado # ^BackBtn < &Atrás # ^NextBtn &Siguiente > # ^AgreeBtn &Acepto # ^AcceptBtn &Acepto las condiciones del Acuerdo de Licencia # ^DontAcceptBtn No &acepto las condiciones del Acuerdo de Licencia # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Cancelar # ^CloseBtn &Cerrar # ^BrowseBtn &Examinar... # ^ShowDetailsBtn Mostrar &detalles # ^ClickNext Presione Siguiente para continuar. # ^ClickInstall Presione Instalar para iniciar la instalación. # ^ClickUninstall Presione Desinstalar para iniciar la desinstalación. # ^Name Nombre # ^Completed Finalizado # ^LicenseText Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto. # ^LicenseTextCB Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK # ^LicenseTextRB Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opción. $_CLICK # ^UnLicenseText Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto. # ^UnLicenseTextCB Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK # ^UnLicenseTextRB Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opción. $_CLICK # ^Custom Personalizada # ^ComponentsText Marque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK # ^ComponentsSubText1 Seleccione el tipo de instalación: # ^ComponentsSubText2_NoInstTypes Seleccione los componentes a instalar: # ^ComponentsSubText2 O seleccione los componentes opcionales que desee instalar: # ^UnComponentsText Marque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK # ^UnComponentsSubText1 Seleccione el tipo de desinstalación: # ^UnComponentsSubText2_NoInstTypes Seleccione los componentes a desinstalar: # ^UnComponentsSubText2 O seleccione los componentes opcionales que desee desinstalar: # ^DirText El programa de instalación instalará $(^NameDA) en la siguiente carpeta. Para instalar en una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK # ^DirSubText Carpeta de Destino # ^DirBrowseText Seleccione la carpeta en la que instalará $(^NameDA): # ^UnDirText El programa de instalación desinstalará $(^NameDA) de la siguiente carpeta. Para desinstalar de una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Seleccione la carpeta desde la que desinstalará $(^NameDA): # ^SpaceAvailable Espacio disponible: # ^SpaceRequired Espacio requerido: # ^UninstallingText $(^NameDA) será desinstalado de la siguiente carpeta. $_CLICK # ^UninstallingSubText Desinstalando desde: # ^FileError Error abriendo archivo para escribir: \r\n\r\n$0\r\n\r\nPresione Abortar para detener la instalación,\r\nReintentar para probar otra vez, o\r\nOmitir para ignorar este archivo. # ^FileError_NoIgnore Error abriendo archivo para escribir: \r\n\r\n$0\r\n\r\nPresione Reintentar para probar otra vez, o\r\nCancelar para detener la instalación. # ^CantWrite "No pudo escribirse: " # ^CopyFailed Copia fallida # ^CopyTo "Copiar a " # ^Registering "Registrando: " # ^Unregistering "Eliminando registro: " # ^SymbolNotFound "No se encontró simbolo: " # ^CouldNotLoad "No pudo cargarse: " # ^CreateFolder "Creando carpeta: " # ^CreateShortcut "Creando acceso directo: " # ^CreatedUninstaller "Creando desinstalador: " # ^Delete "Borrar archivo: " # ^DeleteOnReboot "Borrar al reinicio: " # ^ErrorCreatingShortcut "Error creando acceso directo: " # ^ErrorCreating "Error creando: " # ^ErrorDecompressing ¡Error descomprimiendo datos! ¿Instalador corrupto? # ^ErrorRegistering Error registrando DLL # ^ExecShell "Ejecutando comando: " # ^Exec "Ejecutando: " # ^Extract "Extrayendo: " # ^ErrorWriting "Extrayendo: error escribiendo al archivo " # ^InvalidOpcode Instalador corrupto: código de operación no válido # ^NoOLE "Sin OLE para: " # ^OutputFolder "Carpeta de salida: " # ^RemoveFolder "Eliminar carpeta: " # ^RenameOnReboot "Renombrar al reinicio: " # ^Rename "Renombrar: " # ^Skipped "Omitido: " # ^CopyDetails Copiar Detalles al Portapapeles # ^LogInstall Registrar proceso de instalación # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/SpanishInternational.nsh000077500000000000000000000202061477201124000234700ustar00rootroot00000000000000;Language: Spanish International (3082) ;By Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - niwrad777@gmail.com ;Base by Monki y Joel !insertmacro LANGFILE "SpanishInternational" "Spanish (International)" "Español (Alfabetización Internacional)" "Espanol (Alfabetizacion Internacional)" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Instalación de $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este asistente le guiará a través de la instalación de $(^NameDA).$\r$\n$\r$\nSe recomienda que cierre todas la demás aplicaciones antes de iniciar la instalación. Esto hará posible actualizar archivos de sistema sin tener que reiniciar su computadora.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Desinstalación de $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente le guiará durante la desinstalación de $(^NameDA).$\r$\n$\r$\nAntes de iniciar la desinstalación, asegúrese de que $(^NameDA) no se está ejecutando.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acuerdo de licencia" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revise el acuerdo de licencia antes de instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta las condiciones del acuerdo, marque abajo la casilla. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta las condiciones del acuerdo, seleccione abajo la primera opción. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acuerdo de licencia" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revise el acuerdo de licencia antes de desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Presione Avanzar Página para ver el resto del acuerdo." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selección de componentes" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea instalar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selección de componentes" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un componente para ver su descripción." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elegir lugar de instalación" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elija la carpeta para instalar $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elegir lugar de desinstalación" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elija la carpeta desde la cual desinstalará $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se instala." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Finalizada" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación se ha finalizado correctamente." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Abortada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación no se terminó correctamente." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se desinstala." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Finalizada" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación se ha finalizado correctamente." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Abortada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación no se terminó correctamente." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Finalizando el Asistente de Instalación de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido instalado en su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Su sistema debe ser reiniciado para poder finalizar la instalación de $(^NameDA). ¿Desea reiniciar ahora?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando el Asistente de Desinstalación de $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido desinstalado de su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Su computadora debe ser reiniciada para finalizar la desinstalación de $(^NameDA). ¿Desea reiniciar ahora?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ahora" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reiniciar manualmente más tarde" ${LangFileString} MUI_TEXT_FINISH_RUN "&Ejecutar $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Léame" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elegir Carpeta del Menú Inicio" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elija una Carpeta del Menú Inicio para los accesos directos de $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menú Inicio en la que quiera crear los accesos directos del programa. También puede introducir un nombre para crear una nueva carpeta." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear accesos directos" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de su sistema." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "¿Está seguro de que desea salir de la instalación de $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Está seguro de que desea salir de la desinstalación de $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elegir Usuarios" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elija los usuarios para los cuales Ud. desea instalar $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Elija una opción si desea instalar $(^NameDA) para sólo para Ud., o para todos los usuarios de esta computadora.$(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instación para cualquier usuario de esta computadora" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación solo para mí" !endif nsis-3.11/Contrib/Language files/Swahili.nlf000077500000000000000000000126231477201124000207260ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1089 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by MK, Kenya Branch # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Usanidi # ^UninstallCaption $(^Name) Sakinusha # ^LicenseSubCaption : Mapatano ya Leseni # ^ComponentsSubCaption : Machaguo ya Kusakinisha # ^DirSubCaption : Folda ya Kusakinisha # ^InstallingSubCaption : Inasakinisha # ^CompletedSubCaption : Imekamilika # ^UnComponentsSubCaption : Machaguo ya Kusakinusha # ^UnDirSubCaption : Folda ya Kusakinusha # ^ConfirmSubCaption : Uthibitisho # ^UninstallingSubCaption : Inasakinusha # ^UnCompletedSubCaption : Imekamilika # ^BackBtn < Inayo&tangulia # ^NextBtn &Ifuatayo > # ^AgreeBtn &Nakubali # ^AcceptBtn &Nakubali matakwa ya Mapatano ya Leseni # ^DontAcceptBtn &Sikubali matakwa ya Mapatano ya Leseni # ^InstallBtn &Sakinisha # ^UninstallBtn &Sakinusha # ^CancelBtn Ghairi # ^CloseBtn &Funga # ^BrowseBtn &Vinjari... # ^ShowDetailsBtn &Onyesha utondoti # ^ClickNext Bofya Ifuatayo ili kuendelea. # ^ClickInstall Bofya Sakinisha ili kuanza usakinishaji. # ^ClickUninstall Bofya Sakinusha ili kuanza usakinushaji. # ^Name Jina # ^Completed Imekamilika # ^LicenseText Tafadhali soma mapatano ya leseni kabla ya kusakinisha (kuweka kwenye kompyuta) $(^NameDA). Ikiwa unakubali matakwa yote ya mapatano, bofya Nakubali. # ^LicenseTextCB Tafadhali soma mapatano ya leseni kabla ya kusakinisha (kuweka kwenye kompyuta) $(^NameDA). Ikiwa unakubali matakwa yote ya mapatano, bofya kisanduku cha alama kilicho hapa chini. $_CLICK # ^LicenseTextRB Tafadhali soma mapatano ya leseni kabla ya kusakinisha (kuweka kwenye kompyuta) $(^NameDA). Ikiwa unakubali matakwa yote ya mapatano, teua chaguo la kwanza hapa chini. $_CLICK # ^UnLicenseText Tafadhali soma mapatano ya leseni kabla ya kusakinusha (kufuta) $(^NameDA). Ikiwa unakubali matakwa yote ya mapatano, bofya Nakubali. # ^UnLicenseTextCB Tafadhali soma mapatano ya leseni kabla ya kusakinusha (kufuta) $(^NameDA). Ikiwa unakubali matakwa yote ya mapatano, bofya kisanduku cha alama kilicho hapa chini. $_CLICK # ^UnLicenseTextRB Tafadhali soma leseni ya mapatano kabla ya kusakinusha (kufuta) $(^NameDA). Ikiwa unakubali matakwa yote ya mapatano, teua chaguo la kwanza hapa chini. $_CLICK # ^Custom Kaida # ^ComponentsText Tia alama vijenzi unavyotaka kusakinisha na utoe alama kando ya vijenzi usivyotaka kusakinisha. $_CLICK # ^ComponentsSubText1 Teua aina ya usakinishaji: # ^ComponentsSubText2_NoInstTypes Teua vijenzi vitakavyosakinishwa: # ^ComponentsSubText2 Au, uteue vijenzi vya hiari unavyotaka kusakinisha: # ^UnComponentsText Tia alama vijenzi unavyotaka kusakinusha na utoe alama kando ya vijenzi usivyotaka kusakinusha. $_CLICK # ^UnComponentsSubText1 Teua aina ya usakinushaji: # ^UnComponentsSubText2_NoInstTypes Teua vijenzi vitakavyosakinushwa: # ^UnComponentsSubText2 Au, uteue vijenzi vya hiari unavyotaka kusakinusha: # ^DirText Usanidi utasakinisha $(^NameDA) katika folda ifuatayo. Ili kusakinisha katika folda tofauti, bofya Vinjari kisha uteue folda nyingine. $_CLICK # ^DirSubText Folda Inayokusudiwa # ^DirBrowseText Teua folda itakayotumika katika usakinishaji $(^NameDA): # ^UnDirText Usanidi utasakinusha $(^NameDA) kutoka katika folda ifuatayo. Ili kusakinusha kutoka katika folda tofauti, bofya Vinjari kisha uteue folda nyingine. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Teua folda itakayotumika katika usakinushaji $(^NameDA): # ^SpaceAvailable "Nafasi iliyopo: " # ^SpaceRequired "Nafasi inayohitajika: " # ^UninstallingText $(^NameDA) itasakinushwa kutoka katika folda ifuatayo. $_CLICK # ^UninstallingSubText Usakinushaji kutoka: # ^FileError Hitilafu katika kufungua faili ili kuandika: \r\n\r\n$0\r\n\r\nBofya Katiza ili kusimamisha usakinishaji,\r\nJaribu Upya ili kujaribu upya, au\r\nPuuza ili kuruka faili hii. # ^FileError_NoIgnore Hitilafu katika kufungua faili ili kuandika: \r\n\r\n$0\r\n\r\nBofya Jaribu Tena ili kujaribu tena, au\r\nGhairi ili kusimamisha usakinishaji. # ^CantWrite "Haiwezekani kuandika: " # ^CopyFailed Haikuwezekana Kunakili # ^CopyTo "Nakili katika" # ^Registering "Inaandikisha: " # ^Unregistering "Inatangua Uandikishaji: " # ^SymbolNotFound "Alama haikupatikana: " # ^CouldNotLoad "Haikupakia: " # ^CreateFolder "Unda Folda: " # ^CreateShortcut "Unda Mkato: " # ^CreatedUninstaller "Kisakinushaji Kimeundwa: " # ^Delete "Futa Faili: " # ^DeleteOnReboot "Futa itakapowashwa upya: " # ^ErrorCreatingShortcut "Hitilafu katika kuunda mkato: " # ^ErrorCreating "Hitilafu katika kuunda: " # ^ErrorDecompressing Hitilafu katika kugandamua data! Kisakinishaji kimevurugika? # ^ErrorRegistering Hitilafu katika kuandikisha DLL # ^ExecShell "ExecShell: " # ^Exec "Tekeleza: " # ^Extract "Chopoa: " # ^ErrorWriting "Zidua: hitilafu katika kuandika faili " # ^InvalidOpcode Kisakinishi kimevurugika: msimbo batili # ^NoOLE "Hakuna UPV (OLE) kwa ajili ya: " # ^OutputFolder "Folda ya zao: " # ^RemoveFolder "Ondoa Folda: " # ^RenameOnReboot "Badili jina itakapowashwa upya: " # ^Rename "Badili jina: " # ^Skipped "Imerukwa: " # ^CopyDetails Nakili Utondoti Kwenye Clipboard # ^LogInstall Unda batli ya mchakato wa kusakinisha # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Swahili.nsh000077500000000000000000000114701477201124000207360ustar00rootroot00000000000000;Language: Swahili (1089) !insertmacro LANGFILE "Swahili" = "Kiswahili" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Karibu kwenye $(^NameDA) Usanidi" #FIXME:MUI_TEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_UNWELCOMEPAGE #FIXME:MUI_UNTEXT_WELCOME_INFO_TITLE #FIXME:MUI_UNTEXT_WELCOME_INFO_TEXT " !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Mapatano ya Leseni" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Tafadhali soma matakwa ya leseni kabla ya kusakinisha (kuweka kwenye kompyuta) $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ikiwa unakubali matakwa ya mapatano, bofya Nakubali ili kuendelea. Lazima ukubali mapatano kabla ya kusakinisha (kuweka kwenye kompyuta) $(^NameDA)." #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_UNLICENSEPAGE #FIXME:MUI_UNTEXT_LICENSE_TITLE #FIXME:MUI_UNTEXT_LICENSE_SUBTITLE #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Bofya Page Down uone sehemu inayosalia ya mapatano." !endif !ifdef MUI_COMPONENTSPAGE #FIXME:MUI_TEXT_COMPONENTS_TITLE #FIXME:MUI_TEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_UNCOMPONENTSPAGE #FIXME:MUI_UNTEXT_COMPONENTS_TITLE #FIXME:MUI_UNTEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Ufafanuzi" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE #FIXME:MUI_TEXT_DIRECTORY_TITLE #FIXME:MUI_TEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_UNDIRECTORYPAGE #FIXME:MUI_UNTEXT_DIRECTORY_TITLE #FIXME:MUI_UNTEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Inasakinisha" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Tafadhali subiri, $(^NameDA) inasakinishwa." ${LangFileString} MUI_TEXT_FINISH_TITLE "Usakinishaji Umekamilika" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Usanidi umekamilika ifaavyo." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "SUsanidi haukukamilika ifaavyo." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Inasakinusha" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Tafadhali subiri, $(^NameDA) inasakinushwa." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Usakinushaji Umekamilika" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Usakinushaji umekamilika ifaavyo." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Usakinushaji Umekatizwa " ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Usakinushaji haukukamilika ifaavyo." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Inamalizia Usanidi wa $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) imesakinishwa katika kompyuta yako.$\r$\n$\r$\nBofya Maliza ili kufunga Usanidi." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Lazima kompyuta yako iwashwe upya ili kukamilisha usakinishaji wa $(^NameDA). Ungependa iwashwe upya sasa?" !endif !ifdef MUI_UNFINISHPAGE #FIXME:MUI_UNTEXT_FINISH_INFO_TITLE #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT #FIXME:MUI_UNTEXT_FINISH_INFO_REBOOT !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Washa upya sasa" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nataka kuiwasha upya baadaye" ${LangFileString} MUI_TEXT_FINISH_RUN "&Endesha $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Onyesha faili yenye maagizo" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Maliza" !endif !ifdef MUI_STARTMENUPAGE #FIXME:MUI_TEXT_STARTMENU_TITLE #FIXME:MUI_TEXT_STARTMENU_SUBTITLE #FIXME:MUI_INNERTEXT_STARTMENU_TOP #FIXME:MUI_INNERTEXT_STARTMENU_CHECKBOX !endif !ifdef MUI_UNCONFIRMPAGE #FIXME:MUI_UNTEXT_CONFIRM_TITLE #FIXME:MUI_UNTEXT_CONFIRM_SUBTITLE !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Una hakika kwamba unataka kuaga Usanidi wa $(^Name) ?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Una hakika kwamba unataka kuaga Usakinushaji wa $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Language files/Swedish.nlf000077500000000000000000000123411477201124000207310ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1053 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Magnus Bonnevier (magnus.bonnevier@telia.com) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Installation # ^UninstallCaption $(^Name) Avinstallation # ^LicenseSubCaption : Licensavtal # ^ComponentsSubCaption : Installationsval # ^DirSubCaption : Installationskatalog # ^InstallingSubCaption : Installerar # ^CompletedSubCaption : Slutförd # ^UnComponentsSubCaption : Avinstallationsval # ^UnDirSubCaption : Avinstallationskatalog # ^ConfirmSubCaption : Bekräftelse # ^UninstallingSubCaption : Avinstallerar # ^UnCompletedSubCaption : Slutförd # ^BackBtn < &Tillbaka # ^NextBtn &Nästa > # ^AgreeBtn Jag &Godkänner # ^AcceptBtn Jag &Godkänner villkoren i licensavtalet # ^DontAcceptBtn Jag &Godkänner inte villkoren i licensavtalet # ^InstallBtn &Installera # ^UninstallBtn &Avinstallera # ^CancelBtn Avbryt # ^CloseBtn &Stäng # ^BrowseBtn B&läddra... # ^ShowDetailsBtn Visa &detaljer # ^ClickNext Klicka pÃ¥ Nästa för att fortsätta. # ^ClickInstall Klicka pÃ¥ Installera för att starta installationen. # ^ClickUninstall Klicka pÃ¥ Avinstallera för att starta avinstallationen. # ^Name Namn # ^Completed Slutförd # ^LicenseText Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godkänner. # ^LicenseTextCB Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK # ^LicenseTextRB Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, välj det första alternativet nedan. $_CLICK # ^UnLicenseText Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godkänner. # ^UnLicenseTextCB Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK # ^UnLicenseTextRB Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, välj det första alternativet nedan. $_CLICK # ^Custom Valfri # ^ComponentsText Markera de komponenter du vill installera och avmarkera de komponenter du inte vill installera. $_CLICK # ^ComponentsSubText1 Välj typ av installation: # ^ComponentsSubText2_NoInstTypes Välj komponenter att installera: # ^ComponentsSubText2 Eller, välj de alternativa komponenter du önskar installera: # ^UnComponentsText Markera de komponenter du vill avinstallera och avmarkera de komponenter du inte vill avinstallera. $_CLICK # ^UnComponentsSubText1 Välj typ av avinstallation: # ^UnComponentsSubText2_NoInstTypes Välj komponenter att avinstallera: # ^UnComponentsSubText2 Eller, välj de alternativa komponenter du önskar avinstallera: # ^DirText Guiden kommer att installera $(^NameDA) i följande katalog. För att installera i en annan katalog, klicka Bläddra och välj en alternativ katalog. $_CLICK # ^DirSubText MÃ¥lkatalog # ^DirBrowseText Välj katalog att installera $(^NameDA) i: # ^UnDirText Installationsguiden kommer att avinstallera $(^NameDA) frÃ¥n följande katalog. För att avinstallera frÃ¥n en annan katalog, klicka Bläddra och välj en annan katalog. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Välj katalog att avinstallera $(^NameDA) frÃ¥n: # ^SpaceAvailable "Utrymme tillgängligt: " # ^SpaceRequired "Utrymme som behövs: " # ^UninstallingText $(^NameDA) kommer att avinstalleras frÃ¥n följande katalog. $_CLICK # ^UninstallingSubText Avinstallerar frÃ¥n: # ^FileError Fel vid Öppning av fil för skrivning: \r\n\t"$0"\r\nKlicka pÃ¥ avbryt för att avbryta installationen,\r\nförsök igen för att försöka skriva till filen igen, eller\r\nIgnorera för att skippa denna fil # ^FileError_NoIgnore Fel vid Öppning av fil för skrivning: \r\n\t"$0"\r\nKlicka pÃ¥ försök igen för att skriva till filen igen, eller\r\navbryt för att avbryta installationen # ^CantWrite "Kan inte skriva: " # ^CopyFailed Kopiering misslyckades # ^CopyTo "Kopiera till " # ^Registering "Registrerar: " # ^Unregistering "Avregistrerar: " # ^SymbolNotFound "Kunde inte hitta symbol: " # ^CouldNotLoad "Kunde inte ladda: " # ^CreateFolder "Skapa katalog: " # ^CreateShortcut "Skapa genväg: " # ^CreatedUninstaller "Skapade avinstallationsprogram: " # ^Delete "Radera fil: " # ^DeleteOnReboot "Radera vid omstart: " # ^ErrorCreatingShortcut "Fel vid skapande av genväg: " # ^ErrorCreating "Fel vid skapande: " # ^ErrorDecompressing Fel vid uppackning av data! Skadat installationspaket? # ^ErrorRegistering Fel vid registrering av DLL # ^ExecShell "ExecShell: " # ^Exec "Kör: " # ^Extract "Extrahera: " # ^ErrorWriting "Extrahera: fel vid skrivning till fil " # ^InvalidOpcode Installationspaket skadat: ogiltig opcode # ^NoOLE "Ingen OLE för: " # ^OutputFolder "MÃ¥lkatalog: " # ^RemoveFolder "Ta bort katalog: " # ^RenameOnReboot "Döp om vid omstart: " # ^Rename "Döp om: " # ^Skipped "Ignorerad: " # ^CopyDetails Kopiera detaljinformation till klippbordet # ^LogInstall Logga installationsförfarandet # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Swedish.nsh000077500000000000000000000176361477201124000207560ustar00rootroot00000000000000;Compatible with Modern UI 1.72 ;Language: Swedish (1053) ;By Magnus Bonnevier (magnus.bonnevier@telia.com), updated by Rickard Angbratt (r.angbratt@home.se), updated by Ulf Axelsson (ulf.axelsson@gmail.com) !insertmacro LANGFILE "Swedish" = "Svenska" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Välkommen till installationsguiden för $(^NameDA)." ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denna guide tar dig igenom installationen av $(^NameDA).$\r$\n$\r$\nDet rekommenderas att du avslutar alla andra program innan du fortsätter installationen. Detta tillÃ¥ter att installationen uppdaterar nödvändiga systemfiler utan att behöva starta om din dator.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Välkommen till avinstallationsguiden för $(^NameDA)." ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denna guide tar dig igenom avinstallationen av $(^NameDA).$\r$\n$\r$\nInnan du startar avinstallationen, försäkra dig om att $(^NameDA) inte körs.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licensavtal" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Om du accepterar villkoren i avtalet, klicka Jag Godkänner för att fortsätta. Du mÃ¥ste acceptera avtalet för att installera $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du mÃ¥ste acceptera avtalet för att installera $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Om du accepterar villkoren i avtalet, välj det första alternativet nedan. Du mÃ¥ste acceptera avtalet för att installera $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licensavtal" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Om du accepterar villkoren i avtalet, klicka Jag Godkänner för att fortsätta. Du mÃ¥ste acceptera avtalet för att avinstallera $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du mÃ¥ste acceptera avtalet för att avinstallera $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Om du accepterar villkoren i avtalet, välj det första alternativet nedan. Du mÃ¥ste acceptera avtalet för att avinstallera $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tryck Page Down för att se resten av licensavtalet." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Välj komponenter" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Välj vilka alternativ av $(^NameDA) som du vill installera." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Välj komponenter" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Välj vilka alternativ av $(^NameDA) som du vill avinstallera." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivning" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "HÃ¥ll muspekaren över ett alternativ för att se dess beskrivning." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Välj ett alternativ för att se dess beskrivning." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Välj installationsväg" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Välj katalog att installera $(^NameDA) i." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Välj avinstallationsväg" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Välj katalog att avinstallera $(^NameDA) frÃ¥n." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerar" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Var vänlig vänta medan $(^NameDA) installeras." ${LangFileString} MUI_TEXT_FINISH_TITLE "Installationen är klar" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Guiden avslutades korrekt." ${LangFileString} MUI_TEXT_ABORT_TITLE "Installationen avbröts" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Guiden genomfördes inte korrekt." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallerar" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Var vänlig vänta medan $(^NameDA) avinstalleras." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallationen genomförd" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallationen genomfördes korrekt." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallationen avbruten" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallationen genomfördes inte korrekt." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Avslutar installationsguiden för $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) har installerats pÃ¥ din dator.$\r$\n$\r$\nKlicka pÃ¥ Slutför för att avsluta guiden." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Din dator mÃ¥ste startas om för att fullborda installationen av $(^NameDA). Vill du starta om nu?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Avslutar avinstallationsguiden för $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) komponenter har avinstallerats frÃ¥n din dator.$\r$\n$\r$\nKlicka pÃ¥ Slutför för att avsluta guiden." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Din dator mÃ¥ste startas om för att fullborda avinstallationen av $(^NameDA). Vill du starta om nu?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Starta om nu" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Jag vill starta om själv senare" ${LangFileString} MUI_TEXT_FINISH_RUN "&Kör $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Visa Readme-filen" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Slutför" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Välj Startmenykatalog" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Välj en Startmenykatalog för programmets genvägar." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Välj startmenykatalog i vilken du vill skapa programmets genvägar. Du kan ange ett eget namn för att skapa en ny katalog." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Skapa ej genvägar" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstallera $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Ta bort $(^NameDA) frÃ¥n din dator." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Är du säker pÃ¥ att du vill avbryta installationen av $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Är du säker pÃ¥ att du vill avbryta avinstallationen av $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Välj användare" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Välj för vilka användare du vill installera $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Välj huruvida du vill installera $(^NameDA) enbart för dig själv eller för alla användare pÃ¥ denna dator. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installera för alla som använder denna dator" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installera bara för mig" !endif nsis-3.11/Contrib/Language files/Tatar.nlf000077500000000000000000000170021477201124000203750ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1092 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Bulat Azat uly [ bulat_ibrahim@mail.ru ] # ^Branding Nullsoft Install System %s # ^SetupCaption Урнаштыру $(^Name) # ^UninstallCaption Бетерү $(^Name) # ^LicenseSubCaption : Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ # ^ComponentsSubCaption : Урнаштыру шартлары # ^DirSubCaption : Урнаштыру папкаÑÑ‹ # ^InstallingSubCaption : Файлларны күчермәләү # ^CompletedSubCaption : Гамәл тәмамланды # ^UnComponentsSubCaption : Бетерү шартлары # ^UnDirSubCaption : Бетерү папкаÑÑ‹ # ^ConfirmSubCaption : РаÑлау # ^UninstallingSubCaption : Файлларны бетерү # ^UnCompletedSubCaption : Гамәл тәмамланды # ^BackBtn < &Ðртка # ^NextBtn &Ðлга > # ^AgreeBtn Кабул ит&әм # ^AcceptBtn Мин &килешү шартларын кабул итәм # ^DontAcceptBtn Мин &килешү шартларын кабул итими # ^InstallBtn &Урнаштырырга # ^UninstallBtn Бе&терергә # ^CancelBtn Баш тарту # ^CloseBtn &Ябарга # ^BrowseBtn К&арарга... # ^ShowDetailsBtn &Тулырак... # ^ClickNext Дәвам итү өчен 'Ðлга' төймәÑенә баÑыгыз. # ^ClickInstall Программаны урнаштыру өчен 'Урнаштырырга' төймәÑенә баÑыгыз. # ^ClickUninstall Программаны бетерү өчен 'Бетерергә' төймәÑенә баÑыгыз. # ^Name ИÑем # ^Completed Әзер # ^LicenseText $(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз. Килешү шартларын кабул итÑәгез, 'Кабул итәм' төймәÑенә баÑыгыз. # ^LicenseTextCB $(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз. Килешү шартларын кабул итÑәгез, түбәндә билге куегыз. $_CLICK # ^LicenseTextRB $(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз. Килешү шартларын кабул итÑәгез, түбәндәге вариантлардан беренчеÑен Ñайлагыз. $_CLICK # ^UnLicenseText $(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз. Килешү шартларын кабул итÑәгез, 'Кабул итәм' төймәÑенә баÑыгыз. # ^UnLicenseTextCB $(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз. Килешү шартларын кабул итÑәгез, түбәндә билге куегыз. $_CLICK # ^UnLicenseTextRB $(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз. Килешү шартларын кабул итÑәгез, түбәндәге вариантлардан беренчеÑен Ñайлагыз. $_CLICK # ^Custom Сайлап кына # ^ComponentsText Программаның урнаштырырга теләгән компонентларын Ñайлагыз. $_CLICK # ^ComponentsSubText1 Урнаштыру төрен Ñайлагыз: # ^ComponentsSubText2_NoInstTypes Урнаштыру өчен программаның компонентларын Ñайлагыз: # ^ComponentsSubText2 Ñки урнаштыру өчен Ó©Ñтәмә компонентлар Ñайлагыз: # ^UnComponentsText Бетерергә теләгән компонентларны Ñайлагыз. $_CLICK # ^UnComponentsSubText1 Бетерү төрен Ñайлагыз: # ^UnComponentsSubText2_NoInstTypes Бетерү өчен компонентларны Ñайлагыз: # ^UnComponentsSubText2 Ñки бетерү өчен Ó©Ñтәмә компонентларны Ñайлагыз: # ^DirText Программа $(^NameDA) программаÑын күрÑәтерлән папкага урнаштырачак. Башка папкага урнаштыру өчен, 'Карарга' төймәÑенә баÑыгыз һәм урын күрÑәтегез. $_CLICK # ^DirSubText Урнаштыру папкаÑÑ‹ # ^DirBrowseText $(^NameDA) урнаштыру өчен папка Ñайлагыз: # ^UnDirText Программа $(^NameDA) программаÑын күрÑәтелгән папкадан бетерәчәк. Башка папкадан бетерү өчен, 'Карарга' төймәÑенә баÑыгыз һәм урын күрÑәтегез. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA) бетерергә кирәк булган папканы күрÑәтегез: # ^SpaceAvailable "ДиÑкта буш урын: " # ^SpaceRequired "ДиÑкта кирәк урын: " # ^UninstallingText $(^NameDA) программаÑÑ‹ Ñанагыгыздан бетереләчәк. $_CLICK # ^UninstallingSubText Моннан бетерү: # ^FileError Яздыру өчен файлны ачып булмый: \r\n\t"$0"\r\n'Туктату': урнаштыруны туктатырга;\r\n"Кабатлау": омтылышны кабатларга;\r\n"Калдыру": бу гамәлне төшереп калдырырга. # ^FileError_NoIgnore Яздыру өчен файлны ачып булмый: \r\n\t"$0"\r\n'Кабатлау': омтылышны кабатларга;\r\n'Баш тарту': урнаштыру барышын туктатырга. # ^CantWrite "Яздырып булмый: " # ^CopyFailed Күчермә ÑÑауда хата # ^CopyTo "Монда күчермәләү: " # ^Registering "Теркәлү: " # ^Unregistering "Теркәүдән баш тарту: " # ^SymbolNotFound "Символны табып булмый: " # ^CouldNotLoad "Йөкләп булмый: " # ^CreateFolder "Папка ÑÑау: " # ^CreateShortcut "Сылтама ÑÑау: " # ^CreatedUninstaller "Бетерү программаÑын ÑÑау: " # ^Delete "Файлны бетерү: " # ^DeleteOnReboot "Санак Ñүндереп кабызылганда бетерү: " # ^ErrorCreatingShortcut "Сылтама ÑÑауда хата: " # ^ErrorCreating "ЯÑауда хата: " # ^ErrorDecompressing Мәгълүматларны чыгаруда хата! Урнаштыручы бозык булуы мөмкин. # ^ErrorRegistering DLL теркәүдә хата # ^ExecShell "Тышча командаÑын башкару: " # ^Exec "Башкару: " # ^Extract "Чыгару: " # ^ErrorWriting "Чыгару: файл Ñздыруда хата " # ^InvalidOpcode Урнаштыручы бозылган: мөмкин булмаган код # ^NoOLE "OLE моның өчен юк: " # ^OutputFolder "Урнаштыру папкаÑÑ‹: " # ^RemoveFolder "Папканы бетерү: " # ^RenameOnReboot "Санак Ñүндереп кабызылганда иÑемен үзгәртү: " # ^Rename "ИÑемен үзгәртү: " # ^Skipped "Калдыру: " # ^CopyDetails Мәгълүматларны алмашыну буферына күчермәләргә # ^LogInstall Урнаштыру хиÑабын алып барырга # byte (байт) б # kilo К # mega М # giga Гnsis-3.11/Contrib/Language files/Tatar.nsh000077500000000000000000000241101477201124000204040ustar00rootroot00000000000000;Language: Tatar (1092) ;Translation by Bulat Azat uly [bulat_ibrahim@mail.ru] !insertmacro LANGFILE "Tatar" = "Татарча" "Tatarcha" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) урнаштыручыга рәхим итегез" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Бу программа $(^NameDA) программаÑын Ñанагыгызга урнаштырыр.$\r$\n$\r$\nУрнаштыру алдыннан бөтен ачык кушымталарны Ñбарга тәкъдим ителә. Бу урнаштыру программаÑына ÑиÑтема файлларын Ñанакны Ñүндереп кабызмыйча Ñңартырга мөмкинлек бирә.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) бетерүчегә рәхим итегез" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Бу программа $(^NameDA) программаÑын Ñанагыгыздан бетерер.$\r$\n$\r$\nДәвам итү алдыннан $(^NameDA) җибәрелмәгәнлеген тикшерегез.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) урнаштыру алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Килешү шартларын кабул итÑәгез, $\"Кабул итәм$\" төймәÑенә баÑыгыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Килешү шартларын кабул итÑәгез, түбәндә билге куегыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Килешү шартларын кабул итÑәгез, түбәндәге вариантлардан беренчеÑен Ñайлагыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) бетерү алдыннан Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÐºÐ¸Ð»ÐµÑˆÒ¯Ðµ белән танышыгыз." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Килешү шартларын кабул итÑәгез, $\"Кабул итәм$\" төймәÑенә баÑыгыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Килешү шартларын кабул итÑәгез, түбәндә билге куегыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Килешү шартларын кабул итÑәгез, түбәндәге вариантлардан беренчеÑен Ñайлагыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ТекÑÑ‚ буенча күчү өчен, $\"PageUp$\" һәм $\"PageDown$\" төймәләренә баÑыгыз." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Урнаштырылучы программаның компонентлары" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Урнаштырырга теләгән $(^NameDA) компонентларын Ñайлагыз." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Программа компонентлары" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Бетерергә теләгән $(^NameDA) компонентларын Ñайлагыз." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ТаÑвирлама" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Компонентның таÑвирламаÑын уку өчен, аның иÑеменә тычкан курÑорын китерегез." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Компонентның таÑвирламаÑын уку өчен, аны билгеләгез." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Урнаштыру папкаÑын Ñайлау" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) урнаштыру өчен папка Ñайлагыз." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Бетерү папкаÑын Ñайлау" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) бетерергә кирәк булган папканы Ñайлагыз." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Файлларны күчермәләү" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) файллары күчермәләнә, көтегез..." ${LangFileString} MUI_TEXT_FINISH_TITLE "Урнаштыру тәмамланды" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Урнаштыру уңышлы тәмамланды." ${LangFileString} MUI_TEXT_ABORT_TITLE "Урнаштыру туктатылды" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Урнаштыру уңышÑыз тәмамланды." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Бетерү" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) файллары бетерелә, көтегез..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Бетерү тәмамланды" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Программаны бетерү уңышлы тәмамланды." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Бетерү туктатылды" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Бетерү тулыÑынча башкарылмады." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) урнаштыручы Ñшен тәмамлау" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) Ñанагыгызга урнаштырылды.$\r$\n$\r$\nУрнаштыру программаÑыннан чыгу өчен $\"Тәмам$\" төймәÑенә баÑыгыз." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) урнаштыруын тәмамлау өчен, Ñанакны Ñүндереп кабызырга кирәк. Ðны хәзер башкарыргамы?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) бетерүче Ñшен тәмамлау" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) Ñанагыгыздан бетерелде.$\r$\n$\r$\nБетерү программаÑыннан чыгу өчен $\"Тәмам$\" төймәÑенә баÑыгыз." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) бетерүен тәмамлау өчен, Ñанакны Ñүндереп кабызырга кирәк. Ðны хәзер башкарыргамы?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Әйе, Ñанакны хәзер Ñүндереп кабызырга" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Юк, мин Ñоңрак Ñүндереп кабызырмын" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) программаÑын җибәр&ергә" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&ReadMe файлын күрÑәтергә" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Тәмам" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "$\"Башлау$\" менюÑында папка" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$\"Башлау$\" менюÑында программа Ñылтамаларын урнаштыру өчен папка Ñайлагыз." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "$\"Башлау$\" менюÑында программа Ñылтамалары урнаштырылачак папканы Ñайлагыз. Шулай ук папкага башка иÑем бирә алаÑыз." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Сылтамалар ÑÑамаÑка" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) бетерү" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Санактан $(^NameDA) бетерү." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Чыннан да $(^Name) урнаштыруын туктатыргамы?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Чыннан да $(^Name) бетерүен туктатыргамы?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Урнаштыру режимы" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "КайÑÑ‹ кулланучылар өчен $(^NameDA) урнаштырырга телиÑез, Ñайлагыз." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA) программаÑын үзегезгә генә Ñки бөтен кулланучылар өчен дә урнаштырачагыгызны Ñайлагыз. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Бөтен кулланучылар өчен урнаштырырга" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Минем өчен генә урнаштырырга" !endif nsis-3.11/Contrib/Language files/Thai.nlf000077500000000000000000000234011477201124000202070ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1054 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 874 # RTL - anything else than RTL means LTR - # Translation by SoKoOLz, TuW@nNu (asdfuae) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) ติดตั้ง # ^UninstallCaption $(^Name) ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง # ^LicenseSubCaption : ข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธิ์ # ^ComponentsSubCaption : ตัวเลือà¸à¸à¸²à¸£à¸•ิดตั้ง # ^DirSubCaption : à¹à¸Ÿà¹‰à¸¡à¸—ี่ติดตั้ง # ^InstallingSubCaption : à¸à¸³à¸¥à¸±à¸‡à¸•ิดตั้ง # ^CompletedSubCaption : เสร็จสิ้น # ^UnComponentsSubCaption : ตัวเลือà¸à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง # ^UnDirSubCaption : à¹à¸Ÿà¹‰à¸¡à¸—ี่ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง # ^ConfirmSubCaption : ยืนยัน # ^UninstallingSubCaption : à¸à¸³à¸¥à¸±à¸‡à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง # ^UnCompletedSubCaption : เสร็จสิ้น # ^BackBtn < &à¸à¸¥à¸±à¸šà¹„ป # ^NextBtn &ต่อไป > # ^AgreeBtn &ตà¸à¸¥à¸‡ # ^AcceptBtn &ตà¸à¸¥à¸‡à¸¢à¸­à¸¡à¸£à¸±à¸šà¸‚้อต่างๆในหัวข้อลิขสิทธิ์ # ^DontAcceptBtn &ไม่ยอมรับข้อต่างๆในหัวข้อลิขสิทธิ์ # ^InstallBtn &ติดตั้ง # ^UninstallBtn &ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง # ^CancelBtn ยà¸à¹€à¸¥à¸´à¸ # ^CloseBtn &ปิด # ^BrowseBtn เ&รียà¸à¸”ู... # ^ShowDetailsBtn &รายละเอียด # ^ClickNext à¸à¸” ต่อไป เพื่อเริ่มระบบอัติโนมัติ # ^ClickInstall à¸à¸” ติดตั้ง เพื่อทำà¸à¸²à¸£à¸•ิดตั้ง # ^ClickUninstall à¸à¸” ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง เพื่อยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง # ^Name ชื่อ # ^Completed เสร็จสิ้นà¹à¸¥à¹‰à¸§ # ^LicenseText โปรดอ่านทวนเรื่องà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸šà¹ƒà¸™à¸¥à¸´à¸‚สิทธิ์à¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸—ุà¸à¹†à¸”้าน, à¸à¸” ฉันยอมรับ # ^LicenseTextCB โปรดอ่านทวนเรื่องà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸šà¹ƒà¸™à¸¥à¸´à¸‚สิทธิ์à¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸—ุà¸à¹†à¸”้าน, à¸à¸”เลือà¸à¸—ี่à¸à¸¥à¹ˆà¸­à¸‡à¸”้านล่าง. $_CLICK # ^LicenseTextRB โปรดอ่านทวนเรื่องà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸šà¹ƒà¸™à¸¥à¸´à¸‚สิทธิ์à¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸—ุà¸à¹†à¸”้าน, เลือà¸à¸•ัวเลือà¸à¹à¸£à¸à¸‚้างล่าง. $_CLICK # ^UnLicenseText โปรดอ่านทวนเรื่องà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸šà¹ƒà¸™à¸¥à¸´à¸‚สิทธิ์à¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸•ิดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸—ุà¸à¹†à¸”้าน, à¸à¸” ฉันยอมรับ # ^UnLicenseTextCB โปรดอ่านทวนเรื่องà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸šà¹ƒà¸™à¸¥à¸´à¸‚สิทธิ์à¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸•ิดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸—ุà¸à¹†à¸”้าน, à¸à¸”เลือà¸à¸—ี่à¸à¸¥à¹ˆà¸­à¸‡à¸”้านล่าง. $_CLICK # ^UnLicenseTextRB โปรดอ่านทวนเรื่องà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸šà¹ƒà¸™à¸¥à¸´à¸‚สิทธิ์à¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸•ิดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸—ุà¸à¹†à¸”้าน, เลือà¸à¸•ัวเลือà¸à¹à¸£à¸à¸‚้างล่าง. $_CLICK # ^Custom à¸à¸³à¸«à¸™à¸”เอง # ^ComponentsText เลื่อà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่คุณต้องà¸à¸²à¸£à¸•ิดตั้งà¹à¸¥à¸°à¹„ม่เลือà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่คุณไม่ต้องà¸à¸²à¸£à¸•ิดตั้ง $_CLICK # ^ComponentsSubText1 เลือà¸à¸§à¸´à¸˜à¸µà¸à¸²à¸£à¸à¸²à¸£à¸•ิดตั้ง: # ^ComponentsSubText2_NoInstTypes เลือà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่คุณต้องà¸à¸²à¸£à¸•ิดตั้ง: # ^ComponentsSubText2 หรือ, เลือà¸à¸•ัวเลือà¸à¸—ี่คุณต้องà¸à¸²à¸£à¸•ิดตั้ง: # ^UnComponentsText เลือà¸à¸•ัวเลือà¸à¸—ี่คุณต้องà¸à¸²à¸£à¸ˆà¸°à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งà¹à¸¥à¸°à¹„ม่เลือà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่คุณไม่ต้องà¸à¸²à¸£à¸ˆà¸°à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง $_CLICK # ^UnComponentsSubText1 เลือà¸à¸§à¸´à¸˜à¸µà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง: # ^UnComponentsSubText2_NoInstTypes เลือà¸à¸•ัวเลือà¸à¸—ี่ต้องà¸à¸²à¸£à¸ˆà¸°à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง: # ^UnComponentsSubText2 หรือ, เลือà¸à¸ˆà¸²à¸à¸•ัวเลือà¸à¸­à¸·à¹ˆà¸™à¹†à¸—ี่คุณต้องà¸à¸²à¸£à¸ˆà¸°à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง: # ^DirText ตัวติดตั้งจะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA) ลงในà¹à¸Ÿà¹‰à¸¡à¸”ังต่อไปนี้, ถ้าต้องà¸à¸²à¸£à¸•ิดตั้งลงในà¹à¸Ÿà¹‰à¸¡à¸­à¸·à¹ˆà¸™, à¸à¸” เรียà¸à¸”ูà¹à¸¥à¸°à¹€à¸¥à¸·à¸­à¸à¹à¸Ÿà¹‰à¸¡à¸­à¸·à¹ˆà¸™ $_CLICK # ^DirSubText à¹à¸Ÿà¹‰à¸¡à¸—ี่ต้องà¸à¸²à¸£à¸•ิดตั้ง # ^DirBrowseText เลือà¸à¹à¸Ÿà¹‰à¸¡à¸—ี่ต้องà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA) ใน: # ^UnDirText ตัวติดตั้งจะทำà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง $(^NameDA) จาà¸à¹à¸Ÿà¹‰à¸¡à¸”ังต่อไปนี้, ถ้าต้องà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งจาà¸à¹à¸Ÿà¹‰à¸¡à¸­à¸·à¹ˆà¸™, à¸à¸” เรียà¸à¸”ู à¹à¸¥à¸°à¹€à¸¥à¸·à¸­à¸à¹à¸Ÿà¹‰à¸¡à¸­à¸·à¹ˆà¸™ $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText เลือà¸à¹à¸Ÿà¹‰à¸¡à¸—ี่ต้องà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง $(^NameDA) จาà¸: # ^SpaceAvailable "มีพื้นที่เหลือ: " # ^SpaceRequired "ต้องà¸à¸²à¸£à¸žà¸·à¹‰à¸™à¸—ี่: " # ^UninstallingText $(^NameDA) จะถูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งจาà¸à¹à¸Ÿà¹‰à¸¡à¸•่อไปนี้. $_CLICK # ^UninstallingSubText ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งจาà¸: # ^FileError ไม่สามารถเปิดไฟล์สำหรับเขียนได้: \r\n\r\n$0\r\n\r\nà¸à¸” ยà¸à¹€à¸¥à¸´à¸ เพื่อหยุดà¸à¸²à¸£à¸•ิดตั้ง,\r\nลองอีà¸à¸„รั้ง เพื่อลองอีà¸à¸„รั้ง, หรือ\r\nเพิà¸à¹€à¸‰à¸¢ เพื่อข้ามไฟล์นี้. # ^FileError_NoIgnore ไม่สามารถเปิดไฟล์สำหรับเขียนได้: \r\n\r\n$0\r\n\r\nà¸à¸” ลองอีà¸à¸„รั้ง เพื่อลองอีà¸à¸„รั้ง, หรือ\r\nยà¸à¹€à¸¥à¸´à¸à¹€à¸žà¸·à¹ˆà¸­à¸«à¸¢à¸¸à¸”à¸à¸²à¸£à¸•ิดตั้ง # ^CantWrite "ไม่สามารถเขียน: " # ^CopyFailed คัดลอà¸à¸œà¸´à¸”พลาด # ^CopyTo "คัดลอà¸à¹„ปยัง " # ^Registering "à¸à¸³à¸¥à¸±à¸‡à¸¥à¸‡à¸—ะเบียน: " # ^Unregistering "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¥à¸‡à¸—ะเบียน: " # ^SymbolNotFound "ไม่สามารถหาสัà¸à¸¥à¸±à¸à¸©à¸“์ได้: " # ^CouldNotLoad "ไม่สามารถโหลดได้: " # ^CreateFolder "สร้างà¹à¸Ÿà¹‰à¸¡: " # ^CreateShortcut "สร้างชอร์ตคัท: " # ^CreatedUninstaller "สร้างตัวยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง: " # ^Delete "ลบไฟล์: " # ^DeleteOnReboot "ลบตอนรีบูท: " # ^ErrorCreatingShortcut "มีปัà¸à¸«à¸²à¸ªà¸£à¹‰à¸²à¸‡à¹„ฟล์ชอร์ตคัท: " # ^ErrorCreating "มีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹„ฟล์: " # ^ErrorDecompressing มีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¸„ลายข้อมูล! เà¸à¸´à¸”ข้อผิดพลาดจาà¸à¸•ัวติดตั้ง? # ^ErrorRegistering มีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¸¥à¸‡à¸—ะเบียน DLL # ^ExecShell "รันเชลล์ไฟล์: " # ^Exec "รันไฟล์: " # ^Extract "à¹à¸•à¸à¹„ฟล์: " # ^ErrorWriting "à¹à¸•à¸à¹„ฟล์: เà¸à¸´à¸”ปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¹€à¸‚ียนไฟล์" # ^InvalidOpcode ตัวติดตั้งมีปัà¸à¸«à¸²: รหัส opcode ผิดพลาด # ^NoOLE "ไม่มี OLE สำหรับ: " # ^OutputFolder "à¹à¸Ÿà¹‰à¸¡à¸—ีติดตั้ง: " # ^RemoveFolder "ลบà¹à¸Ÿà¹‰à¸¡: " # ^RenameOnReboot "เปลี่ยนชื่อตอนรีบูท: " # ^Rename "เปลี่ยนชื่อ: " # ^Skipped "ข้าม: " # ^CopyDetails คัดลอà¸à¸£à¸²à¸¢à¸¥à¸°à¹€à¸­à¸µà¸¢à¸”ลงคลิปบอร์ด # ^LogInstall บันทึà¸à¸à¸²à¸£à¸•ิดตั้ง # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Thai.nsh000077500000000000000000000307061477201124000202260ustar00rootroot00000000000000;Language: Thai (1054) ;By SoKoOLz, TuW@nNu (asdfuae) !insertmacro LANGFILE "Thai" = "ไทย" /* TODO: ISO 11940? */ "Thai" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ยินดีต้อนรับเข้าสู่à¸à¸²à¸£à¸•ิดตั้งโปรà¹à¸à¸£à¸¡ $(^NameDA) " ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ตัวติดตั้งอัติโนมัติจะนำคุณไปสู่à¸à¸²à¸£à¸•ิดตั้งของ $(^NameDA).$\r$\n$\r$\nเราขอà¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¸›à¸´à¸”โปรà¹à¸à¸£à¸¡à¸­à¸·à¹ˆà¸™à¹†à¹ƒà¸«à¹‰à¸«à¸¡à¸”à¸à¹ˆà¸­à¸™à¸—ี่จะเริ่มติดตั้ง, นี่จะเป็นà¸à¸²à¸£à¸­à¸±à¸›à¹€à¸”ทไฟล์ได้ง่ายขึ้นโดยคุณไม่จำเป็นต้องทำà¸à¸²à¸£à¸£à¸µà¸šà¸¹à¸—คอมพิวเตอร์ของคุณ$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ยินดีต้อนรับสู่à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งอัติโนมัติของ $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ตัวติดตั้งอัติโนมัตินี้จะนำคุณไปสู่à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งของ $(^NameDA).$\r$\n$\r$\nà¸à¸²à¸£à¸ˆà¸°à¹€à¸£à¸´à¹ˆà¸¡à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งนี้, โปรดตรวจสอบว่า $(^NameDA) ไม่ได้ใช้อยู่$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "ข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธิ์" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "โปรดอ่านทวนลิขสิทธิ์ในหัวข้อต่างๆอีà¸à¸„รั้งà¸à¹ˆà¸­à¸™à¸—ี่คุณจะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธิ์, à¸à¸” ฉันยอมรับ เพื่อทำต่อไป, คุณต้องยอมรับในข้อตà¸à¸¥à¸‡à¸¥à¸´à¸‚สิทธิ์เพื่อที่จะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธ, à¸à¸”เลือà¸à¹ƒà¸™à¸à¸¥à¹ˆà¸­à¸‡à¸‚้างล่างนี้ คุณต้องยอมรับในข้อตà¸à¸¥à¸‡à¸¥à¸´à¸‚สิทธิ์เพื่อที่จะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธ, เลือà¸à¸•ัวเลือà¸à¹à¸£à¸à¸”้านล่างนี้ คุณต้องยอมรับในข้อตà¸à¸¥à¸‡à¸¥à¸´à¸‚สิทธิ์เพื่อที่จะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "ข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธิ์" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "à¸à¸£à¸¸à¸“าอ่านข้อตà¸à¸¥à¸‡à¸”้านลิขสิทธิ์à¸à¹ˆà¸­à¸™à¸•ิดตั้งโปรà¹à¸à¸£à¸¡ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ถ้าคุณยอมรับในข้อตà¸à¸¥à¸‡à¸™à¸µà¹‰ à¸à¸£à¸¸à¸“าà¸à¸”ปุ่ม ฉันยอมรับ à¹à¸¥à¸°à¸„ุณจะต้องตà¸à¸¥à¸‡à¸à¹ˆà¸­à¸™à¸—ี่จะเริ่มà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸•ิดตั้งโปรà¹à¸à¸£à¸¡ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธิ์, à¸à¸”เลือà¸à¹ƒà¸™à¸à¸¥à¹ˆà¸­à¸‡à¸‚้างล่างนี้ คุณต้องยอมรับในข้อตà¸à¸¥à¸‡à¸¥à¸´à¸‚สิทธิ์เพื่อที่จะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ถ้าคุณยอมรับข้อตà¸à¸¥à¸‡à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¥à¸´à¸‚สิทธิ์, เลือà¸à¸•ัวเลือà¸à¹à¸£à¸à¸”้านล่างนี้ คุณต้องยอมรับในข้อตà¸à¸¥à¸‡à¸¥à¸´à¸‚สิทธิ์เพื่อที่จะทำà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "à¸à¸” Page Down เพื่ออ่านข้อตà¸à¸¥à¸‡à¸—ั้งหมด" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "เลือà¸à¸ªà¹ˆà¸§à¸™à¸›à¸£à¸°à¸à¸­à¸š" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "เลือà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่คุณต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ˆà¸²à¸ $(^NameDA) ที่คุณต้องà¸à¸²à¸£à¸•ิดตั้ง" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "เลือà¸à¸ªà¹ˆà¸§à¸™à¸›à¸£à¸°à¸à¸­à¸š" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "เลือà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่คุณต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ˆà¸²à¸ $(^NameDA) ที่คุณต้องยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "รายละเอียด" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ขยับเมาส์ของคุณเหนือส่วนประà¸à¸­à¸šà¹€à¸žà¸·à¹ˆà¸­à¸”ูรายละเอียด" !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "เลือà¸à¸ªà¹ˆà¸§à¸™à¸›à¸£à¸°à¸à¸­à¸šà¸—ี่คุณต้องà¸à¸²à¸£à¸”ูรายละเอียด" !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "เลือà¸à¸—ี่ที่ต้องà¸à¸²à¸£à¸•ิดตั้ง" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "เลือà¸à¹à¸œà¹‰à¸¡à¸—ี่ต้องà¸à¸²à¸£à¸•ิดตั้ง $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "เลือà¸à¹à¸Ÿà¹‰à¸¡à¸—ี่ต้องà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "เลือà¸à¹à¸Ÿà¹‰à¸¡à¸—ี่คุณต้องà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งของ $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "à¸à¸³à¸¥à¸±à¸‡à¸•ิดตั้ง" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "โปรดรอในขณะที่ $(^NameDA) à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¸•ิดตั้ง" ${LangFileString} MUI_TEXT_FINISH_TITLE "à¸à¸²à¸£à¸•ิดตั้งเสร็จสิ้น" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "à¸à¸²à¸£à¸•ิดตั้งเสร็จสมบูรณ์" ${LangFileString} MUI_TEXT_ABORT_TITLE "à¸à¸²à¸£à¸•ิดตั้งถูà¸à¸¢à¸à¹€à¸¥à¸´à¸" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "à¸à¸²à¸£à¸•ิดตั้งไม่เสร็จสมบูรณ์" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "à¸à¸³à¸¥à¸±à¸‡à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "โปรดรอในขณะที่ $(^NameDA) à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งเสร็จสิ้น" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งเสร็จสิ้นโดยสมบูรณ์" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งถูà¸à¸¢à¸à¹€à¸¥à¸´à¸" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งไม่สำเร็จ" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "à¸à¸²à¸£à¸•ิดตั้งอัติโนมัติของ $(^NameDA) à¸à¸³à¸¥à¸±à¸‡à¹€à¸ªà¸£à¹‡à¸ˆà¸ªà¸´à¹‰à¸™" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ได้ถูà¸à¸•ิดตั้งลงในเครื่องคอมพิวเตอร์ของคุณà¹à¸¥à¹‰à¸§$\r$\n$\r$\nà¸à¸” เสร็จสิ้นเพื่อปิดตัวติดตั้งอัติโนมัติ" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "เครื่องคอมพิวเตอร์ของคุณจำเป็นต้องรีสตารท์เพื่อà¸à¸²à¸£à¸•ิดตั้งของ $(^NameDA) จะเรียบร้อย, คุณต้องà¸à¸²à¸£à¸ˆà¸° รีบูท เดี๋ยวนี้ไหม?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งอัติโนมัติของ $(^NameDA) à¸à¸³à¸¥à¸±à¸‡à¹€à¸ªà¸£à¹‡à¸ˆà¸ªà¸¡à¸šà¸¹à¸£à¸“์" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ได้ถูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¸­à¸­à¸à¸ˆà¸²à¸à¹€à¸„รื่องคอมพิวเตอร์ของคุณà¹à¸¥à¹‰à¸§ $\r$\n$\r$\nà¸à¸” เสร็จสิ้น เพื่อปิดหน้าจอติดตั้งอัติโนมัติ" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "เครื่องคอมพิวเตอร์ของคุณจำเป็นต้องรีสตาร์ทในà¸à¸²à¸£à¸—ี่จะทำà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งของ $(^NameDA) เสร็จสิ้น, คุณต้องà¸à¸²à¸£à¸ˆà¸°à¸£à¸µà¸šà¸¹à¸—เดี๋ยวนี้ไหม?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "รีบูท เดี๋ยวนี้" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ฉันต้องà¸à¸²à¸£ รีบูทด้วยตนเอง ทีหลัง" ${LangFileString} MUI_TEXT_FINISH_RUN "&รัน $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&à¹à¸ªà¸”งรายละเอียด" ${LangFileString} MUI_BUTTONTEXT_FINISH "&เสร็จสิ้น" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "เลือà¸à¹à¸Ÿà¹‰à¸¡ Start Menu" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "เลือà¸à¹à¸Ÿà¹‰à¸¡ Start Menu เพื่อสร้างชอร์ตคัทของ $(^NameDA). " ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "เลือà¸à¹à¸œà¹‰à¸¡ Start Menu ที่คุณต้องà¸à¸²à¸£à¸ˆà¸°à¸ªà¸£à¹‰à¸²à¸‡à¸Šà¸­à¸£à¹Œà¸•คัทของโปรà¹à¸à¸£à¸¡, คุณยังสามารถà¸à¸³à¸«à¸™à¸”ชื่อเพื่อสร้างà¹à¸Ÿà¹‰à¸¡à¹ƒà¸«à¸¡à¹ˆà¹„ด้อีà¸à¸”้วย" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ไม่ต้องสร้าง ชอร์ตคัท" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้ง $(^NameDA) จาà¸à¹€à¸„รื่องคอมพิวเตอร์ของคุณ" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸„ุณต้องà¸à¸²à¸£à¸ˆà¸°à¸­à¸­à¸à¸ˆà¸²à¸à¸à¸²à¸£à¸•ิดตั้งของ $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸„ุณต้องà¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ิดตั้งของ $(^Name)?" !endif nsis-3.11/Contrib/Language files/TradChinese.nlf000077500000000000000000000117241477201124000215200ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1028 # Font and size - dash (-) means default å­—åž‹åç¨±èˆ‡å¤§å° æ–°ç´°æ˜Žé«” 9 # Codepage - dash (-) means ASCII code page ASCII å­—ç¢¼é  950 # RTL - anything else than RTL means LTR ç”±å³è‡³å·¦æ›¸å¯« - # Revision date: 2017-03-17 # Translators: ## Kii Ali , , ## Walter Cheuk # # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) å®‰è£ # ^UninstallCaption $(^Name) è§£é™¤å®‰è£ # ^LicenseSubCaption : 授權å”è­° # ^ComponentsSubCaption : 安è£é¸é … # ^DirSubCaption : 安è£è³‡æ–™å¤¾ # ^InstallingSubCaption : æ­£åœ¨å®‰è£ # ^CompletedSubCaption : å·²å®Œæˆ # ^UnComponentsSubCaption : 解除安è£é¸é … # ^UnDirSubCaption : 解除安è£è³‡æ–™å¤¾ # ^ConfirmSubCaption : ç¢ºèª # ^UninstallingSubCaption : æ­£åœ¨è§£é™¤å®‰è£ # ^UnCompletedSubCaption : å®Œæˆ # ^BackBtn < 上一步(&B) # ^NextBtn 下一步(&N) > # ^AgreeBtn æˆ‘åŒæ„(&A) # ^AcceptBtn 我接å—「授權å”è­°ã€çš„æ¢æ¬¾(&A) # ^DontAcceptBtn æˆ‘ä¸æŽ¥å—「授權å”è­°ã€çš„æ¢æ¬¾(&D) # ^InstallBtn 安è£(&I) # ^UninstallBtn 解除安è£(&U) # ^CancelBtn å–æ¶ˆ # ^CloseBtn 關閉(&C) # ^BrowseBtn ç€è¦½(&R)... # ^ShowDetailsBtn 顯示細節(&D) # ^ClickNext 按「下一步(N)ã€ç¹¼çºŒã€‚ # ^ClickInstall 按「安è£(I)ã€é–‹å§‹å®‰è£ã€‚ # ^ClickUninstall 按「解除安è£(U)ã€é–‹å§‹è§£é™¤å®‰è£ã€‚ # ^Name å稱 # ^Completed å·²å®Œæˆ # ^LicenseText åœ¨å®‰è£ $(^NameDA) 之å‰è«‹æª¢é–±æŽˆæ¬Šå”議。如果接å—å”è­°æ‰€æœ‰æ¢æ¬¾ï¼ŒæŒ‰ã€Œæˆ‘åŒæ„(A)ã€ã€‚ # ^LicenseTextCB åœ¨å®‰è£ $(^NameDA) 之å‰è«‹æª¢é–±æŽˆæ¬Šå”議。如果接å—å”è­°æ‰€æœ‰æ¢æ¬¾ï¼ŒæŒ‰ä¸‹æ–¹çš„勾鏿¡†ã€‚ $_CLICK # ^LicenseTextRB åœ¨å®‰è£ $(^NameDA) 之å‰è«‹æª¢é–±æŽˆæ¬Šå”議。如果接å—å”è­°æ‰€æœ‰æ¢æ¬¾ï¼Œé¸æ“‡ä¸‹æ–¹çš„第一個é¸é …。 $_CLICK # ^UnLicenseText åœ¨è§£é™¤å®‰è£ $(^NameDA) 之å‰è«‹æª¢é–±æŽˆæ¬Šå”議。如果接å—å”è­°ä¸­æ‰€æœ‰æ¢æ¬¾ï¼ŒæŒ‰ã€Œæˆ‘åŒæ„(A)ã€ã€‚ # ^UnLicenseTextCB åœ¨è§£é™¤å®‰è£ $(^NameDA) 之å‰è«‹æª¢é–±æŽˆæ¬Šå”議。如果接å—å”è­°ä¸­æ‰€æœ‰æ¢æ¬¾ï¼ŒæŒ‰ä¸‹æ–¹çš„勾鏿¡†ã€‚ $_CLICK # ^UnLicenseTextRB åœ¨è§£é™¤å®‰è£ $(^NameDA) 之å‰è«‹æª¢é–±æŽˆæ¬Šå”議。如果接å—å”è­°ä¸­æ‰€æœ‰æ¢æ¬¾ï¼Œé¸æ“‡çš„第一個é¸é …。 $_CLICK # ^Custom 自訂 # ^ComponentsText 勾鏿ƒ³è¦å®‰è£çš„元件,並解除勾é¸ä¸æƒ³å®‰è£çš„元件。 $_CLICK # ^ComponentsSubText1 é¸å–安è£çš„類型: # ^ComponentsSubText2_NoInstTypes é¸å–安è£çš„元件: # ^ComponentsSubText2 åˆæˆ–者,自訂é¸å–想安è£çš„å…ƒä»¶: # ^UnComponentsText 勾鏿ƒ³è¦è§£é™¤å®‰è£çš„元件,並解除勾é¸ä¸æƒ³è§£é™¤å®‰è£çš„元件。 $_CLICK # ^UnComponentsSubText1 é¸å–解除安è£çš„類型: # ^UnComponentsSubText2_NoInstTypes é¸å–è¦è§£é™¤å®‰è£çš„元件: # ^UnComponentsSubText2 åˆæˆ–è€…ï¼Œé¸æ“‡æƒ³è¦è§£é™¤å®‰è£çš„å¯é¸é …元件: # ^DirText 安è£ç¨‹å¼æœƒå°‡ $(^NameDA) 安è£åœ¨ä»¥ä¸‹è³‡æ–™å¤¾ã€‚è¦å®‰è£åˆ°ä¸åŒçš„資料夾,按「ç€è¦½(B)...ã€ä¸¦é¸æ“‡å…¶ä»–資料夾。 $_CLICK # ^DirSubText 目標資料夾 # ^DirBrowseText é¸å–è¦å®‰è£ $(^NameDA) 的資料夾: # ^UnDirText 安è£ç¨‹å¼æœƒè‡ªä»¥ä¸‹è³‡æ–™å¤¾è§£é™¤å®‰è£ $(^NameDA) 。è¦è§£é™¤å®‰è£ä¸åŒçš„資料夾,按「ç€è¦½(B)...ã€ä¸¦é¸æ“‡å…¶ä»–資料夾。 $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText é¸å–è¦è§£é™¤å®‰è£ $(^NameDA) 的資料夾: # ^SpaceAvailable "å¯ç”¨ç©ºé–“: " # ^SpaceRequired "所需空間: " # ^UninstallingText æœƒè‡ªä»¥ä¸‹è³‡æ–™å¤¾è§£é™¤å®‰è£ $(^NameDA) 。 $_CLICK # ^UninstallingSubText 解除安è£ç›®éŒ„: # ^FileError 無法開啟è¦å¯«å…¥çš„æª”案: \r\n\t"$0"\r\n按「中止ã€åœæ­¢å®‰è£ï¼Œ\r\n「é‡è©¦ã€é‡æ–°å˜—試寫入檔案,或\r\n「忽略ã€ç•¥éŽæ­¤æª”案。 # ^FileError_NoIgnore 無法開啟è¦å¯«å…¥çš„æª”案: \r\n\t"$0"\r\n按「é‡è©¦ã€é‡æ–°å˜—試寫入檔案,或\r\nã€Œå–æ¶ˆã€åœæ­¢å®‰è£ã€‚ # ^CantWrite "無法寫入: " # ^CopyFailed "複製失敗 " # ^CopyTo "複製到: " # ^Registering "正在註冊: " # ^Unregistering "正在解除註冊: " # ^SymbolNotFound "無法找到符號: " # ^CouldNotLoad "無法載入: " # ^CreateFolder "建立資料夾: " # ^CreateShortcut "建立æ·å¾‘: " # ^CreatedUninstaller "建立解除安è£ç¨‹å¼: " # ^Delete "刪除檔案: " # ^DeleteOnReboot "釿–°é–‹æ©Ÿå¾Œåˆªé™¤: " # ^ErrorCreatingShortcut "建立æ·å¾‘時發生錯誤: " # ^ErrorCreating "建立時發生錯誤: " # ^ErrorDecompressing "解壓縮資料發生錯誤ï¼å®‰è£ç¨‹å¼æ˜¯å¦å·²æå£žï¼Ÿ" # ^ErrorRegistering "註冊 DLL 時發生錯誤" # ^ExecShell "執行殼層程å¼: " # ^Exec "執行: " # ^Extract "抽å–: " # ^ErrorWriting "抽å–: 無法寫入檔案 " # ^InvalidOpcode "安è£ç¨‹å¼ææ¯€: 無效的作業代碼 " # ^NoOLE "沒有 OLE 用於: " # ^OutputFolder "輸出資料夾: " # ^RemoveFolder "移除資料夾: " # ^RenameOnReboot "釿–°é–‹æ©Ÿå¾Œé‡æ–°å‘½å: " # ^Rename "釿–°å‘½å: " # ^Skipped "已略éŽ: " # ^CopyDetails "複製細節到剪貼簿 " # ^LogInstall "將安è£é€²ç¨‹è¨˜å…¥æ—¥èªŒ" # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/TradChinese.nsh000077500000000000000000000167421477201124000215360ustar00rootroot00000000000000;Language: 'Chinese (Traditional)' (1028) ;Translator: Kii Ali , , ;Translator: Walter Cheuk ;Revision date: 2017-03-17 !insertmacro LANGFILE "TradChinese" "Chinese (Traditional)" "中文(ç¹é«”)" "Hanyu (Fantizi)" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "歡迎使用 $(^NameDA) 安è£ç²¾éˆ" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "æœ¬ç²¾éˆæœƒå¼•導您完æˆå®‰è£ $(^NameDA)。$\r$\n$\r$\n在開始安è£ä¹‹å‰ï¼Œå»ºè­°å…ˆé—œé–‰å…¶ä»–所有應用程å¼ã€‚這將å…許安è£ç¨‹å¼æ›´æ–°ç›¸é—œçš„系統檔案,而ä¸éœ€è¦é‡æ–°å•Ÿå‹•電腦。$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "歡迎使用 $(^NameDA) 解除安è£ç²¾éˆ" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "æœ¬ç²¾éˆæœƒå¼•å°Žæ‚¨è§£é™¤å®‰è£ $(^NameDA)。$\r$\n$\r$\n在開始解除安è£ä¹‹å‰ï¼Œè«‹ç¢ºèª $(^NameDA) 並未有執行。$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "授權å”è­°" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "åœ¨å®‰è£ $(^NameDA) 之å‰ï¼Œè«‹æª¢é–±æŽˆæ¬Šæ¢æ¬¾ã€‚" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "如果接å—å”è­°çš„æ¢æ¬¾ï¼ŒæŒ‰ [æˆ‘åŒæ„(A)] 繼續安è£ã€‚å¿…é ˆè¦æŽ¥å—å”è­°æ‰èƒ½å®‰è£ $(^NameDA) 。" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果接å—å”è­°çš„æ¢æ¬¾ï¼ŒæŒ‰ä¸‹æ–¹çš„勾鏿¡†ã€‚å¿…é ˆè¦æŽ¥å—å”è­°æ‰èƒ½å®‰è£ $(^NameDA)。$_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果接å—å”è­°ä¸­çš„æ¢æ¬¾ï¼Œé¸æ“‡ä¸‹æ–¹ç¬¬ä¸€å€‹é¸é …ã€‚å¿…é ˆè¦æŽ¥å—å”è­°æ‰èƒ½å®‰è£ $(^NameDA)。$_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "授權å”è­°" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "åœ¨è§£é™¤å®‰è£ $(^NameDA) 之å‰ï¼Œè«‹æª¢é–±æŽˆæ¬Šæ¢æ¬¾ã€‚" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "如果接å—å”è­°çš„æ¢æ¬¾ï¼ŒæŒ‰ [æˆ‘åŒæ„(A)] 繼續解除安è£ã€‚如果é¸å– [å–æ¶ˆ] ,安è£ç¨‹å¼æœƒé—œé–‰ã€‚å¿…é ˆè¦æŽ¥å—å”è­°æ‰èƒ½è§£é™¤å®‰è£ $(^NameDA) 。" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果接å—å”è­°çš„æ¢æ¬¾ï¼ŒæŒ‰ä¸‹æ–¹çš„勾鏿¡†ã€‚å¿…é ˆè¦æŽ¥å—å”è­°æ‰èƒ½è§£é™¤å®‰è£ $(^NameDA)。$_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果接å—å”è­°çš„æ¢æ¬¾ï¼Œé¸æ“‡ä¸‹æ–¹ç¬¬ä¸€å€‹é¸é …ã€‚å¿…é ˆè¦æŽ¥å—å”è­°æ‰èƒ½è§£é™¤å®‰è£ $(^NameDA)。$_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "檢閱å”議的其餘部分,按 [PgDn] 往下æ²å‹•é é¢ã€‚" !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "鏿“‡å…ƒä»¶" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "鏿“‡æƒ³è¦å®‰è£ $(^NameDA) 的功能。" !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "é¸å–元件" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "é¸å– $(^NameDA) 當中想è¦è§£é™¤çš„功能。" !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "說明" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "å°‡æ»‘é¼ æŒ‡æ¨™åœæ‡¸åˆ°å…ƒä»¶ä¹‹ä¸Šï¼Œå³å¯è¦‹åˆ°å…¶èªªæ˜Žã€‚" !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "é¸å–元件,å³å¯è¦‹åˆ°å…¶èªªæ˜Žã€‚" !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "é¸å–安è£ä½ç½®" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "é¸å– $(^NameDA) è¦å®‰è£çš„資料夾。" !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "é¸å–解除安è£ä½ç½®" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "é¸å– $(^NameDA) è¦è§£é™¤å®‰è£çš„資料夾。" !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "安è£" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) 正在安è£ï¼Œè«‹ç¨å€™ã€‚" ${LangFileString} MUI_TEXT_FINISH_TITLE "完æˆå®‰è£" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "安è£å·²å®Œæˆã€‚" ${LangFileString} MUI_TEXT_ABORT_TITLE "已中止安è£" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "安è£ä¸¦æœªå®Œæˆã€‚" !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "解除安è£" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) 正在解除安è£ï¼Œè«‹ç¨å€™ã€‚" ${LangFileString} MUI_UNTEXT_FINISH_TITLE "完æˆè§£é™¤å®‰è£" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "解除安è£å·²å®Œæˆã€‚" ${LangFileString} MUI_UNTEXT_ABORT_TITLE "已中止解除安è£" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "解除安è£ä¸¦æœªå®Œæˆã€‚" !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "å³å°‡å®Œæˆå®‰è£ $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "å·²åœ¨é›»è…¦å®‰è£ $(^NameDA) 。$\r$\n按 [完æˆ(F)] 關閉安è£ç¨‹å¼ã€‚" ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "電腦需è¦é‡æ–°é–‹æ©Ÿï¼Œæ‰èƒ½å®Œæˆå®‰è£ $(^NameDA) 。è¦é¦¬ä¸Šé‡æ–°é–‹æ©Ÿå—Žï¼Ÿ" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "å³å°‡å®Œæˆè§£é™¤å®‰è£ $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "å·²è‡ªé›»è…¦è§£é™¤å®‰è£ $(^NameDA) 。$\r$\n$\r$\n按 [完æˆ(F)] 關閉安è£ç¨‹å¼ã€‚" ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "電腦需è¦é‡æ–°é–‹æ©Ÿï¼Œæ‰èƒ½å®Œæˆè§£é™¤å®‰è£ $(^NameDA) 。è¦é¦¬ä¸Šé‡æ–°é–‹æ©Ÿå—Žï¼Ÿ" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "æ˜¯ï¼Œé¦¬ä¸Šé‡æ–°é–‹æ©Ÿ(&Y)" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "å¦ï¼Œæˆ‘ç¨å¾Œå†è‡ªè¡Œé‡æ–°é–‹æ©Ÿ(&N)" ${LangFileString} MUI_TEXT_FINISH_RUN "執行 $(^NameDA)(&R)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "顯示「讀我檔案ã€(&S)" ${LangFileString} MUI_BUTTONTEXT_FINISH "完æˆ(&F)" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "鏿“‡ã€Œé–‹å§‹åŠŸèƒ½è¡¨ã€è³‡æ–™å¤¾" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "鏿“‡ã€Œé–‹å§‹åŠŸèƒ½è¡¨ã€è³‡æ–™å¤¾ï¼Œç”¨æ–¼ç¨‹å¼çš„æ·å¾‘ã€‚" ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "鏿“‡ã€Œé–‹å§‹åŠŸèƒ½è¡¨ã€è³‡æ–™å¤¾ï¼Œä»¥ä¾¿å»ºç«‹ç¨‹å¼çš„æ·å¾‘ã€‚ä½ ä¹Ÿå¯ä»¥è¼¸å…¥å稱,建立新資料夾。" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ä¸è¦å»ºç«‹æ·å¾‘(&N)" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "è§£é™¤å®‰è£ $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "è‡ªé›»è…¦è§£é™¤å®‰è£ $(^NameDA) 。" !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "確定è¦çµæŸ $(^Name) 的安è£ç¨‹å¼å—Žï¼Ÿ" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "確定è¦çµæŸ $(^Name) 的解除安è£ç¨‹å¼å—Žï¼Ÿ" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "鏿“‡ä½¿ç”¨è€…" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "鏿“‡è¦å°‡ $(^NameDA) 安è£çµ¦å“ªä½ä½¿ç”¨è€…。" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "鏿“‡åƒ…å°‡ $(^NameDA) 安è£çµ¦è‡ªå·±ä½¿ç”¨ï¼Œé‚„是此電腦的所有使用者皆å¯ä½¿ç”¨ã€‚ $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "安è£çµ¦æ­¤é›»è…¦çš„æ‰€æœ‰ä½¿ç”¨è€…" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "僅安è£çµ¦è‡ªå·±" !endif nsis-3.11/Contrib/Language files/Turkish.nlf000077500000000000000000000131571477201124000207620ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1055 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1254 # RTL - anything else than RTL means LTR - # Translation by ?atay Dilsiz(chagy) (amigos_cagi@hotmail.com) # Corrections by Mozilla Türkiye YerelleÅŸtirme TopluluÄŸu tarafından çevrilmiÅŸtir. http://mozilla.org.tr # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Kurulumu # ^UninstallCaption $(^Name) Kaldırma # ^LicenseSubCaption : Lisans SözleÅŸmesi # ^ComponentsSubCaption : Kurulum Seçenekleri # ^DirSubCaption : Kurulum Dizini # ^InstallingSubCaption : Kuruluyor # ^CompletedSubCaption : Tamamlandı # ^UnComponentsSubCaption : Kaldırma Seçenekleri # ^UnDirSubCaption : Kaldırılacak Dizin # ^ConfirmSubCaption : Onay # ^UninstallingSubCaption : Kaldırılıyor # ^UnCompletedSubCaption : Tamamlandı # ^BackBtn < &Geri # ^NextBtn İ&leri > # ^AgreeBtn &Katılıyorum # ^AcceptBtn Lisans SözleÅŸmesi'nin koÅŸullarını &kabul ediyorum # ^DontAcceptBtn Lisans SözleÅŸmesi'nin koÅŸullarını kabul et&miyorum # ^InstallBtn &Kur # ^UninstallBtn &Kaldır # ^CancelBtn Vazgeç # ^CloseBtn &Kapat # ^BrowseBtn &Gözat... # ^ShowDetailsBtn &Ayrıntıları göster # ^ClickNext Devam etmek için İleri düğmesine basın. # ^ClickInstall Kurulumu baÅŸlatmak için Kur düğmesine basın. # ^ClickUninstall Kaldırmayı baÅŸlatmak için Kaldır düğmesine basın. # ^Name Ad # ^Completed Tamamlandı # ^LicenseText Lütfen $(^NameDA) uygulamasını kurmadan önce lisans sözleÅŸmesini gözden geçirin. SözleÅŸmedeki bütün koÅŸulları kabul ediyorsanız Kabul Ediyorum düğmesine basın. # ^LicenseTextCB Lütfen $(^NameDA) uygulamasını kurmadan önce lisans sözleÅŸmesini gözden geçirin. SözleÅŸmedeki bütün koÅŸulları kabul ediyorsanız aÅŸağıdaki kutuya iÅŸaret koyun. $_CLICK # ^LicenseTextRB Lütfen $(^NameDA) uygulamasını kurmadan önce lisans sözleÅŸmesini gözden geçirin. SözleÅŸmedeki bütün koÅŸulları kabul ediyorsanız aÅŸağıdaki ilk seçeneÄŸi seçin. $_CLICK # ^UnLicenseText Lütfen $(^NameDA) uygulamasını kaldırmadan önce lisans sözleÅŸmesini gözden geçirin. SözleÅŸmedeki bütün koÅŸulları kabul ediyorsanız Kabul Ediyorum düğmesine basın. # ^UnLicenseTextCB Lütfen $(^NameDA) uygulamasını kaldırmadan önce lisans sözleÅŸmesini gözden geçirin. SözleÅŸmedeki bütün koÅŸulları kabul ediyorsanız aÅŸağıdaki kutuya iÅŸaret koyun. $_CLICK # ^UnLicenseTextRB Lütfen $(^NameDA) uygulamasını kaldırmadan önce lisans sözleÅŸmesini gözden geçirin. SözleÅŸmedeki bütün koÅŸulları kabul ediyorsanız aÅŸağıdaki ilk seçeneÄŸi seçin. $_CLICK # ^Custom Özel # ^ComponentsText Kurmak istediÄŸiniz bileÅŸenleri iÅŸaretleyip kurmak istemediklerinizi iÅŸaretlemeden bırakın. $_CLICK # ^ComponentsSubText1 Kurulum türünü seçin: # ^ComponentsSubText2_NoInstTypes Kurulacak bileÅŸenleri seçin: # ^ComponentsSubText2 ya da isteÄŸe baÄŸlı olarak kurmak istediÄŸiniz bileÅŸenleri seçin: # ^UnComponentsText Kaldırmak istediÄŸiniz bileÅŸenleri iÅŸaretleyip kaldırmak istemediklerinizi iÅŸaretlemeden bırakın. $_CLICK # ^UnComponentsSubText1 Kaldırma türünü seçin: # ^UnComponentsSubText2_NoInstTypes Kaldırılacak bileÅŸenleri seçin: # ^UnComponentsSubText2 ya da isteÄŸe baÄŸlı olarak kaldırmak istediÄŸiniz bileÅŸenleri seçin: # ^DirText $(^NameDA) aÅŸağıdaki dizinde kurulacak. Farklı bir dizinde kurmak için Gözat düğmesine basıp baÅŸka bir dizin seçin. $_CLICK # ^DirSubText Hedef Dizin # ^DirBrowseText $(^NameDA) uygulamasının kurulacağı dizini seçin: # ^UnDirText $(^NameDA) aÅŸağıdaki dizinden kaldırılacak. Farklı bir dizinden kaldırmak için Gözat düğmesine basıp baÅŸka bir dizin seçin. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA) uygulamasının kaldırılacağı dizini seçin: # ^SpaceAvailable "Kullanılabilir boÅŸ alan: " # ^SpaceRequired "Gereken boÅŸ alan: " # ^UninstallingText $(^NameDA) aÅŸağıdaki dizinden kaldırılacak. $_CLICK # ^UninstallingSubText Kaldırılan yer: # ^FileError Dosya yazmak için açılırken hata meydana geldi: \r\n\r\n$0\r\n\r\nKurulumu durdurmak için Dur düğmesine,\r\nyeniden denemek için Yeniden Dene düğmesine,\r\nbu dosyayı atlamak için Yoksay düğmesine basın. # ^FileError_NoIgnore Dosya yazmak için açılırken hata meydana geldi: \r\n\r\n$0\r\n\r\nYeniden denemek için Yeniden Dene düğmesine,\r\nkurulumu durdurmak için Vazgeç düğmesine basın. # ^CantWrite "Yazılamadı: " # ^CopyFailed Kopyalama baÅŸarısız oldu # ^CopyTo "Kayıt: " # ^Registering "Kaydediliyor: " # ^Unregistering "Kayıt siliniyor: " # ^SymbolNotFound "Simge bulunamadı: " # ^CouldNotLoad "Yüklenemedi: " # ^CreateFolder "Dizin oluÅŸtur: " # ^CreateShortcut "Kısayol oluÅŸtur: " # ^CreatedUninstaller "Kaldırma uygulaması oluÅŸtur: " # ^Delete "Dosya sil: " # ^DeleteOnReboot "Açılışta sil: " # ^ErrorCreatingShortcut "Kısayol oluÅŸturulurken hata meydana geldi: " # ^ErrorCreating "OluÅŸturma hatası: " # ^ErrorDecompressing Veriyi açarken hata meydana geldi! Acaba kurulum uygulaması mı bozuk? # ^ErrorRegistering DLL kaydedilirken hata meydana geldi # ^ExecShell "ExecShell: " # ^Exec "Çalıştır: " # ^Extract "Aç: " # ^ErrorWriting "Açma: Dosyaya yazarken hata meydana geldi " # ^InvalidOpcode Kurulum bozuk: Geçersiz kod # ^NoOLE "OLE yok: " # ^OutputFolder "Çıktı dizini: " # ^RemoveFolder "Dizini sil: " # ^RenameOnReboot "Açılışta adını deÄŸiÅŸtir: " # ^Rename "Ad deÄŸiÅŸtir: " # ^Skipped "Atlandı: " # ^CopyDetails Ayrıntıları panoya kopyala # ^LogInstall Kurulum sürecinin kaydını tut # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Turkish.nsh000077500000000000000000000176111477201124000207720ustar00rootroot00000000000000;Language: Turkish (1055) ;By Çagatay Dilsiz(Chagy) ;Updated by Fatih BOY (fatih_boy@yahoo.com) !insertmacro LANGFILE "Turkish" = "Türkçe" "Turkce" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Kurulum sihirbazına hoÅŸ geldiniz" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bu sihirbaz size $(^NameDA) kurulumu boyunca rehberlik edecektir.$\r$\n$\r$\nKurulumu baÅŸlatmadan önce çalışan diÄŸer programlari kapatmanızı öneririz. Böylece bilgisayarınızı yeniden baÅŸlatmadan bazı sistem dosyaları sorunsuz kurulabilir.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Programını Kaldırma Sihirbazına HoÅŸ Geldiniz" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bu sihirbaz size $(^NameDA) programının kadırılımı boyunca rehberlik edecektir.$\r$\n$\r$\nKaldırım iÅŸlemeni baÅŸlatmadan önce çalışan diÄŸer programlari kapatmanızı öneririz. Böylece bilgisayarınızı yeniden baÅŸlatmadan bazı sistem dosyaları sorunsuz kaldırılabilir.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisans SözleÅŸmesi" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lütfen $(^NameDA) programını kurmadan önce sözleÅŸmeyi okuyunuz." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "SözleÅŸme koÅŸullarını kabul ediyorsanız, 'Kabul Ediyorum'a basınız. $(^NameDA) programını kurmak için sözleÅŸme koÅŸullarını kabul etmelisiniz." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "SözleÅŸme koÅŸullarını kabul ediyorsanız, aÅŸağıdaki onay kutusunu doldurunuz. $(^NameDA) programını kurmak için sözleÅŸme koÅŸullarını kabul etmelisiniz. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "SözleÅŸme koÅŸullarını kabul ediyorsanız, asagidaki onay düğmesini seçiniz. $(^NameDA) programını kurmak için sözleÅŸme koÅŸullarını kabul etmelisiniz. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisans SözleÅŸmesi" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lütfen $(^NameDA) programını sisteminizden kaldırmadan önce sözleÅŸmeyi okuyunuz." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "SözleÅŸme koÅŸullarını kabul ediyorsanız, 'Kabul Ediyorum'a basınız. $(^NameDA) programını sisteminizden kaldırmak için sözleÅŸme koÅŸullarını kabul etmelisiniz." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "SözleÅŸme koÅŸullarını kabul ediyorsanız, aÅŸağıdaki onay kutusunu doldurunuz. $(^NameDA) programını sisteminizden kaldırmak için sözleÅŸme koÅŸullarını kabul etmelisiniz. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "SözleÅŸme koÅŸullarını kabul ediyorsanız, asagidaki onay düğmesini seçiniz. $(^NameDA) programını sisteminizden kaldırmak için sözleÅŸme koÅŸullarını kabul etmelisiniz. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "SözleÅŸmenin geri kalanını okumak için 'page down' tuÅŸuna basabilirsiniz." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "BileÅŸen seçimi" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Lütfen $(^NameDA) için kurmak istediginiz bileÅŸenleri seçiniz." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "BileÅŸen Åžeçimi" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Lütfen kaldırmak istediÄŸiniz $(^NameDA) program bileÅŸenini seçiniz." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Açıklama" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "BileÅŸenlerin açıklamalarını görmek için imleci bileÅŸen üzerine götürün." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hedef dizini seçimi" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) programını kurmak istediÄŸiniz dizini ÅŸeçiniz." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kaldırılıcak Dizin Seçimi" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) programını kaldırmak istediginiz dizini seçiniz." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Kuruluyor" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Lütfen $(^NameDA) kurulurken bekleyiniz." ${LangFileString} MUI_TEXT_FINISH_TITLE "Kurulum Tamamlandı" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Kurulum baÅŸarıyla tamamlandı." ${LangFileString} MUI_TEXT_ABORT_TITLE "Kurulum İptal Edildi" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Kurulum tam olarak tamamlanmadı." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Kaldırılıyor" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Litfen $(^NameDA) programı sisteminizden kaldırılırken bekleyiniz." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Kaldırma İşlemi Tamamlandır" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Kaldırma iÅŸlemi baÅŸarıyla tamamlandı." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Kaldırma İşlemi İptal Edildi" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Kaldırma İşlemi tamamlanamadı." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) Kurulum sihirbazı tamamlanıyor." ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) bilgisayariniza yüklendi.$\r$\n$\r$\nLütfen 'Bitir'e basarak kurulumu sonlandırın." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) kurulumunun tamamlanması için bilgisayarınızı yeniden baÅŸlatmanız gerekiyor.Bilgisayarınızı yeniden baÅŸlatmak istiyor musunuz?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) Programı Kaldırma Sihirbazı Tamamlanıyor" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) programı sisteminizden kaldırıldı.$\r$\n$\r$\nSihirbazı kapatmak için 'bitir'e basınız." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) programını kaldırma iÅŸleminin tamamlanması için bilgisayarınızın yeniden baÅŸlatılması gerekiyor. Bilgisayarınızın ÅŸimdi yeniden baÅŸlatılmasını ister misiniz?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Yeniden baÅŸlat" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Bilgisayarımı daha sonra baÅŸlatacağım." ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) programını çalıştır" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "beni oku/readme dosyasını &göster" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Bitir" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "BaÅŸlat Menüsü Klasör Seçimi" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) kısayollarının konulacagı baÅŸlat menüsü klasörünü seçiniz." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Programın kısayollarının konulacağı baÅŸlat menüsü klasörünü seçiniz. Farklı bir isim girerek yeni bir klasör yaratabilirsiniz." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Kısayolları oluÅŸturmadan devam et" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) Programını Kaldır" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) programını sisteminizden kaldırma." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) kurulumundan çıkmak istediÄŸinize emin misiniz?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) Programi Kaldırma iÅŸleminden çıkmak istediÄŸinize emin misiniz?" !endif nsis-3.11/Contrib/Language files/Ukrainian.nlf000077500000000000000000000176111477201124000212510ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1058 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1251 # RTL - anything else than RTL means LTR - # Translation by Yuri Holubow, Nash-Soft.com, Dmitriy Kononchuk [gri3ly.kiev.ua], Osidach Vitaly and others # ^Branding СиÑтема вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Nullsoft %s # ^SetupCaption Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^Name) # ^UninstallCaption Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^Name) # ^LicenseSubCaption : Ліцензійна угода # ^ComponentsSubCaption : Опції вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ # ^DirSubCaption : Тека вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ # ^InstallingSubCaption : Триває вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ # ^CompletedSubCaption : Завершено # ^UnComponentsSubCaption : Опції Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ # ^UnDirSubCaption : Тека Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ # ^ConfirmSubCaption : ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ # ^UninstallingSubCaption : Триває Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ # ^UnCompletedSubCaption : Завершено # ^BackBtn < &Ðазад # ^NextBtn &Далі > # ^AgreeBtn &ПогоджуюÑÑ # ^AcceptBtn Я &приймаю умови Ліцензійної угоди # ^DontAcceptBtn Я &не приймаю умови Ліцензійної угоди # ^InstallBtn &Ð’Ñтановити # ^UninstallBtn &Видалити # ^CancelBtn СкаÑувати # ^CloseBtn &Закрити # ^BrowseBtn О&глÑд... # ^ShowDetailsBtn &Подробиці # ^ClickNext ÐатиÑніть «Далі» Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ. # ^ClickInstall ÐатиÑніть «ВÑтановити», щоб запуÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²ÑтановленнÑ. # ^ClickUninstall ÐатиÑніть «Видалити», щоб запуÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ. # ^Name Ðазва # ^Completed Завершено # ^LicenseText ОзнайомтеÑÑ Ð· ліцензійною угодою перед вÑтановленнÑм $(^NameDA). Якщо ви згодні з уÑіма умовами угоди, натиÑніть «ПогоджуюÑÑ». # ^LicenseTextCB ОзнайомтеÑÑ Ð· ліцензійною угодою перед вÑтановленнÑм $(^NameDA). Якщо ви приймаєте умови угоди, вÑтановіть прапорець нижче. $_CLICK # ^LicenseTextRB ОзнайомтеÑÑ Ð· ліцензійною угодою перед вÑтановленнÑм $(^NameDA). Якщо ви приймаєте умови угоди, оберіть перший варіант нижче. $_CLICK # ^UnLicenseText ОзнайомтеÑÑ Ð· ліцензійною угодою перед видаленнÑм $(^NameDA). Якщо ви згодні з уÑіма умовами угоди, натиÑніть «ПогоджуюÑÑ». # ^UnLicenseTextCB ОзнайомтеÑÑ Ð· ліцензійною угодою перед видаленнÑм $(^NameDA). Якщо ви приймаєте умови угоди, вÑтановіть прапорець нижче. $_CLICK # ^UnLicenseTextRB ОзнайомтеÑÑ Ð· ліцензійною угодою перед видаленнÑм $(^NameDA). Якщо ви приймаєте умови угоди, оберіть перший варіант нижче. $_CLICK # ^Custom ВлаÑний вибір # ^ComponentsText Позначте компоненти, Ñкі ви хочете вÑтановити, та приберіть позначки з непотрібних. $_CLICK # ^ComponentsSubText1 Виберіть тип вÑтановленнÑ: # ^ComponentsSubText2_NoInstTypes Виберіть компоненти Ð´Ð»Ñ Ð²ÑтановленнÑ: # ^ComponentsSubText2 Ðбо виберіть необов'Ñзкові компоненти, Ñкі ви бажаєте вÑтановити: # ^UnComponentsText Позначте компоненти, Ñкі ви хочете видалити, та приберіть позначки з тих, що потрібно залишити. $_CLICK # ^UnComponentsSubText1 Виберіть тип видаленнÑ: # ^UnComponentsSubText2_NoInstTypes Виберіть компоненти Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ: # ^UnComponentsSubText2 Ðбо виберіть необов'Ñзкові компоненти, Ñкі ви бажаєте видалити: # ^DirText Програму $(^NameDA) буде вÑтановлено в зазначену теку. Щоб вÑтановити в іншу теку, натиÑніть «ОглÑд» Ñ– вкажіть потрібну теку. $_CLICK # ^DirSubText Тека Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ # ^DirBrowseText Виберіть теку Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA): # ^UnDirText Програму $(^NameDA) буде видалено із зазначеної теки. Щоб виконати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· іншої теки, натиÑніть «ОглÑд» Ñ– вкажіть потрібну теку. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Виберіть теку, з Ñкої потрібно видалити $(^NameDA): # ^SpaceAvailable "ДоÑтупно міÑцÑ: " # ^SpaceRequired "Потрібно міÑцÑ: " # ^UninstallingText $(^NameDA) буде видалено з вказаної теки. $_CLICK # ^UninstallingSubText Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·: # ^FileError Помилка під Ñ‡Ð°Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу: \r\n\r\n$0\r\n\r\nÐатиÑніть «Перервати», щоб зупинити вÑтановленнÑ,\r\n«Повторити», щоб Ñпробувати знову, або\r\n«Ігнорувати», щоб пропуÑтити цей файл. # ^FileError_NoIgnore Помилка під Ñ‡Ð°Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу: \r\n\r\n$0\r\n\r\nÐатиÑніть «Повторити», щоб Ñпробувати знову, або\r\n«СкаÑувати», щоб зупинити вÑтановленнÑ. # ^CantWrite "Ðеможливо запиÑати: " # ^CopyFailed Ðе вдалоÑÑ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ # ^CopyTo "Копіювати до " # ^Registering "РеєÑтраціÑ: " # ^Unregistering "СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації: " # ^SymbolNotFound "Ðеможливо знайти Ñимвол: " # ^CouldNotLoad "Ðеможливо завантажити: " # ^CreateFolder "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÐ¸: " # ^CreateShortcut "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñрлика: " # ^CreatedUninstaller "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ видаленнÑ: " # ^Delete "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ: " # ^DeleteOnReboot "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ: " # ^ErrorCreatingShortcut "Помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñрлика: " # ^ErrorCreating "Помилка ÑтвореннÑ: " # ^ErrorDecompressing Помилка Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…! Можливо, пошкоджений файл вÑтановленнÑ. # ^ErrorRegistering Помилка реєÑтрації бібліотеки (DLL) # ^ExecShell "Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ оболонки: " # ^Exec "ВиконаннÑ: " # ^Extract "РозпакуваннÑ: " # ^ErrorWriting "РозпакуваннÑ: помилка запиÑу даних у файл " # ^InvalidOpcode Пошкоджений файл вÑтановленнÑ: неприпуÑтимий код відповіді # ^NoOLE "Ðемає OLE длÑ: " # ^OutputFolder "Тека призначеннÑ: " # ^RemoveFolder "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÐ¸: " # ^RenameOnReboot "Перейменувати піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ: " # ^Rename "ПерейменуваннÑ: " # ^Skipped "Пропущено: " # ^CopyDetails Копіювати подробиці до буфера обміну # ^LogInstall Зберегти журнал процеÑу вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ # ^Byte Б # ^Kilo К # ^Mega М # ^Giga Г nsis-3.11/Contrib/Language files/Ukrainian.nsh000077500000000000000000000237171477201124000212660ustar00rootroot00000000000000;Language: Ukrainian (1058) ;By Yuri Holubow, Nash-Soft.com ;Corrections by Osidach Vitaly (Vit_Os2) and others !insertmacro LANGFILE "Ukrainian" = "УкраїнÑька" "Ukrayins'ka" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ЛаÑкаво проÑимо до вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ð¦Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° допоможе вам вÑтановити $(^NameDA).$\r$\n$\r$\nРадимо закрити вÑÑ– інші програми, перш ніж почати вÑтановленнÑ. ЗавдÑки цьому будуть оновлені відповідні ÑиÑтемні файли без потреби перезапуÑкати комп’ютер.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ЛаÑкаво проÑимо до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ð¦Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° допоможе вам видалити $(^NameDA).$\r$\n$\r$\nПеред початком Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð¾Ð²â€™Ñзково закрийте $(^NameDA).$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ліцензійна угода" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ОзнайомтеÑÑ Ð· умовами ліцензійної угоди перед вÑтановленнÑм $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Якщо ви згодні з умовами угоди, натиÑніть кнопку «ПогоджуюÑÑ», щоб продовжити. Ви маєте погодитиÑÑ Ð· угодою Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Якщо ви згодні з умовами угоди, вÑтановіть позначку нижче. Ви маєте погодитиÑÑ Ð· угодою Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Якщо ви згодні з умовами угоди, виберіть перший варіант нижче. Ви маєте погодитиÑÑ Ð· угодою Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ліцензійна угода" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ОзнайомтеÑÑ Ð· умовами ліцензійної угоди перед видаленнÑм $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Якщо ви згодні з умовами угоди, натиÑніть «ПогоджуюÑÑ» Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ. Ви маєте погодитиÑÑ Ð· угодою Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Якщо ви згодні з умовами угоди, вÑтановіть позначку нижче. Ви маєте погодитиÑÑ Ð· угодою Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Якщо ви згодні з умовами угоди, виберіть перший варіант нижче. Ви маєте погодитиÑÑ Ð· угодою Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÐатиÑніть клавішу PageDown, щоб переглÑнути угоду далі." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Оберіть компоненти" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Оберіть, Ñкі компоненти $(^NameDA) ви хочете вÑтановити." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Оберіть компоненти" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Оберіть, Ñкі компоненти $(^NameDA) ви хочете видалити." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ОпиÑ" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ðаведіть мишу на компонент, щоб побачити його опиÑ." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Оберіть компонент, щоб побачити його опиÑ." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Оберіть теку вÑтановленнÑ" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Оберіть теку, в Ñку потрібно вÑтановити $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Оберіть теку видаленнÑ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Оберіть теку, з Ñкої потрібно видалити $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ð’ÑтановленнÑ" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Будь лаÑка, зачекайте поки триває вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA)." ${LangFileString} MUI_TEXT_FINISH_TITLE "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑƒÑпішно завершено." ${LangFileString} MUI_TEXT_ABORT_TITLE "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ було завершено." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ВидаленнÑ" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Будь лаÑка, зачекайте поки триває Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑƒÑпішно завершено." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½Ðµ було завершено." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) вÑтановлено на ваш комп’ютер.$\r$\n$\r$\nÐатиÑніть «Завершити» Ð´Ð»Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Щоб завершити вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^NameDA), потрібно перезапуÑтити комп’ютер. Хочете перезапуÑтити зараз?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) видалено з вашого комп’ютера.$\r$\n$\r$\nÐатиÑніть «Завершити» Ð´Ð»Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Щоб завершити Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA), потрібно перезапуÑтити комп’ютер. Хочете перезапуÑтити зараз?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ПерезапуÑтити" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Я хочу перезапуÑтити влаÑноруч згодом" ${LangFileString} MUI_TEXT_FINISH_RUN "&ЗапуÑтити $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Показати інформацію про програму" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Завершити" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Тека в меню ПуÑк" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Оберіть «Тека в меню ПуÑк» Ð´Ð»Ñ Ñрликів програми $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Оберіть теку в меню ПуÑк, в Ñкій ви бажаєте Ñтворити Ñрлики Ð´Ð»Ñ Ð²Ñтановленої програми. Можна також ввеÑти назву Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ— теки." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ðе Ñтворювати Ñрлики" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^NameDA) з вашого комп’ютера." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ви дійÑно хочете вийти з вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ви дійÑно хочете вийти з Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Оберіть кориÑтувачів" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Оберіть кориÑтувачів, Ð´Ð»Ñ Ñких потрібно вÑтановити $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Оберіть, чи хочете ви вÑтановити $(^NameDA) лише Ð´Ð»Ñ Ñебе, чи Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів цього комп’ютера. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Ð’Ñтановити Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів цього комп’ютера" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Ð’Ñтановити лише Ð´Ð»Ñ Ð¼ÐµÐ½Ðµ" !endifnsis-3.11/Contrib/Language files/Uzbek.nlf000077500000000000000000000125671477201124000204150ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 1091 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Emil Garipov [emil.garipov@gmail.com] # ^Branding Nullsoft Install System %s # ^SetupCaption O'rnatish $(^Name) # ^UninstallCaption O'chirish $(^Name) # ^LicenseSubCaption : Lisenzion kelishuv # ^ComponentsSubCaption : O'rnatish parametrlari # ^DirSubCaption : O'rnatish papkasi # ^InstallingSubCaption : Fayllarni kopiya qilish # ^CompletedSubCaption : Operatsiya yakunlandi # ^UnComponentsSubCaption : O'chirish parametrlari # ^UnDirSubCaption : O'chirsh papkasi # ^ConfirmSubCaption : Tasdiqlash # ^UninstallingSubCaption : Fayllarni o'chirish # ^UnCompletedSubCaption : Operatsiya yakunlandi # ^BackBtn < &Orqaga # ^NextBtn &Oldinga > # ^AgreeBtn &Qabul qilaman # ^AcceptBtn Men &kelishuv shartlarini qabul qilaman # ^DontAcceptBtn Men &kelishuv shartlarini qabul qilmayman # ^InstallBtn &O'rnatish # ^UninstallBtn &O'chirish # ^CancelBtn Bekor qilish # ^CloseBtn &Yopish # ^BrowseBtn &Ko'rish ... # ^ShowDetailsBtn &Äåòàëè... # ^ClickNext Davom etish uchun 'Oldinga'tugmachasini bosing. # ^ClickInstall Dasturni o'rnatish uchun'O'rnatish' tugmachasini bosing. # ^ClickUninstall Dasturni o'chirish uchun 'O'chirsh' tugmachasini bosing. # ^Name Ism # ^Completed Tayor # ^LicenseText $(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing. # ^LicenseTextCB $(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK # ^LicenseTextRB $(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK # ^UnLicenseText $(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing. # ^UnLicenseTextCB $(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK # ^UnLicenseTextRB $(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK # ^Custom Tanlash bo'icha # ^ComponentsText O'rnatish ucun dastur komponentlarini tanlang. $_CLICK # ^ComponentsSubText1 O'rnatish jarayonini tanlang: # ^ComponentsSubText2_NoInstTypes O'rnatish uchun dastur komponentlarini tanlang: # ^ComponentsSubText2 Yoki o'rnatish uchun qushimcha komponentlarini tanlang: # ^UnComponentsText O'chirish uchun dastur komponentlarini tanlang. $_CLICK # ^UnComponentsSubText1 O'chirish jarayonini tanlang: # ^UnComponentsSubText2_NoInstTypes O'chirish uchun dastur komponentlarini tanlang: # ^UnComponentsSubText2 Yoki o'chirish uchun qushimcha komponentlarini tanlang: # ^DirText Dastur $(^NameDA)ni ko'rsatilgan papkaga o'rnatadi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK # ^DirSubText O'rnatish papkasi # ^DirBrowseText O'rnatish papkasini ko'rsating $(^NameDA): # ^UnDirText Dastur $(^NameDA)ni ko'rsatilgan papkadan o'chiradi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText $(^NameDA)ni o'chirish uchun papkani ko'rsating: # ^SpaceAvailable "Diskda joriy qilingan: " # ^SpaceRequired "Diskda talab qilinadigan: " # ^UninstallingText $(^NameDA) dasturi kompyuterizdan uchiriladi. $_CLICK # ^UninstallingSubText O'chirilish: # ^FileError Yozish uchun faylni ochish imkoniyati yuq: \r\n\t"$0"\r\n'Tuxtashish': O'rnatishni tuxtatish;\r\n"Takrorlash":yana bir o'rinib ko'rish;\r\n"Taylab ketish": shu xarakatni taylab ketish. # ^FileError_NoIgnore Yozish uchun faylni ochish imkoniyati yuq: \r\n\t"$0"\r\n'Takrorlash': yana bir o'rinib ko'rish;\r\n'Bekor qilish': o'rnatish protsessini bekor qilish. # ^CantWrite "Yozish uchun imkoniyat yuq: " # ^CopyFailed Kopiya qilganda xato bor # ^CopyTo "Kopiya qilish " # ^Registering "Ro'yxatga olish: " # ^Unregistering "Ro'xatdan chiqish: " # ^SymbolNotFound "Simvolni topish imkoniyati yuq: " # ^CouldNotLoad "Zagruzka qilish imkoniyati yuq: " # ^CreateFolder "Papkani yaratish: " # ^CreateShortcut "Belgini yaratish: " # ^CreatedUninstaller "O'chirish dasturini yaratish: " # ^Delete "Faylni o'chirish: " # ^DeleteOnReboot "Kompyuter qayta yuklash jaraonida o'chirish: " # ^ErrorCreatingShortcut "Belgini yaratish jarayonida xato: " # ^ErrorCreating "Yaratish xatosi: " # ^ErrorDecompressing Ma'lumotlarni asilga qaytarish xatosi! Distributiv ziyonlangan bulishi mumkin. # ^ErrorRegistering Kutubxonani ro'xatga olish imkoniyati yuq (DLL) # ^ExecShell "Qoplang'ich komandasini bajarish: " # ^Exec "Bajarish: " # ^Extract "Ichidan olish: " # ^ErrorWriting "Ichidan olish: fayl yozish xatosi " # ^InvalidOpcode Distributiv ziyonlangan: ruxsatlanmangan kod # ^NoOLE "Quydagilarga OLE yuq: " # ^OutputFolder "Papkani o'rnatish: " # ^RemoveFolder "Papkani o'chirish: " # ^RenameOnReboot "Kompyuter qayta yuklanish jarayonida ismni qaita quyish: " # ^Rename "Ismni qayta quyish: " # ^Skipped "O'tkazib yuborish: " # ^CopyDetails Bufer obmenaga ma'lumotlarni kopiya qilish # ^LogInstall O'rnatish xisobotini chiqorish # byte áàéò # kilo Ê # mega ÃŒ # giga Ãnsis-3.11/Contrib/Language files/Uzbek.nsh000077500000000000000000000166641477201124000204300ustar00rootroot00000000000000;Language: Uzbek (1091) ;Translation updated by Emil Garipov [emil.garipov@gmail.com] !insertmacro LANGFILE "Uzbek" = "O‘zbek" "O'zbek" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Sizni o'rnatish dastur tabriklaydi $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bu dastur sizning komputeringizga $(^NameDA) dasturni o'rnatadi.$\r$\n$\r$\nO'rnatishdan oldin ishlayotgan barcha ilovalarni yopish tavsiya etiladi. Bu o'rnatuvchi dasturga kompyuterni qayta yuklamasdan sistemali fayllarni yangilash imkonini beradi.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Sizni $(^NameDA)ni o'chirish dasturi tabriklaydi" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bu dastur $(^NameDA)ni sizning kompyuteringizdan o'chiradi.$\r$\n$\r$\nO'chirishdan oldin $(^NameDA) dasturni ishlamayotganligini aniqlang.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisenzion kelishuv" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) dasturini o'rnatishdan oldin lisenzion kelishuv bilan tanishib chiking." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Agar kelishuv shartlariga rozi bo'lsangiz $\"Qabul kilaman$\" tugmasini bosing.Dasturni o'rnatish uchun,kelishuv shartlarini qabul qilish kerak." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Agar siz kelishuv shartlarini qabul kilsangiz,bayroqchani joylashtiring. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kelishuv shartlarini qabul qilsangiz quida taklif etilganlardan birinchi variantni tanlang. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisenzion kelishuv" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)ni o'chirishdan oldin lesinzion kelishuv bilan tanishing." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Agar siz kelishuv shartlariniqabul qilsangiz $\"Qabul qilaman$\" tugmasini bosing. O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Agar shartlarni qabul qilsangiz, bayroqchani o'rnating.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kelishuv shartlarini qabul qilsangiz, taklif etilganlardan birinchi variantni tanlang.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Matn bo'icha silgish uchun $\"PageUp$\" va $\"PageDown$\" tugmasidan foydalaning." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "O'rnatilayotgan dastur komponentlari" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA) dasturning o'zingizga kerak bo'lgan komponentasini tanlang." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dastur komponentlari" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)ning o'chirish kerak bo'lgan komponentlarini tanlang." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Tasvir" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sichqonchaning kursorini komponent tasvirini o'qish uchun ustiga quying." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tasvirini o'qish o'chun, komponentni tanlang." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "O'rnatish papkasini tanlash" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)ni o'rnatish uchun papka tanlang." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "O'chiriladigan papkani tanlash" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) o'chiriladigan papkasini ko'rsating." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Fayllarni ko'chirish" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Biror kuting, $(^NameDA) fayllari ko'chirilmoqda..." ${LangFileString} MUI_TEXT_FINISH_TITLE "O'rnatish jarayoni tugadi" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "O'rnatish jarayoni muvaffaqiyat bilan tugadi." ${LangFileString} MUI_TEXT_ABORT_TITLE "O'rnatish jarayoni uzildi" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "O'rnatish jarayoni tugamadi." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O'chirish" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Biror kutib turing, $(^NameDA) fayllarini o'chirish bajarilmoqda..." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "O'chirish tuganlandi" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Dasturni o'chirish muvaffaqiyatli yakunlandi." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "O'chirish jarayoni uzildi" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "O'chirish to'la bajarilmadi." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)ni o'rnatuvci dasturi o'z ishini tugatmoqda" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)ni o'rnatish bajarildi.$\r$\n$\r$\nO'rnatuvchi dasturdan chiqish uchun $\"Tayor$\" tugmasini bosing." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) dasturini o'rnatish jarayonini tugatish uchun Kompyuterni qayta yuklash kerak.Shu ishni bajarishni xoziroq istaysizmi?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)ni o'chirish dasturi o'z ishini tugatdi." ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) dasturi kompyuteringizdan o'chirildi.$\r$\n$\r$\nO'chirish dasturidan chiqish uchun $\"Tayor$\"tugmasini bosing." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) dasturini o'chirishni tugatish uchun kompyuterni qayta yuklash kerak.shu ishni xozir bajarasizmi?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ha, kompyuter hozir qayta yuklansin" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Yo'q, bu ishni keyinroq bajaraman" ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &Ishga tushirilsin" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Readme fayli ko'rsatilsin" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Tayor" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Papka $\"Ãóñê$\" menyusida" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dastur belgilarini joylashtirish uchun $\"Ãóñê$\" menyusidan papka tanlang." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "$\"Ãóñê$\" menyusidan dastur belgilari joylashadigan papka tanlang. Siz papkaning boshqa ismini kiritishingiz mumkin" ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Belgilar yaratilmasin" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)ni o'chirish" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)ni kompyuterdan o'chirish." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Haqiqatdan ham siz $(^Name)ni o'rnatishni bekor qilmoqchimisiz?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name)ni o'chirish jarayonini bekor qilmoqchisizmi?" !endif nsis-3.11/Contrib/Language files/Valencian.nlf000077500000000000000000000125051477201124000212250ustar00rootroot00000000000000# Header, don't edit NLF v6 # Language ID 33280 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Bernardo Arlandis Mañó # ^Branding Nullsoft Install System %s # ^SetupCaption Instalacio de $(^Name) # ^UninstallCaption Desinstalacio de $(^Name) # ^LicenseSubCaption : Acort de Llicencia # ^ComponentsSubCaption : Opcions d'instalacio # ^DirSubCaption : Directori d'instalacio # ^InstallingSubCaption : Instalant # ^CompletedSubCaption : Completat # ^UnComponentsSubCaption : Opcions de desinstalacio # ^UnDirSubCaption : Directori de desinstalacio # ^ConfirmSubCaption : Confirmacio # ^UninstallingSubCaption : Desinstalant # ^UnCompletedSubCaption : Completat # ^BackBtn < &Anterior # ^NextBtn &Següent > # ^AgreeBtn A&ccepte # ^AcceptBtn A&ccepte els termens de la llicencia # ^DontAcceptBtn &No accepte els termens de la llicencia # ^InstallBtn &Instalar # ^UninstallBtn &Desinstalar # ^CancelBtn Cancelar # ^CloseBtn &Tancar # ^BrowseBtn &Examinar... # ^ShowDetailsBtn Vore &detalls # ^ClickNext Pulse Següent per a continuar. # ^ClickInstall Pulse Instalar per a començar l'instalacio. # ^ClickUninstall Pulse Desinstalar per a començar la desinstalacio. # ^Name Nom # ^Completed Completat # ^LicenseText Per favor, revise l'acort de llicencia abans d'instalar $(^NameDA). Si accepta tots els termens de l'acort, pulse Accepte. # ^LicenseTextCB Per favor, revise l'acort de llicencia abans d'instalar $(^NameDA). Si accepta tots els termens de l'acort, marque la casella avall. $_CLICK # ^LicenseTextRB Per favor, revise l'acort de llicencia abans d'instalar $(^NameDA). Si accepta tots els termens de l'acort, seleccione la primera opcio avall. $_CLICK # ^UnLicenseText Per favor, revise l'acort de llicencia abans de desinstalar $(^NameDA). Si accepta tots els termens de l'acort, pulse Accepte. # ^UnLicenseTextCB Per favor, revise l'acort de llicencia abans de desinstalar $(^NameDA). Si accepta tots els termens de l'acort, marque la casella avall. $_CLICK. # ^UnLicenseTextRB Per favor, revise l'acort de llicencia abans de desinstalar $(^NameDA). Si accepta tots els termens de l'acort, seleccione la primera opcio avall. $_CLICK # ^Custom Personalisada # ^ComponentsText Marque els components que vullga instalar i desmarque els components que no vullga instalar. $_CLICK # ^ComponentsSubText1 Seleccione el tipo d'instalacio: # ^ComponentsSubText2_NoInstTypes Seleccione els components a instalar: # ^ComponentsSubText2 O seleccione els components opcionals que vullga instalar: # ^UnComponentsText Marque els components que vullga desinstalar i desmarque els components que no vullga desinstalar. $_CLICK # ^UnComponentsSubText1 Seleccione el tipo de desinstalacio: # ^UnComponentsSubText2_NoInstTypes Seleccione els components a desinstalar: # ^UnComponentsSubText2 O seleccione els components opcionals que vullga desinstalar: # ^DirText El programa d'instalacio instalarà $(^NameDA) en el següent directori. Per a instalar en un directori diferent, pulse Examinar i seleccione un atre directori. $_CLICK # ^DirSubText Directori de desti # ^DirBrowseText Seleccione el directori a on instalar $(^NameDA): # ^UnDirText El programa d'instalacio desinstalarà $(^NameDA) del següent directori. Per a desinstalar d'un directori diferent, pulse Examinar i seleccione un atre directori. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Seleccione el directori d'a on desinstalar $(^NameDA): # ^SpaceAvailable Espai disponible: # ^SpaceRequired Espai necessari: # ^UninstallingText $(^NameDA) es desinstalarà del següent directori. $_CLICK # ^UninstallingSubTex Desinstalant de: # ^FileError Erro obrint archiu per a escritura: \r\n\t"$0"\r\nPulse abortar per a anular l'instalacio,\r\nreintentar per a tornar a intentar escriure l'archiu, u\r\nometre per a ignorar est archiu # ^FileError_NoIgnore Erro obrint archiu per a escritura: \r\n\t"$0"\r\nPulse reintentar per a tornar a intentar escriure l'archiu, o\r\ncancelar per a anular l'instalacio # ^CantWrite "No s'ha pogut escriure: " # ^CopyFailed Fallà la copia # ^CopyTo "Copiar a " # ^Registering "Registrant: " # ^Unregistering "Eliminant registre: " # ^SymbolNotFound "No es pot trobar el simbol: " # ^CouldNotLoad "No s'ha pogut carregar: " # ^CreateFolder "Creant directori: " # ^CreateShortcut "Creant llançador: " # ^CreatedUninstaller "Creant desinstalador: " # ^Delete "Borrant archiu: " # ^DeleteOnReboot "Borrar al reiniciar: " # ^ErrorCreatingShortcut "Erro creant llançador: " # ^ErrorCreating "Erro creant: " # ^ErrorDecompressing ¡Erro descomprimint senyes! ¿Instalador corrupte? # ^ErrorRegistering Erro registrant DLL # ^ExecShell "Eixecutar comandaments: " # ^Exec "Eixecutar: " # ^Extract "Extraent: " # ^ErrorWriting "Extraent: erro escrivint en l'archiu " # ^InvalidOpcode Instalador corrupte: codic d'operacio no valit # ^NoOLE "Sense OLE per a: " # ^OutputFolder "Directori obert: " # ^RemoveFolder "Eliminant directori: " # ^RenameOnReboot "Renomenar al reinici: " # ^Rename "Renomenar: " # ^Skipped "Omes: " # ^CopyDetails Copiar Detalls al Portapapers # ^LogInstall Registrar proces d'instalacio # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Valencian.nsh000077500000000000000000000170311477201124000212350ustar00rootroot00000000000000;Language: Valencian (33280) ;By Bernardo Arlandis Mañó !insertmacro LANGFILE "Valencian" = "Valencià" "Valencia" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvingut a l'Assistent d'Instalacio de $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este programa instalarà $(^NameDA) en el seu ordenador.$\r$\n$\r$\nEs recomana que tanque totes les demes aplicacions abans d'iniciar l'instalacio. Aixina es podran actualisar archius relacionats en el sistema sense haver de reiniciar el seu ordenador.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvingut a l'Assistent de Desinstalacio de $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Est assistent el guiarà durant la desinstalacio de $(^NameDA).$\r$\n$\r$\nAbans de començar la desinstalacio, assegure's que $(^NameDA) no s'està eixecutant.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acort de llicencia" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Per favor, revise els termens de la llicencia abans d'instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si accepta tots els termens de l'acort, seleccione Accepte per a continuar. Deu d'acceptar l'acort per a instalar $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepta els termens de l'acort, marque la casella avall. Deu d'acceptar els termens per a instalar $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepta els termens de l'acort, seleccione la primera opcio avall. Deu d'acceptar els termens per a instalar $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acort de llicencia" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Per favor, revise els termens de la llicencia abans de desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si accepta tots els termens de l'acort, seleccione Accepte per a continuar. Deu d'acceptar l'acort per a desinstalar $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepta els termens de l'acort, marque la casella avall. Deu d'acceptar els termens per a desinstalar $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepta els termens de l'acort, seleccione la primera opcio avall. Deu d'acceptar els termens per a desinstalar $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pulse Avançar Pagina per a vore lo restant de l'acort." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Seleccio de components" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione quins components de $(^NameDA) vol instalar." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Seleccio de components" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione quins components de $(^NameDA) vol desinstalar." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripcio" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Situe el ratoli damunt d'un component per a vore la seua descripcio." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un component per a vore la seua descripcio." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Trie el lloc d'instalacio" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Trie el directori per a instalar $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Triar lloc de desinstalacio" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Trie el directori des d'a on es desinstalarà $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalant" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Per favor, espere mentres $(^NameDA) s'instala." ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalacio Completa" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'instalacio s'ha completat correctament." ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacio Anulada" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'instalacio no s'ha completat correctament." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalant" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Per favor, espere mentres $(^NameDA) es desinstala." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalacio Completa" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalacio s'ha completat correctament." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalacio Anulada" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalacio no s'ha completat correctament." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Finalisant l'Assistent d'Instalacio de $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) s'ha instalat en son sistema.$\r$\n$\r$\nPulse Acabar per a tancar est assistent." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Son sistema es deu de reiniciar per a que puga completar-se l'instalacio de $(^NameDA). ¿Vol reiniciar ara?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Finalisant l'Assistent de Desinstalacio de $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) s'ha desinstalat de son sistema.$\r$\n$\r$\nPulse Acabar per a tancar est assistent." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "El seu ordenador deu de reiniciar-se per a completar la desinstalacio de $(^NameDA). ¿Vol reiniciar ara?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ara" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Vullc reiniciar manualment despres en acabant" ${LangFileString} MUI_TEXT_FINISH_RUN "&Eixecutar $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vore Lligga'm" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Acabar" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Trie una Carpeta del Menu Inici" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Trie una Carpeta del Menu Inici per als llançadors de $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menu Inici a on vullga crear els llançadors del programa. Tambe pot introduir un nom per a crear-ne una nova carpeta." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear llançadors" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de son sistema." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "¿Està segur que vol eixir de l'instalacio de $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Està segur de voler eixir de la desinstalacio de $(^Name)?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Language files/Vietnamese.nlf000077500000000000000000000147231477201124000214310ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1066 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1258 # RTL - anything else than RTL means LTR - # Translation by NGUYỄN MaÌ£nh HuÌ€ng # ^Branding Nullsoft Install System %s # ^SetupCaption CaÌ€i đặt $(^Name) # ^UninstallCaption Gỡ bỏ $(^Name) # ^LicenseSubCaption : Thỏa thuận GiâÌy pheÌp # ^ComponentsSubCaption : TuÌ€y choÌ£n CaÌ€i đặt # ^DirSubCaption : Thư muÌ£c CaÌ€i đặt # ^InstallingSubCaption : CaÌ€i đặt # ^CompletedSubCaption : HoaÌ€n thaÌ€nh # ^UnComponentsSubCaption : TuÌ€y choÌ£n Gỡ bỏ # ^UnDirSubCaption : Thư muÌ£c Gỡ bỏ # ^ConfirmSubCaption : XaÌc nhận # ^UninstallingSubCaption : Gỡ bỏ # ^UnCompletedSubCaption : HoaÌ€n thaÌ€nh # ^BackBtn < &LuÌ€i # ^NextBtn &TiêÌn > # ^AgreeBtn Tô&i đồng yÌ # ^AcceptBtn Tô&i châÌp thuận caÌc Ä‘iều khoản của Thỏa thuận GiâÌy pheÌp # ^DontAcceptBtn Tôi &không châÌp thuận caÌc Ä‘iều khoản của Thỏa thuận GiâÌy pheÌp # ^InstallBtn &CaÌ€i đặt # ^UninstallBtn &Gỡ bỏ # ^CancelBtn Hủy bỏ # ^CloseBtn ÄoÌn&g # ^BrowseBtn Du&yệt... # ^ShowDetailsBtn &Hiện chi tiêÌt # ^ClickNext NhâÌn TiêÌn để tiêÌp tuÌ£c. # ^ClickInstall NhâÌn “CaÌ€i đặt†để băÌt đầu việc caÌ€i đặt. # ^ClickUninstall NhâÌn “Gỡ bỏ†để băÌt đầu việc gỡ bỏ. # ^Name Tên # ^Completed HoaÌ€n thaÌ€nh # ^LicenseText Vui loÌ€ng xem xeÌt thỏa thuận giâÌy pheÌp trươÌc khi caÌ€i đặt $(^NameDA). NêÌu baÌ£n châÌp thuận tâÌt cả caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn “Tôi đồng yÌâ€. # ^LicenseTextCB Vui loÌ€ng xem xeÌt thỏa thuận giâÌy pheÌp trươÌc khi caÌ€i đặt $(^NameDA). NêÌu baÌ£n châÌp thuận tâÌt cả caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn ô bên dươÌi. $_CLICK # ^LicenseTextRB Vui loÌ€ng xem xeÌt thỏa thuận giâÌy pheÌp trươÌc khi caÌ€i đặt $(^NameDA). NêÌu baÌ£n châÌp thuận tâÌt cả caÌc Ä‘iều khoản của thỏa thuận, hãy choÌ£n ô đầu tiên bên dươÌi. $_CLICK # ^UnLicenseText Vui loÌ€ng xem xeÌt thỏa thuận giâÌy pheÌp trươÌc khi gỡ bỏ $(^NameDA). NêÌu baÌ£n châÌp thuận tâÌt cả caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn “Tôi đồng yÌâ€. # ^UnLicenseTextCB Vui loÌ€ng xem xeÌt thỏa thuận giâÌy pheÌp trươÌc khi gỡ bỏ $(^NameDA). NêÌu baÌ£n châÌp thuận tâÌt cả caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn ô bên dươÌi. $_CLICK # ^UnLicenseTextRB Vui loÌ€ng xem xeÌt thỏa thuận giâÌy pheÌp trươÌc khi gỡ bỏ $(^NameDA). NêÌu baÌ£n châÌp thuận tâÌt cả caÌc Ä‘iều khoản của thỏa thuận, hãy choÌ£n ô đầu tiên bên dươÌi. $_CLICK # ^Custom TuÌ€y biêÌn # ^ComponentsText ChoÌ£n thaÌ€nh phần maÌ€ baÌ£n muôÌn caÌ€i đặt vaÌ€ không choÌ£n caÌc thaÌ€nh phần maÌ€ baÌ£n không muôÌn caÌ€i đặt. $_CLICK # ^ComponentsSubText1 ChoÌ£n kiểu caÌ€i đặt: # ^ComponentsSubText2_NoInstTypes ChoÌ£n thaÌ€nh phần để caÌ€i đặt: # ^ComponentsSubText2 Hoặc, choÌ£n thaÌ€nh phần phuÌ£ maÌ€ baÌ£n muôÌn caÌ€i đặt: # ^UnComponentsText ChoÌ£n thaÌ€nh phần maÌ€ baÌ£n muôÌn gỡ bỏ vaÌ€ không choÌ£n caÌc thaÌ€nh phần maÌ€ baÌ£n không muôÌn gỡ bỏ. $_CLICK # ^UnComponentsSubText1 ChoÌ£n kiểu gỡ bỏ: # ^UnComponentsSubText2_NoInstTypes ChoÌ£n thaÌ€nh phần để gỡ bỏ: # ^UnComponentsSubText2 Hoặc, choÌ£n thaÌ€nh phần phuÌ£ maÌ€ baÌ£n muôÌn gỡ bỏ: # ^DirText TriÌ€nh trợ liÌ sẽ caÌ€i đặt $(^NameDA) vaÌ€o thư muÌ£c sau. Äể caÌ€i đặt vaÌ€o một thư muÌ£c khaÌc, hãy nhâÌn Duyệt để choÌ£n thư muÌ£c. $_CLICK # ^DirSubText Thư muÌ£c Ä‘iÌch # ^DirBrowseText ChoÌ£n thư muÌ£c để caÌ€i đặt $(^NameDA): # ^UnDirText TriÌ€nh trợ liÌ sẽ gỡ bỏ $(^NameDA) khỏi thư muÌ£c sau. Äể gỡ bỏ khỏi một thư muÌ£c khaÌc, hãy nhâÌn Duyệt để choÌ£n thư muÌ£c. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText ChoÌ£n thư muÌ£c để gỡ bỏ $(^NameDA): # ^SpaceAvailable "Dung lượng hiện coÌ: " # ^SpaceRequired "Dung lượng yêu cầu: " # ^UninstallingText $(^NameDA) sẽ biÌ£ gỡ bỏ khỏi thư muÌ£c sau. $_CLICK # ^UninstallingSubText Äang gỡ bỏ khỏi: # ^FileError Lỗi khi mở tập tin để ghi: \r\n\r\n$0\r\n\r\nNhâÌn “Hủy bỏ†để ngừng việc caÌ€i đặt,\r\n“Thử laÌ£i†để thử lần nữa, hoặc\r\n“Bỏ qua†để bỏ qua tập tin naÌ€y. # ^FileError_NoIgnore Lỗi khi mở tập tin để ghi: \r\n\r\n$0\r\n\r\nNhâÌn “Thử laÌ£i†để thử lần nữa, hoặc\r\n“Hủy bỏ†để ngừng việc caÌ€i đặt. # ^CantWrite "Không thể ghi: " # ^CopyFailed Sao cheÌp biÌ£ thâÌt baÌ£i # ^CopyTo "Sao cheÌp vaÌ€o " # ^Registering "Äang đăng kiÌ: " # ^Unregistering "Äang hủy đăng kiÌ: " # ^SymbolNotFound "Không thể tiÌ€m thâÌy biểu tượng: " # ^CouldNotLoad "Không thể naÌ£p: " # ^CreateFolder "TaÌ£o thư muÌ£c: " # ^CreateShortcut "TaÌ£o lôÌi tăÌt: " # ^CreatedUninstaller "TaÌ£o triÌ€nh gỡ bỏ: " # ^Delete "XoÌa tập tin: " # ^DeleteOnReboot "XoÌa khi khởi động laÌ£i: " # ^ErrorCreatingShortcut "Lỗi khi taÌ£o lôÌi tăÌt: " # ^ErrorCreating "Lỗi khi taÌ£o: " # ^ErrorDecompressing Lỗi khi giải neÌn dữ liệu! CoÌ thể triÌ€nh caÌ€i đặt Ä‘ã biÌ£ hỏng? # ^ErrorRegistering Lỗi khi đăng kiÌ DLL # ^ExecShell "ExecShell: " # ^Exec "Thực thi: " # ^Extract "TriÌch xuâÌt: " # ^ErrorWriting "TriÌch xuâÌt: lôi khi ghi vaÌ€o tập tin " # ^InvalidOpcode TriÌ€nh caÌ€i đặt biÌ£ hỏng: mã taÌc vuÌ£ bâÌt hợp lệ # ^NoOLE "Không coÌ OLE cho: " # ^OutputFolder "Thư muÌ£c đầu ra: " # ^RemoveFolder "XoÌa thư muÌ£c: " # ^RenameOnReboot "Äổi tên khi khởi động laÌ£i: " # ^Rename "Äổi tên: " # ^Skipped "Äã bỏ qua: " # ^CopyDetails Sao cheÌp Chi tiêÌt vaÌ€o Clipboard # ^LogInstall Lưu kiÌ quaÌ triÌ€nh caÌ€i đặt # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Vietnamese.nsh000077500000000000000000000220331477201124000214330ustar00rootroot00000000000000;Language: Vietnamese (1066) ;By NGUYỄN MaÌ£nh HuÌ€ng !insertmacro LANGFILE "Vietnamese" = "Tiếng Việt" "Tieng Viet" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ChaÌ€o mừng đêÌn vÆ¡Ìi Trợ liÌ CaÌ€i đặt $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "TriÌ€nh trợ liÌ sẽ hươÌng dẫn baÌ£n việc caÌ€i đặt $(^NameDA).$\r$\n$\r$\nBaÌ£n nên Ä‘oÌng tâÌt cả caÌc chương triÌ€nh khaÌc trươÌc khi băÌt đầu caÌ€i đặt. Äiều naÌ€y coÌ thể giuÌp cập nhật caÌc tập tin hệ thôÌng maÌ€ không cần phải khởi động laÌ£i maÌy tiÌnh.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ChaÌ€o mừng đêÌn vÆ¡Ìi Trợ liÌ Gỡ bỏ $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "TriÌ€nh trợ liÌ sẽ hươÌng dẫn baÌ£n việc gỡ bỏ $(^NameDA).$\r$\n$\r$\nTrươÌc khi băÌt đầu gỡ bỏ, hãy chăÌc chăÌn rằng $(^NameDA) Ä‘ang không chaÌ£y.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Thỏa thuận GiâÌy pheÌp" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vui loÌ€ng xem xeÌt caÌc Ä‘iều khoản giâÌy pheÌp trươÌc khi caÌ€i đặt $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "NêÌu baÌ£n châÌp thuận caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn “Tôi đồng y̆để tiêÌp tuÌ£c. BaÌ£n phải châÌp thuận bản thỏa thuận để caÌ€i đặt $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "NêÌu baÌ£n châÌp thuận caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn ô bên dươÌi. BaÌ£n phải châÌp thuận bản thỏa thuận để caÌ€i đặt $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "NêÌu baÌ£n châÌp thuận caÌc Ä‘iều khoản của thỏa thuận, hãy choÌ£n ô đầu tiên bên dươÌi. BaÌ£n phải châÌp thuận bản thỏa thuận để caÌ€i đặt $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Thỏa thuận GiâÌy pheÌp" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vui loÌ€ng xem xeÌt caÌc Ä‘iều khoản giâÌy pheÌp trươÌc khi gỡ bỏ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "NêÌu baÌ£n châÌp thuận caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn “Tôi đồng y̆để tiêÌp tuÌ£c. BaÌ£n phải châÌp thuận bản thỏa thuận để gỡ bỏ $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "NêÌu baÌ£n châÌp thuận caÌc Ä‘iều khoản của thỏa thuận, hãy nhâÌn ô bên dươÌi. BaÌ£n phải châÌp thuận bản thỏa thuận để gỡ bỏ $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "NêÌu baÌ£n châÌp thuận caÌc Ä‘iều khoản của thỏa thuận, hãy choÌ£n ô đầu tiên bên dươÌi. BaÌ£n phải châÌp thuận bản thỏa thuận để gỡ bỏ $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÂÌn Page Down để xem phần coÌ€n laÌ£i của thỏa thuận." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ChoÌ£n thaÌ€nh phần" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "ChoÌ£n caÌc tiÌnh năng của $(^NameDA) maÌ€ baÌ£n muôÌn caÌ€i đặt." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ChoÌ£n thaÌ€nh phần" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "ChoÌ£n caÌc tiÌnh năng của $(^NameDA) maÌ€ baÌ£n muôÌn gỡ bỏ." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Mô tả" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Rê chuột lên trên một thaÌ€nh phần để thâÌy mô tả của noÌ." !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ChoÌ£n thư muÌ£c caÌ€i đặt" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "ChoÌ£n thư muÌ£c để caÌ€i đặt $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "ChoÌ£n thư muÌ£c gỡ bỏ" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "ChoÌ£n thư muÌ£c để gỡ bỏ $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "CaÌ€i đặt" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vui loÌ€ng đợi trong khi $(^NameDA) Ä‘ang được caÌ€i đặt." ${LangFileString} MUI_TEXT_FINISH_TITLE "CaÌ€i đặt hoaÌ€n tâÌt" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Việc caÌ€i đặt Ä‘ã hoaÌ€n tâÌt thaÌ€nh công." ${LangFileString} MUI_TEXT_ABORT_TITLE "CaÌ€i đặt biÌ£ hủy" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Việc caÌ€i đặt không hoaÌ€n tâÌt thaÌ€nh công." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Gỡ bỏ" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vui loÌ€ng đợi trong khi $(^NameDA) Ä‘ang được gỡ bỏ." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Gỡ bỏ hoaÌ€n tâÌt" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Việc gỡ bỏ Ä‘ã hoaÌ€n tâÌt thaÌ€nh công." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Gỡ bỏ biÌ£ hủy" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Việc gỡ bỏ không hoaÌ€n tâÌt thaÌ€nh công." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "HoaÌ€n tâÌt CaÌ€i đặt $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) Ä‘ã được caÌ€i đặt vaÌ€o maÌy tiÌnh của baÌ£n.$\r$\n$\r$\nNhâÌn “HoaÌ€n thaÌ€nh†để Ä‘oÌng TriÌ€nh trợ liÌ." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "MaÌy tiÌnh của baÌ£n phải được khởi động laÌ£i để hoaÌ€n tâÌt việc caÌ€i đặt $(^NameDA). BaÌ£n coÌ muôÌn khởi động laÌ£i ngay không?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "HoaÌ€n tâÌt Gỡ bỏ $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) Ä‘ã được gỡ bỏ khỏi maÌy tiÌnh của baÌ£n.$\r$\n$\r$\nNhâÌn “HoaÌ€n thaÌ€nh†để Ä‘oÌng TriÌ€nh trợ liÌ." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "MaÌy tiÌnh của baÌ£n phải được khởi động laÌ£i để hoaÌ€n tâÌt việc gỡ bỏ $(^NameDA). BaÌ£n coÌ muôÌn khởi động laÌ£i ngay không?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Khởi động laÌ£i ngay" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Tôi muôÌn khởi động laÌ£i sau" ${LangFileString} MUI_TEXT_FINISH_RUN "&ChaÌ£y $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Hiện &Readme" ${LangFileString} MUI_BUTTONTEXT_FINISH "&HoaÌ€n thaÌ€nh" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "ChoÌ£n thư muÌ£c TriÌ€nh đơn Start" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "ChoÌ£n một thư muÌ£c trên TriÌ€nh đơn Start để taÌ£o lôÌi tăÌt cho $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "ChoÌ£n thư muÌ£c trên TriÌ€nh đơn Start maÌ€ baÌ£n muôÌn taÌ£o lôÌi tăÌt cho chương triÌ€nh. BaÌ£n cũng coÌ thể nhập tên để taÌ£o thư muÌ£c mÆ¡Ìi." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Không taÌ£o lôÌi tăÌt" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Gỡ bỏ $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Gỡ bỏ $(^NameDA) khỏi maÌy tiÌnh của baÌ£n." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "BaÌ£n coÌ thật sự muôÌn thoaÌt triÌ€nh CaÌ€i đặt $(^Name) không?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "BaÌ£n coÌ thật sự muôÌn thoaÌt triÌ€nh Gỡ bỏ $(^Name) không?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "ChoÌ£n người duÌ€ng" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "ChoÌ£n người duÌ€ng maÌ€ baÌ£n muôÌn caÌ€i đặt $(^NameDA)." ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "ChoÌ£n giữa việc caÌ€i đặt $(^NameDA) cho riêng baÌ£n hoặc cho tâÌt cả người duÌ€ng của maÌy tiÌnh naÌ€y. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "CaÌ€i đặt cho bâÌt kiÌ€ người naÌ€o sử duÌ£ng maÌy tiÌnh naÌ€y" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Chỉ caÌ€i đặt cho riêng tôi" !endif nsis-3.11/Contrib/Language files/Welsh.nlf000077500000000000000000000112011477201124000203770ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1106 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by Rhoslyn Prys, Meddal.com # ^Branding Nullsoft Install System %s # ^SetupCaption Rhaglen Osod $(^Name) # ^UninstallCaption Rhaglen Dadosod $(^Name) # ^LicenseSubCaption : Cytundeb Trwyddedu # ^ComponentsSubCaption : Dewisiadau Gosod # ^DirSubCaption : Ffolder Gosod # ^InstallingSubCaption : Gosod # ^CompletedSubCaption : Cwblhawyd # ^UnComponentsSubCaption : Dewisiadau Dadosod # ^UnDirSubCaption : Ffolder Dadosod # ^ConfirmSubCaption : Cadarnhad # ^UninstallingSubCaption : Dadosod # ^UnCompletedSubCaption : Cwblhawyd # ^BackBtn < &Nôl # ^NextBtn &Nesaf > # ^AgreeBtn &Cytuno # ^AcceptBtn Rwy'n &derbyn Amodau'r Drwydded # ^DontAcceptBtn Rwy'n &gwrthod Amodau'r Drwydded # ^InstallBtn &Gosod # ^UninstallBtn &Dadosod # ^CancelBtn Diddymu # ^CloseBtn C&au # ^BrowseBtn &Pori... # ^ShowDetailsBtn &Dangos manylion # ^ClickNext Cliciwch Nesaf i barhau. # ^ClickInstall Cliciwch Gosod i gychwyn gosod. # ^ClickUninstall Cliciwch Dadosod i gychwyn dadosod. # ^Name Enw # ^Completed Cwblhawyd # ^LicenseText Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno. # ^LicenseTextCB Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK # ^LicenseTextRB Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK # ^UnLicenseText Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno. # ^UnLicenseTextCB Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK # ^UnLicenseTextRB Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK # ^Custom Addasu # ^ComponentsText Ticiwch y cydrannau rydych am eu gosod a dad-dicio'r cydrannau nad ydych am eu gosod. $_CLICK # ^ComponentsSubText1 Dewis y math o osod: # ^ComponentsSubText2_NoInstTypes Dewis cydrannau i'w gosod: # ^ComponentsSubText2 Neu, ddewis y cydrannau ychwanegol i'w gosod: # ^UnComponentsText Ticiwch y cydrannau rydych am eu dadosod a dad-dicio'r cydrannau nad ydych am eu dadosod. $_CLICK # ^UnComponentsSubText1 Dewis y math o ddadosod: # ^UnComponentsSubText2_NoInstTypes Dewis cydrannau i'w dadosod: # ^UnComponentsSubText2 Neu, ddewis y cydrannau ychwanegol i'w dadosod: # ^DirText Bydd y Rhaglen Osod yn gosod $(^NameDA) yn y ffolder canlynol. I'w osod mewn ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK # ^DirSubText Ffolder Cyrchfan # ^DirBrowseText Dewis y ffolder i osod $(^NameDA) ynddo: # ^UnDirText Bydd y Rhegen Osod yn dadosod $(^NameDA) o'r ffolder canlynol. I ddadosod o ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Dewis ffolder i ddadosod $(^NameDA) ohono: # ^SpaceAvailable "Lle ar gael: " # ^SpaceRequired "Lle angenrheidiol: " # ^UninstallingText Bydd $(^NameDA) yn cael ei ddadosod o'r ffolder canlynol. $_CLICK # ^UninstallingSubText Dadosod o: # ^FileError Gwall agor ffeil i'w hysgrifennu: \r\n\r\n$0\r\n\r\nCliciwch Atal i atal y gosod,\r\nEto i geisio eto, neu\r\nAnwybyddu i hepgor y ffeil. # ^FileError_NoIgnore Gwall agor ffeil i'w hysgrifennu: \r\n\r\n$0\r\n\r\nCliciwch Eto i geisio eto, neu\r\nDiddymu i atal y gosod. # ^CantWrite "Methu ysgrifennu: " # ^CopyFailed Methu Copïo # ^CopyTo "Copïo i " # ^Registering "Cofrestru: " # ^Unregistering "Dadgofrestru: " # ^SymbolNotFound "Methu canfod symbol: " # ^CouldNotLoad "Methu llwytho: " # ^CreateFolder "Creu ffolder: " # ^CreateShortcut "Creu llwybr byr: " # ^CreatedUninstaller "Creu dadosodwr: " # ^Delete "Dileu ffeil: " # ^DeleteOnReboot "Dileu wrth ailgychwyn: " # ^ErrorCreatingShortcut "Gwall wrth greu llwybr byr: " # ^ErrorCreating "Gwall wrth greu: " # ^ErrorDecompressing Gwall wrth ddatgywasgu data! Gosodwr llwgr? # ^ErrorRegistering Gwall cofrestru DLL # ^ExecShell "ExecShell: " # ^Exec "Gweithredu: " # ^Extract "Echdynnu: " # ^ErrorWriting "Echdynnu: gwall ysgrifennu i ffeil " # ^InvalidOpcode Gosodwr llwgr: opcode annilys # ^NoOLE "Dim OLE ar gyfer: " # ^OutputFolder "Ffolder allbwn: " # ^RemoveFolder "Tynnu ffolder: " # ^RenameOnReboot "Ailenwi wrth ailgychwyn: " # ^Rename "Ailenwi: " # ^Skipped "Hepgor: " # ^CopyDetails Copïo Manylion i'r Clipfwrdd # ^LogInstall Cofnodi'r brosed gosod # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Welsh.nsh000077500000000000000000000155441477201124000204260ustar00rootroot00000000000000;Language: Welsh (1106) ;By Rhoslyn Prys, Meddal.com !insertmacro LANGFILE "Welsh" = "Cymraeg" = !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Croeso i Ddewin Gosod $(^NameDA)" ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bydd y dewin yn eich arwain drwy osodiad $(^NameDA).$\r$\n$\r$\nCaewch pob rhaglen cyn cychwyn y rhaglen osod. Bydd hyn yn ei gwneud yn bosibl i ddiweddaru'r ffeiliau system berthnasol heb fod angen ailgychwyn eich cyfrifiadur.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_UNWELCOMEPAGE ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Croeso i Ddewin Dadosod $(^NameDA)" ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bydd y dewin yn eich arwain drwy ddadosod $(^NameDA).$\r$\n$\r$\nCyn cychwyn dadosod, gwnewch yn siwr nad yw $(^NameDA) yn rhedeg.$\r$\n$\r$\n$_CLICK" !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Cytundeb Trwyddedu" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Darllenwch amodau'r drwydded cyn gosod $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA)." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK" ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK" !endif !ifdef MUI_UNLICENSEPAGE ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Cytundeb Trwyddedu" ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Darllenwch amodau'r drwydded cyn dadosod $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA)." ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK" ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK" !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pwyswch Page Down i ddarllen gweddill y cytundeb." !endif !ifdef MUI_COMPONENTSPAGE ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Dewis Cydrannau" ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Dewis pa nodweddion o $(^NameDA) rydych am eu gosod." !endif !ifdef MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dewis Cydrannau" ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Dewis pa nodweddion o $(^NameDA) i'w dadoso." !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Disgrifiad" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Gosod eich llygoden dros gydran i weld ei ddisgrifiad." !else ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Dewis cydran i weld ei ddisgrifiad." !endif !endif !ifdef MUI_DIRECTORYPAGE ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Dewis Lleoliad Gosod" ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Dewis y ffolder i osod $(^NameDA)." !endif !ifdef MUI_UNDIRECTORYPAGE ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dewis Lleoliad Dadosod" ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Dewis y ffolder i ddadosod $(^NameDA)." !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Gosod" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Arhoswch tra fo $(^NameDA) yn cael ei osod." ${LangFileString} MUI_TEXT_FINISH_TITLE "Cwblhawyd y Gosod" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Mae'r Gosod wedi ei gwblhau'n llwyddiannus." ${LangFileString} MUI_TEXT_ABORT_TITLE "Ataliwyd y Gosod" ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Methwyd â chwblhau'r gosod yn llwyddiannus." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Dadosod" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Arhoswch tra bo $(^NameDA) yn cael ei ddadosod." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Cwblhawyd y Dadosod" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Mae'r Dadosod wedi ei gwblhau'n llwyddiannus." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ataliwyd y Dadosod" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Methwyd â chwblhau'r dadosod yn llwyddiannus." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Cwblhau Dewin Gosod $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Mae $(^NameDA) wedi cael ei osod ar eich cyfrifiadur.$\r$\n$\r$\nCliciwch Gorffen i gau'r dewin." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?" !endif !ifdef MUI_UNFINISHPAGE ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Cwblhau Dewin Dadosod $(^NameDA)" ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Mae $(^NameDA) wedi ei ddadosod oddi ar eich cyfrifiadur.$\r$\n$\r$\nCliciwch Gorffen i gau'r dewin." ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?" !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ailgychwyn" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Rwyf am ailgychwyn yn hwyrach" ${LangFileString} MUI_TEXT_FINISH_RUN "&Rhedeg $(^NameDA)" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Dangos Darllenfi" ${LangFileString} MUI_BUTTONTEXT_FINISH "&Gorffen" !endif !ifdef MUI_STARTMENUPAGE ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Dewis Ffolder Dewislen Cychwyn" ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dewis ffolder Dewislen Cychwyn ar gyfer llwybrau byr $(^NameDA)." ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Dewis ffolder Dewislen Cychwyn i greu llwybrau byr y rhaglen. Gallwch roi enw i greu ffolder newydd." ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Peidio creu llwybrau byr" !endif !ifdef MUI_UNCONFIRMPAGE ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dadosod $(^NameDA)" ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Tynnu $(^NameDA) oddiar eich cyfrifiadur." !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ydych chi'n si?r eich bod am adael Rhaglen Osod $(^Name)?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ydych chi'n siwr eich bod am adael Rhaglen Dadosod $(^Name)?" !endif nsis-3.11/Contrib/Language files/Yoruba.nlf000077500000000000000000000135571477201124000205760ustar00rootroot00000000000000# Header, don't edit NLF v6 # Start editing here # Language ID 1130 # Font and size - dash (-) means default - - # Codepage - dash (-) means ASCII code page 1252 # RTL - anything else than RTL means LTR - # Translation by ..... (any credits should go here) # ^Branding Nullsoft Install System %s # ^SetupCaption $(^Name) Ètò ÃŒsÌ£iṣẹ́ # ^UninstallCaption $(^Name) YoÌ£ Ọ́ Kúrò # ^LicenseSubCaption : Àdéhùn ÃŒfúnnilásÌ£eÌ£ # ^ComponentsSubCaption : Ibi Tó O Fẹ́ Kó Fi Sí # ^DirSubCaption : Ibi Tó Máa Kó ÃŒsoÌ£fúnni Sí # ^InstallingSubCaption : Ó Ti Ń Fi Sí I # ^CompletedSubCaption : Ó Ti Parí # ^UnComponentsSubCaption : Ṣé Kó YoÌ£ Ọ́? # ^UnDirSubCaption : Ibi Tó O Fẹ́ Kó Fi Èyí Tó YoÌ£ Sí # ^ConfirmSubCaption : Ṣ̣é Kó Ṣ̣e É? # ^UninstallingSubCaption : Ó Ti Ń YoÌ£ Ọ̣́ # ^UnCompletedSubCaption : Ó Ti Parí # ^BackBtn < &Pa Dà # ^NextBtn &Èyí Tó Tẹ̀ Lé E > # ^AgreeBtn Mo &Gbà # ^AcceptBtn Mo &fara mọ́ ohun tẹ́ eÌ£ soÌ£ sínú Àdéhùn ÃŒfúnnilásÌ£eÌ£ # ^DontAcceptBtn Mi &ò fara mọ́ ohun tẹ́ eÌ£ soÌ£ sínú Àdéhùn ÃŒfúnnilásÌ£e# ^InstallBtn &Fi sí i # ^UninstallBtn &YoÌ£ ọ́ kúrò # ^CancelBtn Má sÌ£e é # ^CloseBtn &Pa á dé # ^BrowseBtn Y&ẹ̀ ẹ́ wò... # ^ShowDetailsBtn Fi &gbogbo rẹ̀ hàn # ^ClickNext TeÌ£ Èyí Tó Tẹ̀ Lé E kó o lè máa bá a loÌ£. # ^ClickInstall TeÌ£ Fi Sí I kó lè bẹ̀rẹ̀ fífi sí i. # ^ClickUninstall TeÌ£ YoÌ£ Ọ́ Kúrò kó lè bẹ̀rẹ̀ yíyoÌ£ ọ́. # ^Name OrúkoÌ£ # ^Completed Ó ti parí # ^LicenseText Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó fi $(^NameDA) sí i. Tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, teÌ£ Mo Gbà. # ^LicenseTextCB Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó fi $(^NameDA) sí i. Tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, teÌ£ àpótí tóńtó nísàlẹ̀. $_CLICK # ^LicenseTextRB Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó fi $(^NameDA) sí i. Tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, mú tàkọ́kọ́ nísàlẹ̀. $_CLICK # ^UnLicenseText Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó yoÌ£ $(^NameDA) kúrò. Tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, teÌ£ Mo Gbà. # ^UnLicenseTextCB Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó yoÌ£ $(^NameDA) kúrò. Tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, teÌ£ àpótí tóńtó nísàlẹ̀. $_CLICK # ^UnLicenseTextRB Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó yoÌ£ $(^NameDA) kúrò. Tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, mú tàkọ́kọ́ nísàlẹ̀. $_CLICK # ^Custom Ohun tó o fẹ́ # ^ComponentsText #FIXME:Check the components you want to install and uncheck the components you don't want to install. $_CLICK # ^ComponentsSubText1 Yan bó o sÌ£e fẹ́ kó fi sí i: # ^ComponentsSubText2_NoInstTypes Yan àwoÌ£n tó o fẹ́ kó fi sí i: # ^ComponentsSubText2 Tàbí kó o yan àwoÌ£n tó wù ọ́ kó fi sí i: # ^UnComponentsText #FIXME:Check the components you want to uninstall and uncheck the components you don't want to uninstall. $_CLICK # ^UnComponentsSubText1 Yan bó o sÌ£e fẹ́ kó yoÌ£ ọ́: # ^UnComponentsSubText2_NoInstTypes Yan àwoÌ£n tó o fẹ́ kó yoÌ£: # ^UnComponentsSubText2 Tàbí kó o yan àwoÌ£n tó wù ọ́ kó yoÌ£: # ^DirText Ètò ÃŒsÌ£iṣẹ́ $(^NameDA) yóò kó ohun tó ní síbí yìí. Láti kó o sí ibòmíràn, teÌ£ Yẹ̀ Ẹ́ Wò kó o sì yan ibi tó o fẹ́. $_CLICK # ^DirSubText Ibi Tó O Fẹ́ Kó Wà # ^DirBrowseText Yan ibi tó o fẹ́ kó fi $(^NameDA) sí: # ^UnDirText Ètò ÃŒsÌ£iṣẹ́ $(^NameDA) yóò kó ohun tó ní kúrò níbí. Láti kó o kúrò nínú ibòmíràn, teÌ£ Yẹ̀ Ẹ́ Wò kó o sì yan ibi tó o fẹ́. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText Tan ibi tó o ti fẹ́ kó yoÌ£ $(^NameDA) kúrò: # ^SpaceAvailable "Àyè tó wà: " # ^SpaceRequired "Àyè tó nílò: " # ^UninstallingText $(^NameDA) yóò kúrò ní ibí yìí. $_CLICK # ^UninstallingSubText Ó Å„ yoÌ£ kúrò níbí: # ^FileError Kò rí i ṣí fún lílò: \r\n\r\n$0\r\n\r\nTeÌ£ Ṣíwọ́ kó lè dáwọ́ dúró láìfi sí i,\r\nTún Dán An Wò kó lè tún un sÌ£e, tàbí\r\nGbójú fò ó láti fo fáìlì yìí. # ^FileError_NoIgnore Kò rí i ṣí fún lílò: \r\n\r\n$0\r\n\r\nTún Dán An Wò kó lè tún un sÌ£e, tàbí\r\nMá SÌ£e É kó lè jáwọ́ fífi sí i. # ^CantWrite #FIXME:"Can't write: " # ^CopyFailed Kò rí ẹ̀dà sÌ£e # ^CopyTo "SÌ£e ẹ̀dà sí" # ^Registering #FIXME:"Registering: " # ^Unregistering #FIXME:"Unregistering: " # ^SymbolNotFound "Kò rí àmì yeÌ£n: " # ^CouldNotLoad "Kò rí i sÌ£e: " # ^CreateFolder "SÌ£e ibi ìkónÌ€kansí: " # ^CreateShortcut "SÌ£e àbùjá: " # ^CreatedUninstaller "Ó ti sÌ£e ohun táá máa fi yoÌ£ ọ́: " # ^Delete "YoÌ£ fáìlì dà nù: " # ^DeleteOnReboot "YoÌ£ ọ́ dà nù tó o bá ti pa dà woÌ£lé: " # ^ErrorCreatingShortcut "Kò rọ́nà àbùjá sÌ£e: " # ^ErrorCreating "Kò rí i sÌ£e: " # ^ErrorDecompressing #FIXME:Error decompressing data! Corrupted installer? # ^ErrorRegistering #FIXME:Error registering DLL # ^ExecShell "ExecShell: " # ^Exec "SÌ£e ohun tó soÌ£: " # ^Extract "Wà á jáde: " # ^ErrorWriting "Wà á jáde: error writing to file " # ^InvalidOpcode #FIXME:Installer corrupted: invalid opcode # ^NoOLE "No OLE for: " # ^OutputFolder "Ibi tó Å„ kó ohun tó sÌ£e sí: " # ^RemoveFolder "YoÌ£ ibi ìkónÌ€kansí kúrò: " # ^RenameOnReboot "Yí orúkoÌ£ rẹ̀ pa dà tó o bá ti pa dà woÌ£lé: " # ^Rename "Yí orúkoÌ£ rẹ̀ pa dà: " # ^Skipped "Ó fò ó: " # ^CopyDetails SÌ£e Ẹ̀dà Kúkẹ̀kúlẹ̀ sí Ibi ÃŒfinÌ€kansí fúngbà díẹ̀ # ^LogInstall KoÌ£ gbogbo ìgbésẹ̀ sílẹ̀ # ^Byte B # ^Kilo K # ^Mega M # ^Giga G nsis-3.11/Contrib/Language files/Yoruba.nsh000077500000000000000000000117451477201124000206040ustar00rootroot00000000000000;Language: Yorùbá (1033) !insertmacro LANGFILE "Yoruba" = "Yorùbá" "Yoruba" !ifdef MUI_WELCOMEPAGE ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Èyí ni Ètò ÃŒsÌ£iṣẹ́ $(^NameDA)" #FIXME:MUI_TEXT_WELCOME_INFO_TEXT !endif !ifdef MUI_UNWELCOMEPAGE #FIXME:MUI_UNTEXT_WELCOME_INFO_TITLE #FIXME:MUI_UNTEXT_WELCOME_INFO_TEXT " !endif !ifdef MUI_LICENSEPAGE ${LangFileString} MUI_TEXT_LICENSE_TITLE "Àdéhùn ÃŒfúnnilásÌ£eÌ£" ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Jọ̀wọ́ ka àdéhùn ìfúnnilásÌ£eÌ£ kó o tó fi $(^NameDA) sí i." ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "tó o bá fara mọ́ ohun tá a soÌ£ nínú àdéhùn yìí, teÌ£ Mo Gbà kó lè máa bá a loÌ£. O gbọ́dọ̀ fara mọ́ àdéhùn yìí kó o tó fi $(^NameDA) sí i." #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_UNLICENSEPAGE #FIXME:MUI_UNTEXT_LICENSE_TITLE #FIXME:MUI_UNTEXT_LICENSE_SUBTITLE #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX #FIXME:MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS !endif !ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "TeÌ£ bọ́tìnì Page Down láti lè rí ìyókù àdéhùn yìí." !endif !ifdef MUI_COMPONENTSPAGE #FIXME:MUI_TEXT_COMPONENTS_TITLE #FIXME:MUI_TEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_UNCOMPONENTSPAGE #FIXME:MUI_UNTEXT_COMPONENTS_TITLE #FIXME:MUI_UNTEXT_COMPONENTS_SUBTITLE !endif !ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Àlàyé nípa rẹ̀" !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !else #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO !endif !endif !ifdef MUI_DIRECTORYPAGE #FIXME:MUI_TEXT_DIRECTORY_TITLE #FIXME:MUI_TEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_UNDIRECTORYPAGE #FIXME:MUI_UNTEXT_DIRECTORY_TITLE #FIXME:MUI_UNTEXT_DIRECTORY_SUBTITLE !endif !ifdef MUI_INSTFILESPAGE ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ó ti Å„ fi sí i" ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Jọ̀wọ́ ní sùúrù bó sÌ£e Å„ fi $(^NameDA) sí i." ${LangFileString} MUI_TEXT_FINISH_TITLE "Ó ti fi sí i tán" ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ó ti parí lórí ètò ìsÌ£iṣẹ́." #FIXME:MUI_TEXT_ABORT_TITLE ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Kò lè parí ètò ìsÌ£iṣẹ́." !endif !ifdef MUI_UNINSTFILESPAGE ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ó ti Å„ yoÌ£ ọ́" ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Jọ̀wọ́ ní sùúrù bó sÌ£e Å„ yoÌ£ $(^NameDA)." ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ó Ti YoÌ£ Ọ́ Tán" ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ó ti parí yíyoÌ£ ọ́." ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ó Ti Ṣíwọ́ YíyoÌ£ Ọ́" ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Kò parí yíyoÌ£ ọ́." !endif !ifdef MUI_FINISHPAGE ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ó Å„ parí Ètò ÃŒsÌ£iṣẹ́ $(^NameDA) loÌ£" ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT Ó ti fi "$(^NameDA) sórí kọ̀nÌ€pútà reÌ£.$\r$\n$\r$\nTeÌ£ ÃŒparí kó lè pa Ètò ÃŒsÌ£iṣẹ́." ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "O ní láti tún kọ̀nÌ€pútà rẹ̣ tàn kó tó lè parí iṣẹ́ fífi $(^NameDA) sí i. SÌ£e wàá fẹ́ tún kọ̀nÌ€pútà reÌ£ tàn báyìí?" !endif !ifdef MUI_UNFINISHPAGE #FIXME:MUI_UNTEXT_FINISH_INFO_TITLE #FIXME:MUI_UNTEXT_FINISH_INFO_TEXT #FIXME:MUI_UNTEXT_FINISH_INFO_REBOOT !endif !ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Tún un tàn wàyí" ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Mo fẹ́ fúnra mi tún un tàn tó bá yá" ${LangFileString} MUI_TEXT_FINISH_RUN "&Mú kí $(^NameDA) bẹ̀rẹ̀ iṣẹ́" ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Gbé Kàmí jáde" ${LangFileString} MUI_BUTTONTEXT_FINISH "&ÃŒparí" !endif !ifdef MUI_STARTMENUPAGE #FIXME:MUI_TEXT_STARTMENU_TITLE #FIXME:MUI_TEXT_STARTMENU_SUBTITLE #FIXME:MUI_INNERTEXT_STARTMENU_TOP #FIXME:MUI_INNERTEXT_STARTMENU_CHECKBOX !endif !ifdef MUI_UNCONFIRMPAGE #FIXME:MUI_UNTEXT_CONFIRM_TITLE #FIXME:MUI_UNTEXT_CONFIRM_SUBTITLE !endif !ifdef MUI_ABORTWARNING ${LangFileString} MUI_TEXT_ABORTWARNING "Ṣé ó dá oÌ£ lójú pé o fẹ́ pa Ètò ÃŒsÌ£iṣẹ́ $(^Name) tì?" !endif !ifdef MUI_UNABORTWARNING ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ṣé ó dá oÌ£ lójú pé o fẹ́ pa YíyoÌ£ $(^Name) Kúrò tì?" !endif !ifdef MULTIUSER_INSTALLMODEPAGE #FIXME:MULTIUSER_TEXT_INSTALLMODE_TITLE #FIXME:MULTIUSER_TEXT_INSTALLMODE_SUBTITLE #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_TOP #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS #FIXME:MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER !endif nsis-3.11/Contrib/Library/000077500000000000000000000000001477201124000154145ustar00rootroot00000000000000nsis-3.11/Contrib/Library/RegTool/000077500000000000000000000000001477201124000167675ustar00rootroot00000000000000nsis-3.11/Contrib/Library/RegTool/RegTool.cpp000077500000000000000000000355571477201124000210700ustar00rootroot00000000000000// RegTool v3 // Unicode support by Jim Park & Olivier Marcoux #include "../../../Source/Platform.h" #include #define STR_SIZE 1024 #if defined(_MSC_VER) && _MSC_VER-0 >= 1600 && _MSC_VER-0 <= 1800 // MSVC complains about math stuff we are not even using (bug #1159) EXTERN_C int _fltused = 0; EXTERN_C double _hypot(double x, double y) { return 0.0; } #endif /* All A/W functions need this ugly hack so we can call them in template functions. Everything is implemented in template functions because the x86 version needs to call the W functions on NT and the A functions on 9x. The macros assume that "T" is a [W]CHAR type. */ #define MKSTR(str) ( sizeof(T) > 1 ? (const T*) L##str : (const T*) str ) #ifdef UNICODE #define CALL(func) hack::func##W #else #define CALL(func) hack::func##A #endif #define CALL_wsprintf (sizeof(T) > 1 ? (int(*)(T*,const T*,...)) wsprintfW : (int(*)(T*,const T*,...)) wsprintfA) namespace hack { // Allow cast from [const] T* to [W]CHAR* but nothing else (losing constness is acceptable). inline WCHAR* WP(const WCHAR*p) { return (WCHAR*) p; } inline WCHAR* WP(const CHAR*p) { return (WCHAR*) p; } inline CHAR* NP(const WCHAR*p) { return (CHAR*) p; } inline CHAR* NP(const CHAR*p) { return (CHAR*) p; } // These function names rely on the C preprocessor & PSDK macros to append A/W to their name so they can be found by the CALL macro. template T* GetCommandLine() { return sizeof(T) > 1 ? (T*) ::GetCommandLineW() : (T*) ::GetCommandLineA(); } template T* CharNext(const T*p1) { return sizeof(T) > 1 ? (T*) ::CharNextW(WP(p1)) : (T*) ::CharNextA(NP(p1)); } template T* lstrcpy(T*p1,const T*p2) { return sizeof(T) > 1 ? (T*) ::lstrcpyW(WP(p1),WP(p2)) : (T*) ::lstrcpyA(NP(p1),NP(p2)); } template T* lstrcat(T*p1,const T*p2) { return sizeof(T) > 1 ? (T*) ::lstrcatW(WP(p1),WP(p2)) : (T*) ::lstrcatA(NP(p1),NP(p2)); } template LONG RegEnumKey(HKEY p1, DWORD p2, T*p3,DWORD p4) { return sizeof(T) > 1 ? ::RegEnumKeyW(p1,p2,WP(p3),p4) : ::RegEnumKeyA(p1,p2,NP(p3),p4); } template LONG RegOpenKeyEx(HKEY p1,const T*p2,DWORD p3,REGSAM p4,PHKEY p5) { return sizeof(T) > 1 ? ::RegOpenKeyExW(p1,WP(p2),p3,p4,p5) : ::RegOpenKeyExA(p1,NP(p2),p3,p4,p5); } template LONG RegQueryValueEx(HKEY p1,const T*p2,LPDWORD p3,LPDWORD p4,LPBYTE p5,LPDWORD p6) { return sizeof(T) > 1 ? ::RegQueryValueExW(p1,WP(p2),p3,p4,p5,p6) : ::RegQueryValueExA(p1,NP(p2),p3,p4,p5,p6); } template LONG RegDeleteKey(HKEY p1,const T*p2) { return sizeof(T) > 1 ? ::RegDeleteKeyW(p1,WP(p2)) : ::RegDeleteKeyA(p1,NP(p2)); } template DWORD GetModuleFileName(HMODULE p1,T*p2,DWORD p3) { return sizeof(T) > 1 ? ::GetModuleFileNameW(p1,WP(p2),p3) : ::GetModuleFileNameA(p1,NP(p2),p3); } template HMODULE LoadLibraryEx(const T*p1,void*p2,DWORD p3) { return sizeof(T) > 1 ? ::LoadLibraryExW(WP(p1),p2,p3) : ::LoadLibraryExA(NP(p1),p2,p3); } template UINT GetWindowsDirectory(const T*p1,UINT p2) { return sizeof(T) > 1 ? ::GetWindowsDirectoryW(WP(p1),p2) : ::GetWindowsDirectoryA(NP(p1),p2); } template UINT GetSystemDirectory(const T*p1,UINT p2) { return sizeof(T) > 1 ? ::GetSystemDirectoryW(WP(p1),p2) : ::GetSystemDirectoryA(NP(p1),p2); } template DWORD GetShortPathName(const T*p1,const T*p2,DWORD p3) { return sizeof(T) > 1 ? ::GetShortPathNameW(WP(p1),WP(p2),p3) : ::GetShortPathNameA(NP(p1),NP(p2),p3); } template DWORD GetFileAttributes(const T*p1) { return sizeof(T) > 1 ? ::GetFileAttributesW(WP(p1)) : ::GetFileAttributesA(NP(p1)); } template BOOL MoveFileEx(const T*p1,const T*p2,DWORD p3) { return sizeof(T) > 1 ? ::MoveFileExW(WP(p1),WP(p2),p3) : ::MoveFileExA(NP(p1),NP(p2),p3); } template HANDLE CreateFile(const T*p1,DWORD p2,DWORD p3,LPSECURITY_ATTRIBUTES p4,DWORD p5,DWORD p6,HANDLE p7) { return sizeof(T) > 1 ? ::CreateFileW(WP(p1),p2,p3,p4,p5,p6,p7) : ::CreateFileA(NP(p1),p2,p3,p4,p5,p6,p7); } template BOOL CreateProcess(const T*p1,const T*p2,LPSECURITY_ATTRIBUTES p3,LPSECURITY_ATTRIBUTES p4,BOOL p5,DWORD p6,LPVOID p7,const T*p8,STARTUPINFO*p9,LPPROCESS_INFORMATION p10) { return sizeof(T) > 1 ? ::CreateProcessW(WP(p1),WP(p2),p3,p4,p5,p6,p7,WP(p8),(STARTUPINFOW*)p9,p10) : ::CreateProcessA(NP(p1),NP(p2),p3,p4,p5,p6,p7,NP(p8),(STARTUPINFOA*)p9,p10); } } #if defined(_MSC_VER) && _MSC_VER >= 1200 EXTERN_C IMAGE_DOS_HEADER __ImageBase; #define HINST_THISCOMPONENT ( (HINSTANCE) &__ImageBase ) #define HINST_APPLICATION HINST_THISCOMPONENT #else #define HINST_APPLICATION ( (HINSTANCE) GetModuleHandle(NULL) ) #endif static bool IsWinNT() { #if defined(_WIN64) || (defined(_M_ARM) || defined(__arm__)) return true; #else LPCWSTR str = L"count"; // Using this string because it's already used in other parts of the code return CharNextW(str) != NULL; #endif } void SafeWow64EnableWow64FsRedirection(BYTE EnableFsRedirection) { #ifndef _WIN64 HMODULE hK32 = LoadLibraryA("KERNEL32"); FARPROC proc = GetProcAddress(hK32, "Wow64EnableWow64FsRedirection"); if (proc) { typedef BYTE WINNTBOOLEAN; typedef WINNTBOOLEAN (WINAPI*W64EW64FSR)(WINNTBOOLEAN); W64EW64FSR Wow64EnableWow64FsRedirectionFunc = (W64EW64FSR) proc; Wow64EnableWow64FsRedirectionFunc(EnableFsRedirection); } #endif } char *mystrstriA(char *a, const char *b) { int l = lstrlenA(b); while (lstrlenA(a) >= l) { char c = a[l]; a[l] = 0; if (!lstrcmpiA(a, b)) { a[l] = c; return a; } a[l] = c; a = CharNextA(a); } return NULL; } void mini_memcpy(void *out, const void *in, int len) { char *c_out=(char*)out; char *c_in=(char *)in; while (len-- > 0) { *c_out++=*c_in++; } } template static HANDLE myOpenFile(const T *fn, DWORD da, DWORD cd) { DWORD attr = CALL(GetFileAttributes)(fn), share = FILE_SHARE_READ; return CALL(CreateFile)(fn, da, share, NULL, cd, attr == INVALID_FILE_ATTRIBUTES ? 0 : attr, NULL); } #ifndef _WIN64 /** Modifies the wininit.ini file to rename / delete a file. * * @param prevName The previous / current name of the file. * @param newName The new name to move the file to. If NULL, the current file * will be deleted. */ template void RenameViaWininit(const T* prevName, const T* newName) // Note: Not thread safe! { static char szRenameLine[1024]; static T wininit[1024]; static T tmpbuf[1024]; int cchRenameLine; LPCSTR szRenameSec = "[Rename]\r\n"; // rename section marker HANDLE hfile; DWORD dwFileSize; DWORD dwBytes, dwRenameLinePos; char *pszWinInit; // Contains the file contents of wininit.ini int spn; // length of the short path name in TCHARs. CALL(lstrcpy)(tmpbuf, MKSTR("NUL")); if (newName) { // create the file if it's not already there to prevent GetShortPathName from failing CloseHandle(myOpenFile(newName,0,CREATE_NEW)); spn = CALL(GetShortPathName)(newName,tmpbuf,COUNTOF(tmpbuf)); if (!spn || spn > 1024) return; } // wininit is used as a temporary here spn = CALL(GetShortPathName)(prevName,wininit,COUNTOF(wininit)); if (!spn || spn > 1024) return; #ifdef _UNICODE cchRenameLine = wsprintfA(szRenameLine, "%S=%S\r\n", tmpbuf, wininit); #else cchRenameLine = wsprintfA(szRenameLine, "%s=%s\r\n", tmpbuf, wininit); #endif // Get the path to the wininit.ini file. CALL(GetWindowsDirectory)(wininit, COUNTOF(wininit)-16); CALL(lstrcat)(wininit, MKSTR("\\wininit.ini")); hfile = myOpenFile(wininit, GENERIC_READ | GENERIC_WRITE, OPEN_ALWAYS); if (hfile != INVALID_HANDLE_VALUE) { // We are now working on the Windows wininit file dwFileSize = GetFileSize(hfile, NULL); pszWinInit = (char*) GlobalAlloc(GPTR, dwFileSize + cchRenameLine + 10); if (pszWinInit != NULL) { if (ReadFile(hfile, pszWinInit, dwFileSize, &dwBytes, NULL) && dwFileSize == dwBytes) { // Look for the rename section in the current file. LPSTR pszRenameSecInFile = mystrstriA(pszWinInit, szRenameSec); if (pszRenameSecInFile == NULL) { // No rename section. So we add it to the end of file. lstrcpyA(pszWinInit+dwFileSize, szRenameSec); dwFileSize += 10; dwRenameLinePos = dwFileSize; } else { // There is a rename section, but is there another section after it? char *pszFirstRenameLine = pszRenameSecInFile+10; char *pszNextSec = mystrstriA(pszFirstRenameLine,"\n["); if (pszNextSec) { char *p = pszWinInit + dwFileSize; char *pEnd = pszWinInit + dwFileSize + cchRenameLine; while (p > pszNextSec) { *pEnd-- = *p--; } dwRenameLinePos = BUGBUG64TRUNCATE(DWORD, pszNextSec - pszWinInit) + 1; // +1 for the \n } // rename section is last, stick item at end of file else dwRenameLinePos = dwFileSize; } mini_memcpy(&pszWinInit[dwRenameLinePos], szRenameLine, cchRenameLine); dwFileSize += cchRenameLine; SetFilePointer(hfile, 0, NULL, FILE_BEGIN); WriteFile(hfile, pszWinInit, dwFileSize, &dwBytes, NULL); GlobalFree(pszWinInit); } } CloseHandle(hfile); } } #endif template BOOL DeleteFileOnReboot(const T *pszFile) { BOOL fOk = CALL(MoveFileEx)(pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); #ifndef _WIN64 if (!fOk && sizeof(T) == 1) { RenameViaWininit(pszFile, (const T*)NULL); fOk = TRUE; // BUGBUG: We just pretend everything is OK, nobody checks our return value anyway } #endif return fOk; } template void RegFile(T cmd, const T *file, BOOL x64) { T *self; // These are allocated on the heap to avoid _chkstk T *cmdline; int ready = 0; if (!*file || (cmd != _T('D') && cmd != _T('T') && cmd != _T('E'))) return; self = (T*) GlobalAlloc(GPTR, sizeof(T)*STR_SIZE); cmdline = (T*) GlobalAlloc(GPTR, sizeof(T)*STR_SIZE); if (cmd == ('E')) { CALL_wsprintf(cmdline, MKSTR("\"%s\" /regserver"), file); ready++; } else if (!x64) { if (CALL(GetModuleFileName)(HINST_APPLICATION, self, STR_SIZE)) { CALL_wsprintf(cmdline, MKSTR("\"%s\" /%c%s"), self, cmd, file); ready++; } } else { if (CALL(GetSystemDirectory)(self, STR_SIZE)) { CALL_wsprintf(cmdline, MKSTR("\"%s\\regsvr32.exe\" /s \"%s\""), self, file); ready++; SafeWow64EnableWow64FsRedirection(FALSE); } } if (ready) { PROCESS_INFORMATION pi; BYTE sibuf[sizeof(T) > 1 ? sizeof(STARTUPINFOW) : sizeof(STARTUPINFOA)] = {0,}; STARTUPINFO &si = (STARTUPINFO&) sibuf; si.cb = sizeof(sibuf); if (CALL(CreateProcess)(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } if (x64) { SafeWow64EnableWow64FsRedirection(TRUE); } } GlobalFree(self); GlobalFree(cmdline); } template void RegDll(const T *file) { HMODULE mod = CALL(LoadLibraryEx)(file, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (mod) { FARPROC regfunc = GetProcAddress(mod, "DllRegisterServer"); if (regfunc) regfunc(); FreeLibrary(mod); } } template void RegTypeLib(T *file) { WCHAR wbuf[sizeof(T) > 1 ? 1 : STR_SIZE]; // Buffer only used by ANSI implementation! WCHAR *wfile = wbuf; // Not const because of RegisterTypeLib in old PSDK if (sizeof(T) > 1) wfile = (WCHAR*) file; else { if (MultiByteToWideChar(CP_ACP, 0, (const CHAR*) file, -1, wbuf, STR_SIZE) == 0) return; } ITypeLib* tlib; if (SUCCEEDED(LoadTypeLib(wfile, &tlib))) { RegisterTypeLib(tlib, wfile, NULL); tlib->Release(); } } template int RegTool() { T *cmdline; T seekchar = (' '); cmdline = CALL(GetCommandLine)(); if (*cmdline == ('\"')) seekchar = *cmdline++; while (*cmdline && *cmdline != seekchar) cmdline = CALL(CharNext)(cmdline); cmdline = CALL(CharNext)(cmdline); while (*cmdline == (' ')) cmdline++; if (*cmdline++ != ('/')) { return 1; } if (*cmdline == ('S')) { HKEY rootkey; T *keyname, *file; // These are allocated on the heap to avoid _chkstk keyname = (T*) GlobalAlloc(GPTR, STR_SIZE*sizeof(T)); file = (T*) GlobalAlloc(GPTR, STR_SIZE*sizeof(T)); if (SUCCEEDED(RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\NSIS.Library.RegTool.v3", 0, KEY_READ, &rootkey))) { DWORD keyidx = 0; while (CALL(RegEnumKey)(rootkey, keyidx, keyname, STR_SIZE) == ERROR_SUCCESS) { HKEY key; if (SUCCEEDED(CALL(RegOpenKeyEx)(rootkey, keyname, 0, KEY_READ, &key))) { DWORD t, count, l = sizeof(DWORD); if (SUCCEEDED(CALL(RegQueryValueEx)(key, MKSTR("count"), NULL, &t, (LPBYTE) &count, &l)) && t == REG_DWORD) { DWORD j; T valname[128], mode[3]; for (j = 0; ++j <= count;) { CALL_wsprintf(valname, MKSTR("%u.mode"), j); l = sizeof(mode); if (FAILED(CALL(RegQueryValueEx)(key, valname, NULL, &t, (LPBYTE) mode, &l)) || t != REG_SZ) continue; CALL_wsprintf(valname, MKSTR("%u.file"), j); l = STR_SIZE*sizeof(T); if (FAILED(CALL(RegQueryValueEx)(key, valname, NULL, &t, (LPBYTE) file, &l)) || t != REG_SZ) continue; // JP: Note, if this mode[1] is used as anything but a boolean later on, // we'll need to consider the next line carefully. RegFile(mode[0], file, mode[1] == 'X'); } } RegCloseKey(key); CALL(RegDeleteKey)(rootkey, keyname); } keyidx++; // Must increment this so we don't loop forever if a non-admin accidentally executes RegTool /S } RegCloseKey(rootkey); RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\NSIS.Library.RegTool.v3"); } { if (CALL(GetModuleFileName)(HINST_APPLICATION, file, STR_SIZE)) { DeleteFileOnReboot(file); } } GlobalFree(keyname); GlobalFree(file); } else { DWORD orgerrmode = SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS); OleInitialize(NULL); if (*cmdline == ('D')) { RegDll(cmdline + 1); } else if (*cmdline == ('T')) { RegTypeLib(cmdline + 1); } OleUninitialize(); SetErrorMode(orgerrmode); } return 0; } NSIS_ENTRYPOINT_GUINOCRT EXTERN_C void NSISWinMainNOCRT() { int ec = IsWinNT() ? RegTool() : RegTool(); ExitProcess(ec); } nsis-3.11/Contrib/Library/RegTool/SConscript000077500000000000000000000004631477201124000210070ustar00rootroot00000000000000target = 'RegTool' files = Split(""" RegTool.cpp """) libs = Split(""" advapi32 oleaut32 ole32 user32 kernel32 """) Import('BuildUtil env GetArcCPU') filename = 'RegTool-' + GetArcCPU(env) + '.bin' BuildUtil(target, files, libs, entry = 'NSISWinMainNOCRT', nodeflib = True, file_name = filename) nsis-3.11/Contrib/Library/TypeLib/000077500000000000000000000000001477201124000167645ustar00rootroot00000000000000nsis-3.11/Contrib/Library/TypeLib/SConscript000077500000000000000000000002451477201124000210020ustar00rootroot00000000000000target = 'TypeLib' files = Split(""" TypeLib.cpp """) libs = Split(""" kernel32 user32 oleaut32 """) Import('BuildPlugin') BuildPlugin(target, files, libs) nsis-3.11/Contrib/Library/TypeLib/TypeLib.cpp000077500000000000000000000040751477201124000210510ustar00rootroot00000000000000/* NSIS plug-in for Type Library Registration/UnRegistration Written by Joost Verburg Unicode support by Jim Park -- 08/23/2007 */ #include #include // nsis plugin #include #define NSISFunction(funcname) extern "C" void __declspec(dllexport) funcname(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; } NSISFunction(Register) { EXDLL_INIT(); wchar_t ole_filename[1024]; PopStringW(ole_filename); ITypeLib* typeLib; HRESULT hr; hr = LoadTypeLib(ole_filename, &typeLib); if (SUCCEEDED(hr)) { RegisterTypeLib(typeLib, ole_filename, NULL); hr = typeLib->Release(); } } NSISFunction(UnRegister) { EXDLL_INIT(); wchar_t ole_filename[1024]; PopStringW(ole_filename); ITypeLib* typeLib; HRESULT hr; hr = LoadTypeLibEx(ole_filename, REGKIND_NONE, &typeLib); if (SUCCEEDED(hr)) { TLIBATTR* typelibAttr; hr = typeLib->GetLibAttr(&typelibAttr); if(SUCCEEDED(hr)) { UnRegisterTypeLib(typelibAttr->guid, typelibAttr->wMajorVerNum, typelibAttr->wMinorVerNum, typelibAttr->lcid, typelibAttr->syskind); typeLib->ReleaseTLibAttr(typelibAttr); } typeLib->Release(); } } NSISFunction(GetLibVersion) { EXDLL_INIT(); wchar_t ole_filename[1024]; PopStringW(ole_filename); ITypeLib* typeLib; HRESULT hr; hr = LoadTypeLib(ole_filename, &typeLib); if (SUCCEEDED(hr)) { TLIBATTR* typelibAttr; hr = typeLib->GetLibAttr(&typelibAttr); if (SUCCEEDED(hr)) { TCHAR buf[33]; wsprintf(buf, _T("%d"), typelibAttr->wMajorVerNum); pushstring(buf); wsprintf(buf, _T("%d"), typelibAttr->wMinorVerNum); pushstring(buf); typeLib->ReleaseTLibAttr(typelibAttr); } else { pushstring(_T("0")); pushstring(_T("0")); } typeLib->Release(); } else { pushstring(_T("0")); pushstring(_T("0")); } } nsis-3.11/Contrib/MakeLangId/000077500000000000000000000000001477201124000157445ustar00rootroot00000000000000nsis-3.11/Contrib/MakeLangId/MakeLangId.cpp000077500000000000000000000342551477201124000204200ustar00rootroot00000000000000/********* MakeLangID ********** History ======= 20161207 - anders_k * Rewritten from scratch to support languages from EnumSystemLocales + New icon ("Swerica" by anders_k, ZLib & CC BY-SA 4.0 dual license) 20130906 - anders_k + 64-bit support 20100326 - wizou & anders_k + Unicode support 20040818 - kichik * Initial release Reference ========= https://msdn.microsoft.com/library/dd318693#Language Identifier Constants and Strings https://wayback.archive.org/web/20021221200122/http://msdn.microsoft.com/library/en-us/intl/nls_8rse.asp#LOCALE_* (95/98/ME/NT4/2000/XP) */ #include "../../Source/Platform.h" #include #include "resource.h" #if defined(_MSC_VER) && _MSC_VER-0 >= 1600 && _MSC_VER-0 <= 1800 // MSVC complains about math stuff we are not even using (bug #1159) EXTERN_C int _fltused = 0; EXTERN_C double _hypot(double x, double y) { return 0.0; } #endif #ifndef LOCALE_SNAME #define LOCALE_SNAME 0x005C #endif #ifndef LOCALE_SENGLISHDISPLAYNAME #define LOCALE_SENGLISHDISPLAYNAME 0x0072 #endif #ifndef LOCALE_SNATIVEDISPLAYNAME #define LOCALE_SNATIVEDISPLAYNAME 0x0073 #endif #ifndef CB_SETCUEBANNER #define CB_SETCUEBANNER (0x1700+3) #endif #if defined(_MSC_VER) && _MSC_VER >= 1200 EXTERN_C IMAGE_DOS_HEADER __ImageBase; #define HINST_THISCOMPONENT ( (HINSTANCE) &__ImageBase ) #define HINST_APPLICATION HINST_THISCOMPONENT #else #define HINST_APPLICATION ( (HINSTANCE) GetModuleHandle(NULL) ) #endif static INT_PTR StrToIntptr(LPCTSTR s, bool ForceHex = false) { UINT_PTR val = 0; int sign = 1, base = 10, numtop = '9'; if (*s == TEXT('-')) s++, sign = -1; if (*s == TEXT('0')) { s++; if ((s[0] & ~0x20) == TEXT('X')) ++s, base = 16; } if (ForceHex) base = 16; for (;;) { int c = *s++; if (c >= _T('0') && c <= numtop) c -= TEXT('0'); else if (base == 16 && (c & ~0x20) >= TEXT('A') && (c & ~0x20) <= TEXT('F')) c = (c & 7) + 9; else break; val *= base, val += c; } return ((INT_PTR)val) * sign; } typedef struct { WORD id; LPCSTR name; } INTLNG; // Storing the names as ASCII saves 4 KiB #define IL(p, s, pn, sn) { MAKELANGID(p, s), #pn ":" #sn } static const INTLNG g_IntLang[] = { IL(0x00, 0x00, NEUTRAL, NEUTRAL), IL(0x00, 0x01, NEUTRAL, DEFAULT), IL(0x00, 0x03, NEUTRAL, CUSTOM_DEFAULT), // Vista+? //archives.miloush.net/michkap/archive/2007/09/02/4701403.html IL(0x00, 0x04, NEUTRAL, CUSTOM_UNSPECIFIED), // Vista+? IL(0x00, 0x05, NEUTRAL, UI_CUSTOM_DEFAULT), // Vista+? IL(0x00, 0x08, NEUTRAL, DYNAMIC), IL(0x7f, 0x00, INVARIANT, NEUTRAL), // Invariant locale IL(0x36, 0x01, AFRIKAANS, AFRIKAANS_SOUTH_AFRICA), IL(0x1c, 0x01, ALBANIAN, ALBANIAN_ALBANIA), IL(0x01, 0x01, ARABIC, ARABIC_SAUDI_ARABIA), IL(0x01, 0x02, ARABIC, ARABIC_IRAQ), IL(0x01, 0x03, ARABIC, ARABIC_EGYPT), IL(0x01, 0x04, ARABIC, ARABIC_LIBYA), IL(0x01, 0x05, ARABIC, ARABIC_ALGERIA), IL(0x01, 0x06, ARABIC, ARABIC_MOROCCO), IL(0x01, 0x07, ARABIC, ARABIC_TUNISIA), IL(0x01, 0x08, ARABIC, ARABIC_OMAN), IL(0x01, 0x09, ARABIC, ARABIC_YEMEN), IL(0x01, 0x0a, ARABIC, ARABIC_SYRIA), IL(0x01, 0x0b, ARABIC, ARABIC_JORDAN), IL(0x01, 0x0c, ARABIC, ARABIC_LEBANON), IL(0x01, 0x0d, ARABIC, ARABIC_KUWAIT), IL(0x01, 0x0e, ARABIC, ARABIC_UAE), IL(0x01, 0x0f, ARABIC, ARABIC_BAHRAIN), IL(0x01, 0x10, ARABIC, ARABIC_QATAR), IL(0x2b, 0x01, ARMENIAN, ARMENIAN_ARMENIA), IL(0x4d, 0x01, ASSAMESE, ASSAMESE_INDIA), IL(0x2c, 0x01, AZERI, AZERI_LATIN), IL(0x2c, 0x02, AZERI, AZERI_CYRILLIC), IL(0x2d, 0x01, BASQUE, BASQUE_BASQUE), IL(0x23, 0x01, BELARUSIAN, BELARUSIAN_BELARUS), IL(0x45, 0x01, BENGALI, BENGALI_INDIA), IL(0x45, 0x02, BENGALI, BENGALI_BANGLADESH), IL(0x02, 0x01, BULGARIAN, BULGARIAN_BULGARIA), IL(0x03, 0x01, CATALAN, CATALAN_CATALAN), IL(0x5c, 0x01, CHEROKEE, CHEROKEE_CHEROKEE), IL(0x04, 0x01, CHINESE, CHINESE_TRADITIONAL), IL(0x04, 0x02, CHINESE, CHINESE_SIMPLIFIED), IL(0x04, 0x03, CHINESE, CHINESE_HONGKONG), IL(0x04, 0x04, CHINESE, CHINESE_SINGAPORE), IL(0x04, 0x05, CHINESE, CHINESE_MACAU), IL(0x83, 0x01, CORSICAN, CORSICAN_FRANCE), IL(0x1a, 0x01, CROATIAN, CROATIAN_CROATIA), IL(0x1a, 0x04, CROATIAN, CROATIAN_BOSNIA_HERZEGOVINA_LATIN), IL(0x05, 0x01, CZECH, CZECH_CZECH_REPUBLIC), IL(0x06, 0x01, DANISH, DANISH_DENMARK), IL(0x65, 0x01, DIVEHI, DIVEHI_MALDIVES), IL(0x13, 0x01, DUTCH, DUTCH), IL(0x13, 0x02, DUTCH, DUTCH_BELGIAN), IL(0x09, 0x01, ENGLISH, ENGLISH_US), IL(0x09, 0x02, ENGLISH, ENGLISH_UK), IL(0x09, 0x03, ENGLISH, ENGLISH_AUS), IL(0x09, 0x04, ENGLISH, ENGLISH_CAN), IL(0x09, 0x05, ENGLISH, ENGLISH_NZ), IL(0x09, 0x06, ENGLISH, ENGLISH_EIRE), IL(0x09, 0x07, ENGLISH, ENGLISH_SOUTH_AFRICA), IL(0x09, 0x08, ENGLISH, ENGLISH_JAMAICA), IL(0x09, 0x09, ENGLISH, ENGLISH_CARIBBEAN), IL(0x09, 0x0a, ENGLISH, ENGLISH_BELIZE), IL(0x09, 0x0b, ENGLISH, ENGLISH_TRINIDAD), IL(0x09, 0x0c, ENGLISH, ENGLISH_ZIMBABWE), IL(0x09, 0x0d, ENGLISH, ENGLISH_PHILIPPINES), IL(0x09, 0x10, ENGLISH, ENGLISH_INDIA), IL(0x09, 0x11, ENGLISH, ENGLISH_MALAYSIA), IL(0x09, 0x12, ENGLISH, ENGLISH_SINGAPORE), IL(0x25, 0x01, ESTONIAN, ESTONIAN_ESTONIA), IL(0x38, 0x01, FAEROESE, FAEROESE_FAROE_ISLANDS), IL(0x29, 0x01, FARSI, PERSIAN_IRAN), // LANG_FARSI AKA LANG_PERSIAN IL(0x64, 0x01, FILIPINO, FILIPINO_PHILIPPINES), IL(0x0b, 0x01, FINNISH, FINNISH_FINLAND), IL(0x0c, 0x01, FRENCH, FRENCH), IL(0x0c, 0x02, FRENCH, FRENCH_BELGIAN), IL(0x0c, 0x03, FRENCH, FRENCH_CANADIAN), IL(0x0c, 0x04, FRENCH, FRENCH_SWISS), IL(0x0c, 0x05, FRENCH, FRENCH_LUXEMBOURG), IL(0x0c, 0x06, FRENCH, FRENCH_MONACO), IL(0x56, 0x01, GALICIAN, GALICIAN_GALICIAN), IL(0x37, 0x01, GEORGIAN, GEORGIAN_GEORGIA), IL(0x07, 0x01, GERMAN, GERMAN), IL(0x07, 0x02, GERMAN, GERMAN_SWISS), IL(0x07, 0x03, GERMAN, GERMAN_AUSTRIAN), IL(0x07, 0x04, GERMAN, GERMAN_LUXEMBOURG), IL(0x07, 0x05, GERMAN, GERMAN_LIECHTENSTEIN), IL(0x08, 0x01, GREEK, GREEK_GREECE), IL(0x47, 0x01, GUJARATI, GUJARATI_INDIA), IL(0x75, 0x01, HAWAIIAN, HAWAIIAN_US), IL(0x0d, 0x01, HEBREW, HEBREW_ISRAEL), IL(0x39, 0x01, HINDI, HINDI_INDIA), IL(0x0e, 0x01, HUNGARIAN, HUNGARIAN_HUNGARY), IL(0x0f, 0x01, ICELANDIC, ICELANDIC_ICELAND), IL(0x21, 0x01, INDONESIAN, INDONESIAN_INDONESIA), IL(0x10, 0x01, ITALIAN, ITALIAN), IL(0x10, 0x02, ITALIAN, ITALIAN_SWISS), IL(0x11, 0x01, JAPANESE, JAPANESE_JAPAN), IL(0x60, 0x02, KASHMIRI, KASHMIRI_SASIA), IL(0x3f, 0x01, KAZAK, KAZAK_KAZAKHSTAN), IL(0x53, 0x01, KHMER, KHMER_CAMBODIA), IL(0x12, 0x01, KOREAN, KOREAN), IL(0x40, 0x01, KYRGYZ, KYRGYZ_KYRGYZSTAN), IL(0x54, 0x01, LAO, LAO_LAO), IL(0x26, 0x01, LATVIAN, LATVIAN_LATVIA), IL(0x27, 0x01, LITHUANIAN, LITHUANIAN), IL(0x2f, 0x01, MACEDONIAN, MACEDONIAN_MACEDONIA), IL(0x3e, 0x01, MALAY, MALAY_MALAYSIA), IL(0x3e, 0x02, MALAY, MALAY_BRUNEI_DARUSSALAM), IL(0x4c, 0x01, MALAYALAM, MALAYALAM_INDIA), IL(0x3a, 0x01, MALTESE, MALTESE_MALTA), //(0x58, 0x01, MANIPURI, ?), IL(0x4e, 0x01, MARATHI, MARATHI_INDIA), IL(0x50, 0x01, MONGOLIAN, MONGOLIAN_CYRILLIC_MONGOLIA), IL(0x50, 0x02, MONGOLIAN, MONGOLIAN_PRC), IL(0x61, 0x01, NEPALI, NEPALI_NEPAL), IL(0x61, 0x02, NEPALI, NEPALI_INDIA), IL(0x14, 0x01, NORWEGIAN, NORWEGIAN_BOKMAL), IL(0x14, 0x02, NORWEGIAN, NORWEGIAN_NYNORSK), IL(0x48, 0x01, ORIYA, ORIYA_INDIA), IL(0x15, 0x01, POLISH, POLISH_POLAND), IL(0x16, 0x01, PORTUGUESE, PORTUGUESE_BRAZILIAN), IL(0x16, 0x02, PORTUGUESE, PORTUGUESE), IL(0x18, 0x01, ROMANIAN, ROMANIAN_ROMANIA), IL(0x19, 0x01, RUSSIAN, RUSSIAN_RUSSIA), IL(0x4f, 0x01, SANSKRIT, SANSKRIT_INDIA), IL(0x91, 0x01, SCOTTISH_GAELIC, SCOTTISH_GAELIC), IL(0x1a, 0x01, SERBIAN, SERBIAN_CROATIA), IL(0x1a, 0x02, SERBIAN, SERBIAN_LATIN), // Serbia and Montenegro (former) IL(0x1a, 0x03, SERBIAN, SERBIAN_CYRILLIC), // Serbia and Montenegro (former) IL(0x1a, 0x06, SERBIAN, SERBIAN_BOSNIA_HERZEGOVINA_LATIN), IL(0x1a, 0x07, SERBIAN, SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC), IL(0x1b, 0x01, SLOVAK, SLOVAK_SLOVAKIA), IL(0x24, 0x01, SLOVENIAN, SLOVENIAN_SLOVENIA), IL(0x0a, 0x01, SPANISH, SPANISH), IL(0x0a, 0x02, SPANISH, SPANISH_MEXICAN), IL(0x0a, 0x03, SPANISH, SPANISH_MODERN), IL(0x0a, 0x04, SPANISH, SPANISH_GUATEMALA), IL(0x0a, 0x05, SPANISH, SPANISH_COSTA_RICA), IL(0x0a, 0x06, SPANISH, SPANISH_PANAMA), IL(0x0a, 0x07, SPANISH, SPANISH_DOMINICAN_REPUBLIC), IL(0x0a, 0x08, SPANISH, SPANISH_VENEZUELA), IL(0x0a, 0x09, SPANISH, SPANISH_COLOMBIA), IL(0x0a, 0x0a, SPANISH, SPANISH_PERU), IL(0x0a, 0x0b, SPANISH, SPANISH_ARGENTINA), IL(0x0a, 0x0c, SPANISH, SPANISH_ECUADOR), IL(0x0a, 0x0d, SPANISH, SPANISH_CHILE), IL(0x0a, 0x0e, SPANISH, SPANISH_URUGUAY), IL(0x0a, 0x0f, SPANISH, SPANISH_PARAGUAY), IL(0x0a, 0x10, SPANISH, SPANISH_BOLIVIA), IL(0x0a, 0x11, SPANISH, SPANISH_EL_SALVADOR), IL(0x0a, 0x12, SPANISH, SPANISH_HONDURAS), IL(0x0a, 0x13, SPANISH, SPANISH_NICARAGUA), IL(0x0a, 0x14, SPANISH, SPANISH_PUERTO_RICO), IL(0x0a, 0x15, SPANISH, SPANISH_US), IL(0x41, 0x01, SWAHILI, SWAHILI), IL(0x1d, 0x01, SWEDISH, SWEDISH), IL(0x1d, 0x02, SWEDISH, SWEDISH_FINLAND), IL(0x5a, 0x01, SYRIAC, SYRIAC_SYRIA), IL(0x1e, 0x01, THAI, THAI_THAILAND), IL(0x51, 0x01, TIBETAN, TIBETAN_PRC), IL(0x1f, 0x01, TURKISH, TURKISH_TURKEY), IL(0x22, 0x01, UKRAINIAN, UKRAINIAN_UKRAINE), IL(0x43, 0x01, UZBEK, UZBEK_LATIN), IL(0x43, 0x02, UZBEK, UZBEK_CYRILLIC), IL(0x2a, 0x01, VIETNAMESE, VIETNAMESE_VIETNAM), IL(0x52, 0x01, WELSH, WELSH_UNITED_KINGDOM) }; HWND g_hList; static INT AddLocale(HWND hCtl, LPCTSTR Name, UINT LangId) { INT idx = (INT) SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM) Name); if (idx != CB_ERR) SendMessage(hCtl, CB_SETITEMDATA, idx, LangId); return idx; } static BOOL CALLBACK EnumSysLocalesProc(LPTSTR lpLocaleString) { const UINT cchbuf1 = 80+2+80+1+2+85+1+!0, cchbuf2 = 85+!0; TCHAR buf1[cchbuf1], buf2[cchbuf2]; UINT lid = (UINT) StrToIntptr(lpLocaleString, true), lcid = MAKELCID(lid, SORT_DEFAULT); UINT retval = GetLocaleInfo(lcid, LOCALE_SENGLISHDISPLAYNAME|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1); if (!retval) // LOCALE_SENGLISHDISPLAYNAME is Win7+ { GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2); if ((retval = GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1))) --retval; retval += wsprintf(buf1+retval, retval ? TEXT(" (%s)") : TEXT("?"), buf2); } AddLocale(g_hList, buf1, lid); return true; } static void InitSysLangList(HWND hCtl) { g_hList = hCtl; // EnumSystemLocales is stupid and does not have a callback parameter SendMessage(hCtl, CB_SETCUEBANNER, 0, (LPARAM) L"Select a language..."); EnumSystemLocales(EnumSysLocalesProc, LCID_SUPPORTED); } static void InitIntLangList(HWND hCtl) { g_hList = hCtl; SendMessage(hCtl, CB_SETCUEBANNER, 0, (LPARAM) L"Select a language..."); for (UINT i = 0; i < sizeof(g_IntLang)/sizeof(INTLNG); ++i) { #ifdef UNICODE WCHAR name[200]; wsprintf(name, L"%S", g_IntLang[i].name); #else LPCTSTR name = g_IntLang[i].name; #endif AddLocale(hCtl, name, g_IntLang[i].id); } } static void OnLanguageChanged(HWND hDlg) { const UINT cchbuf1 = 80+2+80+1+2+85+1+!0, cchbuf2 = 85+!0; TCHAR buf1[cchbuf1], buf2[cchbuf2]; HWND hList = g_hList; INT idx = (INT) SendMessage(hList, CB_GETCURSEL, 0, 0); UINT lid = (UINT) SendMessage(hList, CB_GETITEMDATA, idx, 0), lcid = MAKELCID(lid, SORT_DEFAULT), retval; EnableWindow(GetDlgItem(hDlg, IDOK), idx != CB_ERR); if (idx == CB_ERR) { SetDlgItemText(hDlg, IDC_INFO, TEXT("")); SetDlgItemText(hDlg, IDC_LANGID, TEXT("")); SetDlgItemText(hDlg, IDC_CODEPAGE, TEXT("")); return ; } if ((retval = GetLocaleInfo(lcid, LOCALE_SNATIVEDISPLAYNAME|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1))) --retval; if (!retval) // LOCALE_SNATIVEDISPLAYNAME is Win7+ { GetLocaleInfo(lcid, LOCALE_SNATIVECTRYNAME|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2); if ((retval = GetLocaleInfo(lcid, LOCALE_SNATIVELANGNAME|LOCALE_NOUSEROVERRIDE, buf1, cchbuf1))) --retval; retval += wsprintf(buf1+retval, retval ? TEXT(" (%s)") : TEXT("?"), buf2); } if (retval && GetLocaleInfo(lcid, LOCALE_SNAME|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2) && *buf2) { wsprintf(buf1+retval, TEXT(" [%s]"), buf2); } SetDlgItemText(hDlg, IDC_INFO, buf1); wsprintf(buf1, TEXT("%u (0x%X)"), lid, lid); SetDlgItemText(hDlg, IDC_LANGID, buf1); wsprintf(buf1, TEXT("%u"), lid); SetDlgItemText(hDlg, IDC_COPYHELPER, buf1); retval = GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE|LOCALE_NOUSEROVERRIDE, buf2, cchbuf2); LPCTSTR cpstr = retval ? lstrcmp(buf2, TEXT("0")) ? buf2 : TEXT("1200 (Unicode-only)") : TEXT("?"); SetDlgItemText(hDlg, IDC_CODEPAGE, cpstr); } INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wp, LPARAM lp) { HWND hCtl, hCtl2; switch(Msg) { case WM_SIZE: if (wp == SIZE_MAXIMIZED) ShowWindow(hDlg, SW_SHOWNOACTIVATE); // Disallow STARTF_USESHOWWINDOW+SW_MAXIMIZE break; case WM_COMMAND: switch(wp) { case MAKELONG(IDOK, BN_CLICKED): // Using a secret edit box to copy to the clipboard hCtl = GetDlgItem(hDlg, IDC_COPYHELPER); SendMessage(hCtl, EM_SETSEL, 0, -1); SendMessage(hCtl, WM_COPY, 0, 0); break; case MAKELONG(IDCANCEL, BN_CLICKED): return EndDialog(hDlg, 0); case MAKELONG(IDC_SOURCE, CBN_SELCHANGE): hCtl = GetDlgItem(hDlg, IDC_SYSLANGLIST), hCtl2 = GetDlgItem(hDlg, IDC_INTLANGLIST); if (g_hList == hCtl) { HWND h; h = hCtl, hCtl = hCtl2, hCtl2 = h; } ShowWindow(g_hList = hCtl, SW_SHOW); ShowWindow(hCtl2, SW_HIDE); // fallthrough case MAKELONG(IDC_SYSLANGLIST, CBN_SELCHANGE): case MAKELONG(IDC_INTLANGLIST, CBN_SELCHANGE): OnLanguageChanged(hDlg); break; } break; case WM_INITDIALOG: { SendMessage(hDlg, WM_SETICON, ICON_BIG, lp); InitSysLangList(GetDlgItem(hDlg, IDC_SYSLANGLIST)); InitIntLangList(GetDlgItem(hDlg, IDC_INTLANGLIST)); hCtl = GetDlgItem(hDlg, IDC_SOURCE); SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM) TEXT("System")); SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM) TEXT("Internal")); SendMessage(hCtl, CB_SETCURSEL, 0, 0); // Select "System"... SendMessage(hDlg, WM_COMMAND, MAKELONG(IDC_SOURCE, CBN_SELCHANGE), (LPARAM) hCtl); // ...and notify PostMessage(hDlg, WM_NEXTDLGCTL, 0, FALSE); // Switches focus to the 2nd combobox } break; } return FALSE; } NSIS_ENTRYPOINT_GUINOCRT EXTERN_C void NSISWinMainNOCRT() { InitCommonControls(); HINSTANCE hInst = HINST_APPLICATION; HANDLE hIco = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_SHARED); INT_PTR retval = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG), 0, DialogProc, (LPARAM) hIco); ExitProcess((UINT) retval); } nsis-3.11/Contrib/MakeLangId/MakeLangId.ico000077500000000000000000000314461477201124000204070ustar00rootroot00000000000000€€h(F00h®( è/(þ1(€Z:^„Sªg¦i©h¦e-!»9)ía¡ÉeµÉÌþÉÉÉÿÿÿÿÿÿ""""!wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww$DDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDD¾îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDËîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDD̾îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌËîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌ̾îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌËîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌ̾îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌËîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̾îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌËîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîí¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌɈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌɈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌɈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌɈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌɈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̘ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌɈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̾îîîîîîîîîîîîîîîîîîîîîîîîîîîí¬ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌËîîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDnîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDFîîîîîîîîîîîîîîîîîîîîîîí$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDDDDDDDDDDDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDUUUUUUUUTDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDDUUUUTUUUUDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDEUUUUUUUUUDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDEUUUUUUUUUDDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡$DDUUUUUTUUUUUDDDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDnîîîîîîîîîîîîîîîí$CDUUUUUUUUUUUEUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDFîîîîîîîîîîîîîîîí$34UUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDnîîîîîîîîîîîîîîí$35UUUUUUUUUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDFîîîîîîîîîîîîîîí$35UUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDnîîîîîîîîîîîîîí$35UUUUUUUUUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDFîîîîîîîîîîîîîí$35UUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDnîîîîîîîîîîîîí$5UUUUUUUUUUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDFîîîîîîîîîîîîí%UUUUUUUUUUUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDnîîîîîîîîîîîí%UUUUUUUUUUUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDFîîîîîîîîîîîí%UUUUUUUUUUUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDnîîîîîîîîîîí%UUUUUUUUUUUUUUUUTDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDFîîîîîîîîîîí%UUUUUUUUUUUUUUUUTDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆ‡%UUUUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆˆ‡%UUUUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆ‡$UUUUUUUUUUUUUUUDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆˆ‡$UTUUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆ‡$EDUUUUUUUUUUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆˆ‡$TTDUUUUUUUUUUUUUTDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆ‡$DEEDUUUUUTUUUUUUDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆˆ‡%EEEUUUUUTTUUUUTTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆ‡$DDDUUUTDDDEUUUUTDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDDDAˆˆˆˆˆ‡$DDDDUUDDDDEUUUUDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆ‡$DDDEUUUUUUUUUUTDDDDDDDDÌÌÌÌÌÌÌÌDDDDDDDDDDDDDDDDDDDDDDDDDDAˆˆˆˆ‡""""""""""""""""""""""""ªªªªªªªª"""""""""""""""""""""""""""wwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0`Z;^ƒS§i¦Že-!»9)íC4ía¡ÉeµÉÌýÉÉÉþþþÿÿÿÿÿ"%UUUUUUUUUUUUUUUUUUUUUU#3ffffffffffffffffffffe#31wgfvffffffffffffffffe#33Oßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü#334ÿßÿÿßßÿÿÿßÿýÝßÿÿÿýßÜ#333OÿÿÿßÿÿÿÿÿßýßÿÿÿýÝÿÜ#3334ÿÝßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü#3333fffffffffffffffffe#33331wffffffffffffffffe#33333ffffffffffffffffe#333331wfffffffffffffffe#333333Oßÿÿÿÿÿÿÿÿÿÿÿÿÿÿü#3333334ÿßÿÿÿßÿÝýßÿÿÿýÝü#3333333OÿÿÿßÿÝßÿÿÿÿÿÝßü#33333334ÿÿÿÿÿÿÿÿÿÿÿÿÿÿü#33333333†fffffffffffffe#33333333¸vffffffffffffe#33333333»†ffffffffffffe›»»»»»»»»»¸vfffffffffffe›»»»»»»»»»»¯ÿÿÿÿÿÿÿÿÿÿÿü›»»»»»»»»»»ºÿýÿÝÿÿÿÿÿýÿü›»»»»»»»»»»»¯ýÿÝÿÿÿÿÿÝÿü›»»»»»»»»»»»ºÿÿÿÿÿÿÿÿÿÿü›»»»»»»»»»»»»†fffffffffe#33333333»»»31vffffffffe#33333333»»»33ffffffffe#33333333»»»331vfffffffe#33333333»»»333Oßÿÿÿÿÿÿü#33333333»»»3334ÿßÿÿÿýßÜ#33333333»»»3333OÿÿÿÿýÿÜ#33333333»»»33334ÿÿÿÿÿÿü#33333333»»»33333fffffe#33333333»»»333331fffffe#33333333»»»333333ffffe#33333333»»»3333331ffffe#33333333»»»3333333ÿÿÿü#33333333»»»33333334ÿÝÿü#33333333»»»33333333OÝÿü#33333333»»»333333334ÿÿü#33333333»»»333333333wu#33333333»»»3333333331fe"""""""""™™™""""""""""UUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @Z:^„Sªg¦i©h¦e-!»9)ía¡ÉeµÉÌþÉÉÉÿÿþÿÿÿ"wwwwwwwwwwwwww#1ˆˆˆˆˆˆˆˆˆˆˆˆˆ‡#3ˆˆˆˆˆˆˆˆˆˆˆˆ‡#31ˆˆˆˆˆˆˆˆˆˆˆˆ‡#33oÿÿÿÿÿÿÿÿÿÿÿí#336ÿîÿÿÿÿÿÿÿÿÿý#335oÿÿÿÿÿÿÿÿÿÿý#35UQˆˆˆˆˆˆˆˆˆˆ‡#5UUUˆˆˆˆˆˆˆˆˆ‡#5UUUQˆˆˆˆˆˆˆˆˆ‡%UUUUU¿ÿÿÿÿÿÿÿÿý#UUUUUËÿÿÿÿÿÿÿÿý¬ÌÌÌÌÌÌ¿ÿÿÿÿÿÿÿý¬ÌÌÌÌÌÌɈˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌ̘ˆˆˆˆˆˆ‡¬ÌÌÌÌÌÌÌɈˆˆˆˆˆ‡%DDEEDÌÌDoÿÿÿÿÿý$DTDDDÌÌDFÿÿÿÿÿý$DDUEDÌÌEEoÿÿÿÿý$TTDDDÌÌDDAˆˆˆˆ‡$DEEDTÌÌDEDˆˆˆ‡$EEDDDÌÌDTDQˆˆˆ‡$DDDETÌÌDDDDoÿÿý$EEEETÌÌDTTTVÿÿý$DDDDTÌÌDDDDDoÿý$DDDDDÌÌDDDDDAˆ‡$DDDDDÌÌDDDDDD‡""""""ªª""""""!wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( [<_†U§j¨f.!¾9)ícŤÌf¸ÌÌþÌÌÌÿÿÿÿÿÿÿÿÿÿ!UUUUUUU#fffffe#4ÌÌÌÌÌË#3LÌÌÌÌË#31ffffe#33vfffeŠªª©ÌÌÌËŠªªªœÌÌË#33ª1ffe#33ª3fe#33ª34ÌË#33ª33LË#33ª331e"""ˆ"""ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/MakeLangId/MakeLangId.xml000077500000000000000000000016661477201124000204360ustar00rootroot00000000000000 MakeLangId nsis-3.11/Contrib/MakeLangId/SConscript000077500000000000000000000005051477201124000177610ustar00rootroot00000000000000target = "MakeLangId" files = Split(""" MakeLangId.cpp """) res = Split(""" resource.rc """) resources = Split(""" MakeLangId.xml """) libs = Split(""" kernel32 user32 comctl32 """) Import('BuildUtil') BuildUtil(target, files, libs, res = res, resources = resources, entry = 'NSISWinMainNOCRT', nodeflib = True) nsis-3.11/Contrib/MakeLangId/resource.h000077500000000000000000000015121477201124000177460ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by resource.rc // #define IDR_MANIFEST 1 #define IDD_DIALOG 101 #define IDI_ICON 102 #define IDC_SOURCE 1001 #define IDC_SYSLANGLIST 1002 #define IDC_INTLANGLIST 1003 #define IDC_INFO 1004 #define IDC_LANGID 1005 #define IDC_CODEPAGE 1006 #define IDC_COPYHELPER 1007 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1008 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/MakeLangId/resource.rc000077500000000000000000000063721477201124000201340ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include \r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // IDI_ICON ICON "MakeLangId.ico" ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_DIALOG DIALOGEX DISCARDABLE 0, 0, 185, 95 STYLE DS_SETFONT | DS_FIXEDSYS | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX CAPTION "MakeLangID" FONT 8, "MS Shell Dlg" BEGIN COMBOBOX IDC_SOURCE, 7, 7, 171, 100, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_SYSLANGLIST, 7, 24, 171, 100, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_INTLANGLIST, 7, 24, 171, 100, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP CONTROL "", IDC_INFO, "STATIC", SS_LEFT | SS_NOTIFY | WS_CHILD | WS_VISIBLE | WS_GROUP, 7, 41, 171, 8 // SS_NOTIFY enables double-click to copy on Vista+ LTEXT "Language ID:", -1, 7, 51, 45, 8 CONTROL "", IDC_LANGID, "EDIT", ES_LEFT | ES_READONLY | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 58, 51, 119, 8 LTEXT "Codepage:", -1, 7, 61, 45, 8 CONTROL "", IDC_CODEPAGE, "EDIT", ES_LEFT | ES_READONLY | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 58, 61, 119, 8 DEFPUSHBUTTON "Copy", IDOK, 128, 74, 50, 14 PUSHBUTTON "Exit", IDCANCEL, 7, 74, 50, 14 CONTROL "", IDC_COPYHELPER, "EDIT", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0 END ///////////////////////////////////////////////////////////////////////////// // // RT_MANIFEST // 1 RT_MANIFEST "MakeLangId.xml" ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 178 TOPMARGIN, 7 BOTTOMMARGIN, 88 END END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/Makensisw/000077500000000000000000000000001477201124000157515ustar00rootroot00000000000000nsis-3.11/Contrib/Makensisw/License.txt000077500000000000000000000016161477201124000201030ustar00rootroot00000000000000Copyright (c) 2002 Robert Rainwater This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. nsis-3.11/Contrib/Makensisw/Readme.txt000077500000000000000000000163441477201124000177220ustar00rootroot00000000000000---------------------------------------------------- MakeNSISW - MakeNSIS Windows Wrapper ---------------------------------------------------- About MakeNSISW --------------- MakeNSISW is a wrapper for the NSIS compiler (MakeNSIS). MakeNSISW allows you to compile NSIS scripts using a Windows GUI interface. Requirements ------------ MakeNSISW requires NSIS be installed on your system. The default directory for this installation is $PROGRAMFILES\NSIS\Contrib\MakeNSISW. Usage: ------ If you installed the Shell Extensions option during the installation, then all that is required is that you choose 'Compile NSI' from the right- click menu on a NSIS script. This will invoke MakeNSISW. The format of the parameters when calling MakeNSISW from the commandline is: makensisw [options] [script.nsi | - [...]] For the options, please see the MakeNSIS documentation. Shortcut Keys ------------- Ctrl+A: Select all text Ctrl+B: Open Script Folder Ctrl+C: Copy selected text Ctrl+D: Open the Define Symbols dialog Ctrl+E: Edit the script Ctrl+F: Find text Ctrl+K: Abort compiler Ctrl+L: Load a script Ctrl+R, F7: Recompile the script Ctrl+T, Ctrl+F5: Test the installer Ctrl+W: Clear log window Ctrl+<+|-|0>: Zoom log window Alt+X: Exit the application F1: View Documentation F5: Recompile and Test Version History --------------- 0.1 - Initial Release 0.2 - Added ability to save output and copy output 0.3 - Added option to recompile script (F2 or File|Recompile) - Added Help Menu - Return code is now always set - Added Accelerator key support for Exit and Recompile - No longer uses NSIS's version string - Made clearer status message in title bar - Disabled menu/accelerator functions during compile 0.4 - Fixed Copy Selected bug 0.5 - Minor Makefile changes (mingw) - Moved strings into global strings to make editing easier - Added Clear Log Command under Edit menu - Recompile no longer clears the log window (use F5) - Close is now the default button when you hit enter - added VC++ project, updated resources to work with VC++ - rearranged directory structure - makefiles now target ../../makensisw.exe - removed makensisw home link in help menu (hope this is ok, doesn't really seem needed to me) - made display use a fixed width font (Some people may not like this, but I do) - added 'test' button (peeks output for 'Output' line) - made it so that the log shows the most recent 32k. - made it so that the log always clears on a recompile. - compiled with VC++ so no longer needs msvcrt.dll - made the compiler name be a full path (for more flexibility) 0.6 - print correct usage if unable to execute compiler - removed mingw warnings - set title/branding before errors - some docs changes - Added Edit|Edit Script function 0.7 - Edit Script should now work for output>32k - Added resize support (thanks to felfert) - Added window position saving (thanks to felfert) - Disable some items when exec of makensis failed 0.8 - Added window size constraints (thanks to bcheck) - Cleaned up the resource file 0.9 - Removed global strings (moved into #defines) - Some GUI changes - No longer focused Close button (its default anyways) - Fixed resize bug on minimize/restore (thanks to felfert) - Made window placement stored in HKLM instead of HKCU, cause I hate things that get littered in HKCU. 1.0 - Fixed bug with large output causing crash 1.1 - Crash may actually be fixed 1.2 - XP visual style support 1.3 - Added Documentation menu item - Fix GUI problem with About dialog 1.4 - Edit Script command will now work with or without file associations - Added default filename for save dialog - Use standard fonts - Documentation menuitem caused recompile 1.5 - Fixed Copy All function 1.6 - Reduced size from 44k to 12k (kichik) - Editbox not limited to 32k (now using richedit control) - Made the log window font-size smaller. 1.7 - Added check for warnings - Added sound for successful compilations - Update home page and documentation menu items to Sourceforge page 1.8 - Contents of log window are now streamed in - Empty log window check (to prevent random crashes) 1.9 - Text always scrolls to bottom (kichik) - Updated link to new docs - Makensisw now takes the same parameters as makensis.exe - Fixed some random crashes - Drag and Drop Support into the Makensisw window - Updated icon to more sexy one - Added Load Script option on File menu - Added Search Dialog (Ctrl+F) (kichik) - Added Select All (Ctrl+A), Copy (Ctrl+C), Exit (Alt+X) keys - Branding text now reflects NSIS version - Added some simple tool tips - Added Context Menu in log window - Added resize gripper - Ctrl+L loads a script - Added Clear Log (Ctrl+W) - Browse Script (Ctrl+B) launches explorer in script directory - Check for Update command - Added link to the NSIS Forum under Help menu - Bunch of other stuff not worth mentioning - Define Symbols menu (Ctrl+D) 2.0 - Improved user interface - Define Symbols is available even if a script is not loaded - Defined Symbols are saved on exit and reloaded on start - Added NSIS Update menu - Added toolbar for commonly used menus - Made the Toolbar style flat - Added option for compile & run - Added compressor setting option - Added support for lzma compression - Added named Symbols sets. 2.1 - Added "Cancel compilation" menu item 2.2 - Settings saved in HKCU instead of HKLM - Added menu accelerators to MRU list 2.3 - Escape button closes MakeNSISw 2.3.1 - Fixed broken command line parameter handling 2.3.2 - The size gripper can be used to resize the window 2.3.3 - Update check switched from JNetLib to WinInet - New file type icons 2.3.4 - Added Window Info/Spy feature - System DPI aware - New toolbar images 2.3.5 - Added log window colors - Basic AppEvents custom sound support for BuildComplete, BuildWarning and BuildError 2.3.6 - Added GUID generator tool 2.4 - Added Lookup tool - Use Consolas font if it exists 2.4.1 - Close button transforms to Abort when appropriate - Prevent user from modifying the log - Log zoom Copyright Information --------------------- Copyright (c) 2002 Robert Rainwater Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg, Anders Kjersem. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. nsis-3.11/Contrib/Makensisw/SConscript000077500000000000000000000014061477201124000177670ustar00rootroot00000000000000target = 'makensisw' files = Split(""" makensisw.cpp toolbar.cpp utils.cpp version.cpp update.cpp lookup.cpp wndspy.cpp """) res = Split(""" resource.rc """) resources = Split(""" icon.ico assoc_nsi.ico assoc_nsh.ico makensisw.xml toolbar.bmp toolbar16n24.bmp toolbar16d24.bmp toolbar16h24.bmp toolbar24n24.bmp toolbar24d24.bmp toolbar24h24.bmp toolbar32n24.bmp toolbar32d24.bmp toolbar32h24.bmp """) libs = Split(""" advapi32 user32 gdi32 msimg32 shell32 shlwapi comdlg32 comctl32 wininet winmm kernel32 ole32 """) docs = Split(""" License.txt Readme.txt """) Import('BuildUtil') BuildUtil( target, files, libs, res = res, resources = resources, entry = None, defines = ['RELEASE=2.4.1'], docs = docs, root_util = True ) nsis-3.11/Contrib/Makensisw/afxres.h000077500000000000000000000003611477201124000174150ustar00rootroot00000000000000// Reviewed for Unicode support by Jim Park -- 08/17/2007 #define _WIN32_IE 0x0400 #include #include #ifndef IDC_STATIC #define IDC_STATIC -1 #endif #ifndef LWS_IGNORERETURN #define LWS_IGNORERETURN 0x0002 #endif nsis-3.11/Contrib/Makensisw/assoc_nsh.ico000077500000000000000000010405261477201124000204400ustar00rootroot00000000000000 èf(N00¨v ¨hÆ ( .!( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwwwÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿòÿÿÿ""""ÿ÷ÿò/ÿò7ww/ÿ÷ÿò2ÿ#3wr/ÿ÷ÿò3"337"/ÿ÷ÿò33332"/ÿ÷ÿò3333f"/ÿ÷ÿò3336fb/ÿ÷ÿò333fff/ÿ÷ÿò336fff/ÿ÷ÿòs3ffff/ÿ÷ÿò76ffff/ÿ÷ÿòsvff"f/ÿ÷ÿò7gfbÿ&/ÿ÷ÿòvvv/ÿò/ÿ÷ÿ""""ÿÿÿ/ÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿwwwwÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿpwwwwwwwwwÿÿÿÿðððððððððððððððððððððððððð?ððÿðÿðÿÿÿÿÿ( À€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwÿÿÿÿ÷ÿÿÿÿ÷òÿ""÷ò"w/÷ò32/÷ò3f/÷òvf/÷òw"/÷""ÿ/÷ÿÿÿÿ÷ÿÿÿwwÿÿÿpÿÿÿwwwwwpÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿ(0`€ ÿÿÿ—”’›˜–óóóB›¹W„¨1m™ /0BT„AADkSRe`1L8|s]”ާ¤¢´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿýÿÿxt[´®Ì`x_ûÿÿÿüýÿÿýþxt[´®”S7ÿÿÿýÿÿÔ_þþÿÿÿýÿÿ .ON+xt[´®ýÿÿþÿÿ0_                      üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüÿüÿüÿüÿüÿüÿü?ÿüÿüÿÿüÿÿ( @€ÿÿÿ—”’óóóB†¤F›¹W„¨1 /0aŠ m™ T„AADke`SR1L8|sU†r]”Ž        ÿÿÿÿðððððððððððððððððððððððððð?ððÿðÿðÿÿÿÿÿ( @ÿÿÿ—”’Tœº[ /0q&SRAADkT„e`8|s1L]”´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿèJKxt[èJK+ýÿÿ#$%%J&R'4xt[èJKÌ*þÿÿ*ýÿÿP_$þÿÿ%þÿÿ& '1(Q)L*(+,ýÿÿ-þÿÿ2xt[èJKT*  ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿ( •“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿêéëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿêéëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäãåÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿáàâÿáàâÿôôôÿþýþÿêéëÿäâäÿãâäÿëêëÿþþþÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäãåÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññòÿîíîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿññòÿäãåÿþýþÿüüüÿãâäÿóòóÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿññòÿîíîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿäãåÿýýýÿåäæÿòñòÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿäãåÿþýþÿÿÿÿÿýýýÿóòóÿéèéÿóòóÿýýýÿÿÿÿÿÿÿÿÿôôôÿáàâÿéèéÿéèéÿüüüÿìëíÿéèéÿÿÿÿÿÿÿÿÿéèéÿìëíÿôôôÿáàâÿåäæÿåäæÿüüüÿÿÿÿÿÿÿÿÿýýýÿóòóÿéèéÿóòóÿýýýÿÿÿÿÿüüüÿäãåÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûûûÿéèêÿæåæÿêéëÿþþþÿöõöÿæåçÿèçéÿæåæÿúúúÿûúûÿçæèÿæåæÿâáãÿôôôÿöõöÿéèéÿçæèÿâáãÿéèéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìëíÿóòóÿÿÿÿÿÿÿÿÿïîðÿáàâÿñðñÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿø÷øÿø÷øÿþþþÿñðñÿäãåÿþþþÿþýþÿäâäÿòñòÿôôôÿáàâÿûûûÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïîðÿáàâÿñðñÿÿÿÿÿÿÿÿÿÿÿÿÿìëíÿóòóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿöõöÿïîðÿùøùÿâáãÿïîðÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿæåæÿÿÿÿÿüüüÿîîïÿçæèÿïîðÿýýýÿÿÿÿÿÿÿÿÿôôôÿáàâÿåäæÿåäæÿöõöÿýýýÿçæèÿåäæÿäãåÿèçéÿþýþÿôôôÿáàâÿåäæÿåäæÿùøùÿÿÿÿÿÿÿÿÿüüüÿîîïÿçæèÿïîðÿýýýÿÿÿÿÿÿÿÿÿùøùÿæåæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿùùùÿöõöÿÿÿÿÿø÷øÿôôôÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõôõÿþýþÿÿÿÿÿÿÿÿÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿûûûÿûûûÿûûûÿþýþÿÿÿÿÿÿÿÿÿúúúÿúúúÿÿÿÿÿÿÿÿÿþýþÿûûûÿûûûÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõôõÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäãåÿûúûÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿäãåÿçæèÿåäæÿùøùÿÿÿÿÿÿÿÿÿðïðÿãâäÿåäæÿäãåÿùøùÿôôôÿáàâÿÿÿÿÿóòóÿâáãÿùøùÿêéëÿâáãÿäâäÿíìíÿôôôÿáàâÿÿÿÿÿóòóÿâáãÿùøùÿêéëÿäâäÿãâäÿëêëÿþþþÿþýþÿêéëÿäâäÿãâäÿëêëÿþþþÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿêéëÿÿÿÿÿðïðÿãâäÿåäæÿäãåÿùøùÿùøùÿäâäÿèçéÿæåæÿüüüÿùøùÿâáãÿæåæÿãâäÿôôôÿôôôÿåäæÿÿÿÿÿùùùÿäãåÿèçéÿèçéÿùùùÿäãåÿçæèÿåäæÿùøùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿçæèÿôôôÿóóôÿùùùÿÿÿÿÿÿÿÿÿø÷øÿþýþÿüüüÿéèéÿêéëÿôôôÿáàâÿø÷øÿâáãÿóóôÿññòÿäâäÿüüüÿÿÿÿÿ÷÷÷ÿôôôÿáàâÿø÷øÿâáãÿóóôÿññòÿäãåÿþýþÿüüüÿãâäÿóòóÿññòÿäãåÿþýþÿüüüÿãâäÿóòóÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿéèêÿöõöÿÿÿÿÿø÷øÿþýþÿüüüÿéèéÿêéëÿìëìÿìëìÿÿÿÿÿçæèÿòñòÿñðñÿçæèÿÿÿÿÿåäæÿôôôÿôôôÿåäæÿÿÿÿÿìëìÿìëìÿÿÿÿÿýýýÿìëìÿçæèÿôôôÿóóôÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿéèéÿôôôÿãâäÿöõöÿÿÿÿÿÿÿÿÿùùùÿæåçÿáàâÿâáãÿõôõÿôôôÿáàâÿéèéÿãâäÿöõöÿìëíÿéèéÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿéèéÿãâäÿöõöÿìëíÿéèéÿÿÿÿÿÿÿÿÿéèéÿìëíÿìëíÿéèéÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿåäæÿÿÿÿÿÿÿÿÿùùùÿæåçÿáàâÿâáãÿõôõÿìëíÿëêëÿÿÿÿÿæåæÿóòóÿñðñÿéèéÿÿÿÿÿåäæÿôôôÿôôôÿäâäÿ÷÷÷ÿìëìÿéèêÿÿÿÿÿúúúÿìëíÿéèéÿôôôÿãâäÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿéèêÿæåæÿêéëÿþþþÿÿÿÿÿÿÿÿÿîíîÿæåæÿùøùÿþýþÿûûûÿôôôÿáàâÿÿÿÿÿïîðÿæåæÿñðñÿäãåÿþýþÿÿÿÿÿùøùÿôôôÿáàâÿÿÿÿÿïîðÿæåæÿñðñÿäãåÿþþþÿþýþÿäâäÿòñòÿñðñÿäãåÿþþþÿþýþÿäâäÿòñòÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîíîÿññòÿÿÿÿÿÿÿÿÿîíîÿæåæÿùøùÿþýþÿûûûÿûúûÿèçéÿäãåÿëêëÿþýþÿòñòÿìëìÿÿÿÿÿéèéÿöõöÿöõöÿçæèÿêéëÿóóôÿéèêÿåäæÿêéëÿûûûÿéèêÿæåæÿêéëÿþþþÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿäâäÿèçéÿäãåÿññòÿôôôÿáàâÿåäæÿâáãÿðïðÿþýþÿçæèÿäâäÿæåæÿëêëÿôôôÿáàâÿåäæÿâáãÿðïðÿýýýÿçæèÿåäæÿäãåÿèçéÿþýþÿýýýÿçæèÿåäæÿäãåÿèçéÿþýþÿéèéÿäãåÿáàâÿåäæÿïîðÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿäâäÿýýýÿÿÿÿÿÿÿÿÿùøùÿäâäÿèçéÿäãåÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿþýþÿûûûÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿûûûÿÿÿÿÿþýþÿûûûÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿúúúÿÿÿÿÿÿÿÿÿüüüÿûûûÿûûûÿûûûÿýýýÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿb›bÿDÿ„°„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïçÿ+g*ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ+g+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïçÿ)a(ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ#R"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïçÿ)a(ÿ@ÿ@ÿC ÿ@ÿ@ÿ'l@ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ9~^ÿ'l@ÿ@ÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿ@ÿzªzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïçÿ)a(ÿ@ÿ@ÿ"eGÿ$pVÿD ÿ@ÿDÿ9~^ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ>dÿDÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿO9ÿG*ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïçÿ)a(ÿ@ÿ@ÿ"eGÿ6zrÿ6zrÿ$pVÿD ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ>dÿDÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿa\ÿH,ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïçÿ)a(ÿ@ÿ@ÿ"eGÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ>dÿDÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿb]ÿH,ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàëàÿ)a(ÿ@ÿ@ÿ"eGÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ>dÿDÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿb]ÿH,ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿ@ÿ"eGÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿb]ÿH,ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿAÿ"gIÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ$T#ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿb]ÿH,ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ"O!ÿÕäÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿb]ÿH,ÿ@ÿ@ÿp¤oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ8~]ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿb]ÿH,ÿ@ÿ@ÿgžgÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿBÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿb]ÿH,ÿ@ÿ@ÿ^˜]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ'r[ÿF"ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ@ÿ#Dÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿb]ÿJ/ÿ@ÿ@ÿ^˜]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêßÿ&Z&ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ8~]ÿBÿ@ÿ@ÿ-Iÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿ^˜]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ&Z&ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ5|XÿBÿ@ÿ@ÿ-Iÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿ^˜]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ$T#ÿ@ÿAÿ"iKÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿ^˜]ÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ$T#ÿ@ÿBÿ"jMÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿAÿ-Iÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿ^˜]ÿäãåÿüüüÿôôôÿáàâÿÿÿÿÿîíîÿäâäÿòñòÿáàâÿáàâÿáàâÿôôôÿÿÿÿÿûûûÿáàâÿø÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ$T#ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿ^˜]ÿûûûÿôôôÿáàâÿóóôÿâáãÿ÷÷÷ÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿáàâÿø÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ$T#ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ0yRÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿT’TÿóóôÿáàâÿâáãÿîîïÿÿÿÿÿôôôÿáàâÿéèéÿéèéÿüüüÿÿÿÿÿóòóÿáàâÿîîïÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ$T#ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH$ÿ@ÿAÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿK0ÿ@ÿ@ÿKKÿáßáÿññòÿåäæÿüüüÿôôôÿáàâÿø÷øÿø÷øÿþþþÿýýýÿäâäÿîíîÿâáãÿúúúÿÿÿÿÿÕäÕÿ$T#ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ+t`ÿH%ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc^ÿL3ÿ@ÿ@ÿKKÿþþþÿëêëÿéèéÿóóôÿáàâÿåäæÿåäæÿöõöÿíìíÿæåæÿÿÿÿÿìëíÿéèéÿÕäÕÿ$T#ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ0yRÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿKKÿýýýÿûûûÿýýýÿûûûÿûûûÿûûûÿþýþÿûûûÿþýþÿÿÿÿÿþýþÿËÝËÿ#R"ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ.wNÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿKKÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿBÿ"kNÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ)uHÿ@ÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿKKÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿCÿ"nRÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ)uHÿ@ÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿKKÿáßáÿáàâÿáàâÿôôôÿÿÿÿÿËÝËÿ"O!ÿ@ÿCÿ"nRÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ[“ÿ[“ÿ)uHÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿKKÿþþþÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿCÿ"nRÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ)uHÿ[“ÿ[“ÿ[“ÿ)uHÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿB†AÿüýüÿËÝËÿ"O!ÿ@ÿCÿ"nRÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ'ÿ@ÿ@ÿ(pDÿ[“ÿ)uHÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc_ÿL3ÿ@ÿ@ÿ2z2ÿ"O!ÿ@ÿCÿ"nRÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ6zrÿ-veÿJ(ÿ@ÿ@ÿ$^5ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿN7ÿ@ÿ@ÿ@ÿ@ÿCÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿG$ÿE!ÿ@ÿ@ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\Qÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿ@ÿ@ÿ@ÿD"ÿUDÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿUEÿH,ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿA ÿMGÿG1ÿ@ÿ@ÿL3ÿc_ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿTCÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿA ÿMGÿQRÿQRÿG1ÿ@ÿ@ÿL3ÿc_ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿTCÿ@ÿ@ÿ Bÿ/Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿA ÿMGÿQRÿQRÿQRÿQRÿG1ÿ@ÿ@ÿL3ÿc_ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿTCÿ@ÿ@ÿ Bÿ/Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿA ÿMGÿQRÿQRÿQRÿQRÿQRÿQRÿG1ÿ@ÿ@ÿK1ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿTCÿ@ÿ@ÿ Bÿ/Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿA ÿMGÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿG1ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿTCÿ@ÿ@ÿ Bÿ/Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿ\RÿAÿ@ÿA ÿMGÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿTCÿ@ÿ@ÿ Bÿ/Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA ÿMGÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿS@ÿ@ÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA ÿMGÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿR?ÿ@ÿ@ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿR?ÿ@ÿ@ÿ%Iÿ3X ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿR?ÿ@ÿ@ÿ&KÿBgÿCiÿ5Z ÿ@ÿ@ÿ Aÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿK0ÿc^ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿR?ÿ@ÿ@ÿ&KÿBgÿCiÿCiÿCiÿ5Z ÿ@ÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿI.ÿ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`ÿR?ÿ@ÿ@ÿ&KÿBgÿCiÿCiÿCiÿCiÿCiÿ6Z ÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿH4ÿ@ÿ@ÿH,ÿ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`ÿR?ÿ@ÿ@ÿ&KÿBgÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿZMÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿH,ÿb]ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿR?ÿ@ÿ@ÿ&KÿBgÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿXJÿAÿ@ÿA!ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿH,ÿb]ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿQ<ÿ@ÿ@ÿ&KÿBgÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿNIÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿH,ÿb]ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ&KÿBgÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿH,ÿb]ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ'LÿBgÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿAÿ.Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿH,ÿb]ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿAÿ.Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿH,ÿb]ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ7\ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿG*ÿa\ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ8\ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿI8ÿ@ÿ@ÿG*ÿa\ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿc`ÿXJÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿJ;ÿ@ÿ@ÿG*ÿa\ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿc`ÿO;ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿc`ÿVGÿ@ÿ@ÿB"ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿJ;ÿ@ÿ@ÿG*ÿa\ÿc`ÿc`ÿc`ÿc`ÿc`ÿO8ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿQ=ÿVGÿ@ÿ@ÿB#ÿOKÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿJ;ÿ@ÿ@ÿG*ÿa\ÿc`ÿc`ÿc`ÿN7ÿ@ÿ@ÿ(MÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿG)ÿ@ÿ@ÿC$ÿOLÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿJ;ÿ@ÿ@ÿG*ÿa\ÿc`ÿN7ÿ@ÿ@ÿ)NÿBhÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿC$ÿOLÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿQRÿJ;ÿ@ÿ@ÿG*ÿM6ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ-Iÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿ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(ÿAÿ@ÿ@ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9^ÿAÿ@ÿ@ÿ,Hÿ0Jÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ9_ÿAÿ@ÿ@ÿ,Hÿ0Jÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿ@&ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?.ÿ?ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ;`ÿAÿ@ÿ@ÿ,Hÿ0Jÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ@ÿ@ÿ@ÿ?8ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?*ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ;`ÿAÿ@ÿ@ÿ,Hÿ0Jÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ9"ÿ>ÿ@ÿ@ÿ?8ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?)ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ;`ÿAÿ@ÿ@ÿ,Hÿ0Jÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ 1,ÿ>ÿ@ÿ@ÿ?8ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿ*NÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ;`ÿAÿ@ÿ@ÿ,Hÿ&E ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ 1,ÿ>ÿ@ÿ@ÿ?8ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿ,PÿChÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ;`ÿAÿ@ÿ@ÿ"Cÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ 1,ÿ>ÿ@ÿ@ÿ?8ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿ,PÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿCiÿ;`ÿAÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ 1,ÿ>ÿ@ÿ@ÿ?8ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿBÿ/T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ0T ÿ(Lÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ 1,ÿ>ÿ@ÿ@ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ 1,ÿ>ÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿ@ÿ@ÿBÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ*Qÿ&Lÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ 0-ÿ>ÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@(ÿ@ÿ@ÿ6bÿ*Sÿ@ÿ@ÿÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@'ÿ@ÿ@ÿ7cÿk˜ ÿc“ÿ*Sÿ@ÿ@ÿÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ7cÿk˜ ÿl˜ ÿl˜ ÿc“ÿ*Sÿ@ÿ@ÿÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ:hÿk˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿc“ÿ*Sÿ@ÿ@ÿÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿc“ÿ*Sÿ@ÿ@ÿÿ@ÿ?ÿ?7ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿc“ÿ*Sÿ@ÿ@ÿ9c ÿ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‚ÿM{ÿ$Iÿ@ÿAÿJ}ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ 0-ÿ>ÿ@ÿ?ÿ?6ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿc“ÿ,Tÿ@ÿ@ÿ9c ÿ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‚ÿM{ÿ$Iÿ@ÿAÿJ}ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ 0-ÿ>ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ9c ÿ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‚ÿM{ÿ$Iÿ@ÿAÿJ}ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ@&ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ9c ÿ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‚ÿM{ÿ$Iÿ@ÿAÿJ}ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ??ÿ@&ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ9c ÿ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‚ÿMzÿ$Iÿ@ÿAÿJ}ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ;iÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ9c ÿ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‚ÿLyÿ"Gÿ@ÿAÿJ}ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ>m ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ9c ÿ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‚ÿLyÿ"Gÿ@ÿCÿK}ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ9c ÿ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‚ÿLyÿ"Gÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?5ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ-Vÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿLyÿ"Gÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?4ÿ?@ÿ?@ÿ?@ÿ?@ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿf• ÿ.Xÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿLyÿ"Gÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿ@ÿ?3ÿ?@ÿ?@ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿLyÿ"Gÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿ?3ÿ?@ÿ??ÿ?%ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿLyÿ"Gÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿ?1ÿ?$ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿKyÿ"Gÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿ@ÿ@ÿ?n ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿJvÿ Eÿ@ÿCÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -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-ÿ@ÿ@ÿ@ÿBr ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿJvÿ Eÿ@ÿ DÿNÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ ..ÿ< ÿ@ÿ@ÿCs ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ6_ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿJvÿ Eÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿûûûÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ ..ÿ< ÿ@ÿ@ÿCs ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ0[ÿ@ÿ@ÿ2[ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿJvÿ Eÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿûûûÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ ..ÿ< ÿ@ÿ@ÿCs ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿi– ÿ2]ÿ@ÿ@ÿ2[ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿT‚ÿJvÿ Eÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿûûûÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿäâäÿ÷÷÷ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ ..ÿ< ÿ@ÿ@ÿCs ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿk— ÿ4_ÿ@ÿ@ÿ2[ÿT‚ÿT‚ÿT‚ÿT‚ÿJvÿ Eÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿöõöÿçæèÿêéëÿòñòÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ ..ÿ< ÿ@ÿ@ÿCs ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿk— ÿ4_ÿ@ÿ@ÿ2[ÿT‚ÿT‚ÿJvÿ Eÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿCs ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿk— ÿ4_ÿ@ÿ@ÿ2[ÿIvÿ Eÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿ-VÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿFv ÿEu ÿ#Iÿ@ÿ@ÿAÿ@ÿ DÿR…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿAÿQ…ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿ@ÿ@ÿ@ÿ"Iÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$Lÿ$LÿDÿ@ÿ@ÿ@ÿ@ÿ7cÿ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˜ ÿ=kÿ@ÿ.n.ÿäãåÿûûûÿúúúÿâáãÿçæèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿAÿ6mÿ@ÿ@ÿ)SÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ\‘ÿ Eÿ@ÿ"O!ÿ2z2ÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿçæèÿïîðÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿAÿPŒ%ÿš¹VÿF‡ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ\‘ÿ Eÿ@ÿ"O!ÿËÝËÿüýüÿCˆCÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿçæèÿîîïÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿAÿPŒ%ÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ\‘ÿ Eÿ@ÿ"O!ÿËÝËÿùøùÿþýþÿúúûÿKKÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿæåçÿûúûÿçæèÿâáãÿåäæÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /.ÿ<ÿ@ÿAÿPŒ%ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ\‘ÿ Eÿ@ÿ"O!ÿËÝËÿäâäÿèçéÿäãåÿññòÿîîïÿKKÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿôôôÿåäæÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿAÿPŒ%ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿZÿ Eÿ@ÿ"O!ÿËÝËÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿýýýÿúúûÿKKÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿAÿPŒ%ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ"O!ÿËÝËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿKKÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿBÿX‘*ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ$T#ÿÍßÍÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿKKÿ@ÿ@ÿ4_ÿk— ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäãåÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿBÿZ’+ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ(RÿtŸ'ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ$T#ÿÕäÕÿñðñÿäâäÿêéëÿáàâÿûûûÿôôôÿåäæÿÿÿÿÿùùùÿäãåÿçæèÿåäæÿø÷øÿKKÿ@ÿ@ÿ3^ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿùøùÿÿÿÿÿÿÿÿÿöõöÿêéëÿÿÿÿÿôôôÿåäæÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿôôôÿáàâÿÿÿÿÿóòóÿâáãÿùøùÿçæèÿäâäÿâáãÿîîïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿBÿZ’+ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿPŒ%ÿAÿ@ÿ&Oÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ$T#ÿÕäÕÿþþþÿìëíÿéèêÿõôõÿáàâÿûûûÿôôôÿåäæÿÿÿÿÿìëìÿçæèÿôôôÿóóôÿùùùÿþþþÿKKÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿêéëÿÿÿÿÿÿÿÿÿéèêÿöõöÿÿÿÿÿôôôÿåäæÿ÷÷÷ÿëêëÿôôôÿáàâÿÿÿÿÿôôôÿáàâÿø÷øÿâáãÿóóôÿôôôÿäâäÿþþþÿöõöÿáàâÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿBÿZ’+ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿQ&ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ$T#ÿÕäÕÿåäæÿ÷÷÷ÿýýýÿöõöÿîíîÿáàâÿûûûÿôôôÿäâäÿ÷÷÷ÿìëìÿéèéÿôôôÿãâäÿöõöÿÿÿÿÿùùùÿU“Uÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿõôõÿÿÿÿÿúúúÿåäæÿÿÿÿÿÿÿÿÿôôôÿåäæÿêéëÿåäæÿìëìÿáàâÿÿÿÿÿôôôÿáàâÿéèéÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿBÿZ’+ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿZ’+ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ$T#ÿÕäÕÿüüüÿîíîÿðïðÿöö÷ÿæåæÿäãåÿìëìÿÿÿÿÿöõöÿçæèÿêéëÿóòóÿéèêÿæåæÿêéëÿþþþÿÿÿÿÿîíîÿññòÿ^˜]ÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿûûûÿÿÿÿÿîíîÿññòÿÿÿÿÿÿÿÿÿôôôÿâáãÿæåæÿ÷÷÷ÿâáãÿáàâÿÿÿÿÿôôôÿáàâÿÿÿÿÿïîðÿæåæÿôôôÿåäæÿÿÿÿÿø÷øÿáàâÿûûûÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ -0ÿ /-ÿ=ÿ@ÿBÿZ’+ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿZ’+ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿUŒÿCÿ@ÿ$T#ÿÕäÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿäâäÿýýýÿÿÿÿÿ^˜]ÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿññòÿþýþÿäâäÿýýýÿÿÿÿÿÿÿÿÿôôôÿáàâÿòñòÿÿÿÿÿçæèÿáàâÿÿÿÿÿôôôÿáàâÿåäæÿâáãÿðïðÿôôôÿåäæÿÿÿÿÿø÷øÿáàâÿûûûÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ -0ÿ 0-ÿ=ÿ@ÿBÿZ’+ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿZ’+ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿOŠÿCÿ@ÿ$T#ÿÕäÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿ^˜]ÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿüüüÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿûûûÿÿÿÿÿÿÿÿÿþýþÿûûûÿÿÿÿÿþýþÿûûûÿûûûÿþýþÿÿÿÿÿþýþÿüüüÿÿÿÿÿþþþÿûûûÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ -0ÿ 0-ÿ>ÿ@ÿBÿZ’+ÿš¹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ÿZ’+ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ$T#ÿÕäÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^˜]ÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.n.ÿ@ÿ7%ÿ -0ÿ 0-ÿ>ÿ@ÿDÿe˜3ÿš¹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ÿš¹Vÿš¹VÿZ’+ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ&Z&ÿØæØÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿ^˜]ÿ@ÿ@ÿ0[ÿi– ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿ.n.ÿ@ÿ7%ÿ 0-ÿ>ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹VÿZ’+ÿBÿ@ÿ%Nÿn›$ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ&Z&ÿßêßÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿãâäÿåäæÿäãåÿùøùÿùøùÿäâäÿèçéÿæåæÿüüüÿôôôÿåäæÿÿÿÿÿúúúÿâáãÿçæèÿÿÿÿÿæåçÿçæèÿÿÿÿÿäâäÿìëìÿÿÿÿÿñðñÿäâäÿêéëÿ^˜]ÿ@ÿ@ÿ0Zÿf• ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿðïðÿãâäÿåäæÿäãåÿùøùÿïîðÿâáãÿãâäÿöõöÿðïðÿãâäÿåäæÿäãåÿùøùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿ.n.ÿ@ÿ9"ÿ>ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹VÿZ’+ÿBÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ&Z&ÿßêßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿþýþÿüüüÿéèéÿêéëÿìëìÿìëìÿÿÿÿÿçæèÿòñòÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿÿÿÿÿûûûÿâáãÿæåæÿôôôÿçæèÿãâäÿþþþÿìëíÿéèêÿõôõÿáàâÿ^˜]ÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿåäæÿþþþÿåäæÿáàâÿø÷øÿø÷øÿþýþÿüüüÿéèéÿêéëÿÿÿÿÿéèéÿìëíÿÿÿÿÿø÷øÿþýþÿüüüÿéèéÿêéëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿ.n.ÿ@ÿ@ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿ[“-ÿDÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ&Z&ÿßêßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿæåçÿáàâÿâáãÿõôõÿìëíÿëêëÿÿÿÿÿæåæÿóòóÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿÿÿÿÿòñòÿèçéÿñðñÿäãåÿóòóÿåäæÿ÷÷÷ÿýýýÿöõöÿîíîÿáàâÿûûûÿiŸhÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿåäæÿïîðÿæåæÿäãåÿø÷øÿùùùÿæåçÿáàâÿâáãÿõôõÿÿÿÿÿéèéÿìëíÿÿÿÿÿùùùÿæåçÿáàâÿâáãÿõôõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿ.n.ÿ@ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ&Z&ÿßêßÿÿÿÿÿÿÿÿÿùùùÿòñòÿôôôÿ÷÷÷ÿîíîÿæåæÿùøùÿþýþÿûûûÿûúûÿèçéÿäãåÿëêëÿþýþÿçæèÿâáãÿéèéÿçæèÿâáãÿåäæÿìëíÿñðñÿùùùÿåäæÿüüüÿîíîÿðïðÿöö÷ÿæåæÿäãåÿìëìÿÿÿÿÿöõöÿp¤oÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿãâäÿâáãÿùøùÿåäæÿø÷øÿîíîÿæåæÿùøùÿþýþÿûûûÿÿÿÿÿéèéÿìëíÿÿÿÿÿîíîÿæåæÿùøùÿþýþÿûûûÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕäÕÿ"O!ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿL‡ÿAÿ@ÿ&Z&ÿßêßÿïîðÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿùøùÿäâäÿèçéÿäãåÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿóòóÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¤oÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿùøùÿäâäÿèçéÿäãåÿññòÿïîðÿâáãÿãâäÿöõöÿùøùÿäâäÿèçéÿäãåÿññòÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ#R"ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿJ…ÿAÿ@ÿ&Z&ÿßêßÿûûûÿýýýÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¤oÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿýýýÿûûûÿûûûÿþýþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿDÿf™4ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿH‚ÿAÿ@ÿ&Z&ÿßêßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¤oÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿ Eÿož9ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ#Jÿi™"ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿH‚ÿAÿ@ÿ)a(ÿäíãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¤oÿ@ÿ@ÿ-Vÿf• ÿl˜ ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿ Eÿož9ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ#Jÿh˜!ÿ‚§.ÿ‚§.ÿ‚§.ÿ‚§.ÿH‚ÿAÿ@ÿ)a(ÿçïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¤oÿ@ÿ@ÿ-Vÿc“ÿ=kÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿ Eÿož9ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿf™4ÿDÿ@ÿ!Hÿc•ÿ‚§.ÿ‚§.ÿH‚ÿAÿ@ÿ)a(ÿçïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¤oÿ@ÿ@ÿ*Sÿ9gÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿ Eÿož9ÿš¹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ÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿš¹Vÿg™4ÿ Eÿ@ÿ!Hÿc•ÿH‚ÿAÿ@ÿ)a(ÿçïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|«|ÿ@ÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÝËÿ"O!ÿ@ÿ@ÿA€ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿhš5ÿA€ÿ@ÿ@ÿ FÿAÿ@ÿ)a(ÿçïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ@ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#R"ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ)a(ÿçïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ@ÿ@ÿ.n.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+g+ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ@ÿ+g*ÿçïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ°ƒÿCÿb›bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿäãåÿçæèÿåäæÿùøùÿÿÿÿÿÿÿÿÿôôôÿáàâÿáàâÿáàâÿêéëÿâáãÿãâäÿöõöÿþýþÿêéëÿâáãÿäâäÿíìíÿôôôÿáàâÿáàâÿáàâÿôôôÿôôôÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿðïðÿãâäÿåäæÿäãåÿùøùÿôôôÿáàâÿáàâÿáàâÿôôôÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿáàâÿø÷øÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿáàâÿáàâÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèêÿâáãÿåäæÿéèéÿôôôÿåäæÿôôôÿåäæÿôôôÿãâäÿçæèÿäãåÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿçæèÿôôôÿóóôÿùùùÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿññòÿäâäÿüüüÿÿÿÿÿ÷÷÷ÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿø÷øÿþýþÿüüüÿéèéÿêéëÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿáàâÿø÷øÿÿÿÿÿôôôÿáàâÿôôôÿø÷øÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿäãåÿóòóÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿçæèÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿéèéÿôôôÿãâäÿöõöÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿìëíÿéèéÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿéèéÿéèéÿüüüÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿùùùÿæåçÿáàâÿâáãÿõôõÿôôôÿáàâÿéèéÿéèéÿüüüÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿóòóÿáàâÿîîïÿÿÿÿÿôôôÿáàâÿìëíÿäâäÿñðñÿôôôÿáàâÿéèéÿéèéÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ÷÷÷ÿäâäÿöõöÿôôôÿåäæÿôôôÿåäæÿôôôÿäãåÿþþþÿçæèÿîîïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿéèêÿæåæÿêéëÿþþþÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿñðñÿäãåÿþýþÿÿÿÿÿùøùÿôôôÿáàâÿø÷øÿø÷øÿþþþÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿîíîÿæåæÿùøùÿþýþÿûûûÿôôôÿáàâÿø÷øÿø÷øÿþþþÿÿÿÿÿø÷øÿáàâÿÿÿÿÿÿÿÿÿýýýÿäâäÿîíîÿâáãÿúúúÿôôôÿáàâÿÿÿÿÿîîïÿæåæÿôôôÿáàâÿø÷øÿø÷øÿþþþÿÿÿÿÿÿÿÿÿùùùÿòñòÿôôôÿ÷÷÷ÿïîðÿåäæÿåäæÿéèéÿôôôÿåäæÿöõöÿéèéÿôôôÿäâäÿçæèÿæåçÿûúûÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿïîðÿâáãÿãâäÿöõöÿþýþÿçæèÿäâäÿæåæÿëêëÿôôôÿáàâÿåäæÿåäæÿöõöÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿùøùÿäâäÿèçéÿäãåÿññòÿôôôÿáàâÿåäæÿåäæÿöõöÿéèéÿäãåÿáàâÿåäæÿïîðÿíìíÿæåæÿÿÿÿÿìëíÿéèéÿôôôÿáàâÿåäæÿâáãÿòñòÿôôôÿáàâÿåäæÿåäæÿöõöÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿöõöÿïîðÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿûûûÿÿÿÿÿÿÿÿÿýýýÿûûûÿûûûÿþýþÿÿÿÿÿÿÿÿÿüüüÿûûûÿÿÿÿÿþýþÿûûûÿûûûÿûûûÿþýþÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿþýþÿûûûÿûûûÿûûûÿþýþÿüüüÿûûûÿûûûÿûûûÿýýýÿûûûÿþýþÿÿÿÿÿþýþÿûûûÿþýþÿûûûÿûûûÿþýþÿÿÿÿÿþýþÿûûûÿûûûÿûûûÿþýþÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿöõöÿùùùÿöõöÿûúûÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿþýþÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿäãåÿçæèÿåäæÿùøùÿÿÿÿÿÿÿÿÿþýþÿêéëÿâáãÿäâäÿíìíÿþýþÿêéëÿäâäÿãâäÿëêëÿþþþÿôôôÿåäæÿÿÿÿÿÿÿÿÿôôôÿáàâÿÿÿÿÿôôôÿáàâÿÿÿÿÿÿÿÿÿÿÿÿÿéèêÿîîïÿÿÿÿÿùùùÿáàâÿñðñÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿÿÿÿÿûûûÿáàâÿø÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿùøùÿâáãÿæåæÿãâäÿôôôÿôôôÿåäæÿôôôÿåäæÿîîïÿèçéÿæåæÿîíîÿùøùÿäâäÿèçéÿæåæÿüüüÿôôôÿåäæÿÿÿÿÿúúúÿâáãÿçæèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿçæèÿôôôÿóóôÿùùùÿÿÿÿÿÿÿÿÿññòÿäâäÿüüüÿÿÿÿÿ÷÷÷ÿññòÿäãåÿþýþÿüüüÿãâäÿóòóÿôôôÿåäæÿ÷÷÷ÿëêëÿôôôÿáàâÿÿÿÿÿôôôÿáàâÿôôôÿø÷øÿÿÿÿÿôôôÿáàâÿáàâÿáàâÿçæèÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿÿÿÿÿûûûÿáàâÿø÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿñðñÿçæèÿÿÿÿÿåäæÿôôôÿôôôÿåäæÿôôôÿåäæÿûúûÿñðñÿçæèÿæåçÿìëìÿìëìÿÿÿÿÿçæèÿòñòÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿéèéÿôôôÿãâäÿöõöÿÿÿÿÿÿÿÿÿìëíÿéèéÿÿÿÿÿÿÿÿÿÿÿÿÿìëíÿéèéÿÿÿÿÿÿÿÿÿéèéÿìëíÿôôôÿåäæÿêéëÿåäæÿìëìÿáàâÿÿÿÿÿôôôÿáàâÿìëíÿäâäÿñðñÿþýþÿãâäÿ÷÷÷ÿæåæÿòñòÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿÿÿÿÿóòóÿáàâÿîîïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿñðñÿéèéÿÿÿÿÿåäæÿôôôÿôôôÿåäæÿôôôÿåäæÿíìíÿæåçÿóóôÿùùùÿìëíÿëêëÿÿÿÿÿæåæÿóòóÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿéèêÿæåæÿêéëÿþþþÿÿÿÿÿÿÿÿÿñðñÿäãåÿþýþÿÿÿÿÿùøùÿñðñÿäãåÿþþþÿþýþÿäâäÿòñòÿôôôÿâáãÿæåæÿ÷÷÷ÿâáãÿáàâÿÿÿÿÿôôôÿáàâÿÿÿÿÿîîïÿæåæÿÿÿÿÿìëíÿèçéÿâáãÿýýýÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿýýýÿäâäÿîíîÿâáãÿúúúÿÿÿÿÿÿÿÿÿùùùÿòñòÿôôôÿ÷÷÷ÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿòñòÿìëìÿÿÿÿÿéèéÿöõöÿôôôÿåäæÿôôôÿåäæÿùøùÿçæèÿéèéÿîíîÿûúûÿèçéÿäãåÿëêëÿþýþÿçæèÿâáãÿéèéÿçæèÿâáãÿåäæÿùùùÿòñòÿôôôÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿçæèÿäâäÿæåæÿëêëÿýýýÿçæèÿåäæÿäãåÿèçéÿþýþÿôôôÿáàâÿòñòÿÿÿÿÿçæèÿáàâÿÿÿÿÿôôôÿáàâÿåäæÿâáãÿòñòÿÿÿÿÿø÷øÿáàâÿëêëÿÿÿÿÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿíìíÿæåæÿÿÿÿÿìëíÿéèéÿÿÿÿÿÿÿÿÿõôõÿìëìÿîîïÿññòÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿóòóÿåäæÿÿÿÿÿõôõÿìëìÿîîïÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿúúúÿÿÿÿÿÿÿÿÿþýþÿûûûÿÿÿÿÿÿÿÿÿþýþÿûûûÿÿÿÿÿþýþÿûûûÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿûûûÿþýþÿÿÿÿÿþýþÿûûûÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúûÿöõöÿûúûÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿþþþÿÿÿÿÿÿÿÿÿûúûÿ÷÷÷ÿùøùÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿ”“‘ÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿñðñÿñðñÿñðñÿñðñÿñðñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿùùùÿäãåÿçæèÿåäæÿùøùÿÿÿÿÿÿÿÿÿôôôÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿðïðÿãâäÿåäæÿäãåÿùøùÿïîðÿâáãÿãâäÿöõöÿðïðÿãâäÿåäæÿäãåÿùøùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïîðÿâáãÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿþýþÿêéëÿâáãÿäâäÿíìíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëìÿçæèÿôôôÿóóôÿùùùÿÿÿÿÿÿÿÿÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿø÷øÿþýþÿüüüÿéèéÿêéëÿÿÿÿÿéèéÿìëíÿÿÿÿÿø÷øÿþýþÿüüüÿéèéÿêéëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿññòÿäâäÿüüüÿÿÿÿÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿôôôÿäãåÿýýýÿåäæÿòñòÿìëíÿéèéÿôôôÿãâäÿöõöÿÿÿÿÿÿÿÿÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿùùùÿæåçÿáàâÿâáãÿõôõÿÿÿÿÿéèéÿìëíÿÿÿÿÿùùùÿæåçÿáàâÿâáãÿõôõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿìëíÿéèéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿöõöÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûûûÿéèêÿæåæÿêéëÿþþþÿÿÿÿÿÿÿÿÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿîíîÿæåæÿùøùÿþýþÿûûûÿÿÿÿÿéèéÿìëíÿÿÿÿÿîíîÿæåæÿùøùÿþýþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿñðñÿäãåÿþýþÿÿÿÿÿùøùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿôôôÿïîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿùøùÿäâäÿèçéÿäãåÿññòÿïîðÿâáãÿãâäÿöõöÿùøùÿäâäÿèçéÿäãåÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïîðÿâáãÿãâäÿöõöÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿþýþÿçæèÿäâäÿæåæÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿùøùÿöõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿýýýÿûûûÿûûûÿþýþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿûûûÿþýþÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿüüüÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿñðñÿñðñÿñðñÿñðñÿñðñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿåäæÿüüüÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿ÷÷÷ÿâáãÿçæèÿãâäÿôôôÿùùùÿäãåÿçæèÿåäæÿùøùÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿðïðÿãâäÿåäæÿäãåÿùøùÿïîðÿâáãÿãâäÿöõöÿðïðÿãâäÿåäæÿäãåÿùøùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïîðÿâáãÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿ÷÷÷ÿáàâÿø÷øÿþýþÿêéëÿâáãÿäâäÿíìíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿñðñÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿôôôÿåäæÿÿÿÿÿéèéÿñðñÿìëíÿìëìÿÿÿÿÿåäæÿôôôÿìëìÿçæèÿôôôÿóóôÿùùùÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿø÷øÿþýþÿüüüÿéèéÿêéëÿÿÿÿÿéèéÿìëíÿÿÿÿÿø÷øÿþýþÿüüüÿéèéÿêéëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿôôôÿåäæÿþþþÿåäæÿáàâÿø÷øÿññòÿäâäÿüüüÿÿÿÿÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿáàâÿÿÿÿÿôôôÿåäæÿôôôÿåäæÿÿÿÿÿôôôÿäãåÿýýýÿåäæÿòñòÿîíîÿéèêÿÿÿÿÿåäæÿôôôÿìëíÿéèéÿôôôÿãâäÿöõöÿôôôÿåäæÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿùùùÿæåçÿáàâÿâáãÿõôõÿÿÿÿÿéèéÿìëíÿÿÿÿÿùùùÿæåçÿáàâÿâáãÿõôõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿôôôÿåäæÿïîðÿæåæÿäãåÿø÷øÿìëíÿéèéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿþýþÿöõöÿéèéÿçæèÿâáãÿéèéÿöõöÿæåçÿèçéÿæåæÿúúúÿûúûÿçæèÿæåæÿâáãÿôôôÿûûûÿéèêÿæåæÿêéëÿþþþÿçæèÿâáãÿéèéÿÿÿÿÿÿÿÿÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿîíîÿæåæÿùøùÿþýþÿûûûÿÿÿÿÿéèéÿìëíÿÿÿÿÿîíîÿæåæÿùøùÿþýþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéèéÿìëíÿÿÿÿÿôôôÿãâäÿâáãÿùøùÿåäæÿø÷øÿñðñÿäãåÿþýþÿÿÿÿÿùøùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿáàâÿûûûÿöõöÿïîðÿùøùÿâáãÿïîðÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäæÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøùÿâáãÿïîðÿýýýÿÿÿÿÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿùøùÿäâäÿèçéÿäãåÿññòÿïîðÿâáãÿãâäÿöõöÿùøùÿäâäÿèçéÿäãåÿññòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïîðÿâáãÿãâäÿöõöÿôôôÿáàâÿîíîÿÿÿÿÿåäæÿø÷øÿþýþÿçæèÿäâäÿæåæÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿùùùÿöõöÿÿÿÿÿø÷øÿôôôÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷øÿôôôÿþþþÿÿÿÿÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿýýýÿûûûÿûûûÿþýþÿÿÿÿÿþþþÿûúûÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿûûûÿþýþÿþýþÿûûûÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿüüüÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿòòòÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿôôôÿ¡Ÿÿ”“‘¡•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ”“‘ÿ”“‘¡•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ”“‘¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/assoc_nsi.ico000077500000000000000000010405261477201124000204410ustar00rootroot00000000000000 èf(N00¨v ¨hÆ ( .!( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwwwÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿðÿÿÿÿ÷ÿðÿð™™™ÿ÷ÿðÿ ™™œÿ÷ÿð™™™™Ìÿ÷ÿð™™™™œÌÿ÷ÿð™™™™ÌÌÿ÷ÿð™™™œÌÌÿ÷ÿð™™™ÌÌÌÿ÷ÿ𙙜ÌÌÌÿ÷ÿð™™ÌÌÌÌÿ÷ÿð™œÌÌÌÌÿ÷ÿð™ÌÌÌÌÿ÷ÿðœÌÌÀÿ ÿ÷ÿðÌÌÌÿðÿ÷ÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿwwwwÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿpwwwwwwwwwÿÿÿÿðððððððððððððððððððððððððð?ððÿðÿðÿÿÿÿÿ( À€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwÿÿÿÿ÷ÿÿÿÿ÷ðÿ÷ð™÷ð™œ÷ð™Ì÷ðœÌ÷ðÌ÷ÿ÷ÿÿÿÿ÷ÿÿÿwwÿÿÿpÿÿÿwwwwwpÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿ(0`€ ÿÿÿ—”’›˜–óóóH?EõÈNóº&ï®xF>IÒ”$+¢©x-7Ì=DïyU\`ñ{}ô§¤¢p·xt[@‘T Cé ÄX ôþ d* ü“ù X”ù Ð/ë ø/Ì Ls (ûý „ûý àûý <üý ˜üý ôüý Pýý ¬ýý þý dþý Àþý ÿý xÿý Ôÿý 0þ Œþ Cb hCb ÄCb @T 4€” ù $o €o Üo o po Ìo To‰ °o‰ €¯D ܯD ¤où ô? \ ¸  p Ì ( „ à < ˜ ô P ¬  d À  x @‘ `@‘ ¼@‘ A‘ \- Ä Ò LÝæ p‡Ô ä PN ¼^ ô@ ì^ ^ T Œê x ^ f +[ í Ô °E ÈVë gN tTþ ˜ä @ Ô  ˜a @þ di úý [ dÒÉ  [ H ½ (g ¤§þ  Îÿ $Íê „Ò ÌR ÔF PM Ò H®ì ”]ý 0Wú à ÿ                      ÿÿÿÿÿÿüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüÿüÿüÿüÿüÿüÿü?ÿüÿüÿÿüÿÿÿÿÿÿÿÿ( @€ÿÿÿH?E©xÒ”ï®óº&õÈN$+¢-7Ì=Dï>Dð\`ñ{}ô—”’úúúóóóyUx        ÿÿÿÿðððððððððððððððððððððððððð?ððÿðÿðÿÿÿÿÿ( @ÿÿÿ—”’~a*~a+DA‰óÈTxã¬&-7Ì#+¢©xÑ”=Dï\`ñyU{}ó´v(<<0’ØA®ØA®ð0D®0D®˜ àD®àD®è   ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿ( •“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿøøøÿ×××ÿÞÞÞÿðððÿÛÛÛÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÖÖÖÿÖÖÖÿÖÖÖÿðððÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿôôôÿ×××ÿÞÞÞÿØØØÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿäääÿäääÿÿÿÿÿüüüÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿåååÿäääÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿåååÿàààÿðððÿØØØÿòòòÿåååÿáááÿÿÿÿÿøøøÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿåååÿãããÿÿÿÿÿÜÜÜÿîîîÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿðððÿÖÖÖÿàààÿàààÿûûûÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿçççÿáááÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿúúúÿáááÿÜÜÜÿâââÿþþþÿûûûÿáááÿÛÛÛÿâââÿÞÞÞÿ×××ÿÛÛÛÿòòòÿàààÿùùùÿßßßÿÚÚÚÿãããÿýýýÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿðððÿÖÖÖÿõõõÿõõõÿþþþÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿùùùÿÞÞÞÿÜÜÜÿ×××ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿîîîÿ×××ÿëëëÿÛÛÛÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿðððÿÖÖÖÿÖÖÖÿÚÚÚÿîîîÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿùùùÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿÙÙÙÿÙÙÙÿÜÜÜÿùùùÿéééÿ×××ÿØØØÿòòòÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿèèèÿßßßÿÜÜÜÿçççÿøøøÿ×××ÿÞÞÞÿðððÿÖÖÖÿÖÖÖÿÚÚÚÿîîîÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿõõõÿ×××ÿïïïÿðððÿÛÛÛÿôôôÿãããÿðððÿÖÖÖÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿôôôÿÖÖÖÿöööÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿçççÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿçççÿÞÞÞÿéééÿÿÿÿÿàààÿåååÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿùùùÿëëëÿÞÞÞÿÝÝÝÿðððÿÛÛÛÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿôôôÿÖÖÖÿöööÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿàààÿØØØÿòòòÿðððÿÛÛÛÿâââÿÛÛÛÿäääÿÖÖÖÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÚÚÚÿíííÿðððÿÛÛÛÿðððÿÙÙÙÿôôôÿúúúÿÿÿÿÿÿÿÿÿûûûÿÚÚÚÿýýýÿÿÿÿÿðððÿÙÙÙÿôôôÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÙÙÙÿØØØÿäääÿúúúÿÿÿÿÿàààÿåååÿÿÿÿÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿæææÿÝÝÝÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÚÚÚÿíííÿðððÿÛÛÛÿðððÿÙÙÙÿôôôÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿéééÿÜÜÜÿðððÿ×××ÿÜÜÜÿôôôÿ×××ÿÖÖÖÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿ÷÷÷ÿÖÖÖÿôôôÿòòòÿàààÿòòòÿÞÞÞÿâââÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿîîîÿÿÿÿÿòòòÿÞÞÞÿâââÿòòòÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿíííÿÜÜÜÿáááÿíííÿùùùÿÿÿÿÿàààÿåååÿÿÿÿÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿöööÿÞÞÞÿàààÿçççÿÞÞÞÿ×××ÿÛÛÛÿðððÿÖÖÖÿÿÿÿÿ÷÷÷ÿÖÖÖÿôôôÿòòòÿàààÿòòòÿÞÞÞÿâââÿíííÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿ×××ÿêêêÿðððÿÖÖÖÿíííÿÿÿÿÿÞÞÞÿÖÖÖÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿØØØÿéééÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿþþþÿîîîÿÜÜÜÿëëëÿûûûÿéééÿ×××ÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿØØØÿéééÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿýýýÿÿÿÿÿýýýÿúúúÿÿÿÿÿÿÿÿÿýýýÿúúúÿÿÿÿÿýýýÿúúúÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿöööÿÿÿÿÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿøøøÿ×××ÿÞÞÞÿðððÿÛÛÛÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿýýýÿÞÞÞÿÙÙÙÿ×××ÿèèèÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿèèèÿßßßÿÜÜÜÿçççÿøøøÿ×××ÿÞÞÞÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿäääÿäääÿÿÿÿÿüüüÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿðððÿÙÙÙÿþþþÿòòòÿÖÖÖÿüüüÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿùùùÿëëëÿÞÞÞÿÝÝÝÿðððÿÛÛÛÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿåååÿàààÿðððÿØØØÿòòòÿåååÿáááÿÿÿÿÿøøøÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿåååÿãããÿÿÿÿÿÜÜÜÿîîîÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿðððÿÛÛÛÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿæææÿÝÝÝÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿüüüÿòòòÿçççÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿúúúÿáááÿÜÜÜÿâââÿþþþÿûûûÿáááÿÛÛÛÿâââÿÞÞÞÿ×××ÿÛÛÛÿòòòÿàààÿùùùÿßßßÿÚÚÚÿãããÿýýýÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿòòòÿàààÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿöööÿÞÞÞÿàààÿçççÿÞÞÞÿ×××ÿÛÛÛÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿžšÿIBGÿ³¯²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿkdiÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=Cÿkejÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿøøøÿ×××ÿÞÞÞÿðððÿÛÛÛÿöööÿÙÙÙÿßßßÿrlqÿE=CÿE=Cÿ±®°ÿÿÿÿÿàààÿëëëÿðððÿÖÖÖÿÖÖÖÿÖÖÖÿðððÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿôôôÿ×××ÿÞÞÞÿØØØÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿe^cÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿVOUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿäääÿäääÿÿÿÿÿüüüÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿäääÿäääÿÿÿÿÿrlqÿE=CÿE=CÿE=Cÿ±®°ÿàààÿëëëÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿåååÿäääÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿe^cÿE=CÿE=DÿF?NÿE=CÿE=Cÿa^ ÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿlkÈÿa^ ÿE=CÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿåååÿàààÿðððÿØØØÿòòòÿåååÿáááÿÿÿÿÿøøøÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿåååÿãããÿÿÿÿÿrlqÿE=CÿE=DÿE=CÿE=Cÿ­©¬ÿíííÿðððÿÖÖÖÿàààÿàààÿûûûÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿçççÿáááÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿe^cÿE=CÿE=DÿSR±ÿVXÓÿG@PÿE=CÿH@MÿlkÈÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿnnÎÿH@MÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿúúúÿáááÿÜÜÜÿâââÿþþþÿûûûÿáááÿÛÛÛÿâââÿÞÞÞÿ×××ÿÛÛÛÿòòòÿàààÿùùùÿßßßÿÚÚÚÿrlqÿE=CÿA?ÿC>gÿE=CÿE=Cÿ¦£¥ÿðððÿÖÖÖÿõõõÿõõõÿþþþÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿùùùÿÞÞÞÿÜÜÜÿ×××ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿe^cÿE=CÿE=DÿSR±ÿZ^ñÿZ^ñÿVXÓÿG@PÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿnnÎÿH@MÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿmÿE=CÿE=Cÿ¦£¥ÿÖÖÖÿÛÛÛÿÛÛÛÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðïðÿe^cÿE=CÿE=DÿSR±ÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYØÿG@UÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿnnÎÿH@MÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ¦£¥ÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìëëÿe^cÿE=CÿE=DÿSR±ÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿnnÎÿH@MÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ¦£¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëêëÿ^W]ÿE=CÿE=DÿSR±ÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ¦£¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿëêëÿ^W]ÿE=CÿE>FÿSS¶ÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿXQWÿßÝÞÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÖÖÖÿ÷÷÷ÿôôôÿÖÖÖÿíííÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿøøøÿ×××ÿÞÞÞÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿýýýÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ¦£¥ÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿèèèÿßßßÿÜÜÜÿçççÿøøøÿ×××ÿÞÞÞÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿÙÙÙÿëêëÿ^W]ÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿTMRÿåäåÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿëëëÿÝÝÝÿõõõÿ×××ÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÞÞÿ×××ÿíííÿèèèÿØØØÿâââÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿðððÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ¦£¥ÿÛÛÛÿÿÿÿÿàààÿëëëÿùùùÿëëëÿÞÞÞÿÝÝÝÿðððÿÛÛÛÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿëêëÿ^W]ÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿG?IÿlkÇÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿE=CÿrlqÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿâââÿ×××ÿîîîÿÿÿÿÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÖÖÖÿéééÿâââÿÜÜÜÿèèèÿØØØÿÿÿÿÿðððÿÙÙÙÿôôôÿíííÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿåååÿàààÿðððÿØØØÿòòòÿðððÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ¡ ÿüüüÿÛÛÛÿíííÿæææÿÝÝÝÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿüüüÿòòòÿçççÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿåååÿàààÿðððÿØØØÿòòòÿðððÿÙÙÙÿôôôÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëêëÿ^W]ÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿG?Iÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿE=CÿE=CÿrlqÿåååÿàààÿðððÿØØØÿòòòÿþþþÿÞÞÞÿØØØÿëëëÿÿÿÿÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿÙÙÙÿúúúÿ×××ÿ×××ÿûûûÿ×××ÿõõõÿòòòÿÞÞÞÿâââÿéééÿàààÿÞÞÞÿ×××ÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿðððÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BèÿB>nÿE=CÿE=Cÿ›—šÿÜÜÜÿøøøÿöööÿÞÞÞÿàààÿçççÿÞÞÞÿ×××ÿÛÛÛÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿòòòÿÞÞÞÿâââÿòòòÿÿÿÿÿ÷÷÷ÿíííÿðððÿëêëÿ^W]ÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿWYÙÿG@UÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿJ?<ÿWE*ÿE=CÿrlqÿúúúÿáááÿÜÜÜÿâââÿþþþÿëëëÿâââÿùùùÿÜÜÜÿöööÿúúúÿáááÿÜÜÜÿâââÿþþþÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿâââÿÿÿÿÿÜÜÜÿßßßÿÿÿÿÿÞÞÞÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿéééÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BèÿB>uÿE=CÿE=Cÿ›—šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿëêëÿ^W]ÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿlkÇÿG?IÿE=CÿJ?<ÿpP ÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿüüüÿÿÿÿÿûûûÿüüüÿÿÿÿÿüüüÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ›—šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿåäåÿ^W]ÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿkjÂÿG?IÿE=CÿJ?<ÿpP ÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ›—šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäåÿXQWÿE=CÿE>FÿTTºÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿJ?<ÿpP ÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ›—šÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäåÿXQWÿE=CÿF>IÿTUÀÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿK@:ÿpP ÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ›—šÿÿÿÿÿøøøÿ×××ÿÞÞÞÿëëëÿÝÝÝÿõõõÿ×××ÿöööÿøøøÿ×××ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäåÿXQWÿE=CÿF>IÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ›—šÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿâââÿ×××ÿîîîÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäåÿXQWÿE=CÿF>IÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿih¼ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿûûûÿðððÿÛÛÛÿðððÿÛÛÛÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ•‘”ÿÚÚÚÿÿÿÿÿþþþÿÞÞÞÿØØØÿëëëÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäåÿXQWÿE=CÿF>IÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHBZÿE=CÿF>Fÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿúúúÿúúúÿÿÿÿÿòòòÿàààÿðððÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿðððÿØØØÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿB?vÿE=CÿE=Cÿ‹ÿÚÚÚÿëëëÿâââÿùùùÿÜÜÜÿöööÿÞÞÞÿ×××ÿÛÛÛÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿåäåÿXQWÿE=CÿF>IÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿXZÞÿHB[ÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿöööÿòòòÿéééÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿðððÿÖÖÖÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BëÿA?ÿE=CÿE=Cÿ‹ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿåäåÿXQWÿE=CÿF>IÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿih¼ÿF>FÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿúúúÿþþþÿ÷÷÷ÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿýýýÿúúúÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=Cÿ‹ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿßÝÞÿWPUÿE=CÿF>IÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿhg¸ÿF>FÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=Cÿ‹ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿF>JÿUUÂÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿfe³ÿE=DÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=Cÿ‹ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿF?LÿUWÌÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿfe³ÿE=DÿE=CÿM@8ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=Cÿ‹ÿïïïÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿF?LÿUWÌÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿy{ôÿy{ôÿfe³ÿE=DÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=Cÿ‹ÿÚÚÚÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿF?LÿUWÌÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿfe³ÿy{ôÿy{ôÿy{ôÿfe³ÿE=DÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿûûûÿðððÿÛÛÛÿðððÿÛÛÛÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=CÿŠ…ˆÿýýýÿßÝÞÿSLRÿE=CÿF?LÿUWÌÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICaÿE=CÿE=Dÿda©ÿy{ôÿfe³ÿE=DÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿúúúÿúúúÿÿÿÿÿòòòÿàààÿðððÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿðððÿØØØÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BíÿA?ÿE=CÿE=Cÿ}x|ÿSLRÿE=CÿF?LÿUWÌÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿZ^ñÿX[ãÿICcÿE=CÿE=CÿXT„ÿE=DÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿöööÿòòòÿéééÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿðððÿÖÖÖÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;BîÿA?ˆÿE=CÿE=CÿE=CÿE=CÿF?KÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿHAXÿG@RÿE=CÿE=CÿE=CÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿúúúÿþþþÿ÷÷÷ÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿýýýÿúúúÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ=AÊÿE=EÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ=AËÿD=LÿE=CÿD=FÿE=CÿE=CÿD>Uÿ?@ªÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿ?@¬ÿB>mÿE=CÿE=CÿNA7ÿsQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ=AËÿD=LÿE=CÿCAÀÿE=JÿE=CÿCAÀÿE=IÿE=CÿBAÀÿE=IÿE=CÿBAÀÿE=IÿE=CÿBAÀÿE=IÿE=CÿBAÀÿE=IÿE=CÿBqÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@@œÿE=CÿE=Cÿ^L1ÿ£tÿ§vÿ§vÿ§vÿ§vÿ§vÿ…bÿG>BÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿúúúÿúúúÿÿÿÿÿòòòÿàààÿðððÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿðððÿØØØÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>AÀÿE=IÿE=CÿBnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@@œÿE=CÿE=Cÿ^L1ÿ£tÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿöööÿòòòÿéééÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿðððÿÖÖÖÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>AÀÿE=IÿE=CÿBnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@@œÿE=CÿE=Cÿ^L1ÿ£tÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿúúúÿþþþÿ÷÷÷ÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿýýýÿúúúÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>@¸ÿE=HÿE=CÿBnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@?–ÿE=CÿE=Cÿ^L1ÿ£tÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>@¸ÿE=FÿE=CÿBnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@?’ÿE=CÿE=Cÿ^L1ÿ£tÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿüüüÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿþþþÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>@¸ÿE=FÿE=CÿAnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@?’ÿE=CÿE=Cÿ`M0ÿ£tÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿL@9ÿrQÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿøøøÿ×××ÿÞÞÞÿýýýÿâââÿÙÙÙÿØØØÿãããÿþþþÿöööÿ×××ÿÜÜÜÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>@¸ÿE=FÿE=CÿAnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@?’ÿE=CÿE=CÿcN.ÿ¥uÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿL@9ÿqPÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿìììÿÚÚÚÿýýýÿûûûÿØØØÿîîîÿëëëÿÞÞÞÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>@¸ÿE=FÿE=CÿAnÿ;Bèÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ@?’ÿE=CÿE=CÿcN.ÿ¥uÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ‰eÿG>BÿE=CÿJ?<ÿpP ÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿåååÿàààÿðððÿØØØÿòòòÿðððÿÛÛÛÿÿÿÿÿåååÿàààÿÿÿÿÿÿÿÿÿàààÿåååÿëëëÿàààÿÿÿÿÿrlqÿE=Cÿ@?—ÿ;Bïÿ;Bïÿ;Bïÿ;Bïÿ>@¸ÿE=FÿE=CÿAiÿ@¸ÿE=FÿE=CÿAgÿ@¸ÿE=FÿE=CÿAgÿgÿgÿeÿE=DÿE=CÿAgÿgÿA?…ÿE=CÿE=CÿhQ*ÿ¦uÿ§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ÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿŽgÿH?AÿE=CÿJ?<ÿoP ÿwSÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿäääÿäääÿÿÿÿÿüüüÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿäääÿäääÿÿÿÿÿrlqÿE=CÿE=CÿE=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=JÿE=CÿE=CÿE=CÿE=CÿhQ*ÿ¦uÿ§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ÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿŽgÿH?AÿE=CÿI?>ÿnO ÿwSÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿåååÿàààÿðððÿØØØÿòòòÿåååÿáááÿÿÿÿÿøøøÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿåååÿãããÿÿÿÿÿrlqÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿhQ*ÿ¦uÿ§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ÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿŽhÿJ@?ÿE=CÿI?>ÿnO ÿwSÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿúúúÿáááÿÜÜÜÿâââÿþþþÿûûûÿáááÿÛÛÛÿâââÿÞÞÞÿ×××ÿÛÛÛÿòòòÿàààÿùùùÿßßßÿÚÚÚÿrlqÿE=CÿE=CÿE=Cÿ;7^ÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿ43qÿB;JÿE=CÿE=CÿhQ*ÿ¦uÿ§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ÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ§vÿ’jÿJ@?ÿE=CÿI?>ÿnO ÿwSÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=CÿE=CÿE=CÿCÿnO ÿwSÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ62TÿA:GÿE=CÿCÿnO ÿwSÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿ "mÿA:GÿE=CÿCÿnO ÿ^H ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿ "mÿA:GÿE=CÿCÿUD,ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿ "mÿA:GÿE=CÿCÿuY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿvY ÿbN.ÿE=CÿE=CÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿ "mÿA:GÿE=CÿCBÿfS5ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿ!oÿ@:HÿE=CÿDBÿ°„ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿ!oÿ@:HÿE=CÿDÿE=CÿKAAÿÁÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿéééÿéééÿ×××ÿúúúÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿ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ÿ!oÿD=DÿE=CÿE=Cÿ¤|ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿë©ÿw_.ÿE=CÿE=Cÿ…e"ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿ·ƒ ÿPD>ÿE=CÿNC?ÿÁÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿ÷÷÷ÿÜÜÜÿÞÞÞÿØØØÿòòòÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿsÿ;6NÿE=CÿE=Cÿ§~ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿë©ÿw_.ÿE=CÿE=Cÿ…e"ÿÑ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿ·ƒ ÿPD>ÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿðððÿõõõÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿæææÿâââÿþþþÿÚÚÚÿðððÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿsÿ;6NÿE=CÿE=Cÿ§~ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿë©ÿw_.ÿE=CÿE=Cÿ}`&ÿÑ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿ·ƒ ÿPD>ÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿåååÿÙÙÙÿëëëÿüüüÿòòòÿçççÿÖÖÖÿúúúÿæææÿáááÿÿÿÿÿÛÛÛÿðððÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿsÿ;6NÿE=CÿE=Cÿ§~ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿë©ÿ|b,ÿE=CÿE=Cÿ}`&ÿÑ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿÒ’ÿ·ƒ ÿPD>ÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿèèèÿÜÜÜÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿøøøÿÞÞÞÿÜÜÜÿÜÜÜÿòòòÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿsÿ;6NÿE=CÿE=Cÿ§~ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿí«ÿ€d+ÿE=CÿE=Cÿ}`&ÿÑ’ÿÒ’ÿÒ’ÿÒ’ÿ·ƒ ÿPD>ÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿ×××ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿsÿ;6NÿE=CÿE=Cÿ§~ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿí«ÿ€d+ÿE=CÿE=Cÿ}`&ÿÑ’ÿÒ’ÿ·ƒ ÿPD>ÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿE=Cÿ§~ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿí«ÿ€d+ÿE=CÿE=Cÿ}`&ÿ¶‚ ÿPD>ÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿE=CÿoY2ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ­‚ÿ«ÿWI<ÿE=CÿE=CÿG>BÿE=CÿNC?ÿË”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿéééÿéééÿ×××ÿúúúÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿH?BÿÊ”ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿ÷÷÷ÿÜÜÜÿÞÞÞÿØØØÿòòòÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿE=CÿE=CÿE=CÿTH@ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿZL?ÿMCBÿE=CÿE=CÿE=CÿE=Cÿˆj'ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿðððÿõõõÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿæææÿâââÿþþþÿÚÚÚÿðððÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿF>Cÿ…pFÿE=CÿE=CÿeT=ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿÎ+ÿNDAÿE=CÿSLRÿ}x|ÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿåååÿÙÙÙÿëëëÿüüüÿòòòÿçççÿÖÖÖÿúúúÿæææÿáááÿÿÿÿÿÛÛÛÿðððÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿF>Cÿ´”IÿõÈLÿ«ŽHÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿÎ+ÿNDAÿE=CÿSLRÿßÝÞÿýýýÿ‹†ŠÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿèèèÿÜÜÜÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿøøøÿÞÞÞÿÜÜÜÿÜÜÜÿòòòÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿF>Cÿ´”IÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿÎ+ÿNDAÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿ×××ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿrÿ=7LÿE=CÿF>Cÿ´”IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿÎ+ÿNDAÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿ pÿ>8KÿE=CÿF>Cÿ´”IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿÌœ+ÿNDAÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿvÿ pÿ?8JÿE=CÿF>Cÿ´”IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿSLRÿßÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿéééÿéééÿ×××ÿúúúÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿvÿ pÿ?8JÿE=CÿH@Cÿ»šIÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿXQWÿàßàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿ€d+ÿí«ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿ÷÷÷ÿÜÜÜÿÞÞÞÿØØØÿòòòÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿvÿ pÿ?8JÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=CÿcR>ÿå®'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿd+ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿðððÿõõõÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿæææÿâââÿþþþÿÚÚÚÿðððÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿvÿ pÿ?8JÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ´”IÿF>CÿE=Cÿ^O?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ‹ÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿåååÿÙÙÙÿëëëÿüüüÿòòòÿçççÿÖÖÖÿúúúÿæææÿáááÿÿÿÿÿÛÛÛÿðððÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿvÿ pÿ?8JÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿµ•IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ–‘•ÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿèèèÿÜÜÜÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿøøøÿÞÞÞÿÜÜÜÿÜÜÜÿòòòÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿvÿ pÿ?8JÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿ×××ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿvÿ pÿ?8JÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿǘ,ÿKABÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿvÿ!oÿ@9IÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿÀ–-ÿKABÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿvÿ!oÿ@:HÿE=CÿH@Cÿ½›IÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=CÿXQWÿåäåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿéééÿéééÿ×××ÿúúúÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿvÿ!oÿ@:HÿE=CÿKBCÿÈ¡JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=Cÿ^W]ÿçæçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=Cÿw_.ÿë©ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿ÷÷÷ÿÜÜÜÿÞÞÞÿØØØÿòòòÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ/-\ÿ!oÿ@:HÿE=CÿKBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=Cÿ\N?ÿàª'ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=Cÿw^.ÿè¨ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿðððÿõõõÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿæææÿâââÿþþþÿÚÚÚÿðððÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿrlqÿE=Cÿ51Uÿ@:HÿE=CÿKBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ½›IÿH@CÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›—šÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿåååÿÙÙÙÿëëëÿüüüÿòòòÿçççÿÖÖÖÿúúúÿæææÿáááÿÿÿÿÿÛÛÛÿðððÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿrlqÿE=CÿE=CÿE=CÿKBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿ¾œIÿKBCÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ž¡ÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿèèèÿÜÜÜÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿøøøÿÞÞÞÿÜÜÜÿÜÜÜÿòòòÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿrlqÿE=CÿE=CÿKBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿ×××ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåäåÿTMRÿE=CÿKBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ¼’-ÿH?BÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿWPUÿE=CÿKBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ·.ÿH?BÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿLBCÿÈ¢JÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ³Œ/ÿF>CÿE=Cÿ^W]ÿëêëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿNDCÿШJÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿWJ@ÿÛ§(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ³Œ/ÿF>CÿE=Cÿe^cÿîííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿpY1ÿè¨ÿï¬ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿNDCÿШJÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿWJ@ÿÚ¦(ÿó¸$ÿó¸$ÿó¸$ÿó¸$ÿ³Œ/ÿF>CÿE=Cÿe^cÿðïðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿoY2ÿå¥ÿ˜t!ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿNDCÿШJÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÈ¢JÿKBCÿE=CÿRGAÿÕ¢)ÿó¸$ÿó¸$ÿ³Œ/ÿF>CÿE=Cÿe^cÿðïðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦£¥ÿE=CÿE=CÿhU4ÿŽn%ÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿNDCÿШJÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿõÈLÿÉ¢JÿNDCÿE=CÿRGAÿÕ¢)ÿ³Œ/ÿF>CÿE=Cÿe^cÿðïðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ª­ÿE=CÿE=CÿF>BÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÝÞÿSLRÿE=CÿE=Cÿ¡†HÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£JÿÊ£Jÿ¡†HÿE=CÿE=CÿPEAÿF>CÿE=Cÿe^cÿðïðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±®°ÿE=CÿE=CÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVOUÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=Cÿe^cÿðïðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±®°ÿE=CÿE=Cÿrlqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿkejÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=CÿE=Cÿkdiÿðïðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²¯±ÿH@Fÿžšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÛÛÛÿûûûÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿðððÿÛÛÛÿöööÿ×××ÿÜÜÜÿØØØÿðððÿôôôÿ×××ÿÞÞÞÿØØØÿðððÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿôôôÿÖÖÖÿõõõÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿéééÿ×××ÿØØØÿòòòÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿèèèÿßßßÿÜÜÜÿçççÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿëëëÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿäääÿäääÿÿÿÿÿüüüÿðððÿÛÛÛÿëëëÿÞÞÞÿÿÿÿÿÛÛÛÿðððÿåååÿäääÿÿÿÿÿÛÛÛÿðððÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿþþþÿÛÛÛÿÖÖÖÿõõõÿõõõÿýýýÿûûûÿàààÿâââÿÿÿÿÿàààÿåååÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿùùùÿòòòÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿùùùÿëëëÿÞÞÞÿÝÝÝÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿÖÖÖÿÿÿÿÿðððÿÛÛÛÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿåååÿáááÿÿÿÿÿøøøÿðððÿÛÛÛÿëëëÿàààÿÿÿÿÿÛÛÛÿðððÿçççÿáááÿÿÿÿÿÛÛÛÿðððÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿéééÿÜÜÜÿÚÚÚÿõõõÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿàààÿåååÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿæææÿÝÝÝÿïïïÿ÷÷÷ÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿÖÖÖÿýýýÿòòòÿàààÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿûûûÿáááÿÛÛÛÿâââÿðððÿÛÛÛÿíííÿäääÿÿÿÿÿàààÿòòòÿùùùÿÞÞÞÿÜÜÜÿ×××ÿðððÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿðððÿØØØÿ×××ÿöööÿÛÛÛÿõõõÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿàààÿåååÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿöööÿÞÞÞÿàààÿçççÿðððÿÙÙÙÿßßßÿÜÜÜÿøøøÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿÖÖÖÿúúúÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿðððÿÖÖÖÿçççÿÿÿÿÿÛÛÛÿõõõÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿéééÿ×××ÿØØØÿòòòÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿýýýÿúúúÿþþþÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÞÞÞÿÙÙÙÿ×××ÿèèèÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿèèèÿßßßÿÜÜÜÿçççÿøøøÿ×××ÿÞÞÞÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿéééÿ×××ÿØØØÿòòòÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÞÞÞÿÙÙÙÿ×××ÿèèèÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿÿÿÿÿôôôÿÖÖÖÿõõõÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿéééÿ×××ÿØØØÿòòòÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÙÙÙÿþþþÿòòòÿÖÖÖÿüüüÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿùùùÿëëëÿÞÞÞÿÝÝÝÿðððÿÛÛÛÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿåååÿÿÿÿÿäääÿäääÿÿÿÿÿüüüÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÙÙÙÿþþþÿòòòÿÖÖÖÿüüüÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿþþþÿÛÛÛÿÖÖÖÿõõõÿõõõÿýýýÿûûûÿàààÿâââÿÿÿÿÿàààÿåååÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿùùùÿòòòÿÿÿÿÿðððÿÛÛÛÿäääÿäääÿÿÿÿÿüüüÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿðððÿÛÛÛÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿæææÿÝÝÝÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿüüüÿòòòÿçççÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿåååÿÿÿÿÿåååÿáááÿÿÿÿÿøøøÿåååÿãããÿÿÿÿÿÜÜÜÿîîîÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿðððÿÛÛÛÿéééÿÜÜÜÿÚÚÚÿõõõÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿàààÿåååÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿåååÿáááÿÿÿÿÿøøøÿåååÿãããÿÿÿÿÿÜÜÜÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿòòòÿàààÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿöööÿÞÞÞÿàààÿçççÿÞÞÞÿ×××ÿÛÛÛÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿàààÿåååÿÿÿÿÿûûûÿáááÿÛÛÛÿâââÿùùùÿßßßÿÚÚÚÿãããÿýýýÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿðððÿØØØÿ×××ÿöööÿÛÛÛÿõõõÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿàààÿåååÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿàààÿûûûÿáááÿÛÛÛÿâââÿùùùÿßßßÿÚÚÚÿãããÿýýýÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿéééÿ×××ÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿðððÿÛÛÛÿÿÿÿÿõõõÿÖÖÖÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿçççÿÿÿÿÿÛÛÛÿõõõÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿéééÿ×××ÿØØØÿòòòÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ­­­b•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿûûûÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòòòÿùùùÿòòòÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿýýýÿûûûÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿþþþÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿ”“‘ÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ×××ÿØØØÿòòòÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ×××ÿØØØÿòòòÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿÿÿÿÿôôôÿÖÖÖÿõõõÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿéééÿ×××ÿØØØÿòòòÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿðððÿÛÛÛÿÿÿÿÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿßßßÿßßßÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿäääÿäääÿÿÿÿÿüüüÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿðððÿÛÛÛÿþþþÿÛÛÛÿÖÖÖÿõõõÿõõõÿýýýÿûûûÿàààÿâââÿÿÿÿÿàààÿåååÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿùùùÿòòòÿÿÿÿÿðððÿÛÛÛÿäääÿäääÿÿÿÿÿüüüÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿåååÿáááÿÿÿÿÿøøøÿåååÿãããÿÿÿÿÿÜÜÜÿîîîÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿðððÿÛÛÛÿéééÿÜÜÜÿÚÚÚÿõõõÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿàààÿåååÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿåååÿáááÿÿÿÿÿøøøÿåååÿãããÿÿÿÿÿÜÜÜÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿûûûÿáááÿÛÛÛÿâââÿùùùÿßßßÿÚÚÚÿãããÿýýýÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿàààÿåååÿÿÿÿÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿðððÿØØØÿ×××ÿöööÿÛÛÛÿõõõÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿàààÿåååÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿàààÿûûûÿáááÿÛÛÛÿâââÿùùùÿßßßÿÚÚÚÿãããÿýýýÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ×××ÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿéééÿ×××ÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿçççÿÿÿÿÿÛÛÛÿõõõÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿéééÿ×××ÿØØØÿòòòÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿþþþÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿÿÿÿÿùùùÿéééÿéééÿ×××ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿûûûÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ×××ÿØØØÿòòòÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿèèèÿßßßÿÜÜÜÿçççÿøøøÿ×××ÿÞÞÞÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿðððÿÖÖÖÿÖÖÖÿÚÚÚÿîîîÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿÙÙÙÿÙÙÙÿÜÜÜÿùùùÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿöööÿÙÙÙÿßßßÿÜÜÜÿûûûÿ÷÷÷ÿÜÜÜÿÞÞÞÿØØØÿòòòÿðððÿÛÛÛÿÿÿÿÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿðððÿÛÛÛÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿèèèÿßßßÿÜÜÜÿçççÿÿÿÿÿÿÿÿÿòòòÿâââÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿôôôÿÖÖÖÿõõõÿêêêÿØØØÿÛÛÛÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿàààÿëëëÿùùùÿëëëÿÞÞÞÿÝÝÝÿðððÿÛÛÛÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿðððÿÖÖÖÿÿÿÿÿôôôÿÖÖÖÿöööÿðððÿÛÛÛÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿýýýÿçççÿÞÞÞÿéééÿðððÿÖÖÖÿðððÿõõõÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿäääÿäääÿÿÿÿÿÞÞÞÿíííÿæææÿâââÿþþþÿÚÚÚÿðððÿðððÿÛÛÛÿÿÿÿÿåååÿáááÿñññÿÖÖÖÿúúúÿðððÿÛÛÛÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿùùùÿëëëÿÞÞÞÿÝÝÝÿÿÿÿÿÿÿÿÿáááÿòòòÿÿÿÿÿðððÿÛÛÛÿþþþÿÛÛÛÿÖÖÖÿõõõÿõõõÿýýýÿûûûÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿðððÿÚÚÚÿüüüÿÛÛÛÿíííÿæææÿÝÝÝÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿüüüÿòòòÿçççÿÖÖÖÿúúúÿðððÿÛÛÛÿðððÿÛÛÛÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÚÚÚÿíííÿðððÿÛÛÛÿðððÿÙÙÙÿôôôÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÙÙÙÿØØØÿäääÿúúúÿðððÿÖÖÖÿåååÿÙÙÙÿëëëÿðððÿÙÙÙÿôôôÿäääÿãããÿÿÿÿÿÜÜÜÿîîîÿæææÿáááÿÿÿÿÿÛÛÛÿðððÿðððÿÙÙÙÿôôôÿ÷÷÷ÿòòòÿçççÿÖÖÖÿúúúÿðððÿÚÚÚÿüüüÿÙÙÙÿíííÿíííÿÛÛÛÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿûûûÿðððÿÛÛÛÿðððÿÛÛÛÿåååÿàààÿðððÿØØØÿòòòÿæææÿÝÝÝÿïïïÿ÷÷÷ÿÿÿÿÿøøøÿÛÛÛÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿéééÿÜÜÜÿÚÚÚÿõõõÿ÷÷÷ÿÝÝÝÿÖÖÖÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàààÿåååÿÿÿÿÿòòòÿÝÝÝÿßßßÿÜÜÜÿøøøÿöööÿÞÞÞÿàààÿçççÿÞÞÞÿ×××ÿÛÛÛÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿðððÿÖÖÖÿÿÿÿÿ÷÷÷ÿÖÖÖÿôôôÿòòòÿàààÿòòòÿÞÞÞÿâââÿòòòÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿíííÿÜÜÜÿáááÿíííÿùùùÿðððÿÖÖÖÿÿÿÿÿèèèÿÜÜÜÿòòòÿÞÞÞÿâââÿîîîÿßßßÿÚÚÚÿãããÿýýýÿøøøÿÞÞÞÿÜÜÜÿÜÜÜÿòòòÿòòòÿÞÞÞÿâââÿéééÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿòòòÿÝÝÝÿÞÞÞÿÝÝÝÿéééÿÛÛÛÿëëëÿðððÿÖÖÖÿúúúÿúúúÿÿÿÿÿòòòÿàààÿðððÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿöööÿÞÞÞÿàààÿçççÿÿÿÿÿçççÿìììÿÿÿÿÿÿÿÿÿðððÿØØØÿ×××ÿöööÿÛÛÛÿõõõÿçççÿÜÜÜÿöööÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿ×××ÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿðððÿÖÖÖÿÛÛÛÿØØØÿéééÿÿÿÿÿòòòÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿþþþÿîîîÿÜÜÜÿëëëÿûûûÿðððÿÖÖÖÿÛÛÛÿ×××ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿöööÿòòòÿéééÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÙÙÙÿüüüÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿçççÿÿÿÿÿÛÛÛÿõõõÿöööÿÙÙÙÿßßßÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿòòòÿùùùÿòòòÿýýýÿúúúÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿöööÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿúúúÿþþþÿ÷÷÷ÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿþþþÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿùùùÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿâââÿÙÙÙÿØØØÿãããÿþþþÿöööÿ×××ÿÜÜÜÿØØØÿðððÿøøøÿ×××ÿÞÞÞÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿøøøÿ×××ÿÞÞÞÿöööÿ×××ÿÜÜÜÿØØØÿðððÿðððÿ×××ÿÞÞÞÿÚÚÚÿúúúÿðððÿÛÛÛÿÿÿÿÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿëëëÿÝÝÝÿõõõÿ×××ÿöööÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿÚÚÚÿýýýÿûûûÿØØØÿîîîÿëëëÿÞÞÞÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿÿÿÿÿðððÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿðððÿÛÛÛÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿðððÿÛÛÛÿÿÿÿÿëëëÿÞÞÞÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿÿÿÿÿÞÞÞÿéééÿùùùÿòòòÿÿÿÿÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿâââÿ×××ÿîîîÿÿÿÿÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿàààÿÿÿÿÿÿÿÿÿàààÿåååÿëëëÿàààÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿûûûÿðððÿÛÛÛÿðððÿÛÛÛÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿåååÿàààÿðððÿØØØÿòòòÿðððÿÛÛÛÿÿÿÿÿëëëÿàààÿÿÿÿÿÛÛÛÿðððÿðððÿÚÚÚÿþþþÿÞÞÞÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿàààÿðððÿØØØÿòòòÿþþþÿÞÞÞÿØØØÿëëëÿÿÿÿÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÚÚÚÿþþþÿýýýÿÙÙÙÿíííÿíííÿäääÿÿÿÿÿàààÿòòòÿÞÞÞÿ×××ÿÛÛÛÿðððÿÖÖÖÿúúúÿúúúÿÿÿÿÿòòòÿàààÿðððÿÛÛÛÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿçççÿÜÜÜÿöööÿýýýÿúúúÿúúúÿáááÿÜÜÜÿâââÿþþþÿÞÞÞÿ×××ÿÛÛÛÿíííÿäääÿÿÿÿÿàààÿòòòÿòòòÿÝÝÝÿÞÞÞÿÝÝÝÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿáááÿÜÜÜÿâââÿþþþÿëëëÿâââÿùùùÿÜÜÜÿöööÿúúúÿáááÿÜÜÜÿâââÿþþþÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÞÞÞÿÛÛÛÿÚÚÚÿßßßÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿðððÿÖÖÖÿÛÛÛÿÛÛÛÿöööÿòòòÿéééÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿúúúÿúúúÿþþþÿ÷÷÷ÿòòòÿùùùÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿôôôÿÖÖÖÿõõõÿëëëÿÙÙÙÿâââÿÖÖÖÿúúúÿðððÿÛÛÛÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿ÷÷÷ÿÚÚÚÿÞÞÞÿÛÛÛÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿÿÿÿÿôôôÿÖÖÖÿõõõÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿéééÿ×××ÿØØØÿòòòÿêêêÿØØØÿÛÛÛÿÚÚÚÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿþþþÿÛÛÛÿÖÖÖÿõõõÿåååÿáááÿñññÿÖÖÖÿúúúÿðððÿÛÛÛÿÿÿÿÿÛÛÛÿðððÿðððÿÛÛÛÿäääÿÞÞÞÿðððÿïïïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿþþþÿÛÛÛÿÖÖÖÿõõõÿõõõÿýýýÿûûûÿàààÿâââÿÿÿÿÿàààÿåååÿÿÿÿÿõõõÿýýýÿûûûÿàààÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿéééÿÜÜÜÿÚÚÚÿõõõÿüüüÿòòòÿçççÿÖÖÖÿúúúÿðððÿÚÚÚÿüüüÿÙÙÙÿíííÿíííÿÛÛÛÿåååÿàààÿðððÿØØØÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÛÛÛÿéééÿÜÜÜÿÚÚÚÿõõõÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿàààÿåååÿÿÿÿÿ÷÷÷ÿÝÝÝÿÖÖÖÿ×××ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿØØØÿ×××ÿöööÿÛÛÛÿõõõÿóóóÿÜÜÜÿÚÚÚÿäääÿÿÿÿÿòòòÿÝÝÝÿÞÞÞÿÝÝÝÿéééÿÛÛÛÿëëëÿúúúÿáááÿÜÜÜÿâââÿþþþÿÿÿÿÿÿÿÿÿ÷÷÷ÿíííÿðððÿôôôÿðððÿØØØÿ×××ÿöööÿÛÛÛÿõõõÿçççÿÜÜÜÿöööÿýýýÿúúúÿÿÿÿÿàààÿåååÿÿÿÿÿçççÿÜÜÜÿöööÿýýýÿúúúÿ÷÷÷ÿíííÿðððÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÖÖÖÿçççÿÿÿÿÿÛÛÛÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿäääÿèèèÿìììÿðððÿÖÖÖÿçççÿÿÿÿÿÛÛÛÿõõõÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿéééÿ×××ÿØØØÿòòòÿöööÿÙÙÙÿßßßÿÚÚÚÿìììÿñññÿäääÿèèèÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿúúúÿþþþÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿýýýÿúúúÿþþþÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿüüüÿúúúÿúúúÿýýýÿÿÿÿÿþþþÿùùùÿûûûÿÿÿÿÿùùùÿôôôÿöööÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿóóóÿòòòÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿôôôÿ¢ žÿ”“‘‹•“‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•“‘ÿ”“‘ÿ”“‘‹•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ•“‘ÿ”“‘‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿ¿ÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/icon.ico000077500000000000000000011171561477201124000174140ustar00rootroot00000000000000(v ¨žÈF h ( v@@ (Bž600 ¨%Æx( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™™ ™™œ™™™™Ì™™™™œÌ™™™™ÌÌ™™™œÌÌ™™™ÌÌÌ™™œÌÌÌ™™ÌÌÌÌ™œÌÌÌÌ™ÌÌÌÌœÌÌÀ ÌÌÌÿÿ¿žŒ€€€€€€€€€€1€yý( @?3?{X"yªzÓ– ä®,ì»:ôÉV&.¥/9Ì@Fï^cñ}ôÿÿÿ                                         ÿÿÿÿßþÏþÇüÃøÁðÀàÀ@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ?‡ÀÇ€ÿçÿ÷(0@yUxH?EF>I©xÒ”ï®óº&õÈN$+¢-7Ì=Dï\`ñ{}ôÿÿÿ                             ¿ðŸàÀ‡€ƒ€€€€€€€€€€€€€€€ƒ€Àã€óû( yUxH?Edddppp|||©xÒ”ï®óº&õÈN$+¢-7Ì=Dï>Dð\`ñ{}ôÿÿÿ               ÿÿ¿žŒ€€€€€€€€€€1€yý( DDHÿ_\ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿ`]ŸÿG?LÿDKÿKGzÿDKÿTVÌÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD•ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ØÿC=YÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD<ÿqPÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‘ÿD:^ÿDˆÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:aÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿDŽÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÔÿC=TÿD;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿnO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDvÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDuÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDuÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDuÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿDuÿ:Aëÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿDuÿ<@ÇÿC@ÿŒfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿlNÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿŠeÿG>@ÿDÿkMÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿkMÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿkMÿDÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿDÿ‘iÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿ‘iÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿÇÿv^-ÿDÿË“ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿë¨ÿz`,ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿíªÿc*ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿíªÿc*ÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿDÿDÿDÿDÿDÿDÿDÿDÿDÿDDC×ÿF?Tÿ[T_ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[S^ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[S^ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿqrÔÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿUNYÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿPM‹ÿJBQÿqrÔÿ]ZÿIAGÿnPÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿG?FÿF@HÿPM‹ÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿHANÿH@GÿIAGÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿG?FÿF@HÿDBŠÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿF?OÿH@GÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@Yÿ?=mÿ08ºÿF?TÿD@tÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDBŠÿI@FÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ?=oÿ-7Êÿ-7Ìÿ/8ÀÿC>ZÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿH@GÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>ZÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿI@FÿrR ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>[ÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿG?EÿOC<ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>[ÿD@mÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿIAGÿœq ÿ`M3ÿQD:ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Tÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿDAyÿMCDÿœq ÿ©xÿ¥vÿ`M3ÿQD:ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿDAyÿODEÿœq ÿ©xÿ©xÿ©xÿ¥vÿ`M3ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿD@tÿODEÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dáÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿD@tÿPDDÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ?CËÿF?Lÿ<<|ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?_ÿ>Dáÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DèÿD@tÿQFAÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ?CËÿF?Lÿ;;ƒÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?_ÿ>Dáÿ=Dïÿ=Dïÿ=DèÿD@mÿRFCÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿMB?ÿrR ÿyUÿyUÿyUÿyUÿlOÿJACÿH@MÿBBŸÿF?Lÿ;;ƒÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?^ÿ>Dáÿ=DèÿD@mÿRFCÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿyUÿyUÿlOÿJACÿH@MÿG?Eÿ>[ÿE?^ÿD@mÿTGAÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿyUÿlOÿJACÿG@KÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿTGAÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿlOÿJACÿF@HÿG?Fÿ;8eÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ(-™ÿBHÿ:7jÿ%+¡ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ&,žÿA;WÿUG=ÿœq ÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿjS-ÿH?DÿJACÿF@Hÿ%&kÿxÿ!$pÿC:]ÿ&,žÿ$+¢ÿ$+¢ÿ$+¢ÿ(-™ÿD=Pÿt]5ÿë«ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿhT8ÿcP7ÿÊÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ€b)ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:Oÿ>:]ÿ&,žÿ$+¢ÿ*/“ÿF?Oÿw_4ÿë«ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿhT8ÿcP7ÿÊÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿÒš ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:Nÿ>:]ÿ*/“ÿF?Lÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿmX5ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:NÿG?Eÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ„h-ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿГÿqY0ÿYK=ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ„h-ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿu]2ÿXI<ÿÀ‰ ÿqY0ÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>HÿOECÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿI@DÿI@Dÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>HÿIAEÿOECÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿr8ÿJACÿG?Eÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿ$%mÿE>Hÿ’{JÿÔ­LÿRHEÿr8ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ[RRÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿ$%mÿE>Hÿ’{JÿõÈNÿõÈNÿÙ±MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿ$%mÿG?Fÿ’{JÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿ$%mÿH@Gÿ’{JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿ&'kÿG?Fÿ‚JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿSIIÿ`WWÿUI?ÿÕ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿ&'kÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿß¶Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿTJJÿg]]ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿ&'kÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿTJJÿh_^ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿH@Gÿ/.`ÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿè²(ÿiX?ÿTJJÿg_`ÿQFAÿÒš ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@HÿG?Eÿ¨‹JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿìµ'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿå°)ÿbR@ÿVLLÿg_`ÿQFAÿΘÿï®ÿï®ÿÄ’ÿOECÿI@Fÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿäºMÿbTEÿq]=ÿìµ'ÿóº&ÿóº&ÿóº&ÿóº&ÿå°)ÿbR@ÿWMMÿphiÿNCBÿË–ÿï®ÿÄ’ÿOECÿIAEÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿç¼MÿbTEÿq]=ÿìµ'ÿóº&ÿóº&ÿå°)ÿbR@ÿWMMÿphiÿNCBÿË–ÿÄ’ÿOECÿIAEÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿç¼MÿbTEÿq]=ÿìµ'ÿå°)ÿbR@ÿWMMÿphiÿNCBÿ z ÿOECÿI@Fÿ‚Jÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶MÿÔ­LÿWKEÿq]=ÿ\NAÿ[RRÿphiÿG?EÿOECÿIAGÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?Eÿ[RRÿxrvÿQGHÿÿÿÿÿÿÿÿÿóÿÿÿ€ñÿÿÿðÿÿþðÿüð?ÿøðÿððÿàðÿÀðÿ€ðÿðþð|ð8ððððððððððððððððððððððððððððððððððððððð>ððÿ€ðÿÀðÿàðÿððÿøðÿüà?ÿþÀÿÿ€ÿÿÿÿÿÿÏ(0` €%G?JÿG?I­G@H†HAMÿH@JÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿIAJÿH@HÿF?NÿF?TÿG?I­G@H†IBTÿUVºÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCPÿG?E„F?Pÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCPÿG?E„F?Pÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿG?E„F?Pÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿI@CÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?HØIBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿZV†ÿJCOÿfLÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿBA›ÿF?NÿH@LÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHARÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ5:¡ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?OÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?OÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?Oÿ[H)ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@OÿrX&ÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿJ@@ÿF?PÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿJ@@ÿG?JÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿDAƒÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿJ@@ÿE>PÿE?MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>Pÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿJ@@ÿE>GÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿJ@@ÿD=Hÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿI@CÿD=Hÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>JÿNCBÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿRF?ÿD=Hÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿx^1ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿMCCÿD=Hÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿRF@ÿD=Hÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ34yÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ0._ÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿ$%mÿE=Hÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿ$%mÿE=Hÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¦yÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿ$%mÿE>HÿODCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿOECÿPEAÿœw"ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿ$%mÿE=HÿzfGÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJADØUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿRF@ÿE>GÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿRF@ÿG?E„H@Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿRF@ÿG?E„RHFÿЪLÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿRF@ÿG?E„RHFÿЪLÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿ¼“0ÿVJBÿJAD†KBC­UI?ÿPEAÿJBEÿLCEÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿLCDÿOEDÿJAD†KBC­LBCÿçÿÿãÿþáÿüàÿøàðà?ààÀà€ààààààààààààààààààààààààààààààà@àààðàøàüàþÀÿ€?ÿ‡ÿÇÿÿçnsis-3.11/Contrib/Makensisw/lookup.cpp000077500000000000000000000323041477201124000177730ustar00rootroot00000000000000// Copyright (C) 2020-2025 Anders Kjersem // // This file is a part of NSIS. // // Licensed under the zlib/libpng license (the "License"); // you may not use this file except in compliance with the License. // // Licence details can be found in the file COPYING. // // This software is provided 'as-is', without any express or implied // warranty. #include "makensisw.h" #include #include #include #include #include "utils.h" #include "resource.h" enum { reg_mui_string_truncate = 0x01 }; static void StrTToW(LPCTSTR Src, LPWSTR Dst, UINT cch) { if (sizeof(*Src) == sizeof(*Dst)) lstrcpynW(Dst, (LPCWSTR) Src, cch); else MultiByteToWideChar(CP_ACP, 0, (LPCSTR) Src, -1, Dst, cch); } template static LPWSTR SmartStrTToW(T*Src, LPWSTR Dst, UINT cch) { if (sizeof(T) == sizeof(*Dst)) return (LPWSTR) Src; return (StrTToW(Src, Dst, cch), Dst); } #define StrBase10ToSInt(s) StrToSInt((s), 10) template static int WINAPI StrToSInt(const T*Str, UINT Base = 0) { if (Base && !(*Str >= '0' && *Str <= '9') && *Str != '-') return 0; // Don't allow leading space int v, succ; if (sizeof(*Str) > 1) succ = StrToIntExW((WCHAR*) Str, Base != 10 ? STIF_SUPPORT_HEX : STIF_DEFAULT, &v); else succ = StrToIntExA((CHAR *) Str, Base != 10 ? STIF_SUPPORT_HEX : STIF_DEFAULT, &v); return succ ? v : 0; // Not full base support, we only need 10 and 16 } template static ULARGE_INTEGER PathParseIconLocationEx(T*Path) { ULARGE_INTEGER li; int idx = 0; SIZE_T i, comma = 0; for (i = 0; Path[i]; ++i) { if (Path[i] == ',') comma = i; if (FSPath::IsAgnosticSeparator(Path[i])) comma = 0; } if (comma) { Path[comma] = T('\0'); idx = StrBase10ToSInt(Path + comma + 1); } return (li.HighPart = (UINT) comma, li.LowPart = idx, li); } #ifndef _WIN64 static int WINAPI PathParseIconLocationFallback(LPSTR Path) { ULARGE_INTEGER li = PathParseIconLocationEx(Path); return li.LowPart; } #endif static HRESULT GetSpecialFolderPath(HWND hWnd, LPTSTR Buf, UINT csidl) { UINT create = csidl & CSIDL_FLAG_CREATE, succ, ec; csidl &= ~CSIDL_FLAG_CREATE; if (SupportsWNT4() || SupportsW95()) { LPITEMIDLIST pidl; HRESULT hr = SHGetSpecialFolderLocation(hWnd, csidl, &pidl); if (SUCCEEDED(hr)) { hr = SHGetPathFromIDList(pidl, Buf) ? S_OK : E_FAIL, CoTaskMemFree(pidl); if (SUCCEEDED(hr) && create) { succ = CreateDirectory(Buf, NULL); hr = (succ || (ec = GetLastError()) == ERROR_ALREADY_EXISTS) ? S_OK : HRESULT_FROM_WIN32(ec); } } return hr; } succ = SHGetSpecialFolderPath(hWnd, Buf, csidl, false); if (!succ && create) succ = SHGetSpecialFolderPath(hWnd, Buf, csidl, create); return succ ? S_OK : E_FAIL; } static HICON LoadIconFromLocation(LPCTSTR Path, int Idx) { // web.archive.org/web/201901/https://blogs.msdn.microsoft.com/oldnewthing/20100505-00/?p=14153# -1 is special HICON hIco = ExtractIcon(NULL, Path, Idx == -1 ? 0 : Idx); if (!hIco && !GetLastError()) SetLastError(ERROR_NOT_FOUND); return hIco; } template static void AppendText(HWND hEdit, const T*Str) { SNDMSG(hEdit, EM_SETSEL, 0, -1), SNDMSG(hEdit, EM_SETSEL, -1, -1); if (sizeof(T) > 1) SendMessageW(hEdit, EM_REPLACESEL, 0, (SIZE_T) Str); else SendMessageA(hEdit, EM_REPLACESEL, 0, (SIZE_T) Str); } static int AddComboStringWithData(HWND hWnd, LPCSTR Str, SIZE_T Data) { int idx = (int) SendMessageA(hWnd, CB_INSERTSTRING, (INT_PTR) -1, (SIZE_T) const_cast(Str)); if (idx >= 0) SendMessage(hWnd, CB_SETITEMDATA, idx, Data); return idx; } template static HKEY ParseRegPath(I*In, O*&Path, O*&Name) { HKEY hKey = GetRegRootKey(In); I*pp = 0, *pn = 0; if (hKey) { SIZE_T i; for (i = 0; In[i]; ++i) if (In[i] == I('\\')) (!pp ? pp : pn) = &In[i + 1]; // First separator after HK* or last separator if (pn) pn[-1] = I('\0'); // Split path and name } return (Path = const_cast(pp), Name = const_cast(pn), hKey); } HRESULT (WINAPI*g_RLMSOld)(HKEY hKey, LPCWSTR pszValue, LPWSTR pszOutBuf, DWORD cbOutBuf); static LONG WINAPI RegLoadMUIStringFallbackW(HKEY hKey, LPCWSTR Name, LPWSTR Out, DWORD cbOutBuf, LPDWORD pcbData, DWORD Flags, LPCSTR pszDirectory) { if ((Flags & reg_mui_string_truncate) && pcbData) return ERROR_INVALID_PARAMETER; if (g_RLMSOld) { HRESULT hr = g_RLMSOld(hKey, Name, Out, cbOutBuf); if (SUCCEEDED(hr)) { if (pcbData) *pcbData = (StrLenT(Out) + 1) * sizeof(*Out); return ERROR_SUCCESS; } if (pcbData) *pcbData = (cbOutBuf|1) * 2; // We have no real value to set, caller just has to loop until success return hr; // Note: Not converting E_* here, FormatMessage knows what to do. } return ERROR_NOT_SUPPORTED; } enum { LM_SHGLN, LM_SHLIS, LM_RLMS, LM_PPIL, LM_FMTMSG }; LPCSTR g_ModeLbl[] = { "Path:", "Path:", "Registry:", "Path:", "[Path,]Number:" }; struct DIALOGDATA { HRESULT (WINAPI*SHLIS)(LPCWSTR s, LPWSTR o, UINT cch, PVOID*ppvReserved); HRESULT (WINAPI*SHGLN)(PCWSTR p, PWSTR m, UINT cch, int*rid); LONG (WINAPI*RLMS)(HKEY hKey, LPCWSTR pszValue, LPWSTR pszOutBuf, DWORD cbOutBuf, LPDWORD pcbData, DWORD Flags, LPCSTR pszDirectory); int (WINAPI*PPIL)(LPTSTR p); void*OrgParentDlgData; HWND hMode, hExtra, hOutTxt, hOutIco; DIALOGDATA() { extern void* g_ModalDlgData; OrgParentDlgData = g_ModalDlgData, g_ModalDlgData = this; } ~DIALOGDATA() { extern void* g_ModalDlgData; g_ModalDlgData = OrgParentDlgData; } static DIALOGDATA* Get(HWND hDlg) { return (DIALOGDATA*) g_ModalDlgData; } static inline void Set(HWND hDlg, DIALOGDATA*p) { } }; static INT_PTR CALLBACK LookupDlgProc(HWND hDlg, UINT Msg, WPARAM WParam, LPARAM LParam) { DIALOGDATA*pDD = DIALOGDATA::Get(hDlg); int idx = pDD ? (int) SendMessage(pDD->hMode, CB_GETCURSEL, 0, 0) : 0; UINT mode = pDD ? (UINT) SendMessage(pDD->hMode, CB_GETITEMDATA, idx, 0) : 0; HRESULT hr; TCHAR buf[MAX_PATH + 1 + 6]; // Path + ',' + resid switch(Msg) { case WM_SIZE: if (WParam == SIZE_MAXIMIZED) ShowWindow(hDlg, SW_SHOWNOACTIVATE); // Disallow STARTF_USESHOWWINDOW+SW_MAXIMIZE break; case WM_INITDIALOG: DIALOGDATA::Set(hDlg, (pDD = (DIALOGDATA*) LParam)); CenterOnParent(hDlg); pDD->hMode = GetDlgItem(hDlg, IDC_LUMODE); pDD->hExtra = GetDlgItem(hDlg, IDC_LUEXTRATEXT); pDD->hOutTxt = GetDlgItem(hDlg, IDC_LUOUTPUTTEXT); pDD->hOutIco = CreateWindowEx(WS_EX_TRANSPARENT, _T("STATIC"), 0, WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE|SS_REALSIZECONTROL, 0, 0, 0, 0, pDD->hOutTxt, 0, 0, 0); if (pDD->SHLIS) AddComboStringWithData(pDD->hMode, "SHLoadIndirectString", LM_SHLIS); if (pDD->RLMS) AddComboStringWithData(pDD->hMode, "RegLoadMUIString", LM_RLMS); if (pDD->SHGLN) AddComboStringWithData(pDD->hMode, "SHGetLocalizedName", LM_SHGLN); if (pDD->PPIL) AddComboStringWithData(pDD->hMode, "PathParseIconLocation", LM_PPIL); AddComboStringWithData(pDD->hMode, "FormatMessage", LM_FMTMSG); SNDMSG(pDD->hExtra, EM_LIMITTEXT, COUNTOF(buf), 0); SNDMSG(pDD->hMode, CB_SETCURSEL, (SIZE_T) 0, 0), SNDMSG(hDlg, WM_COMMAND, MAKELONG(IDC_LUMODE, CBN_SELENDOK), (SIZE_T) pDD->hMode); return TRUE; case WM_CLOSE: close: return EndDialog(hDlg, 0); case WM_DESTROY: { HICON hOld = (HICON) SNDMSG(pDD->hOutIco, STM_SETICON, (SIZE_T) NULL, 0); if (hOld) DestroyIcon(hOld); } break; case WM_COMMAND: switch((UINT) WParam) { case IDCANCEL: goto close; case MAKELONG(IDC_LUMODE, CBN_SELENDOK): { SendMessageA(GetDlgItem(hDlg, IDC_LUEXTRALABEL), WM_SETTEXT, 0, (SIZE_T) const_cast(g_ModeLbl[mode])); LPCTSTR extra = buf; *buf = '\0'; switch(mode) { case LM_SHGLN: GetSpecialFolderPath(NULL, buf, CSIDL_COMMON_DESKTOPDIRECTORY); break; case LM_SHLIS: extra = _T("@shell32,-4097"); break; case LM_RLMS: extra = _T("HKCR\\AudioCD\\shell\\play\\MUIVerb"); break; case LM_PPIL: extra = _T("%WINDIR%\\Explorer.exe,-101"); break; case LM_FMTMSG: extra = _T("wininet.dll,12005"); break; } ShowWindow(pDD->hOutIco, SW_HIDE); SetWindowText(pDD->hExtra, extra); } break; case MAKELONG(IDC_LUEXTRATEXT, EN_UPDATE): SendMessage(pDD->hExtra, WM_GETTEXT, COUNTOF(buf), (SIZE_T) buf); SetWindowText(pDD->hOutTxt, _T("")); switch(mode) { case LM_SHGLN: { int resid; WCHAR path[COUNTOF(buf)], mod[MAX_PATH], *pis; pis = SmartStrTToW(buf, path, COUNTOF(path)); hr = pDD->SHGLN(pis, mod, COUNTOF(mod), &resid); if (SUCCEEDED(hr)) { AppendText(pDD->hOutTxt, mod); AppendText(pDD->hOutTxt, (wsprintfW(path, L",%d\r\n\r\n", resid), path)); if (ExpandEnvironmentStringsW(mod, path, COUNTOF(path))) { if (HMODULE hMod = LoadLibraryExW(path, NULL, LOAD_LIBRARY_AS_DATAFILE)) { if (LoadStringW(hMod, resid, mod, COUNTOF(mod))) { AppendText(pDD->hOutTxt, mod); } FreeLibrary(hMod); } } } else die_hr: { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, hr, 0, buf, COUNTOF(buf), NULL); AppendText(pDD->hOutTxt, (wsprintfW(path, L"%#x: ", hr), path)); AppendText(pDD->hOutTxt, buf); } } break; case LM_SHLIS: { WCHAR is[COUNTOF(buf)], os[MAX_PATH], *pis; pis = SmartStrTToW(buf, is, COUNTOF(is)); hr = pDD->SHLIS(pis, os, COUNTOF(os), NULL); if (FAILED(hr)) goto die_hr; AppendText(pDD->hOutTxt, os); } break; case LM_RLMS: { UINT ec; TCHAR *pkey, *pname; if (HKEY hKey = ParseRegPath(buf, pkey, pname)) { if (!(ec = RegOpenKeyForReading(hKey, pkey, &hKey))) { WCHAR namebuf[255+!0], outbuf[MAX_PATH], *pwn = SmartStrTToW(pname, namebuf, COUNTOF(namebuf)); ec = pDD->RLMS(hKey, pwn, outbuf, sizeof(outbuf), NULL, reg_mui_string_truncate, NULL); if (!ec) AppendText(pDD->hOutTxt, outbuf); RegCloseKey(hKey); } if (FAILED(hr = HRESULT_FROM_WIN32(ec))) goto die_hr; } } break; case LM_PPIL: { RECT r; int idx = pDD->PPIL(buf); HICON hIco = LoadIconFromLocation(buf, idx), hOld; hr = GetLastError(); GetClientRect(pDD->hOutTxt, &r); SetWindowPos(pDD->hOutIco, HWND_TOP, 0, 0, r.right, r.bottom, SWP_NOACTIVATE|(hIco ? SWP_SHOWWINDOW : SWP_HIDEWINDOW)); hOld = (HICON) SNDMSG(pDD->hOutIco, STM_SETICON, (SIZE_T) hIco, 0); if (hOld) DestroyIcon(hOld); if (!hIco) goto die_hr; } break; case LM_FMTMSG: { UINT flags = FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, succ = false; ULARGE_INTEGER li = PathParseIconLocationEx(buf); LPCTSTR numstr = buf; HMODULE hMod = 0; if (li.HighPart) { numstr = buf + ++li.HighPart; hMod = LoadLibraryEx(buf, 0, LOAD_LIBRARY_AS_DATAFILE), flags |= FORMAT_MESSAGE_FROM_HMODULE; if (!hMod) goto badmsgmod; } hr = StrToSInt(numstr); succ = FormatMessage(flags, hMod, hr, 0, buf, COUNTOF(buf), NULL) != 0; badmsgmod: hr = GetLastError(); if (hMod) FreeLibrary(hMod); if (!succ) goto die_hr; SetWindowText(pDD->hOutTxt, buf); } break; } break; } break; } return FALSE; } INT_PTR ShowLookupDialog(HWND hOwner) { DIALOGDATA dd; (FARPROC&) dd.SHLIS = GetSysProcAddr("SHLWAPI", "SHLoadIndirectString"); // WXP+ (FARPROC&) dd.SHGLN = GetSysProcAddr("SHELL32", "SHGetLocalizedName"); // WVista+ (FARPROC&) dd.RLMS = GetSysProcAddr("ADVAPI32", "RegLoadMUIStringW"); // WVista+ Note: RegLoadMUIStringA always returns ERROR_CALL_NOT_IMPLEMENTED if (!dd.RLMS && ((FARPROC&) g_RLMSOld = GetSysProcAddr("SHLWAPI", (LPCSTR) 439))) dd.RLMS = RegLoadMUIStringFallbackW; // W98SE+,IE5+ (FARPROC&) dd.PPIL = #ifdef _WIN64 (FARPROC) PathParseIconLocation; #else GetSysProcAddr("SHLWAPI", sizeof(TCHAR) == 1 ? "PathParseIconLocationA" : "PathParseIconLocationW"); // W95OSR2+,IE3.1+ if (!dd.PPIL || (SupportsWNT4() || IsWin9598ME())) { (FARPROC&) dd.PPIL = GetSysProcAddr("SHELL32", (LPCSTR) 249); // WNT4+ PathParseIconLocationT if (sizeof(TCHAR) == 1) (FARPROC&) dd.PPIL = (FARPROC) PathParseIconLocationFallback; } #endif return DialogBoxParam(HINST_APPLICATION, MAKEINTRESOURCE(DLG_LOOKUP), hOwner, LookupDlgProc, (LPARAM) &dd); }nsis-3.11/Contrib/Makensisw/makensisw.cpp000077500000000000000000001563251477201124000204750ustar00rootroot00000000000000/* Copyright (c) 2002 Robert Rainwater Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/18/2007 */ #define MAKENSISW_CPP #include "makensisw.h" #include #include #include #include "resource.h" #include "toolbar.h" #include "update.h" namespace MakensisAPI { #ifdef _WIN64 const TCHAR* SigintEventNameFmt = _T("makensis win32 sigint event %Iu"); #else const TCHAR* SigintEventNameFmt = _T("makensis win32 sigint event %u"); #endif const TCHAR* SigintEventNameLegacy = _T("makensis win32 signint event"); } NSCRIPTDATA g_sdata; NRESIZEDATA g_resize; NFINDREPLACE g_find; TCHAR g_findbuf[128]; extern NTOOLBAR g_toolbar; void* g_ModalDlgData; BYTE g_MiniCommand = false; NSIS_ENTRYPOINT_SIMPLEGUI int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int ShowCmd) { // We can be associated with .nsi files and when launched from the shell we inherit the current directory so // we need to prevent LoadLibrary from searching the current directory because it can contain untrusted DLLs! FARPROC SDDA = GetSysProcAddr("KERNEL32", "SetDllDirectoryA"); // WinXP.SP1+ if (SDDA) ((BOOL(WINAPI*)(LPCSTR))SDDA)(""); // Remove the current directory from the default DLL search order // Try to register the SysLink class enum { icc_link_class = 0x8000 }; // ComCtl32v6 #if (!defined(_MSC_VER) && !defined(_WIN64)) || (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_IA64))) // x86 or Itanium if (!InitCCEx(icc_link_class) && (sizeof(void*) > 4 || LOBYTE(GetVersion()) >= 5)) // Must check the version because older shell32 versions have a incompatible function at the same ordinal { FARPROC lwrc = GetSysProcAddr("SHELL32", (LPCSTR) 258); // LinkWindow_RegisterClass if (lwrc) ((BOOL(WINAPI*)())lwrc)(); WNDCLASS wc; if (GetClassInfo(NULL, _T("Link Window"), &wc)) { wc.lpszClassName = _T("SysLink"); RegisterClass(&wc); // Superclass the old link window class if SysLink is not available } } #endif memset(&g_sdata,0,sizeof(NSCRIPTDATA)); memset(&g_resize,0,sizeof(NRESIZEDATA)); memset(&g_find,0,sizeof(NFINDREPLACE)); g_sdata.hInstance = hInst; g_sdata.symbols = NULL; g_sdata.sigint_event_legacy = CreateEvent(NULL, FALSE, FALSE, MakensisAPI::SigintEventNameLegacy); g_sdata.verbosity = (unsigned char) ReadRegSettingDW(REGVERBOSITY, 4); if (g_sdata.verbosity > 4) g_sdata.verbosity = 4; g_sdata.log_zoom = 100; RestoreSymbols(); LoadSysLibrary("RichEd20"); if (!InitBranding()) { MessageBox(0,NSISERROR,ERRBOXTITLE,MB_ICONEXCLAMATION|MB_OK|MB_TASKMODAL); return 1; } ResetObjects(); HACCEL haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL)); HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc); if (!hDialog && !g_MiniCommand) { MessageBox(0,DLGERROR,ERRBOXTITLE,MB_ICONEXCLAMATION|MB_OK|MB_TASKMODAL); return 1; } MSG msg; int status; while ((status=GetMessage(&msg,0,0,0))!=0) { if (status==-1) return -1; if (!IsDialogMessage(g_find.hwndFind, &msg)) { if (!TranslateAccelerator(hDialog,haccel,&msg)) { if (!IsDialogMessage(hDialog,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } MemSafeFree(g_sdata.script); if (g_sdata.script_cmd_args) GlobalFree(g_sdata.script_cmd_args); if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event); if (g_sdata.sigint_event_legacy) CloseHandle(g_sdata.sigint_event_legacy); return (int) msg.wParam; } void SetScript(const TCHAR *script, bool clearArgs /*= true*/) { MemSafeFree(g_sdata.script); if (clearArgs) { if (g_sdata.script_cmd_args) { GlobalFree(g_sdata.script_cmd_args); } // Pointing to a single char. Maybe _T('\0') g_sdata.script_cmd_args = GlobalAlloc(GHND, sizeof(TCHAR)); } g_sdata.script = (TCHAR*) MemAlloc((lstrlen(script) + 1)*sizeof(TCHAR)); lstrcpy(g_sdata.script, script); } static void AddScriptCmdArgs(const TCHAR *arg) { g_sdata.script_cmd_args = GlobalReAlloc(g_sdata.script_cmd_args, GlobalSize(g_sdata.script_cmd_args) + (lstrlen(arg) + 2/* quotes */ + 1 /* space */)*sizeof(TCHAR), 0); TCHAR *args = (TCHAR *) GlobalLock(g_sdata.script_cmd_args); lstrcat(args, _T(" \"")); lstrcat(args, arg); lstrcat(args, _T("\"")); GlobalUnlock(g_sdata.script_cmd_args); } enum { CMD_PICKCOMP = 0x0001, CMD_SPY = 0x0080, CMD_LOOKUP = 0x8000 }; static UINT ProcessCommandLine() { LPCWSTR alwaysextraparam[] = { _T("INPUTCHARSET"), _T("ICS"), _T("OUTPUTCHARSET"), _T("OCS") }; TCHAR **argv; int i, j, retflags = 0, in_files = 0; int argc = SetArgv((TCHAR *)GetCommandLine(), &argv); if (argc > 1) { for (i = 1; i < argc; i++) { if (in_files) goto openfile; else if (!lstrcmpi(argv[i], _T("--"))) ++in_files; else if (!lstrcmpi(argv[i], _T("/Spy"))) retflags |= CMD_SPY; else if (!lstrcmpi(argv[i], _T("/Lookup"))) retflags |= CMD_LOOKUP; else if (!StrCmpNI(argv[i], _T("/XSetCompressor "), COUNTOF("/XSetCompressor ") - !0)) { TCHAR *p = argv[i] + lstrlen(_T("/XSetCompressor ")), cchSlashFinalSpace = COUNTOF("/FINAL ") - !0; if (!StrCmpNI(p,_T("/FINAL "), cchSlashFinalSpace)) p += cchSlashFinalSpace; while (*p == _T(' ')) p++; for (j = (int) COMPRESSOR_SCRIPT + 1; j < (int) COMPRESSOR_BEST; j++) { if (!lstrcmpi(p, compressor_names[j])) { SetCompressor((NCOMPRESSOR) j); } } } else if (!lstrcmpi(argv[i], _T("/ChooseCompressor"))) { retflags |= CMD_PICKCOMP; } else if (argv[i][0] == _T('-') || argv[i][0] == _T('/')) { AddScriptCmdArgs(argv[i]); for (SIZE_T k = 0; k < COUNTOF(alwaysextraparam); ++k) if (!lstrcmpi(argv[i] + 1, alwaysextraparam[k]) && ++i < argc) AddScriptCmdArgs(argv[i]); } else openfile: { SetScript(argv[i], false); PushMRUFile(g_sdata.script); break; } } } MemSafeFree(argv); return retflags; } DWORD CALLBACK SaveFileStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { HANDLE hFile = (HANDLE) ((DWORD_PTR*)dwCookie)[0]; DWORD cbio; #ifdef UNICODE if (!((DWORD_PTR*)dwCookie)[1]) { if (!WriteUTF16LEBOM(hFile)) return -1; ((DWORD_PTR*)dwCookie)[1] = TRUE; } #endif BOOL wop = WriteFile(hFile, pbBuff, cb, &cbio, 0); return (*pcb = (LONG) cbio, !wop); } static void ToolBarSizeChanged(HWND hDlg) { RECT r; HWND hEd = g_sdata.logwnd; GetWindowRect(g_toolbar.hwnd, &r); LONG tbh = RectH(r); GetWindowRect(hEd, &r); LONG oldh = RectH(r), margin = DlgUnitToPixelY(hDlg, 7), top = tbh + margin; POINT pt = { r.left, r.top }; ScreenToClient(hDlg, &pt); SetWindowPos(hEd, 0, pt.x, top, RectW(r), oldh + (pt.y - top), SWP_NOZORDER|SWP_NOACTIVATE); // Update IDC_LOGWIN position and size } static BOOL CALLBACK DialogResize(HWND hWnd, LPARAM param) { RECT r, r2, &dlgrect = *(RECT*) param; GetWindowRect(hWnd, &r); ScreenToClient(g_sdata.hwnd, ((LPPOINT)&r)+0), ScreenToClient(g_sdata.hwnd, ((LPPOINT)&r)+1); switch (GetDlgCtrlID(hWnd)) { case IDC_TOOLBAR: GetWindowRect(hWnd, &r2); SetWindowPos(hWnd, 0, 0, 0, RectW(r) + g_resize.dx, RectH(r2), SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); break; case IDC_LOGWIN: if (!g_resize.bottompanelsize) { r2.top = 246, r2.bottom = 22 + 190; // Dialog units from the .rc file MapDialogRect(GetParent(hWnd), &r2); g_resize.bottompanelsize = r2.top - r2.bottom; } SetWindowPos(hWnd, 0, r.left, r.top, dlgrect.right - (r.left * 2), dlgrect.bottom - (r.top + g_resize.bottompanelsize), SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); break; case IDC_TEST: case IDCANCEL: SetWindowPos(hWnd, 0, r.left + g_resize.dx, r.top + g_resize.dy, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); break; default: SetWindowPos(hWnd, 0, r.left, r.top + g_resize.dy, RectW(r) + g_resize.dx, RectH(r), SWP_NOZORDER|SWP_NOACTIVATE); break; } RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE); return TRUE; } INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { g_sdata.hwnd=hwndDlg, g_sdata.logwnd = GetDlgItem(hwndDlg, IDC_LOGWIN); HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)hIcon); // Altered by Darren Owen (DrO) on 29/9/2003 // Added in receiving of mouse and key events from the richedit control SendMessage(g_sdata.logwnd,EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); InitializeLogWindow(); g_sdata.menu = GetMenu(g_sdata.hwnd); g_sdata.fileSubmenu = FindSubMenu(g_sdata.menu, IDM_FILE); g_sdata.editSubmenu = FindSubMenu(g_sdata.menu, IDM_EDIT); g_sdata.toolsSubmenu = FindSubMenu(g_sdata.menu, IDM_TOOLS); SetMenuDefaultItem(FindSubMenu(g_sdata.menu, IDM_SCRIPT), IDM_RECOMPILE_TEST, MF_BYCOMMAND); RestoreMRUList(); CreateToolBar(); InitTooltips(g_sdata.hwnd); SetDlgItemText(g_sdata.hwnd,IDC_VERSION,g_sdata.branding); LPCTSTR fontname = _T("Courier New"), fontconsolas = _T("Consolas"); BYTE fontsize = 8, fontcharset = DEFAULT_CHARSET, suppwin4 = SupportsWNT4() || SupportsW9X(); if (FontExists(fontconsolas)) { fontname = fontconsolas, ++fontsize; } else if (SupportsW2000() && GetACP() == 932) // According to older Inno, Courier New cannot display Japanese on < WinXP { LPCWSTR msgothlocalutf = L"\xff2d\xff33 \xff30\x30b4\x30b7\x30c3\x30af"; const CHAR msgothlocal932[] = { -126, 'l', -126, 'r', ' ', -125, 'S', -125, 'V', -125, 'b', -125, 'N', '\0' }; fontcharset = SHIFTJIS_CHARSET, ++fontsize; fontname = _T("MS Gothic"); // Win2000 can handle this, downlevel cannot if (suppwin4 && !FontExists(fontname)) fontname = sizeof(TCHAR) > 1 ? (LPCTSTR) msgothlocalutf : (LPCTSTR) msgothlocal932; } HFONT hFont = CreateFontPt(hwndDlg,fontsize,FW_NORMAL,FIXED_PITCH|FF_DONTCARE,fontcharset,fontname); SendMessage(g_sdata.logwnd,WM_SETFONT,(WPARAM)hFont,0); g_sdata.compressor = COMPRESSOR_NONE_SELECTED; SetScript(_T("")); RestoreCompressor(); ToolBarSizeChanged(hwndDlg); UINT docmd = ProcessCommandLine(); if ((docmd & (CMD_SPY|CMD_LOOKUP))) { INT_PTR r = ((docmd & CMD_LOOKUP) ? ShowLookupDialog : ShowWndSpy)(0); g_sdata.hwnd = NULL; // Don't save window pos g_MiniCommand++; return SendMessage(hwndDlg, WM_CLOSE, r, r); } RestoreWindowPos(g_sdata.hwnd); if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) { SetCompressor(g_sdata.default_compressor); } if(docmd & CMD_PICKCOMP) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,API_cast(CompressorProc))) { EnableItems(g_sdata.hwnd); return TRUE; } } CompileNSISScript(); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; GetGripperPos(hwndDlg, g_resize.griprect); HDC hdc = BeginPaint(hwndDlg, &ps); DrawGripper(hwndDlg, hdc, g_resize.griprect); EndPaint(hwndDlg, &ps); return TRUE; } case WM_DESTROY: { SaveSymbols(); SaveMRUList(); SaveWindowPos(g_sdata.hwnd); ReleaseLogWindow(); ImageList_Destroy(g_toolbar.imagelist); ImageList_Destroy(g_toolbar.imagelistd); ImageList_Destroy(g_toolbar.imagelisth); DestroyTooltips(); PostQuitMessage(0); return TRUE; } case WM_CLOSE: tryquitapp: { if (!g_sdata.thread) { DestroyWindow(hwndDlg); PostQuitMessage((int) wParam); } return TRUE; } case WM_DROPFILES: { int num; TCHAR szTmp[MAX_PATH]; num = DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0); if (num==1) { DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); if (szTmp[0]) { SetScript(szTmp); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } else { MessageBox(hwndDlg,MULTIDROPERROR,ERRBOXTITLE,MB_OK|MB_ICONSTOP); } DragFinish((HDROP)wParam); break; } case WM_GETMINMAXINFO: { ((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT; } case WM_ENTERSIZEMOVE: { GetClientRect(g_sdata.hwnd, &g_resize.resizeRect); return TRUE; } case WM_SIZE: { if (wParam == SIZE_MAXHIDE || wParam == SIZE_MAXSHOW) return TRUE; const LONG oldW = g_resize.resizeRect.right, oldH = g_resize.resizeRect.bottom; GetClientRect(hwndDlg, &g_resize.resizeRect); g_resize.dx = g_resize.resizeRect.right - oldW; g_resize.dy = g_resize.resizeRect.bottom - oldH; EnumChildWindows(g_sdata.hwnd, DialogResize, (LPARAM) &g_resize.resizeRect); return TRUE; } case WM_SIZING: { InvalidateRect(hwndDlg, &g_resize.griprect, TRUE); GetGripperPos(hwndDlg, g_resize.griprect); return TRUE; } case WM_NCHITTEST: { RECT r = g_resize.griprect; MapWindowPoints(hwndDlg, 0, (POINT*)&r, 2); POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; if (PtInRect(&r, pt)) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, HTBOTTOMRIGHT); return TRUE; } return FALSE; } case WM_MAKENSIS_PROCESSCOMPLETE: { if (g_sdata.thread) { CloseHandle(g_sdata.thread); g_sdata.thread=0; } if(g_sdata.compressor == COMPRESSOR_BEST) { if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) { TCHAR temp_file_name[1024]; // BUGBUG: Hardcoded buffer size wsprintf(temp_file_name,_T("%s_makensisw_temp"),g_sdata.output_exe); if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) { SetCompressorStats(); CopyFile(g_sdata.output_exe,temp_file_name,false); g_sdata.best_compressor_name = g_sdata.compressor_name; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+2]; ResetObjects(); CompileNSISScript(); return TRUE; } else { int this_compressor=0, i; HANDLE hPrev, hThis; DWORD prevSize=0, thisSize=0; for(i=(int)COMPRESSOR_SCRIPT+2; i<(int)COMPRESSOR_BEST; i++) { if(!lstrcmpi(g_sdata.compressor_name,compressor_names[i])) { this_compressor = i; break; } } if(FileExists(temp_file_name)) { hPrev = CreateFile(temp_file_name,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hPrev != INVALID_HANDLE_VALUE) { prevSize = GetFileSize(hPrev, 0); CloseHandle(hPrev); if(prevSize != INVALID_FILE_SIZE) { hThis = CreateFile(g_sdata.output_exe,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hThis != INVALID_HANDLE_VALUE) { thisSize = GetFileSize(hThis, 0); CloseHandle(hThis); if(thisSize != INVALID_FILE_SIZE) { if(prevSize > thisSize) { CopyFile(g_sdata.output_exe,temp_file_name,false); SetCompressorStats(); g_sdata.best_compressor_name = g_sdata.compressor_name; } } } } } } if(this_compressor == ((int)COMPRESSOR_BEST - 1)) { TCHAR buf[1024]; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; if(!lstrcmpi(g_sdata.best_compressor_name,compressor_names[this_compressor])) { wsprintf(buf,COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,thisSize); LogMessage(g_sdata.hwnd,buf); } else { CopyFile(temp_file_name,g_sdata.output_exe,false); wsprintf(buf,RESTORED_COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,prevSize); LogMessage(g_sdata.hwnd,buf); LogMessage(g_sdata.hwnd, g_sdata.compressor_stats); } DeleteFile(temp_file_name); g_sdata.compressor_stats[0] = _T('\0'); } else { g_sdata.compressor_name = compressor_names[this_compressor+1]; ResetObjects(); CompileNSISScript(); return TRUE; } } } } EnableItems(g_sdata.hwnd); if (!g_sdata.retcode) { if (g_sdata.warnings) { SetTitle(g_sdata.hwnd,_T("Finished with Warnings")); PlayAppSoundAsync(("BuildWarning"), MB_ICONWARNING); SetLogColor(LC_WARNING); } else { SetTitle(g_sdata.hwnd,_T("Finished Successfully")); PlayAppSoundAsync(("BuildComplete"), MB_ICONASTERISK); SetLogColor(LC_SUCCESS); } // Added by Darren Owen (DrO) on 1/10/2003 if(g_sdata.recompile_test) PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0); } else { SetTitle(g_sdata.hwnd,_T("Compile Error: See Log for Details")); PlayAppSoundAsync(("BuildError"), MB_ICONEXCLAMATION); SetLogColor(LC_ERROR); } // Added by Darren Owen (DrO) on 1/10/2003 // ensures the recompile and run state is reset after use g_sdata.recompile_test = 0; DragAcceptFiles(g_sdata.hwnd,TRUE); return TRUE; } case MakensisAPI::QUERYHOST: { if (MakensisAPI::QH_OUTPUTCHARSET == wParam) { const UINT reqcp = 1200; // We want UTF-16LE return DlgRet(hwndDlg, (LONG_PTR)(1+reqcp)); } else if (MakensisAPI::QH_SUPPORTEDVERSION == wParam) return DlgRet(hwndDlg, 0x03006000); return FALSE; } case WM_NOTIFY: switch (((NMHDR*)lParam)->code ) { case EN_SELCHANGE: EnableMenuItem(g_sdata.menu, IDM_COPYSELECTED, RicheditHasSelection(g_sdata.logwnd) ? MF_ENABLED : MF_GRAYED); break; // Altered by Darren Owen (DrO) on 6/10/2003 // Allows the detection of the right-click menu when running on OSes below Windows 2000 // and will then simulate the effective WM_CONTEXTMENU message that would be received // note: removed the WM_CONTEXTMENU handling to prevent a duplicate menu appearing on // Windows 2000 and higher case EN_MSGFILTER: #define lpnmMsg ((MSGFILTER*)lParam) if(WM_RBUTTONUP == lpnmMsg->msg || (WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS)) { POINT pt; HWND edit = g_sdata.logwnd; RECT r; GetCursorPos(&pt); // Added and altered by Darren Owen (DrO) on 29/9/2003 // Will place the right-click menu in the top left corner of the window // if the application key is pressed and the mouse is not in the window // from here... ScreenToClient(edit, &pt); GetClientRect(edit, &r); if (!PtInRect(&r, pt)) pt.x = pt.y = 0; MapWindowPoints(edit, HWND_DESKTOP, &pt, 1); TrackPopupMenu(g_sdata.editSubmenu, GetMenuDropAlignment() | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0); } break; case TBN_DROPDOWN: { LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam; if (pToolBar->hdr.hwndFrom == g_toolbar.hwnd && pToolBar->iItem == IDM_COMPRESSOR) { ShowCompressorToolbarDropdownMenu(*pToolBar); return TBDDRET_DEFAULT; } return TBDDRET_NODEFAULT; } } return TRUE; case WM_COPYDATA: { using namespace MakensisAPI; COPYDATASTRUCT *cds = (COPYDATASTRUCT*) lParam, cdsret; switch (cds->dwData) { case MakensisAPI::NOTIFY_SCRIPT: MemSafeFree(g_sdata.input_script); if ((g_sdata.input_script = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)))) lstrcpy(g_sdata.input_script, (TCHAR*) cds->lpData); EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script); break; case MakensisAPI::NOTIFY_WARNING: g_sdata.warnings++; break; case MakensisAPI::NOTIFY_ERROR: break; case MakensisAPI::NOTIFY_OUTPUT: MemSafeFree(g_sdata.output_exe); g_sdata.output_exe = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)); lstrcpy(g_sdata.output_exe, (TCHAR *)cds->lpData); break; case MakensisAPI::PROMPT_FILEPATH: if ((((PROMPT_FILEPATH_DATA*)cds->lpData)->Platform & 7) == sizeof(TCHAR)) { TCHAR buf[MAX_PATH]; lstrcpyn(buf, FSPath::FindLastComponent(((PROMPT_FILEPATH_DATA*)cds->lpData)->Path), COUNTOF(buf)); OPENFILENAME of = { SizeOfStruct(of) }; of.hwndOwner = hwndDlg; of.lpstrFilter = _T("*.exe\0*.exe\0*\0*.*\0"); of.lpstrFile = buf, of.nMaxFile = COUNTOF(buf); of.Flags = OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR; if (GetSaveFileName(&of)) { cdsret.dwData = cds->dwData, cdsret.cbData = (lstrlen(buf) + 1) * sizeof(TCHAR), cdsret.lpData = buf; SendMessage((HWND) wParam, WM_COPYDATA, (SIZE_T) hwndDlg, (SIZE_T) &cdsret); } return TRUE; } return FALSE; } return TRUE; } case WM_INITMENU: EnableMenuItem(g_sdata.menu, IDM_CANCEL, g_sdata.thread ? MF_ENABLED : MF_GRAYED); break; case WM_MAKENSIS_UPDATEUISTATE: { UINT i, emptylog = SendMessage(g_sdata.logwnd, WM_GETTEXTLENGTH, 0, 0) == 0; static const PACKEDCMDID_T nonemptylogids [] = { PACKCMDID(IDM_COPY), PACKCMDID(IDM_COPYALL), PACKCMDID(IDM_CLEARLOG), PACKCMDID(IDM_SELECTALL) }; for (i = 0; i < COUNTOF(nonemptylogids); ++i) EnableUICommand(UNPACKCMDID(nonemptylogids[i]), !emptylog); EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script); break; } case WM_MAKENSIS_FREEZEEDITOR: RicheditFreeze(g_sdata.pLogTextDoc, lParam); break; case WM_TIMER: { HWND hCtl; switch(wParam) { case TID_CONFIGURECLOSEORABORT: SendMessage(hCtl = GetDlgItem(hwndDlg, IDCANCEL), WM_SETTEXT, 0, (LPARAM) (g_sdata.thread ? _T("&Abort") : _T("&Close"))); EnableWindow(hCtl, true); UpdateCloseButtonTooltip(); return KillTimer(hwndDlg, wParam); } break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDM_UI_SWITCHSECTION: //devblogs.microsoft.com/oldnewthing/20191022-00/?p=103016 SetDialogFocus(hwndDlg, g_toolbar.hwnd); // Toolbar does not have WS_TABSTOP and we have no other "UI areas" to switch to so just go there break; case IDM_BROWSESCR: { if (g_sdata.input_script) { TCHAR str[MAX_PATH],*str2; lstrcpy(str,g_sdata.input_script); str2=_tcsrchr(str,_T('\\')); if(str2!=NULL) *(str2+1)=0; ShellExecuteWithErrorBox(hwndDlg, str); } return TRUE; } case IDM_DOCS: return (ShowDocs(), TRUE); case IDM_NSISHOME: return OpenUrlInDefaultBrowser(g_sdata.hwnd, NSIS_URL); case IDM_FORUM: return OpenUrlInDefaultBrowser(g_sdata.hwnd, NSIS_FORUM_URL); case IDM_NSISUPDATE: return (CheckForUpdate(), TRUE); case IDM_ABOUT: return ShowAboutDialog(hwndDlg)|TRUE; case IDM_SELECTALL: { SendMessage(g_sdata.logwnd, EM_SETSEL, 0, -1); return TRUE; } case IDM_LOADSCRIPT: { if (!g_sdata.thread) { OPENFILENAME l = { SizeOfStruct(l) }; TCHAR buf[MAX_PATH]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Load Script"); l.lpstrDefExt = _T("log"); l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; buf[0] = _T('\0'); if (GetOpenFileName(&l)) { SetScript(buf); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } return TRUE; } case IDM_MRU_FILE: case IDM_MRU_FILE+1: case IDM_MRU_FILE+2: case IDM_MRU_FILE+3: case IDM_MRU_FILE+4: LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); return TRUE; case IDM_CLEAR_MRU_LIST: ClearMRUList(); return TRUE; case IDM_COMPRESSOR: { SetCompressor((NCOMPRESSOR)(g_sdata.compressor+1)); return TRUE; } case IDM_CLEARLOG: { if (!g_sdata.thread) { ClearLog(); } return TRUE; } case IDM_ZOOM_INC: g_sdata.log_zoom += 25; goto set_log_zoom; case IDM_ZOOM_DEC: g_sdata.log_zoom -= 25; goto set_log_zoom; case IDM_ZOOM_RST: g_sdata.log_zoom = 100; set_log_zoom: SendMessage(g_sdata.logwnd, EM_SETZOOM, g_sdata.log_zoom = STD_MAX((int)g_sdata.log_zoom, 25), 100); InvalidateRect(g_sdata.logwnd, 0, false); break; case IDM_RECOMPILE: { CompileNSISScript(); return TRUE; } // Added by Darren Owen (DrO) on 1/10/2003 case IDM_RECOMPILE_TEST: { g_sdata.recompile_test = 1; CompileNSISScript(); return TRUE; } case IDM_SETTINGS: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,API_cast(SettingsProc)); return TRUE; } case IDM_WNDSPY: return ShowWndSpy(hwndDlg); case IDM_LOOKUP: return ShowLookupDialog(hwndDlg); case IDM_GUIDGEN: { GUID guid; TCHAR buf[41 * (1 + (sizeof(TCHAR) < 2))]; FARPROC func = GetKeyState(VK_CONTROL) < 0 ? GetSysProcAddr("RPCRT4", "UuidCreateSequential") : NULL; ((HRESULT(WINAPI*)(GUID*))(func ? func : GetSysProcAddr("RPCRT4", "UuidCreate")))(&guid); ((int(WINAPI*)(GUID*, TCHAR*, int))(GetSysProcAddr("OLE32", "StringFromGUID2")))(&guid, buf, 39); for (UINT i = 0; sizeof(TCHAR) < 2; ++i) if (!(buf[i] = (CHAR) ((WCHAR*)buf)[i])) break; // WCHAR to TCHAR if ANSI LogMessage(g_sdata.hwnd, (buf[38] = '\r', buf[39] = '\n', buf[40] = '\0', buf)); SendMessage(g_sdata.hwnd, WM_MAKENSIS_UPDATEUISTATE, 0, 0); // Update clear log command state break; } case IDM_ARP: { TCHAR dir[MAX_PATH]; GetSystemDirectory(dir, COUNTOF(dir)); ShellExecute(hwndDlg, NULL, TEXT("control.exe"), TEXT("appwiz.cpl"), dir, SW_SHOW); break; } case IDM_TEST: case IDC_TEST: { if (g_sdata.output_exe) { ShellExecuteWithErrorBox(hwndDlg, g_sdata.output_exe); } return TRUE; } case IDM_EDITSCRIPT: { if (g_sdata.input_script) { if (!ShellExecuteSilent(hwndDlg, g_sdata.input_script)) { TCHAR app[MAX_PATH]; if (GetWindowsDirectory(app, COUNTOF(app))) { lstrcat(app,_T("\\notepad.exe")); ShellExecuteWithErrorBox(hwndDlg, app, g_sdata.input_script); } } } return TRUE; } case IDCANCEL: if (g_sdata.thread) return PostMessage(hwndDlg, WM_COMMAND, IDM_CANCEL, 0); case IDM_EXIT: wParam = 0; goto tryquitapp; case IDM_CANCEL: { SetEvent(g_sdata.sigint_event); SetEvent(g_sdata.sigint_event_legacy); return TRUE; } case IDM_COPY: if (RicheditHasSelection(g_sdata.logwnd)) goto logwndcopysel; // fall through case IDM_COPYALL: CopyToClipboard(g_sdata.hwnd); return TRUE; case IDM_COPYSELECTED: logwndcopysel: SendMessage(g_sdata.logwnd, WM_COPY, 0, 0); return TRUE; case IDM_SAVE: { OPENFILENAME l = { SizeOfStruct(l) }; TCHAR buf[MAX_STRING]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Save Output"); l.lpstrDefExt = _T("log"); l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST; lstrcpy(buf,_T("output")); if (GetSaveFileName(&l)) { HANDLE hFile = CreateFile(buf, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); if (INVALID_HANDLE_VALUE != hFile) { // BUGBUG:TODO: Error message for bad hFile or failed EM_STREAMOUT? WPARAM opts = sizeof(TCHAR) > 1 ? (SF_TEXT|SF_UNICODE) : (SF_TEXT); DWORD_PTR cookie[2] = { (DWORD_PTR)hFile, FALSE }; EDITSTREAM es = { (DWORD_PTR)&cookie, 0, SaveFileStreamCallback }; SendMessage(g_sdata.logwnd, EM_STREAMOUT, opts, (LPARAM)&es); CloseHandle(hFile); } } return TRUE; } case IDM_FIND: { bool reuseWindow = true; if (!g_find.uFindReplaceMsg) g_find.uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); memset(&g_find.fr, 0, sizeof(FINDREPLACE)); g_find.fr.lStructSize = sizeof(FINDREPLACE); g_find.fr.hwndOwner = hwndDlg; g_find.fr.Flags = FR_NOUPDOWN; g_find.fr.lpstrFindWhat = g_findbuf; g_find.fr.wFindWhatLen = COUNTOF(g_findbuf); if (!reuseWindow || !SetForegroundWindow(g_find.hwndFind)) g_find.hwndFind = FindText(&g_find.fr); return TRUE; } default: { int i; DWORD command = LOWORD(wParam); for(i=(int)COMPRESSOR_SCRIPT; i<=(int)COMPRESSOR_BEST; i++) { if(command == compressor_commands[i]) { SetCompressor((NCOMPRESSOR)i); return TRUE; } } } } } } if (msg == g_find.uFindReplaceMsg && msg) { LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; if (lpfr->Flags & FR_FINDNEXT) { WPARAM flags = FR_DOWN; if (lpfr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE; if (lpfr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; FINDTEXTEX ft; SendMessage(g_sdata.logwnd, EM_EXGETSEL, 0, (LPARAM)&ft.chrg); ft.chrg.cpMin = (ft.chrg.cpMax == ft.chrg.cpMin) ? 0 : ft.chrg.cpMax; ft.chrg.cpMax = (LONG) SendMessage(g_sdata.logwnd, WM_GETTEXTLENGTH, 0, 0); ft.lpstrText = lpfr->lpstrFindWhat; ft.chrg.cpMin = (LONG) SendMessage(g_sdata.logwnd, EM_FINDTEXTEX, flags, (LPARAM)&ft); if (ft.chrg.cpMin != -1) SendMessage(g_sdata.logwnd, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax); else MessageBeep(MB_ICONASTERISK); } if (lpfr->Flags & FR_DIALOGTERM) g_find.hwndFind = 0; return TRUE; } return 0; } DWORD WINAPI MakeNSISProc(LPVOID TreadParam) { TCHAR eventnamebuf[100]; wsprintf(eventnamebuf, MakensisAPI::SigintEventNameFmt, g_sdata.hwnd); if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event); g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, eventnamebuf); if (!g_sdata.sigint_event) { ErrorMessage(g_sdata.hwnd, _T("There was an error creating the abort event.")); PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 1; } STARTUPINFO si; HANDLE newstdout,read_stdout; if (!InitSpawn(si, read_stdout, newstdout)) { ErrorMessage(g_sdata.hwnd, _T("There was an error creating the pipe.")); PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 1; } PROCESS_INFORMATION pi; if (!CreateProcess(0, g_sdata.compile_command, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi)) { TCHAR buf[MAX_STRING]; // BUGBUG: TODO: Too small? wsprintf(buf,_T("Could not execute:\r\n %s."), g_sdata.compile_command); ErrorMessage(g_sdata.hwnd, buf); FreeSpawn(0, read_stdout, newstdout); PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 1; } CloseHandle(newstdout); // Close this handle (duplicated in subprocess) now so we get ERROR_BROKEN_PIPE char iob[(1024 & ~1) + sizeof(WCHAR)]; WCHAR *p = (WCHAR*) iob, wcl = 0; DWORD cbiob = sizeof(iob) - sizeof(WCHAR), cb = 0, cbofs = 0, cch, cbio; for(;;) { BOOL rok = ReadFile(read_stdout, iob+cbofs, cbiob-cbofs, &cbio, NULL); cb += cbio, cch = cb / sizeof(WCHAR); if (!cch) { if (!rok) break; // TODO: If cb is non-zero we should report a incomplete read error? cbofs += cbio; // We only have 1 byte, need to read more to get a complete WCHAR continue; } char oddbyte = (char)(cb % 2), incompsurr; cbofs = 0; if ((incompsurr = IS_HIGH_SURROGATE(p[cch-1]))) wcl = p[--cch], cbofs = sizeof(WCHAR); // Store leading surrogate part and complete it later if (oddbyte) oddbyte = iob[cb-1], ++cbofs; logappendfinal: p[cch] = L'\0'; LogMessage(g_sdata.hwnd, p); p[0] = wcl, iob[cbofs - !!oddbyte] = oddbyte, cb = 0; if (!rok) // No more data can be read { if (cbofs) // Unable to complete the surrogate pair or odd byte { p[0] = 0xfffd, cch = 1, cbofs = 0; goto logappendfinal; } break; } } FreeSpawn(&pi, read_stdout, 0); g_sdata.retcode = pi.dwProcessId; PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 0; } static INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { ABOUTDLGDATA &dd = *(ABOUTDLGDATA*) g_ModalDlgData; switch(msg) { case WM_DRAWITEM: if (wParam == IDC_ABOUTHEADER) { DRAWITEMSTRUCT &dis = *(DRAWITEMSTRUCT*) lParam; RECT r, r2; const TCHAR txt[] = TEXT("MakeNSISW"); INT dt = DT_NOCLIP|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER, cch = COUNTOF(txt) - 1, line = DpiScaleY(dis.hwndItem, 2), shadow = 1; GetClientRect(dis.hwndItem, &r); if (!dd.hHeaderFont) dd.hHeaderFont = CreateFont(0, CFF_RAWSIZE, r.bottom / 2, FW_BOLD, DEFAULT_PITCH|FF_DONTCARE, ANSI_CHARSET, _T("Trebuchet MS")); // IE4.01SP2+ HGDIOBJ hOrgFont = SelectObject(dis.hDC, dd.hHeaderFont); DrawHorzGradient(dis.hDC, r.left, r.top, r.right, r.bottom - line, RGB(22, 77, 160), RGB(29, 100, 207)); DrawHorzGradient(dis.hDC, r.left, r.bottom - line, r.right, r.bottom, RGB(255, 142, 42), RGB(190, 90, 2)); SetBkMode(dis.hDC, TRANSPARENT); if (!dd.FinalHeaderPos) { r2 = r; DrawText(dis.hDC, txt, cch, &r2, dt|DT_CALCRECT); dd.FinalHeaderPos = r.right - (r2.right - r2.left); dd.FinalHeaderPos -= DlgUnitToPixelX(hwndDlg, 7); // Margin } r.left += dd.AnimPos; SetTextColor(dis.hDC, RGB(0, 0, 0)), OffsetRect(&r, +shadow, +shadow); DrawText(dis.hDC, txt, cch, &r, dt); SetTextColor(dis.hDC, RGB(255, 255, 255)), OffsetRect(&r, -shadow, -shadow); DrawText(dis.hDC, txt, cch, &r, dt); SelectObject(dis.hDC, hOrgFont); return TRUE; } break; case WM_TIMER: if (wParam == ABOUTDLGDATA::TID_HEADER) { INT finalpos = dd.FinalHeaderPos, dir; if (dd.AnimSpeed >= 4) { dd.AnimPos += (dir = (dd.AnimPos >= finalpos)) ? -(INT)dd.AnimSpeed : +(INT)dd.AnimSpeed; if (dd.AnimDir != dir) dd.AnimDir = dir, dd.AnimSpeed /= 2; } else { dd.AnimPos = finalpos; KillTimer(hwndDlg, ABOUTDLGDATA::TID_HEADER); } InvalidateRect(GetDlgItem(hwndDlg, IDC_ABOUTHEADER), NULL, false); } break; case WM_DESTROY: DeleteObject(dd.hHeaderFont); DeleteObject(dd.hFont); DeleteObject(dd.hBoldFont); break; case WM_INITDIALOG: { CenterOnParent(hwndDlg); HFONT fontnorm = CreateFontPt(hwndDlg, 8, FW_NORMAL, FIXED_PITCH|FF_DONTCARE, ANSI_CHARSET, _T("Tahoma")), fontbold = CreateFontPt(hwndDlg, 8, FW_BOLD, FIXED_PITCH|FF_DONTCARE, ANSI_CHARSET, _T("Tahoma")); if (!fontbold && (SupportsWNT4() || SupportsW95())) { // Tahoma shipped with 98+ and 2000+ fontnorm = CreateFontPt(hwndDlg, 8, FW_NORMAL, FIXED_PITCH|FF_DONTCARE, ANSI_CHARSET, _T("MS Shell Dlg")); fontbold = CreateFontPt(hwndDlg, 8, FW_BOLD, FIXED_PITCH|FF_DONTCARE, ANSI_CHARSET, _T("MS Shell Dlg")); } dd.hFont = fontnorm, dd.hBoldFont = fontbold; SendDlgItemMessage(hwndDlg, IDC_ABOUTVERSION, WM_SETFONT, (WPARAM)fontbold, FALSE); static const BYTE fontnormctlids[] = { IDC_ABOUTCOPY, IDC_ABOUTPORTIONS, IDC_ABOUTDONATE, IDC_OTHERCONTRIB, IDC_NSISVER }; for (UINT i = 0; i < COUNTOF(fontnormctlids); ++i) SendDlgItemMessage(hwndDlg, fontnormctlids[i], WM_SETFONT, (WPARAM)fontnorm, FALSE); SendMessage(hwndDlg, WM_APP, 0, 0); // Set IDC_ABOUTVERSION SetDlgItemText(hwndDlg, IDC_ABOUTCOPY, COPYRIGHT); SetDlgItemText(hwndDlg, IDC_OTHERCONTRIB, CONTRIB); SetDlgItemText(hwndDlg, IDC_ABOUTDONATE, DONATE); SetDlgItemText(hwndDlg, IDC_NSISVER, g_sdata.branding); SetTimer(hwndDlg, ABOUTDLGDATA::TID_HEADER, 50, NULL); break; } case WM_NOTIFY: switch (((NMHDR*)lParam)->code) { case NM_CLICK: // fall through case NM_RETURN: if (((NMHDR*)lParam)->idFrom == IDC_ABOUTDONATE) { static const BYTE x = 128, encurl[] = DONATEURL; char url[COUNTOF(encurl)]; for (UINT i = 0;; ++i) if (!(url[i] = (char) (encurl[i] & ~x))) break; // "Decrypt" URL OpenUrlInDefaultBrowser(hwndDlg, url); } break; } break; case WM_COMMAND: if (wParam == MAKELONG(IDC_ABOUTVERSION, STN_DBLCLK)) goto showversion; if (IDOK != LOWORD(wParam)) break; // fall through case WM_CLOSE: return EndDialog(hwndDlg, TRUE); case WM_APP: showversion: { TCHAR buf[200], showver = wParam != 0; wsprintf(buf, _T("MakeNSISW %s%s(NSIS Compiler Interface)"), showver ? NSISW_VERSION : _T(""), showver ? _T(" ") : _T("")); SetDlgItemText(hwndDlg, IDC_ABOUTVERSION, buf); } break; } return FALSE; } INT_PTR ShowAboutDialog(HWND hwndOwner) { ABOUTDLGDATA dd; g_ModalDlgData = ⅆ dd.hHeaderFont = NULL, dd.FinalHeaderPos = 0; dd.AnimSpeed = 55, dd.AnimPos = 0, dd.AnimDir = 0; return DialogBox(g_sdata.hInstance, MAKEINTRESOURCE(DLG_ABOUT), hwndOwner, API_cast(AboutProc)); } static void EnableSymbolSetButtons(HWND hwndDlg) { LRESULT n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETCOUNT, 0, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_CLEAR), n > 0); EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE), n > 0); } static void EnableSymbolEditButtons(HWND hwndDlg) { LRESULT n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_LEFT), n == 1); EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), n != 0); } static void SetSymbols(HWND hwndDlg, TCHAR **symbols) { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0); if (symbols) { for (SIZE_T i = 0; symbols[i]; ++i) SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_ADDSTRING, 0, (LPARAM)symbols[i]); } EnableSymbolSetButtons(hwndDlg); EnableWindow(GetDlgItem(hwndDlg, IDC_RIGHT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_LEFT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), FALSE); } static TCHAR **GetSymbols(HWND hwndDlg) { LRESULT n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETCOUNT, 0, 0); TCHAR **symbols = NULL; if(n > 0) { symbols = (TCHAR **) GlobalAlloc(GPTR, (n+1)*sizeof(TCHAR *)); for (LRESULT i = 0; i < n; i++) { LRESULT len = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)i, 0); symbols[i] = (TCHAR*) MemAllocZI((len+1)*sizeof(TCHAR)); if (!symbols[i]) { FreeSymbolSet(symbols); return NULL; } SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)i, (LPARAM)symbols[i]); } symbols[n] = NULL; } return symbols; } INT_PTR CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { CenterOnParent(hwndDlg); for(int i = (int)COMPRESSOR_SCRIPT; i <= (int)COMPRESSOR_BEST; i++) SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_ADDSTRING, 0, (LPARAM)compressor_display_names[i]); SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_SETCURSEL, (WPARAM)g_sdata.default_compressor, (LPARAM)0); SetSymbols(hwndDlg, g_sdata.symbols); SetFocus(GetDlgItem(hwndDlg, IDC_SYMBOL)); break; } case WM_MAKENSIS_LOADSYMBOLSET: { TCHAR *name = (TCHAR *)wParam; TCHAR **symbols = LoadSymbolSet(name); if(symbols) { SetSymbols(hwndDlg, symbols); GlobalFree((HGLOBAL) symbols); } break; } case WM_MAKENSIS_SAVESYMBOLSET: { TCHAR *name = (TCHAR *)wParam; TCHAR **symbols = GetSymbols(hwndDlg); if(symbols) { SaveSymbolSet(name, symbols); GlobalFree((HGLOBAL) symbols); } break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { ResetObjects(); ResetSymbols(); g_sdata.symbols = GetSymbols(hwndDlg); INT_PTR n = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); if (n >= (INT_PTR)COMPRESSOR_SCRIPT && n <= (INT_PTR)COMPRESSOR_BEST) g_sdata.default_compressor = (NCOMPRESSOR)n; else g_sdata.default_compressor = COMPRESSOR_SCRIPT; SaveCompressor(); SetCompressor(g_sdata.default_compressor); EndDialog(hwndDlg, TRUE); } break; case IDCANCEL: EndDialog(hwndDlg, TRUE); break; case IDC_RIGHT: { LRESULT n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { TCHAR *buf = (TCHAR*) MemAllocZI((n+1)*sizeof(TCHAR)); SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXT, n+1, (LPARAM)buf); if(_tcsstr(buf,_T(" ")) || _tcsstr(buf,_T("\t"))) { MessageBox(hwndDlg,SYMBOLSERROR,ERRBOXTITLE,MB_OK|MB_ICONSTOP); MemFree(buf); break; } n = SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { TCHAR *buf2 = (TCHAR*) MemAllocZI((n+1)*sizeof(TCHAR)); SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXT, n+1, (LPARAM)buf2); TCHAR *buf3 = (TCHAR*) MemAllocZI((lstrlen(buf)+lstrlen(buf2)+2)*sizeof(TCHAR)); wsprintf(buf3,_T("%s=%s"),buf,buf2); MemFree(buf); buf = buf3; MemFree(buf2); } INT_PTR idx = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_ADDSTRING, 0, (LPARAM)buf); if (idx >= 0) { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_SETSEL, FALSE, -1); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_SETSEL, TRUE, idx); } EnableSymbolEditButtons(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, 0); SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, 0); MemFree(buf); EnableSymbolSetButtons(hwndDlg); } } break; case IDC_LEFT: { if (SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0) != 1) break; int index; INT_PTR num = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, 1, (LPARAM)&index); if(num == 1) { INT_PTR n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)index, 0); if(n > 0) { TCHAR *buf = (TCHAR*) MemAllocZI((n+1)*sizeof(TCHAR)); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)index, (LPARAM)buf); TCHAR *p = _tcsstr(buf,_T("=")); if(p) { SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, (LPARAM)(p+1)); *p=0; } SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, (LPARAM)buf); MemFree(buf); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)index, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_LEFT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), FALSE); EnableSymbolSetButtons(hwndDlg); } } } break; case IDC_CLEAR: { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0); EnableSymbolSetButtons(hwndDlg); } break; case IDC_LOAD: case IDC_SAVE: ShowSymbolSetDialog(hwndDlg, IDC_LOAD == LOWORD(wParam)); break; case IDC_DEL: { INT_PTR n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0); int *items = (int*) MemAllocZI(n*sizeof(int)); if (items) { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, (WPARAM)n, (LPARAM)items); for(INT_PTR i=n-1;i>=0;i--) SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)items[i], 0); MemFree(items); } EnableSymbolEditButtons(hwndDlg); EnableSymbolSetButtons(hwndDlg); } break; case IDC_SYMBOL: if(HIWORD(wParam) == EN_CHANGE) { LRESULT n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_RIGHT), n > 0); } break; case IDC_SYMBOLS: if (HIWORD(wParam) == LBN_SELCHANGE) { EnableSymbolEditButtons(hwndDlg); } else if (HIWORD(wParam) == LBN_DBLCLK) { SendDlgItemMessage(hwndDlg, IDC_LEFT, BM_CLICK, 0, 0); } break; } break; } } return FALSE; } INT_PTR CALLBACK CompressorProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { CenterOnParent(hwndDlg); for(int i=(int)COMPRESSOR_SCRIPT; i <= (int)COMPRESSOR_BEST; i++) { SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_ADDSTRING, 0, (LPARAM)compressor_display_names[i]); } SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_SETCURSEL, (WPARAM)g_sdata.compressor, (LPARAM)0); SetFocus(GetDlgItem(hwndDlg, IDC_COMPRESSOR)); break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { INT_PTR n = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); if(n >= (INT_PTR)COMPRESSOR_SCRIPT && n <= (INT_PTR)COMPRESSOR_BEST) SetCompressor((NCOMPRESSOR)n); else SetCompressor(g_sdata.default_compressor); EndDialog(hwndDlg, 0); break; } case IDCANCEL: { EndDialog(hwndDlg, 1); LogMessage(g_sdata.hwnd,USAGE); break; } } break; } } return FALSE; } static void FixSimpleComboBoxSizeBug(HWND hCombo) // Fix Win10 CBS_SIMPLE height drawing bug when DPI != 96 { RECT r; GetWindowRect(hCombo, &r); SetWindowPos(hCombo, 0, 0, 0, RectW(r), RectH(r)-1, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); SetWindowPos(hCombo, 0, 0, 0, RectW(r), RectH(r), SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE|SWP_FRAMECHANGED); } #define SymbolSetDlgDpiChanged(hwndDlg) ( FixSimpleComboBoxSizeBug(GetDlgItem((hwndDlg), IDC_NAMES)) ) static INT_PTR CALLBACK SymbolSetProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { SYMSETDLGDATA &dd = *(SYMSETDLGDATA*) g_ModalDlgData; switch(msg) { case WM_INITDIALOG: { HKEY hKey; CenterOnParent(hwndDlg); EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), FALSE); if (OpenRegSettingsKey(hKey)) { HKEY hSubKey; if (RegOpenKeyEx(hKey, REGSYMSUBKEY, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS) { TCHAR subkey[1024]; int i=0; while (RegEnumKey(hSubKey, i, subkey, sizeof(subkey)) == ERROR_SUCCESS) { SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_ADDSTRING, 0, (LPARAM)subkey); i++; } RegCloseKey(hSubKey); } RegCloseKey(hKey); } HWND hwndEdit = GetComboEdit(GetDlgItem(hwndDlg, IDC_NAMES)); SendMessage(hwndEdit, EM_LIMITTEXT, (WPARAM)SYMSETNAME_MAXLEN, 0); if (dd.LoadingMode) { SetWindowText(hwndDlg, LOAD_SYMBOL_SET_DLG_NAME); SetWindowText(GetDlgItem(hwndDlg, IDOK), LOAD_BUTTON_TEXT); SendMessage(hwndEdit, EM_SETREADONLY, (WPARAM)TRUE, 0); } else { SetWindowText(hwndDlg, SAVE_SYMBOL_SET_DLG_NAME); SetWindowText(GetDlgItem(hwndDlg, IDOK), SAVE_BUTTON_TEXT); } SymbolSetDlgDpiChanged(hwndDlg); break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { TCHAR name[SYMSETNAME_MAXLEN+1]; HWND hwndEdit = GetComboEdit(GetDlgItem(hwndDlg, IDC_NAMES)); SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)COUNTOF(name), (LPARAM)name); if (!*name) { LPCTSTR msg = dd.LoadingMode ? LOAD_SYMBOL_SET_MESSAGE : SAVE_SYMBOL_SET_MESSAGE; LPCTSTR tit = dd.LoadingMode ? LOAD_SYMBOL_SET_DLG_NAME : SAVE_SYMBOL_SET_DLG_NAME; MessageBox(hwndDlg, msg, tit, MB_OK|MB_ICONEXCLAMATION); } else { HWND hwndParent = GetParent(hwndDlg); UINT msg = dd.LoadingMode ? WM_MAKENSIS_LOADSYMBOLSET : WM_MAKENSIS_SAVESYMBOLSET; SendMessage(hwndParent, msg, (WPARAM)name, (LPARAM)NULL); EndDialog(hwndDlg, TRUE); } break; } case IDCANCEL: { EndDialog(hwndDlg, TRUE); break; } case IDC_DEL: { LONG_PTR n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0); if(n != CB_ERR) { INT_PTR len = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETLBTEXTLEN, (WPARAM)n, 0); TCHAR *buf = (TCHAR*) MemAllocZI((len+1)*sizeof(TCHAR)); if(SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETLBTEXT, (WPARAM)n, (LPARAM)buf) != CB_ERR) { SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_DELETESTRING, n, 0); DeleteSymbolSet(buf); } MemFree(buf); } EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), FALSE); break; } case IDC_NAMES: { if(HIWORD(wParam) == CBN_SELCHANGE) { LONG_PTR n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), CB_ERR != n); } else if(HIWORD(wParam) == CBN_DBLCLK) { LONG_PTR n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0); if (n != CB_ERR) SendDlgItemMessage(hwndDlg, IDOK, BM_CLICK, 0, 0); } break; } } break; } } return FALSE; } INT_PTR ShowSymbolSetDialog(HWND hwndOwner, BOOL LoadingSet) { SYMSETDLGDATA dd = { g_ModalDlgData, LoadingSet }; g_ModalDlgData = ⅆ INT_PTR retval = DialogBox(g_sdata.hInstance, MAKEINTRESOURCE(DLG_SYMBOLSET), hwndOwner, API_cast(SymbolSetProc)); g_ModalDlgData = dd.pOldMDD; // Restore the old pointer return retval; } void SetCompressor(NCOMPRESSOR compressor) { int i; if(g_sdata.compressor != compressor) { WORD command; LPCTSTR compressor_name; if(compressor > COMPRESSOR_SCRIPT && compressor < COMPRESSOR_BEST) { command = compressor_commands[(int)compressor]; compressor_name = compressor_names[(int)compressor]; } else if(compressor == COMPRESSOR_BEST) { command = compressor_commands[(int)compressor]; compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; } else { compressor = COMPRESSOR_SCRIPT; command = IDM_COMPRESSOR_SCRIPT; compressor_name = _T(""); } g_sdata.compressor = compressor; g_sdata.compressor_name = compressor_name; UpdateToolBarCompressorButton(); for(i=(int)COMPRESSOR_SCRIPT; i<= (int)COMPRESSOR_BEST; i++) { CheckMenuItem(g_sdata.menu, compressor_commands[i], MF_BYCOMMAND | MF_UNCHECKED); } CheckMenuItem(g_sdata.menu, command, MF_BYCOMMAND | MF_CHECKED); ResetObjects(); } } nsis-3.11/Contrib/Makensisw/makensisw.h000077500000000000000000000237031477201124000201330ustar00rootroot00000000000000/* Copyright (c) 2002 Robert Rainwater Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef MAKENSIS_H #define MAKENSIS_H #define _WIN32_IE 0x0400 #include "../../Source/Platform.h" #include #include #include "utils.h" #define _RICHEDIT_VER 0x0200 #include #undef _RICHEDIT_VER #define DpiAwarePerMonitor2() ( FALSE ) // Not yet #define DpiAwarePerMonitor() ( FALSE ) #define SupportsWNT4() ( sizeof(void*) == 4 && !DpiAwarePerMonitor() ) // NT4 does not support the MultiMon API #define SupportsW9X() ( sizeof(TCHAR) == 1 ) #define SupportsW95() ( FALSE && SupportsW9X() && !DpiAwarePerMonitor() ) #define SupportsW2000() ( sizeof(void*) == 4 ) #define SupportsRTLUI() ( FALSE ) // UI is English only static inline bool IsWin9598ME() { return SupportsW9X() && (int) GetVersion() < 0; } static inline bool IsWin95() { return SupportsW95() && (GetVersion() & (0x8000FFFF & ~0x0300)) == 0x80000004; } // Defines #define NSIS_URL "https://nsis.sourceforge.io/" #define NSIS_FORUM_URL "http://forums.winamp.com/forumdisplay.php?forumid=65" #define NSIS_UC_URL "https://nsis.sourceforge.io/update.php?version=" #define NSIS_DL_URL "https://nsis.sourceforge.io/download/" #ifdef UNICODE #define USAGE _T("Usage:\r\n\r\n \x2022 File \x203a Load Script...\r\n \x2022 Drag the .nsi file into this window\r\n \x2022 Right click the .nsi file and choose \"Compile NSIS Script\"\r\n") #else #define USAGE _T("Usage:\r\n\r\n - File | Load Script...\r\n - Drag the .nsi file into this window\r\n - Right click the .nsi file and choose \"Compile NSIS Script\"\r\n") #endif #define COPYRIGHT _T("Copyright (C) 2002 Robert Rainwater") #define CONTRIB _T("Fritz Elfert, Justin Frankel, Amir Szekely, Sunil Kamath, Joost Verburg, Anders Kjersem") #define DONATE _T("
Donate to support NSIS development.") #define DONATEURL { 'h'|x,'t','t'|x,'p',':'|x,'/'|x,'/'|x,'n'|x,'s'|x,'i'|x,'s'|x,'.'|x,'s'|x,'f'|x,'.','n'|x,'e'|x,'t'|x,'/'|x,'r','/'|x,'D'|x,'o'|x,'n'|x,'a'|x,'t'|x,'e'|x,'\0' } // "Encrypted" #define DOCURL "https://nsis.sourceforge.io/Docs/" #define LOCALDOCS _T("\\NSIS.chm") #define ERRBOXTITLE 0 //_T("Error") #define NSISERROR _T("Unable to initialize MakeNSIS. Please verify that makensis.exe is in the same directory as makensisw.exe.") #define DLGERROR _T("Unable to initialize MakeNSISW.") #define SYMBOLSERROR _T("Symbol cannot contain whitespace characters") #define MULTIDROPERROR _T("Dropping more than one script at a time is not supported") #define NSISUPDATEPROMPT _T("Running NSIS Update will close MakeNSISW.\nContinue?") #define REGSEC HKEY_CURRENT_USER #define REGSECDEF HKEY_LOCAL_MACHINE #define REGKEY _T("Software\\NSIS") #define REGLOC _T("MakeNSISWPlacement") #define REGVERBOSITY _T("MakeNSISWVerbosity") #define REGCOMPRESSOR _T("MakeNSISWCompressor") #define REGCOLORIZE _T("MakeNSISWColorize") #define REGSYMSUBKEY _T("Symbols") #define REGMRUSUBKEY _T("MRU") #define EXENAME _T("makensis.exe") #define MAX_STRING 256 #define TIMEOUT 100 #define MINWIDTH 400 #define MINHEIGHT 220 #define COMPRESSOR_MESSAGE _T("\n\nThe %s compressor created the smallest installer (%d bytes).") #define RESTORED_COMPRESSOR_MESSAGE _T("\n\nThe %s compressor created the smallest installer (%d bytes).") #define EXE_HEADER_COMPRESSOR_STAT _T("EXE header size:") #define TOTAL_SIZE_COMPRESSOR_STAT _T("Total size:") #define LOAD_SYMBOL_SET_DLG_NAME _T("Load Symbol Definitions Set") #define SAVE_SYMBOL_SET_DLG_NAME _T("Save Symbol Definitions Set") #define LOAD_BUTTON_TEXT _T("Load") #define SAVE_BUTTON_TEXT _T("Save") #define LOAD_SYMBOL_SET_MESSAGE _T("Please select a name for the Symbol Definitions Set to load.") #define SAVE_SYMBOL_SET_MESSAGE _T("Please enter or select a name for the Symbol Definitions Set to save.") #define TESTBTN_TIPTEXT _T("Test the generated installer") #define CLOSEBTN_TIPTEXT _T("Close MakeNSISW") #define WM_MAKENSIS_PROCESSCOMPLETE (WM_USER+1001) #define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002) #define WM_MAKENSIS_SAVESYMBOLSET (WM_USER+1003) #define WM_MAKENSIS_UPDATEUISTATE (WM_USER+1004) #define WM_MAKENSIS_FREEZEEDITOR (WM_USER+1005) #define TID_CONFIGURECLOSEORABORT 1 namespace MakensisAPI { extern const TCHAR* SigintEventNameFmt; extern const TCHAR* SigintEventNameLegacy; enum datatransfer_e { NOTIFY_SCRIPT, NOTIFY_WARNING, NOTIFY_ERROR, NOTIFY_OUTPUT, PROMPT_FILEPATH }; enum sndmsg_e { QUERYHOST = WM_APP }; enum QUERYHOST_e { QH_OUTPUTCHARSET = 1, QH_ENABLESTDERR, QH_SUPPORTEDVERSION }; typedef struct { unsigned char Platform; unsigned char Reserved; TCHAR Path[1]; } PROMPT_FILEPATH_DATA; } typedef enum { COMPRESSOR_NONE_SELECTED = -1, COMPRESSOR_SCRIPT = 0, COMPRESSOR_ZLIB, COMPRESSOR_ZLIB_SOLID, COMPRESSOR_BZIP2, COMPRESSOR_BZIP2_SOLID, COMPRESSOR_LZMA, COMPRESSOR_LZMA_SOLID, COMPRESSOR_BEST, } NCOMPRESSOR; #ifdef MAKENSISW_CPP const TCHAR *compressor_names[] = {_T(""), _T("zlib"), _T("/SOLID zlib"), _T("bzip2"), _T("/SOLID bzip2"), _T("lzma"), _T("/SOLID lzma"), _T("Best")}; const TCHAR *compressor_display_names[] = {_T("Defined in Script/Compiler Default"), _T("ZLIB"), _T("ZLIB (solid)"), _T("BZIP2"), _T("BZIP2 (solid)"), _T("LZMA"), _T("LZMA (solid)"), _T("Best Compressor")}; const WORD compressor_commands[] = {IDM_COMPRESSOR_SCRIPT, IDM_ZLIB, IDM_ZLIB_SOLID, IDM_BZIP2, IDM_BZIP2_SOLID, IDM_LZMA, IDM_LZMA_SOLID, IDM_BEST}; #endif #ifdef TOOLBAR_CPP int compressor_bitmaps[] = {IDB_COMPRESSOR_SCRIPT, IDB_COMPRESSOR_ZLIB, IDB_COMPRESSOR_ZLIB, IDB_COMPRESSOR_BZIP2, IDB_COMPRESSOR_BZIP2, IDB_COMPRESSOR_LZMA, IDB_COMPRESSOR_LZMA, IDB_COMPRESSOR_BEST}; int compressor_strings[] = {IDS_SCRIPT, IDS_ZLIB, IDS_ZLIB_SOLID, IDS_BZIP2, IDS_BZIP2_SOLID, IDS_LZMA, IDS_LZMA_SOLID, IDS_BEST}; #endif // Extern Variables extern const TCHAR* NSISW_VERSION; extern void* g_ModalDlgData; DWORD WINAPI MakeNSISProc(LPVOID TreadParam); INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); typedef struct { enum { TID_HEADER = 1 }; HFONT hHeaderFont, hFont, hBoldFont; INT AnimPos, AnimDir; UINT AnimSpeed, FinalHeaderPos; } ABOUTDLGDATA; INT_PTR ShowAboutDialog(HWND hwndOwner); INT_PTR CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); typedef struct { void*pOldMDD; BOOL LoadingMode; } SYMSETDLGDATA; INT_PTR ShowSymbolSetDialog(HWND hwndOwner, BOOL LoadingSet); INT_PTR CALLBACK CompressorProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); void SetScript(const TCHAR *script, bool clearArgs = true); void CompileNSISScript(); TCHAR* BuildSymbols(); void SetCompressor(NCOMPRESSOR); void RestoreSymbols(); void SaveSymbols(); void FreeSymbolSet(TCHAR **); void DeleteSymbolSet(const TCHAR *); TCHAR** LoadSymbolSet(const TCHAR *); void SaveSymbolSet(const TCHAR *, TCHAR **); void RestoreMRUList(); void SaveMRUList(); typedef struct NSISScriptData { TCHAR *script; HGLOBAL script_cmd_args; TCHAR *compile_command; TCHAR *output_exe; TCHAR *input_script; TCHAR *branding; char *brandingv; TCHAR **symbols; int retcode; unsigned char verbosity; DWORD logLength; DWORD warnings; HINSTANCE hInstance; HWND hwnd; HWND logwnd; HMENU menu; HMENU fileSubmenu; HMENU editSubmenu; HMENU toolsSubmenu; HANDLE thread; HANDLE sigint_event; HANDLE sigint_event_legacy; HWND focused_hwnd; void*pLogTextDoc; NCOMPRESSOR default_compressor; NCOMPRESSOR compressor; LPCTSTR compressor_name; TCHAR compressor_stats[512]; LPCTSTR best_compressor_name; int recompile_test; WORD log_zoom; } NSCRIPTDATA; extern NSCRIPTDATA g_sdata; typedef struct ResizeData { RECT resizeRect; RECT griprect; int dx; int dy; UINT bottompanelsize; } NRESIZEDATA; typedef struct FindReplaceDialog { FINDREPLACE fr; UINT uFindReplaceMsg; HWND hwndFind; } NFINDREPLACE; typedef struct ToolTipStruct { HWND tip; HWND tip_p; HHOOK hook; } NTOOLTIP; extern INT_PTR ShowWndSpy(HWND hOwner); extern INT_PTR ShowLookupDialog(HWND hOwner); #endif nsis-3.11/Contrib/Makensisw/makensisw.xml000077500000000000000000000021621477201124000205000ustar00rootroot00000000000000 MakeNSIS Wrapper true nsis-3.11/Contrib/Makensisw/resource.h000077500000000000000000000137221477201124000177610ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by resource.rc // #define IDS_LOADSCRIPT 1 #define IDS_SAVE 2 #define IDS_EXIT 3 #define IDS_COPY 4 #define IDS_FIND 5 #define IDS_RECOMPILE 6 #define IDS_SETTINGS 7 #define IDS_COMPRESSOR 8 #define IDS_TEST 9 #define IDS_EDITSCRIPT 10 #define IDS_BROWSESCR 11 #define IDS_CLEARLOG 12 #define IDS_SCRIPT 18 #define IDS_ZLIB 19 #define IDS_ZLIB_SOLID 20 #define IDS_BZIP2 21 #define IDS_BZIP2_SOLID 22 #define IDS_RECOMPILE_TEST 23 #define IDS_BEST 24 #define IDS_LZMA 25 #define IDS_LZMA_SOLID 26 #define DLG_MAIN 101 #define IDI_ICON 102 #define DLG_ABOUT 103 #define IDM_MENU 104 #define IDK_ACCEL 105 #define IDI_ASSOC_NSI 112 #define IDI_ASSOC_NSH 113 #define IDB_LOGO 115 #define DLG_SETTINGS 116 #define DLG_WNDSPY 117 #define DLG_LOOKUP 118 #define IDB_TOOLBAR 122 #define DLG_COMPRESSOR 124 #define DLG_SYMBOLSET 125 #define IDB_TOOLBAR16N24 129 #define IDB_TOOLBAR16D24 130 #define IDB_TOOLBAR16H24 131 #define IDB_TOOLBAR24N24 132 #define IDB_TOOLBAR24D24 133 #define IDB_TOOLBAR24H24 134 #define IDB_TOOLBAR32N24 135 #define IDB_TOOLBAR32D24 136 #define IDB_TOOLBAR32H24 137 #define IDC_VERSION 200 #define IDC_TOOLBAR 201 #define IDC_LOGWIN 202 #define IDC_TEST 203 #define IDC_ABOUTVERSION 220 #define IDC_ABOUTCOPY 221 #define IDC_ABOUTPORTIONS 222 #define IDC_CONTRIB 223 #define IDC_NSISVER 224 #define IDC_OTHERCONTRIB 225 #define IDC_ABOUTHEADER 226 #define IDC_ABOUTDONATE 227 #define IDC_RIGHT 230 #define IDC_LEFT 231 #define IDC_CLEAR 232 #define IDC_LOAD 233 #define IDC_SAVE 234 #define IDC_DEL 235 #define IDC_SYMBOLS 236 #define IDC_SYMBOL 237 #define IDC_VALUE 238 #define IDC_COMPRESSOR 239 #define IDC_NAMES 240 #define IDC_SPYDRAG 220 #define IDC_HWND 221 #define IDC_WNDID 222 #define IDC_WNDCLASS 223 #define IDC_WNDUSERDATA 224 #define IDC_WNDSTYLE 225 #define IDC_WNDLOGISIZE 226 #define IDC_WNDPHYSSIZE 227 #define IDC_WNDINFO 229 #define IDC_WNDDPI 230 #define IDC_LUMODE 220 #define IDC_LUEXTRALABEL 221 #define IDC_LUEXTRATEXT 222 #define IDC_LUOUTPUTTEXT 223 #define IDC_LUOUTPUTICON 224 #define IDM_MRU_FILE 6000 #define IDM_CMDBASE 500 #define IDM_BROWSESCR 500 #define IDM_ABOUT 501 #define IDM_NSISHOME 502 #define IDM_FORUM 503 #define IDM_NSISUPDATE 404 #define IDM_SELECTALL 505 #define IDM_DOCS 506 #define IDM_LOADSCRIPT 507 #define IDM_EDITSCRIPT 508 #define IDM_SAVE 509 #define IDM_COPYALL 510 #define IDM_COPYSELECTED 511 #define IDM_FIND 512 #define IDM_CLEARLOG 513 #define IDM_RECOMPILE 514 #define IDM_COMPRESSOR 515 #define IDM_TEST 516 #define IDM_FILE 517 #define IDM_EDIT 518 #define IDM_SCRIPT 519 #define IDM_TOOLS 520 #define IDM_HELP 521 #define IDM_EXIT 522 #define IDM_CLEAR_MRU_LIST 523 #define IDM_COMPRESSOR_SUBMENU 524 #define IDM_COMPRESSOR_SCRIPT 525 #define IDM_ZLIB 526 #define IDM_ZLIB_SOLID 527 #define IDM_BZIP2 528 #define IDM_BZIP2_SOLID 529 #define IDM_LZMA 530 #define IDM_LZMA_SOLID 531 #define IDM_BEST 532 #define IDM_RECOMPILE_TEST 533 #define IDM_CANCEL 534 #define IDM_SETTINGS 535 #define IDM_WNDSPY 536 #define IDM_COPY 537 #define IDM_UI_SWITCHOWNEDWINDOW 538 // Alt+F6 #define IDM_UI_SWITCHSECTION 539 // F6 #define IDM_GUIDGEN 540 #define IDM_LOOKUP 541 #define IDM_ZOOM_INC 542 #define IDM_ZOOM_DEC 543 #define IDM_ZOOM_RST 544 #define IDM_ARP 545 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 138 #define _APS_NEXT_COMMAND_VALUE 545 #define _APS_NEXT_CONTROL_VALUE 241 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/Makensisw/resource.rc000077500000000000000000000410341477201124000201330ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON ICON "icon.ico" IDI_ASSOC_NSI ICON "assoc_nsi.ico" IDI_ASSOC_NSH ICON "assoc_nsh.ico" ///////////////////////////////////////////////////////////////////////////// // // Menu // IDM_MENU MENUEX BEGIN POPUP "&File", IDM_FILE BEGIN MENUITEM "&Save Output...", IDM_SAVE MENUITEM "&Load Script...\tCtrl+L", IDM_LOADSCRIPT MENUITEM "", -1, MFT_SEPARATOR MENUITEM "E&xit\tAlt+X", IDM_EXIT MENUITEM "", -1, MFT_SEPARATOR MENUITEM "", IDM_MRU_FILE END POPUP "&Edit", IDM_EDIT BEGIN MENUITEM "&Copy\tCtrl+C", IDM_COPYSELECTED MENUITEM "Copy &All", IDM_COPYALL MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Find...\tCtrl+F", IDM_FIND MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Select All\tCtrl+A", IDM_SELECTALL MENUITEM "Clear &Log Window\tCtrl+W", IDM_CLEARLOG END POPUP "&Script", IDM_SCRIPT BEGIN MENUITEM "&Recompile\tCtrl+R", IDM_RECOMPILE MENUITEM "Test &Installer\tCtrl+T", IDM_TEST MENUITEM "Reco&mpile and Test\tCtrl+M", IDM_RECOMPILE_TEST MENUITEM "C&ancel compilation\tCtrl+K", IDM_CANCEL MENUITEM "", -1, MFT_SEPARATOR POPUP "Set &Compressor", IDM_COMPRESSOR_SUBMENU BEGIN MENUITEM "&Defined in Script/Compiler Default", IDM_COMPRESSOR_SCRIPT MENUITEM "&ZLIB", IDM_ZLIB MENUITEM "ZLIB (solid)", IDM_ZLIB_SOLID MENUITEM "BZI&P2", IDM_BZIP2 MENUITEM "BZIP2 (solid)", IDM_BZIP2_SOLID MENUITEM "&LZMA", IDM_LZMA MENUITEM "LZMA (solid)", IDM_LZMA_SOLID MENUITEM "&Best Compressor", IDM_BEST END MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Edit Script\tCtrl+E", IDM_EDITSCRIPT MENUITEM "Open Script &Folder\tCtrl+B", IDM_BROWSESCR END POPUP "&Tools", IDM_TOOLS BEGIN MENUITEM "&Settings\tCtrl+S", IDM_SETTINGS MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Window Info", IDM_WNDSPY MENUITEM "&Lookup", IDM_LOOKUP MENUITEM "Generate &GUID", IDM_GUIDGEN MENUITEM "&Add/Remove Programs", IDM_ARP MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Clear Recent &Files List", IDM_CLEAR_MRU_LIST END POPUP "&Help", IDM_HELP BEGIN MENUITEM "NSIS Users &Manual\tF1", IDM_DOCS MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Check for &Updates", IDM_NSISUPDATE MENUITEM "", -1, MFT_SEPARATOR MENUITEM "NSIS &Homepage", IDM_NSISHOME MENUITEM "NSIS &Forum", IDM_FORUM MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&About MakeNSISW", IDM_ABOUT END END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDK_ACCEL ACCELERATORS BEGIN VK_F6, IDM_UI_SWITCHSECTION, VIRTKEY "A", IDM_SELECTALL, VIRTKEY, CONTROL "B", IDM_BROWSESCR, VIRTKEY, CONTROL "C", IDM_COPYSELECTED, VIRTKEY, CONTROL "E", IDM_EDITSCRIPT, VIRTKEY, CONTROL "F", IDM_FIND, VIRTKEY, CONTROL "L", IDM_LOADSCRIPT, VIRTKEY, CONTROL "M", IDM_RECOMPILE_TEST, VIRTKEY, CONTROL VK_F5, IDM_RECOMPILE_TEST, VIRTKEY "R", IDM_RECOMPILE, VIRTKEY, CONTROL VK_F7, IDM_RECOMPILE, VIRTKEY "S", IDM_SETTINGS, VIRTKEY, CONTROL "T", IDM_TEST, VIRTKEY, CONTROL VK_F5, IDM_TEST, VIRTKEY, CONTROL VK_F1, IDM_DOCS, VIRTKEY "W", IDM_CLEARLOG, VIRTKEY, CONTROL "X", IDM_EXIT, VIRTKEY, ALT "K", IDM_CANCEL, VIRTKEY, CONTROL VK_CANCEL, IDM_CANCEL, VIRTKEY, CONTROL VK_ADD, IDM_ZOOM_INC, VIRTKEY, CONTROL VK_SUBTRACT, IDM_ZOOM_DEC, VIRTKEY, CONTROL "0", IDM_ZOOM_RST, VIRTKEY, CONTROL END ///////////////////////////////////////////////////////////////////////////// // // Dialog // DLG_MAIN DIALOG 0, 0, 362, 246 STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "MakeNSISW" MENU IDM_MENU FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_LOGWIN,RICHEDIT_CLASS,ES_MULTILINE | ES_AUTOVSCROLL | ES_NOHIDESEL | ES_READONLY | ES_SAVESEL | WS_TABSTOP | WS_BORDER | WS_VSCROLL,7,22,348,190 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,220,346,1 LTEXT "",IDC_VERSION,7,230,200,12,WS_DISABLED DEFPUSHBUTTON "Test &Installer",IDC_TEST,230,226,60,15,WS_DISABLED | WS_TABSTOP PUSHBUTTON "&Close",IDCANCEL,296,226,49,15,WS_TABSTOP END DLG_ABOUT DIALOGEX 0, 0, 233, 142 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_NOFAILCREATE CAPTION "About MakeNSISW" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,171,120,50,15 CONTROL "",IDC_ABOUTHEADER,"Static",SS_OWNERDRAW,0,0,233,25 LTEXT "",IDC_ABOUTVERSION,14,31,218,8,SS_NOTIFY LTEXT "Copyright",IDC_ABOUTCOPY,14,43,218,8 LTEXT "Other Contributors:",IDC_ABOUTPORTIONS,14,56,218,10 LTEXT "",IDC_OTHERCONTRIB,27,68,206,22 CONTROL "",IDC_ABOUTDONATE,"SysLink",WS_TABSTOP|LWS_IGNORERETURN,14,98,218,8 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,13,113,209,1 LTEXT "NSIS",IDC_NSISVER,14,123,135,8,WS_DISABLED END DLG_SETTINGS DIALOGEX 0, 0, 292, 215 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "MakeNSISW Settings" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,180,192,48,14 PUSHBUTTON "Cancel",IDCANCEL,234,192,48,14 GROUPBOX "Default Compressor (overrides script setting)", IDC_STATIC,6,6,282,41 COMBOBOX IDC_COMPRESSOR,18,24,258,94,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP GROUPBOX "Symbol Definitions",IDC_STATIC,6,54,282,132 LTEXT "Symbol &Name",IDC_STATIC,18,84,44,8 EDITTEXT IDC_SYMBOL,18,96,68,12,ES_AUTOHSCROLL,WS_EX_CLIENTEDGE LTEXT "&Value (optional)",IDC_STATIC,18,120,50,8 EDITTEXT IDC_VALUE,18,132,66,12,ES_AUTOHSCROLL,WS_EX_CLIENTEDGE PUSHBUTTON "&Add >>",IDC_RIGHT,96,84,49,14 PUSHBUTTON "&Edit <<",IDC_LEFT,96,108,49,14 PUSHBUTTON "&Delete",IDC_DEL,96,132,49,14 LTEXT "Symbol List",IDC_STATIC,156,66,118,9 LISTBOX IDC_SYMBOLS,156,78,121,79,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "&Clear",IDC_CLEAR,156,162,36,14 PUSHBUTTON "&Load",IDC_LOAD,198,162,36,14 PUSHBUTTON "&Save",IDC_SAVE,240,162,36,14 END DLG_COMPRESSOR DIALOGEX 0, 0, 250, 53 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Choose Compressor" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,138,30,48,14 PUSHBUTTON "Cancel",IDCANCEL,192,30,48,14 LTEXT "Compressor:",IDC_STATIC,6,14,43,8 COMBOBOX IDC_COMPRESSOR,54,12,184,94,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END DLG_SYMBOLSET DIALOGEX 0, 0, 188, 125 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,78,102,50,14 PUSHBUTTON "Cancel",IDCANCEL,132,102,50,14 LTEXT "Symbol Definitions Set Name:",IDC_STATIC,6,6,101,10 COMBOBOX IDC_NAMES,6,17,176,80,CBS_SIMPLE | CBS_AUTOHSCROLL | CBS_SORT | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Delete",IDC_DEL,6,102,50,14 END DLG_WNDSPY DIALOGEX 0, 0, 236, 130 STYLE DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER CAPTION "Window Info" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN CONTROL "", IDC_SPYDRAG, "Static", SS_ICON | SS_NOTIFY | SS_CENTERIMAGE | SS_SUNKEN | WS_CHILD | WS_VISIBLE | WS_GROUP, 7, 7, 20 , 20 LTEXT "Drag the finder over a window and then release the mouse...", IDC_STATIC , 39, 7, 190, 20 CONTROL "Id:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 34, 32, 10 CONTROL "", IDC_WNDID, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 34, 190, 10 CONTROL "HWND:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 44, 32, 10 CONTROL "", IDC_HWND, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 44, 190, 10 CONTROL "Class:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 54, 32, 10 CONTROL "", IDC_WNDCLASS, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 54, 190, 10 CONTROL "Data:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 64, 32, 10 CONTROL "", IDC_WNDUSERDATA, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, 39, 64, 190, 10 CONTROL "Style:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 74, 32, 10 CONTROL "", IDC_WNDSTYLE, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 74, 190, 10 CONTROL "Logical:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 84, 32, 10 CONTROL "", IDC_WNDLOGISIZE, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, 39, 84, 190, 10 CONTROL "Physical:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 94, 32, 10 CONTROL "", IDC_WNDPHYSSIZE, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, 39, 94, 190, 10 CONTROL "Info:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 104, 32, 10 CONTROL "", IDC_WNDINFO, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 104, 190, 10 CONTROL "DPI:", IDC_STATIC, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP , 7, 114, 32, 10 CONTROL "", IDC_WNDDPI, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 114, 190, 10 END DLG_LOOKUP DIALOGEX 0, 0, 301, 150 STYLE DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER CAPTION "Lookup" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN GROUPBOX "Source", 0, 7, 7, 285, 65 COMBOBOX IDC_LUMODE, 16, 20, 268, 114, CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_TABSTOP CONTROL "", IDC_LUEXTRALABEL, "Static", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 16, 38, 268, 10 CONTROL "", IDC_LUEXTRATEXT, "Edit", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 16, 50, 268, 14 CONTROL "", IDC_LUOUTPUTTEXT, "Edit", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 7, 80, 286, 60 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN DLG_MAIN, DIALOG BEGIN RIGHTMARGIN, 361 BOTTOMMARGIN, 228 END DLG_ABOUT, DIALOG BEGIN BOTTOMMARGIN, 121 END DLG_SETTINGS, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 285 TOPMARGIN, 7 BOTTOMMARGIN, 208 END DLG_COMPRESSOR, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 243 TOPMARGIN, 7 BOTTOMMARGIN, 46 END DLG_SYMBOLSET, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 183 TOPMARGIN, 7 BOTTOMMARGIN, 118 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // RT_MANIFEST // 1 RT_MANIFEST "makensisw.xml" ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDB_TOOLBAR BITMAP "toolbar.bmp" IDB_TOOLBAR16N24 BITMAP "toolbar16n24.bmp" IDB_TOOLBAR16D24 BITMAP "toolbar16d24.bmp" // Note: This image should NEVER be <= 256 colors because then Windows will create its own disabled effect IDB_TOOLBAR16H24 BITMAP "toolbar16h24.bmp" IDB_TOOLBAR24N24 BITMAP "toolbar24n24.bmp" IDB_TOOLBAR24D24 BITMAP "toolbar24d24.bmp" // Note: This image should NEVER be <= 256 colors because then Windows will create its own disabled effect IDB_TOOLBAR24H24 BITMAP "toolbar24h24.bmp" IDB_TOOLBAR32N24 BITMAP "toolbar32n24.bmp" IDB_TOOLBAR32D24 BITMAP "toolbar32d24.bmp" // Note: This image should NEVER be <= 256 colors because then Windows will create its own disabled effect IDB_TOOLBAR32H24 BITMAP "toolbar32h24.bmp" ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE BEGIN IDS_LOADSCRIPT "Load Script..." IDS_SAVE "Save Output..." IDS_EXIT "Exit" IDS_COPY "Copy" IDS_FIND "Find..." IDS_RECOMPILE "Recompile" IDS_SETTINGS "Settings..." IDS_COMPRESSOR "Set Compressor" IDS_TEST "Test Installer" IDS_EDITSCRIPT "Edit Script" IDS_BROWSESCR "Open Script Folder" IDS_CLEARLOG "Clear Log Window" END STRINGTABLE BEGIN IDS_SCRIPT "Defined in Script/Compiler Default" IDS_ZLIB "ZLIB" IDS_ZLIB_SOLID "ZLIB (solid)" IDS_BZIP2 "BZIP2" IDS_BZIP2_SOLID "BZIP2 (solid)" IDS_RECOMPILE_TEST "Recompile and Test" IDS_BEST "Best Compressor" IDS_LZMA "LZMA" IDS_LZMA_SOLID "LZMA (solid)" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/Makensisw/toolbar.bmp000077500000000000000000000110661477201124000201220ustar00rootroot00000000000000BM66(à" " €€€€€€€€€ÀÀÀÀÜÀðʦ @ ` €   À à@@ @@@`@€@ @À@à`` `@```€` `À`à€€ €@€`€€€ €À€à    @ ` €   À àÀÀ À@À`À€À ÀÀÀààà à@à`à€à àÀàà@@ @@@`@€@ @À@à@ @ @ @@ `@ €@  @ À@ à@@@@ @@@@@`@@€@@ @@À@@à@`@` @`@@``@`€@` @`À@`à@€@€ @€@@€`@€€@€ @€À@€à@ @  @ @@ `@ €@  @ À@ à@À@À @À@@À`@À€@À @ÀÀ@Àà@à@à @à@@à`@à€@à @àÀ@àà€€ €@€`€€€ €À€à€ € € @€ `€ €€  € À€ à€@€@ €@@€@`€@€€@ €@À€@à€`€` €`@€``€`€€` €`À€`à€€€€ €€@€€`€€€€€ €€À€€à€ €  € @€ `€ €€  € À€ à€À€À €À@€À`€À€€À €ÀÀ€Àà€à€à €à@€à`€à€€à €àÀ€ààÀÀ À@À`À€À ÀÀÀàÀ À À @À `À €À  À ÀÀ àÀ@À@ À@@À@`À@€À@ À@ÀÀ@àÀ`À` À`@À``À`€À` À`ÀÀ`àÀ€À€ À€@À€`À€€À€ À€ÀÀ€àÀ À  À @À `À €À  À ÀÀ àÀÀÀÀ ÀÀ@ÀÀ`ÀÀ€ÀÀ ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ&&&&&&&&&&&&&¤ä£ääääää›\í‘‘‘‘‘‘&&&.&.&.&.&&&o·¿········o&’’ííííííí’’ã ÿ ›¯geí‘‘ØØØØØØ‘‘1)1()&w.¿wwww·ww·¿.&wo¿¿¿¿¿¿¿¿¿w¿&’ÛÛ‰‰öö‰Ò’äöêëêëóó ›wwgeìÙØØØØØØØØØØ‘11)1(11).w&¿¿¿¿¿¿¿·w¿&&¿&¿¿¿¿¿¿¿¿¿w¿&’ÛÛö‰‰ööö‰Ò’ä ÿ ÿ ›wogfí‘ØØØØØØØØØØØØ‘a21)1(11)11&&·&ö¿¿¿¿¿¿¿w¿&¤&¿.¿¿¿¿¿¿¿¿¿wö&’ÛÛö‰‰öö‰Ò’ä¤äääìÿêêóëëë ›wogeíØØØØÙâëëâØØØØ‘22j11öö³01)1&w.w.¿¿¿¿¿¿¿w¿&     &¿w·¿¿¿¿¿¿¿!wö·&’ÛÛöööö‰Ò’ä äÿÿÿ ÿ ÿ ›wwg\äììíÙØØØëÿÿÿÿ ØØØØØ‘*s21)q½ÿö³1)0)777&w&·&ÿ¿öööööö¿ö&¤     &¿¿nÿööööö!s!öö&’ÛÛÛääÛÛÛÛÛÛ’ãÿêëëìÿêêëëêë ›wíì ÿÿ ìÙØáÙÿ ááÙØØØØØØ‘sss1111½ÿös11)7777.w.¿/........&&.¤¤········ ···ùùù·· ····ùùù· ···ù···· ····ùùù· &¿¿.&&&&&!|½s!&&’ÛäííííííííÛ’äö ÿ ìÿÿÿÿ ÿ ÿší ÿÿ ÿÿ äØâááÿáÙÙØ ØØØØØ‘!ssÿÿö¼)1777&w&¿¿¿¿¿¿¿¿¿¿.ÿÿÿÿÿÿ¤¤········ ···ù··ù· ····ù··· ··ù·ù··· ····ù··· &¿¿¿¿¿¿¿!s||½s!’ÛÿÿÿÿÿÿÿÿÿÛ’äÿêêêìÿÿÿÿÿöí›ì ÿ ÿÿÿÿíÙëââÿ ááØÿ ØØØØ‘!ttÿööööÿÿÿÿ1)7777&¿&ö¿ö¿ö¿ö¿ö¿.ÿÿÿÿÿÿ¤¤········ ···ùùù·· ·····ù·· ·ù···ù·· ····ù··· &ÿ¿¿¿¿¿!!!!|s!!!’ÛÿÿÿÿÿÿÿÿÿÛ’äÿÿÿÿìÿÿÿÿÿäãääô ÿÿÿÿÿ ìÙì ë ÿööÿÿÿ ØØØ‘)½|½½½½´½ÿÿ¾r11777&¿..ö¿¿·...&&&ÿÿÿÿÿÿ¤¤········ ···ù··ù· ······ù· ······ù· ····ù··· &ÿ¿¿¿&www!|s!’ÛÿÿÛ’ìÿêêê ÿÿÿÿÿãôêí ÿ ÿÿÿíØô ôë ÿÿ ØØØ‘!´¾ssts½öÿ¾rr1)77.¿¿¿..&.¿¿¿.ÿÿÿÿÿÿ¤··· ···ùùù ···ùùù ···ù ···ù &&&&!{!’ÛÿÿÿÿÿÿÿÿÿÛ’ìÿÿÿÿììì ììäóì ÿÿ ÿ äÙ ëëââÿ ØØØ‘2¾s3|öÿ¾r221!&ö¿öö¿ö¿ö¿ö&ÿÿÿÿÿÿ··· ··· ··· ··· ··· !rr!’ÛÿÿÛ’ìÿÿÿÿÿöí›õÿ ÿÿìØôö ëêá áØØØ‘j¼½sts3r2j!&ö¿¿·.&.&&ÿÿÿÿÿÿ     !r!’ÛÿÿÿÿÿÿÿÿÿÛ’ìÿÿÿÿÿãääääÿ õäÐ ÿ ì ëâàØ‘*½ö½|ttts2!&.&&¤¤¤     !!!!’ÿÿÿÿÿÿÿÿÿ’ ÿÿÿÿÿäóêäí ìäØÙô ôëáÙ‘j*¾¼ks!!!! ìììììäóììäÙÙÙÙÙ‘rj2j2jnsis-3.11/Contrib/Makensisw/toolbar.cpp000077500000000000000000000202611477201124000201230ustar00rootroot00000000000000/* Copyright (c) 2003 Sunil Kamath Modified by Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/20/2007 */ #define TOOLBAR_CPP #include "makensisw.h" #include "resource.h" #include "toolbar.h" NTOOLBAR g_toolbar; extern NSCRIPTDATA g_sdata; extern NTOOLTIP g_tip; typedef struct { BYTE Style, State; BYTE ImgIdx; BYTE TTip; WORD CmdId; } TBBTNDESC; #define MKNAMEDTBBTNDESC(id, sta, sty) sty, sta, IDB_##id, IDS_##id, IDM_##id static const TBBTNDESC g_TBBtnsDesc[BUTTONCOUNT] = { /*TBB_LOADSCRIPT*/ { MKNAMEDTBBTNDESC(LOADSCRIPT, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_SAVE */ { MKNAMEDTBBTNDESC(SAVE, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) }, /*TBB_SEP1 */ { TBSTYLE_SEP }, /*TBB_COPY */ { MKNAMEDTBBTNDESC(COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_FIND */ { MKNAMEDTBBTNDESC(FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_CLEARLOG */ { MKNAMEDTBBTNDESC(CLEARLOG, TBSTATE_ENABLED, TBSTYLE_BUTTON ) }, /*TBB_SEP2 */ { TBSTYLE_SEP }, /*TBB_RECOMPILE */ { MKNAMEDTBBTNDESC(RECOMPILE, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) }, /*TBB_TEST */ { MKNAMEDTBBTNDESC(TEST, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) }, /*TBB_COMPRESSOR*/ { MKNAMEDTBBTNDESC(COMPRESSOR, TBSTATE_ENABLED, TBSTYLE_DROPDOWN) }, /*TBB_EDITSCRIPT*/ { MKNAMEDTBBTNDESC(EDITSCRIPT, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) }, /*TBB_BROWSESCR */ { MKNAMEDTBBTNDESC(BROWSESCR, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON ) } }; static const BYTE g_TBIL[] = { /* 16 */ IDB_TOOLBAR16N24, IDB_TOOLBAR16D24, IDB_TOOLBAR16H24, /* 24 */ IDB_TOOLBAR24N24, IDB_TOOLBAR24D24, IDB_TOOLBAR24H24, /* 32 */ IDB_TOOLBAR32N24, IDB_TOOLBAR32D24, IDB_TOOLBAR32H24 }; static void LoadToolBarImages(); void CreateToolBar() { g_toolbar.hwnd = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | TBSTYLE_TRANSPARENT | TBSTYLE_FLAT, 0, 0, 0, 0, g_sdata.hwnd, (HMENU) IDC_TOOLBAR, g_sdata.hInstance, NULL); TBBUTTON tbbs[BUTTONCOUNT]; SendMessage(g_toolbar.hwnd, TB_BUTTONSTRUCTSIZE, sizeof(tbbs[0]), 0); for (UINT i = 0; i < BUTTONCOUNT; ++i) { tbbs[i].iBitmap = g_TBBtnsDesc[i].ImgIdx; tbbs[i].idCommand = g_TBBtnsDesc[i].CmdId; tbbs[i].fsState = g_TBBtnsDesc[i].State; tbbs[i].fsStyle = g_TBBtnsDesc[i].Style; tbbs[i].dwData = 0, tbbs[i].iString = 0; } SendMessage(g_toolbar.hwnd, TB_ADDBUTTONS, BUTTONCOUNT, (LPARAM) &tbbs); // Note: TB_ADDBUTTONSW is IE4+ LoadToolBarImages(); } static void LoadToolBarImages() { HWND hTB = g_toolbar.hwnd; // Comctl32.dll version detection #ifndef _WIN64 HMODULE hMod = LoadSysLibrary("COMCTL32"); const FARPROC hasCC4_70 = (SupportsW95()) ? GetProcAddress(hMod, "InitCommonControlsEx") : (FARPROC) TRUE; // NT4 shipped with v4.70 const FARPROC hasCC4_71 = (SupportsWNT4() || SupportsW95()) ? GetProcAddress(hMod, "DllGetVersion") : (FARPROC) TRUE; // IE4 shipped with v4.71 #else const bool hasCC4_70 = true, hasCC4_71 = true; #endif UINT iltypecount = 3, s16 = DpiScaleY(hTB, 16), imgsize, iloffs; // 144dpi(150%)=24 120dpi(125%)=20 if (s16 > 24) imgsize = 32, iloffs = 2 * iltypecount; else if (s16 > 16) imgsize = 24, iloffs = 1 * iltypecount; else imgsize = 16, iloffs = 0 * iltypecount; UINT dispbpp = GetScreenBPP(hTB); if (hasCC4_70 && dispbpp > 8) { // Version 4.70 => Modern toolbar, 24-bit bitmaps g_toolbar.imagelist = ImageList_LoadImage(g_sdata.hInstance, MAKEINTRESOURCE(g_TBIL[iloffs+0]), imgsize, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); g_toolbar.imagelistd = ImageList_LoadImage(g_sdata.hInstance, MAKEINTRESOURCE(g_TBIL[iloffs+1]), imgsize, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); g_toolbar.imagelisth = ImageList_LoadImage(g_sdata.hInstance, MAKEINTRESOURCE(g_TBIL[iloffs+2]), imgsize, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); SendMessage(hTB, TB_SETIMAGELIST, 0, (LPARAM) g_toolbar.imagelist); SendMessage(hTB, TB_SETDISABLEDIMAGELIST, 0, (LPARAM) g_toolbar.imagelistd); SendMessage(hTB, TB_SETHOTIMAGELIST, 0, (LPARAM) g_toolbar.imagelisth); } else { // Version 4.00 => Old Windows 95 toolbar, 256 color bitmap with system palette TBADDBITMAP tbBitmap; tbBitmap.hInst = g_sdata.hInstance; tbBitmap.nID = IDB_TOOLBAR; SendMessage(hTB, TB_ADDBITMAP, IMAGECOUNT, (LPARAM) &tbBitmap); } if (hasCC4_71) SendMessage(hTB, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS); } void UpdateToolBarCompressorButton() { int iBitmap, iString; TCHAR szBuffer[124]; // increased to 124 for good measure, also. TCHAR temp[64]; // increased to 64. Hit limit 08/20/2007 -- Jim Park. if(g_sdata.compressor >= COMPRESSOR_SCRIPT && g_sdata.compressor <= COMPRESSOR_BEST) { iBitmap = compressor_bitmaps[(int)g_sdata.compressor]; iString = compressor_strings[(int)g_sdata.compressor]; } else { return; } LoadString(g_sdata.hInstance, IDS_COMPRESSOR, temp, COUNTOF(temp)); szBuffer[0] = _T('\0'); lstrcat(szBuffer,temp); lstrcat(szBuffer,_T(" [")); LoadString(g_sdata.hInstance, iString, temp, COUNTOF(temp)); lstrcat(szBuffer,temp); lstrcat(szBuffer,_T("]")); SendMessage(g_toolbar.hwnd, TB_CHANGEBITMAP, (WPARAM) IDM_COMPRESSOR, (LPARAM) MAKELPARAM(iBitmap, 0)); SetTooltipText(g_toolbar.hwnd, (UINT) TBB_COMPRESSOR, szBuffer); } void AddToolBarButtonTooltip(UINT idx, int iString) { TOOLINFO ti; ti.cbSize = SizeOfStruct(ti); ti.uFlags = 0; ti.hwnd = g_toolbar.hwnd; ti.uId = idx; ti.hinst = g_sdata.hInstance, ti.lpszText = MAKEINTRESOURCE(iString); SendMessage(g_toolbar.hwnd, TB_GETITEMRECT, idx, (LPARAM) &ti.rect); SendMessage(g_tip.tip, TTM_ADDTOOL, 0, (LPARAM) &ti); } void AddToolBarTooltips() { for (UINT i = 0; i < BUTTONCOUNT; ++i) { int ids = g_TBBtnsDesc[i].TTip; if (ids) AddToolBarButtonTooltip(i, ids); } } void EnableToolBarButton(int cmdid, BOOL enabled) { UINT state = enabled ? TBSTATE_ENABLED : TBSTATE_INDETERMINATE; SendMessage(g_toolbar.hwnd, TB_SETSTATE, cmdid, MAKELPARAM(state, 0)); } static bool IsRTL(HWND hWnd) { return (((UINT) GetWindowLongPtr(hWnd, GWL_EXSTYLE)) & (WS_EX_LAYOUTRTL)) != 0; } // WS_EX_RIGHT? WS_EX_RTLREADING? #ifndef TPM_LAYOUTRTL #define TPM_LAYOUTRTL 0x8000 // For MinGW (w32api-4.0.3-1) #endif static UINT GetToolbarDropdownMenuPos(HWND hTB, UINT Id, POINT&pt) { RECT r; INT_PTR idx = SendMessage(hTB, TB_COMMANDTOINDEX, Id, 0); UINT tpm_align = GetMenuDropAlignment(); bool ralign = tpm_align != TPM_LEFTALIGN, rtl = SupportsRTLUI() && IsRTL(hTB); SendMessage(hTB, TB_GETITEMRECT, idx, (LPARAM) &r); MapWindowPoints(hTB, NULL, (POINT*) &r, 2); pt.x = (rtl ^ ralign) ? r.right : r.left, pt.y = r.bottom; return tpm_align | (rtl ? TPM_LAYOUTRTL : 0) | TPM_VERTICAL; } static void ShowToolbarDropdownMenu(const NMTOOLBAR&nmtb, HWND hNotifyWnd, HMENU hParentMenu, UINT SubMenuId = -1) { POINT pt; HMENU hMenu = SubMenuId == static_cast(-1) ? hParentMenu : FindSubMenu(hParentMenu, SubMenuId); UINT tpmf = GetToolbarDropdownMenuPos(nmtb.hdr.hwndFrom, nmtb.iItem, pt); SendMessage(g_tip.tip, TTM_ACTIVATE, false, 0); TrackPopupMenu(hMenu, tpmf, pt.x, pt.y, 0, hNotifyWnd, NULL); SendMessage(g_tip.tip, TTM_ACTIVATE, true, 0); } void ShowCompressorToolbarDropdownMenu(const NMTOOLBAR&nmtb) { HMENU hParentMenu = FindSubMenu(g_sdata.menu, IDM_SCRIPT); ShowToolbarDropdownMenu(nmtb, g_sdata.hwnd, hParentMenu, IDM_COMPRESSOR_SUBMENU); } nsis-3.11/Contrib/Makensisw/toolbar.h000077500000000000000000000050661477201124000175760ustar00rootroot00000000000000/* Copyright (c) 2003 Sunil Kamath Modified by Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Reviewed for Unicode support by Jim Park -- 08/20/2007 */ #ifndef TOOLBAR_H #define TOOLBAR_H #include #define TBB_LOADSCRIPT 0 #define TBB_SAVE 1 #define TBB_SEP1 2 #define TBB_COPY 3 #define TBB_FIND 4 #define TBB_CLEARLOG 5 #define TBB_SEP2 6 #define TBB_RECOMPILE 7 #define TBB_TEST 8 #define TBB_COMPRESSOR 9 #define TBB_EDITSCRIPT 10 #define TBB_BROWSESCR 11 #define BUTTONCOUNT 12 #define IDB_LOADSCRIPT 0 #define IDB_SAVE 1 #define IDB_COPY 2 #define IDB_FIND 3 #define IDB_RECOMPILE 4 #define IDB_TEST 5 #define IDB_EDITSCRIPT 6 #define IDB_BROWSESCR 7 #define IDB_CLEARLOG 8 #define IDB_COMPRESSOR_SCRIPT 9 #define IDB_COMPRESSOR_BZIP2 10 #define IDB_COMPRESSOR_ZLIB 11 #define IDB_COMPRESSOR_BEST 12 #define IDB_COMPRESSOR_LZMA 13 #define IMAGECOUNT 14 #define IDB_COMPRESSOR IDB_COMPRESSOR_SCRIPT typedef struct ToolBarStruct { HWND hwnd; HIMAGELIST imagelist; HIMAGELIST imagelistd; HIMAGELIST imagelisth; } NTOOLBAR; void CreateToolBar(); void EnableToolBarButton(int, BOOL); void AddToolBarTooltips(); void ShowCompressorToolbarDropdownMenu(const NMTOOLBAR&nmtb); void UpdateToolBarCompressorButton(); #endif nsis-3.11/Contrib/Makensisw/toolbar16d24.bmp000077500000000000000000000250661477201124000206100ustar00rootroot00000000000000BM6*6(à*3 3 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚}ƒ}ƒ}ƒ}ƒ}ƒ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwyywyywyywyywyywyywyywyywyywyywyywyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffffffffffffffffffffÿÿÿÿ—†…—†…ª¥¥ª¥¥ª¥¥ª¥¥ª¥¥ª¥¥ª¥¥”€€—†…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªªÉÇÄÉÇÄÈÅÁÈÅÁÈÅÁÇÿÇÿÇÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ}ƒ}£z£z£z£z£z£zƒ}ƒ}ÿÿÿÿÿÿÿÿt†yt†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‚ƒuvvrrsuvvfffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz™™›¯¯›¯¯›¯¯›¯¯›¯¯›¯¯›¯¯›¯¯›¯¯›¯¯›¯¯wyyÿÿÿÿÿÿÿÿÿÿ½¶°½·°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿz™™z™™z™™z™™z™™z™™z™™z™™z™™z™™z™™z™™ffffffÿÿ—†…­——§””À¿¿“~~“~~ÁÂÂÀÁÁ¾¿¿¸¸¸‘zzˆˆ—†…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªªÊÈÆ¶¯¨µ­¦´¬¤´¬¤³ª¡³ª¡Çÿªªªÿÿ¢Ÿœ{vr{vr{vr{vr†‚ÿÿÿÿÿÿŸ›™{vr{vr{vr{vr†‚ÿÿÿÿÿÿ–‡|¡z£z£z£z£z£z£z£z£z¡zƒ}ÿÿÿÿÿÿt†yw~{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‰Ž„‰Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz™™½ÇÇ­¸À­¸À­¸À­¸À­¸À­¸À­¸À­¸À­¸À›¯¯wyyÿÿÿÿÿÿÿÿ½¶°ÊÉÇÊÉǽ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffÿÿÿÿÿÿÿÿz™™ÊÊʯ¼Ã¯¼Ã¯¼Ã¯¼Ã¯¼Ã¯¼Ã¯¼Ã¯¼Ã›¯¯z™™ffffffÿÿ—†…«––¦’’ÂÀÀ“~~“~~ÀÁÁÁÂÂÀÀÁ¸¸¸‘{{ˆˆ—†…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªªÊÈÆÊÈÆÉÇÄÉÇÄÉÇÄÈÅÁÈÅÁÇÿªªªÿÿ™•‘¯«©¤Ÿ–’Œˆ…{vrÿÿÿÿÿÿ‘Ї®«¨¤Ÿ–’Œˆ…}xuÿÿÿÿ–‡|¡z£z¡z¡z¡z¡z£z£z£z£z£z¡zƒ}ÿÿÿÿt†yy’€y’€y’€{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‰Žš¢©„‰Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz™™½Çǯ½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â›¯¯wyyÿÿÿÿÿÿ½¶°ÊÉÇÊÉÇÊÉÇÊÉǽ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffffffffffffffffffffÿÿÿÿÿÿz™™ÊÊʯ½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â›¯¯fffz™™fffÿÿ—†…«––¦’’Ó~~“~~À¿¿ÁÂÂÁºººyyˆˆ—†…ÿÿÿÿªªªªªªªªªªªªªªªªªªÊÉǶ¯¨µ­¦´¬¤´¬¤³ª¡³ª¡ÈÅÁªªªÿÿ™•‘Á¾½º·µ©¦¤›˜–{vrÿÿÿÿÿÿ‘ЇÆÃÁº·µ©¦¤›˜–}xuÿÿÿÿž‹z¡z¡z Œz¥“„­ž’¯¢–°£—­ž’©˜ˆ£z£z£zƒ}ÿÿÿÿt†y{–‚{–‚{–‚{–‚{–‚{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‰Žš¢©„‰Ž‰ƒ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwyywyyz™™½ÇǰÀðÀðÀðÀðÀðÀðÀðÀðÀÛ¯¯wyyÿÿÿÿ½¶°ÊÉÇÊÉÇÊÉÇÊÉÇÊÉǾ·¯°§žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿÿÿÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿÿÿÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿÿÿÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿÿÿÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿz™™ÊÊʯ½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½Â¯½ÂtŒvz™™fffz™™fffÿÿ—†…«––¦’’ÃÂÂÃÂÂÀ¿¿À¿¿ÀÀÁÀÀÁººº“~~ ‹‹—†…ÿÿÿÿªªªÉÇÄÉÇÄÈÅÁÈÅÁªªªËÊÉËÊÉÊÉÇÊÈÆÊÈÆÉÇÄÉÇÄÈÅÁªªªÿÿ™•‘ÆÃÁ¶³±©¦¤›˜–{vrÿÿÿÿÿÿ‘ЇÆÃÁ¶³±©¦¤›˜–}xuÿÿš‰{¤}¢|¢|°¤—ÊÊÊÊÊÊÊÊÊÊÊÊÄÀ¼® “£z£z£z£z‚}ÿÿt†y~™†~™†~™†~™†~™†~™†~™†{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‰Ž‚¨®™³½‘¦®‰ƒ‡ÿÿÿÿÿÿÿÿÿÿÿÿz™™›¯¯›¯¯z™™½ÇǯÁïÁïÁïÁïÁïÁïÁïÁïÁÛ¯¯wyyÿÿ½¶°ÊÉÇÊÉÇÊÉÇÊÉÇÊÉǾ·¯¼´¬µ­¦°§žÿÿÿÿÿÿÿÿÿÿÿÿwyywyywyywyywyywyywyywyywyywyyffffff¾·¯fffÿÿÿÿwyywyywyywyywyywyywyywyywyywyyffffff¾·¯fffÿÿÿÿwyywyywyywyywyywyywyywyywyywyyffffff¾·¯fffÿÿÿÿwyywyywyywyywyywyywyywyywyywyyffffff¾·¯fffÿÿÿÿwyywyywyywyywyywyywyywyywyywyyffffff¾·¯fffÿÿz™™ÊÊʰÀðÀðÀðÀðÀðÀðÀðÀÃtŒv‰¢tŒv›¯¯›¯¯fffÿÿ—†…©••§””©••«™™«™™©——§””«˜˜©••¦’’©••—†…ÿÿÿÿªªªÊÈÆÁ¿½Á¿½Á¿½ªªªËÊɶ¯¨µ­¦´¬¤´¬¤³ª¡³ª¡ÉÇĪªªÿÿž™–ÇÅÿ¼»±¯­©§¦{vrÿÿÿÿÿÿ‰†ÇÅÿ¼»´²°©§¦}xuÿÿš‰{¦”¥”‚¥”‚ÊÊÊÿ»¨˜ˆ¥”ƒ£‘€ { Œz£z£z£z£zƒ}ÿÿt†y€œˆ€œˆ€œˆ€œˆ€œˆ€œˆ€œˆ€œˆ€œˆ{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡´ÃŨ¼Á™³½‘¦®‰ƒ‡ÿÿÿÿÿÿÿÿÿÿz™™½ÇÇ­¸Àz™™½ÇǯÁïÁïÁïÁïÁïÁïÁïÁïÁÛ¯¯wyyÿÿ½·°ÊÉÇÊÉÇÊÉÇÊÉǾ·¯¼´¬¹°§½µ©«¦¤°§ÿÿÿÿÿÿÿÿ{˜˜™®®™®®™®®™®®™®®™®®™®®™®®™®®wyyÿÿfff¾·¯fffÿÿ{˜˜™®®™®®wwªwwªwwª™®®™®®™®®™®®wyyÿÿfff¾·¯fffÿÿ{˜˜™®®™®®™®®wwªwwªwwª™®®™®®™®®wyyÿÿfff¾·¯fffÿÿ{˜˜™®®™®®wwª™®®™®®™®®™®®™®®™®®wyyÿÿfff¾·¯fffÿÿ{˜˜™®®™®®™®®wwªwwªwwª™®®™®®™®®wyyÿÿfff¾·¯fffÿÿz™™ÊÊʰÀðÀðÀðÀðÀðÀðÀÃtŒv“®œš¶¤Š¤’tŒv›¯¯fffÿÿ—†…¢Žªœ›³¨¨µ¬«µ¬«¶¬«´ª©´ª©µ¬¬¶­­©••—†…ÿÿÿÿªªªÊÈÆÊÈÆÉÇÄÉÇĪªªÊÊÊÊÊÊËÊÉËÊÉÊÉÇÊÉÇÊÈÆÉÇĪªªÿÿŸ›™•Œ‰†‹†ƒ†}}y}xu‚}y•Œ‰†‹†ƒ†}‚}y}xuƒ~{ÿÿ›Š|ªšŠ¨˜ˆ¨˜ˆÊÊʲ§œ¦–…¤’¢|»´­ Œz¡z£z£z£zƒ}ÿÿt†yƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹ƒŸ‹{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•¢ª¨¼Á¨»Á™³½’¦­ÿÿÿÿÿÿÿÿÿÿz™™½Çǯ½Âz™™½ÇǽÇǽÇǽÇǽÇǽÇǽÇǽÇǽÇDZÃÄ›¯¯wyyÿÿÿÿ½¸ÊÉÇÊÉǾ·¯¾·¯·¯¥½´¦¸°¥ª¥¥«¦¤°§ÿÿÿÿÿÿ{˜˜ºÄÄ«¶¾«¶¾«¶¾«¶¾«¶¾«¶¾«¶¾™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ«¶¾wwª«¶¾«¶¾wwª«¶¾«¶¾™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ«¶¾«¶¾wwª«¶¾«¶¾«¶¾«¶¾™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄwwª«¶¾wwª«¶¾«¶¾«¶¾«¶¾™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ«¶¾«¶¾wwª«¶¾«¶¾«¶¾«¶¾™®®wyyÿÿfff¾·¯fffÿÿz™™z™™z™™z™™z™™z™™z™™z™™tŒvŽ©––±Ÿ–±Ÿš¶¤Š¤’tŒvfffÿÿ—†…©••ÊÊÊÆÅÅÆÅÅÆÅÅÆÅÅÆÅÅÆÅÅÆÅÅÆÅÅ©••—†…ÿÿÿÿªªªÊÉÇÁ¿½Á¿½Á¿½ªªªÊÊÊÊÊÊÊÊÊËÊÉËÊÉÆÅÅÆÆÆÆÆÆªªªÿÿ¢Ÿœ•ŒÆÃÁº·µ©¦¤›˜–{vrŸ›˜—‘ŽÆÃÁ¶³±©¦¤›˜–zv˜•“ÿÿ›Š|³§š®¡“­ŸÊÊʽ¸ªšŠ¨˜ˆ¤’ÊÊʺ²ª¡z£z£z£zƒ}ÿÿt†y†£†£†£†£†£†£†£†£†£†£†£†£{–‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡´ÃŨ»Áš´½š´½‰ƒ‡ÿÿÿÿÿÿÿÿz™™½ÇǰÀÃz™™›¯¯›¯¯›¯¯›¯¯›¯¯z™™z™™z™™z™™z™™z™™ÿÿÿÿÿÿÿÿ½¸¾·¯¾·¯¾·¯²«¢½´¤º±¢­§©®©«¯ª«°§ÿÿÿÿ{˜˜ºÄÄ­»À­»À­»À­»À­»À­»À­»À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­»Àwwªwwªwwª­»À­»À­»À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­»À­»À­»Àwwª­»À­»À­»À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜wwª­»À­»À­»Àwwª­»À­»À­»À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­»À­»Àwwª­»À­»À­»À­»À™®®wyyÿÿfff¾·¯fffÿÿÿÿz™™ÊÊʱÃıÃıÃıÃÄtŒvtŒvtŒvtŒv”°žŽ©–tŒvtŒvtŒvÿÿ—†…©••ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÆÅÅ©••—†…ÿÿÿÿªªªËÊÉËÊÉÊÉÇÊÈÆªªªÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ››››››››››››ÿÿÿÿ™•‘ÇÅÿ¼»´²°©§¦}xu}xu—‘ŽÇÅÿ¼»´²°©§¦†}ÿÿÿÿš‰{¸®¤¸®¢°¢•Àº´ÊÊÊžžÇÅÃÊÊÊÊÊÊ¿¹³£z£z£zƒ}ÿÿt†y‰¦‰¦‰¦‰¦‰¦‰¦‰¦‰¦‰¦‰¦{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•¢ª¨¼Á¨»Á™³½’¦­ÿÿÿÿÿÿÿÿz™™½ÇǯÁïÁÃz™™ÆÆÆ½ÇDZÃÄz™™wyy¯ÁÛ¯¯wyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²¨Ÿµ®¨¶¯¨´¬£¼²¢¸®¢®©«®©«¯ª®¯ª«°§ÿÿ{˜˜ºÄÄ­½À­½À­½À­½À­½À­½À­½À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­½Àwwª­½À­½Àwwª­½À­½À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­½À­½À­½À­½Àwwª­½À­½À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­½À­½À­½À­½Àwwª­½À­½À™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄÄ­½À­½Àwwª­½À­½À­½À­½À™®®wyyÿÿfff¾·¯fffÿÿÿÿz™™ÊÊʱÃıÃıÃıÃıÃıÃıÃÄtŒv’¯›‡¡tŒv›¯¯fffÿÿ—†…©••ÆÅž½½¾½½¾½½¾½½¾½½¾½½¾½½ÆÅÅ©••—†…ÿÿÿÿªªªÊÊÊÁ¿½Á¿½Á¿½ªªªÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ›››ÊÊʨ¨¨ÿÿÿÿÿÿ¥¢Ÿ•ŒŒ†ƒ†}zv{vr‚}y•ŒŒ†ƒ†}zv{vrŸœšÿÿÿÿš‰{¸®¢Àº´¸®¢µªŸ¼´¬Á¼¶¿¹³Ã¿»ÊÊÊÊÊʽ¶°£z£z£z‚}ÿÿt†y‹ª“‹ª“‹ª“‹ª“‹ª“‹ª“‹ª“‹ª“{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡´ÃŨ¼Á™³½š´½‰ƒ‡ÿÿÿÿÿÿz™™½ÇǯÁïÁïÁÃz™™z™™z™™wyy¯ÁïÁÛ¯¯wyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©¡™¼²¢¼²¢¸®¢´¬£¯ª®³­°¾·¯¾·¯°§ÿÿ{˜˜ºÄĺÄĺÄĺÄĺÄĺÄĺÄÄ®ÀÀ™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄĺÄÄwwªwwªwwªºÄĺÄÄ®ÀÀ™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄĺÄĺÄÄwwªwwªwwªºÄÄ®ÀÀ™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄĺÄĺÄĺÄĺÄĺÄÄwwª®ÀÀ™®®wyyÿÿfff¾·¯fffÿÿ{˜˜ºÄĺÄĺÄÄwwªºÄĺÄĺÄÄ®ÀÀ™®®wyyÿÿfff¾·¯fffÿÿÿÿz™™ÊÊʱÃıÃıÃıÃıÃÄÊÊÊz™™tŒv‹ª“tŒvz™™z™™ÿÿÿÿ—†…©••ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÆÅÅ©••—†…ÿÿÿÿªªªÊÊÊÊÊÊËÊÉËÊɱ±±ªªªªªªªªªªªªªªª›››¨¨¨ÿÿÿÿÿÿÿÿÿÿ›–“º·µ©¦¤›˜–{vrÿÿ™•‘º·µ©¦¤›˜–zvÿÿÿÿÿÿÿÿŽÂ½¸Â½¸º±§µªŸ²¥˜­ŸªšŠÊÊʺ²©£z£z£zƒ}ÿÿÿÿt†y«•«•«•«•«•«•{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•¢ª¨¼Á¨¼Á½¾¼fffÿÿÿÿÿÿz™™½ÇǽÇǽÇǽÇǽÇǽÇǽÇǽÇǽÇDZÃÄ›¯¯wyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©¡™º±¢µ­¡µ­¡³­°³­°¾·¯¾·¯¹°§ÿÿ{˜˜™®®™®®™®®™®®{˜˜{˜˜{˜˜{˜˜{˜˜ÿÿÿÿfff¾·¯fffÿÿ{˜˜™®®™®®™®®™®®{˜˜{˜˜{˜˜{˜˜{˜˜ÿÿÿÿfff¾·¯fffÿÿ{˜˜™®®™®®™®®™®®{˜˜{˜˜{˜˜{˜˜{˜˜ÿÿÿÿfff¾·¯fffÿÿ{˜˜™®®™®®™®®™®®{˜˜{˜˜{˜˜{˜˜{˜˜ÿÿÿÿfff¾·¯fffÿÿ{˜˜™®®™®®™®®™®®{˜˜{˜˜{˜˜{˜˜{˜˜ÿÿÿÿfff¾·¯fffÿÿÿÿÿÿz™™ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊz™™tŒv‚žˆ‚žˆtŒvÿÿÿÿÿÿÿÿ—†…©••ÆÅž½½¾½½¾½½¾½½¾½½¾½½¾½½ÆÅÅ©••—†…ÿÿÿÿªªªÊÊÊÊÊÊËÊÉËÊÉËÊÉÆÅÅÂÀÀ½»»ªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿª¦¤Œ†ƒ†}}y†}ÿÿ¤Ÿ™•‘Œ†ƒ}y†}ÿÿÿÿÿÿÿÿš‰{¹¯¤ÆÂ¿Ã¿»º±§²¥˜®ŸªšŠº²©¦”¤}£z¡zŽ}ÿÿÿÿt†y®–®–®–®–{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡•¢ª½¾¼‘‘¡fff‰ƒ‡ÿÿÿÿz™™›¯¯›¯¯›¯¯›¯¯›¯¯z™™z™™z™™z™™z™™z™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©¡™±©ž²«¢·±³³­¬¾·¯¸®¤ÿÿÿÿÿÿ{˜˜ÄÄÄ®ÀÀ{˜˜ÿÿfffffffffffffffffffff¾·¯fffÿÿÿÿ{˜˜ÄÄÄ®ÀÀ{˜˜ÿÿfffffffffffffffffffff¾·¯fffÿÿÿÿ{˜˜ÄÄÄ®ÀÀ{˜˜ÿÿfffffffffffffffffffff¾·¯fffÿÿÿÿ{˜˜ÄÄÄ®ÀÀ{˜˜ÿÿfffffffffffffffffffff¾·¯fffÿÿÿÿ{˜˜ÄÄÄ®ÀÀ{˜˜ÿÿfffffffffffffffffffff¾·¯fffÿÿÿÿÿÿÿÿz™™z™™z™™z™™z™™ÿÿtŒvœƒtŒvÿÿÿÿÿÿÿÿÿÿ—†…©••ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÆÅÅ©••—†…ÿÿÿÿªªªÊÊÊÊÊÊÊÊÊËÊÉÊÊʪªªªªªªªªªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—‘޾»º{vrÿÿÿÿÿÿ—‘޾»º{vrÿÿÿÿÿÿÿÿÿÿÿÿš‰{º°¦ÄÀ¼ÆÂ¿Àº´º±§µªŸ³§š®Ÿ¦”¡z“…|ÿÿÿÿÿÿt†y°˜°˜{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡€€‹‘‘¡ˆˆfffÿÿÿÿÿÿz™™ÆÆÆ½ÇDZÃÄz™™wyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©¡™±©ž³­¬¼´¬¸®¤ÿÿÿÿÿÿÿÿÿÿ{˜˜{˜˜ÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿ{˜˜{˜˜ÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿ{˜˜{˜˜ÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿ{˜˜{˜˜ÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿ{˜˜{˜˜ÿÿÿÿfff¾·¯¾·¯¾·¯¾·¯¾·¯¾·¯fffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtŒvtŒvtŒvtŒvÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—†…¼²²¼²²¼²²¼²²¼²²¼²²¼²²¼²²¼²²—†…ÿÿÿÿÿÿªªªÊÊÊÊÊÊÊÊÊÊÊÊÊÊʪªªÊÊʪªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤Ÿ™•‘Œ†ƒÿÿÿÿÿÿª¦¤™•‘Œ†ƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿš‰{Ÿƒº±§¾·¯¾·¯º±§³§š©˜ˆŒ~‘ƒ|ÿÿÿÿÿÿÿÿt†y{–‚t†yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡ˆˆˆˆ€€‹fffÿÿÿÿÿÿÿÿz™™z™™z™™wyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©¡™¼´¬¸®¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtŒvtŒvtŒvtŒvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ªªªªªªªªªªªªªªªªªªªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›Š|Œ~žŽ€žŽ€Œ~–‡|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ƒ‡ffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/toolbar16h24.bmp000077500000000000000000000110661477201124000206070ustar00rootroot00000000000000BM66(àS S  #(%3: 00>9)dguxO'T%_!g"k+q+m1]d4o9z?L5B$WorAFJHr@R-X[9]S:bYEkbDeiIhbRuoSqo^~tZzt`}‹ ”%£%¬&¯*ª(²,¬4 ¶0¸2±4 ¸4®9“,!˜3(³>"·A¶J%·P-½S.¿[5ÄS(Ã[4E‘G— KœU«#^°%_­+c³)b»,e½0gµ3iº1hº;nÇ4j¬Oz¸BsŸop¤rnÃeBÆiFÊkEÀdLÆkNÉpNÉoQÍwVÇs]Êu\Çz^Ï|\€= 9ˆE–K¥G¤S°Y¼aÉfØlÁp×{är¼„u¿ˆy·lÓƒcÀuÅŽ{Ø•uß§uè®vì°uñ¶x²%(²s˜yœÄÍËÄuE1ŽŽŽŽ e ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ}}ŽŽŽŽ€€€ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽWÊ»ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽµ±±±±±°±ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ01=11ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽnsis-3.11/Contrib/Makensisw/toolbar16n24.bmp000077500000000000000000000110661477201124000206150ustar00rootroot00000000000000BM66(àC C >'#'(('22(22D.I3O8#Q8&T:)}?'k)ZC/YE9@&fM=99m]>U>WpEFKfSEkP@rVEyXGcVwpoŠ ""’)*“00HšMœP«V»]©U¬X°\±`A%‰E!—C?¯b!³g(Â]À_ÅaÊeÄh ËhÃkÎrÆpÉrÇo"Çs Êx%Ì},Ò}+­EE²JJ¶US†k[€l`‹sc„tiwf•~o‹}sÂ]]ÅbbËefÆiiÌmlÐeeÖhhËrqÂ{x …Š3’8œ<!µ8 ¤D&®J+¸F,¸Q6ºT<¼]2ÁW8Ë^=Ôd@ÂeFÍm@ÙhNÝyRÙEálHæpу4˜‚v•†|˜…z»“lÕCÙDÓŒLדM×’PÚ˜TÖ•[Ø–ZÖš\Ý\çœRÞ¡bÛ£jΡsФwÑ©tÔ¦xÕª|ݳwãªqæµzîÀxóÂsõÆyCC®^_®ÿÿÿ••™™o•ºVá„Xâˆaì•XœÃE¨ÏA«ÑÀà_ÄÄaÉÉLÎÿPÒÿ~áÿ„„„‚¢¤”‰®Ÿ•°Ÿ”¹œ“´™š­¡œ¼ªž·¤¹Ÿ­¤¤¤©©©½¢·»»»ÓœÒ­„Ö°†Ù°‚߸†×³ŒÖ Ÿ×³“Û¶”ع–洂鷂弆빆㺋黋缑徘Á« À¤©Ë®©×§¥Ø¦¥×©§Ø««Àµ¬ÅªºÈ½³Ñµ½æ¸¸öÈ€óÉ‹êÞÎÀµæÃ êȦêË©ðÊ¥íϲîÑ´ðÒ³ðÖ»òÙ¾•Ìò•Ýò˜ÑùœÛÿ€âÿ•äòšâüšëü•òò˜òù›øý§õüÍÊÍÚÉÀÔÐÒÜÔÔ×ÞÖÜÙØâÕÏðÙÁóßÊâÖÐëÛÔãÝßôàÌëàÔèàßõåÔøçÕýéÓõçÝýíÛÙßàÞáãÄòòÉùùáãåìääáæèêëë÷ìåñîíýñãýõëÿøïðððýùôûûú…………………………………………………………………………………………………¢¢¢¢¢¢¢¢¢¢…………………………………………………………)))))…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………++œœœœœœœ+……………………¢úúïïïííí¢……………………………………………………))111111))………… ………………………………………………………………………‡‘‘‘‘‘‘‘‘‘‘‘……………ÈÉ……………………………………………………………………………………………………………………………………………………‡‡‡‡‡‡‡‡‡‡‡‡…+MHçöôðÜ=+…………………¢û®ª§§{{í¢…–………h………!0111111110)……… QS …………………………………………………………………………‡óÒÒÒÒÒÒÒÒÒ‘…………ÈüüÏ……………………………………………………………………………………………………………………………………………………………………………………………………………………‡ÿÓÓÓÓÓÓÓÓ‘‡…+LGêôöñÜ=+…………………¢ûûúúúïïí¢…B·—A………ž—A……!010000111110)…… RRRS ……………………………………ˆ……………………………‡óÖÖÖÖÖÖÖÖÖ‘………ÈüüüüÏ……………………………………tt………………………tt………………………tt………………………tt………………………tt………‡ÿÖÖÖÖÖÖÖÖÖ‘‡…+LGõçööÞ=+……¢¢¢¢¢¢ü®ª§§{{BæÝ™F………îÝ™F……$00.8lpql<111)…… SSSSSS ………………………………ˆ……………………‡ó××××××××ב……ÈüüüüüÊx………………………………ÊÊÊÊÊÊÊ…………………ÊÊÊÊÊÊÊ…………………ÊÊÊÊÊÊÊ…………………ÊÊÊÊÊÊÊ…………………ÊÊÊÊÊÊÊ……‡ÿÖÖÖÖÖÖÖÖP‡‡…+LGõõççññÞ>+……¢úúïï¢þþüûûúúBîÆ™F………îÆ™F…%322rÿÿÿÿèn1111… UUUUUUUS …………………………’Ž………………‡‘‘‡óÙÙÙÙÙÙÙÙÙ‘…ÈüüüüüÊŪx………………t……t……t……t……t…‡ÿ××××××××PZP‘‘…+IHINNJHKIGI+……¢ûééé¢þ®ª§§{{ú¢…Eøå¾………øåÀ…#577ÿä;94/.1111)… VVVVVVVVVS ……………………ÛÔ’Ž……………‡óÒ‡óÙÙÙÙÙÙÙÙÙ‘…ÉüüüüÊųěw…………†…Ê…†„„„…Ê…†„„„…Ê…†„…Ê…†„„„…Ê…‡ÿ×××××××Pb‹^P‘…+?O¥ºº»««¼½I+……¢ûûúú¢ÿÿþþüüûú¢…h    …&e;;ÿv:62Ç.0111)… XXXXXXXXXXXS …………………ŒÔ”’……………‡óÖ‡óóóóóóóóóÚ‘……ÏüüÊʩñœ›w………†òÐÐÐÐÐÐÐ…t…†òЄÐЄÐÐ…t…†òÐЄÐÐÐÐ…t…†ò„ЄÐÐÐÐ…t…†òÐЄÐÐÐÐ…t…‡‡‡‡‡‡‡‡P_ŠŠ‹^P…+IÿùùùùùùùùI+……¢üééé¢ÿÿÿþþùýý¢…–îÝ™Ff@îÆ™FC…&umjÿãe;6ÿ¶0111)… [[[[[[[[[[[[S…………………Û”““…………‡óׇ‘‘‘‘‘‡‡‡‡‡‡…………ÏÊÊʦŸ ¸w……†òÑÑÑÑÑÑÑ…Ê…†òÑ„„„ÑÑÑ…Ê…†òÑÑÑ„ÑÑÑ…Ê…†„ÑÑÑ„ÑÑÑ…Ê…†òÑÑ„ÑÑÑÑ…Ê……‡ÿÚÚÚÚPPPP‰_PPP…+IÿÿÿÿÿÿÿÿùI+……¢þþüû¢ÿÿÿÿÿ••••……BøåÀ@øåÀ ……%¯~oÌÿëëøÿÿË111)… \\\\\\\\\\S ………………………ŒÔ”’…………‡óÙÙ‡ýóÚ‡Ù‘…………………z¬­¨€~  £¸w…†òÕÕÕÕÕÕÕ…t…†òÕ„ÕÕ„ÕÕ…t…†òÕÕÕÕ„ÕÕ…t…†òÕÕÕÕ„ÕÕ…t…†òÕÕ„ÕÕÕÕ…t……‡ÿÚÚÚÚÚÚÚPaYP‘…+IùáááááááùI+……¢ÿééé¢ÿÿÿÿÿ•ÿ¡………˜   g……#~Í~}ÅÎËäÿÿÈ111… ]]]]]]]]S ……………………………ÛÔ’“………‡óÙÙÙ‡‡‡ÙÙ‘……………………i€€~¨£¿ÊÊw…†òòòòòòòØ…Ê…†òò„„„òòØ…Ê…†òòò„„„òØ…Ê…†òòòòòò„Ø…Ê…†òòò„òòòØ…Ê……‡ÿÚÚÚÚÚÿ‡P]P‡‡……+IÿÿÿÿÿÿÿÿùI+……¢ÿÿþþ¤¢¢¢¢¢•¡……………DÝ™F…BÝ™F…………,ÏÏ´}sjeÿµ111)…… ``````S ……………………………………ŒÔÔà………‡óóóóóóóóóÚ‘………………………i||¿¿Êʳ…††††††……t…††††††……t…††††††……t…††††††……t…††††††……t………‡ÿÿÿÿÿ‡PWWP…………+IùáááááááùI+……¢ÿÿþþþùêߢ……………………š  …—B …………#°ìä´skeµ5310 …… ccccS …………………………………………Œàƒ……‡‘‘‘‘‘‡‡‡‡‡‡……………………………iy¦Á¹Ê¯………†÷؆…Ê……†÷؆…Ê……†÷؆…Ê……†÷؆…Ê……†÷؆…Ê…………‡‡‡‡‡…PTP……………+IÿÿÿÿÿÿÿÿùI+……¢ÿÿÿþÿ¢¢¢¢………………………@â………@â………………#²èìÍ´}uk50 ……… ddS …………………………………………………ƒ‚………‡ýóÚ‡……………………………………………iy¹Å¯……………††……ÊÊÊÊÊÊ…………††……ÊÊÊÊÊÊ…………††……ÊÊÊÊÊÊ…………††……ÊÊÊÊÊÊ…………††……ÊÊÊÊÊÊ………………………PPPP…………………+ÂÂÂÂÂÂÂÂÂ+………¢ÿÿÿÿÿ¢ÿ¢…………………………—B………šB…………………#-´ÊÊ´u<'*………… S ………………………………………………………‚‚…………‡‡‡…………………………………………………iů……………………………………………………………………………………………………………………………………………………………PPPP……………………………………………………………¤¢¢¢¢¢¢¢……………………………………………………………………………&'(('"……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………nsis-3.11/Contrib/Makensisw/toolbar24d24.bmp000077500000000000000000000572661477201124000206160ustar00rootroot00000000000000BM¶^6(P€^C C ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœššš™™™———–––•••“““’’’‘‘‘ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAACCCCCCBBBBBBCCCBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿººººººÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB¿¿¿ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿBBBBBBBBB¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨>>>BBBBBBBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýý÷÷÷÷÷÷ööööööõõõõõõõõõõõõõõõôôôýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAABBBYYYYYYYYYYYYYYYYYYYYYCCCAAAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVVDVV ÿÿÿÿÿÿvvv      ”””áááááá_________áááááááááÜÜÜÌÌÌÌÌÌWWWwwwwwwBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ýýýøøø¯¯¯¬¬¬ªªª¢¢¢™™™“““õõõýýýÿÿÿÿÿÿiii  iiiÿÿÿÿÿÿÿÿiii  dddÿÿÿÿÿÿÿÿÿÿÿÿÿÿCCC`]Zc_ZiaXocXodZocXocXocXpdYocXlcYibZYYYBBBÿÿÿÿÿÿÿÿÿÿÿÿ>>>CCC>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAA%%%AAAAAAAAAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ---------------------------------ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñòñðÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿBBBÿÿÿÿÿÿDVV°¸ÀÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒ›››ÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒDVV ÿÿÿÿÿÿvvv      ”””áááááá_________áááááááááÜÜÜÌÌÌÌÌÌWWWwwwwwwBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ýýýøøø÷÷÷÷÷÷÷÷÷öööööööööõõõõõõõõõýýýÿÿÿÿÿÿddd¡¡¡ÄÄĦ¦¦MMM555,,, ÿÿÿÿÿÿÿÿddd¡¡¡¦¦¦}}}555,,,((( ÿÿÿÿÿÿÿÿÿÿÿÿFFFZZZhaWjaWlbWpdYpdYncWncWncWqeZocXocXqeZjc[ZZZBBBÿÿÿÿÿÿÿÿÿÿ>>>PPPPPPPPP>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%%%kkkOOOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWW˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñóòñóòñòñð¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBB¿¿¿BBBÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜ÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒ›››ÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒEWW ÿÿÿÿÿÿ˜˜˜˜˜˜”””áááááá_________áááååååååáááÌÌÌÌÌÌWWWwwwwwwBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ýýýøøø¯¯¯¬¬¬ªªª¢¢¢™™™’’’õõõýýýÿÿÿÿÿÿddd¡¡¡ÄÄĦ¦¦DDD777,,, ÿÿÿÿÿÿÿÿ]]]¡¡¡¦¦¦}}}777,,,((( ÿÿÿÿÿÿÿÿÿÿGGGZZZe_XlbWlcYlcYncWmcZmcZmcZmcZocXqeZqeZocXpe[lcYZZZÿÿÿÿÿÿÿÿÿÿ>>>TTTTTTTTTTTTPPP>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿOOO”””xxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒÆÌÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñóòñóòñóòñóòñÃÃ㣣ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDVVµ¶·ÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒ›››’’’¤¤¤¦¦¦ÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒ˜˜˜ ÿÿÿÿÿÿvvvœœœœœœåååååå_________ÜÜÜáááááááááÌÌÌÌÌÌWWWwwwwwwBBBÿÿÿÿÿÿÿÿœœœµµµ´´´³³³²²²²²²±±±¤¤¤ýýýùùù÷÷÷÷÷÷÷÷÷öööööööööõõõõõõõõõýýý’’’ÿÿÿÿÿÿdddÒÒÒãããÖÖÖ}}}VVV??? ÿÿÿÿÿÿÿÿ]]]ÏÏÏÖÖÖ¡¡¡YYY===999 ÿÿÿÿÿÿÿÿÿÿe_XjaWi`VlcYlcY‚‚‚äääéééðððíííëëëéééííí¼¼¼pdYocXocXlcYBBBÿÿÿÿÿÿÿÿ>>>[[[[[[[[[[[[[[[[[[RRR>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””ÄÄĺººxxxNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñóòñóòñóòñóòñáááÌÌÌÌÌÌ£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿDVVÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒ›››‚‚‚¨¨¨µµµ§§§žžž›››ÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒEWW ÿÿÿÿÿÿvvvœœœœœœåååååå_________ÜÜÜáááááááááÌÌÌÌÌÌWWWwwwwwwBBBÿÿÿÿÿÿÿÿœœœýýýýýýýýýýýýýýýýýý¥¥¥ýýýùùù¯¯¯­­­ªªª¡¡¡™™™’’’öööýýý“““ÿÿÿÿÿÿdddÒÒÒãããÖÖÖ}}}QQQAAAÿÿÿÿÿÿÿÿdddÒÒÒÖÖÖ®®®YYY???999 ÿÿÿÿÿÿÿÿGGGibZkbXiaXkc\¨¨¨ííííííðððóóóíííííííííóóóÆÆÆpdYocXocXodZYYYCCCÿÿÿÿÿÿ>>>^^^^^^^^^^^^^^^^^^^^^^^^RRR>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””½ÂÆÍÔÙ½ÂÆ‰‰‰NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ------EWWâèèÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñóòñóòñóòñóòñáááÖÖÖÌÌÌÄÄħ§§   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ˜˜˜ÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒƒƒƒ£££®®®²²²µµµ±±±ƒƒƒ›››ÆÎÒÆÎÒÆÎÒÆÎÒ:JJ ÿÿÿÿÿÿvvv˜˜˜˜˜˜ééééééåååááááááÜÜÜÜÜÜÜÜÜáááÔÔÔÔÔÔ___BBBÿÿÿÿÿÿÿÿýýýýýýýýýýýýýýýýýý¦¦¦ýýýúúúùùùùùùøøø÷÷÷÷÷÷÷÷÷öööööööööýýý”””ÿÿÿÿÿÿdddÏÏÏåååÖÖÖ}}}YYY??? ÿÿÿÿÿÿÿÿ]]]ÏÏÏÖÖÖ®®®VVV???999 ÿÿÿÿÿÿÿÿHHHjeakf`id`¤¤¤îîîíííêêêÊÊÊÀÀÀ¼¼¼¼¼¼ÀÀÀÆÆÆ«««ocXqeZqeZodZc`]CCCÿÿÿÿÿÿ>>>bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÏÔÕÉÉÉ–––ˆˆˆNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWW˜˜˜˜˜˜EWWâèèÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñóòñóòñóòñóòñáááÖÖÖÌÌÌÄÄħ§§¯¯¯£££   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿDVVÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒ›››«««………ÆÏÒÆÏÒÆÏÒÆÏÒÆÏÒ˜˜˜EWW ÿÿÿÿÿÿvvv˜˜˜˜˜˜”””””””””         ˜˜˜””””””˜˜˜”””””””””˜˜˜˜˜˜BBBÿÿÿÿÿÿÿÿ   ýýýýýýæææáááÞÞÞÚÚÚ¨¨¨ýýýúúú¯¯¯­­­ªªª¢¢¢™™™’’’÷÷÷ýýý–––ÿÿÿÿÿÿdddÒÒÒãããÖÖÖ}}}VVV???ÿÿÿÿÿÿÿÿ]]]ÒÒÒÖÖÖ®®®VVV???999 ÿÿÿÿÿÿIII```lllkkkkkkíííííí×××hhhjjjjjjjjjjjjjhfle_md\mcZqeZrf[ocXjc[ZZZBBBÿÿÿÿ>>>iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓ·ÃÆ—¨¯ˆˆˆNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèÆÌÒEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿ¹¹¹áááóòñóòñóòñóòñóòñáááÌÌÌÌÌÌÄÄͶ¶ÀÀÀ¾¾¾¥¥¥§§§   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿDVVÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒ›››¦¦¦†††›››ÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒEWWEWW ÿÿÿÿÿÿvvvŽŽŽŽŽŽŽŽŽ”””””””””ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽBBBÿÿÿÿÿÿÿÿ¡¡¡ýýýýýýýýýýýýýýýýýý©©©ýýýûûûúúúùùùùùùùùùùùùøøøøøøøøø÷÷÷ýýý———ÿÿÿÿÿÿdddÒÒÒãããÖÖÖ}}}YYY??? $$$000555$$$dddÒÒÒÖÖÖ®®®YYY???999 ÿÿÿÿÿÿJJJbbbpppooooooíííðððµµµmmmlllkkkjjjjjjjjjkfbme^nd[qeZqeZocXibZZZZCCCÿÿÿÿ>>>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓ·ÃÆšª°‰‰‰NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèÆÎÒEWWâèèâèèâèèâèèâèèâèèâèèâèèâè蘘˜---ÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃáááóòñóòñóòñáááÖÖÖÌÌÌÌÌ̧§§¿¿¿¿¿¿»»»¥¥¥¥¥¥§§§   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ---------------------------------------ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ---------------------------------------ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ---------------------------------------ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ---------------------------------------ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ---------------------------------------ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿ˜˜˜ÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒ‡‡‡œœœ‡‡‡ÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒ:JJEWW ÿÿÿÿÿÿvvv††††††”””         ¢¢¢¢¢¢¢¢¢         ¢¢¢¢¢¢¢¢¢BBBÿÿÿÿÿÿÿÿ¢¢¢ýýýýýýæææàààÝÝÝÚÚÚªªªýýýûûû¯¯¯­­­ªªª¢¢¢™™™’’’÷÷÷ýýý˜˜˜ÿÿÿÿÿÿdddêêêýýýêêê³³³ššš‚‚‚ (((999999(((dddêêêêêêÖÖÖššš‚‚‚uuuÿÿÿÿÿÿLLLdddyyywwwtttóóóðððpppooonnnlllkkkŽŽŽssslgcme^odZocXqeZjc[YYYCCCÿÿÿÿ>>>qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓ·ÃÆšª°‹‹‹NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ------EWWâèèÆÏÒÆÏÒ8<<˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜EWWEWWEWWEWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃáááóòñáááÖÖÖÌÌÌÌÌÌÌÌ̲²²ººº»»»µµµ¥¥¥¦¦¦¦¦¦      ÿÿÿÿÿÿÿÿÿÿEWW˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWW˜˜˜˜˜˜˜˜˜˜˜˜>>>>>>>>>>>>˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWW˜˜˜˜˜˜????????????????????????˜˜˜˜˜˜˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWW˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWW˜˜˜˜˜˜˜˜˜˜˜˜oooooooo???˜˜˜˜˜˜˜˜˜˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿDVVÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ›››ˆˆˆˆˆˆˆˆˆ›››ÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜EWW ÿÿÿÿÿÿvvvœœœ´´´õõõöööööö÷÷÷÷÷÷÷÷÷ùùùùùùúúúúúúúúúûûûééé   ”””BBBÿÿÿÿÿÿÿÿ¤¤¤ýýýýýýýýýýýýýýýýýý¬¬¬ýýýüüüüüüûûûûûûûûûúúúùùùóóóààà×××óóóšššÿÿÿÿÿÿÿÿÿÿ]]]¡¡¡ãããÙÙÙÄÄÄ‚‚‚dddMMM}}}ÆÆÆÞÞÞšššpppVVV???ÿÿÿÿÿÿÿÿÿÿOOOlll‹‹‹‡‡‡ðððíííÊÊÊyyywwwuuuqqqqqq•••ðððµµµwwwne]odZpdYgb\YYYCCCÿÿÿÿ>>>yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\\\>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓ·ÃÆ­³‹‹‹NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWW˜˜˜˜˜˜EWWâèèÆÐÒÆÐÒÆÐÒEWWEWWEWWEWW8<<˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““ÃÃÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ«««¶¶¶³³³²²²©©©©©©«««±±±§§§   ÿÿÿÿÿÿÿÿEWWâèèÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒ¤Ôö˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÍÒÆÍÒÆÍÒoooooooo>>>ÆÍÒÆÍÒÆÍÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÍÒ???oooooooooooo???ÆÍÒÆÍÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÍÒÆÍÒÆÍÒ???oo???ÆÍÒÆÍÒÆÍÒÆÍÒÆÍÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÍÒÆÍÒÆÍÒoo????????????ÆÍÒÆÍÒÆÍÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿDVVÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ›››ˆˆˆˆˆˆˆˆˆ›››ÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜EWW ÿÿÿÿÿÿvvvœœœ´´´ååååååååååååååååååååååååååååååååååååÞÞÞ   ”””BBBÿÿÿÿÿÿÿÿ¥¥¥ýýýýýýåååàààÝÝÝÚÚÚ¬¬¬ýýýüüü¯¯¯­­­ªªª¢¢¢úúúÀÀÀ¢¢¢›››µµµ›››ÿÿÿÿÿÿÿÿÿÿdddšššãããÙÙÙÄÄÄ‚‚‚dddMMM}}}ÆÆÆÞÞÞšššpppQQQ??? ÿÿÿÿÿÿÿÿÿÿQQQppp˜˜˜”””’’’éééíííííí‘‘‘zzz{{{vvvuuu˜˜˜óóóððð°°°mf`oe\ocXfa[YYYCCCÿÿÿÿ>>>}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}\\\>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓ¶ÂÆž¯´NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèÆÌÒEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““ÌÌÌÌÌÌÌÌÌÌÌÌÊÊʱ±±³³³³³³±±±©©©«««­­­±±±±±±§§§   ÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒoo>>>ÆÎÒoo>>>ÆÎÒÆÎÒÆÎÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒ???oo???ÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒ???oo???oo???ÆÎÒÆÎÒÆÎÒÆÎÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒoo???ÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒÆÎÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿDVVÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜EWW ÿÿÿÿÿÿvvvœœœ´´´õõõõõõööö÷÷÷÷÷÷øøøøøøøøøùùùúúúúúúúúúééé   ”””BBBÿÿÿÿÿÿÿÿ¦¦¦ýýýýýýýýýýýýýýýýýý­­­ýýýüüüüüüûûûûûûûûûúúúúúú«««ÿÿÿúúú‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿ]]]¡¡¡ãããÙÙÙ¿¿¿†††dddMMMuuuÏÏÏÙÙÙ¡¡¡pppQQQ??? ÿÿÿÿÿÿÿÿÿÿRRRuuu¨¨¨¥¥¥³³³íííððððððÑÑÑÀÀÀÆÆÆÆÆÆœœœððððððííí{{{oe\odZfa[YYYCCCÿÿÿÿ>>>\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÌÓÔ¶ÂÆŸ°µNNNÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèÆÎÒEWWâèèâèèâèèâèèâèèâèèâèèâèèâè蘘˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥´´´´´´···®®®©©©°°°°°°°°°«««¬¬¬¬¬¬±±±±±±±±±      ÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒÆÎÒ¤ÛöÆÎÒÆÎÒÆÎÒÆÎÒ¤ÛöÆÎÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒoooooo```ÆÎÒÆÎÒ¤ÛöÆÎÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒ???oo???ÆÎÒÆÎÒÆÎÒ¤ÛöÆÎÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒ???oo???ÆÍÒ???oo???ÆÎÒ¤ÛöÆÎÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÎÒÆÎÒÆÎÒoo???ÆÎÒÆÎÒÆÎÒÆÎÒ¤ÛöÆÎÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿDVVDVVEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWEWWÆÏÒÆÏÒEWW ÿÿÿÿÿÿvvv˜˜˜²²²õõõõõõõõõööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúééé   ”””BBBÿÿÿÿÿÿÿÿ¨¨¨ýýýýýýæææàààÞÞÞÛÛÛ®®®ýýýüüüüüüüüüüüüûûûûûûûûû®®®ÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]]]ÍÍÍöööêêêããã³³³¦¦¦ÍÍÍãããòòòÍÍÍ«««‚‚‚ ÿÿÿÿÿÿÿÿÿÿQQQuuu¼¼¼»»»²²²«««‹‹‹«««ëëëíííðððóóóððððððððððððóóó±±±–––odZc`\YYYBBBÿÿÿÿ>>>ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓ·ÃÆ¶¶¶aaaNNNÿÿÿÿÿÿÿÿÿÿEWWâèèÆÏÒÆÏÒ8<<˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜EWWEWWEWWEWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““““““³³³³³³±±±­­­¨¨¨­­­±±±°°°µµµÊÊÊÉÉÉÌÌÌÌÌ̦¦¦•••ÿÿEWWâèèÆÑÒÆÑÒ¤ïöÆÑÒÆÑÒÆÑÒ¤ïöÆÑÒÆÑÒÆÑÒ¤ïö˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒ¤ïöoooooo```ÆÑÒÆÑÒÆÑÒ¤ïö˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒ¤ïöÆÑÒ???oo???ÆÑÒÆÑÒÆÑÒ¤ïö˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèè???oo???ÆÑÒÆÑÒÆÑÒ???oo???ÆÑÒ¤ïö˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒ¤ïöoo???ÆÑÒ¤ïöÆÑÒÆÑÒÆÑÒ¤ïö˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿDVVýýýÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒÆÐÒEWW ÿÿÿÿÿÿ˜˜˜²²²ååååååååååååååååååååååååååååååååååååÞÞÞ   ”””BBBÿÿÿÿÿÿÿÿ©©©ýýýýýýýýýýýýýýýýýý®®®ýýýýýýýýýýýýýýýýýýýýýýýýÏÏϬ¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‚‚]]]MMMAAA===000,,,&&&???QQQdddAAA777000&&&gggÿÿÿÿÿÿÿÿÿÿÿÿWWWÀÀÀÅÅŽ½½³³³¯¯¯–––¢¢¢±±±ÀÀÀÀÀÀ¼¼¼­­­ðððóóóððð›››pe[odZ```CCCÿÿÿÿÿÿ>>>‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNÍÒÓÎÎÎSSSÀÀÀuuuÿÿÿÿÿÿÿÿEWWâèèÆÐÒÆÐÒÆÐÒEWWEWWEWWEWW8<<˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““©©©³³³±±±¨¨¨¨¨¨­­­±±±¶¶¶¹¹¹ÊÊÊÌÌÌÌÌÌÒÒÒ•••ÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒoo>>>ÆÑÒoo>>>ÆÑÒÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒ???????????????oo??????ÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ???oo???ÆÑÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒoo???ÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿDVVýýýÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒýýýýýýýýýýýýýýýýýý333ÿÿÿÿÿÿÿÿvvvœœœ´´´ôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúéé餤¤œœœBBBÿÿÿÿÿÿÿÿªªªýýýýýýæææàààÝÝÝìììÏÏÏ®®®®®®­­­¬¬¬¬¬¬ªªª©©©¨¨¨¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÖÖÖÄÄÄ‚‚‚ddd999MMMÏÏÏÞÞÞšššpppQQQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQQQ½½½ËËËÉÉɼ¼¼¶¶¶®®®¢¢¢›››•••ˆˆˆ„„„µµµóóóòòòÀÀÀnd[nd[mcZXXXBBBÿÿÿÿÿÿ>>>\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNFFFØØØ°°°SSSNNNÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““©©©°°°¨¨¨¨¨¨«««¶¶¶ººººººÌÌÌÌÌÌÌÌÌ”””ÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒoooooooo>>>ÆÑÒÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒ???oooooooooooo???ÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ???ÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿEWWâèèÆÑÒÆÑÒÆÑÒoo???ÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜ÿÿÿÿÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿDVVýýýÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜EWWEWWEWWEWWEWWEWWEWWÿÿÿÿÿÿÿÿÿÿ˜˜˜²²²ôôôõõõõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùùééé   ”””BBBÿÿÿÿÿÿÿÿ¬¬¬ýýýýýýýýýýýýýýýýýýýýýýýýóóó×××àààóóó———ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]]]dddVVV999333‡‡‡]]]ddd;;;000&&&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzzzÀÀÀÕÕÕÏÏÏÆÆÆ»»»¥¥¥›››’’’ˆˆˆ‡‡‡ÀÀÀÆÆÆ¬¬¬kkkne]mcZda]AAAÿÿÿÿÿÿÿÿ>>>’’’’’’’’’’’’’’’’’’\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNN°°°wwwwwwNNNÿÿÿÿÿÿEWWâèèâèèâèèâèèâèèâèèâèèâèèâè蘘˜---ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““““““¡¡¡¡¡¡ªªªÂÂÂÁÁÁ¹¹¹ÉÉÉÒÒÒ“““ÿÿÿÿÿÿÿÿEWWâèèâèèâèèâèèâè蘘˜EWWEWWEWWEWWEWWEWWEWWÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèâèèâèèâèè>>>>>>>>>>>>EWWEWWEWWEWWEWWÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèâèèâèèâèèâè蘘˜EWWEWWEWWEWWEWWEWWEWWÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèâèèâèèâèèâè蘘˜EWWEWWEWWEWWEWWEWWEWWÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿEWWâèèâèèâèèâèè??????EWWEWWEWWEWWEWWEWWEWWÿÿÿÿÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿDVVýýýÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒÆÑÒ˜˜˜EWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜²²²ååååååååååååååååååååååååååååååååååååÞÞÞ   ”””BBBÿÿÿÿÿÿÿÿ¬¬¬üüüüüüæææáááÝÝÝìììúúúýýýÀÀÀ¢¢¢›››µµµ›››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿddd¡¡¡000ÿÿÿÿdddÏÏÏ000ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXXX€€€ÆÆÆÖÖÖÏÏÏÃÃî®®¢¢¢———ŽŽŽÀÀÀ¸¸¸uuunnnle_hc]ZZZÿÿÿÿÿÿÿÿÿÿ>>>•••–––––––––\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNNNSSSNNNÿÿÿÿÿÿÿÿ8<<˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜EWWEWWEWWEWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““£££¡¡¡¨¨¨ÃÃúºº§§§ÒÒÒ“““ÿÿÿÿÿÿÿÿÿÿÿÿEWWâèèâèèÆÒÒÆÒÒEWWœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿEWWâèèâèèÆÒÒÆÒÒEWWœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿEWWâèèâèèÆÒÒÆÒÒEWWœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿEWWâèèâèèÆÒÒÆÒÒEWWœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿEWWâèèâèèÆÒÒÆÒÒEWWœœœÌÌÌœœœÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿDVVýýýýýýýýýýýýýýýýýýýýýýýýEWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvvvœœœ´´´ôôôôôôõõõõõõöööööö÷÷÷÷÷÷÷÷÷øøøøøøùùùèè褤¤œœœBBBÿÿÿÿÿÿÿÿ­­­üüüüüüüüüûûûûûûûûûúúúýýý«««ÿÿÿúúú‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]]]ÊÊÊ000ÿÿÿÿ]]]ÙÙÙ000ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVVÓÓÓØØØÒÒÒÀÀÀ¸¸¸«««¢¢¢¡¡¡žžž‹‹‹~~~rrredc[[[DDDÿÿÿÿÿÿÿÿÿÿ>>>•••–––\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAANNNÿÿÿÿÿÿÿÿÿÿÿÿEWWEWWEWWEWW8<<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““££££££ººº§§§ÄÄÄ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEWWEWWEWWEWWÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿEWWEWWEWWEWWÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿEWWEWWEWWEWWÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿEWWEWWEWWEWWÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿEWWEWWEWWEWWÿÿœœœœœœœœœœœœœœœœœœœœœœœœÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿDVVDVVDVVDVVDVVDVVDVVDVVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvvvœœœ´´´ôôôôôôõõõõõõõõõõõõöööööö÷÷÷øøøøøøøøøèè褤¤œœœBBBÿÿÿÿÿÿÿÿ®®®üüüüüüüüüüüüûûûûûûûûûýýý®®®ÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWWW{{{³³³¿¿¿½½½¶¶¶¬¬¬¤¤¤›››„„„xxxaaaEEEÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>>>\\\>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““’’’ÄÄÄÒÒÒ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffffffffffffffffffffffffffffffffffffffffffÿÿÿÿÿÿÿÿÿÿ®®®ýýýýýýýýýýýýýýýýýýýýýýýýÏÏϬ¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSSSYYY{{{{{{zzzwwwtttpppfffLLLHHHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>>>>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““¸¸¸“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏ®®®­­­­­­¬¬¬«««ªªª¨¨¨§§§¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTTTUUUWWWVVVRRRQQQKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/toolbar24h24.bmp000077500000000000000000000572661477201124000206220ustar00rootroot00000000000000BM¶^6(P€^3 3 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ••““›’’š˜—–‹‹”ŠŠ“‰‰’‡‡‡‡††……Ž……ŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ……Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@DDBCDBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ£™Õ£™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄCCCCCCCCCCCCCªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄCCCCCCCCCCCCCªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄCCCCCCCCCCCCCªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄCCCCCCCCCCCCCªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄCCCCCCCCCCCCCªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)#)#)#›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ))#)#)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––žÿÿÿõöÿõöÿôõýôôÿòôýòòýñôýòôüñòýñòüÿÿÿ……Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?D}~~~~~}F>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîÛ¯¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄªªÄÿÿÿÿÿÿuœuœuœuœuœuœuœuœuœuœuœuœuœuœuœuœuœuœuœuœÿÿÿÿÿÿ…IÇ7mÇ7m²,eÞÒãÞÒãn)n)n)ÒÞìÒÒìÒÒìÒÒã¼¼Ò¼¼Òc!CC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™¡ÿÿÿööÿÇ—Æ”ˆÆƒÄ„tÃ~kÂydÀnX¿kRòòüÿÿÿ‡‡ÿÿÿÿÿÿF/_  F/_ÿÿÿÿÿÿÿÿF/_ B+XÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ — Ÿ$¨(³,´,³,³,³,·,´,¯+¨%€Fÿÿÿÿÿÿÿÿÿÿÿÿ7)H-7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG#GGGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ33333333333ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ£—ñÙÕýñîýñîýðìÛ¯¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿCÿÿÿÿÿÿuœCŸÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿ¸çy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿuœÿÿÿÿÿÿ…IÇ7mÇ7m²,eÞÒãÞÒãn)n)n)ÒÞìÒÒìÒÒìÒÒã¼¼Ò¼¼Òc!CC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšš¢ÿÿÿöøÿõöÿõõÿõõÿôõýôôýôõýòôüòôýòòýÿÿÿ‡‡ÿÿÿÿÿÿB+X”~—纘! ?&ÿÿÿÿÿÿÿÿB+X”~—˜cNq&ÿÿÿÿÿÿÿÿÿÿÿÿS …¥)«)¯)¶+¶+²+°+²+¸+³,³,¸,®(„Dÿÿÿÿÿÿÿÿÿÿ7)e6e6e67)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#38rQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîýñîýñîýñîýðìÕ¡—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCªªÄCÿÿÿÿÿÿÿÿÿÿÿÿ0ºÐyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿŽºçyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyŸÿÿÿÿÿÿ•O¼,e¼,e²,eÞÒãÞÒãn)n)n)ÒÒìÞÞìÞÞìÒÒì¼¼Ò¼¼Òc!CC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ››£ÿÿÿöøÿÇ—Æ”ˆÆƒÄ„sÃ}kÀydÀoW¿kRñôýÿÿÿˆˆ‘ÿÿÿÿÿÿB+X”~—纘9+ÿÿÿÿÿÿÿÿ:M”~—˜cNq+ÿÿÿÿÿÿÿÿÿÿV †  $¯+¯)°'²+³,²)²,³,³,º,º,³,¸,¯)„ÿÿÿÿÿÿÿÿÿÿ7)k9k9k9k9e67)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ°;íèðíèðÓËØz36´4´4¶3 ¶3 ´1 ³,²)³+º,»,³,«'€Cÿÿÿÿ7)‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WˆñÿU×ÿ »ÿÖ$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîýñîýñîýñîýñîñÙÕô¼¨ô¼¨ä¯¢Ù¥òºŽî¶Ž y•°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞySô¼¨ÞySô¼¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞySô¼¨ÞySô¼¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞySô¼¨ÞySô¼¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞySô¼¨ÞySô¼¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞySô¼¨ÞySô¼¨ÿÿÿÿÿÿuœyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿÍç;Ó¶ ŽÍçyèÿyèÿyèÿyèÿyèÿyŸyŸÿÿÿÿÿÿ…I¬(a¬(a§(a§(a§(a¬3i¬3i¬3i§-e§(a§(a§-e§(a§(a§(a¬(a¬(a)#ÿÿÿÿÿÿÿÿšš¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ££ªÿÿÿúüÿúùÿùùÿùùÿùùÿøøÿøøÿööÿööÿõöÿÿÿÿ˜ÿÿÿÿÿÿB+X×ÀÉæÖáÚÄÐcNq1K 3"&B+X×ÀÉÚÄÐ¥£1K 3+ÿÿÿÿÿÿZ)´C³@³@íèðñíô¶œ¥´8´7³5´4´3 ¶3 ³-³+³+¸,º,´,ª(Fÿÿÿÿ7)˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WˆñÿU×ÿ ¼ÿÖ$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÛ¯¦ñÙÕýñîýñîýñîñÙÕöÊ»ô¼¨ô¼¨°…òºòºâ®™uš y•°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2222222222222ÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿÿÿ2222222222222ÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿÿÿ2222222222222ÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿÿÿ2222222222222ÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿÿÿ2222222222222ÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿ0ºÐyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿ£Ž-Ƨ£ŽyìÿyìÿyìÿyìÿyìÿyìÿY‡yŸÿÿÿÿÿÿ…IœYœY§8m²N}²N}²U}²Uƒ²Uƒ²Uƒ²N}²N}²N}²Uƒ²Uƒ²Zƒ¬(a¬(a)#ÿÿÿÿÿÿÿÿ››£ÿÿÿÿÿÿèßæåÙÝäÕØâÑÒ¤¤«ÿÿÿüüÿÇ—Ç“‰ÆƒÄ„tÂ~lÂxd¿oW¿kRõöÿÿÿÿ‘‘™ÿÿÿÿÿÿB+Xíâëÿÿÿíâ몔«ˆr’gPx++B+XíâëíâëÚÄЈr’gPxV?k ÿÿÿÿÿÿ[ -»K'ºG#·F õñöñíô¤|ƒ¶>´;³:´5´5it„BD´-³,´,³,¸,¬(€Fÿÿÿÿ7)ŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸR|=7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WˆñÿS×ÿÀÿ ‰Ð$Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ33yŸ¼ÿÿyßÿyßÿ¸>•r}ñíô¶œ¥…GK¶-¶-¶,¨'~Fÿÿÿÿ7)«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y|=7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WˆñÿU×ÿÇÿ ‰Ð$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼ÒyŸ¼ÿÿyêÿyêÿyêÿyŸyŸyŸyŸ2ÍrZÉmSÉjOéäëíèðíèð˜ks‚NU»K+ºC!ºB™võñöñíô¯—¡¶-¶,´,¥'~Fÿÿÿÿ7)³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]|=7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WˆñÿPÕÿÉÿ‰Ñ$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nnô¼¨ô¼¨ô¼¨ô¼¨ðº¦ÒŸ‰ñ¯uñ¯uÛ¡‚z§ }±¡€¶¨„¿ª„­°…¼€uÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿÿuyÒÿÿuyÒÿyÒÿyÒÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿxÿxÿxyÒÿyÒÿyÒÿyÒÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿuœyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼ÒyŸÿÿÿÿÿÿ…I¼7mÆožôôüôôüôõýõõÿõöÿööÿöøÿöøÿøùÿùùÿùúÿùúÿêÛë¾Cu²,e)#ÿÿÿÿÿÿÿÿ  §ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§®ÿÿÿüüÿüýÿúüÿúüÿúúÿúúÿúùÿ¥¥¬ÿÿÿúúû‰‰’ÿÿÿÿÿÿÿÿÿÿÿÿ:M”~—æÖáÞÎÒº¤·oUzB+X! ?V?kÓ¸ÇÞÎÒ”~—R;d$E 3ÿÿÿÿÿÿÿÿÿÿ_˜F:×rÕ†mÍyd²™¤íèðñíôñíôÍÃл¬¸Ã³¾Ä¶Àœ|†ñíôñíôíèð‘KJ¶+¶,¥'~Fÿÿÿÿ7)¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W†ìÿRÖÿËÿ‰Ñ$WÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿĆzǘ–ɘ–Μ—¾’Ç“é¨uéªuÚ € }±¡~µ¡~µ¨„¾¨„»ª„­¼€u¼€uÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿ•ÙÿyÒÿyÒÿyÒÿyÒÿ•ÙÿyÒÿ,¼Òÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿÿÿÿ´yÒÿyÒÿ•ÙÿyÒÿ,¼Òÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿxÿxyÒÿyÒÿyÒÿ•ÙÿyÒÿ,¼Òÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿxÿxyÇÿxÿxyÒÿ•ÙÿyÒÿ,¼Òÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿÿxyÒÿyÒÿyÒÿyÒÿ•ÙÿyÒÿ,¼Òÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿuœuœyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyâÿyâÿyŸÿÿÿÿÿÿ…I¼,eÆjšòôüòôüòõüôöýõõÿõöÿöøÿöøÿøùÿøùÿùúÿùúÿêÛê¾Cu²,e)#ÿÿÿÿÿÿÿÿ¢¢©ÿÿÿÿÿÿèßæåÙÝäÕÙäÑÒ¨¨¯ÿÿÿýýÿýüÿýýÿüýÿüüÿüüÿüüÿ¨¨¯ÿÿÿžž¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:MÎ¾ÇøòûíâëæÖ᪔«˜zj‡Î¾ÇæÖáõðôξǡ… zj‡gPxÿÿÿÿÿÿÿÿÿÿ] —C:ᥓᡒݘƒÚubb®—ìåííèðñíôõñöñíôñíôñíôñíôõñö·˜«on´)Ÿ#|@ÿÿÿÿ7)ÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄf|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WˆñÿU×ÿ}¯Ò?R$WÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿÃW7¶œ¥õñöõðôÄ«±´,´,²+zBÿÿÿÿÿÿ7)ÎkÎkÎkÎkÎkÎkÎkÎk|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W3$ÉÒÛ_aÞo$WÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nnÑ„è¨uÓ™uÓ™uÏ—}¯ŠÀ´À´Àô¼¨ô¼¨ô¼¨¿q[ÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿÿÿÿÿuyôÿyôÿyôÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyôÿxÿÿÿÿÿÿxyôÿyôÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿxyôÿyôÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿÿxyôÿyôÿyôÿyôÿyôÿyôÿ,¼Òÿÿÿÿô¼¨ÞySô¼¨ÿÿÿÿÿÿÿÿuœÿÿÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿ,¼ÒyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿÿÿÿÿ•O¼,eÆjšòòûòòüòôüòõýôõýôõÿõöÿõøÿöøÿøøÿøùÿøúÿêÛê¾Cu²,e)#ÿÿÿÿÿÿÿÿ¦¦­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññúËËÞ××çññú˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:MB+X-H+"j[‚xgŠ:MB+X +"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜JDÞ§îÉ¿íô踥᧒ՈnÎy^ÊmOÇ_=Ç]:Ä«±Ë³¸¿·8 ¶-²+£$>ÿÿÿÿÿÿÿÿ7)ÖnÖnÖnÖnÖnÖn|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W_aÞ³³$WÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nn¤nnÀŠuÀŠuÀˆÀ›Á¾™Á·­î¸¦íù¿qZÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ,¼ÒyŸyŸyŸyŸyŸyŸyŸÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿuuuuyŸyŸyŸyŸyŸÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ,¼ÒyŸyŸyŸyŸyŸyŸyŸÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ,¼ÒyŸyŸyŸyŸyŸyŸyŸÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿxxyŸyŸyŸyŸyŸyŸyŸÿÿÿÿô¼¨ô¼¨ô¼¨ÿÿÿÿÿÿÿÿÿÿuœÿÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼ÒyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•O¼,eÆjšâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞ¾Cu²,e)#ÿÿÿÿÿÿÿÿ¦¦­ýüÿüýÿèßææÙÞäÕØñèëùùÿÿÿÿ¼¼Á››£””œ°°¶””œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB+X”~—"ÿÿÿÿB+XÓ¸Ç"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿb$PKⲨñ;ìÄ´ä² Ù‘|Ó‚iÍrXÊeEËgFÄ«±É¾F·?³/ª'‚ÿÿÿÿÿÿÿÿÿÿ7)ÚpÝrÝrÝr|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W­o$WÿÿÿÿÿÿÿÿC2&:*.ÿÿÿÿÿÿÿÿsbV° ”³¢šŒ|oC2&:*6&.ÿÿÿÿÿÿÿÿÿÿÿÿ€> ¥W½aÁaÄaÉbÉbÆbÅbÆbËbÇcÇcËcÃ`¤Wu<ÿÿÿÿÿÿÿÿÿÿk)555k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%'#hlpMPPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþôçດÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÀÀÀBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÀÀÀBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÀÀÀBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÀÀÀBBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBBÀÀÀBBBÿÿÿÿÿÿÿÿÿÿÿÿfÌÌœÒÿœÒÿœÒÿœÒÿœÒÿœÒÿœÒÿœÒÿT«‹VÌâœÒÿœÒÿœÒÿœÒÿœÒÿœÒÿœÒÿœÒÿœœ.ÿÿÿÿÿÿ±SNÎccÎccÆccçÞÞçÞÞ”))”))”))ÞÞçççççççÞÞçÎÎÎÎÎÎŒ!!­BB­BBa/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿÿÿùúúÖ²ŠÕ°…Õ¬€Ô¤qÓŸiÑœbÑ•UÐ’Qõ÷øÿÿÿÿÿÿÿÿÿsbV° ”Ó¾¶³¢šP@8C2*:*.ÿÿÿÿÿÿÿÿmYL° ”³¢šŒ|oC2*:*6".ÿÿÿÿÿÿÿÿÿÿ‚? ¦V ¹]ÄbÄaÅ_ÆbÇcÆaÆcÇcÇcÌcÌcÇcËcÄa¤Wÿÿÿÿÿÿÿÿÿÿk)’8’8’8’85k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿMPPo•ºc„ SužÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéåģФwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿ™™wÅ÷œÙÿœÙÿœÙÿœÙÿœÙÿœÙÿVÐâj¼¯{ÎÇ|ÒÊT¯‹œÙÿœÙÿœÙÿœÙÿœÙÿœÙÿcÎÎ.ÿÿÿÿÿÿ¥MHÎkkÎkkÆZZçççççç”))”))”))ÞÞÞÞççÞççÞççÎÎÎÎÎÎŒ!!­BB­BBa/#ÿÿÿÿÿÿÿÿœœœµµµ´´´³³³²²²²²²±±±¤¤¤ÿÿÿúûûøùúøøùøøù÷øø÷÷ø÷øøö÷÷ö÷øö÷øÿÿÿ’’’ÿÿÿÿÿÿsbVâÑÅíáÜäÔÌŒ|odOGK:2.ÿÿÿÿÿÿÿÿmYLßËÃäÔ̰ ”gVJK:.G6*.ÿÿÿÿÿÿÿÿÿÿ¹]Á`¿\ÃaÄa¤„bíæßïëæõòïòîëñìèïëæòîëͽ­ÊcÈcÇcÄat;ÿÿÿÿÿÿÿÿk)š>š>š>š>š>š>’3k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿo•º™ÎñƒºòSuž]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéõãÐ÷Î¥÷ΥФwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿ™™œÝÿœÝÿœÝÿœÝÿœÝÿœÝÿVÒâT±‹wÛ¿ˆãÛ|ÔÊnвVÒâœÝÿœÝÿœÝÿœÝÿœÝÿœœ.ÿÿÿÿÿÿ¥MHÎkkÎkkÆZZçççççç”))”))”))ÞÞÞÞççÞççÞççÎÎÎÎÎÎŒ!!­BB­BBa/#ÿÿÿÿÿÿÿÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ÿÿÿúûüÖ²ŠÕ°†Õ­€Ó¥qÒŸjÒœbÑ•UÐ’Q÷øøÿÿÿ“““ÿÿÿÿÿÿsbVâÑÅíáÜäÔÌŒ|o]MDO:2. ÿÿÿÿÿÿÿÿsbVâÑÅäÔ̽­ gVJK:2G6*.ÿÿÿÿÿÿÿÿ„B ¿bÃb¿^Ãb»©–òîëòîëõòïøõñòîëòîëòîëøõñÔɼÊcÇcÈcÈbžTt:ÿÿÿÿÿÿk)ŸAŸAŸAŸAŸAŸAŸAŸA’3k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿo•º‰Åüªàÿ‰ÅüJ¡É]>Uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(22(22œœÎÿÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéõãÐùØ·÷Î¥ëÄŸÅ¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿfÌÌœáÿœáÿœáÿœáÿœáÿœáÿT³‹q×µzãÄáÖ‡åÚ~æÉT³‹VÔâœáÿœáÿœáÿœáÿ„„.ÿÿÿÿÿÿ¥MHÎccÎccÆZZïççïççççççÞÞçÞÞÞÞÞÞÞÞÞÞÞÞÞçÖÖÖÖÖÖ”))µJJµJJa/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿûüüúûûúúûùùúùùùøùùøùú÷øù÷øù÷øùÿÿÿ”””ÿÿÿÿÿÿsbVßËÃïçÞäÔÌŒ|ogVJK:2.ÿÿÿÿÿÿÿÿmYLßËÃäÔ̽­ dOGK:2G6*.ÿÿÿÿÿÿÿÿ…D ÄjÅiÃg¹¥óðìòîëðìçÕÍÃÍ´ͽ­Í½­Í´Ôɼì”ÈbËcÌcÈc¸[v<ÿÿÿÿÿÿk) ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤Dž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U«ðüŸã÷F´èA«Ñ]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎΜœÎÿÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéõãÐùØ·÷Î¥ëÄŸÅ¥Š×³‰Ð¤wΡsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿ™™œêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿVØâuã¼iÒ©T·‹œêÿœêÿœêÿœêÿœêÿcÎΜœ.ÿÿÿÿÿÿ¥MHÎccÎccÆccÆccÆccÎssÎssÎssÆkkÆccÆccÆkkÆccÆccÆccÎccÎcca/#ÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿîèáíãØëàÔêÝΨ¨¨ÿÿÿüüüÖ²ŠÕ°†Õ­€Ó¤rÒ jÑœbЕUÐ’Qøùùÿÿÿ–––ÿÿÿÿÿÿsbVâÑÅíáÜäÔÌŒ|odOGK:2. ÿÿÿÿÿÿÿÿmYLâÑÅäÔ̽­ dOGK:2G6*.ÿÿÿÿÿÿ…E ª_ÆrÅpÅnòîëòîëßÙÓh5ÈiÈiÉh Éh Èg ÇcÆaÇbÌcÍcÇcÁ_¡Ut;ÿÿÿÿk)&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®Jž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õüâÿIÍÿA«Ñ]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéõãÐ÷Î¥÷Î¥ëğ㽊öÌ‹óÉ‹¹œ’Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿ™™œîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿVÚânß²T¹‹VÚâœîÿœîÿœîÿœîÿœîÿœœœœ.ÿÿÿÿÿÿ¥MHÂ`_Â`_¾`_¾`_¾`_ÂhgÂhgÂhg¾dc¾`_¾`_¾dc¾`_¾`_¾`_Â`_Â`_a/#ÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©©©ÿÿÿüýýüûüûûûûûûûûûúúûúúúùùúùùúøùùÿÿÿ———ÿÿÿÿÿÿsbVâÑÅíáÜäÔÌŒ|ogVJK:2.2">."C2&2"sbVâÑÅäÔ̽­ gVJK:2G6*.ÿÿÿÿÿÿ…G«aÈtÇrÇròîëõòïɶ¢ÈlÈkÇjÈiÈh Éh ÇdÇbÇbËcÌcÈcÀ`¢Vv<ÿÿÿÿk))³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³Nž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õüâÿLÎÿC«Ñ]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿåÄ£õãÐþõéþõéþõéõãÐùØ·÷Î¥÷ΥťŠöÌŠöÌŠêô™—¹œ’Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)11)11)11)11)11)11)11)11)11)11)11)11)11ÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿ)11)11)11)11)11)11)11)11)11)11)11)11)11ÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿ)11)11)11)11)11)11)11)11)11)11)11)11)11ÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿ)11)11)11)11)11)11)11)11)11)11)11)11)11ÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿ)11)11)11)11)11)11)11)11)11)11)11)11)11ÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿfÌÌœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿT»‹dÕ¤T»‹œñÿœñÿœñÿœñÿœñÿœñÿ„„œœ.ÿÿÿÿÿÿ¥MH¶XW¶XW¾lkÆ|{Æ|{Æ{ƀƀƀÆ|{Æ|{Æ|{ƀƀƅ€Â`_Â`_a/#ÿÿÿÿÿÿÿÿ¢¢¢ÿÿÿÿÿÿîèáìãØëàÓêÝΪªªÿÿÿýýýÖ²ŠÖ¯†Õ¬€Ô¤rÒ jÒ›bЕUÐ’Qøùúÿÿÿ˜˜˜ÿÿÿÿÿÿsbVòêæÿÿÿòêæÀ°§§—~v.6&G6*G6*6&sbVòêæòêæäÔ̧—~v‚qi. ÿÿÿÿÿÿ†I¬dÍz'Ìw#Êv øõñõò>€ÉpÈnÇmÈjÈj«r¤sCÈdÇcÈcÇcËcÂ`¡Uv<ÿÿÿÿk),¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Qž<k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õü€âÿMÑÿK¨Ì]>Uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(22(22œœÎÿÿœèÿœèÿoncÎÎcÎÎcÎÎcÎÎcÎΜœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÄ£õãÐþõéõãÐùØ·÷Î¥÷Î¥÷Υ߸†öÈ€öÉ弆´™˜µ™šº”ΡsΡsÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎsssscÎÎcÎÎcÎÎcÎÎcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœcÎÎcÎÎvvvvvvvvcÎÎcÎÎcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎÿÿÿÿvcÎÎcÎÎcÎÎcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿ™™œ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿVßâT¾‹T¾‹T¾‹Vßâœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎΜœ.ÿÿÿÿÿÿ¥MHÎkkÕ•›ö÷÷÷øøøøøøùùøùúøúùúúûúûûûüûûüüûýýüüýðåæÏtsÆcca/#ÿÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿÿÿþýþýþýüýþüýýüüýüüüúûüõõõâââÙÙÙõõõšššÿÿÿÿÿÿÿÿÿÿmYL° ”íáÜçÛÎÓ¾¶~vsbV[J>Œ|oÕŸêÞÖ§—nbdOGK:2. ÿÿÿÿÿÿÿÿÿÿ‡L¯l+Õ‹GÔˆCÓ†<õòïòîëÕÍÃÌy'Ëw$Êu!ÊpËp±—{õòïɶ¢¥wJÉdÉdÉc¿_ Uv<ÿÿÿÿk)2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁWž<k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õüâÿRÖÿK¨Ì]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎΜœÎÿÿœðÿœðÿœðÿœœœœœœœœoncÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”låÄ£÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥Ó¯„õÆyõÄsîÀx·¤·¤¹Ÿ­À¤©Å¥ŠÎ¡sÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿÿÿÿÿsœÖÿœÖÿœÖÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÖÿvÿÿÿÿÿÿvœÖÿœÖÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿvÿvœÖÿœÖÿœÖÿœÖÿœÖÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿÿvvvvœÖÿœÖÿœÖÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿ™™œøÿœøÿœøÿœøÿœøÿœøÿVßâT¾‹T¾‹T¾‹VßâœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿcÎΜœ.ÿÿÿÿÿÿ¥MHÎkkÕ•›êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcca/#ÿÿÿÿÿÿÿÿ¥¥¥ÿÿÿÿÿÿîèàìãØëàÓêÝά¬¬ÿÿÿþýþÖ²ŠÖ°†Õ¬€Ó¤rÒ jûûüÀÀÀ¢¢¢›››µµµ›››ÿÿÿÿÿÿÿÿÿÿsbV§—íáÜçÛÎÓ¾¶~vsbV[J>Œ|oÕŸêÞÖ§—nb]MDO:..ÿÿÿÿÿÿÿÿÿÿˆN°p1Ú—XדRבNïëæòîëòîë³’q£|SÍz*Ìt!Ìs´š~øõñõòïIJžÉdÉcÈc½_ Uv<ÿÿÿÿk)5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[ž<k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õü~àÿT×ÿO¨Í]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”l÷Î¥÷Î¥÷Î¥÷Î¥ôÌ£Þ¸†õÄsõÄs康¤¹Ÿ­º¡²¿¤»À¤©Å¥ŠÎ¡sÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿÿsœÞÿÿsœÞÿœÞÿœÞÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿvÿvÿvœÞÿœÞÿœÞÿœÞÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿ™™œùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎΜœ.ÿÿÿÿÿÿ¥MHÎkkÕ•›÷÷÷÷÷÷÷øøøøùøùùùùúùúúùúûúûûûûüûüüûüüðåæÏtsÆcca/#ÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­ÿÿÿýýþýþýüýþüýýüüýüüüüûü«««ÿÿÿúúú‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿmYL° ”íáÜçÛÎ̼³•xsbV[J>‚qißËÃçÛΰ ”nb]MDK:2.ÿÿÿÿÿÿÿÿÿÿ‰O³v9â«pà¦kÚœbÆ´¡òîëõòïõòïÚÓÌÍ´ÓǺÔɼ¶žƒõòïõòïòîë®zIÉbÉc½_ Uv<ÿÿÿÿk)8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U¦ñýáÿWÙÿO¨Í]>UÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ¦xÖ³“׳“Û¶”Ï­Ö¯~ï¿sïÀsä¹}¹Ÿ­º ±º ±¿¤º¿¤·À¤©Î¡sΡsÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÜÿœÞÿœÞÿœÞÿœÞÿœÜÿœÞÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿÿÿÿ°œÞÿœÞÿœÜÿœÞÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿvÿvœÞÿœÞÿœÞÿœÜÿœÞÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿvÿvœÖÿvÿvœÞÿœÜÿœÞÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿÿvœÞÿœÞÿœÞÿœÞÿœÜÿœÞÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿ™™™™œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœêÿœêÿœœ.ÿÿÿÿÿÿ¥MHÎccÕ‘—ö÷÷ö÷÷öø÷÷ùøøøùøùùùúúùúúúûûúûûûüüûüüðååÏtsÆcca/#ÿÿÿÿÿÿÿÿ¨¨¨ÿÿÿÿÿÿîèáìãØëàÔëÝή®®ÿÿÿþþþþýþþþþýþþýýýýýýýýü®®®ÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYLÛÏÃúööòêæíáÜÀ°§³¢š‘„ÛÏÃíáÜøôïÛÏú¥‘„~v.ÿÿÿÿÿÿÿÿÿÿ‡L²t9é½éºæ³€ä­s·‹`ì”ñìèòîëõòïøõñõòïõòïõòïõòïøõñʳšÁ•lÈa¸\žTr:ÿÿÿÿk)=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôdž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õüâÿŸÄÎPqQ]>UÿÿÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿoncÎÎcÎÎcÎÎcÎÎcÎΜœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”l¼”lõÄsõÄsñÁsèºsß´sÙ°‚¿¤»¾¤ºÃ¨·ôÌ£óË£÷Î¥÷ΥبvЖ[ÿÿœœÎÿÿœ÷ÿœ÷ÿœòÿœ÷ÿœ÷ÿœ÷ÿœòÿœ÷ÿœ÷ÿœ÷ÿœòÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœòÿÿÿÿ°œ÷ÿœ÷ÿœ÷ÿœòÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœòÿœ÷ÿvÿvœ÷ÿœ÷ÿœ÷ÿœòÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿvÿvœ÷ÿœ÷ÿœ÷ÿvÿvœ÷ÿœòÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœòÿÿvœ÷ÿœòÿœ÷ÿœ÷ÿœ÷ÿœòÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿ™™ÿÿÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœîÿœœ.ÿÿÿÿÿÿ±SNÎccÕ‘—êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcca/#ÿÿÿÿÿÿÿÿ©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏϬ¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽxmYL[J>O>2K:.>.":*6"O:.]MDsbVO>2G2&>."6"sf]ÿÿÿÿÿÿÿÿÿÿÿÿ‹S#鿘íÄžë¾èµç±yÁ•l£„ʳšÔÁ­ÔÁ­Í½­Ä¯˜õòïøõñõòïÅ›sËbÈb´X w<ÿÿÿÿÿÿk)?Øf?Øf?Øf?Øf?Øf?Øf?Øf?Øf?Øf?Øfž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U§õüËÙÇ?o7µºÌo|sÿÿÿÿÿÿÿÿœœÎÿÿœðÿœðÿœðÿœœœœœœœœoncÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lÓ®õÄsñÁsß´sß´s×°„¿¤»Ä©¼Ç¬·ôÌ£÷Î¥÷Î¥òӵЖ[ÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿÿsœ÷ÿÿsœ÷ÿœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿvvvvvÿvvœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvÿvœ÷ÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿÿvœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿ™™ÿÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:1+ÿÿÿÿÿÿÿÿ¥MHÎkkÕ•›õ÷öö÷÷ö÷÷÷øø÷ùùøøùøùùùúúùúúúûúûûûûüûðååÓxwÎkka/#ÿÿÿÿÿÿÿÿªªªÿÿÿÿÿÿîèáìãØëàÓõîçÏÏÏ®®®®®®­­­¬¬¬¬¬¬ªªª©©©¨¨¨¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíáÜäÔÌÓ¾¶~vsbVG6*[J>ßËÃêÞÖ§—nb]MDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡L漕ðÌ©ðΦê¿è¹…æ±xÞ¤gÛ\Ù•RÕˆ=Óƒ6ɶ¢øõñøôïÔÁ­ÈcÈcÆbSs:ÿÿÿÿÿÿk)AÛiAÛiAÛiAÛiAÛiAÛiAÛiAÛiž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U5h$×ÞÖ‰ŠÙ99m]>UÿÿÿÿÿÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lÓ®î¿sß´sß´sܲ{Ä©¼È­¼È­¼÷Î¥÷Î¥÷ΥЖYÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿÿÿÿÿsœ÷ÿœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿvÿÿÿÿÿÿvœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿÿvœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎÿÿÿÿ÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿ™™ÿÿÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿcÎΜœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿ±SNÎccÕ‘—ööööö÷ö÷÷öøø÷øø÷øùøùùøúúùúúúúúúûúúüûðååÏtsÆcca/#ÿÿÿÿÿÿÿÿ¬¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÙÙÙâââõõõ———ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYLsbVdOGG6*C."‘†›‡mYLsbVK6*>."6"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³yC羚ó×»òÓ°îË¢é¾à§lÛœ\Ø“NÖ‰<Ö‡9ÔÁ­ÙǴЫŠÊl ÉdÆb»]p:ÿÿÿÿÿÿÿÿk)EálEálEálEálEálEálž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U‰ŠÙAA¯AA¯]>UÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”l¼”lÑ©sÑ©sѬ…ѵ½Ï´½Ê­©óË£òӵЖXÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿcÎΜœœœœœœœœœœœœœÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿssssœœœœœœœœœœÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿcÎΜœœœœœœœœœœœœœÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿcÎΜœœœœœœœœœœœœœÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿvvœœœœœœœœœœœœœœÿÿÿÿ÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿ™™ÿÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎΜœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±SNÎccÕ‘—êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcca/#ÿÿÿÿÿÿÿÿ¬¬¬þýþýþýîèáíãÙëàÓõîæûûüÿÿÿÀÀÀ¢¢¢›››µµµ›››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsbV° ”>."ÿÿÿÿsbVßËÃ>."ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹S$·~JêÆ¥õÚºñÔ°ëÆã®zߣgÚ—VØDÙEÔÁ­×·šÏvÊqÇeÀ_£Vÿÿÿÿÿÿÿÿÿÿk)GänHæpHæpHæpž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UXW©99m]>UÿÿÿÿÿÿÿÿoncÎÎcÎÎcÎÎcÎÎcÎΜœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lǥѩsѬ€Ò¶½Ì¯ªÅ¥ŠòӵЖXÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿœÿÿœÿÿœœçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿœÿÿœÿÿœœçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿœÿÿœÿÿœœçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿœÿÿœÿÿœœçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿœÿÿœÿÿœœçœR÷Î¥çœR÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿ™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥MHÎkkÕ•›õööõ÷ööö÷÷÷÷÷øø÷øøøùùøùùøùùùúúùûúúûûðäåÓxwÎkka/#ÿÿÿÿÿÿÿÿ­­­ýýþýþýýþýüýýüýýüüýüûüÿÿÿ«««ÿÿÿúúú‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYLÔÈÄ>."ÿÿÿÿmYLßÛ×>."ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠP!·LòÔ¸ôÙÀñֶ鿘綊ãªuã£câ¡bßž_ÖAÑ€,Ìu¾c £Wx;ÿÿÿÿÿÿÿÿÿÿk)GänHæpž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ++V]>Uÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœonÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lǥѪv̯ªÅ¥ŠëğЖXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœœœœœœÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿœœœœœœœœÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿœœœœœœœœÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿœœœœœœœœÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿœœœœœœœœÿÿçœRçœRçœRçœRçœRçœRçœRçœR÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™™™™™™™™™™™™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥MHÎkkÕ•›õööõööö÷öö÷÷÷÷÷ö÷÷÷øù÷øøøùøùùúùúúùúúïäåÓxwÎkka/#ÿÿÿÿÿÿÿÿ®®®þþþþýþþýþýþþýýýýýýýýüÿÿÿ®®®ÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠR$³xDే辗潕㶊ã«và¥jÜ›[΂;Æv+§^w<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”l¸’nëÄŸòӵЖXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœR÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9”B9ÿÿÿÿÿÿÿÿÿÿ®®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏϬ¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆLŒT%´{D´{D³zC³v<³s7°o1©c$‚EAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”l꺈ЕXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçœRçœRçœRçœRçœRçœRçœRçœRçœRçœRçœR!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏ®®®­­­­­­¬¬¬«««ªªª¨¨¨§§§¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰Q‰R ‰T$‹S ‰OˆN€Dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/toolbar32d24.bmp000077500000000000000000001240661477201124000206060ustar00rootroot00000000000000BM6¨6(À ¨C C ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§¦¦¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤¤¤¤¤¤¤¤¤££££££££££££££££££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©ŽŽŽŽŽŽŽŽŽŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§¿¿¿¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¿¿¿£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ••••••••••••••••••••••••–––•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®²²²¯¯¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒÿÿÿÿÿÿÿÿ––––––––––––––––––®®®´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´®®®““““““™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾½½½¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½¿¿¿£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••———˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜–––•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ””””””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½¼¼¼±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššŒŒŒÿÿÿÿÿÿ–––ššš££££££¡¡¡¡¡¡¸¸¸¸¸¸““““““““““““¹¹¹¹¹¹¸¸¸¸¸¸······³³³³³³‘‘‘‘‘‘™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¾¾¾¾¾¾¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤¤¤¤½½½½½½¿¿¿£££ÿÿÿÿÿÿÿÿššš‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡šššÿÿÿÿÿÿÿÿÿÿššš‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••——————˜˜˜˜˜˜˜˜˜™™™˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™˜˜˜˜˜˜˜˜˜––––––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””‘‘‘‘‘‘”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½¼¼¼±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿššš³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³ªªª³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³šššŒŒŒÿÿÿÿÿÿ–––ššš££££££¡¡¡¡¡¡¸¸¸¸¸¸““““““““““““¹¹¹¹¹¹¸¸¸¸¸¸······³³³³³³‘‘‘‘‘‘™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½½½½½½½¿¿¿£££ÿÿÿÿÿÿÿÿ˜˜˜ššš¨¨¨°°°©©©ŸŸŸ’’’ŒŒŒŠŠŠ‰‰‰‡‡‡ÿÿÿÿÿÿÿÿÿÿ˜˜˜˜˜˜¨¨¨©©©ŸŸŸ’’’ŒŒŒŠŠŠ‰‰‰‡‡‡‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––———˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™˜˜˜˜˜˜™™™™™™˜˜˜–––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””‘‘‘‘‘‘‘‘‘‘‘‘”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰‰‰‰‰‰‰€€€‰‰‰›››“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½½½½½½½¼¼¼±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿššš³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³«««   «««³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³šššŒŒŒÿÿÿÿÿÿ–––œœœ¡¡¡¡¡¡¡¡¡¡¡¡¸¸¸¸¸¸““““““““““““¸¸¸¸¸¸¹¹¹¹¹¹¸¸¸¸¸¸³³³³³³‘‘‘‘‘‘™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¾¾¾¾¾¾¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤¤¤¤½½½½½½¿¿¿¤¤¤ÿÿÿÿÿÿÿÿ˜˜˜˜˜˜¨¨¨°°°©©©ŸŸŸŠŠŠ‰‰‰‡‡‡ÿÿÿÿÿÿÿÿÿÿ–––ššš¨¨¨©©©ŸŸŸŠŠŠ‰‰‰‡‡‡‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘‘‘–––———˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™˜˜˜˜˜˜™™™˜˜˜–––ÿÿÿÿÿÿÿÿÿÿÿÿ”””’’’’’’’’’’’’’’’’’’”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““¥¥¥   ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½½½½½½½½½½½½½¼¼¼±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆÿÿÿÿÿÿÿÿˆˆˆÿÿÿÿššš´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´«««¡¡¡¨¨¨¦¦¦«««´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª–––ŒŒŒÿÿÿÿÿÿ–––œœœ¡¡¡¡¡¡¡¡¡¡¡¡¸¸¸¸¸¸““““““““““““¸¸¸¸¸¸¹¹¹¹¹¹¸¸¸¸¸¸³³³³³³‘‘‘‘‘‘™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½½½½½½½½½½½½½¿¿¿¤¤¤ÿÿÿÿÿÿÿÿ˜˜˜¬¬¬···ººº···¯¯¯§§§žžž———“““‡‡‡ÿÿÿÿÿÿÿÿÿÿ˜˜˜¬¬¬······¯¯¯¦¦¦žžž———“““‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿ–––———˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜œœœŸŸŸ                     žžž˜˜˜˜˜˜™™™™™™˜˜˜•••ÿÿÿÿÿÿÿÿÿÿ”””““““““““““““““““““““““““”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥µµµ¬¬¬™™™”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½½½½½½½½½½½½½½½½½½½¶¶¶ªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆˆˆˆ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆˆˆˆ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆˆˆˆ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆˆˆˆ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆˆˆˆ€€€€€€ÿÿÿÿÿÿÿÿÿÿššš´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´«««§§§°°°¬¬¬¬¬¬¡¡¡«««´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª†††ŒŒŒÿÿÿÿÿÿ–––ššš££££££ŸŸŸŸŸŸ¹¹¹¹¹¹““““““““““““······¹¹¹¹¹¹¹¹¹¹¹¹³³³³³³‘‘‘‘‘‘™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿ§§§­­­­­­­­­¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬©©©¿¿¿¾¾¾¾¾¾¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤¤¤¤½½½½½½¿¿¿¤¤¤ÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´¸¸¸µµµ«««ŸŸŸ”””‡‡‡ÿÿÿÿÿÿÿÿÿÿ–––¨¨¨³³³µµµ¨¨¨   •••ŽŽŽ‹‹‹‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿ‘‘‘———˜˜˜———˜˜˜˜˜˜˜˜˜   ®®®¹¹¹ººº¼¼¼¼¼¼»»»»»»ºººººº»»»¯¯¯™™™™™™˜˜˜˜˜˜˜˜˜———ÿÿÿÿÿÿÿÿÿÿ””””””””””””””””””””””””””””””””””””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””²²²´´´®®®”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½½½½½½½½½½½½½½½½½½½¶¶¶³³³³³³¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§€€€ÿÿÿÿÿÿÿÿÿÿššš´´´´´´´´´´´´´´´´´´´´´´´´´´´«««¡¡¡¬¬¬®®®°°°¬¬¬©©©¡¡¡«««´´´´´´´´´´´´´´´´´´´´´´´´ššš†††ŒŒŒÿÿÿÿÿÿ–––ššš££££££ŸŸŸŸŸŸ¹¹¹¹¹¹““““““““““““······¹¹¹¹¹¹¹¹¹¹¹¹³³³³³³‘‘‘‘‘‘™™™™™™™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿ§§§¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿©©©¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½½½½½¿¿¿¤¤¤ÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´¸¸¸µµµ«««ŸŸŸ“““‡‡‡ÿÿÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´µµµ«««ŸŸŸ•••‹‹‹‡‡‡ÿÿÿÿÿÿÿÿÿÿ‘‘‘–––˜˜˜˜˜˜———˜˜˜˜˜˜ªªª»»»»»»»»»¼¼¼½½½¼¼¼»»»»»»»»»¼¼¼½½½²²²™™™™™™˜˜˜˜˜˜˜˜˜˜˜˜•••ÿÿÿÿÿÿÿÿ”””••••••••••••••••••••••••••••••••••••”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤³³³¶¶¶°°°¤¤¤”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½½½½½½½½½½½½½½½½½½½¶¶¶³³³³³³±±±©©©¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿšššµµµµµµµµµµµµµµµµµµµµµµµµ«««¡¡¡ªªª­­­­­­¯¯¯°°°®®®©©©¡¡¡«««µµµµµµµµµµµµµµµµµµµµµ–––†††ŒŒŒÿÿÿÿÿÿ–––ššš¡¡¡¡¡¡ŸŸŸŸŸŸºººººº¹¹¹¹¹¹¸¸¸¸¸¸············¸¸¸¸¸¸µµµµµµ““““““››››››™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿ§§§¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿©©©¿¿¿¾¾¾¾¾¾¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤¤¤¤¾¾¾½½½¿¿¿¥¥¥ÿÿÿÿÿÿÿÿ˜˜˜¨¨¨³³³¹¹¹µµµªªªŸŸŸ•••‡‡‡ÿÿÿÿÿÿÿÿÿÿ–––¨¨¨³³³µµµ«««ŸŸŸ”””‹‹‹‡‡‡ÿÿÿÿÿÿÿÿÿÿ‘‘‘™™™™™™™™™™™™™™™©©©»»»»»»»»»ººº³³³°°°¯¯¯¯¯¯¯¯¯°°°±±±²²²ªªª˜˜˜™™™™™™™™™™™™˜˜˜———ÿÿÿÿÿÿÿÿ”””––––––––––––––––––––––––––––––––––––––––––”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¥¥¥···´´´¨¨¨¤¤¤”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹ššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®¸¸¸½½½½½½½½½½½½½½½½½½½½½½½½½½½¶¶¶³³³³³³±±±©©©¬¬¬©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿšššµµµµµµµµµµµµµµµµµµµµµµµµµµµ¡¡¡¡¡¡¡¡¡¡¡¡­­­¯¯¯®®®ªªª¡¡¡¡¡¡¡¡¡µµµµµµµµµµµµµµµµµµªªª†††šššŒŒŒÿÿÿÿÿÿ–––ššš¡¡¡¡¡¡ŸŸŸŸŸŸºººººº¹¹¹¹¹¹¸¸¸¸¸¸············¸¸¸¸¸¸µµµµµµ““““““››››››™™™ŽŽŽÿÿÿÿÿÿÿÿÿÿ§§§¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿©©©¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¥¥¥ÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´¸¸¸µµµ«««ŸŸŸ”””‡‡‡ÿÿÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´µµµªªªŸŸŸ”””‹‹‹‡‡‡ÿÿÿÿÿÿÿÿ‘‘‘———ššššššššššššžžžººº»»»»»»³³³¡¡¡šššššššššššššššššš™™™™™™˜˜˜˜˜˜˜˜˜™™™™™™˜˜˜˜˜˜˜˜˜•••ÿÿÿÿÿÿ”””––––––––––––––––––––––––––––––––––––––––––––––––”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””µµµ³³³¬¬¬¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššªªªªªªªªªššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²½½½½½½½½½½½½½½½½½½½½½½½½½½½¶¶¶³³³³³³±±±©©©®®®¯¯¯¨¨¨©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿšššµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ¬¬¬¡¡¡¬¬¬¨¨¨¡¡¡µµµµµµµµµµµµµµµµµµµµµµµµµµµªªª†††šššŒŒŒÿÿÿÿÿÿ–––ššš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¤¤¤¤¤¤¤¤¤¤¤¤¢¢¢¢¢¢¡¡¡¡¡¡¢¢¢¢¢¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸·········ªªª¿¿¿¿¿¿¾¾¾¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤¤¤¤¾¾¾¾¾¾¿¿¿¥¥¥ÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´¸¸¸µµµ«««ŸŸŸ”””‡‡‡ÿÿÿÿÿÿÿÿÿÿ–––¦¦¦´´´µµµ«««ŸŸŸ”””‹‹‹‡‡‡ÿÿÿÿÿÿÿÿ‘‘‘———››››››››››››©©©»»»»»»¶¶¶   ššššššššššššššššššššš™™™™™™˜˜˜˜˜˜˜˜˜™™™™™™˜˜˜˜˜˜˜˜˜–––ÿÿÿÿÿÿ”””——————————————————————————————————————————————————————”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””›››···³³³¬¬¬¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»³³³³³³ššš»»»·································ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯¼¼¼½½½½½½½½½½½½½½½½½½½½½¶¶¶³³³³³³±±±©©©®®®±±±°°°©©©¨¨¨©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¬¬¬¢¢¢ªªª¢¢¢¬¬¬¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ššš†††šššŒŒŒÿÿÿÿÿÿ–––ššš      ŸŸŸŸŸŸŸŸŸŸŸŸ¡¡¡¡¡¡¡¡¡¡¡¡      ŸŸŸŸŸŸ      ŸŸŸŸŸŸŸŸŸŸŸŸ      –––ŽŽŽÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ªªª¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¥¥¥ÿÿÿÿÿÿÿÿ˜˜˜¦¦¦´´´¸¸¸µµµ«««ŸŸŸ•••‡‡‡ˆˆˆ‹‹‹“““ŒŒŒˆˆˆ˜˜˜¦¦¦´´´µµµ«««ŸŸŸ•••‹‹‹‡‡‡ÿÿÿÿÿÿÿÿ’’’˜˜˜œœœœœœœœœœœœ¯¯¯»»»¼¼¼­­­›››››››››šššššššššššššššššš™™™™™™˜˜˜˜˜˜™™™™™™˜˜˜˜˜˜˜˜˜–––ÿÿÿÿÿÿ”””˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””···²²²¬¬¬¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´ššš»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»···ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±¼¼¼½½½½½½½½½½½½½½½¶¶¶³³³³³³³³³©©©®®®±±±±±±¯¯¯¨¨¨¨¨¨¨¨¨©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¢¢¢§§§§§§¢¢¢¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶–––†††šššŒŒŒÿÿÿÿÿÿ–––ššš¡¡¡¡¡¡¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦      –––ŽŽŽÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸·········ªªª¿¿¿¿¿¿¿¿¿¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤¤¤¤¾¾¾¾¾¾¿¿¿¦¦¦ÿÿÿÿÿÿÿÿ˜˜˜³³³ººº¿¿¿ºººµµµ¬¬¬¦¦¦   žžž‡‡‡‰‰‰›››‰‰‰˜˜˜³³³ººººººµµµ¬¬¬¦¦¦   ššš‡‡‡ÿÿÿÿÿÿÿÿ’’’™™™žžžžžž´´´½½½¼¼¼§§§œœœœœœ›››››››››šššššš£££©©©œœœ™™™™™™™™™™™™˜˜˜™™™™™™˜˜˜•••ÿÿÿÿÿÿ”””™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””žžž···²²²­­­¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´šššªªªªªªªªªªªªªªªªªªªªªššššššššššššššššššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±¼¼¼½½½½½½½½½¶¶¶³³³³³³³³³³³³­­­°°°¯¯¯°°°­­­¨¨¨¨¨¨¨¨¨¨¨¨©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªª‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ªªªªªªªªªªªªªªªªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªª‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ªªªªªªªªªªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªª‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ªªªªªªªªªªªªªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿššš¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¬¬¬¢¢¢¦¦¦¢¢¢¬¬¬¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª†††ªªªšššŒŒŒÿÿÿÿÿÿ–––ššš¡¡¡¡¡¡¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦      –––ŽŽŽÿÿÿÿÿÿÿÿÿÿ¨¨¨¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ªªª¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¦¦¦ÿÿÿÿÿÿÿÿŸŸŸ˜˜˜–––•••’’’ŒŒŒŠŠŠ‰‰‰ˆˆˆ‰‰‰‰‰‰‡‡‡˜˜˜˜˜˜˜˜˜”””’’’ŒŒŒŠŠŠ‰‰‰ŠŠŠšššÿÿÿÿÿÿÿÿ“““ššš¡¡¡   ŸŸŸŸŸŸ³³³½½½¼¼¼ªªªœœœœœœ›››››››››¤¤¤»»»ªªªœœœ™™™™™™™™™˜˜˜™™™™™™˜˜˜–––ÿÿÿÿÿÿ”””šššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššš”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””   ···²²²­­­¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹‹‹‹‹‹‹ššš»»»µµµµµµµµµššš½½½»»»»»»······ššš‹‹‹ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±¼¼¼½½½¶¶¶³³³³³³³³³³³³³³³«««¯¯¯¯¯¯¯¯¯­­­ªªª©©©ªªªªªª«««©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»³³³³³³³³³³³³‹‹‹•••••••••••••••‹‹‹³³³³³³³³³³³³ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»³³³³³³‹‹‹••••••••••••••••••••••••‹‹‹³³³³³³³³³ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»³³³³³³³³³³³³³³³‹‹‹‹‹‹‹‹‹³³³³³³³³³³³³³³³³³³³³³ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»³³³³³³³³³³³³‹‹‹•••••••••••••••‹‹‹³³³³³³³³³³³³ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿššš¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¬¬¬¬¬¬¢¢¢¢¢¢¢¢¢¢¢¢¬¬¬¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª†††ªªªšššŒŒŒÿÿÿÿÿÿ–––ššš£££«««½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿¿¿¿¿¿¿ººº¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ©©©¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸·········«««¿¿¿¿¿¿¿¿¿¬¬¬«««ªªª©©©¨¨¨§§§¾¾¾¿¿¿½½½¸¸¸¶¶¶¸¸¸½½½¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––¨¨¨¯¯¯¸¸¸¶¶¶°°°¨¨¨   ˜˜˜’’’‡‡‡ŸŸŸ±±±···°°°¦¦¦›››”””ŽŽŽ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““›››¤¤¤£££¢¢¢¡¡¡­­­¼¼¼»»»³³³   žžžœœœœœœœœœ¥¥¥¼¼¼¼¼¼­­­™™™™™™™™™™™™˜˜˜˜˜˜•••ÿÿÿÿÿÿ”””››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¡¡¡···²²²­­­¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššªªªªªªªªªššš»»»¶¶¶¶¶¶¶¶¶¶¶¶ššššššššššššššš‹‹‹¶¶¶ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±¶¶¶³³³³³³³³³³³³³³³³³³«««¯¯¯¯¯¯®®®­­­ªªªªªªªªª«««¬¬¬«««©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹‹‹‹‹‹‹‹‹‹•••‹‹‹´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´‹‹‹‹‹‹•••‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´‹‹‹•••‹‹‹´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿ”””¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¬¬¬¢¢¢¢¢¢¢¢¢¢¢¢¬¬¬¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ššš†††ªªªšššŒŒŒÿÿÿÿÿÿ–––ššš£££«««¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹···¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ©©©¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¿¿¿°°°¨¨¨¦¦¦¥¥¥­­­¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜¦¦¦°°°¸¸¸¶¶¶°°°¨¨¨   ˜˜˜’’’‡‡‡ŸŸŸ±±±···¯¯¯¦¦¦›››“““‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““œœœ¦¦¦¦¦¦¥¥¥¤¤¤¤¤¤ººº»»»»»»³³³¤¤¤žžžžžžžžž¦¦¦¼¼¼½½½¼¼¼¬¬¬žžž™™™™™™˜˜˜˜˜˜˜˜˜•••ÿÿÿÿÿÿ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””£££···²²²®®®¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»³³³³³³ššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªª³³³³³³³³³³³³³³³²²²­­­¯¯¯®®®®®®­­­ªªªªªª««««««­­­­­­«««©©©¨¨¨ÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹´´´´´´‹‹‹•••‹‹‹´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹•••‹‹‹´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿ”””··············································································ššš†††ªªªšššŒŒŒÿÿÿÿÿÿ–––ššš£££«««½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ººº¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ©©©¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸·········«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¿¿¿ªªª¿¿¿¾¾¾¼¼¼¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––¨¨¨¯¯¯¸¸¸¶¶¶¯¯¯¨¨¨¡¡¡˜˜˜’’’‡‡‡³³³¶¶¶¯¯¯¨¨¨›››“““‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””©©©ªªª©©©§§§ŸŸŸ¬¬¬»»»¼¼¼½½½¼¼¼´´´°°°°°°±±±²²²§§§½½½¼¼¼¼¼¼»»»¬¬¬žžž™™™™™™™™™˜˜˜•••ÿÿÿÿÿÿ””””””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¤¤¤···²²²®®®¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´ššš»»»·································ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©©©­­­­­­®®®­­­«««ªªª­­­­­­­­­¬¬¬ªªª«««««««««­­­­­­¬¬¬«««©©©¨¨¨ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹‹‹‹‹‹‹•••‹‹‹´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´´´´‹‹‹•••‹‹‹´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´‹‹‹•••‹‹‹´´´‹‹‹•••‹‹‹´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»´´´´´´´´´´´´‹‹‹•••‹‹‹´´´´´´´´´´´´´´´´´´´´´´´´ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿ”””¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿†††šššªªªšššŒŒŒÿÿÿÿÿÿ–––ššš£££«««¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹···¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ©©©¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿«««¿¿¿¾¾¾¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜¦¦¦¯¯¯···¶¶¶°°°©©©ŸŸŸššš’’’‡‡‡ŸŸŸ±±±···¯¯¯¦¦¦›››“““ŽŽŽ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””ªªª¬¬¬«««©©©©©©¡¡¡¯¯¯¼¼¼½½½¼¼¼¼¼¼¼¼¼¼¼¼½½½½½½¼¼¼¼¼¼¼¼¼»»»»»»»»»¬¬¬ŸŸŸ˜˜˜˜˜˜———•••ÿÿÿÿÿÿ”””žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžž”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¥¥¥···²²²®®®¥¥¥”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»´´´´´´ššš»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»···ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥©©©®®®­­­­­­­­­¬¬¬¬¬¬¬¬¬«««««««««««««««ªªª«««©©©¬¬¬«««ªªª©©©ÿÿÿÿÿÿššš»»»µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»µµµµµµµµµµµµ‹‹‹••••••••••••‹‹‹µµµµµµµµµµµµµµµªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»µµµµµµµµµµµµµµµµµµ‹‹‹•••‹‹‹µµµµµµµµµµµµµµµµµµªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»µµµµµµ‹‹‹•••‹‹‹µµµµµµµµµ‹‹‹•••‹‹‹µµµµµµµµµµµµªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»µµµµµµµµµµµµ‹‹‹•••‹‹‹µµµµµµµµµµµµµµµµµµµµµµµµªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿ”””šššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššªªªµµµµµµšššŒŒŒÿÿÿÿÿÿ–––ššš¡¡¡ªªª½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¿¿¿ººº¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿªªª¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸·········«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ººº«««¿¿¿©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––³³³¸¸¸½½½ººº¸¸¸³³³¬¬¬©©©¤¤¤‡‡‡³³³¸¸¸¼¼¼¸¸¸³³³ªªª¤¤¤      ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““«««¯¯¯®®®¬¬¬¬¬¬«««¢¢¢ªªª´´´»»»»»»¼¼¼½½½½½½¼¼¼¼¼¼»»»¼¼¼¼¼¼½½½¼¼¼¬¬¬¥¥¥˜˜˜˜˜˜———•••ÿÿÿÿÿÿ”””ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¦¦¦¶¶¶µµµ®®®–––”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»µµµµµµšššªªªªªªªªªªªªªªªªªªªªªššššššššššššššššššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ªªª®®®®®®­­­¬¬¬¬¬¬««««««­­­­­­­­­­­­«««²²²²²²³³³³³³³³³©©©ÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹‹‹‹‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶‹‹‹‹‹‹‹‹‹¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶šššŒŒŒÿÿÿÿÿÿ–––œœœ¡¡¡ªªª¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹···¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿªªª¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿···³³³«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   –––•••’’’ŽŽŽ‹‹‹ŠŠŠ‰‰‰‡‡‡“““˜˜˜“““‹‹‹ˆˆˆ‰‰‰™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ªªª°°°±±±¯¯¯®®®­­­¬¬¬¥¥¥¦¦¦¨¨¨¬¬¬°°°°°°°°°¯¯¯«««¼¼¼¼¼¼½½½¼¼¼®®®¦¦¦™™™˜˜˜˜˜˜———ÿÿÿÿÿÿÿÿ”””ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¦¦¦³³³³³³“““”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶ššš½½½»»»»»»······ššš‹‹‹ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ªªª®®®­­­¬¬¬«««««««««­­­­­­®®®®®®ªªª²²²³³³³³³³³³´´´¥¥¥ÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹•••‹‹‹‹‹‹¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶šššŒŒŒÿÿÿÿÿÿ–––ššš£££«««½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ººº¥¥¥£££–––ŽŽŽÿÿÿÿÿÿÿÿÿÿªªª¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸···»»»»»»³³³««««««««««««««««««ªªªªªªªªªªªª©©©©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜¸¸¸µµµ°°°¨¨¨   ˜˜˜‡‡‡’’’³³³···¯¯¯¦¦¦›››“““‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““žžž¯¯¯³³³³³³±±±¯¯¯­­­«««ªªª¨¨¨§§§¥¥¥£££¢¢¢¡¡¡­­­¼¼¼½½½¼¼¼°°°¨¨¨™™™™™™˜˜˜———•••ÿÿÿÿÿÿÿÿ”””                                    ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””™™™¶¶¶´´´£££”””ÿÿÿÿÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶ššššššššššššššš‹‹‹¶¶¶ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ªªª­­­««««««««««««­­­®®®®®®®®®­­­³³³³³³³³³´´´¥¥¥ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹‹‹‹‹‹‹‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶‹‹‹••••••••••••••••••••••••‹‹‹¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹‹‹‹‹‹‹¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»¶¶¶¶¶¶¶¶¶¶¶¶‹‹‹•••‹‹‹¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªª‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶šššŒŒŒÿÿÿÿÿÿ–––ššš£££«««¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹···¥¥¥£££–––ŽŽŽÿÿÿÿÿÿÿÿÿÿªªª¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––½½½¼¼¼¸¸¸³³³¯¯¯§§§ššš¦¦¦ººº¼¼¼¸¸¸³³³¬¬¬¤¤¤‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••¬¬¬²²²µµµ´´´±±±¯¯¯­­­ªªª¨¨¨¦¦¦¥¥¥£££¢¢¢¡¡¡®®®½½½½½½°°°ªªª™™™™™™™™™˜˜˜———ÿÿÿÿÿÿÿÿÿÿ”””¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¦¦¦µµµ¹¹¹žžž™™™”””ÿÿÿÿÿÿÿÿÿÿššš»»»·································ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥©©©©©©ªªªªªªªªª­­­®®®®®®®®®¬¬¬³³³³³³´´´¥¥¥ÿÿÿÿÿÿÿÿÿÿššš»»»·····················»»»»»»»»»»»»···»»»»»»···ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»············‹‹‹•••••••••••••••‹‹‹···»»»»»»···ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»······‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹»»»»»»···ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»·····················»»»»»»»»»»»»···»»»»»»···ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»············‹‹‹•••‹‹‹»»»»»»»»»»»»···»»»»»»···ªªª‹‹‹ÿÿÿÿ€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ŒŒŒÿÿÿÿÿÿÿÿ–––œœœ¡¡¡ªªª½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ººº¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ«««¿¿¿¿¿¿¿¿¿¹¹¹¹¹¹¸¸¸···»»»»»»¿¿¿¿¿¿½½½¸¸¸¶¶¶¸¸¸½½½¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   –––˜˜˜”””ŒŒŒ¡¡¡ÿÿ¤¤¤–––˜˜˜’’’ŽŽŽ‹‹‹‰‰‰™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““žžž¯¯¯µµµ¶¶¶´´´²²²¯¯¯¬¬¬©©©¦¦¦¤¤¤£££¢¢¢¡¡¡°°°¼¼¼±±±«««ššš™™™™™™˜˜˜———•••ÿÿÿÿÿÿÿÿÿÿ”””¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¯¯¯©©©   ™™™”””ÿÿÿÿÿÿÿÿÿÿššš»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»···ªªª‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥©©©©©©©©©ªªª°°°°°°°°°­­­©©©²²²´´´¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿššš»»»»»»»»»»»»»»»»»»»»»»»»šššššššššššššššššššššššššššÿÿÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»»»»»»»»»»»»»‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ššššššššššššššššššÿÿÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»»»»»»»»»»»»»»»»»»»»»»šššššššššššššššššššššššššššÿÿÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»»»»»»»»»»»»»»»»»»»»»»šššššššššššššššššššššššššššÿÿÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿššš»»»»»»»»»»»»»»»‹‹‹‹‹‹‹‹‹šššššššššššššššššššššššššššÿÿÿÿÿÿ€€€§§§³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ªªªšššššššššššššššššššššššššššššššššÿÿÿÿÿÿÿÿÿÿ–––œœœ¡¡¡ªªª¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹···¤¤¤¡¡¡–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¿¿¿°°°¨¨¨¦¦¦¥¥¥­­­¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜²²²¨¨¨‹‹‹ÿÿÿÿÿÿ˜˜˜³³³¨¨¨‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ŸŸŸ±±±¶¶¶¶¶¶´´´±±±®®®«««¨¨¨¥¥¥¤¤¤££££££°°°²²²®®®›››ššš™™™˜˜˜–––ÿÿÿÿÿÿÿÿÿÿÿÿ”””¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””œœœ¢¢¢’’’”””ÿÿÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªššššššššššššššššššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥©©©©©©ªªª°°°°°°­­­©©©±±±´´´¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªšššÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªšššÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªšššÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªšššÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿšššªªªªªªªªªªªªªªªªªªªªªšššÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€§§§³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿·································ªªªšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––ššš£££«««½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ººº¥¥¥£££–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¿¿¿ªªª¿¿¿¾¾¾¼¼¼¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––¸¸¸²²²‹‹‹ÿÿÿÿÿÿ–––¶¶¶²²²‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””   °°°µµµ¶¶¶µµµ³³³°°°­­­ªªªªªª¨¨¨¨¨¨§§§¦¦¦£££ŸŸŸœœœššš™™™–––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¢¢¢¢¢¢¢¢¢¢¢¢”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽŽŽ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš½½½»»»»»»······ššš‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥©©©©©©¯¯¯­­­©©©±±±´´´¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš½½½»»»»»»······ššš‹‹‹ÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿššš½½½»»»»»»······ššš‹‹‹ÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿššš½½½»»»»»»······ššš‹‹‹ÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿššš½½½»»»»»»······ššš‹‹‹ÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿššš½½½»»»»»»······ššš‹‹‹ÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿···························ªªªšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––ššš£££«««¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹···¥¥¥£££–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿«««¿¿¿¾¾¾¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   –––˜˜˜œœœÿÿÿÿÿÿ   –––˜˜˜œœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ŸŸŸ­­­±±±´´´´´´³³³±±±®®®­­­«««ªªª¨¨¨¦¦¦£££ŸŸŸœœœššš–––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””¢¢¢¢¢¢”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššššššššššššššš‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ªªª­­­©©©±±±´´´¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššššššššššššššš‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššššššššššššššš‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššššššššššššššš‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššššššššššššššš‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿššššššššššššššš‹‹‹ÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššš¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ªªªšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––ššš£££«««½½½½½½½½½½½½½½½½½½½½½½½½½½½¾¾¾½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ººº¥¥¥£££–––ŽŽŽÿÿÿÿÿÿÿÿÿÿ«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ººº«««¿¿¿©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“““•••žžž¬¬¬¯¯¯¯¯¯¯¯¯­­­¬¬¬«««©©©¦¦¦¤¤¤   ———‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ””””””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤©©©±±±´´´¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³³§§§€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššššššššššššššššššššššššššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––ÿÿÿÿÿÿÿÿÿÿÿÿ«««¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿···³³³«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””•••žžžžžžžžžžžžžžžœœœššš™™™’’’‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§®®®¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³««««««««««««««««««ªªªªªªªªªªªª©©©©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””””””””•••••••••”””“““’’’’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/toolbar32h24.bmp000077500000000000000000001240661477201124000206120ustar00rootroot00000000000000BM6¨6(À ¨# # ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ••““›’’š‘‘™˜—–ŒŒ•‹‹”ŠŠ“‰‰’ˆˆ‘‡‡‡‡††……Ž……Ž……Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ……Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>@DDBBCDCBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)#)#)#)#)#›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ›yŸ)))#)#)#)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––žÿÿÿõöÿõõÿõöÿôõýôôÿôôýòôýòòýñôýñòüòôüñòýñòüñòüÿÿÿ……Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?Dz}~~~~~~€}F>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ£™Þ¶®Ö¥›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿ,,,,,,,,,,,,,,,,,,,,,,,,,,,ÿÿÿÿÿÿÿÿn:n:n:n:n:n:²˜·Í»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑÍ»ÑͻѲ˜·n)n)CCC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜ ÿÿÿõöÿõöÿõõÿôõÿôôÿôõÿôõýòôýòôýòôüòòüñòýñòýñòüÿÿÿ††ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?By˜ ¤%¨%¨'ª'¨'¨'ª(¬(¬(¨%‚zC>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)|=|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ£—ñÙÕýñîýðìÛ¯¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸ,ÿÿÿÿÿÿn:…IÇ7mÇ7m²,e²,eÞÒãÞÒãn)n)n)n)ÒÞìÒÞìÒÒìÒÒìÒÒãÒÒã¼¼Ò¼¼Òc!c!CCC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™¡ÿÿÿööÿõöÿÇ—Æ”ˆÆƒÄŠ{Ä„tÃ~kÂydÀt]ÀnX¿kRòòüòòüÿÿÿ‡‡ÿÿÿÿÿÿÿÿF/_    F/_ÿÿÿÿÿÿÿÿÿÿF/_  B+XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ ~— Ÿ$¨(¯+³,´,³,²,³,³,·,¸,´,¯+¨%…€Fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)|=a4a4|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGGGGGGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ33333333333333ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ£—ñÙÕýñîýñîýñîýðìÛ¯¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿyŸy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿ¸çy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿyŸ,ÿÿÿÿÿÿn:…IÇ7mÇ7m²,e²,eÞÒãÞÒãn)n)n)n)ÒÞìÒÞìÒÒìÒÒìÒÒãÒÒã¼¼Ò¼¼Òc!c!CCC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšš¢ÿÿÿöøÿõöÿõöÿõõÿõõÿõõÿôõýôôýôõýòôýòôüòôýòòýòòüÿÿÿ‡‡ÿÿÿÿÿÿÿÿB+XF/_”~—纘cNq! ?&ÿÿÿÿÿÿÿÿÿÿB+XB+X”~—˜cNq! ?&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS …$¥)«)¯)²)¶+¶+²+²+°+²+¸+º+³,³,¸,¶,®(„Dÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)|=e6e6e6e6|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG##G##38rQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîýñîýñîýñîýñîýðìÛ¯¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿyŸyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿºçŽºçyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyÂÿyŸ,ÿÿÿÿÿÿn:•O¼,e¼,e²,e²,eÞÒãÞÒãn)n)n)n)ÒÒìÒÒìÞÞìÞÞìÒÒìÒÒì¼¼Ò¼¼Òc!c!CCC)#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ››£ÿÿÿöøÿööÿÇ—Æ”ˆÆƒÄŠ{Ä„sÃ}kÀydÀt]ÀoW¿kRñôýòòýÿÿÿˆˆ‘ÿÿÿÿÿÿÿÿB+XB+X”~—纘cNq9+ÿÿÿÿÿÿÿÿÿÿ:MF/_”~—˜cNq9+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿV †  $«)¯+¯)°'²'²+³,²)²+²,³,³,³,º,º,³,³,¸,¯)„Fÿÿÿÿÿÿÿÿÿÿÿÿ7)|=k9k9k9k9k9k9|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQI~P]„Yd„Yd„Yd„Yd„YdUa„Yd‚NU´,³,¸,·,«(~?ÿÿÿÿÿÿÿÿÿÿ7)|=q;q;q;q;q;q;q;q;|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDo¸…ÎÿR—ä-y$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîýñîýñîýñîýñîýñîýñîýñîýñîöÊ»Í}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿyŸyËÿyËÿyËÿyËÿyËÿyËÿyËÿyËÿyËÿyËÿ¿ç5¤³^ÖàL¼ËNÂÎ“Ž¿çyËÿyËÿyËÿyËÿyËÿyËÿyËÿyËÿyËÿ,¼Ò,ÿÿÿÿÿÿn:…I¼7m¼7m² \² \ÞÞìÞÞìn)n)n)n)ÒÒãÒÒãÒÞìÒÞìÒÞìÒÞì¼¼Ò¼¼Òc!c!CCC)#ÿÿÿÿÿÿÿÿÿÿ••°°¶°°¶¯¯µ®®´®®´­­³­­³««²««²žž¥ÿÿÿøùÿøùÿÇ—Æ”‰ÆƒÄŠ|Ã…sÂ}lÂydÀr]ÀoW¿kRòôýòôýÿÿÿŠŠ“ÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉæÖáÚÄÐ¥£cNq-H 3+ÿÿÿÿÿÿÿÿÿÿ:M”~—Ó¸ÇÚÄД~—gPx1K /+"ÿÿÿÿÿÿÿÿÿÿÿÿY  $«(¨#«'®)¯)„Yd³¡°æÝäéäëñíôñìñíèðìåíéäëêåìíè𻥱·,º,´,³,¯)œ Cÿÿÿÿÿÿÿÿÿÿ7)|=v?v?v?v?v?v?v?v?v?v?|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$Wu¼ö}ÆÿW¡÷D¡$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîýñîýñîýñîýñîýñîýñîýñîýñîöÊ»ô¼¨ô¼¨¿„yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|XÿÿÿÿÿÿÿÿÿÿyŸyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿÂ畎GÎÃRÛÏ^ÙàNÄÎ;¿¶•ŽÂçyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿyÑÿyŸ,ÿÿÿÿÿÿn:…I¼7m¼7m² \² \ÞÞìÞÞìn)n)n)n)ÒÒãÒÒãÒÞìÒÞìÒÞìÒÞì¼¼Ò¼¼Òc!c!CCC)#ÿÿÿÿÿÿÿÿÿÿ••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸ¦ÿÿÿøùÿùùÿøùÿøøÿööÿöøÿööÿõöÿõöÿôöÿôõÿôõÿôõýòôýÿÿÿ‹‹”ÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉæÖáÚÄÐ¥£cNq$E3+ ÿÿÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉÚÄÐ¥£cNq1K 3+"ÿÿÿÿÿÿÿÿÿÿY ‰¨+®+¨%«(®+£Š™íèðíèðíèðñíôõñöñíôíèðíèðíèðñíôõñöĶÀ·,¸,³,´,´+¥$|Cÿÿÿÿÿÿÿÿ7)|=}B}B}B}B}B}B}B}B}B}B}B}B|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVj¥vÂÿŒÕÿ_°ÿ €Í$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¡—ñÙÕýñîýñîýñîýñîýñîýñîýñîýñîýñîöÊ»ô¼¨ô¼¨ä¯¢°…¬tpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿyŸyÖÿyÖÿyÖÿyÖÿyÖÿyÖÿyÖÿyÖÿÄ瘎?ɹKÙÇKÖÇYÖÛ]ÛßPÝÍ;À¶˜ŽÄçyÖÿyÖÿyÖÿyÖÿyÖÿyÖÿyÖÿY‡,ÿÿÿÿÿÿn:…I¼,e¼,e² \² \éÞìéÞìÞÞìÞÞìÞÒãÞÒãÒÒãÒÒãÒÒãÒÒãÒÒìÒÒìÇÇÛÇÇÛn)n)› K› KC)#ÿÿÿÿÿÿÿÿÿÿ––žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  §ÿÿÿùúÿøùÿÇ—Ç”ˆÆƒÄŠ{ÄsÃ~lÀydÀr]ÀnW¿kRôõÿòôýÿÿÿŒŒ•ÿÿÿÿÿÿÿÿB+X”~—Ó¸ÇéÞãÚÄС… cNq1K 3+ÿÿÿÿÿÿÿÿÿÿ:M”~—Ó¸ÇÚÄÐ¥£cNq-H 3+"ÿÿÿÿÿÿÿÿÿÿZ ®1¯5°4®1®/ …“îêñíèðíèðêåìÆ»Ç»¬¸»¥±»¥±»¥±»¬¸Ã°»Ä¶À®—´+¶,¸,º,´,¬)Ÿ!Fÿÿÿÿÿÿÿÿ7)|=„E„E„E„E„E„E„E„E„E„E„E„E„E„E|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W>n¾êÿ}Ùü™íŠÕ$Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ333yŸ¼ÿÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ¤™ñÙÕýñîýñîýñîýñîýñîýñîýñîýñîýñîöÊ»ô¼¨ô¼¨ä¯¢°…ɘŒ°…¿„yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸyÝÿyÝÿyÝÿyÝÿyÝÿyÝÿyÝÿyÝÿyÝÿ›Ž›Ž›Ž›ŽJÙÅYÚÙPÑÑ?˺›Ž›Ž›ŽyÝÿyÝÿyÝÿyÝÿyÝÿyÝÿ,¼ÒyŸ,ÿÿÿÿÿÿn:…I¼,e¼,e² \² \éÞìéÞìÞÞìÞÞìÞÒãÞÒãÒÒãÒÒãÒÒãÒÒãÒÒìÒÒìÇÇÛÇÇÛn)n)› K› KC)#ÿÿÿÿÿÿÿÿÿÿ˜˜ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¨ÿÿÿùùÿùúÿùùÿøùÿøøÿøøÿøøÿööÿõöÿõöÿõöÿôöÿõõÿôõÿÿÿÿ–ÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉæÖáÚÄÐ¥£cNq(H 3+ÿÿÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉÚÄС… cNq(H 3+"ÿÿÿÿÿÿÿÿY ‰#²8 ²8 °7 ®5 |LYéäëíèðíèðÆ»Ç^d´1 ¶3 ¶4 ¶4 ¶3 ¶1 ´/´,³+³+´,º,»,³,²,¥%~@ÿÿÿÿÿÿ7)|=ŠHŠHŠHŠHŠHŠHŠHŠHŠHŠHŠHŠHŠHŠHŠHŠH|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WN¦äùWÙÿ·ÿ×$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼ÒyŸ¼ÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞ¶®ýñîýñîýñîýñîýñîýñîýñîýñîýñîöÊ»ô¼¨ô¼¨ä¯¢°…Ù¥Þª y•°…¿„yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿÊçŽDÙÀ4­Žyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿyâÿ,¼ÒyŸ,ÿÿÿÿÿÿn:…I¼,e¼,e²,e²,e²,e²,e¼Bu¼Bu¼Bu¼Bu²7m²7m²,e²,e²7m²7m²,e²,e²,e²,e¼,e¼,en:)#ÿÿÿÿÿÿÿÿÿÿ™™¡ÿÿÿÿÿÿÿÿÿèßææÝâæÙÝäÕÙâÑÒâÑÒ¢¢©ÿÿÿúúÿúùÿÇ—Æ”‰ÆƒÄŠ{ÄtÂ~lÀydÀt]¿oW¿kRõöÿõõýÿÿÿ—ÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉæÖáÚÄÐ¥£cNq-H 3+ ÿÿÿÿÿÿÿÿÿÿ:Mˆr’×ÀÉÚÄÐ¥£cNq-H 3+"ÿÿÿÿÿÿÿÿZ Œ'³>²@°>°; …“íèðíèðÓËØZ]z36´4´4´4¶3 ¶3 ´1 ´/³,²)³+´,º,»,³,´,«'€Cÿÿÿÿÿÿ7)|=‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K‘K|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WC †ðÿZÛÿ »ÿÖ$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ¥›ýðìýñîýñîýñîýñîýñîýñîýñîöÊ»ô¼¨ô¼¨ä¯¢°…Ù¥òºŽî¶Ž¡z™ y•°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿÍç Ž;Ó¶ ŽÍçyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyŸyŸ,ÿÿÿÿÿÿn:…I¬(a¬(a§(a§(a§(a§(a¬3i¬3i¬3i¬3i§-e§-e§(a§(a§-e§-e§(a§(a§(a§(a¬(a¬(an:)#ÿÿÿÿÿÿÿÿÿÿšš¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ££ªÿÿÿúüÿúúÿúùÿùùÿùùÿùùÿùùÿøøÿøøÿöøÿööÿööÿõöÿõöÿÿÿÿ˜ÿÿÿÿÿÿÿÿB+Xˆr’×ÀÉæÖáÚÄÐ¥£cNq1K 3+"$E&B+Xˆr’×ÀÉÚÄÐ¥£cNq1K 3+"ÿÿÿÿÿÿÿÿZ)¸C´C³@³@¶¨¸íèðñíô¶œ¥8:´8´7³5³4´4´3 ¶3 ´0 ³-³+³+´+¸,º,´,´,ª(Fÿÿÿÿÿÿ7)|=˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O˜O|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WK¦ˆñÿU×ÿ ¼ÿÖ$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ¯¦ýðìýñîýñîýñîýñîýñîöÊ»ô¼¨ô¼¨ô¼¨°…Ù¥òºòºâ®œvš™uš y•°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ333333333333333333ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿ333333333333333333ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿ333333333333333333ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿ333333333333333333ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|Xÿÿÿÿÿÿÿÿÿÿ333333333333333333ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿ£Ž,Ĥ-Ƨ£ŽyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿyìÿY‡yŸ,ÿÿÿÿÿÿn:…IœYœY§8m§8m²N}²N}²U}²U}²Uƒ²Uƒ²Uƒ²Uƒ²N}²N}²N}²N}²Uƒ²Uƒ²Zƒ²Zƒ¬(a¬(an:)#ÿÿÿÿÿÿÿÿÿÿ››£ÿÿÿÿÿÿÿÿÿèßææÝâåÙÝäÕØâÑÒâÑÒ¤¤«ÿÿÿüüÿüúÿÇ—Ç“‰ÆƒÄŠ{Ä„tÂ~lÂxdÀr]¿oW¿kRõöÿööÿÿÿÿ‘‘™ÿÿÿÿÿÿÿÿB+XÓ¸ÇíâëÿÿÿíâëÚÄЪ”«ˆr’gPxZJn+R;d+B+XÓ¸ÇíâëíâëÚÄЪ”«ˆr’gPxV?kF/_ ÿÿÿÿÿÿÿÿ[ -¼L)»K'ºG#·F ÍÃÐõñöñíô¤|ƒ¶>¶>´;³:³7´5´5it …“„BD´-³,´,´,³,¸,¶,¬(€Fÿÿÿÿÿÿ7)|=ŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸRŸR|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WU­ˆñÿS×ÿÀÿ‰Ó$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ¯¦ýðìýñîýñîýñîöÊ»ô¼¨ô¼¨ô¼¨ô¼¨ÓŸ‰ò¶…ò´ƒò¶„Û¤‰›uœ™u››u¡z—°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Òxxxxxx,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Òxxxxxxxxxx,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Òxxxxxxx,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿyŸyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿÑ礎%Äž¤ŽÑçyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿ,¼Ò,¼ÒyŸ,ÿÿÿÿÿÿn:…IœYœY§8m§8m²N}²N}²U}²U}²Uƒ²Uƒ²Uƒ²Uƒ²N}²N}²N}²N}²Uƒ²Uƒ²Zƒ²Zƒ¬(a¬(an:)#ÿÿÿÿÿÿÿÿÿÿœœ¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¬ÿÿÿüüÿúüÿüüÿúúÿúúÿùúÿùùÿøùÿùùÿøùÿøøÿøöÿöøÿööÿÿÿÿ’’šÿÿÿÿÿÿÿÿcNqB+X:M1K! ?3+" +B+XB+XB+X-H! ?3+&F/_ÿÿÿÿÿÿÿÿ] ‘3$ÂY9¾R3¼N/¼N-Ë¿Éôðöñíô®—¸C ·C¶@´>³:´8¶8“nzíèð®—„BD´/´-´,³,·,¶,ª'€Fÿÿÿÿÿÿ7)|=¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V¥V|=7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W ^´ˆðÿOÕÿÂÿ ‰Ò$Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ333yŸ¼ÿÿyßÿyßÿyßÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ¯¦ýðìýñîöÊ»ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨Ä”ˆò´‚ò´‚ñ²{å¨|¡}£y¦z§z§§§°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿy¿ÿy¿ÿxÿÿÿÿÿxy¿ÿy¿ÿy¿ÿy¿ÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿxÿÿÿÿÿÿÿÿxy¿ÿy¿ÿy¿ÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿxxxy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿy¿ÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿy¿ÿy¿ÿxÿÿÿÿÿxy¿ÿy¿ÿy¿ÿy¿ÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿyŸyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿÓçÓç§Ž§Ž§Ž§ŽÓçyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿ,¼Ò,¼ÒyŸ,ÿÿÿÿÿÿn:…I¼7mÆožòôýòôüôõýõõýõöÿõöÿõöÿõøÿøøÿøøÿøùÿùúÿùúÿùúÿùüÿúúÿúüÿêÛë¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿžž¥ÿÿÿÿÿÿÿÿÿèßåæÝâåÙÝäÕØâÑÒâÑÒ¦¦­ÿÿÿýüÿüüÿÇ—Ç”‰ÆƒÄŠ|ÄtÂ~løùÿÿÿÿññú××çËËÞ××çññú““›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:M”~—º¤·æÖáÞÎÒ纔~—gPxB+X! ?cNqư¼âÒÛ纈r’R;d-H / 3 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ] “8,ÇiKÆbHÄ^DÃ[=¶œ¥ñíôíèðÆ»ÇZ]ºJ'¸G$·D!·@·>¸>•r}ñíôñíô¶œ¥…GK¶/¶-¶-¶,³,¨'~Fÿÿÿÿÿÿ7)|=«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y«Y|=7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$Wf¸†îÿPÖÿÇÿ ‰Ð$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼ÒyŸ¼ÿÿyêÿyêÿyêÿyêÿyŸyŸyŸyŸyŸ3yêÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ¯¦öÊ»ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨Ã“‡ò´‚ñ²{ñ¯uèªz¤}£z§z§ }±§‚½ª„­°…¼€uÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyÇÿyÇÿxÿxxxxÿxyÇÿyÇÿyÇÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿxxÿxxxxxxxyÇÿyÇÿyÇÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyÇÿyÇÿyÇÿxÿxyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿyÇÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyÇÿyÇÿxÿxxxxxyÇÿyÇÿyÇÿyÇÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿO~yõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿÓç§Ž§Ž§Ž§ŽÓçyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyŸ,¼ÒyŸ,ÿÿÿÿÿÿn:…I¼7mÆožâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞ¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿŸŸ¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦­ÿÿÿýüÿüýÿüüÿúüÿüüÿúüÿúúÿúúÿùùÿÿÿÿ¼¼Á››£””œ–°°¶””œÿÿÿÿÿÿÿÿÿÿÿÿÿÿB+Xˆr’çºæÖáÞÎÒ纔~—gPxB+X! ?cNqư¼âÒÛº¤·ˆr’R;d$E 3/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^”>2Ív\ÍrZÉmSÉjO˜kséäëíèðíèðƻǘks‚NU»K+ºG%ºC!ºB™vñíôõñöñíô¯—¡‘KJ¶-¶,´,³,¥'~Fÿÿÿÿÿÿ7)|=³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]³]|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$Wq¿†íÿPÕÿÉÿ‰Ñ$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿy¿ÿy¿ÿyŸ¼ÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍ}ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ðº¦ÒŸ‰ñ²{ñ¯uñ¯uÛ¡‚z§z§ }±¡€¶¨„¿¨„¿ª„­°…¼€uÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿxÿxyÒÿyÒÿxÿxyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿxÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿO~yöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyŸ,¼ÒyŸ,ÿÿÿÿÿÿn:…I¼7mÆožòôüôôüôôüôõýõöýõõÿõöÿööÿöøÿöøÿöøÿøùÿøùÿùùÿùúÿùúÿúüÿêÛë¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿ  §ÿÿÿÿÿÿÿÿÿèßåæÝâåÙÝäÕØâÑÒâÑÒ§§®ÿÿÿüüÿüýÿüýÿúüÿúüÿúüÿúúÿúúÿúùÿÿÿÿ¥¥¬ÿÿÿúúûòòô‰‰’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:M”~—º¤·æÖáÞÎÒº¤·”~—oUzB+X! ?V?kÓ¸ÇÞÎÒº¤·”~—R;d$E/ 3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_˜F:Ò†m×rÕ†mÍyd“RR²™¤íèðñíôõñöñíôÍÃл¬¸»¬¸Ã³¾Ä¶Àœ|†õñöñíôñíôíè𯗡‘KJ¶+¶,³,¥'~Fÿÿÿÿÿÿ7)|=¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`¸`|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$WydžìÿRÖÿËÿ‰Ð$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÇÿyÇÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿĆzǘ–ɘ–Ö£˜Îœ—¾’Ç“êªué¨uéªuÚ €z§ }±¡~µ¡~µ§„¾¨„¾¨„»ª„­°…¼€uÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿxÿxxxÿxyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿyÒÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿxÿxyÒÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyÒÿyÒÿxÿxyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿyÒÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿO~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼ÒyŸ,ÿÿÿÿÿÿn:…I¼7mÆožâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞ¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿ¡¡¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§®ÿÿÿýýÿüüÿýüÿüüÿüüÿüüÿúúÿúúÿúúÿÿÿÿ§§®ÿÿÿúúû““›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB+Xˆr’º¤·âÒÛÞÎÒ纘cNqF/_! ?cNqư¼âÒÛº¤·ˆr’R;d$E 3 /ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^—D:ÖxÞ˜‚Ù“{Ó†rÓ„m—[]»¥±ñíôõñöñíôîêòñíôñíôõñöõñöñíôñíôñíôíèðíèðíè𲙤“RR´+³+¤$}Bÿÿÿÿÿÿ7)|=¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c¿c|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W!}ȆìÿUÖÿÍÿ…Ì$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyÒÿyÒÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nn´ˆˆí®vä§yߤzí¬uå¤uå¤uß¡uÓ™u¥¯£€·¡€¶¡€¶¨‚ ¸™¯…»¼’¶‰Ê‰xÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿyßÿyßÿxÿÿÿÿxyßÿyßÿyßÿyßÿyßÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿyßÿyßÿyßÿyßÿxÿxyßÿyßÿyßÿyßÿyßÿyßÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿxÿxyßÿyßÿyßÿxÿxyßÿyßÿyßÿyßÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿyßÿyßÿxÿxyßÿyßÿyßÿyßÿyßÿyßÿyßÿyßÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿO~yŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸ,¼ÒyâÿyâÿyŸ,ÿÿÿÿÿÿn:…I¼,eÆjšòòüòôüòôüòõüôõýôöýõõÿõöÿööÿöøÿöøÿøùÿøùÿøùÿùúÿùúÿúúÿêÛê¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿ¢¢©ÿÿÿÿÿÿÿÿÿèßææÝâåÙÝäÕÙäÑÒäÑÒ¨¨¯ÿÿÿýýÿýüÿýüÿýýÿüýÿüüÿüüÿüüÿüüÿââ﨨¯ÿÿÿžž¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:MÎ¾ÇæÖáøòûíâëæÖáξǪ”«˜zj‡Î¾ÇæÖáõðôæÖáξǡ… zj‡gPxgPxÿÿÿÿÿÿÿÿÿÿÿÿÿÿ] —C:Ö‘}ᥓᡒݘƒÛ•|Úubb®—ÍÃÐìåííèðñíôõñöõñöñíôñíôíèðñíôñíôõñöñíô·˜«on´)°)Ÿ#|@ÿÿÿÿÿÿ7)|=ÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄfÄf|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W%„Ð…æÿxßÿ}¯Ò?R$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyßÿyßÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nnÑ„ñ¯uñ¯uì«uå¤uß¡uÓ™uË”…¨„¿¨„¿§„¾®‰»¼—ðº¦î¸¦ô¼¨ô¼¨ô¼¨Ê‰xÿÿÿÿÿÿyŸ¼ÿÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyêÿyêÿyêÿyêÿxÿxxxÿxyêÿyêÿyêÿyêÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿxÿxyêÿyêÿyêÿyêÿyêÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyêÿyêÿxxxyêÿyêÿyêÿyêÿxÿxyêÿyêÿyêÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyêÿyêÿyêÿyêÿxÿxyêÿyêÿyêÿyêÿyêÿyêÿyêÿyêÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyèÿyŸ,ÿÿÿÿÿÿn:•O¼,eÆjšâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞ¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿ££ªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏáÌÌЦ¦­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfUz:M1K! ?3 /&"/$EB+X)A3&"B0_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿb#ωyᨛ毡䧓ᡊߛ‚Þ•{«on°xu¬‚‡·˜Ä«±Ä«±Ä«±»¥±¯“›ñíôñíôõñöñíô㥰xu¸+´+ª'™ Gÿÿÿÿÿÿÿÿ7)|=ÊhÊhÊhÊhÊhÊhÊhÊhÊhÊhÊhÊhÊhÊh|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W…Ò›Æá¸ËË<8ÃW7¶œ¥ñíôõñöõðôÄ«±¶~´,´,²+£$zBÿÿÿÿÿÿÿÿ7)|=ÎkÎkÎkÎkÎkÎkÎkÎkÎkÎkÎkÎk|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W YU3$ÉÒÛÀÀØbf™$WÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿyŸyŸyŸyŸyŸ3yôÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nnÑ„è¨uÓ™uÓ™uÓ™uÏ—}«…º¯ŠÀ´À´À”ô¼¨ô¼¨ô¼¨íù¿q[ÿÿÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿxÿxxxxÿxyôÿyôÿyôÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿxÿÿÿÿÿÿÿÿxyôÿyôÿyôÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿxxxyôÿyôÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyôÿyôÿyôÿyôÿxÿxyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿ,¼Ò3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyðÿyŸ,ÿÿÿÿÿÿn:…I¼7mÆožâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞÃHy¼7mn:)#ÿÿÿÿÿÿÿÿÿÿ¥¥¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’’šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:MøòûõðôæÖáξǺ¤·Œz”F/_+ˆr’íâëõðôæÖáξǪ”«zj‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa#Ò‘‡è¸­ðǹí²洡⨔ޜ„×vÒ…jÎy]ÊnQÉfFÆ_>ÄZ8¼£«õñöõñõÄ«±»ŠŠ³0³-´,«(œ Bÿÿÿÿÿÿÿÿÿÿ7)|=ÓmÓmÓmÓmÓmÓmÓmÓmÓmÓm|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$Wn…›ÉÉÞÚÛë%'²²$WÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nnºŠ„ÆuÉ‘uÉ‘uÀŒ€°Š»¶À´À´ÀÀ”œô¼¨ô¼¨íù¿q[ÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿyöÿyöÿxÿÿÿÿÿxyÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿxxxxxxxxxx¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿyöÿyöÿyöÿyöÿxÿx¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿyôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿÿÿÿÿÿn:•O¼,eÆjšñôûòòûòòüòôüòôüòõýôõýôõÿôöÿõöÿõøÿöøÿöøÿøøÿøùÿøúÿøúÿêÛê¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿ¦¦­ÿÿÿÿÿÿÿÿÿèßææÝâæÙÞäÕØñèëðåéÿÿÿÿÿÿññú××çËËÞ××çññú““›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfUz:MB+X-H5+"j[‚ÿÿxgŠ:MB+X! ? +"B0_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ] ˜JDÞ§îÉ¿ðÎÂíô踥᧒ژՈnÎy^ÊmOÉeEÇ_=Ç]:Ä«±ììô˳¸¿·8 ´4¶-²+£$~>ÿÿÿÿÿÿÿÿÿÿ7)|=ÖnÖnÖnÖnÖnÖnÖnÖn|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W›¡Ð_aÞ#$ϳ$WÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyÿÿ,¼Ò3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nn³…„ÀŠuÀŠuÀˆ¿™ÁÀ›Á¾™Á·­°…íù¿qZÿÿÿÿÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyŸyŸyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿxxxxxxyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyŸyŸyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿyŸyŸyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿyŸ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿ¼ÿÿxxxyŸyŸyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿyõÿ,¼ÒyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿÿÿÿÿn:•O¼,eÆjšâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞ¾Cu²,en:)#ÿÿÿÿÿÿÿÿÿÿ¦¦­ÿÿÿýüÿüýÿüüÿúüÿüüÿúüÿúúÿúúÿùùÿÿÿÿ¼¼Á››£””œ–°°¶””œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB+XÄ´È”~—"ÿÿÿÿÿÿB+XӸǔ~—"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿb$PKⲨîËÀñ;ìĴ䲠ߤ‘Ù‘|Ó‚iÍrXËjLÊeEËgFÄ«±Îº¾É¾F·?¶7 ³/ª'‚Kÿÿÿÿÿÿÿÿÿÿÿÿ7)|=ÚpÚpÚpÚpÚpÚp|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$W­01Úo$WÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nn³…„ÀŠuÀƒÀ›¿ÂœÁº“®°…䯢íù¿qZÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿyŸ,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼Ò,¼ÒyŸÿÿ×|Xô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿyöÿ,¼ÒyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿn:…I¼7mÆožñòûñòûñôûòòüòôüôôüôõýôõýõõÿõöÿõöÿõöÿööÿöøÿöùÿøùÿøúÿêÚêÃHy¼7mn:)#ÿÿÿÿÿÿÿÿÿÿ§§®ÿÿÿüüÿüýÿüýÿúüÿúüÿúüÿúúÿúúÿúùÿÿÿÿ¥¥¬ÿÿÿúúûòòô‰‰’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:MæÖáÄ´È"ÿÿÿÿÿÿ:MÓÎÜÄ´È"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa!RMᮢíļðËÄìǺ軭ᨛޜٌw׉pÙ‚e×€dÓ|aÑvYÇeBÀS-ºD²8§, ‚Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)|=ÝrÝrÝrÝr|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXc$WÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nn³…„ÀŒxÀ™»º“®°…䯢íù¿qZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3ÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3ÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3ÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3ÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿyŸôôü¼ÿÿ¼ÿÿyÿÿyÿÿyŸ3ÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|Xô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿyÿÿyÿÿyÿÿyÿÿyÿÿyÿÿyÿÿyÿÿyÿÿ,¼ÒyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿn:…I¼7mÆožâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèâÚèÞËÞÃHy¼7mn:)#ÿÿÿÿÿÿÿÿÿÿ§§®ÿÿÿýýÿüüÿýüÿüüÿüüÿüüÿúúÿúúÿúúÿÿÿÿ§§®ÿÿÿúúû““›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfUz:MB+XP?jÿÿÿÿÿÿfUz:MB+XP?jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿb%›LGÖ™’Ძé¸ìĹ踯䮡ޡ‘Ý™…Þ‘xÛŒpÕ€dÏtWÇcC¾P0³@§0‚Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)|= Þs Þs|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸ3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤nn³‰”º“®°…䯢íù¿qZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸ3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸ3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸ3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸ3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸ3ÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,¼ÒyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿn:…I¼7mÆožñòûñòûñòûòôûñòüòôüôôüòôüòõüôõÿôõýõöýõöÿööÿöøÿöøÿøøÿéÚêÃHy¼7mn:)#ÿÿÿÿÿÿÿÿÿÿ¨¨¯ÿÿÿýýÿýüÿýüÿýýÿüýÿüüÿüüÿüüÿüüÿââ﨨¯ÿÿÿžž¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ] a$˜HEÕ•Šß§™ß§šÝ¥˜Ùœ×•„ÙxÕ…lÏx]ÆgM¼V<²F,ˆ%NGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)|=|=7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸkp°…䯢íù¿qZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|Xô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨ô¼¨×|XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŸyŸyŸyŸyŸyŸyŸyŸyŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿn:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:ÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏáÌÌЦ¦­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^ c%˜HB™LE™LE˜KD˜HA˜F=˜B8”<24+Š,$VRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7)7)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂ}nâ¡‹¿oZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X×|X'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌШ¨¯¨¨¯§§®§§®¦¦­¦¦­¥¥¬¤¤«££ª¢¢©¡¡¨  §ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^__ _$a!b _^VSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnsis-3.11/Contrib/Makensisw/toolbar32n24.bmp000077500000000000000000001240661477201124000206200ustar00rootroot00000000000000BM6¨6(À ¨# # ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœššš™™™˜˜˜———–––•••”””“““’’’‘‘‘ŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp:r;u;u;s;s;t;u;t;s:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa/#a/#a/#a/#a/#µœœµœœµœœµœœµœœµœœµœœµœœµœœµœœµœœµœœµœœµœœa#a#a/#a/#a/#a/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøùùøøùøùù÷øø÷÷ù÷÷øö÷øööøõ÷øõö÷ö÷÷õöøõö÷õö÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿq;u<TŸU U U U U U U¡UŸTv<p:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà»–çɪ὘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀÿÿÿÿÿÿÿÿ: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+ÿÿÿÿÿÿÿÿ”B9”B9”B9”B9”B9”B9Ƴ³ÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÚÍÍÆ³³”))”))­BB­BB­BBa/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸŸÿÿÿøùúøùùøøù÷øù÷÷ù÷øù÷øøö÷øö÷øö÷÷öö÷õöøõöøõö÷ÿÿÿŽŽŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿq;s<œT³Z ¼^¿^¿_À_¿_¿_À`Â`Â`¿^£WTt;p:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)ž<ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà»”õãÐþõéþôçåÄ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀ¦¦¦ÀÀÀÀÀÀÿÿÿÿÿÿœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ:1+ÿÿÿÿÿÿ”B9¥MHÖkkÖkkÆccÆccçÞÞçÞÞ”))”))”))”))ÞççÞççÞÞçÞÞçÞÞÞÞÞÞÎÎÎÎÎÎŒ!!Œ!!­BB­BB­BBa/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿùùúøùúÖ²ŠÕ°…Õ­€Ô©yÔ¤rÓ iÒœbј[Ñ”VÐ’Qöö÷öö÷ÿÿÿÿÿÿÿÿÿÿÿve]. .. .. ... .ve]ÿÿÿÿÿÿÿÿÿÿve]. ... .....sbVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿy=  V²Z¸]¿`ÄbÇcÈcÇcÆcÇcÇcÊcËcÈcÄb¿^¥W¡Vv=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)ž<Š3Š3ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<C2&:*6".ÿÿÿÿÿÿÿÿÿÿsbVsbV° ”³¢šŒ|o[J>C2&:*6&..ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€> ¥W·]½aÁaÄaÆaÉbÉbÆbÆbÅbÆbËbÌbÇcÇcËcÉcÃ`¤Wu<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)ž<5555ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéþõéþôçåÄ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿœœœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿVÎâT­‹lÉ®jº¯VÎâœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿcÎ΄„:1+ÿÿÿÿÿÿ”B9±SNÎccÎccÆccÆccçÞÞçÞÞ”))”))”))”))ÞÞçÞÞçççççççÞÞçÞÞçÎÎÎÎÎÎŒ!!Œ!!­BB­BB­BBa/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£££ÿÿÿúúûúúûùúúùúûùùúøùú÷ùú÷øù÷øøöøøöøøö÷øö÷øö÷øÿÿÿ‘‘‘ÿÿÿÿÿÿÿÿsbVÀ°§êÞÖòêæêÞÖ̼³ª‘…yll_S]MD.ÿÿÿÿÿÿÿÿÿÿsbVÀ°§êÞÖêÞÖ̼³§—…yll_S]MDP@8.ÿÿÿÿÿÿÿÿÿÿÿÿ~> ¦W½^À_ÃaÄaÄaÅ_’b3™pH ~[¤„b¤„b¤„b¤„b¤„b¢_¤„b£|SÈcÇcËcÊcÁ` Uq:ÿÿÿÿÿÿÿÿÿÿk)ž<–:–:–:–:–:–:–:–:ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿu•´¥Ûÿ²ßSdw]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéþõéþõéþõéùØ·Ú«{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÀÀÀ¦¦¦ÿÿÿÿÿÿÿÿÿÿœœœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿVÐâj¼¯ˆáÛ{ÎÇ|ÒÊT¯‹VÐâœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿœÙÿcÎÎ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÎkkÆZZÆZZçççççç”))”))”))”))ÞÞÞÞÞÞÞççÞççÞççÞççÎÎÎÎÎÎŒ!!Œ!!­BB­BB­BBa/#ÿÿÿÿÿÿÿÿÿÿœœœµµµµµµ´´´³³³³³³²²²²²²±±±±±±¤¤¤ÿÿÿúûûúûûÖ²ŠÕ°†Õ­€Ô©zÓ¥qÒŸjÒœbÑ—[Ñ•UÐ’Qö÷øö÷øÿÿÿ’’’ÿÿÿÿÿÿÿÿsbV§—âÑÅíáÜäÔ̽­ Œ|odOGK:2G6*.ÿÿÿÿÿÿÿÿÿÿmYL° ”ßËÃäÔ̰ ”~vgVJK:.G6*>.".ÿÿÿÿÿÿÿÿÿÿÿÿ„B ¹]Á`¿\Á_ÃaÄa¤„bǺ¬íæßïëæõòïõñìòîëñìèïëæðìçòîëͽ­ÊcÌcÈcÇcÄa¶Z t;ÿÿÿÿÿÿÿÿÿÿk)ž<š>š>š>š>š>š>š>š>š>š>ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U™ÎñŸÕÿƒºòSuž]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéþõéþõéþõéùØ·÷Î¥÷ΥФwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâž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âž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âž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ÿÿÿÿÿÿÿÿÿÿœœœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿVÒâT±‹wÛ¿åˈãÛ|ÔÊnвT±‹VÒâœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿœÝÿœœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÎkkÆZZÆZZçççççç”))”))”))”))ÞÞÞÞÞÞÞççÞççÞççÞççÎÎÎÎÎÎŒ!!Œ!!­BB­BB­BBa/#ÿÿÿÿÿÿÿÿÿÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥ÿÿÿúûüûûûúûûúúûùùúùúûùùùøùùøùú÷ùù÷øù÷øù÷øøö÷øÿÿÿ“““ÿÿÿÿÿÿÿÿsbV§—âÑÅíáÜäÔ̽­ Œ|o]MDO:2G6*. ÿÿÿÿÿÿÿÿÿÿsbV§—âÑÅäÔ̽­ Œ|ogVJK:2G6*>.".ÿÿÿÿÿÿÿÿÿÿ„B ¨Y¿bÃb¿^Á`Ãb»©–òîëòîëòîëõòïøõñõòïòîëòîëòîëõòïøõñÔɼÊcËcÇcÈcÈb½]žTt:ÿÿÿÿÿÿÿÿk)ž<ŸAŸAŸAŸAŸAŸAŸAŸAŸAŸAŸAŸAž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‘¢šÒûªàÿ‰ÅüJ¡É]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿດõãÐþõéþõéþõéþõéþõéþõéþõéþõéþõéùØ·÷Î¥÷Î¥ëÄŸÅ¥ŠÂ˜nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿœœœáÿœáÿœáÿœáÿœáÿœáÿœáÿœáÿVÔâT³‹q×µzãÃzáÄáÖ‡åÚ~æÉnѲT³‹VÔâœáÿœáÿœáÿœáÿœáÿœáÿœáÿ„„:1+ÿÿÿÿÿÿ”B9¥MHÎccÎccÆZZÆZZïççïçççççççççÞÞçÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞçÞÞçÖÖÖÖÖÖ”))”))µJJµJJ­BBa/#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿûüüúûûÖ²ŠÖ°…Õ­€Ô©yÓ¤qÓ jÑœbÑ—[Ñ”UÐ’Q÷øùö÷øÿÿÿ”””ÿÿÿÿÿÿÿÿsbV° ”ßËÃïçÞäÔ̺¥Œ|ogVJK:2G6*.ÿÿÿÿÿÿÿÿÿÿmYL° ”ßËÃäÔ̽­ Œ|odOGK:2G6*>.".ÿÿÿÿÿÿÿÿÿÿ…D ÃgÄjÅiÃgÃe¹¥óðìòîëòîëðìçÕÍÃÍ´ͽ­Í½­Í½­Í´ÓÅ·Ôɼì”ÈbÉcËcÌcÈcÂa¸[v<ÿÿÿÿÿÿÿÿk)ž< ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤D ¤Dž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>Up”º«ðüŸã÷F´è8©Ð]>Uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(22(22(22œœÎÿÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ༖õãÐþõéþõéþõéþõéþõéþõéþõéþõéþõéùØ·÷Î¥÷Î¥ëÄŸÅ¥Š×³‰Å¥ŠÐ¤wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœœæÿœæÿœæÿœæÿœæÿœæÿœæÿœæÿœæÿTµ‹Tµ‹Tµ‹Tµ‹yãÁ„äÔ~ÝÍqÙ¶Tµ‹Tµ‹Tµ‹œæÿœæÿœæÿœæÿœæÿœæÿcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MHÎccÎccÆZZÆZZïççïçççççççççÞÞçÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞçÞÞçÖÖÖÖÖÖ”))”))µJJµJJ­BBa/#ÿÿÿÿÿÿÿÿÿÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§ÿÿÿûûüûüüûûüúûûúúûúúûúúúùùûøùúøùúøùù÷ùùøøù÷øùÿÿÿ•••ÿÿÿÿÿÿÿÿsbV§—âÑÅíáÜäÔ̽­ Œ|o`SGK:2G6*.ÿÿÿÿÿÿÿÿÿÿsbV§—âÑÅäÔ̺¥Œ|o`SGK:2G6*>.".ÿÿÿÿÿÿÿÿ„C ¨\Æl Æl Åk Ãj ž{WïëæòîëòîëÕÍíˆbÈg Éh Éi Éi Éh Ég ÈeÈcÇbÇbÈcÌcÍcÇcÆc½^ Tr;ÿÿÿÿÿÿk)ž<#©G#©G#©G#©G#©G#©G#©G#©G#©G#©G#©G#©G#©G#©G#©G#©Gž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UG|£¢ëôƒãþGÊÿ>­Ò]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎΜœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçɪþõéþõéþõéþõéþõéþõéþõéþõéþõéùØ·÷Î¥÷Î¥ëÄŸÅ¥Šã½ŠçÀ¹œ’Å¥ŠÐ¤wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâž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÷Î¥âž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÷Î¥÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžVâžVâžVâžVâžVâžVâžVâžVâžVâžVâžV÷Î¥÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿVØâT·‹uã¼iÒ©T·‹œêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿœêÿcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MHÎccÎccÆccÆccÆccÆccÎssÎssÎssÎssÆkkÆkkÆccÆccÆkkÆkkÆccÆccÆccÆccÎccÎcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿîèáíæÝíãØëàÔêÝÎêÝΨ¨¨ÿÿÿüüüüûüÖ²ŠÕ°†Õ­€Ô©yÓ¤rÒ jÑœbј[ЕUÐ’Qøùùøøøÿÿÿ–––ÿÿÿÿÿÿÿÿsbV§—âÑÅíáÜäÔ̽­ Œ|odOGK:2G6*. ÿÿÿÿÿÿÿÿÿÿmYL§—âÑÅäÔ̽­ Œ|odOGK:2G6*>.".ÿÿÿÿÿÿÿÿ…E ª_ÇpÆrÅpÅn¹¥òîëòîëßÙÓ«…[h5ÈiÈiÈiÉh Éh Èg ÈeÇcÆaÇbÈcÌcÍcÇcÈcÁ_¡Ut;ÿÿÿÿÿÿk)ž<&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®J&®Jž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U>t¦ôû…åþIÍÿA«Ñ]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ὘þôçþõéþõéþõéþõéþõéþõéþõéùØ·÷Î¥÷Î¥ëÄŸÅ¥Šã½ŠöÌ‹óÉ‹º–¹œ’Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿVÚâT¹‹nß²T¹‹VÚâœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœœœœ:1+ÿÿÿÿÿÿ”B9¥MHÂ`_Â`_¾`_¾`_¾`_¾`_ÂhgÂhgÂhgÂhg¾dc¾dc¾`_¾`_¾dc¾dc¾`_¾`_¾`_¾`_Â`_Â`_”B9a/#ÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©©©ÿÿÿüýýüüüüûüûûûûûûûûüûûûúúûúúúùúúùùúùùúøùùøùùÿÿÿ———ÿÿÿÿÿÿÿÿsbV§—âÑÅíáÜäÔ̽­ Œ|ogVJK:2G6*.2">."]MDC2&2"sbV§—âÑÅäÔ̽­ Œ|ogVJK:2G6*>.".ÿÿÿÿÿÿÿÿ…G«aËtÈtÇrÇrÉ¿´òîëõòïɶ¢¢l9ÈlÈkÇjÇiÈiÈh Éh Èf ÇdÇbÇbÈbËcÌcÈcÈcÀ`¢Vv<ÿÿÿÿÿÿk)ž<)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³N)³Nž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UCz£§õüâÿLÎÿC«Ñ]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÄ£þôçþõéþõéþõéþõéþõéùØ·÷Î¥÷Î¥÷ΥťŠã½ŠöÌŠöÌŠêÃ¶š—´™—¹œ’Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿ(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿ(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿ(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿ(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿT»‹cÔ¡dÕ¤T»‹œñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿ„„œœ:1+ÿÿÿÿÿÿ”B9¥MH¶XW¶XW¾lk¾lkÆ|{Æ|{Æ{Æ{ƀƀƀƀÆ|{Æ|{Æ|{Æ|{ƀƀƅ€Æ…€Â`_Â`_”B9a/#ÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿÿÿÿÿÿÿÿÿîèáíæÝìãØëàÓêÝÎêÝΪªªÿÿÿýýýýüüÖ²ŠÖ¯†Õ¬€Ô©yÔ¤rÒ jÒ›bÑ—[ЕUÐ’Qøùúùùúÿÿÿ˜˜˜ÿÿÿÿÿÿÿÿsbVßËÃòêæÿÿÿòêæäÔÌÀ°§§—~v…yl.6&G6*nbG6*6&sbVßËÃòêæòêæäÔÌÀ°§§—~v‚qive]. ÿÿÿÿÿÿÿÿ†I¬dÎ{)Íz'Ìw#Êv ÚÓÌøõñõò>€ÉpÉpÈnÇmÇkÈjÈj«r¹¥¤sCÈdÇcÈcÈcÇcËcÉcÂ`¡Uv<ÿÿÿÿÿÿk)ž<,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Q,¸Qž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UF©§õü€âÿMÑÿE¨Ï]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÄ£þôçþõéþõéþõéùØ·÷Î¥÷Î¥÷Î¥÷Υ߸†öÉ‚öÈ€öÉ弆µ™™´™˜µ™šº”Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎvvvvvvcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎvvvvvvvvvvcÎÎcÎÎcÎÎcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎvvvvvvvcÎÎcÎÎcÎÎcÎÎcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿœœœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿVÝâT¼‹^Ô›T¼‹VÝâœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿcÎÎcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MH¶XW¶XW¾lk¾lkÆ|{Æ|{Æ{Æ{ƀƀƀƀÆ|{Æ|{Æ|{Æ|{ƀƀƅ€Æ…€Â`_Â`_”B9a/#ÿÿÿÿÿÿÿÿÿÿ£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿÿÿýýýüýýýýýüüüüüüûüüûûûúûûûûûúûûúúúúùúùúúùùùÿÿÿ™™™ÿÿÿÿÿÿÿÿŒ|osbVmYLgVJ[J>O:2G6*C.":*6&2"6"6&. G6*sbVsbVsbVdOG[J>O>2G6*C2&:*6&:*ve]ÿÿÿÿÿÿÿÿ‡K®h$Ò„8Ï2Î|.Î|,ÙÐÅ÷ôñõòïì”Ët ÊtÉrÈpÇmÈlÉl¯”xòîë씤sCÈeÈdÈcÇcÊcÉcÀ_¡Uv<ÿÿÿÿÿÿk)žULˆ°§ôü}àÿPÒÿI¨Î]>Uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(22(22(22œœÎÿÿœèÿœèÿœèÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22cÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÄ£þôçþõéùØ·÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥Ô°…öÈöÈõÆyì¿zºŸ ·œ£·¤·¤¾¢¤Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœÐÿœÐÿvÿÿÿÿÿvœÐÿœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿvÿÿÿÿÿÿÿÿvœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœÐÿœÐÿœÐÿvvvœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœÐÿœÐÿvÿÿÿÿÿvœÐÿœÐÿœÐÿœÐÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿœœœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿVßâVßâT¾‹T¾‹T¾‹T¾‹Vßâœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÕ•›ö÷øö÷÷÷øøøøøøùùøùùøùúøúùúúúúúûúûûûüûûüüûüüûýýüüýüýýðåæÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿîèàíæÝìãØëàÓêÝÎêÝά¬¬ÿÿÿþýþýýýÖ²ŠÖ°†Õ¬€Ô©zÓ¤rÒ júûüÿÿÿõõõâââÙÙÙâââõõõšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYL° ”̼³íáÜçÛÎÓ¾¶° ”~vsbV[J>.Œ|oÕŸêÞÖÓ¾¶§—nbdOGK:.K:2. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡L¯l+ÖJÕ‹GÔˆCÓ†<ɶ¢õòïòîëÕÍë…[Ìy'Ëw$Êu!ÊrÊpËp±—{õòïõòïɶ¢¥wJÉeÉdÉdÉcÇc¿_ Uv<ÿÿÿÿÿÿk)ž<2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁW2ÁWž<k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UOŽ´¦óý~áÿRÖÿK¨Ì]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎΜœÎÿÿœðÿœðÿœðÿœðÿœœœœœœœœœœ(22œðÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÄ£ùØ·÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥Ó¯„öÈõÆyõÄsîÀx¼Ÿ ·¤·¤¹Ÿ­¾£¹À¤©Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿœÖÿvÿvvvvÿvœÖÿœÖÿœÖÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿvvÿvvvvvvvœÖÿœÖÿœÖÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿœÖÿœÖÿvÿvœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿœÖÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœÖÿœÖÿvÿvvvvvœÖÿœÖÿœÖÿœÖÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿ}|œøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿVßâT¾‹T¾‹T¾‹T¾‹VßâœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœœcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÕ•›êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿÿÿþýþýþýýýýüýýýýýüýýüüüüüüûûüÿÿÿÀÀÀ¢¢¢›››•••µµµ›››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿsbV§—Ó¾¶íáÜçÛÎÓ¾¶° ”~vsbV[J>.Œ|oÕŸêÞÖ̼³§—nb]MDK:2O:..ÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆN°p1ÚšZÚ—XדRבN³’qïëæòîëòîëÕÍó’q£|SÍz*Ìw%Ìt!Ìs´š~õòïøõñõòïIJž®zIÉdÉcÈcÇc½_ Uv<ÿÿÿÿÿÿk)ž<5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[5Ç[ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UV–»¦òþ~àÿT×ÿO¨Í]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÐÿœÐÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ«{÷Î¥÷Î¥÷Î¥÷Î¥÷Î¥ôÌ£Þ¸†õÆyõÄsõÄs康¤·¤¹Ÿ­º¡²¿¤»¿¤»À¤©Å¥ŠÎ¡sÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿvÿvœÞÿœÞÿvÿvœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿvÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿ}|œùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœœcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÕ•›ö÷÷÷÷÷÷÷÷÷øøøùøøøùøùùùùúùúúùúúùúûúûûúûûûûüûüüûüüüýüðåæÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿîèàíæÝìãØëàÓêÝÎêÝέ­­ÿÿÿýýþýþýýþýüýþüýýüýýüüýüüüüûüÿÿÿ«««ÿÿÿúúúóóó‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYL° ”̼³íáÜçÛÎ̼³° ”•xsbV[J>.‚qißËÃçÛÎ̼³° ”nb]MDO:.K:2.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰O³v9Þ¦kâ«pà¦kÚœb¯QÆ´¡òîëõòïøõñõòïÚÓÌÍ´Í´ÓǺÔɼ¶žƒøõñõòïõòïòîëIJž®zIÉbÉcÇc½_ Uv<ÿÿÿÿÿÿk)ž<8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^8Ë^ž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>UXœÃ¦ñýáÿWÙÿR¨Ì]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÖÿœÖÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ¦xÖ³“׳“ổ۶”Ï­Ö¯~ðÀsï¿sïÀsä¹}·¤¹Ÿ­º ±º ±¾¤º¿¤º¿¤·À¤©Å¥ŠÎ¡sÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿvÿvvvÿvœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿœÞÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿvÿvœÞÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœÞÿœÞÿvÿvœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿœÞÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿ}|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎΜœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÕ•›êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ§§§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­ÿÿÿþþþýýþþýþýýýýýýýýýüüýüüýüüüÿÿÿ­­­ÿÿÿúúúšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsbV§—̼³êÞÖçÛÎÓ¾¶³¢šŒ|ove][J>.Œ|oÕŸêÞÖ̼³§—nb]MDK:2K:..ÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆN²u9á¬vç³ã¯yߦpߤk²†[ͽ­õòïøõñõòïóðíõòïõòïøõñøõñõòïõòïõòïòîëòîëòîëÆ´¡¯QÈbÇb¼]ŸTs;ÿÿÿÿÿÿk)ž<:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ða:Ðaž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U[ŸÄ¦ñÿáÿXÚÿT¥È]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœÞÿœÞÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lȧ…òÃtë¾wè¼xòÂsì¼sì¼sèºsß´s½¢«»¡³º¡²º¡²¿£Ë«–Ä¥ŒÍ­šÎ­É¨ŒØ¨vÿÿÿÿÿÿœœÎÿÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿœèÿœèÿvÿÿÿÿvœèÿœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿœèÿœèÿœèÿœèÿvÿvœèÿœèÿœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿvÿvœèÿœèÿœèÿvÿvœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿœèÿœèÿvÿvœèÿœèÿœèÿœèÿœèÿœèÿœèÿœèÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿ}|œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœcÎΜêÿœêÿœœ:1+ÿÿÿÿÿÿ”B9¥MHÎccÕ‘—öö÷ö÷÷ö÷÷öø÷÷øø÷ùøøøùøùùùùùùúúùúúúûûúûûúûûûüüûüüüüüðååÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿÿÿÿÿÿÿÿÿîèáíæÝìãØëàÔëÝÎëÝή®®ÿÿÿþþþþýþþýþþþþýþþýýýýýýýýýýýüêêê®®®ÿÿÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYLÛÏÃíáÜúööòêæíáÜÛÏÃÀ°§³¢š‘„.ÛÏÃíáÜøôïíáÜÛÏú¥‘„~v~v.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡L²t9á®{é½éºæ³€å±zä­s·‹`ì”ÚÓÌñìèòîëõòïøõñøõñõòïõòïòîëõòïõòïøõñõòïʳšÁ•lÈaÅa¸\žTr:ÿÿÿÿÿÿk)ž<=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôd=Ôdž<k)k)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]>U^¤Ì¥íÿ›èÿŸÄÎPqQ]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœèÿœèÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lÓ®õÄsõÄsñÁsì¼sèºsß´sÙ°‚¿¤»¿¤»¾¤ºÃ¨·Î­”ôÌ£óË£÷Î¥÷Î¥÷ΥبvÿÿÿÿÿÿœœÎÿÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœðÿœðÿœðÿœðÿvÿvvvÿvœðÿœðÿœðÿœðÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿvÿvœðÿœðÿœðÿœðÿœðÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœðÿœðÿvvvœðÿœðÿœðÿœðÿvÿvœðÿœðÿœðÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœðÿœðÿœðÿœðÿvÿvœðÿœðÿœðÿœðÿœðÿœðÿœðÿœðÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœîÿœœ:1+ÿÿÿÿÿÿ”B9±SNÎccÕ‘—êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÏÏϬ¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽxmYLgVJ[J>O>2K:.G2&>.":*6".O:.]MDsbVaM@O>2G2&>."2"6"sf]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹S#ܨw鿘íÄžë¾éº‡èµç±yÁ•lÅ›s£„ʳšÔÁ­ÔÁ­ÔÁ­Í½­Ä¯˜õòïõòïøõñõòïÓ»¢Å›sËbÈbÀ_´X w<ÿÿÿÿÿÿÿÿk)žUY¥ÎµÕÜËÙÇ?o7o|s]>UÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœðÿœðÿœðÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22cÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾–pÓ®õÄsñÁsèºsß´sß´s×°„¿¤»¿¤»Ä©¼Ç¬·È¨ŽôÌ£÷Î¥÷Î¥÷Î¥òӵЖ[ÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvÿvœ÷ÿœ÷ÿvÿvœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿvvvvvvvÿvvœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvÿvœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvÿvœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœñÿœœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÕ•›õ÷öõ÷öö÷÷ö÷÷÷ø÷÷øø÷ùùøøù÷ùùøùùùúúùúúúúûúûúûûûûüûûüüðååÓxwÎkk”B9a/#ÿÿÿÿÿÿÿÿÿÿªªªÿÿÿÿÿÿÿÿÿîèáíæÝìãØëàÓõîçõîçÏÏÏ®®®®®®­­­­­­¬¬¬¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsbVíáÜäÔÌÓ¾¶° ”~vsbVG6*.[J>ßËÃêÞÖ̼³§—nb]MD6"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡L²w?漕ðÌ©ðΦïÈžê¿è¹…æ±xã¬pÞ¤gÛ\Ù•R׎GÕˆ=Óƒ6ɶ¢õòïøõñøôïÔÁ­É¢|ÈcÈcÆb»]Ss:ÿÿÿÿÿÿÿÿk)žUZ„S5h$×ÞÖÑÑÓ‹Ž–]>UÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœœœœœœœœœœ(22œ÷ÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lÓ®î¿sß´sß´sß´sܲ{Á¥¶Ä©¼È­¼È­¼Ò°š÷Î¥÷Î¥÷Î¥òӵЖYÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvÿvvvvÿvœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿvÿÿÿÿÿÿÿÿvœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvvvœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿvÿvœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿcÎÎ(22ÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœôÿœœ:1+ÿÿÿÿÿÿ”B9¥MHÎkkÕ•›êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÓxwÎkk”B9a/#ÿÿÿÿÿÿÿÿÿÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYLúööøôïíáÜÛÏÃ̼³ª‘ve]C2*§—òêæøôïíáÜÛÏÃÀ°§‘„6"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠQ#Þ®„îË©ôÖµòÒ®íÈžê¿‘ç¶â­tÞ¥hÛœ[Ø”P׎EÕ‰=Ô…7λ§øõñøõðÔÁ­Í©‡ÇfÇdÈcÁ`¶Y s;ÿÿÿÿÿÿÿÿÿÿk)žU”¥˜××Ùäåæ^_®CC®]>UÿÿÿÿÿÿÿÿÿÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”l̩լs×®s×®sѪ}Å©·É­¼È­¼È­¼Ñ°™÷Î¥÷Î¥òӵЖYÿÿÿÿÿÿÿÿÿÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿÎÿÿÎÿÿÎÿÿÎÿÿœÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœùÿœùÿœùÿœùÿvÿÿÿÿÿvœÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœùÿœùÿvvvvvvvvvvÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿÎÿÿÎÿÿÎÿÿÎÿÿœÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿœùÿœùÿœùÿœùÿvÿvÎÿÿÎÿÿÎÿÿÎÿÿœÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿœ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:1+ÿÿÿÿÿÿÿÿ”B9±SNÎccÕ‘—õ÷öööööö÷ö÷÷ö÷÷öøø÷øø÷øù÷ùùøùùøúúùúúùúúúúúúûúúüûúüûðååÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿÿÿÿÿÿÿÿÿîèáíæÝíãÙëàÓõîæôìäÿÿÿÿÿÿõõõâââÙÙÙâââõõõšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽxmYLsbVdOGU@4G6*C."‘†ÿÿ›‡mYLsbV[J>K6*>."6"sf]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡K³yC羚ó×»ôÛ¾òÓ°îË¢é¾ä³~à§lÛœ\Ø“N×DÖ‰<Ö‡9ÔÁ­ññïÙǴЫŠÊl ÈiÉdÆb»] Tp:ÿÿÿÿÿÿÿÿÿÿk)žUµºÌ‰ŠÙ\]ËAA¯]>UÿÿÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿœÿÿcÎÎ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lǥѩsÑ©sѬ…д½Ñµ½Ï´½Ê­©Å¥ŠóË£òӵЖXÿÿÿÿÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿvvvvvvœœœœœœœœœœœœÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿœœÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿvvvœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿâžV÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿœøÿcÎΜœœœœœœœœœœœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿ”B9±SNÎccÕ‘—êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÏtsÆcc”B9a/#ÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿÿÿþýþýþýýýýüýýýýýüýýüüüüüüûûüÿÿÿÀÀÀ¢¢¢›››•••µµµ›››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsbVÔÈİ ”>."ÿÿÿÿÿÿsbVßËð ”>."ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹S$·~JêÆ¥óÙ¼õÚºñÔ°ëÆè¼Žã®zߣgÚ—VÙ‘KØDÙEÔÁ­Û̺׷šÏvÊqÉk ÇeÀ_£Vz=ÿÿÿÿÿÿÿÿÿÿÿÿk)žUXW©fgÕ99m]>UÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœœœœœœœœœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lǥѩsѬ€Ñµ»Ò¶½Ì¯ªÅ¥ŠëÄŸòӵЖXÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿœœcÎÎcÎÎcÎÎcÎÎcÎÎcÎÎcÎΜœÿÿâžV÷Î¥âžV÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿœùÿcÎΜœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”B9¥MHÎkkÕ•›õööõööõ÷ööö÷ö÷÷÷÷÷÷øø÷øøøøùøùùøùùøùùùùúùúúùûúúûûúüûðäåÓxwÎkk”B9a/#ÿÿÿÿÿÿÿÿÿÿ­­­ÿÿÿýýþýþýýþýüýþüýýüýýüüýüüüüûüÿÿÿ«««ÿÿÿúúúóóó‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmYLíáÜÔÈÄ>."ÿÿÿÿÿÿmYLßÛ×ÔÈÄ>."ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠP!·LéßòÔ¸ôÙÀñÖ¶îͩ鿘綊ãªuâ¨nã£câ¡bßž_ÝšWÖAÑ€,ÌuÆl¾c £Wx;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)žUÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼”lǥѪvÑ´·Ì¯ªÅ¥ŠëÄŸòӵЖXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22ÿÿâžVâžVâžVâžVâžVâžVâžVâžVâžVâžVâžV÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22ÿÿâžVâžVâžVâžVâžVâžVâžVâžVâžVâžVâžV÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22ÿÿâžVâžVâžVâžVâžVâžVâžVâžVâžVâžVâžV÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22ÿÿâžVâžVâžVâžVâžVâžVâžVâžVâžVâžVâžV÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿœœ÷÷÷ÎÿÿÎÿÿœÿÿœÿÿœœ(22ÿÿâžVâžVâžVâžVâžVâžVâžVâžVâžVâžVâžV÷Î¥÷Î¥÷Î¥÷Î¥âžVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœÿÿÿœÿÿœÿÿœÿÿœÿÿœÿÿœÿÿœÿÿœÿÿœÿÿcÎΜœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”B9¥MHÎkkÕ•›êäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãêäãçÙÙÓxwÎkk”B9a/#ÿÿÿÿÿÿÿÿÿÿ­­­ÿÿÿþþþýýþþýþýýýýýýýýýüüýüüýüüüÿÿÿ­­­ÿÿÿúúúšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽxmYLsbV~qhÿÿÿÿÿÿŽxmYLsbV~qhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹S%µ{Fá´éƧïÒ´ñÔµîË«ëÞ纎洂ç®våªnà¡bܘUÖŒBÏ~/Çr¾f£X{>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿk)ž #include "utils.h" // OpenUrlInDefaultBrowser #define mbtitle "NSIS Update" static LPSTR InetGetErrorStringAllocA(DWORD ec) { LPSTR buf; DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS; if (FormatMessageA(flags|FORMAT_MESSAGE_FROM_SYSTEM, 0, ec, 0, (LPSTR) &buf, 0, 0)) return buf; HMODULE hMod = LoadSysLibrary("WinInet"); if (hMod && FormatMessageA(flags|FORMAT_MESSAGE_FROM_HMODULE, hMod, ec, 0, (LPSTR) &buf, 0, 0)) return buf; #if 0 // We are not using WinHttp* functions hMod = LoadSysLibrary("WinHTTP"); if (hMod && FormatMessageA(flags|FORMAT_MESSAGE_FROM_HMODULE, hMod, ec, 0, (LPSTR) &buf, 0, 0)) return buf; #endif return NULL; } static void InetWorkOnline(HINTERNET hInet) { //msdn.microsoft.com/en-us/library/Aa768170#Supporting Offline Browsing in Applications and Components DWORD cbio = sizeof(DWORD), op32; if (InternetQueryOption(hInet, INTERNET_OPTION_CONNECTED_STATE, &op32, &cbio)) { if (INTERNET_STATE_DISCONNECTED_BY_USER & op32) { INTERNET_CONNECTED_INFO ci = { INTERNET_STATE_CONNECTED, 0 }; InternetSetOption(hInet, INTERNET_OPTION_CONNECTED_STATE, &ci, sizeof(ci)); } } } static DWORD InetSynchronousReadFile(HINTERNET hConn, void*Buffer, DWORD cbBuffer, DWORD*pcbReceived) { *pcbReceived = 0; for (DWORD cbio;;) { if (!cbBuffer) break; if (!InternetReadFile(hConn, Buffer, cbBuffer, &cbio)) return GetLastError(); if (!cbio) break; // EOF, we are done. Buffer = ((char*)Buffer) + cbio, cbBuffer -= cbio; (*pcbReceived) += cbio; } return ERROR_SUCCESS; } static DWORD CALLBACK UpdateCheckWebrequestThread(LPVOID ThreadParam) { char buf[300]; wsprintfA(buf, "%s%s", NSIS_UC_URL, g_sdata.brandingv); InternetAttemptConnect(0); UINT mbicon = MB_ICONINFORMATION; LPCSTR msg = NULL; HINTERNET hInet = InternetOpenA("MakeNSISw (WinInet)", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); DWORD gle = GetLastError(); if (hInet) { InetWorkOnline(hInet); // Note: InternetOpenUrlW does not handle the http headers in the same way, be careful if you stop forcing the A version static const CHAR httpheaders[] = "Accept:*/*\r\n"; DWORD connflags = INTERNET_FLAG_NO_UI|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS; connflags |= INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_NO_COOKIES; connflags |= INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_RELOAD; //if ((32|buf[4]) == 's') connflags |= INTERNET_FLAG_SECURE; HINTERNET hConn = InternetOpenUrlA(hInet, buf, httpheaders, -1, connflags, 0); gle = GetLastError(); if (hConn) { char response[30+1]; DWORD cbRecv; gle = InetSynchronousReadFile(hConn, response, sizeof(response)-1, &cbRecv); if (!gle) { response[cbRecv] = '\0'; switch(response[0]) { case '0': msg = "There is no update available for NSIS at this time."; break; case '1': case '2': if (cbRecv > 2 && '|' == response[1]) { const char *reltypestr = '1' == response[0] ? "it" : "this preview release"; wsprintfA(buf, "NSIS %.50s is now available. Would you like to download %s now?", response+2, reltypestr); mbicon = MB_ICONQUESTION, msg = buf; break; } // fall through default: gle = ERROR_INVALID_DATA; } } InternetCloseHandle(hConn); } InternetCloseHandle(hInet); } HWND hwndOwner = (HWND) ThreadParam; // Hopefully we don't end up with a race where our main window has been closed // and the HWND has been reused just as this thread completes its work if (IsWindow(hwndOwner)) { if (!msg) { LPSTR dynbuf = InetGetErrorStringAllocA(gle); wsprintfA(buf, "There was a problem checking for updates, please try again later.\n\nError: %u %.200s", gle, dynbuf ? dynbuf : ""); mbicon = MB_ICONSTOP, msg = buf; LocalFree(dynbuf); } UINT mbtype = MB_ICONQUESTION == mbicon ? MB_YESNO : MB_OK; int mbret = MessageBoxA(hwndOwner, msg, mbtitle, mbtype|mbicon); if (mbret == IDYES && mbtype == MB_YESNO) { OpenUrlInDefaultBrowser(hwndOwner, NSIS_DL_URL); } EnableMenuItem(g_sdata.menu, IDM_NSISUPDATE, MF_ENABLED); } return 0; } void CheckForUpdate() { if (strstr(g_sdata.brandingv, "cvs")) { MessageBoxA(g_sdata.hwnd, "Cannot check for new version of nightly builds. To update, download a new nightly build.", mbtitle, MB_OK|MB_ICONSTOP); return; } EnableMenuItem(g_sdata.menu, IDM_NSISUPDATE, MF_GRAYED); DWORD tid; CloseHandle(CreateThread(NULL, 0, UpdateCheckWebrequestThread, (LPVOID) g_sdata.hwnd, 0, &tid)); } nsis-3.11/Contrib/Makensisw/update.h000077500000000000000000000001371477201124000174100ustar00rootroot00000000000000void CheckForUpdate(); /* Check for newer version on server and show a message to the user. */ nsis-3.11/Contrib/Makensisw/utils.cpp000077500000000000000000001153641477201124000176320ustar00rootroot00000000000000/* Copyright (c) 2002 Robert Rainwater Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/20/2007 */ #include "makensisw.h" #include "resource.h" #include "toolbar.h" #include #ifndef MONITOR_DEFAULTTONEAREST #define MONITOR_DEFAULTTONEAREST 2 WINUSERAPI HMONITOR WINAPI MonitorFromWindow(HWND hwnd, DWORD dwFlags); #endif #ifndef GRADIENT_FILL_RECT_H #define GRADIENT_FILL_RECT_H 0 #if !defined(_WIN32_WINNT) || _WIN32_WINNT-0 < 0x0410 WINGDIAPI BOOL WINAPI GradientFill(HDC,TRIVERTEX*,ULONG,PVOID,ULONG,ULONG); #endif #endif NTOOLTIP g_tip; LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam); TCHAR g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { _T(""), _T(""), _T(""), _T(""), _T("") }; extern NSCRIPTDATA g_sdata; extern const TCHAR *compressor_names[]; void MemSafeFree(void*mem) { if (mem) GlobalFree(mem); } void*MemAllocZI(SIZE_T cb) { return GlobalAlloc(GPTR, cb); } HMODULE LoadSysLibrary(LPCSTR Mod) { TCHAR buf[MAX_PATH+20], *path; UINT dirmax = MAX_PATH, cch; if ((cch = GetSystemDirectory(buf, dirmax)) >= dirmax) cch = 0; wsprintf(buf + cch, _T("\\%hs.dll"), Mod); // Note: We always append ".dll" path = buf + !cch; // Full path or just the filename return LoadLibrary(path); } #ifdef DECLSPEC_NOINLINE DECLSPEC_NOINLINE #endif FARPROC GetSysProcAddr(LPCSTR Mod, LPCSTR FuncName) { return GetProcAddress(LoadSysLibrary(Mod), FuncName); } static bool WriteFile(HANDLE hFile, const void*pData, DWORD cb) { DWORD cbio; return WriteFile(hFile, pData, cb, &cbio, 0) && cb == cbio; } bool WriteUTF16LEBOM(HANDLE hFile) { static const unsigned char u16lb[] = {0xFF,0xFE}; return WriteFile(hFile, u16lb, sizeof(u16lb)); } BOOL InitCCExHelper(UINT icc) { INITCOMMONCONTROLSEX icx = { sizeof(icx), icc }; BOOL suppw95 = SupportsW95(); FARPROC icce = suppw95 ? GetSysProcAddr("COMCTL32", "InitCommonControlsEx") : (FARPROC) InitCommonControlsEx; return (!suppw95 || icce) && ((BOOL(WINAPI*)(const INITCOMMONCONTROLSEX*))icce)(&icx); } UINT GetScreenBPP(HWND hWnd) { HDC hDc = GetDC(hWnd); UINT bpp = GetDeviceCaps(hDc, BITSPIXEL) * GetDeviceCaps(hDc, PLANES); // TODO: COLORRES if RASTERCAPS&RC_PALETTE? ReleaseDC(hWnd, hDc); return bpp; } int SetArgv(const TCHAR *cmdLine, TCHAR ***argv) { const TCHAR *p; TCHAR *arg, *argSpace; int size, argSpaceSize, inquote, copy, slashes; size = 2; for (p = cmdLine; *p != _T('\0'); p++) { if ((*p == _T(' ')) || (*p == _T('\t'))) { size++; while ((*p == _T(' ')) || (*p == _T('\t'))) { p++; } if (*p == _T('\0')) { break; } } } argSpaceSize = (size+1) * sizeof(TCHAR *) + (lstrlen(cmdLine) + 1) * sizeof(TCHAR); argSpace = (TCHAR *) MemAlloc(argSpaceSize); *argv = (TCHAR **) argSpace; if (!argSpace) return 0; argSpace = (TCHAR *) ((*argv)+size); size--; p = cmdLine; int argc; for (argc = 0; argc < size; argc++) { (*argv)[argc] = arg = argSpace; while ((*p == _T(' ')) || (*p == _T('\t'))) { p++; } if (*p == _T('\0')) { break; } inquote = 0; slashes = 0; while (1) { copy = 1; while (*p == _T('\\')) { slashes++; p++; } if (*p == _T('"')) { if ((slashes & 1) == 0) { copy = 0; if ((inquote) && (p[1] == _T('"'))) { p++; copy = 1; } else { inquote = !inquote; } } slashes >>= 1; } while (slashes) { *arg = _T('\\'); arg++; slashes--; } if ((*p == _T('\0')) || (!inquote && ((*p == _T(' ')) || (*p == _T('\t'))))) { break; } if (copy != 0) { *arg = *p; arg++; } p++; } *arg = _T('\0'); argSpace = arg + 1; } (*argv)[argc] = NULL; return argc; } void SetTitle(HWND hwnd,const TCHAR *substr) { TCHAR title[64]; wsprintf(title,substr ? _T("MakeNSISW - %s") : _T("MakeNSISW"),substr); SetWindowText(hwnd,title); } typedef struct { LPCSTR SoundName; int MBFallback; } PLAYAPPSOUNDDATA; static DWORD CALLBACK PlayAppSoundProc(LPVOID ThreadParam) { PLAYAPPSOUNDDATA *p = (PLAYAPPSOUNDDATA*) ThreadParam; BOOL succ = PlaySoundA(p->SoundName, NULL, (SND_APPLICATION|SND_ALIAS|SND_NODEFAULT) & ~SND_ASYNC); // Cannot use SND_ASYNC because we need to detect if the sound played if (!succ && p->MBFallback >= 0) succ = MessageBeep(p->MBFallback); MemFree(p); return succ; } void PlayAppSoundAsync(LPCSTR SoundName, int MBFallback) { DWORD tid; PLAYAPPSOUNDDATA *p = (PLAYAPPSOUNDDATA*) MemAlloc(sizeof(PLAYAPPSOUNDDATA)); if (p) { p->SoundName = SoundName, p->MBFallback = MBFallback; // Note: The string must be valid until the sound has started because we don't copy it HANDLE hThread = CreateThread(NULL, 0, PlayAppSoundProc, p, 0, SupportsW9X() ? &tid : 0); if (hThread) CloseHandle(hThread); else PlayAppSoundProc(p); } } void CopyToClipboard(HWND hwnd) { if (!hwnd || !OpenClipboard(hwnd)) return; LRESULT len = SendMessage(g_sdata.logwnd, WM_GETTEXTLENGTH, 0, 0); HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE, (++len)*sizeof(TCHAR)); if (!mem) { CloseClipboard(); return; } TCHAR *txt = (TCHAR *)GlobalLock(mem); if (!txt) { CloseClipboard(); return; } EmptyClipboard(); txt[0] = 0; SendMessage(g_sdata.logwnd, WM_GETTEXT, (WPARAM)(len), (LPARAM)txt); GlobalUnlock(mem); #ifdef _UNICODE SetClipboardData(CF_UNICODETEXT, mem); #else SetClipboardData(CF_TEXT, mem); #endif CloseClipboard(); } #include #if defined(MSFTEDIT_CLASS) #include #define RE_HAS_TOM #define IID_ITextDocument NSIS_IID_ITextDocument static const GUID IID_ITextDocument = { 0x8cc497c0, 0xa1df, 0x11ce, { 0x80,0x98,0x0,0xaa,0x0,0x47,0xbe,0x5d } }; #endif void ReleaseLogWindow() { #ifdef RE_HAS_TOM if (g_sdata.pLogTextDoc) ((IUnknown*)g_sdata.pLogTextDoc)->Release(); #endif } void InitializeLogWindow() { HWND hRE = g_sdata.logwnd; #ifdef RE_HAS_TOM IUnknown *pTD = 0, *pREO; if (SendMessage(hRE, EM_GETOLEINTERFACE, 0, (LPARAM)&pREO) && pREO) { if (FAILED(pREO->QueryInterface(IID_ITextDocument, (void**) &pTD))) pTD = 0; pREO->Release(); } g_sdata.pLogTextDoc = pTD; #endif SendMessage(hRE, EM_SETTEXTMODE, TM_PLAINTEXT, 0); } HRESULT RicheditFreeze(void*pITextDocument, SIZE_T Freeze) { HRESULT hr = E_NOTIMPL; #ifdef RE_HAS_TOM ITextDocument*pTD = (ITextDocument*) pITextDocument; if (pTD) { if (Freeze) hr = pTD->Freeze(0); else hr = pTD->Unfreeze(0); } #endif return hr; } void SetLogColor(enum LOGCOLOR lc) { enum { em_seteditstyle = (WM_USER + 204), ses_extendbackcolor = 4 }; HWND hEd = g_sdata.logwnd; bool sysclr = lc >= LC_SYSCOLOR || !ReadRegSettingDW(REGCOLORIZE, true); static const COLORREF clrs[] = { RGB(0, 50, 0), RGB(210, 255, 210), RGB(50, 30, 0), RGB(255, 220, 190), RGB(50, 0, 0), RGB(255, 210, 210) }; CHARFORMAT cf; cf.cbSize = sizeof(cf), cf.dwMask = CFM_COLOR; cf.dwEffects = sysclr ? CFE_AUTOCOLOR : 0; cf.crTextColor = sysclr ? RGB(0, 0, 0) : clrs[(lc * 2) + 0]; SendMessage(hEd, em_seteditstyle, sysclr ? 0 : ses_extendbackcolor, ses_extendbackcolor); SendMessage(hEd, EM_SETCHARFORMAT, 0, (LPARAM) &cf); SendMessage(hEd, EM_SETBKGNDCOLOR, sysclr, sysclr ? sysclr /*Irrelevant*/ : clrs[(lc * 2) + 1]); } void ClearLog() { SetWindowText(g_sdata.logwnd, _T("")); SendMessage(g_sdata.logwnd, EM_SETZOOM, g_sdata.log_zoom, 100); // Bug #1282: SetWindowText resets zoom. SetLogColor(LC_SYSCOLOR); SendMessage(g_sdata.hwnd, WM_MAKENSIS_UPDATEUISTATE, 0, 0); } void LogMessage(HWND hwnd,const TCHAR *str) { HWND hLogWin = g_sdata.logwnd; #ifdef RE_HAS_TOM HRESULT hr = (HRESULT) SendMessage(hwnd, WM_MAKENSIS_FREEZEEDITOR, 0, true); // Force COM calls to UI thread #endif SendMessage(hLogWin, EM_SETSEL, g_sdata.logLength, g_sdata.logLength); SendMessage(hLogWin, EM_REPLACESEL, 0, (LPARAM)str); SendMessage(hLogWin, EM_SCROLLCARET, 0, 0); #ifdef RE_HAS_TOM if (SUCCEEDED(hr)) SendMessage(hwnd, WM_MAKENSIS_FREEZEEDITOR, 0, false); #endif g_sdata.logLength += lstrlen(str); } void ErrorMessage(HWND hwnd,const TCHAR *str) { if (!str) return; TCHAR buf[1028]; wsprintf(buf, _T("[Error] %s\r\n"), str); LogMessage(hwnd,buf); } static void CenterOnParent(HWND hwnd, HWND hParent) { RECT r; GetWindowRect(hwnd, &r); UINT w = (r.right - r.left), h = (r.bottom - r.top), swp = SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE; if (GetWindowRect(hParent, &r)) SetWindowPos(hwnd, 0, r.left + ((r.right - r.left)/2) - (w/2), r.top + ((r.bottom - r.top)/2) - (h/2), 0, 0, swp); } void CenterOnParent(HWND hwnd) { CenterOnParent(hwnd, GetWindow(hwnd, GW_OWNER)); } void SetDialogFocus(HWND hDlg, HWND hCtl) { //blogs.msdn.com/b/oldnewthing/archive/2004/08/02/205624.aspx SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)hCtl, TRUE); } HWND GetComboEdit(HWND hCB) { /* CB_GETCOMBOBOXINFO crashes on 64-bit NT 5.x (KB947841). We are left with GetComboBoxInfo(), FindWindowEx()*2 and ChildWindowFromPoint(h,{1,1}) (docs.microsoft.com/en-us/windows/desktop/Controls/subclass-a-combo-box#). */ if (!SupportsWNT4() && !SupportsW95()) { COMBOBOXINFO cbi; cbi.cbSize = FIELD_OFFSET(COMBOBOXINFO, hwndList) + sizeof(HWND); BOOL succ = GetComboBoxInfo(hCB, &cbi); return succ ? cbi.hwndItem : (HWND)(INT_PTR) succ; } HWND hList = FindWindowEx(hCB, 0, 0, 0); return FindWindowEx(hCB, hList, 0, 0); } void EnableDisableItems(int on) { HWND hwndDlg = g_sdata.hwnd; const HWND hCloseBtn = GetDlgItem(hwndDlg, IDCANCEL); const HWND hTestBtn = GetDlgItem(hwndDlg, IDC_TEST); const HMENU hMenu = g_sdata.menu; const UINT mf = (!on ? MF_GRAYED : MF_ENABLED); const UINT nmf = (!on ? MF_ENABLED : MF_GRAYED); const bool compsuccess = !g_sdata.retcode && on; if(!on) g_sdata.focused_hwnd = GetFocus(); if(compsuccess || !on) { EnableWindow(hTestBtn, on); EnableToolBarButton(IDM_TEST, on); EnableMenuItem(hMenu, IDM_TEST, mf); } EnableMenuItem(hMenu, IDM_CANCEL, nmf); EnableWindow(hCloseBtn, false); static const PACKEDCMDID_T cmds [] = { PACKCMDID(IDM_EXIT), PACKCMDID(IDM_LOADSCRIPT), PACKCMDID(IDM_EDITSCRIPT), PACKCMDID(IDM_SAVE), PACKCMDID(IDM_CLEARLOG), PACKCMDID(IDM_GUIDGEN), PACKCMDID(IDM_COMPRESSOR), PACKCMDID(IDM_COMPRESSOR_SUBMENU), PACKCMDID(IDM_RECOMPILE), PACKCMDID(IDM_RECOMPILE_TEST) }; for (UINT i = 0; i < COUNTOF(cmds); ++i) { UINT id = UNPACKCMDID(cmds[i]); EnableMenuItem(hMenu, id, mf); if (IDM_COPYSELECTED != id && IDM_COMPRESSOR_SUBMENU != id) EnableToolBarButton(id, on); } SendMessage(hwndDlg, WM_MAKENSIS_UPDATEUISTATE, 0 ,0); EnableMenuItem(hMenu, IDM_FILE, mf); // Disable the whole File menu because of the MRU list DrawMenuBar(hwndDlg); HWND hFocus = g_sdata.focused_hwnd, hOptimal = hTestBtn; if (on && hCloseBtn == hFocus) hFocus = hOptimal; if (!IsWindowEnabled(hFocus)) hFocus = g_sdata.logwnd; SetDialogFocus(hwndDlg, hOptimal); SetDialogFocus(hwndDlg, hFocus); SetTimer(hwndDlg, TID_CONFIGURECLOSEORABORT, 1000, 0); } void SetCompressorStats() { DWORD_PTR line_count, i; TCHAR buf[1024]; bool found = false; line_count = SendMessage(g_sdata.logwnd, EM_GETLINECOUNT, 0, 0); for(i=0; i width) { p.rcNormalPosition.left = 0; p.rcNormalPosition.right = width; } else if(p.rcNormalPosition.right > width) { p.rcNormalPosition.left = width - windowWidth; p.rcNormalPosition.right = width; } else if(p.rcNormalPosition.left < 0) { p.rcNormalPosition.left = 0; p.rcNormalPosition.right = windowWidth; } windowHeight = p.rcNormalPosition.bottom-p.rcNormalPosition.top; if(windowHeight > height) { p.rcNormalPosition.top = 0; p.rcNormalPosition.bottom = height; } else if(p.rcNormalPosition.bottom > height) { p.rcNormalPosition.top = height - windowHeight; p.rcNormalPosition.bottom = height; } else if(p.rcNormalPosition.top < 0) { p.rcNormalPosition.top = 0; p.rcNormalPosition.bottom = windowHeight; } p.length = sizeof(p); SetWindowPlacement(hwnd, &p); } RegCloseKey(hKey); } } void SaveWindowPos(HWND hwnd) { HKEY hKey; WINDOWPLACEMENT p; p.length = sizeof(p); if (!GetWindowPlacement(hwnd, &p)) p.length = 0; if (p.length && CreateRegSettingsKey(hKey)) { RegSetValueEx(hKey, REGLOC, 0, REG_BINARY, (LPBYTE)&p, p.length); RegCloseKey(hKey); } } void RestoreSymbols() { g_sdata.symbols = LoadSymbolSet(NULL); } void SaveSymbols() { SaveSymbolSet(NULL, g_sdata.symbols); } #define SYMSET_SUBKEY_MAXLEN (100 + SYMSETNAME_MAXLEN) // REGSYMSUBKEY + [\name] static int CreateSymbolSetSubkeyPath(const TCHAR *name, TCHAR *buffer) { return wsprintf(buffer, name ? _T("%s\\%s") : _T("%s"), REGSYMSUBKEY, name); } void FreeSymbolSet(TCHAR **symbols) { if (symbols) { for (SIZE_T i = 0; symbols[i]; ++i) MemSafeFree(symbols[i]); GlobalFree((HGLOBAL) symbols); } } void DeleteSymbolSet(const TCHAR *name) { HKEY hKey; if (name && OpenRegSettingsKey(hKey)) { TCHAR subkey[SYMSET_SUBKEY_MAXLEN+1]; CreateSymbolSetSubkeyPath(name, subkey); RegDeleteKey(hKey, subkey); RegCloseKey(hKey); } } TCHAR** LoadSymbolSet(const TCHAR *name) { HKEY hCfgKey, hSymKey; TCHAR **symbols = NULL; if (OpenRegSettingsKey(hCfgKey)) { TCHAR subkey[SYMSET_SUBKEY_MAXLEN+1]; CreateSymbolSetSubkeyPath(name, subkey); if (RegOpenKeyForReading(hCfgKey, subkey, &hSymKey) == ERROR_SUCCESS) { TCHAR bufName[8]; for (DWORD i = 0, rt, cbBuf, cbData;;) { cbBuf = sizeof(bufName); if (RegEnumValue(hSymKey, i, bufName, &cbBuf, NULL, &rt, NULL, &cbData) == ERROR_SUCCESS && rt == REG_SZ) { if(symbols) { HGLOBAL newmem = GlobalReAlloc(symbols, (i+2)*sizeof(TCHAR*), GMEM_MOVEABLE|GMEM_ZEROINIT); if (!newmem) FreeSymbolSet(symbols); symbols = (TCHAR**) newmem; } else { symbols = (TCHAR**) GlobalAlloc(GPTR, (i+2)*sizeof(TCHAR*)); } if (!symbols) break; // Out of memory, abort! symbols[i] = (TCHAR*) MemAllocZI(cbData += sizeof(TCHAR)); if (!symbols[i] || RegReadString(hSymKey, bufName, symbols[i], cbData)) { FreeSymbolSet(symbols); break; } symbols[++i] = NULL; // The symbols array is terminated by a NULL pointer } else break; } RegCloseKey(hSymKey); } RegCloseKey(hCfgKey); } return symbols; } void SaveSymbolSet(const TCHAR *name, TCHAR **symbols) { HKEY hCfgKey, hSymKey; if (CreateRegSettingsKey(hCfgKey)) { TCHAR subkey[SYMSET_SUBKEY_MAXLEN+1], bufName[8]; CreateSymbolSetSubkeyPath(name, subkey); if (RegOpenKey(hCfgKey, subkey, &hSymKey) == ERROR_SUCCESS) { // Cannot use DeleteSymbolSet because name might be NULL and named sets are stored inside the base symbols key for (DWORD cb;;) { cb = sizeof(bufName); if (RegEnumValue(hSymKey,0, bufName, &cb,NULL,NULL,NULL,NULL)!=ERROR_SUCCESS) break; RegDeleteValue(hSymKey, bufName); } RegCloseKey(hSymKey); } if(symbols) { if (RegCreateKey(hCfgKey, subkey, &hSymKey) == ERROR_SUCCESS) { for (SIZE_T i = 0; symbols[i]; ++i) { wsprintf(bufName, _T("%d"), (INT) i); RegWriteString(hSymKey, bufName, symbols[i]); } RegCloseKey(hSymKey); } } RegCloseKey(hCfgKey); } } void ResetObjects() { MemSafeFree(g_sdata.compile_command); g_sdata.compile_command = NULL; g_sdata.warnings = FALSE; g_sdata.retcode = -1; g_sdata.thread = NULL; } void ResetSymbols() { FreeSymbolSet(g_sdata.symbols); g_sdata.symbols = NULL; } BOOL ShellExecuteWithErrorBox(HWND hWnd, LPCTSTR File, LPCTSTR Parameters) { SHELLEXECUTEINFO sei; sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_FLAG_DDEWAIT; if (!(sei.hwnd = hWnd)) sei.fMask |= SEE_MASK_FLAG_NO_UI; sei.lpVerb = NULL; sei.lpFile = File; sei.lpParameters = Parameters; sei.lpDirectory = NULL; sei.nShow = SW_SHOW; return ShellExecuteEx(&sei); } void FreeSpawn(PROCESS_INFORMATION *pPI, HANDLE hRd, HANDLE hWr) { if (pPI) { GetExitCodeProcess(pPI->hProcess, &pPI->dwProcessId); CloseHandle(pPI->hProcess); CloseHandle(pPI->hThread); } CloseHandle(hRd); CloseHandle(hWr); } BOOL InitSpawn(STARTUPINFO &si, HANDLE &hRd, HANDLE &hWr) { OSVERSIONINFO osv; GetVersionEx((osv.dwOSVersionInfoSize = sizeof(osv), &osv)); const bool winnt = VER_PLATFORM_WIN32_NT == osv.dwPlatformId; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; SECURITY_ATTRIBUTES sa={sizeof(sa)}; SECURITY_DESCRIPTOR sd; if (winnt) { InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, false); sa.lpSecurityDescriptor = &sd; } sa.bInheritHandle = true; BOOL okp = CreatePipe(&hRd, &hWr, &sa, 0); si.hStdOutput = hWr, si.hStdError = hWr; si.hStdInput = INVALID_HANDLE_VALUE; return okp; } int InitBranding() { const TCHAR *opt = _T(" /version"); UINT cch = lstrlen(EXENAME) + lstrlen(opt) + 1; TCHAR *cmd = (TCHAR*) MemAlloc(cch*sizeof(TCHAR)); if (!cmd) return 0; lstrcpy(cmd, EXENAME); lstrcat(cmd, opt); STARTUPINFO si; HANDLE newstdout, read_stdout; char szBuf[1024], retval = 0; if (InitSpawn(si, read_stdout, newstdout)) { PROCESS_INFORMATION pi, *ppi = 0; if (CreateProcess(0, cmd, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi)) { DWORD dwRead = 0; if (WAIT_OBJECT_0 == WaitForSingleObject(pi.hProcess, 10000)) { ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL); retval = 1; } szBuf[dwRead] = 0, ppi = π int len = lstrlenA(szBuf); while(len && ((szBuf[len - 1] == '\n')|(szBuf[len - 1] == '\r'))) szBuf[--len] = '\0'; if (!len) retval = 0; g_sdata.branding = (TCHAR*) MemAlloc((len+6)*sizeof(TCHAR)); // LEAKED wsprintf(g_sdata.branding, _T("NSIS %hs"), szBuf); g_sdata.brandingv = (char*) MemAlloc(len+1); // LEAKED lstrcpyA(g_sdata.brandingv, szBuf); } FreeSpawn(ppi, read_stdout, newstdout); } MemFree(cmd); return retval; } LRESULT SetTooltipText(HWND hWnd, UINT_PTR Id, LPCTSTR Text) { TOOLINFO ti; ti.cbSize = SizeOfStruct(ti); ti.uFlags = Id > 0x7fff ? TTF_IDISHWND : 0; ti.hwnd = hWnd, ti.uId = Id; ti.hinst = g_sdata.hInstance, ti.lpszText = const_cast(Text); return SendMessage(g_tip.tip, TTM_UPDATETIPTEXT, 0, (LPARAM) (LPTOOLINFO) &ti); } void UpdateCloseButtonTooltip() { LPCTSTR txt = g_sdata.thread ? _T("") : CLOSEBTN_TIPTEXT; SetTooltipText(g_tip.tip_p, (UINT_PTR) GetDlgItem(g_sdata.hwnd, IDCANCEL), txt); } void InitTooltips(HWND h) { if (h == NULL) return; InitCCEx(ICC_BAR_CLASSES); DWORD s = WS_POPUP | WS_BORDER | TTS_ALWAYSTIP, xs = WS_EX_TOOLWINDOW | WS_EX_TOPMOST; g_tip.hook = 0; g_tip.tip_p = h; g_tip.tip = CreateWindowEx(xs, TOOLTIPS_CLASS, NULL, s, 0, 0, 0, 0, h, NULL, HINST_APPLICATION, NULL); if (!g_tip.tip) return; g_tip.hook = SetWindowsHookEx(WH_GETMESSAGE, TipHookProc, NULL, GetCurrentThreadId()); AddTip(GetDlgItem(h, IDCANCEL), CLOSEBTN_TIPTEXT); AddTip(GetDlgItem(h, IDC_TEST), TESTBTN_TIPTEXT); AddToolBarTooltips(); } void DestroyTooltips() { UnhookWindowsHookEx(g_tip.hook); } void AddTip(HWND hWnd, LPCTSTR lpszToolTip) { TOOLINFO ti; ti.cbSize = SizeOfStruct(ti); ti.uFlags = TTF_IDISHWND; ti.hwnd = g_tip.tip_p; ti.uId = (UINT_PTR) hWnd; ti.lpszText = const_cast(lpszToolTip); SendMessage(g_tip.tip, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); } LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) return CallNextHookEx(g_tip.hook, nCode, wParam, lParam); switch (((MSG*)lParam)->message) { case WM_MOUSEMOVE: if (IsChild(g_tip.tip_p,((MSG*)lParam)->hwnd)) SendMessage(g_tip.tip, TTM_RELAYEVENT, 0,lParam); break; default: break; } return CallNextHookEx(g_tip.hook, nCode, wParam, lParam); } void ShowDocs() { TCHAR pathf[MAX_PATH],*path; GetModuleFileName(NULL,pathf,COUNTOF(pathf)); path=_tcsrchr(pathf,_T('\\')); if(path!=NULL) *path=0; lstrcat(pathf,LOCALDOCS); if (!ShellExecuteSilent(g_sdata.hwnd, pathf)) OpenUrlInDefaultBrowser(g_sdata.hwnd, DOCURL); } TCHAR* BuildSymbols() { TCHAR *buf = NULL; if(g_sdata.symbols) { int i=0; while(g_sdata.symbols[i]) { if(buf) { TCHAR *buf3 = (TCHAR*) MemAlloc((lstrlen(buf)+lstrlen(g_sdata.symbols[i])+6)*sizeof(TCHAR)); wsprintf(buf3,_T("%s \"/D%s\""),buf,g_sdata.symbols[i]); MemFree(buf); buf = buf3; } else { buf = (TCHAR*) MemAlloc((lstrlen(g_sdata.symbols[i])+5)*sizeof(TCHAR)); wsprintf(buf,_T("\"/D%s\""),g_sdata.symbols[i]); } i++; } } else { buf = (TCHAR*) MemAlloc(sizeof(TCHAR)); buf[0] = _T('\0'); } return buf; } static inline bool IsValidFile(const TCHAR *fname) { return FileExists(fname); } BOOL PopMRUFile(TCHAR* fname) { int i; for(i=0; i= COUNTOF(full_file_name)) { return; } if(IsValidFile(full_file_name)) { int i; PopMRUFile(full_file_name); for(i = MRU_LIST_SIZE - 2; i >= 0; i--) { lstrcpy(g_mru_list[i+1], g_mru_list[i]); } lstrcpy(g_mru_list[0],full_file_name); BuildMRUMenus(); } } void BuildMRUMenus() { HMENU hMenu = g_sdata.fileSubmenu; int i, n; MENUITEMINFO mii; TCHAR buf[MRU_DISPLAY_LENGTH + 5/*number*/ + 1/*null*/]; TCHAR buf2[MRU_DISPLAY_LENGTH - 6]; TCHAR buf3[MRU_DISPLAY_LENGTH + 1]; mii.cbSize = sizeof(mii); for(i = 0; i < MRU_LIST_SIZE; i++) { DeleteMenu(hMenu, IDM_MRU_FILE+i, MF_BYCOMMAND); } n = GetMenuItemCount(hMenu); // Remove MRU separator int seppos = n - 1; mii.fMask = MIIM_TYPE, mii.cch = 0; if (GetMenuItemInfo(hMenu, seppos, TRUE, &mii)) { if (MFT_SEPARATOR & mii.fType) { DeleteMenu(hMenu, seppos, MF_BYPOSITION); n--; } } for(i = 0; i < MRU_LIST_SIZE; i++) { if(g_mru_list[i][0]) { if (seppos) { // We have MRU items so add the separator mii.fMask = MIIM_TYPE; mii.fType = MFT_SEPARATOR; InsertMenuItem(hMenu, n++, TRUE, &mii); seppos = 0; } memset(buf,0,sizeof(buf)); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = IDM_MRU_FILE+i; mii.fType = MFT_STRING; wsprintf(buf, _T("&%d "), i + 1); if(lstrlen(g_mru_list[i]) > MRU_DISPLAY_LENGTH) { TCHAR *p = _tcsrchr(g_mru_list[i],_T('\\')); if(p) { p++; if(lstrlen(p) > MRU_DISPLAY_LENGTH - 7) { *buf2 = 0; lstrcpyn(buf2,p,MRU_DISPLAY_LENGTH - 9); lstrcat(buf2,_T("...")); lstrcpyn(buf3,g_mru_list[i],4); lstrcat(buf,buf3); lstrcat(buf,_T("...\\")); lstrcat(buf,buf2); } else { lstrcpyn(buf3,g_mru_list[i],(MRU_DISPLAY_LENGTH - lstrlen(p) - 3)); lstrcat(buf,buf3); lstrcat(buf,_T("...\\")); lstrcat(buf,p); } } else { lstrcpyn(buf3,g_mru_list[i],(MRU_DISPLAY_LENGTH-2)); lstrcat(buf,buf3); lstrcat(buf,_T("...")); } } else { lstrcat(buf, g_mru_list[i]); } mii.dwTypeData = buf; mii.cch = lstrlen(buf)+1; mii.fState = MFS_ENABLED; InsertMenuItem(hMenu, n++, TRUE, &mii); } else { break; } } hMenu = g_sdata.toolsSubmenu; mii.fMask = MIIM_STATE; mii.fState = g_mru_list[0][0] ? MFS_ENABLED : MFS_GRAYED; SetMenuItemInfo(hMenu, IDM_CLEAR_MRU_LIST,FALSE,&mii); } void LoadMRUFile(int position) { if (!g_sdata.thread && position >=0 && position < MRU_LIST_SIZE && g_mru_list[position][0]) { SetScript(g_mru_list[position]); if(IsValidFile(g_mru_list[position])) { PushMRUFile(g_mru_list[position]); } else { PopMRUFile(g_mru_list[position]); BuildMRUMenus(); } ResetObjects(); CompileNSISScript(); } } void RestoreMRUList() { HKEY hCfgKey, hMRUKey; UINT n = 0, i; if (OpenRegSettingsKey(hCfgKey)) { if (RegOpenKeyForReading(hCfgKey, REGMRUSUBKEY, &hMRUKey) == ERROR_SUCCESS) { for(int i=0; i= COMPRESSOR_SCRIPT && v <= COMPRESSOR_BEST) { n = (int)v; } if (CreateRegSettingsKey(hKey)) { if (compressor_names[n][0]) RegWriteString(hKey, REGCOMPRESSOR, compressor_names[n]); else RegDeleteValue(hKey, REGCOMPRESSOR); RegCloseKey(hKey); } } bool FileExists(const TCHAR *fname) { WIN32_FIND_DATA wfd; HANDLE h = FindFirstFile(fname,&wfd); if(INVALID_HANDLE_VALUE != h) { FindClose(h); return true; } return false; } bool OpenUrlInDefaultBrowser(HWND hwnd, LPCSTR Url) { return (int)(INT_PTR) ShellExecuteA(hwnd, NULL, Url, NULL, NULL, SW_SHOWNORMAL) > 32; } HMENU FindSubMenu(HMENU hMenu, UINT uId) { MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_SUBMENU; return GetMenuItemInfo(hMenu, uId, FALSE, &mii) ? mii.hSubMenu : 0; } static UINT DpiGetClassicSystemDpiY() { HDC hDC = GetDC(NULL); UINT dpi = GetDeviceCaps(hDC, LOGPIXELSY); ReleaseDC(NULL, hDC); return dpi; } static HRESULT WINAPI DpiFallbackGetDpiForMonitor(HMONITOR hMon, int MDT, UINT*pX, UINT*pY) { return (*pX = *pY = DpiGetClassicSystemDpiY(), S_OK); } static UINT WINAPI DpiFallbackGetDpiForWindow(HWND hWnd) { return 0; } static HMONITOR WINAPI DpiFallbackMonitorFromWindow(HWND hWnd, DWORD Flags) { return NULL; } static UINT DpiNativeGetForMonitor(HMONITOR hMon) { static HRESULT(WINAPI*f)(HMONITOR, int, UINT*, UINT*); if (!f && !((FARPROC&)f = GetSysProcAddr("SHCORE", "GetDpiForMonitor"))) f = DpiFallbackGetDpiForMonitor; UINT x, y, mdt_effective_dpi = 0; return SUCCEEDED(f(hMon, mdt_effective_dpi, &x, &y)) ? y : 0; } UINT DpiGetForMonitor(HWND hWnd) { HMONITOR(WINAPI*monitorfromwindow)(HWND, DWORD); if (SupportsWNT4() || SupportsW95()) { static HMONITOR(WINAPI*g)(HWND, DWORD); if (!g && !((FARPROC&)g = GetSysProcAddr("USER32", "MonitorFromWindow"))) g = DpiFallbackMonitorFromWindow; monitorfromwindow = g; } else { monitorfromwindow = MonitorFromWindow; } HMONITOR hMon = monitorfromwindow(hWnd, MONITOR_DEFAULTTONEAREST); return hMon ? DpiNativeGetForMonitor(hMon) : (UINT)(UINT_PTR) hMon; } UINT DpiGetForWindow(HWND hWnd) { UINT dpi; if (DpiAwarePerMonitor() || DpiAwarePerMonitor2()) { static UINT(WINAPI*f)(HWND); if (!f && !((FARPROC&)f = GetSysProcAddr("USER32", "GetDpiForWindow"))) f = DpiFallbackGetDpiForWindow; if ((dpi = f(hWnd))) return dpi; } if (DpiAwarePerMonitor() && (dpi = DpiGetForMonitor(hWnd))) return dpi; return DpiGetClassicSystemDpiY(); } int DpiScaleY(HWND hWnd, int Val) { return MulDiv(Val, DpiGetForWindow(hWnd), 96); } HFONT CreateFontHelper(INT_PTR Data, int Height, DWORD p1, LPCTSTR Face) { WORD w = LOBYTE(p1)<<2, flags = HIBYTE(p1), cs = HIWORD(LOBYTE(p1)), paf = HIWORD(HIBYTE(p1)); if (flags & CFF_DPIPT) { UINT dpi = (flags & CFF_DPIFROMHWND) ? DpiGetForWindow((HWND) Data) : (UINT) Data; Height = -MulDiv(Height, dpi, 72); } return CreateFont(Height, 0, 0, 0, w, FALSE, FALSE, FALSE, cs, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, paf, Face); } BOOL CALLBACK FontExistsCallback(const LOGFONT*pLF, const TEXTMETRIC*pTM, DWORD Type, LPARAM Cookie) { *((BOOL*) Cookie) = TRUE; return FALSE; } BOOL FontExists(LPCTSTR Face) { BOOL ret = FALSE; HDC hDC = GetDC(0); EnumFonts(hDC, Face, FontExistsCallback, (LPARAM) &ret); ReleaseDC(0, hDC); return ret; } BOOL FillRectColor(HDC hDC, const RECT &Rect, COLORREF Color) { COLORREF orgclr = SetBkColor(hDC, Color); ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &Rect, _T(""), 0, NULL); return TRUE|SetBkColor(hDC, orgclr); } static BOOL DrawHorzGradient(HDC hDC, const RECT&rect, COLOR16 r1, COLOR16 g1, COLOR16 b1, COLOR16 r2, COLOR16 g2, COLOR16 b2) { TRIVERTEX v[2] = { {rect.left, rect.top, r1, g1, b1, 0xffff}, {rect.right, rect.bottom, r2, g2, b2, 0xffff} }; GRADIENT_RECT r = { 0, 1 }; BOOL(WINAPI*gf)(HDC,TRIVERTEX*,ULONG,VOID*,ULONG,ULONG); if (SupportsWNT4() || SupportsW95()) { if (!((FARPROC&)gf = GetSysProcAddr("MSIMG32", "GradientFill"))) { return FillRectColor(hDC, rect, RGB((((UINT)r1+r2)/2)>>8, (((UINT)g1+g2)/2)>>8, (((UINT)b1+b2)/2)>>8)); // TODO: Actually try to draw a gradient } } else gf = GradientFill; return gf(hDC, v, 2, &r, 1, GRADIENT_FILL_RECT_H); } BOOL DrawHorzGradient(HDC hDC, LONG l, LONG t, LONG r, LONG b, COLORREF c1, COLORREF c2) { RECT rect = { l, t, r, b }; return DrawHorzGradient(hDC, rect, (WORD)GetRValue(c1)<<8, (WORD)GetGValue(c1)<<8, (WORD)GetBValue(c1)<<8, (WORD)GetRValue(c2)<<8, (WORD)GetGValue(c2)<<8, (WORD)GetBValue(c2)<<8); } long DlgUnitToPixelX(HWND hDlg, long x) { RECT r = { x, 0, 0, 0 }; MapDialogRect(hDlg, &r); return r.left; } long DlgUnitToPixelY(HWND hDlg, long y) { RECT r = { 0, y, 0, 0 }; MapDialogRect(hDlg, &r); return r.top; } #ifndef SP_GRIPPER #ifndef HTHEME #define HTHEME HTHEME_OLDSDK struct OLDSDK_TYPE_HTHEME {int unused;}; typedef struct OLDSDK_TYPE_HTHEME* HTHEME; #endif #define SP_GRIPPER 3 #endif struct VisualStyles { VisualStyles() : m_OpenThemeData(NULL) {} static HTHEME WINAPI Compat_OpenThemeData(HWND hWnd, LPCWSTR Class) { return NULL; } HTHEME OpenThemeData(HWND hWnd, LPCWSTR Class) { return (InitUXTheme(), m_OpenThemeData(hWnd, Class)); } void InitUXTheme() { if (m_OpenThemeData) return ; HMODULE hUXT = LoadSysLibrary("UXTHEME"); if (!((FARPROC&) m_OpenThemeData = GetProcAddress(hUXT, "OpenThemeData"))) m_OpenThemeData = Compat_OpenThemeData; (FARPROC&) CloseThemeData = GetProcAddress(hUXT, "CloseThemeData"); (FARPROC&) DrawThemeBackground = GetProcAddress(hUXT, "DrawThemeBackground"); } HTHEME(WINAPI*m_OpenThemeData)(HWND,LPCWSTR); HRESULT(WINAPI*CloseThemeData)(HTHEME); HRESULT(WINAPI*DrawThemeBackground)(HTHEME,HDC,int,int,LPCRECT,LPCRECT); } VS; void DrawGripper(HWND hWnd, HDC hDC, const RECT&r) { HTHEME hTheme = VS.OpenThemeData(hWnd, L"STATUS"); if (hTheme) { VS.DrawThemeBackground(hTheme, hDC, SP_GRIPPER, 0, &r, NULL); VS.CloseThemeData(hTheme); } else { DrawFrameControl(hDC, const_cast(&r), DFC_SCROLL, DFCS_SCROLLSIZEGRIP); } } bool RicheditHasSelection(HWND hRE) { CHARRANGE tr; SendMessage(hRE, EM_EXGETSEL, 0, (LPARAM) &tr); return tr.cpMax - tr.cpMin <= 0 ? FALSE : TRUE; } void EnableUICommand(UINT Id, INT_PTR Enabled) { EnableToolBarButton(Id, !!Enabled); EnableMenuItem(g_sdata.menu, Id, Enabled ? MF_ENABLED : MF_GRAYED); } nsis-3.11/Contrib/Makensisw/utils.h000077500000000000000000000170351477201124000172730ustar00rootroot00000000000000/* Copyright (c) 2002 Robert Rainwater Copyright (c) 2002 Robert Rainwater Contributors: Justin Frankel, Fritz Elfert, and Sunil Kamath This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/20/2007 */ #ifndef UTILS_H #define UTILS_H #include "resource.h" #include "toolbar.h" #ifdef COUNTOF #undef COUNTOF #endif #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #if defined(_MSC_VER) && _MSC_VER >= 1200 EXTERN_C IMAGE_DOS_HEADER __ImageBase; #define HINST_THISCOMPONENT ( (HINSTANCE) &__ImageBase ) #define HINST_APPLICATION HINST_THISCOMPONENT #else #define HINST_APPLICATION ( (HINSTANCE) GetModuleHandle(NULL) ) #endif #define MRU_LIST_SIZE 5 #define MRU_DISPLAY_LENGTH 40 #define SYMSETNAME_MAXLEN 40 template inline T API_cast(INT_PTR(CALLBACK*p1)(HWND,UINT,WPARAM,LPARAM)) { return (DLGPROC) p1; } // DLGPROC in really old SDKs return BOOL void* MemAllocZI(SIZE_T cb); void MemSafeFree(void*mem); #define MemAlloc MemAllocZI #define MemFree MemSafeFree HMODULE LoadSysLibrary(LPCSTR Mod); FARPROC GetSysProcAddr(LPCSTR Mod, LPCSTR FuncName); bool WriteUTF16LEBOM(HANDLE hFile); BOOL InitCCExHelper(UINT icc); static inline BOOL InitCCEx(UINT icc) { return icc > 0xff ? InitCCExHelper(icc) : true; } static inline UINT SizeOfStruct(const TOOLINFO&x) { return FIELD_OFFSET(TOOLINFO, lParam); } static inline UINT SizeOfStruct(const OPENFILENAME&x) { return sizeof(void*) < 8 ? 76 : sizeof(x); } UINT GetScreenBPP(HWND hWnd = NULL); BOOL ShellExecuteWithErrorBox(HWND hWnd, LPCTSTR File, LPCTSTR Parameters = NULL); inline BOOL ShellExecuteSilent(HWND hWnd, LPCTSTR File) { return ShellExecuteWithErrorBox(NULL, File); } void FreeSpawn(PROCESS_INFORMATION *pPI, HANDLE hRd, HANDLE hWr); BOOL InitSpawn(STARTUPINFO &si, HANDLE &hRd, HANDLE &hWr); typedef BYTE PACKEDCMDID_T; #define PACKCMDID(id) ( PACKEDCMDID_T((id) - IDM_CMDBASE) ) #define UNPACKCMDID(id) ( IDM_CMDBASE + (id) ) int SetArgv(const TCHAR *cmdLine, TCHAR ***argv); void SetTitle(HWND hwnd,const TCHAR *substr); void PlayAppSoundAsync(LPCSTR SoundName, int MBFallback = -1); void CopyToClipboard(HWND hwnd); void InitializeLogWindow(); void ReleaseLogWindow(); enum LOGCOLOR { LC_SUCCESS, LC_WARNING, LC_ERROR, LC_SYSCOLOR }; void SetLogColor(enum LOGCOLOR lc); void ClearLog(); void LogMessage(HWND hwnd,const TCHAR *str); void ErrorMessage(HWND hwnd,const TCHAR *str); void CenterOnParent(HWND hwnd); void SetDialogFocus(HWND hDlg, HWND hCtl); // Use this and not SetFocus()! #define DlgRet(hDlg, val) ( SetWindowLongPtr((hDlg), DWLP_MSGRESULT, (val)) | TRUE ) HWND GetComboEdit(HWND hCB); #define DisableItems(hwnd) EnableDisableItems(((void)(hwnd), 0)) #define EnableItems(hwnd) EnableDisableItems(((void)(hwnd), 1)) void EnableDisableItems(int on); bool OpenRegSettingsKey(HKEY &hKey, bool create = false); #define CreateRegSettingsKey(refhkey) OpenRegSettingsKey((refhkey), true) DWORD ReadRegSettingDW(LPCTSTR name, const DWORD defval); void RestoreWindowPos(HWND hwnd); void SaveWindowPos(HWND hwnd); void ResetObjects(); void ResetSymbols(); int InitBranding(); void InitTooltips(HWND h); void DestroyTooltips(); void AddTip(HWND hWnd, LPCTSTR lpszToolTip); LRESULT SetTooltipText(HWND hWnd, UINT_PTR Id, LPCTSTR Text); void UpdateCloseButtonTooltip(); void ShowDocs(); void RestoreCompressor(); void SaveCompressor(); void SetCompressorStats(); BOOL PopMRUFile(TCHAR* fname); void PushMRUFile(TCHAR* fname); void BuildMRUMenus(); void LoadMRUFile(int position); void ClearMRUList(); struct FSPath { template static inline bool IsAgnosticSeparator(const T c) { return '\\' == c || '/' == c; } template static T* FindLastComponent(T*p) // Note: Returns "" for "dir\" { for (T *sep = 0, *start = p;; ++p) if (!*p) return sep ? ++sep : start; else if (IsAgnosticSeparator(*p)) sep = p; } }; template UINT StrLenT(const T*s) { return sizeof(T) > 1 ? lstrlenW((WCHAR*) s) : lstrlenA((CHAR*) s) ; } template T AsciiLoCh(T ch) { return ch >= 'A' && ch <= 'Z' ? (ch | 32) : ch; } template int AsciiCmpNI(const A*a, const B*b, SIZE_T len) { int cmp = 0; for (SIZE_T i = 0;; ++i) if (i == len || (cmp = AsciiLoCh(a[i]) - AsciiLoCh(b[i])) || !a[i]) return cmp; } template inline bool AsciiMatchNI(const A*a, const B*b, SIZE_T c) { return !AsciiCmpNI(a, b, c); } template bool AsciiMatchPrefixI(const A*s, const B*p) { return AsciiMatchNI(s, p, StrLenT(p)); } template HKEY GetRegRootKey(const T*Str) { if (AsciiMatchPrefixI(Str, "HKEY_CLASSES_ROOT") || AsciiMatchPrefixI(Str, "HKCR")) return HKEY_CLASSES_ROOT; if (AsciiMatchPrefixI(Str, "HKEY_CURRENT_USER") || AsciiMatchPrefixI(Str, "HKCU")) return HKEY_CURRENT_USER; if (AsciiMatchPrefixI(Str, "HKEY_LOCAL_MACHINE") || AsciiMatchPrefixI(Str, "HKLM")) return HKEY_LOCAL_MACHINE; if (AsciiMatchPrefixI(Str, "HKEY_USERS") || AsciiMatchPrefixI(Str, "HKU")) return HKEY_USERS; return (HKEY) NULL; } DWORD RegOpenKeyForReading(HKEY hRoot, LPCTSTR SubKey, HKEY*pKey); bool FileExists(const TCHAR *fname); bool OpenUrlInDefaultBrowser(HWND hwnd, LPCSTR Url); HMENU FindSubMenu(HMENU hMenu, UINT uId); static inline UINT GetMenuDropAlignment() { return GetSystemMetrics(SM_MENUDROPALIGNMENT) ? TPM_RIGHTALIGN : TPM_LEFTALIGN; } typedef enum { CFF_RAWSIZE = 0x00, CFF_DPIPT = 0x01, CFF_DPIFROMHWND = 0x02 } CREATEFONTFLAGS; HFONT CreateFontHelper(INT_PTR Data, int Height, DWORD p1, LPCTSTR Face); inline HFONT CreateFont(INT_PTR Data, WORD Flags, int Height, WORD Weight, BYTE PitchAndFamily, BYTE CharSet, LPCTSTR Face) { DWORD packed = MAKELONG(MAKEWORD(Weight>>2, Flags), MAKEWORD(CharSet, PitchAndFamily)); return CreateFontHelper(Data, Height, packed, Face); } inline HFONT CreateFontPt(HWND hWndDPI, int Height, WORD Weight, BYTE PitchAndFamily, BYTE CharSet, LPCTSTR Face) { return CreateFont((INT_PTR) hWndDPI, CFF_DPIFROMHWND|CFF_DPIPT, Height, Weight, PitchAndFamily, CharSet, Face); } BOOL FontExists(LPCTSTR Face); BOOL FillRectColor(HDC hDC, const RECT &Rect, COLORREF Color); BOOL DrawHorzGradient(HDC hDC, LONG l, LONG t, LONG r, LONG b, COLORREF c1, COLORREF c2); inline long RectW(const RECT&r) { return r.right - r.left; } inline long RectH(const RECT&r) { return r.bottom - r.top; } long DlgUnitToPixelX(HWND hDlg, long x); long DlgUnitToPixelY(HWND hDlg, long y); UINT DpiGetForMonitor(HWND hWnd); UINT DpiGetForWindow(HWND hWnd); int DpiScaleY(HWND hWnd, int Val); void DrawGripper(HWND hWnd, HDC hDC, const RECT&r); static inline void GetGripperPos(HWND hwnd, RECT&r) { GetClientRect(hwnd, &r); r.left = r.right - GetSystemMetrics(SM_CXVSCROLL); r.top = r.bottom - GetSystemMetrics(SM_CYVSCROLL); } bool RicheditHasSelection(HWND hRE); HRESULT RicheditFreeze(void*pITextDocument, SIZE_T Freeze); void EnableUICommand(UINT Id, INT_PTR Enabled); #endif nsis-3.11/Contrib/Makensisw/version.cpp000077500000000000000000000023561477201124000201530ustar00rootroot00000000000000/* Copyright (c) 2002 Robert Rainwater Contributors: Justin Frankel, Fritz Elfert, Amir Szekely and Jim Park (Unicode Support) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/17/2007 */ #include "makensisw.h" #define TSTRINGIFY_(x) _T(#x) #define TSTRINGIFY(x) TSTRINGIFY_(x) #ifdef RELEASE const TCHAR *NSISW_VERSION = TSTRINGIFY(RELEASE); #else const TCHAR *NSISW_VERSION = __TDATE__; #endif nsis-3.11/Contrib/Makensisw/wndspy.cpp000077500000000000000000000366211477201124000200140ustar00rootroot00000000000000// Copyright (C) 2018-2025 Anders Kjersem // // This file is a part of NSIS. // // Licensed under the zlib/libpng license (the "License"); // you may not use this file except in compliance with the License. // // Licence details can be found in the file COPYING. // // This software is provided 'as-is', without any express or implied // warranty. #include "makensisw.h" #include #include #include "utils.h" #include "resource.h" #define InitializeApiFuncWithFallback(mn, fn) { FARPROC f = GetSysProcAddr((mn), (#fn)); g_##fn = Compat_##fn; if (f) (FARPROC&) g_##fn = f; } #define InitializeApiFuncEx(mn, fn, ptr) ( (FARPROC&)(g_##ptr) = GetSysProcAddr((mn), (#fn)) ) #define InitializeApiFunc(mn, fn) ( (FARPROC&)(g_##fn) = GetSysProcAddr((mn), (#fn)) ) #define CallApiFunc(fn) ( g_##fn ) #define HasApiFunc(fn) ( !!(g_##fn) ) INT_PTR(WINAPI*g_SetThreadDpiAwarenessContext)(INT_PTR); UINT(WINAPI*g_GetDpiForWindow)(HWND); BOOL(WINAPI*g_LogicalToPhysicalPoint)(HWND hWnd, LPPOINT lpPoint); BOOL(WINAPI*g_PhysicalToLogicalPoint)(HWND hWnd, LPPOINT lpPoint); typedef struct _DPI { enum { a_invalid = -1, a_unaware = 0, a_system = 1, a_pm = 2 }; enum { ac_invalid = 0, ac_unaware = -1, ac_system = -2, ac_pm1 = -3, ac_pm2 = -4, ac_count = ac_pm2 * -1 }; static inline INT_PTR SetThreadDpiAwarenessContext(INT_PTR a1) { return g_SetThreadDpiAwarenessContext(a1); } static inline UINT GetDpiForWindow(HWND a1) { return HasApiFunc(GetDpiForWindow) ? CallApiFunc(GetDpiForWindow)(a1) : 0; } static inline UINT GetDpiForMonitor(HWND hWnd) { return DpiGetForMonitor(hWnd); } } DPI; static INT_PTR WINAPI Compat_SetThreadDpiAwarenessContext(INT_PTR AC) { return 0; } static BOOL WINAPI Compat_LogicalToPhysicalPoint(HWND hWnd, LPPOINT lpPoint) { return TRUE; } static BOOL WINAPI Compat_PhysicalToLogicalPoint(HWND hWnd, LPPOINT lpPoint) { return TRUE; } static void InitializeDpiApi() { InitializeApiFuncWithFallback("USER32", SetThreadDpiAwarenessContext); InitializeApiFunc("USER32", GetDpiForWindow); InitializeApiFuncEx("USER32", LogicalToPhysicalPointForPerMonitorDPI, LogicalToPhysicalPoint); if (!HasApiFunc(LogicalToPhysicalPoint)) InitializeApiFuncWithFallback("USER32", LogicalToPhysicalPoint); InitializeApiFuncEx("USER32", PhysicalToLogicalPointForPerMonitorDPI, PhysicalToLogicalPoint); if (!HasApiFunc(PhysicalToLogicalPoint)) InitializeApiFuncWithFallback("USER32", PhysicalToLogicalPoint); } static BOOL LogicalToPhysical(HWND hWnd, POINT&Pt) { return CallApiFunc(LogicalToPhysicalPoint)(hWnd, &Pt); } static BOOL PhysicalToLogical(HWND hWnd, POINT&Pt) { return CallApiFunc(PhysicalToLogicalPoint)(hWnd, &Pt); } static void LogicalToPhysical(HWND hWnd, RECT&Rect) { POINT *p = (POINT*) &Rect; LogicalToPhysical(hWnd, p[0]), LogicalToPhysical(hWnd, p[1]); } static void PhysicalToLogical(HWND hWnd, RECT&Rect) { POINT *p = (POINT*) &Rect; PhysicalToLogical(hWnd, p[0]), PhysicalToLogical(hWnd, p[1]); } static BOOL GetPhysicalWindowRect(HWND hWnd, RECT&Rect, HWND hWndCaller) { BOOL succ = GetWindowRect(hWnd, &Rect); LogicalToPhysical(hWndCaller, Rect); return succ; } static BOOL GetPhysicalClientRect(HWND hWnd, RECT&Rect, HWND hWndCaller) { BOOL succ = GetClientRect(hWnd, &Rect); LogicalToPhysical(hWndCaller, Rect); return succ; } static inline void PhysicalToLogical(HWND hWnd, RECT&Rect, HWND hWndCaller) { PhysicalToLogical(hWndCaller, Rect); } static void ConvertLogicalToLogical(RECT&Rect, HWND hSrc, HWND hDst) { LogicalToPhysical(hSrc, Rect), PhysicalToLogical(hDst, Rect); } static BOOL GetLogicalWindowRect(HWND hWnd, RECT&Rect, HWND hWndCaller) { BOOL succ = GetWindowRect(hWnd, &Rect); if (succ) ConvertLogicalToLogical(Rect, hWndCaller, hWnd); return succ; } static HWND GetParentWindow(HWND hWnd) { HWND r = GetParent(hWnd); // Parent or owner return r != GetWindow(hWnd, GW_OWNER) ? r : NULL; } static HWND GetAncestorRoot(HWND hWnd) { if (!SupportsWNT4() && !SupportsW95()) return GetAncestor(hWnd, GA_ROOT); for (HWND hTmp; (hTmp = GetParentWindow(hWnd)); ) hWnd = hTmp; return hWnd; } typedef struct _DIALOGDATA { BOOL Dragging; HWND hWndTarget, hWndOutline; int DialogAwarenessContext; // Canonical DPI awareness context _DIALOGDATA() : hWndOutline(0) {} static struct _DIALOGDATA* Get(HWND hDlg) { return (struct _DIALOGDATA*) GetWindowLongPtr(hDlg, DWLP_USER); } static void Set(HWND hDlg, void*pDD) { SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR) pDD); } } DIALOGDATA; struct FINDCHILDDATA { HWND hWnd; POINT pt; ULONG Area; bool IncludeHidden; void Init(POINT pt, bool IncludeHidden) { Area = 0, Area = ~Area, this->pt = pt, this->IncludeHidden = IncludeHidden; } }; static BOOL CALLBACK FindChildWindowFromPointProc(HWND hWnd, LPARAM LParam) { RECT r; FINDCHILDDATA*pFCD = (FINDCHILDDATA*) LParam; if (GetWindowRect(hWnd, &r) && PtInRect(&r, pFCD->pt)) // TODO: Region? { ULONG area = (r.right - r.left) * (r.bottom - r.top); if (area < pFCD->Area && (pFCD->IncludeHidden || IsWindowVisible(hWnd))) pFCD->Area = area, pFCD->hWnd = hWnd; } return TRUE; } static HWND FindChildWindowFromPoint(HWND hWnd, FINDCHILDDATA*pFCD) { HWND hParent = GetParentWindow(hWnd), hOrg; if (!hParent) hParent = hWnd; recurse: hOrg = pFCD->hWnd = hWnd; EnumChildWindows(hParent, FindChildWindowFromPointProc, (LPARAM) pFCD); if (hOrg && hOrg != pFCD->hWnd) { hWnd = hParent = pFCD->hWnd; goto recurse; } return pFCD->hWnd; } static HWND GetChildWindowFromPointHelper(POINT pt) { const bool includeHidden = false; HWND hWnd = WindowFromPoint(pt), hWnd2; if (!hWnd) return hWnd; while(!includeHidden && hWnd && !IsWindowVisible(hWnd)) if ((hWnd2 = GetParentWindow(hWnd))) hWnd = hWnd2; FINDCHILDDATA fcd; fcd.Init(pt, includeHidden); hWnd = FindChildWindowFromPoint(hWnd, &fcd); return hWnd; } #if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64_VERSION_MAJOR) && (!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) WINUSERAPI BOOL WINAPI IsHungAppWindow(HWND); // MinGW is wrong, IsHungAppWindow was added in WinNT4. MinGW < 3.20? does not even have it in their .lib! #endif static BOOL IsHung(HWND hWnd) { #if !(defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64_VERSION_MAJOR) && (__MINGW32_MINOR_VERSION <= 15)) if (sizeof(void*) > 4 || sizeof(TCHAR) > 1) { return IsHungAppWindow(hWnd); } else #endif { static FARPROC g_func = GetSysProcAddr("USER32", "IsHungAppWindow"); if (g_func) return ((BOOL(WINAPI*)(HWND))g_func)(hWnd); DWORD_PTR mr; LRESULT rv = SendMessageTimeout(hWnd, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 500, &mr); return rv == 0; } } static LRESULT CALLBACK OutlineWindowProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam) { WNDPROC orgProc = (WNDPROC) GetWindowLongPtr(hWnd, GWLP_USERDATA); switch(Msg) { case WM_WINDOWPOSCHANGED: { WINDOWPOS wp = *(WINDOWPOS*) LParam; int size = GetSystemMetrics(SM_CXBORDER) * 2, sizeX = size, sizeY = size; if (sizeX >= wp.cx) sizeX = 1; if (sizeY >= wp.cy) sizeY = 1; HRGN hRgn = CreateRectRgn(0, 0, wp.cx, wp.cy); HRGN hRgnInner = CreateRectRgn(sizeX, sizeY, wp.cx - sizeX, wp.cy - sizeY); if (sizeX * 2 < wp.cx && sizeY * 2 < wp.cy) CombineRgn(hRgn, hRgn, hRgnInner, RGN_XOR); DeleteObject(hRgnInner); SetWindowRgn(hWnd, hRgn, TRUE); } return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); FillRectColor(hDC, ps.rcPaint, RGB(255, 0, 255)); EndPaint(hWnd, &ps); } return 0; } return orgProc ? CallWindowProc(orgProc, hWnd, Msg, WParam, LParam) : DefWindowProc(hWnd, Msg, WParam, LParam); } static void SetDragSourceImage(HWND hDlg, INT_PTR Dragging = false) { HCURSOR hCur = Dragging ? NULL : LoadCursor(NULL, IDC_CROSS); SendDlgItemMessage(hDlg, IDC_SPYDRAG, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM) hCur); } static void ShowWindowInfo(HWND hDlg, HWND hWnd) { const TCHAR *strFmtPtr = sizeof(void*) > 4 ? _T("%#.16I64x") : _T("%#.8x"); const TCHAR *strFmtPtr2 = sizeof(void*) > 4 ? _T("%#.16I64x & %#.16I64x") : _T("%#.8x & %#.8x"); const TCHAR *strIntPtr = sizeof(void*) > 4 ? _T("%I64d") : _T("%d"); TCHAR buf[300]; LONG_PTR style = GetWindowLongPtr(hWnd, GWL_STYLE); wsprintf(buf, strIntPtr, GetWindowLongPtr(hWnd, GWLP_ID)); SetDlgItemText(hDlg, IDC_WNDID, buf); wsprintf(buf, strFmtPtr, hWnd); SetDlgItemText(hDlg, IDC_HWND, buf); if (!GetClassName(hWnd, buf, COUNTOF(buf))) *buf = _T('\0'); SetDlgItemText(hDlg, IDC_WNDCLASS, buf); wsprintf(buf, strFmtPtr2, GetWindowLongPtr(hWnd, GWLP_USERDATA), GetWindowLongPtr(hWnd, DWLP_USER)); SetDlgItemText(hDlg, IDC_WNDUSERDATA, buf); wsprintf(buf, strFmtPtr2, (LONG_PTR) style, GetWindowLongPtr(hWnd, GWL_EXSTYLE)); SetDlgItemText(hDlg, IDC_WNDSTYLE, buf); RECT rw, rc; GetLogicalWindowRect(hWnd, rw, hDlg); wsprintf(buf, _T("%dx%d..%dx%d \x2248 %dx%d"), rw.left, rw.top, rw.right, rw.bottom, rw.right - rw.left, rw.bottom - rw.top); // '\x2245' is not present on XP SetDlgItemText(hDlg, IDC_WNDLOGISIZE, hWnd ? buf : NULL); GetPhysicalWindowRect(hWnd, rw, hDlg); GetPhysicalClientRect(hWnd, rc, hDlg); wsprintf(buf, _T("%dx%d..%dx%d \x2248 %dx%d (%dx%d)"), rw.left, rw.top, rw.right, rw.bottom, rw.right - rw.left, rw.bottom - rw.top, rc.right - rc.left, rc.bottom - rc.top); SetDlgItemText(hDlg, IDC_WNDPHYSSIZE, hWnd ? buf : NULL); *buf = _T('\0'); if (IsWindowUnicode(hWnd)) lstrcat(buf, _T("Unicode")); if (IsWindowVisible(hWnd)) lstrcat(*buf ? lstrcat(buf, _T(", ")) : buf, _T("Visible")); // IsWindowVisible is not exactly the same as WS_VISIBLE if (!(style & WS_DISABLED)) lstrcat(*buf ? lstrcat(buf, _T(", ")) : buf, _T("Enabled")); if (GetWindow(hWnd, GW_OWNER)) lstrcat(*buf ? lstrcat(buf, _T(", ")) : buf, _T("Owned")); if (IsHung(hWnd)) lstrcat(*buf ? lstrcat(buf, _T(", ")) : buf, _T("Hung")); SetDlgItemText(hDlg, IDC_WNDINFO, hWnd ? buf : NULL); UINT dpi = DPI::GetDpiForWindow(hWnd), mondpi = DPI::GetDpiForMonitor(hWnd); #ifndef _M_ARM64 // Not i386, AMD64 nor ARM(32-bit) if (!dpi) { OSVERSIONINFO osv; GetVersionEx((osv.dwOSVersionInfoSize = sizeof(osv), &osv)); if (MAKELONG(osv.dwMinorVersion, osv.dwMajorVersion) < MAKELONG(3, 6)) dpi = mondpi; // <= 8.0 has the same DPI on all monitors (blogs.windows.com/windowsexperience/2013/07/15/windows-8-1-dpi-scaling-enhancements/) } #endif UINT cch = wsprintf(buf, dpi ? _T("%u") : _T("?"), dpi); if ((DpiAwarePerMonitor() || dpi) && dpi != mondpi) wsprintf(buf + cch, _T(" (on %u)"), mondpi); // Don't display on >= 8.1 && < 10FU1607 (because we are not PMv1). GetDpiForWindow will also fail on those systems. SetDlgItemText(hDlg, IDC_WNDDPI, hWnd ? buf : NULL); } static INT_PTR CALLBACK SpyDlgProc(HWND hDlg, UINT Msg, WPARAM WParam, LPARAM LParam) { enum { TID_OUTLINE = 1 }; DIALOGDATA*pDD = DIALOGDATA::Get(hDlg); switch(Msg) { case WM_SIZE: if (WParam == SIZE_MAXIMIZED) ShowWindow(hDlg, SW_SHOWNOACTIVATE); // Disallow STARTF_USESHOWWINDOW+SW_MAXIMIZE break; case WM_INITDIALOG: DIALOGDATA::Set(hDlg, (pDD = (DIALOGDATA*) LParam)); CenterOnParent(hDlg); // On >= 10FU1703 we are PMv2 and Windows scales our dialog and child controls. // On >= 10FU1607 && < 10FU1703 we are System aware but try to upgrade this thread to // PMv1 to reduce compatibility handling in other USER32 functions. We don't want // the dialog HWND to be PMv1 because we are not going to manually reposition our controls. // On < 10FU1607 we only have the process awareness (not ideal). if (pDD->DialogAwarenessContext > DPI::ac_pm2) // Is the dialog AC < PMv2? Note: The canonical AC numbers are negative. DPI::SetThreadDpiAwarenessContext(DPI::ac_pm1); SendMessage(hDlg, WM_CAPTURECHANGED, 0, 0); break; case WM_CLOSE: close: return EndDialog(hDlg, 0); case WM_COMMAND: switch(WParam) { case IDCANCEL: goto close; case MAKELONG(IDC_SPYDRAG, STN_CLICKED): SetCapture(hDlg); pDD->hWndTarget = 0; pDD->Dragging++; SetDragSourceImage(hDlg, (INT_PTR) hDlg); SetCursor(LoadCursor(NULL, IDC_CROSS)); break; } break; case WM_MOUSEMOVE: if (pDD->Dragging) { POINT pt; GetCursorPos(&pt); HWND hWnd = GetChildWindowFromPointHelper(pt); if (hWnd == pDD->hWndTarget) break; pDD->hWndTarget = hWnd; if (GetAncestorRoot(hWnd) == hDlg) hWnd = 0; ShowWindowInfo(hDlg, hWnd); } break; case WM_LBUTTONUP: if (pDD->Dragging && pDD->hWndTarget) { if (!pDD->hWndOutline) { pDD->hWndOutline = CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_TOPMOST, WC_STATIC, NULL, WS_POPUP|WS_DISABLED|SS_BLACKRECT, 0, 0, 0, 0, hDlg, 0, 0, 0); SetWindowLongPtr(pDD->hWndOutline, GWLP_USERDATA, SetWindowLongPtr(pDD->hWndOutline, GWLP_WNDPROC, (LONG_PTR) OutlineWindowProc)); } SetWindowPos(pDD->hWndOutline, HWND_BOTTOM, -32767, -32767, 1, 1, SWP_SHOWWINDOW|SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOOWNERZORDER); // MSDN says LogicalToPhysicalPoint requires a visible window RECT r; GetPhysicalWindowRect(pDD->hWndTarget, r, hDlg), PhysicalToLogical(pDD->hWndOutline, r, hDlg); if (GetAncestorRoot(pDD->hWndTarget) != hDlg) { SetWindowPos(pDD->hWndOutline, HWND_TOPMOST, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_HIDEWINDOW|SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOOWNERZORDER); ShowWindow(pDD->hWndOutline, SW_SHOWNA); // To avoid a small Windows redraw bug, don't show the window until after it has the correct size } SetTimer(hDlg, TID_OUTLINE, 2 * 1000, NULL); } ReleaseCapture(); break; case WM_CAPTURECHANGED: SetFocus(GetDlgItem(hDlg, IDC_SPYDRAG)); pDD->Dragging = 0; SetDragSourceImage(hDlg, FALSE); break; case WM_TIMER: if (WParam == TID_OUTLINE) { KillTimer(hDlg, WParam); ShowWindow(pDD->hWndOutline, SW_HIDE); } break; } return FALSE; } struct ScopedThreadDpiAwarenessContext { // Note: Assumes InitializeDpiApi() has been called! struct List { List() : m_l(0) {} List operator <<(INT_PTR in) { List r = *this; r.m_l |= (1 << (in < 0 ? -in : in)); return r; } UINT GetBits() const { return m_l; } UINT m_l; }; ScopedThreadDpiAwarenessContext(List ACList) : m_OrgAC(0) { for (UINT s = DPI::ac_count, list = ACList.GetBits(); (m_AC = -(int)s); --s) if ((1 << s) & list) if ((m_OrgAC = DPI::SetThreadDpiAwarenessContext((INT_PTR) m_AC))) break; } ~ScopedThreadDpiAwarenessContext() { DPI::SetThreadDpiAwarenessContext(m_OrgAC); } int GetCanonicalActiveAwarenessContext() const { return m_AC; } INT_PTR m_OrgAC; int m_AC; // Canonical "active" DPI_AWARENESS_CONTEXT }; INT_PTR ShowWndSpy(HWND hOwner) { InitializeDpiApi(); ScopedThreadDpiAwarenessContext::List aclist; ScopedThreadDpiAwarenessContext stdac(aclist << DPI::ac_pm2 << DPI::ac_system); DIALOGDATA dd; dd.DialogAwarenessContext = stdac.GetCanonicalActiveAwarenessContext(); return DialogBoxParam(HINST_APPLICATION, MAKEINTRESOURCE(DLG_WNDSPY), hOwner, SpyDlgProc, (LPARAM) &dd); } nsis-3.11/Contrib/Math/000077500000000000000000000000001477201124000147015ustar00rootroot00000000000000nsis-3.11/Contrib/Math/Math.txt000077500000000000000000000240221477201124000163360ustar00rootroot00000000000000Math::Script NSIS plugin. C-like style scripting (operators at least). Tip1: plugin watches the case of the letters. Tip2: plugin makes almost no error checks. So YOU should check your script twice before run :) New HOW TO USE: run the MathTest.Exe, and try yourself. After spending some minutes your should be able to write your script by yourself. To include it to your NSIS script just insert that: Math::Script "YourScript1" Math::Script "YourScript2" Math::Script "YourScriptFinal" How to use it? Simple: Strcpy $0 "Brainsucker" Math::Script "a = 'Math'; B = 'Script'; r0 += ' wants to use ' + a + '::' + b +'!'" DetailPrint "$0" That string will fill r0 with some stuff. Here are some other samples: 10! (factorial, r0 will contain '10! = 362880'): r0 = '10! = ' + (1*2*3*4*5*6*7*8*9) the same: a = b = 1; #{++a <= 10, b = b*a}; r0 = (a-1) + '! = ' + b Some floating point: Strcpy $R0 "1e1" Math::Script "pi = 3.14159; R1 = 2*pi*R0; r0 = 'Length of circle with radius ' + R0 + ' is equal to ' + R1 + '.'" Detailprint "$0" Ok. Variables. NSIS: r0-r9 -> $0-$9. R0-R9 -> $R0-$R9. Also CL ($CMDLINE), ID ($INSTDIR), OD ($OUTDIR), LG ($LANG), ED ($EXEDIR). User definable: name starting from character, up to 28 letters long. Stacks. Two stacks are supported: NSIS stack and plugin's own stack. I see no reasons for using plugin stack, but if you will, remember - the plugin stores variables used at function to that stack before function execution, and restores after execution. Even less I recommend you to use NSIS stack. You should use it only for input/output. How to use? It's variable styled. Plugins stack is associated with S variable, and NSIS stack associated with NS variable. To push to stack just do "S=0" or "NS=0", to pop from stack "a=S" or "b=NS". Combined operations supported too: "S += 1.5" will increment value at the top of stack by 1.5. Supported types: int (in fact that is __int64), float (double in fact), string. Int: just numbers, may include sign. Float: -123.456, 123.456e-78, 123e-45 String: something in quotes ("", '', ``). There is also an array type. It is actually a reference type, so if b is array and you will perform "a=b", the a and b will reference a single array. To create a copy of array, use ca func: dest = ca(source). Btw - you couldn't control dimensions of arrays - they are autosized. To declare array: a = {}; To declare array and initialize some items with values: {"Hello!", "Use", "mixed types", 1.01e23, "like that" ,1234}; To access array: a[index] = "Cool"; Also [] operation could be used to strings. str[x] gives you a single char with index x (zero-based) as new string. str[-x] - the same, but x counts from the string end (so the last char is -1). str[x,y] gives you characters in range x-y (inclusive), both x and y could be <0 - in this case they counted from the end of the string. The function could be useful - is conversion of arrays to strings and back. Example: a = a("Hello"); str = s(a); After running such script array a will contain 6 integers (chars and last zero - end of string), and str will contain your string back. Operators (some binary, some unary): >>= <<= -= += /= *= |= &= ^= %= -- ++ >> << && || <= =< >= => != == = + - * / % < > & | ^ ~ ! Only some are applicable to float (logic & arithmetic) and string (+ and logic) of course. Additional case: reference/de-reference operators (& and *). & will give you the reference to argument which should be a variable (NSIS, user, array item, stack), and * will convert it back to original variable. For example (a=&b; *a=10) will set b to 10. Expression (*&a) is equal to simple (a). Script is set of expressions (mathematical in general) delimited with ';'. Processing is mathematically right (2+2*2 will give 6), operations are performed in a C like order (precedence). Flow control: if-then-else like: #[if-expression, then-expr, else-expr] example: #[a==0, b=1; c=2, b *= (--c); c/=10] C eq: if (a==0) { b=1; c=2;} else { b*=(c++);c-=10; } while (expr) do; like #{expr, do} example: #{(c<1.1e25)&&(b < 10), b++; c*=1.23} C eq: while ((c<1.1e25)&&(b<10)) { b++; c*=1.23; } WATCH OUT! Comma (,) separates if-expr, then-expr, and else-expr from each other. All sub-expressions separated by (;) are the part of one expression, and the result of the last one of these sub-exprs gives you the result of expression. All the stuff (like variables and functions) will be saved between calls. Functions: type conversions: l(string) returns the length of string or array argument s(source) converts source to string type i(source) converts source to int type f(source) converts source to float type c(source) if source is string, returns int value of first char, if source is int, returns string which consists of a single char (source) (+0 terminator). a(source) converts source to array (only string supported) ff(float, format) converts float to string, with format options. options = precision + flags. Precision shows how many digits after decimal point will be shown. Flags: 16 (or 0x10) - No Exponential View (number will be shown as 123.123) 32 (or 0x20) - Only exponential view (number will be shown as 123.12e123) 64 (or 0x40) - use 'E' character instead of 'e' By default the plugin decides itself how to show your number. math (description of all these functions is available at MSDN, use the second given name for search): sin(x), sin Sine of argument cos(x), cos Cosine of argument cel(x), ceil Ceil of argument (no fract. part) csh(x), cosh Hyperbolic Cosine of Argument exp(x), exp Exponential abs(x), abs Absolute value (warning: float) flr(x), floor Floor of argument (no fract. part) asn(x), asin ArcSine of argument acs(x), acos ArcCosine of argument atn(x), atan ArcTangent of argument ln(x), log Exponential Logarithm log(x), log10 Decimal logarithm snh(x), sinh Hyperbolic Sine of Argument sqt(x), sqrt Square root of argument tan(x), tan Tangent of argument tnh(x), tanh Hyperbolic tangent of argument functions taking two arguments at2(x, y) atan2 Arctangent of the value (y/x) pow(x, y) pow power, x^y fmd(x, y) fmod floating point remainder fex(x, o) frexp Gets the mantissa (result = r) and exponent (o) of floating-point number (x): x = r*(2^o) mdf(x, o) modf Splits a floating-point value into fractional and integer parts. User-defined functions. It's very simple. Example: test(a,b) (a+b); After that test(1,2) will give you 3. test2(a,b) (a=a+b; b *= a); The result of function is always the result of last expression. As said before it better not to use stack (S) in between function calls. It will be better to develop variable-safe functions, i.e. functions which will not corrupt variables. For this you should either push/pop them to stack, or declare as additional arguments, which will never be used. Example: test3(a,b,c) (c=10; #{--c > 0, a=sqrt(a*b)}; a) No matter how many arguments will be passed to function, the values of all three vars (a,b,c) will be saved. Such variable-safe functions could be recursive: Math::Script 'rec(a) (#[a > 0, rec(a-1), 0]+a);' Math::Script 'R1 = rec(10)' will set R1 to right result 55. Sometimes functions will need to return more than one value, in this case you could declare argument as referent (b at example): test4(a, &b) (*b = a*a; a*a*a) In this case test4 will return a^3, and if we will call it like that test4(a,c), it will place a^2 to c. BUT! Note: you should use de-referencer (*) with variable, at example *b. CAUTION: never use the same variable as function internal reference variable and external argument variable (for example test4(a,b)). It will surely fail. Also: if you declared argument as reference - you should never supply a constant expression to it. It could be either array item (array[1]), NSIS register R0, any of the user variables (beside the variable with the same name:), but never the constant. Another may-be-useful possibility is to redeclare the function (the usual declaration at the time when function already defined will simply call that function). For such task you could use "#name", like "func()(1); #func()(2);". But beware, function declaration occurs at time of parsing, so it's not possible to perform flow controlled declaration. SUCH IS NOT POSSIBLE: "#[a<0, #func()(1), #func()(2)]" IT WILL SIMPLY DEFINE #func as (2), as the latest variant. (c) Nik Medved (brainsucker)nsis-3.11/Contrib/Math/SConscript000077500000000000000000000005661477201124000167250ustar00rootroot00000000000000target = 'Math' files = Split(""" Source/Math.c Source/MyMath.c Source/plugin.c """) libs = Split(""" kernel32 user32 """) examples = Split(""" math.nsi mathtest.nsi mathtest.ini mathtest.txt """) docs = Split(""" Math.txt """) Import('BuildPlugin env') BuildPlugin(target, files, libs, examples, docs, nodeflib = False, flags = ['$CPP_FLAG'], entry = None) nsis-3.11/Contrib/Math/Source/000077500000000000000000000000001477201124000161415ustar00rootroot00000000000000nsis-3.11/Contrib/Math/Source/Math.c000077500000000000000000001631211477201124000172050ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #include #include // nsis plugin #include "MyMath.h" #include "Math.h" extern "C" int _fltused; #ifdef __MINGW32__ int _fltused = 1; #endif #define EIPtrToInt(pEI) ( (int) (INT_PTR) (pEI) ) // Make GCC (64-bit) happy. BUGBUG64: Somebody should verify that this truncation is OK ExpressionItem *stack; int UserVarsCount, UserFuncsCount; UserVar UserVars[MAX_USER_VARS]; UserFunc UserFuncs[MAX_USER_FUNCS]; void PrintTree(ExpressionItem *root, TCHAR *str); void ParseString(TCHAR *&sp, ExpressionItem* &itemplace); void CleanupItems(ExpressionItem* &itemplace); void PlaceVariable(TCHAR *&vb, ParseInfo *pi); void PlaceNewItem(TCHAR *&vb, ParseInfo *pi, int precedence) { ExpressionItem *newroot; PlaceVariable(vb, pi); if (pi->item == NULL) return; while ((pi->OpsStack) && (((EIPtrToInt(pi->OpsStack->param2)) < precedence) || (((EIPtrToInt(pi->OpsStack->param2)) == precedence) && (precedence != OPERATOR_SET_PRECEDENCE)))) { // second operand for our operator newroot = pi->OpsStack; *((ExpressionItem **)&(newroot->param2)) = pi->item; pi->OpsStack = newroot->next; newroot->next = NULL; pi->item = newroot; } // finally we have got new root newroot = pi->item; if (pi->SetupNewRoot) { (*pi->root)->next = newroot; pi->root = &((*pi->root)->next); pi->SetupNewRoot = 0; } if (*pi->place == *pi->root) *pi->place = *pi->root = newroot; else *pi->root = newroot; // no item at our pockets pi->item = NULL; } #define NSIS_VARS_COUNT 27 #define NSIS_VARS_STACK 25 #define NSIS_VARS_NSTACK 26 typedef TCHAR smallstr[2]; const smallstr NSISVariablesNames[NSIS_VARS_COUNT] = {{_T('r'),_T('0')}, {_T('r'),_T('1')}, {_T('r'),_T('2')}, {_T('r'),_T('3')}, {_T('r'),_T('4')}, {_T('r'),_T('5')}, {_T('r'),_T('6')}, {_T('r'),_T('7')}, {_T('r'),_T('8')}, {_T('r'),_T('9')}, {_T('R'),_T('0')}, {_T('R'),_T('1')}, {_T('R'),_T('2')}, {_T('R'),_T('3')}, {_T('R'),_T('4')}, {_T('R'),_T('5')}, {_T('R'),_T('6')}, {_T('R'),_T('7')}, {_T('R'),_T('8')}, {_T('R'),_T('9')}, {_T('C'),_T('L')}, {_T('I'),_T('D')}, {_T('O'),_T('D')}, {_T('E'),_T('D')}, {_T('L'),_T('G')}, {_T('S'),0}, {_T('N'),_T('S')}}; ExpressionItem *FindVariable(TCHAR *varname) { int i; ExpressionItem *item = AllocItem(); // check NSIS variables for (i = 0; i < NSIS_VARS_COUNT; i++) { if (lstrcmpn(varname, NSISVariablesNames[i],2) == 0) { if (i == NSIS_VARS_STACK) item->type = IT_VARIABLE | ITV_STACK; else if (i == NSIS_VARS_NSTACK) item->type = IT_VARIABLE | ITV_NSTACK; else item->type = (IT_VARIABLE | ITV_NSIS) + i; return item; } } // no.. that's user variable for (i = 0; i < UserVarsCount; i++) { if (lstrcmp(varname, UserVars[i].name) == 0) { // ok. we found user var expression needed break; } } if (i == UserVarsCount) { // new variable UserVarsCount++; lstrcpy(UserVars[i].name, varname); UserVars[i].item = NULL; } item->type = (IT_VARIABLE | ITV_USER) + i; return item; } void PlaceVariable(TCHAR *&vb, ParseInfo *pi) { if (vb <= pi->valbuf) return; *vb = 0; pi->item = FindVariable(pi->valbuf); vb = pi->valbuf; } typedef double (*math_d2)(double, double); typedef double (*math_ddp)(double, double*); typedef double (*math_di)(double, int*); #define MATHFUNCNUM 29 const MathFunction MathFunctions[MATHFUNCNUM] = { {{_T('s'),_T('i'),_T('n')}, ITF_MATH1 >> 8, sin}, {{_T('s'),_T('n'),_T('h')}, ITF_MATH1 >> 8, sinh}, {{_T('a'),_T('s'),_T('n')}, ITF_MATH1 >> 8, asin}, {{_T('c'),_T('o'),_T('s')}, ITF_MATH1 >> 8, cos}, {{_T('c'),_T('s'),_T('h')}, ITF_MATH1 >> 8, cosh}, {{_T('a'),_T('c'),_T('s')}, ITF_MATH1 >> 8, acos}, {{_T('t'),_T('a'),_T('n')}, ITF_MATH1 >> 8, tan}, {{_T('t'),_T('n'),_T('h')}, ITF_MATH1 >> 8, tanh}, {{_T('a'),_T('t'),_T('n')}, ITF_MATH1 >> 8, atan}, {{_T('a'),_T('b'),_T('s')}, ITF_MATH1 >> 8, fabs}, {{_T('l'),_T('n'),0}, ITF_MATH1 >> 8, log}, {{_T('l'),_T('o'),_T('g')}, ITF_MATH1 >> 8, log10}, {{_T('e'),_T('x'),_T('p')}, ITF_MATH1 >> 8, exp}, {{_T('s'),_T('q'),_T('t')}, ITF_MATH1 >> 8, sqrt}, {{_T('c'),_T('e'),_T('l')}, ITF_MATH1 >> 8, ceil}, {{_T('f'),_T('l'),_T('r')}, ITF_MATH1 >> 8, floor}, {{_T('a'),_T('t'),_T('2')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)atan2}, {{_T('p'),_T('o'),_T('w')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)pow}, {{_T('f'),_T('m'),_T('d')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)fmod}, // type conversions {{_T('i'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_INT}, {{_T('s'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_STRING}, {{_T('f'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_FLOAT}, {{_T('a'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_ARRAY}, #define ITFT_CARRAY_ID 23 {{_T('c'),_T('a'),0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_ARRAY}, {{_T('f'),_T('f'),0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_FLOATF}, {{_T('l'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_LEN}, {{_T('c'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_CHAR}, {{_T('f'),_T('e'),_T('x')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_di)frexp}, {{_T('m'),_T('d'),_T('f')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_ddp)modf}, }; void PlaceFunction(TCHAR *&vb, TCHAR *&sp, ParseInfo *pi, int redefine) { int i; ExpressionItem *item = pi->item = AllocItem(); *vb = 0; // check BUILTIN functions for (i = 0; i < MATHFUNCNUM; i++) { if (lstrcmpn(pi->valbuf, MathFunctions[i].name, 3) == 0) { item->type = IT_FUNCTION | (MathFunctions[i].type << 8) | i; // get first argument sp++; ParseString(sp, *((ExpressionItem **)(&item->param1))); if (*sp == _T(',')) { // get second argument sp++; ParseString(sp, *((ExpressionItem **)(&item->param2))); } sp++; vb = pi->valbuf; return; } } // heh, may be it user function for (i = 0; i < UserFuncsCount; i++) { if (lstrcmp(pi->valbuf, UserFuncs[i].name) == 0) { // Function found? Redefine option specified? if (redefine) break; item->type = IT_FUNCTION | ITF_USER | i; // get arguments list ExpressionItem **newplace = ((ExpressionItem **)(&pi->item->param1)); while (*sp != _T(')')) { *newplace = AllocItem(); (*newplace)->type = IT_EXPRESSION; sp++; ParseString(sp, *((ExpressionItem **)(&(*newplace)->param1))); newplace = &((*newplace)->next); } sp++; vb = pi->valbuf; return; } } // oops, we need no item for function definition CleanupItems(item); pi->item = NULL; // it's user function define int flags = 0; TCHAR buffer[128], *buf = buffer; // workaround for redefine flag - if the function already present, // it will be cleared and redefined UserFunc *f = &UserFuncs[i]; if (i == UserFuncsCount) UserFuncsCount++; else CleanupItems(f->root); lstrcpy(f->name, pi->valbuf); f->varflags = 0; f->varsnum = 0; do { sp++; switch (*sp) { case _T(' '): break; case _T(','): case _T(')'): if (buf > buffer) { *buf = 0; // it should be user variable ExpressionItem *it = FindVariable(buffer); f->vars[f->varsnum++] = (it->type) & ITEMOPTIONS; CleanupItems(it); buf = buffer; flags <<= 1; } break; case _T('&'): flags |= 1; break; default: *(buf++) = *sp; break; } } while (*sp != _T(')')); // prepare flag for fast analisys for (i = 0; i < f->varsnum; i++) { f->varflags <<= 1; flags >>= 1; f->varflags |= flags&1; } // find nearest round bracket - function body while (*sp != _T('(') && *sp) sp++; if (!*sp) return; sp++; // now we are ready to parse function body ParseString(sp, f->root); sp++; // closing bracket vb = pi->valbuf; #ifdef _DEBUG // dump function (in debug mode) TCHAR place[1024]; wsprintf(place, _T("function %s("), f->name); flags = f->varflags; for (i = 0; i < f->varsnum; i++) { if (flags&1) lstrcat(place, _T("&")); lstrcat(place, UserVars[f->vars[i]].name); if (i < f->varsnum-1) lstrcat(place, _T(", ")); flags >>= 1; } lstrcat(place, _T(")")); PrintTree(f->root, place); #endif } // operator options #define PO_UNARYPRE 0x1 // this operator can be uniary pre (--a) for ex #define PO_UNARYPOST 0x2 // this op can be uniary post (a++) (couldn't be binary) #define PO_PRENONCONST 0x4 // pre argument (a = b) -> a is non const #define PO_POSTNONCONST 0x8 // post argument (b--) is non const #define PO_LASTOP 0x10 // op should be the last item at expression (=, -=, etc) #define PO_SET 0x20 // op will set new value to one of args #define PO_USESPRE 0x40 // operator will use pre operand #define PO_USESPOST 0x80 // operator will use post operan void PlaceOp(TCHAR *&vb, int type, int precedence, ParseInfo *pi) { PlaceVariable(vb, pi); if ((type & PO_UNARYPRE) && (!pi->item)) { // uniary pre op ExpressionItem *item = AllocItem(); item->type = type; item->param2 = (EIPARAM) (INT_PTR) precedence; item->next = pi->OpsStack; pi->OpsStack = item; } else { // get previous tree as items and operators of lower precedence PlaceNewItem(vb, pi, precedence); // post operators ExpressionItem *item = AllocItem(); item->type = type; item->param1 = (EIPARAM) (*pi->root); if (*pi->place == *pi->root) *pi->place = *pi->root = NULL; else *pi->root = NULL; if (type & PO_UNARYPOST) { // uniary post op pi->item = item; } else { // binary operator item->param2 = (EIPARAM) (INT_PTR) precedence; item->next = pi->OpsStack; pi->OpsStack = item; } } } #define OPSNUM 35 const OpStruct Operators[OPSNUM] = { // three byte ops {{_T('>'),_T('>'),_T('=')}, 14, ITO_SHR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {{_T('<'),_T('<'),_T('=')}, 14, ITO_SHL | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, // two byte ops // !!! don't forget to change Set Operator Precedence !!! {_T("-="), 14, ITO_MINUS | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("+="), 14, ITO_PLUS | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("/="), 14, ITO_DIV | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("*="), 14, ITO_MUL | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("|="), 14, ITO_OR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("&="), 14, ITO_AND | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("^="), 14, ITO_XOR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("%="), 14, ITO_MOD | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("--"), 2, ITO_DEC | PO_POSTNONCONST | PO_PRENONCONST | PO_UNARYPRE | PO_UNARYPOST | PO_SET | PO_USESPRE | PO_USESPOST}, {_T("++"), 2, ITO_INC | PO_POSTNONCONST | PO_PRENONCONST | PO_UNARYPRE | PO_UNARYPOST | PO_SET | PO_USESPRE | PO_USESPOST}, {_T(">>"), 6, ITO_SHR | PO_USESPRE | PO_USESPOST}, {_T("<<"), 6, ITO_SHL | PO_USESPRE | PO_USESPOST}, // logical {_T("&&"), 12, ITO_LAND | PO_USESPRE | PO_USESPOST}, {_T("||"), 13, ITO_LOR | PO_USESPRE | PO_USESPOST}, // comparisons {_T("<="), 7, ITO_LE | PO_USESPRE | PO_USESPOST}, {_T("=<"), 7, ITO_LE | PO_USESPRE | PO_USESPOST}, {_T(">="), 7, ITO_GE | PO_USESPRE | PO_USESPOST}, {_T("=>"), 7, ITO_GE | PO_USESPRE | PO_USESPOST}, {_T("!="), 8, ITO_NE | PO_USESPRE | PO_USESPOST}, {_T("=="), 8, ITO_EQ | PO_USESPRE | PO_USESPOST}, // single byte ops // !!! don't forget to change Set Operator Precedence !!! {_T("="), 14, ITO_SET | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPOST}, {_T("+"), 5, ITO_PLUS | PO_USESPRE | PO_USESPOST}, {_T("-"), 5, ITO_MINUS | PO_USESPRE | PO_USESPOST | PO_UNARYPRE}, {_T("*"), 4, ITO_MUL | PO_USESPRE | PO_USESPOST | PO_UNARYPRE}, {_T("/"), 4, ITO_DIV | PO_USESPRE | PO_USESPOST}, {_T("%"), 4, ITO_MOD | PO_USESPRE | PO_USESPOST}, {_T("<"), 7, ITO_LS | PO_USESPRE | PO_USESPOST}, {_T(">"), 7, ITO_GR | PO_USESPRE | PO_USESPOST}, {_T("&"), 9, ITO_AND | PO_USESPRE | PO_USESPOST | PO_UNARYPRE}, {_T("|"), 11, ITO_OR | PO_USESPRE | PO_USESPOST}, {_T("^"), 10, ITO_XOR | PO_USESPRE | PO_USESPOST}, {_T("~"), 3, ITO_NOT | PO_USESPOST | PO_UNARYPRE}, {_T("!"), 3, ITO_LNOT |PO_USESPOST | PO_UNARYPRE} }; void CheckForOperator(TCHAR *&sp, TCHAR *&vb, ParseInfo *pi) { for (int op = 0; op < OPSNUM; op++) { int c = lstrlen(Operators[op].name); if (c > 3) c = 3; // real operator length if (lstrcmpn(sp, Operators[op].name, c)) { // wrong - different op continue; } // that is our op sp += c; PlaceOp(vb, ((int) Operators[op].type) | IT_OPERATOR, Operators[op].precedence, pi); break; } } void ParseString(TCHAR *&sp, ExpressionItem* &itemplace) { ParseInfo pi = {0, NULL, NULL, &itemplace, &itemplace}; int redefine = 0; TCHAR *vb = pi.valbuf; // cycle until current expression end while ((*sp != 0) && (*sp != _T(')')) && (*sp != _T('}')) && (*sp != _T(']')) && (*sp != _T(','))) { int processed = 1; switch (*sp) { case _T(' '): case _T('\t'): sp++; break; case _T(';'): // expression delimiter PlaceNewItem(vb, &pi, 255); if (*pi.root) pi.SetupNewRoot = 1; sp++; break; case _T('0'): case _T('1'): case _T('2'): case _T('3'): case _T('4'): case _T('5'): case _T('6'): case _T('7'): case _T('8'): case _T('9'): // variable & function names could contain numbers as non first chars if (vb > pi.valbuf) { processed = FALSE; break; } case _T('\''): case _T('\"'): case _T('`'): // constant meet pi.item = AllocItem(); StringToItem(sp, pi.item, STI_STRING | STI_FLOAT | STI_INT); break; case _T('('): // start of function or expression if (vb > pi.valbuf) { // thats function PlaceFunction(vb, sp, &pi, redefine); } else { // expression sp++; ParseString(sp, pi.item); if (*sp == _T(')')) sp++; } redefine = 0; break; case _T('#'): // start of one of logical expressions sp++; if ((*sp != _T('[')) && (*sp != _T('{'))) { // function redefine flag redefine = 1; break; } { pi.item = AllocItem(); // IF or WHILE pi.item->type = ((*sp == _T('['))?(IT_LOGIC | ITL_IF):(IT_LOGIC | ITL_WHILE)); // first expr - logic statement sp++; ParseString(sp, *((ExpressionItem **)(&pi.item->param1))); // ok, second expr - then, third - else statement.. others??? ExpressionItem **newplace = ((ExpressionItem **)(&pi.item->param2)); while (*sp == _T(',')) { *newplace = AllocItem(); (*newplace)->type = IT_EXPRESSION; sp++; ParseString(sp, *((ExpressionItem **)(&(*newplace)->param1))); newplace = &((*newplace)->next); } } sp++; break; case _T('['): { // thats array access PlaceOp(vb, IT_ARRAY | ITA_ACCESS | PO_UNARYPOST, 1, &pi); sp++; // item index ParseString(sp, *(ExpressionItem **)&(pi.item->param2)); if (*sp == _T(',')) { // two indexes - string access ExpressionItem *it = AllocItem(); it->type = IT_EXPRESSION; it->param1 = (EIPARAM) *(ExpressionItem **)&(pi.item->param2); *(ExpressionItem **)&(pi.item->param2) = it; it = it->next = AllocItem(); it->type = IT_EXPRESSION; sp++; ParseString(sp, *((ExpressionItem **)(&it->param1))); } sp++; } break; case _T('{'): // start of array define { // array define - consists of array copy operator and array define itself // type conversion item (to create a copy of array) pi.item = AllocItem(); pi.item->type = IT_FUNCTION | ITF_TYPE | ITFT_CARRAY_ID | ITFA_COPY; // during first create our array descriptor and array pointers ExpressionItem *ai = AllocArray(DEFAULT_ARRAY_SIZE); pi.item->param1 = (EIPARAM) ai; ArrayDesc *ad = *((ArrayDesc**)&(ai->param1)); // parse array initializers while (*sp != _T('}')) { sp++; ParseString(sp, ad->array[ad->count]); if (ad->array[ad->count]) ad->count++; } sp++; } break; case _T('-'): case _T('+'): case _T('<'): case _T('='): case _T('>'): case _T('/'): case _T('*'): case _T('~'): case _T('^'): case _T('!'): case _T('&'): case _T('|'): case _T('%'): CheckForOperator(sp, vb, &pi); break; // non expression? ok, then it should be common char, like function or var name default: processed = FALSE; break; } if (!processed) *(vb++) = *(sp++); } PlaceNewItem(vb, &pi, 255); } void CleanupArray(ArrayDesc *ad) { if (!(--(ad->references))) { // last array reference, we could kill it // cleanup array items for (int i = 0; i < ad->count; i++) { ExpressionItem *aritem = ad->array[i]; if (aritem) CleanupItems(aritem); } // cleanup ptrs and descriptor dbgGlobalFree(ad->array); dbgGlobalFree(ad); } } void CleanupItems(ExpressionItem* &itemplace) { if (itemplace == NULL) return; ExpressionItem *item = itemplace, *itemnext; do { if (((item->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_VARIABLE|ITV_ARRITEM)) || ((item->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_ARRAY))) { CleanupArray((ArrayDesc *)item->param1); } else if ((item->type & ITEMTYPE) == IT_CONST) { if ((item->type & ITEMSUBTYPE) == ITC_STRING) dbgGlobalFree((HGLOBAL) item->param1); } else { CleanupItems(*((ExpressionItem**) &item->param1)); CleanupItems(*((ExpressionItem**) &item->param2)); } // free the item itself itemnext = item->next; dbgGlobalFree((HGLOBAL) item); item = itemnext; } while (item != NULL); itemplace = NULL; } #ifdef _DEBUG HANDLE myfile; TCHAR *opsnames[] = {_T(""), _T("-"), _T("+"), _T("<<"), _T(">>"), _T("*"), _T("/"), _T("="), _T("&&"), _T("||"), _T("++"), _T("--"), _T("=<"), _T(">="), _T("!="), _T("=="), _T("<"), _T(">"), _T("&"), _T("%"), _T("|"), _T("^"), _T("~"), _T("!")}; void PrintNode(int index, int spaces, ExpressionItem* itemplace) { if (itemplace == NULL) return; ExpressionItem *item = itemplace; do { DWORD wrote; TCHAR buffer[1024], *place = buffer; for (int k = 0; k < spaces; k++) *(place++) = 32; *place = 0; switch (item->type & ITEMTYPE) { case IT_EXPRESSION: wsprintf(place, _T("Expression Place-Holder ")); break; case IT_CONST: switch (item->type & ITEMSUBTYPE) { case ITC_STRING: wsprintf(place, _T("String: \"%s\""), (TCHAR *) item->param1); break; case ITC_INT: wsprintf(place, _T("Int: ")); itoa64(*((__int64*)&(item->param1)), place+5); break; case ITC_FLOAT: wsprintf(place, _T("Float: ")); FloatFormat(place+7, *((double*)&(item->param1)), 6); break; case ITC_ARRAY: ArrayDesc *ad = (ArrayDesc*) item->param1; wsprintf(place, _T("Array, ptr %08X, size %d, count %d, references %d"), ad->array, ad->size, ad->count, ad->references); break; } _tcscat(place, _T(" ")); break; case IT_OPERATOR: wsprintf(place, _T("Op: %s%s "), opsnames[(item->type & ITEMSUBTYPE) >> 8], (item->type & PO_SET)?(_T("(=)")):(_T(""))); break; case IT_VARIABLE: switch (item->type & ITEMSUBTYPE) { case ITV_NSIS: { TCHAR buffer[128]; buffer[0] = NSISVariablesNames[item->type & ITEMOPTIONS][0]; buffer[1] = NSISVariablesNames[item->type & ITEMOPTIONS][1]; buffer[2] = 0; wsprintf(place, _T("Var: %s (%d) "), buffer, item->type & ITEMOPTIONS); } break; case ITV_USER: wsprintf(place, _T("Var: %s (%d) "), UserVars[item->type & ITEMOPTIONS].name, item->type & ITEMOPTIONS); break; case ITV_STACK: wsprintf(place, _T("Plugin Stack ")); break; case ITV_NSTACK: wsprintf(place, _T("NSIS Stack ")); break; } break; case IT_LOGIC: if ((item->type & ITEMSUBTYPE) == ITL_IF) wsprintf(place, _T("IF ")); else wsprintf(place, _T("WHILE ")); break; case IT_FUNCTION: if (((item->type & ITEMSUBTYPE) == ITF_MATH1) || ((item->type & ITEMSUBTYPE) == ITF_MATH2) || ((item->type & ITEMSUBTYPE) == ITF_TYPE)) { TCHAR buffer[128]; buffer[0] = (MathFunctions[item->type &ITEMOPTIONS].name)[0]; buffer[1] = (MathFunctions[item->type &ITEMOPTIONS].name)[1]; buffer[2] = (MathFunctions[item->type &ITEMOPTIONS].name)[2]; buffer[3] = 0; wsprintf(place, _T("Built-In Function %s() [%d] "), buffer, item->type &ITEMOPTIONS); } else { UserFunc *f = &(UserFuncs[item->type & ITEMOPTIONS]); wsprintf(place, _T("User Function: %s("), f->name); int flags = f->varflags; for (int i = 0; i < f->varsnum; i++) { if (flags&1) lstrcat(place, _T("&")); lstrcat(place, UserVars[f->vars[i]].name); if (i < f->varsnum-1) lstrcat(place, _T(", ")); flags >>= 1; } lstrcat(place, _T(") ")); } break; case IT_ARRAY: wsprintf(place, _T("Array access [] ")); break; } place += lstrlen(place); wsprintf(place, _T("Addr: %08X Type: %08X Next: %08X Param1: %08X Param2: %08X"), item, item->type, item->next, item->param1, item->param2); lstrcat(place, _T("\n")); WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL); if (((item->type & ITEMTYPE) != IT_CONST) && ((item->type & (ITEMTYPE|ITEMSUBTYPE)) != (IT_VARIABLE|ITV_ARRITEM))) { place = buffer; for (int k = 0; k < spaces+2; k++) *(place++) = 32; int show = 0; if (((item->param1 != NULL) && ((*((ExpressionItem**) &item->param1))->next != NULL)) || ((item->param2 != NULL) && ((*((ExpressionItem**) &item->param2))->next != NULL))) show = 1; if (show) { wsprintf(place, _T("Sub1:\n")); WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL); } PrintNode(1, spaces + 4, *((ExpressionItem**) &item->param1)); if (show) { wsprintf(place, _T("Sub2:\n")); WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL); } PrintNode(2, spaces + 4, *((ExpressionItem**) &item->param2)); } else if ((item->type & (ITEMSUBTYPE|ITEMTYPE)) == (ITC_ARRAY|IT_CONST)) { ArrayDesc *ad = (ArrayDesc *) item->param1; for (int i = 0; i < ad->count; i++) { ExpressionItem *aritem = ad->array[i]; if (aritem) PrintNode(2, spaces + 4, aritem); } } item = item->next; } while (item != NULL); } void PrintTree(ExpressionItem *root, TCHAR *str) { myfile = CreateFile(_T("d:\\math.debug"), GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, 0); SetFilePointer(myfile, 0, NULL, FILE_END); TCHAR buffer[1024]; DWORD wrote; wsprintf(buffer, _T("New tree for \'%s\'\n"), str); WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL); PrintNode(0, 4, root); CloseHandle(myfile); myfile = NULL; } #endif void CopyArray(ExpressionItem *&item) { if (item == NULL) return; // especial case - array to array conversion is requested array copy ExpressionItem *olditem = item; ArrayDesc *oad = (ArrayDesc *) (olditem->param1); // Initialize the array of the same size item = AllocArray(oad->size); ArrayDesc *nad = (ArrayDesc *) (item->param1); nad->count = oad->count; // copy items for (int i = 0; i < oad->count; i++) nad->array[i] = CopyItem(oad->array[i], TRUE); // cleanup old array pointer (may be array itself) CleanupItems(olditem); } void ItemToType(ExpressionItem* &item, int type) { TCHAR *buffer, *bp; if (item == NULL) return; int itemt = item->type & ITEMTYPE, oldtype = item->type & ITEMSUBTYPE; if (((itemt == IT_CONST) && (oldtype == type)) || (itemt != IT_CONST)) return; switch (type) { case ITC_STRING: buffer = AllocString(); ItemToString(buffer, item); item->param1 = (EIPARAM) buffer; item->param2 = 0; break; case ITC_FLOAT: if (oldtype == ITC_INT) *((double *)&(item->param1)) = (double) *((__int64 *)&(item->param1)); else { bp = buffer = (TCHAR*) item->param1; StringToItem(buffer, item, STI_FLOAT); dbgGlobalFree(bp); } break; case ITC_INT: if (oldtype == ITC_FLOAT) *((__int64 *)&(item->param1)) = (__int64) *((double *)&(item->param1)); else { bp = buffer = (TCHAR*) item->param1; StringToItem(buffer, item, STI_INT); dbgGlobalFree(bp); } break; case ITC_ARRAY: if (oldtype == ITC_STRING) { TCHAR *buf = (TCHAR*) item->param1; int len = lstrlen(buf)+1; ExpressionItem *ni = AllocArray(lstrlen(buf)+1); ArrayDesc *ad = (ArrayDesc*) ni->param1; for (int i = 0; i < len; i++) { ad->array[i] = AllocItem(); *((__int64 *) &(ad->array[i]->param1)) = (__int64) buf[i]; } ad->count = len; CleanupItems(item); item = ni; } break; } item->type = IT_CONST | type; } void SaveResult(ExpressionItem *var, ExpressionItem *result) { if ((var->type & ITEMTYPE) != IT_VARIABLE) return; // result should be stored at variable to int varindex = var->type & ITEMOPTIONS; switch (var->type & ITEMSUBTYPE) { case ITV_NSIS: { // store string result direct to NSIS variable TCHAR *ptr = g_variables + varindex*g_stringsize; ItemToString(ptr, result); } break; case ITV_USER: { CleanupItems(UserVars[varindex].item); UserVars[varindex].item = CopyItem(result); } break; case ITV_ARRITEM: { ExpressionItem *&ei = ((ArrayDesc*)(var->param1))->array[(UINT_PTR)(var->param2)]; CleanupItems(ei); ei = CopyItem(result); } break; case ITV_STACK: { ExpressionItem *newitem = CopyItem(result); newitem->next = stack; stack = newitem; } break; case ITV_NSTACK: { TCHAR *buf = AllocString(); ItemToString(buf, result); pushstring(buf); dbgGlobalFree(buf); } break; } } void RunAndGetConst(ExpressionItem* from, ExpressionItem* &result, int type) { RunTree(from, result, type | RTO_NEEDCONST); ItemToType(result, type); } void RunTree(ExpressionItem *from, ExpressionItem* &result, int options) { ExpressionItem *item = from; result = NULL; while (item != NULL) { CleanupItems(result); int type = item->type & ITEMTYPE, subtype = item->type & ITEMSUBTYPE, ioptions = item->type & ITEMOPTIONS; switch (type) { case IT_EXPRESSION: RunTree(*((ExpressionItem**)&(item->param1)), result, options); break; case IT_CONST: result = CopyItem(item); break; case IT_VARIABLE: if (options & RTO_NEEDCONST) { // we need const result - :) is it nsis or common variable switch (subtype) { case ITV_NSIS: { // nsis result = AllocItem(); TCHAR *variable = getuservariable(ioptions); StringToItem(variable, result, options); } break; case ITV_USER: { // usual variable if (UserVars[ioptions].item) result = CopyItem(UserVars[ioptions].item); else result = AllocItem(); } break; case ITV_ARRITEM: { // array item ExpressionItem *ei = ((ArrayDesc*)(item->param1))->array[(UINT_PTR)(item->param2)]; if (ei) result = CopyItem(ei); else result = AllocItem(); } break; case ITV_STACK: { // pop from plugin stack result = stack; if (result == NULL) result = AllocItem(); stack = result->next; result->next = NULL; } break; case ITV_NSTACK: { // NSIS stack TCHAR buffer[1024], *buf = buffer; result = AllocItem(); popstring(buffer); StringToItem(buf, result, options); } break; } } else // if we don't need const - we will just pass variable record result = CopyItem(item); break; case IT_OPERATOR: { ExpressionItem *var = NULL, *item1 = NULL, *item2 = NULL; // prepare arguments in case of SET operator if (ioptions & PO_SET) { if ((item->param1) && (ioptions & PO_PRENONCONST)) { RunTree(*((ExpressionItem**)&(item->param1)), var, 0); if (ioptions & PO_USESPRE) RunTree(var, item1, RTO_NEEDCONST | STI_INT | STI_FLOAT | STI_STRING); } else if ((item->param2) && (ioptions & PO_POSTNONCONST)) { RunTree(*((ExpressionItem**)&(item->param2)), var, 0); if (ioptions & PO_USESPOST) RunTree(var, item2, RTO_NEEDCONST | STI_INT | STI_FLOAT | STI_STRING); } } // prepare arguments in case of any operator int needmore = 1; if ((!item1) && (item->param1) && (ioptions & PO_USESPRE)) { RunTree(*((ExpressionItem**)&(item->param1)), item1, RTO_NEEDCONST | STI_INT | STI_FLOAT | STI_STRING); // logical expressions && and || can make decision on first arg basis if ((subtype == ITO_LAND) || (subtype == ITO_LOR) ) { ItemToType(item1, ITC_INT); int res = (int) *((__int64*) &(item1->param1)); if (((res)&&(subtype==ITO_LOR)) || ((!res)&&(subtype==ITO_LAND))) needmore = 0; } } // get-reference operator if ((!item1) && (subtype == ITO_AND) && (!item2) && (item->param2)) { RunTree(*((ExpressionItem**)&(item->param2)), result, 0); break; } if ((needmore) && (!item2) && (item->param2) && (ioptions & PO_USESPOST)) RunTree(*((ExpressionItem**)&(item->param2)), item2, RTO_NEEDCONST | STI_INT | STI_FLOAT | STI_STRING); // reference operator if ((!item1) && (subtype == ITO_MUL) && ((item2->type & ITEMTYPE) == (IT_VARIABLE))) { // ok, that's the result we need if (options & RTO_NEEDCONST) { RunTree(item2, result, options); CleanupItems(item2); } else result = item2; break; } __int64 i1=0, i2=0, i3=0, i4=0; if (((!item1)||((item1->type & ITEMTYPE)==IT_CONST)) && ((!item2)||((item2->type & ITEMTYPE)==IT_CONST))) { // find the best type match for operation int it1 = (item1 && (ioptions & PO_USESPRE))?(item1->type & ITEMSUBTYPE):(ITC_UNKNOWN), it2 = (item2 && (ioptions & PO_USESPOST))?(item2->type & ITEMSUBTYPE):(ITC_UNKNOWN), type = (it1 < it2)?(it1):(it2); // convert operands to desired type ItemToType(item1, type); ItemToType(item2, type); switch (type) { case ITC_INT: { i1 = (item1)?(*((__int64*)&item1->param1)):(0); i2 = (item2)?(*((__int64*)&item2->param1)):(0); switch (subtype) { case ITO_MINUS: i1 -= i2; break; // unary minus auto handled with NULL case ITO_PLUS: i1 += i2; break; case ITO_SHL: i1 <<= i2; break; case ITO_SHR: i1 >>= i2; break; case ITO_MUL: i1 *= i2; break; case ITO_MOD: case ITO_DIV: if (i2 == 0) { i3 = 0; i4 = i1; } else { i3 = i1 / i2; i4 = i1 % i2; } if (subtype == ITO_DIV) i1 = i3; else i1 = i4; break; case ITO_SET: i1 = i2; break; case ITO_LE: i1 = (i1 <= i2); break; case ITO_GE: i1 = (i1 >= i2); break; case ITO_NE: i1 = (i1 != i2); break; case ITO_EQ: i1 = (i1 == i2); break; case ITO_LS: i1 = (i1 < i2); break; case ITO_GR: i1 = (i1 > i2); break; case ITO_AND: i1 = (i1 & i2); break; case ITO_OR: i1 = (i1 | i2); break; case ITO_XOR: i1 = (i1 ^ i2); break; case ITO_NOT: i1 = ~i2; break; case ITO_LNOT: i1 = !i2; break; case ITO_LAND: i1 = i1 && i2; break; case ITO_LOR: i1 = i1 || i2; break; case ITO_INC: if (item1) i2 = i1++; else i1 = ++i2; break; case ITO_DEC: if (item1) i2 = i1--; else i1 = --i2; break; } result = AllocItem(); *((__int64*)&result->param1) = i1; } break; case ITC_FLOAT: { int ir = -666; double i1 = (item1)?(*((double*)&item1->param1)):(0.0); double i2 = (item2)?(*((double*)&item2->param1)):(0.0); switch (subtype) { case ITO_MINUS: i1 -= i2; break; // unary minus auto handled with NULL case ITO_PLUS: i1 += i2; break; case ITO_MUL: i1 *= i2; break; case ITO_DIV: i1 /= i2; break; case ITO_SET: i1 = i2; break; case ITO_LE: ir = (i1 <= i2); break; case ITO_GE: ir = (i1 >= i2); break; case ITO_NE: ir = (i1 != i2); break; case ITO_EQ: ir = (i1 == i2); break; case ITO_LS: ir = (i1 < i2); break; case ITO_GR: ir = (i1 > i2); break; } result = AllocItem(); if (ir == -666) { // if ir value left intact - result is double result->type = IT_CONST | ITC_FLOAT; *((double*)&result->param1) = i1; } else *((__int64*)&result->param1) = (__int64) ir; } break; case ITC_STRING: { int ir = -666; TCHAR *i1 = (item1)?((TCHAR*)item1->param1):(NULL); TCHAR *i2 = (item2)?((TCHAR*)item2->param1):(NULL); int sc = (i1 && i2)?(lstrcmp(i1, i2)):((i1)?(1):((i2)?(-1):(0))); switch (subtype) { case ITO_PLUS: lstrcat(i1, i2); break; case ITO_SET: i1 = i2; break; case ITO_LE: ir = (sc <= 0); break; case ITO_GE: ir = (sc >= 0); break; case ITO_NE: ir = (sc != 0); break; case ITO_EQ: ir = (sc == 0); break; case ITO_LS: ir = (sc < 0); break; case ITO_GR: ir = (sc > 0); break; } if (ir == -666) { result = CopyItem((item1)?(item1):(item2)); } else { result = AllocItem(); *((__int64*)&result->param1) = (__int64) ir; } } break; case ITC_ARRAY: result = CopyItem(item2); break; } } // check for both items constant // the other case - usually UniaryPre operators working with non constants else result = CopyItem(item2); if (ioptions & PO_SET) { // Save our result in output variable SaveResult(var, result); } // Actual value to be returned as result is at i2 for ++ and -- ops if ((subtype == ITO_DEC) || (subtype == ITO_INC)) *((__int64*)&result->param1) = i2; CleanupItems(item1); CleanupItems(item2); CleanupItems(var); } break; case IT_LOGIC: { int ifmode = (subtype == ITL_IF); ExpressionItem *ifbr = *((ExpressionItem**)&(item->param1)), *dobr = *((ExpressionItem**)&(item->param2)), *thbr = NULL, *elbr = NULL; // check do branche for existence if (dobr && ifmode) { // then... thbr = *((ExpressionItem**)&(dobr->param1)); // ... and else branches if (dobr->next) elbr = *((ExpressionItem**)&(dobr->next->param1)); } while (true) { RunAndGetConst((ifbr), result, ITC_INT); if (ifmode) { // we need then or else branch? if ((*((__int64*)&result->param1))) dobr = thbr; else dobr = elbr; } else { // while mode if (!(*((__int64*)&result->param1))) break; } // ok, run the approtiate branch of if statement (if available) if (dobr) { CleanupItems(result); RunTree(dobr, result, options); } if (ifmode) break; CleanupItems(result); } } break; case IT_FUNCTION: if (subtype == ITF_USER) { int i; UserFunc *f = &(UserFuncs[ioptions]); int flags = f->varflags; ExpressionItem *ip = *((ExpressionItem**)&(item->param1)); ExpressionItem *si = AllocItem(), *var = AllocItem(); ExpressionItem *vals[32]; si->type = IT_VARIABLE | ITV_STACK; for (i = 0; i < f->varsnum; i++) { // push every variable ExpressionItem *val; var->type = (IT_VARIABLE | ITV_USER) + f->vars[i]; RunTree(var, val, RTO_NEEDCONST | ITC_STRING | ITC_INT | ITC_FLOAT | ITC_ARRAY); SaveResult(si, val); CleanupItems(val); // calculate argument value and for future if (ip) { if (flags&1) { // var ptr required RunTree(*((ExpressionItem**)&(ip->param1)), vals[i], 0); } else { RunTree(*((ExpressionItem**)&(ip->param1)), vals[i], RTO_NEEDCONST | ITC_STRING | ITC_INT | ITC_FLOAT | ITC_ARRAY); } ip = ip->next; } else vals[i] = AllocItem(); flags >>= 1; } // now when all values got we could save them to variables for (i = 0; i < f->varsnum; i++) { var->type = (IT_VARIABLE | ITV_USER) + f->vars[i]; SaveResult(var, vals[i]); CleanupItems(vals[i]); } // ok, call the func RunTree(f->root, result, RTO_NEEDCONST | ITC_STRING | ITC_INT | ITC_FLOAT | ITC_ARRAY); // pop original params for (i = f->varsnum-1; i >= 0; i--) { // pop every variable ExpressionItem *val; var->type = (IT_VARIABLE | ITV_USER) + f->vars[i]; RunTree(si, val, RTO_NEEDCONST | ITC_STRING | ITC_INT | ITC_FLOAT | ITC_ARRAY); SaveResult(var, val); CleanupItems(val); } // free used items CleanupItems(si); CleanupItems(var); } else if (subtype == ITF_TYPE) { INT_PTR newtype = (INT_PTR) MathFunctions[ioptions].fptr; if (newtype < ITC_UNKNOWN) { // get as possibly close to ready expression int truncatednewtype = (int) newtype; // BUGBUG64: Make sure this is safe for 64-bit, meaning, can newtype be < INT_MIN? RunAndGetConst((item->param1), result, truncatednewtype); if (ioptions == ITFT_CARRAY_ID) CopyArray(result); } else if (newtype == FTT_FLOATF) { // float format function ExpressionItem *arg1, *arg2; RunAndGetConst((item->param1), arg1, ITC_FLOAT); double value = *((double*)&(arg1->param1)); RunAndGetConst((item->param2), arg2, ITC_INT); int format = (int) *((__int64*)&(arg2->param1)); result = AllocItem(); result->type = IT_CONST | ITC_STRING; result->param1 = (EIPARAM) AllocString(); FloatFormat((TCHAR*) result->param1, value, format); CleanupItems(arg1); CleanupItems(arg2); } else if (newtype == FTT_LEN) { // length function RunTree(*((ExpressionItem **) &(item->param1)), result, RTO_NEEDCONST | ITC_STRING | ITC_ARRAY); if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_ARRAY)) { int len = ((ArrayDesc*)(result->param1))->count; CleanupItems(result); result = AllocItem(); *((__int64*)&(result->param1)) = (__int64) len; break; } else if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) != (IT_CONST|ITC_STRING)) ItemToType(result, ITC_STRING); if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_STRING)) { // ok, that's string int len = lstrlen((TCHAR*)result->param1); dbgGlobalFree((HGLOBAL) result->param1); *((__int64*)&(result->param1)) = (__int64) len; result->type = IT_CONST | ITC_INT; } else CleanupItems(result); } else { // only one left - c() - char/int/char conversion RunTree(*((ExpressionItem **) &(item->param1)), result, RTO_NEEDCONST | ITC_STRING | ITC_INT); if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_STRING)) { // ok, that's string - convert first char to int int chr = (*((TCHAR*)result->param1)) & 0xFF; dbgGlobalFree((HGLOBAL) result->param1); *((__int64*)&(result->param1)) = (__int64) chr; result->type = IT_CONST | ITC_INT; break; } if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_INT)) { // ok, that's int - convert to new string (char+0) int chr = (int) (*((__int64*)&(result->param1))) & 0xFF; result->param1 = (EIPARAM) AllocString(); *((TCHAR*)result->param1) = (TCHAR) chr; *((TCHAR*)(result->param1+1)) = (TCHAR) 0; result->type = IT_CONST | ITC_STRING; break; } else CleanupItems(result); } } else { // oops :-o function call :) RunAndGetConst((item->param1), result, ITC_FLOAT); double &value = *((double*)&(result->param1)); if (subtype == ITF_MATH1) { // Built-In math function with 1 arg value = MathFunctions[ioptions].fptr(value); } else if (subtype == ITF_MATH2) { // Built-In math function with 2 args if (ioptions >= MATHFUNCNUM-2) { // specific function - we need second arg as out ExpressionItem *arg2, *res2 = AllocItem(); RunTree(*((ExpressionItem**)&(item->param2)), arg2, 0); if (ioptions == MATHFUNCNUM-1) { // fmodf function - second arg is ptr to double res2->type = IT_CONST | ITC_FLOAT; double &v = *((double*)&(res2->param1)); value = ((Math2dFuncPtr)(MathFunctions[ioptions].fptr))(value, &v); } else { // frexp function - second arg is ptr to int int v = 0; value = ((Math2iFuncPtr)(MathFunctions[ioptions].fptr))(value, &v); *((__int64 *)&(res2->param1)) = (__int64) v; } SaveResult(arg2, res2); CleanupItems(arg2); CleanupItems(res2); } else { // normal 2-arg math function ExpressionItem *arg2; RunAndGetConst((item->param2), arg2, ITC_FLOAT); double value2 = *((double*)&(arg2->param1)); value = ((Math2FuncPtr)(MathFunctions[ioptions].fptr))(value, value2); CleanupItems(arg2); } } } break; case IT_ARRAY: { // currently only array access is used ExpressionItem *index, *aritem; RunTree(*((ExpressionItem **) &(item->param1)), aritem, RTO_NEEDCONST | ITC_STRING | ITC_ARRAY); if ((aritem->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST | ITC_STRING)) { // argument is string TCHAR *str = (TCHAR*)(aritem->param1); int len = lstrlen(str); // have we two indexes or one? if ((*((ExpressionItem **) &(item->param2)))->type != IT_EXPRESSION) { // one index - user need a char RunAndGetConst((item->param2), index, ITC_INT); int pos = (int) *((__int64*)&(index->param1)); if (pos < 0) pos += len; // -index - means from end if ((pos > len) || (pos < 0)) *str = 0; // index is across string boundaries else { // new string - just a single char *str = *(str+pos); *(str+1) = 0; } } else { // two indexes ExpressionItem *index2; // if first index is skipped -> 0 (from first char) if ((*((ExpressionItem **) &(item->param2)))->param1 == 0) index = AllocItem(); else RunAndGetConst(((*((ExpressionItem **) &(item->param2)))->param1), index, ITC_INT); if ((*((ExpressionItem **) &(item->param2)))->next->param1 == 0) { // if second index is skipped -> -1 (till last char) index2 = AllocItem(); *((__int64*)&(index2->param1)) = -1; } else RunAndGetConst(((*((ExpressionItem **) &(item->param2)))->next->param1), index2, ITC_INT); // ok, we've got two indexes int pos1 = (int) *((__int64*)&(index->param1)); int pos2 = (int) *((__int64*)&(index2->param1)); if (pos1 < 0) pos1 += len; // -index - means from end if (pos2 < 0) pos2 += len; // -index - means from end // limit start/stop positions if (pos1 < 0) pos1 = 0; if (pos2 < 0) pos2 = 0; if (pos1 > len) pos1 = len; if (pos2 >= len) pos2 = len-1; // copy string part TCHAR* lpos = str + (pos2-pos1); while (str <= lpos) { *str = *(str + pos1); str++; } // null-termiante *str = 0; CleanupItems(index2); } } else { // argument is array RunAndGetConst((item->param2), index, ITC_INT); // convert array pointer to array item pointer aritem->type = IT_VARIABLE | ITV_ARRITEM; aritem->param2 = (EIPARAM) *((__int64*)&(index->param1)); ArrayDesc *ad = (ArrayDesc*)aritem->param1; if ((EIPtrToInt(aritem->param2)) >= ad->count) { ad->count = (EIPtrToInt(aritem->param2))+1; while (ad->count > ad->size) { // resize array ExpressionItem **oldei = ad->array; ad->array = (ExpressionItem**) dbgGlobalAlloc(GPTR, 2*ad->size*sizeof(ExpressionItem*)); for (int i = 0; i < ad->size; i++) ad->array[i] = oldei[i]; ad->size*=2; dbgGlobalFree(oldei); } } } CleanupItems(index); // we need constant result? if (options & RTO_NEEDCONST) { RunTree(aritem, result, options); CleanupItems(aritem); } else result = aritem; } break; } item = item->next; } } static UINT_PTR PluginCallback(enum NSPIM msg) { return 0; } HINSTANCE g_hInstance; extern "C" void __declspec(dllexport) Script(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { EXDLL_INIT(); TCHAR *buffer = AllocString(), *buf = buffer; ExpressionItem *root = NULL; // root of current tree // keep loaded to save user defined variables extra->RegisterPluginCallback(g_hInstance, PluginCallback); // pop script string popstring(buffer); // parse it ParseString(buf, root); #ifdef _DEBUG // dump PrintTree(root, buffer); #endif ExpressionItem *result; RunTree(root, result, 0); CleanupItems(result); CleanupItems(root); dbgGlobalFree((HGLOBAL) buffer); } double _infinity; extern "C" void _fpreset(); void CleanAll(int init) { if (init) { unsigned char _infinity_base[8] = {0, 0, 0, 0, 0, 0, 0xf0, 0x7f}; _fltused = 0; _infinity = *((double*)(_infinity_base)); _fpreset(); stack = NULL; UserVarsCount = 0; UserFuncsCount = 0; } else { int i; // cleanup stack CleanupItems(stack); stack = NULL; // cleanup user vars for (i = 0; i < UserVarsCount; i++) CleanupItems(UserVars[i].item); // cleanup user funcs for (i = 0; i < UserFuncsCount; i++) CleanupItems(UserFuncs[i].root); UserVarsCount = 0; UserFuncsCount = 0; dbgGlobalCheck(); } } extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance = hInst; CleanAll(ul_reason_for_call == DLL_PROCESS_ATTACH); return TRUE; } nsis-3.11/Contrib/Math/Source/Math.h000077500000000000000000000013421477201124000172060ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #pragma once #include // nsis plugin #include #ifdef _DEBUG //#define _DEBUG_LEAKS #endif #ifdef _DEBUG_LEAKS #define dbgGlobalAlloc(a, b) watchGlobalAlloc(a, b) #define dbgGlobalFree(a) watchGlobalFree(a) #define dbgGlobalCheck() watchGlobal(); void watchGlobal(); void watchGlobalFree(HGLOBAL block); HGLOBAL watchGlobalAlloc(UINT Flags, UINT size); #else #define dbgGlobalAlloc(a, b) GlobalAlloc(a, b) #define dbgGlobalFree(a) GlobalFree(a) #define dbgGlobalCheck() {}; #endif TCHAR *AllocString(); ExpressionItem *AllocItem(); ExpressionItem *AllocArray(int size); ExpressionItem *CopyItem(ExpressionItem *item, int NeedConst = 0); nsis-3.11/Contrib/Math/Source/MyMath.c000077500000000000000000000141061477201124000175110ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #include #include #include "MyMath.h" #include "Math.h" // Converts String to Int (Dec, Hex) or Float value void StringToItem(TCHAR *&s, ExpressionItem *item, int options) { item->type = IT_CONST | ITC_INT; __int64 &v=*((__int64*)&(item->param1)); v = 0; // Check for right input if (!s) return; // String-value if ((((options & (STI_FLOAT | STI_INT)) == 0) || *s == _T('\'') || *s == _T('\"') || *s == _T('`') || ((*s != _T('+')) && (*s != _T('-')) && ((*s < _T('0')) || (*s > _T('9'))))) && (options & STI_STRING)) { // end of string char TCHAR eol = 0; if (*s == _T('\'') || *s == _T('\"') || *s == _T('`')) eol = *s; else s--; item->type = IT_CONST | ITC_STRING; // allocate memory buffer for string TCHAR *sp; sp = *((TCHAR**)&(item->param1)) = AllocString(); while (*(++s) && (*s != eol)) { *(sp++) = *s; } if (*s == eol) s++; *sp = 0; } else { // strip leading spaces and tabs while ((*s == _T(' ')) || (*s == _T('\t'))) s++; // Hex-value if ((options & STI_INT) && *s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) { s++; while (*(s+1) == _T('0')) s++; for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; else break; v<<=4; v+=c; } } // Dec-value, possible floating-point else { int sign=0, numsignif = 0; if (*s == _T('-')) sign++; else s--; while (*(s+1) == _T('0')) s++; for (;;) { int c=*(++s) - _T('0'); numsignif++; if ((options & STI_FLOAT) && ((c == (_T('e')-_T('0'))) || (c==(_T('E')-_T('0'))) || (c==(_T('.')-_T('0'))) || (numsignif > 18))) { // Switch to floating point conversion routine item->type = IT_CONST | ITC_FLOAT; double& d = *((double*)&(item->param1)); d = (double) v; while ((c >= 0) && (c <= 9)) { d = d*10.0 + (double) c; c=*(++s) - _T('0'); } // sub-decimal part if (c == (_T('.')-_T('0'))) { double pwr = 1.0, dec = 0.0; for (;;) { c=*(++s) - _T('0'); if ((c < 0) || (c > 9)) break; dec = dec*10.0 + (double) c; pwr *= 10.0; } d += dec/pwr; } // exponental part if ((c == (_T('E')-_T('0'))) || (c == (_T('e')-_T('0')))) { int expc = 0, esign = 0; s++; // detect exponential sign if ((*s == _T('+')) || (*s == _T('-'))) esign = (*s == _T('-')); else s--; // detect exp value for (;;) { c=*(++s) - _T('0'); if ((c < 0) || (c > 9)) break; expc = expc*10 + c; } if (expc >= DBL_MAX_EXP) { d = HUGE_VAL; expc = 0; } double pwr = 1; while (expc > 99) { pwr *= 1.0e100; expc -= 100; } while (expc > 9) { pwr *= 1.0e10; expc -= 10; } while (expc) { pwr *= 10.0; expc--; } if (esign) d /= pwr; else d *= pwr; } if (sign) d = -d; return; } if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) v = -v; if ((options & STI_FLOAT) && ((options & STI_INT) == 0)) { double& d = *((double*)&(item->param1)); d = (double) v; item->type = IT_CONST | ITC_FLOAT; } } } } void ItemToString(TCHAR *sbuf, ExpressionItem *item) { if ((item == NULL) || ((item->type & ITEMTYPE) != IT_CONST)) { *sbuf = 0; return; } switch (item->type & ITEMSUBTYPE) { case ITC_STRING: { TCHAR *ptr = *((TCHAR**)&(item->param1)); while ( (*(sbuf++) = *(ptr++)) ); } break; case ITC_ARRAY: { ArrayDesc *ad = (ArrayDesc *) item->param1; for (int index = 0; index < ad->count; index++) if ((ad->array[index]) && ((ad->array[index]->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST | ITC_INT))) if ((*(sbuf++) = (TCHAR) *((__int64*)&(ad->array[index]->param1))) == 0) break; } break; case ITC_FLOAT: FloatFormat(sbuf, *((double*)&(item->param1)), 6); break; case ITC_INT: itoa64(*((__int64*)&(item->param1)), sbuf); break; } } void itoa64(__int64 i, TCHAR *buffer) { TCHAR buf[128], *b = buf; if (i < 0) { *(buffer++) = _T('-'); i = -i; } if (i == 0) *(buffer++) = _T('0'); else { while (i > 0) { *(b++) = _T('0') + ((TCHAR) (i%10)); i /= 10; } while (b > buf) *(buffer++) = *(--b); } *buffer = 0; } #define POS_INFINITY _T("#INF") #define NEG_INFINITY _T("-#INF") void FloatFormat(TCHAR *s, double value, int options) { TCHAR format[128]; int prec = options & 0xF; *s = 0; if(value == HUGE_VAL) { lstrcpy(s, POS_INFINITY); return; } else if(value == -HUGE_VAL) { lstrcpy(s, NEG_INFINITY); return; } if (options & FF_NOEXP) { _stprintf(format, _T("%%.%df"), prec); } else if (options & FF_EXP) { _stprintf(format, _T("%%.%de"), prec); } else if (options & FF_LEXP) { _stprintf(format, _T("%%.%dE"), prec); } else { _stprintf(format, _T("%%.%dg"), prec); } _stprintf(s, format, value); } int lstrcmpn(TCHAR *s1, const TCHAR *s2, int chars) { while ((chars > 0) && (*s1) && (*s2) && (*(s1) == *(s2))) chars--, s1++, s2++; if ((chars == 0) || (*s1 == *s2)) return 0; return (*s1 - *s2); } nsis-3.11/Contrib/Math/Source/MyMath.h000077500000000000000000000104551477201124000175210ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #pragma once #include #include #include #define DEFAULT_ARRAY_SIZE 1024 #define ITEMTYPE 0xFF0000 // items classes #define IT_CONST 0x000000 #define IT_EXPRESSION 0x010000 #define IT_OPERATOR 0x020000 #define IT_VARIABLE 0x030000 #define IT_LOGIC 0x040000 // flow control items #define IT_FUNCTION 0x050000 #define IT_ARRAY 0x060000 // array operation #define ITEMSUBTYPE 0x00FF00 // const items #define ITC_STRING 0x000100 #define ITC_FLOAT 0x000200 #define ITC_INT 0x000400 #define ITC_ARRAY 0x000800 #define ITC_UNKNOWN 0x001000 // type function #define FTT_FLOATF (ITC_UNKNOWN << 0) #define FTT_LEN (ITC_UNKNOWN << 1) #define FTT_CHAR (ITC_UNKNOWN << 2) // additional option - for "ca" function #define ITFA_COPY 0x000001 // ops items #define ITO_MINUS 0x000100 #define ITO_PLUS 0x000200 #define ITO_SHL 0x000300 #define ITO_SHR 0x000400 #define ITO_MUL 0x000500 #define ITO_DIV 0x000600 #define ITO_SET 0x000700 #define ITO_LAND 0x000800 #define ITO_LOR 0x000900 #define ITO_INC 0x000A00 #define ITO_DEC 0x000B00 #define ITO_LE 0x000C00 #define ITO_GE 0x000D00 #define ITO_NE 0x000E00 #define ITO_EQ 0x000F00 #define ITO_LS 0x001000 #define ITO_GR 0x001100 #define ITO_AND 0x001200 #define ITO_MOD 0x001300 #define ITO_OR 0x001400 #define ITO_XOR 0x001500 #define ITO_NOT 0x001600 #define ITO_LNOT 0x001700 // variables sub-types #define ITV_NSIS 0x000100 #define ITV_USER 0x000200 #define ITV_ARRITEM 0x000400 #define ITV_STACK 0x000800 // plugin specific stack #define ITV_NSTACK 0x001000 // nsis stack // logic sub-types #define ITL_IF 0x000100 #define ITL_WHILE 0x000200 // function sub-types #define ITF_MATH1 0x000100 #define ITF_MATH2 0x000200 #define ITF_TYPE 0x000300 #define ITF_USER 0x000400 // array items sub-types #define ITA_ACCESS 0x000000 #define ITEMOPTIONS 0x0000FF // 16 bytes structure typedef struct __ExpressionItem ExpressionItem; //#define EIPARAM int #define EIPARAM ExpressionItem* typedef struct __ExpressionItem { int type; EIPARAM param1; EIPARAM param2; ExpressionItem *next; } ExpressionItem; typedef struct __ParseInfo { int SetupNewRoot; ExpressionItem *item; ExpressionItem *OpsStack; ExpressionItem **place; ExpressionItem **root; TCHAR valbuf[108]; } ParseInfo; #define OPERATOR_SET_PRECEDENCE 14 typedef struct __OpStruct { TCHAR name[3]; unsigned char precedence; unsigned short int type; } OpStruct; #define MAX_USER_VARS 256 typedef struct __UserVar { TCHAR name[28]; ExpressionItem *item; } UserVar; #define MAX_USER_FUNCS 256 typedef struct __UserFunc { TCHAR name[20]; unsigned char vars[31]; // only used for indexing unsigned char varsnum; // number of vars < 256 unsigned int varflags; ExpressionItem *root; } UserFunc; typedef struct __ArrayDesc { ExpressionItem **array; int size; // size of allocated items pool int count; // max number of item accessed int references; // array will be killed at CleanupItems only when references == 0 } ArrayDesc; typedef double (*Math1FuncPtr)(double arg); typedef double (*Math2FuncPtr)(double arg, double arg2); typedef double (*Math2iFuncPtr)(double arg, int *arg2); typedef double (*Math2dFuncPtr)(double arg, double *arg2); typedef struct __MathFunction { TCHAR name[3]; unsigned char type; Math1FuncPtr fptr; } MathFunction; #define STI_STRING 0x0100 #define STI_FLOAT 0x0200 #define STI_INT 0x0400 #define FF_DEFAULT 0x00 // uses default mode: if available noexp, else exp #define FF_NOEXP 0x10 // uses noexp mode #define FF_EXP 0x20 // uses exp mode (small e) #define FF_LEXP 0x40 // uses exp mode (large E) // RunTree options #define RTO_NEEDCONST 0x0001 #define RTO_PREFFEREDTYPE 0xFF00 void RunTree(ExpressionItem *from, ExpressionItem* &result, int type); void StringToItem(TCHAR *&sbuf, ExpressionItem *item, int options); void ItemToString(TCHAR *sbuf, ExpressionItem *item); void FloatFormat(TCHAR *sbuf, double value, int options); void itoa64(__int64 i, TCHAR *buffer); int lstrcmpn(TCHAR *s1, const TCHAR *s2, int chars); nsis-3.11/Contrib/Math/Source/plugin.c000077500000000000000000000051221477201124000176060ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/22/2007 #include #include "MyMath.h" #include "Math.h" #ifdef _DEBUG_LEAKS #include int blocksnum = 0; HGLOBAL blocks[100000]; HGLOBAL watchGlobalAlloc(UINT Flags, UINT size) { HGLOBAL block = GlobalAlloc(Flags, size); blocks[blocksnum++] = block; return block; } void watchGlobalFree(HGLOBAL block) { for (int i = 0; i < blocksnum; i++) if (blocks[i] == block) blocks[i] = NULL; GlobalFree(block); } void watchGlobal() { for (int i = 0; i < blocksnum; i++) if (blocks[i] != NULL) { _RPT2(_CRT_WARN, _T("Memory leak %d at %8X\n"), i, blocks[i]); } } #endif TCHAR *AllocString() { return (TCHAR*) dbgGlobalAlloc(GPTR,g_stringsize*sizeof(TCHAR)); } ExpressionItem *AllocItem() { ExpressionItem *item = (ExpressionItem*)dbgGlobalAlloc(GPTR,sizeof(ExpressionItem)); item->next = NULL; item->type = IT_CONST | ITC_INT; item->param1 = item->param2 = 0; return item; } ExpressionItem *AllocArray(int s) { int size = DEFAULT_ARRAY_SIZE; while (s > size) size*=2; ExpressionItem *ai = (ExpressionItem*)dbgGlobalAlloc(GPTR,sizeof(ExpressionItem)); ai->type = IT_CONST | ITC_ARRAY; ai->param1 = (EIPARAM) dbgGlobalAlloc(GPTR, sizeof(ArrayDesc)); ArrayDesc *ad = *((ArrayDesc**)&(ai->param1)); // initialize and clear the array memory ad->array = (ExpressionItem**) dbgGlobalAlloc(GPTR, size*sizeof(ExpressionItem*)); ad->size = size; ad->count = 0; ad->references = 1; return ai; } ExpressionItem *CopyItem(ExpressionItem *citem, int NeedConst) { if (!citem) return NULL; ExpressionItem *item = NULL; if ((NeedConst) && ((citem->type & ITEMTYPE) != IT_CONST)) { // in case of non constant expression - flat it to const RunTree(citem, item, RTO_NEEDCONST | ITC_INT | ITC_STRING | ITC_FLOAT | ITC_ARRAY); if (item) return item; } item = AllocItem(); item->type = citem->type; if ((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_STRING)) { item->param1 = (EIPARAM) AllocString(); lstrcpy((LPTSTR) item->param1, (LPTSTR) citem->param1); } else if (((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_ARRAY)) || ((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_VARIABLE | ITV_ARRITEM))) { item->param1 = citem->param1; ArrayDesc *ad = (ArrayDesc*) item->param1; ad->references++; } else item->param1 = citem->param1; item->param2 = citem->param2; item->next = NULL; return item; } nsis-3.11/Contrib/Math/math.nsi000077500000000000000000000022751477201124000163560ustar00rootroot00000000000000; This is just an example of Math plugin ; ; (c) brainsucker, 2002 ; (r) BSForce Name "Math Plugin Example" OutFile "math.exe" ShowInstDetails show XPStyle on Section "ThisNameIsIgnoredSoWhyBother?" Math::Script 'SaR(s,fa,ra, i,f,r,e,p) (i=0;#{i=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])" Math::Script "a = 'Hello \r\n World \r\n!!!'; a = SaR(a,{'\r','\n'},{'$\r','$\n'}); R0 = a" Math::Script "NS = '$\"In quotes$\"'; TQ(); R1=NS; R3=P(s(R1),'qu')" Math::Script "NS = 'No quotes'; TQ(); R2=NS" Math::Script "NS='123\r\n456\r\n789'; DL(); R4=NS; DL(); R5=NS; DL(); R6=NS; R7=NS" DetailPrint "'$R0'" DetailPrint "'$R1'" DetailPrint "'$R2'" DetailPrint "'$R3'" DetailPrint "'$R4'" DetailPrint "'$R5'" DetailPrint "'$R6'" DetailPrint "'$R7'" SectionEnd ; eof nsis-3.11/Contrib/Math/mathtest.ini000077500000000000000000000021421477201124000172350ustar00rootroot00000000000000[Settings] NumFields=10 NextButtonText=Execute CancelButtonText=Quit BackButtonText=Readme [Field 1] Type=label Text=Enter your script here: Left=0 Right=-1 Top=0 Bottom=8 [Field 2] Type=text Left=0 Right=-1 Top=9 Bottom=55 flags=MULTILINE|WANTRETURN|HSCROLL State="" [Field 3] Type=text Left=53 Right=175 Top=56 Bottom=140 flags=MULTILINE|READONLY State="" [Field 4] Type=text Left=175 Right=-1 Top=56 Bottom=140 flags=MULTILINE|READONLY State="" [Field 5] Type=RadioButton Left=0 Right=-1 Top=70 Bottom=80 flags=GROUP Text="Your script" State=1 [Field 6] Type=RadioButton Left=0 Right=-1 Top=80 Bottom=90 flags= Text="Sample 1" State=0 [Field 7] Type=RadioButton Left=0 Right=-1 Top=90 Bottom=100 flags= Text="Sample 2" State=0 [Field 8] Type=RadioButton Left=0 Right=-1 Top=100 Bottom=110 flags= Text="Sample 3" State=0 [Field 9] Type=RadioButton Left=0 Right=-1 Top=110 Bottom=120 flags= Text="Sample 4" State=0 [Field 10] Type=RadioButton Left=0 Right=-1 Top=120 Bottom=130 flags= Text="Sample 5" State=0 nsis-3.11/Contrib/Math/mathtest.nsi000077500000000000000000000131051477201124000172500ustar00rootroot00000000000000;NSIS Modern User Interface version 1.65 ;InstallOptions Example Script ;Written by Joost Verburg !define MUI_BUTTONTEXT_NEXT "Execute" ;--------------------- ;Include Modern UI !include "MUI.nsh" ;-------------------------------- ;Product Info Name "Math::Script Test" ;-------------------------------- ;Configuration ;General OutFile "MathTest.exe" ;-------------------------------- ;Variables Var TEMP1 Var TEMP2 Var TEMP3 ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "mathtest.txt" Page custom ScriptPageEnter Page instfiles ;-------------------------------- ;Modern UI Configuration ; !define MUI_ABORTWARNING ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Reserve Files ;Things that need to be extracted on first (keep these lines before any File command!) ;Only for BZIP2 compression ReserveFile "MathTest.ini" !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;-------------------------------- ;Installer Functions LangString SCRIPTSAMPLE0 ${LANG_ENGLISH} "r0 = 'Hello'; r1 = 'Math::Script'\r\nr0 += ' from the ' + r1 + '!'; r1=''" LangString SCRIPTSAMPLE1 ${LANG_ENGLISH} "a =0; b=1.0\r\n#{a++ < 100, b *= a}\r\nr0 = a; R0 = b; R1 = ff(b, 15)\r\nr1 = (a-1) + '! = ' + b" LangString SCRIPTSAMPLE2 ${LANG_ENGLISH} 'pi=3.14159; \r\nangle = pi/4;\r\ntext = "x = " + ff(angle,16+3) \r\nr0 = text += ", sin x = " + sin(angle)' LangString SCRIPTSAMPLE3 ${LANG_ENGLISH} "v1 = 123.456; v2 = 123456789.1011\r\nr0 = v1; r1 = v2\r\nr2 = ff(v1, 3); r3 = ff(v2, 3); r4 = ff(v1, 3+16); r5 = ff(v2, 3+16)\r\nr6 = ff(v1, 3+32); r7 = ff(v2, 3+32); r8 = ff(v1, 3+32+64); r9 = ff(v2, 3+32+64)\r\n" LangString SCRIPTSAMPLE4 ${LANG_ENGLISH} "a = 10000; b = 0; #{--a > 0, b+= a}; r0 = a; r1 = b\r\nz = 1.55; r2 = #[z > 1.5, 'Its greater', 'Its lower']\r\nz = 1.45; r3 = #[z > 1.5, 'Its greater', 'Its lower']" LangString SCRIPTSAMPLE5 ${LANG_ENGLISH} 'r0 = "123a123"\r\nr1 = r0; \r\nr2 = s(r0); r3 = f(r0); r4 = i(r0); r5 = l(r0)' Function .onInit ;Extract InstallOptions INI files !insertmacro MUI_INSTALLOPTIONS_EXTRACT "MathTest.ini" Strcpy "$TEMP1" "$(SCRIPTSAMPLE0)" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 2" "State" $TEMP1 FunctionEnd LangString TEXT_IO_TITLE ${LANG_ENGLISH} "MathTest Script Page" LangString TEXT_IO_SUBTITLE ${LANG_ENGLISH} "Try your scripting capapibilites or test one of sample scripts" Function DumpVariables Strcpy "$TEMP1" "$$0='$0'\r\n$$1='$1'\r\n$$2='$2'\r\n$$3='$3'\r\n$$4='$4'\r\n$$5='$5'\r\n$$6='$6'\r\n$$7='$7'\r\n$$8='$8'\r\n$$9='$9'" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 3" "State" $TEMP1 Strcpy "$TEMP1" "$$R0='$R0'\r\n$$R1='$R1'\r\n$$R2='$R2'\r\n$$R3='$R3'\r\n$$R4='$R4'\r\n$$R5='$R5'\r\n$$R6='$R6'\r\n$$R7='$R7'\r\n$$R8='$R8'\r\n$$R9='$R9'" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 4" "State" $TEMP1 FunctionEnd Function ClearVariables Math::Script "r0=r1=r2=r3=r4=r5=r6=r7=r8=r9=R0=R1=R2=R3=R4=R5=R6=R7=R8=R9=''" FunctionEnd Function GetLine push $TEMP1 Math::Script "mtsDL()" pop $TEMP2 pop $TEMP1 FunctionEnd Function ExecuteScript !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 2" "State" Math::Script "mtsTQ(s) (s = s(NS); #[s[0]=='$\"',s=s[1,]]; #[s[-1]=='$\"',s=s[,-2]]; NS = s)" Math::Script "mtsP(s,e, p,i) (p=-1;i=0; #{(i=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])" push $TEMP1 ; remove "" Math::Script "mtsTQ()" pop $TEMP1 ; script at $TEMP1 Go: StrLen $TEMP3 $TEMP1 IntCmp $TEMP3 0 End ; get single line to $TEMP2 Call GetLine ; MessageBox MB_OK "'$TEMP2' '$TEMP1'" Math::Script "$TEMP2" goto Go End: Math::Script "" FunctionEnd Function ScriptPageEnter !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)" Again: Call ClearVariables Call ExecuteScript Call DumpVariables !insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "mathtest.ini" pop $TEMP3 !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 5" "State" IntCmp $TEMP1 1 Test Strcpy "$TEMP2" "$(SCRIPTSAMPLE1)" !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 6" "State" IntCmp $TEMP1 1 Write Strcpy "$TEMP2" "$(SCRIPTSAMPLE2)" !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 7" "State" IntCmp $TEMP1 1 Write Strcpy "$TEMP2" "$(SCRIPTSAMPLE3)" !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 8" "State" IntCmp $TEMP1 1 Write Strcpy "$TEMP2" "$(SCRIPTSAMPLE4)" !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 9" "State" IntCmp $TEMP1 1 Write Strcpy "$TEMP2" "$(SCRIPTSAMPLE5)" Write: !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 2" "State" "$TEMP2" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 5" "State" "1" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 6" "State" "0" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 7" "State" "0" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 8" "State" "0" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 9" "State" "0" !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 10" "State" "0" Test: Strcmp $TEMP3 "success" Again FunctionEnd Section "Dummy Section" SecDummy SectionEnd nsis-3.11/Contrib/Math/mathtest.txt000077500000000000000000000007421477201124000173010ustar00rootroot00000000000000Math Tester. This demo allows you to test your Math::Script expressions without need to compile anything. Just enter your expressions into multiline editbox (every single line is a separate call to Math::Script) or select one of sample expressions and press Execute. Every call to Math::Script can accept up to 1kb of script, but this demo is limited to the summ of 1 kb at all lines. And... watch your scripts. No.... Watch your errors at scripts! (c) Brainsucker, 2003. nsis-3.11/Contrib/Modern UI 2/000077500000000000000000000000001477201124000156545ustar00rootroot00000000000000nsis-3.11/Contrib/Modern UI 2/Deprecated.nsh000077500000000000000000000035431477201124000204360ustar00rootroot00000000000000/* NSIS Modern User Interface Deprecated code - display warnings */ !macro MUI_LEGACY_MAP_NOSTRETCH NAME R !if "${R}" != "" !ifdef ${NAME}NOSTRETCH !define /IfNDef ${NAME}STRETCH NoStretchNoCropNoAlign !endif !else !insertmacro ${__MACRO__} ${NAME}BITMAP_ 1 !insertmacro ${__MACRO__} ${NAME}BITMAP_RTL_ 1 !insertmacro ${__MACRO__} ${NAME}UNBITMAP_ 1 !insertmacro ${__MACRO__} ${NAME}UNBITMAP_RTL_ 1 !endif !macroend ;-------------------------------- ;InstallOptions !define INSTALLOPTIONS_ERROR "MUI_INSTALLOPTIONS_* macros are no longer a part of MUI2. Include InstallOptions.nsh and use INSTALLOPTIONS_* macros instead. It is also recommended to upgrade to nsDialogs." !macro MUI_INSTALLOPTIONS_EXTRACT FILE !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_DISPLAY FILE !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_INITDIALOG FILE !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_SHOW !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_SHOW_RETURN !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE !error "${INSTALLOPTIONS_ERROR}" !macroend !macro MUI_RESERVEFILE_INSTALLOPTIONS !error `MUI_RESERVEFILE_INSTALLOPTIONS is no longer supported as InstallOptions is no longer used by MUI2. Instead, use "ReserveFile /plugin InstallOptions.dll". It is also recommended to upgrade to nsDialogs.` !macroend nsis-3.11/Contrib/Modern UI 2/Interface.nsh000077500000000000000000000240671477201124000203020ustar00rootroot00000000000000/* NSIS Modern User Interface Interface code for all pages */ ;-------------------------------- ;Variables Var mui.Header.Text Var mui.Header.Text.Font Var mui.Header.SubText Var mui.Header.Background Var mui.Header.Image Var mui.Branding.Text Var mui.Branding.Background Var mui.Line.Standard Var mui.Line.FullWindow Var mui.Button.Next Var mui.Button.Cancel Var mui.Button.Back ;-------------------------------- ;General interface settings !macro MUI_INTERFACE !ifndef MUI_INTERFACE !define MUI_INTERFACE ;These values are set after the interface settings in the script, ;so the script itself can override all values. ;Default interface settings in nsisconf.nsh !ifdef MUI_INSERT_NSISCONF !insertmacro MUI_NSISCONF !endif ;Default interface settings !insertmacro MUI_DEFAULT MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe" !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe" !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT "${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe" !insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !insertmacro MUI_DEFAULT MUI_BGCOLOR "FFFFFF" !insertmacro MUI_DEFAULT MUI_TEXTCOLOR "000000" ;Map *_NOSTRETCH legacy define to the correct *_STRETCH value !verbose push 2 !insertmacro MUI_LEGACY_MAP_NOSTRETCH MUI_HEADERIMAGE_ "" !insertmacro MUI_LEGACY_MAP_NOSTRETCH MUI_WELCOMEFINISHPAGE_ "" !insertmacro MUI_LEGACY_MAP_NOSTRETCH MUI_UNWELCOMEFINISHPAGE_ "" !verbose pop ;Default header images !ifdef MUI_HEADERIMAGE !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP_STRETCH "FitControl" !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP_RTL_STRETCH ${MUI_HEADERIMAGE_BITMAP_STRETCH} !ifndef MUI_HEADERIMAGE_UNBITMAP !define MUI_HEADERIMAGE_UNBITMAP "${MUI_HEADERIMAGE_BITMAP}" !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_STRETCH ${MUI_HEADERIMAGE_BITMAP_STRETCH} !endif !if "${MUI_HEADERIMAGE_BITMAP}" == "" !error "Invalid MUI_HEADERIMAGE_BITMAP" !endif !if "${MUI_HEADERIMAGE_UNBITMAP}" == "" !error "Invalid MUI_HEADERIMAGE_UNBITMAP" !endif !ifdef MUI_HEADERIMAGE_BITMAP_RTL !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL !define MUI_HEADERIMAGE_UNBITMAP_RTL "${MUI_HEADERIMAGE_BITMAP_RTL}" !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_STRETCH ${MUI_HEADERIMAGE_BITMAP_RTL_STRETCH} !endif !if "${MUI_HEADERIMAGE_BITMAP_RTL}" == "" !error "Invalid MUI_HEADERIMAGE_BITMAP_RTL" !endif !if "${MUI_HEADERIMAGE_UNBITMAP_RTL}" == "" !error "Invalid MUI_HEADERIMAGE_UNBITMAP_RTL" !endif !endif !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_UNBITMAP_STRETCH ${MUI_HEADERIMAGE_BITMAP_STRETCH} !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_UNBITMAP_RTL_STRETCH ${MUI_HEADERIMAGE_BITMAP_RTL_STRETCH} !endif ;Default texts !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT "$(MUI_TEXT_ABORTWARNING)" !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT "$(MUI_UNTEXT_ABORTWARNING)" ;Apply settings XPStyle On ;XP style setting in manifest resource ;Dialog resources ChangeUI all "${MUI_UI}" !ifdef MUI_HEADERIMAGE !ifndef MUI_HEADERIMAGE_RIGHT ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE}" !else ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE_RIGHT}" !endif !endif ;Icons Icon "${MUI_ICON}" UninstallIcon "${MUI_UNICON}" !endif !macroend ;-------------------------------- ;Abort warning message box !macro MUI_ABORTWARNING !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_ABORTWARNING_TEXT}" IDYES mui.Quit !else MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_ABORTWARNING_TEXT}" IDYES mui.Quit !endif Abort mui.Quit: !macroend !macro MUI_UNABORTWARNING !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_UNABORTWARNING_TEXT}" IDYES mui.Quit !else MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_UNABORTWARNING_TEXT}" IDYES mui.Quit !endif Abort mui.Quit: !macroend ;-------------------------------- ;Initialization of GUI !macro MUI_HEADERIMAGE_INITHELPER_LOADIMAGEWITHMACRO MACRO !ifdef MUI_HEADERIMAGE_RIGHT !ifndef MUI_OPTIMIZE_ALWAYSLTR ; Undocumented ${if} $(^RTL) == 1 !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Left Leak ${Else} !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Right Leak ${EndIf} !else !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Right Leak !endif !else !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Auto Leak !endif !macroend !macro MUI_HEADERIMAGE_INITHELPER_LOADIMAGE UN RTL IMGRESID PATH GetDlgItem $mui.Header.Image $HWNDPARENT ${IMGRESID} ; This variable is not used by every mode but we have to reference it to avoid a compiler warning. !if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" == "NoStretchNoCropNoAlign" SetBrandingImage /IMGID=${IMGRESID} "${PATH}" !else if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" == "NoStretchNoCrop" !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGEWITHMACRO \ MUI_LOADANDXALIGNIMAGE !else if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" == "AspectFitHeight" !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGEWITHMACRO \ MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT !else !if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" != "FitControl" !warning 'MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH set to unknown value, defaulting to FitControl' !endif SetBrandingImage /IMGID=${IMGRESID} /RESIZETOFIT "${PATH}" !endif !macroend !macro MUI_HEADERIMAGE_INIT UN IMGRESID ;Load and display header image !ifdef MUI_HEADERIMAGE InitPluginsDir !ifdef MUI_HEADERIMAGE_${UN}BITMAP_RTL ${if} $(^RTL) == 1 File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UN}BITMAP_RTL}" !pragma verifyloadimage "${MUI_HEADERIMAGE_${UN}BITMAP_RTL}" !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGE "${UN}" "_RTL" ${IMGRESID} "$PLUGINSDIR\modern-header.bmp" ${else} !endif File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UN}BITMAP}" !pragma verifyloadimage "${MUI_HEADERIMAGE_${UN}BITMAP}" !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGE "${UN}" "" ${IMGRESID} "$PLUGINSDIR\modern-header.bmp" !ifdef MUI_HEADERIMAGE_${UN}BITMAP_RTL ${endif} !endif !endif !macroend !macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER ;Initialize outer dialog (fonts & colors) ;Header GetDlgItem $mui.Header.Text $HWNDPARENT 1037 CreateFont $mui.Header.Text.Font "$(^Font)" "$(^FontSize)" "700" SendMessage $mui.Header.Text ${WM_SETFONT} $mui.Header.Text.Font 0 GetDlgItem $mui.Header.SubText $HWNDPARENT 1038 !ifndef MUI_HEADER_TRANSPARENT_TEXT SetCtlColors $mui.Header.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" SetCtlColors $mui.Header.SubText "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !else SetCtlColors $mui.Header.Text "${MUI_TEXTCOLOR}" "transparent" SetCtlColors $mui.Header.SubText "${MUI_TEXTCOLOR}" "transparent" !endif ;Header image !insertmacro MUI_HEADERIMAGE_INIT "${UNINSTALLER}" 1046 ;Header background GetDlgItem $mui.Header.Background $HWNDPARENT 1034 SetCtlColors $mui.Header.Background "" "${MUI_BGCOLOR}" ;Header icon image background !ifndef MUI_HEADERIMAGE GetDlgItem $mui.Header.Image $HWNDPARENT 1039 SetCtlColors $mui.Header.Image "" "${MUI_BGCOLOR}" !endif ;Branding text GetDlgItem $mui.Branding.Background $HWNDPARENT 1028 SetCtlColors $mui.Branding.Background /BRANDING GetDlgItem $mui.Branding.Text $HWNDPARENT 1256 SetCtlColors $mui.Branding.Text /BRANDING SendMessage $mui.Branding.Text ${WM_SETTEXT} 0 "STR:$(^Branding) " ;Lines GetDlgItem $mui.Line.Standard $HWNDPARENT 1035 GetDlgItem $mui.Line.FullWindow $HWNDPARENT 1045 ;Buttons GetDlgItem $mui.Button.Next $HWNDPARENT 1 GetDlgItem $mui.Button.Cancel $HWNDPARENT 2 GetDlgItem $mui.Button.Back $HWNDPARENT 3 !macroend ;-------------------------------- ;Interface functions !macro MUI_FUNCTION_GUIINIT Function .onGUIInit !insertmacro MUI_GUIINIT_OUTERDIALOG "" !ifdef MUI_PAGE_FUNCTION_GUIINIT Call "${MUI_PAGE_FUNCTION_GUIINIT}" !endif !ifdef MUI_CUSTOMFUNCTION_GUIINIT Call "${MUI_CUSTOMFUNCTION_GUIINIT}" !endif FunctionEnd !macroend !macro MUI_UNFUNCTION_GUIINIT Function un.onGUIInit !insertmacro MUI_GUIINIT_OUTERDIALOG UN !ifdef MUI_UNPAGE_FUNCTION_GUIINIT Call "${MUI_UNPAGE_FUNCTION_GUIINIT}" !endif !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT Call "${MUI_CUSTOMFUNCTION_UNGUIINIT}" !endif FunctionEnd !macroend !macro MUI_FUNCTION_ABORTWARNING Function .onUserAbort !ifdef MUI_PAGE_FUNCTION_ABORTWARNING Call ${MUI_PAGE_FUNCTION_ABORTWARNING} !endif !ifdef MUI_ABORTWARNING !insertmacro MUI_ABORTWARNING !endif !ifdef MUI_CUSTOMFUNCTION_ABORT Call "${MUI_CUSTOMFUNCTION_ABORT}" !endif FunctionEnd !macroend !macro MUI_FUNCTION_UNABORTWARNING Function un.onUserAbort !ifdef MUI_UNPAGE_FUNCTION_ABORTWARNING Call ${MUI_UNPAGE_FUNCTION_ABORTWARNING} !endif !ifdef MUI_UNABORTWARNING !insertmacro MUI_UNABORTWARNING !endif !ifdef MUI_CUSTOMFUNCTION_UNABORT Call "${MUI_CUSTOMFUNCTION_UNABORT}" !endif FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/License.txt000077500000000000000000000015101477201124000177770ustar00rootroot00000000000000Copyright © 2002-2025 Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution.nsis-3.11/Contrib/Modern UI 2/Localization.nsh000077500000000000000000000113251477201124000210230ustar00rootroot00000000000000/* NSIS Modern User Interface Localization */ ;-------------------------------- ;Variables !macro MUI_LANGDLL_VARIABLES !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME !ifndef MUI_LANGDLL_REGISTRY_VARIABLES !define MUI_LANGDLL_REGISTRY_VARIABLES ;/GLOBAL because the macros are included in a function Var /GLOBAL mui.LangDLL.RegistryLanguage !endif !endif !macroend ;-------------------------------- ;Include language files !macro MUI_LANGUAGEEX LangDir NLFID !verbose push ${MUI_VERBOSE} !ifndef MUI_PAGE_UNINSTALLER_PREFIX !ifndef MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING ; Define this to avoid the warning if you only have custom pages !warning "MUI_LANGUAGE[EX] should be inserted after the MUI_[UN]PAGE_* macros" !endif !endif !insertmacro MUI_INSERT ;Include a language LoadLanguageFile "${LangDir}\${NLFID}.nlf" ;Include MUI language file !insertmacro LANGFILE_INCLUDE_WITHDEFAULT \ "${LangDir}\${NLFID}.nsh" "${NSISDIR}\Contrib\Language files\English.nsh" ;Add language to list of languages for selection dialog !define /ifndef MUI_LANGDLL_LANGUAGES "" !define /redef MUI_LANGDLL_LANGUAGES \ `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" ${MUI_LANGDLL_LANGUAGES}` !define /ifndef MUI_LANGDLL_LANGUAGES_CP "" !define /redef MUI_LANGDLL_LANGUAGES_CP \ `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" "${LANG_${NLFID}_CP}" ${MUI_LANGDLL_LANGUAGES_CP}` !verbose pop !macroend !macro MUI_LANGUAGE NLFID !verbose push ${MUI_VERBOSE} !insertmacro MUI_LANGUAGEEX "${NSISDIR}\Contrib\Language files" "${NLFID}" !verbose pop !macroend ;-------------------------------- ;Language selection !macro MUI_LANGDLL_DISPLAY !verbose push !verbose ${MUI_VERBOSE} !ifndef MUI_LANGDLL_LANGUAGES !warning "MUI_LANGDLL_DISPLAY should only be used after inserting the MUI_LANGUAGE macro(s)" !endif !insertmacro MUI_LANGDLL_VARIABLES !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE "Installer Language" !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO "Please select a language." !ifdef MUI_LANGDLL_REGISTRY_VARIABLES ReadRegStr $mui.LangDLL.RegistryLanguage "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" ${if} $mui.LangDLL.RegistryLanguage != "" ;Set default language to registry language StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage ${endif} !endif !ifdef NSIS_CONFIG_SILENT_SUPPORT ${unless} ${Silent} !endif !ifndef MUI_LANGDLL_ALWAYSSHOW !ifdef MUI_LANGDLL_REGISTRY_VARIABLES ${if} $mui.LangDLL.RegistryLanguage == "" !endif !endif ;Show language selection dialog !ifdef MUI_LANGDLL_ALLLANGUAGES LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" A ${MUI_LANGDLL_LANGUAGES} "" !else LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" AC ${MUI_LANGDLL_LANGUAGES_CP} "" !endif Pop $LANGUAGE ${if} $LANGUAGE == "cancel" Abort ${endif} !ifndef MUI_LANGDLL_ALWAYSSHOW !ifdef MUI_LANGDLL_REGISTRY_VARIABLES ${endif} !endif !endif !ifdef NSIS_CONFIG_SILENT_SUPPORT ${endif} !endif !verbose pop !macroend !macro MUI_LANGDLL_SAVELANGUAGE ;Save language in registry !ifndef MUI_PAGE_UNINSTALLER IfAbort mui.langdllsavelanguage_abort !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE !endif mui.langdllsavelanguage_abort: !endif !macroend !macro MUI_UNGETLANGUAGE ;Get language from registry in uninstaller !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_LANGDLL_VARIABLES !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME ReadRegStr $mui.LangDLL.RegistryLanguage "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" ${if} $mui.LangDLL.RegistryLanguage = "" !endif !insertmacro MUI_LANGDLL_DISPLAY !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME ${else} StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage ${endif} !endif !verbose pop !macroend ;-------------------------------- ;Rerserve LangDLL file !macro MUI_RESERVEFILE_LANGDLL !verbose push !verbose ${MUI_VERBOSE} ReserveFile /plugin LangDLL.dll !verbose pop !macroend nsis-3.11/Contrib/Modern UI 2/MUI2.nsh000077500000000000000000000044621477201124000171130ustar00rootroot00000000000000/* NSIS Modern User Interface - Version 2.1 Copyright 2002-2025 Joost Verburg Contributors: Amir Szekely, Anders Kjersem */ !ifndef MUI_INCLUDED !verbose push 3 !define MUI_INCLUDED !define MUI_SYSVERSION "2.1" !verbose pop !echo "NSIS Modern User Interface version ${MUI_SYSVERSION} - Copyright 2002-2025 Joost Verburg" ;-------------------------------- !verbose push 3 !define /IfNDef MUI_VERBOSE 3 !verbose ${MUI_VERBOSE} !addincludedir "${NSISDIR}\Contrib\Modern UI 2" ;-------------------------------- ;Header files required by MUI !include WinMessages.nsh !include LogicLib.nsh !include nsDialogs.nsh !include LangFile.nsh ;-------------------------------- ;Macros for compile-time defines !macro MUI_DEFAULT SYMBOL CONTENT ;Define symbol if not yet defined ;For setting default values !ifndef "${SYMBOL}" !define "${SYMBOL}" "${CONTENT}" !endif !macroend !macro MUI_SET SYMBOL CONTENT ;Define symbol and undefine if necessary !insertmacro MUI_UNSET "${SYMBOL}" !define "${SYMBOL}" "${CONTENT}" !macroend !macro MUI_UNSET SYMBOL ;Undefine symbol if defined !ifdef "${SYMBOL}" !undef "${SYMBOL}" !endif !macroend ;-------------------------------- ;MUI interface !include "Deprecated.nsh" !include "Interface.nsh" !include "Localization.nsh" !include "Pages.nsh" ;-------------------------------- ;Pages !include "Pages\Components.nsh" !include "Pages\Directory.nsh" !include "Pages\Finish.nsh" !include "Pages\InstallFiles.nsh" !include "Pages\License.nsh" !include "Pages\StartMenu.nsh" !include "Pages\UninstallConfirm.nsh" !include "Pages\Welcome.nsh" ;-------------------------------- ;Insert MUI code in script !macro MUI_INSERT !ifndef MUI_INSERT !define MUI_INSERT ;This macro is included when the first language file is included, ;after the pages. ;Interface settings !insertmacro MUI_INTERFACE ;Interface functions - Installer !insertmacro MUI_FUNCTION_GUIINIT !insertmacro MUI_FUNCTION_ABORTWARNING ;Interface functions - Uninstaller !ifdef MUI_UNINSTALLER !insertmacro MUI_UNFUNCTION_GUIINIT !insertmacro MUI_FUNCTION_UNABORTWARNING !endif !endif !macroend !verbose pop !endif ;~ MUI_INCLUDED nsis-3.11/Contrib/Modern UI 2/Pages.nsh000077500000000000000000000222601477201124000174320ustar00rootroot00000000000000/* NSIS Modern User Interface Support code for all pages */ ;-------------------------------- ;Page initialization !macro MUI_PAGE_INIT !ifdef MUI_INSERT !warning "MUI_PAGE_* inserted after MUI_LANGUAGE" !endif ;Include interface settings if necessary !insertmacro MUI_INTERFACE ;Define settings for installer page !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "" ;Generate unique ID !insertmacro MUI_UNSET MUI_UNIQUEID !define MUI_UNIQUEID ${__LINE__} !macroend !macro MUI_UNPAGE_INIT !ifdef MUI_INSERT !warning "MUI_UNPAGE_* inserted after MUI_LANGUAGE" !endif ;Include interface settings !insertmacro MUI_INTERFACE ;Define prefixes for uninstaller page !insertmacro MUI_SET MUI_UNINSTALLER "" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER "" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "UN" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "un." ;Generate unique ID !insertmacro MUI_UNSET MUI_UNIQUEID !define MUI_UNIQUEID ${__LINE__} !macroend ;-------------------------------- ;Header text for standard MUI page !macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" !else ifdef MUI_PAGE_HEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}" !else ifdef MUI_PAGE_HEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}" !endif !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT !macroend ;-------------------------------- ;Header text for custom page !macro MUI_HEADER_TEXT TEXT SUBTEXT ;Called from script !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_HEADER_TRANSPARENT_TEXT LockWindow on !endif SendMessage $mui.Header.Text ${WM_SETTEXT} 0 "STR:${TEXT}" SendMessage $mui.Header.SubText ${WM_SETTEXT} 0 "STR:${SUBTEXT}" !ifdef MUI_HEADER_TRANSPARENT_TEXT LockWindow off !endif !verbose pop !macroend ;-------------------------------- ;Custom page functions !macro MUI_PAGE_FUNCTION_CUSTOM TYPE !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE} Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}" !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE} !endif !macroend ;-------------------------------- ;Support for full window pages (like welcome/finish page) !macro MUI_PAGE_FUNCTION_FULLWINDOW !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow LockWindow on ;The branding text needs to be hidden because the full windows page ;overlaps with it. ShowWindow $mui.Branding.Background ${SW_HIDE} ShowWindow $mui.Branding.Text ${SW_HIDE} ;The texts need to be hidden because otherwise they may show through ;the page above when the Alt key is pressed. ShowWindow $mui.Header.Text ${SW_HIDE} ShowWindow $mui.Header.SubText ${SW_HIDE} ShowWindow $mui.Header.Image ${SW_HIDE} ;Show line below full width of page ShowWindow $mui.Line.Standard ${SW_HIDE} ShowWindow $mui.Line.FullWindow ${SW_NORMAL} LockWindow off FunctionEnd Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow ;Set everything back to normal again LockWindow on ShowWindow $mui.Branding.Background ${SW_NORMAL} ShowWindow $mui.Branding.Text ${SW_NORMAL} ShowWindow $mui.Header.Text ${SW_NORMAL} ShowWindow $mui.Header.SubText ${SW_NORMAL} ShowWindow $mui.Header.Image ${SW_NORMAL} ShowWindow $mui.Line.Standard ${SW_NORMAL} ShowWindow $mui.Line.FullWindow ${SW_HIDE} LockWindow off FunctionEnd !endif !macroend !macro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE _un _hwndImg _ImgPath _RetImgHandle !ifdef MUI_${_un}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH !insertmacro MUI_DEFAULT MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH NoStretchNoCropNoAlign ; Legacy compatibility !endif !insertmacro MUI_DEFAULT MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH FitControl !if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "NoStretchNoCropNoAlign" ${NSD_SetImage} ${_hwndImg} "${_ImgPath}" "${_RetImgHandle}" !else if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "NoStretchNoCrop" !insertmacro MUI_LOADANDXALIGNIMAGE ${_hwndImg} "${_ImgPath}" Auto "${_RetImgHandle}" !else if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "AspectFitHeight" !insertmacro MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT ${_hwndImg} "${_ImgPath}" Auto "${_RetImgHandle}" !else !if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" != "FitControl" !warning 'MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH set to unknown value, defaulting to FitControl' !endif ${NSD_SetStretchedImage} ${_hwndImg} "${_ImgPath}" "${_RetImgHandle}" !endif !macroend ;-------------------------------- ;Helper macros !include Util.nsh !macro MUI_INTERNAL_LOADANDSIZEIMAGE _macro _hwndImg _ImgPath _XAlign _RetImgHandle !if "${_XAlign}" == "Auto" ${if} $(^RTL) == 1 Push "*${_ImgPath}" ${Else} Push "${_ImgPath}" ${EndIf} !else if "${_XAlign}" == "Right" Push "*${_ImgPath}" !else Push "${_ImgPath}" !endif Push "${_hwndImg}" ${CallArtificialFunction} ${_macro} !if "${_RetImgHandle}" == "Leak" !insertmacro _LOGICLIB_TEMP Pop $_LOGICLIB_TEMP !else if "${_RetImgHandle}" != "Stack" Pop ${_RetImgHandle} !endif !macroend !macro MUI_LOADANDXALIGNIMAGE _hwndImg _ImgPath _XAlign _RetImgHandle !insertmacro MUI_INTERNAL_LOADANDSIZEIMAGE \ MUI_INTERNAL_LOADANDXALIGNIMAGE "${_hwndImg}" "${_ImgPath}" "${_XAlign}" "${_RetImgHandle}" !macroend !macro MUI_INTERNAL_LOADANDXALIGNIMAGE System::Store "S" System::Call 'USER32::GetWindowRect(psr0,@r1)' System::Call 'USER32::MapWindowPoints(p0,p$hwndparent,pr1,i2)' ; Note: Assuming control is not in inner dialog System::Call '*$1(i.r5,i.r6,i.r7,i.r8)' IntOp $7 $7 - $5 IntOp $8 $8 - $6 Pop $1 StrCpy $3 $1 1 ${If} $3 == "*" ; Move control to the right? StrCpy $1 $1 "" 1 ${Endif} System::Call 'USER32::LoadImage(p0,tr1,i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE})p.r2' SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2 $1 Push $2 ; Return value System::Call 'GDI32::DeleteObject(pr1)' ; Note: Assuming the previous image (if any) was a bitmap System::Call 'USER32::GetClientRect(pr0,@r1)' System::Call '*$1(i,i,i.r1,i.r2)' ${If} $3 == "*" ${AndIf} $1 < $7 ; ImgW < CtlW IntOp $3 $7 - $1 IntOp $5 $5 + $3 System::Call 'USER32::SetWindowPos(pr0,p0,ir5,ir6,i,i,i0x15)' ${EndIf} System::Store "L" !macroend !macro MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT _hwndImg _ImgPath _XAlign _RetImgHandle !insertmacro MUI_INTERNAL_LOADANDSIZEIMAGE \ MUI_INTERNAL_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT "${_hwndImg}" "${_ImgPath}" "${_XAlign}" "${_RetImgHandle}" !macroend !macro MUI_INTERNAL_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT System::Store "S" System::Call 'USER32::GetWindowRect(psr0,@r1)' System::Call 'USER32::MapWindowPoints(p0,p$hwndparent,pr1,i2)' ; Note: Assuming control is not in inner dialog System::Call '*$1(i.r5,i.r6,i.r7,i.r8)' IntOp $7 $7 - $5 IntOp $8 $8 - $6 Pop $1 StrCpy $3 $1 1 ${If} $3 == "*" ; Move control to the right? StrCpy $1 $1 "" 1 ${Endif} System::Call 'USER32::LoadImage(p0,tr1,i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE})p.r2' SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2 $1 Push $2 ; Return value System::Call 'GDI32::DeleteObject(pr1)' ; Note: Assuming the previous image (if any) was a bitmap System::Call 'USER32::GetClientRect(pr0,@r1)' System::Call '*$1(i,i,i.r1,i.r2)' IntOp $R7 $7 * 10000 IntOp $R8 $8 * 10000 IntOp $R1 $1 * 10000 IntOp $R2 $2 * 10000 IntOp $R3 $R1 / $2 StrCpy $R4 10000 ${If} $R1 > $R2 StrCpy $R3 10000 IntOp $R4 $R2 / $1 ${EndIf} ${DoWhile} $R2 > $R8 ; ImgH > CtlH IntOp $R1 $R1 - $R3 IntOp $R2 $R2 - $R4 ${Loop} ${DoWhile} $R2 < $R8 ; ImgH < CtlH IntOp $R1 $R1 + $R3 IntOp $R2 $R2 + $R4 ${Loop} IntOp $1 $R1 / 10000 IntOp $2 $R2 / 10000 ${If} $1 < $7 ${AndIf} $3 == "*" IntOp $R3 $7 - $1 IntOp $5 $5 + $R3 ${EndIf} ${DoWhile} $2 > $8 ; Non-aspect-maintained stretch to make it a pixel perfect match IntOp $2 $2 - 1 IntOp $1 $1 - 1 ${IfThen} $3 == "*" ${|} IntOp $5 $5 + 1 ${|} ${Loop} System::Call 'USER32::SetWindowPos(pr0,p0,ir5,ir6,ir1,ir2,i0x14)' System::Store "L" !macroend nsis-3.11/Contrib/Modern UI 2/Pages/000077500000000000000000000000001477201124000167135ustar00rootroot00000000000000nsis-3.11/Contrib/Modern UI 2/Pages/Components.nsh000077500000000000000000000155261477201124000215660ustar00rootroot00000000000000/* NSIS Modern User Interface Components page */ ;-------------------------------- ;Page interface settings and variables !macro MUI_COMPONENTSPAGE_INTERFACE !ifndef MUI_COMPONENTSPAGE_INTERFACE !define MUI_COMPONENTSPAGE_INTERFACE Var mui.ComponentsPage Var mui.ComponentsPage.Text Var mui.ComponentsPage.InstTypesText Var mui.ComponentsPage.ComponentsText Var mui.ComponentsPage.InstTypes Var mui.ComponentsPage.Components Var mui.ComponentsPage.DescriptionTitle Var mui.ComponentsPage.DescriptionText.Info Var mui.ComponentsPage.DescriptionText Var mui.ComponentsPage.SpaceRequired !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC "${NSISDIR}\Contrib\UIs\modern_smalldesc.exe" !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC "${NSISDIR}\Contrib\UIs\modern_nodesc.exe" ;Apply settings !ifdef MUI_COMPONENTSPAGE_SMALLDESC ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_SMALLDESC}" !else ifdef MUI_COMPONENTSPAGE_NODESC ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_NODESC}" !endif CheckBitmap "${MUI_COMPONENTSPAGE_CHECKBITMAP}" !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_COMPONENTS !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE "" !insertmacro MUI_COMPONENTSPAGE_INTERFACE !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST "" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE "" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} Caption " " ComponentText "${MUI_COMPONENTSPAGE_TEXT_TOP}" "${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}" "${MUI_COMPONENTSPAGE_TEXT_COMPLIST}" PageExEnd !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} !undef MUI_COMPONENTSPAGE_TEXT_TOP !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO !macroend !macro MUI_PAGE_COMPONENTS !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_COMPONENTS !verbose pop !macroend !macro MUI_UNPAGE_COMPONENTS !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_COMPONENTS !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE) FunctionEnd Function "${SHOW}" ;Get control handles FindWindow $mui.ComponentsPage "#32770" "" $HWNDPARENT GetDlgItem $mui.ComponentsPage.Text $mui.ComponentsPage 1006 GetDlgItem $mui.ComponentsPage.InstTypesText $mui.ComponentsPage 1021 GetDlgItem $mui.ComponentsPage.ComponentsText $mui.ComponentsPage 1022 GetDlgItem $mui.ComponentsPage.InstTypes $mui.ComponentsPage 1017 GetDlgItem $mui.ComponentsPage.Components $mui.ComponentsPage 1032 GetDlgItem $mui.ComponentsPage.DescriptionTitle $mui.ComponentsPage 1042 GetDlgItem $mui.ComponentsPage.DescriptionText $mui.ComponentsPage 1043 GetDlgItem $mui.ComponentsPage.SpaceRequired $mui.ComponentsPage 1023 ;Default text in description textbox SendMessage $mui.ComponentsPage.DescriptionTitle ${WM_SETTEXT} 0 "STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}" EnableWindow $mui.ComponentsPage.DescriptionText 0 SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" StrCpy $mui.ComponentsPage.DescriptionText.Info "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" ;Text for current components page !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend ;-------------------------------- ;Script functions for components descriptions !macro MUI_DESCRIPTION_BEGIN ${if} $0 == -1 ;No mouse hover over component in list SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:" EnableWindow $mui.ComponentsPage.DescriptionText 0 SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:$mui.ComponentsPage.DescriptionText.Info" !macroend !macro MUI_DESCRIPTION_TEXT VAR TEXT !verbose push !verbose ${MUI_VERBOSE} ${elseif} $0 == ${VAR} SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:" EnableWindow $mui.ComponentsPage.DescriptionText 1 SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:${TEXT}" !verbose pop !macroend !macro MUI_DESCRIPTION_END !verbose push !verbose ${MUI_VERBOSE} ${endif} !verbose pop !macroend !macro MUI_FUNCTION_DESCRIPTION_BEGIN !verbose push !verbose ${MUI_VERBOSE} Function .onMouseOverSection !insertmacro MUI_DESCRIPTION_BEGIN !verbose pop !macroend !macro MUI_FUNCTION_DESCRIPTION_END !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_DESCRIPTION_END !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION Call "${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}" !endif FunctionEnd !verbose pop !macroend !macro MUI_UNFUNCTION_DESCRIPTION_BEGIN !verbose push !verbose ${MUI_VERBOSE} Function un.onMouseOverSection !insertmacro MUI_DESCRIPTION_BEGIN !verbose pop !macroend !macro MUI_UNFUNCTION_DESCRIPTION_END !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_DESCRIPTION_END !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION Call "${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}" !endif FunctionEnd !verbose pop !macroend nsis-3.11/Contrib/Modern UI 2/Pages/Directory.nsh000077500000000000000000000070161477201124000214000ustar00rootroot00000000000000/* NSIS Modern User Interface Directory page */ ;-------------------------------- ;Page interface settings and variables !macro MUI_DIRECTORYPAGE_INTERFACE !ifndef MUI_DIRECTORYPAGE_INTERFACE !define MUI_DIRECTORYPAGE_INTERFACE Var mui.DirectoryPage Var mui.DirectoryPage.Text Var mui.DirectoryPage.DirectoryBox Var mui.DirectoryPage.Directory Var mui.DirectoryPage.BrowseButton Var mui.DirectoryPage.SpaceRequired Var mui.DirectoryPage.SpaceAvailable !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_DIRECTORY !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE "" !insertmacro MUI_DIRECTORYPAGE_INTERFACE !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION "" PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} Caption " " DirText "${MUI_DIRECTORYPAGE_TEXT_TOP}" "${MUI_DIRECTORYPAGE_TEXT_DESTINATION}" !ifdef MUI_DIRECTORYPAGE_VARIABLE DirVar "${MUI_DIRECTORYPAGE_VARIABLE}" !endif !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE DirVerify leave !endif PageExEnd !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} !undef MUI_DIRECTORYPAGE_TEXT_TOP !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE !macroend !macro MUI_PAGE_DIRECTORY !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_DIRECTORY !verbose pop !macroend !macro MUI_UNPAGE_DIRECTORY !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_DIRECTORY !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE) FunctionEnd Function "${SHOW}" ;Get control handles FindWindow $mui.DirectoryPage "#32770" "" $HWNDPARENT GetDlgItem $mui.DirectoryPage.Text $mui.DirectoryPage 1006 GetDlgItem $mui.DirectoryPage.DirectoryBox $mui.DirectoryPage 1020 GetDlgItem $mui.DirectoryPage.Directory $mui.DirectoryPage 1019 GetDlgItem $mui.DirectoryPage.BrowseButton $mui.DirectoryPage 1001 GetDlgItem $mui.DirectoryPage.SpaceRequired $mui.DirectoryPage 1023 GetDlgItem $mui.DirectoryPage.SpaceAvailable $mui.DirectoryPage 1024 !ifdef MUI_DIRECTORYPAGE_BGCOLOR !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXTCOLOR "" SetCtlColors $mui.DirectoryPage.Directory "${MUI_DIRECTORYPAGE_TEXTCOLOR}" "${MUI_DIRECTORYPAGE_BGCOLOR}" !endif !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/Pages/Finish.nsh000077500000000000000000000432101477201124000206500ustar00rootroot00000000000000 /* NSIS Modern User Interface Finish page (implemented using nsDialogs) */ ;-------------------------------- ;Page interface settings and variables !macro MUI_FINISHPAGE_INTERFACE !ifndef MUI_FINISHPAGE_INTERFACE !define MUI_FINISHPAGE_INTERFACE Var mui.FinishPage Var mui.FinishPage.Image Var mui.FinishPage.Image.Bitmap Var mui.FinishPage.Title Var mui.FinishPage.Title.Font Var mui.FinishPage.Text !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES Var mui.FinishPage.ReturnValue !endif !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES Var mui.FinishPage.ReturnValue !endif !endif !ifdef MUI_FINISHPAGE_CANCEL_ENABLED !ifndef MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES !define MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES Var mui.FinishPage.DisableAbortWarning !endif !endif !ifdef MUI_FINISHPAGE_RUN !ifndef MUI_FINISHPAGE_RUN_VARIABLES !define MUI_FINISHPAGE_RUN_VARIABLES Var mui.FinishPage.Run !endif !endif !ifdef MUI_FINISHPAGE_SHOWREADME !ifndef MUI_FINISHPAGE_SHOWREADME_VARIABLES !define MUI_FINISHPAGE_SHOWREADME_VARIABLES Var mui.FinishPage.ShowReadme !endif !endif !ifdef MUI_FINISHPAGE_LINK !ifndef MUI_FINISHPAGE_LINK_VARIABLES !define MUI_FINISHPAGE_LINK_VARIABLES Var mui.FinishPage.Link !endif !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT !ifndef MUI_FINISHPAGE_REBOOT_VARIABLES !define MUI_FINISHPAGE_REBOOT_VARIABLES Var mui.FinishPage.RebootNow Var mui.FinishPage.RebootLater !endif !endif !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" !if "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" == "" !error "Invalid MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP" !endif !macroend ;-------------------------------- ;Interface initialization !macro MUI_FINISHPAGE_GUIINIT !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit InitPluginsDir File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" !pragma verifyloadimage "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT Call "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}" !endif !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_NOAUTOCLOSE SetAutoClose true !endif FunctionEnd !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit !endif !macroend ;-------------------------------- ;Abort warning !macro MUI_FINISHPAGE_ABORTWARNING !ifdef MUI_FINISHPAGE_CANCEL_ENABLED !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning ${if} $mui.FinishPage.DisableAbortWarning == "1" Quit ${endif} !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING Call ${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING} !endif FunctionEnd !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning !endif !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_FINISH !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE "" !insertmacro MUI_FINISHPAGE_INTERFACE !insertmacro MUI_FINISHPAGE_GUIINIT !insertmacro MUI_FINISHPAGE_ABORTWARNING !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_BUTTON "$(MUI_BUTTONTEXT_FINISH)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTNOW "$(MUI_TEXT_FINISH_REBOOTNOW)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTLATER "$(MUI_TEXT_FINISH_REBOOTLATER)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_RUN_TEXT "$(MUI_TEXT_FINISH_RUN)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_SHOWREADME_TEXT "$(MUI_TEXT_FINISH_SHOWREADME)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR "000080" !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \ ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID} Caption " " PageExEnd !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \ ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID} \ ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Link_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT !insertmacro MUI_UNSET MUI_FINISHPAGE_ABORTWARNINGCHECK !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM !macroend !macro MUI_PAGE_FINISH !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_FINISH !verbose pop !macroend !macro MUI_UNPAGE_FINISH !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_FINISH !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_FINISHPAGE PRE LEAVE LINK !ifdef MUI_FINISHPAGE_LINK Function "${LINK}" ExecShell open "${MUI_FINISHPAGE_LINK_LOCATION}" FunctionEnd !endif Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE ;Set text on Next button SendMessage $mui.Button.Next ${WM_SETTEXT} 0 "STR:${MUI_FINISHPAGE_BUTTON}" ;Enable cancel button if set in script !ifdef MUI_FINISHPAGE_CANCEL_ENABLED EnableWindow $mui.Button.Cancel 1 !endif ;Create dialog nsDialogs::Create 1044 Pop $mui.FinishPage nsDialogs::SetRTL $(^RTL) SetCtlColors $mui.FinishPage "" "${MUI_BGCOLOR}" ;Image control ${NSD_CreateBitmap} 0u 0u 109u 193u "" Pop $mui.FinishPage.Image !insertmacro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE "${MUI_PAGE_UNINSTALLER_PREFIX}" $mui.FinishPage.Image $PLUGINSDIR\modern-wizard.bmp $mui.FinishPage.Image.Bitmap ;Positiong of controls ;Title !ifndef MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_TITLE_HEIGHT 28 !else !define MUI_FINISHPAGE_TITLE_HEIGHT 38 !endif ;Text ;17 = 10 (top margin) + 7 (distance between texts) !define /math MUI_FINISHPAGE_TEXT_TOP 17 + ${MUI_FINISHPAGE_TITLE_HEIGHT} ;Height if space required for radio buttons or check boxes !ifndef MUI_FINISHPAGE_TEXT_LARGE !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 40 !else !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 60 !endif !define /math MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS ${MUI_FINISHPAGE_TEXT_TOP} + ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS} ;Positioning of radio buttons to ask for a reboot !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT !define /math MUI_FINISHPAGE_REBOOTNOW_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options ;25 = 10 (height of first radio button) + 15 (distance between buttons) !define /math MUI_FINISHPAGE_REBOOTLATER_TOP ${MUI_FINISHPAGE_REBOOTNOW_TOP} + 25 !endif ;Positioning of checkboxes !ifdef MUI_FINISHPAGE_RUN !define /math MUI_FINISHPAGE_RUN_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options !endif !ifdef MUI_FINISHPAGE_SHOWREADME !ifdef MUI_FINISHPAGE_RUN ;25 = 10 (height of run checkbox) + 10 (distance between checkboxes) !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_RUN_TOP} + 20 !else !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options !endif !endif !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME ;Height if full space is available for text and link !ifndef MUI_FINISHPAGE_LINK !define MUI_FINISHPAGE_TEXT_HEIGHT 130 !else !define MUI_FINISHPAGE_TEXT_HEIGHT 120 !endif !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT ${if} ${RebootFlag} ;Title text ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u "${MUI_FINISHPAGE_TITLE}" Pop $mui.FinishPage.Title SetCtlColors $mui.FinishPage.Title "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" CreateFont $mui.FinishPage.Title.Font "$(^Font)" "12" "700" SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0 ;Finish text ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u "${MUI_FINISHPAGE_TEXT_REBOOT}" Pop $mui.FinishPage.Text SetCtlColors $mui.FinishPage.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" ;Radio buttons for reboot page ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTNOW_TOP}u 195u 10u "${MUI_FINISHPAGE_TEXT_REBOOTNOW}" Pop $mui.FinishPage.RebootNow SetCtlColors $mui.FinishPage.RebootNow "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTLATER_TOP}u 195u 10u "${MUI_FINISHPAGE_TEXT_REBOOTLATER}" Pop $mui.FinishPage.RebootLater SetCtlColors $mui.FinishPage.RebootLater "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !ifndef MUI_FINISHPAGE_REBOOTLATER_DEFAULT SendMessage $mui.FinishPage.RebootNow ${BM_SETCHECK} ${BST_CHECKED} 0 !else SendMessage $mui.FinishPage.RebootLater ${BM_SETCHECK} ${BST_CHECKED} 0 !endif ${NSD_SetFocus} $mui.FinishPage.RebootNow ${else} !endif ;Title text ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u "${MUI_FINISHPAGE_TITLE}" Pop $mui.FinishPage.Title SetCtlColors $mui.FinishPage.Title "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" CreateFont $mui.FinishPage.Title.Font "$(^Font)" "12" "700" SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0 ;Finish text !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT}u "${MUI_FINISHPAGE_TEXT}" !else ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u "${MUI_FINISHPAGE_TEXT}" !endif Pop $mui.FinishPage.Text SetCtlColors $mui.FinishPage.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" ;Checkboxes !ifdef MUI_FINISHPAGE_RUN ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_RUN_TOP}u 195u 10u "${MUI_FINISHPAGE_RUN_TEXT}" Pop $mui.FinishPage.Run SetCtlColors $mui.FinishPage.Run "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_CHECKED} 0 !endif ${NSD_SetFocus} $mui.FinishPage.Run !endif !ifdef MUI_FINISHPAGE_SHOWREADME ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_SHOWREADME_TOP}u 195u 10u "${MUI_FINISHPAGE_SHOWREADME_TEXT}" Pop $mui.FinishPage.ShowReadme SetCtlColors $mui.FinishPage.ShowReadme "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED SendMessage $mui.FinishPage.ShowReadme ${BM_SETCHECK} ${BST_CHECKED} 0 !endif !ifndef MUI_FINISHPAGE_RUN ${NSD_SetFocus} $mui.FinishPage.ShowReadme !endif !endif ;Link !ifdef MUI_FINISHPAGE_LINK ${NSD_CreateLink} 120u 175u 195u 10u "${MUI_FINISHPAGE_LINK}" Pop $mui.FinishPage.Link SetCtlColors $mui.FinishPage.Link "${MUI_FINISHPAGE_LINK_COLOR}" "${MUI_BGCOLOR}" ${NSD_OnClick} $mui.FinishPage.Link "${LINK}" !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT ${endif} !endif !ifdef MUI_FINISHPAGE_CANCEL_ENABLED StrCpy $mui.FinishPage.DisableAbortWarning "1" !endif !ifndef MUI_FORCECLASSICCONTROLS ${If} ${IsHighContrastModeActive} !endif ; SetCtlColors does not change the check/radio text color (bug #443) !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.RebootNow,w" ",w" ")' System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.RebootLater,w" ",w" ")' !endif !ifdef MUI_FINISHPAGE_RUN System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.Run,w" ",w" ")' !endif !ifdef MUI_FINISHPAGE_SHOWREADME System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.ShowReadme,w" ",w" ")' !endif !ifndef MUI_FORCECLASSICCONTROLS ${EndIf} !endif ;Show page Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW nsDialogs::Show !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow !ifdef MUI_FINISHPAGE_CANCEL_ENABLED StrCpy $mui.FinishPage.DisableAbortWarning "" !endif ;Delete image from memory ${NSD_FreeImage} $mui.FinishPage.Image.Bitmap !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_HEIGHT !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_TOP !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTNOW_TOP !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_TOP !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TOP !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TOP FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT ;Check whether the user has chosen to reboot the computer ${if} ${RebootFlag} SendMessage $mui.FinishPage.RebootNow ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED} Reboot ${else} Return ${endif} ${endif} !endif ;Run functions depending on checkbox state !ifdef MUI_FINISHPAGE_RUN SendMessage $mui.FinishPage.Run ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED} !ifndef MUI_FINISHPAGE_RUN_FUNCTION !ifndef MUI_FINISHPAGE_RUN_PARAMETERS Exec "$\"${MUI_FINISHPAGE_RUN}$\"" !else Exec "$\"${MUI_FINISHPAGE_RUN}$\" ${MUI_FINISHPAGE_RUN_PARAMETERS}" !endif !else Call "${MUI_FINISHPAGE_RUN_FUNCTION}" !endif ${endif} !endif !ifdef MUI_FINISHPAGE_SHOWREADME SendMessage $mui.FinishPage.ShowReadme ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED} !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION ExecShell open "${MUI_FINISHPAGE_SHOWREADME}" !else Call "${MUI_FINISHPAGE_SHOWREADME_FUNCTION}" !endif ${endif} !endif FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/Pages/InstallFiles.nsh000077500000000000000000000115551477201124000220300ustar00rootroot00000000000000/* NSIS Modern User Interface InstallFiles page */ ;-------------------------------- ;Page interface settings and variables !macro MUI_INSTFILESPAGE_INTERFACE !ifndef MUI_INSTFILESYPAGE_INTERFACE !define MUI_INSTFILESYPAGE_INTERFACE !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS "/windows" !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR "smooth" Var mui.InstFilesPage Var mui.InstFilesPage.Text Var mui.InstFilesPage.ProgressBar Var mui.InstFilesPage.ShowLogButton Var mui.InstFilesPage.Log ;Apply settings InstallColors ${MUI_INSTFILESPAGE_COLORS} InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR} SubCaption 4 " " UninstallSubCaption 2 " " !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_INSTFILES !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE "" !insertmacro MUI_INSTFILESPAGE_INTERFACE PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} Caption " " PageExEnd !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT !macroend !macro MUI_PAGE_INSTFILES !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_INSTFILES !verbose pop !macroend !macro MUI_UNPAGE_INSTFILES !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_INSTFILES !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE) FunctionEnd Function "${SHOW}" ;Get controls handles FindWindow $mui.InstFilesPage "#32770" "" $HWNDPARENT GetDlgItem $mui.InstFilesPage.Text $mui.InstFilesPage 1006 GetDlgItem $mui.InstFilesPage.ProgressBar $mui.InstFilesPage 1004 GetDlgItem $mui.InstFilesPage.ShowLogButton $mui.InstFilesPage 1027 GetDlgItem $mui.InstFilesPage.Log $mui.InstFilesPage 1016 !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE ;Set text on completed page header IfAbort mui.endheader_abort !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" !endif Goto mui.endheader_done mui.endheader_abort: !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" !endif mui.endheader_done: !insertmacro MUI_LANGDLL_SAVELANGUAGE FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/Pages/License.nsh000077500000000000000000000105751477201124000210220ustar00rootroot00000000000000/* NSIS Modern User Interface License page */ ;-------------------------------- ;Page interface settings and variables !macro MUI_LICENSEPAGE_INTERFACE !ifndef MUI_LICENSEPAGE_INTERFACE !define MUI_LICENSEPAGE_INTERFACE Var mui.LicensePage Var mui.Licensepage.TopText Var mui.Licensepage.Text Var mui.Licensepage.LicenseText !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR "/windows" ;Apply settings LicenseBkColor "${MUI_LICENSEPAGE_BGCOLOR}" !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_LICENSE LICENSEDATA !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE "" !insertmacro MUI_LICENSEPAGE_INTERFACE !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP "$(MUI_INNERTEXT_LICENSE_TOP)" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON "" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT "" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT "" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE "" PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} Caption " " LicenseData "${LICENSEDATA}" !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)" "${MUI_LICENSEPAGE_BUTTON}" !else ifdef MUI_LICENSEPAGE_CHECKBOX LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)" "${MUI_LICENSEPAGE_BUTTON}" !else LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)" "${MUI_LICENSEPAGE_BUTTON}" !endif !else LicenseText "${MUI_LICENSEPAGE_TEXT_BOTTOM}" "${MUI_LICENSEPAGE_BUTTON}" !endif !ifdef MUI_LICENSEPAGE_CHECKBOX LicenseForceSelection checkbox "${MUI_LICENSEPAGE_CHECKBOX_TEXT}" !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS LicenseForceSelection radiobuttons "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}" "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}" !endif PageExEnd !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE !macroend !macro MUI_PAGE_LICENSE LICENSEDATA !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_LICENSE "${LICENSEDATA}" !verbose pop !macroend !macro MUI_UNPAGE_LICENSE LICENSEDATA !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_LICENSE "${LICENSEDATA}" !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE) FunctionEnd Function "${SHOW}" ;Get control handles FindWindow $mui.LicensePage "#32770" "" $HWNDPARENT GetDlgItem $mui.LicensePage.TopText $mui.LicensePage 1040 GetDlgItem $mui.LicensePage.Text $mui.LicensePage 1006 GetDlgItem $mui.LicensePage.LicenseText $mui.LicensePage 1000 ;Top text SendMessage $mui.LicensePage.TopText ${WM_SETTEXT} 0 "STR:${MUI_LICENSEPAGE_TEXT_TOP}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/Pages/StartMenu.nsh000077500000000000000000000200041477201124000213460ustar00rootroot00000000000000/* NSIS Modern User Interface Start Menu folder page */ ;-------------------------------- ;Page interface settings and variables !macro MUI_STARTMENUPAGE_INTERFACE !ifndef MUI_STARTMENUPAGE_INTERFACE !define MUI_STARTMENUPAGE_INTERFACE Var mui.StartMenuPage Var mui.StartMenuPage.Location Var mui.StartMenuPage.FolderList Var mui.StartMenuPage.Temp !endif !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME !ifndef MUI_STARTMENUPAGE_REGISTRY_VARIABLES !define MUI_STARTMENUPAGE_REGISTRY_VARIABLES Var mui.StartMenuPage.RegistryLocation !endif !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_STARTMENU ID VAR !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE "" !insertmacro MUI_STARTMENUPAGE_INTERFACE !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER "$(^Name)" !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)" !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)" !define MUI_STARTMENUPAGE_VARIABLE "${VAR}" !define "MUI_STARTMENUPAGE_${ID}_VARIABLE" "${MUI_STARTMENUPAGE_VARIABLE}" !define "MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT" "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" !endif !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" !endif !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" !endif PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} Caption " " PageExEnd !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} !undef MUI_STARTMENUPAGE_VARIABLE !undef MUI_STARTMENUPAGE_TEXT_TOP !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX !undef MUI_STARTMENUPAGE_DEFAULTFOLDER !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME !macroend !macro MUI_PAGE_STARTMENU ID VAR !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_STARTMENU "${ID}" "${VAR}" !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME ;Get Start Menu location from registry ${if} "${MUI_STARTMENUPAGE_VARIABLE}" == "" ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" ${if} $mui.StartMenuPage.RegistryLocation != "" StrCpy "${MUI_STARTMENUPAGE_VARIABLE}" $mui.StartMenuPage.RegistryLocation ${endif} ClearErrors ${endif} !endif !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE) ${if} $(^RTL) == "0" !ifndef MUI_STARTMENUPAGE_NODISABLE StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !else StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !endif ${else} !ifndef MUI_STARTMENUPAGE_NODISABLE StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !else StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !endif ${endif} Pop $mui.StartMenuPage ;Get control handles GetDlgItem $mui.StartMenuPage.Location $mui.StartMenuPage 1002 GetDlgItem $mui.StartMenuPage.FolderList $mui.StartMenuPage 1004 !ifdef MUI_STARTMENUPAGE_BGCOLOR !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXTCOLOR "" SetCtlColors $mui.StartMenuPage.Location "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" SetCtlColors $mui.StartMenuMenu.FolderList "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" !endif !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW StartMenu::Show !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED Pop $mui.StartMenuPage.Temp ${if} $mui.StartMenuPage.Temp == "success" Pop "${MUI_STARTMENUPAGE_VARIABLE}" ${endif} FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend ;-------------------------------- ;Script macros to get Start Menu folder !macro MUI_STARTMENU_GETFOLDER ID VAR !verbose push !verbose ${MUI_VERBOSE} ;Get Start Menu folder from registry ;Can be called from the script in the uninstaller !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}" ${if} $mui.StartMenuPage.RegistryLocation != "" StrCpy "${VAR}" $mui.StartMenuPage.RegistryLocation ${else} StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" ${endif} !else StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" !endif !verbose pop !macroend !macro MUI_STARTMENU_WRITE_BEGIN ID ;The code in the script to write the shortcuts should be put between the ;MUI_STARTMENU_WRITE_BEGIN and MUI_STARTMENU_WRITE_END macros !verbose push !verbose ${MUI_VERBOSE} !define MUI_STARTMENUPAGE_CURRENT_ID "${ID}" StrCpy $mui.StartMenuPage.Temp "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" 1 ;If the folder start with >, the user has chosen not to create a shortcut ${if} $mui.StartMenuPage.Temp != ">" ${if} "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" == "" ;Get folder from registry if the variable doesn't contain anything !insertmacro MUI_STARTMENU_GETFOLDER "${MUI_STARTMENUPAGE_CURRENT_ID}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" ${endif} !verbose pop !macroend !macro MUI_STARTMENU_WRITE_END !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME ;Write folder to registry WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" !endif ${endif} !undef MUI_STARTMENUPAGE_CURRENT_ID !verbose pop !macroend nsis-3.11/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh000077500000000000000000000045041477201124000227220ustar00rootroot00000000000000/* NSIS Modern User Interface Uninstall confirmation page */ ;-------------------------------- ;Page interface settings and variables !macro MUI_UNCONFIRMPAGE_INTERFACE !ifndef MUI_UNCONFIRMPAGE_INTERFACE !define MUI_UNCONFIRMPAGE_INTERFACE Var mui.UnConfirmPage Var mui.UnConfirmPage.Text Var mui.UnConfirmPage.DirectoryText Var mui.UnConfirmPage.Directory !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_CONFIRM !insertmacro MUI_SET MUI_UNCONFIRMPAGE "" !insertmacro MUI_UNCONFIRMPAGE_INTERFACE !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION "" PageEx un.uninstConfirm PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} Caption " " UninstallText "${MUI_UNCONFIRMPAGE_TEXT_TOP}" "${MUI_UNCONFIRMPAGE_TEXT_LOCATION}" !ifdef MUI_UNCONFIRMPAGE_VARIABLE DirVar "${MUI_UNCONFIRMPAGE_VARIABLE}" !endif PageExEnd !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION !macroend !macro MUI_UNPAGE_CONFIRM !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_CONFIRM !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE) FunctionEnd Function "${SHOW}" ;Get controls handles FindWindow $mui.UnConfirmPage "#32770" "" $HWNDPARENT GetDlgItem $mui.UnConfirmPage.Text $mui.UnConfirmPage 1006 GetDlgItem $mui.UnConfirmPage.DirectoryText $mui.UnConfirmPage 1029 GetDlgItem $mui.UnConfirmPage.Directory $mui.UnConfirmPage 1000 !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/Pages/Welcome.nsh000077500000000000000000000123671477201124000210340ustar00rootroot00000000000000/* NSIS Modern User Interface Welcome page (implemented using nsDialogs) */ ;-------------------------------- ;Page interface settings and variables !macro MUI_WELCOMEPAGE_INTERFACE !ifndef MUI_WELCOMEPAGE_INTERFACE !define MUI_WELCOMEPAGE_INTERFACE Var mui.WelcomePage Var mui.WelcomePage.Image Var mui.WelcomePage.Image.Bitmap Var mui.WelcomePage.Title Var mui.WelcomePage.Title.Font Var mui.WelcomePage.Text !endif !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" !if "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" == "" !error "Invalid MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP" !endif !macroend ;-------------------------------- ;Interface initialization !macro MUI_WELCOMEPAGE_GUIINIT !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit InitPluginsDir File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" !pragma verifyloadimage "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT Call "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}" !endif FunctionEnd !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit !endif !macroend ;-------------------------------- ;Page declaration !macro MUI_PAGEDECLARATION_WELCOME !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE "" !insertmacro MUI_WELCOMEPAGE_INTERFACE !insertmacro MUI_WELCOMEPAGE_GUIINIT !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)" !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)" !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} PageExEnd !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT !macroend !macro MUI_PAGE_WELCOME !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_PAGEDECLARATION_WELCOME !verbose pop !macroend !macro MUI_UNPAGE_WELCOME !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGEDECLARATION_WELCOME !verbose pop !macroend ;-------------------------------- ;Page functions !macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE ;Create dialog nsDialogs::Create 1044 Pop $mui.WelcomePage nsDialogs::SetRTL $(^RTL) SetCtlColors $mui.WelcomePage "" "${MUI_BGCOLOR}" ;Image control ${NSD_CreateBitmap} 0u 0u 109u 193u "" Pop $mui.WelcomePage.Image !insertmacro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE "${MUI_PAGE_UNINSTALLER_PREFIX}" $mui.WelcomePage.Image $PLUGINSDIR\modern-wizard.bmp $mui.WelcomePage.Image.Bitmap ;Positiong of controls ;Title !ifndef MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_WELCOMEPAGE_TITLE_HEIGHT 28 !else !define MUI_WELCOMEPAGE_TITLE_HEIGHT 38 !endif ;Text ;17 = 10 (top margin) + 7 (distance between texts) !define /math MUI_WELCOMEPAGE_TEXT_TOP 17 + ${MUI_WELCOMEPAGE_TITLE_HEIGHT} ;Title ${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u "${MUI_WELCOMEPAGE_TITLE}" Pop $mui.WelcomePage.Title SetCtlColors $mui.WelcomePage.Title "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" CreateFont $mui.WelcomePage.Title.Font "$(^Font)" "12" "700" SendMessage $mui.WelcomePage.Title ${WM_SETFONT} $mui.WelcomePage.Title.Font 0 ;Welcome text ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "${MUI_WELCOMEPAGE_TEXT}" Pop $mui.WelcomePage.Text SetCtlColors $mui.WelcomePage.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" ;Show page Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW nsDialogs::Show !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow ;Delete image from memory ${NSD_FreeImage} $mui.WelcomePage.Image.Bitmap !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_HEIGHT !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT_TOP FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend nsis-3.11/Contrib/Modern UI 2/Readme.html000077500000000000000000002314661477201124000177560ustar00rootroot00000000000000 NSIS Modern User Interface - Documentation

[Expand all]   [Collapse all]

Introduction

The Modern UI provides a user interface for NSIS installers with a modern wizard style, similar to the wizards of recent Windows versions. It is based on the basic user interface that is provided by the NSIS compiler itself and extends it with more interface features and pages.

All standard NSIS pages (such as the pages to select components and the installation folder) are supported as well as a number of additional pages. The welcome page allows you to provide an introduction to the installation process, while the finish page provides a way to let the user decide what steps should be performed after the setup wizard is closed (for example, whether the application should be started immediately). A finish page can also be used to ask for a system restart is necessary.

Open/Close section Screenshots

Modern UI 2.1

This new version makes it easier to customize pages, because the same method can be used to  change standard NSIS pages as well as additional pages provided by the Modern UI. It is now also possible for other NSIS plug-ins to add new pages to the Modern UI. You can expect to see examples of this soon.

The welcome and finish page are no longer implemented using InstallOptions. Instead, the new nsDialogs plug-in is used. nsDialogs allows you to create custom pages or customize existing pages directly from the script.

To upgrade a Modern UI 1.8 script, you should:

  • Insert the MUI2.nsh header file instead of MUI.nsh.
  • The macros for InstallOptions have been moved to a separate header file unrelated to the Modern UI. If you are still using InstallOptions for custom pages, insert InstallOptions.nsh and use the INSTALLOPTIONS_* macros instead of the MUI_INSTALLOPTIONS_* macros. The macros themselves have remained the same.
  • Rewrite customization code for the Modern UI 1.8 welcome and finish pages in which the InstallOptions INI file is used. nsDialogs commands should be used instead.
  • Use the standard NSIS method to escape special characters in all texts. For example, $\r$\n creates newline.

Script header

The settings for the Modern UI should be inserted in the header of the script file. It's important to follow the same order as the items below. For example, interface settings should be defined before you insert pages, because the pages depend on the interface configuration. It may be useful to look at the example scripts too see how this is done in actual script files.

Parameters are given in this format: required (option1 | option2) [optional]

1. Header file

First of all, add this line to the top of script to include the Modern UI:

!include MUI2.nsh

2. Interface configuration

Then, you may want to use interface settings to change the look and feel of the installer. These settings apply to all pages.

The interface settings provided by the NSIS compiler itself (such as LicenseText, Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern UI provides equalivent or extended versions of these settings.

Examples:

!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
!define MUI_UI "myUI.exe" ;Value
!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors

Open/Close section Interface settings

Open/Close section Page header

MUI_ICON icon_file
The icon for the installer.
Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico

MUI_UNICON icon_file
The icon for the uninstaller.
Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico

MUI_HEADERIMAGE
Display an image on the header of the page.

MUI_HEADERIMAGE_BITMAP bmp_file
Bitmap image to display on the header of installers pages (recommended size: 150x57 pixels).
Default: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp

MUI_HEADERIMAGE_BITMAP_STRETCH mode

  • FitControl (Default)
    Stretch the image to fit the image control.

  • NoStretchNoCropNoAlign
    Do not stretch the image to fit the size of the image control. You should not use this option if you have a full size bitmap that fits exactly because the size of the field will be different if the user has a custom DPI setting or if the installer is using a CJK language.

  • NoStretchNoCrop
    This is similar to NoStretchNoCropNoAlign but will align the image to the right edge when using a RTL language or if MUI_HEADERIMAGE_RIGHT is defined.

  • AspectFitHeight
    Scale the image up or down until it is the same height as the image control while maintaining the image aspect ratio.

MUI_HEADERIMAGE_BITMAP_RTL bmp_file
Bitmap image to display on the header of installers pages when using a RTL language (recommended size: 150x57 pixels).
Default: Non-RTL bitmap

MUI_HEADERIMAGE_BITMAP_RTL_STRETCH mode
See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

MUI_HEADERIMAGE_UNBITMAP bmp_file
Bitmap image to display on the header of uninstaller pages (recommended size: 150x57 pixels).
Default: Installer header bitmap

MUI_HEADERIMAGE_UNBITMAP_STRETCH mode
See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

MUI_HEADERIMAGE_UNBITMAP_RTL bmp_file
Bitmap image to display on the header of uninstallers pages when using a RTL language (recommended size: 150x57 pixels).
Default: Installer RTL header bitmap

MUI_HEADERIMAGE_UNBITMAP_RTL_STRETCH mode
See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

MUI_HEADERIMAGE_RIGHT
Display the header image on the right side instead of the left side (when using a RTL language it will be displayed on the left side instead of the right side).

MUI_BGCOLOR (color: RRGGBBR hexadecimal)
Background color for the header, the Welcome page and the Finish page.
Default: FFFFFF

MUI_HEADER_TRANSPARENT_TEXT
Set a transparent background for the header's label controls. Useful for custom user interfaces that set a bigger header image.

MUI_TEXTCOLOR (color: RRGGBBR hexadecimal)
Text color for the header, the Welcome page and the Finish page.
Default: 000000

Open/Close section Interface resources

MUI_UI ui_file
The interface file with the dialog resources. Change this if you have made your own customized UI.
Default: ${NSISDIR}\Contrib\UIs\modern.exe

MUI_UI_HEADERIMAGE ui_file
The interface files with the dialog resource IDD_INST that contains a bitmap control and space for the header bitmap.
Default: ${NSISDIR}\Contrib\UIs\modern_headerbmp.exe

MUI_UI_HEADERIMAGE_RIGHT ui_file
The interface files with the dialog resource IDD_INST that contains a bitmap control and space for the header bitmap on the right side.
Default: ${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe

MUI_UI_COMPONENTSPAGE_SMALLDESC ui_file
The interface files with a customized dialog resource IDD_SELCOM with a small description area.
Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe

MUI_UI_COMPONENTSPAGE_NODESC ui_file
The interface files with a customized dialog resource IDD_SELCOM without a description area.
Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe

Open/Close section Installer welcome/finish page

MUI_WELCOMEFINISHPAGE_BITMAP bmp_file
Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

MUI_WELCOMEFINISHPAGE_BITMAP_STRETCH mode
See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

Open/Close section Uninstaller welcome/finish page

MUI_UNWELCOMEFINISHPAGE_BITMAP bmp_file
Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

MUI_UNWELCOMEFINISHPAGE_BITMAP_STRETCH mode
See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

Open/Close section License page

MUI_LICENSEPAGE_BGCOLOR (/windows | /grey | (color: RRGGBB hexadecimal))
The background color for the license textbox. Use /windows for the Windows text background color (usually white). Use the /grey for the window background color (usually grey).
Default: /windows

Open/Close section Components page

MUI_COMPONENTSPAGE_CHECKBITMAP bitmap_file
The bitmap with images for the checks of the component select treeview.
Default: ${NSISDIR}\Contrib\Graphics\Checks\modern.bmp

MUI_COMPONENTSPAGE_SMALLDESC
A small description area on the bottom of the page. Use this layout if you have a lot of sections and don't need large descriptions.

MUI_COMPONENTSPAGE_NODESC
No description area.

Open/Close section Directory page

MUI_DIRECTORYPAGE_BGCOLOR (color: RRGGBB hexadecimal)
The background color for the directory textbox.

Open/Close section Start Menu folder page

MUI_STARTMENUPAGE_BGCOLOR (color: RRGGBB hexadecimal)
The background color for the startmenu directory list and textbox.

Open/Close section Installation page

MUI_INSTFILESPAGE_COLORS (/windows | "(foreground color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)")
The colors of the details screen. Use /windows for the default Windows colors.
Default: /windows

MUI_INSTFILESPAGE_PROGRESSBAR ("" | colored | smooth)
The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.
Default: smooth

Open/Close section Installer finish page

MUI_FINISHPAGE_NOAUTOCLOSE
Do not automatically jump to the finish page, to allow the user to check the install log.

Open/Close section Uninstaller finish page

MUI_UNFINISHPAGE_NOAUTOCLOSE
Do not automatically jump to the finish page, to allow the user to check the uninstall log.

Open/Close section Abort warning

MUI_ABORTWARNING
Show a message box with a warning when the user wants to close the installer.

MUI_ABORTWARNING_TEXT text
Text to display on the abort warning message box.

MUI_ABORTWARNING_CANCEL_DEFAULT
Set the Cancel button as the default button on the message box.

Open/Close section Uninstaller abort warning

MUI_UNABORTWARNING
Show a message box with a warning when the user wants to close the uninstaller.

MUI_UNABORTWARNING_TEXT text
Text to display on the abort warning message box.

MUI_UNABORTWARNING_CANCEL_DEFAULT
Set the Cancel button as the default button on the message box.

3. Pages

Insert the following macros to set the pages you want to use. The pages will appear in the order in which you insert them in the script. You can also insert custom Page commands between the macros to add custom pages.

You can add multiple pages of certain types (for example, if you want the user to specify multiple folders).

Examples:

!insertmacro MUI_PAGE_LICENSE "License.rtf"
!insertmacro MUI_PAGE_COMPONENTS

Var StartMenuFolder
!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder

You will need the page ID for the Start Menu folder page when using the Start Menu folder macros. The folder will be stored in the specified variable.

Installer pages
MUI_PAGE_WELCOME
MUI_PAGE_LICENSE textfile
MUI_PAGE_COMPONENTS
MUI_PAGE_DIRECTORY
MUI_PAGE_STARTMENU pageid variable
MUI_PAGE_INSTFILES
MUI_PAGE_FINISH

Uninstaller pages
MUI_UNPAGE_WELCOME
MUI_UNPAGE_CONFIRM
MUI_UNPAGE_LICENSE textfile
MUI_UNPAGE_COMPONENTS
MUI_UNPAGE_DIRECTORY
MUI_UNPAGE_INSTFILES
MUI_UNPAGE_FINISH

Open/Close section Page settings

Page settings apply to a single page and should be set before inserting a page macro. The same settings can be used for installer and uninstaller pages. You have to repeat the setting if you want it to apply to multiple pages. Example:

;Add a directory page to let the user specify a plug-ins folder
;Store the folder in $PluginsFolder

Var PLUGINS_FOLDER
!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder
!insertmacro MUI_PAGE_DIRECTORY

All standard texts in the user interface are loaded from language files, which are available for all languages supported by NSIS. So you only need to define these texts if you want to change the default.

If the parameter is a text that should be different for each language, define a language string using LangString and use $(LangStringName) as value. For a license text in multiple languages, LicenseLangString can be used. Refer the NSIS Users Manual for more information about installers with multiple languages.

In all text settings, the doublequote character (") should be escaped in the following form: $\"

Open/Close section General page settings

MUI_PAGE_HEADER_TEXT text
Text to display on the header of the page.

MUI_PAGE_HEADER_SUBTEXT text
Subtext to display on the header of the page.

Open/Close section Welcome page settings

MUI_WELCOMEPAGE_TITLE title
Title to display on the top of the page.

MUI_WELCOMEPAGE_TITLE_3LINES
Extra space for the title area.

MUI_WELCOMEPAGE_TEXT text
Text to display on the page.

Open/Close section License page settings

MUI_LICENSEPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_LICENSEPAGE_TEXT_BOTTOM text
Text to display on the bottom of the page.

MUI_LICENSEPAGE_BUTTON button_text
Text to display on the 'I Agree' button.

MUI_LICENSEPAGE_CHECKBOX
Display a checkbox the user has to check to agree with the license terms.

MUI_LICENSEPAGE_CHECKBOX_TEXT text
Text to display next to the checkbox to agree with the license terms.

MUI_LICENSEPAGE_RADIOBUTTONS
Display two radio buttons to allow the user to choose between accepting the license terms or not.

MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
Text to display next to the checkbox to accept the license terms.

MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
Text to display next to the checkbox to decline the license terms.

Open/Close section Components page settings

MUI_COMPONENTSPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_COMPONENTSPAGE_TEXT_COMPLIST text
Text to display on next to the components list.

MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
Text to display on next to the installation type combo box.

MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
Text to display on the of the top of the description box.

MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
Text to display inside the description box when no section is selected.

Open/Close section Directory page settings

MUI_DIRECTORYPAGE_TEXT_TOP text
Text to display on top of the page.

MUI_DIRECTORYPAGE_TEXT_DESTINATION text
Text to display on the destination folder frame.

MUI_DIRECTORYPAGE_VARIABLE variable
Variable in which to store the selected folder.
Default: $INSTDIR

MUI_DIRECTORYPAGE_VERIFYONLEAVE
Does not disable the Next button when a folder is invalid but allows you to use GetInstDirError in the leave function to handle an invalid folder.

Open/Close section Start Menu folder page settings

MUI_STARTMENUPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_STARTMENUPAGE_TEXT_CHECKBOX text
Text to display next to the checkbox to disable the Start Menu folder creation.

MUI_STARTMENUPAGE_DEFAULTFOLDER folder
The default Start Menu Folder.

MUI_STARTMENUPAGE_NODISABLE
Do not display the checkbox to disable the creation of Start Menu shortcuts.

MUI_STARTMENUPAGE_REGISTRY_ROOT root
MUI_STARTMENUPAGE_REGISTRY_KEY key
MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
The registry key to store the Start Menu folder. The page will use it to remember the users preference. You should also use for the uninstaller to remove the Start Menu folders. Don't forget to remove this key during uninstallation.

For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu folder:

!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
  Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"

Open/Close section Installation page settings

MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
Text to display on the header of the installation page when the installation has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
Subtext to display on the header of the installation page when the installation has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
Text to display on the header of the installation page when the installation has been aborted.

MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
Subext to display on the header of the installation page when the installation has been aborted.

Open/Close section Finish page settings

MUI_FINISHPAGE_TITLE title
Title to display on the top of the page.

MUI_FINISHPAGE_TITLE_3LINES
Extra space for the title area.

MUI_FINISHPAGE_TEXT text
Text to display on the page.

MUI_FINISHPAGE_TEXT_LARGE
Extra space for the text area (if using checkboxes).

MUI_FINISHPAGE_BUTTON text
Text to display on the Finish button.

MUI_FINISHPAGE_CANCEL_ENABLED
Enable the Cancel button so the user can skip any options displayed on the finish page.

MUI_FINISHPAGE_TEXT_REBOOT text
Text to display on the finish page when asking for a system reboot.

MUI_FINISHPAGE_TEXT_REBOOTNOW text
Text to display next to the 'Reboot now' option button.

MUI_FINISHPAGE_TEXT_REBOOTLATER text
Text to display next to the 'Reboot later' option button.

MUI_FINISHPAGE_REBOOTLATER_DEFAULT
Sets the 'Reboot later' option as the default option.

MUI_FINISHPAGE_RUN exe_file
Application which the user can select to run using a checkbox. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_RUN_TEXT text
Texts to display next to the 'Run program' checkbox.

MUI_FINISHPAGE_RUN_PARAMETERS parameters
Parameters for the application to run. Don't forget to escape double quotes in the value (use $\").

MUI_FINISHPAGE_RUN_NOTCHECKED
Do not check the 'Run program' checkbox by default

MUI_FINISHPAGE_RUN_FUNCTION function
Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without parameters). You can use the function to execute multiple applications or you can change the checkbox name and use it for other things.

MUI_FINISHPAGE_SHOWREADME file/url
File or website which the user can select to view using a checkbox. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_SHOWREADME_TEXT text
Texts to display next to the 'Show Readme' checkbox.

MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
Do not check the 'Show Readme' checkbox by default

MUI_FINISHPAGE_SHOWREADME_FUNCTION function
Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without parameters). You can use the function to show multiple files or you can change the checkbox name and use it for other things.

MUI_FINISHPAGE_LINK link_text
Text for a link on the which the user can click to view a website or file.

MUI_FINISHPAGE_LINK_LOCATION file/url
Website or file which the user can select to view using the link. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
Text color for the link on the Finish page.
Default: 000080

MUI_FINISHPAGE_NOREBOOTSUPPORT
Disables support for the page that allows the user to reboot the system. Define this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.

Open/Close section Uninstall confirm page settings

MUI_UNCONFIRMPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_UNCONFIRMPAGE_TEXT_LOCATION text
Text to display next to the uninstall location text box.

MUI_UNCONFIRMPAGE_VARIABLE variable
Variable in which to store the uninstall source folder.
Default: $INSTDIR

4. Language files

Insert the Modern UI language files for the languages to want to include.

!insertmacro MUI_LANGUAGE "English"

The standard NSIS language files are loaded automatically, there is no need to use LoadLanguageFile.

5. Reserve files

If you are using solid compression, files that are required before the actual installation should be stored first in the data block, because this will make your installer start faster. Include reserve file commands for such files before your sections and functions:

ReserveFile /plugin MyPlugin.dll
!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog
...

Script code for pages

Some pages allow you to show additional information or can be used to get user input. Here you can find the script code to use these features.

Components page descriptions

The Modern UI components page has a text box in which a description can be shown when the user hovers the mouse over a component. If you don't want to use these descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.

To set a description for a section, an additional parameter needs to be added to Section command with a unique identifier for the section. This name can later be used to set the description for this section.

Section "Section Name 1" Section1
   ...
SectionEnd

After the sections, use these macros to set the descriptions:

LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END macros.

Start Menu folder

Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN and MUI_STARTMENU_WRITE_END macros:

!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid
  ...create shortcuts...
!insertmacro MUI_STARTMENU_WRITE_END

The page ID should be the ID of the page on which the user has selected the folder for the shortcuts you want to write.

The variable which contains the folder and the page ID are set as parameters of the page macro.

Language selection dialog

If you want the installer to display a language selection dialog (see the the MultiLanguage.nsi example), insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:

Function .onInit

  !insertmacro MUI_LANGDLL_DISPLAY

FunctionEnd

This macro can also be used in the un.onInit function.

Open/Close section Settings for registry storage of selected language

To remember the user's preference, you can define a registry key. These defines should be set before inserting the installation page macro.

MUI_LANGDLL_REGISTRY_ROOT root
MUI_LANGDLL_REGISTRY_KEY key
MUI_LANGDLL_REGISTRY_VALUENAME value_name
The registry key to store the language. The users preference will be remembered. You can also use it for the uninstaller to display the right language. Don't forget to remove this key in the uninstaller.

For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the stored language preference:

Function un.onInit

  !insertmacro MUI_UNGETLANGUAGE

FunctionEnd

Open/Close section Interface settings for selection dialog

To customize the language selection dialog interface, use these defines before inserting the MUI_LANGDLL_DISPLAY macro.

MUI_LANGDLL_WINDOWTITLE text
The window title of the language selection dialog.

MUI_LANGDLL_INFO text
The text to display on the language selection dialog.

MUI_LANGDLL_ALWAYSSHOW
Always show the language selection dialog, even if a language has been stored in the registry. The language stored in the registry will be selected by default.

MUI_LANGDLL_ALLLANGUAGES
Always show all available languages and don't filter according to their codepage.

Custom pages

If you want add your custom pages to your installer, you can insert your own page commands between the page macros.

!insertmacro MUI_PAGE_WELCOME
Page custom FunctionName ;Custom page
!insertmacro MUI_PAGE_COMPONENTS
 
;Uninstaller
!insertmacro MUI_UNPAGE_CONFIRM
UninstPage custom un.FunctionName ;Custom page
!insertmacro MUI_UNPAGE_INSTFILES

Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:

LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"

Function CustomPageFunction
  !insertmacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
  nsDialogs::...
  ...
FunctionEnd

Custom functions

Interface functions provided by NSIS, like the .onGUIInit function and the page functions are automatically included by the Modern UI and filled with code to support new interface features. If you want to add additional code to these function, create a function with the custom script code in the script use the Modern UI functions call them.

Example:

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit

Function myGUIInit
  ...
FunctionEnd

Modern UI pages can also customized using custom functions.

Open/Close section General Custom Functions

These defines should be set before inserting the language macros.

MUI_CUSTOMFUNCTION_GUIINIT function
MUI_CUSTOMFUNCTION_UNGUIINIT function
MUI_CUSTOMFUNCTION_ABORT function
MUI_CUSTOMFUNCTION_UNABORT function
MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION function
MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION function

Mouse over functions are only available when the description macros (MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not used, regular .onMouseOverSection and un.onMouseOverSection must be used.

Open/Close section Page Custom Functions

These defines should be set before inserting a page macro.

MUI_PAGE_CUSTOMFUNCTION_PRE function
MUI_PAGE_CUSTOMFUNCTION_SHOW function
MUI_PAGE_CUSTOMFUNCTION_LEAVE function
MUI_PAGE_CUSTOMFUNCTION_DESTROYED function

The pre function is called first and allows you to initialize variables or decide whether the page should be skipped. Then, the show function is called, which can be used to customize the interface. Finally, the user input can be validated in the leave function. The NSIS Users Manual provides more information about these functions.

In the show function, the window handles of all controls on the page can be retrieved from a Modern UI variable. A list of the variables names is not yet available. For now, refer to the source files of the Modern UI 2. The variable declarations can be found in the first lines of the header file for a certain page.

The destroyed function is called after a external/plug-in page has been destroyed.

Example scripts

Basic: Basic.nsi
Welcome/Finish page: WelcomeFinish.nsi
Multiple languages: MultiLanguage.nsi
Header image: HeaderBitmap.nsi
Start Menu Folder page: StartMenu.nsi

Credits

Written by Joost Verburg.
Icons designed by Nikos Adamamas, aka adni18.
Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.

License

The zlib/libpng license applies to the Modern UI.

Open/Close section License Terms

Copyright © 2002-2025 Joost Verburg

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; 
   you must not claim that you wrote the original software.
   If you use this software in a product, an acknowledgment in the
   product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
   and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
nsis-3.11/Contrib/Modern UI 2/SConscript000077500000000000000000000014121477201124000176670ustar00rootroot00000000000000target = 'Modern UI 2' docs = Split(""" License.txt Readme.html """) doc_images = Split(""" closed.gif header.gif open.gif screen1.png screen2.png """) contribs = Split(""" Deprecated.nsh Interface.nsh Localization.nsh MUI2.nsh Pages.nsh """) pages = Split(""" Components.nsh Directory.nsh Finish.nsh InstallFiles.nsh License.nsh StartMenu.nsh UninstallConfirm.nsh Welcome.nsh """) Import('defenv') def join(prefix, list_): return list(map(lambda x: '%s/%s' % (prefix, x), list_)) defenv.DistributeDocs(docs, path=target) defenv.DistributeDocs(join('../Modern UI/images',doc_images), path='%s/%s'%(target,'images')) path = 'Pages' defenv.DistributeContrib(join(path,pages), path='%s/%s'%(target,path)) defenv.DistributeContrib(contribs, path=target) nsis-3.11/Contrib/Modern UI/000077500000000000000000000000001477201124000155325ustar00rootroot00000000000000nsis-3.11/Contrib/Modern UI/Changelog.txt000077500000000000000000000267321477201124000201770ustar00rootroot00000000000000NSIS Modern User Interface Version History 1.81 * Added MUI_TEXTCOLOR (2018-09-09) * Added MUI_PAGE_CUSTOMFUNCTION_DESTROYED (2017-04-03) * Added support for MUI_UNCONFIRMPAGE_VARIABLE (RFE #511) (2016-12-30) 1.8 - August 9, 2007 * Uses the new language files * Updated documentation * Although MUI_DIRECTORYPAGE_BGCOLOR and MUI_STARTMENUPAGE_BGCOLOR are documented as interface settings that apply to every directory page or Start Menu folder page, they were actually implemented as page specific settings. They have been changed to interface settings. * MUI_LANGDLL_DISPLAY now also reads a previously saved language from the registry if the installation is silent. * InstallOptions macros have been moved to a separate header file (InstallOptions.nsh). The MUI_INSTALLOPTIONS_* macros are still provided for backwards compatibility and insert the equalivent INSTALLOPTIONS_* macros. * Added MUI_CUSTOMFUNCTION_MOUSEOVERSECTION 1.78 - June 8, 2007 * Added MUI_STARTMENUPAGE_BGCOLOR * Added MUI_DIRECTORYPAGE_BGCOLOR * Added MUI_LANGDLL_ALLLANGUAGES 1.77 - April 27, 2007 * Added MUI_FINISHPAGE_CANCEL_ENABLED * Added MUI_FINISHPAGE_REBOOTLATER_DEFAULT * Block unsupported languages in the language selection dialog * Cancel button no longer enabled by default on the finish page * Reduced flicker caused by MUI_HEADER_TRANSPARENT_TEXT 1.76 - September 23, 2006 * Added MUI_ABORTWARNING_CANCEL_DEFAULT 1.75 - April 1, 2006 * Added show function for the start menu page * Added MUI_HEADER_TRANSPARENT_TEXT for transparent header texts 1.74 - September 4, 2005 * Fixed compile error when checkboxes are used on multiple finish page pages 1.73 - August 6, 2005 * The checkboxes to run an application or show a Readme file can now also be used on an uninstaller finish pages or multiple finish pages 1.72 - November 27, 2004 * Fixed state of Finish page Cancel button when both an installer and uninstaller page is included 1.71 - October 14, 2004 * The selected language is only stored in the registry when installation was successful 1.70 - February 6, 2004 * Improved documentation * New Init custom function for Welcome and Finish page 1.69 - January 7, 2004 * All uninstaller pages work without installer pages * Fixed top text on uninstaller license page 1.68 - November 24, 2003 * New settings for extra space for title and text on Welcome and Finish page. * Improved handling of verbose settings. Define MUI_VERBOSE the set the Modern UI verbose level (1-4). * Language file string for uninstaller reboot information * Setting for folder validation in leave function * Fixed finish page text settings for multiple pages 1.67 - November 18, 2003 * Support for uninstaller Welcome pages and Finish pages * Improved and changed text settings * ID for Start Menu Folder pages, easier to use multiple pages * Renamed a few settings * Default header image * Support for uninstaller abort warning * Setting for 3 line text on Welcome and Finish page (NOTE: New settings have been introduced in version 1.68) * Language file backwards compatibility: English for missing strings * Support for different uninstaller header image * Language selection dialog not displayed if installer is silent * Cancel button on Finish page when there are options * Full RTL support 1.66 - October 7, 2003 * New system for page settings and custom pages * Support for uninstaller components page * Support for multiple pages of the same type * New position for interface settings * Changed macro and setting names * Updated language system, new language files and settings * Removed MUI_BRANDINGTEXT. You can use the standard BrandingText instruction. * Removed MUI_PRODUCT and MUI VERSION. You can use the standard Name instruction. 1.65 - July 16, 2003 * New page configuration system, no different system for installers with custom pages * Default windows color for the license text background * Example script updates (new format, user variables) * Improved registry storage for Start Menu folder * ReserveFile macro for StartMenu plug-in * Option to always show the language selection dialog (even if a language has been stored in the registry) * Checkboxes on Finish page can be used to call a function * Support for custom leave functions for Start Menu Folder, Welcome and Finish pages * Support for a link on the Finish page * New macro to get Start Menu folder in uninstaller * Options to disable bitmap stretching * Components page description box info text: always displayed when mouse is outside box, disabled style 1.64 - April 27, 2003 * Support for license page with checkbox or radiobuttons to let the user accept the agreement or not * Macros for finish headers don't have to be inserted anymore * Language preference stored when installation has completed, no problems anymore when the users selects the wrong language * Header text for aborted installation * New macros: get language for uninstaller, delete shortcuts * Language specific fonts * Welcome/Finish page INI files can be modified in pre functions * More texts can be customized 1.63 - March 9, 2003 * Support for a bitmap in the wizard header * New defines to change the components page interface * MUI_SYSTEM inserted automatically * Single macro for language selection dialog * Removed page description in window title * Easier to customize resource files * New system for custom functions * Start Menu folder registry key automatically written * New InstallOptions macros that do not remove the return value from the stack * Support for custom pages before the finish page * Renamed Start Menu page defines * 'Do not create shortcuts' checkbox can be removed * 'MS Shell Dlg' font for header title * RTL support * Documentation updates * Minor fixes 1.62 - February 2, 2003 * New language strings for Finish page * Possibility to let a Modern UI Function call your own function * No problems anymore when using both 'Run program' and 'Show Readme' on the Finish page * Default state of checkboxes on the finish page can be changed * Welcome / Finish page compatible with custom DPI settings * Converted Install Options INI files to use dialog units * More ReserveFile macros (NOTE: Some of these macros have been removed in later versions) * Background color can be changed with a define * Support for multilingual branding texts * Start Menu / Finish page window titles also work when using custom page commands * Language files should be inserted after inserting the MUI_SYSTEM macro (NOTE: The MUI_SYSTEM macro has been removed in version 1.63) * Define MUI_MANUALVERBOSE if you don't want the Modern UI to change the verbose settings during compilation (NOTE: This setting has been changed in version 1.68) 1.61 - December 5, 2002 * modern3.exe UI without description area (NOTE: This setting has been changed in version 1.63) * Added define to show uninstall confirm page * Added language string for finish page title and continue to uninstall * Define for parameters for the application to run on the finish page * Minor fixes 1.6 - November 18, 2002 * Welcome / Finish page * Automatic ask for reboot on finish page * Create no shortcut option on the Start Menu Folder selection page * Customizing GUIInit functions easier * Minor font / UI changes 1.5 - November 11, 2002 * New language file format * Language strings can be changed in the script without editing languagefiles * Start Menu Folder selection page * 'Click Next to continue' and 'Click Install to start the installation' texts automatically change to the page order * Install Options macros updated. MUI_INSTALLOPTIONS_DISPLAY is the standard macro now. Use MUI_INSTALLOPTIONS_INITDIALOG and MUI_INSTALLOPTIONS_SHOW if you want to customize dialog controls. * No more writing window titles & abort warnings to Install Options INI Files * Compatible with updated paging system * Renamed macros and defines * Minor fixes 1.4 - November 4, 2002 * Uses new NSIS Page command * Macro System updates (smaller) * Macro System a lot easier * Modern UI Language Files load NLF language files * Renamed macros and defines 1.3 - October 27, 2002 * Easier macro system for basic scripts * New MultiLanguage system using Modern UI Language Files * New directory structure (header/language files in Contrib\Modern UI) * Small bugfixes & typo corrections * SetPage function should be set using defines * Different NextPage/PrevPage/FinishHeader macros for install/uninstall (NOTE: These macros have been removed in version 1.4) * Interface settings can be defined (for example, MUI_ICON), no parameters for MUI_INTERFACE anymore * New Install Options macros to read/write IO INI file value 1.21 - September 30, 2002 * Temp vars set in Modern UI header * Currentpage & Install Options vars should be set using parameters of the MUI_INTERFACE and * MUI_INSTALLOPTIONS macros (NOTE: The MUI_INTERFACE macro has been removed in version 1.3) * MultiLanguage.nsi uses the new language strings 1.2 - September 22, 2002 (NOTE: All macros mentioned here have been removed in version 1.4) * Lots of macro system updates & fixes * InstallOptions support in macro system * Added Modern UI + InstallOptions example (InstallOptions.nsi) * MUI_NEXTPAGE_OUTER integrated in MUI_NEXTPAGE * No hard-coded function names anymore (you should give MUI_PREVPAGE a parameter with the set page function name (for example, MUI_PREVPAGE SetPage) * Examples use ReserveFile for faster startup 1.19 - Semtember 19, 2002 * Renamed some macros * Custom code can be used between page start/stop macros (NOTE: These macros have been removed in version 1.4) 1.18 - Semtember 13, 2002 * Uses the new Sendmessage string option 1.17 - Semtember 10, 2002 * Win9x font weight bug fixed (font of title in white rect) 1.16 - Semtember 6, 2002 * Change text 'Scroll down' on license page to 'Press Page Down', because the RichEdit control has focus by default now 1.15 - Semtember 4, 2002 * Multilanguage example: changed LangDialog to LangDLL::LangDialog (using the DLL name is now required) (NOTE: A new macro for the language selection dialog has been introduced in version 1.63) 1.14 - Semtember 3, 2002 * Small grammar fix (thanks eccles) * UI files updated by Justin for better RichEdit usage 1.13 - Semtember 2, 2002 * Added 16 color icons 1.12 - August 30, 2002 * Verifying installer & Unpacking data dialog has no titlebar anymore 1.11 - August 29, 2002 * Finish header for uninstaller can also be set using MUI_FINISHHEADER (NOTE: The MUI_FINISHHEADER macro has been removed in version 1.64) 1.1 - August 29, 2002 (NOTE: All settings mentioned here do not exist anymore) * Header file with macros, it's now very easy to use the UI in your scripts * Added the modern2.exe UI, with an other location of the Description frame, for installers with a lot of subsections (thanks rainwater) * Updated example scripts * Added Multilanguage.nsi example (Multilanguage & LangDLL) * Fixed background color issue with some custom XP themes * Removed WS_VISIBLE from black rect for inner dialog (fixes display issues) * Changed size of description area * Example script: Added instructions for the user on the Description frame * Auto sizing branding text * Used modern.bmp for the checks (thanks rainwater) * Using the new NSIS version, descriptions work using the keyboard and you can give descriptions to subsections * Correct font size using High-DPI fonts 1.0 - August 26, 2002 * Initial releasensis-3.11/Contrib/Modern UI/License.txt000077500000000000000000000015101477201124000176550ustar00rootroot00000000000000Copyright 2002-2025 Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution. nsis-3.11/Contrib/Modern UI/Readme.html000077500000000000000000002376221477201124000176340ustar00rootroot00000000000000 NSIS Modern User Interface - Documentation

[Expand all]   [Collapse all]

Introduction

The Modern UI provides a user interface for NSIS installers with a modern wizard style, similar to the wizards of recent Windows versions. It is based on the basic user interface that is provided by the NSIS compiler itself and extends it with more interface features and pages.

All standard NSIS pages (such as the pages to select components and the installation folder) are supported as well as a number of additional pages. The welcome page allows you to provide an introduction to the installation process, while the finish page provides a way to let the user decide what steps should be performed after the setup wizard is closed (for example, whether the application should be started immediately). A finish page can also be used to ask for a system restart is necessary.

Open/Close section Screenshots

Script header

The settings for the Modern UI should be inserted in the header of the script file. It's important to follow the same order as the items below. For example, interface settings should be defined before you insert pages, because the pages depend on the interface configuration. It may be useful to look at the example scripts too see how this is done in actual script files.

Parameters are given in this format: required (option1 | option2) [optional]

1. Header file

First of all, add this line to the top of script to include the Modern UI:

!include "MUI.nsh"

2. Interface configuration

Then, you may want to use interface settings to change the look and feel of the installer. These settings apply to all pages.

The interface settings provided by the NSIS compiler itself (such as LicenseText, Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern UI provides equalivent or extended versions of these settings.

Examples:

!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
!define MUI_UI "myUI.exe" ;Value
!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors

Open/Close section Interface settings

Open/Close section Page header

MUI_ICON icon_file
The icon for the installer.
Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico

MUI_UNICON icon_file
The icon for the uninstaller.
Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico

MUI_HEADERIMAGE
Display an image on the header of the page.

MUI_HEADERIMAGE_BITMAP bmp_file
Bitmap image to display on the header of installers pages (recommended size: 150x57 pixels).
Default: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp

MUI_HEADERIMAGE_BITMAP_NOSTRETCH
Do not stretch the installer header bitmap to fit the size of the field. Use this option only if you have an image that does not use the whole space. If you have a full size bitmap that fits exactly, you should not use this option because the size of the field will be different if the user has a custom DPI setting.

MUI_HEADERIMAGE_BITMAP_RTL bmp_file
Bitmap image to display on the header of installers pages when using a RTL language (recommended size: 150x57 pixels).
Default: Non-RTL bitmap

MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH
Do not stretch the installer header bitmap when using a RTL language to fit the size of the field. Use this option only if you have an image that does not use the whole space. If you have a full size bitmap that fits exactly, you should not use this option because the size of the field will be different if the user has a custom DPI setting.

MUI_HEADERIMAGE_UNBITMAP bmp_file
Bitmap image to display on the header of uninstaller pages (recommended size: 150x57 pixels).
Default: Installer header bitmap

MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
Do not stretch the uninstaller header bitmap to fit the size of the field. Use this option only if you have an image that does not use the whole space. If you have a full size bitmap that fits exactly, you should not use this option because the size of the field will be different if the user has a custom DPI setting.

MUI_HEADERIMAGE_UNBITMAP_RTL bmp_file
Bitmap image to display on the header of uninstallers pages when using a RTL language (recommended size: 150x57 pixels).
Default: Installer RTL header bitmap

MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH
Do not stretch the uninstaller header bitmap when using a RTL language to fit the size of the field. Use this option only if you have an image that does not use the whole space. If you have a full size bitmap that fits exactly, you should not use this option because the size of the field will be different if the user has a custom DPI setting.

MUI_HEADERIMAGE_RIGHT
Display the header image on the right side instead of the left side (when using a RTL language it will be displayed on the left side instead of the right side).

MUI_BGCOLOR (color: RRGGBBR hexadecimal)
Background color for the header, the Welcome page and the Finish page.
Default: FFFFFF

MUI_HEADER_TRANSPARENT_TEXT
Set a transparent background for the header's label controls. Useful for custom user interfaces that set a bigger header image.

MUI_TEXTCOLOR (color: RRGGBBR hexadecimal)
Text color for the header, the Welcome page and the Finish page.
Default: 000000

Open/Close section Interface resources

MUI_UI ui_file
The interface file with the dialog resources. Change this if you have made your own customized UI.
Default: ${NSISDIR}\Contrib\UIs\modern.exe

MUI_UI_HEADERIMAGE ui_file
The interface files with the dialog resource IDD_INST that contains a bitmap control and space for the header bitmap.
Default: ${NSISDIR}\Contrib\UIs\modern_headerbmp.exe

MUI_UI_HEADERIMAGE_RIGHT ui_file
The interface files with the dialog resource IDD_INST that contains a bitmap control and space for the header bitmap on the right side.
Default: ${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe

MUI_UI_COMPONENTSPAGE_SMALLDESC ui_file
The interface files with a customized dialog resource IDD_SELCOM with a small description area.
Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe

MUI_UI_COMPONENTSPAGE_NODESC ui_file
The interface files with a customized dialog resource IDD_SELCOM without a description area.
Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe

Open/Close section Installer welcome/finish page

MUI_WELCOMEFINISHPAGE_BITMAP bmp_file
Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
Do not stretch the bitmap for the Welcome and Finish page to fit the size of the field. Use this option only if you have an image that does not use the whole space. If you have a full size bitmap that fits exactly, you should not use this option because the size of the field will be different if the user has a custom DPI setting.

MUI_WELCOMEFINISHPAGE_INI ini_file
InstallOptions INI file for the Welcome page and the Finish page.
Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini

Open/Close section Uninstaller welcome/finish page

MUI_UNWELCOMEFINISHPAGE_BITMAP bmp_file
Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
Do not stretch the bitmap for the Welcome and Finish page to fit the size of the field. Use this option only if you have an image that does not use the whole space. If you have a full size bitmap that fits exactly, you should not use this option because the size of the field will be different if the user has a custom DPI setting.

MUI_UNWELCOMEFINISHPAGE_INI ini_file
InstallOptions INI file for the uninstaller Welcome page and the Finish page.
Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini

Open/Close section License page

MUI_LICENSEPAGE_BGCOLOR (/windows | /grey | (color: RRGGBB hexadecimal))
The background color for the license textbox. Use /windows for the Windows text background color (usually white). Use the /grey for the window background color (usually grey).
Default: /windows

Open/Close section Components page

MUI_COMPONENTSPAGE_CHECKBITMAP bitmap_file
The bitmap with images for the checks of the component select treeview.
Default: ${NSISDIR}\Contrib\Graphics\Checks\modern.bmp

MUI_COMPONENTSPAGE_SMALLDESC
A small description area on the bottom of the page. Use this layout if you have a lot of sections and don't need large descriptions.

MUI_COMPONENTSPAGE_NODESC
No description area.

Open/Close section Directory page

MUI_DIRECTORYPAGE_BGCOLOR (color: RRGGBB hexadecimal)
The background color for the directory textbox.

Open/Close section Start Menu folder page

MUI_STARTMENUPAGE_BGCOLOR (color: RRGGBB hexadecimal)
The background color for the startmenu directory list and textbox.

Open/Close section Installation page

MUI_INSTFILESPAGE_COLORS (/windows | "(foreground color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)")
The colors of the details screen. Use /windows for the default Windows colors.
Default: /windows

MUI_INSTFILESPAGE_PROGRESSBAR ("" | colored | smooth)
The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.
Default: smooth

Open/Close section Installer finish page

MUI_FINISHPAGE_NOAUTOCLOSE
Do not automatically jump to the finish page, to allow the user to check the install log.

Open/Close section Uninstaller finish page

MUI_UNFINISHPAGE_NOAUTOCLOSE
Do not automatically jump to the finish page, to allow the user to check the uninstall log.

Open/Close section Abort warning

MUI_ABORTWARNING
Show a message box with a warning when the user wants to close the installer.

MUI_ABORTWARNING_TEXT text
Text to display on the abort warning message box.

MUI_ABORTWARNING_CANCEL_DEFAULT
Set the Cancel button as the default button on the message box.

Open/Close section Uninstaller abort warning

MUI_UNABORTWARNING
Show a message box with a warning when the user wants to close the uninstaller.

MUI_UNABORTWARNING_TEXT text
Text to display on the abort warning message box.

MUI_UNABORTWARNING_CANCEL_DEFAULT
Set the Cancel button as the default button on the message box.

3. Pages

Insert the following macros to set the pages you want to use. The pages will appear in the order in which you insert them in the script. You can also insert custom Page commands between the macros to add custom pages.

You can add multiple pages of certain types (for example, if you want the user to specify multiple folders).

Examples:

!insertmacro MUI_PAGE_LICENSE "License.rtf"
!insertmacro MUI_PAGE_COMPONENTS

Var StartMenuFolder
!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder

You will need the page ID for the Start Menu folder page when using the Start Menu folder macros. The folder will be stored in the specified variable.

Installer pages
MUI_PAGE_WELCOME
MUI_PAGE_LICENSE textfile
MUI_PAGE_COMPONENTS
MUI_PAGE_DIRECTORY
MUI_PAGE_STARTMENU pageid variable
MUI_PAGE_INSTFILES
MUI_PAGE_FINISH

Uninstaller pages
MUI_UNPAGE_WELCOME
MUI_UNPAGE_CONFIRM
MUI_UNPAGE_LICENSE textfile
MUI_UNPAGE_COMPONENTS
MUI_UNPAGE_DIRECTORY
MUI_UNPAGE_INSTFILES
MUI_UNPAGE_FINISH

Open/Close section Page settings

Page settings apply to a single page and should be set before inserting a page macro. The same settings can be used for installer and uninstaller pages. You have to repeat the setting if you want it to apply to multiple pages. Example:

;Add a directory page to let the user specify a plug-ins folder
;Store the folder in $PluginsFolder

Var PLUGINS_FOLDER
!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder
!insertmacro MUI_PAGE_DIRECTORY

All standard texts in the user interface are loaded from language files, which are available for all languages supported by NSIS. So you only need to define these texts if you want to change the default.

If the parameter is a text that should be different for each language, define a language string using LangString and use $(LangStringName) as value. For a license text in multiple languages, LicenseLangString can be used. Refer the NSIS Users Manual for more information about installers with multiple languages.

In all text settings, the doublequote character (") should be escaped in the following form: $\"

Open/Close section General page settings

MUI_PAGE_HEADER_TEXT text
Text to display on the header of the page.

MUI_PAGE_HEADER_SUBTEXT text
Subtext to display on the header of the page.

Open/Close section Welcome page settings

To add a newline to any of these texts, use \r\n instead of $\r$\n.

MUI_WELCOMEPAGE_TITLE title
Title to display on the top of the page.

MUI_WELCOMEPAGE_TITLE_3LINES
Extra space for the title area.

MUI_WELCOMEPAGE_TEXT text
Text to display on the page.

Open/Close section License page settings

MUI_LICENSEPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_LICENSEPAGE_TEXT_BOTTOM text
Text to display on the bottom of the page.

MUI_LICENSEPAGE_BUTTON button_text
Text to display on the 'I Agree' button.

MUI_LICENSEPAGE_CHECKBOX
Display a checkbox the user has to check to agree with the license terms.

MUI_LICENSEPAGE_CHECKBOX_TEXT text
Text to display next to the checkbox to agree with the license terms.

MUI_LICENSEPAGE_RADIOBUTTONS
Display two radio buttons to allow the user to choose between accepting the license terms or not.

MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
Text to display next to the checkbox to accept the license terms.

MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
Text to display next to the checkbox to decline the license terms.

Open/Close section Components page settings

MUI_COMPONENTSPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_COMPONENTSPAGE_TEXT_COMPLIST text
Text to display on next to the components list.

MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
Text to display on next to the installation type combo box.

MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
Text to display on the of the top of the description box.

MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
Text to display inside the description box when no section is selected.

Open/Close section Directory page settings

MUI_DIRECTORYPAGE_TEXT_TOP text
Text to display on top of the page.

MUI_DIRECTORYPAGE_TEXT_DESTINATION text
Text to display on the destination folder frame.

MUI_DIRECTORYPAGE_VARIABLE variable
Variable in which to store the selected folder.
Default: $INSTDIR

MUI_DIRECTORYPAGE_VERIFYONLEAVE
Does not disable the Next button when a folder is invalid but allows you to use GetInstDirError in the leave function to handle an invalid folder.

Open/Close section Start Menu folder page settings

MUI_STARTMENUPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_STARTMENUPAGE_TEXT_CHECKBOX text
Text to display next to the checkbox to disable the Start Menu folder creation.

MUI_STARTMENUPAGE_DEFAULTFOLDER folder
The default Start Menu Folder.

MUI_STARTMENUPAGE_NODISABLE
Do not display the checkbox to disable the creation of Start Menu shortcuts.

MUI_STARTMENUPAGE_REGISTRY_ROOT root
MUI_STARTMENUPAGE_REGISTRY_KEY key
MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
The registry key to store the Start Menu folder. The page will use it to remember the users preference. You should also use for the uninstaller to remove the Start Menu folders. Don't forget to remove this key during uninstallation.

For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu folder:

!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
  Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"

Open/Close section Installation page settings

MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
Text to display on the header of the installation page when the installation has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
Subtext to display on the header of the installation page when the installation has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
Text to display on the header of the installation page when the installation has been aborted.

MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
Subext to display on the header of the installation page when the installation has been aborted.

Open/Close section Finish page settings

To add a newline to any of these texts, use \r\n instead of $\r$\n.

MUI_FINISHPAGE_TITLE title
Title to display on the top of the page.

MUI_FINISHPAGE_TITLE_3LINES
Extra space for the title area.

MUI_FINISHPAGE_TEXT text
Text to display on the page.

MUI_FINISHPAGE_TEXT_LARGE
Extra space for the text area (if using checkboxes).

MUI_FINISHPAGE_BUTTON text
Text to display on the Finish button.

MUI_FINISHPAGE_CANCEL_ENABLED
Enable the Cancel button so the user can skip any options displayed on the finish page.

MUI_FINISHPAGE_TEXT_REBOOT text
Text to display on the finish page when asking for a system reboot.

MUI_FINISHPAGE_TEXT_REBOOTNOW text
Text to display next to the 'Reboot now' option button.

MUI_FINISHPAGE_TEXT_REBOOTLATER text
Text to display next to the 'Reboot later' option button.

MUI_FINISHPAGE_REBOOTLATER_DEFAULT
Sets the 'Reboot later' option as the default option.

MUI_FINISHPAGE_RUN exe_file
Application which the user can select to run using a checkbox. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_RUN_TEXT text
Texts to display next to the 'Run program' checkbox.

MUI_FINISHPAGE_RUN_PARAMETERS parameters
Parameters for the application to run. Don't forget to escape double quotes in the value (use $\").

MUI_FINISHPAGE_RUN_NOTCHECKED
Do not check the 'Run program' checkbox by default

MUI_FINISHPAGE_RUN_FUNCTION function
Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without parameters). You can use the function to execute multiple applications or you can change the checkbox name and use it for other things.

MUI_FINISHPAGE_SHOWREADME file/url
File or website which the user can select to view using a checkbox. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_SHOWREADME_TEXT text
Texts to display next to the 'Show Readme' checkbox.

MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
Do not check the 'Show Readme' checkbox by default

MUI_FINISHPAGE_SHOWREADME_FUNCTION function
Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without parameters). You can use the function to show multiple files or you can change the checkbox name and use it for other things.

MUI_FINISHPAGE_LINK link_text
Text for a link on the which the user can click to view a website or file.

MUI_FINISHPAGE_LINK_LOCATION file/url
Website or file which the user can select to view using the link. You don't need to put quotes around the filename when it contains spaces.

MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
Text color for the link on the Finish page.
Default: 000080

MUI_FINISHPAGE_NOREBOOTSUPPORT
Disables support for the page that allows the user to reboot the system. Define this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.

Open/Close section Uninstall confirm page settings

MUI_UNCONFIRMPAGE_TEXT_TOP text
Text to display on the top of the page.

MUI_UNCONFIRMPAGE_TEXT_LOCATION text
Text to display next to the uninstall location text box.

MUI_UNCONFIRMPAGE_VARIABLE variable
Variable in which to store the uninstall source folder.
Default: $INSTDIR

4. Language files

Insert the Modern UI language files for the languages to want to include.

!insertmacro MUI_LANGUAGE "English"

The standard NSIS language files are loaded automatically, there is no need to use LoadLanguageFile.

5. Reserve files

If you are using solid compression, files that are required before the actual installation should be stored first in the data block, because this will make your installer start faster. Include reserve file commands for such files before your sections and functions:

ReserveFile "ioFile.ini" ;Your own InstallOptions INI files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;InstallOptions plug-in
!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog

Script code for pages

Some pages allow you to show additional information or can be used to get user input. Here you can find the script code to use these features.

Components page descriptions

The Modern UI components page has a text box in which a description can be shown when the user hovers the mouse over a component. If you don't want to use these descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.

To set a description for a section, an additional parameter needs to be added to Section command with a unique identifier for the section. This name can later be used to set the description for this section.

Section "Section Name 1" Section1
   ...
SectionEnd

After the sections, use these macros to set the descriptions:

LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END macros.

Start Menu folder

Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN and MUI_STARTMENU_WRITE_END macros:

!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid
  ...create shortcuts...
!insertmacro MUI_STARTMENU_WRITE_END

The page ID should be the ID of the page on which the user has selected the folder for the shortcuts you want to write.

The variable which contains the folder and the page ID are set as parameters of the page macro.

Language selection dialog

If you want the installer to display a language selection dialog (see the the MultiLanguage.nsi example), insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:

Function .onInit

  !insertmacro MUI_LANGDLL_DISPLAY

FunctionEnd

This macro can also be used in the un.onInit function.

Open/Close section Settings for registry storage of selected language

To remember the user's preference, you can define a registry key. These defines should be set before inserting the installation page macro.

MUI_LANGDLL_REGISTRY_ROOT root
MUI_LANGDLL_REGISTRY_KEY key
MUI_LANGDLL_REGISTRY_VALUENAME value_name
The registry key to store the language. The users preference will be remembered. You can also use it for the uninstaller to display the right language. Don't forget to remove this key in the uninstaller.

For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the stored language preference:

Function un.onInit

  !insertmacro MUI_UNGETLANGUAGE

FunctionEnd

Open/Close section Interface settings for selection dialog

To customize the language selection dialog interface, use these defines before inserting the MUI_LANGDLL_DISPLAY macro.

MUI_LANGDLL_WINDOWTITLE text
The window title of the language selection dialog.

MUI_LANGDLL_INFO text
The text to display on the language selection dialog.

MUI_LANGDLL_ALWAYSSHOW
Always show the language selection dialog, even if a language has been stored in the registry. The language stored in the registry will be selected by default.

MUI_LANGDLL_ALLLANGUAGES
Always show all available languages and don't filter according to their codepage.

Custom pages

If you want add your custom pages to your installer, you can insert your own page commands between the page macros. The InstallOptions documentation provides information about creating custom pages using InstallOptions.

!insertmacro MUI_PAGE_WELCOME
Page custom FunctionName ;Custom page
!insertmacro MUI_PAGE_COMPONENTS
 
;Uninstaller
!insertmacro MUI_UNPAGE_CONFIRM
UninstPage custom un.FunctionName ;Custom page
!insertmacro MUI_UNPAGE_INSTFILES

Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:

LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"

Function CustomPageFunction
  !insertmacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "ioFile.ini"
FunctionEnd

Custom functions

Interface functions provided by NSIS, like the .onGUIInit function and the page functions are automatically included by the Modern UI and filled with code to support new interface features. If you want to add additional code to these function, create a function with the custom script code in the script use the Modern UI functions call them.

Example:

!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit

Function myGUIInit
  ...your own code...
FunctionEnd

Open/Close section General Custom Functions

These defines should be set before inserting the language macros.

MUI_CUSTOMFUNCTION_GUIINIT function
MUI_CUSTOMFUNCTION_UNGUIINIT function
MUI_CUSTOMFUNCTION_ABORT function
MUI_CUSTOMFUNCTION_UNABORT function
MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION function
MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION function

Mouse over functions are only available when the description macros (MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not used, regular .onMouseOverSection and un.onMouseOverSection must be used.

Open/Close section Page Custom Functions

These defines should be set before inserting a page macro.

MUI_PAGE_CUSTOMFUNCTION_PRE function
MUI_PAGE_CUSTOMFUNCTION_SHOW function
MUI_PAGE_CUSTOMFUNCTION_LEAVE function

Notes:

  • In the Pre function of the Welcome page and the Finish page, you can write to the InstallOptions INI file of the page (ioSpecial.ini)
  • In the Show function of the Welcome, Finish and StartMenu pages, $MUI_HWND contains the HWND of the inner dialog

Open/Close section Welcome/Finish Page Custom Functions

This define should be inserted before a single Welcome or Finish page.

MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT function

This Init function is called before the InstallOptions INI file for the page is written, so you can use it to initialize any variables used in the page settings.

Example scripts

Basic: Basic.nsi
Welcome/Finish page: WelcomeFinish.nsi
Multiple languages: MultiLanguage.nsi
Header image: HeaderBitmap.nsi
Custom pages: InstallOptions.nsi
Start Menu Folder page: StartMenu.nsi

Credits

Written by Joost Verburg.
Icons designed by Nikos Adamamas, aka adni18.
Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.

License

The zlib/libpng license applies to the Modern UI.

Open/Close section License Terms

Copyright © 2002-2025 Joost Verburg

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; 
   you must not claim that you wrote the original software.
   If you use this software in a product, an acknowledgment in the
   product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
   and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
nsis-3.11/Contrib/Modern UI/SConscript000077500000000000000000000007761477201124000175610ustar00rootroot00000000000000target = 'Modern UI' docs = Split(""" Changelog.txt License.txt Readme.html """) doc_images = Split(""" closed.gif header.gif open.gif screen1.png screen2.png """) contribs = Split(""" ioSpecial.ini System.nsh """) Import('defenv') def join(prefix, list_): return list(map(lambda x: '%s/%s' % (prefix, x), list_)) defenv.DistributeDocs(docs, path=target) path = 'images' defenv.DistributeDocs(join(path,doc_images), path='%s/%s'%(target,path)) defenv.DistributeContrib(contribs, path=target) nsis-3.11/Contrib/Modern UI/System.nsh000077500000000000000000002070251477201124000175410ustar00rootroot00000000000000/* NSIS Modern User Interface - Version 1.81 Copyright 2002-2025 Joost Verburg */ !ifndef MUI_INCLUDED !verbose push 3 !define MUI_INCLUDED !define MUI_SYSVERSION "1.81" !verbose pop !echo "NSIS Modern User Interface version ${MUI_SYSVERSION} - Copyright 2002-2025 Joost Verburg" ;-------------------------------- !verbose push 3 !define /IfNDef MUI_VERBOSE 3 !verbose ${MUI_VERBOSE} ;-------------------------------- ;HEADER FILES, DECLARATIONS !include InstallOptions.nsh !include LangFile.nsh !include WinMessages.nsh Var MUI_TEMP1 Var MUI_TEMP2 ;-------------------------------- ;INSERT CODE !macro MUI_INSERT !ifndef MUI_INSERT !define MUI_INSERT !ifdef MUI_PRODUCT | MUI_VERSION !warning "The MUI_PRODUCT and MUI_VERSION defines have been removed. Use a normal Name command now." !endif !insertmacro MUI_INTERFACE !insertmacro MUI_FUNCTION_GUIINIT !insertmacro MUI_FUNCTION_ABORTWARNING !ifdef MUI_IOCONVERT_USED !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT !endif !ifdef MUI_UNINSTALLER !insertmacro MUI_UNFUNCTION_GUIINIT !insertmacro MUI_FUNCTION_UNABORTWARNING !ifdef MUI_UNIOCONVERT_USED !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT !endif !endif !endif !macroend ;-------------------------------- ;GENERAL !macro MUI_DEFAULT SYMBOL CONTENT !ifndef "${SYMBOL}" !define "${SYMBOL}" "${CONTENT}" !endif !macroend !macro MUI_DEFAULT_IOCONVERT SYMBOL CONTENT !ifndef "${SYMBOL}" !define "${SYMBOL}" "${CONTENT}" !insertmacro MUI_SET "${SYMBOL}_DEFAULTSET" !insertmacro MUI_SET "MUI_${MUI_PAGE_UNINSTALLER_PREFIX}IOCONVERT_USED" !else !insertmacro MUI_UNSET "${SYMBOL}_DEFAULTSET" !endif !macroend !macro MUI_SET SYMBOL !ifndef "${SYMBOL}" !define "${SYMBOL}" !endif !macroend !macro MUI_UNSET SYMBOL !ifdef "${SYMBOL}" !undef "${SYMBOL}" !endif !macroend ;-------------------------------- ;INTERFACE - COMPILE TIME SETTINGS !macro MUI_INTERFACE !ifndef MUI_INTERFACE !define MUI_INTERFACE !ifdef MUI_INSERT_NSISCONF !insertmacro MUI_NSISCONF !endif !insertmacro MUI_DEFAULT MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe" !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe" !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT "${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe" !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC "${NSISDIR}\Contrib\UIs\modern_smalldesc.exe" !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC "${NSISDIR}\Contrib\UIs\modern_nodesc.exe" !insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR "/windows" !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS "/windows" !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR "smooth" !insertmacro MUI_DEFAULT MUI_BGCOLOR "FFFFFF" !insertmacro MUI_DEFAULT MUI_TEXTCOLOR "000000" !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_INI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini" !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_INI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini" !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" !if "${MUI_WELCOMEFINISHPAGE_BITMAP}" == "" !error "Invalid MUI_WELCOMEFINISHPAGE_BITMAP" !endif !if "${MUI_UNWELCOMEFINISHPAGE_BITMAP}" == "" !error "Invalid MUI_UNWELCOMEFINISHPAGE_BITMAP" !endif !ifdef MUI_HEADERIMAGE !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" !ifndef MUI_HEADERIMAGE_UNBITMAP !define MUI_HEADERIMAGE_UNBITMAP "${MUI_HEADERIMAGE_BITMAP}" !ifdef MUI_HEADERIMAGE_BITMAP_NOSTRETCH !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH !endif !endif !if "${MUI_HEADERIMAGE_BITMAP}" == "" !error "Invalid MUI_HEADERIMAGE_BITMAP" !endif !if "${MUI_HEADERIMAGE_UNBITMAP}" == "" !error "Invalid MUI_HEADERIMAGE_UNBITMAP" !endif !ifdef MUI_HEADERIMAGE_BITMAP_RTL !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL !define MUI_HEADERIMAGE_UNBITMAP_RTL "${MUI_HEADERIMAGE_BITMAP_RTL}" !ifdef MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH !endif !endif !if "${MUI_HEADERIMAGE_BITMAP_RTL}" == "" !error "Invalid MUI_HEADERIMAGE_BITMAP_RTL" !endif !if "${MUI_HEADERIMAGE_UNBITMAP_RTL}" == "" !error "Invalid MUI_HEADERIMAGE_UNBITMAP_RTL" !endif !endif !endif XPStyle On ChangeUI all "${MUI_UI}" !ifdef MUI_HEADERIMAGE !ifndef MUI_HEADERIMAGE_RIGHT ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE}" !else ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE_RIGHT}" !endif !endif !ifdef MUI_COMPONENTSPAGE_SMALLDESC ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_SMALLDESC}" !else ifdef MUI_COMPONENTSPAGE_NODESC ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_NODESC}" !endif Icon "${MUI_ICON}" UninstallIcon "${MUI_UNICON}" CheckBitmap "${MUI_COMPONENTSPAGE_CHECKBITMAP}" LicenseBkColor "${MUI_LICENSEPAGE_BGCOLOR}" InstallColors ${MUI_INSTFILESPAGE_COLORS} InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR} SubCaption 4 " " UninstallSubCaption 2 " " !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT "$(MUI_TEXT_ABORTWARNING)" !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT "$(MUI_UNTEXT_ABORTWARNING)" !endif !macroend ;-------------------------------- ;INTERFACE - RUN-TIME !macro MUI_INNERDIALOG_TEXT CONTROL TEXT !verbose push !verbose ${MUI_VERBOSE} FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT GetDlgItem $MUI_TEMP1 $MUI_TEMP1 ${CONTROL} SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}" !verbose pop !macroend !macro MUI_HEADER_TEXT_INTERNAL ID TEXT GetDlgItem $MUI_TEMP1 $HWNDPARENT "${ID}" !ifdef MUI_HEADER_TRANSPARENT_TEXT ShowWindow $MUI_TEMP1 ${SW_HIDE} !endif SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}" !ifdef MUI_HEADER_TRANSPARENT_TEXT ShowWindow $MUI_TEMP1 ${SW_SHOWNA} !endif !macroend !macro MUI_HEADER_TEXT TEXT SUBTEXT !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_HEADER_TRANSPARENT_TEXT LockWindow on !endif !insertmacro MUI_HEADER_TEXT_INTERNAL 1037 "${TEXT}" !insertmacro MUI_HEADER_TEXT_INTERNAL 1038 "${SUBTEXT}" !ifdef MUI_HEADER_TRANSPARENT_TEXT LockWindow off !endif !verbose pop !macroend !macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" !else ifdef MUI_PAGE_HEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}" !else ifdef MUI_PAGE_HEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}" !endif !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT !macroend !macro MUI_DESCRIPTION_BEGIN FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043 StrCmp $0 -1 0 mui.description_begin_done SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:" EnableWindow $MUI_TEMP1 0 SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT" Goto mui.description_done mui.description_begin_done: !macroend !macro MUI_DESCRIPTION_TEXT VAR TEXT !verbose push !verbose ${MUI_VERBOSE} StrCmp $0 ${VAR} 0 mui.description_${VAR}_done SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:" EnableWindow $MUI_TEMP1 1 SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}" Goto mui.description_done mui.description_${VAR}_done: !verbose pop !macroend !macro MUI_DESCRIPTION_END !verbose push !verbose ${MUI_VERBOSE} mui.description_done: !verbose pop !macroend !macro MUI_ENDHEADER IfAbort mui.endheader_abort !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" !endif Goto mui.endheader_done mui.endheader_abort: !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" !endif mui.endheader_done: !macroend !macro MUI_ABORTWARNING !ifdef MUI_FINISHPAGE_ABORTWARNINGCHECK StrCmp $MUI_NOABORTWARNING "1" mui.quit !endif !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_ABORTWARNING_TEXT}" IDYES mui.quit !else MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_ABORTWARNING_TEXT}" IDYES mui.quit !endif Abort mui.quit: !macroend !macro MUI_UNABORTWARNING !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_UNABORTWARNING_TEXT}" IDYES mui.quit !else MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_UNABORTWARNING_TEXT}" IDYES mui.quit !endif Abort mui.quit: !macroend !macro MUI_GUIINIT !insertmacro MUI_WELCOMEFINISHPAGE_INIT "" !insertmacro MUI_HEADERIMAGE_INIT "" !insertmacro MUI_GUIINIT_BASIC !macroend !macro MUI_UNGUIINIT !insertmacro MUI_WELCOMEFINISHPAGE_INIT "UN" !insertmacro MUI_HEADERIMAGE_INIT "UN" !insertmacro MUI_GUIINIT_BASIC !ifdef MUI_UNFINISHPAGE !ifndef MUI_UNFINISHPAGE_NOAUTOCLOSE SetAutoClose true !endif !endif !macroend !macro MUI_GUIINIT_BASIC GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 CreateFont $MUI_TEMP2 "$(^Font)" "$(^FontSize)" "700" SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0 !ifndef MUI_HEADER_TRANSPARENT_TEXT SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !else SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "transparent" GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "transparent" !endif GetDlgItem $MUI_TEMP1 $HWNDPARENT 1034 ; Header background SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}" GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 ; Header image SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}" GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 SetCtlColors $MUI_TEMP1 /BRANDING GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 SetCtlColors $MUI_TEMP1 /BRANDING SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$(^Branding) " !macroend !macro MUI_WELCOMEFINISHPAGE_INIT UNINSTALLER !ifdef MUI_${UNINSTALLER}WELCOMEPAGE | MUI_${UNINSTALLER}FINISHPAGE !insertmacro INSTALLOPTIONS_EXTRACT_AS "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_INI}" "ioSpecial.ini" File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP}" !pragma verifyloadimage "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP}" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Text" "$PLUGINSDIR\modern-wizard.bmp" !ifdef MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Flags" "" !endif !endif !macroend !macro MUI_HEADERIMAGE_INIT UNINSTALLER !ifdef MUI_HEADERIMAGE InitPluginsDir !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL StrCmp $(^RTL) 0 mui.headerimageinit_nortl File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}" !pragma verifyloadimage "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}" !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL_NOSTRETCH SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp" !else SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp" !endif Goto mui.headerimageinit_done mui.headerimageinit_nortl: !endif File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}" !pragma verifyloadimage "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}" !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_NOSTRETCH SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp" !else SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp" !endif !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL mui.headerimageinit_done: !endif !endif !macroend ;-------------------------------- ;INTERFACE - FUNCTIONS !macro MUI_FUNCTION_GUIINIT Function .onGUIInit !insertmacro MUI_GUIINIT !ifdef MUI_CUSTOMFUNCTION_GUIINIT Call "${MUI_CUSTOMFUNCTION_GUIINIT}" !endif FunctionEnd !macroend !macro MUI_FUNCTION_DESCRIPTION_BEGIN !verbose push !verbose ${MUI_VERBOSE} !ifndef MUI_VAR_TEXT Var MUI_TEXT !define MUI_VAR_TEXT !endif Function .onMouseOverSection !insertmacro MUI_DESCRIPTION_BEGIN !verbose pop !macroend !macro MUI_FUNCTION_DESCRIPTION_END !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_DESCRIPTION_END !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION Call "${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}" !endif FunctionEnd !verbose pop !macroend !macro MUI_UNFUNCTION_DESCRIPTION_BEGIN !verbose push !verbose ${MUI_VERBOSE} Function un.onMouseOverSection !insertmacro MUI_DESCRIPTION_BEGIN !verbose pop !macroend !macro MUI_UNFUNCTION_DESCRIPTION_END !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_DESCRIPTION_END !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION Call "${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}" !endif FunctionEnd !verbose pop !macroend !macro MUI_FUNCTION_ABORTWARNING Function .onUserAbort !ifdef MUI_ABORTWARNING !insertmacro MUI_ABORTWARNING !endif !ifdef MUI_CUSTOMFUNCTION_ABORT Call "${MUI_CUSTOMFUNCTION_ABORT}" !endif FunctionEnd !macroend !macro MUI_FUNCTION_UNABORTWARNING Function un.onUserAbort !ifdef MUI_UNABORTWARNING !insertmacro MUI_UNABORTWARNING !endif !ifdef MUI_CUSTOMFUNCTION_UNABORT Call "${MUI_CUSTOMFUNCTION_UNABORT}" !endif FunctionEnd !macroend !macro MUI_UNFUNCTION_GUIINIT Function un.onGUIInit !insertmacro MUI_UNGUIINIT !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT Call "${MUI_CUSTOMFUNCTION_UNGUIINIT}" !endif FunctionEnd !macroend !macro MUI_FUNCTIONS_DESCRIPTION_BEGIN ;1.65 compatibility !warning "Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_BEGIN to MUI_FUNCTION_DESCRIPTION_BEGIN." !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !macroend !macro MUI_FUNCTIONS_DESCRIPTION_END ;1.65 compatibility !warning "Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_END to MUI_FUNCTION_DESCRIPTION_END." !insertmacro MUI_FUNCTION_DESCRIPTION_END !macroend ;-------------------------------- ;START MENU FOLDER !macro MUI_STARTMENU_GETFOLDER ID VAR !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME ReadRegStr $MUI_TEMP1 "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}" StrCmp $MUI_TEMP1 "" +3 StrCpy "${VAR}" $MUI_TEMP1 Goto +2 StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" !else StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" !endif !verbose pop !macroend !macro MUI_STARTMENU_WRITE_BEGIN ID !verbose push !verbose ${MUI_VERBOSE} !define MUI_STARTMENUPAGE_CURRENT_ID "${ID}" StrCpy $MUI_TEMP1 "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" 1 StrCmp $MUI_TEMP1 ">" mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done StrCmp "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" "" 0 mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty !insertmacro MUI_STARTMENU_GETFOLDER "${MUI_STARTMENUPAGE_CURRENT_ID}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty: !verbose pop !macroend !macro MUI_STARTMENU_WRITE_END !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" !endif mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done: !undef MUI_STARTMENUPAGE_CURRENT_ID !verbose pop !macroend ;-------------------------------- ;PAGES !macro MUI_PAGE_INIT !ifdef MUI_INSERT !warning "MUI_[UN]PAGE_* inserted after MUI_LANGUAGE" !endif !insertmacro MUI_INTERFACE !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_PREFIX "" !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_FUNCPREFIX "" !insertmacro MUI_UNSET MUI_UNIQUEID !define MUI_UNIQUEID ${__LINE__} !macroend !macro MUI_UNPAGE_INIT !ifndef MUI_UNINSTALLER !define MUI_UNINSTALLER !endif !define MUI_PAGE_UNINSTALLER !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX !define MUI_PAGE_UNINSTALLER_PREFIX "UN" !define MUI_PAGE_UNINSTALLER_FUNCPREFIX "un." !macroend !macro MUI_UNPAGE_END !undef MUI_PAGE_UNINSTALLER !undef MUI_PAGE_UNINSTALLER_PREFIX !undef MUI_PAGE_UNINSTALLER_FUNCPREFIX !macroend !macro MUI_PAGE_WELCOME !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)" !ifndef MUI_VAR_HWND Var MUI_HWND !define MUI_VAR_HWND !endif PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} PageExEnd !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT !verbose pop !macroend !macro MUI_PAGE_LICENSE LICENSEDATA !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP "$(MUI_INNERTEXT_LICENSE_TOP)" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON "" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT "" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT "" !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE "" PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} Caption " " LicenseData "${LICENSEDATA}" !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)" "${MUI_LICENSEPAGE_BUTTON}" !else ifdef MUI_LICENSEPAGE_CHECKBOX LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)" "${MUI_LICENSEPAGE_BUTTON}" !else LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)" "${MUI_LICENSEPAGE_BUTTON}" !endif !else LicenseText "${MUI_LICENSEPAGE_TEXT_BOTTOM}" "${MUI_LICENSEPAGE_BUTTON}" !endif !ifdef MUI_LICENSEPAGE_CHECKBOX LicenseForceSelection checkbox "${MUI_LICENSEPAGE_CHECKBOX_TEXT}" !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS LicenseForceSelection radiobuttons "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}" "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}" !endif PageExEnd !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE !verbose pop !macroend !macro MUI_PAGE_COMPONENTS !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST "" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE "" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)" !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" !ifndef MUI_VAR_TEXT Var MUI_TEXT !define MUI_VAR_TEXT !endif PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} Caption " " ComponentText "${MUI_COMPONENTSPAGE_TEXT_TOP}" "${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}" "${MUI_COMPONENTSPAGE_TEXT_COMPLIST}" PageExEnd !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} !undef MUI_COMPONENTSPAGE_TEXT_TOP !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO !verbose pop !macroend !macro MUI_PAGE_DIRECTORY !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION "" PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} Caption " " DirText "${MUI_DIRECTORYPAGE_TEXT_TOP}" "${MUI_DIRECTORYPAGE_TEXT_DESTINATION}" !ifdef MUI_DIRECTORYPAGE_VARIABLE DirVar "${MUI_DIRECTORYPAGE_VARIABLE}" !endif !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE DirVerify leave !endif PageExEnd !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} !undef MUI_DIRECTORYPAGE_TEXT_TOP !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_BGCOLOR !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE !verbose pop !macroend !macro MUI_PAGE_STARTMENU ID VAR !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER "$(^Name)" !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)" !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)" !define MUI_STARTMENUPAGE_VARIABLE "${VAR}" !define "MUI_STARTMENUPAGE_${ID}_VARIABLE" "${MUI_STARTMENUPAGE_VARIABLE}" !define "MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT" "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" !endif !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" !endif !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" !endif !ifndef MUI_VAR_HWND Var MUI_HWND !define MUI_VAR_HWND !endif PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} Caption " " PageExEnd !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} !undef MUI_STARTMENUPAGE_VARIABLE !undef MUI_STARTMENUPAGE_TEXT_TOP !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX !undef MUI_STARTMENUPAGE_DEFAULTFOLDER !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME !insertmacro MUI_UNSET MUI_STARTMENUPAGE_BGCOLOR !verbose pop !macroend !macro MUI_PAGE_INSTFILES !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} Caption " " PageExEnd !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT !verbose pop !macroend !macro MUI_PAGE_FINISH !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_BUTTON "$(MUI_BUTTONTEXT_FINISH)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTNOW "$(MUI_TEXT_FINISH_REBOOTNOW)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTLATER "$(MUI_TEXT_FINISH_REBOOTLATER)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_RUN_TEXT "$(MUI_TEXT_FINISH_RUN)" !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_SHOWREADME_TEXT "$(MUI_TEXT_FINISH_SHOWREADME)" !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR "000080" !ifndef MUI_VAR_HWND Var MUI_HWND !define MUI_VAR_HWND !endif !ifndef MUI_PAGE_UNINSTALLER !ifndef MUI_FINISHPAGE_NOAUTOCLOSE AutoCloseWindow true !endif !endif !ifdef MUI_FINISHPAGE_CANCEL_ENABLED !ifndef MUI_VAR_NOABORTWARNING !define MUI_VAR_NOABORTWARNING Var MUI_NOABORTWARNING !endif !endif PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID} Caption " " PageExEnd !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM !verbose pop !macroend !macro MUI_UNPAGE_WELCOME !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_UNPAGE_END !verbose pop !macroend !macro MUI_UNPAGE_CONFIRM !verbose push !verbose ${MUI_VERBOSE} !ifndef MUI_UNINSTALLER !define MUI_UNINSTALLER !endif !insertmacro MUI_PAGE_INIT !insertmacro MUI_SET MUI_UNCONFIRMPAGE !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION "" PageEx un.uninstConfirm PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} Caption " " UninstallText "${MUI_UNCONFIRMPAGE_TEXT_TOP}" "${MUI_UNCONFIRMPAGE_TEXT_LOCATION}" !ifdef MUI_UNCONFIRMPAGE_VARIABLE DirVar "${MUI_UNCONFIRMPAGE_VARIABLE}" !endif PageExEnd !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION !verbose pop !macroend !macro MUI_UNPAGE_LICENSE LICENSEDATA !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGE_LICENSE "${LICENSEDATA}" !insertmacro MUI_UNPAGE_END !verbose pop !macroend !macro MUI_UNPAGE_COMPONENTS !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_UNPAGE_END !verbose pop !macroend !macro MUI_UNPAGE_DIRECTORY !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_UNPAGE_END !verbose pop !macroend !macro MUI_UNPAGE_INSTFILES !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_END !verbose pop !macroend !macro MUI_UNPAGE_FINISH !verbose push !verbose ${MUI_VERBOSE} !insertmacro MUI_UNPAGE_INIT !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_END !verbose pop !macroend ;-------------------------------- ;PAGE FUNCTIONS !macro MUI_PAGE_FUNCTION_CUSTOM TYPE !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE} Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}" !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE} !endif !macroend !macro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM !ifdef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT Call "${MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT}" !undef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT !endif !macroend !macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE Function "${PRE}" !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "NumFields" "3" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "NextButtonText" "" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "CancelEnabled" "" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 2" "Text" MUI_WELCOMEPAGE_TITLE !ifndef MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "38" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "45" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "48" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "55" !endif !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "185" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_WELCOMEPAGE_TEXT !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE LockWindow on GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 ShowWindow $MUI_TEMP1 ${SW_NORMAL} LockWindow off !insertmacro INSTALLOPTIONS_INITDIALOG "ioSpecial.ini" Pop $MUI_HWND SetCtlColors $MUI_HWND "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" GetDlgItem $MUI_TEMP1 $MUI_HWND 1201 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" CreateFont $MUI_TEMP2 "$(^Font)" "12" "700" SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0 GetDlgItem $MUI_TEMP1 $MUI_HWND 1202 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW !insertmacro INSTALLOPTIONS_SHOW LockWindow on GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 ShowWindow $MUI_TEMP1 ${SW_HIDE} LockWindow off FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend !macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE) FunctionEnd Function "${SHOW}" !insertmacro MUI_INNERDIALOG_TEXT 1040 "${MUI_LICENSEPAGE_TEXT_TOP}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend !macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE) FunctionEnd Function "${SHOW}" !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}" FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043 EnableWindow $MUI_TEMP1 0 !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend !macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE) FunctionEnd Function "${SHOW}" !ifdef MUI_DIRECTORYPAGE_BGCOLOR !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXTCOLOR "" FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1019 SetCtlColors $MUI_TEMP1 "${MUI_DIRECTORYPAGE_TEXTCOLOR}" "${MUI_DIRECTORYPAGE_BGCOLOR}" !endif !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend !macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME StrCmp "${MUI_STARTMENUPAGE_VARIABLE}" "" 0 +4 ReadRegStr $MUI_TEMP1 "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" StrCmp $MUI_TEMP1 "" +2 StrCpy "${MUI_STARTMENUPAGE_VARIABLE}" $MUI_TEMP1 !endif !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE) StrCmp $(^RTL) 0 mui.startmenu_nortl !ifndef MUI_STARTMENUPAGE_NODISABLE StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !else StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !endif Goto mui.startmenu_initdone mui.startmenu_nortl: !ifndef MUI_STARTMENUPAGE_NODISABLE StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !else StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" !endif mui.startmenu_initdone: Pop $MUI_HWND !ifdef MUI_STARTMENUPAGE_BGCOLOR !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXTCOLOR "" GetDlgItem $MUI_TEMP1 $MUI_HWND 1002 SetCtlColors $MUI_TEMP1 "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" GetDlgItem $MUI_TEMP1 $MUI_HWND 1004 SetCtlColors $MUI_TEMP1 "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" !endif !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW StartMenu::Show !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED Pop $MUI_TEMP1 StrCmp $MUI_TEMP1 "success" 0 +2 Pop "${MUI_STARTMENUPAGE_VARIABLE}" FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend !macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE) FunctionEnd Function "${SHOW}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE !insertmacro MUI_ENDHEADER !insertmacro MUI_LANGDLL_SAVELANGUAGE FunctionEnd !macroend !macro MUI_FUNCTION_FINISHPAGE PRE LEAVE Function "${PRE}" !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Settings" "NextButtonText" MUI_FINISHPAGE_BUTTON !ifdef MUI_FINISHPAGE_CANCEL_ENABLED !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "CancelEnabled" "1" !endif !ifndef MUI_FINISHPAGE_TITLE_3LINES !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "38" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "45" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "48" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "55" !endif !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 2" "Text" MUI_FINISHPAGE_TITLE !ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME !ifndef MUI_FINISHPAGE_TITLE_3LINES !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "85" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "115" !endif !else !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "95" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "125" !endif !endif !else !ifndef MUI_FINISHPAGE_LINK !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "185" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "175" !endif !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT IfRebootFlag 0 mui.finish_noreboot_init !ifndef MUI_FINISHPAGE_TITLE_3LINES !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "85" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "115" !endif !else !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "95" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "125" !endif !endif !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_FINISHPAGE_TEXT_REBOOT !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" "RadioButton" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 4" "Text" MUI_FINISHPAGE_TEXT_REBOOTNOW !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" "321" !ifndef MUI_FINISHPAGE_TITLE_3LINES !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "90" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "100" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "130" !endif !else !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "100" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "110" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "130" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "140" !endif !endif !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Type" "RadioButton" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 5" "Text" MUI_FINISHPAGE_TEXT_REBOOTLATER !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Left" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Right" "321" !ifndef MUI_FINISHPAGE_TITLE_3LINES !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Top" "110" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Bottom" "120" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Top" "110" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Bottom" "120" !endif !ifdef MUI_FINISHPAGE_REBOOTLATER_DEFAULT !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "0" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "State" "1" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "1" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "State" "0" !endif Goto mui.finish_load mui.finish_noreboot_init: !endif !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_FINISHPAGE_TEXT !ifdef MUI_FINISHPAGE_RUN !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" "CheckBox" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 4" "Text" MUI_FINISHPAGE_RUN_TEXT !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" "315" !ifndef MUI_FINISHPAGE_TITLE_3LINES !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "90" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "100" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "130" !endif !else !ifndef MUI_FINISHPAGE_TEXT_LARGE !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "100" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "110" !else !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "130" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "140" !endif !endif !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "1" !endif !endif !ifdef MUI_FINISHPAGE_SHOWREADME !ifdef MUI_FINISHPAGE_CURFIELD_NO !undef MUI_FINISHPAGE_CURFIELD_NO !endif !ifndef MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_CURFIELD_NO 4 !ifndef MUI_FINISHPAGE_TITLE_3LINES !ifndef MUI_FINISHPAGE_TEXT_LARGE !define MUI_FINISHPAGE_CURFIELD_TOP 90 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 100 !else !define MUI_FINISHPAGE_CURFIELD_TOP 120 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130 !endif !else !ifndef MUI_FINISHPAGE_TEXT_LARGE !define MUI_FINISHPAGE_CURFIELD_TOP 100 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 110 !else !define MUI_FINISHPAGE_CURFIELD_TOP 130 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 140 !endif !endif !else !define MUI_FINISHPAGE_CURFIELD_NO 5 !ifndef MUI_FINISHPAGE_TITLE_3LINES !ifndef MUI_FINISHPAGE_TEXT_LARGE !define MUI_FINISHPAGE_CURFIELD_TOP 110 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 120 !else !define MUI_FINISHPAGE_CURFIELD_TOP 140 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 150 !endif !else !ifndef MUI_FINISHPAGE_TEXT_LARGE !define MUI_FINISHPAGE_CURFIELD_TOP 120 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130 !else !define MUI_FINISHPAGE_CURFIELD_TOP 150 !define MUI_FINISHPAGE_CURFIELD_BOTTOM 160 !endif !endif !endif !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Type" "CheckBox" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Text" MUI_FINISHPAGE_SHOWREADME_TEXT !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Left" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Right" "315" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Top" ${MUI_FINISHPAGE_CURFIELD_TOP} !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Bottom" ${MUI_FINISHPAGE_CURFIELD_BOTTOM} !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "State" "1" !endif !endif !ifdef MUI_FINISHPAGE_LINK !ifdef MUI_FINISHPAGE_CURFIELD_NO !undef MUI_FINISHPAGE_CURFIELD_NO !endif !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME !define MUI_FINISHPAGE_CURFIELD_NO 6 !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME !define MUI_FINISHPAGE_CURFIELD_NO 5 !else !define MUI_FINISHPAGE_CURFIELD_NO 4 !endif !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Type" "Link" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Text" MUI_FINISHPAGE_LINK !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Left" "120" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Right" "315" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Top" "175" !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Bottom" "185" !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "State" MUI_FINISHPAGE_LINK_LOCATION !endif !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "6" !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_LINK !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" !else ifdef MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME | MUI_FINISHPAGE_LINK !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "4" !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT mui.finish_load: !endif !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE LockWindow on GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 ShowWindow $MUI_TEMP1 ${SW_HIDE} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 ShowWindow $MUI_TEMP1 ${SW_NORMAL} LockWindow off !insertmacro INSTALLOPTIONS_INITDIALOG "ioSpecial.ini" Pop $MUI_HWND SetCtlColors $MUI_HWND "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" GetDlgItem $MUI_TEMP1 $MUI_HWND 1201 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" CreateFont $MUI_TEMP2 "$(^Font)" "12" "700" SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0 GetDlgItem $MUI_TEMP1 $MUI_HWND 1202 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT IfRebootFlag 0 mui.finish_noreboot_show GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" Goto mui.finish_show mui.finish_noreboot_show: !endif !ifdef MUI_FINISHPAGE_RUN GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !endif !ifdef MUI_FINISHPAGE_SHOWREADME !ifndef MUI_FINISHPAGE_RUN GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 !else GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 !endif SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" !endif !ifdef MUI_FINISHPAGE_LINK !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME GetDlgItem $MUI_TEMP1 $MUI_HWND 1205 !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 !else GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 !endif SetCtlColors $MUI_TEMP1 "${MUI_FINISHPAGE_LINK_COLOR}" "${MUI_BGCOLOR}" !endif !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT mui.finish_show: !endif !ifndef MUI_FORCECLASSICCONTROLS ${If} ${IsHighContrastModeActive} !endif ; SetCtlColors does not change the check/radio text color (bug #443) !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' !endif !endif !ifndef MUI_FORCECLASSICCONTROLS ${EndIf} !endif !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW !ifdef MUI_FINISHPAGE_CANCEL_ENABLED StrCpy $MUI_NOABORTWARNING "1" !endif !insertmacro INSTALLOPTIONS_SHOW !ifdef MUI_FINISHPAGE_CANCEL_ENABLED StrCpy $MUI_NOABORTWARNING "" !endif LockWindow on GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 ShowWindow $MUI_TEMP1 ${SW_NORMAL} GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 ShowWindow $MUI_TEMP1 ${SW_HIDE} LockWindow off FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT IfRebootFlag "" mui.finish_noreboot_end !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State" StrCmp $MUI_TEMP1 "1" 0 +2 Reboot Return mui.finish_noreboot_end: !endif !ifdef MUI_FINISHPAGE_RUN !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State" StrCmp $MUI_TEMP1 "1" 0 mui.finish_norun !ifndef MUI_FINISHPAGE_RUN_FUNCTION !ifndef MUI_FINISHPAGE_RUN_PARAMETERS StrCpy $MUI_TEMP1 "$\"${MUI_FINISHPAGE_RUN}$\"" !else StrCpy $MUI_TEMP1 "$\"${MUI_FINISHPAGE_RUN}$\" ${MUI_FINISHPAGE_RUN_PARAMETERS}" !endif Exec "$MUI_TEMP1" !else Call "${MUI_FINISHPAGE_RUN_FUNCTION}" !endif mui.finish_norun: !endif !ifdef MUI_FINISHPAGE_SHOWREADME !ifndef MUI_FINISHPAGE_RUN !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State" !else !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 5" "State" !endif StrCmp $MUI_TEMP1 "1" 0 mui.finish_noshowreadme !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION ExecShell "open" "${MUI_FINISHPAGE_SHOWREADME}" !else Call "${MUI_FINISHPAGE_SHOWREADME_FUNCTION}" !endif mui.finish_noshowreadme: !endif FunctionEnd !macroend !macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE Function "${PRE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE) FunctionEnd Function "${SHOW}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW FunctionEnd Function "${LEAVE}" !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend ;-------------------------------- ;INSTALL OPTIONS (CUSTOM PAGES) !macro MUI_INSTALLOPTIONS_EXTRACT FILE !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_EXTRACT "${FILE}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_EXTRACT_AS "${FILE}" "${FILENAME}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_DISPLAY FILE !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_DISPLAY "${FILE}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_DISPLAY_RETURN "${FILE}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_INITDIALOG FILE !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_INITDIALOG "${FILE}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_SHOW !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_SHOW !verbose pop !macroend !macro MUI_INSTALLOPTIONS_SHOW_RETURN !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_SHOW_RETURN !verbose pop !macroend !macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_READ "${VAR}" "${FILE}" "${SECTION}" "${KEY}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE !verbose push !verbose ${MUI_VERBOSE} !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" "${VALUE}" !verbose pop !macroend !macro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT FILE SECTION KEY SYMBOL ;Converts default strings from language files to InstallOptions format ;Only for use inside MUI !verbose push !verbose ${MUI_VERBOSE} !ifndef "${SYMBOL}_DEFAULTSET" !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" "${${SYMBOL}}" !else Push "${${SYMBOL}}" Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}Nsis2Io Pop $MUI_TEMP1 !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" $MUI_TEMP1 !endif !verbose pop !macroend ;-------------------------------- ;RESERVE FILES !macro MUI_RESERVEFILE_INSTALLOPTIONS !verbose push !verbose ${MUI_VERBOSE} ReserveFile /plugin InstallOptions.dll !verbose pop !macroend !macro MUI_RESERVEFILE_LANGDLL !verbose push !verbose ${MUI_VERBOSE} ReserveFile /plugin LangDLL.dll !verbose pop !macroend ;-------------------------------- ;LANGUAGES !macro MUI_LANGUAGE NLFID ;Include a language !verbose push !verbose ${MUI_VERBOSE} ; MUI_PAGE_UNINSTALLER_PREFIX is undefined by uninstaller pages so we check MUI_UNINSTALLER as well !ifndef MUI_PAGE_UNINSTALLER_PREFIX && MUI_UNINSTALLER !ifndef MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING ; Define this to avoid the warning if you only have custom pages !warning "MUI_LANGUAGE should be inserted after the MUI_[UN]PAGE_* macros" !endif !endif !insertmacro MUI_INSERT LoadLanguageFile "${NSISDIR}\Contrib\Language files\${NLFID}.nlf" ;Include language file !insertmacro LANGFILE_INCLUDE_WITHDEFAULT \ "${NSISDIR}\Contrib\Language files\${NLFID}.nsh" "${NSISDIR}\Contrib\Language files\English.nsh" ;Add language to list of languages for selection dialog !define /ifndef MUI_LANGDLL_LANGUAGES "" !define /redef MUI_LANGDLL_LANGUAGES \ `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" ${MUI_LANGDLL_LANGUAGES}` !define /ifndef MUI_LANGDLL_LANGUAGES_CP "" !define /redef MUI_LANGDLL_LANGUAGES_CP \ `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" "${LANG_${NLFID}_CP}" ${MUI_LANGDLL_LANGUAGES_CP}` !verbose pop !macroend ;-------------------------------- ;LANGUAGE SELECTION DIALOG !macro MUI_LANGDLL_DISPLAY !verbose push !verbose ${MUI_VERBOSE} !ifndef MUI_LANGDLL_LANGUAGES !warning "MUI_LANGDLL_DISPLAY should only be used after inserting the MUI_LANGUAGE macro(s)" !endif !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE "Installer Language" !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO "Please select a language." !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME ReadRegStr $MUI_TEMP1 "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" StrCmp $MUI_TEMP1 "" mui.langdll_show StrCpy $LANGUAGE $MUI_TEMP1 !ifndef MUI_LANGDLL_ALWAYSSHOW Goto mui.langdll_done !endif mui.langdll_show: !endif !ifdef NSIS_CONFIG_SILENT_SUPPORT IfSilent mui.langdll_done !endif !ifdef MUI_LANGDLL_ALLLANGUAGES LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" A ${MUI_LANGDLL_LANGUAGES} "" !else LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" AC ${MUI_LANGDLL_LANGUAGES_CP} "" !endif Pop $LANGUAGE StrCmp $LANGUAGE "cancel" 0 +2 Abort !ifdef NSIS_CONFIG_SILENT_SUPPORT mui.langdll_done: !else ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME mui.langdll_done: !endif !verbose pop !macroend !macro MUI_LANGDLL_SAVELANGUAGE !ifndef MUI_PAGE_UNINSTALLER IfAbort mui.langdllsavelanguage_abort !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE !endif mui.langdllsavelanguage_abort: !endif !macroend !macro MUI_UNGETLANGUAGE !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME ReadRegStr $MUI_TEMP1 "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" StrCmp $MUI_TEMP1 "" 0 mui.ungetlanguage_setlang !endif !insertmacro MUI_LANGDLL_DISPLAY !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME Goto mui.ungetlanguage_done mui.ungetlanguage_setlang: StrCpy $LANGUAGE $MUI_TEMP1 mui.ungetlanguage_done: !endif !verbose pop !macroend ;-------------------------------- ;END !verbose pop !endif nsis-3.11/Contrib/Modern UI/images/000077500000000000000000000000001477201124000167775ustar00rootroot00000000000000nsis-3.11/Contrib/Modern UI/images/closed.gif000077500000000000000000000003131477201124000207370ustar00rootroot00000000000000GIF89aÄ~¡É‰ªÎwœÆóöúçîõŽ­ÐªÂÛ—´Ô£¼Øúüý¸Ìáöøûýýþh’ÀÕàíñõùêðöÄÔæyžÇ×âî¡»×­Ã܇¨Í_‹¼r™Ä¯ÅÝÿÿÿ!ù,H ad9­l+`X¥ÍtMÁ2},6^ƒ^¬Òn±«X94È cB•D¨¨ s³î·¦xŒkh¤ªÅ~.ð¸^;nsis-3.11/Contrib/Modern UI/images/header.gif000077500000000000000000000136071477201124000207300ustar00rootroot00000000000000GIF89aîP÷ýýýpµÌqÊǼ´³ÎÙ ]–Ny•fqx»¼Ä0hËËÒÃÄʼnÆx˜ÂËúúú½ÁVhi…uˆ´öööRøøøÌÌÍ_®þ©¹ÄËÄÃN°nttQqk½ÄÃòòòîïî]¡ðñð/35ÓÓÓ0CG™¶ÅìíìÁË«ÊÔÆôôôïð𗚦`'ÅÊ·òôòÓÖÊÄÅ̱½ÄðòñîðïôöõÝÕÑñòñöø÷íîî¾ÀÆÈ·§óóóÌÌÂ@t¥¿ÑဣÃþþþ`Œ´ïó÷ßèðÏÜèp—¼Ÿ¹Ò®ÊêëèðêèP€­èÖÏÚÝá¯ÅÙŠ·¥äæÙ×ÙØ¸Õáñóëíðè¨×Ç©ØØ×äå§Å¦ÅÛâÆÖ׷ɨ‡¨¡¸ÖØçÇ·g”œÞÀœ»àËÊàäÈáÔÒ”‹£·¥ÜåÕ¤Ö¸Ó¶­ÆÕª‹¦žµÈÇà»´µÚº˜´žT‡œ”ú¶©¤ÙãÉx•œÎ…{y¦Ÿ¦ÅÈ—¸£ÕÊŧ¨¨­Íà·Ë—x¤¢¨Êתui™¢Ï«•¨©wˆË¦ÑÞ·¶¶¨–§œ¥Ô§—¦£ííí¥Ç‡X—›ÚȽ¸ÜþÁÀвvlf‡šw™¡®¬“˜½Ó˜ìЉ’ŒspÊyn¼Ä¶ÉÕ¶«Óþ±ÏàÈàɵØÉ˜Œv{³¨ûûû[•¥”ʵ˜Ñ¨Š—”ª¼«–‰Š¶Ç›Êþuºi‹·¸©«¶§¶ºÆÇÇÕá÷wª¾µÂ~†Åþs©bµÓ§œÚáyB:ˆÉ‰Óà½=§ü|žŽTKs½Õ˜··hºy––›@o™¸¸¹‘9-‚¹ý¡Ì¾™Ðš«¬Â|³·§£j¥²Ç¨¿ÐŸ(gŒƒ††—††k¦ž—Ç‚zżÉ÷›Ñ¹¿ÊÍ}²Šd\«bX¨Í”¸ÈˆÏÎÏg¦©c´þ|€Žw†–ÀrMŒƒ‰Ëš‘ÿ{Ƥº÷ëìì™Õ&Ÿÿ8¦À]·ÂuŒ£¿XJ¥Ò޶v_Ÿ±ùùùùúúÖÖÜÕÝÑg¡f^~wÂxg³k÷÷÷v± 1:ö÷ök¨ÍÙ÷[»rºN›Š­¸F‡ÿÿÿ!ù,îPÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏO_ˆ~Q£†;ШS«îša€ë}b÷!õ:õ@VëÞÍ›èˆ `䪸54PîÜ9Çu†w@¢÷žN½úKàœ†ëу Aµâ ÿÏ„ £3Ådˆ.ݺû÷ð5^ ’dáËLy2e¼Šÿ*$‘P¬ÑÚìåß‚ 6xP⊂Äñý%¡I à‡I°ÂÄêÀžƒ(¦è^p¤Pháx0røáŒxÇ« £‚*öè#h<…Š,!`F"ÉÄK˜$’F&ÉÄ:´ £‰?f©åeAâqB…]|±’k<±ÆKœñEi޹ÆK¬1ÇŽˆ£';n©çžŒ7¤ O$±Æct±ÆKªHg¬ÑÅc 1Ç](BèH01È(à‰%Ÿ † Ø, ~RHñÅ•TòÇS,ÿñÅ«(r:s yÆsTrÇZ:€'žòè’?È&›l õ ,²5DÏVk-²=díÑN{í·ÉfKÑ·E<¤Ä·>°äl¸PYëкÊ>µ-G?<+ÓAPP­¸š=  "Ç=‘*¡sü‚K#K4Òˆ"•üBÍ¿4Â5¾6Â.ÀJ±Ä:dÐN±0}[€ Á›¬ADP îÊþð+м¥ÌòÊ.Gô- nº+™\óRî6d2´NÁ¬Q½ñÂD„¾Öþ\ p‚H5hÄ!Å}üñÀ,,Pr.³ 2MפtýÄ,³Àañ4*¤ºD˜cœP;x¶×¸å*4´?ÿ13Ë5-߃ë´Cà2Ëá×ò¬’ÏíVû®äEWËíFHŸü’|{ød9lÐ "Üé7ÅwH %p”'ƒôÁ‰%PR p,G1Ë<*’aþÑìÐýéÝà¡7åùP8ÍÚZNóÏ{^¸J4t.ºê*ûùQA7˃D`»€Q*ˆ¡ V°ÂÄ .ˆ! `ØÄ&P…f¢›hA H „à…(ä°Äà÷¨€ާ’j ”ØŠ$óöæ dÄhìt'JžÕƒ" ’á ² 0ÿ´SDMøz@Ð üÀŸ 1BÊP†¢ósC8BC'Úƒ¼ d¢åÂWç²wQŠRÔ ”HøJ&B!a ÅhB"šR‚Zô*Õ¨?8j³W¶´¡ -C!®††ô,méKc„d–!ÂM ª„(n!&]hK T‰ Õ*84 }À0À€…²†á¬a¨ªP*¨Bd ÃâJ'¤Á ¢Øƒ¼ð 7 %PÀèÑr6’ža|ÖS ÒJv¾ô’Ê‚¢c.-&ë±)&ûy|‹AÀg´x ¸ƒA³Ð=—FÆÏÄ3ó Œyû2ïÑXÀ1õ ·X!£sgÙ±‹£²€Àã¹üj Bð‚¡ QE´ÜÖ`¨¢½vÝ‚˜÷°…ùúa¯^pC/ Ѐÿãd$€L„jÉ“±ÌC! E«`LDÏÈJŸG` û¡u~°…§Ûâ•Ýy êû[Í„ÐhçöXÄÉ}Þƒ»Juš1Òê •wë²q©@•wDê©)X¨® ž›(žèù·û¸ñ(¥*£ˆ‹¤\+³ŠKŽb‰yÝð 9[ ‘ଭX`j0 ˜`­` ­å´o*MZ0mäz 2ð°“Ukws j¶ùC`FG‰ç±¼Ã+€“6`Šu² ‹[ŠW@ùT(h¡ê2w‚&Ë© ¶‘µ“ÿWäGPiu«oÒ™½¾ùN˜(¸Ý{hyÙz껨‚CCz8bP·óëƒP³ëÐ žÛ„å­æ¹ð ¯ ¶ð o·PÚº­nŠ- d`ã*¡3€»`¡V[h¸à"Ö¸‚åcuɸÁ—†è¼aë£ÑUMpdûniP'z\ j£ ‹£q·T*‰G6?ÄÛ¸ÆË½D¬Ž–`KL¿g”¸³¹O.¤|é‰$÷'ZU쿉¹nð ­ ³|ºfÕå` ¶@üt<$°`Á/° – x ®å8€!ëÊ®M\±ZÿÛ©n˜ÃÅK¸ŒLxŽìÂ6L.&ܰùúIW-€è{Ä‘+—Û+«‡+ĺ2yKF°T-öh×Y£M¬½±:ijZª÷ÊBË0Šn™cƒW8„˺¬˜ Ž€³­Pu@Y­V^ ’@Çt, Ò`"0 €´P€|¼Á¢€0 8p„<»Ë»±lĦʤ4h+ Ï”g¯atþRý†k³öSKZ§œ‰BLD,7lA=`Â<`ƒÐfɱ‹úĤŒÉY<[-cºì¸{iA§äÐð;¬å9˜ë 9€Ž€Æ¥PkœLLÒLÍלÍ"  ÿPl ƒ`¢úè¬zz¡>™Ñ‹Ìn xól }x K¨“ £ÆuÑTE]­z—c9Ê´\Ê!?€[ Ôz =y?µÐÝb+ÑYMÑBÐ\V-ÊfûBÃÜÓ7ø<«¡Œ«º¦#ž°Úà~Ð ÐÌÑʬÍÓ, ’p ÚÌ͙  à xÀ çQk‡»ê,ÔCýÖ¶UÔe s@¬œEúÈS¥}‰ ¶׈¦ªÕ¢ié²½©¤ÊÉ}9·òè4]DpAÐ8\Qê–a­ÚR9º½©·öÅx=8ïʔͭ׫Ñ}óÏmFÿà-ud×]¬" žp 9° rà^ªÆÔÒHÍr Œ½Í ðØ‘½ ¾¼ p *€&€*`È{**Aq.„à^Þæ} ~-­€ *ýÞVß`" pß6-Ù¾ †ÀÓ× Èšý ›Þâ.ž#}Þ€°îÞbÁDºÊÀÍåÙ € +ÀÓQ+à‡àšíÙ/ÞäNŽÅì ìP«“°ýÐjàÌY:ÛÙ À0 +€1`·k)twàOçr~Åìp×P³Î¦ uàÞ+™ÇÄ‚^æ©€æ °ÿnâ°Ù…,NL>çé3kÞì@÷pyž9†  ªÐçjà £°%½ú¾è¹[†&2Â’ë²NQ^÷°msg мÞ9à뚎«`»çÊæ)Ôt7N>ëÌÞì8Qçìpër·ËèÖ~ Ö®Œ2КªÎæâ€­®Î ãìä^î=å•Nî§Œ9™“ÿñÁª~·€ÎèÊŒâT7°nîú¾ï.æmç·¾;К­ ¸{ðÿá;ðfÆóêüþðþNé@êî~;àÀî:©ð)0X o7?ò$ï 0åô@Ðò.ßò+@Åd’ï%_ó6ÏoÞ(ï<Ï<ÿóIJ#4óD_ôÁW’ôJ/ôFßôNÿ õCÿôT_õVõXŸõZ¿õ\ßõ^ÿõ`öb?öd_öföhŸöj¿ölßönÿöp÷r/;nsis-3.11/Contrib/Modern UI/images/open.gif000077500000000000000000000002121477201124000204250ustar00rootroot00000000000000GIF89a³~¡ÉŽ­ÐwœÆªÂÛêðöÕàíúüýýýþ×âî¡»×­Ã܇¨Í_‹¼r™Ä¯ÅÝÿÿÿ!ù,7p¬Ië ¸Í»hòŒd™€b©ž¡º¢®‰W<¬r |8Xl”…â‘¥©y†tJ•";nsis-3.11/Contrib/Modern UI/images/screen1.png000077500000000000000000000364371477201124000210650ustar00rootroot00000000000000‰PNG  IHDR÷‰ ƒŠ¤gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<PLTEÿßœãÙ͹ÄêÆÖü’¦Ù7Úööò¨¹åóµi¨³ÑRhbúËæ¡îñúTäßÿÿ·Ìø¿ÿÿËÔïjþ{“ÖÚáô1jÅÒÛñZ샛Ù1lîœR¹TiÌÐп±Ì„µniáS+òñíhˆðâ¢Jmg„…Œ¿ÉìØÒÄs¾þk¯ØKâÄ«ÅSfDŽÿÿ¿!¥!òõûøøö±éØíìæHH›Zôn­l‡Ñ›Þû‘˜²ßßœæä׿iK¬¨™eñþþþŠŸâÌØIœÞ¼Òùqþ>–ÿ‰­åŒV„ñwžëîù®ÄÑÎ’;rÓ¸»àEÒüüû¡óíà¸ô³¶n©¥¹iqŒäé÷CÏøùýkB¾Qož•ùÿÿÝFªóáߨUÝ•DdBAwó£ˆÍvž±¯bïïïßœH°Çôf‚Ïš®ßúúøUêm³±o™×µ ³äHñððꊰ÷jîàæöXè”mXæCHš™ýÁ´+ÿ'Åßÿ¿`{«ê‚iôôð’®„1‡ã"eòx¤õ¯- B¿ÿÏåÎæþäìýz—ËóóîdìmBЫŭgоxÏþM~ÅÏ퓳¥ø÷ð°¿èÚ@Åÿý±€‹Ó’g yútOé …ÿÐÓÖÈÃ×&`æÕóïÏéØãéãàÿ㯬圼ìÚºokóy˜¥~ˆ²ÿÿîöøüÿâÅçççJ#¹žçÿh”&U„^îi×XÀ M×…ÝÐè¾ÿçõ,YÄl¢xBèçßÝãâTâOëH\ð`óâ¹Æ)ƒ[æøàÚXî¯<õôëBEÖóñçlF× föpùAA„ìÌ„1Œÿ²=çëø¦Óÿ1¢ì»øë¶¶ï„¸ÚºÞÉãÞÌÎßäwÄ…F|Ì¯ÑØ¿ÐÚ¿œù‹mËPãÿÿåtœK½ãéìoõ¼¼²ÊÓ²A¡×ÿÿÿì騒ùºE9¥IDATxÚì @UU¾ÿáèù„ÁG¨ P¢Xˆ£’šÀ˜oeBÅ,™ÆŒQ§,5“tšÂ˜t’š®f¯ÿ½Zf·qz¨GÃ|¡ÍÔÕj®uõÎüÓÙçþ~¿µöëœ}8Αsà¬pØgﵟŸýý­µ×o­µ$´Â· Á’ ÃÃWô[Ñoü¡Uú䯯ي>÷«^®Êá•ÉááÉ•K“¹-NĈúËãŸ{þùçõ×_ýä¯?Öyì¯øûWúÇìùçŸë9}%ãþV¿±À}üóHí'¿Ö) >¯·#Ï?¾_0rŸž6=llØÈ’6¤SÎ^ŒÜ W Éìù¬$¬Ý€ÅáÜ’Ã!‡bÜôà©RÀÊä7çÌ™CÜ<±Çÿ°Ê†~Â|Î6 ¾S²±Á*fí2² ø;-Û§¾uúôà•+§<¶rzáœ9opðD|§¾B˜¯Y¿^ëÖž4i>ZÌü˜˜˜5{cþ>xÅŠ˜µðeÍöíÛ÷Âσ>xåÊ{wmì~ôÑÛÑnİgoìrëÊÇVN0•¸ÏY±áÕ—6mÚ´ú‚Îö.Ì×LB]¯L6 o€˜íÿ~gxø„ù—pšl{Ìöíï½÷Ö?{…'K2äQ²Ûé¸ñÆ¿< Ø'"÷逽_ŸUñ¯};ûjÖ%àN»/r¼lçÚµkúI>fû?%à3iÒ¥ù—€zöÞ[ew³üÏþEZ n~"×ûŠKy׬կ\¸ðµ«—6`åàî›Ü'Ü×’Ö™»—¹Ï¿DzßNöÞ{È=9YºS¿xú¿HÓîáá1%×>2`Èà8xÝG¹¯e؉9¹uà^9a;|ËVí½÷®0îyôa‰çðÒÃÄ=˜¸¯ žžþáŒ_[ ³mÛ¶øAÿÿ¦ø{eÔå~ááOOùýŠñ’ôÊïWìþï‡óI<‚{¡pøx¥|5¸°0`G³bÖ–S3ÿü>B¾„y„û|¹@G¥ù5k÷eÛctz¿òžÊÁ£Ú »FïÁÉá—†þ÷âoþþý7ß=õÔ3ÏìZu à éQÒãsû½Ò¶à9oN=ÜÙäÊ9xoN >°ûO`7Á©Wf½òãÊJôj\ò§›#pyš;óòkî¶Ã]Ͳöß»’}E£÷ÛoGäø÷ìX®Sô~é?þ{ñâoÒ¾{ê™]ÏìÚµçUÙD=¼uA%é}æï+ÁHï8^IÀÃ+iYãÇÊÊrt÷Tî¦Ü êñÊ~³>_€³$ér¥°6pÿ‰Fï?¬YÜ++×nðÙ1ÛÙÓû!ä>¹ßx;•ã©Æ†ßQïõ¾4¹¸?õÍ7ß|zê™ÿÞs c±éQ¿=ó÷À½òîÇÓ+Óû œTÃ|OKÛV~ˆ“³¤mW€û¥•0›¥Awÿ¶ô?áQ ¼õáàJpã#†Lœ˜øÊåt7±þÎ=F)É?óÃ?¬ù¸/{2zÒûÞ½ÈýêýrgÏí ög‰;ùùäðÊKCÿã™ÅßMþnç3×®=õÌžKcǦ§÷à§îýú½5äÎ'yá½ÒŸB—âDú,iÐRø:$˜ØPÀœ~áá¥àçÁ¦V†Íš‚܃ûÁÇQßÚV“bæORÉø¶?&¥WNØ ‚½¯!ðÀýЕàl¸K€»^ïÏþFÕ{x¿˜¡÷ýÝ÷“¿J:{ÀSOí™–†ÜW‚cžyÜo&JC»<É,ꕯ})q'ìð·Á“Þƒ‰{re¿#3ö|ýÝß¿NüÉ?ê»\}fÕ‘°±aaakì,à“k)p?È&ƒÃàÆ{Z2ñM½Œ›5ó¾ô•ÒÌúßÿçĉƒAïcqS=9÷°·aS˜ª¿‚ûüI<Äà8òÀ‡ÄýÐö5k²á~÷î=z?P˜ÎôNØoÄO;è})ç¾ô@ú†˜»¾ûûä·ßzÓ W÷öðêUÏ|ß0yè /\Í›t„Ú0îo¿tÕÃ\žšNåyœœxˆÜîúŽÀ}È< s‰çÛ, ¸}iÊ‚•‡ïÅ ¬ã‘;þ»oêᱠǸWªÜUK¯<¼ ¼”änÇúº üÃŒ{ðR¦÷ô aaGV¯Ú5ùûï‡Å®ú«Üˆä‰ÁðùæÔñoNœøŸ÷ö|ù?WŽ\÷ă=Ùbœ=õ`Ïcõ„…'>ÆZ{PòƒôŸÿ[yäMJü<–ç'N=Ò³3YX»þH‡ÖÄÄPö9ró‡ÃÂ÷ƒ{×\s,ýÐÒµŒûJ¼<×{0q¯„9¬çs«/­~Ni?¤6!XžzùåžG4sVÏÿe͵ Ù‡Ùœ—§õ ó¸7bÈ•ñ‡{ k»Iö®aáV|Š{àðÁ~ÉI={.K?´÷àš½œzØ¡ôÊ¥Ó—wxöÙU#쪟_ …÷0À¬ñ#2xg?.$Ñ%»÷‰!K]^ËÁŸÛÛ¯¼÷Þvö ¾÷Ã? O.ü'p_»÷СCð÷à!²Ê’ßZö”ߟ½ñ/øüÆí7½÷ë‡Å¸Ã=h ¿.×øÍ‰K…dݲµ}ÿý±Çûçc²MìŸ7¬íÙó¹µ¾ÅmÎ[ÉÉ…É…o­ <û/¿ù ûåö—.ƒ½÷K‡’ÝØ°±è’èpõðßË1vkaþþ³Ö¶ÁÜ ëžaÏ-³±µ? l›úËÁ‡½'‡¯XQÙo°ûòØ—CN?¢ìì“–îÒåyi%þÂ<­W.åÆôœ<}útÖM*9Û†óa.\¸¥í÷G;Ôÿ©š)ìU˜œ\ìO5…;‚/ÄÓéßtúÖñMƪ^HõuÁ?¼‹Y¯»z¡E÷ŠFˆŸ ì ²Š  ²%`Ý—tïÞ½®{X`]```Úf´ÐúÞЭ7Ùr°Ÿ‚}ùå`?»ìU°{îùüóϧ|~ÇwHÂÚÝ‚§÷æÜªã.ƒGòÙž±WÀw'ãàÉtà÷Þ~¹ þKü-2ø{xïs¿ëV-v/K>(ša½-Ñ+¾;'Áž×sÿ‘FðŒ;bܽÌ]žé=bÏ®P]=‘gªon¶ñô7lV}_ŽÀ¿*Àû”Ÿ·uôèçÁËØòˆ¾™+°'è¹kô¾Ü–»,x?E`÷¾ÞmÁg£§ÏV=}Å²ŠŠ !Å!YYYAÅ!€$_g“ÃË;üO—k2xmÉî¡w/Y¡¬w¹d§/ØECþ­8ú AYñ%ÃKN^ÿ†—4xôö vV´ÓøùÞÏÀßñ¹àîE?oS¢× žÈgõÆ’’Ó§‡Ÿ&æø[RŸ…äËðŠà{Û<ÊÙ—ìTî¼·¸Û ^ážÍõž=´¬OŸ± íܹÆ<†¾1«{(>—ì•èmá•~Šðô>Áý.]‰ ôX¤Ÿ]‡þ}ƪ^ÙA;Îî8ÛýlÐ@äó²Bš›Ë™âíKv½• Þ@ðâ ÞG¸Ûäðäè±ö¦¢‘i½×Žw\¼¸äâÅ‹;vœ=Û¸ DߘÙ¼àmKô†%;àþ¹ä¼Ù–òHUi”+çÄRG¸®p¿U~‚W ô½4UvÙA€wøŒsuu—ìÀß³;ø±%yy˜Ë—¶,øŸ*z§:»Wuð-¤ÅÀ‘¦KÜyj×î¥Vµa¥Ž]ž·¼\g—M™<”ç†Ïˆ†\<2Å~¶bÁYÆýìÙèÆ¼¼¼Æ,xçžÞq½ñ£ÜgüÜ}™®c™ÉS·Áüˆ{°wû:;|ãpPû“6¡¼Äþ쎌;L7¢â›ëʵžÞ¾ÎîK»:»{Á·xGjsàô?QâÿÌê¼ <¶œ­®bMŒÓÍ–×ãß‚d[Í~‘Ihý¼£àLvv4ªý\w¤š¸ólÅŽ ø;B‚ó‹å,þGoó(§+ѳº›Ð×0@gœTdú×\Ó¸Ôª}™ò¿}™8D^‹%)€§žÉ–/®2}=×”Qdú%¤UW[,o‹Öû%ûöK¸efÒöÆùw[½cÁ ò«*èæ„„æf’xãÙ³; ë7×o,‰…ïñ!˜ÅÛÞ˜û-6uvN<½¢wø¿ˆè¨ÿÆ)²e‚OµK}a®)Ñv5å­÷™ff‘_” 5ÜmÁG3Å“—îçêçæ„ºîËÎ6‚ÞwÔ'Ô×6,¡  ÀgA˜`ó¯–è—;ˆÂc‰~ é]Ìßí¸SùýX’3Ï´KÝ÷¡l=í–i{þÄýVãGxôò§1wß̸.©8ÍÄ^?ì…úóõõ ø ØØØøb.ølƒrÆuµ¯ê}Kfjy~‘©Œyê4Åa?m6ýc.9êqšÔûæñå wòóÊj´­ÍU<çž#ÑâgÜíOzÏ; ÜWE ÐÍ›ë*‚Ξ…l}ذÍÃΫv¾Ÿ•UPèB§AP®å¢æù}b³-×a¶lRTjÖÿRUî&Íj\áãØzüÜQ¥Q.?/v:îzðLîÃW=Ù=ónpóÅ<|=ºùó%çC*‚²‚Hð º ^ÓìÆá“Ü=SÚ#*çGimãŽÔïR=Éý4ÕÙ@q=°® {B¿Z?l[qýùmW‹ãÏo.(8›Õ˜Õ=¯m}ÑÛ¥àŒ uv‚ûuàþsCGO‚Ï.AìÃg¬Š­è^Ø'ÔŸvõ<”çâãë·•4+H,(ðX¤WKôŽÛWþHþÑìÆ›zÿ¹±£G½ŸæÜ7=YQpuX`Á°«Ã† ‹ß69þÇÅ“ ®€Äë/†œ-†¢<Ã×%$ÔÕ.wÖÎÎI‰^X»rG¹G'ì>6äüùóõç'‡l+V_\\rJxÝAñ±ñYÎáj”Q9¯r×Dáï’ý|×{ɪUçŠÏŸßv~[qqIüäøâ³;BB dòAY±yõÍvðº’Á#ü«®TÙ »®ÜoµÏà ûð3V­Ú”z/)‰)Î*Æzù; ð÷"<ÊbÙ.2øA9§ ª%¾ÝËuŽJvÄý4a_µ ÑCâó²B**à~é}×{ îBâCêmžälrxû:zM]­àá-î·Úõ˜jdrGìȽ"©W„Tï‘¡£Üë}A£úߺÕŸ‹ö•ÞænSg·¶Q–û¦Mw=²dɤ^²DÉÜAêÀ+í@ïÍuvOr.5»q|À(×¢&ºtš/f¬´k•µ~ ·-`ÔèQíÁÝVðŠÞ{5²§8Àþä“ÑØcчtïŽÙ:ç@ë õ èæ!—«èíëìdðU7¯ºÖì†*`3ZǧVWJ=™ÙÊÛˆ­P3ŽÔ˜Lãà£4ЦZI3Âv—úÝ+ßÚŸ»­Þ¡<ϱßÕ+ˆw‰$êu qêXŸ°9¡>ð"pG½Ûu‘´«³»“ Þ6 ï¤ÎnQéVIÔÃ=½„Fµ’;[#àè™LHüÜ©—q­T6å&wÇì ½Û€¥ÜÔMØC°?$P—;ÉÔ'p+è®×»“(¼ìè5]åœ=ÉÉd—ä!ô»$9þ¹Ã00IXÔdhÔÌ÷ t¨ÊdÚÅVbpRFSRXk_&Æe†Â%Æ ýi˜-¡¤™ëÝ®§\_'%z¹ê¦CVÖ=ÝaëinX²Sÿ$rçn>é믗-KZ;,iê;SÔ…d•`ižuˆnið ‡%»Ï]ª³æqîrø^ÙÑOf/A7OÃ,IZ›4kܬŸÌ7nUq a¿Xr¶äN÷F‚ÁའëìlÛWŠæVÞån”‹ÎZõä¹4¿¹ h0ÇŸygYש‚% ÷Æâz%+ÐíZè9c›Ã î퟿Ûåð ÷ì¼UA4xU`d‚ÿÈ}`/fØ/†œE/_¿¤¹YÎn³]}_zÎP3;Þ{z·­³ËÎk ‚,ž `ô}APÙ,;å—#öÛJ?p©í#üò{P|îBßXažçn ^í?‘•×Hôlä*?nx aäjÇÌ=á_ÙÛ¶}¥ƒª›ëß^˜w9|4”é |…âêcKò²7³0\E<¨½x‰2ˆ¡íHÅvíì~jTIK]c…]üý玂±àé£ãóbƒ˜äk÷¬³àâë–Às;:yeðÊ:Yï ¨VG92¨»‚÷¦ÞíÛÙeGƒäc£Ùƒ<“u]]HEVŽdB£–Êã;-Ñ/wÐcês1œ·ý¼ýø•ÙÙYy€>ˆ F¾$¤¢" µž—R3š»7+#“·0@õòå†ÍnZ1Ê‘°ëÂÝ&‡×ô…Ïòñ8†Qcã¹s8¨ Q/‘‡§6z Qø[Ĉô^ÏßU?oác_L(Î"ÜdyñY@]óŠ:àZ,Ñé¨ÎN”ìÚ_ï£ðòhvÙˆ¾8‹ÿ„Èã’«o PŠô›íOä—÷vÕåx/q7ü"š¿tvýMÈ®¨X?.¼s¦¯+¯ xUi}!Àx›»=øh…¼æeCî\ï ŽTFá_½Eô˜òfþî õ…f\36n)EÐ’Š%Ê»†ê”Ö¶šWP8ì@á°d'‚3^лÝ#¼Úƒ¢—þ3šw(zïnP²3o×^ÿÎA¦½¹Ûçðöz§wÎhÞ5D‚WJôuvuµ}¼‚®’^€oîc„ù—ñü]À?õnæ_&¸û§ îBïÂwaÂÏ z&¸ ~^˜Ð»0Á]˜ðó„ޅ îÂwa‚»0¯r·mp<Ãn¡™åèq£#4>l~'–Ð4ï”çiäoÇW&ܾmÚ_É1Í!z„{{©ÝY´°’ÁEðÞóKá~4°Cpwxˆ˜{ÓFïp?“Ã6üÉ”dµÔ˜öåX›ªL¦=GÌ0i=ƒxkâ¡Âò$øVšf9:Ïtÿ\øÿY œ§¦fÓ¸²|“)¥·—dm:™ÃS6°3Â+švâL$Ò­Äö_F©9`Ú8nì¾U\q׬»§ý±}ðÕØ‰yóLùqiW·ò3uõ"xˆ;Ë^,5IVsJøb9ú0^+¾G³Ÿ\¸úÿ°œÊkf>vüTŽÕ\: çehS§évJÖA¸Asü6±”òÕh MËšw>-·(+ñý³ÔŒ;-;Nã `UïòÚ=`ù–RVc'æÝ3¥ãê¡Y½AV³«ÁCÜUG‚ct“Ï·Ôð›‹{?yašUs=CÒBvÝ›NþZž§ÛÛ@Sßœ^Q’E“÷ÿEΠ3,3H ÇŽ++i÷š&;t¼nòqðŽ+Zâk׸åëqíà3ÕŽ~¦ëÁCÜOæh¸³ËÇŽåo6WC“ºp5”MÉG/_¢ûCÓl¹çß¿ñ3?KQ©ÌZàÞ@Ã%|FT³¶Sî^:Ó–¸»xª®Ä÷¯+×±KMƒ%|¦9íÚfyÓùš™üļy¦ì¸l {ìL]¼¾T_ךç ó1ß®ê4gêcÜ‹’¬~ÂÝËg*êçEý¼0Á½u¡‹îáFXGçîB¨ƒGnŽëëŠñ)Åö&p©:ÙõàÂ<ªwCî6‘…ûÑy9må. x_ï-†:ä§P~'hã–£Ìà¯ûrð Ørj±QAÛc Cù^Õ'`ÖŽÜ1pÌq¨C®2‚9º8Ös8İ„N;“c5#hë¼hOrýí•UÃÈqaíª÷BZß-W‡ò8¯¶”ƒù¦2­Ÿ×Ô©k븭ÚúNåSŽƒkwîÆ¡òÓ'sôÜyƒê‘÷(éÌnpZ÷w£P÷ðr¹Nñó,ŽÁî•Äh:9 îƒ0‚>¶!Ç.ä½R¼‚oâúµ4óO+tÍÏÛ‡:dùÊsœ6ŽABÆìÈΠ÷‡AAÛà±%î/‡)0H"¸‹ú:a‚»0Á]˜‡òwaBïÂwa‚»0‘¿ z&¸ Ü… îÂwa¢>©4 WNihqŒAì›!¸·‰{ïu]|n$ü$¸“¿™2h¨5¥ÎO«wê˦öbÃO”Ïrj1âw2M”/?CIä¸ãàî÷¾LíÞ-½c1,ÃÂÇÞÓ çgÛçIÓ‹zÊœäƒòêµÃüñ7NÇt‘;u½×žxÀ¨æžË²v*Û9Ó»Ó縦“5¨¬U[FócKäAùØ ~Ê|;îŽ;Þ¹À}QéVI´UpW¸ƒ—?j<éžÞgX5cïi†óÓôu³Í÷w¬)c?EY`ëçw¼sÑÏÏ<“)³†¿EPPx ã e‹¯çšý‹{d×®§OŸÎí ŸÎ¸·œ¿ÏÅÒ–U{OÎ/Iíëf;š-Áá,Ê ~Ê0¥iV[?oÐñÎEî¡Q*÷ÑðeÐV˜N­J”eœÚmÞ·ÛœáoÜ|WÂîfþÞ6ÃAù®ë`±ŠSgÜ©*¢iúÚƒ&üÍí#w„Nؽ½(Ézݹ§žÔúy)Èû9÷ò®|®·¸·Kýü"”ø àá¥ŒŽÆü\?ùù7ü˜{WÀþUdd¹‡êç}0.³ˆžãàs(øy(ÒIR‘\®óOî¹¹ð‡•u¹_•—K"ç7Ü»rð_•G îþÃ=2—Yd¤Ð»Ys$ÕÌu ÄvÞü]˜Þz—G&ÀB//ï-ôî§Ö)¹ óËöuÂÜ4Ñ_Æ?Mè]pù»ÈßEy¾s—çÝÈß=Õ¢¾-«è¹¥‘Sl¾»õ‡£—¹ËqËj›uŒ»É]c´æWÜ¥/×uÝœ›ËºM,—Þu‡;¾¶”¿'Ócܯ¯ÞÄ«ægÜ×-_¾®7kH)½àŽŸç[Ž}HyãC>okår‹zùu©ó”×ÇèÞlÏÎ{Jï×Üçn6uĆy#¥®Ëy;jlP+}ïŽÞù;çÖ(]ÚèÅõ¬Q¼‹-êùk¨5={ƒní e¬¬á|›¹OŽÝ{þ&Ûèn€k¼9Ža;[ŠÓóIÝâÔ“»;¦Þ»®[Ç¡çF&H“Ýç~r Š…^_ÞªõêkDšN樯Q^,"¿È¾Ücõÿe½¸Æôî»f¦~1o¯Ùñ¸³æó§# ¼â?¯Áä[Õ¢¾eîǕٷ‘û®Ï§ u‹UôŽè¯] ×;¶³ŽïË õ ä@V“8“7¿f‹¦aO®¿Aæ“)¥Âd"-hu_çŽy;oTé”»Kå:bzb.½8[¼/nM‹zòóÿ`­éÙëc´o¶?®¼È¾­z1¢Ûˆnq³w)z¿v-þÚ€ñ:½S;ëGà&ke•À¤9Ûc¥ª‹¸ú-3çÂ7¾Wòqî‘jkÚ\7¹Ós\ϧIüMÔâ½U-êY)޵¦g‹µ/”Q^dßVîëMh]b¡T?†éá(‹W¹S;ëÊzzp¯.7¾eMñÔE4}4}£ÓªJ£|ÞÏón¼õ|ˆ§êmÌîT°y¸UµÆÏ¯¯9òµÙ7iò÷®)åy%O­âÄ ¹«‹ðÛ©L¹¶hêëä‘;všèJàËÝÔ»VúI>É=vv—›nºiÀ€sšòqÜ7ë¾Ö¹‡Å§õ$%®rÿ\ø¢ŒV¤DVxæ!w)ËgÏí'ht£ÝË_ù›OœHoMᣱxŽúÖXèݱ 0å·ÿO{p_XWýd4ZÅÜ⮼®ù–S9æ}9æcX¯j.¦FVRX†Æ)Ji`\­ƒÒØ¿9C÷²g#)hRÓÆãô¶çAÙZLïÊ[¢=¬÷Ï´&Iù}ÚÝLíÁ=®zýú-[FLùÅ/~1eÊ”;Fºãçu¯gWêÖÙ¨5J »œauó¹!gÊG7Rb00ó‹œAgXfð!”ûA÷Vxëý³ÙïÎÞ¿ÿµ×ª.\ÜMíϽ]ô·¾¶vË þ‹)w8åì>w%,#·¹ÉË£i¹çß¿ñ3?KâC ô w'zW±o1Öûêýý=Â÷¿$i˜÷ôÜ»uÛÂå>Å3~>âán>¦¬ÈÃ5ðÌ›"7¼ÁE™¼6àÌgþ|^™õwCsøF¿V¹‡¦µÝÏ;Ó;Ç~ó–¨÷Õ‹§ïVY¯þƒwši´du„ôÊe÷.ð²Þ»u1‚À;å^èt|Z¹\ǹ+£)¥59HC‹L¿¬’›ä~VX˧v6VÝ¡r i¤úy ë´¹\çDï2ö›G ÷üÕX· Ïê/­îÖþœ€¡'Pgê¯~é²7ów wwý¼{j¬5M;´£v¢÷ý¯ÝLØwÓê?$~Ðçéú×ú3á§t7M/Xý‡¯^éõÚWÌ[ËzOÔ-¾Ì–À$¦Ú-I¨‹¶BÊe|åÃRZà½{—{Q’µ}¸;Ñûk¯Ý|3Ã.‘ÞGößÚkÿ$øÖ'ññø„9àøÃà˜†¿ÿúsîV['ˆs.+‹¹{à©@ï1ê"®þÿz¼ÏnLˆ ØÔ{§èÿn¨wù¸Wß|3Ã.1½÷Ï5î ‚^ýR/@ƒÜ`Ðz’¹šµÃÇVîØbž«¯¦µú㯺ˆVEï1˜V¥—}4÷ƒþ2ŸÉN^’˜Þ÷÷‡œxõ&!»õœ; “hò?®wä¹uJ/e±¬w–ŠOõQÖX±@Þš&ïïù»ÕjmK{8¯æïøÇ°Ëzg¢%?…ðÄ»qº¢u–K牯®ïÓg÷e±¬w– Kr[µ…„ [#?¿u˜×Êówx ÞÆ>k÷9îNôØG0ìLïV®PðÄÿ{ºûÒ´t÷$X²šÿõá>,¢}ÐGYÌŸãzñTOS¹Ž/b3ä­ ãëwx½û.wgzW°K¼¾ÎSù»»¯…ð ½ûIý¼'ý¼›¯…ð ½ÛÆãü@ïn×Ï»ùZŸÐ»y! kê ÜÛüZ_Ô{gmwáÉúyw_ á‹ù»?p÷˜Ÿoãk!|£<¯¿wVîï¢SÔ×éãﶦïîîÎØå^í8/w‘ËÇ»xÍ_ëçÅßY—7Mww»>Sv[öÑŽó|¼‹u}±W¬»ãt½ëãï¼ã£ Þ¦»»sî>Úqžõ‡UÞ×éûIµ:þ®ö‚Þí©JwwþbªQô62uœoGîå2ö\ö‡í¸z×ÇßÑÔPÖ>Béî.s×ëÝÍŽóí®÷\׸û]ü]æÞƒÚG麻Ûsw³ã|Tûûù\ÿñó­Š¿+JVÞ?§vw·çîvÇyåîåy}üÃLd=ÛÕîî£Ù ɨ;¼ä©ŽóÞ(×å ½ÅßÉc‰‹õŒW»»Ó ÉF³îð’‡:ÎG?ï+ñ÷ÎZ_×:½ûCyÞ?êç•ç8Ô{¹Ð»¿Äãdî¢<ïgÜÁÏßò#üåyãÞu™Ð»?åï­Ò»?”çg£½»c3Ÿ ½ûOy©ÏÞÚ]øÒHõT®»…/Êó*w†ãqE3QõŠAxµãŽTÏÊó"·igŰøÌq£š>R½(Ïè]Æ®áŽáDOduñ-à.ÊóÎôþ®‚]ÏÑ-üv¼€»¨ŸwW±Kz½Sp%5tkQb ¸‹úy§ímìFÜ¥¢¯C£:`À]ÔÏ;©œûLÅnÈ= fœÔî¢~Þyü]ÆnÈ]~£@ ¸;Ìßsý¹<¯ç>BÛî®öÅÇßÕêr]¤Ð»+õóE‰RçâîÏåyÿŒÃŠò¼såy¿äžë—íiý#ØnȽwy¾h$!Ò ïñºÞý£³»÷%º¯u~ÖÿÝIgwÉ0°Ö)¸/¬`oyÒïéˆz×wv—ðUÎöïü ÐUÄv îqë?ú‡9™2_<0e¤•çm;»K‹R"¤ÿÝÑùõþI\íGݶÈãÝáoz·éìNµîÈù¡Ò¨EÔÍýè\¬S¥x:Fã0rîûowwEï8®ÑÚ°³»¤ŒoaÉÀš¹´ÅÓqƒDÖnfPT§àîoãÏ·ÔÙ}æ\M„œ¦RO>Å#34?Õ÷ßîîqîNï6Ýy*н)±òÔ“Ïh¹w òþȽ…ÎîT®Sc®ÔÁ<¼<˜Mb‡x»{+¹»;^eÔ»MgwþGÙ<ÅÊG×(£›Ðàðõ~ß»»Ð»S½;éìÞùžàDþîJý¼àî/ímü¤~^¼OJp÷¿ü]p÷#?/âï¢<ï·ñwÿÎß]Œ¿»`¬àïçåy»Áæ[MOî7ºSsîäñ÷6pW{Gu(î~øžgƒÍK,òN1wíàÓ4_°”w_—›âŒæ#ÔK#:?Rzb{å¶«\.½+âïräbîT%jâ48?•æ<"w_Wý<ïß1¢ó#¥¾Oôî½®o_lK)½à÷ñwI²`^å®/w_WõÎfMë1Ú‘R×åœ:6 ÷·÷Ë6¯`þš¸ìhš¯ÎÑäëšà|LjÎw|©ºzøIpÖ~¾³Çß•Ñ q]?r2“;o6gQ ›óˆÜ}]åÎfuèüH)·¯òV!?ì/c0Ø|iT‘<´<@5›°œFƒÍG°ÞëlŽÜ}]_®3A CDç‘{ßÓ„ý´öwi°yóÛÎçt¸ú:)²ëéÓ§;|F&ˆþq¶Vd7úP‘7Ç#ò$wØEÿwÿ©Ÿ§ñmNŸfØÅxþÅÔþ• ýßE{›ÎÃ=7Áçææ~U^.òwÿá™K†r÷»ñ.ü7þ.5GøÈ\ªŸ÷?½;¿wÒµ#¥Þ‘8ÞE¹Œw19vWì9ø›lçƒÍóî›u_;ýx±úÿvýßí8wVîwN®ŠæÃ]øÉxÂŒ¬SræÜ:aþ.ÌM Üwa‚{± “ —téß L(ÓÂ: wÚå㤓ty_@ïtÜû40Aƒîs¬Ã ßh°~Z8=©Ï‚Âïú¼Ð¿?:ƒË……«YŠ´Ça~a’ Þ¹@#½[­Ÿ¦}šô_ø8ͺ í2pEÐåý>α~ °ÑÏšdö6Îÿn ¶vç¶ÎÉ]>¯âþfó…iŸ¦±l?à>@gðiN—þïv‰ùæ<þñw4ß/ÜþM:#wåvf”‰0Ú§…ßá€Y:è½?ãþ~KÑåc\è/Ù}Ëà;*wmþ.üSÌ´»ÀÇåôóàÚáï  ^½ËÇiŠŸGÕ÷ñ“b^§æŽ>3t,Ò}:½ð_4™Ôç]ÊïÑù[­ /Űrùþ‚{ÇçÞâœ?µû/÷÷wäîç&¸ î‚»àNV(¸ ½ î‚»çÌr´ApïXÜ-5&S™»œÕïMU&Ó¾>½±ÁR“E)Çq<‘$ÁÝw¸ŸÌ±6•xNïM¡iòÌ|SJƒå輫eÞÑã •NAp¿®Ü‰àA9æ“VQ²IàH¶–£•¦±/8?…<?Ê|ô@ø©¼édšön°ý[™õ¡=ÄÝœáq½{$1z"‹áÚšÚ§5·Öç]Çò|‘ pXN-¶šK‘˜9ãÄÜ$&[:nKMÿòÌ·U¸+ó{T%aνJÍ6ˆ{Д\uÿ­>§sS<À]I¬_«édŽqêãt²ú 8Ø¡ál»™öäÆ}ìV¹ÎlÊÀýÁQ¡rg¸q|¯4~Û³áÞˆ²ªwyþ@[a(§Ç®S8÷ü²vâ>ÃÊiš)ïÎOy‡ü|U’Êa~àå§0îl>Ê;_ÉßÍIx[[x©¡A¾5ØÚ¦w¸Øª° À`NÁœ%?£‰òî…j’(G¢tŒ;è u); –4© ø=k—ÁwØŠ2‡Î‡¶ÐCžËò‡&5m$­°ƒ4gPÖX%_¬AiìjægÈ[ÑåœVõHØ‘µWþ>—nÑòê8æž» MòET•Åná¡rÖÇæ˜ÙZŒ;­Ì<¤4푹³´éœÓÉÕ0_Êò—㺼ÆrTáÞ£Š»¶T¹ûøFÔrNf—Áa©DÙ†æ>–wг¾È4p†eÍ>•£nGs ²B·§øGÍîµ'о~Þõ|åzÔÏ8='¼Èýr×å5îèŽ8q‹wu/“Úgpxsÿ-CsÎ*weVþýß9ó3(À4 ·P·£9†4#îºÝ«3wÍ9¡74kP¹s?OùKª$;î,+ÚÄbe©Ž;8ou¿Üö9µ¢2eŽŒŽŸ5¯Ìú»¡9XœÈ`Û˧ì’CŽ­ŸWrÈê-Ê‘µ—Ÿ÷ý: ÊHÑÑ+Reå:³’+¥h%Fb(°A'¡,Õr‡ü¬L]ÀfdpĽ©ªLžƒÏ¼C9yå˸»Ò´"– 6XÙÁõjyAT£r%çLÒ@Q»•ë:f]”0Á]pïœ~^˜Ð»0?çÞžOÂÏ{«<ÆM¡5¬Û‘zï@ç„ãó’l£)Bïû9ÖA?+³šËäÀŠúô[š&GFÒxk>šBÓÔxL>{:æ‰âÍ R:?÷ŽîçóËNü¸ÇƆ¢$¾8Æ"þ¼ÖNŽŒðˆµRdðØa ‹ ÈST嘒TèݧÏÉ2Ã2}&M+Ÿ¡i<2ÒÄC تç‹5ØAóõUúr´Dp÷ísj ýY’õw‹76rç‘+XOœ™¶Qvaá-w9Z"ü¼ŸÓór¬œW¦ï¡Dd0ØÁ##›äöùCË´ÁœÿkÙϳf“Ú4Dè݇Ï)[©Ô¨­û”ˆ È–"#ÇÔv}ÓR‚4ߢ”똟oCËqÁÝ7êm„u~?/Lè]˜à.LøyÁ]è]pÜ…ŸÜ…ÞwÁ]p~^pz÷ú9 ðάSŽG-À»‡½ã¾?n€0|ß„0÷Lp÷Oï z&¸ ~^˜Ð»°ÎÏ} üè¾qº9ÛU„u î„VF7F#é˜JÒ9Ù=m«Í*c¦0¸W”¤cƈ»Æ;ùûÄ&Ó¶å®[d»D· Þ"R¸ùvÒÜXÂÚYïxáé]6B$ *²"Ù‚1VÍ\öÁ¹K²ÈÇØ¥ oVÍråvÒÞXÂÚ›»Äáá'Þ’$1!ŽÁ).cJE3­Ê\–Fñó2G%…²˜£ã<Æ*¸{›»¬s™ûˆÞÏË3åå¤IÉÈcÓm¡n§WæËì‚»ówÉ*Ããÿ‘[ ÜÕåˆZÒ Ç¡nA"åk¸Kc4Ø5ÜÇ».&µ wëw«FþFܵKl¹«\IaÕr§år-wIØõ1'ÜU§5+Üñ›`Œœ}Ë~ž-×ûù1l¶ìÞÕVIÏ]vÿڤ¼Po#‘Ú˜â¬ô#±Y[f•dA²¤ÊrÍ*\°²Üu)h+ò¶äÝ)[×?ü k·üݳ& i²žV˜à.Lp&òwaBïÂwa‚»0‘¿ z÷ ûöÛo»8û½©eÃ$ß~{›ç6u}Pp×^ÕÛv½~Ì}ûížÛnûö[mêú ðóšËºkÕ÷ˆsý}Õ®Ûû:OØë»®Ï ½k/ëëßO¹Ãöýë°©\ÏØë×éwÍe=6Å#V{ìîoåæº¿¡_äæ»ûú ðóÚËú OXm5rÌõÀ¦r#m¸{ì…Þµ—u„',n$qtKÝ"m¹{ìwíeíÖ* 8úâƒÙÕû‘{yù–nn[¹-÷ÖnÀðñ…Ÿwõ²®ÀwÑ$ª3âF½h®6Žs·[}|èVYo¼Å>*/w»+Ãx†‡H(ôî ÷áòYà‚~Ô¹cî\ïÍ0©o9:/s½Í*üëÝg¢Öí¶¶¼Ù9÷E¥j» ºPkxàF‡X[-¸Ûq¯µ·îž[z¡[-Šs½9£[¾É´/sˉ*“iϨÍû2m“¯gÜw6ÛÌõÇŒZ¸oÀmìËç£8O„^;•Ymu|Ô‹Õ0ão í×¹WëgÃêµù{ŽÂšôÕl*[ÂçKAïö[гãn€'NfâŽ,òaÅñƒc›Vw`s€‚»ö²ÆÙ'VÈßãâ‚Ö?2£¤jóÁ•&Á ðÜevÉ«GÞ†Ü'TègÓê¿S•„wÓ‰Ði'3o±€3¦o¿ìyý„ îöIÖçÃÁÕÎ|tCà’ðà`“°Ÿ…”‘ Èßrû¤Êó  tÐqE&ÓÐQäí¡\å³êjcî;êÀ]R½ÞœÂò‰wª¾^h.M«-BÕÇYÏ@1ÁÀª+–9ãW—Ïq·Ða¡ÒXV„å:pü(}gÜ…Þá¢8´¸Ú… Õ/ëãØ—‘ö 9÷ ú¹ëã4k~òÉÂ… ãà§š¶¹^³eÝ.'L°ãnŸfáê|#aÃëqÓ¸Í8Ãí î¶Ü«[4Yµ3ÛoÈ]^Ýùú³ã^í Û/¸ÛpéÛ?{6ãîMÙq÷ØŠü]sY[?ûÛÙîÚ·]®þö“o;Á3öÛO®Ï ½k.ëžÅ7¹k\±ç£Ù{^¿4Øöúž®Ï îªÝfõPóµÚnžÚT^m·ës€‚»Æîþä£-ÎÌI›H1bÄ–»iSµ[ºµøã$LŽipS×çEþî÷&úËîÂwa‚»0Á]˜à.Lp&¸ Ü… îÂ|‹ûÊà+Ì9 µ¥Â:·®îS…ù¡M ˜(Ìíÿ¬I+©ËIEND®B`‚nsis-3.11/Contrib/Modern UI/images/screen2.png000077500000000000000000000440051477201124000210540ustar00rootroot00000000000000‰PNG  IHDR÷‰?íÁbKGDÿÿÿ ½§“ IDATxÚì]ixTUš~Ïrï­JH ÙDL»! ‹ƒ-¢­€˜D$±m7ZÒ‚ÑfqÔq•Т€MO«@P Ñ ãÒ¶ H !„ ÝŠlY+$B*•ª»œùq«n* Lp˜§ð¾?òÔ­s¾s¿úêÞ÷|ç=_Ý!‚PPð8lذaÃÆy‹U«ž>$Ë›üž249,,<**ÚŽ” 6lœ_hnnjkk=tøh0×ûY¾ àñ´‘#®üeæå—À³ãeÆ çt]PUuìË/vWì«4‰ž!LŠ¿æWc/ßîöø|ªÛ£··{ìÙ°aÃÆù‚g¨“ɲêüþ`ݧc=0th’Iñ õMMÍ>Ÿ¯µÕm‡Ì† 6Î/„‡‡Ê²å¸xX<0¶µí$2{ö¿]3qâUF65µ56žpŸr{<ª,6lü q°¶ºÞÕ|¶Vq±QÃ’¬ÃþÑÒOH”ÃÃC[šÔ`OR¶l8ÛAM¿cİ”Ð~¡11ÑÑaý|ß§Ÿ}Æ Šljj­>Öxâ„ÂÛ°aãgŠ#®šzWóÝ·ä¤Jæ¼O{“š¦Wì=ºnS €!±‰¢É­­îqY££)¥}Ä0Œšš¦ßîíÚÜàÐìnJÙ²aæì)bH¬–…þ€á¯“!@÷” ¼º™q½µzÑ;gG…F{;|€ €›§q»ÝêpÈÁçæœ2jø<'„îaŒÈÌnIS û‚°aÃÆ†zWsÁíyC†D{ÚU ¯’Fjj|Áíy«þ³ø’ä&ÅGF„µ»½}?udDظ¬Q;¿Ýëp„¸ruδ+Ú[:PqT÷úú2û{=€œiW”üqµüàGu»ýY; +rˉŽnu5²ŒÆcÿÍœõ ©1ÑÃI²Q_s¸®¦Ú6DÓ¹aû²°aÃÆ…„„øï'X!Pš¨ DE†kš~¶ƒDE†#¨¾Qoï>!9RíI5Ü!I£„HºèöBn÷I­†&ÔŽ¢y­AZNªáŽÎ\Þ«y©D¬óQøŽø:ãš”¤„ñ ƒnP.S°ð°´”‹/ûî@yScrD·_TÙ°aÃÆy×ÉÐPål­Ün/?…úÐÒêî£àÓeöŽÎA¯×š&ôv¦ëyO,ðçGF4Í0±^üú?^P<·@ïðúTƒè†5ˆWóA,ÏX'_Kœücï®+¦ŽŒi„÷X¹: ¿ÚÚ¡z››â9ñã%¹3*v~ì“BuÛ—… 6.˜i¸¥z÷Ѫ‹†_ÖÞ²åÝ3›NŸ>­‹ðD÷i BõÕ£}x´À¤ä„?Ýu‡è©¿Y¿Ál:¾x ݆ÞÍ?Ë”€0N«þ#b¤9 ¦ÃÕ°c玸Ô_´5»:Ü^9,·ëøñßLËO¸«ª2,i´¦ ‚€B”¯Ï3aÅ ×ǘ㗯ërø¿ ñ£…÷¯ÅoûÜ¿o(_—¿¨lòs›îN7+×]ÿäö›Û8g>zâŽ×1ïßÓµÿvBº".-ìÚíÿŠÊu×oIذäúAgå|ãG ߨ×éÕ¤g­¦ 8–.),:@!rÛ8gDß\²—fç'/Ù8wÁ$DÓ®$ONs—ë€öZ !¦ 5ì¢ág8ÝÁö[Ò·FÍc]5 tæ'öÖNJNxã–æá=›6›À§y™ª€R C7Lã(!”ÆEõɆE„œRÛ“²2§¾ÂÝÑÖ¡¹%êp²þ„" œltp$ PO •q0Y^@¸ê«QQsàDn|´À¾o¶“}9-Š3^ëËNeHˆSqrÍ{ξ8JHò‡Ôª³ð~!²âc”D wÊ’ª„´¬Y[>»_fv¿š½àÝámx&×ÏÄÂpwv;#ƒ¿qíGXùïÙ½Ï ®mKæ¼\EÈð%Láný4ìè–›2¤Ã!…œ"mÞëE7ÆZiƒn~®N«Â":û­²v¿º¸æâYñéjü´ùâü„=;Ÿ;² DUµ³µ’$€ñΊ]ï«.oõäœ#H—×T•N ÓÚó^ZÞIô7çÝóN±Eñµ æЉнBhΘ BPB¹<…á€@xÜ­ßK'jݼ¹©q¤Æœòn]¨ž&£å€ »¥£Å£5´Gê•ìËZb"0õÑt¬ŠQ]'I±†.×!‡ëøˆ˜¾ÔåpêçÆ©tî¾8˜+%N0ÿIã$ðœw)zÒ ]ƒ¡ÈÝ+„é?å}©Ú³ç}`8ë'1%`ÄÂ%Îy¹Š3ò„R‰ôz—îy}ÎËû1ªpMQv,tahœ!ša¨"[SMǪÉœ@„á£îz:]Ðzgw?m¶°sùŸ9 Cü„ûÀÌÇ--Þ0 ¸©þ°îÜY§Íå_Ùoõ4EnÝ˺B… € ¦°0qÅ ‹è-Н), öº€K €Ä¡V.O)çL@DÕ´èj˜ÃàÜãR]mÂkÐ~í†Có¹ZZšÚ;ˆNH» >…êNñ£[Mæ,h#\‡`ÛW™—“úНöd_ueqŒ [ÏZ¶ŸÙO}>{”iW_öpþÊýÖµšÂ ê<|ÎÛÏÜì^=uAIÎCs/[¹ŸˆìK °zêäämÛ¶€is×MÔ[.€R“ÓY`]E9£þé‰RÖón ·öâU§ÿBLúýu?TJ©zñÎÜEö‹¥™]Fe9/mÏ©YøÛeþ±{»M]ü©”›ž,ÊŽ…N¡ƒ€ŒŠ÷^½Ã\ûlnl7Ë„¡Ã…xïÑ¢q¥ó†Ðôˆ'ʺû‰ÕS”ä¼TZÀõÁ¼Y¯`îÚ¢)غxÖÒý KˆQ½Ù†ÍòtÝÐtýìí¨•Œ›¤\™rìXC¯6ƒ²f&Ý3Î̯T5„,T{ŸG ç$¯Xi½õN—+Ahª¾1ebìs3·µÖ„€Òð0&…R꤂F˜Ð:> !¬]UÛ}F»·×8éÖ8§ŒÑ ‹¯)ÃÓGVïÜûÀÈÄÝ_T¦çæˆ÷J¾Úû»Ñ#—,šµŒÜ¿yû¤XWÙ¼;@Ÿþª £þý…ù¯TÎx¶´0C ¡lÞ+r|Û#Τ¢hÒc·¾ÿeA&#J>ak¿,Ãß*D¦Œ=Øz(yC郌ÚÒÅùE³Š’ÊLërá[¹;eŒ³>a<ˆÇ{æè¬{kÃ{‹zx•Ûðì+•é…k—gÇ ¼lkœ‘ñÂòÚÉóßë”z¨ÿß,oÓü9ƒªºÐÏ4¡’ÞÞQ)EæÖT!ÐIóÎ$W[­¦¶+ËÜ<‡¦ª$I×!` àweÛ,Š·¤›×¦d Â& ©*YöËÀ&ÍÉœ>HDDd¨ÚÿÄIehÿ(%$*DR|â”#dpÍ8ðåú«FæKDáFSñ(*ãÊAe¡ µ{‘6>>=)ÑŸw•ÖoLŸ¸ePÒ±¹ºÉÇö3âc)W$ÎüZ¹¨;²›ââˆCQ$*1¿åªÞC)ºwB‘µÄ„þ“É’"3€ujîœÉ“˜9I€QäW ¥’Ätr°d©%D’zfÔÃ@kc¯^zpÓüïnY^¼èWÅbÔÛ‹òõ0ìu ‚fÐËS {|:¸<`Ø/'g¬¨*Þñõ‚1@rÆ0÷í×ãQÑÝöÊ_òv,»bQéæ Åùw5ž1ž~?¤M眾 s!c œs fÂü…¾bc³ü9TltU={ÅF¢ìÁ¿¡TU©Ÿ‘å;[…9 jÒ3g€9¾oQü³g_´zµEô+'M5ˆÎ¡LZþÊIS±¡`œ›õ²ÒoL꥟žìP;˜“ ‡,ö´ó¶cøèŒ°Ô–“íaáý‰á>ÕÚvéÀˆ~ýú K‚ÔרsMþÃË+3Ú0&^” ü½®ö–!£ïk]LÈ%)DÀuõ\¾D–:w_SF ¡v©$@ö¬˜ì(~'hó–Ë<ˆP»ZH•p‰û#J™Ôe³«a 5¹w¯Øà[×Óö}ñýw¾úì“Ç®º½»ao—…Ÿ: ãr/,Ÿ|Q@‘<ä Є*+Ý.-ÿéesUâî~4}ÛS´˜¤,!´ÓÆÓï'·Ö.ŠÌäÀôÄ%p•)2…ÜõÐÆ?_°±•ùs—Ëk†×«¸öš‘©©c{vxõµ5½Í´ €$K–¸¬ËkÚ™XÞj5…Y’Lº7 b†‚RøÉv‹â¿»g–ù7õµѯ¸v²B×ýk I– 1+HÌ\žHrçlÆŒs¸ô£-j¬ÓÉ”KåöÂÊC-­§&Õìp:Ó}šÞÜä9ÕLnœ0B–%¼9q5ÝCÈ´ø8Ê.›8+'¦E0g¿¡Ã²°±º.ööÉ™xò/{jóG^v|ëšÈz(7CCfŠ·ß\¹ywþã×*Lòÿî‹$Ž¿!ó…'ж–ç?v]Èñ÷>Ž%kòà`)EV¤.¢ c²"YæL¶`üÄ™ØøÖKo½úîê6®ÛÜ<>”+ܯ¤Ê‰Ÿ^±1[‡L¸!óùž^í|áy,ü×q#¦æf¬Ü«^7iXÐqºaMúfù…Ë ðÍó—Ý÷6™ùZÕÂ1†\9e4žþªü«¯W\Åëß"\¨$ßv×<µ&/Ñü ÌHåŠô¢/Ü{ô¶5ù ŽÙƒ¬qñaS2ñdχuõ“1‡k(»¾ýäo@:à/±õ»*×?ýÔnܺtJe\–íÿ6cã‚‚¦éÖà ¦LžÙ­µlû[½>º€iz7ÅAµu†q¦ÅAg+ùö®=6Žã¼ËÇ-Êz™z[Îi7’LTêÚ©šËÒ±ï*$H (â6Ì‹Y-ÒwQQ§¾½  aÀ Ö ¯0àN¦5‚¼ ‘oÙg»0‚Ò6í˜âzD–ÙÄR,»"ENÿ˜ÝÙÝÙ×Ýñnïøý ,¨½Ù™ofwûÛo¿ù¦âqÝcó×W»$ ЙÿÉKÅ¿ñXÆð½ñXæÀs”è‡#YøÄàÊŠî™ën²¼´F¼|<ÞDWÖñØæÏ ÝWþ÷ŸžÝÛº¡ó®ÛoùÛå3/~ÿûOýùŸ‘.žûÅùóW?uïomÞ¼$ €Ði ‘óÞ"äð-» ûÆïÿÔ£wíº{WlÃMwöíø‡ÿxù/òÏ?ûö_ú£OŽ<üÌ>´6ß<ôÕ׿³|ð 9ù¬×‡:º<ÿì[w~éÏ>ùÏ@ÈÝÊÔßõ\ºÖ¹‰ÍŽ®x<¦{j¸=ñ. @èèŠÅâíÝÿ×o_»ý‰Ïù&}Œ=9UùÄMË7lФËa©39èØÐ¶ìפÈ*éÜü Où®ä®'_Hï–º¶?üÄ#_yúÑôÓä· ÿòÜçöŠ´¼þE «+ïJ˜½·øÁòž›7Âm¿ð·n?öÀþ€GÆ~ô…;–nظ%¶Ôw ãñ|]ò¹g+C»aÛ¦MqNÊŸ;7ÿJáÓG¾„Ü­¼ø­{;Wzö=úü³o;Æó6›_-=üBæéGxZ÷èèêîìøïñ?§ïlŸûѱ;–nØÜ{CY!.Dý<6«K×¼âå…¿vu¯@œÝ†«+„ÿüªV^V¥VV -ßAé7ì‹ëud•î ÿ}í‘Çl5¼öÈcw>ÿJŒ‰7ñx7åó•å% ùå¿’{|Ó–-º‡ê ÿõ•Ë?yååÅëË{n½åæ-›»–¤Þ»úîâ{7Ü(Ýuä77n¼É¼Âˆ1LZZ¼pö=ØvÛž­q€+‹g—6ïë퀫çß¹x¥g×Þž+‹óçõLi÷~lç&úçÕwßXü€£@£V˜í¡%7õöíía…-{,Xqõü;¯èǶ,ÿêÌ…_–}·mŽ NÄÕwßXü nýÕiÕµËgϼ¯§82 Åâ.•_»|öÌû`Z¢[È osÏ®½´ÏKWß=UoÎ2–š—lƒ)´ÜfgßæØ¯çÏò ¨»·Å+òà_]{â{§ÒFTMÏ®ƒ½=H QqÙ _¾>(|ã¹£üÞGW¯ÀþÁïËüã?ý—í,ØÐÓ3õã—ò_y *ÿúÓ÷õÑà÷ÇïðmôÕW®+ÕŽŽ7ççï¿~ü™á'ö¬./wttH†+Úý…€Y¹¾ººÚÑÝý¦váNRÿÊ•÷/£ø÷ºÇ†JU]”øöÞßè¡+—ßÿÅÅ‹þòò ­ÛzÞy¤gã¦s!ö D’$B@‚ØÞ[îaŽÂÞÝ}̈Xòö­ô¯ÞÝ+‡oÙwh‹ÀvAagI˞؞Ø#Ó«¨Þ¹ÿö®£'2ÌiU¬·ïPoã}ŽrZ(´9Ö»{cÈš½L²íܶûÀ6k³úùŽïºõ¶1ä‚(zæuóØ¥¥ëðÝïý[ˆ£âbÌM|}•С/¿òfðJ:@Ò=6D€«×V:n„ÕŽN²à ¯®®~´Ú×V€Æ‰ûúÚÑ Ý±n.qËIÛwìØ±c;ù’ćé²_²¦õÑýôˆöa‹nýû„ÔÙ‹a~:tØ´3þgVÛ¹}Sأμ£@œ±<‘ëîÅÌ<6›¶lëêÄ»Ꮋý.æ4@´9RàÕŸ½n>?%‰IWðXNã𡃩ƒ4bïÀ{àì¹ üC˜ð,]°ï–=îØK“á|öÁÃ/BnÃX‘³DOýá‰Üg#ïø™ëfÄœ@¨åQË×ê¬ñ(¥_á¶ÿZnË}¯×Ëþo´áú(p°2÷«ãh¶Ã©¶\ê³ï0°¿ÏøŠ§–wmÅ·#Þ´DK w8GŽÖœïpAÇÙíñæÞñ¦³¼Oלºba"e»PË£–oU-ä6òcQçMâÇÃÞ$æh±¨ ÅòF¾øÜÚÁ<6.TâÞW_Z*e‡÷=G¾}¬fœƒu¼é,ï×5Og[”Y¾ƒ£eÝÿëhD|[ˉ[hó³ôþ¾„¾+Ñ×Oÿ˜×êÓHb?½ÑÊs¶ µÓ“e”GëÚAujÔÞÁµÆê;Ò?<œ€òäi•V’yŽ|ûØ€qn‚wH—´éY²|,¯( Ë*¥ÛVUEY#–Ï7‰ågç5… Í•]*Ïi‰†\ÑÙ )Êí@:Ut¤oh8år93XÈ‚ÙpçhŽsˆ®œÌfÊï—3I)ÓZ¾z–W…’Ïç\ÏçUUm -/Íúq“Ù"¤ö׉âM¹WX·×†f£šŽ$††9ç÷Qy ÏQÛŒs˜®ÉE燇ÑS‘×ôÈòÕ³|>Ÿ÷ßBˆ.è[Ùc#ŸÐ’΋ZÍ¥KšÐ=#pÔÝ+dç·òäi-üc(Ô“.0ÁUÓb€Ž£yÉûŸ#ß>Öf^UÞ¹5á»F¹ÞFöµ^]Èò~„UwÞô/Ï\1@E}½½7õØ$F¦ée]Î$M¤VJ¾K¹È Œé^«± õTêôJëUabdœ>‡Ê™dNÎ>æ@eW5?1 4*0¼ØncVM‹þ DU"’pŽ|ûX›y᮸“Ô–Ñ)Õ¼ts²'Gêîôëššã»È,I %êqu­%Z0Æf­þ…бQU•w¨¯Þ¡ž hÎÜW—0pkÄAÀxùP16â…!‚C¸¨‹õ^ñò®q–ú½âåÅ-5ñîHÀÙa.SÙ|âåƒôÑüzÅØ¸g8.æÚ5ç®%0^>2´îÉò>VQ–§ª^UÕð\_Ó˜4aîk3àŒ¤Œü"¾Œ¤ èŠi ü¹Ò`yY– …BHŽÜb8ÞÙ™·c ¼Dûû囎 ˜:5±Ð¶…dù6ÔïÕ°<˜¤tME}p®Ïçó5Dà´?ËëÁ Ñ¡Qf‰i”ñdùV¥žPÐJiêiì”u5׌VÈòHñ5±Óoâ„AérÑeÖJÓ`Nð7fès ºÌi‰F::o@–_w_–k#¬ÞÛ'ÃÍ Ë›‚Øž@F.òBÞáÒÑ"|"Š˜S¹ò†ãÄî­fÿÏ©†“ÅËÏb$jaYÕ,ô;ûû6#N)K›¢ß-^+®¬¬a-púÔ,Ò¢ÝY>â¨Ë[E}X Ëä©§Ö±¬VJKÉLÙºÎÎè ”.i™vÌg9:8uÔœn::èFô¶t[ºk&•ͦXFÃ_#ÊÚ82í2-ß´×>Á¾œI:Í)g’ÉLÙê±JfÊFÿLJ‘}íÍòÑG=YžŠzk›–by“8ˆ6dù–@Y>xýQôØÈEázÕºVoäB®ËE ~×ù¼¿/¡“jyN3“ úä®5‰yÁöÞÁ9¬zݽ®†¬3…@Dƒå[McùHjy«3ÃòÉÕªÕ‰Å<=Ôø;;_¢Üš=*tª¤ûk¼¿¼j¥´M|sÏRˆst"ÈòÈòž5˲̢q¢Åòaï]³öKù.efúžœå êvRëðRÕÌÿÙŠåe„Ùö#FããåÛ„åUUï‹gØ{5õ ,ߨxy­”ëæXJs IDAT›/M %¨€.—©² Ën'är8Süן’fat \.sš]7‘îôtÊ Üñ5?u“<ÖÍE ÚCË·|X^aþsaÌ{ÕõÓƒ"§åG-!ƒLÕ2‡F•K51':ûxip¸+Yʲ:›ñ4°|ïtwÊ»»ã¹*˜½Ìœ@4oé½ß:SD+²|kÁŸå ÉBœÛ`×lÍj–×9œËº›Ì”![ái3|’+eø¿å"ubëµäTàÖÔ9>éñ1>éšÓo]Ì广4;(äê”goé¬N$‰ÅÞ©ýAýòìHVíd‘~íÅò-–—efff …Ë*I’$D,¢þ*çd³©…è«àùiÇgUÓ:Sóò_-•°£-‡LOO‹?ÙZ¾êúúQ¸†ø²fS|õFá¢,쀗½Åþ`þgßÞzd±ˆ¹‹ A#ýòíÃò¼OÆê QòÁú+~? ^~š!°_ÞV¡‚9)jù*Yž.ç-˲ªª’Te™ùè½µv úÕH@ÿx\ˇÕõYYÞ±UU5ŸÏ Y–Ü„äeY–eÙ±êS¸úffføo°~kHÕBô-ƒÈ-…@ Ë·+ËS/ Í%ÉøÈ²L=]Š> ß‹çÒ€öúm+FÍÌÌäóÞ늴µ<±®~ù@,LÅ5ýâJU6%tîK)\Éý-Ì,/¬ff†;\¦4òÔ3io•Ódyµ/Òõ¡ú‚,@ –G-ï¼Ç@!„Poèu$É)Û %NýøŽhà#vüæÊÒ7 9¼–:pjyÔòœr7<æüwQ›']Q/ïäzªÓ…ù&Ý]:: …](|`` Ytådydy»GÅÜÃÖ{Òõ»ªª„X|)Âï®üŠQ|mª*»Q<›l%ñ®ÿ:åJC–G å‘å]XÞ–a†êwF©cñ?‡'O£þwV› :™ÖX–óê(¼×/\,_7–g|­¸<ÊéÜœ&—©§ÅYu>Ÿwò;UîF$¾­Þƒ,@ Z’å#H[ Ç׿LT·Räe÷ÉЈuU)újªoI*œ¦C KRr½áywË“CÝ÷Ôãïžç@ üјxùà,¯D†ñí¬*I! @å¼wf`#ÔrffFUUö Ëya<¥,Ët•(cJ­›%UÅË#ÔòÈòž, H’,žŸé*ÜRO=ãwà<ïv~§âyfÔ™åQË#ˆv`ùær™w›‘3Ìÿ®¯HQU{„ -OÝëÖ¬ô@½öÔeoÄÅãwdyÑ&,ßDRó×é×SÐ@6!¬_eu§ñÀÄ»·çY@Ô éØ±§Æ¾•?ñDáÛßþZSƒå•¦ÝÓx}\$)ÄËXIáݧù ž÷*L%œ©…ZzŠ@ Ú_übžr{ôµ|³8!”5õØÐ,óŽÕ_í%Ý¢kPË#ÔòkËõUkùƵ<hK-¯4PÌ*‘ß"D{jùµÒõ¨åjù(hy¥!žzÔòµ|óµ|=¿E.jyÑÆZ^ÁUîQVJ§KZñq¨£y-rÆÛ‰å‘è×ìuÁ¸”µRZŠðuÝÈ»®Áwxðæª3¬‰„® hIk=ÎÛŽåV¢ž¨ôgÆTu,ã# ’¶CbdzOl{¢ýX¾z]/I…Vü×€«D>11{ª¤i¥S£Ù“” ´RZ¢È©6uCÿÖJét©”cL¨9‰;RPO.—¦ÿ×Ó‹±ýÜk‹ •ŽgÊåLR’èÿXñtIÓËØíñjÎV¹­>k[&æÆÒ\£`?̦M{Å<š3tÍsøz“™²SŸšUIÎ3'<é‚.59®Û¯Û•#è¿¡s<6§mÃåz ²<.Cm¡w²?süød¥(Óû-™é¯BÈÂÄì ó~¤(gæŽBè!Æ5BQ”Eõ”g÷RÉŽúÇ©’fì'ô'a“‰‘ñ‰Tjbé-—œ;I›Yžš…Ùyï»G›Ÿ…ÑACZ–ç4¡=ÍÙŸ }ý0:(åT¹X”ÝÚeF&††Så9Mh†s|œÅ¼›3Ôâà¨>®9«åÜFÛPˆOÖ„ó’} ¼›X£+ÇûÔxÿê1\ÁD–wp´R³…ˆu†ÔÄ1P”k~Ì !äè”Ø™P³öbîÍi¥trrxÁS¯Õ 4÷4Ö¼ª^¯£Àò¡ŽB¢‚§¯¿¬» ´Ó“åìQ˜lÑNO–]ý@×z|¡NRu&l‘îäj®¶ÊµR®¤ÈE²0‘bzÐ]©éÝ h†³˜wsLœºµÛ $úúË“§5¿Óü¤{Ôê8 ¶7Qß+Çü€×Û©¯ýÂ[O,ï]ÐÓ\ÿMqabv¾•öWto0Ý!ŸëOy8ør’”SõxA&©») 2=’¶˜9™”¤t)aÔ\Íg0gå‰>ÐÛON$ø¶4§‘ÉÉᅢ̔§ŽbÍ:Ù¯ÿ&j¯A‹ý`ÏÓì¤Û~µ×,="ƒMÔïÊqóà×QllÎÿTFàvÂÜW¥I3f×/Zoî«VJ‡q õCà•‘šûZ #Ë#„º"Éò¡ Ôf<¢™žÆQ@à•S ¢©å«ƒ‚žzhc–tàDÜÔJ­a²É’a"],Ç3Øêײ|»°<ýš`módÙŽ­Û=©ægi貂A'q”¯æÖ> ÂÖãigŸrÏ¥- á=\ÖZkzÚ5‹ŽÛ(šq6Ü¡öcyÀPËÿoïì£Û*ÏÿH6¥-‰ùHË$LÜ^á4X@`<¸IµãÌOºîbÊN³ÓÙÁ®Û$ý€©ÏÐPg˜ÓBϦiS{vËB÷ÐMCjbJbk>Bäà&¸º¬Ó$-%‡èî×’e}Øú¸º’®~¿££c_ßûÞ÷¾¯ô»ÝûØpL­ceTÙ,uÐ'®²ˆ†Ü--¾¡Š.}nwVTiÜá×ï’],[0¹\Ó"j'¤Lè&‡¯:çEoi‚s*Lå €¸Þ¸X>V«$*jÅ 1£ Eµ¶Nõ±kc%PHK¼­Ž¦ý^óiûwÖ5ˆ~÷Žws“«¡!ÎæIÖÞš¹o†„ T1KäÔ2yŽ‹[Lí¬ -ò¶Ú"ê´Å©LóÙÔkdzm±ÈÑ k7Ʊ$VËl¶Òo3V‘‹šñPÏ£ûs¢ãOÔ ±Éa½qDfJ¶¢VŒ &ô×é ‚šŽS+‘BZU›BAñôXils5möª}jâmž|í­¸}K/é”L³‚É2WÏ€:S±9¥±­e²~Œ·»½¥­QI¬2Ý´öEݵÍÕ"Ý^QĩĘñè‹y, Ö2›±ô›Ä¬"wƃK⤋.O6}ÃøƒÊ$¶'x³.–'c6…™’­¨•ø_e¶ÚX‰ÒŠKU]K{µ£ÉÕ|ïFožBí­x}K7é”L³Ä›a¸ªêtÍ{»Û[ꪒ[ß *ꀫnƒÓ×íuЧ§Íf¨°–àˆÍÜ“J¿I¬*rñg|–ÃŒ.O¹aüAo«Í¶Ñé7¹¼M!Xž¸>C¤ZQ+©z[™è÷†·$Me¥ UâUÌ¥s¶˜_×ü¤ä“N=;e@õvûœŠRÓàëöª®º*³g<ÛõÂbÂ$-m¦ß‡[P–Gô†’NE­˜ ¯•T9ªdkW);ÂßüÑ›§Y{+²o“MM¶õ•p"ǕИ‡'Õcçš\mÊlÃUµ¡ÃW]íÓ#Ô$+Ó)5 ²q£¯¡F¥¦Aº»ƒ©ŠY+¬E¿"&8Ë3ÎTt¹¸KfèÏl¯½¸ƒ U›²qÖ).0Ë‹EŒ1þäë[š¶¦Éài‡""m-¶j[»»Ãßærès·´¸£$Ûæ²EþU nÛÒ"âÔëµ›MD¤¥O«up¦O+'û¡$jóM}Ýzƒ= _GÄÝáß’xヵ“㤔Û6õˆ8l}3½í£vºc¦1ßQÓ›Á ÄÝáו†K©ip»%X”=jåª-Á±&·Lz¤a‹¢ÿؾÍé×;=ã±Î¾SÇ xÃ&4˱fª'|ÔªD$ÆŒG7³?‰¼öb‚ž±Ùèô›]U'¼Z™½`D_è¡}þU+3ÉŽ‹À`r¼Z™iÎDI¾»= ÉcÈnyá €¨Dþc'ÀòÄõXÑ–/d˧/ztX>§-/F\j €ås×òFÅõX>§-èË[ÜòÂ¥–€å­myâzÀòayDXÞâ–8€å­myâzÀòayDXÞâ–8€å­myâzÀòayDXÞâ–Š–·¶å…bg€å­my£âz,oqÑ£{Àòy zâzÀòÖ÷¢,oq©!zÀò7š'¡tXž¸Ë#zÀòXÞÑ ÀòÄõÄõ€å=–·®èÑ=`ù<=q=`yâzDX¾°EÏH–ÏÑ×–'®Gô€å [ô ,–Ï‚â±|²¢'®,O\èË#zÀòX>ÇE/X°snÏáÁí{û_ö©Ë\Êšå+o(›Å\Æ€XËç”è“&Ðv:¶ükí<àû|¥ãÅGÖ~aÅ¢¾W–í±‡Žã @,åóØò½¯ïxvÏ¿4Ußâú”Ýn/**ºõzGõ‹nû¬ó§Ï‘Õ‹“kQí¬]'[v4*Ì ±¨µ¡¦j9–ÇòX^äeŸZ±ä*=EóäГï9sþƒ>¼0ÖþÊ&»Ýn³Ù–¹”—}±’(Þîv·Sñ¶:ÚBþºNUDz|Î-š¦iþiZשзÕÑäêÓ—øª[½c‰Ò¸¥ÃíîðkÚ´”~OÓ@¦išÖ×Ò¾1VSJ™«g@QwmsµH·WDÔq*¼.ËóÕ+–_æR^üž‹¿}^ÃéßžþýïÞ~ÿßÿÍf·ÛZæšæ\‡Fotúu«ƒ>i¯Ö:šzzTq7Ô(""JMƒ»g@U}îŽ UÁ%íÝÞè%ñº\M§[ß]ä†Uu-¾AUÔWݧ¯Û+ê ÏU†åËcy,/kV”¿øª_åÝ Ýw/ºÇ>Rü`åÃ_,ÿ¢Ýn·Ùì¿ÜwtÍŠòpçú5Mów¸u›‡/œdS•éǯ8e@õvûœŠRÓàëöª®º*^€å±<–—•7”õ¼rü%ßÝnŸ{ñÜ¿.ÿr£ï®ï*ùX‰Ífï{ýíg_:²ò†²(­6îè“j= ®”¹zš6Ç ÅÕ]ÛzZêªÂÖ‰»dò³Â€:‹Ñcl¨Ô4ÈÆ¾†E”šéî&_AÖ¯—÷ úÜ·üü+æn½÷Ο> È^T}Ó"=¯Gñ}¯¿ýä ¯n½÷ÎØwÀVmòwÔ:lµþúO¶P\¿EOì4Mþº£JDÂÖiéÓb/¥±­ÅVmkwwøã_m_kÃ2鑆-Šþcû6§ËC`kn¾óذþ»[·Ú‰å Dôš–ô­ª€ÖûÚñæGž^³¢ü/—]³Ì¥8:ôË}GŸ}éÈÖ{ï\uÓgìvã ;|õ«èn'cC,Ÿv»muÅâ}?ºû–ë¯þ_¿zíÆ»¾÷ÓžƒË¯SöýèîÕ‹Q<@!gl°|®)Þ#ò@j­Ì¿bîÕKï¨^Ê€ä Äò…iyÀòXË–ÇòX°<–Çò€å–,X°<`yÀòX°<–Çò€å±<–,å±<`yÀò€åË–,€å±<–,å±<`y,åËcy,æ`Âô$iy”»–?}æÜžÃƒÛ÷ö¿ìS—¹”5+ÊWÞP6ÿйŒ/±<±|~[>Ðv:¶ükýjÿ›·U”>ÿà?_yuïÁ·–í±‡ŽC €å­dyόϴ|ïkÇ·>óü¯+ÿÛ—–¯(/½äc]yý§ÿ¹±æñ¯×ýÏç÷÷¾v¼@ß@jgmm§ª?§ÙˆýAl`®å=IZ>[¢ô$óœòY-/-ú̹æGžþŠÏ,/_h·}néÕ_ª¹¡ù‘§OŸ9Z¿Ö¦Óê5V¦-`¸°|&-ïIFñºÒ(qøÙ%/-¿çð`ÍŸŽV¼Ý^d·Û«n\´fùµ{†Ößáïp»;üÚ¦*ÞacyO2Š·~¶Ä]è–ß¾·¿æF%¦âõçºe×lßÛŸP ©vÖNÆøjgm«W_0Im§:¹fgkøÇµs]SOO“cr`‹á §Z™þBí¬­mm­Õÿ0¹Rh÷³ì7<ø þ¹UäA†vïmÞÙ`ã“TÙÈÀæÚéK¢(rIÌa‘ÈumÁq=\ÇnÜÇ/(H˧ à¬+ÛŠO×ò/ûÔ?ûÌ‚xŠ·ÛíË\Ê˾“J™«g@QwmsµH·WDÔq*"JãM§ÏÕ´Ù+"ÒÓ4P§/iiߨ©ŠÒ¸Eÿp íhTB-†-T[M®>MÓ4‡¯:ÂT=>çMëki¯^'[Bm&²ßXǽUøÛZÚ»½""Þîö–¶©ÎN5¾©J¼­Ž6½öuj¨“šæï¦uªx£Ž(zIÌa‰×ψáŠî@¨{€åyžå—¹”ÿùC<ÅÛíöWÞZæRfl£ª®Å7¨Š:àªÛàôu{Eô¹Ê”𰳺]|ƒªˆ¸;6è²Qœî„2΃¾à&JMƒ{R´AÜ 5Šˆât‡~ˆw“ÚoôVGÙÞíÕ%_7]˜¡ÆÕAŸ´Wë8šzzÔP'õþ÷ ¨ÑG4ó1&ÕÏØv°<´üšå»^Wã)Þn·ÿrß[kV”Ï܈â”ÕÛís*JMƒ¯Û«¸êªDí¬ulkðëqe‡Û´ñHm¿³o¥k>†ä#Œï×Bd |žµŸ™î`y,Ÿ_–_yCÙ ‡ÞÞ×"¦âû^|ö¥#+o(›Åò5 ²q£¯¡F¥¦Aº»Å©„ÅÚ"ê®m=3l¯‡œ1*e®žÉô‰ºk[ÏŒ‚ŒñgÞop§Së̶UÕ†_uµo†È8¬·1ü¬÷?úˆâcÌa‰×Ϩá,ÏË‹ˆÌ¿bîÖ{ï|Úë{éÈ;ÑŠò…W·Þ{gø°µý‹¾é r¥LzDwR&í>g"¢4¶¹š6›Íf[7àŠS+m-íÕ_3N-T6ù;|ÕzÂÕ—HlšÈ~•Æ-“­×Ih«šwP±q’W¡ÞN}9Ú3Ù¬c[ƒSUø:Á#ªŠqŒ1‡%^?c Wìo‘Áb47ß?6>ÑÜ|J±ð,yò-ñ´~jÉ31xñà¯wüã7¿¿í…ýýÃ#çw¸ûñgwüã‹=1Ð`òÛΖéù€ìr»9ulò(OSâÖŒåEÄn·­®X¼ïGwï9<øä‹¯oøþ3z›¶ÿRC›p¼Ýí-mšÂ@@Î`yË'‰§ KO~^/ÿ@j­Ì¿bîÕKï¨^Ê;'~:F«b€¼¼)ÊΜp 1–,Ÿ#±vV¤™ûêÄòX>;ÏS°<`y+ƒå Ð-om°<´å-–,å±<`y,åËç¾åó«Ã€å­ùÿ’Ĉë;=X°|®‰ÛÀþcy(t˧ïÃÅå±<–ÏÔ¯é[É“K5â±<`yœ’é€Ë–ω–Çò€å±<–Ó-/}›;–÷`yÀòb¨Jä±<äå3m(,å –—ŒéËcyȲåMÓ–Çò`žåÅZŠ÷¤Ú,´|F•$9yã+–ë[^2™—¬Ö6ÀòPè–ÏÖ³.wOIy,±|.ÇìbDÑJ,…hy£R4•{²^öÒ6XËgPaY‘{j¢ÇòPX–7\.ž,Ýx•à™&µcÁò—–ÏÁø=Óg,…bùœ’»±VÂòX Ð-Ÿ‰0Ù“KwÕzR–+X>Gâwó݇åÀú–Ïnüžay(ËgWñ’=ûxÒ;^,´|nÆï™ó—Ë@!XÞ““Šè•É–Ï iby,Ÿ…ø=MÝÌpʯ¿Ì oby,o¶â3­]ѹ Oµ€å -ËçŽâ=É÷Ç4Ëç²C±<–ÏiÅ{ÒëIšQ¶'ç¯Åò¢åsDñùØÉ%Ÿby,ŸsŠ÷d © ΓW÷yayHÈòYW|æÉFÙžü=–Àò‘¬äžâS'ÏoîÅòX>SŠ7?=bx'=y^¨Ë`ùœP¼'½¸¹$ß` {ÇòË{ò0 oàÙÂ̽cy0ÛòP¼É™Ÿ4÷.& Ë`yK)ÞѸw,ùaùœR|FEoøÞÍT<–ÀòypE|R;’ì]'“øÞ3—ÀÁòXÞlË{òüN+ÉäÞ±<ä·å=y[«ÀcÖ­XrËòùP•À‘ÌïÝÀ–Àòi‰/+ŠOßVž¬Þ¿šÝ}–Ïŧóz²Z¥À´Ýay,Ÿ¢ò²®ø¬$p $©–S-ŸSŠ73“ 2ú©Ë`ù Ƴs&$p2„ÇÄKHËçô­§ÙMàdŽ %p°<–ψå=Ù~d(²6c?µ`y,o|ÆÀ“L$pÌÁÀéÀòX> ­ä‘â3”À1 C8,€å“Ê›mH\d9’ÀÉ )jñ`y,o¾å³þ§¯ÚláI>IåÁò`¾å³žç‘´8¹/zOö.€<¶|Fo¦èó×tƒF °¼y¹š ‰ÌÚ²Ãò`¶å=™¿—'×8ù+zÀòÙ·< œÌ}î,Ÿ©kä}.Äõ€å3õ­©™+ ,€åóÀòÄõ†ŸËg°¤d ¶ ¢Oj”Ë›q‘{¦#V8XËgÓò$p²•À,o^JDo~\XÞÔš’?™zk$pËg§òŒá© âú˜£X>kõÅHà˜£{Àò³ë #$pµ|Ö•JÀÊ–'`qË#z‹[Þ–‡É}Ñ£{°ˆå=Ùx¤,zâzÀòy`y8·< ‹[>ýއ¸°|î[>Ñ“À,Ÿ–OS $pËçºåÓ( Àò¹ny8[Þb¢'X>?,ŸG¢'®,O¦Ëçp¦^¢žIà@NX~Véx,-zCŽ1…6°|~$pRnËçz'Í“ Ⱦå JôɯQ',Ÿ‹¢7°M€LYÞ’I)™zcÛÈŽåóZôž gêmSÐ=`ùœJàd()€ås"“¡“¢S-oÑ{2#zÃÛ$FZ¾pÂyO&3õ™h“¸°|eêIà@¾ZÞª¢ÏD's¢G÷¢å Vô™H¶HŽ]§X¾Ð-ŸS  Àò2õè",è=YÊÔ“À“,è=\j Ö¶¼á DOr×ò‚å­x©%q=–7LCž{›l2õ`‚å½'o/µDô0‰­¹ùþÍ?|`ÃúïVV–1ÖàÀAÝíÅ¡EwÝõeÆÀ*–@ÿaÊòï¨'‹ag°<`yÀò€åË–Àò€åË@ŽPÌXŒ@`bì‡À˜¦™±»ñ±3h¨‹>ªÿ`³‰Íf·ÙŠ.ºø£v{³ŒåfáìÙwÏŸ?§iËÑÇ>6gÞ¼ù"2váÃ\¤ýø…£¿Ø}üøÉ³Ö8º+/ÿxý²²ûþógÇ'*ÎÏ‘¢IDATÆ´¼…§ËÌþþ/*ÇÕŽK.¹ÄGtáÂ…ß>}öì»—]öIM›øñ ¾g^xûé­ß±Ò¬ýUóCóJ¥öf¦8© ÉËC!rþü¹yŸø„eÞÿ"rñÅÏûÄ'Ο?§ÿú‹ÝÇ7?|Ï™÷þø½EWZæyóÃ÷lÛ}¬¨¸˜)&–˜M Xéý¯sÉ%—èÙ M ?y6 i_Y³ä7çE¤:ÿŸ¯.ûôO¶;~òlqqñØèXO1±<@Ac³ÙEdbBSýC–9(Õ?˜ÐDÄf³1ÅXdbBS¥–9ÅQ:ˆŽÇòùÆHooÿˆá–hªhL“ì<ÔNwmçÛÆ5¨ú‡ÆäåŒ~'ï|c8øÛÂʵ ²Ó‘ñ‰€â(}ë­wRÜþÿu~~IóΩ߿Ýóë%í_—ÿþ\㧢׌^>.š&Ú˜u£²¨ôÑÿí3oøNíë:àÎâ­õyü©Ë¤ÉСÞaçªò9¡%KW뿎ô÷¾Ò?² ìO¦Z^SýCç?HU³‘Õ[>;ÍÝ·t‰¢Ä½°±+zy@D“@À0Ë«þ¡Ÿï3éÚÿ‘cÏïÏ}o.‰\­òoÒÉz¨þ¡'úÞ3%’:1|Ù5QÓ9‰N‘á7†¯Y[_!rj_×[ýÎ¥'çU†u½þ`¤¿÷•þ«nÎÎkË$Ÿ¢éÚ-•kë+âü}zÆæªUås“õ%—ŽŒ Ÿ¥7/˜~bØé¨¬_n`Z@ÏË¿´7Õ\öèx êûŸúòŸN÷MÆG%Põƒ/ß<6:*² ìsÚøø¨4ÿ“«Ëú/|2ðóßþÓ²û¾+COD­66š^,ÿ?yݤ.¹tn ûOŸD)YêÔ'lî¥%úé!|ZG†‡Å¢+˜ÜÇ9¹Ëä¥õkOzªëÀå³dWæ”” éeç; W¯]mfGú{gÄÎ÷ÁFÞÊÆë•+)RaAÅÚúú[ä•§ººöŠ›Ö:¡G…%Ÿ¾jŽˆÈÈÉw†EdNéByc`úfsßV)»{ fùñ€â(K™ñ‰@`"Æ’ðåáKÞùéƒ?óÝÜrìàƒ·ôûÕ¨ÕÒCq”NŒ›s%e©óZ9ºsjZOÚw*zcœ¦O뜒’áÈY&–È/J¯Z»X†õöÏ Ù¦òòŽÊúò9"×”<¥/)Yè(Ñ7¼yiïΧºD$ìÛ×·þ¶k{¯¬Yµ¸$ýÎé÷¾;~Ú¤Á¸J‘ïüù’ÜòàÁÎ…»wÚ¼êúÁs&)sÎâÛVËó;»žšü}á­õsJ%rc½§µrmÅê©_¥déê,ååmÍÍ÷oþáÖ÷¾¿ÿ ïZ(Nœxûºë¯·ÞqyóÍ… }øÁ°ó«ÿã{ßþ»Çï¹yÇŽƒÖ8´ÚÚ?ÿæ÷|ûÑïŸúyë… £>ʼn¬ùÐÃ?ÑÝN,`0]¡0H}ýZó»1¨þ¡#oþ6宿aaÄ’7ŸÈÖ¨ªþ¡ö®“¼ºRËLVœM@Dq”þÛ¶=)·ðê!Ä’±±±lŽâ(]ÿè~¡Z–H .\|ñÅ;¢à¶+/ÿ¸ˆ¬tÇÏÊ”ƒêÞ¼^ÿè ˆ\yùÇ‹ŠŠ˜â¤ /…È{ïþÈGЬô_&ô$4::1oÞüÑ lúÅþÝûO,^zË‹®³Ì¬õܲjå§úÊçß?;\àSœÈúäå¡ ™7oþÙ³ïúã·ä?-*þÈý¹-Wúyßží'·[ã讼üãwܺä¡f·-±ë¿­=Ådlfç²Ë>™ìÿÏÌŠ‹/²ßÓ°ªõ¯þƒÝnÏtû¢â jdl\¯£c³ÙÄf³iíý÷Ï1ÅX  Ñ4mttlttŒ¡áÞW,X°<`yÀò€å°<`yÀò;LV8XU³ò¡‡ÂpXƒU5+§YþöÛWÝ~û*ÆÀbØš›ïg¬Êÿ9ÔË<ü|6×IEND®B`‚nsis-3.11/Contrib/Modern UI/ioSpecial.ini000077500000000000000000000003231477201124000201440ustar00rootroot00000000000000[Settings] Rect=1044 NumFields=3 [Field 1] Type=bitmap Left=0 Right=109 Top=0 Bottom=193 Flags=RESIZETOFIT [Field 2] Type=label Left=120 Right=315 Top=10 [Field 3] Type=label Left=120 Right=315nsis-3.11/Contrib/MultiUser/000077500000000000000000000000001477201124000157415ustar00rootroot00000000000000nsis-3.11/Contrib/MultiUser/MultiUser.nsh000077500000000000000000000352241477201124000204150ustar00rootroot00000000000000/* MultiUser.nsh Installer configuration for multi-user Windows environments Copyright 2008-2025 Joost Verburg */ !ifndef MULTIUSER_INCLUDED !define MULTIUSER_INCLUDED 20210216 !verbose push 3 ;Standard NSIS header files !ifdef MULTIUSER_MUI !include MUI2.nsh !endif !include LogicLib.nsh !include WinVer.nsh !include FileFunc.nsh !if ${NSIS_PTR_SIZE} > 4 !define /IfNDef MULTIUSER_MINWIN 0x501 !else !define /IfNDef MULTIUSER_MINWIN 0x400 !endif ;Variables Var MultiUser.Privileges Var MultiUser.InstallMode ;Command line installation mode setting !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE !include StrFunc.nsh ${Using:StrFunc} StrStr !ifndef MULTIUSER_NOUNINSTALL ${Using:StrFunc} UnStrStr !endif Var MultiUser.Parameters Var MultiUser.Result !endif ;Installation folder stored in registry !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME Var MultiUser.InstDir !endif !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME Var MultiUser.DefaultKeyValue !endif ;Windows Vista UAC setting !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin RequestExecutionLevel admin !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power RequestExecutionLevel admin !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS !else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest RequestExecutionLevel highest !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS !else RequestExecutionLevel user !ifndef MULTIUSER_EXECUTIONLEVEL !warning "MULTIUSER_EXECUTIONLEVEL not set!" !endif !endif /* Install modes */ !macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX ;Install mode initialization - per-machine ${ifnot} ${IsNT} ${orif} $MultiUser.Privileges == "Admin" ${orif} $MultiUser.Privileges == "Power" StrCpy $MultiUser.InstallMode AllUsers SetShellVarContext all !if "${UNINSTALLER_PREFIX}" != UN ;Set default installation location for installer !ifdef MULTIUSER_INSTALLMODE_INSTDIR !ifdef MULTIUSER_USE_PROGRAMFILES64 StrCpy $INSTDIR "$PROGRAMFILES64\${MULTIUSER_INSTALLMODE_INSTDIR}" !else StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" !endif !endif !endif !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" ${if} $MultiUser.InstDir != "" StrCpy $INSTDIR $MultiUser.InstDir ${endif} !endif !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" !endif ${endif} !macroend !macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX ;Install mode initialization - per-user !if ${MULTIUSER_MINWIN} < 0x500 ${if} ${IsNT} !endif StrCpy $MultiUser.InstallMode CurrentUser SetShellVarContext current !if "${UNINSTALLER_PREFIX}" != UN ;Set default installation location for installer !ifdef MULTIUSER_INSTALLMODE_INSTDIR !if ${MULTIUSER_MINWIN} < 0x490 ${if} ${AtLeastWin2000} !endif GetKnownFolderPath $INSTDIR {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; FOLDERID_UserProgramFiles StrCmp $INSTDIR "" 0 +2 StrCpy $INSTDIR "$LocalAppData\Programs" ; Fallback directory StrCpy $INSTDIR "$INSTDIR\${MULTIUSER_INSTALLMODE_INSTDIR}" !if ${MULTIUSER_MINWIN} < 0x490 ${else} StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" ${endif} !endif !endif !endif !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" ${if} $MultiUser.InstDir != "" StrCpy $INSTDIR $MultiUser.InstDir ${endif} !endif !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" !endif !if ${MULTIUSER_MINWIN} < 0x500 ${endif} !endif !macroend Function MultiUser.InstallMode.AllUsers !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" "" FunctionEnd Function MultiUser.InstallMode.CurrentUser !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" "" FunctionEnd !ifndef MULTIUSER_NOUNINSTALL Function un.MultiUser.InstallMode.AllUsers !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un FunctionEnd Function un.MultiUser.InstallMode.CurrentUser !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un FunctionEnd !endif /* Installer/uninstaller initialization */ !macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT}" !else Quit !endif !macroend !macro MULTIUSER_INIT_TEXTS UNINSTALLER_PREFIX !if "${UNINSTALLER_PREFIX}" == "" !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^SetupCaption)" !else !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^Name)" !endif !define /IfNDef MULTIUSER_INIT_TEXT_ADMINREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires administrator privileges." !define /IfNDef MULTIUSER_INIT_TEXT_POWERREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires at least Power User privileges." !define /IfNDef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer." !undef MULTIUSER_TMPSTR_CAPTION !macroend !macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX ;Installer initialization - check privileges and set install mode !insertmacro MULTIUSER_INIT_TEXTS "${UNINSTALLER_PREFIX}" UserInfo::GetAccountType Pop $MultiUser.Privileges !if ${MULTIUSER_MINWIN} < 0x500 ${if} ${IsNT} !endif ;Check privileges !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin ${if} $MultiUser.Privileges != "Admin" MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}" !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" ${endif} !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power ${if} $MultiUser.Privileges != "Power" ${andif} $MultiUser.Privileges != "Admin" ${if} ${AtMostWinXP} MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}" ${else} MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}" ${endif} !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" ${endif} !endif !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS ;Default to per-machine installation if possible ${if} $MultiUser.Privileges == "Admin" ${orif} $MultiUser.Privileges == "Power" !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers !else Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser !endif !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME ;Set installation mode to setting from a previous installation !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" ${if} $MultiUser.DefaultKeyValue == "" ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" ${if} $MultiUser.DefaultKeyValue != "" Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser ${endif} ${endif} !else ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" ${if} $MultiUser.DefaultKeyValue == "" ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" ${if} $MultiUser.DefaultKeyValue != "" Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ${endif} ${endif} !endif !endif ${else} Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser ${endif} !else Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser !endif !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE ;Check for install mode setting on command line ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser" ${if} $MultiUser.Result != "" Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser ${endif} ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers" ${if} $MultiUser.Result != "" ${if} $MultiUser.Privileges == "Admin" ${orif} $MultiUser.Privileges == "Power" Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ${else} MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}" !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" ${endif} ${endif} !endif !if ${MULTIUSER_MINWIN} < 0x500 ${else} ;Not running Windows NT, per-user installation not supported Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ${endif} !endif !macroend !macro MULTIUSER_INIT !verbose push 3 !ifdef __UNINSTALL__ !insertmacro MULTIUSER_UNINIT !else !insertmacro MULTIUSER_INIT_CHECKS "" "" !endif !verbose pop !macroend !ifndef MULTIUSER_NOUNINSTALL !macro MULTIUSER_UNINIT !verbose push 3 !insertmacro MULTIUSER_INIT_CHECKS Un un. !verbose pop !macroend !endif /* Mode selection page */ !macro MULTIUSER_PAGE_FUNCTION_CUSTOM TYPE !ifmacrodef MUI_PAGE_FUNCTION_CUSTOM !insertmacro MUI_PAGE_FUNCTION_CUSTOM "${TYPE}" !endif !ifdef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE} Call "${MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE}}" !undef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE} !endif !macroend !macro MULTIUSER_INSTALLMODEPAGE_INTERFACE !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE !define MULTIUSER_INSTALLMODEPAGE_INTERFACE Var MultiUser.InstallModePage Var MultiUser.InstallModePage.Text Var MultiUser.InstallModePage.AllUsers Var MultiUser.InstallModePage.CurrentUser !endif !macroend !macro MULTIUSER_PAGEDECLARATION_INSTALLMODE UNPREFIX UNIQUEID !define /ReDef MULTIUSER_${UNPREFIX}INSTALLMODEPAGE "" ; Unlock strings in the language file(s) !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)" !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)" !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)" PageEx custom PageCallbacks MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID} !define /IfNDef MULTIUSER_INSTALLMODEPAGE_CAPTION " " Caption "${MULTIUSER_INSTALLMODEPAGE_CAPTION}" PageExEnd !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID} !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER !macroend !macro MULTIUSER_PAGE_INSTALLMODE !verbose push 3 !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest." !endif !ifmacrodef MUI_PAGE_INIT !insertmacro MUI_PAGE_INIT !endif !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE "" ${__COUNTER__} !verbose pop !macroend !macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE !include nsDialogs.nsh Function "${PRE}" !if ${MULTIUSER_MINWIN} < 0x500 ${ifnot} ${IsNT} Abort ${endif} !endif ${if} $MultiUser.Privileges != "Power" ${andif} $MultiUser.Privileges != "Admin" Abort ${endif} !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM PRE !ifmacrodef MUI_HEADER_TEXT_PAGE !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE) !endif nsDialogs::Create 1018 Pop $MultiUser.InstallModePage ${NSD_CreateLabel} 0 2u 100% 42u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}" Pop $MultiUser.InstallModePage.Text ${NSD_CreateRadioButton} 15u 50u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}" Pop $MultiUser.InstallModePage.AllUsers !ifdef MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME !ifdef NOSYSTEMCALLS ReadEnvStr $0 USERNAME !else System::Call 'ADVAPI32::GetUserName(t""r0,*i${NSIS_MAX_STRLEN})' !endif StrCmp $0 "" +2 StrCpy $0 " ($0)" ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}$0" !else ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}" !endif Pop $MultiUser.InstallModePage.CurrentUser ${if} $MultiUser.InstallMode == "AllUsers" SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 ${else} SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 ${endif} !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM SHOW nsDialogs::Show !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM DESTROYED FunctionEnd Function "${LEAVE}" SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $0 ${if} $0 = ${BST_CHECKED} Call MultiUser.InstallMode.AllUsers ${else} Call MultiUser.InstallMode.CurrentUser ${endif} !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend !verbose pop !endif nsis-3.11/Contrib/MultiUser/Readme.html000077500000000000000000000403471477201124000200370ustar00rootroot00000000000000 Multi-User Header File (MultiUser.nsh)

Multi-User Header File (MultiUser.nsh)

Installer configuration for multi-user Windows environments

Table of Contents

Introduction

Modern Windows versions support multiple users accounts on a single computer, each with different privileges. For security reasons, the privileges of applications can also be limited. For an installer, the execution level and installation mode are important. The execution level determines the privileges of the installer application. For example, to install hardware drivers, administrator privileges are required. Applications can also be installed for a single user or for all users on a computer, which is determined by the installation mode. Installation for all users requires a higher execution level as compared with a single user setup. The MultiUser.nsh header files provides the features to automatically handle all these aspects related to user accounts and installer privileges.

Note that all settings need to be set before including the MultiUser.nsh header file.

Initialization and Execution Level 

Before the MultiUser.nsh file is included, the MULTIUSER_EXECUTIONLEVEL define should be set to one of the following values depending on the execution level that is required:

Value Description Typical application
Admin Administrator privileges are required Access data of all users accounts
Power Power User privileges are required
(Power Users no longer exist in Windows Vista. For Vista this is equivalent to Admin)
Installation for all users (writing to "Program Files" or HKLM registry keys), driver installation
Highest Request the highest possible execution level for the current user Mixed-mode installer that can both be installed per-machine or per-user
Standard No special rights required Installation for current user only

Insert the MULTIUSER_INIT and MULTIUSER_UNINT macros in the .onInit and un.onInit function to verify these privileges. If no uninstaller is created in the script, define MULTIUSER_NOUNINSTALL.

!define MULTIUSER_EXECUTIONLEVEL Highest
;!define MULTIUSER_NOUNINSTALL ;Uncomment if no uninstaller is created
!include MultiUser.nsh

...

Function .onInit
  !insertmacro MULTIUSER_INIT
FunctionEnd

Function un.onInit
  !insertmacro MULTIUSER_UNINIT
FunctionEnd

Whether the required privileges can be obtained depends on the user that starts the installer:

  • Windows NT 4/2000/XP/2003 give the installer the same privileges as the user itself. If the privileges of the user are not sufficient (e.g. Admin level is required is set but the user has no administrator rights), the macros will display an error message and quit the installer. If is however possible to manually run the installer with an administrator account.
  • Windows Vista restricts the privileges of all applications by default. Depending on requested execution level, MultiUser.nsh will set the RequestExecutionLevel flag to request privileges. The user will be asked for confirmation and (if necessary) for an administrator password.
  • Windows 95/98/98 do not set any restrictions on users or applications. Administrator rights are always available.

It is recommended to insert these initialization macros before macros that require user intervention. For example, it does not make sense to ask a user for an installer language if the installer will quit afterwards because the user account does not have the required privileges. After the macros are inserted, the variable $MultiUser.Privileges will contain the current execution level (Admin, Power, User or Guest).

The following additional settings are available to customize the initialization:

Setting Description
MULTIUSER_INIT_TEXT_ADMINREQUIRED Error message to be displayed when administrator rights are required but not available.
MULTIUSER_INIT_TEXT_POWERREQUIRED Error message to be displayed when Power User rights are required but not available.
MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE Error message to be displayed when administrator or Power User rights are required because of an installation mode setting on the command line (see below) but are not available.
MULTIUSER_USE_PROGRAMFILES64 Use $PROGRAMFILES64 instead of $PROGRAMFILES as the default all users directory.
MULTIUSER_INIT_FUNCTIONQUIT
MULTIUSER_INIT_UNFUNCTIONQUIT
A custom function to be called when the installer is closed due to insufficient privileges.

Installation Mode

As mentioned before, applications can both be installed for a single users or for all users on a computer. Applications for all users are typically installed in the Program Files folder and appear in the Start Menu of every user. On the contrary, applications for a single user are usually installed in the local Application Data folder and only a appear in the Start Menu of the user who installed the application.

By default, MultiUser.nsh will set the installation mode for a per-machine installation if Administrator or Power User rights are available (this is always the case if the execution level is set to Admin or Power, if Highest is set it depends on the user account). For the Standard execution level the installation will always be for a single user. On Windows 95/98/Me installation for a single user is not possible, a per-machine installation will be performed.

The following settings are available to change the default installation mode:
Setting Description
MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER Set default to a per-user installation, even if the rights for a per-machine installation are available.
MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME Non-empty registry key that is created during the installation in either HKCU or HKLM. The default installation mode will automatically be set to the previously selected mode depending on the location of the key.

After initialization, the variable $MultiUser.InstallMode will contain the current installation mode (AllUsers or CurrentUser).

Mixed-Mode Installation

For the Admin and Power levels, both a per-machine as well as a per-user installation is possible. If the Highest level is set and the user is an Administrator or Power User, both options are also available.

Usually it's a good thing to give the user to choice between these options. For users of the Modern UI version 2, a page is provided that asks the user for the installation mode. To use this page, define MULTIUSER_MUI before including MultiUser.nsh. Then, the MULTIUSER_PAGE_INSTALLMODE macro can be used just like a normal Modern UI page (this page will automatically be skipped when running Windows 95/98/Me):

!define MULTIUSER_EXECUTIONLEVEL Highest
!define MULTIUSER_MUI
!define MULTIUSER_INSTALLMODE_COMMANDLINE
!include MultiUser.nsh
!include MUI2.nsh

!insertmacro MULTIUSER_PAGE_INSTALLMODE
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES 

!insertmacro MUI_LANGUAGE English

...

Function .onInit
  !insertmacro MULTIUSER_INIT
FunctionEnd

Function un.onInit
  !insertmacro MULTIUSER_UNINIT
FunctionEnd

The MULTIUSER_INSTALLMODE_COMMANDLINE setting that also appears in this example enables the installation mode to be set using the /AllUsers or /CurrentUser command line parameters. This is especially useful for silent setup.

The following settings can be used to customize the texts on the page (in addition to the general Modern UI page settings):

Setting Description
MULTIUSER_INSTALLMODEPAGE_TEXT_TOP Text to display on the top of the page.
MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS Text to display on the radio button for a per-machine installation.
MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER Text to display on the radio button for a per-user installation.
MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME Append the username to the per-user radio button.

Installation Mode Initialization

The SetShellVarContext flag (which determines the folders for e.g. shortcuts, like $DESKTOP) is automatically set depending on the installation mode. In addition, the following settings can be used to perform additional actions when the installation mode is initialized:

Setting Description
MULTIUSER_INSTALLMODE_INSTDIR Name of the folder in which to install the application, without a path. This folder will be located in Program Files for a per-machine installation and in the local Application Data folder for a per-user installation (if supported).
MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME Registry key from which to obtain a previously stored installation folder. It will be retrieved from HKCU for per-user and HKLM for per-machine.
MULTIUSER_INSTALLMODE_FUNCTION
MULTIUSER_INSTALLMODE_UNFUNCTION
A custom function to be called during the initialization of the installation mode to set additional installer settings that depend on the mode

To set the installation mode manually, call one of these four functions:

Function name Installation mode
MultiUser.InstallMode.AllUsers Installer: Per-machine installation
MultiUser.InstallMode.CurrentUser Installer: Per-user installation
un.MultiUser.InstallMode.AllUsers Uninstaller: Per-machine installation
un.MultiUser.InstallMode.CurrentUser Uninstaller: Per-user installation

Example

Basic: MultiUser.nsi
nsis-3.11/Contrib/MultiUser/SConscript000077500000000000000000000003201477201124000177510ustar00rootroot00000000000000target = 'MultiUser' docs = Split(""" Readme.html """) includes = Split(""" MultiUser.nsh """) Import('defenv') defenv.DistributeDocs(docs, path=target) defenv.DistributeInclude(includes) nsis-3.11/Contrib/NSIS Menu/000077500000000000000000000000001477201124000154515ustar00rootroot00000000000000nsis-3.11/Contrib/NSIS Menu/SConscript000077500000000000000000000045171477201124000174750ustar00rootroot00000000000000target = "NSIS" Import('BuildUtil env') files = Split(""" nsismenu/nsismenu.cpp nsismenu/nslinks.cpp """) resources = Split(""" nsismenu/nsisicon.ico """) rc = 'nsismenu/nsismenu.rc' libs = Split(""" advapi32 comctl32 gdi32 shell32 user32 """) if env['UNICODE']: libs.append(["wxbase28u", "wxmsw28u_core", "wxmsw28u_html"]) else: libs.append(["wxbase28", "wxmsw28_core", "wxmsw28_html"]) html = Split(""" #Menu/index.html #Menu/notinstalled.html """) images = Split(""" #Menu/images/line.gif #Menu/images/site.gif #Menu/images/header.gif """) import os from os.path import join if env['PLATFORM'] != 'win32' and WhereIs('wx-config') or \ env['PLATFORM'] == 'win32' and env.get('WXWIN'): # build if env['PLATFORM'] != 'win32': rc = libs = [] nsis_menu = BuildUtil( target, files, libs, res = rc, resources = resources, flags = ['$EXCEPTION_FLAG'], root_util = True, cross_platform = True, ) # manifest if env.get('MSVCRT_NEEDSMANIFEST'): manifest = env.SideEffect('%s.exe.manifest' % target, nsis_menu) env.DistributeBin(manifest, alias='install-utils') # set directories if nsis_menu[0].env['PLATFORM'] == 'win32': wxinc = [join(env['WXWIN'], 'include')] if env['UNICODE']: wxlib = [join(os.environ['WXWIN'], 'lib', 'vc_libunsis')] wxinc.append(join(os.environ['WXWIN'], 'lib', 'vc_libunsis', 'mswu')) else: wxlib = [join(os.environ['WXWIN'], 'lib', 'vc_libnsis')] wxinc.append(join(os.environ['WXWIN'], 'lib', 'vc_libnsis', 'msw')) nsis_menu[0].env.Append(LIBPATH = wxlib) nsis_menu[0].env.Append(CPPPATH = wxinc) else: nsis_menu[0].env.ParseConfig('wx-config --cxxflags --libs') # install menu files env.DistributeMenu(html, alias='install-utils') env.DistributeMenu(images, path='images', alias='install-utils') if env['PLATFORM'] != 'win32': env.DistributeBin(resources); else: # no wxWidgets def err(target, source, env): if env['PLATFORM'] == 'win32': print('*** error: WXWIN must be set to build NSIS Menu!') else: print('*** error: wx-config must be in the PATH to build NSIS Menu!') return 1 cmd = env.Command(target, files, Action(err, '')) env.Alias('NSIS Menu', cmd) nsis-3.11/Contrib/NSIS Menu/nsismenu/000077500000000000000000000000001477201124000173125ustar00rootroot00000000000000nsis-3.11/Contrib/NSIS Menu/nsismenu/nsisicon.ico000077500000000000000000011171561477201124000216520ustar00rootroot00000000000000(v ¨žÈF h ( v@@ (Bž600 ¨%Æx( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ™™™ ™™œ™™™™Ì™™™™œÌ™™™™ÌÌ™™™œÌÌ™™™ÌÌÌ™™œÌÌÌ™™ÌÌÌÌ™œÌÌÌÌ™ÌÌÌÌœÌÌÀ ÌÌÌÿÿ¿žŒ€€€€€€€€€€1€yý( @?3?{X"yªzÓ– ä®,ì»:ôÉV&.¥/9Ì@Fï^cñ}ôÿÿÿ                                         ÿÿÿÿßþÏþÇüÃøÁðÀàÀ@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ?‡ÀÇ€ÿçÿ÷(0@yUxH?EF>I©xÒ”ï®óº&õÈN$+¢-7Ì=Dï\`ñ{}ôÿÿÿ                             ¿ðŸàÀ‡€ƒ€€€€€€€€€€€€€€€ƒ€Àã€óû( yUxH?Edddppp|||©xÒ”ï®óº&õÈN$+¢-7Ì=Dï>Dð\`ñ{}ôÿÿÿ               ÿÿ¿žŒ€€€€€€€€€€1€yý( DDHÿ_\ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿa_¤ÿ`]ŸÿG?LÿDKÿKGzÿDKÿTVÌÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿDKÿTVÌÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ñÿY]ðÿMIˆÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD•ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ÜÿC=YÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@ØÿC=YÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿD‘ÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD<ÿqPÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‘ÿD:^ÿDˆÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:^ÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Àÿ>:aÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD‘ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿDŽÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ;@×ÿC=TÿD;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÔÿC=TÿD;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD‡ÿ:Aîÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD:^ÿ,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Çÿ=:dÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿoO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC;ÿnO ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD‡ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ÑÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿD~ÿ:Aíÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDvÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDuÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDuÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD~ÿDuÿ:Aëÿ:Aïÿ:Aïÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿDuÿ:Aëÿ:Aïÿ<@ËÿC=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿDuÿ<@ÇÿC@ÿŒfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿmN ÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿD=ÿlNÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿˆdÿF=AÿDÿkMÿvRÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿŠeÿG>@ÿDÿkMÿvRÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿkMÿvRÿD@ÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿkMÿDÿfÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿDÿ‘iÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿ‘iÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿ¦uÿfÿG>@ÿDÿÇÿv^-ÿDÿË“ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿë¨ÿv^-ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿë¨ÿz`,ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿíªÿc*ÿDÿË“ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿï«ÿíªÿc*ÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿD7IÿDÿDÿDÿDÿDÿDÿDÿDÿDÿDDC×ÿF?Tÿ[T_ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[S^ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿttÛÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ[S^ÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿNKÿKDUÿqrÔÿ{}ôÿ{}ôÿ_\–ÿIAGÿnPÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿUNYÿLDOÿLGoÿ[_êÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ïÿPM‹ÿJBQÿqrÔÿ]ZÿIAGÿnPÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿG?FÿF@HÿPM‹ÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿPMÿHANÿH@GÿIAGÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@YÿG?FÿF@HÿDBŠÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿDBÿF?OÿH@GÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>CÜÿF@Yÿ?=mÿ08ºÿF?TÿD@tÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDBŠÿI@FÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ?=oÿ-7Êÿ-7Ìÿ/8ÀÿC>ZÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿH@GÿpQ ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>ZÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿI@FÿrR ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>[ÿD@mÿ=Dèÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿG?EÿOC<ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?Tÿ>[ÿD@mÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DíÿDAÿIAGÿœq ÿ`M3ÿQD:ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Tÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿDAyÿMCDÿœq ÿ©xÿ¥vÿ`M3ÿQD:ÿuSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿDAyÿODEÿœq ÿ©xÿ©xÿ©xÿ¥vÿ`M3ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dåÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿD@tÿODEÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ=Dïÿ?CÑÿF?Oÿ<<|ÿ-7Êÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ/7ÃÿB=`ÿE@eÿ>Dáÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DëÿD@tÿPDDÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ=Dïÿ?CËÿF?Lÿ<<|ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?_ÿ>Dáÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DèÿD@tÿQFAÿœq ÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿOC<ÿtSÿyUÿyUÿyUÿyUÿyUÿlOÿJACÿH@Mÿ@CÄÿ?CËÿF?Lÿ;;ƒÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?_ÿ>Dáÿ=Dïÿ=Dïÿ=DèÿD@mÿRFCÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿdP0ÿMB?ÿrR ÿyUÿyUÿyUÿyUÿlOÿJACÿH@MÿBBŸÿF?Lÿ;;ƒÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ.7ÇÿA=fÿE?^ÿ>Dáÿ=DèÿD@mÿRFCÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿyUÿyUÿlOÿJACÿH@MÿG?Eÿ>[ÿE?^ÿD@mÿTGAÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿyUÿlOÿJACÿG@KÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿTGAÿ¡sÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ¨wÿjS-ÿMB?ÿrR ÿyUÿlOÿJACÿF@HÿG?Fÿ;8eÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ&,œÿ(-™ÿBHÿ:7jÿ%+¡ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ&,žÿA;WÿUG=ÿœq ÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿ£tÿjS-ÿH?DÿJACÿF@Hÿ%&kÿxÿ!$pÿC:]ÿ&,žÿ$+¢ÿ$+¢ÿ$+¢ÿ(-™ÿD=Pÿt]5ÿë«ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿhT8ÿcP7ÿÊÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ€b)ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:Oÿ>:]ÿ&,žÿ$+¢ÿ*/“ÿF?Oÿw_4ÿë«ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿhT8ÿcP7ÿÊÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿÒš ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:Nÿ>:]ÿ*/“ÿF?Lÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿå§ÿmX5ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!tÿ@:NÿG?Eÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUH?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ|b1ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿÒ”ÿÒ”ÿГÿx]-ÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ„h-ÿí­ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿoY4ÿ]M:ÿÇÿÒ”ÿГÿqY0ÿYK=ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>Hÿ„h-ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿèªÿu]2ÿXI<ÿÀ‰ ÿqY0ÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>HÿOECÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿp(ÿI@DÿI@Dÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿxÿ!$pÿE>HÿIAEÿOECÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿ‘u8ÿr8ÿJACÿG?Eÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿxÿ$%mÿE>Hÿ’{JÿÔ­LÿRHEÿr8ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ[RRÿ[L=ÿÝ¢ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿxÿ$%mÿE>Hÿ’{JÿõÈNÿõÈNÿÙ±MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿxÿ$%mÿG?Fÿ’{JÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿxÿ$%mÿH@Gÿ’{JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿñ¹&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿìµ'ÿq]=ÿQGHÿ`WWÿUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿxÿ&'kÿG?Fÿ‚JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿÝ´MÿWKEÿƒj:ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿSIIÿ`WWÿUI?ÿÕ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿxÿ&'kÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿß¶Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿTJJÿg]]ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@Hÿ%&kÿ&'kÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿé³(ÿiX?ÿTJJÿh_^ÿQFAÿÒš ÿï®ÿï®ÿï®ÿï®ÿÄ’ÿOECÿH@Gÿ/.`ÿG?Fÿ …JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿï·'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿè²(ÿiX?ÿTJJÿg_`ÿQFAÿÒš ÿï®ÿï®ÿï®ÿÄ’ÿOECÿF@HÿG?Eÿ¨‹JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿâ¸Mÿ\OEÿzd<ÿìµ'ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿå°)ÿbR@ÿVLLÿg_`ÿQFAÿΘÿï®ÿï®ÿÄ’ÿOECÿI@Fÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿäºMÿbTEÿq]=ÿìµ'ÿóº&ÿóº&ÿóº&ÿóº&ÿå°)ÿbR@ÿWMMÿphiÿNCBÿË–ÿï®ÿÄ’ÿOECÿIAEÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿç¼MÿbTEÿq]=ÿìµ'ÿóº&ÿóº&ÿå°)ÿbR@ÿWMMÿphiÿNCBÿË–ÿÄ’ÿOECÿIAEÿ¬JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿç¼MÿbTEÿq]=ÿìµ'ÿå°)ÿbR@ÿWMMÿphiÿNCBÿ z ÿOECÿI@Fÿ‚Jÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶Mÿß¶MÿÔ­LÿWKEÿq]=ÿ\NAÿ[RRÿphiÿG?EÿOECÿIAGÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?EÿG?Eÿ[RRÿxrvÿQGHÿÿÿÿÿÿÿÿÿóÿÿÿ€ñÿÿÿðÿÿþðÿüð?ÿøðÿððÿàðÿÀðÿ€ðÿðþð|ð8ððððððððððððððððððððððððððððððððððððððð>ððÿ€ðÿÀðÿàðÿððÿøðÿüà?ÿþÀÿÿ€ÿÿÿÿÿÿÏ(0` €%G?JÿG?I­G@H†HAMÿH@JÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿKDSÿIAJÿH@HÿF?NÿF?TÿG?I­G@H†IBTÿUVºÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCPÿG?E„F?Pÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCPÿG?E„F?Pÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿG?E„F?Pÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿI@CÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿ{}ôÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?I­G@H†IBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿ`]šÿ{}ôÿppÎÿJCOÿfLÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ>C×ÿF?TÿG?HØIBTÿXZÓÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿ\`ñÿY[ÙÿIBUÿZV†ÿJCOÿfLÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿBA›ÿF?NÿH@LÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHAOÿHARÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ5:¡ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?OÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?OÿfLÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG?Oÿ[H)ÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@OÿrX&ÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=Dïÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿyUÿJ@@ÿF?Pÿ=DïÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ=Dïÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿyUÿJ@@ÿF?PÿAB­ÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿBA–ÿ=Dïÿ?CËÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿyUÿJ@@ÿG?JÿE>Qÿ28³ÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ-7Ìÿ18¸ÿE>QÿDAƒÿG@Oÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿyUÿJ@@ÿE>PÿE?MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>MÿE>Pÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿyUÿJ@@ÿE>GÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿiNÿJ@@ÿD=Hÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿƒbÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿ©xÿiÿMBAÿI@CÿD=Hÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>JÿNCBÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿPDAÿRF?ÿD=Hÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿx^1ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿMCCÿD=Hÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿRF@ÿD=Hÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ$+¢ÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ-0Šÿ$+¢ÿ,/ŽÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿ))hÿE>Jÿ34yÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿxÿ0._ÿE>Jÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿÒ”ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿxÿ$%mÿE=Hÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¾ˆ ÿÒ”ÿ¹… ÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿxÿ$%mÿE=Hÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿ˜t$ÿSF?ÿ¦yÿSF?ÿ®ƒÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿxÿ$%mÿE>HÿODCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿQFCÿOECÿPEAÿœw"ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿxÿ$%mÿE=HÿzfGÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJADØUI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿxÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿï®ÿRF@ÿD=Hÿ$%mÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿï®ÿRF@ÿE>GÿE=Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿï®ÿRF@ÿG?E„H@Hÿ²“JÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿóº&ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿï®ÿRF@ÿG?E„RHFÿЪLÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿÛ©*ÿóº&ÿÕ¤+ÿVJBÿJAD†KBC­UI?ÿמ ÿRF@ÿG?E„RHFÿЪLÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿõÈNÿ›HÿWJBÿ¼“0ÿVJBÿJAD†KBC­UI?ÿPEAÿJBEÿLCEÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿUJFÿLCDÿOEDÿJAD†KBC­LBCÿçÿÿãÿþáÿüàÿøàðà?ààÀà€ààààààààààààààààààààààààààààààà@àààðàøàüàþÀÿ€?ÿ‡ÿÇÿÿçnsis-3.11/Contrib/NSIS Menu/nsismenu/nsismenu.cpp000077500000000000000000000221311477201124000216610ustar00rootroot00000000000000///////////////////////////////////////////////////////////////////////////// // NSIS MENU // // Reviewed for Unicode support by Jim Park -- 08/23/2007 // Basically, compiling wxWidgets as Unicode should do it. ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include #endif #include #include #include #include #include #include #include #include // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- #if !wxCHECK_VERSION(2, 9, 0) && !defined(wxLaunchDefaultApplication) #define wxLaunchDefaultApplication wxLaunchDefaultBrowser #endif #ifdef __WXMSW__ #define CanOpenChm() true #else #define CanOpenChm() false #endif typedef enum { SUT_UNKNOWN = 0, SUT_BIN = 0x14, SUT_DOC = 0x24, SUT_WEB = 0x34 } SPECIALURLTYPE; // The low nibble contains the "protocol" length! SPECIALURLTYPE GetSpecialUrlType(const wxString&Url) { const wxString l4 = Url.Left(4); if (0 == l4.CmpNoCase(wxT("BIN:"))) return SUT_BIN; if (0 == l4.CmpNoCase(wxT("DOC:"))) return SUT_DOC; if (0 == l4.CmpNoCase(wxT("WEB:"))) return SUT_WEB; return SUT_UNKNOWN; } static bool PathExists(const wxString&Path) { return wxFileExists(Path) || wxDirExists(Path); } static wxString BuildPathWorker(const wxChar*a, const wxChar*b) { wxString path(a); if (path.Last() != wxFileName::GetPathSeparator()) path.Append(wxFileName::GetPathSeparator()); return (path.Append(b), path); } static const wxChar*GetCStr(const wxString&t) { return t.c_str(); } static const wxChar*GetCStr(const wxChar*t) { return t; } template wxString BuildPath(const A&a, const B&b) { return BuildPathWorker(GetCStr(a), GetCStr(b)); } template wxString BuildPath(const A&a, const B&b, const C&c) { return BuildPath(BuildPath(GetCStr(a), GetCStr(b)), GetCStr(c)); } wxString GetMenuHtmlFile(const wxChar*file) { #ifdef __WXMSW__ wxString dataroot(wxPathOnly(wxStandardPaths::Get().GetExecutablePath())); #else const wxChar*dataroot = wxT(PREFIX_DATA); #endif return BuildPath(dataroot, wxT("Menu"), file); } SPECIALURLTYPE TransformUrl(wxString&Url) { SPECIALURLTYPE ut = GetSpecialUrlType(Url); const wxString location = Url.Mid(ut & 0x0F); const wxString exePath = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()); if (SUT_BIN == ut) { #ifdef __WXMSW__ Url = BuildPath(exePath, location) + wxT(".exe"); if (!PathExists(Url)) Url = BuildPath(exePath, wxT("Bin"), location) + wxT(".exe"); #else Url = BuildPath(exePath, location); #endif } else if (SUT_DOC == ut) { #ifdef __WXMSW__ wxString path = BuildPath(exePath, location); #else wxString path = BuildPath(wxT(PREFIX_DOC), location); #endif if ((!CanOpenChm() || !wxFileExists(path)) && 0 == location.CmpNoCase(wxT("NSIS.chm"))) { path = BuildPath(wxPathOnly(path), wxT("Docs"), wxT("Manual.html")); // DOCTYPES=htmlsingle if (!wxFileExists(path)) path = BuildPath(wxPathOnly(path), wxT("Contents.html")); // DOCTYPES=html (Not adding /Docs/ because it has already been appended) } Url = path; } else if (SUT_WEB == ut) { Url = location; } return ut; } // Define a new application type, each program should derive a class from wxApp class MyApp : public wxApp { public: // override base class virtuals // ---------------------------- // this one is called on application startup and is a good place for the app // initialization (doing it here and not in the ctor allows to have an error // return: if OnInit() returns false, the application terminates) virtual bool OnInit(); }; // Define a new frame type: this is going to be our main frame class MyFrame : public wxFrame { public: // ctor(s) MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); // event handler(s) void OnLink(wxHtmlLinkEvent& event); void OnClose(wxCloseEvent& event); private: wxHtmlWindow *m_Html; // any class wishing to process wxWindows events must use this macro DECLARE_EVENT_TABLE() }; // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- #define HTMLW 598 // release.py generates a 598x45 header image #define HTMLH 365 // IDs for the controls and the menu commands enum { // controls start here (the numbers are, of course, arbitrary) HtmlControl = 1000 }; // ---------------------------------------------------------------------------- // event tables and other macros for wxWindows // ---------------------------------------------------------------------------- // the event tables connect the wxWindows events with the functions (event // handlers) which process them. It can be also done at run-time, but for the // simple menu events like this the static method is much simpler. BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_HTML_LINK_CLICKED(HtmlControl, MyFrame::OnLink) END_EVENT_TABLE() // Create a new application object: this macro will allow wxWindows to create // the application object during program execution (it's better than using a // static object for many reasons) and also declares the accessor function // wxGetApp() which will return the reference of the right type (i.e. MyApp and // not wxApp) IMPLEMENT_APP(MyApp) // ============================================================================ // implementation // ============================================================================ // ---------------------------------------------------------------------------- // the application class // ---------------------------------------------------------------------------- // `Main program' equivalent: the program execution "starts" here bool MyApp::OnInit() { wxInitAllImageHandlers(); // Create the main application window MyFrame *frame = new MyFrame(_("NSIS Menu"), wxPoint(50, 50), wxSize(HTMLW + wxSystemSettings::GetMetric(wxSYS_FRAMESIZE_X), HTMLH + wxSystemSettings::GetMetric(wxSYS_FRAMESIZE_Y))); // Show it and tell the application that it's our main window frame->SetClientSize(HTMLW, HTMLH); frame->Show(TRUE); SetTopWindow(frame); // success: wxApp::OnRun() will be called which will enter the main message // loop and the application will run. If we returned FALSE here, the // application would exit immediately. return TRUE; } // ---------------------------------------------------------------------------- // main frame // ---------------------------------------------------------------------------- #ifdef NSISMENU_NOLINKTAGHANDLER static wxHtmlWindow*g_pHtmlWindow = 0; #endif // frame constructor MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame *)NULL, -1, title, pos, size, wxCLOSE_BOX | wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION, wxT("nsis_menu")) { m_Html = new wxHtmlWindow(this, HtmlControl, wxPoint(0, 0), wxSize(HTMLW, HTMLH), wxHW_SCROLLBAR_NEVER|wxHW_NO_SELECTION); m_Html->SetRelatedFrame(this, wxT("%s")); // Dialog caption comes from the html title element or filename m_Html->SetBorders(0); m_Html->EnableScrolling(false, false); #ifdef NSISMENU_NOLINKTAGHANDLER g_pHtmlWindow = m_Html; #endif // Set font size wxSize DialogSize(1000, 1000); DialogSize = this->ConvertDialogToPixels(DialogSize); int fonts[7] = {0, 0, 14000 / (DialogSize.GetWidth()), 19000 / (DialogSize.GetWidth()), 0, 0, 0}; m_Html->SetFonts(wxString(), wxString(), fonts); #ifdef __WXMSW__ this->SetIcon(wxICON(nsisicon)); #else wxIcon icon(wxT("nsisicon.ico"), wxBITMAP_TYPE_ICO); this->SetIcon(icon); #endif m_Html->LoadPage(GetMenuHtmlFile(wxT("index.html"))); this->Centre(wxBOTH); } // event handler void MyFrame::OnLink(wxHtmlLinkEvent& event) { const wxMouseEvent *e = event.GetLinkInfo().GetEvent(); if (e == NULL || e->LeftUp()) { int notinstalled = false; wxString href = event.GetLinkInfo().GetHref(), url = href; SPECIALURLTYPE ut = TransformUrl(url); switch(ut) { case SUT_BIN: if (PathExists(url)) wxExecute(url); else ++notinstalled; break; case SUT_DOC: if (PathExists(url)) wxLaunchDefaultApplication(url); else ++notinstalled; break; case SUT_WEB: wxLaunchDefaultBrowser(url); break; default: event.Skip(); } #ifdef NSISMENU_NOLINKTAGHANDLER if (notinstalled && g_pHtmlWindow) g_pHtmlWindow->LoadPage(GetMenuHtmlFile(wxT("notinstalled.html"))); #endif } } nsis-3.11/Contrib/NSIS Menu/nsismenu/nsismenu.rc000077500000000000000000000001361477201124000215040ustar00rootroot00000000000000nsisicon ICON "nsisicon.ico" WXCURSOR_HAND CURSOR DISCARDABLE "wx/msw/hand.cur"nsis-3.11/Contrib/NSIS Menu/nsismenu/nslinks.cpp000077500000000000000000000065201477201124000215050ustar00rootroot00000000000000///////////////////////////////////////////////////////////////////////////// // Name: src/html/m_links.cpp // Purpose: wxHtml module for links & anchors // Author: Vaclav Slavik // RCS-ID: $Id: nslinks.cpp,v 1.2 2007/03/08 01:47:14 pabs3 Exp $ // Copyright: (c) 1999 Vaclav Slavik // Licence: wxWindows licence // // Reviewed for Unicode support by Jim Park -- 08/23/2007 // Basically, compiling wxWidgets as Unicode should do it. ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #if wxUSE_HTML && wxUSE_STREAMS && !defined(NSISMENU_NOLINKTAGHANDLER) #ifndef WXPRECOMP #endif #include "wx/html/forcelnk.h" #include "wx/html/m_templ.h" #include #include #include FORCE_LINK_ME(nslinks) // TODO: These helper function declarations should be in a header file typedef enum { SUT_UNKNOWN = 0, SUT_BIN = 0x14, SUT_DOC = 0x24, SUT_WEB = 0x34 } SPECIALURLTYPE; SPECIALURLTYPE TransformUrl(wxString&Url); class wxHtmlAnchorCell : public wxHtmlCell { private: wxString m_AnchorName; public: wxHtmlAnchorCell(const wxString& name) : wxHtmlCell() { m_AnchorName = name; } void Draw(wxDC& WXUNUSED(dc), int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(view_y1), int WXUNUSED(view_y2), wxHtmlRenderingInfo& WXUNUSED(info)) {} DECLARE_NO_COPY_CLASS(wxHtmlAnchorCell) }; TAG_HANDLER_BEGIN(A, "A") TAG_HANDLER_CONSTR(A) { } TAG_HANDLER_PROC(tag) { if (tag.HasParam( wxT("HREF") )) { wxHtmlLinkInfo oldlnk = m_WParser->GetLink(); wxColour oldclr = m_WParser->GetActualColor(); wxString href(tag.GetParam( wxT("HREF") )), target; if (tag.HasParam( wxT("TARGET") )) target = tag.GetParam( wxT("TARGET") ); wxColour colour = m_WParser->GetLinkColor(); wxHtmlLinkInfo linkInfo(href, target); wxString location = href; SPECIALURLTYPE ut = TransformUrl(location); if (ut == SUT_BIN || ut == SUT_DOC) { if (!wxFileExists(location) && !wxDirExists(location)) { colour = wxColour(0x80, 0x80, 0x80); linkInfo = wxHtmlLinkInfo(wxT("notinstalled.html"), target); } } m_WParser->SetActualColor(colour); m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(colour)); m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); m_WParser->SetLink(linkInfo); ParseInner(tag); m_WParser->SetLink(oldlnk); m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); m_WParser->SetActualColor(oldclr); m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(oldclr)); return true; } else return false; } TAG_HANDLER_END(A) #if wxCHECK_VERSION(3, 0, 0) TAGS_MODULE_BEGIN(Links) #else TAGS_MODULE_BEGIN(CustomLinks) #endif TAGS_MODULE_ADD(A) #if wxCHECK_VERSION(3, 0, 0) TAGS_MODULE_END(Links) #else TAGS_MODULE_END(CustomLinks) #endif #endif nsis-3.11/Contrib/NSIS Menu/nsismenu/resource.h000077500000000000000000000006521477201124000213200ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by test.rc // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/NSIS Menu/wx/000077500000000000000000000000001477201124000161075ustar00rootroot00000000000000nsis-3.11/Contrib/NSIS Menu/wx/build.txt000077500000000000000000000001501477201124000177460ustar00rootroot000000000000001. Install wxWidgets 2.8 2. Set WXWIN environment variable 3. Run wxbuild.bat 4. Build NSIS happily nsis-3.11/Contrib/NSIS Menu/wx/setup.h000077500000000000000000001274741477201124000174420ustar00rootroot00000000000000///////////////////////////////////////////////////////////////////////////// // Name: wx/msw/setup.h // Purpose: Configuration for the library // Author: Julian Smart // Modified by: // Created: 01/02/97 // RCS-ID: $Id: setup0.h,v 1.246 2006/11/09 00:54:51 VZ Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows licence // // Reviewed for Unicode support by Jim Park -- 08/01/2007 // (This one is the ANSI version.) ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_SETUP_H_ #define _WX_SETUP_H_ /* --- start common options --- */ // ---------------------------------------------------------------------------- // global settings // ---------------------------------------------------------------------------- // define this to 0 when building wxBase library - this can also be done from // makefile/project file overriding the value here #ifndef wxUSE_GUI #define wxUSE_GUI 1 #endif // wxUSE_GUI // ---------------------------------------------------------------------------- // compatibility settings // ---------------------------------------------------------------------------- // This setting determines the compatibility with 2.4 API: set it to 1 to // enable it but please consider updating your code instead. // // Default is 0 // // Recommended setting: 0 (please update your code) #define WXWIN_COMPATIBILITY_2_4 0 // This setting determines the compatibility with 2.6 API: set it to 0 to // flag all cases of using deprecated functions. // // Default is 1 but please try building your code with 0 as the default will // change to 0 in the next version and the deprecated functions will disappear // in the version after it completely. // // Recommended setting: 0 (please update your code) #define WXWIN_COMPATIBILITY_2_6 0 // MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when // default system font is used for wxWindow::GetCharWidth/Height() instead of // the current font. // // Default is 0 // // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 // ---------------------------------------------------------------------------- // debugging settings // ---------------------------------------------------------------------------- // Generic comment about debugging settings: they are very useful if you don't // use any other memory leak detection tools such as Purify/BoundsChecker, but // are probably redundant otherwise. Also, Visual C++ CRT has the same features // as wxWidgets memory debugging subsystem built in since version 5.0 and you // may prefer to use it instead of built in memory debugging code because it is // faster and more fool proof. // // Using VC++ CRT memory debugging is enabled by default in debug mode // (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) // and if __NO_VC_CRTDBG__ is not defined. // If 1, enables wxDebugContext, for writing error messages to file, etc. If // __WXDEBUG__ is not defined, will still use the normal memory operators. // // Default is 0 // // Recommended setting: 0 #define wxUSE_DEBUG_CONTEXT 0 // If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* // __WXDEBUG__ is also defined. // // WARNING: this code may not work with all architectures, especially if // alignment is an issue. This switch is currently ignored for mingw / cygwin // // Default is 0 // // Recommended setting: 1 if you are not using a memory debugging tool, else 0 #define wxUSE_MEMORY_TRACING 0 // In debug mode, cause new and delete to be redefined globally. // If this causes problems (e.g. link errors which is a common problem // especially if you use another library which also redefines the global new // and delete), set this to 0. // This switch is currently ignored for mingw / cygwin // // Default is 0 // // Recommended setting: 0 #define wxUSE_GLOBAL_MEMORY_OPERATORS 0 // In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If // this causes problems (e.g. link errors), set this to 0. You may need to set // this to 0 if using templates (at least for VC++). This switch is currently // ignored for mingw / cygwin / CodeWarrior // // Default is 0 // // Recommended setting: 0 #define wxUSE_DEBUG_NEW_ALWAYS 0 // wxHandleFatalExceptions() may be used to catch the program faults at run // time and, instead of terminating the program with a usual GPF message box, // call the user-defined wxApp::OnFatalException() function. If you set // wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. // // This setting is for Win32 only and can only be enabled if your compiler // supports Win32 structured exception handling (currently only VC++ does) // // Default is 1 // // Recommended setting: 1 if your compiler supports it. #define wxUSE_ON_FATAL_EXCEPTION 0 // Set this to 1 to be able to generate a human-readable (unlike // machine-readable minidump created by wxCrashReport::Generate()) stack back // trace when your program crashes using wxStackWalker // // Default is 1 if supported by the compiler. // // Recommended setting: 1, set to 0 if your programs never crash #define wxUSE_STACKWALKER 0 // Set this to 1 to compile in wxDebugReport class which allows you to create // and optionally upload to your web site a debug report consisting of back // trace of the crash (if wxUSE_STACKWALKER == 1) and other information. // // Default is 1 if supported by the compiler. // // Recommended setting: 1, it is compiled into a separate library so there // is no overhead if you don't use it #define wxUSE_DEBUGREPORT 0 // ---------------------------------------------------------------------------- // Unicode support // ---------------------------------------------------------------------------- // Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be // defined as wchar_t, wxString will use Unicode internally. If you set this // to 1, you must use wxT() macro for all literal strings in the program. // // Unicode is currently only fully supported under Windows NT/2000/XP // (Windows 9x doesn't support it and the programs compiled in Unicode mode // will not run under 9x -- but see wxUSE_UNICODE_MSLU below). // // Default is 0 // // Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) #ifndef wxUSE_UNICODE #define wxUSE_UNICODE 0 #endif // Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without // compiling the program in Unicode mode. More precisely, it will be possible // to construct wxString from a wide (Unicode) string and convert any wxString // to Unicode. // // Default is 1 // // Recommended setting: 1 #define wxUSE_WCHAR_T 1 // ---------------------------------------------------------------------------- // global features // ---------------------------------------------------------------------------- // Compile library in exception-safe mode? If set to 1, the library will try to // behave correctly in presence of exceptions (even though it still will not // use the exceptions itself) and notify the user code about any unhandled // exceptions. If set to 0, propagation of the exceptions through the library // code will lead to undefined behaviour -- but the code itself will be // slightly smaller and faster. // // Note that like wxUSE_THREADS this option is automatically set to 0 if // wxNO_EXCEPTIONS is defined. // // Default is 1 // // Recommended setting: depends on whether you intend to use C++ exceptions // in your own code (1 if you do, 0 if you don't) #define wxUSE_EXCEPTIONS 0 // Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI // // Default is 0 // // Recommended setting: 0 (this is still work in progress...) #define wxUSE_EXTENDED_RTTI 0 // Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from // std::list and std::vector, with a compatibility interface, // and for wxHashMap to be implemented with templates. // // Default is 0 // // Recommended setting: YMMV #define wxUSE_STL 0 // Support for message/error logging. This includes wxLogXXX() functions and // wxLog and derived classes. Don't set this to 0 unless you really know what // you are doing. // // Default is 1 // // Recommended setting: 1 (always) #define wxUSE_LOG 0 // Recommended setting: 1 #define wxUSE_LOGWINDOW 0 // Recommended setting: 1 #define wxUSE_LOGGUI 0 // Recommended setting: 1 #define wxUSE_LOG_DIALOG 0 // Support for command line parsing using wxCmdLineParser class. // // Default is 1 // // Recommended setting: 1 (can be set to 0 if you don't use the cmd line) #define wxUSE_CMDLINE_PARSER 0 // Support for multithreaded applications: if 1, compile in thread classes // (thread.h) and make the library a bit more thread safe. Although thread // support is quite stable by now, you may still consider recompiling the // library without it if you have no use for it - this will result in a // somewhat smaller and faster operation. // // Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset // to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in // build/msw/config.* file this value will have no effect. // // Default is 1 // // Recommended setting: 0 unless you do plan to develop MT applications #define wxUSE_THREADS 0 // If enabled, compiles wxWidgets streams classes // // wx stream classes are used for image IO, process IO redirection, network // protocols implementation and much more and so disabling this results in a // lot of other functionality being lost. // // Default is 1 // // Recommended setting: 1 as setting it to 0 disables many other things #define wxUSE_STREAMS 1 // Use standard C++ streams if 1 instead of wx streams in some places. If // disabled (default), wx streams are used everywhere and wxWidgets doesn't // depend on the standard streams library. // // Notice that enabling this does not replace wx streams with std streams // everywhere, in a lot of places wx streams are used no matter what. // // Default is 0 // // Recommended setting: 1 if you use the standard streams anyhow and so // dependency on the standard streams library is not a // problem #define wxUSE_STD_IOSTREAM 0 // Enable conversion to standard C++ string if 1. // // Default is 1 for most compilers. // // Currently the Digital Mars and Watcom compilers come without standard C++ // library headers by default, wxUSE_STD_STRING can be set to 1 if you do have // them (e.g. from STLPort). // // VC++ 5.0 does include standard C++ library header, however they produce // many warnings that can't be turned off when compiled at warning level 4. #if defined(__DMC__) || defined(__WATCOMC__) \ || (defined(_MSC_VER) && _MSC_VER < 1200) #define wxUSE_STD_STRING 0 #else #define wxUSE_STD_STRING 1 #endif // Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. // Note that if the system's implementation does not support positional // parameters, setting this to 1 forces the use of the wxWidgets implementation // of wxVsnprintf. The standard vsnprintf() supports positional parameters on // many Unix systems but usually doesn't under Windows. // // Positional parameters are very useful when translating a program since using // them in formatting strings allow translators to correctly reorder the // translated sentences. // // Default is 1 // // Recommended setting: 1 if you want to support multiple languages #define wxUSE_PRINTF_POS_PARAMS 0 // ---------------------------------------------------------------------------- // non GUI features selection // ---------------------------------------------------------------------------- // Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit // integer which is implemented in terms of native 64 bit integers if any or // uses emulation otherwise. // // This class is required by wxDateTime and so you should enable it if you want // to use wxDateTime. For most modern platforms, it will use the native 64 bit // integers in which case (almost) all of its functions are inline and it // almost does not take any space, so there should be no reason to switch it // off. // // Recommended setting: 1 #define wxUSE_LONGLONG 1 // Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level // POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. // // Default is 1 // // Recommended setting: 1 (wxFile is highly recommended as it is required by // i18n code, wxFileConfig and others) #define wxUSE_FILE 1 #define wxUSE_FFILE 0 // Use wxFSVolume class providing access to the configured/active mount points // // Default is 1 // // Recommended setting: 1 (but may be safely disabled if you don't use it) #define wxUSE_FSVOLUME 0 // Use wxStandardPaths class which allows to retrieve some standard locations // in the file system // // Default is 1 // // Recommended setting: 1 (may be disabled to save space, but not much) #define wxUSE_STDPATHS 1 // use wxTextBuffer class: required by wxTextFile #define wxUSE_TEXTBUFFER 1 // use wxTextFile class: requires wxFile and wxTextBuffer, required by // wxFileConfig #define wxUSE_TEXTFILE 1 // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards // compatibility (and implemented in terms of wxDateTime). // // Note that this class is relatively new and is still officially in alpha // stage because some features are not yet (fully) implemented. It is already // quite useful though and should only be disabled if you are aiming at // absolutely minimal version of the library. // // Requires: wxUSE_LONGLONG // // Default is 1 // // Recommended setting: 1 #define wxUSE_DATETIME 0 // Set wxUSE_TIMER to 1 to compile wxTimer class // // Default is 1 // // Recommended setting: 1 #define wxUSE_TIMER 0 // Use wxStopWatch clas. // // Default is 1 // // Recommended setting: 1 (needed by wxSocket) #define wxUSE_STOPWATCH 0 // Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes // which allow the application to store its settings in the persistent // storage. Setting this to 1 will also enable on-demand creation of the // global config object in wxApp. // // See also wxUSE_CONFIG_NATIVE below. // // Recommended setting: 1 #define wxUSE_CONFIG 1 // If wxUSE_CONFIG is 1, you may choose to use either the native config // classes under Windows (using .INI files under Win16 and the registry under // Win32) or the portable text file format used by the config classes under // Unix. // // Default is 1 to use native classes. Note that you may still use // wxFileConfig even if you set this to 1 - just the config object created by // default for the applications needs will be a wxRegConfig or wxIniConfig and // not wxFileConfig. // // Recommended setting: 1 #define wxUSE_CONFIG_NATIVE 0 // If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows // to connect/disconnect from the network and be notified whenever the dial-up // network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. // // Default is 1. // // Recommended setting: 1 #define wxUSE_DIALUP_MANAGER 0 // Compile in classes for run-time DLL loading and function calling. // Required by wxUSE_DIALUP_MANAGER. // // This setting is for Win32 only // // Default is 1. // // Recommended setting: 1 #define wxUSE_DYNLIB_CLASS 1 // experimental, don't use for now #define wxUSE_DYNAMIC_LOADER 0 // Set to 1 to use socket classes #define wxUSE_SOCKETS 0 // Set to 1 to enable virtual file systems (required by wxHTML) #define wxUSE_FILESYSTEM 1 // Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) #define wxUSE_FS_ZIP 0 // Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) #define wxUSE_FS_ARCHIVE 0 // Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) #define wxUSE_FS_INET 0 // wxArchive classes for accessing archives such as zip and tar #define wxUSE_ARCHIVE_STREAMS 0 // Set to 1 to compile wxZipInput/OutputStream classes. #define wxUSE_ZIPSTREAM 0 // Set to 1 to compile wxTarInput/OutputStream classes. #define wxUSE_TARSTREAM 0 // Set to 1 to compile wxZlibInput/OutputStream classes. Also required by // wxUSE_LIBPNG #define wxUSE_ZLIB 0 // If enabled, the code written by Apple will be used to write, in a portable // way, float on the disk. See extended.c for the license which is different // from wxWidgets one. // // Default is 1. // // Recommended setting: 1 unless you don't like the license terms (unlikely) #define wxUSE_APPLE_IEEE 0 // Joystick support class #define wxUSE_JOYSTICK 0 // wxFontMapper class #define wxUSE_FONTMAP 1 // wxMimeTypesManager class #define wxUSE_MIMETYPE 0 // wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP // or wxURL you need to set this to 1. // // Default is 1. // // Recommended setting: 1 #define wxUSE_PROTOCOL 0 // The settings for the individual URL schemes #define wxUSE_PROTOCOL_FILE 0 #define wxUSE_PROTOCOL_FTP 0 #define wxUSE_PROTOCOL_HTTP 0 // Define this to use wxURL class. #define wxUSE_URL 0 // Define this to use native platform url and protocol support. // Currently valid only for MS-Windows. // Note: if you set this to 1, you can open ftp/http/gopher sites // and obtain a valid input stream for these sites // even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. // Doing so reduces the code size. // // This code is experimental and subject to change. #define wxUSE_URL_NATIVE 0 // Support for wxVariant class used in several places throughout the library, // notably in wxDataViewCtrl API. // // Default is 1. // // Recommended setting: 1 unless you want to reduce the library size as much as // possible in which case setting this to 0 can gain up to 100KB. #define wxUSE_VARIANT 0 // Support for regular expression matching via wxRegEx class: enable this to // use POSIX regular expressions in your code. You need to compile regex // library from src/regex to use it under Windows. // // Default is 0 // // Recommended setting: 1 if your compiler supports it, if it doesn't please // contribute us a makefile for src/regex for it #define wxUSE_REGEX 0 // wxSystemOptions class #define wxUSE_SYSTEM_OPTIONS 0 // wxSound class #define wxUSE_SOUND 0 // Use wxMediaCtrl // // Default is 1. // // Recommended setting: 1 #define wxUSE_MEDIACTRL 0 // Use GStreamer for Unix (req a lot of dependencies) // // Default is 0 // // Recommended setting: 1 (wxMediaCtrl won't work by default without it) #define wxUSE_GSTREAMER 0 // Use wxWidget's XRC XML-based resource system. Recommended. // // Default is 1 // // Recommended setting: 1 (requires wxUSE_XML) #define wxUSE_XRC 0 // XML parsing classes. Note that their API will change in the future, so // using wxXmlDocument and wxXmlNode in your app is not recommended. // // Default is the same as wxUSE_XRC, i.e. 1 by default. // // Recommended setting: 1 (required by XRC) #define wxUSE_XML wxUSE_XRC // Use wxWidget's AUI docking system // // Default is 1 // // Recommended setting: 1 #define wxUSE_AUI 0 // Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced // 2D drawing API. (Still somewhat experimental) // // Please note that on Windows you will need to link with gdiplus.lib (use // USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your // application if you want it to be runnable on pre-XP systems. // // Default is 0 // // Recommended setting: 1 #ifndef wxUSE_GRAPHICS_CONTEXT #define wxUSE_GRAPHICS_CONTEXT 0 #endif // ---------------------------------------------------------------------------- // Individual GUI controls // ---------------------------------------------------------------------------- // You must set wxUSE_CONTROLS to 1 if you are using any controls at all // (without it, wxControl class is not compiled) // // Default is 1 // // Recommended setting: 1 (don't change except for very special programs) #define wxUSE_CONTROLS 1 // wxPopupWindow class is a top level transient window. It is currently used // to implement wxTipWindow // // Default is 1 // // Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) #define wxUSE_POPUPWIN 0 // wxTipWindow allows to implement the custom tooltips, it is used by the // context help classes. Requires wxUSE_POPUPWIN. // // Default is 1 // // Recommended setting: 1 (may be set to 0) #define wxUSE_TIPWINDOW 0 // Each of the settings below corresponds to one wxWidgets control. They are // all switched on by default but may be disabled if you are sure that your // program (including any standard dialogs it can show!) doesn't need them and // if you desperately want to save some space. If you use any of these you must // set wxUSE_CONTROLS as well. // // Default is 1 // // Recommended setting: 1 #define wxUSE_ANIMATIONCTRL 0 // wxAnimationCtrl #define wxUSE_BUTTON 0 // wxButton #define wxUSE_BMPBUTTON 0 // wxBitmapButton #define wxUSE_CALENDARCTRL 0 // wxCalendarCtrl #define wxUSE_CHECKBOX 0 // wxCheckBox #define wxUSE_CHECKLISTBOX 0 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) #define wxUSE_CHOICE 0 // wxChoice #define wxUSE_COLLPANE 0 // wxCollapsiblePane #define wxUSE_COLOURPICKERCTRL 0 // wxColourPickerCtrl #define wxUSE_COMBOBOX 0 // wxComboBox #define wxUSE_DATAVIEWCTRL 0 // wxDataViewCtrl #define wxUSE_DATEPICKCTRL 0 // wxDatePickerCtrl #define wxUSE_DIRPICKERCTRL 0 // wxDirPickerCtrl #define wxUSE_FILEPICKERCTRL 0 // wxFilePickerCtrl #define wxUSE_FONTPICKERCTRL 0 // wxFontPickerCtrl #define wxUSE_GAUGE 0 // wxGauge #define wxUSE_HYPERLINKCTRL 0 // wxHyperlinkCtrl #define wxUSE_LISTBOX 0 // wxListBox #define wxUSE_LISTCTRL 0 // wxListCtrl #define wxUSE_RADIOBOX 0 // wxRadioBox #define wxUSE_RADIOBTN 1 // wxRadioButton #define wxUSE_SCROLLBAR 0 // wxScrollBar #define wxUSE_SLIDER 0 // wxSlider #define wxUSE_SPINBTN 0 // wxSpinButton #define wxUSE_SPINCTRL 0 // wxSpinCtrl #define wxUSE_STATBOX 0 // wxStaticBox #define wxUSE_STATLINE 0 // wxStaticLine #define wxUSE_STATTEXT 0 // wxStaticText #define wxUSE_STATBMP 0 // wxStaticBitmap #define wxUSE_TEXTCTRL 0 // wxTextCtrl #define wxUSE_TOGGLEBTN 0 // requires wxButton #define wxUSE_TREECTRL 0 // wxTreeCtrl // Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR // below either wxStatusBar95 or a generic wxStatusBar will be used. // // Default is 1 // // Recommended setting: 1 #define wxUSE_STATUSBAR 0 // Two status bar implementations are available under Win32: the generic one // or the wrapper around native control. For native look and feel the native // version should be used. // // Default is 1 for the platforms where native status bar is supported. // // Recommended setting: 1 (there is no advantage in using the generic one) #define wxUSE_NATIVE_STATUSBAR 0 // wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar // classes at all. Otherwise, use the native toolbar class unless // wxUSE_TOOLBAR_NATIVE is 0. // // Default is 1 for all settings. // // Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. #define wxUSE_TOOLBAR 0 #define wxUSE_TOOLBAR_NATIVE 0 // wxNotebook is a control with several "tabs" located on one of its sides. It // may be used to logically organise the data presented to the user instead of // putting everything in one huge dialog. It replaces wxTabControl and related // classes of wxWin 1.6x. // // Default is 1. // // Recommended setting: 1 #define wxUSE_NOTEBOOK 0 // wxListbook control is similar to wxNotebook but uses wxListCtrl instead of // the tabs // // Default is 1. // // Recommended setting: 1 #define wxUSE_LISTBOOK 0 // wxChoicebook control is similar to wxNotebook but uses wxChoice instead of // the tabs // // Default is 1. // // Recommended setting: 1 #define wxUSE_CHOICEBOOK 0 // wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of // the tabs // // Default is 1. // // Recommended setting: 1 #define wxUSE_TREEBOOK 0 // wxToolbook control is similar to wxNotebook but uses wxToolBar instead of // tabs // // Default is 1. // // Recommended setting: 1 #define wxUSE_TOOLBOOK 0 // wxTabDialog is a generic version of wxNotebook but it is incompatible with // the new class. It shouldn't be used in new code. // // Default is 0. // // Recommended setting: 0 (use wxNotebook) #define wxUSE_TAB_DIALOG 0 // wxGrid class // // Default is 1, set to 0 to cut down compilation time and binaries size if you // don't use it. // // Recommended setting: 1 // #define wxUSE_GRID 0 // wxMiniFrame class: a frame with narrow title bar // // Default is 1. // // Recommended setting: 1 (it doesn't cost almost anything) #define wxUSE_MINIFRAME 0 // wxComboCtrl and related classes: combobox with custom popup window and // not necessarily a listbox. // // Default is 1. // // Recommended setting: 1 but can be safely set to 0 except for wxUniv where it // it used by wxComboBox #define wxUSE_COMBOCTRL 0 // wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox // items. // // Default is 1. // // Recommended setting: 1 but can be safely set to 0, except where it is // needed as a base class for generic wxBitmapComboBox. #define wxUSE_ODCOMBOBOX 0 // wxBitmapComboBox is a combobox that can have images in front of text items. // // Default is 1. // // Recommended setting: 1 but can be safely set to 0 #define wxUSE_BITMAPCOMBOBOX 0 // ---------------------------------------------------------------------------- // Miscellaneous GUI stuff // ---------------------------------------------------------------------------- // wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) #define wxUSE_ACCEL 0 // Hotkey support (currently Windows only) #define wxUSE_HOTKEY 0 // Use wxCaret: a class implementing a "cursor" in a text control (called caret // under Windows). // // Default is 1. // // Recommended setting: 1 (can be safely set to 0, not used by the library) #define wxUSE_CARET 0 // Use wxDisplay class: it allows enumerating all displays on a system and // their geometries as well as finding the display on which the given point or // window lies. // // Default is 1. // // Recommended setting: 1 if you need it, can be safely set to 0 otherwise #define wxUSE_DISPLAY 0 // Miscellaneous geometry code: needed for Canvas library #define wxUSE_GEOMETRY 0 // Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and // wxListCtrl. // // Default is 1. // // Recommended setting: 1 (set it to 0 if you don't use any of the controls // enumerated above, then this class is mostly useless too) #define wxUSE_IMAGLIST 0 // Use wxMenu, wxMenuBar, wxMenuItem. // // Default is 1. // // Recommended setting: 1 (can't be disabled under MSW) #define wxUSE_MENUS 1 // Use wxSashWindow class. // // Default is 1. // // Recommended setting: 1 #define wxUSE_SASH 0 // Use wxSplitterWindow class. // // Default is 1. // // Recommended setting: 1 #define wxUSE_SPLITTER 0 // Use wxToolTip and wxWindow::Set/GetToolTip() methods. // // Default is 1. // // Recommended setting: 1 #define wxUSE_TOOLTIPS 0 // wxValidator class and related methods #define wxUSE_VALIDATORS 1 // ---------------------------------------------------------------------------- // common dialogs // ---------------------------------------------------------------------------- // On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. // file selector, printer dialog). Switching this off also switches off the // printing architecture and interactive wxPrinterDC. // // Default is 1 // // Recommended setting: 1 (unless it really doesn't work) #define wxUSE_COMMON_DIALOGS 0 // wxBusyInfo displays window with message when app is busy. Works in same way // as wxBusyCursor #define wxUSE_BUSYINFO 0 // Use single/multiple choice dialogs. // // Default is 1 // // Recommended setting: 1 (used in the library itself) #define wxUSE_CHOICEDLG 0 // Use colour picker dialog // // Default is 1 // // Recommended setting: 1 #define wxUSE_COLOURDLG 0 // wxDirDlg class for getting a directory name from user #define wxUSE_DIRDLG 0 // TODO: setting to choose the generic or native one // Use file open/save dialogs. // // Default is 1 // // Recommended setting: 1 (used in many places in the library itself) #define wxUSE_FILEDLG 0 // Use find/replace dialogs. // // Default is 1 // // Recommended setting: 1 (but may be safely set to 0) #define wxUSE_FINDREPLDLG 0 // Use font picker dialog // // Default is 1 // // Recommended setting: 1 (used in the library itself) #define wxUSE_FONTDLG 0 // Use wxMessageDialog and wxMessageBox. // // Default is 1 // // Recommended setting: 1 (used in the library itself) #define wxUSE_MSGDLG 1 // progress dialog class for lengthy operations #define wxUSE_PROGRESSDLG 0 // support for startup tips (wxShowTip &c) #define wxUSE_STARTUP_TIPS 0 // text entry dialog and wxGetTextFromUser function #define wxUSE_TEXTDLG 0 // number entry dialog #define wxUSE_NUMBERDLG 0 // splash screen class #define wxUSE_SPLASH 0 // wizards #define wxUSE_WIZARDDLG 0 // Compile in wxAboutBox() function showing the standard "About" dialog. // // Default is 1 // // Recommended setting: 1 but can be set to 0 to save some space if you don't // use this function #define wxUSE_ABOUTDLG 0 // ---------------------------------------------------------------------------- // Metafiles support // ---------------------------------------------------------------------------- // Windows supports the graphics format known as metafile which is, though not // portable, is widely used under Windows and so is supported by wxWin (under // Windows only, of course). Win16 (Win3.1) used the so-called "Window // MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in // Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by // default, WMFs will be used under Win16 and EMFs under Win32. This may be // changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting // wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile // in any metafile related classes at all. // // Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. // // Recommended setting: default or 0 for everything for portable programs. #define wxUSE_METAFILE 0 #define wxUSE_ENH_METAFILE 0 #define wxUSE_WIN_METAFILES_ALWAYS 0 // ---------------------------------------------------------------------------- // Big GUI components // ---------------------------------------------------------------------------- // Set to 0 to disable MDI support. // // Requires wxUSE_NOTEBOOK under platforms other than MSW. // // Default is 1. // // Recommended setting: 1, can be safely set to 0. #define wxUSE_MDI 0 // Set to 0 to disable document/view architecture #define wxUSE_DOC_VIEW_ARCHITECTURE 0 // Set to 0 to disable MDI document/view architecture // // Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE #define wxUSE_MDI_ARCHITECTURE 0 // Set to 0 to disable print/preview architecture code #define wxUSE_PRINTING_ARCHITECTURE 0 // wxHTML sublibrary allows to display HTML in wxWindow programs and much, // much more. // // Default is 1. // // Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a // smaller library. #define wxUSE_HTML 1 // Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL // headers and libraries to be able to compile the library with wxUSE_GLCANVAS // set to 1. Note that for some compilers (notably Microsoft Visual C++) you // will need to manually add opengl32.lib and glu32.lib to the list of // libraries linked with your program if you use OpenGL. // // Default is 0. // // Recommended setting: 1 if you intend to use OpenGL, 0 otherwise #define wxUSE_GLCANVAS 0 // wxRichTextCtrl allows editing of styled text. // // Default is 1. // // Recommended setting: 1, set to 0 if you want compile a // smaller library. #define wxUSE_RICHTEXT 0 // ---------------------------------------------------------------------------- // Data transfer // ---------------------------------------------------------------------------- // Use wxClipboard class for clipboard copy/paste. // // Default is 1. // // Recommended setting: 1 #define wxUSE_CLIPBOARD 0 // Use wxDataObject and related classes. Needed for clipboard and OLE drag and // drop // // Default is 1. // // Recommended setting: 1 #define wxUSE_DATAOBJ 0 // Use wxDropTarget and wxDropSource classes for drag and drop (this is // different from "built in" drag and drop in wxTreeCtrl which is always // available). Requires wxUSE_DATAOBJ. // // Default is 1. // // Recommended setting: 1 #define wxUSE_DRAG_AND_DROP 0 // Use wxAccessible for enhanced and customisable accessibility. // Depends on wxUSE_OLE. // // Default is 0. // // Recommended setting (at present): 0 #define wxUSE_ACCESSIBILITY 0 // ---------------------------------------------------------------------------- // miscellaneous settings // ---------------------------------------------------------------------------- // wxSingleInstanceChecker class allows to verify at startup if another program // instance is running (it is only available under Win32) // // Default is 1 // // Recommended setting: 1 (the class is tiny, disabling it won't save much // space) #define wxUSE_SNGLINST_CHECKER 0 #define wxUSE_DRAGIMAGE 0 #define wxUSE_IPC 0 // 0 for no interprocess comms #define wxUSE_HELP 0 // 0 for no help facility // Should we use MS HTML help for wxHelpController? If disabled, neither // wxCHMHelpController nor wxBestHelpController are available. // // Default is 1 under MSW, 0 is always used for the other platforms. // // Recommended setting: 1, only set to 0 if you have trouble compiling // wxCHMHelpController (could be a problem with really ancient compilers) #define wxUSE_MS_HTML_HELP 0 // Use wxHTML-based help controller? #define wxUSE_WXHTML_HELP 0 #define wxUSE_RESOURCES 0 // 0 for no wxGetResource/wxWriteResource #define wxUSE_CONSTRAINTS 0 // 0 for no window layout constraint system #define wxUSE_SPLINES 0 // 0 for no splines #define wxUSE_MOUSEWHEEL 0 // Include mouse wheel support // ---------------------------------------------------------------------------- // postscript support settings // ---------------------------------------------------------------------------- // Set to 1 for PostScript device context. #define wxUSE_POSTSCRIPT 0 // Set to 1 to use font metric files in GetTextExtent #define wxUSE_AFM_FOR_POSTSCRIPT 0 // ---------------------------------------------------------------------------- // database classes // ---------------------------------------------------------------------------- // Define 1 to use ODBC classes #define wxUSE_ODBC 0 // For backward compatibility reasons, this parameter now only controls the // default scrolling method used by cursors. This default behavior can be // overridden by setting the second param of wxDB::wxDbGetConnection() or // wxDb() constructor to indicate whether the connection (and any wxDbTable()s // that use the connection) should support forward only scrolling of cursors, // or both forward and backward support for backward scrolling cursors is // dependent on the data source as well as the ODBC driver being used. #define wxODBC_FWD_ONLY_CURSORS 0 // Default is 0. Set to 1 to use the deprecated classes, enum types, function, // member variables. With a setting of 1, full backward compatibility with the // 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, // as future development will be done only on the non-deprecated // functions/classes/member variables/etc. #define wxODBC_BACKWARD_COMPATABILITY 0 // ---------------------------------------------------------------------------- // other compiler (mis)features // ---------------------------------------------------------------------------- // Set this to 0 if your compiler can't cope with omission of prototype // parameters. // // Default is 1. // // Recommended setting: 1 (should never need to set this to 0) #define REMOVE_UNUSED_ARG 1 // VC++ 4.2 and above allows and but you can't mix // them. Set to 1 for , 0 for . Note that VC++ 7.1 // and later doesn't support wxUSE_IOSTREAMH == 1 and so will be // used anyhow. // // Default is 1. // // Recommended setting: whatever your compiler likes more #define wxUSE_IOSTREAMH 1 // ---------------------------------------------------------------------------- // image format support // ---------------------------------------------------------------------------- // wxImage supports many different image formats which can be configured at // compile-time. BMP is always supported, others are optional and can be safely // disabled if you don't plan to use images in such format sometimes saving // substantial amount of code in the final library. // // Some formats require an extra library which is included in wxWin sources // which is mentioned if it is the case. // Set to 1 for wxImage support (recommended). #define wxUSE_IMAGE 1 // Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. #define wxUSE_LIBPNG 0 // Set to 1 for JPEG format support (requires libjpeg) #define wxUSE_LIBJPEG 0 // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 0 // Set to 1 for TGA format support (loading only) #define wxUSE_TGA 0 // Set to 1 for GIF format support #define wxUSE_GIF 1 // Set to 1 for PNM format support #define wxUSE_PNM 0 // Set to 1 for PCX format support #define wxUSE_PCX 0 // Set to 1 for IFF format support (Amiga format) #define wxUSE_IFF 0 // Set to 1 for XPM format support #define wxUSE_XPM 0 // Set to 1 for MS Icons and Cursors format support #define wxUSE_ICO_CUR 0 // Set to 1 to compile in wxPalette class #define wxUSE_PALETTE 0 // ---------------------------------------------------------------------------- // wxUniversal-only options // ---------------------------------------------------------------------------- // Set to 1 to enable compilation of all themes, this is the default #define wxUSE_ALL_THEMES 0 // Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES // is unset, if it is set these options are not used; notice that metal theme // uses Win32 one #define wxUSE_THEME_GTK 0 #define wxUSE_THEME_METAL 0 #define wxUSE_THEME_MONO 0 #define wxUSE_THEME_WIN32 0 /* --- end common options --- */ // ---------------------------------------------------------------------------- // Windows-only settings // ---------------------------------------------------------------------------- // Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode // and want to run your programs under Windows 9x and not only NT/2000/XP. // This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see // http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note // that you will have to modify the makefiles to include unicows.lib import // library as the first library (see installation instructions in install.txt // to learn how to do it when building the library or samples). // // If your compiler doesn't have unicows.lib, you can get a version of it at // http://libunicows.sourceforge.net // // Default is 0 // // Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) #ifndef wxUSE_UNICODE_MSLU #define wxUSE_UNICODE_MSLU 0 #endif // Set this to 1 if you want to use wxWidgets and MFC in the same program. This // will override some other settings (see below) // // Default is 0. // // Recommended setting: 0 unless you really have to use MFC #define wxUSE_MFC 0 // Set this to 1 for generic OLE support: this is required for drag-and-drop, // clipboard, OLE Automation. Only set it to 0 if your compiler is very old and // can't compile/doesn't have the OLE headers. // // Default is 1. // // Recommended setting: 1 #define wxUSE_OLE 0 // Set this to 1 to enable wxAutomationObject class. // // Default is 1. // // Recommended setting: 1 if you need to control other applications via OLE // Automation, can be safely set to 0 otherwise #define wxUSE_OLE_AUTOMATION 0 // Set this to 1 to enable wxActiveXContainer class allowing to embed OLE // controls in wx. // // Default is 1. // // Recommended setting: 1, required by wxMediaCtrl #define wxUSE_ACTIVEX 0 // wxDC caching implementation #define wxUSE_DC_CACHEING 0 // Set this to 1 to enable the use of DIB's for wxBitmap to support // bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. #define wxUSE_DIB_FOR_BITMAP 0 // Set this to 1 to enable wxDIB class used internally for manipulating // wxBitmao data. // // Default is 1, set it to 0 only if you don't use wxImage neither // // Recommended setting: 1 (without it conversion to/from wxImage won't work) #define wxUSE_WXDIB 1 // Set to 0 to disable PostScript print/preview architecture code under Windows // (just use Windows printing). #define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 // Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH // which allows to put more than ~32Kb of text in it even under Win9x (NT // doesn't have such limitation). // // Default is 1 for compilers which support it // // Recommended setting: 1, only set it to 0 if your compiler doesn't have // or can't compile #define wxUSE_RICHEDIT 0 // Set this to 1 to use extra features of richedit v2 and later controls // // Default is 1 for compilers which support it // // Recommended setting: 1 #define wxUSE_RICHEDIT2 0 // Set this to 1 to enable support for the owner-drawn menu and listboxes. This // is required by wxUSE_CHECKLISTBOX. // // Default is 1. // // Recommended setting: 1, set to 0 for a small library size reduction #define wxUSE_OWNER_DRAWN 0 // Set to 1 to compile MS Windows XP theme engine support #define wxUSE_UXTHEME 0 // Set to 1 to auto-adapt to MS Windows XP themes where possible // (notably, wxNotebook pages) #define wxUSE_UXTHEME_AUTO 0 // Set to 1 to use InkEdit control (Tablet PC), if available #define wxUSE_INKEDIT 0 // ---------------------------------------------------------------------------- // Generic versions of native controls // ---------------------------------------------------------------------------- // Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the // native wxDatePickerCtrl // // Default is 0. // // Recommended setting: 0, this is mainly used for testing #define wxUSE_DATEPICKCTRL_GENERIC 0 // ---------------------------------------------------------------------------- // Crash debugging helpers // ---------------------------------------------------------------------------- // Set this to 1 to be able to use wxCrashReport::Generate() to create mini // dumps of your program when it crashes (or at any other moment) // // Default is 1 if supported by the compiler (VC++ and recent BC++ only). // // Recommended setting: 1, set to 0 if your programs never crash #define wxUSE_CRASHREPORT 0 // ---------------------------------------------------------------------------- // obsolete settings // ---------------------------------------------------------------------------- // NB: all settings in this section are obsolete and should not be used/changed // at all, they will disappear // Define 1 to use bitmap messages. #define wxUSE_BITMAP_MESSAGE 0 #endif // _WX_SETUP_H_ nsis-3.11/Contrib/NSIS Menu/wx/wxbuild.bat000077500000000000000000000026741477201124000202710ustar00rootroot00000000000000@echo off if not exist setup.h goto setup_error if not exist "%WXWIN%\build\msw\makefile.vc" goto error set OLDCD=%CD% cd /D "%WXWIN%\build\msw" rem Save the old setup.h as old_setup.h in the starting dir. copy /y "%WXWIN%\include\wx\msw\setup.h" "%OLDCD%\old_setup.h" if "%1"=="unicode" goto unicode if "%1"=="ansi" goto ansi :ansi rem Ask if we want to delete this dir. echo Deleting... rd /S ..\..\lib\vc_libnsis echo ### building ANSI version ### rem Copy the ANSI version of setup.h to WXWIN setup. copy /y "%OLDCD%\setup.h" "%WXWIN%\include\wx\msw\setup.h" echo Deleting... rd /S vc_mswnsis nmake -f makefile.vc CFG=nsis BUILD=release RUNTIME_LIBS=static SHARED=0 UNICODE=0 WXUNIV=0 USE_OPENGL=0 USE_ODBC=0 USE_HTML=1 USE_XRC=0 if "%1"=="" goto unicode if "%1"=="all" goto unicode goto finish :unicode rem Ask if we want to delete this dir. echo Deleting... rd /S ..\..\lib\vc_libunsis echo ### building UNICODE version ### rem Copy the UNICODE version of setup.h to WXWIN setup. copy /y "%OLDCD%\setup.h" "%WXWIN%\include\wx\msw\setup.h" echo Deleting... rd /S vc_mswuunsis nmake -f makefile.vc CFG=unsis BUILD=release RUNTIME_LIBS=static SHARED=0 UNICODE=1 WXUNIV=0 USE_OPENGL=0 USE_ODBC=0 USE_HTML=1 USE_XRC=0 :finish rem Restore the setup.h copy /y "%OLDCD%\old_setup.h" "%WXWIN%\include\wx\msw\setup.h" cd /D "%OLDCD%" goto done :error echo WXWIN is not properly set goto done :setup_error echo setup.h cannot be found, wrong working directory? :done nsis-3.11/Contrib/NSISdl/000077500000000000000000000000001477201124000151045ustar00rootroot00000000000000nsis-3.11/Contrib/NSISdl/License.txt000077500000000000000000000016571477201124000172430ustar00rootroot00000000000000NSISdl 1.1 - HTTP downloading plugin for NSIS Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.nsis-3.11/Contrib/NSISdl/ReadMe.txt000077500000000000000000000056311477201124000170120ustar00rootroot00000000000000NSISdl 1.3 - HTTP downloading plugin for NSIS --------------------------------------------- Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel This plugin can be used from NSIS to download files via HTTP. Note: HTTPS is not supported, only plain HTTP! To connect to the internet, use the Dialer plugin. USAGE ----- NSISdl::download http://www.domain.com/file localfile.exe You can also pass /TIMEOUT to set the timeout in milliseconds: NSISdl::download /TIMEOUT=30000 http://www.domain.com/file localfile.exe The return value is pushed to the stack: "cancel" if cancelled "success" if success otherwise, an error string describing the error If you don't want the progress window to appear, use NSISdl::download_quiet. Example of usage: NSISdl::download http://www.domain.com/file localfile.exe Pop $R0 ;Get the return value StrCmp $R0 "success" +3 MessageBox MB_OK "Download failed: $R0" Quit For another example, see waplugin.nsi in the examples directory. PROXIES ------- NSISdl supports only basic configurations of proxies. It doesn't support proxies which require authentication, automatic configuration script, etc. NSISdl reads the proxy configuration from Internet Explorer's registry key under HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings. It reads and parses ProxyEnable and ProxyServer. If you don't want NSISdl to use Internet Explorer's settings, use the /NOIEPROXY flag. /NOIEPROXY should be used after /TRANSLATE and /TIMEOUT. For example: If you want to specify a proxy on your own, use the /PROXY flag. NSISdl::download /NOIEPROXY http://www.domain.com/file localfile.exe NSISdl::download /TIMEOUT=30000 /NOIEPROXY http://www.domain.com/file localfile.exe NSISdl::download /PROXY proxy.whatever.com http://www.domain.com/file localfile.exe NSISdl::download /PROXY proxy.whatever.com:8080 http://www.domain.com/file localfile.exe TRANSLATE --------- To translate NSISdl add the following values to the call line: /TRANSLATE2 downloading connecting second minute hour seconds minutes hours progress Default values are: downloading - "Downloading %s" connecting - "Connecting ..." second - " (1 second remaining)" minute - " (1 minute remaining)" hour - " (1 hour remaining)" seconds - " (%u seconds remaining)" minutes - " (%u minutes remaining)" hours - " (%u hours remaining)" progress - "%skB (%d%%) of %skB @ %u.%01ukB/s" The old /TRANSLATE method still works for backward compatibility. /TRANSLATE downloading connecting second minute hour plural progress remaining Default values are: downloading - "Downloading %s" connecting - "Connecting ..." second - "second" minute - "minute" hour - "hour" plural - "s" progress - "%dkB (%d%%) of %ukB @ %d.%01dkB/s" remaining - " (%d %s%s remaining)" /TRANSLATE and /TRANSLATE2 must come before /TIMEOUT. nsis-3.11/Contrib/NSISdl/SConscript000077500000000000000000000005061477201124000171220ustar00rootroot00000000000000target = 'NSISdl' files = Split(""" asyncdns.cpp connection.cpp httpget.cpp nsisdl.cpp util.cpp """) libs = Split(""" advapi32 wsock32 user32 kernel32 """) docs = Split(""" License.txt ReadMe.txt """) Import('BuildPlugin') BuildPlugin( target, files, libs, docs = docs, cppused = True, nodeflib = False, ) nsis-3.11/Contrib/NSISdl/asyncdns.cpp000077500000000000000000000031401477201124000174330ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: asyncdns.cpp - JNL portable asynchronous DNS implementation ** License: see License.txt ** ** Unicode support by Jim Park -- 08/24/2007 */ // Jim Park: For Unicode Support, all string functions must explicitly use // ANSI versions if UNICODE is defined. #include "netinc.h" #include "util.h" #include "asyncdns.h" JNL_AsyncDNS::JNL_AsyncDNS() { m_thread=0; m_addr=0; m_hostname[0]=0; } JNL_AsyncDNS::~JNL_AsyncDNS() { wait_for_thread_death(); } DWORD WINAPI JNL_AsyncDNS::_threadfunc(LPVOID _d) { JNL_AsyncDNS *_this=(JNL_AsyncDNS*)_d; struct hostent *hostentry; hostentry=::gethostbyname(_this->m_hostname); if (hostentry) { _this->m_addr=*((int*)hostentry->h_addr); } else _this->m_addr=INADDR_NONE; return 0; } int JNL_AsyncDNS::resolve(char *hostname, unsigned long *addr) { // return 0 on success, 1 on wait, -1 on unresolvable unsigned long ip=inet_addr(hostname); if (ip != INADDR_NONE) { *addr=ip; return 0; } if (lstrcmpiA(m_hostname,hostname)) m_addr=0; else if (m_addr == INADDR_NONE) { wait_for_thread_death(); return -1; } else if (m_addr) { *addr=m_addr; wait_for_thread_death(); return 0; } lstrcpyA(m_hostname,hostname); if (!m_thread) { DWORD id; m_thread=CreateThread(NULL,0,_threadfunc,(LPVOID)this,0,&id); if (!m_thread) return -1; } return 1; } void JNL_AsyncDNS::wait_for_thread_death() { if (m_thread) { WaitForSingleObject(m_thread,INFINITE); CloseHandle(m_thread); } m_thread=0; } nsis-3.11/Contrib/NSISdl/asyncdns.h000077500000000000000000000022111477201124000170760ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: asyncdns.h - JNL portable asynchronous DNS interface ** License: see License.txt ** ** Usage: ** 1. Create JNL_AsyncDNS object, optionally with the number of cache entries. ** 2. call resolve() to resolve a hostname into an address. The return value of ** resolve is 0 on success (host successfully resolved), 1 on wait (meaning ** try calling resolve() with the same hostname in a few hundred milliseconds ** or so), or -1 on error (i.e. the host can't resolve). ** 4. enjoy. ** ** Unicode support by Jim Park -- 08/24/2007 */ // Jim Park: Inet host name is strictly ANSI, no UNICODE for now. #ifndef _ASYNCDNS_H_ #define _ASYNCDNS_H_ class JNL_AsyncDNS { public: JNL_AsyncDNS(); ~JNL_AsyncDNS(); int resolve(char *hostname, unsigned long *addr); // return 0 on success, 1 on wait, -1 on unresolvable private: void wait_for_thread_death(); char m_hostname[256]; unsigned long m_addr; HANDLE m_thread; static unsigned long WINAPI _threadfunc(LPVOID _d); }; #endif //_ASYNCDNS_H_ nsis-3.11/Contrib/NSISdl/connection.cpp000077500000000000000000000244511477201124000177600ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: connection.cpp - JNL TCP connection implementation ** License: see License.txt ** ** Unicode support by Jim Park -- 08/24/2007 */ #include "netinc.h" #include "util.h" #include "connection.h" JNL_Connection::JNL_Connection(JNL_AsyncDNS *dns, int sendbufsize, int recvbufsize) { m_errorstr=""; if (dns == JNL_CONNECTION_AUTODNS) { m_dns=new JNL_AsyncDNS(); m_dns_owned=1; } else { m_dns=dns; m_dns_owned=0; } m_recv_buffer_len=recvbufsize; m_send_buffer_len=sendbufsize; m_recv_buffer=(char*)malloc(m_recv_buffer_len); m_send_buffer=(char*)malloc(m_send_buffer_len); m_socket=INVALID_SOCKET; m_remote_port=0; m_state=STATE_NOCONNECTION; m_recv_len=m_recv_pos=0; m_send_len=m_send_pos=0; m_host[0]=0; memset(&m_saddr,0,sizeof(m_saddr)); } void JNL_Connection::connect(PORTABLE_SOCKET s, struct sockaddr_in *loc) { close(1); m_socket=s; m_remote_port=0; m_dns=NULL; if (loc) m_saddr=*loc; else memset(&m_saddr,0,sizeof(m_saddr)); if (m_socket != INVALID_SOCKET) { SET_SOCK_BLOCK(m_socket,0); m_state=STATE_CONNECTED; } else { m_errorstr="invalid socket passed to connect"; m_state=STATE_ERROR; } } void JNL_Connection::connect(char *hostname, int port) { close(1); m_remote_port=(short)port; m_socket=::socket(AF_INET,SOCK_STREAM,0); if (m_socket==INVALID_SOCKET) { m_errorstr="creating socket"; m_state=STATE_ERROR; } else { SET_SOCK_BLOCK(m_socket,0); strncpy(m_host,hostname,sizeof(m_host)-1); m_host[sizeof(m_host)-1]=0; memset(&m_saddr,0,sizeof(m_saddr)); if (!m_host[0]) { m_errorstr="empty hostname"; m_state=STATE_ERROR; } else { m_state=STATE_RESOLVING; m_saddr.sin_family=AF_INET; m_saddr.sin_port=htons((unsigned short)port); m_saddr.sin_addr.s_addr=inet_addr(hostname); } } } JNL_Connection::~JNL_Connection() { if (m_socket != INVALID_SOCKET) { ::shutdown(m_socket, SHUT_RDWR); ::closesocket(m_socket); m_socket=INVALID_SOCKET; } free(m_recv_buffer); free(m_send_buffer); if (m_dns_owned) { delete m_dns; } } void JNL_Connection::run(int max_send_bytes, int max_recv_bytes, int *bytes_sent, int *bytes_rcvd) { int bytes_allowed_to_send=(max_send_bytes<0)?m_send_buffer_len:max_send_bytes; int bytes_allowed_to_recv=(max_recv_bytes<0)?m_recv_buffer_len:max_recv_bytes; if (bytes_sent) *bytes_sent=0; if (bytes_rcvd) *bytes_rcvd=0; switch (m_state) { case STATE_RESOLVING: if (m_saddr.sin_addr.s_addr == INADDR_NONE) { int a=m_dns?m_dns->resolve(m_host,(unsigned long int *)&m_saddr.sin_addr.s_addr):-1; if (!a) { m_state=STATE_CONNECTING; } else if (a == 1) { m_state=STATE_RESOLVING; break; } else { m_errorstr="resolving hostname"; m_state=STATE_ERROR; return; } } if (!::connect(m_socket,(struct sockaddr *)&m_saddr,16)) { m_state=STATE_CONNECTED; } else if (ERRNO!=EINPROGRESS) { m_errorstr="connecting to host"; m_state=STATE_ERROR; } else { m_state=STATE_CONNECTING; } break; case STATE_CONNECTING: { fd_set f[3]; FD_ZERO(&f[0]); FD_ZERO(&f[1]); FD_ZERO(&f[2]); FD_SET(m_socket,&f[0]); FD_SET(m_socket,&f[1]); FD_SET(m_socket,&f[2]); struct timeval tv; memset(&tv,0,sizeof(tv)); if (select((int)(m_socket+1),&f[0],&f[1],&f[2],&tv)==-1) { m_errorstr="connecting to host (calling select())"; m_state=STATE_ERROR; } else if (FD_ISSET(m_socket,&f[1])) { m_state=STATE_CONNECTED; } else if (FD_ISSET(m_socket,&f[2])) { m_errorstr="connecting to host"; m_state=STATE_ERROR; } } break; case STATE_CONNECTED: case STATE_CLOSING: if (m_send_len>0 && bytes_allowed_to_send>0) { int len=m_send_buffer_len-m_send_pos; if (len > m_send_len) len=m_send_len; if (len > bytes_allowed_to_send) len=bytes_allowed_to_send; if (len > 0) { int res=::send(m_socket,m_send_buffer+m_send_pos,len,0); if (res==-1 && ERRNO != EWOULDBLOCK) { // m_state=STATE_CLOSED; // return; } if (res>0) { bytes_allowed_to_send-=res; if (bytes_sent) *bytes_sent+=res; m_send_pos+=res; m_send_len-=res; } } if (m_send_pos>=m_send_buffer_len) { m_send_pos=0; if (m_send_len>0) { len=m_send_buffer_len-m_send_pos; if (len > m_send_len) len=m_send_len; if (len > bytes_allowed_to_send) len=bytes_allowed_to_send; int res=::send(m_socket,m_send_buffer+m_send_pos,len,0); if (res==-1 && ERRNO != EWOULDBLOCK) { // m_state=STATE_CLOSED; } if (res>0) { bytes_allowed_to_send-=res; if (bytes_sent) *bytes_sent+=res; m_send_pos+=res; m_send_len-=res; } } } } if (m_recv_len m_recv_buffer_len-m_recv_len) len=m_recv_buffer_len-m_recv_len; if (len > bytes_allowed_to_recv) len=bytes_allowed_to_recv; if (len>0) { int res=::recv(m_socket,m_recv_buffer+m_recv_pos,len,0); if (res == 0 || (res < 0 && ERRNO != EWOULDBLOCK)) { m_state=STATE_CLOSED; break; } if (res > 0) { bytes_allowed_to_recv-=res; if (bytes_rcvd) *bytes_rcvd+=res; m_recv_pos+=res; m_recv_len+=res; } } if (m_recv_pos >= m_recv_buffer_len) { m_recv_pos=0; if (m_recv_len < m_recv_buffer_len) { len=m_recv_buffer_len-m_recv_len; if (len > bytes_allowed_to_recv) len=bytes_allowed_to_recv; if (len > 0) { int res=::recv(m_socket,m_recv_buffer+m_recv_pos,len,0); if (res == 0 || (res < 0 && ERRNO != EWOULDBLOCK)) { m_state=STATE_CLOSED; break; } if (res > 0) { bytes_allowed_to_recv-=res; if (bytes_rcvd) *bytes_rcvd+=res; m_recv_pos+=res; m_recv_len+=res; } } } } } if (m_state == STATE_CLOSING) { if (m_send_len < 1) m_state = STATE_CLOSED; } break; default: break; } } void JNL_Connection::close(int quick) { if (quick || m_state == STATE_RESOLVING || m_state == STATE_CONNECTING) { m_state=STATE_CLOSED; if (m_socket != INVALID_SOCKET) { ::shutdown(m_socket, SHUT_RDWR); ::closesocket(m_socket); } m_socket=INVALID_SOCKET; memset(m_recv_buffer,0,m_recv_buffer_len); memset(m_send_buffer,0,m_send_buffer_len); m_remote_port=0; m_recv_len=m_recv_pos=0; m_send_len=m_send_pos=0; m_host[0]=0; memset(&m_saddr,0,sizeof(m_saddr)); } else { if (m_state == STATE_CONNECTED) m_state=STATE_CLOSING; } } int JNL_Connection::send_bytes_in_queue(void) { return m_send_len; } int JNL_Connection::send_bytes_available(void) { return m_send_buffer_len-m_send_len; } int JNL_Connection::send(char *data, int length) { if (length > send_bytes_available()) { return -1; } int write_pos=m_send_pos+m_send_len; if (write_pos >= m_send_buffer_len) { write_pos-=m_send_buffer_len; } int len=m_send_buffer_len-write_pos; if (len > length) { len=length; } memcpy(m_send_buffer+write_pos,data,len); if (length > len) { memcpy(m_send_buffer,data+len,length-len); } m_send_len+=length; return 0; } int JNL_Connection::send_string(char *line) { return send(line,strlen(line)); } int JNL_Connection::recv_bytes_available(void) { return m_recv_len; } int JNL_Connection::peek_bytes(char *data, int maxlength) { if (maxlength > m_recv_len) { maxlength=m_recv_len; } int read_pos=m_recv_pos-m_recv_len; if (read_pos < 0) { read_pos += m_recv_buffer_len; } int len=m_recv_buffer_len-read_pos; if (len > maxlength) { len=maxlength; } memcpy(data,m_recv_buffer+read_pos,len); if (len < maxlength) { memcpy(data+len,m_recv_buffer,maxlength-len); } return maxlength; } int JNL_Connection::recv_bytes(char *data, int maxlength) { int ml=peek_bytes(data,maxlength); m_recv_len-=ml; return ml; } int JNL_Connection::getbfromrecv(int pos, int remove) { int read_pos=m_recv_pos-m_recv_len + pos; if (pos < 0 || pos > m_recv_len) return -1; if (read_pos < 0) { read_pos += m_recv_buffer_len; } if (read_pos >= m_recv_buffer_len) { read_pos-=m_recv_buffer_len; } if (remove) m_recv_len--; return m_recv_buffer[read_pos]; } int JNL_Connection::recv_lines_available(void) { int l=recv_bytes_available(); int lcount=0; int lastch=0; int pos; for (pos=0; pos < l; pos ++) { int t=getbfromrecv(pos,0); if (t == -1) return lcount; if ((t=='\r' || t=='\n') &&( (lastch != '\r' && lastch != '\n') || lastch==t )) lcount++; lastch=t; } return lcount; } int JNL_Connection::recv_line(char *line, int maxlength) { if (maxlength > m_recv_len) maxlength=m_recv_len; while (maxlength--) { int t=getbfromrecv(0,1); if (t == -1) { *line=0; return 0; } if (t == '\r' || t == '\n') { int r=getbfromrecv(0,0); if ((r == '\r' || r == '\n') && r != t) getbfromrecv(0,1); *line=0; return 0; } *line++=(char)t; } return 1; } unsigned long JNL_Connection::get_interface(void) { if (m_socket==INVALID_SOCKET) return 0; struct sockaddr_in sin; memset(&sin,0,sizeof(sin)); socklen_t len=16; if (::getsockname(m_socket,(struct sockaddr *)&sin,&len)) return 0; return (unsigned long) sin.sin_addr.s_addr; } nsis-3.11/Contrib/NSISdl/connection.h000077500000000000000000000130101477201124000174120ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: connection.h - JNL TCP connection interface ** License: see License.txt ** ** Usage: ** 1. Create a JNL_Connection object, optionally specifying a JNL_AsyncDNS ** object to use (or NULL for none, or JNL_CONNECTION_AUTODNS for auto), ** and the send and receive buffer sizes. ** 2. Call connect() to have it connect to a host/port (the hostname will be ** resolved if possible). ** 3. call run() with the maximum send/recv amounts, and optionally parameters ** so you can tell how much has been send/received. You want to do this a lot, while: ** 4. check get_state() to check the state of the connection. The states are: ** JNL_Connection::STATE_ERROR ** - an error has occurred on the connection. the connection has closed, ** and you can no longer write to the socket (there still might be ** data in the receive buffer - use recv_bytes_available()). ** JNL_Connection::STATE_NOCONNECTION ** - no connection has been made yet. call connect() already! :) ** JNL_Connection::STATE_RESOLVING ** - the connection is still waiting for a JNL_AsycnDNS to resolve the ** host. ** JNL_Connection::STATE_CONNECTING ** - the asynchronous call to connect() is still running. ** JNL_Connection::STATE_CONNECTED ** - the connection has connected, all is well. ** JNL_Connection::STATE_CLOSING ** - the connection is closing. This happens after a call to close, ** without the quick parameter set. This means that the connection ** will close once the data in the send buffer is sent (data could ** still be being received when it would be closed). After it is ** closed, the state will transition to: ** JNL_Connection::STATE_CLOSED ** - the connection has closed, generally without error. There still ** might be data in the receive buffer, use recv_bytes_available(). ** 5. Use send() and send_string() to send data. You can use ** send_bytes_in_queue() to see how much has yet to go out, or ** send_bytes_available() to see how much you can write. If you use send() ** or send_string() and not enough room is available, both functions will ** return error ( < 0) ** 6. Use recv() and recv_line() to get data. If you want to see how much data ** there is, use recv_bytes_available() and recv_lines_available(). If you ** call recv() and not enough data is available, recv() will return how much ** data was actually read. See comments at the function defs. ** ** 7. To close, call close(1) for a quick close, or close() for a close that will ** make the socket close after sending all the data sent. ** ** 8. delete ye' ol' object. ** ** Unicode support by Jim Park -- 08/24/2007 ** Keep all the stuff here strictly ANSI. */ #ifndef _CONNECTION_H_ #define _CONNECTION_H_ #include "asyncdns.h" #include "netinc.h" #define JNL_CONNECTION_AUTODNS ((JNL_AsyncDNS*)-1) class JNL_Connection { public: typedef enum { STATE_ERROR, STATE_NOCONNECTION, STATE_RESOLVING, STATE_CONNECTING, STATE_CONNECTED, STATE_CLOSING, STATE_CLOSED } state; JNL_Connection(JNL_AsyncDNS *dns=JNL_CONNECTION_AUTODNS, int sendbufsize=8192, int recvbufsize=8192); ~JNL_Connection(); void connect(char *hostname, int port); void connect(PORTABLE_SOCKET sock, struct sockaddr_in *loc=NULL); // used by the listen object, usually not needed by users. void run(int max_send_bytes=-1, int max_recv_bytes=-1, int *bytes_sent=NULL, int *bytes_rcvd=NULL); int get_state() { return m_state; } const char *get_errstr() { return m_errorstr; } void close(int quick=0); void flush_send(void) { m_send_len=m_send_pos=0; } int send_bytes_in_queue(void); int send_bytes_available(void); int send(char *data, int length); // returns -1 if not enough room int send_string(char *line); // returns -1 if not enough room int recv_bytes_available(void); int recv_bytes(char *data, int maxlength); // returns actual bytes read unsigned int recv_int(void); int recv_lines_available(void); int recv_line(char *line, int maxlength); // returns 0 if the line was terminated with a \r or \n, 1 if not. // (i.e. if you specify maxlength=10, and the line is 12 bytes long // it will return 1. or if there is no \r or \n and that's all the data // the connection has.) int peek_bytes(char *data, int maxlength); // returns bytes peeked unsigned long get_interface(void); // this returns the interface the connection is on unsigned long get_remote(void) { return m_saddr.sin_addr.s_addr; } // remote host ip. short get_remote_port(void) { return m_remote_port; } // this returns the remote port of connection protected: PORTABLE_SOCKET m_socket; short m_remote_port; char *m_recv_buffer; char *m_send_buffer; int m_recv_buffer_len; int m_send_buffer_len; int m_recv_pos; int m_recv_len; int m_send_pos; int m_send_len; struct sockaddr_in m_saddr; char m_host[256]; JNL_AsyncDNS *m_dns; int m_dns_owned; state m_state; const char *m_errorstr; int getbfromrecv(int pos, int remove); // used by recv_line* }; #endif // _Connection_H_ nsis-3.11/Contrib/NSISdl/httpget.cpp000077500000000000000000000323701477201124000172770ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: httpget.cpp - JNL HTTP GET implementation ** License: see License.txt ** ** Unicode support by Jim Park -- 08/24/2007 */ #include "netinc.h" #include "util.h" #include "httpget.h" static const char g_errstr_oom[] = "error allocating memory"; template static int classify_scheme_char(T c) { if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')) return 0; return c == '+' || c == '-' || c == '.' ? 1 : -1; } template static unsigned int get_scheme_length(T*s) { if (classify_scheme_char(s[0]) != 0) return 0; // The first character MUST be a-z||A-Z. (RFC 3986 3.1) for (unsigned int i=0;;) { if (s[++i] == ':') return ++i; // Length including ':' if (classify_scheme_char(s[i]) < 0) return 0; } } enum { GLT_ABS=0, GLT_NETREL, GLT_ROOTREL, GLT_PATHREL }; template static unsigned int get_location_type(T*s) { unsigned int len=get_scheme_length(s); if (len) return GLT_ABS; // "xyz:..." s+=len; // Note: The authority section is not skipped here because it is assumed to not exist without a scheme! if (s[0] != '/') return GLT_PATHREL; // "xyz..." or "./xyz..." (or "" but don't rely on this) if (s[1] == '/') return GLT_NETREL; // "//..." (relative "network-path reference") return GLT_ROOTREL; // "/" or "/xyz..." } JNL_HTTPGet::JNL_HTTPGet(JNL_AsyncDNS *dns, int recvbufsize, char *proxy) { m_recvbufsize=recvbufsize; m_dns=dns; m_con=NULL; m_http_proxylpinfo=0; m_http_proxyhost=0; m_http_proxyport=0; if (proxy && *proxy) { char *p=(char*)malloc(strlen(proxy)+1); if (p) { char *r=NULL; strcpy(p,proxy); do_parse_url(p,&m_http_proxyhost,&m_http_proxyport,&r,&m_http_proxylpinfo); free(r); free(p); } } m_sendheaders=NULL; reinit(); } void JNL_HTTPGet::reinit() { m_errstr=0; m_recvheaders=NULL; m_recvheaders_size=0; m_http_state=0; m_http_port=0; m_http_url=0; m_reply=0; m_http_host=m_http_lpinfo=m_http_request=NULL; } void JNL_HTTPGet::deinit() { delete m_con; free(m_recvheaders); free(m_http_url); free(m_http_host); free(m_http_lpinfo); free(m_http_request); free(m_errstr); free(m_reply); reinit(); } JNL_HTTPGet::~JNL_HTTPGet() { deinit(); free(m_sendheaders); free(m_http_proxylpinfo); free(m_http_proxyhost); } void JNL_HTTPGet::addheader(const char *header) { //if (strstr(header,"\r") || strstr(header,"\n")) return; if (!m_sendheaders) { m_sendheaders=(char*)malloc(strlen(header)+3); if (m_sendheaders) { strcpy(m_sendheaders,header); strcat(m_sendheaders,"\r\n"); } } else { char *t=(char*)malloc(strlen(header)+strlen(m_sendheaders)+1+2); if (t) { strcpy(t,m_sendheaders); strcat(t,header); strcat(t,"\r\n"); free(m_sendheaders); m_sendheaders=t; } } } void JNL_HTTPGet::do_encode_mimestr(char *in, char *out) { char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int shift = 0; int accum = 0; while (*in) { if (*in) { accum <<= 8; shift += 8; accum |= *in++; } while ( shift >= 6 ) { shift -= 6; *out++ = alphabet[(accum >> shift) & 0x3F]; } } if (shift == 4) { *out++ = alphabet[(accum & 0xF)<<2]; *out++='='; } else if (shift == 2) { *out++ = alphabet[(accum & 0x3)<<4]; *out++='='; *out++='='; } *out++=0; } void JNL_HTTPGet::connect(const char *url) { deinit(); m_http_url=(char*)malloc(strlen(url)+1); strcpy(m_http_url,url); do_parse_url(m_http_url,&m_http_host,&m_http_port,&m_http_request, &m_http_lpinfo); strcpy(m_http_url,url); if (!m_http_host || !m_http_host[0] || !m_http_port) { m_http_state=-1; seterrstr("invalid URL"); return; } int sendbufferlen=0; if (!m_http_proxyhost || !m_http_proxyhost[0]) { sendbufferlen += 4 /* GET */ + strlen(m_http_request) + 9 /* HTTP/1.0 */ + 2; } else { sendbufferlen += 4 /* GET */ + strlen(m_http_url) + 9 /* HTTP/1.0 */ + 2; if (m_http_proxylpinfo&&m_http_proxylpinfo[0]) { sendbufferlen+=58+strlen(m_http_proxylpinfo)*2; // being safe here } } sendbufferlen += 5 /* Host: */ + strlen(m_http_host) + 2; if (m_http_lpinfo&&m_http_lpinfo[0]) { sendbufferlen+=46+strlen(m_http_lpinfo)*2; // being safe here } if (m_sendheaders) sendbufferlen+=strlen(m_sendheaders); char *str=(char*)malloc(sendbufferlen+1024); if (!str) { seterrstr(g_errstr_oom); m_http_state=-1; } if (!m_http_proxyhost || !m_http_proxyhost[0]) { wsprintfA(str,"GET %s HTTP/1.0\r\n",m_http_request); } else { wsprintfA(str,"GET %s HTTP/1.0\r\n",m_http_url); } wsprintfA(str+strlen(str),"Host: %s\r\n",m_http_host); if (m_http_lpinfo&&m_http_lpinfo[0]) { strcat(str,"Authorization: Basic "); do_encode_mimestr(m_http_lpinfo,str+strlen(str)); strcat(str,"\r\n"); } if (m_http_proxylpinfo&&m_http_proxylpinfo[0]) { strcat(str,"Proxy-Authorization: Basic "); do_encode_mimestr(m_http_proxylpinfo,str+strlen(str)); strcat(str,"\r\n"); } if (m_sendheaders) strcat(str,m_sendheaders); strcat(str,"\r\n"); int a=m_recvbufsize; if (a < 4096) a=4096; m_con=new JNL_Connection(m_dns,strlen(str)+4,a); if (m_con) { if (!m_http_proxyhost || !m_http_proxyhost[0]) { m_con->connect(m_http_host,m_http_port); } else { m_con->connect(m_http_proxyhost,m_http_proxyport); } m_con->send_string(str); } else { m_http_state=-1; seterrstr("could not create connection object"); } free(str); } static int my_strnicmp(char *b1, const char *b2, int l) { while (l-- && *b1 && *b2) { char bb1=*b1++; char bb2=*b2++; if (bb1>='a' && bb1 <= 'z') bb1+='A'-'a'; if (bb2>='a' && bb2 <= 'z') bb2+='A'-'a'; if (bb1 != bb2) return bb1-bb2; } return 0; } char *_strstr(const char *i, const char *s) { if (strlen(i)>=strlen(s)) while (i[strlen(s)-1]) { int l=strlen(s)+1; const char *ii=i; const char *is=s; while (--l>0) { if (*ii != *is) break; ii++; is++; } if (l==0) return const_cast(i); i++; } return NULL; } #define strstr _strstr void JNL_HTTPGet::do_parse_url(char *url, char **host, int *port, char **req, char **lp) { char *p,*np; free(*host); *host=0; free(*req); *req=0; free(*lp); *lp=0; if (strstr(url,"://")) np=p=strstr(url,"://")+3; else np=p=url; while (*np != '/' && *np) np++; if (*np) { *req=(char*)malloc(strlen(np)+1); if (*req) strcpy(*req,np); *np++=0; } else { *req=(char*)malloc(2); if (*req) strcpy(*req,"/"); } np=p; while (*np != '@' && *np) np++; if (*np) { *np++=0; *lp=(char*)malloc(strlen(p)+1); if (*lp) strcpy(*lp,p); p=np; } else { *lp=(char*)malloc(1); if (*lp) strcpy(*lp,""); } np=p; while (*np != ':' && *np) np++; if (*np) { *np++=0; *port=my_atoi(np); } else *port=80; *host=(char*)malloc(strlen(p)+1); if (*host) strcpy(*host,p); } const char *JNL_HTTPGet::getallheaders() { // double null terminated, null delimited list if (m_recvheaders) return m_recvheaders; else return "\0\0"; } const char *JNL_HTTPGet::getheader(const char *headername) { char *ret=NULL; if (strlen(headername)<1||!m_recvheaders) return NULL; char *p=m_recvheaders; while (*p) { if (!my_strnicmp(p,headername,strlen(headername))) { ret=p+strlen(headername); while (*ret == ' ') ret++; break; } p+=strlen(p)+1; } return ret; } int JNL_HTTPGet::run() { int cnt=0; if (m_http_state==-1||!m_con) return -1; // error run_again: static char main_buf[4096]; char *buf = main_buf; m_con->run(); if (m_con->get_state()==JNL_Connection::STATE_ERROR) { seterrstr(m_con->get_errstr()); return -1; } if (m_con->get_state()==JNL_Connection::STATE_CLOSED) return 1; if (m_http_state==0) // connected, waiting for reply { if (m_con->recv_lines_available()>0) { m_con->recv_line(buf,4095); buf[4095]=0; m_reply=(char*)malloc(strlen(buf)+1); if (!m_reply) { seterrstr(g_errstr_oom); return m_http_state=-1; } strcpy(m_reply,buf); if (strstr(buf,"200")) m_http_state=2; // proceed to read headers normally else if (strstr(buf,"301") || strstr(buf,"302")) { m_http_state=1; // redirect city } else { seterrstr(buf); m_http_state=-1; return -1; } cnt=0; } else if (!cnt++) goto run_again; } if (m_http_state == 1) // redirect { while (m_con->recv_lines_available() > 0) { m_con->recv_line(buf,4096); if (!buf[0]) { m_http_state=-1; return -1; } if (!my_strnicmp(buf,"Location:",9)) { char *p=buf+9; while (*p== ' ') p++; if (*p) { const char *orgloc=m_http_url, *e; char *newloc=p, *newbuf=0; if (my_strnicmp(newloc, "http://",7)) { unsigned int lenorg=0, sep=0, lennew=0; unsigned int newloctype=get_location_type(newloc); for (e=orgloc, lenorg=7; e[lenorg]; ++lenorg) // This assumes the original URL starts with "http://" { if (e[lenorg] == '/' || e[lenorg] == '?' || e[lenorg] == '#') // Is it the end of the authority section? break; } if (newloctype == GLT_ABS) { // A scheme we don't understand, let connect deal with it. } else { lennew=strlen(newloc); if (newloctype == GLT_NETREL) { lenorg=sizeof("http:")-1; // The new location is "//...", we must prepend the original scheme. } else if (newloctype != GLT_ROOTREL) { ++sep; // We need a separator between the original path and the new path. unsigned int lastsep=lenorg; for (e=orgloc; e[lastsep]; ++lastsep) { if (e[lastsep] == '/') lenorg = lastsep; if (e[lastsep] == '?' || e[lastsep] == '#') // Is it the end of the path section? break; } } p=malloc(lenorg+sep+lennew+1); if (!p) { seterrstr(g_errstr_oom); return m_http_state=-1; } strncpy(p,orgloc,++lenorg), p[lenorg]='\0'; if (sep) strcat(p, "/"); strcat(p,newloc); newbuf=newloc=p; } } connect(newloc); free(newbuf); return 0; } } } } if (m_http_state==2) { if (!cnt++ && m_con->recv_lines_available() < 1) goto run_again; while (m_con->recv_lines_available() > 0) { m_con->recv_line(buf,4096); if (!buf[0]) { m_http_state=3; break; } char *h = buf; // workaround for bug #1445735 // // some proxies, like WinProxy, prefix headers with tabs // or spaces. to make sure headers are detected properly, // this removes up to 128 useless white spaces. while ((h - buf < 128) && (*h == ' ' || *h == '\t')) h++; if (!m_recvheaders) { m_recvheaders_size=strlen(h)+1; m_recvheaders=(char*)malloc(m_recvheaders_size+1); if (m_recvheaders) { strcpy(m_recvheaders,h); m_recvheaders[m_recvheaders_size]=0; } } else { int oldsize=m_recvheaders_size; m_recvheaders_size+=strlen(h)+1; char *n=(char*)malloc(m_recvheaders_size+1); if (n) { memcpy(n,m_recvheaders,oldsize); strcpy(n+oldsize,h); n[m_recvheaders_size]=0; free(m_recvheaders); m_recvheaders=n; } } } } if (m_http_state==3) { } return 0; } int JNL_HTTPGet::get_status() // returns 0 if connecting, 1 if reading headers, // 2 if reading content, -1 if error. { if (m_http_state < 0) return -1; if (m_http_state < 2) return 0; if (m_http_state == 2) return 1; if (m_http_state == 3) return 2; return -1; } int JNL_HTTPGet::getreplycode()// returns 0 if none yet, otherwise returns http reply code. { if (!m_reply) return 0; char *p=m_reply; while (*p && *p != ' ') p++; // skip over HTTP/x.x if (!*p) return 0; return my_atoi(++p); } int JNL_HTTPGet::bytes_available() { if (m_con && m_http_state==3) return m_con->recv_bytes_available(); return 0; } int JNL_HTTPGet::get_bytes(char *buf, int len) { if (m_con && m_http_state==3) return m_con->recv_bytes(buf,len); return 0; } int JNL_HTTPGet::peek_bytes(char *buf, int len) { if (m_con && m_http_state==3) return m_con->peek_bytes(buf,len); return 0; } __int64 JNL_HTTPGet::content_length() { const char *p=getheader("content-length:"); if (!p) return 0; __int64 cl = myatoi64(p); if (cl > 0) return cl; // workaround for bug #1744091 // some buggy apache servers return negative values for sizes // over 2gb - fix it for them if (cl < 0) return (__int64)((unsigned int)(cl)); return 0; } nsis-3.11/Contrib/NSISdl/httpget.h000077500000000000000000000103701477201124000167400ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: httpget.h - JNL interface for doing HTTP GETs. ** License: see License.txt ** ** Usage: ** 1. Create a JNL_HTTPGet object, optionally specifying a JNL_AsyncDNS ** object to use (or NULL for none, or JNL_CONNECTION_AUTODNS for auto), ** and the receive buffer size, and a string specifying proxy (or NULL ** for none). See note on proxy string below. ** 2. call addheader() to add whatever headers you want. It is recommended to ** add at least the following two: ** addheader("User-Agent:MyApp (Mozilla)"); */// addheader("Accept:*/*"); /* ( the comment weirdness is there so I Can do the star-slash :) ** 3. Call connect() with the URL you wish to GET (see URL string note below) ** 4. Call run() once in a while, checking to see if it returns -1 ** (if it does return -1, call geterrorstr() to see what the error is). ** (if it returns 1, no big deal, the connection has closed). ** 5. While you're at it, you can call bytes_available() to see if any data ** from the http stream is available, or getheader() to see if any headers ** are available, or getreply() to see the HTTP reply, or getallheaders() ** to get a double null terminated, null delimited list of headers returned. ** 6. If you want to read from the stream, call get_bytes (which returns how much ** was actually read). ** 7. content_length() is a helper function that uses getheader() to check the ** content-length header. ** 8. Delete ye' ol' object when done. ** ** Proxy String: ** should be in the format of host:port, or user@host:port, or ** user:password@host:port. if port is not specified, 80 is assumed. ** URL String: ** should be in the format of http://user:pass@host:port/requestwhatever ** note that user, pass, port, and /requestwhatever are all optional :) ** note that also, http:// is really not important. if you do poo:// ** or even leave out the http:// altogether, it will still work. ** ** Reviewed for Unicode support by Jim Park -- 08/24/2004 ** Everything remains ANSI. Made sure all TCHAR style functions were ** changed to strictly ANSI. ** ** Notes: ** We used to have a fork of JNetLib in MakeNSISw that was slightly different, ** you can see it @ http://sf.net/p/nsis/code/6603/tree/NSIS/trunk/Contrib/Makensisw/jnetlib/ */ #ifndef _HTTPGET_H_ #define _HTTPGET_H_ #include "connection.h" class JNL_HTTPGet { public: JNL_HTTPGet(JNL_AsyncDNS *dns=JNL_CONNECTION_AUTODNS, int recvbufsize=16384, char *proxy=NULL); ~JNL_HTTPGet(); void addheader(const char *header); void connect(const char *url); int run(); // returns: 0 if all is OK. -1 if error (call geterrorstr()). 1 if connection closed. int get_status(); // returns 0 if connecting, 1 if reading headers, // 2 if reading content, -1 if error. const char *getallheaders(); // double null terminated, null delimited list const char *getheader(const char *headername); char *getreply() { return m_reply; } int getreplycode(); // returns 0 if none yet, otherwise returns http reply code. const char *geterrorstr() { return m_errstr;} int bytes_available(); int get_bytes(char *buf, int len); int peek_bytes(char *buf, int len); __int64 content_length(); JNL_Connection *get_con() { return m_con; } public: void reinit(); void deinit(); void seterrstr(const CHAR *str) { if (m_errstr) free(m_errstr); m_errstr=(char*)malloc(strlen(str)+1); strcpy(m_errstr,str); } void do_parse_url(char *url, char **host, int *port, char **req, char **lp); void do_encode_mimestr(char *in, char *out); JNL_AsyncDNS *m_dns; JNL_Connection *m_con; int m_recvbufsize; int m_http_state; int m_http_port; char *m_http_url; char *m_http_host; char *m_http_lpinfo; char *m_http_request; char *m_http_proxylpinfo; char *m_http_proxyhost; int m_http_proxyport; char *m_sendheaders; char *m_recvheaders; int m_recvheaders_size; char *m_reply; char *m_errstr; }; #endif // _HTTPGET_H_ nsis-3.11/Contrib/NSISdl/netinc.h000077500000000000000000000023651477201124000165460ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: netinc.h - network includes and portability defines (used internally) ** License: see License.txt ** ** Unicode support by Jim Park -- 08/24/2007 */ #ifndef _NETINC_H_ #define _NETINC_H_ #include #include "util.h" #define strcasecmp(x,y) stricmp(x,y) #define ERRNO (WSAGetLastError()) #define SET_SOCK_BLOCK(s,block) { unsigned long __i=block?0:1; ioctlsocket(s,FIONBIO,&__i); } #ifndef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #endif #ifndef EINPROGRESS #define EINPROGRESS WSAEWOULDBLOCK #endif #define memset mini_memset #define memcpy mini_memcpy // Jim Park: For Unicode support, we need to distinguish whether we are working on // Unicode or ANSI. #define strcpy lstrcpyA #define strncpy lstrcpynA #define strcat lstrcatA #define strlen lstrlenA #define malloc(x) (new char[x]) #define free(x) {delete [] x;} typedef int socklen_t; #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif #ifndef INADDR_ANY #define INADDR_ANY 0 #endif #ifndef SHUT_RDWR #define SHUT_RDWR 2 #endif #ifndef INVALID_SOCKET #define INVALID_SOCKET -1 #endif #define PORTABLE_SOCKET SOCKET #endif //_NETINC_H_ nsis-3.11/Contrib/NSISdl/nsisdl.cpp000077500000000000000000000436461477201124000171240ustar00rootroot00000000000000/* NSIS-DL 1.3 - http downloading DLL for NSIS Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/24/2007 */ #include #include #include #include "netinc.h" #include "util.h" #include "httpget.h" #include // nsis plugin void *operator new( size_t num_bytes ) { return GlobalAlloc(GPTR,num_bytes); } void operator delete( void *p ) { if (p) GlobalFree(p); } HMODULE hModule; HWND g_hwndProgressBar; HWND g_hwndStatic; static int g_cancelled; static WNDPROC lpWndProcOld; static UINT uMsgCreate; HWND childwnd; HWND hwndL; HWND hwndB; static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (uMsgCreate && message == uMsgCreate) { static HWND hwndPrevFocus; static BOOL fCancelDisabled; if (wParam) { childwnd = FindWindowEx((HWND) lParam, NULL, _T("#32770"), NULL); hwndL = GetDlgItem(childwnd, 1016); hwndB = GetDlgItem(childwnd, 1027); HWND hwndP = GetDlgItem(childwnd, 1004); HWND hwndS = GetDlgItem(childwnd, 1006); if (childwnd && hwndP && hwndS) { // Where to restore focus to before we disable the cancel button hwndPrevFocus = GetFocus(); if (!hwndPrevFocus) hwndPrevFocus = hwndP; if (IsWindowVisible(hwndL)) ShowWindow(hwndL, SW_HIDE); else hwndL = NULL; if (IsWindowVisible(hwndB)) ShowWindow(hwndB, SW_HIDE); else hwndB = NULL; RECT wndRect, ctlRect; GetClientRect(childwnd, &wndRect); GetWindowRect(hwndS, &ctlRect); HWND s = g_hwndStatic = CreateWindow( _T("STATIC"), _T(""), WS_CHILD | WS_CLIPSIBLINGS | SS_CENTER, 0, wndRect.bottom / 2 - (ctlRect.bottom - ctlRect.top) / 2, wndRect.right, ctlRect.bottom - ctlRect.top, childwnd, NULL, hModule, NULL ); DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS; dwStyle |= GetWindowLongPtr(hwndP, GWL_STYLE) & PBS_SMOOTH; GetWindowRect(hwndP, &ctlRect); HWND pb = g_hwndProgressBar = CreateWindow( _T("msctls_progress32"), _T(""), dwStyle, 0, wndRect.bottom / 2 + (ctlRect.bottom - ctlRect.top) / 2, wndRect.right, ctlRect.bottom - ctlRect.top, childwnd, NULL, hModule, NULL ); LRESULT c = SendMessage(hwndP, PBM_SETBARCOLOR, 0, 0); SendMessage(hwndP, PBM_SETBARCOLOR, 0, c); SendMessage(pb, PBM_SETBARCOLOR, 0, c); c = SendMessage(hwndP, PBM_SETBKCOLOR, 0, 0); SendMessage(hwndP, PBM_SETBKCOLOR, 0, c); SendMessage(pb, PBM_SETBKCOLOR, 0, c); // set font LRESULT hFont = SendMessage((HWND) lParam, WM_GETFONT, 0, 0); SendMessage(pb, WM_SETFONT, hFont, 0); SendMessage(s, WM_SETFONT, hFont, 0); ShowWindow(pb, SW_SHOWNA); ShowWindow(s, SW_SHOWNA); fCancelDisabled = EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE); SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwnd, IDCANCEL), TRUE); } else childwnd = NULL; } else if (childwnd) { if (hwndB) { ShowWindow(hwndB, SW_SHOWNA); hwndB = NULL; } if (hwndL) { ShowWindow(hwndL, SW_SHOWNA); hwndL = NULL; } // Prevent weird stuff happening if the cancel button happens to be // pressed at the moment we are finishing and restore the previous focus // and cancel button states SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)hwndPrevFocus, TRUE); SendMessage(GetDlgItem(hwnd, IDCANCEL), BM_SETSTATE, FALSE, 0); if (fCancelDisabled) EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE); if (g_hwndStatic) { DestroyWindow(g_hwndStatic); g_hwndStatic = NULL; } if (g_hwndProgressBar) { DestroyWindow(g_hwndProgressBar); g_hwndProgressBar = NULL; } childwnd = NULL; } } else if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL) { g_cancelled = 1; } else { return CallWindowProc(lpWndProcOld, hwnd, message, wParam, lParam); } return 0; } extern "C" BOOL APIENTRY DllMain(HINSTANCE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { hModule = _hModule; return TRUE; } #ifndef INT32_MAX #define INT32_MAX 0x7fffffff #endif int MulDiv64(int nNumber, __int64 nNumerator, __int64 nDenominator) { // ok, a complete implementation would handle negatives too, // but this method is probably not generally useful. while (nNumerator > INT32_MAX || nDenominator > INT32_MAX) { nNumerator = Int64ShraMod32(nNumerator, 1); nDenominator = Int64ShraMod32(nDenominator, 1); } return MulDiv(nNumber, (int)nNumerator, (int)nDenominator); } static __int64 g_file_size; static DWORD g_dwLastTick = 0; void progress_callback(const char *msg, __int64 read_bytes) { // flicker reduction by A. Schiffler DWORD dwLastTick = g_dwLastTick; DWORD dwThisTick = GetTickCount(); if (childwnd) { if (dwThisTick - dwLastTick > 500) { SetWindowTextA(g_hwndStatic, msg); dwLastTick = dwThisTick; } if (g_file_size) SendMessage(g_hwndProgressBar, PBM_SETPOS, (WPARAM) MulDiv64(30000, read_bytes, g_file_size), 0); g_dwLastTick = dwLastTick; } } extern char *_strstr(const char *i, const char *s); #define strstr _strstr extern "C" { __declspec(dllexport) void download (HWND parent, int string_size, TCHAR *variables, stack_t **stacktop) { char buf[1024]; char url[1024]; TCHAR filenameT[1024]; static char proxy[1024]; BOOL bSuccess=FALSE; int timeout_ms=30000; int getieproxy=1; int manualproxy=0; int translation_version; const char *error=NULL; // translation version 2 & 1 static char szDownloading[1024]; // "Downloading %s" static char szConnecting[1024]; // "Connecting ..." static char szSecond[1024]; // " (1 second remaining)" for v2 // "second" for v1 static char szMinute[1024]; // " (1 minute remaining)" for v2 // "minute" for v1 static char szHour[1024]; // " (1 hour remaining)" for v2 // "hour" for v1 static char szProgress[1024]; // "%skB (%d%%) of %skB at %u.%01ukB/s" for v2 // "%dkB (%d%%) of %dkB at %d.%01dkB/s" for v1 // translation version 2 only static char szSeconds[1024]; // " (%u seconds remaining)" static char szMinutes[1024]; // " (%u minutes remaining)" static char szHours[1024]; // " (%u hours remaining)" // translation version 1 only static char szPlural[1024]; // "s"; static char szRemaining[1024]; // " (%d %s%s remaining)"; EXDLL_INIT(); PopStringA(url); if (!lstrcmpiA(url, "/TRANSLATE2")) { PopStringA(szDownloading); PopStringA(szConnecting); PopStringA(szSecond); PopStringA(szMinute); PopStringA(szHour); PopStringA(szSeconds); PopStringA(szMinutes); PopStringA(szHours); PopStringA(szProgress); PopStringA(url); translation_version=2; } else if (!lstrcmpiA(url, "/TRANSLATE")) { PopStringA(szDownloading); PopStringA(szConnecting); PopStringA(szSecond); PopStringA(szMinute); PopStringA(szHour); PopStringA(szPlural); PopStringA(szProgress); PopStringA(szRemaining); PopStringA(url); translation_version=1; } else { lstrcpyA(szDownloading, "Downloading %s"); lstrcpyA(szConnecting, "Connecting ..."); lstrcpyA(szSecond, " (1 second remaining)"); lstrcpyA(szMinute, " (1 minute remaining)"); lstrcpyA(szHour, " (1 hour remaining)"); lstrcpyA(szSeconds, " (%u seconds remaining)"); lstrcpyA(szMinutes, " (%u minutes remaining)"); lstrcpyA(szHours, " (%u hours remaining)"); lstrcpyA(szProgress, "%skB (%d%%) of %skB at %u.%01ukB/s"); translation_version=2; } lstrcpynA(buf, url, 10); if (!lstrcmpiA(buf, "/TIMEOUT=")) { timeout_ms=my_atoi(url+9); PopStringA(url); } if (!lstrcmpiA(url, "/PROXY")) { getieproxy=0; manualproxy=1; PopStringA(proxy); PopStringA(url); } if (!lstrcmpiA(url, "/NOIEPROXY")) { getieproxy=0; PopStringA(url); } popstring(filenameT); static char main_buf[8192]; char *filenameA; #ifdef _UNICODE filenameA = main_buf; wsprintfA(filenameA, "%S", filenameT); #else filenameA = filenameT; #endif HANDLE hFile = CreateFile(filenameT,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL); if (hFile == INVALID_HANDLE_VALUE) { wsprintfA(buf, "Unable to open %s", filenameA); error = buf; } else { if (parent) { uMsgCreate = RegisterWindowMessage(_T("nsisdl create")); lpWndProcOld = (WNDPROC)SetWindowLongPtr(parent,GWLP_WNDPROC,(LONG_PTR)ParentWndProc); SendMessage(parent, uMsgCreate, TRUE, (LPARAM) parent); // set initial text char *p = filenameA; while (*p) p++; while (*p !='\\' && p != filenameA) p = CharPrevA(filenameA, p); wsprintfA(buf, szDownloading, p != filenameA ? p + 1 : p); SetDlgItemTextA(childwnd, 1006, buf); SetWindowTextA(g_hwndStatic, szConnecting); } { WSADATA wsaData; WSAStartup(MAKEWORD(1, 1), &wsaData); JNL_HTTPGet *get = 0; char *buf = main_buf, *p = NULL; HKEY hKey; if (getieproxy && RegOpenKeyExA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&hKey) == ERROR_SUCCESS) { DWORD l = 4; DWORD t; DWORD v; if (RegQueryValueExA(hKey,"ProxyEnable",NULL,&t,(unsigned char*)&v,&l) == ERROR_SUCCESS && t == REG_DWORD && v) { l=8192; if (RegQueryValueExA(hKey,"ProxyServer",NULL,&t,(unsigned char *)buf,&l ) == ERROR_SUCCESS && t == REG_SZ) { p=strstr(buf,"http="); if (!p) p=buf; else { p+=5; } char *tp=strstr(p,";"); if (tp) *tp=0; char *p2=strstr(p,"="); if (p2) p=0; // we found the wrong proxy } } buf[8192-1]=0; RegCloseKey(hKey); } if (manualproxy == 1) { p = proxy; } DWORD start_time=GetTickCount(); get=new JNL_HTTPGet(JNL_CONNECTION_AUTODNS,16384,(p&&p[0])?p:NULL); int st; int has_printed_headers = 0; __int64 cl = 0; int len; __int64 sofar = 0; DWORD last_recv_time=start_time; get->addheader ("User-Agent: NSISDL/1.2 (Mozilla)"); get->addheader ("Accept: */*"); get->connect (url); while (1) { if (g_cancelled) error = "cancel"; if (error) { if (parent) { SendMessage(parent, uMsgCreate, FALSE, (LPARAM) parent); SetWindowLongPtr(parent, GWLP_WNDPROC, (LONG_PTR)lpWndProcOld); } break; } st = get->run (); if (st == -1) { lstrcpynA(url, get->geterrorstr(), sizeof(url)); error = url; } else if (st == 1) { if (sofar < cl || get->get_status () != 2) error="download incomplete"; else { bSuccess=TRUE; error = "success"; } } else { if (get->get_status () == 0) { // progressFunc ("Connecting ...", 0); if (last_recv_time+timeout_ms < GetTickCount()) error = "Timed out on connecting."; else Sleep(10); // don't busy-loop while connecting } else if (get->get_status () == 1) { progress_callback("Reading headers", 0); if (last_recv_time+timeout_ms < GetTickCount()) error = "Timed out on getting headers."; else Sleep(10); // don't busy-loop while reading headers } else if (get->get_status () == 2) { if (! has_printed_headers) { has_printed_headers = 1; last_recv_time=GetTickCount(); cl = get->content_length (); if (cl == 0) error = "Server did not specify content length."; else if (g_hwndProgressBar) { SendMessage(g_hwndProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 30000)); g_file_size = cl; } } int data_downloaded = 0; while ((len = get->bytes_available ()) > 0) { data_downloaded++; if (len > 8192) len = 8192; len = get->get_bytes (buf, len); if (len > 0) { last_recv_time=GetTickCount(); DWORD dw; WriteFile(hFile,buf,len,&dw,NULL); sofar += len; int time_sofar=(GetTickCount()-start_time)/1000; int bps = (int)(sofar/(time_sofar?time_sofar:1)); int remain = MulDiv64(time_sofar, cl, sofar) - time_sofar; if (translation_version == 2) { char *rtext=remain==1?szSecond:szSeconds;; if (remain >= 60) { remain/=60; rtext=remain==1?szMinute:szMinutes; if (remain >= 60) { remain/=60; rtext=remain==1?szHour:szHours; } } char sofar_str[128]; char cl_str[128]; myitoa64(sofar/1024, sofar_str); myitoa64(cl/1024, cl_str); wsprintfA (buf, szProgress, //%skB (%d%%) of %skB @ %u.%01ukB/s sofar_str, MulDiv64(100, sofar, cl), cl_str, bps/1024,((bps*10)/1024)%10 ); if (remain) wsprintfA(buf+lstrlenA(buf),rtext, remain ); } else if (translation_version == 1) { char *rtext=szSecond; if (remain >= 60) { remain/=60; rtext=szMinute; if (remain >= 60) { remain/=60; rtext=szHour; } } wsprintfA (buf, szProgress, //%dkB (%d%%) of %dkB @ %d.%01dkB/s int(sofar/1024), MulDiv64(100, sofar, cl), int(cl/1024), bps/1024,((bps*10)/1024)%10 ); if (remain) wsprintfA(buf+lstrlenA(buf),szRemaining, remain, rtext, remain==1?"":szPlural ); } progress_callback(buf, sofar); } else { if (sofar < cl) error = "Server aborted."; } } if (GetTickCount() > last_recv_time+timeout_ms) { if (sofar != cl) { error = "Downloading timed out."; } else { // workaround for bug #1713562 // buggy servers that wait for the client to close the connection. // another solution would be manually stopping when cl == sofar, // but then buggy servers that return wrong content-length will fail. bSuccess = TRUE; error = "success"; } } else if (!data_downloaded) Sleep(10); } else { error = "Bad response status."; } } } // Clean up the connection then release winsock if (get) delete get; WSACleanup(); } CloseHandle(hFile); } if (g_cancelled || !bSuccess) { DeleteFile(filenameT); } PushStringA(error); } __declspec(dllexport) void download_quiet(HWND parent, int stringsize, TCHAR *variables, stack_t **stacktop) { g_hwndProgressBar=0; download(NULL,stringsize,variables,stacktop); } } //extern "C" nsis-3.11/Contrib/NSISdl/util.cpp000077500000000000000000000046341477201124000165770ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: util.cpp - JNL implementation of basic network utilities ** License: see License.txt ** ** Unicode support by Jim Park -- 08/24/2007 ** Keep everything here strictly ANSI. No TCHAR style stuff. */ #include #include "util.h" int my_atoi(char *s) { int sign=0; int v=0; if (*s == '-') { s++; sign++; } for (;;) { int c=*s++ - '0'; if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) return -(int) v; return (int)v; } __int64 myatoi64(const char *s) { __int64 v=0; int sign=0; if (*s == '-') sign++; else s--; for (;;) { int c=*(++s) - '0'; if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) v = -v; return v; } void myitoa64(__int64 i, char *buffer) { char buf[128], *b = buf; if (i < 0) { *(buffer++) = '-'; i = -i; } if (i == 0) *(buffer++) = '0'; else { while (i > 0) { *(b++) = '0' + ((char) (i%10)); i /= 10; } while (b > buf) *(buffer++) = *(--b); } *buffer = 0; } // Visual Studio 2015 (CLv19 x86) and some older versions of CLv14 x64 will optimize // our loop into a direct call to _memset and this fails to link because we don't use the CRT #if defined(_MSC_VER) && _MSC_VER+0 >= 1400 # if defined(_MSC_FULL_VER) && _MSC_FULL_VER+0 >= 140050727 # include # else EXTERN_C void __stosb(BYTE*,BYTE,size_t); # endif //~ _MSC_FULL_VER >= 140050727 # if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) // __stosb not available under _M_ARM nor _M_ARM64 # pragma intrinsic(__stosb) # define CRTINTRINSIC_memset(p,c,s) __stosb((BYTE*)(p),(BYTE)(c),(s)) # elif defined(_M_ARM) || defined(_M_ARM64) // For _MSC_VER=1914 (VS 15.7.27703.2026/CL 19.14.26430) EXTERN_C void* __cdecl memset(void *d, int v, size_t l) { char *p=(char*)d; while (l-- > 0) *p++=v; return d; } # pragma function(memset) # endif #endif //~ _MSC_VER void mini_memset(void *o,char i,int l) { #ifdef CRTINTRINSIC_memset CRTINTRINSIC_memset(o, i, l); #else char *oo=(char*)o; while (l-- > 0) *oo++=i; #endif } void mini_memcpy(void *o,void*i,int l) { char *oo=(char*)o; char *ii=(char*)i; while (l-- > 0) *oo++=*ii++; } nsis-3.11/Contrib/NSISdl/util.h000077500000000000000000000023251477201124000162370ustar00rootroot00000000000000/* ** JNetLib ** Copyright (C) 2000-2001 Nullsoft, Inc. ** Author: Justin Frankel ** File: util.h - JNL interface for basic network utilities ** License: see License.txt ** ** routines you may be interested in: ** JNL::open_socketlib(); ** opens the socket library. Call this once before using any network ** code. If you create a new thread, call this again. Only really an ** issue for Win32 support, but use it anyway for portability/ ** ** JNL::close_Socketlib(); ** closes the socketlib. Call this when you're done with the network, ** after all your JNetLib objects have been destroyed. ** ** unsigned long JNL::ipstr_to_addr(const char *cp); ** gives you the integer representation of a ip address in dotted ** decimal form. ** ** JNL::addr_to_ipstr(unsigned long addr, char *host, int maxhostlen); ** gives you the dotted decimal notation of an integer ip address. ** ** Reviewed for Unicode support by Jim Park -- 08/24/2007 ** Keep the functions here strictly ANSI. */ #ifndef _UTIL_H_ #define _UTIL_H_ int my_atoi(char *p); __int64 myatoi64(const char *s); void myitoa64(__int64 i, char *buffer); void mini_memset(void *,char,int); void mini_memcpy(void *,void*,int); #endif //_UTIL_H_ nsis-3.11/Contrib/Splash/000077500000000000000000000000001477201124000152425ustar00rootroot00000000000000nsis-3.11/Contrib/Splash/Example.nsi000077500000000000000000000010511477201124000173500ustar00rootroot00000000000000Name "Splash.dll test" OutFile "Splash Test.exe" XPStyle on Function .onInit # the plugins dir is automatically deleted when the installer exits InitPluginsDir File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-nsis.bmp" #optional #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav" splash::show 1000 $PLUGINSDIR\splash Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normally, and '-1' if some error occurred. FunctionEnd Section SectionEndnsis-3.11/Contrib/Splash/SConscript000077500000000000000000000003771477201124000172660ustar00rootroot00000000000000target = 'Splash' files = Split(""" splash.c """) libs = Split(""" kernel32 user32 gdi32 winmm """) examples = Split(""" Example.nsi """) docs = Split(""" splash.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples, docs) nsis-3.11/Contrib/Splash/splash.c000077500000000000000000000053711477201124000167110ustar00rootroot00000000000000#include #include // nsis plugin HINSTANCE g_hInstance; HBITMAP g_hbm; int sleep_val; int g_rv=-1; static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_CREATE) { BITMAP bm; RECT vp; GetObject(g_hbm, sizeof(bm), &bm); SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0); SetWindowLongPtr(hwnd,GWL_STYLE,0); SetWindowPos(hwnd,NULL, vp.left+(vp.right-vp.left-bm.bmWidth)/2, vp.top+(vp.bottom-vp.top-bm.bmHeight)/2, bm.bmWidth,bm.bmHeight, SWP_NOZORDER); ShowWindow(hwnd,SW_SHOW); SetTimer(hwnd,1,sleep_val,NULL); return 0; } if (uMsg == WM_PAINT) { PAINTSTRUCT ps; RECT r; HDC curdc=BeginPaint(hwnd,&ps); HDC hdc=CreateCompatibleDC(curdc); HBITMAP oldbm; GetClientRect(hwnd,&r); oldbm=(HBITMAP)SelectObject(hdc,g_hbm); BitBlt(curdc,r.left,r.top,r.right-r.left,r.bottom-r.top,hdc,0,0,SRCCOPY); SelectObject(hdc,oldbm); DeleteDC(hdc); EndPaint(hwnd,&ps); return 0; } if (uMsg == WM_CLOSE) return 0; if (uMsg == WM_TIMER || uMsg == WM_LBUTTONDOWN) { g_rv=(uMsg == WM_LBUTTONDOWN); DestroyWindow(hwnd); } return DefWindowProc(hwnd,uMsg,wParam,lParam); } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; return TRUE; } void __declspec(dllexport) show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { TCHAR fn[MAX_PATH]; TCHAR temp[64]; TCHAR *sleep=temp; EXDLL_INIT(); popstring(sleep); popstring(fn); sleep_val=0; while (*sleep >= _T('0') && *sleep <= _T('9')) { sleep_val*=10; sleep_val+=*sleep++-_T('0'); } if (fn[0] && sleep_val>0) { MSG msg; TCHAR classname[4]=_T("_sp"); static WNDCLASS wc; wc.lpfnWndProc = WndProc; wc.hInstance = g_hInstance; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.lpszClassName = classname; if (RegisterClass(&wc)) { TCHAR fn2[MAX_PATH]; lstrcpy(fn2,fn); lstrcat(fn,_T(".bmp")); lstrcat(fn2,_T(".wav")); g_hbm=LoadImage(NULL,fn,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); if (g_hbm) { HWND myWnd; PlaySound(fn2,NULL,SND_ASYNC|SND_FILENAME|SND_NODEFAULT); myWnd = CreateWindowEx(WS_EX_TOOLWINDOW,classname,classname, 0,0,0,0,0,(HWND)hwndParent,NULL,g_hInstance,NULL); while (IsWindow(myWnd) && GetMessage(&msg,myWnd,0,0)) { DispatchMessage(&msg); } // Stop currently playing wave, we want to exit PlaySound(0,0,0); DeleteObject(g_hbm); UnregisterClass(classname, g_hInstance); } } } wsprintf(temp,_T("%d"),g_rv); pushstring(temp); } nsis-3.11/Contrib/Splash/splash.txt000077500000000000000000000023231477201124000173000ustar00rootroot00000000000000Splash.dll - small (4k), simple plugin that lets you throw up a splash screen in NSIS installers. --- UPDATED in 2.0b0 - will break old scripts --- To use: Create a .BMP file of your splash screen. (optional) Create a .WAV file to play while your splash screen shows. Add the following lines to your .NSI file: Function .onInit SetOutPath $TEMP File /oname=spltmp.bmp "my_splash.bmp" ; optional ; File /oname=spltmp.wav "my_splashsound.wav" splash::show 1000 $TEMP\spltmp Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normally, and '-1' if some error occurred. Delete $TEMP\spltmp.bmp ; Delete $TEMP\spltmp.wav FunctionEnd Note that the first parameter to splash.exe is the length to show the screen for (in milliseconds), and the second is the splash bitmap filename (without the .bmp). The BMP file used will be this parameter.bmp, and the wave file used (if present) will be this parameter.wav. (If you already have an .onInit function, put that in it) Note: the return value of splash is 1 if the user closed the splash screen early (pop it from the stack) -Justin Converted to a plugin DLL by Amir Szekely (kichik) nsis-3.11/Contrib/StartMenu/000077500000000000000000000000001477201124000157325ustar00rootroot00000000000000nsis-3.11/Contrib/StartMenu/Example.nsi000077500000000000000000000023171477201124000200460ustar00rootroot00000000000000Name "StartMenu.dll test" OutFile "StartMenu Test.exe" XPStyle on Page directory DirText "This installer will create some shortcuts to MakeNSIS in the start menu.$\nFor this it needs NSIS's path." \ "Please specify the path in which you have installed NSIS:" InstallDir "${NSISDIR}" Function .onVerifyInstDir IfFileExists $INSTDIR\makensis.exe +2 Abort FunctionEnd Page custom StartMenuGroupSelect "" ": Start Menu Folder" Function StartMenuGroupSelect Push $R1 StartMenu::Select /checknoshortcuts "Don't create a start menu folder" /autoadd /lastused $R0 "StartMenu.dll test" Pop $R1 StrCmp $R1 "success" success StrCmp $R1 "cancel" done ; error MessageBox MB_OK $R1 StrCpy $R0 "StartMenu.dll test" # use default Return success: Pop $R0 done: Pop $R1 FunctionEnd Page instfiles Section # this part is only necessary if you used /checknoshortcuts StrCpy $R1 $R0 1 StrCmp $R1 ">" skip CreateDirectory $SMPROGRAMS\$R0 CreateShortcut $SMPROGRAMS\$R0\MakeNSISw.lnk $INSTDIR\makensisw.exe SetShellVarContext All CreateDirectory $SMPROGRAMS\$R0 CreateShortcut "$SMPROGRAMS\$R0\All users MakeNSISw.lnk" $INSTDIR\makensisw.exe skip: SectionEndnsis-3.11/Contrib/StartMenu/Readme.txt000077500000000000000000000043301477201124000176730ustar00rootroot00000000000000StartMenu.dll shows a custom page that lets the user select a start menu program folder to put shortcuts in. To show the dialog use the Select function. This function has one required parameter which is the program group default name, and some more optional switches: /autoadd - automatically adds the program name to the selected folder /noicon - doesn't show the icon in the top left corner /text [please select...] - sets the top text to something else than "Select the Start Menu folder in which..." /lastused [folder] - sets the edit box to a specific value folder. Use this to make this plug-in remember the last folder selected by the user /checknoshortcuts text - Shows a check box with the text "text". If the user checks this box, the return value will have > as its first character and you should not create the program group. /rtl - sets the direction of every control on the selection dialog to RTL. This means every text shown on the page will be justified to the right. The order of the switches doesn't matter but the required parameter must come after all of them. Every switch after the required parameter will be ignored and left on the stack. The function pushes "success", "cancel" or an error to the stack. If there was no error and the user didn't press on cancel it will push the selected folder name after "success". If the user checked the no shortcuts checkbox the result will be prefixed with '>'. The function does not push the full path but only the selected sub-folder. It's up to you to decide if to put it in the current user or all users start menu. To set properties of the controls on the page, such as colors and fonts use Init and Show instead of Select. Init will push the HWND of the page on the stack, or an error string. For example: StartMenu::Init "Test" Pop $0 IntCmp $0 0 failed GetDlgItem $0 $0 1003 SetCtlColors $0 "" FF0000 StartMenu::Show # continue as with Select here failed: Look at Example.nsi for a full example (without Init and Select). Created by Amir Szekely (aka KiCHiK)nsis-3.11/Contrib/StartMenu/SConscript000077500000000000000000000005111477201124000177440ustar00rootroot00000000000000target = 'StartMenu' files = Split(""" StartMenu.c """) resources = Split(""" StartMenu.rc """) libs = Split(""" kernel32 user32 gdi32 shell32 ole32 """) examples = Split(""" Example.nsi """) docs = Split(""" Readme.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples, docs, res = resources) nsis-3.11/Contrib/StartMenu/StartMenu.c000077500000000000000000000266351477201124000200370ustar00rootroot00000000000000#include #include #include // nsis plugin #include "resource.h" HINSTANCE g_hInstance; HWND hwParent; HWND hwChild; HWND g_hwStartMenuSelect; HWND g_hwDirList; TCHAR buf[1024]; TCHAR text[1024]; TCHAR progname[1024]; TCHAR lastused[1024]; TCHAR checkbox[1024]; int autoadd; int g_done; int noicon; int rtl; WNDPROC lpWndProcOld; void (__stdcall *validate_filename)(LPTSTR); INT_PTR CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK ParentWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void AddFolderFromReg(int nFolder); static UINT_PTR PluginCallback(enum NSPIM msg) { return 0; } void __declspec(dllexport) Init(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwStartMenuSelect; hwParent = hwndParent; validate_filename = extra->validate_filename; EXDLL_INIT(); extra->RegisterPluginCallback(g_hInstance, PluginCallback); g_done = 0; noicon = 0; rtl = 0; autoadd = 0; text[0] = 0; progname[0] = 0; lastused[0] = 0; checkbox[0] = 0; g_hwStartMenuSelect = NULL; { hwChild = GetDlgItem(hwndParent, 1018); if (!hwChild) { pushstring(_T("error finding childwnd")); return; } popstring(buf); while (buf[0] == _T('/')) { if (!lstrcmpi(buf+1, _T("noicon"))) { noicon = 1; } else if (!lstrcmpi(buf+1, _T("rtl"))) { rtl = 1; } else if (!lstrcmpi(buf+1, _T("text"))) { popstring(text); } else if (!lstrcmpi(buf+1, _T("autoadd"))) { autoadd = 1; } else if (!lstrcmpi(buf+1, _T("lastused"))) { popstring(lastused); } else if (!lstrcmpi(buf+1, _T("checknoshortcuts"))) { popstring(checkbox); } if (popstring(buf)) { *buf = 0; } } if (*buf) { lstrcpy(progname, buf); } else { pushstring(_T("error reading parameters")); return; } hwStartMenuSelect = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG), hwndParent, dlgProc); g_hwStartMenuSelect = hwStartMenuSelect; if (!hwStartMenuSelect) { pushstring(_T("error creating dialog")); return; } else { lpWndProcOld = (WNDPROC) SetWindowLongPtr(hwndParent, DWLP_DLGPROC, (LONG_PTR) ParentWndProc); wsprintf(buf, _T("%u"), hwStartMenuSelect); pushstring(buf); } } } void __declspec(dllexport) Show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { HWND hwStartMenuSelect = g_hwStartMenuSelect; if (!hwStartMenuSelect) { return; } while (!g_done) { MSG msg; GetMessage(&msg, NULL, 0, 0); if (!IsDialogMessage(hwStartMenuSelect,&msg) && !IsDialogMessage(hwndParent,&msg) && !TranslateMessage(&msg)) DispatchMessage(&msg); } DestroyWindow(hwStartMenuSelect); SetWindowLongPtr(hwndParent, DWLP_DLGPROC, (LONG_PTR) lpWndProcOld); } void __declspec(dllexport) Select(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { Init(hwndParent, string_size, variables, stacktop, extra); if (g_hwStartMenuSelect) { popstring(buf); Show(hwndParent, string_size, variables, stacktop); } } static INT_PTR CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { INT_PTR bRes = CallWindowProc(lpWndProcOld,hwnd,message,wParam,lParam); if (message == WM_NOTIFY_OUTER_NEXT && !bRes) { // if leave function didn't abort (lRes != 0 in that case) PostMessage(g_hwStartMenuSelect,WM_USER+666,wParam,0); } return bRes; } void AddRTLStyle(HWND hWnd, long dwStyle) { LONG_PTR s; s = GetWindowLongPtr(hWnd, GWL_STYLE); SetWindowLongPtr(hWnd, GWL_STYLE, s | dwStyle); s = GetWindowLongPtr(hWnd, GWL_EXSTYLE); SetWindowLongPtr(hWnd, GWL_EXSTYLE, s | WS_EX_RIGHT | WS_EX_RTLREADING); } #define ProgressiveSetWindowPos(hwWindow, x, cx, cy) \ MoveWindow( \ hwWindow, \ x, \ y_offset, \ cx, \ cy, \ FALSE \ ); \ \ y_offset += cy + 3; INT_PTR CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hwLocation = GetDlgItem(hwndDlg, IDC_LOCATION); HWND hwDirList = GetDlgItem(hwndDlg, IDC_DIRLIST); HWND hwCheckBox = GetDlgItem(hwndDlg, IDC_CHECK); switch (uMsg) { case WM_INITDIALOG: { HWND hwIcon; HWND hwText; RECT dialog_r, temp_r; HFONT hFont = (HFONT) SendMessage(hwParent, WM_GETFONT, 0, 0); int y_offset = 0; int width, height; int baseUnitY; // Init dialog unit conversion { TEXTMETRIC tm; HDC hDC; hDC = GetDC(hwndDlg); SelectObject(hDC, hFont); GetTextMetrics(hDC, &tm); baseUnitY = tm.tmHeight; ReleaseDC(hwndDlg, hDC); } GetWindowRect(hwChild, &dialog_r); ScreenToClient(hwParent, (LPPOINT) &dialog_r); ScreenToClient(hwParent, ((LPPOINT) &dialog_r) + 1); width = dialog_r.right - dialog_r.left; height = dialog_r.bottom - dialog_r.top; MoveWindow( hwndDlg, dialog_r.left, dialog_r.top, width, height, FALSE ); hwIcon = GetDlgItem(hwndDlg, IDC_NSISICON); hwText = GetDlgItem(hwndDlg, IDC_TEXT); g_hwDirList = hwDirList; SendMessage(hwndDlg, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwIcon, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwText, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwLocation, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwDirList, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwCheckBox, WM_SETFONT, (WPARAM) hFont, TRUE); if (rtl) { AddRTLStyle(hwText, SS_RIGHT); AddRTLStyle(hwLocation, ES_RIGHT); AddRTLStyle(hwDirList, 0); AddRTLStyle(hwCheckBox, BS_RIGHT | BS_LEFTTEXT); } GetClientRect(hwIcon, &temp_r); if (!noicon) { SendMessage( hwIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(103)) ); MoveWindow( hwIcon, rtl ? width - temp_r.right : 0, 0, temp_r.right, temp_r.bottom, FALSE ); temp_r.right += 3; } else { ShowWindow(hwIcon, SW_HIDE); temp_r.right = 0; } if (rtl) { ProgressiveSetWindowPos( hwText, 0, width - temp_r.right, 3 * baseUnitY //MulDiv(24, baseUnitY, 8); ); } else { ProgressiveSetWindowPos( hwText, temp_r.right, width - temp_r.right + 3, 3 * baseUnitY //MulDiv(24, baseUnitY, 8); ); } SetWindowText(hwText, *text ? text : _T("Select the Start Menu folder in which you would like to create the program's shortcuts:")); ProgressiveSetWindowPos( hwLocation, 0, width, MulDiv(12, baseUnitY, 8) ); if (*lastused == _T('>')) { CheckDlgButton(hwndDlg, IDC_CHECK, BST_CHECKED); lstrcpy(lastused, lstrcpy(buf, lastused) + 1); EnableWindow(hwDirList, FALSE); EnableWindow(hwLocation, FALSE); } SetWindowText(hwLocation, *lastused ? lastused : progname); temp_r.bottom = MulDiv(8, baseUnitY, 8); ProgressiveSetWindowPos( hwDirList, 0, width, height - y_offset - (*checkbox ? temp_r.bottom + 3 : 0) ); if (*checkbox) { ProgressiveSetWindowPos( hwCheckBox, 0, width, temp_r.bottom ); ShowWindow(hwCheckBox, SW_SHOWNA); SetWindowText(hwCheckBox, checkbox); } AddFolderFromReg(CSIDL_COMMON_PROGRAMS); AddFolderFromReg(CSIDL_PROGRAMS); // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); ShowWindow(hwndDlg, SW_SHOWNA); if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED) SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM) hwCheckBox, TRUE); else SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM) hwLocation, TRUE); } break; case WM_COMMAND: if (LOWORD(wParam) == IDC_DIRLIST && HIWORD(wParam) == LBN_SELCHANGE) { LRESULT selection = SendMessage(hwDirList, LB_GETCURSEL, 0, 0); if (selection != LB_ERR) { SendMessage(hwDirList, LB_GETTEXT, selection, (WPARAM)buf); if (autoadd) lstrcat(lstrcat(buf, _T("\\")), progname); SetWindowText(hwLocation, buf); } } else if (LOWORD(wParam) == IDC_CHECK && HIWORD(wParam) == BN_CLICKED) { BOOL bEnable = IsDlgButtonChecked(hwndDlg, IDC_CHECK) != BST_CHECKED; EnableWindow(hwDirList, bEnable); EnableWindow(hwLocation, bEnable); if (bEnable) goto ValidateLocation; *buf = _T('!'); //This only needs to be != 0, actual value does not matter goto SetOkBtn; } else if (LOWORD(wParam) == IDC_LOCATION && HIWORD(wParam) == EN_CHANGE) { ValidateLocation: GetWindowText(hwLocation, buf, MAX_PATH); validate_filename(buf); SetOkBtn: EnableWindow(GetDlgItem(hwParent, IDOK), *buf != _T('\0')); } break; case WM_USER+666: g_done = 1; if (wParam == NOTIFY_BYE_BYE) pushstring(_T("cancel")); else { GetWindowText(hwLocation, buf + 1, MAX_PATH); validate_filename(buf); if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED) { buf[0] = _T('>'); pushstring(buf); } else { pushstring(buf + 1); } pushstring(_T("success")); } case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: case WM_CTLCOLORBTN: case WM_CTLCOLORLISTBOX: // let the NSIS window handle colors, it knows best return SendMessage(hwParent, uMsg, wParam, lParam); break; } return FALSE; } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; return TRUE; } void AddFolderFromReg(int nFolder) { //DWORD idx; WIN32_FIND_DATA FileData; HANDLE hSearch; LPITEMIDLIST ppidl; buf[0] = 0; if (SHGetSpecialFolderLocation(hwParent, nFolder, &ppidl) == S_OK) { SHGetPathFromIDList(ppidl, buf); CoTaskMemFree(ppidl); } if (!buf[0]) return; lstrcat(buf, _T("\\*.*")); hSearch = FindFirstFile(buf, &FileData); if (hSearch != INVALID_HANDLE_VALUE) { do { if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (lstrcmp(FileData.cFileName, _T(".")) != 0) { if (lstrcmp(FileData.cFileName, _T("..")) != 0) { if (SendMessage(g_hwDirList, LB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)FileData.cFileName) == LB_ERR) SendMessage(g_hwDirList, LB_ADDSTRING, 0, (LPARAM)FileData.cFileName); /*idx = */ /*SendMessage(hwDirList, LB_SETITEMDATA, (WPARAM)idx, (LPARAM)ExtractAssociatedIcon(g_hInstance, FileData.cFileName, (WORD*)&idx));*/ } } } } while (FindNextFile(hSearch, &FileData)); FindClose(hSearch); } } nsis-3.11/Contrib/StartMenu/StartMenu.rc000077500000000000000000000045621477201124000202140ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_DIALOG DIALOG DISCARDABLE 0, 0, 137, 98 STYLE DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_LOCATION,59,20,40,12,ES_AUTOHSCROLL | WS_CLIPSIBLINGS LISTBOX IDC_DIRLIST,76,42,48,40,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_CLIPSIBLINGS | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,21,44,16,8 ICON "",IDC_NSISICON,21,18,20,20,WS_CLIPSIBLINGS LTEXT "",IDC_TEXT,17,65,55,11,WS_CLIPSIBLINGS END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 130 TOPMARGIN, 7 BOTTOMMARGIN, 91 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/StartMenu/resource.h000077500000000000000000000012331477201124000177340ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by StartMenu.rc // #define IDD_DIALOG 101 #define IDC_NSISICON 1001 #define IDC_LOCATION 1002 #define IDC_TEXT 1003 #define IDC_DIRLIST 1004 #define IDC_CHECK 1005 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1006 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/SubStart/000077500000000000000000000000001477201124000155575ustar00rootroot00000000000000nsis-3.11/Contrib/SubStart/SConscript000077500000000000000000000005441477201124000175770ustar00rootroot00000000000000Import('env') target = "substart" files = Split(""" substart.c """) libs = Split(""" kernel32 user32 """) Import('BuildUtil') substart = BuildUtil(target, files, libs, cli = True, noinstall = True, nodeflib = True) if env['PLATFORM'] == 'win32': env.DistributeBin(substart, names=['makensis.exe'], alias='install-compiler') # install as makensis nsis-3.11/Contrib/SubStart/substart.c000077500000000000000000000061311477201124000175760ustar00rootroot00000000000000/* * substart.c - This app runs the executable of the same name in the 'Bin' * sub-folder and passes along the command line options. * * Copyright (c) 2013-2025 Anders Kjersem * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include #include #define SUBFOLDER _T("Bin") /* * Leaking things Windows is going to clean up after us anyway avoids * linking to a couple of functions, this saves just enough space * to get the file size down to 2 KiB (MSVC 7.1) */ #ifdef _DEBUG # define CANLEAK(cod) cod #else # define CANLEAK(cod) #endif #define MemFree LocalFree static void* MemReAlloc(void*OrgMem, size_t cb) { if (!OrgMem) return LocalAlloc(LMEM_FIXED, cb); return LocalReAlloc(OrgMem, cb, LMEM_MOVEABLE); } static void MemZero(void*pMem, size_t cb) { char*p=(char*)pMem; for(; cb;) p[--cb] = 0; } static UINT SIOPut(LPCSTR Str, UINT cch) { HANDLE hSO = GetStdHandle(STD_OUTPUT_HANDLE); DWORD cbio; return WriteFile(hSO, Str, cch, &cbio, 0) ? cch : 0; } static UINT SIOFmtPut(LPCSTR Fmt, ...) { UINT cch; char buf[150]; // Plenty for our simple strings va_list val; va_start(val, Fmt); cch = wvsprintfA(buf, Fmt, val); cch = SIOPut(buf, cch); va_end(val); return cch; } void mainCRTStartup() { const UINT cchSubDir = (sizeof(SUBFOLDER) / sizeof(TCHAR)) - 1; STARTUPINFO si; PROCESS_INFORMATION pi; UINT ec, cch, cchParams; TCHAR *p = GetCommandLine(), *cmd = 0; if (*p == _T('\"')) do ++p; while(*p && *p != _T('\"')); else while(*p && *p > _T(' ')) ++p; /* Skip end quote and whitespace */ do if (!*p) break; else ++p; while(*p <= ' '); ec = ERROR_OUTOFMEMORY; cchParams = lstrlen(p), cch = MAX_PATH; for (;;) { TCHAR *mem; UINT cchTot = 1 + cch + 1 + cchSubDir + 2 + cchParams + 1, cchSelf; mem = (TCHAR*) MemReAlloc(cmd, cchTot * sizeof(TCHAR)); if (!mem) goto app_die; cmd = mem; cchSelf = GetModuleFileName(NULL, cmd + 1, cch); if (!cchSelf) goto app_diegle; if (cchSelf < cch) { /* Insert subfolder before the filename */ TCHAR *src = cmd + cchSelf + 1, *dst = src + cchSubDir + 1; for(; src > cmd; --src, --dst) { *dst = *src; if (_T('\\') == *src || _T('/') == *src) break; } *++src = _T('\0'); lstrcat(src, SUBFOLDER); src[cchSubDir] = _T('\\'); /* Quote path and append parameters */ cmd[0] = _T('\"'); lstrcat(cmd, _T("\" ")); lstrcat(cmd, p); break; } cch *= 2; } MemZero(&si, sizeof(si)); si.cb = sizeof(si); if (CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { DWORD forkec; WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &forkec); ec = forkec; CANLEAK(CloseHandle(pi.hProcess)); CANLEAK(CloseHandle(pi.hThread)); goto app_end; } app_diegle: ec = GetLastError(); app_die: SIOFmtPut("Unable to start child process, error %#x\n", ec); app_end: CANLEAK(MemFree(cmd)); ExitProcess(ec); } nsis-3.11/Contrib/System/000077500000000000000000000000001477201124000152745ustar00rootroot00000000000000nsis-3.11/Contrib/System/Resource/000077500000000000000000000000001477201124000170635ustar00rootroot00000000000000nsis-3.11/Contrib/System/Resource/Icon.ico000077500000000000000000000063561477201124000204640ustar00rootroot00000000000000(6 è^ ¨F( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÎìîÎìîÎæðîîîîîîîæìÌÌÎÌÌÌæìÌÌÎÌÌÌæìÌÌÎÌÌÌæìÌÌÎÌÌÌæìîîÎÌÌÌæìÌÌÎÌÌÌæìîîÎÎîìæìÌÌÎÌÌÌæìîîÎÎîìæìÌÌÎÌÌÌæì»»ÎË»¼æìÌÌÎÌÌÌæîîîîîîîæ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ îîÎîìîîÎîìîîÎîà îîÎîìîîÎîìîîÎîàðîîîîîîîîîîîîîîàÌÌÌÌÌÌÌìÌÌÌÌÌÌàÎîîììîììîîììîìàÌÌÌÌÌÌÌìÌÌÌÌÌÌàîîîîîîîîîîîîîîàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÎîîîÎÎììÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÎîîîÎÎììÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÎîîîÎÎììîîîÎÎìàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÎîîîÎÎììîîîÎÎìàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÎîîîÎÎììîîîÎÎìàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌÌÌÌÎÌÌìÌÌÌÎÌÌàÌ»»¼Î˼ìË»¼Î˼àÌÌÌÌÎÌÌìÌÌÌÎÌÌàîîîîîîîîîîîîîîàÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ( @ÿÿÿýúøöôòñîìêèæåãáßÜÚÙ×ÕÒÐÏÍËÉÆÄÂÁ¿½»¹¶´²°¯­ª¨¦¥£¡žœ›™—”“‘ЉÜÛÛüûúùöõôóðïîíêéèçäãâáÞÝÜÛÚÙÖÕÎͼ»´³°¯ª©”““’Љ†…‚€þÿýýûüùúúúùù÷øõöööóôôôòòññïðîîììëëéêééçèåæææååãäããáâááßßÝÝÛÛÙÚØÙ××ÕÖÕÕÓÔÒÒÐÐÎÎÊËÇÇÄľ¾»»¹º··´´°°¬¬©©¥¦“”””‘‘ŒŒ‹‹ˆˆ‡‡††……ƒ„ƒƒ‚ÚÛÚÿÿýýûûùùêêççרÔÕÑÒÎÎÁÁ¿ÀÝÝÝÿÿÿŒŒQQ%QQ*2““6“““–:––––ŒŒQQ"QQQ*.“6““““:––––¥¥¥EEFFFrrrHHHHwwwK}}L€‚M……NˆˆŠE""""%%%**w*...2226666::ˆCEFFFFr"r"HHH*w*KKLL2€6M……:NC""""%%%w***...2226666NCCCEEFFFFrrrHHHHwwwwK}L€MMMNCr"""%H%****...2266…BF""""H%%****..L2226MBF""H%%%%***.}.222MBF"r"%%%%***K..22€@E"r""%%%***K...2@ Er"""%%%**w*...@ EF"""%%%%w**..L] @@BBBCCCEFF"""%%%w***.}] CF""""%%H****}] @@@@BBBCCEF""""%H%%**w] CE"""H%%%*wZ ]]@@@@BBCCEFFFFrr"H%HH*w> Bh""r"%%%w>Z]]]@@@ BBCCEEFFFF"r"HH%H> @Cr"""%HW>>ZZ]]] @ BBCChEEEFF"rr"H> @ BF"""HW ] BF"rW™™™™™ ] ž BŸŸ ¢F£¤"rW ] @ErWWWWW>>>>Z]]]@@@dBBBCCCCEEEFFFÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿnsis-3.11/Contrib/System/Resource/Main.c000077500000000000000000000001731477201124000201170ustar00rootroot00000000000000#include BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; } nsis-3.11/Contrib/System/Resource/Resource.h000077500000000000000000000000271477201124000210250ustar00rootroot00000000000000#define IDI_ICON 103 nsis-3.11/Contrib/System/Resource/Resource.rc000077500000000000000000000001251477201124000212010ustar00rootroot00000000000000#include "Resource.h" IDI_ICON ICON "Icon.ico" nsis-3.11/Contrib/System/SConscript000077500000000000000000000027341477201124000173170ustar00rootroot00000000000000target = 'System' files = Split(""" Source/Buffers.c Source/Plugin.c Source/System.c """) libs = Split(""" kernel32 user32 ole32 """) examples = Split(""" Resource.dll System.nsi System.nsh SysFunc.nsh """) docs = Split(""" System.html WhatsNew.txt """) Import('BuildPlugin env') defs = ['SYSTEM_EXPORTS'] msvc = 'msvc' in env['TOOLS'] or 'mstoolkit' in env['TOOLS'] srcsuff = '' if env['TARGET_ARCH'] != 'x86': srcsuff = '-' + env['TARGET_ARCH'] defs += ['SYSTEM_NOCALLBACKS'] # BUGBUG: Remove this when CallBack() is implemented filename = 'Call' + srcsuff src_ascpp = """ #if 0 /* a C style comment */ ERROR: assembler-with-cpp required! #else .end #endif """ conf = env.Configure() if conf.TryCompile('END', '.S'): files += ['Source/'+filename+'.S'] elif (not msvc) and conf.TryCompile(src_ascpp, '.S'): files += ['Source/'+filename+'CPP.S'] elif (not msvc) and conf.TryCompile(src_ascpp, '.sx'): files += ['Source/'+filename+'CPP.sx'] else: print('WARNING: System.dll: unable to find assembler for '+filename+'.S') conf.Finish() BuildPlugin( target, files, libs, examples, docs, nodeflib = False, defines = defs ) res = 'Resource/Resource.rc' res_obj = 'Resource/Resource-rc.o' res_target = env.RES(res_obj, res) res_main = env.Object('Resource/Main.c') resources = Split(""" Resource/Icon.ico Resource/Resource.h """) env.Depends(res_target, resources) resource = env.SharedLibrary('Resource', res_target + res_main) env.MakeReproducible(resource) nsis-3.11/Contrib/System/Source/000077500000000000000000000000001477201124000165345ustar00rootroot00000000000000nsis-3.11/Contrib/System/Source/Buffers.c000077500000000000000000000072051477201124000203030ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/23/2007 #include "stdafx.h" #include "Plugin.h" #include "System.h" #include "Buffers.h" typedef struct tagTempStack TempStack; struct tagTempStack { TempStack *Next; TCHAR Data[0]; }; TempStack *g_tempstack = NULL; static void AllocWorker(unsigned int mult) { size_t size; if ((size = popintptr()) == 0) { system_pushint(0); return; } system_pushintptr((INT_PTR) GlobalAlloc(GPTR, size * mult)); } PLUGINFUNCTIONSHORT(Alloc) { AllocWorker(sizeof(unsigned char)); } PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(StrAlloc) { AllocWorker(sizeof(TCHAR)); } PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(Copy) { SIZE_T size = 0; HANDLE source, dest; TCHAR *str; // Get the string if ((str = system_popstring()) == NULL) return; // Check for size option if (str[0] == _T('/')) { size = (SIZE_T) StrToIntPtr(str+1); dest = (HANDLE) popintptr(); } else dest = (HANDLE) StrToIntPtr(str); source = (HANDLE) popintptr(); // Ok, check the size if (size == 0) size = (SIZE_T) GlobalSize(source); // and the destinantion if (!dest) { dest = GlobalAlloc((GPTR), size); system_pushintptr((INT_PTR) dest); } // COPY! copymem(dest, source, size); GlobalFree(str); } PLUGINFUNCTIONEND #define EXECFLAGSSTACKMARKER ( sizeof(TCHAR) > 1 ? (TCHAR) 0x2691 : 0x1E ) // U+2691 Black Flag PLUGINFUNCTION(Store) { TempStack *tmp; stack_t*pNSE; int size = ((INST_R9+1)*g_stringsize*sizeof(TCHAR)); int tmpint; TCHAR *command, *cmd = command = system_popstring(); while (*cmd != 0) { switch (*(cmd++)) { case _T('s'): case _T('S'): // Store the whole variables range tmp = (TempStack*) GlobalAlloc(GPTR, sizeof(TempStack)+size); // Fill with data copymem(tmp->Data, g_variables, size); // Push to private stack tmp->Next = g_tempstack, g_tempstack = tmp; break; case _T('l'): case _T('L'): if (g_tempstack == NULL) break; // Fill with data copymem(g_variables, g_tempstack->Data, size); // Pop from private stack tmp = g_tempstack, g_tempstack = g_tempstack->Next; GlobalFree((HANDLE) tmp); break; case _T('P'): *cmd += 10; case _T('p'): GlobalFree((HANDLE) system_pushstring(system_getuservariable(*(cmd++)-_T('0')))); break; case _T('R'): *cmd += 10; case _T('r'): GlobalFree((HANDLE) system_setuservariable(*(cmd++)-_T('0'), system_popstring())); break; case _T('f'): // Pop from stack pNSE = *g_stacktop, *g_stacktop = pNSE->next; // Restore data tmpint = extra->exec_flags->abort; if (pNSE->text[0] == EXECFLAGSSTACKMARKER) copymem(extra->exec_flags, pNSE->text+2, sizeof(exec_flags_t)); extra->exec_flags->abort = tmpint; // Don't allow overriding the abort flag GlobalFree((HANDLE) pNSE); break; case _T('F'): // Store the data pNSE = (stack_t*) GlobalAlloc(GPTR, sizeof(stack_t)+(g_stringsize*sizeof(TCHAR))); *((UINT32*)pNSE->text) = EXECFLAGSSTACKMARKER; // marker + '\0' copymem(pNSE->text+2, extra->exec_flags, sizeof(exec_flags_t)); // Push to stack pNSE->next = *g_stacktop, *g_stacktop = pNSE; break; } } GlobalFree((HANDLE) command); } PLUGINFUNCTIONEND nsis-3.11/Contrib/System/Source/Buffers.h000077500000000000000000000001751477201124000203070ustar00rootroot00000000000000#if defined(_MSC_VER) && (_MSC_VER >= 1020) #pragma once #endif #ifndef BUFFERS_H #define BUFFERS_H #endif /* BUFFERS_H */ nsis-3.11/Contrib/System/Source/Call-amd64.S000077500000000000000000000105271477201124000204540ustar00rootroot00000000000000;# ;# This file is a part of NSIS. ;# ;# Copyright (C) 2014-2025 Anders Kjersem ;# ;# Licensed under the zlib/libpng license (the "License"); ;# you may not use this file except in compliance with the License. ;# ;# Licence details can be found in the file COPYING. ;# ;# This software is provided 'as-is', without any express or implied ;# warranty. ;# ;# ;# MASM: ;# ml64.exe /c Call-amd64.S ;# ;# Notes: ;# * MASM does not accept 0x* constants and GAS does not accept *h constants in Intel mode, must use decimal! ;# ; .if 0 ;# MASM SECTION_DATA equ .data SECTION_CODE equ .code FUNC_DECL MACRO name name PROC ENDM FUNC_END MACRO name name ENDP ENDM ;# ~MASM IF 0 ; .else ;# GNU .intel_syntax noprefix .set __GNU__,1 #define IFDEF .ifdef #define ELSE .else #define ENDIF .endif #define SECTION_DATA .data #define SECTION_CODE .text #define END .end #define EXTERN .extern .macro FUNC_DECL name .global \name .func \name \name: .endm .macro FUNC_END name .endfunc .endm ;# ~GNU ENDIF IFDEF SYSTEM_LOG_DEBUG EXTERN __imp_IsDebuggerPresent : PROC ENDIF EXTERN GetProcOffset : PROC EXTERN GetParamsOffset : PROC EXTERN GetSizeOfProcParam : PROC EXTERN GetValueOffsetParam : PROC EXTERN SetCallProcResultValues : PROC SECTION_CODE FUNC_DECL CallProc2 ;# rcx=SystemProc* edx=ParamCount mov [rsp+8], r12 mov [rsp+16], r13 mov [rsp+24], r14 ;#mov [rsp+32], r15 ;# The stack is unaligned on function entry. We have to calculate the required ;# stack size for our parameters + maybe 8 padding bytes to end up 16 byte aligned. IFDEF __GNU__ #define pSystemProc r14 ELSE pSystemProc equ r14 ENDIF mov pSystemProc, rcx ;# Save SystemProc* ;# Not required since we zero-extend eax: xor rax, rax mov r13d, edx ;# Save ParamCount imul eax, edx, 8 and edx, 1 jnz noparamalignpadding lea eax, [eax+8] ;# sizeof(params) + 8 will make us 16 byte aligned noparamalignpadding: cmp eax, 40 ;# The ABI guarantees shadow space for the 4 register parameters ja computedstacksize mov eax, 40 ;# Minimum (4*8) + 8 to align computedstacksize: mov r12d, eax ;# Save stack size (Zero-extended mov) sub rsp, r12 IFDEF SYSTEM_LOG_DEBUG ;# BUGBUG: Remove this call qword ptr [__imp_IsDebuggerPresent] test eax, eax jz nodbgbrk int 3 nodbgbrk: ENDIF ;# We are going to set all stack parameters including the first 4, ;# it does not hurt to do that and it allows us to copy them to ;# their registers without reading pSystemProc->Params[1..3] again call GetSizeOfProcParam mov r9, rax ;# Store sizeof(ProcParameter) call GetValueOffsetParam mov r8, rax ;# Store FIELD_OFFSET(ProcParameter,Value) call GetParamsOffset lea r10, [pSystemProc+rax] ;# Store pSystemProc+FIELD_OFFSET(SystemProc,Params) mov ecx, r13d ;# Zero-extended mov test rcx, rcx jz callthefunc setparameter: mov rax, r9 mul rcx ;# rax = sizeof(ProcParameter) * paramidx (paramidx is 1 based because the return value is stored in Params[0]) add rax, r10 ;# rax += pSystemProc->Params mov rax, qword ptr [rax+r8] ;# rax = pSystemProc->Params[paramidx].Value dec rcx mov [rsp+(8*rcx)], rax inc rcx loop setparameter ;# The 4 parameter registers are all volatile so we might as well assign all of them: ;# setparam4: ;# cmp r13d, 4 ;# jb setparam3 mov r9, [rsp+(8*3)] ;# setparam3: ;# cmp r13d, 3 ;# jb setparam2 mov r8, [rsp+(8*2)] ;# setparam2: ;# cmp r13d, 2 ;# jb setparam1 mov rdx, [rsp+(8*1)] ;# setparam1: ;# cmp r13d, 1 ;# jb callthefunc mov rcx, [rsp+(8*0)] callthefunc: call GetProcOffset mov r10, qword ptr [pSystemProc+rax] xor rax, rax ;# Fix bug #1535007 call r10 mov rcx, pSystemProc mov rdx, rax ;# Return value call SetCallProcResultValues ;# Store GetLastError() and return value ;# mov rax, pSystemProc has been performed by SetCallProcResultValues ;# Epilog: ;# http://msdn.microsoft.com/en-us/library/tawsa7cb claims that only ;# add/lea rsp and pop is valid in the epilog. Unwind might fail on our version? add rsp, r12 ;# Restore stack ;# Restore nonvolatile registers: mov r12, [rsp+8] mov r13, [rsp+16] mov r14, [rsp+24] ;#mov r15, [rsp+32] ret FUNC_END CallProc2 END nsis-3.11/Contrib/System/Source/Call-amd64CPP.S000077500000000000000000000002321477201124000210070ustar00rootroot00000000000000#ifdef _MSC_VER #error "MSVC is supposed to use the plain .S file!" #endif #if 0 ERROR: assembler-with-cpp required! #else #include "Call-amd64.S" #endif nsis-3.11/Contrib/System/Source/Call-amd64CPP.sx000077500000000000000000000002351477201124000212420ustar00rootroot00000000000000#ifdef _MSC_VER #error "MSVC is supposed to use the plain .S file!" #endif #if 0 ERROR: assembler-with-cpp required! #else #include "Call-amd64CPP.S" #endif nsis-3.11/Contrib/System/Source/Call.S000077500000000000000000000626451477201124000175530ustar00rootroot00000000000000;# Copyright (c) 2008 Thomas Gaugler ;# Copyright (c) 2008-2025 NSIS Contributors ;# ;# 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. ;# ;# ;# Implementation of the functions CallProc, RealCallBack and ;# CallBack of the System plugin in pure x86 assembly. ;# ;# This is a hybrid assembly source file supporting both the ;# MASM as well as the GNU assembler in one file. ;# ;# ;# MASM: ;# ml.exe /c /nologo /Fo"call.obj" /W3 /Zi /errorReport:prompt /Ta"call.S" ;# ;# For enabling debug support use: ;# ml.exe /c /nologo /D"SYSTEM_LOG_DEBUG" /Fo"call.obj" /W3 /Zi /errorReport:prompt /Ta"call.S" ;# ;# GNU toolchain: ;# gcc -x assembler-with-cpp -s call.S -c ;# ;# For enabling debug support use: ;# gcc -x assembler-with-cpp -DSYSTEM_LOG_DEBUG -s call.S -c ;# ;# ; .if 0 ;# MASM specific block .386 .model flat OPTION casemap:none ;# SYSCALL is identical to the C calling convention, ;# but does not add an underscore prefix to symbols. OPTION language:syscall SECTION_DATA equ .data SECTION_CODE equ .code DATA_SUFFIX equ ASCII equ DB TEMP_LABEL equ @@ TEMP_LABEL_AHEAD equ @f TEMP_LABEL_BACK equ @b MACRO_DECL equ FUNC_DECL MACRO name name PROC ENDM FUNC_END MACRO name name ENDP ENDM ;# end of MASM specific block IF 0 ; .else ;# GNU toolchain specific block .intel_syntax noprefix .set __GNU__,1 #ifdef SYSTEM_LOG_DEBUG ;# Disable further proprocessing of SYSTEM_LOG_DEBUG ;# and hand it over to the GNU assembler #undef SYSTEM_LOG_DEBUG .set SYSTEM_LOG_DEBUG,1 #endif #ifdef _UNICODE #undef _UNICODE .set _UNICODE,1 #endif #define IFDEF .ifdef #define ELSE .else #define ENDIF .endif #define EXTERN .extern #define SECTION_DATA .data #define SECTION_CODE .text #define DATA_SUFFIX : #define BYTE .byte #define DWORD .int #define WORD .word #define ASCII .ascii #define MACRO_DECL .macro #define MACRO #define ENDM .endm #define TEMP_LABEL 1 #define TEMP_LABEL_AHEAD 1f #define TEMP_LABEL_BACK 1b .macro FUNC_DECL name .global \name .func \name \name: .endm .macro FUNC_END name .endfunc .endm ;# /* ;# http://gcc.gnu.org/ml/gcc/2006-11/msg00081.html ;# _alloca_probe <=> _chkstk <=> _alloca (in libgcc) ;# */ #define __alloca_probe __alloca #define END .end ;# end of GNU toolchain specific block ENDIF IFDEF SYSTEM_LOG_DEBUG EXTERN _WriteToLog : PROC EXTERN _syslogbuf : DWORD ENDIF EXTERN __alloca_probe : PROC EXTERN __imp__GlobalFree@4 : PROC IFDEF _UNICODE EXTERN __imp__wsprintfW : PROC ELSE EXTERN __imp__wsprintfA : PROC ENDIF EXTERN _GlobalCopy : PROC EXTERN _LastStackPlace : DWORD EXTERN _LastStackReal : DWORD EXTERN _LastProc : DWORD EXTERN _CallbackIndex : DWORD EXTERN _retexpr : DWORD EXTERN _retaddr : PTR EXTERN _GetNewStackSize : PROC EXTERN _GetGenStackOption : PROC EXTERN _GetCDeclOption : PROC EXTERN _GetProcOffset : PROC EXTERN _GetCloneOffset : PROC EXTERN _GetProcNameOffset : PROC EXTERN _GetArgsSizeOffset : PROC EXTERN _GetParamCount : PROC EXTERN _GetParamsOffset : PROC EXTERN _GetSizeOfProcParam : PROC EXTERN _GetSizeOffsetParam : PROC EXTERN _GetValueOffsetParam : PROC EXTERN _Get_valueOffsetParam : PROC EXTERN _SetCloneOption : PROC EXTERN _SetCallProcResultValues@12 : PROC EXTERN _SetProcResultCallback : PROC SECTION_DATA ;# Low double word of result _z1 DATA_SUFFIX DWORD 0 ;# High double word of result _z2 DATA_SUFFIX DWORD 0 IFDEF SYSTEM_LOG_DEBUG IFDEF _UNICODE LogStack DATA_SUFFIX BYTE '%', 0, 's', 0, ' ', 0, ' ', 0, 'E', 0, 'S', 0, 'P', 0, ' ', 0 BYTE ' ', 0, '0', 0, 'x', 0, '%', 0, '0', 0, '8', 0, 'X', 0, ' ', 0 BYTE 'S', 0, 't', 0, 'a', 0, 'c', 0, 'k', 0, ' ', 0, '=', 0, ' ', 0 BYTE 'x', 0, '%', 0, '0', 0, '8', 0, 'X', 0, ' ', 0, ' ', 0, 'R', 0 BYTE 'a', 0, 'l', 0, ' ', 0, '=', 0, ' ', 0, '0', 0, 'x', 0, '%', 0 BYTE '8', 0, 'X', 0 WORD 0 LogCall DATA_SUFFIX WORD 9,9 BYTE 'C', 0, 'a', 0, 'l', 0, 'l', 0, ':', 0 WORD 10,0 LogBeforeCall DATA_SUFFIX WORD 9,9,9 BYTE 'B', 0, 'e', 0, 'f', 0, 'o', 0, 'r', 0, 'e', 0, ' ', 0, 'c', 0 BYTE 'l', 0, 'l', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0 BYTE ' ', 0 WORD 0 LogNearCall DATA_SUFFIX WORD 10,9,9,9 BYTE 'N', 0, 'e', 0, 'a', 0, 'r', 0, ' ', 0, 'c', 0, 'a', 0, 'l', 0 BYTE ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0 BYTE ' ', 0 WORD 0 LogBackFrom DATA_SUFFIX WORD 9 BYTE 'B', 0, 'a', 0, 'c', 0, 'k', 0, ' ', 0, 'f', 0, 'r', 0, 'o', 0 BYTE ' ', 0 WORD 0 LogAfterCall DATA_SUFFIX WORD 10,9,9,9 BYTE 'A', 0, 'f', 0, 't', 0, 'e', 0, 'r', 0, ' ', 0, 'c', 0, 'a', 0 BYTE 'l', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0 BYTE ' ', 0 WORD 0 LogReturnAfter DATA_SUFFIX WORD 10,9,9,9 BYTE 'R', 0, 'e', 0, 't', 0, 'u', 0, 'r', 0, 'n', 0, ' ', 0, ' ', 0 BYTE ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0 BYTE ' ', 0, ' ', 0, ' ', 0, '0', 0, 'x', 0, '%', 0, '0', 0, '8', 0 BYTE ' ', 0, ' ', 0, ' ', 0, ' ', 0, '0', 0, 'x', 0, '%', 0, '0', 0 BYTE 'X', 0 WORD 0 LogCalled DATA_SUFFIX BYTE 'C', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ', 0, 'c', 0 BYTE 'l', 0, 'l', 0, 'b', 0, 'a', 0, 'c', 0, 'k', 0, ' ', 0, 'f', 0 BYTE 'o', 0, 'm', 0, ' ', 0 WORD 0 LogShortAfter DATA_SUFFIX WORD 10,9,9,9 BYTE 'S', 0, 'h', 0, 'o', 0, 'r', 0, 't', 0, '-', 0, 'A', 0, 'f', 0 BYTE 'e', 0, 'r', 0, ' ', 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, ' ', 0 BYTE ' ', 0 WORD 0 LogReturn DATA_SUFFIX WORD 9,9 BYTE 'R', 0, 'e', 0, 't', 0, 'u', 0, 'r', 0, 'n', 0, ' ', 0, 'f', 0 BYTE 'o', 0, 'm', 0, ' ', 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'b', 0 BYTE 'c', 0, 'k', 0, ':', 0 WORD 10,0 LogBefore DATA_SUFFIX WORD 9,9,9 BYTE 'B', 0, 'e', 0, 'f', 0, 'o', 0, 'r', 0, 'e', 0, ' ', 0, 'c', 0 BYTE 'l', 0, 'l', 0, '-', 0, 'b', 0, 'a', 0, 'c', 0, 'k', 0, ' ', 0 BYTE ' ', 0 WORD 0 LogShortBefore DATA_SUFFIX WORD 10,9,9,9 BYTE 'S', 0, 'h', 0, '-', 0, 'B', 0, 'e', 0, 'f', 0, 'o', 0, 'r', 0 BYTE ' ', 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, '-', 0, 'b', 0, 'a', 0 BYTE 'k', 0 WORD 0 LogLF DATA_SUFFIX WORD 10,0 ELSE LogStack DATA_SUFFIX ASCII "%s ESP = 0x%08X Stack = 0x%08X Real = 0x%08X" BYTE 0 LogCall DATA_SUFFIX BYTE 9,9 ASCII "Call:" BYTE 10,0 LogBeforeCall DATA_SUFFIX BYTE 9,9,9 ASCII "Before call " BYTE 0 LogNearCall DATA_SUFFIX BYTE 10,9,9,9 ASCII "Near call " BYTE 0 LogBackFrom DATA_SUFFIX BYTE 9 ASCII "Back from " BYTE 0 LogAfterCall DATA_SUFFIX BYTE 10,9,9,9 ASCII "After call " BYTE 0 LogReturnAfter DATA_SUFFIX BYTE 10,9,9,9 ASCII "Return 0x%08X 0x%08X" BYTE 0 LogCalled DATA_SUFFIX ASCII "Called callback from " BYTE 0 LogShortAfter DATA_SUFFIX BYTE 10,9,9,9 ASCII "Short-After call " BYTE 0 LogReturn DATA_SUFFIX BYTE 9,9 ASCII "Return from callback:" BYTE 10,0 LogBefore DATA_SUFFIX BYTE 9,9,9 ASCII "Before call-back " BYTE 0 LogShortBefore DATA_SUFFIX BYTE 10,9,9,9 ASCII "Sh-Before call-back" BYTE 0 LogLF DATA_SUFFIX BYTE 10,0 ENDIF ENDIF SECTION_CODE IFDEF SYSTEM_LOG_DEBUG ;# Sets edi to address of the end of the syslog buffer (terminating zero) MACRO_DECL SYSTEM_LOG_INIT MACRO mov edi,offset _syslogbuf TEMP_LABEL: ;# End loop if terminating zero of buffer was found otherwise move ;# to next character and check again cmp byte ptr [edi],0 je TEMP_LABEL_AHEAD inc edi jmp TEMP_LABEL_BACK TEMP_LABEL: ENDM ;# Appends log information and advances edi accordingly. ;# ;# edi must point to the address of the log buffer where ;# the log information should be appended. ;# ;# eax returns number of bytes appended to log buffer MACRO_DECL SYSTEM_LOG_ADD MACRO arg1,arg2 ;# Format string IFDEF __GNU__ push \arg1 \arg2 ELSE push arg1 arg2 ENDIF ;# Log buffer push edi IFDEF _UNICODE call dword ptr [__imp__wsprintfW] ELSE call dword ptr [__imp__wsprintfA] ENDIF ;# If wsprintf succeeds then advance edi by number of bytes ;# written to buffer cmp eax,0 jl TEMP_LABEL_AHEAD add edi,eax TEMP_LABEL: add esp,8 ENDM ;# Writes stackpointer and additional information to log ;# and advances edi accordingly (terminating zero of buffer). ;# ;# edi must point to the address of the log buffer where ;# the log information should be appended. ;# ;# eax returns number of bytes appended to log buffer MACRO_DECL SYSTEM_EVENT MACRO arg1,arg2 ;# Save current stack pointer in eax mov eax,esp ;# Stackpointer information push dword ptr [_LastStackReal] push dword ptr [_LastStackPlace] push eax ;# Event information IFDEF __GNU__ push \arg1 \arg2 ELSE push arg1 arg2 ENDIF SYSTEM_LOG_ADD offset LogStack add esp,16 ENDM ;# Flush log information and reset log buffer. ;# ;# edi must point to the address of the log buffer where ;# the log information should be appended. ;# ;# eax returns number of bytes appended to log buffer MACRO_DECL SYSTEM_LOG_POST MACRO ;# Append line feed to log information SYSTEM_LOG_ADD offset LogLF ;# Flush log information push offset _syslogbuf call _WriteToLog add esp,4 ;# Reset log buffer mov byte ptr [_syslogbuf],0 ENDM ENDIF FUNC_DECL _CallProc ;# Save stack push ebp mov ebp,esp ;# Stack space for local variables ;# ebp-4 = Size of ProcParameter structure sub esp,4 ;# Save all usable registers to free our hands push ebx push edi push esi IFDEF SYSTEM_LOG_DEBUG SYSTEM_LOG_INIT SYSTEM_LOG_ADD offset LogCall SYSTEM_EVENT offset LogBeforeCall ENDIF ;# CallbackIndex != 0 cmp dword ptr [_CallbackIndex],0 je stack_expand_done ;# proc->Options without POPT_GENSTACK push dword ptr [ebp+8] call _GetGenStackOption cmp eax,0 pop eax jne stack_expand_done ;# Save previous stack location push ebp mov dword ptr [_LastStackReal],esp cmp dword ptr [_LastStackPlace],0 jne stack_adjust ;# Create new stack call _GetNewStackSize call __alloca_probe mov dword ptr [_LastStackPlace],esp jmp stack_expand_done stack_adjust: ;# Move stack pointer mov esp,dword ptr [_LastStackPlace] stack_expand_done: ;# Push arguments to stack ;# ;# Get number of parameters push dword ptr [ebp+8] call _GetParamCount add esp,4 ;# Skip if there are no parameters cmp eax,0 jle params_loop_done ;# Save number of parameters on stack push eax ;# Get offset for element Params of SystemProc structure call _GetParamsOffset add eax,dword ptr [ebp+8] push eax call _GetSizeOfProcParam mov dword ptr [ebp-4],eax ;# Calculate offset for the last Parameter pop ebx pop ecx mul ecx add ebx,eax ;# Save offset of last parameter on stack push ebx ;# Save number of parameters on stack push ecx ;# Size offset of parameter call _GetSizeOffsetParam push eax ;# Value offset of parameter call _GetValueOffsetParam push eax ;# _value offset of parameter call _Get_valueOffsetParam push eax ;# ebx = _value offset pop ebx ;# edx = Value offset pop edx ;# esi = Size offset pop esi ;# ecx = n-th parameter pop ecx ;# eax = offset of current worked on parameter pop eax params_loop: ;# Check Size of param cmp dword ptr [eax+esi],2 jne params_default ;# Long type 'L'/'l' (64-bit) push dword ptr [eax+ebx] params_default: ;# Default for all types push dword ptr [eax+edx] ;# Continue with next parameter sub eax,dword ptr[ebp-4] loop params_loop params_loop_done: ;# Save proc ;# proc->Clone call _GetCloneOffset mov ecx,dword ptr [ebp+8] add eax,ecx ;# proc->Clone = LastProc mov edx,dword ptr [_LastProc] mov dword ptr [eax],edx ;# LastProc = proc mov dword ptr [_LastProc],ecx IFDEF SYSTEM_LOG_DEBUG SYSTEM_EVENT offset LogNearCall SYSTEM_LOG_POST ENDIF ;# Get address of procedure call _GetProcOffset mov ecx,dword ptr [ebp+8] mov ecx,dword ptr [eax+ecx] ;# /* ;# workaround for bug #1535007 ;# http://sf.net/tracker/index.php?func=detail&aid=1535007&group_id=22049&atid=373085 ;# ;# If a function returns short and doesn't clear eax in the process, ;# it will only set 2 bytes of eax, and the other 2 bytes remain ;# "random". In this case, they'll be part of the proc pointer. ;# ;# To avoid this, eax is cleared before the function is called. This ;# makes sure the value eax will contain is only what the function ;# actually sets. ;# */ xor eax,eax ;# Call call ecx ;# Save return mov dword ptr [_z1],eax mov dword ptr [_z2],edx IFDEF SYSTEM_LOG_DEBUG SYSTEM_LOG_INIT SYSTEM_LOG_ADD offset LogBackFrom ;# LastProc->ProcName call _GetProcNameOffset mov ecx,dword ptr [_LastProc] add eax,ecx SYSTEM_LOG_ADD eax SYSTEM_EVENT offset LogShortAfter ENDIF cmp dword ptr [_CallbackIndex],0 je stack_restore_done mov eax,dword ptr [_LastProc] push eax call _GetGenStackOption cmp eax,0 pop eax jne stack_restore_done ;# Restore real stack location mov dword ptr [_LastStackPlace],esp mov esp,dword ptr [_LastStackReal] pop ebp stack_restore_done: ;# Restore proc mov edx,dword ptr [_LastProc] mov dword ptr [ebp+8],edx ;# proc->Clone call _GetCloneOffset add eax,edx ;# LastProc = proc->Clone mov eax,dword ptr [eax] mov dword ptr [_LastProc],eax ;# In case of cdecl convention we should clear stack ;# if ((proc->Options & POPT_CDECL) != 0) push edx call _GetCDeclOption cmp eax,0 pop edx je stack_clear_done ;# Get number of parameters push edx call _GetParamCount add esp,4 ;# Skip if there are no parameters cmp eax,0 jle stack_clear_done ;# Save number of parameters on stack push eax ;# Get offset for element Params of SystemProc structure call _GetParamsOffset add eax,dword ptr [ebp+8] ;# Calculate offset for the Parameter 1 add eax,dword ptr [ebp-4] ;# Save offset for the Parameter 1 on stack push eax ;# Size offset of parameter call _GetSizeOffsetParam push eax ;# if ((CallbackIndex > 0) && ((proc->Options & POPT_GENSTACK) == 0)) cmp dword ptr [_CallbackIndex],0 jle real_stack_cleanup push dword ptr [ebp+8] call _GetGenStackOption cmp eax,0 pop eax jne real_stack_cleanup ;# In case of temporary stack ;# ;# esi = Size offset pop esi ;# eax = offset of current worked on parameter pop eax ;# ecx = n-th parameter pop ecx temp_stack_loop: ;# LastStackPlace += 4* Size of current parameter; mov edx,dword ptr [eax+esi] mov ebx,dword ptr [_LastStackPlace] lea edx,[ebx+edx*4] mov dword ptr [_LastStackPlace],edx ;# Go to next add eax,dword ptr [ebp-4] loop temp_stack_loop ;# End of stack cleanup jmp stack_clear_done real_stack_cleanup: ;# In case of real stack ;# ;# esi = Size offset pop esi ;# eax = offset of current worked on parameter pop eax ;# ecx = Number of parameters pop ecx real_stack_loop: ;# Size of current parameter == 2 cmp dword ptr [eax+esi],2 jne real_stack_default ;# Long type pop edx real_stack_default: ;# Default pop edx add eax,dword ptr [ebp-4] loop real_stack_loop stack_clear_done: ;# In case of cleared call-proc-queue -> clear allocated stack place (more flexible) cmp dword ptr [_LastProc],0 jne stack_cleanup_done mov dword ptr [_LastStackPlace],0 stack_cleanup_done: ;# Save return push dword ptr [_z2] push dword ptr [_z1] push dword ptr [ebp+8] call _SetCallProcResultValues@12 IFDEF SYSTEM_LOG_DEBUG SYSTEM_EVENT offset LogAfterCall push dword ptr [_z2] push dword ptr [_z1] SYSTEM_LOG_ADD offset LogReturnAfter add esp,8 SYSTEM_LOG_POST ENDIF ;# Return mov eax,dword ptr [ebp+8] ;# Restore registers pop esi pop edi pop ebx ;# Restore stack pointer mov esp,ebp pop ebp ret FUNC_END _CallProc FUNC_DECL _RealCallBack ;# Save stack push ebp mov ebp,esp ;# Stack space for local variables ;# ebp-16 = Size of ProcParameter structure ;# ebp-12 = ArgsSize ;# ebp-8 = Arguments pointer ;# ebp-4 = proc sub esp,16 ;# Save all usable registers to free our hands push ebx push edi push esi ;# Arguments pointer ;# 1-st arg (4 bytes), return (4 bytes) => add 8 bytes mov dword ptr [ebp-8],ebp add dword ptr [ebp-8],8 ;# Our callback proc is in eax (set by the thunk created in CreateCallback) mov dword ptr [ebp-4],eax IFDEF SYSTEM_LOG_DEBUG SYSTEM_LOG_INIT SYSTEM_LOG_ADD offset LogCalled ;# LastProc->ProcName call _GetProcNameOffset mov ecx,dword ptr [_LastProc] add eax,ecx SYSTEM_LOG_ADD eax SYSTEM_EVENT offset LogShortAfter SYSTEM_LOG_POST ENDIF call _GetCloneOffset mov edx,eax mov ecx,dword ptr [ebp-4] ;# 1. Find last unused clone jmp clone_load clone_next: mov ecx,dword ptr [eax] mov dword ptr [ebp-4],ecx clone_load: lea eax,[ecx+edx] cmp dword ptr [eax],0 jne clone_next ;# 2. Create new clone push edx push ecx call _GlobalCopy pop ecx pop edx ;# proc->Clone = Result of GlobalCopy mov ecx,dword ptr [ebp-4] mov dword ptr [ecx+edx],eax ;# proc = proc->Clone mov dword ptr [ebp-4],eax ;# 3. Set clone option push eax call _SetCloneOption pop eax ;# proc->ArgsSize = 0 mov dword ptr [ebp-12],0 ;# Read Arguments ;# Get number of parameters push dword ptr [ebp-4] call _GetParamCount add esp,4 ;# Skip if there are no parameters cmp eax,0 jle cb_params_loop_done ;# Save number of parameters on stack push eax ;# Get size of ProcParameter structure call _GetSizeOfProcParam mov dword ptr [ebp-16],eax ;# Get offset for element Params of SystemProc structure call _GetParamsOffset add eax,dword ptr [ebp-4] ;# Calculate offset for the Parameter 1 add eax,dword ptr [ebp-16] ;# Save offset for the Parameter 1 on stack push eax ;# Size offset of parameter call _GetSizeOffsetParam push eax ;# Value offset of parameter call _GetValueOffsetParam push eax ;# _value offset of parameter call _Get_valueOffsetParam push eax ;# ebx = _value offset pop ebx ;# edx = Value offset pop edx ;# esi = Size offset pop esi ;# eax = offset of current worked on parameter pop eax ;# ecx = n-th parameter pop ecx cb_params_loop: push ecx ;# Default mov ecx,dword ptr [ebp-8] mov ecx,dword ptr [ecx] mov dword ptr [eax+edx],ecx ;# (Arguments pointer)++ add dword ptr [ebp-8],4 ;# ArgsSize += 4 add dword ptr [ebp-12],4 ;# Size of current parameter == 2 cmp dword ptr [eax+esi],2 jne cb_params_next ;# Long type mov ecx,dword ptr [ebp-8] mov ecx,dword ptr [ecx] mov dword ptr [eax+ebx],ecx ;# (Arguments pointer)++ add dword ptr [ebp-8],4 ;# ArgsSize += 4 add dword ptr [ebp-12],4 cb_params_next: ;# Next parameter add eax,dword ptr [ebp-16] pop ecx loop cb_params_loop cb_params_loop_done: ;# proc->ArgsSize = ArgsSize call _GetArgsSizeOffset add eax,dword ptr [ebp-4] mov ecx,dword ptr [ebp-12] mov dword ptr [eax],ecx push dword ptr [ebp-4] call _SetProcResultCallback pop eax ;# Return ;# eax = proc ;# Save temporary stack info push ebp ;# Push LastStackPlace mov dword ptr [_LastStackPlace],esp ;# Restore real stack mov esp,dword ptr [_LastStackReal] ;# Pop LastStackReal pop ebp ;# Fake return from System::Call ;# Restore registers pop esi pop edi pop ebx ;# Restore stack pointer mov esp,ebp pop ebp ;# Return ret FUNC_END _RealCallBack FUNC_DECL _CallBack ;# Save stack push ebp mov ebp,esp ;# Save all usable registers to free our hands push ebx push edi push esi IFDEF SYSTEM_LOG_DEBUG SYSTEM_LOG_INIT SYSTEM_LOG_ADD offset LogReturn SYSTEM_EVENT offset LogBefore SYSTEM_LOG_POST ENDIF ;# Get offset for element Params of SystemProc structure call _GetParamsOffset add eax,dword ptr [ebp+8] push eax ;# Value offset call _GetValueOffsetParam push eax ;# _value offset call _Get_valueOffsetParam mov edx,eax ;# offset of Value element within SystemProc structure pop ecx ;# offset of Params element within SystemProc structure pop eax ;# Callback proc result push dword ptr [eax+ecx] push dword ptr [eax+edx] ;# Adjust return statement ;# if ((proc->Options & POPT_CDECL) != 0) push dword ptr [ebp+8] call _GetCDeclOption cmp eax,0 pop edx jne _retexpr_stdcall ;# retexpr[1] = proc->ArgsSize call _GetArgsSizeOffset mov ecx,dword ptr [ebp+8] mov al,byte ptr [ecx+eax] mov byte ptr [_retexpr+1],al jmp set_return_addr _retexpr_stdcall: ;# retexpr[1] = 0 mov byte ptr [_retexpr+1],0 set_return_addr: ;# Right return statement address mov dword ptr [_retaddr],offset _retexpr ;# Remove unneeded callback proc push dword ptr [ebp+8] call dword ptr [__imp__GlobalFree@4] ;# Prepare return ;# Callback proc result pop edx pop eax ;# Restore temporary stack and return ;# Save real stack info ;# Save previous stack location ;# Push _LastStackReal push ebp mov dword ptr [_LastStackReal],esp ;# Move stack pointer mov esp,dword ptr [_LastStackPlace] ;# Pop _LastStackPlace pop ebp IFDEF SYSTEM_LOG_DEBUG push eax push edx SYSTEM_EVENT offset LogShortBefore SYSTEM_LOG_POST ;# Callback proc result pop edx pop eax ENDIF ;# Fake return from Callback ;# Restore registers pop esi pop edi pop ebx ;# Restore stack pointer mov esp,ebp pop ebp ;# Return jmp dword ptr [_retaddr] FUNC_END _CallBack END nsis-3.11/Contrib/System/Source/CallCPP.S000077500000000000000000000002241477201124000200770ustar00rootroot00000000000000#ifdef _MSC_VER #error "MSVC is supposed to use the plain .S file!" #endif #if 0 ERROR: assembler-with-cpp required! #else #include "Call.S" #endif nsis-3.11/Contrib/System/Source/CallCPP.sx000077500000000000000000000002271477201124000203320ustar00rootroot00000000000000#ifdef _MSC_VER #error "MSVC is supposed to use the plain .S file!" #endif #if 0 ERROR: assembler-with-cpp required! #else #include "CallCPP.S" #endif nsis-3.11/Contrib/System/Source/Plugin.c000077500000000000000000000071341477201124000201460ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/23/2007 #include "stdafx.h" #include "Plugin.h" #include "Buffers.h" #include "System.h" HWND g_hwndParent; #define isvalidnsisvarindex(varnum) ( ((unsigned int)(varnum)) < (__INST_LAST) ) TCHAR *AllocString() { return (TCHAR*) GlobalAlloc(GPTR,g_stringsize*sizeof(TCHAR)); } TCHAR *AllocStr(TCHAR *str) { return lstrcpyn(AllocString(), str, g_stringsize); } TCHAR* system_popstring() { stack_t *pSt; TCHAR *src, *dst, *retval; if (!g_stacktop || !*g_stacktop) return NULL; pSt = *g_stacktop, *g_stacktop = pSt->next, src = pSt->text, dst = (TCHAR*)pSt; // We don't have to call AllocString+lstrcpy+GlobalFree if we convert the stack item to a string for (retval = dst;;) if (!(*dst++ = *src++)) return retval; } TCHAR *system_pushstring(TCHAR *str) { stack_t *th; if (!g_stacktop) return str; th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+(g_stringsize*sizeof(TCHAR))); lstrcpyn(th->text,str,g_stringsize); th->next=*g_stacktop; *g_stacktop=th; return str; } TCHAR *system_getuservariable(int varnum) { if (!isvalidnsisvarindex(varnum)) return AllocString(); return AllocStr(g_variables+varnum*g_stringsize); } TCHAR *system_setuservariable(int varnum, TCHAR *var) { if (var && isvalidnsisvarindex(varnum)) { lstrcpy(g_variables + varnum*g_stringsize, var); } return var; } // Updated for int64 and simple bitwise operations __int64 myatoi64(TCHAR *s) { __int64 v=0; // Check for right input if (!s) return 0; if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) { s++; for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; else break; v<<=4; v+=c; } } else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) { for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('7')) c-=_T('0'); else break; v<<=3; v+=c; } } else { int sign=0; if (*s == _T('-')) sign++; else s--; for (;;) { int c=*(++s) - _T('0'); if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) v = -v; } // Support for simple ORed expressions if (*s == _T('|')) { v |= myatoi64(s+1); } return v; } void myitoa64(__int64 i, TCHAR *buffer) { TCHAR buf[128], *b = buf; if (i < 0) { *(buffer++) = _T('-'); i = -i; } if (i == 0) *(buffer++) = _T('0'); else { while (i > 0) { *(b++) = _T('0') + ((TCHAR) (i%10)); i /= 10; } while (b > buf) *(buffer++) = *(--b); } *buffer = 0; } INT_PTR system_popintptr() { INT_PTR value; TCHAR *str; if ((str = system_popstring()) == NULL) return -1; value = StrToIntPtr(str); GlobalFree(str); return value; } void system_pushintptr(INT_PTR value) { TCHAR buffer[50]; wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value); system_pushstring(buffer); } void *copymem(void *output, void *input, size_t cbSize) { BYTE *out = (BYTE*) output; BYTE *in = (BYTE*) input; if ((input != NULL) && (output != NULL)) { while (cbSize-- > 0) *(out++) = *(in++); } return output; } HANDLE GlobalCopy(HANDLE Old) { size_t size = GlobalSize(Old); return copymem(GlobalAlloc(GPTR, size), Old, size); } UINT_PTR NSISCallback(enum NSPIM msg) { return 0; } #ifdef _DEBUG void main() { } #endif nsis-3.11/Contrib/System/Source/Plugin.h000077500000000000000000000040251477201124000201470ustar00rootroot00000000000000#ifndef ___PLUGIN__H___ #define ___PLUGIN__H___ #include // nsis plugin // Always use system* functions to keep the size down #define pushstring error(use system_pushstring) #undef pushint #define pushint error(use system_pushint) #define pushintptr error(use system_pushintptr) #undef myatoi #define myatoi(str) ( (int) myatoi64(str) ) #define system_pushint(v) system_pushintptr((INT_PTR)(v)) #define popintptr system_popintptr #ifdef _WIN64 # define StrToIntPtr(str) ( (INT_PTR)myatoi64((str)) ) # define IntPtrToStr(p,buf) myitoa64((p),(buf)) #else # define StrToIntPtr(str) ( (INT_PTR)myatoi((str)) ) # define IntPtrToStr(p,buf) myitoa64((p),(buf)) #endif #define BUGBUG64(brokencast) (brokencast) // Cast that needs fixing on x64 #define PLUGINFUNCTION(name) \ void __declspec(dllexport) name( \ HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { \ /*g_hwndParent=hwndParent;*/ \ EXDLL_INIT(); \ extra->RegisterPluginCallback(g_hInstance, NSISCallback); #define PLUGINFUNCTIONEND } #define PLUGINFUNCTIONSHORT(name) void __declspec(dllexport) name(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { \ g_stringsize=string_size; \ g_stacktop=stacktop; extern TCHAR *AllocStr(TCHAR *str); extern void myitoa64(__int64 i, TCHAR *buffer); extern TCHAR *AllocString(); #define system_getuservariableptr(varnum) ( (g_variables)+(varnum)*(g_stringsize) ) extern TCHAR *system_getuservariable(int varnum); // NOTE: This dupes with GlobalAlloc! extern TCHAR *system_setuservariable(int varnum, TCHAR *var); extern TCHAR* system_popstring(); // NULL - stack empty extern TCHAR* system_pushstring(TCHAR *str); extern __int64 myatoi64(TCHAR *s); extern INT_PTR system_popintptr(); // -1 -> stack empty extern void system_pushintptr(INT_PTR value); extern HANDLE GlobalCopy(HANDLE Old); extern void *copymem(void *output, void *input, size_t cbSize); extern UINT_PTR NSISCallback(enum NSPIM); extern HWND g_hwndParent; extern HINSTANCE g_hInstance; #endif nsis-3.11/Contrib/System/Source/System.c000077500000000000000000001514571477201124000202040ustar00rootroot00000000000000// System.cpp : Defines the entry point for the DLL application. // // Unicode support by Jim Park & Olivier Marcoux #include "stdafx.h" #include "Plugin.h" #include "Buffers.h" #include "System.h" #ifndef __GNUC__ #define _DECL_DLLMAIN /* enable prototypes for DllMain and _CRT_INIT */ #include #include #else #define _RPT0(type, msg) #define _CRT_WARN 0 #endif /* __GNUC__ */ #include // Parse Section Type #define PST_PROC 0 #define PST_PARAMS 1 #define PST_RETURN 2 #define PST_OPTIONS 3 #define PCD_NONE 0 #define PCD_PROC 1 #define PCD_PARAMS 2 #define PCD_DONE 3 // Just Continue const int PARAMSIZEBYTYPE_PTR = (4==sizeof(void*)) ? 1 : 2; const int ParamSizeByType[8] = { 0, // PAT_VOID (Size will be equal to 1) //BUGBUG64? 1, // PAT_INT 2, // PAT_LONG sizeof(void*) / 4, // PAT_STRING //BUGBUG64? sizeof(void*) / 4, // PAT_WSTRING //BUGBUG64? sizeof(void*) / 4, // PAT_GUID //BUGBUG64? 0, // PAT_CALLBACK (Size will be equal to 1) //BUGBUG64? 0 // PAT_REGMEM //BUGBUG64? }; // The size of the base type when used in a struct with the '&' syntax (multiply by (Option - PAO_ARRBASE) to get the real size) static const int ByteSizeByType[8] = { 1, // PAT_VOID 1, // PAT_INT 1, // PAT_LONG 1, // PAT_STRING 2, // PAT_WSTRING (Special case for &wN notation: N is a number of WCHAR, not a number of bytes) 1, // PAT_GUID (Must stay 1 for compatibility with the old '*(&g16,i)i.s' syntax) 1, // PAT_CALLBACK 1 // PAT_REGMEM }; int LastStackPlace; int LastStackReal; DWORD LastError; volatile SystemProc *LastProc; int CallbackIndex; CallbackThunk* g_CallbackThunkListHead; HINSTANCE g_hInstance; // Return to callback caller with stack restore char retexpr[4]; //BUGBUG64? HANDLE retaddr; static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf) { if (proc->ProcResult == PR_CALLBACK) { INT_PTR id = proc->CallbackIndex; #ifdef POPT_SYNTAX2 if (proc->Options & POPT_SYNTAX2) id = (INT_PTR) GetAssociatedSysProcFromCallbackThunkPtr(proc->Proc); #endif wsprintf(buf, sizeof(void*) > 4 ? _T("callback%Id") : _T("callback%d"), id); // "%d" must match format used by system_pushintptr() in Get() because script will StrCmp! } else { const TCHAR *resstr = _T("error"); if (proc->ProcResult == PR_OK) resstr = _T("ok"); lstrcpy(buf, resstr); } return buf; } TCHAR *AllocResultStr(SystemProc *proc) { return MakeResultStr(proc, AllocString()); } #ifdef SYSTEM_LOG_DEBUG #ifndef COUNTOF #define COUNTOF(a) ( sizeof(a) / sizeof(a[0]) ) #endif // System log debugging turned on #define SYSTEM_LOG_ADD(a) do{ register int _len = lstrlen(syslogbuf); lstrcpyn(syslogbuf + _len, a, COUNTOF(syslogbuf) - _len); }while(0) #define SYSTEM_LOG_POST do{ SYSTEM_LOG_ADD(_T("\n")); WriteToLog(syslogbuf); *syslogbuf = 0; }while(0) HANDLE logfile = NULL; TCHAR syslogbuf[4096] = _T(""); int logop = 0; void WriteToLog(TCHAR *buffer) { DWORD written; TCHAR timebuffer[128]; GetTickCount(); if (logfile == NULL) return; SetFilePointer(logfile, 0, 0, FILE_END); if (-1 != logop) { wsprintf(timebuffer, _T("%04d %04d.%03d "), (++logop)%10000, (GetTickCount() / 1000) % 10000, GetTickCount() % 1000); #ifdef _UNICODE #ifdef _RPTW0 _RPTW0(_CRT_WARN, timebuffer); _RPTW0(_CRT_WARN, buffer); #endif #else _RPT0(_CRT_WARN, timebuffer); _RPT0(_CRT_WARN, buffer); #endif WriteFile(logfile, timebuffer, lstrlen(timebuffer)*sizeof(TCHAR), &written, NULL); } WriteFile(logfile, buffer, lstrlen(buffer)*sizeof(TCHAR), &written, NULL); // FlushFileBuffers(logfile); } PLUGINFUNCTION(Debug) { TCHAR *o1; o1 = system_popstring(); if (logfile == NULL) if (lstrlen(o1) > 0) { SYSTEMTIME t; TCHAR buffer[1024], buftime[1024], bufdate[1024]; // Init debugging logfile = CreateFile(o1, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); SetFilePointer(logfile, 0, 0, FILE_END); logop = 0; #ifdef _UNICODE { // write Unicode Byte-Order Mark DWORD written; unsigned short bom = 0xfeff; WriteFile(logfile, &bom, 2, &written, NULL); } #endif GetLocalTime(&t); GetTimeFormat(LOCALE_SYSTEM_DEFAULT, LOCALE_NOUSEROVERRIDE, &t, NULL, buftime, 1024); GetDateFormat(LOCALE_SYSTEM_DEFAULT, LOCALE_NOUSEROVERRIDE, &t, NULL, bufdate, 1024); wsprintf(buffer, _T("System, %s %s [build %hs %hs]\n"), buftime, bufdate, __TIME__, __DATE__); WriteToLog(buffer); } else ; else if (lstrlen(o1) > 0) { // Log in to log file int orglogop; WriteToLog(o1); orglogop = logop, logop = -1; WriteToLog(_T("\n")); logop = orglogop; } else { // Stop debugging WriteToLog(_T("Debug stopped.\n\n\n")); CloseHandle(logfile); logfile = NULL; } if (o1) GlobalFree(o1); } PLUGINFUNCTIONEND #else // System log debugging turned off #define SYSTEM_EVENT(a) #define SYSTEM_LOG_ADD(a) #define SYSTEM_LOG_POST #endif /** * This function is useful for Unicode support. Since the Windows * GetProcAddress function always takes a char*, this function wraps * the windows call and does the appropriate translation when * appropriate. * * @param dllHandle Handle to the DLL loaded by LoadLibraryEx. * @param funcName The name of the function to get the address of. * @return The pointer to the function. Null if failure. */ void * NSISGetProcAddress(HMODULE dllHandle, TCHAR* funcName) { #ifdef _UNICODE char* ansiName = NULL; int len; void* funcPtr; len = WideCharToMultiByte(CP_ACP, 0, funcName, -1, ansiName, 0, NULL, NULL); ansiName = (char*) GlobalAlloc(GPTR, len); WideCharToMultiByte(CP_ACP, 0, funcName, -1, ansiName, len, NULL, NULL); funcPtr = GetProcAddress(dllHandle, ansiName); GlobalFree(ansiName); return funcPtr; #else return GetProcAddress(dllHandle, funcName); #endif } PLUGINFUNCTIONSHORT(Free) { HANDLE memtofree = (HANDLE)popintptr(); if (g_CallbackThunkListHead) { CallbackThunk *pCb=g_CallbackThunkListHead,*pPrev=NULL; do { if (GetAssociatedSysProcFromCallbackThunkPtr(pCb) == (SystemProc*)memtofree) { if (pPrev) pPrev->pNext=pCb->pNext; else g_CallbackThunkListHead=pCb->pNext; --(CallbackIndex); VirtualFree(pCb,0,MEM_RELEASE); break; } pPrev=pCb; pCb=pCb->pNext; } while( pCb != NULL ); } GlobalFree(memtofree); } PLUGINFUNCTIONEND PLUGINFUNCTION(Get) { SystemProc *proc = PrepareProc(FALSE); if (proc == NULL) { system_pushstring(_T("error")); return; } SYSTEM_LOG_ADD(_T("Get ")); SYSTEM_LOG_ADD(proc->DllName); SYSTEM_LOG_ADD(_T("::")); SYSTEM_LOG_ADD(proc->ProcName); //SYSTEM_LOG_ADD(_T("\n")); SYSTEM_LOG_POST; if (proc->Options & POPT_ALWRETURN) { // Always return flag set -> return separate proc and result system_pushintptr((INT_PTR) proc); GlobalFree(system_pushstring(AllocResultStr(proc))); } else { if (proc->ProcResult != PR_OK) { // No always return flag and error result - return result GlobalFree(system_pushstring(AllocResultStr(proc))); // If proc is permanent? if (!(proc->Options & POPT_PERMANENT)) GlobalFree((HGLOBAL) proc); // No, free it } else // Ok result, return proc system_pushintptr((INT_PTR) proc); } } PLUGINFUNCTIONEND #ifdef SYSTEM_ARM64 /* TODO: CallProc not implemented. Fake the behavior of the System plugin for the LoadImage API function etc. so MUI works. BUGBUG: MUI is leaking DeleteObject */ SystemProc* CallProc(SystemProc *proc) { INT_PTR ret, *place; if (!lstrcmp(proc->ProcName, sizeof(TCHAR) > 1 ? _T("LoadImageW") : _T("LoadImageA"))) { ret = (INT_PTR) LoadImage((HINSTANCE)proc->Params[1].Value, (LPCTSTR)proc->Params[2].Value, (UINT)proc->Params[3].Value, (int)proc->Params[4].Value, (int)proc->Params[5].Value, (UINT)proc->Params[6].Value); LastError = GetLastError(); } else if (!lstrcmp(proc->ProcName, _T("GetClientRect"))) ret = GetClientRect((HWND)proc->Params[1].Value, (RECT*)proc->Params[2].Value); else if (!lstrcmp(proc->ProcName, _T("GetWindowRect"))) ret = GetWindowRect((HWND)proc->Params[1].Value, (RECT*)proc->Params[2].Value); else if (!lstrcmp(proc->ProcName, _T("MapWindowPoints"))) ret = MapWindowPoints((HWND)proc->Params[1].Value, (HWND)proc->Params[2].Value, (POINT*)proc->Params[3].Value, (UINT)proc->Params[4].Value); else if (!lstrcmp(proc->ProcName, _T("SetWindowPos"))) ret = SetWindowPos((HWND)proc->Params[1].Value, (HWND)proc->Params[2].Value, (int)proc->Params[3].Value, (int)proc->Params[4].Value, (int)proc->Params[5].Value, (int)proc->Params[6].Value, (UINT)proc->Params[7].Value); else if (!lstrcmp(proc->ProcName, _T("GetWindowLong"))) ret = GetWindowLong((HWND)proc->Params[1].Value, (int)proc->Params[2].Value); else if (!lstrcmp(proc->ProcName, _T("SetWindowLong"))) ret = SetWindowLong((HWND)proc->Params[1].Value, (int)proc->Params[2].Value, (LONG)proc->Params[3].Value); else if (!lstrcmp(proc->ProcName, _T("GetWindowText"))) ret = GetWindowText((HWND)proc->Params[1].Value, (LPTSTR)proc->Params[2].Value, (int)proc->Params[3].Value); else if (!lstrcmp(proc->ProcName, _T("SendMessageA"))) ret = SendMessageA((HWND)proc->Params[1].Value, (UINT)proc->Params[2].Value, (WPARAM)proc->Params[3].Value, (LPARAM)proc->Params[4].Value); else if (!lstrcmp(proc->ProcName, _T("SendMessage")) || !lstrcmp(proc->ProcName, _T("SendMessageW"))) ret = SendMessageW((HWND)proc->Params[1].Value, (UINT)proc->Params[2].Value, (WPARAM)proc->Params[3].Value, (LPARAM)proc->Params[4].Value); else if (!lstrcmp(proc->ProcName, _T("GetVersionEx"))) // For winver ret = GetVersionEx((OSVERSIONINFO*)proc->Params[1].Value), LastError = GetLastError(); else if (!lstrcmp(proc->ProcName, _T("GetNativeSystemInfo"))) GetNativeSystemInfo((SYSTEM_INFO*)(ret = proc->Params[1].Value)); else if (!lstrcmp(proc->ProcName, _T("CharNextW"))) // For x64 ret = (INT_PTR) CharNextW((LPWSTR)proc->Params[1].Value); else if (!lstrcmp(proc->ProcName, _T("GetCurrentProcess"))) // For x64 ret = (INT_PTR) GetCurrentProcess(); else if (!lstrcmp(proc->ProcName, _T("IsWow64Process"))) // For x64 { if (!(ret = (INT_PTR) GetProcAddress(LoadLibrary(_T("KERNEL32")), "IsWow64Process"))) goto fail; ret = ((BOOL(WINAPI*)(HANDLE,BOOL*))ret)((HANDLE)proc->Params[1].Value, (BOOL*)proc->Params[2].Value); } else if (!lstrcmp(proc->ProcName, _T("IsWow64Process2"))) // For x64 { if (!(ret = (INT_PTR) GetProcAddress(LoadLibrary(_T("KERNEL32")), "IsWow64Process2"))) goto fail; ret = ((BOOL(WINAPI*)(HANDLE,USHORT*,USHORT*))ret)((HANDLE)proc->Params[1].Value, (USHORT*)proc->Params[2].Value, (USHORT*)proc->Params[3].Value); } else if (!lstrcmp(proc->ProcName, _T("Wow64EnableWow64FsRedirection"))) // For x64 { if (!(ret = (INT_PTR) GetProcAddress(LoadLibrary(_T("KERNEL32")), "Wow64EnableWow64FsRedirection"))) goto fail; ret = ((BYTE(WINAPI*)(BYTE))ret)((BYTE)proc->Params[1].Value); } else fail: proc->ProcResult = PR_ERROR, ret = 0, LastError = ERROR_INVALID_FUNCTION; place = (INT_PTR*) proc->Params[0].Value; if (!ParamIsPointer(proc->Params[0])) place = (INT_PTR*) &(proc->Params[0].Value); if (place) *place = ret; return proc; } #endif //~ SYSTEM_ARM64 #ifdef _WIN64 /* BUGBUG: TODO: CallBack support not implemented! */ SystemProc* CallBack(SystemProc *proc) { proc->ProcResult = PR_ERROR; return proc; } #endif //~ _WIN64 PLUGINFUNCTION(Call) { // Prepare input SystemProc *proc = PrepareProc(TRUE); if (proc == NULL) return; SYSTEM_LOG_ADD(_T("Call ")); SYSTEM_LOG_ADD(proc->DllName); SYSTEM_LOG_ADD(_T("::")); SYSTEM_LOG_ADD(proc->ProcName); //SYSTEM_LOG_ADD(_T("\n")); SYSTEM_LOG_POST; if (proc->ProcResult != PR_CALLBACK) ParamAllocate(proc); ParamsIn(proc); // Make the call if (proc->ProcResult != PR_ERROR) { switch (proc->ProcType) { case PT_NOTHING: if (proc->ProcResult == PR_CALLBACK) proc = CallBack(proc); break; case PT_PROC: case PT_VTABLEPROC: proc = CallProc(proc); break; case PT_STRUCT: CallStruct(proc); break; } } // Process output if (proc->Options & POPT_ALWRETURN) { // Always return flag set - return separate return and result ParamsOut(proc); GlobalFree(system_pushstring(AllocResultStr(proc))); } else { if (proc->ProcResult != PR_OK) { ProcParameter pp = proc->Params[0]; // Save old return param // Return result instead of return value TCHAR resstr[50]; proc->Params[0].Value = (INT_PTR) MakeResultStr(proc, resstr); proc->Params[0].Type = PAT_TSTRING; proc->Params[0].allocatedBlock = NULL; ParamsOut(proc); // Return all params proc->Params[0] = pp; // Restore old return param } else ParamsOut(proc); } if (proc->ProcResult != PR_CALLBACK) { ParamsDeAllocate(proc); // if not callback - check for unload library option if ((proc->Options & POPT_UNLOAD) && proc->ProcType == PT_PROC && proc->Dll) FreeLibrary(proc->Dll); // and unload it :) // In case of POPT_ERROR - first pop will be proc error if ((proc->Options & POPT_ERROR) != 0) system_pushint(LastError); } // If proc is permanent? if (!(proc->Options & POPT_PERMANENT)) GlobalFree((HGLOBAL) proc); // No, free it } PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(Int64Op) { __int64 i1, i2 = 0, i3, i4; TCHAR *op; #ifndef _WIN64 TCHAR buf[25], *o1, *o2; #endif // Get parameters: [num2] #ifdef _WIN64 i1 = system_popintptr(); #else o1 = system_popstring(), i1 = myatoi64(o1); #endif op = system_popstring(); if ((*op != _T('~')) && (*op != _T('!'))) { #ifdef _WIN64 i2 = system_popintptr(); #else o2 = system_popstring(), i2 = myatoi64(o2), GlobalFree(o2); #endif } // Operation switch (*op) { case _T('+'): i1 += i2; break; case _T('-'): i1 -= i2; break; case _T('*'): i1 *= i2; break; case _T('/'): case _T('%'): // It's unclear, but in this case compiler will use DivMod routine // instead of two separate Div and Mod routines. if (i2 == 0) { i3 = 0; i4 = i1; } else {i3 = i1 / i2; i4 = i1 % i2; } if (*op == _T('/')) i1 = i3; else i1 = i4; break; case _T('|'): if (op[1] == _T('|')) i1 = i1 || i2; else i1 |= i2; break; case _T('&'): if (op[1] == _T('&')) i1 = i1 && i2; else i1 &= i2; break; case _T('^'): i1 ^= i2; break; case _T('~'): i1 = ~i1; break; case _T('!'): i1 = !i1; break; case _T('<'): if (op[1] == _T('<')) i1 = i1 << i2; else i1 = i1 < i2; break; case _T('>'): if (op[1] == _T('>')) i1 = op[2] == _T('>') ? (UINT64)i1 >> (UINT64)i2 : i1 >> i2; else i1 = i1 > i2; break; case _T('='): i1 = (i1 == i2); break; } // Output and freedom #ifdef _WIN64 system_pushintptr(i1); #else myitoa64(i1, buf), system_pushstring(buf), GlobalFree(o1); #endif GlobalFree(op); } PLUGINFUNCTIONEND __int64 GetIntFromString(TCHAR **p) { TCHAR buffer[128], *b = buffer; (*p)++; // First character should be skipped while (((**p >= _T('a')) && (**p <= _T('f'))) || ((**p >= _T('A')) && (**p <= _T('F'))) || ((**p >= _T('0')) && (**p <= _T('9'))) || (**p == _T('X')) || (**p == _T('-')) || (**p == _T('x')) || (**p == _T('|'))) *(b++) = *((*p)++); *b = 0; (*p)--; // We should point at last digit return myatoi64(buffer); } SystemProc *PrepareProc(BOOL NeedForCall) { int SectionType = PST_PROC, // First section is always proc spec ProcType = PT_NOTHING, // Default proc spec ChangesDone = 0, ParamIndex = 0, temp = 0, temp2, temp3; INT_PTR temp4; BOOL param_defined = FALSE; SystemProc *proc = NULL; TCHAR *ibuf, *ib, *sbuf, *cbuf, *cb; unsigned int UsedTString = 0, aligntype, inpathq = 0; #ifdef POPT_SYNTAX2 const UINT alignflag = PAT_ALIGNFLAG; #else const UINT alignflag = 0; #endif #ifdef __GNUC__ temp3 = 0; // "warning: 'temp3' may be used uninitialized in this function": temp3 is set to 0 when we start parsing a new parameter #endif // Retrieve proc specs cb = (cbuf = AllocString()); // Current String buffer sbuf = AllocString(); // Safe String buffer ib = ibuf = system_popstring(); // Input string // Parse the string while (SectionType != -1) { // Check for Section Change BOOL changed = TRUE; ChangesDone = SectionType; if (SectionType != PST_PROC && proc == NULL) // no proc after PST_PROC is done means something is wrong with // the call syntax and we'll get a crash because everything needs // proc from here on. break; switch (*ib) { case 0x0: SectionType = -1; break; case _T('#'): // "...#" redefines proc unless preceded by ":", then it's an ordinal (dll::#123) if ((ib <= ibuf || *(ib-1) != _T(':') || PST_PROC != SectionType) && !inpathq) SectionType = PST_PROC, ProcType = PT_NOTHING; else changed = FALSE; break; case _T('('): if (inpathq) changed = FALSE; else { SectionType = PST_PARAMS; // fake-real parameter: for COM interfaces first param is Interface Pointer ParamIndex = ((ProcType == PT_VTABLEPROC)?(2):(1)); temp3 = temp = 0; param_defined = FALSE; } break; case _T(')'): if (inpathq) changed = FALSE; else { SectionType = PST_RETURN; temp3 = temp = 0; } break; case _T('?'): SectionType = PST_OPTIONS; temp = 1; break; default: changed = FALSE; } // Check for changes if (changed) { switch (ChangesDone) { case PST_PROC: *cb = 0; // Adopt proc if (proc == NULL) { proc = (SystemProc *) GlobalAlloc(GPTR, sizeof(SystemProc)); proc->Options = 0; proc->ParamCount = 0; } // Default parameters *proc->DllName = 0; *proc->ProcName = 0; proc->Dll = NULL; proc->Proc = NULL; proc->ProcType = ProcType; proc->ProcResult = PR_OK; // Section changed and previous section was Proc switch (ProcType) { case PT_NOTHING: // Is it previous proc or just unknown proc? if (cb != cbuf) { // Previous proc (for clear up) SystemProc *pr = NULL; if (proc != NULL) GlobalFree(proc); // Get already defined proc proc = (SystemProc *) StrToIntPtr(cbuf); if (!proc) break; // Find the last clone at proc queue while (proc && (proc->Clone != NULL)) proc = (pr = proc)->Clone; // Clear parents record for child callback proc if (pr != NULL) pr->Clone = NULL; // Never Redefine? if (proc->Options & POPT_NEVERREDEF) { proc = GlobalCopy(proc); // Create new proc as copy proc->Options &= ~(POPT_NEVERREDEF|POPT_PERMANENT); // NeverRedef options is never inherited } else proc->Options |= POPT_PERMANENT; // Proc is old -> permanent } break; case PT_PROC: case PT_VTABLEPROC: lstrcpy(proc->DllName, sbuf); case PT_STRUCT: lstrcpy(proc->ProcName, cbuf); break; } break; case PST_PARAMS: if (param_defined) proc->ParamCount = ParamIndex; else // not simply zero because of vtable calls proc->ParamCount = ParamIndex - 1; case PST_RETURN: case PST_OPTIONS: break; } ib++; cb = cbuf; continue; } // Parse the section ChangesDone = PCD_NONE; switch (SectionType) { // Proc sections parser case PST_PROC: parse_next_proc_section_char: switch (*ib) { case _T('\"'): ib++; // Skip '\"' if (inpathq) { inpathq = 0; goto parse_next_proc_section_char; } else { inpathq++; } break; case _T(':'): case _T('-'): // Is it '::' if ((*(ib) == _T('-')) && (*(ib+1) == _T('>'))) { ProcType = PT_VTABLEPROC; } else { if ((*(ib+1) != _T(':')) || (*(ib) == _T('-'))) break; ProcType = PT_PROC; } ib++; // Skip next ':' if (cb > cbuf) { *cb = 0; lstrcpy(sbuf, cbuf); } else *sbuf = 0; // No dll - system proc // Ok ChangesDone = PCD_DONE; break; case _T('*'): // Structure definition ProcType = PT_STRUCT; ChangesDone = PCD_DONE; break; } break; // Params and return sections parser case PST_RETURN: ParamIndex = 0; // Uses the same logic as PST_PARAMS section case PST_PARAMS: temp2 = -1; temp4 = 0; // Our type placeholder aligntype = FALSE; switch (*ib) { case _T(' '): break; case _T('_'): // No param cutting specifier if (proc->ParamCount > ParamIndex) ParamIndex = proc->ParamCount; temp3 = temp = 0; // Clear parameter options if (proc->ParamCount != ((ProcType == PT_VTABLEPROC) ? 1 : 0)) { // only define params if the last count wasn't zero // this prevents erroneous param count for: // 'user32::CloseClipboard()(_)' // for vtable calls, param count should not be one param_defined = TRUE; } break; case _T(','): // Next param temp3 = temp = 0; // Clear parameter options ParamIndex++; param_defined = TRUE; break; case _T('&'): temp = PAO_ARRBASE; break; // Special parameter option case _T('*'): temp = PAO_PTRFLAG; break; // Pointer parameter option // Types case _T('@'): temp2 = PAT_REGMEM; break; case _T('V'): // No extra alignment for void padding case _T('v'): temp2 = PAT_VOID; break; case 'B': aligntype += alignflag ? 1 : 0; case 'b': temp2 = PAT_INT, temp = sizeof(BYTE) + 1; break; // INT8/BYTE/BOOLEAN alias for &1 case 'H': aligntype += alignflag ? 1 : 0; case 'h': temp2 = PAT_INT, temp = sizeof(WORD) + 1; break; // INT16/WORD/SHORT alias for &2 with 'h' AKA printf type length specifier #ifndef _WIN64 case _T('P'): #endif case _T('I'): aligntype += alignflag ? 1 : 0; #ifndef _WIN64 case _T('p'): #endif case _T('i'): temp2 = PAT_INT; break; // INT32 #ifdef _WIN64 case _T('P'): #endif case _T('L'): aligntype += alignflag ? 1 : 0; #ifdef _WIN64 case _T('p'): #endif case _T('l'): temp2 = PAT_LONG; break; // INT64 case _T('M'): // 1 byte, no extra alignment case _T('m'): temp2 = PAT_STRING; break; case _T('T'): aligntype += (alignflag && sizeof(TCHAR) > 1) ? 1 : 0; case _T('t'): temp2 = PAT_TSTRING, ++UsedTString; break; case _T('G'): aligntype += alignflag ? 1 : 0; case _T('g'): temp2 = PAT_GUID; break; case _T('W'): aligntype += alignflag ? 1 : 0; case _T('w'): temp2 = PAT_WSTRING; break; case _T('K'): aligntype += alignflag ? 1 : 0; case _T('k'): temp2 = PAT_CALLBACK; break; // Input output specifiers case _T('.'): temp3++; break; // skip specifier case _T('R'): temp4 = ((INT_PTR) GetIntFromString(&ib))+1; if (temp4 < 11) temp4 += 10; break; case _T('r'): temp4 = ((INT_PTR) GetIntFromString(&ib))+1; break; // Register case _T('-'): case _T('0'): case _T('1'): case _T('2'): case _T('3'): case _T('4'): case _T('5'): case _T('6'): case _T('7'): case _T('8'): case _T('9'): // Numeric inline if (temp3 == 0) { ib--; // It's stupid, I know, but I'm too lazy to do another thing myitoa64(GetIntFromString(&(ib)),(TCHAR *)(temp4 = (INT_PTR) AllocString())); } break; case _T('\"'): case _T('\''): case _T('`'): // Character inline { TCHAR start = *ib; cb = cbuf; // copy inline while (!((*(++ib) == start) && (*(ib+1) != start)) && (*ib)) { if ((*ib) == start) ++ib; *(cb++) = *(ib); } // finish and save *cb = 0; temp4 = (INT_PTR) AllocStr(cbuf); } break; case _T('s'): case _T('S'): temp4 = -1; break; // Stack case _T('c'): case _T('C'): temp4 = INST_CMDLINE+1; break; case _T('d'): case _T('D'): temp4 = INST_INSTDIR+1; break; case _T('o'): case _T('O'): temp4 = INST_OUTDIR+1; break; case _T('e'): case _T('E'): temp4 = INST_EXEDIR+1; break; case _T('a'): case _T('A'): temp4 = INST_LANG+1; break; } // Param type changed? if (temp2 != -1) { const int psbt = ParamSizeByType[temp2]; param_defined = TRUE; proc->Params[ParamIndex].Type = temp2 | (alignflag && aligntype ? alignflag : 0); proc->Params[ParamIndex].Size = // Pointer sized or from type ParamOptionIsPointer(temp) ? (PARAMSIZEBYTYPE_PTR) : ((psbt>0) ? (psbt) : (1)); //BUGBUG64: Is it safe to fallback to 1 for CALLBACK? if (temp == PAO_ARRBASE) temp = PAO_ARRBASE + ((int) GetIntFromString(&ib)); // Read '&' array count specification proc->Params[ParamIndex].Option = temp; proc->Params[ParamIndex].Value = 0; proc->Params[ParamIndex].Input = IOT_NONE; proc->Params[ParamIndex].Output = IOT_NONE; } // Param source/dest changed? if (temp4 != 0) { param_defined = TRUE; if (temp3 == 0) { // it may contain previous inline input if (!((proc->Params[ParamIndex].Input > -1) && (proc->Params[ParamIndex].Input <= __INST_LAST))) GlobalFree((HGLOBAL) proc->Params[ParamIndex].Input); proc->Params[ParamIndex].Input = temp4; } if (temp3 == 1) proc->Params[ParamIndex].Output = (int) temp4; // Note: As long as we never assign a pointer to temp4 when parsing a destination the cast to int is OK. // Next parameter is output or something else temp3++; } ChangesDone = PCD_DONE; break; // Options sections parser case PST_OPTIONS: temp2 = 0; switch (*ib) { case _T(' '): break; case _T('!'): temp = -temp; break; case _T('c'): #ifndef _WIN64 temp2 = POPT_CDECL; // Only x86 cares, just eat the option for everything else #endif break; case _T('r'): temp2 = POPT_ALWRETURN; break; case _T('n'): temp2 = POPT_NEVERREDEF; break; case _T('s'): temp2 = POPT_GENSTACK; break; case _T('e'): temp2 = POPT_ERROR; break; case _T('u'): temp2 = POPT_UNLOAD; break; #ifdef POPT_SYNTAX2 case _T('2'): temp2 = POPT_SYNTAX2; break; #endif } // New Options if (temp2 != 0) { if (temp == 1) proc->Options |= temp2; else proc->Options &= ~temp2; // Back to default (turn on nothing) state temp = 1; temp2 = 0; } ChangesDone = PCD_DONE; break; } // Nothing done, just copy char to buffer if (ChangesDone == PCD_NONE) *(cb++) = *(ib); // Something done, buffer = "" else cb = cbuf; // Increase input pointer ib++; } GlobalFree(ibuf); GlobalFree(cbuf); GlobalFree(sbuf); // Ok, the final step: check proc for existence if (proc != NULL && proc->Proc == NULL) { switch (proc->ProcType) { case PT_NOTHING: break; case PT_VTABLEPROC: { // Use direct system proc address INT_PTR addr; proc->Dll = (HMODULE) StrToIntPtr(proc->DllName); if (proc->Dll == 0) { proc->ProcResult = PR_ERROR; break; } addr = (INT_PTR) proc->Dll; // fake-real parameter: for COM interfaces first param is Interface Pointer proc->Params[1].Output = IOT_NONE; proc->Params[1].Input = (INT_PTR) AllocStr(proc->DllName); proc->Params[1].Size = PARAMSIZEBYTYPE_PTR; proc->Params[1].Type = PAT_PTR; proc->Params[1].Option = 0; // addr - pointer to interface vtable addr = *((INT_PTR *)addr); // now addr contains the pointer to first item at VTABLE // add the index of proc addr = addr + (INT_PTR)(myatoi64(proc->ProcName)*sizeof(void*)); proc->Proc = *((HANDLE*)addr); } break; case PT_PROC: if (*proc->DllName == 0) { // Use direct system proc address if ((proc->Proc = (HANDLE) StrToIntPtr(proc->ProcName)) == 0) proc->ProcResult = PR_ERROR; } else { // Get DLL address if ((proc->Dll = GetModuleHandle(proc->DllName)) == NULL) if ((proc->Dll = LoadLibrary(proc->DllName)) == NULL) { proc->ProcResult = PR_ERROR; break; } // Get proc address proc->Proc = NSISGetProcAddress(proc->Dll, proc->ProcName); if (!proc->Proc && *proc->ProcName == _T('#')) { int ordinal = myatoi(proc->ProcName+1); if (ordinal && IS_INTRESOURCE(ordinal)) proc->Proc = GetProcAddress(proc->Dll, MAKEINTRESOURCEA(ordinal)); } if (UsedTString || !proc->Proc) { FARPROC tproc; TCHAR*ProcName = proc->ProcName; // This buffer has room for us to party on unsigned int cch = lstrlen(ProcName); #ifdef _UNICODE STRSET2CH(ProcName+cch, _T('W'), _T('\0')); #else STRSET2CH(ProcName+cch, _T('A'), _T('\0')); #endif tproc = NSISGetProcAddress(proc->Dll, ProcName); if (tproc) proc->Proc = tproc; else if (!proc->Proc) proc->ProcResult = PR_ERROR; } } break; case PT_STRUCT: if (*(proc->ProcName) != 0) proc->Proc = (HANDLE) StrToIntPtr(proc->ProcName); break; } } return proc; } void ParamAllocate(SystemProc *proc) { UINT i, c; for (i = 0, c = proc->ParamCount; i <= c; i++) if (!proc->Params[i].Value && ParamIsPointer(proc->Params[i])) proc->Params[i].Value = (INT_PTR) GlobalAlloc(GPTR, ParamSizeByType[GetParamType(proc->Params[i])] * 4); } void ParamsIn(SystemProc *proc) { int i; HGLOBAL* place; TCHAR *realbuf; #ifndef _UNICODE LPWSTR wstr; #endif #if !defined(_WIN64) && defined(C_ASSERT) C_ASSERT(FIELD_OFFSET(ProcParameter, Value) + sizeof(int) == FIELD_OFFSET(ProcParameter, _value)); // Make sure PAT_LONG writes to the correct places #endif i = (proc->ParamCount > 0)?(1):(0); while (TRUE) { ProcParameter *par = &proc->Params[i]; UINT partype; // Step 1: retrieve value if ((par->Input == IOT_NONE) || (par->Input == IOT_INLINE)) realbuf = AllocStr(_T("")); else if (par->Input == IOT_STACK) realbuf = system_popstring(); else if ((par->Input > 0) && (par->Input <= __INST_LAST)) realbuf = system_getuservariable((int)par->Input - 1); else { // Inline input, will be freed as realbuf realbuf = (TCHAR*) par->Input; par->Input = IOT_INLINE; } // Retrieve pointer to place place = ParamIsPointer(*par) ? (HGLOBAL*) par->Value : (HGLOBAL*) &(par->Value); // by default no blocks are allocated par->allocatedBlock = NULL; // Step 2: place it switch (partype = GetParamType(*par)) { case PAT_VOID: par->Value = 0; break; case PAT_INT: *(int*)place = myatoi(realbuf); break; case PAT_LONG: *(__int64*)place = myatoi64(realbuf); break; case PAT_TSTRING: /* if (par->Input == IOT_NONE) *((int*) place) = (int) NULL; else*/ *place = par->allocatedBlock = AllocStr(realbuf); break; #ifdef _UNICODE case PAT_STRING: *place = par->allocatedBlock = GlobalAlloc(GPTR, g_stringsize); WideCharToMultiByte(CP_ACP, 0, realbuf, g_stringsize, *(LPSTR*)place, g_stringsize, NULL, NULL); break; case PAT_GUID: *place = par->allocatedBlock = GlobalAlloc(GPTR, 16); CLSIDFromString(realbuf, *(LPCLSID*)place); break; #else case PAT_WSTRING: case PAT_GUID: wstr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, realbuf, g_stringsize, wstr, g_stringsize); if (partype == PAT_GUID) { *place = par->allocatedBlock = GlobalAlloc(GPTR, 16); CLSIDFromString(wstr, *(LPCLSID*)place); GlobalFree((HGLOBAL) wstr); } else *place = par->allocatedBlock = (HGLOBAL)wstr; break; #endif case PAT_CALLBACK: // Generate new or use old callback if (realbuf[0]) par->Value = (INT_PTR) CreateCallback((SystemProc*) StrToIntPtr(realbuf)); break; case PAT_REGMEM: { LPTSTR straddr = system_getuservariableptr(par->Input - 1); par->Value = (INT_PTR) straddr; par->Value += sizeof(void*) > 4 ? sizeof(_T("-9223372036854775807###")) : sizeof(_T("-2147483647")); // "###" for sizeof(void*) alignment IntPtrToStr(par->Value, straddr); } break; } GlobalFree(realbuf); #ifdef SYSTEM_LOG_DEBUG { TCHAR buf[666]; UINT32 hi32 = 0; #ifndef _WIN64 hi32 = par->_value; #endif wsprintf(buf, _T("\t\t\tParam In %d:\tType=%#x Value=") SYSFMT_HEXPTR _T(" hi32=0x%08X"), i, par->Type, par->Value, hi32); SYSTEM_LOG_ADD(buf); SYSTEM_LOG_POST; } #endif if (i == 0) break; if (i == proc->ParamCount) i = 0; else i++; } } void ParamsDeAllocate(SystemProc *proc) { int i; for (i = proc->ParamCount; i >= 0; i--) if (proc->Params[i].Value && ParamIsPointer(proc->Params[i])) { GlobalFree((HGLOBAL) (proc->Params[i].Value)); proc->Params[i].Value = 0; } } #define GetSpecialParamTypeSize(par) ( (((par).Option)-PAO_ARRBASE) * ByteSizeByType[GetParamType(par)] ) // Option must be > PAO_ARRBASE! static const int g_intmask[4] = { 0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF }; #define GetMaskedInt32Value(val, size) ( (val) & g_intmask[((UINT)(size) < 4) ? (size) : (0)] ) #define GetSpecialParamInt32Value(par, size) GetMaskedInt32Value((par).Value, (size)) void ParamsOut(SystemProc *proc) { INT_PTR *place; LPWSTR wstr; int i, partype, intval, typsiz; TCHAR *realbuf = AllocString(); i = proc->ParamCount; do { // Retrieve pointer to place if (ParamIsPointer(proc->Params[i])) place = (INT_PTR*) proc->Params[i].Value; else place = (INT_PTR*) &(proc->Params[i].Value); // Step 1: retrieve value switch (partype = GetParamType(proc->Params[i])) { case PAT_VOID: *realbuf = _T('\0'); break; #ifndef _WIN64 case PAT_REGMEM: #endif case PAT_INT: intval = (int)(*((INT_PTR*) place)); if (proc->Params[i].Option > 0) // Note: We don't handle '*' pointers, "*h" and "*b" are not supported, use "*i" even on smaller types { typsiz = GetSpecialParamTypeSize(proc->Params[i]); intval = GetMaskedInt32Value(intval, typsiz); } wsprintf(realbuf, _T("%d"), intval); break; #ifdef _WIN64 case PAT_REGMEM: #endif case PAT_LONG: myitoa64(*((__int64*) place), realbuf); break; case PAT_STRING: #ifdef _UNICODE MultiByteToWideChar(CP_ACP, 0, *((char**) place), g_stringsize, realbuf, g_stringsize-1); realbuf[g_stringsize-1] = _T('\0'); // make sure we have a null terminator #else lstrcpyn(realbuf,*((TCHAR**) place), g_stringsize); // note: lstrcpyn always includes a null terminator (unlike strncpy) #endif break; case PAT_GUID: #ifdef _UNICODE StringFromGUID2(*((REFGUID*)place), realbuf, g_stringsize); #else { WCHAR guidstrbuf[39]; int guidcch = StringFromGUID2(*((REFGUID*)place), guidstrbuf, 39); WideCharToMultiByte(CP_ACP, 0, guidstrbuf, guidcch, realbuf, g_stringsize, NULL, NULL); } #endif break; case PAT_WSTRING: wstr = *((LPWSTR*)place); #ifdef _UNICODE lstrcpyn(realbuf, wstr, g_stringsize); // note: lstrcpyn always include a null terminator (unlike strncpy) #else WideCharToMultiByte(CP_ACP, 0, wstr, g_stringsize, realbuf, g_stringsize-1, NULL, NULL); realbuf[g_stringsize-1] = _T('\0'); // make sure we have a null terminator #endif break; case PAT_CALLBACK: wsprintf(realbuf, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), proc->Params[i].Value); break; } // memory cleanup if ((proc->Params[i].allocatedBlock != NULL) && ((proc->ProcType != PT_STRUCT) || ParamIsArray(proc->Params[i])) ) GlobalFree(proc->Params[i].allocatedBlock); SYSTEM_LOG_ADD(_T("\t\t\tParam Out(")); // Step 2: place it if (proc->Params[i].Output == IOT_NONE) SYSTEM_LOG_ADD(_T("none")); else if (proc->Params[i].Output == IOT_STACK) { SYSTEM_LOG_ADD(_T("stack")); system_pushstring(realbuf); } else if (proc->Params[i].Output > 0) { SYSTEM_LOG_ADD(_T("var")); system_setuservariable(proc->Params[i].Output - 1, realbuf); } else SYSTEM_LOG_ADD(_T("?BUG?")); #ifdef SYSTEM_LOG_DEBUG { TCHAR dbgbuf[99]; wsprintf(dbgbuf, _T(")\t%d:\tType=%#x Optn=%d Size=%d Data="), i, proc->Params[i].Type, proc->Params[i].Option, proc->Params[i].Size); SYSTEM_LOG_ADD(dbgbuf); SYSTEM_LOG_ADD(realbuf); SYSTEM_LOG_POST; } #endif i--; } while (i >= 0); GlobalFree(realbuf); } HANDLE CreateCallback(SystemProc *cbproc) { #if defined(SYSTEM_AMD64) || defined(SYSTEM_ARM64) return BUGBUG64(HANDLE) NULL; #else char *mem; if (cbproc->Proc == NULL) { // Set callback index cbproc->CallbackIndex = ++(CallbackIndex); cbproc->Options |= POPT_PERMANENT; mem = (char *) (cbproc->Proc = VirtualAlloc(NULL, sizeof(CallbackThunk), MEM_COMMIT, PAGE_EXECUTE_READWRITE)); ((CallbackThunk*)mem)->pNext=g_CallbackThunkListHead; g_CallbackThunkListHead=(CallbackThunk*)mem; #ifdef SYSTEM_X86 *(mem++) = (char) 0xB8; // Mov eax, const *((int *)mem) = (int) cbproc; mem += sizeof(int); *(mem++) = (char) 0xe9; // Jmp relative *((int *)mem) = (int) RealCallBack; *((int *)mem) -= ((int) mem) + 4; #else #error "Asm thunk not implemented for this architecture!" #endif } // Return proc address return cbproc->Proc; #endif } #ifdef POPT_SYNTAX2 static UINT GetStructParamAlignment(const ProcParameter *par) { int partype = GetParamType(*par), isarr = ParamIsArray(*par); // &l is used to get the final struct size "*(p, &l.r0)" // but it also allows you to write the struct size to the struct as a int<8|16|32|64> "*(p, &l4)" // so we can't stop that with: "if ((par->Type & PAT_ALIGNFLAG) && (!isarr || partype != PAT_LONG))" if (par->Type & PAT_ALIGNFLAG) { if ((partype == PAT_STRING) | (partype == PAT_WSTRING)) return ByteSizeByType[partype]; if (partype == PAT_GUID) return 16; return !isarr ? (par->Size * 4) : GetSpecialParamTypeSize(*par); } return 0; } #endif void CallStruct(SystemProc *proc) { BOOL ssflag; // "&l" struct size syntax UINT i, paramcount = proc->ParamCount, structsize = 0, size = 0, partype; char *st, *ptr; #ifdef POPT_SYNTAX2 BOOL tryalign = proc->Options & POPT_SYNTAX2; #endif SYSTEM_LOG_ADD(_T("\t\tStruct...")); // Calculate the structure size for (i = 1; i <= paramcount; i++) { partype = GetParamType(proc->Params[i]); // Emulate g as &g16 // (Changing ByteSizeByType would break compatibility with '*(&g16,i)i.s') if (PAT_GUID==partype && ParamIsSimple(proc->Params[i])) proc->Params[i].Option = PAO_ARRBASE + 16; if (!ParamIsArray(proc->Params[i])) size = proc->Params[i].Size * 4; else size = GetParamArrayTypeSize(proc->Params[i]); #ifdef POPT_SYNTAX2 if (tryalign) structsize = SYS_ALIGNON(structsize, GetStructParamAlignment(&proc->Params[i])); #endif structsize += size; } // Struct exists? if (proc->Proc == NULL) // No. Allocate struct memory proc->Proc = (HANDLE) GlobalAlloc(GPTR, structsize); else if (structsize == 0) // In case of zero size defined structure use mapped size structsize = (int) GlobalSize((HGLOBAL) proc->Proc); #ifdef SYSTEM_LOG_DEBUG { TCHAR dbgbuf[99]; wsprintf(dbgbuf, _T("\t(%u bytes)"), structsize); SYSTEM_LOG_ADD(dbgbuf); } #endif // Pointer to current data st = (char*) proc->Proc; for (i = 1; i <= paramcount; i++) { ssflag = FALSE; partype = GetParamType(proc->Params[i]); // Normal or special block? if (!ParamIsArray(proc->Params[i])) { // Normal size = proc->Params[i].Size * 4; ptr = (char*) &(proc->Params[i].Value); } else { // Special size = GetParamArrayTypeSize(proc->Params[i]); ptr = NULL; switch (partype) { case PAT_VOID: break; case PAT_LONG: // real structure size proc->Params[i].Value = structsize; #ifndef _WIN64 proc->Params[i]._value = 0; #endif ssflag = TRUE; // System::Call '*(...,&l.r0)' // [[fallthrough]] case PAT_INT: proc->Params[i].Value = GetSpecialParamInt32Value(proc->Params[i], size); // clears unused value bits // pointer ptr = (char*) &(proc->Params[i].Value); break; case PAT_STRING: case PAT_WSTRING: case PAT_GUID: // Jim Park: Pointer for memcopy, so keep as char* ptr = (char*) proc->Params[i].Value; break; } } // Process them! if (ptr != NULL) { #ifdef POPT_SYNTAX2 if (tryalign) st = (char*) SYS_ALIGNON((INT_PTR) st, GetStructParamAlignment(&proc->Params[i])); #endif // Input if ((proc->Params[i].Input != IOT_NONE) || (ssflag)) copymem(st, ptr, size); // Output if (proc->Params[i].Output != IOT_NONE) copymem(ptr, st, size); } // Skip to next data block st += size; } SYSTEM_LOG_POST; // Proc virtual return - pointer to memory struct proc->Params[0].Value = (INT_PTR) proc->Proc; } /* Use of system _DllMainCRTStartup to avoid endless recursion for the debug report macro _RPT0. The system _DllMainCRTStartup initializes the C runtime environment. In particular the value for _osplatform is initialized. In the function _get_winmajor called in the execution of the _RPT0 macro an assertion failure is raised if _osplatform is not set. The assertion is reported by the same means as used for the _RPT0 macro. This leads to an endless recursion. */ BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpReserved) { g_hInstance=hInst; if (DLL_PROCESS_ATTACH == fdwReason) { // change the protection of return command VirtualProtect(&retexpr, sizeof(retexpr), PAGE_EXECUTE_READWRITE, (PDWORD)&LastStackPlace); // initialize some variables LastStackPlace = 0, LastStackReal = 0; LastError = 0; LastProc = NULL; CallbackIndex = 0, g_CallbackThunkListHead = NULL; #ifdef SYSTEM_X86 retexpr[0] = (char) 0xC2; retexpr[2] = 0x00; #elif defined(SYSTEM_AMD64) || defined(SYSTEM_ARM64) retexpr[0] = BUGBUG64(0); #else #error TODO #endif } return TRUE; } /* Returns size by which the stack should be expanded */ unsigned int GetNewStackSize(void) { return NEW_STACK_SIZE; } /* Returns non-zero value if GENSTACK option is set */ unsigned int GetGenStackOption(SystemProc *proc) { return (proc->Options & POPT_GENSTACK); } /* Returns non-zero value if CDECL option is set */ unsigned int GetCDeclOption(SystemProc *proc) { return (proc->Options & POPT_CDECL); } /* Returns non-zero value if Error option is set */ static unsigned int GetErrorOption(SystemProc *proc) { return (proc->Options & POPT_ERROR); } /* Returns offset for element Proc of SystemProc structure */ UINT_PTR GetProcOffset(void) { return (UINT_PTR)(&(((SystemProc *)0)->Proc)); } /* Returns offset for element Clone of SystemProc structure */ unsigned int GetCloneOffset(void) { return (unsigned int)(UINT_PTR) (&(((SystemProc *)0)->Clone)); } /* Returns offset for element ProcName of SystemProc structure */ unsigned int GetProcNameOffset(void) { return (unsigned int)(UINT_PTR) (&(((SystemProc *)0)->ProcName)); } /* Returns offset for element ArgsSize of SystemProc structure */ unsigned int GetArgsSizeOffset(void) { return (unsigned int)(UINT_PTR) (&(((SystemProc *)0)->ArgsSize)); } /* Returns number of parameters */ unsigned int GetParamCount(SystemProc *proc) { return proc->ParamCount; } /* Returns offset for element Params of SystemProc structure */ UINT_PTR GetParamsOffset(void) { return (UINT_PTR)(&(((SystemProc *)0)->Params)); } /* Returns size of ProcParameter structure */ UINT_PTR GetSizeOfProcParam(void) { return (sizeof(ProcParameter)); } /* Returns offset for element Size of ProcParameter structure */ unsigned int GetSizeOffsetParam(void) { return (unsigned int)(UINT_PTR) (&(((ProcParameter *)0)->Size)); } /* Returns offset for element Value of ProcParameter structure */ UINT_PTR GetValueOffsetParam(void) { return (UINT_PTR)(&(((ProcParameter *)0)->Value)); } #ifndef _WIN64 /* Returns offset for element _value of ProcParameter structure */ unsigned int Get_valueOffsetParam(void) { return (unsigned int)(&(((ProcParameter *)0)->_value)); } #endif /* Sets "CLONE" option */ void SetCloneOption(SystemProc *proc) { proc->Options |= POPT_CLONE; } /* Sets Result of procedure call to be "OK" */ static void SetProcResultOk(SystemProc *proc) { proc->ProcResult = PR_OK; } /* Sets Result of procedure call to be "CALLBACK" */ void SetProcResultCallback(SystemProc *proc) { proc->ProcResult = PR_CALLBACK; } SystemProc* CALLBACK SetCallProcResultValues(SystemProc *proc, ULARGE_INTEGER retval) { if (GetErrorOption(proc)) LastError = GetLastError(); #ifdef _WIN64 proc->Params[0].Value = retval.QuadPart; #else proc->Params[0].Value = retval.LowPart, proc->Params[0]._value = retval.HighPart; #endif SetProcResultOk(proc); return proc; } nsis-3.11/Contrib/System/Source/System.h000077500000000000000000000152331477201124000202000ustar00rootroot00000000000000#ifndef ___SYSTEM__H___ #define ___SYSTEM__H___ // This should probably be moved to platform.h at some point #if defined(_M_X64) || defined(_M_AMD64) || defined(__amd64__) # define SYSTEM_AMD64 #elif defined(_M_IX86) || defined(__i386__) || defined(_X86_) # define SYSTEM_X86 #elif defined(_M_ARM64) # define SYSTEM_ARM64 #else # error "Unknown architecture!" #endif #ifdef _WIN64 # define SYSFMT_HEXPTR _T("0x%016IX") #else # define SYSFMT_HEXPTR _T("0x%08X") #endif // The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the SYSTEM_EXPORTS // symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // SYSTEM_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef SYSTEM_EXPORTS # define SYSTEM_API __declspec(dllexport) #else # define SYSTEM_API __declspec(dllimport) // BUGBUG: This is a plugin, who is going to import the functions directly? #endif #define SYS_ALIGNUP(num, al) ( ((num)+((al)-1)) & ~((al)-1) ) #define SYS_UNSAFEALIGNON(num, al) ( (num) % (al) == 0 ? (num) : SYS_ALIGNUP((num), (al)) ) // al CANNOT be 0! #define SYS_ALIGNON(num, al) ( (al) ? SYS_UNSAFEALIGNON((num), (al)) : (num) ) #define NEW_STACK_SIZE 256*256 // Proc types: #define PT_NOTHING 0 #define PT_PROC 1 #define PT_STRUCT 2 #define PT_VTABLEPROC 3 // Proc results: #define PR_OK 0 #define PR_ERROR -1 #define PR_CALLBACK 1 // Real world argument types #define PAT_VOID 0 #define PAT_INT 1 #define PAT_LONG 2 #define PAT_STRING 3 #define PAT_WSTRING 4 #define PAT_GUID 5 #define PAT_CALLBACK 6 #define PAT_REGMEM 7 #ifdef _UNICODE #define PAT_TSTRING PAT_WSTRING #else #define PAT_TSTRING PAT_STRING #endif #define PAT_PTR ( (4==sizeof(void*)) ? PAT_INT : PAT_LONG ) #define PAT_ALIGNFLAG 0x8000 // Type is aligned to its natural alignment // Input/Output Source/Destination #define IOT_NONE 0 #define IOT_STACK -1 #define IOT_REG 1 #define IOT_INLINE (__INST_LAST+1) // should replace pointer to inline input // #define INLINE_INPUT -> any other value, will contain pointer to input string // Options #define POPT_CDECL 0x1 // (Option & 0x1) == 0x1 -> cdecl, otherwise stdcall #define POPT_PERMANENT 0x2 // Permanent proc, will not be destroyed after calling #define POPT_ALWRETURN 0x4 // Always return #define POPT_NEVERREDEF 0x8 // Never redefine #define POPT_GENSTACK 0x10 // Use general stack (non temporary for callback) #define POPT_ERROR 0x20 // Call GetLastError after proc and push it to stack #define POPT_UNLOAD 0x40 // unload dll after call #define POPT_CLONE 0x80 // Callback clone #define POPT_SYNTAX2 0x100 // "?2" syntax mode (direct callback ids and aligned uppercased types) // Proc argument (ProcParameter) options #define PAO_PTRFLAG -1 // Could be changed to 0x80000000 if we need to support "*&iN" #define PAO_ARRBASE 1 #define ParamOptionIsPointer(opt) ( (opt) < 0 ) typedef struct { int Type; // Can be ORed with PAT_ALIGNFLAG to request alignment in structs int Option; // PAO_PTRFLAG -> Pointer, PAO_ARRBASE-... -> Special+PAO_ARRBASE INT_PTR Value; // it can hold any pointer sized value #ifndef _WIN64 int _value; // Upper 32 bits of Value when type is 64 bit (2 pushes) #endif int Size; // Value real size (should be either 1 or 2 (the number of pushes)) int Output; INT_PTR Input; HGLOBAL allocatedBlock; // block allocated for passing string, wstring or guid param } ProcParameter; #define ParamIsSimple(par) ( (par).Option == 0 ) #define ParamIsPointer(par) ParamOptionIsPointer((par).Option) #define ParamIsArray(par) ( (par).Option > 0 ) // AKA special #define GetParamArrayTypeSize GetSpecialParamTypeSize #ifdef POPT_SYNTAX2 #define GetParamType(par) ( (BYTE) (par).Type ) #else #define GetParamType(par) ( (par).Type ) #endif // Our single proc (Since the user will free proc with GlobalFree, // I've declared all variables as statics) typedef struct tag_SystemProc SystemProc; struct tag_SystemProc { int ProcType; int ProcResult; TCHAR DllName[1024]; TCHAR ProcName[1024]; HMODULE Dll; HANDLE Proc; int Options; int ParamCount; ProcParameter Params[100]; // I hope nobody will use more than 100 params // Callback specific int CallbackIndex; int ArgsSize; // Clone of current element (used for multi-level callbacks) SystemProc *Clone; }; typedef struct tag_CallbackThunk CallbackThunk; struct tag_CallbackThunk { #ifdef SYSTEM_X86 /* #pragma pack(push,1) char mov_eax_imm; int sysprocptr; char reljmp_imm; int realprocaddr; #pragma pack(pop) */ char asm_code[10]; #elif defined(SYSTEM_AMD64) || defined(SYSTEM_ARM64) char asm_code[BUGBUG64(1)]; // TODO: BUGBUG64 #else #error "Asm thunk not implemented for this architecture!" #endif CallbackThunk* pNext; }; // Free() only knows about pNext in CallbackThunk, it does not know anything about the assembly, that is where this helper comes in... #ifdef SYSTEM_X86 # define GetAssociatedSysProcFromCallbackThunkPtr(pCbT) ( (SystemProc*) *(unsigned int*) (((char*)(pCbT))+1) ) #elif defined(SYSTEM_AMD64) || defined(SYSTEM_ARM64) # define GetAssociatedSysProcFromCallbackThunkPtr(pCbT) BUGBUG64(NULL) #else # error "GetAssociatedSysProcFromCallbackThunkPtr not defined for the current architecture!" #endif extern const int ParamSizeByType[]; // Size of every parameter type (*4 bytes) extern HANDLE CreateCallback(SystemProc *cbproc); extern SystemProc* PrepareProc(BOOL NeedForCall); extern void ParamAllocate(SystemProc *proc); extern void ParamsDeAllocate(SystemProc *proc); extern void ParamsIn(SystemProc *proc); extern void ParamsOut(SystemProc *proc); #ifdef SYSTEM_AMD64 extern SystemProc* CallProc2(SystemProc *proc, UINT_PTR ParamCount); #define CallProc(p) CallProc2((p), (p)->ParamCount) // ParamCount is passed as a parameter so CallProc2 can determine the required stack size without a function call #else //! SYSTEM_AMD64 extern SystemProc* CallProc(SystemProc *proc); #endif //~ SYSTEM_AMD64 #ifndef SYSTEM_NOCALLBACKS extern SystemProc* CallBack(SystemProc *proc); extern SystemProc* RealCallBack(); #endif extern void CallStruct(SystemProc *proc); #ifdef _UNICODE # define STRSET2CH(str, c1, c2) ( *(DWORD*)(str) = ((c1)|(c2)<<16) ) #else # define STRSET2CH(str, c1, c2) ( *(WORD*)(str) = ((c1)|(c2)<<8) ) #endif #endif nsis-3.11/Contrib/System/Source/stdafx.c000077500000000000000000000004351477201124000201760ustar00rootroot00000000000000// stdafx.cpp : source file that includes just the standard includes // AnyDLL.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file nsis-3.11/Contrib/System/Source/stdafx.h000077500000000000000000000007651477201124000202110ustar00rootroot00000000000000// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if defined(_MSC_VER) && (_MSC_VER >= 1020) #pragma once #endif #ifndef STDAFX_H #define STDAFX_H #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // Windows Header Files: #include // TODO: reference additional headers your program requires here //#define SYSTEM_LOG_DEBUG #endif /* STDAFX_H */ nsis-3.11/Contrib/System/SysFunc.nsh000077500000000000000000000243251477201124000174110ustar00rootroot00000000000000; Some useful functions based on System plugin ; ; (c) brainsucker, 2002 ; (r) BSForce !verbose push 3 !ifndef SysFunc.NSH.Included !define SysFunc.NSH.Included !include "System.nsh" !include "WinMessages.nsh" ; ================= GetInstallerExeName implementation ================= ; Adopted Get Parameter function -> now it gets full installer.exe path ; input - nothing, output -> full path at the top of the stack Function GetInstallerExeName Push $R0 Push $R1 Push $R2 StrCpy $R0 $CMDLINE 1 StrCpy $R1 '"' StrCpy $R2 1 StrCmp $R0 '"' loop StrCpy $R1 ' ' ; we're scanning for a space instead of a quote loop: StrCpy $R0 $CMDLINE 1 $R2 StrCmp $R0 $R1 loop2 StrCmp $R0 "" loop2 IntOp $R2 $R2 + 1 Goto loop loop2: ; Ok, have we found last exename character or string end? StrCmp $R0 "" "" +2 IntOp $R2 $R2 - 1 ; last exename char StrCmp $R1 ' ' +3 ; was first character the '"', or something other? StrCpy $R1 1 ; it was quote Goto +2 StrCpy $R1 0 IntOp $R2 $R2 - $R1 StrCpy $R0 $CMDLINE $R2 $R1 SearchPath $R0 $R0 ; expand file name to full path Pop $R2 Pop $R1 Exch $R0 FunctionEnd ; ================= systemGetFileSysTime implementation ================= !macro smGetFileSysTime FILENAME Push ${FILENAME} Call systemGetFileSysTime Pop $R0 !macroend ; ----------------------------------------------------------------- ; systemGetFileSysTime (params on stack): ; FILENAME - name of file to get file time ; returns to stack (SYSTEMTIME struct addr) ; ----------------------------------------------------------------- ; uses original method from NSIS Function systemGetFileSysTime System::Store "s r1" StrCpy $R0 0 ; create WIN32_FIND_DATA struct System::Call '*${stWIN32_FIND_DATA} .r2' ; Find file info System::Call '${sysFindFirstFile}(r1, r2) .r3' ; ok? IntCmp $3 ${INVALID_HANDLE_VALUE} sgfst_exit ; close file search System::Call '${sysFindClose}(r3)' ; Create systemtime struct for local time System::Call '*${stSYSTEMTIME} .R0' ; Get File time System::Call '*$2${stWIN32_FIND_DATA} (,,, .r3)' ; Convert file time (UTC) to local file time System::Call '${sysFileTimeToLocalFileTime}(r3, .r1)' ; Convert file time to system time System::Call '${sysFileTimeToSystemTime}(r1, R0)' sgfst_exit: ; free used memory for WIN32_FIND_DATA struct System::Free $2 System::Store "P0 l" FunctionEnd ; ================= systemMessageBox implementation ================= ; return to $R0 !macro smMessageBox MODULE MSG CAPTION STYLE ICON Push "${ICON}" Push "${STYLE}" Push "${CAPTION}" Push "${MSG}" Push "${MODULE}" Call systemMessageBox Pop $R0 !macroend ; ----------------------------------------------------------------- ; systemMessageBox (params on stack): ; Module: either handle ("i HANDLE", HANDLE could be 0) or "modulename" ; Msg: text of message ; Caption: caption of message box window ; Style: style, buttons etc ; Icon: either icon handle ("i HANDLE") or resource name ; returns to stack ; ----------------------------------------------------------------- Function systemMessageBox System::Store "s r2r3r4r5r6" ; may be Module is module handle? StrCpy $1 $2 IntCmp $1 0 0 smbnext smbnext ; Get module handle System::Call '${sysGetModuleHandle}($2) .r1' IntCmp $1 0 loadlib libnotloaded libnotloaded loadlib: ; Load module and get handle System::Call '${sysLoadLibrary}($2) .r1' IntCmp $1 0 0 smbnext smbnext libnotloaded: ; Indicate that LoadLibrary wasn't used StrCpy $2 1 smbnext: ; Create MSGBOXPARAMS structure System::Call '*${stMSGBOXPARAMS}(, $HWNDPARENT, r1, r3, r4, "$5|${MB_USERICON}", $6, _) .r0' ; call MessageBoxIndirect System::Call '${sysMessageBoxIndirect}(r0) .R0' ; free MSGBOXPARAMS structure System::Free $0 ; have we used load library at start? IntCmp $2 0 0 smbskipfree smbskipfree ; No, then free the module System::Call '${sysFreeLibrary}(r1)' smbskipfree: System::Store "P0 l" FunctionEnd ; ================= systemSplash implementation ================= ; returns to $R0 !macro smSystemSplash DELAY FILE Push ${FILE} Push ${DELAY} call systemSplash Pop $R0 !macroend ; ----------------------------------------------------------------- ; systemSplash (params on stack): ; Delay - time in ms to show the splash ; File - bitmap (& audio) file name (without extension) ; returns to stack ; ----------------------------------------------------------------- Function _systemSplashWndCB ; Callback receives 4 values System::Store "s r2r5r7r9" ; Message branching IntCmp $5 ${WM_CLOSE} m_Close IntCmp $5 ${WM_TIMER} m_Timer IntCmp $5 ${WM_LBUTTONDOWN} m_Lbtn IntCmp $5 ${WM_CREATE} m_Create IntCmp $5 ${WM_PAINT} m_Paint goto default m_Create: ; Create structures System::Call "*${stRECT} (_) .R8" System::Call "*${stBITMAP} (_, &l0 .R7) .R9" ; Get bitmap info System::Call "${sysGetObject} (r6, R7, R9)" ; Get desktop info System::Call "${sysSystemParametersInfo} (${SPI_GETWORKAREA}, 0, R8, 0)" ; Style (callbacked) System::Call "${sysSetWindowLong} (r2, ${GWL_STYLE}, 0) .s" !insertmacro SINGLE_CALLBACK 5 $R7 1 _systemSplashWndCB ; Calculate and set window pos ; Get bmWidth(R2) and bmHeight(R3) System::Call "*$R9${stBITMAP} (,.R2,.R3)" ; Get left(R4), top(R5), right(R6), bottom(R7) System::Call "*$R8${stRECT} (.R4,.R5,.R6,.R7)" ; Left pos IntOp $R0 $R6 - $R4 IntOp $R0 $R0 - $R2 IntOp $R0 $R0 / 2 IntOp $R0 $R0 + $R4 ; Top pos IntOp $R1 $R7 - $R5 IntOp $R1 $R1 - $R3 IntOp $R1 $R1 / 2 IntOp $R1 $R1 + $R5 System::Call "${sysSetWindowPos} (r2, 0, R0, R1, R2, R3, ${SWP_NOZORDER}) .s" !insertmacro SINGLE_CALLBACK 6 $R7 1 _systemSplashWndCB ; Show window System::Call "${sysShowWindow} (r2, ${SW_SHOW}) .s" !insertmacro SINGLE_CALLBACK 7 $R7 1 _systemSplashWndCB ; Set Timer System::Call "${sysSetTimer} (r2, 1, r8,)" ; Free used memory System::Free $R8 System::Free $R9 StrCpy $R0 0 goto exit m_Paint: ; Create structures System::Call "*${stRECT} (_) .R8" System::Call "*${stPAINTSTRUCT} (_) .R9" ; Begin Paint System::Call "${sysBeginPaint} (r2, R9) .R7" ; CreateCompatibleDC System::Call "${sysCreateCompatibleDC} (R7) .R6" ; GetClientRect System::Call "${sysGetClientRect} (r2, R8)" ; Select new bitmap System::Call "${sysSelectObject} (R6, r6) .R5" ; Get left(R0), top(R1), right(R2), bottom(R3) System::Call "*$R8${stRECT} (.R0,.R1,.R2,.R3)" ; width=right-left IntOp $R2 $R2 - $R0 ; height=bottom-top IntOp $R3 $R3 - $R1 System::Call "${sysBitBlt} (R7, R0, R1, R2, R3, R6, 0, 0, ${SRCCOPY})" ; Select old bitmap System::Call "${sysSelectObject} (R6, R5)" ; Delete compatible DC System::Call "${sysDeleteDC} (R6)" ; End Paint System::Call "${sysEndPaint} (r2, R9)" ; Free used memory System::Free $R8 System::Free $R9 StrCpy $R0 0 goto exit m_Timer: m_Lbtn: StrCpy $4 0 IntCmp $5 ${WM_TIMER} destroy StrCpy $4 1 destroy: System::Call "${sysDestroyWindow} (r2) .s" !insertmacro SINGLE_CALLBACK 12 $R4 1 _systemSplashWndCB default: ; Default System::Call "${sysDefWindowProc} (r2, r5, r7, r9) .s" !insertmacro SINGLE_CALLBACK 14 $R0 1 _systemSplashWndCB goto exit m_Close: StrCpy $R0 0 goto exit exit: ; Restore System::Store "p4P0 l R0r4" ; Return from callback System::Call "$3" $R0 FunctionEnd Function systemSplash ; Save registers and get input System::Store "s r8r9" ; Get module instance System::Call "${sysGetModuleHandle} (p) .r7" ; Get arrow cursor System::Call "${sysLoadCursor} (0, p ${IDC_ARROW}) .R9" ; Get callback System::Get "${sysWNDPROC}" Pop $3 ; Create window class System::Call "*${stWNDCLASS} (0,r3,0,0,r7,0,R9,0,p 0,'_sp') .R9" ; Register window class System::Call "${sysRegisterClass} (R9) .R9" IntCmp $R9 0 errorexit ; Class registered ok? ; Load Image (LR_CREATEDIBSECTION|LR_LOADFROMFILE = 0x2010) System::Call '${sysLoadImage} (, s, ${IMAGE_BITMAP}, 0, 0, ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) .r6' "$9.bmp" IntCmp $6 0 errorexit ; Image loaded ok? ; Start the sound (SND_ASYNC|SND_FILENAME|SND_NODEFAULT = 0x20003) System::Call "${sysPlaySound} (s,,${SND_ASYNC}|${SND_FILENAME}|${SND_NODEFAULT})" "$9.wav" ; Create window System::Call "${sysCreateWindowEx} (${WS_EX_TOOLWINDOW}, s, s,,,,,, $HWNDPARENT,,r7,) .s" "_sp" "_sp" !insertmacro SINGLE_CALLBACK 1 $5 1 _systemSplashWndCB ; Create MSG struct System::Call "*${stMSG} (_) p.R9" ; ------------------------- repeat: ; Check for window System::Call "${sysIsWindow} (r5) .s" !insertmacro SINGLE_CALLBACK 2 $R8 1 _systemSplashWndCB IntCmp $R8 0 finish ; Get message System::Call "${sysGetMessage} (R9, r5,_) .s" !insertmacro SINGLE_CALLBACK 3 $R8 1 _systemSplashWndCB IntCmp $R8 0 finish ; Dispatch message System::Call "${sysDispatchMessage} (R9) .s" !insertmacro SINGLE_CALLBACK 4 $R8 1 _systemSplashWndCB ; Repeat dispatch cycle goto repeat ; ------------------------- finish: ; Stop the sound System::Call "${sysPlaySound} (p 0, p 0, i 0)" ; Delete bitmap object System::Call "${sysDeleteObject} (r6)" ; Delete the callback queue System::Free $3 ; Dialog return StrCpy $R0 $4 goto exit ; Exit in case of error errorexit: StrCpy $R0 -1 goto exit exit: ; Restore register and put output System::Store "P0 l" FunctionEnd !endif !verbose popnsis-3.11/Contrib/System/System.html000077500000000000000000000746331477201124000174660ustar00rootroot00000000000000 System Plug-in (NSIS)

NSIS System Plug-in

Copyright © 2002 brainsucker (Nik Medved)
Copyright © 2002-2025 NSIS Contributors

Table of Contents

Introduction

The System plug-in gives developers the ability to call any exported function from any DLL. For example, you can use it to call GetLogicalDriveStrings to get a list of available drives on the user's computer.

The System plug-in also allows the developer to allocate, free and copy memory; interact with COM objects and perform mathematical operations on 64-bit integers.

Programming knowledge is highly recommended for good understanding of the System plug-in.

Usage Examples From The Wiki

Available Functions

Memory Related Functions

  • Alloc SIZE

    Allocates SIZE bytes and returns a memory address on the stack.

    Usage Example

    System::Alloc 64
    Pop $0
    DetailPrint "64 bytes allocated at $0"
    System::Free $0
    
  • StrAlloc SIZE

    Allocates a string buffer for SIZE TCHARs and returns a memory address on the stack. This is extremely useful if you want to write an NSI script that will work for both ANSI and Unicode NSIS.

    Usage Example

    System::StrAlloc 64 ; String buffer for 63 characters and \0 termination.
    Pop $0
    DetailPrint "A string buffer for 64 characters allocated at $0"
    System::Free $0
    
  • Copy [/SIZE] DESTINATION SOURCE

    Copies SIZE bytes from SOURCE to DESTINATION. If SIZE is not specified, SOURCE's size will queried using GlobalSize. This means that if you don't allocate SOURCE using System::Alloc, System::Call or GlobalAlloc, you must specify SIZE. If DESTINATION is zero it will be allocated and its address will be pushed on the stack.

    Usage example

    # allocate a buffer and put 'test string' and an int in it
    System::Call "*(&t1024 'test string', i 5) p .s"
    Pop $0
    # copy to an automatically created buffer
    System::Copy 0 $0
    Pop $1
    # get string and int in $1 buffer
    System::Call "*$1(&t1024 .r2, i .r3)"
    # free buffer
    System::Free $1
    # print result
    DetailPrint $2
    DetailPrint $3
    # copy to our own buffer
    System::Alloc 1028
    Pop $1
    System::Copy $1 $0
    # get string and int in $1 buffer
    System::Call "*$1(&t1024 .r2, i .r3)"
    # free
    System::Free $0
    System::Free $1
    # print result
    DetailPrint $2
    DetailPrint $3
    
  • Free ADDRESS

    Frees ADDRESS.

    Usage Example

    System::Alloc 64
    Pop $0
    DetailPrint "64 bytes allocated at $0"
    System::Free $0
    
  • Store "OPERATION [OPERATION [OPERATION ...]]"

    Performs stack operations. An operation can be pushing or popping a single register from the NSIS stack or pushing or popping all of the registers ($0-$9 and $R0-$R9) from System's private stack. Operations can be separated by any character.

    Available Operations

    • To push $#, use p#, where # is a digit from 0 to 9.
    • To pop $#, use r#, where # is a digit from 0 to 9.
    • To push $R#, use P#, where # is a digit from 0 to 9.
    • To pop $R#, use R#, where # is a digit from 0 to 9.
    • To push $0-$9 and $R0-$R9 to System's private stack, use s or S.
    • To pop $0-$9 and $R0-$R9 from System's private stack, use l or L.
    • To push the internal NSIS flags state (exec_flags_t in api.h) to the stack, use F.
    • To pop the internal NSIS flags state (exec_flags_t in api.h) from the stack, use f.

    Usage Examples

    StrCpy $0 "test"
    System::Store "p0"
    Pop $1
    DetailPrint "$0 = $1"
    
    StrCpy $2 "test"
    System::Store "p2 R2"
    DetailPrint "$2 = $R2"
    
    StrCpy $3 "test"
    System::Store "s"
    StrCpy $3 "another test"
    System::Store "l"
    DetailPrint $3
    
    System::Store "r4" "test"
    DetailPrint $4
    

Calling Functions

  • Call PROC [( PARAMS ) [RETURN [? OPTIONS]]]
  • Get PROC [( PARAMS ) [RETURN [? OPTIONS]]]

    Call and get both share a common syntax. As the names suggest, Call calls and Get gets. What does it call or get? It depends on PROC's value.

    PARAMS is a list of parameters and what do to with them. You can pass data in the parameters and you can also get data from them. The parameters list is separated by commas. Each parameter is combined of three values: type, source and destination. Type can be an integer, a string, etc. Source, which is the source of the parameter value, can be a NSIS register ($0, $1, $INSTDIR), the NSIS stack, a concrete value (5, "test", etc.) or nothing (null). Destination, which is the destination of the parameter value after the call returns, can be a NSIS register, the NSIS stack or nothing which means no output is required. Either one of source or destination can also be a dot (`.') if it is not needed.

    RETURN is like a single parameter definition, but source is only used when creating callback functions. Normally source is a dot.

    OPTIONS is a list of options which control the way System plug-in behaves. Each option can be turned off by prefixing with an exclamation mark. For example: ?!e.

    PARAMS, RETURN and OPTIONS can be repeated many times in one Get/Call line. When repeating, a lot can be omitted, and only what you wish to change can be used. Type, source and/or destination can be omitted for each parameter, even the return value. Options can be added or removed. This allows you to define function prototypes and save on some typing. The last two examples show this.

    PROC can also be repeated but it must be prefixed with a hash sign (`#') except if the hash sign is preceded by a double colon (shell32::#18) in which case it is interpreted as a function ordinal.

    Possible PROC Values and Meanings

    Value Meaning Example
    DLL::FUNC FUNC exported from DLL user32::MessageBox
    ::ADDR Function located at ADDR see below
    *ADDR Structure located at ADDR see below
    * New structure see below
    IPTR->IDX Member indexed IDX from
    interface pointed by IPTR
    see below
    <nothing> New callback function see below
    PROC PROC returned by Get see below

    Available Parameter Types

    Type Meaning
    v void (generally for return)
    p pointer (and other pointer sized types like handles and HWNDs)
    b int8, byte
    h int16, short
    i int32 (includes char, byte, short and so on when used as a pointer)
    l int64, large integer
    m ANSI text, string. (FYI: 'm' for multibyte string or 'w' flipped over.)
    t text, string (pointer to first character). Like TCHAR*, it is a Unicode string in Unicode NSIS.
    w WCHAR text, Unicode string
    g GUID
    k callback
    @ Direct register memory access (Buffer is limited to (NSIS_MAX_STRLEN - 24) * NSIS_CHAR_SIZE bytes)
    &vN N bytes padding (structures only)
    &iN integer of N bytes (structures only)
    &l structure size (structures only)
    &tN array of N TCHAR text characters (structures only)
    &mN array of N CHAR ANSI characters (structures only)
    &wN array of N WCHAR Unicode characters (structures only)
    &g16 16 bytes of GUID (structures only)

    Additionally, each type (except b, h, k and @) can be prefixed with an asterisk to denote a pointer. When using an asterisk, the System plug-in still expects the value of the parameter, rather than the pointer's address. To pass a direct address, use `p' with no asterisk. A usage example is available. Alloc returns addresses and its return value should therefore be used with `p', without an asterisk.

    Available Sources and Destinations

    Type Meaning
    . ignored
    number concrete hex, decimal or octal integer value. several integers can be or'ed using the pipe symbol (`|')
    'string'
    "string"
    `string`
    concrete string value
    r0 through r9 $0 through $9 respectively
    r10 through r19
    R0 through R9
    $R0 through $R9 respectively
    c $CMDLINE
    d $INSTDIR
    o $OUTDIR
    e $EXEDIR
    a $LANGUAGE
    s NSIS stack
    n null for source, no output required for destination

    Source is required when using the @ type and must be a register. When the call returns the source register already contains the memory address in string form so using destination is usually not necessary.

    Callbacks

    Callback functions are simply functions which are passed to a function and called back by it. They are frequently used to pass a possibly large set of data item by item. For example, EnumChildWindows uses a callback function. As NSIS functions are not quite regular functions, the System plug-in provides its own mechanism to support callback functions. It allows you to create callback functions and notifies you each time a callback function was called.

    Creation of callback functions is done using Get and the callback creation syntax. As you will not call the callbacks yourself, the source of the parameters should be omitted using a dot. When the callback is called, the destination of the parameters will be filled with the values passed on to the callback. The value the callback will return is set by the source of the return "parameter". The destination of the return "parameter" should always be set as that's where System will notify you the callback was called.

    System::Get "(i .r0, i .r1) iss"

    To pass a callback to a function, use the k type.

    System::Get "(i .r0, i .r1) isR0"
    Pop $0
    System::Call "dll::UseCallback(k r0)"

    Each time the callback is called, the string callback#, where # is the number of the callback, will be placed in the destination of the return "parameter". The number of the first callback created is 1, the second's is 2, the third's is 3 and so on. As System is single threaded, a callback can only be called while calling another function. For example, EnumChildWindows's callback can only be called when EnumChildWindows is being called. You should therefore check for callback# after each function call that might call your callback.

    System::Get "(i .r0, i .r1) isR0"
    Pop $0
    System::Call "dll::UseCallback(k r0)"
    StrCmp $R0 "callback1" 0 +2
    DetailPrint "UseCallback passed ($0, $1) to the callback"
    

    After you've processed the callback call, you should use Call, passing it the value returned by Get - the callback. This tells System to return from the callback. Destination of the return "parameter" must be cleared prior to calling a function, to avoid false detection of a callback call. If you've specified a source for the return "parameter" when the callback was created, you should fill that source with the appropriate return value. Callbacks are not automatically freed, don't forget to free it after you've finished using it.

    System::Get "(i .r0, i .r1) isR0"
    Pop $0
    System::Call "dll::UseCallback(k r0)"
    loop:
    	StrCmp $R0 "callback1" 0 done
    	DetailPrint "UseCallback passed ($0, $1) to the callback"
    	Push 1 # return value of the callback
    	StrCpy $R0 "" # clear $R0 in case there are no more callback calls
    	System::Call $0 # tell system to return from the callback
    	Goto loop
    done:
    System::Free $0
    

    A complete working example is available in the usage examples section.

    Notes

    • To find out the index of a member in a COM interface, you need to search for the definition of this COM interface in the header files that come with Visual C/C++ or the Platform SDK. The index is zero based.
    • If a function can't be found or the t parameter type was used, an `A' or `W' will be appended to its name and it will be looked up again. This is done because a lot of Windows API functions have two versions, one for ANSI strings and one for Unicode strings. The ANSI version of the function is marked with `A' and the Unicode version is marked with `W'. For example: lstrcpyA and lstrcpyW.
    • Libraries in the system32 directory can be loaded without a path. All other libraries should be loaded with a quoted full path.

    Available Options

    Option Meaning
    c cdecl calling convention (the stack restored by caller). By default stdcall calling convention is used on x86 (the stack restored by callee).
    r Always return (for GET means you should pop result and proc, for CALL means you should pop result (at least)). By default result is returned for errors only (for GET you will pop either error result or right proc, and for CALL you will get either your return or result at defined return place).
    n No redefine. Whenever this proc will be used it will never be redefined either by GET or CALL. This options is never inherited to children.
    s Use general Stack. Whenever the first callback defined the system starts using the temporary stacks for function calls.
    e Call GetLastError() after procedure end and push result on stack.
    u Unload DLL after call (using FreeLibrary, so you'll be able to delete it for example).
    2 Experimental v2 syntax

    Experimental v2 syntax

    Usage Examples

    System::Call 'user32::MessageBox(p $HWNDPARENT, t "NSIS System Plug-in", t "Test", i 0)'
    System::Call '"$SysDir\MyLibrary.dll"::MyFunction(i 42)'
    
    System::Call "kernel32::GetModuleHandle(t 'user32.dll') p .s"
    System::Call "kernel32::GetProcAddress(p s, m 'MessageBoxA') p .r0"
    System::Call "::$0(p $HWNDPARENT, m 'GetProcAddress test', m 'NSIS System Plug-in', i 0)"
    
    System::Get "user32::MessageBox(p $HWNDPARENT, t 'This is a default text', t 'Default', i 0)"
    Pop $0
    System::Call "$0"
    
    System::Get "user32::MessageBox(p $HWNDPARENT, t 'This is a default text', \
    	t 'Default', i 0x1|0x10)"
    Pop $0
    System::Call "$0(, 'This is a System::Get test', 'NSIS System Plug-in',)"
    
    System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
    DetailPrint "User name - $0"
    DetailPrint "String length - $1"
    DetailPrint "Return value - $2"
    
    System::Alloc 4
    Pop $0
    System::Call "*$0(i 5)" ; Write
    System::Call "*$0(i .r1)" ; Read
    System::Free $0
    DetailPrint $1
    
    System::Call "*(i 5) p .r0"
    System::Call "*$0(i .r1)"
    System::Free $0
    DetailPrint $1
    
    System::Call '*0(p, &l.r2, &t2)' ; &l. is not part of the struct
    DetailPrint "Struct size=$2" 
    
    System::Call '*(&l4,i,i,i,i,&t128)p.r1' ; Fills dwOSVersionInfoSize with the struct size as a int32
    ${If} $1 Z<> 0
    	System::Call 'kernel32::GetVersionEx(pr1)i.r0'
    	System::Call '*$1(i,i.R1,i.R2,i.R3)'
    	System::Free $1
    	${IfThen} $0 <> 0 ${|} DetailPrint "v$R1.$R2.$R3" ${|}
    ${EndIf}
    
    System::Call "user32::GetClientRect(p $hwndparent, @ r0)"
    System::Call "*$0(i,i,i.r1,i.r2)"
    DetailPrint ClientRect=$1x$2
    
    # defines
    !define CLSCTX_INPROC_SERVER 1
    !define CLSID_ActiveDesktop {75048700-EF1F-11D0-9888-006097DEACF9}
    !define IID_IActiveDesktop {F490EB00-1240-11D1-9888-006097DEACF9}
    # create IActiveDesktop interface
    System::Call "ole32::CoCreateInstance( \
    	g '${CLSID_ActiveDesktop}', p 0, \
    	i ${CLSCTX_INPROC_SERVER}, \
    	g '${IID_IActiveDesktop}', *p .r0) i.r1"
    StrCmp $1 0 0 end
    # call IActiveDesktop->GetWallpaper
    System::Call "$0->4(w .r2, i ${NSIS_MAX_STRLEN}, i 0)"
    # call IActiveDesktop->Release
    System::Call "$0->2()"
    # print result
    DetailPrint $2
    end:
    
    InitPluginsDir
    File "/oname=$PLUGINSDIR\MyDLL.dll" MyDLL.dll
    System::Call 'KERNEL32::AddDllDirectory(w "$PLUGINSDIR")'
    System::Call 'KERNEL32::LoadLibrary(t "$PLUGINSDIR\MyDLL.dll")p.r1'
    System::Call 'MyDLL::MyFunc(i 5) ? u'
    System::Call 'KERNEL32::FreeLibrary(pr1)'
    Delete $PLUGINSDIR\MyDLL.dll
    
    System::Get "(p.r1, p) iss"
    Pop $R0
    System::Call "user32::EnumChildWindows(p $HWNDPARENT, k R0, p) i.s"
    loop:
    	Pop $0
    	StrCmp $0 "callback1" 0 done
    	System::Call "user32::GetWindowText(pr1,t.r2,i${NSIS_MAX_STRLEN})"
    	System::Call "user32::GetClassName(pr1,t.r3,i${NSIS_MAX_STRLEN})"
    	IntFmt $1 "0x%X" $1
    	DetailPrint "$1 - [$3] $2"
    	Push 1 # callback's return value
    	System::Call "$R0"
    	Goto loop
    done:
    System::Free $R0
    DetailPrint "EnumChildWindows returned $0"
    
    System::Get '(m.r1)ir2r0 ?2' ; v2 syntax
    Pop $9
    System::Call 'kernel32::EnumSystemLocalesA(k r9, i 0)'
    loop:
    	StrCmp $0 "callback$9" 0 done
    	DetailPrint "Locale: $1"
    	StrCpy $2 1 ; EnumLocalesProc return value
    	System::Call $9 ; return from EnumLocalesProc
    	Goto loop
    done:
    System::Free $9
    
    System::Call '*(&t50 "!")p.r2' ; DecimalSep
    System::Call '*(&t50 "`")p.r3' ; ThousandSep
    System::Call '*(i 2, i 0, i 3, P r2, P r3, i 1)p.r1 ?2'
    System::Call 'kernel32::GetNumberFormat(i 0, i 0, t "1337.666" r4, p r1, t.r5, i ${NSIS_MAX_STRLEN})'
    DetailPrint "Custom formatted $4: $5"
    System::Free $3
    System::Free $2
    System::Free $1
    
    !define MB "user32::MessageBox(p$HWNDPARENT,t,t'NSIS System Plug-in',i0)"
    System::Call "${MB}(,'my message',,)"
    System::Call "${MB}(,'another message',,) i.r0"
    MessageBox MB_OK "last call returned $0"
    
    System::Call "user32::SendMessage(p $HWNDPARENT, t 'test', t 'test', p 0) p.s ? \
    	e (,t'test replacement',,) i.r0 ? !e #user32::MessageBox"
    DetailPrint $0
    ClearErrors
    Pop $0
    IfErrors good
    MessageBox MB_OK "this message box will never be reached"
    good:
    

64-bit Functions

  • Int64Op ARG1 OP [ARG2]

    Performs OP on ARG1 and optionally ARG2 and returns the result on the stack. Both ARG1 and ARG2 are 64-bit integers. This means they can range between -2^63 and 2^63 - 1.

    Available Operations

    • Addition -- +
    • Subtraction -- -
    • Multiplication -- *
    • Division -- /
    • Modulo -- %
    • Shift left -- <<
    • Arithmetic shift right -- >>
    • Logical shift right -- >>>
    • Bitwise or -- |
    • Bitwise and -- &
    • Bitwise xor -- ^
    • Bitwise not (one argument) -- ~
    • Logical not (one argument) -- !
    • Logical or -- ||
    • Logical and -- &&
    • Less than -- <
    • Equals -- =
    • Greater than -- >

    Usage Examples

    System::Int64Op 5 + 5
    Pop $0
    DetailPrint "5 + 5 = $0" # 10
    
    System::Int64Op 526355 * 1565487
    Pop $0
    DetailPrint "526355 * 1565487 = $0" # 824001909885
    
    System::Int64Op 5498449498849818 / 3
    Pop $0
    DetailPrint "5498449498849818 / 3 = $0" # 1832816499616606
    
    System::Int64Op 0x89498A198E4566C % 157
    Pop $0
    DetailPrint "0x89498A198E4566C % 157 = $0" # 118
    
    System::Int64Op 1 << 62
    Pop $0
    DetailPrint "1 << 62 = $0" # 4611686018427387904
    
    System::Int64Op 0x4000000000000000 >> 62
    Pop $0
    DetailPrint "0x4000000000000000 >> 62 = $0" # 1
    
    System::Int64Op 0x8000000000000000 >> 1
    Pop $0
    DetailPrint "0x8000000000000000 >> 1 = $0" # -4611686018427387904 (0xC000000000000000)
    
    System::Int64Op 0x8000000000000000 >>> 1
    Pop $0
    DetailPrint "0x8000000000000000 >>> 1 = $0" # 4611686018427387904 (0x4000000000000000)
    
    System::Int64Op 0x12345678 & 0xF0F0F0F0
    Pop $0
    # IntFmt is 32-bit, this is just for the example
    IntFmt $0 "0x%X" $0
    DetailPrint "0x12345678 & 0xF0F0F0F0 = $0" # 0x10305070
    
    System::Int64Op 1 ^ 0
    Pop $0
    DetailPrint "1 ^ 0 = $0" # 1
    
    System::Int64Op 1 || 0
    Pop $0
    DetailPrint "1 || 0 = $0" # 1
    
    System::Int64Op 1 && 0
    Pop $0
    DetailPrint "1 && 0 = $0" # 0
    
    System::Int64Op 9302157012375 < 570197509190760
    Pop $0
    DetailPrint "9302157012375 < 570197509190760 = $0" # 1
    
    System::Int64Op 5168 > 89873
    Pop $0
    DetailPrint "5168 > 89873 = $0" # 0
    
    System::Int64Op 189189 = 189189
    Pop $0
    DetailPrint "189189 = 189189 = $0" # 1
    
    System::Int64Op 156545668489 ~
    Pop $0
    DetailPrint "156545668489 ~ = $0" # -156545668490
    
    System::Int64Op 1 !
    Pop $0
    DetailPrint "1 ! = $0" # 0
    

FAQ

  • Q: How can I pass structs to functions?

    A: First of all, you must allocate the struct. This can be done in two ways. You can either use Alloc or Call with the special struct allocation syntax. Next, if you need to pass data in the struct, you must fill it with data. Then you call the function with a pointer to the struct. Finally, if you want to read data from the struct which might have been written by the called function, you must use Call with the struct handling syntax. After all is done, it's important to remember to free the struct.

    Allocation

    To allocate the struct using Alloc, you must know the size of the struct in bytes. Therefore, it would normally be easier to use Call. In this case it's easy to see the required size is 16 bytes, but other cases might not be that trivial. In both cases, the struct address will be located on the top of the stack and should be retrieved using Pop.

    System::Alloc 16
    
    System::Call "*(i, i, i, t)p.s"
    

    Setting Data

    Setting data can be done using Call. It can be done in the allocation stage, or in another stage using the struct handling syntax.

    System::Call "*(i 5, i 2, i 513, t 'test')p.s"
    
    # assuming the struct's memory address is kept in $0
    System::Call "*$0(i 5, i 2, i 513, t 'test')"
    

    Passing to the Function

    As all allocation methods return an address, the type of the passed data should be an integer, an address in memory.

    # assuming the struct's memory address is kept in $0
    System::Call "dll::func(p r0)"
    

    Reading Data

    Reading data from the struct can be done using the same syntax as setting it. The only difference is that the destination part of the parameter will be set and the source part will be omitted using a dot.

    # assuming the struct's memory address is kept in $0
    System::Call "*$0(i .r0, i .r1, i .r2, t .r3)"
    DetailPrint "first int = $0"
    DetailPrint "second int = $1"
    DetailPrint "third int = $2"
    DetailPrint "string = $3"
    

    Freeing Memory

    Memory is freed using Free.

    # assuming the struct's memory address is kept in $0
    System::Free $0
    

    A Complete Example

    # allocate
    System::Call "*(i,i,p,p,p,p,p,p)p.r1"
    # call
    System::Call "Kernel32::GlobalMemoryStatus(p r1)"
    # get
    System::Call "*$1(i.r2, i.r3, p.r4, p.r5, p.r6, p.r7, p.r8, p.r9)"
    # free
    System::Free $1
    # print
    DetailPrint "Structure size: $2 bytes"
    DetailPrint "Memory load: $3%"
    DetailPrint "Total physical memory: $4 bytes"
    DetailPrint "Free physical memory: $5 bytes"
    DetailPrint "Total page file: $6 bytes"
    DetailPrint "Free page file: $7 bytes"
    DetailPrint "Total virtual: $8 bytes"
    DetailPrint "Free virtual: $9 bytes"
    
nsis-3.11/Contrib/System/System.nsh000077500000000000000000000343571477201124000173110ustar00rootroot00000000000000; Some useful functions, structures, constants ; ; (c) brainsucker, 2002 ; (r) BSForce !verbose push 3 !ifndef System.NSH.Included !define System.NSH.Included !include WinCore.nsh ; ------------- Functions -------------- ; LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); !define sysWNDPROC "(p.s, i.s, p.s, p.s) pss" ; LRESULT DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); !define sysDefWindowProc "user32::DefWindowProc(p, i, p, p) p" !define sysMessageBox "user32::MessageBox(p, t, t, i) i" !define sysMessageBeep "user32::MessageBeep(i) i" !define sysMessageBoxIndirect 'user32::MessageBoxIndirect(p) i' ; HMODULE GetModuleHandle(LPCTSTR lpModuleName); !define sysGetModuleHandle "kernel32::GetModuleHandle(t) i" ; HMODULE LoadLibrary(LPCTSTR lpFileName); !define sysLoadLibrary "kernel32::LoadLibrary(t) p" ; BOOL FreeLibrary(HMODULE hModule); !define sysFreeLibrary "kernel32::FreeLibrary(p) i" ; HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName); !define sysLoadCursor "user32::LoadCursor(p, t) p" ; ATOM RegisterClass(CONST WNDCLASS *lpWndClass); !define sysRegisterClass "user32::RegisterClass(p) i" ; HANDLE LoadImage(HINSTANCE hinst, LPCTSTR lpszName, UINT uType, ; int cxDesired, int cyDesired, UINT fuLoad); !define sysLoadImage "user32::LoadImage(p, t, i, i, i, i) p" ; BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound); !define sysPlaySound "winmm.dll::PlaySound(t, p, i) i" ; HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, ; DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, ; HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); !define sysCreateWindowEx "user32::CreateWindowEx(i, t, t, i, i, i, i, i, p, p, p, p) p" ; BOOL IsWindow(HWND hWnd); !define sysIsWindow "user32::IsWindow(p) i" ; LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong); !define sysSetWindowLong "user32::SetWindowLong(p, i, p) p" ; BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags); !define sysSetWindowPos "user32::SetWindowPos(p, p, i, i, i, i, i) i" ; BOOL ShowWindow(HWND hWnd, int nCmdShow); !define sysShowWindow "user32::ShowWindow(p, i) i" ; BOOL DestroyWindow(HWND hWnd); !define sysDestroyWindow "user32::DestroyWindow(p) i" ; BOOL GetClientRect(HWND hWnd, LPRECT lpRect); !define sysGetClientRect "user32::GetClientRect(p, p) i" ; BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); !define sysGetMessage "user32::GetMessage(p, p, i, i) i" ; LRESULT DispatchMessage(CONST MSG *lpmsg); !define sysDispatchMessage "user32::DispatchMessage(p) p" ; BOOL DeleteObject(HGDIOBJ hObject); !define sysDeleteObject "gdi32::DeleteObject(p) i" ; int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject); !define sysGetObject "gdi32::GetObject(p, i, p) i" ; HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); !define sysSelectObject "gdi32::SelectObject(p, p) p" ; HDC CreateCompatibleDC(HDC hdc); !define sysCreateCompatibleDC "gdi32::CreateCompatibleDC(p) p" ; BOOL DeleteDC(HDC hdc); !define sysDeleteDC "gdi32::DeleteDC(p) i" ; BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, ; HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop); !define sysBitBlt "gdi32::BitBlt(p, i, i, i, i, p, i, i, i) i" ; proposed by abgandar ; int AddFontResource(LPCTSTR lpszFilename); !define sysAddFontResource "gdi32::AddFontResource(t) i" ; HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint); !define sysBeginPaint "user32::BeginPaint(p, p) p" ; BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint); !define sysEndPaint "user32::EndPaint(p, p) i" ; BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni); !define sysSystemParametersInfo "user32::SystemParametersInfo(i, i, p, i) i" ; UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); !define sysSetTimer "user32::SetTimer(p, p, i, k) i" ; DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR LpBuffer); !define sysGetLogicalDriveStrings 'kernel32::GetLogicalDriveStrings(i, p) i' !define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l) i' ; UINT GetDriveType(LPCTSTR lpRootPathName); !define sysGetDriveType 'kernel32::GetDriveType(t) i' ; HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); !define sysFindFirstFile 'kernel32::FindFirstFile(t, p) p' ; BOOL FindClose(HANDLE hFindFile); !define sysFindClose 'kernel32::FindClose(p) i' ; BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, ; LPSYSTEMTIME lpSystemTime); !define sysFileTimeToSystemTime 'kernel32::FileTimeToSystemTime(*l, p) i' ; BOOL FileTimeToLocalFileTime( ; CONST FILETIME *lpFileTime, ; LPFILETIME lpLocalFileTime); !define sysFileTimeToLocalFileTime 'kernel32::FileTimeToLocalFileTime(*l, *l) i' ; BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone, ; LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime); !define sysSystemTimeToTzSpecificLocalTime 'kernel32::SystemTimeToTzSpecificLocalTime(p, p, p) i' !define syslstrlen 'kernel32::lstrlen(t) i' ; int wsprintf(LPTSTR lpOut, LPCTSTR lpFmt, ...); !define syswsprintf "user32::wsprintf(t, t) i ? c" ; ------------- Structures -------------- ; typedef struct _WNDCLASS { ; UINT style; ; WNDPROC lpfnWndProc; ; int cbClsExtra; ; int cbWndExtra; ; HINSTANCE hInstance; ; HICON hIcon; ; HCURSOR hCursor; ; HBRUSH hbrBackground; ; LPCTSTR lpszMenuName; ; LPCTSTR lpszClassName; ; } WNDCLASS, *PWNDCLASS; !define stWNDCLASS "(i, k, i, i, p, p, p, p, t, t) p" ; typedef struct tagMSG { ; HWND hwnd; ; UINT message; ; WPARAM wParam; ; LPARAM lParam; ; DWORD time; ; POINT pt; -> will be presented as two separate px and py ; } MSG, *PMSG; !define stMSG "(p, i, p, p, i, i, i) p" ; typedef struct tagBITMAP { ; LONG bmType; ; LONG bmWidth; ; LONG bmHeight; ; LONG bmWidthBytes; ; WORD bmPlanes; ; WORD bmBitsPixel; ; LPVOID bmBits; ; } BITMAP, *PBITMAP; !define stBITMAP "(i, i, i, i, i, i, p) p" ; typedef struct _RECT { ; LONG left; ; LONG top; ; LONG right; ; LONG bottom; ; } RECT, *PRECT; !define stRECT "(i, i, i, i) p" ; typedef struct tagPAINTSTRUCT { ; HDC hdc; ; BOOL fErase; ; RECT rcPaint; (rcl, rct, rcr, rcb) ; BOOL fRestore; ; BOOL fIncUpdate; ; BYTE rgbReserved[32]; ; } PAINTSTRUCT, *PPAINTSTRUCT; !define stPAINTSTRUCT "(p, i, i, i, i, i, i, i, &v32) p" ; typedef struct { ; UINT cbSize; ; HWND hwndOwner; ; HINSTANCE hInstance; ; LPCTSTR lpszText; ; LPCTSTR lpszCaption; ; DWORD dwStyle; ; LPCTSTR lpszIcon; ; DWORD_PTR dwContextHelpId; ; MSGBOXCALLBACK lpfnMsgBoxCallback; ; DWORD dwLanguageId; ; } MSGBOXPARAMS, *PMSGBOXPARAMS; !define stMSGBOXPARAMS '(&l4, p, p, t, t, i, t, p, k, i) p' ; typedef struct _SYSTEMTIME { ; WORD wYear; ; WORD wMonth; ; WORD wDayOfWeek; ; WORD wDay; ; WORD wHour; ; WORD wMinute; ; WORD wSecond; ; WORD wMilliseconds; ; } SYSTEMTIME, *PSYSTEMTIME; !define stSYSTEMTIME '(&i2, &i2, &i2, &i2, &i2, &i2, &i2, &i2) p' ; Maximal windows path !define /ifndef MAX_PATH 260 ; typedef struct _WIN32_FIND_DATA { ; DWORD dwFileAttributes; ; FILETIME ftCreationTime; ; FILETIME ftLastAccessTime; ; FILETIME ftLastWriteTime; ; DWORD nFileSizeHigh; ; DWORD nFileSizeLow; ; DWORD dwReserved0; ; DWORD dwReserved1; ; TCHAR cFileName[ MAX_PATH ]; ; TCHAR cAlternateFileName[ 14 ]; ; } WIN32_FIND_DATA, *PWIN32_FIND_DATA; !define stWIN32_FIND_DATA '(i, l, l, l, i, i, i, i, &t${MAX_PATH}, &t14) p' ; ------------- Constants -------------- ; == Other == !define /ifndef INVALID_HANDLE_VALUE -1 ; == Sounds == !define SND_SYNC 0x0000 !define SND_ASYNC 0x0001 !define SND_NODEFAULT 0x0002 !define SND_MEMORY 0x0004 !define SND_LOOP 0x0008 !define SND_NOSTOP 0x0010 !define SND_NOWAIT 0x00002000 !define SND_ALIAS 0x00010000 !define SND_ALIAS_ID 0x00110000 !define SND_FILENAME 0x00020000 !define SND_RESOURCE 0x00040004 !define SND_PURGE 0x0040 !define SND_APPLICATION 0x0080 ; == Windows == !define /ifndef WS_OVERLAPPED 0x00000000 !define /ifndef WS_POPUP 0x80000000 !define /ifndef WS_CHILD 0x40000000 !define /ifndef WS_MINIMIZE 0x20000000 !define /ifndef WS_VISIBLE 0x10000000 !define /ifndef WS_DISABLED 0x08000000 !define /ifndef WS_CLIPSIBLINGS 0x04000000 !define /ifndef WS_CLIPCHILDREN 0x02000000 !define /ifndef WS_MAXIMIZE 0x01000000 !define /ifndef WS_CAPTION 0x00C00000 !define /ifndef WS_BORDER 0x00800000 !define /ifndef WS_DLGFRAME 0x00400000 !define /ifndef WS_VSCROLL 0x00200000 !define /ifndef WS_HSCROLL 0x00100000 !define /ifndef WS_SYSMENU 0x00080000 !define /ifndef WS_THICKFRAME 0x00040000 !define /ifndef WS_GROUP 0x00020000 !define /ifndef WS_TABSTOP 0x00010000 !define /ifndef WS_MINIMIZEBOX 0x00020000 !define /ifndef WS_MAXIMIZEBOX 0x00010000 !define /ifndef WS_TILED ${WS_OVERLAPPED} !define /ifndef WS_ICONIC ${WS_MINIMIZE} !define /ifndef WS_SIZEBOX ${WS_THICKFRAME} !define /ifndef WS_OVERLAPPEDWINDOW 0x00CF0000 !define /ifndef WS_TILEDWINDOW ${WS_OVERLAPPEDWINDOW} !define /ifndef WS_POPUPWINDOW 0x80880000 !define /ifndef WS_CHILDWINDOW ${WS_CHILD} !define /ifndef WS_EX_DLGMODALFRAME 0x00000001 !define /ifndef WS_EX_NOPARENTNOTIFY 0x00000004 !define /ifndef WS_EX_TOPMOST 0x00000008 !define /ifndef WS_EX_ACCEPTFILES 0x00000010 !define /ifndef WS_EX_TRANSPARENT 0x00000020 !define /ifndef WS_EX_MDICHILD 0x00000040 !define /ifndef WS_EX_TOOLWINDOW 0x00000080 !define /ifndef WS_EX_WINDOWEDGE 0x00000100 !define /ifndef WS_EX_CLIENTEDGE 0x00000200 !define /ifndef WS_EX_CONTEXTHELP 0x00000400 !define /ifndef WS_EX_RIGHT 0x00001000 !define /ifndef WS_EX_LEFT 0x00000000 !define /ifndef WS_EX_RTLREADING 0x00002000 !define /ifndef WS_EX_LTRREADING 0x00000000 !define /ifndef WS_EX_LEFTSCROLLBAR 0x00004000 !define /ifndef WS_EX_RIGHTSCROLLBAR 0x00000000 !define /ifndef WS_EX_CONTROLPARENT 0x00010000 !define /ifndef WS_EX_STATICEDGE 0x00020000 !define /ifndef WS_EX_APPWINDOW 0x00040000 !define /ifndef WS_EX_OVERLAPPEDWINDOW 0x00000300 !define /ifndef WS_EX_PALETTEWINDOW 0x00000188 !define /ifndef WS_EX_LAYERED 0x00080000 !define /ifndef WS_EX_NOINHERITLAYOUT 0x00100000 !define /ifndef WS_EX_LAYOUTRTL 0x00400000 !define /ifndef WS_EX_COMPOSITED 0x02000000 !define /ifndef WS_EX_NOACTIVATE 0x08000000 ; == System Parameters Info == !define SPI_GETWORKAREA 0x0030 ; == Window swap == !define SWP_NOSIZE 0x0001 !define SWP_NOMOVE 0x0002 !define SWP_NOZORDER 0x0004 !define SWP_NOREDRAW 0x0008 !define SWP_NOACTIVATE 0x0010 !define SWP_FRAMECHANGED 0x0020 !define SWP_SHOWWINDOW 0x0040 !define SWP_HIDEWINDOW 0x0080 !define SWP_NOCOPYBITS 0x0100 !define SWP_NOOWNERZORDER 0x0200 !define SWP_NOSENDCHANGING 0x0400 !define SWP_DRAWFRAME ${SWP_FRAMECHANGED} !define SWP_NOREPOSITION ${SWP_NOOWNERZORDER} !define SWP_DEFERERASE 0x2000 !define SWP_ASYNCWINDOWPOS 0x4000 ; == Bit Copy == !define SRCCOPY 0x00CC0020 !define SRCPAINT 0x00EE0086 !define SRCAND 0x008800C6 !define SRCINVERT 0x00660046 !define SRCERASE 0x00440328 !define NOTSRCCOPY 0x00330008 !define NOTSRCERASE 0x001100A6 !define MERGECOPY 0x00C000CA !define MERGEPAINT 0x00BB0226 !define PATCOPY 0x00F00021 !define PATPAINT 0x00FB0A09 !define PATINVERT 0x005A0049 !define DSTINVERT 0x00550009 !define BLACKNESS 0x00000042 !define WHITENESS 0x00FF0062 ; == Message Box == !define MB_OK 0x00000000 !define MB_OKCANCEL 0x00000001 !define MB_ABORTRETRYIGNORE 0x00000002 !define MB_YESNOCANCEL 0x00000003 !define MB_YESNO 0x00000004 !define MB_RETRYCANCEL 0x00000005 !define MB_CANCELTRYCONTINUE 0x00000006 !define MB_ICONHAND 0x00000010 !define MB_ICONQUESTION 0x00000020 !define MB_ICONEXCLAMATION 0x00000030 !define MB_ICONASTERISK 0x00000040 !define MB_USERICON 0x00000080 !define MB_ICONWARNING ${MB_ICONEXCLAMATION} !define MB_ICONERROR ${MB_ICONHAND} !define MB_ICONINFORMATION ${MB_ICONASTERISK} !define MB_ICONSTOP ${MB_ICONHAND} !define MB_DEFBUTTON1 0x00000000 !define MB_DEFBUTTON2 0x00000100 !define MB_DEFBUTTON3 0x00000200 !define MB_DEFBUTTON4 0x00000300 !define MB_APPLMODAL 0x00000000 !define MB_SYSTEMMODAL 0x00001000 !define MB_TASKMODAL 0x00002000 !define MB_HELP 0x00004000 !define MB_NOFOCUS 0x00008000 !define MB_SETFOREGROUND 0x00010000 !define MB_DEFAULT_DESKTOP_ONLY 0x00020000 !define MB_TOPMOST 0x00040000 !define MB_RIGHT 0x00080000 !define MB_RTLREADING 0x00100000 ; == Callbacks == !macro SINGLE_CALLBACK CHKN RES INDEX FUNC CheckCB_${CHKN}: Pop ${RES} StrCmp ${RES} "callback${INDEX}" 0 ExitCB_${CHKN} Call ${FUNC} Goto CheckCB_${CHKN} ExitCB_${CHKN}: !macroend !endif !verbose popnsis-3.11/Contrib/System/System.nsi000077500000000000000000000124701477201124000173020ustar00rootroot00000000000000; This is just an example of System Plugin ; ; (c) brainsucker, 2002 ; (r) BSForce Name "System Plugin Example" OutFile "System.exe" RequestExecutionLevel User Unicode True !include "SysFunc.nsh" Section "ThisNameIsIgnoredSoWhyBother?" SetOutPath $TEMP ; ----- Sample 1 ----- Message box with custom icon ----- ; there are no default beeps for custom message boxes, use sysMessageBeep ; in case you need it (see next message box example) !insertmacro smMessageBox "i 0" "Message box with custom icon!" "System Example 1a" ${MB_OK} "i 103" ; i 0 - installer exe as module ; i 103 - icon ID ; The same example but using icon from resource.dll. ; You could use this dll for storing your resources, just replace FAR icon ; with something you really need. File "Resource.dll" System::Call '${sysMessageBeep} (${MB_ICONHAND})' ; custom beep !insertmacro smMessageBox "`$TEMP\resource.dll`" "Message box with custom icon from resource.dll!" "System Example 1b" ${MB_OKCANCEL} "i 103" Delete $TEMP\resource.dll ; ----- Sample 2 ----- Fixed disks size/space ----- StrCpy $7 ' Disk, Size, Free, Free for user:$\n$\n' ; Memory for paths System::StrAlloc 1024 Pop $1 ; Get drives System::Call '${sysGetLogicalDriveStrings}(1024, r1)' enumok: ; One more drive? System::Call '${syslstrlen}(i r1) .r2' IntCmp $2 0 enumex ; Is it DRIVE_FIXED? System::Call '${sysGetDriveType} (i r1) .r3' StrCmp $3 ${DRIVE_FIXED} 0 enumnext ; Drive space System::Call '${sysGetDiskFreeSpaceEx}(i r1, .r3, .r4, .r5)' ; Pretty KBs will be saved on stack System::Int64Op $3 / 1048576 System::Int64Op $5 / 1048576 System::Int64Op $4 / 1048576 ; Get pretty drive path string System::Call '*$1(&t1024 .r6)' System::Call '${syswsprintf} (.r7, "%s%20s %20s mb %20s mb %20s mb$\n", tr7, tr6, ts, ts, ts)' enumnext: ; Next drive path IntOp $2 $2 * ${NSIS_CHAR_SIZE} IntOp $1 $1 + $2 IntOp $1 $1 + ${NSIS_CHAR_SIZE} goto enumok enumex: ; End of drives or user cancel ; Free memory for paths System::Free $1 ; Message box System::Call '${sysMessageBox}($HWNDPARENT, s, "System Example 2", ${MB_OKCANCEL})' "$7" ; ----- Sample 3 ----- Direct proc definition ----- ; Direct specification demo System::Call 'user32::MessageBox(p $HWNDPARENT, t "Just direct MessageBox specification demo ;)", t "System Example 3", i ${MB_OK}) i.s' Pop $0 ; ----- Sample 4 ----- Int64, mixed definition demo ----- ; Long int demo StrCpy $2 "12312312" StrCpy $3 "12345678903" System::Int64Op $2 "*" $3 Pop $4 ; Cdecl demo (uses 3 definitions (simple example)) System::Call "${syswsprintf}(.R1, s,,, t, ir0) .R0 (,,tr2,tr3,$4_)" "Int64 ops and strange definition demo, %s x %s == %s, and previous msgbox result = %d" MessageBox MB_OKCANCEL "Cool: '$R1'" ; ----- Sample 5 ----- Small structure example ----- ; Create & Fill structure System::Call "*(i 123123123, &t10 'Hello', &i1 0x123dd, &i2 0xffeeddccaa) i.s" Pop $1 ; Read data from structure System::Call "*$1(i .r2, &t10 .r3, &i1 .r4, &i2 .r5, &l0 .r6)" ; Show data and delete structure MessageBox MB_OK "Structure example: $\nint == $2 $\nstring == $3 $\nbyte == $4 $\nshort == $5 $\nsize == $6" System::Free $1 ; ----- Sample 6 ----- systemGetFileSysTime demo ----- Call GetInstallerExeName pop $0 !insertmacro smGetFileSysTime $0 System::Call '*$R0${stSYSTEMTIME}(.r1, .r2, .r3, .r4, .r5, .r6, .r7, .r8)' MessageBox MB_OK "GetFileSysTime example: file '$0', year $1, month $2, dow $3, day $4, hour $5, min $6, sec $7, ms $8" ; free memory from SYSTEMTIME System::Free $R0 ; ----- Sample 7 ----- systemSplash -> Callbacks demonstration ----- ; Logo File /oname=spltmp.bmp "${NSISDIR}\Contrib\Graphics\Header\orange-nsis.bmp" ; File /oname=spltmp.wav "d:\Windows\Media\tada.wav" ; I. systemSplash variant !insertmacro smSystemSplash 2000 "$TEMP\spltmp" ; II. Splash Plugin variant ; splash::show 2000 $TEMP\spltmp ; Pop $R0 ; $R0 has '1' if the user closed the splash screen early, ; remove logo Delete $TEMP\spltmp.bmp ; Delete $TEMP\spltmp.wav ; Display splash result pop $0 MessageBox MB_OK "Splash (callbacks) demo result $R0" SectionEnd Section "Quoted path" !define /IfNDef CSIDL_FONTS 0x14 StrCpy $9 "$PluginsDir\N(S # I)S" ; Directory with '(', ' ', '#' or ')' needs to be quoted CreateDirectory "$9" CopyFiles /Silent /FilesOnly "$sysdir\shfolder.dll" "$9\" ; This could fail on 95 & NT4? System::Call '"$9\shfolder.dll"::SHGetFolderPathA(p $hWndParent, i ${CSIDL_FONTS}, p 0, i 0, m "?" r1) ?u' DetailPrint Fonts=$1 SectionEnd Section "Ordinal" System::Call 'OLEAUT32::#2(w "OLE string")p.r0' ; SysAllocString System::Call 'USER32::MessageBoxW(p $hWndParent, p r0, w "OLE:", i 0)' System::Call 'OLEAUT32::#6(p r0)' SectionEnd ; eof nsis-3.11/Contrib/System/WhatsNew.txt000077500000000000000000000042351477201124000176040ustar00rootroot00000000000000release 2. 1. Syntax, with inline input 2. Int64 full support (conversion/operations/comparison) 3. Structures support 4. Callbacks support, including multilevel callbacks 5. Some useful routines (Alloc, Free, Copy) 6. CDecl and StdCall calling conventions release 3, 22 march 2003. 1. Custom Message Boxes (with icons etc) -> bug in case of GetModuleHandle and call to FreeLibrary (sysfunc.nsh) 2. GetFileSysTime -> No SystemTimeToTzSpecificLocalTime at win9x bug, changed to use FileTimeToLocalFileTime (sysfunc.nsh) 3. Incorrect automatic structure size (&l) bug, value actually never filled into the structure (strange -> winxp takes no care of the structure size members, such as cbSize, and win98 does...) (system.c) 4. Changed Secondary Stack Allocation behavior - now we just leave 65kb of the stack NSIS give to us to the NSIS itself, and use the other part as the stack for our calls. (system.c) 5. Secondary Stack Optimization - in case of no more pending callback procs - "free" the secondary stack pointer. (system.c) 6. PlaySound("", 0, 0) plays the default windows sound at win9x, so changed to PlaySound(NULL, 0, 0) for effective sound stopping after splash (sysfunc.nsh). release 4, 3 september 2003. 1. Division by zero fatal error at Int64Op killed. 2. bool type removed (use int instead). 3. GUID (g) and LPWSTR (w) types added. 4. Memory cleanup after using t (string), g (guid) and w (unicode string) added. 5. Automatic A-letter at proc name discovery. 6. COM optimized: new proc specification "x->y", where x is interface ptr, and y is vtable member index. For such procs Interface pointer passed as first arg automatically. release 5, 11 september 2003. 1. u flag - unload dll after procedure call. 2. some changes to asm to turn on Whole Program Optimization. 3. Dll shrunk by 1 kb. bug-fix-release, 4.06.2004 1. System::Copy /SIZE fixed (Kichik). 2. System::Copy with destination auto-allocation now pushes destination address on stack. 3. Callbacks fixed (Kichik's kick is awesome). 4. Bug with proc call parts redefinition, # for example (pointed by Kichik). 5. Bug with memory protection during callback processing (Kichik).nsis-3.11/Contrib/UIs/000077500000000000000000000000001477201124000145105ustar00rootroot00000000000000nsis-3.11/Contrib/UIs/SConscript000077500000000000000000000005561477201124000165330ustar00rootroot00000000000000code = 'ui.c' uis = Split(""" default modern modern_headerbmp modern_headerbmpr modern_nodesc modern_smalldesc sdbarker_tiny """) libs = Split(""" kernel32 comctl32 user32 gdi32 """) Import('BuildUtil env') code = env.Object(code) for ui in uis: ui = BuildUtil(ui, [code], libs, res = ui + '.rc', contrib = True, path = 'UIs') env.Alias('UIs', ui) nsis-3.11/Contrib/UIs/default.rc000077500000000000000000000110631477201124000164660ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_LICENSE DIALOGEX 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDI_ICON2,IDC_ULICON,0,0,22,20 LTEXT "",IDC_INTROTEXT,25,0,241,23 CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,105 END IDD_LICENSE_FSRB DIALOG DISCARDABLE 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON2,IDC_ULICON,0,0,22,20 LTEXT "",IDC_INTROTEXT,25,0,241,23 CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,85 CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,110,266,9 CONTROL "",IDC_LICENSEDISAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,120,266,9 END IDD_LICENSE_FSCB DIALOG DISCARDABLE 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON2,IDC_ULICON,0,0,22,20 LTEXT "",IDC_INTROTEXT,25,0,241,23 CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,95 CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,120,266,9 END IDD_DIR DIALOGEX 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN EDITTEXT IDC_DIR,8,49,187,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BROWSE,202,48,55,14 ICON IDI_ICON2,IDC_ULICON,0,0,22,20 CONTROL "",IDC_SPACEAVAILABLE,"Static",SS_LEFTNOWORDWRAP,0,122, 265,8 CONTROL "",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,8,71,118,10 CONTROL "",IDC_SPACEREQUIRED,"Static",SS_LEFTNOWORDWRAP,0,111, 265,8 LTEXT "",IDC_INTROTEXT,25,0,241,34 GROUPBOX "",IDC_SELDIRTEXT,1,38,264,30 END IDD_SELCOM DIALOGEX 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN COMBOBOX IDC_COMBO1,114,25,152,102,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP ICON IDI_ICON2,IDC_ULICON,0,0,22,20 LTEXT "",IDC_TEXT2,0,40,108,65 CONTROL "",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP,0,27,108,8 LTEXT "",IDC_SPACEREQUIRED,0,111,111,18,NOT WS_GROUP LTEXT "",IDC_INTROTEXT,25,0,241,25 CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | WS_BORDER | WS_TABSTOP,114,39,151,90 END IDD_INST DIALOGEX 0, 0, 280, 162 STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",IDC_BACK,171,142,50,14,NOT WS_VISIBLE | WS_GROUP PUSHBUTTON "",IDOK,223,142,50,14 PUSHBUTTON "",IDCANCEL,7,142,50,14 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ | WS_GROUP,7,138, 267,1 CONTROL "",IDC_CHILDRECT,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,7,6,266,130 CTEXT "",IDC_VERSTR,59,145,108,8,WS_DISABLED END IDD_INSTFILES DIALOGEX 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,24,10,241, 11 CONTROL "",IDC_INTROTEXT,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX, 24,0,241,8 CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | NOT WS_VISIBLE | WS_BORDER | WS_TABSTOP,0,25,265,104 ICON IDI_ICON2,IDC_ULICON,0,0,22,20 PUSHBUTTON "",IDC_SHOWDETAILS,0,28,60,14,NOT WS_TABSTOP END IDD_UNINST DIALOGEX 0, 0, 266, 130 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDI_ICON2,IDC_ULICON,0,1,22,20 LTEXT "",IDC_UNINSTFROM,0,45,55,8 EDITTEXT IDC_EDIT1,56,43,209,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "",IDC_INTROTEXT,25,0,241,34 END IDD_VERIFY DIALOGEX 0, 0, 162, 22 STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CTEXT "",IDC_STR,7,7,148,8 END nsis-3.11/Contrib/UIs/modern.rc000077500000000000000000000123531477201124000163310ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_LICENSE DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",1040,0,0,300,15,NOT WS_GROUP CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,15,300,93 LTEXT "",IDC_INTROTEXT,0,113,300,26,NOT WS_GROUP END IDD_DIR DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN EDITTEXT IDC_DIR,10,85,210,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BROWSE,228,83,60,15 CONTROL "",IDC_SPACEAVAILABLE,"Static",SS_LEFTNOWORDWRAP,0,125, 150,8 CONTROL "",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,180,110,118,10 CONTROL "",IDC_SPACEREQUIRED,"Static",SS_LEFTNOWORDWRAP,0,115, 150,8 LTEXT "",IDC_INTROTEXT,0,0,300,60,NOT WS_GROUP GROUPBOX "",IDC_SELDIRTEXT,0,70,300,35 END IDD_SELCOM DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",IDC_INTROTEXT,0,0,300,25,NOT WS_GROUP CONTROL "",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP,0,27,95,8 COMBOBOX IDC_COMBO1,102,25,98,107,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "",IDC_TEXT2,0,40,95,65,NOT WS_GROUP LTEXT "",IDC_SPACEREQUIRED,0,115,100,18,NOT WS_GROUP CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | WS_BORDER | WS_TABSTOP,102,40,98,95 GROUPBOX "",1042,210,36,89,99 LTEXT "",1043,215,46,78,84,NOT WS_GROUP END IDD_INST DIALOGEX 0, 0, 331, 222 STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",3,166,201,50,14,WS_GROUP PUSHBUTTON "",1,216,201,50,14 PUSHBUTTON "",2,273,201,50,14 CONTROL "",IDC_CHILDRECT,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,15,45,300,140 CONTROL "",1044,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,0,0,331,193 CONTROL "",IDC_LICENSEDISAGREE,"Static",SS_ETCHEDHORZ | WS_GROUP, 5,193,321,1 CONTROL "",1036,"Static",SS_ETCHEDHORZ | WS_GROUP,0,35,340,1 CONTROL "",1045,"Static",SS_ETCHEDHORZ | NOT WS_VISIBLE | WS_GROUP,0,193,340,1 LTEXT "",1256,5,188,322,8 LTEXT "",IDC_VERSTR,5,188,322,8,WS_DISABLED LTEXT "",IDC_LICENSEAGREE,0,0,332,35 LTEXT "",1037,10,5,280,10 LTEXT "",1038,15,16,275,16 ICON 103,1039,300,8,21,20,WS_GROUP END IDD_INSTFILES DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",IDC_SHOWDETAILS,1,26,60,14,NOT WS_TABSTOP CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,0,10,300, 11 CONTROL "",IDC_INTROTEXT,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX,0,0,300,10 CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | NOT WS_VISIBLE | WS_BORDER | WS_TABSTOP,0,25,300,110 END IDD_UNINST DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",IDC_UNINSTFROM,0,42,60,8,NOT WS_GROUP EDITTEXT IDC_EDIT1,65,40,234,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "",IDC_INTROTEXT,0,0,300,30,NOT WS_GROUP END IDD_LICENSE_FSRB DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",1040,0,0,300,15,NOT WS_GROUP CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,15,300,73 LTEXT "",IDC_INTROTEXT,0,93,300,26,NOT WS_GROUP CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,120,300,9 CONTROL "",IDC_LICENSEDISAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,130,300,9 END IDD_LICENSE_FSCB DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",1040,0,0,300,15,NOT WS_GROUP CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,15,300,83 LTEXT "",IDC_INTROTEXT,0,103,300,26,NOT WS_GROUP CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,130,300,9 END IDD_VERIFY DIALOGEX 0, 0, 167, 43 STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CTEXT "",IDC_STR,40,26,120,10,NOT WS_GROUP ICON 103,-1,10,11,21,20 CTEXT "Please wait while Setup is loading...",76,40,10,120,16, NOT WS_GROUP END nsis-3.11/Contrib/UIs/modern_headerbmp.rc000077500000000000000000000022301477201124000203310ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_INST DIALOGEX 0, 0, 331, 222 STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",3,166,201,50,14,WS_GROUP PUSHBUTTON "",1,216,201,50,14 PUSHBUTTON "",2,273,201,50,14 CONTROL "",IDC_CHILDRECT,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,15,45,300,140 CONTROL "",1044,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,0,0,331,193 CONTROL "",IDC_LICENSEDISAGREE,"Static",SS_ETCHEDHORZ | WS_GROUP, 5,193,321,1 CONTROL "",1036,"Static",SS_ETCHEDHORZ | WS_GROUP,0,35,340,1 CONTROL "",1045,"Static",SS_ETCHEDHORZ | NOT WS_VISIBLE | WS_GROUP,0,193,340,1 LTEXT "",1256,5,188,322,8 LTEXT "",IDC_VERSTR,5,188,322,8,WS_DISABLED LTEXT "",IDC_LICENSEAGREE,0,0,332,35 LTEXT "",1037,105,5,215,10 LTEXT "",1038,110,16,210,16 CONTROL "",1046,"Static",SS_BITMAP,0,0,100,35 END nsis-3.11/Contrib/UIs/modern_headerbmpr.rc000077500000000000000000000022301477201124000205130ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_INST DIALOGEX 0, 0, 331, 222 STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",3,166,201,50,14,WS_GROUP PUSHBUTTON "",1,216,201,50,14 PUSHBUTTON "",2,273,201,50,14 CONTROL "",IDC_CHILDRECT,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,15,45,300,140 CONTROL "",1044,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,0,0,331,193 CONTROL "",IDC_LICENSEDISAGREE,"Static",SS_ETCHEDHORZ | WS_GROUP, 5,193,321,1 CONTROL "",1036,"Static",SS_ETCHEDHORZ | WS_GROUP,0,35,340,1 CONTROL "",1045,"Static",SS_ETCHEDHORZ | NOT WS_VISIBLE | WS_GROUP,0,193,340,1 LTEXT "",1256,5,188,322,8 LTEXT "",IDC_VERSTR,5,188,322,8,WS_DISABLED LTEXT "",IDC_LICENSEAGREE,0,0,332,35 LTEXT "",1037,10,5,215,10 LTEXT "",1038,15,16,210,16 CONTROL "",1046,"Static",SS_BITMAP,231,0,100,35 END nsis-3.11/Contrib/UIs/modern_nodesc.rc000077500000000000000000000014011477201124000176540ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_SELCOM DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",IDC_INTROTEXT,0,0,300,25,NOT WS_GROUP CONTROL "",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP,0,27,95,8 COMBOBOX IDC_COMBO1,102,25,195,104,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "",IDC_TEXT2,0,40,95,65,NOT WS_GROUP LTEXT "",IDC_SPACEREQUIRED,0,115,100,18,NOT WS_GROUP CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | WS_BORDER | WS_TABSTOP,102,40,195,95 END nsis-3.11/Contrib/UIs/modern_smalldesc.rc000077500000000000000000000015431477201124000203570ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_SELCOM DIALOGEX 0, 0, 300, 140 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN LTEXT "",IDC_INTROTEXT,0,0,300,25,NOT WS_GROUP CONTROL "",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP,0,27,95,8 COMBOBOX IDC_COMBO1,102,25,195,74,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "",IDC_TEXT2,0,40,95,65,NOT WS_GROUP LTEXT "",IDC_SPACEREQUIRED,0,115,100,18,NOT WS_GROUP CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | WS_BORDER | WS_TABSTOP,102,40,195,65 GROUPBOX "",1042,102,105,195,35 LTEXT "",1043,108,117,183,18,NOT WS_GROUP END nsis-3.11/Contrib/UIs/resource.h000077500000000000000000000033051477201124000165140ustar00rootroot00000000000000#include #include #ifndef IDC_STATIC #define IDC_STATIC (-1) #endif #ifndef DS_SHELLFONT #define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS) #endif #define IDC_BACK 3 #define IDD_LICENSE 102 #define IDD_LICENSE_FSRB 108 #define IDD_LICENSE_FSCB 109 #define IDI_ICON2 103 #define IDD_DIR 103 #define IDD_SELCOM 104 #define IDD_INST 105 #define IDD_INSTFILES 106 #define IDD_UNINST 107 #define IDD_VERIFY 111 #define IDB_BITMAP1 110 #define IDC_EDIT1 1000 #define IDC_BROWSE 1001 #define IDC_PROGRESS 1004 #define IDC_INTROTEXT 1006 #define IDC_CHECK1 1008 #define IDC_LIST1 1016 #define IDC_COMBO1 1017 #define IDC_CHILDRECT 1018 #define IDC_DIR 1019 #define IDC_SELDIRTEXT 1020 #define IDC_TEXT1 1021 #define IDC_TEXT2 1022 #define IDC_SPACEREQUIRED 1023 #define IDC_SPACEAVAILABLE 1024 #define IDC_SHOWDETAILS 1027 #define IDC_VERSTR 1028 #define IDC_UNINSTFROM 1029 #define IDC_STR 1030 #define IDC_ULICON 1031 #define IDC_TREE1 1032 #define IDC_BRANDIMAGE 1033 #define IDC_LICENSEAGREE 1034 #define IDC_LICENSEDISAGREE 1035 nsis-3.11/Contrib/UIs/sdbarker_tiny.rc000077500000000000000000000111671477201124000177070ustar00rootroot00000000000000#include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_LICENSE DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON 103,IDC_ULICON,0,0,20,20 LTEXT "",IDC_INTROTEXT,25,0,241,23,NOT WS_GROUP CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,47 END IDD_DIR DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN EDITTEXT IDC_DIR,8,35,187,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BROWSE,202,34,55,14 ICON 103,IDC_ULICON,0,0,20,20 CONTROL "",IDC_SELDIRTEXT,"Static",SS_LEFTNOWORDWRAP,0,22,265,8 CONTROL "",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,187,54,78,10 CONTROL "",IDC_SPACEAVAILABLE,"Static",SS_LEFTNOWORDWRAP,1,63, 185,8 CONTROL "",IDC_SPACEREQUIRED,"Static",SS_LEFTNOWORDWRAP,1,54,185, 8 LTEXT "",IDC_INTROTEXT,25,0,241,18,NOT WS_GROUP END IDD_SELCOM DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN COMBOBOX IDC_COMBO1,114,15,152,94,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP ICON 103,IDC_ULICON,0,0,21,20 LTEXT "",IDC_TEXT2,0,33,108,29,NOT WS_GROUP CONTROL "",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP,0,20,108,8 CONTROL "",IDC_SPACEREQUIRED,"Static",SS_LEFTNOWORDWRAP,0,60,111, 8 LTEXT "",IDC_INTROTEXT,25,0,241,15,NOT WS_GROUP CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | WS_BORDER | WS_TABSTOP,114,28,151,42 END IDD_INST DIALOGEX 0, 0, 280, 105 STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",3,171,84,50,14,NOT WS_VISIBLE | WS_GROUP PUSHBUTTON "",1,223,84,50,14 PUSHBUTTON "",2,7,84,50,14 CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_GROUP,7,79,265,1 CONTROL "",IDC_CHILDRECT,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,7,6,266,70 CTEXT "",IDC_VERSTR,59,86,108,8,WS_DISABLED END IDD_INSTFILES DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,24,10,241, 11 CONTROL "",IDC_INTROTEXT,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX,24,0,241,8 CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | NOT WS_VISIBLE | WS_BORDER | WS_TABSTOP,0,22,265,48 ICON 103,IDC_ULICON,0,0,20,20 PUSHBUTTON "",IDC_SHOWDETAILS,0,28,60,14,NOT WS_TABSTOP END IDD_UNINST DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON 103,IDC_ULICON,0,1,20,20 LTEXT "",IDC_UNINSTFROM,0,47,55,8,NOT WS_GROUP EDITTEXT IDC_EDIT1,56,45,209,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "",IDC_INTROTEXT,25,0,241,34,NOT WS_GROUP END IDD_LICENSE_FSRB DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON 103,IDC_ULICON,0,0,20,20 LTEXT "",IDC_INTROTEXT,25,0,241,23,NOT WS_GROUP CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,27 CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,50,266,9 CONTROL "",IDC_LICENSEDISAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,60,266,9 END IDD_LICENSE_FSCB DIALOGEX 0, 0, 266, 70 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON 103,IDC_ULICON,0,0,20,20 LTEXT "",IDC_INTROTEXT,25,0,241,23,NOT WS_GROUP CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,37 CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,60,266,9 END IDD_VERIFY DIALOGEX 0, 0, 162, 22 STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CTEXT "",IDC_STR,7,7,148,8,NOT WS_GROUP END nsis-3.11/Contrib/UIs/ui.c000077500000000000000000000047211477201124000153000ustar00rootroot00000000000000// ui.cpp : Defines the entry point for the application. // // Unicode support by Jim Park -- 08/10/2007 #include "../../Source/Platform.h" #include #include #include "resource.h" HINSTANCE g_hInstance; HWND m_curwnd; const TCHAR* windows[] = { MAKEINTRESOURCE(IDD_LICENSE), MAKEINTRESOURCE(IDD_SELCOM), MAKEINTRESOURCE(IDD_DIR), MAKEINTRESOURCE(IDD_INSTFILES), MAKEINTRESOURCE(IDD_UNINST) }; INT_PTR CALLBACK GenericProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { static LOGBRUSH b = {BS_SOLID, RGB(255,0,0), 0}; static HBRUSH red; if (!red) red = CreateBrushIndirect(&b); switch (uMsg) { case WM_CTLCOLORSTATIC: return (INT_PTR)red; } return FALSE; } INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { static int i = -1; switch (uMsg) { case WM_INITDIALOG: SetWindowText(hwndDlg, _T("NSIS User Interface - Testing")); SetWindowText(GetDlgItem(hwndDlg, IDC_VERSTR), _T("NSIS version")); SetWindowText(GetDlgItem(hwndDlg, IDC_BACK), _T("< Back")); SetWindowText(GetDlgItem(hwndDlg, IDOK), _T("Next >")); SetWindowText(GetDlgItem(hwndDlg, IDCANCEL), _T("Cancel")); ShowWindow(GetDlgItem(hwndDlg, IDC_BACK), SW_SHOW); ShowWindow(GetDlgItem(hwndDlg, IDC_CHILDRECT), SW_SHOW); SendMessage(hwndDlg, WM_COMMAND, MAKEWORD(IDOK, 0), 0); ShowWindow(hwndDlg, SW_SHOW); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDC_BACK: i+=(LOWORD(wParam)==IDOK)?1:-1; if (i < 0) { i++; break; } if (i >= (int)sizeof(windows)/sizeof(TCHAR*)) { i--; break; } if (m_curwnd) DestroyWindow(m_curwnd); m_curwnd=CreateDialog(g_hInstance,windows[i],hwndDlg,GenericProc); if (m_curwnd) { RECT r; GetWindowRect(GetDlgItem(hwndDlg,IDC_CHILDRECT),&r); ScreenToClient(hwndDlg,(LPPOINT)&r); SetWindowPos(m_curwnd,0,r.left,r.top,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); ShowWindow(m_curwnd,SW_SHOWNA); } break; default: EndDialog(hwndDlg, 0); PostQuitMessage(0); break; } break; } return FALSE; } NSIS_ENTRYPOINT_SIMPLEGUI int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int ShowCmd) { InitCommonControls(); g_hInstance = hInst; LoadLibrary(_T("RichEd32.dll")); return (int) DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST),0,DialogProc); } nsis-3.11/Contrib/UserInfo/000077500000000000000000000000001477201124000155425ustar00rootroot00000000000000nsis-3.11/Contrib/UserInfo/SConscript000077500000000000000000000003271477201124000175610ustar00rootroot00000000000000target = 'UserInfo' files = Split(""" UserInfo.c """) libs = Split(""" advapi32 user32 kernel32 """) examples = Split(""" UserInfo.nsi """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples) nsis-3.11/Contrib/UserInfo/UserInfo.c000077500000000000000000000134431477201124000174500ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/23/2007 #include #include // nsis plugin #if defined(_MSC_VER) && !defined(GetVersion) #if _MSC_VER >= 1500 FORCEINLINE DWORD NoDepr_GetVersion() { __pragma(warning(push))__pragma(warning(disable:4996)) DWORD r = GetVersion(); __pragma(warning(pop)) return r; } #define GetVersion NoDepr_GetVersion #endif //~ _MSC_VER >= 1500 #endif //~ _MSC_VER typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember); CHECKTOKENMEMBERSHIP _CheckTokenMembership=NULL; #if !defined(_WIN64) || defined(NSIS_FORCERUNTIMELINKING) static FARPROC GetAA32ProcAddress(LPCSTR FuncName) { return GetProcAddress(GetModuleHandleA("ADVAPI32"), FuncName); } #endif #if defined(NSIS_FORCERUNTIMELINKING) //__MINGW64_VERSION_MAJOR+0 >= 1 // OpenThreadToken is exported by kernel32.lib in mingw-w64 breaking < Win7 where it only exists in advapi32. // sourceforge.net/p/mingw-w64/bugs/235/# & 821 with fix adapted from the negrutiu NSIS fork. // We try to work around this by specifying advapi32 before kernel32 in the list of libraries but if that fails, set the preceding define. #define OpenThreadToken DelayedOpenThreadToken static BOOL WINAPI DelayedOpenThreadToken(HANDLE Thread, DWORD Access, BOOL OpenAsSelf, HANDLE*Token) { typedef BOOL (WINAPI*OTT)(HANDLE, DWORD, BOOL, HANDLE*); OTT func = (OTT) GetAA32ProcAddress("OpenThreadToken"); return func(Thread, Access, OpenAsSelf, Token); } #endif void __declspec(dllexport) GetName(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { EXDLL_INIT(); { DWORD dwStringSize = g_stringsize; stack_t *th; if (!g_stacktop) return; th = (stack_t*) GlobalAlloc(GPTR, sizeof(stack_t) + g_stringsize*sizeof(TCHAR)); if (!GetUserName(th->text, &dwStringSize)) // Fails with ERROR_NOT_LOGGED_ON on Win9x if you cancel the logon dialog. { *th->text = _T('\0'); } th->next = *g_stacktop; *g_stacktop = th; } } struct group { DWORD auth_id; TCHAR *name; }; static const struct group groups[] = { {DOMAIN_ALIAS_RID_USERS, _T("User")}, // every user belongs to the users group, hence users come before guests {DOMAIN_ALIAS_RID_GUESTS, _T("Guest")}, {DOMAIN_ALIAS_RID_POWER_USERS, _T("Power")}, {DOMAIN_ALIAS_RID_ADMINS, _T("Admin")} }; TCHAR* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny) { TCHAR *group = NULL; HANDLE hToken = NULL; #ifndef _WIN64 if (GetVersion() & 0x80000000) // Not NT { return _T("Admin"); } #endif // First we must open a handle to the access token for this thread. if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken) || OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { SID_IDENTIFIER_AUTHORITY SystemSidAuthority = {SECURITY_NT_AUTHORITY}; TOKEN_GROUPS *ptg = NULL; BOOL ValidTokenGroups = FALSE; DWORD cbTokenGroups; DWORD i, j; if (CheckTokenForGroupDeny) // GetUserName is in advapi32.dll so we can avoid Load/Freelibrary _CheckTokenMembership= #ifndef _WIN64 (CHECKTOKENMEMBERSHIP) GetAA32ProcAddress("CheckTokenMembership"); #else CheckTokenMembership; #endif // Use "old school" membership check? if (!CheckTokenForGroupDeny || _CheckTokenMembership == NULL) { // We must query the size of the group information associated with // the token. Note that we expect a FALSE result from GetTokenInformation // because we've given it a NULL buffer. On exit cbTokenGroups will tell // the size of the group information. if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &cbTokenGroups) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // Allocate buffer and ask for the group information again. // This may fail if an administrator has added this account // to an additional group between our first call to // GetTokenInformation and this one. if ((ptg = GlobalAlloc(GPTR, cbTokenGroups)) && GetTokenInformation(hToken, TokenGroups, ptg, cbTokenGroups, &cbTokenGroups)) { ValidTokenGroups=TRUE; } } } if (ValidTokenGroups || (CheckTokenForGroupDeny && _CheckTokenMembership)) { PSID psid; for (i = 0; i < sizeof(groups)/sizeof(struct group); i++) { // Create a SID for the local group and then check if it exists in our token if (AllocateAndInitializeSid( &SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, groups[i].auth_id, 0, 0, 0, 0, 0, 0,&psid)) { BOOL IsMember = FALSE; if (CheckTokenForGroupDeny && _CheckTokenMembership) { _CheckTokenMembership(0, psid, &IsMember); } else if (ValidTokenGroups) { for (j = 0; j < ptg->GroupCount; j++) { if (EqualSid(ptg->Groups[j].Sid, psid)) { IsMember = TRUE; } } } if (IsMember) group=groups[i].name; FreeSid(psid); } } } if (ptg) GlobalFree(ptg); CloseHandle(hToken); return group; } return _T(""); } void __declspec(dllexport) GetAccountType(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { EXDLL_INIT(); pushstring(GetAccountTypeHelper(TRUE)); } void __declspec(dllexport) GetOriginalAccountType(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { EXDLL_INIT(); pushstring(GetAccountTypeHelper(FALSE)); } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; } nsis-3.11/Contrib/UserInfo/UserInfo.nsi000077500000000000000000000026111477201124000200120ustar00rootroot00000000000000Name "UserInfo.dll test" OutFile UserInfo.exe RequestExecutionLevel Highest !define REALMSG "$\nOriginal non-restricted account type: $2" Section ClearErrors UserInfo::GetName IfErrors PluginFail Pop $0 StrCmp $0 "" 0 +2 ; GetName can return a empty string on Win9x StrCpy $0 "?" UserInfo::GetAccountType Pop $1 # GetOriginalAccountType will check the tokens of the original user of the # current thread/process. If the user tokens were elevated or limited for # this process, GetOriginalAccountType will return the non-restricted # account type. # On Vista with UAC, for example, this is not the same value when running # with `RequestExecutionLevel user`. GetOriginalAccountType will return # "admin" while GetAccountType will return "user". UserInfo::GetOriginalAccountType Pop $2 StrCmp $1 "Admin" 0 +3 ; Note: Win9x always returns "Admin" MessageBox MB_OK 'User "$0" is in the Administrators group${REALMSG}' Goto done StrCmp $1 "Power" 0 +3 MessageBox MB_OK 'User "$0" is in the Power Users group${REALMSG}' Goto done StrCmp $1 "User" 0 +3 MessageBox MB_OK 'User "$0" is just a regular user${REALMSG}' Goto done StrCmp $1 "Guest" 0 +3 MessageBox MB_OK 'User "$0" is a guest${REALMSG}' Goto done MessageBox MB_OK "Unknown error" Goto done PluginFail: MessageBox MB_OK "Error! Unable to call plug-in!" done: SectionEnd nsis-3.11/Contrib/VPatch/000077500000000000000000000000001477201124000151755ustar00rootroot00000000000000nsis-3.11/Contrib/VPatch/Readme.html000077500000000000000000000333101477201124000172630ustar00rootroot00000000000000 VPatch 3

VPatch 3.1

Introduction

VPatch allows to create a patch file to update previous versions of your software. The GenPat utility generates the patch file. The plug-in can use the patch to update a file. Using a patch, you can reduce the download size of your updates because only the differences between the files are included in the patch file.

How to use

Generate the patch file

Make sure you have the source file (original version) and the target file (version to update to). For example, DATA.DTA (currently on user system) and DATA_20.DTA (version 2.0 of this data file). Now call the command line tool GenPat.exe:

GENPAT oldfile.txt newfile.txt patch.pat

Now, the patch will be generated, this will take some time.

Using the /B=(BlockSize) parameter of the GenPat utility (put it after the filenames), you can use a different block size. A smaller block size may result in a smaller patch, but the generation will take more time (the default blocksize is 64).

If you have trouble using this command-line utility, you can download a GUI (graphical user interface) for VPatch from its own website: http://www.tibed.net/vpatch.

Update the file during installation

Use the VPatch plug-in to update a file using a patch file:

vpatch::vpatchfile "patch.pat" "oldfile.txt" "temporary_newfile.txt"

The result of the patch operating will be added to the stack and can be one of the following texts:

  • OK
  • OK, new version already installed
  • An error occurred while patching
  • Patch data is invalid or corrupt
  • No suitable patches were found

Check example.nsi for an example. You should check whether the stack string starts with "OK" because then the patch has succeeded and you can rename "temporary_newfile.txt" to "oldfile.txt" to replace the original, if you want.

Multiple patches in one file

GenPat appends a patch to the file you specified. If there is already a patch for the same original file, with the same CRC/MD5, in the patch file, the patch will be replaced. For example, if you want to be able to upgrade version 1 and 2 to version 3, you can put a 1 > 3 and 2 > 3 patch in one file.

You can also put patches for different files in one patch file, for example, a patch from file A version 1 to file A version 2 and a patch from file B version 1 to file B version 2. Just call the plug-in multiple times with the same patch file. It will automatically select the right patch (based on the file CRC).

Patch generator (GenPat) exit codes

In version 3 the following exit codes (known as error levels in the DOS period) can be returned by GenPat. GenPat will return an exit code based on success of the patch generation. Here is a list of the possible exit codes:

Exit code Description
0 Success
1 Arguments missing
2 Other error
3 Source file already has a patch in specified patch file (ERROR), use /R switch to override

These exit codes can be useful when you generate patch files through a NSIS script.

Source code

Source code is available in the original package and in the SVN repository of NSIS.

NSIS plug-in (C++)

The source of the NSIS plug-in that applies patches can be found in the Source\Plugin folder.

Patch Generator (C++)

The most interesting part of VPatch, the actual patch generation algorithm, can be found in Source\GenPat\PatchGenerator.cpp. The header of that file contains a brief explanation of the algorithm as well.

User interface (Delphi)

A user interface is included as well, which you will have to build yourself because the GUI executable was too large to include. Besides Borland Delphi 6 or higher (you can use the freely available Personal edition), you will also need to install the VirtualTreeView component by Mike Lischke.

Version history

  • 3.1
    • GenPat now compiles on POSIX platforms (MinGW/GCC), Visual C++ 6 and Borland C++.
    • More test cases to verify functionality of GenPat.
  • 3.0
    • Final: Updates to the GUI, installer
    • RC8: GenPat will now flag replacement of a patch (e.g. the source file has the same contents as a previous patch inside a patch file) as an error. You can specifically allow it using the /R switch. Added license to source files.
    • RC7: Fixed critical bug in GenPat with multiple patches in a single file. Fixed serious bug in stand-alone EXE runtime: process kept on running forever. Included case testing through a Python script to test common usage (and prevent bugs like the one in GenPat in the future).
    • RC6: Upgraded to non-beta compiler. Added /A switch to change block match limit and /O to deactivate the limit. Updated GUI to support the /O switch.
    • RC4a to RC5a: input block size is now checked for power of 2 and fixed if incorrect. When patch file does not yet exist, no longer forgets to create the header. No longer tries to allocate memory when there are no chunks. Fixed memory leaks.
    • Target file date is now preserved inside a patch and restored on the user system.
    • MD5 checksums are now used instead of CRC32 checksums, unless existing patches in a file already are in CRC32 mode.
    • The patch generator, GenPat, has been completely rewritten in C++. It no longer needs to keep the entire files in memory, instead memory usage is a certain percentage of the source file size. The percentage is based on the block size, larger block sizes will reduce memory usage.
    • All runtimes now share a common codebase, perform proper error checking and don't leave behind files if the input file was already up to date.
    • Bug Fix: The patch generator algorithm no longer reduces to a quadratic runtime if there are many blocks with the same content in the files to patch.
    • Bug Fix: The documentation of the command-line utilities was incorrect and no warnings would be given by the runtimes, causing the patch not to work (this does not apply to NSIS patches).
  • 2.1
    • Added argument checking and error handling to GenPat. Now returns exit codes as well to indicate success/failure (and the reason for failure). Only GenPat has changed in this version compared to 2.0 final.
    • Bug Fix: GenPat no longer gives an Access Violation when attempting to patch a file smaller than 64 bytes into a file larger than 64 bytes.
  • 2.0 final
    • Cleaned up source code for the patch generator, which is now included (this code is written in Borland Delphi 6 and compiles with the freely available Personal edition).
  • 2.0 beta 2
    • All new algorithm used in the patch generator: much faster (up to 90%) while using smaller block sizes (higher compression)
    • Created a NSIS 2 plugin
    • Works with small files
    • Replaces existing patch in file if original file CRC is identical

Credits

Written by Koen van de Sande.
C plug-in initially by Edgewize, updated by Koen van de Sande.
New documentation and example by Joost Verburg and Koen van de Sande.

License

Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; 
   you must not claim that you wrote the original software.
   If you use this software in a product, an acknowledgment in the
   product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
   and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
nsis-3.11/Contrib/VPatch/SConscript000077500000000000000000000004751477201124000172200ustar00rootroot00000000000000target = 'VPatch' examples = Split(""" example.nsi newfile.txt oldfile.txt patch.pat """) docs = Split(""" Readme.html """) includes = Split(""" VPatchLib.nsh """) Import('defenv') defenv.DistributeExamples(examples, path=target) defenv.DistributeDocs(docs, path=target) defenv.DistributeInclude(includes) nsis-3.11/Contrib/VPatch/Source/000077500000000000000000000000001477201124000164355ustar00rootroot00000000000000nsis-3.11/Contrib/VPatch/Source/GenPat/000077500000000000000000000000001477201124000176135ustar00rootroot00000000000000nsis-3.11/Contrib/VPatch/Source/GenPat/Checksums.cpp000077500000000000000000000073171477201124000222570ustar00rootroot00000000000000//--------------------------------------------------------------------------- // Checksums.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #include "Checksums.h" /* ------------------------ CRC32 checksum calculation ----------------- */ uint32_t CRCTable[256]; bool bInitCRC = false; void InitCRC() { int i, j; unsigned long c; for (c = i = 0; i < 256; c = ++i) { for (j = 0; j < 8; j++) { if (c & 1) c = (c>>1) ^ 0xEDB88320; else c >>= 1; } CRCTable[i] = c; } bInitCRC = true; } crc32_t streamCRC32(bistream& data) { if(!bInitCRC) InitCRC(); const int CRCBLOCKSIZE = 16384; uint8_t block[CRCBLOCKSIZE]; unsigned int read; uint8_t *p; crc32_t crc = 0xFFFFFFFF; while(data.good()) { data.read(reinterpret_cast(block), CRCBLOCKSIZE); read = (unsigned int) data.gcount(); // The cast is safe because we never read more than CRCBLOCKSIZE for (p = block; p < block + read; p++) crc = CRCTable[(crc & 0xFF) ^ *p] ^ (crc >> 8); } crc = (crc ^ 0xFFFFFFFF); return crc; } /* ------------------------ MD5 checksum calculation ----------------- */ void streamMD5(bistream& data, md5_byte_t digest[16]) { const int MD5BLOCKSIZE = 16384; uint8_t md5block[MD5BLOCKSIZE]; unsigned int read; md5_state_t state; md5_init(&state); while(data.good()) { data.read(reinterpret_cast(md5block), MD5BLOCKSIZE); read = (unsigned int) data.gcount(); // The cast is safe because we never read more than MD5BLOCKSIZE md5_append(&state, md5block, read); } md5_finish(&state, digest); } // Jim Park: string -> tstring. TChecksum::TChecksum(tstring& fileName) : mode(MD5) { bifstream data; data.open(fileName.c_str(), ios::binary | ios::in); data.seekg(0, ios::beg); crc = streamCRC32(data); data.close(); bifstream data2; data2.open(fileName.c_str(), ios::binary | ios::in); data2.seekg(0, ios::beg); streamMD5(data2, digest); data2.close(); } void TChecksum::loadMD5(md5_byte_t newdigest[16]) { mode = MD5; for(int i = 0; i < 16; i++) { digest[i] = newdigest[i]; } } void TChecksum::loadCRC32(crc32_t newcrc) { mode = CRC32; crc = newcrc; } bool TChecksum::operator==(const TChecksum& b) { if(mode != b.mode) throw "Checksums in different mode: MD5/CRC32"; if(mode == MD5) { for(int md5index = 0; md5index < 16; md5index++) { if(digest[md5index] != b.digest[md5index]) break; if(md5index == 15) return true; } return false; } else { return (crc == b.crc); } } nsis-3.11/Contrib/VPatch/Source/GenPat/Checksums.h000077500000000000000000000035351477201124000217220ustar00rootroot00000000000000//--------------------------------------------------------------------------- // Checksums.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #if !defined(Checksums_H) #define Checksums_H #include "md5.h" #include #include "GlobalTypes.h" #include "tchar.h" typedef uint32_t crc32_t; class TChecksum { public: md5_byte_t digest[16]; crc32_t crc; enum { CRC32, MD5 } mode; TChecksum() : mode(MD5) { } TChecksum(tstring& fileName); void loadMD5(md5_byte_t newdigest[16]); void loadCRC32(crc32_t newcrc); bool operator==(const TChecksum& b); }; #endif // Checksums_H nsis-3.11/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp000077500000000000000000000073731477201124000225150ustar00rootroot00000000000000//--------------------------------------------------------------------------- // ChunkedFile.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #include "ChunkedFile.h" #include "tchar.h" using namespace std; ChunkedFile::ChunkedFile(bistream& f, TFileOffset fSize, TFileOffset chunkSize) : chunks(NULL) { chunkCount = fSize / chunkSize; tout << _T("[ChunkedFile] Filesize of ") << static_cast(fSize) << _T(" gives ") << static_cast(chunkCount) << _T(" chunks.\n"); tout << _T("[ChunkedFile] Memory to be used by those chunks: ") << sizeof(FileChunk) * chunkCount << _T(" bytes..."); if(chunkCount == 0) { chunks = NULL; return; } chunks = new FileChunk[chunkCount]; tout << _T(" allocated.\n"); unsigned char* data = new unsigned char[chunkSize]; for(TFileOffset i = 0; i < chunkCount; i++) { f.read(reinterpret_cast(data),chunkSize); chunks[i].offset = i * chunkSize; calculateChecksum(data,chunkSize,chunks[i].checksum); } delete[] data; tout << _T("[ChunkedFile] Sorting chunks... "); std::sort(chunks,chunks + chunkCount); tout << _T("done.\n"); } bool ChunkedFile::search(TChunkChecksum key, TFileOffset* start) { // function: // Searches sortedArray[first]..sortedArray[last] for key. // returns: index of the matching element if it finds key, // otherwise -(index where it could be inserted)-1. // parameters: // sortedArray in array of sorted (ascending) values. // first, last in lower and upper subscript bounds // key in value to search for. // returns: // index of key, or -insertion_position -1 if key is not // in the array. This value can easily be // transformed into the position to insert it. if(chunkCount == 0) return false; int first = 0; int last = chunkCount - 1; while (first <= last) { int mid = (first + last) / 2; // compute mid point. if(key == chunks[mid].checksum) { while(true) { if(mid == 0) break; mid--; if(!(key == chunks[mid].checksum)) { mid++; break; } } *start = mid; return true; // found it. return position } if (key < chunks[mid].checksum) last = mid - 1; // repeat search in bottom half. else first = mid + 1; // repeat search in top half. } return false; // failed to find key } nsis-3.11/Contrib/VPatch/Source/GenPat/ChunkedFile.h000077500000000000000000000054211477201124000221520ustar00rootroot00000000000000//--------------------------------------------------------------------------- // ChunkedFile.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #if !defined(ChunkedFile_H) #define ChunkedFile_H #include "GlobalTypes.h" #include "adler32.h" #include #include // private data type: the data tree information typedef struct TChunkChecksum { Checksum::uLong adler32; CHECKSUM_BLOCK v; } TChunkChecksum; inline bool operator<(const TChunkChecksum& a, const TChunkChecksum& b) { return (a.adler32 < b.adler32) ? true : ( (a.adler32 == b.adler32) ? (a.v < b.v) : false ); } inline bool operator==(const TChunkChecksum& a, const TChunkChecksum& b) { return (a.v == b.v) && (a.adler32 == b.adler32); } typedef struct FileChunk { TFileOffset offset; TChunkChecksum checksum; } FileChunk; inline bool operator<(const FileChunk& a, const FileChunk& b) { return a.checksum < b.checksum; } class ChunkedFile { public: TFileOffset chunkCount; FileChunk* chunks; ChunkedFile(bistream& f, TFileOffset fSize, TFileOffset chunkSize); ~ChunkedFile() { if(chunks != NULL) delete[] chunks; } bool search(TChunkChecksum key, TFileOffset* start); inline void calculateChecksum(unsigned char* data, TFileOffset size, TChunkChecksum& K) { K.v = *reinterpret_cast(data); K.adler32 = Checksum::adler32(1L,data,size); } }; #endif // ChunkedFile_H nsis-3.11/Contrib/VPatch/Source/GenPat/FileFormat1.cpp000077500000000000000000000213701477201124000224360ustar00rootroot00000000000000//--------------------------------------------------------------------------- // FileFormat1.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #include "FileFormat1.h" #include "GlobalTypes.h" #define MAGIC_VPAT 0x54415056 namespace FileFormat1 { void writeByte(bostream& patch, TFileOffset dw) { unsigned char b = dw & 0xFF; patch.write(reinterpret_cast(&b),sizeof(b)); } void writeWord(bostream& patch, TFileOffset dw) { unsigned char b = dw & 0xFF; patch.write(reinterpret_cast(&b),sizeof(b)); b = (dw & 0xFF00) >> 8; patch.write(reinterpret_cast(&b),sizeof(b)); } void writeDword(bostream& patch, TFileOffset dw) { unsigned char b = dw & 0xFF; patch.write(reinterpret_cast(&b),sizeof(b)); b = (dw & 0xFF00) >> 8; patch.write(reinterpret_cast(&b),sizeof(b)); b = (dw & 0xFF0000) >> 16; patch.write(reinterpret_cast(&b),sizeof(b)); b = (dw & 0xFF000000) >> 24; patch.write(reinterpret_cast(&b),sizeof(b)); } void writeMD5(bostream& patch, md5_byte_t digest[16]) { for(int i = 0; i < 16; i++) { writeByte(patch, digest[i]); } } TFileOffset readDword(bistream& patch) { unsigned char b; patch.read(reinterpret_cast(&b),sizeof(b)); TFileOffset dw = b; patch.read(reinterpret_cast(&b),sizeof(b)); dw = dw | (b << 8); patch.read(reinterpret_cast(&b),sizeof(b)); dw = dw | (b << 16); patch.read(reinterpret_cast(&b),sizeof(b)); dw = dw | (b << 24); return dw; } void readMD5(bistream& patch, md5_byte_t digest[16]) { unsigned char b; for(int i = 0; i < 16; i++) { patch.read(reinterpret_cast(&b),sizeof(b)); digest[i] = b; } } void writeFileCount(bostream& f, TFileOffset currentCount) { f.seekp(4,ios::beg); writeDword(f,currentCount); } TFileOffset removeExistingPatch(bistream& in, TFileOffset inSize, bostream& out, TChecksum* removeCRC, bool existenceIsError) { TFileOffset fileCount = 0x80000000; // MD5 mode if(in.bad() || in.eof() || (inSize == 0)) { // empty file/does not yet exist writeDword(out,MAGIC_VPAT); writeDword(out,fileCount); // noFiles return fileCount; } // copy and do stuff if(readDword(in) != MAGIC_VPAT) { writeDword(out,MAGIC_VPAT); writeDword(out,fileCount); // noFiles return fileCount; } fileCount = readDword(in); writeDword(out,MAGIC_VPAT); writeDword(out,fileCount); // noFiles bool MD5Mode = (fileCount & 0x80000000) != 0; if(MD5Mode) removeCRC->mode = TChecksum::MD5; if(!MD5Mode) removeCRC->mode = TChecksum::CRC32; // top byte is reserved for extensions fileCount = fileCount & 0x00FFFFFF; TFileOffset tempCount = fileCount; for(TFileOffset i = 0; i < tempCount; i++) { TFileOffset startOffset = in.tellg(); readDword(in); // noBlocks TChecksum sourceChecksum; if(!MD5Mode) { crc32_t sourceCRC = readDword(in); // SourceCRC readDword(in); // TargetCRC sourceChecksum.loadCRC32(sourceCRC); } else { md5_byte_t digest[16]; readMD5(in, digest); // SourceCRC sourceChecksum.loadMD5(digest); readMD5(in, digest); // TargetCRC } TFileOffset bodySize = readDword(in); // bodySize in.seekg(bodySize,ios::cur); TFileOffset endOffset = in.tellg(); if(sourceChecksum == *removeCRC) { if(existenceIsError) { throw _T("Source file with the exact same contents already exists in patch!\nUse /R option (replace) to replace it with this patch!"); } fileCount--; } else { // copy this patch to out in.seekg(startOffset,ios::beg); TFileOffset size = endOffset-startOffset; char* buffer = new char[size]; in.read(buffer,size); out.write(buffer,size); delete[] buffer; } } TFileOffset curPos = out.tellp(); if(MD5Mode) fileCount = fileCount | 0x80000000; writeFileCount(out,fileCount); out.seekp(curPos,ios::beg); return fileCount; } void writePatch(bostream& patch, bistream& target, vector& sameBlocks, TChecksum* sourceCRC, TChecksum* targetCRC, TFileOffset currentFileCount, POSIX::ALT_FILETIME targetTime) { TFileOffset bodySize = 0; TFileOffset noBlocks = 0; TFileOffset noBlocksOffset = patch.tellp(); writeDword(patch,noBlocks); if(sourceCRC->mode == TChecksum::MD5) { writeMD5(patch,sourceCRC->digest); // sourceCRC writeMD5(patch,targetCRC->digest); // targetCRC } else { writeDword(patch,sourceCRC->crc); // sourceCRC writeDword(patch,targetCRC->crc); // targetCRC } TFileOffset bodySizeOffset = patch.tellp(); writeDword(patch,bodySize); for(vector::iterator iter = sameBlocks.begin(); iter != sameBlocks.end(); iter++) { SameBlock* current = *iter; // store current block if(current->size > 0) { // copy block from sourceFile if(current->size < 256) { writeByte(patch,1); writeByte(patch,current->size); bodySize += 2; } else if(current->size < 65536) { writeByte(patch,2); writeWord(patch,current->size); bodySize += 3; } else { writeByte(patch,3); writeDword(patch,current->size); bodySize += 5; } writeDword(patch,current->sourceOffset); bodySize += 4; noBlocks++; } iter++; if(iter == sameBlocks.end()) break; SameBlock* next = *iter; iter--; // calculate area inbetween this block and the next TFileOffset notFoundStart = current->targetOffset+current->size; if(notFoundStart > next->targetOffset) { throw _T("makeBinaryPatch input problem: there was overlap"); } TFileOffset notFoundSize = next->targetOffset - notFoundStart; if(notFoundSize > 0) { // we need to include this area in the patch directly if(notFoundSize < 256) { writeByte(patch,5); writeByte(patch,notFoundSize); bodySize += 2; } else if(notFoundSize < 65536) { writeByte(patch,6); writeWord(patch,notFoundSize); bodySize += 3; } else { writeByte(patch,7); writeDword(patch,notFoundSize); bodySize += 5; } // copy from target... target.seekg(notFoundStart,ios::beg); #define COPY_BUF_SIZE 4096 char copyBuffer[COPY_BUF_SIZE]; for(TFileOffset i = 0; i < notFoundSize; i += COPY_BUF_SIZE) { TFileOffset j = notFoundSize - i; if(j > COPY_BUF_SIZE) j = COPY_BUF_SIZE; target.read(copyBuffer,j); patch.write(copyBuffer,j); } bodySize += notFoundSize; noBlocks++; } } // we are done, now add just one extra block with the target file time writeByte(patch,255); writeDword(patch,targetTime.dwLowDateTime); writeDword(patch,targetTime.dwHighDateTime); noBlocks++; bodySize += 9; TFileOffset curPos = patch.tellp(); patch.seekp(noBlocksOffset,ios::beg); writeDword(patch,noBlocks); patch.seekp(bodySizeOffset,ios::beg); writeDword(patch,bodySize); // do this at the end because it messes up file position writeFileCount(patch,++currentFileCount); patch.seekp(curPos,ios::beg); } } nsis-3.11/Contrib/VPatch/Source/GenPat/FileFormat1.h000077500000000000000000000037051477201124000221050ustar00rootroot00000000000000//--------------------------------------------------------------------------- // FileFormat1 //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #if !defined(FileFormat1_H) #define FileFormat1_H #include #include #include "Checksums.h" #include "PatchGenerator.h" #include "POSIXUtil.h" using namespace std; namespace FileFormat1 { TFileOffset removeExistingPatch(bistream& in, TFileOffset inSize, bostream& out, TChecksum* removeCRC, bool existenceIsError); void writePatch(bostream& patch, bistream& target, vector& sameBlocks, TChecksum* sourceCRC, TChecksum* targetCRC, TFileOffset currentFileCount, POSIX::ALT_FILETIME targetTime); } #endif // FileFormat1_H nsis-3.11/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp000077500000000000000000000026411477201124000225520ustar00rootroot00000000000000//--------------------------------------------------------------------------- // GlobalTypes.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #include "GlobalTypes.h" nsis-3.11/Contrib/VPatch/Source/GenPat/GlobalTypes.h000077500000000000000000000126741477201124000222260ustar00rootroot00000000000000//--------------------------------------------------------------------------- // GlobalTypes.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #if !defined(GlobalTypes_H) #define GlobalTypes_H #ifndef _MSC_VER #include #endif #include #include #include #include using namespace std; #ifdef _MSC_VER typedef unsigned char uint8_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #define CHECKSUM_BLOCK unsigned __int64 #define __WIN32__ #else #define CHECKSUM_BLOCK unsigned long long #endif typedef uint32_t TFileOffset; // This is a hacky partial replacement for [f]stream so we can open wchar_t* #include "tchar.h" #include #include class simplebfstream { FILE*m_File; ios_base::iostate m_state; streamsize m_LastReadCount; public: simplebfstream() : m_File(0), m_state(ios_base::badbit|ios_base::failbit) {} ~simplebfstream() { if (m_File) fclose(m_File); } bool open(const TCHAR*filename, ios_base::openmode mode) { TCHAR mAcc, mFmt = _T('b'); if (ios::in&mode) mAcc = _T('r'); if (ios::out&mode) mAcc = _T('w'); assert(0==(mode&~(ios::in|ios::binary|ios::out))); TCHAR modestr[3] = {mAcc, mFmt, _T('\0')}; m_File = FOPEN(filename, modestr); m_state = m_File ? ios_base::goodbit : ios_base::badbit|ios_base::failbit; return good(); } void close() { if (!m_File || fclose(m_File)) { m_state |= ios_base::failbit; } m_File = 0; } bool is_open() const {return !!m_File;} bool eof() const {return !!(ios_base::eofbit & m_state);} bool bad() const {return !!(ios_base::badbit & m_state);} bool fail() const {return !!((ios_base::failbit|ios_base::badbit) & m_state);} bool good() const {return ios_base::goodbit==m_state;} streamsize gcount() const {return m_LastReadCount;} long tellg() const {return ftell(m_File);} simplebfstream& read(char*s,streamsize n) { streamsize cbio = fread(s, 1, n); m_LastReadCount = cbio; if (cbio != n) { m_state |= ferror(m_File) ? ios_base::badbit : (ios_base::eofbit|ios_base::failbit); } return *this; } simplebfstream& seekg(streamoff off, ios_base::seekdir dir) { int origin = ios_base::beg==dir ? SEEK_SET : ios_base::cur==dir ? SEEK_CUR : SEEK_END; if (fseek(off, origin)) { // BUGBUG: Does not follow standard m_state |= ios_base::badbit|ios_base::failbit; } return *this; } simplebfstream& seekp(streamoff off, ios_base::seekdir dir) {return seekg(off, dir);} long tellp() const {return tellg();} simplebfstream& write(const char* s, streamsize n) { streamsize cbio = fwrite(s, 1, n); if (cbio != n) m_state |= ios_base::badbit; return *this; } bool operator ! () const {return fail();} protected: // streamsize and streamoff can be INT64 on x86 in VS2015 template streamsize readwritehelper(void*buf, size_t itemsize, streamsize count, F func) { if (sizeof(streamsize) <= sizeof(size_t)) return func(buf, itemsize, (size_t) count, m_File); for (streamsize totc = 0;;) { size_t small = count > 0x7fffffff ? 0x7fffffff : (size_t) count; size_t rv = func(((char*)buf) + totc, itemsize, small, m_File); count -= (streamsize) rv, totc += rv; if (rv != small) return totc; } } streamsize fread(void*buf, size_t itemsize, streamsize count) { return readwritehelper(buf, itemsize, count, ::fread); } streamsize fwrite(const void*buf, size_t itemsize, streamsize count) { return readwritehelper((void*) buf, itemsize, count, ::fwrite); } int fseek(streamoff off, int origin) { if (sizeof(streamoff) <= sizeof(long)) return ::fseek(m_File, (long) off, origin); for (;;) { long small = off > 0x7fffffff ? 0x7fffffff : off < -2147483647 ? -2147483647 : (long) off; int retval = ::fseek(m_File, small, origin); off -= small, origin = SEEK_CUR; if (!off || retval) return retval; } } }; typedef simplebfstream bistream; typedef bistream bifstream; typedef simplebfstream bostream; typedef bostream bofstream; #endif // GlobalTypes_H nsis-3.11/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp000077500000000000000000000101621477201124000220620ustar00rootroot00000000000000//--------------------------------------------------------------------------- // POSIXUtil.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #include "POSIXUtil.h" #include #include #include #include #include #include /* My Borland/VC++ compiler do not have this file */ #if !defined(__BORLANDC__) && !defined(_MSC_VER) #include #endif #ifdef __WIN32__ /* The Windows way of getting a temp file needs windows.h*/ #include #endif using namespace std; namespace POSIX { void TimeT_To_FILETIME(time_t t, ALT_FILETIME *pft ) { uint64_t ll = (((uint64_t)t) *10000000L) + (((uint64_t)116444736L) * 1000000000L); pft->dwLowDateTime = (uint32_t)(ll & 0xFFFFFFFF); pft->dwHighDateTime = (uint32_t)((ll>>32)&0xFFFFFFFF); } #ifdef __WIN32__ /* do it the old way on Win32, because POSIX does not get timezone stuff right */ ALT_FILETIME getFileTime(const TCHAR* sFileName) { FILETIME temp; GetSystemTimeAsFileTime(&temp); HANDLE h = CreateFile(sFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (h == INVALID_HANDLE_VALUE) { terr << _T("Cannot read file time of ") << sFileName << _T("\n"); } else { GetFileTime(h, NULL, NULL, &temp); CloseHandle(h); } ALT_FILETIME result; result.dwHighDateTime = temp.dwHighDateTime; result.dwLowDateTime = temp.dwLowDateTime; return result; } #else ALT_FILETIME getFileTime(const char* sFileName) { struct stat buf; /* get current time first as a fall-back */ time_t currentTime = time(NULL); if(stat(sFileName, &buf)) { terr << _T("Cannot read file time of ") << sFileName << _T("\n"); } else { /* get the time from the file */ currentTime = buf.st_mtime; } ALT_FILETIME result; TimeT_To_FILETIME(currentTime, &result); return result; } #endif uint32_t getFileSize(const TCHAR* sFileName) { bifstream f; f.open(sFileName, std::ios_base::binary | std::ios_base::in); if (!f.good() || f.eof() || !f.is_open()) { throw _T("File could not be read (getFileSize)"); } f.seekg(0, std::ios_base::beg); std::ifstream::pos_type begin_pos = f.tellg(); f.seekg(0, std::ios_base::end); return static_cast(f.tellg() - begin_pos); } #ifdef __WIN32__ tstring getTempFile() { TCHAR buffer[MAX_PATH]; if(GetTempFileName(_T("."),_T("vpatch"),0,buffer) == 0) { terr << _T("Cannot create temporary filename"); } return tstring(buffer); } #else tstring getTempFile() { TCHAR t[] = _T("/tmp/genpatXXXXXX"); mode_t old_umask = umask(0077); int fd = mkstemp(t); if (fd == -1) { terr << _T("Cannot create temporary filename"); return _T(""); } close(fd); umask(old_umask); return tstring(t); } #endif } nsis-3.11/Contrib/VPatch/Source/GenPat/POSIXUtil.h000077500000000000000000000034501477201124000215310ustar00rootroot00000000000000//--------------------------------------------------------------------------- // POSIXUtil.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #if !defined(POSIXUtil_H) #define POSIXUtil_H #include "GlobalTypes.h" #include #include "tchar.h" using namespace std; namespace POSIX { typedef struct ALT_FILETIME { uint32_t dwLowDateTime; uint32_t dwHighDateTime; } ALT_FILETIME; ALT_FILETIME getFileTime(const TCHAR* sFileName); uint32_t getFileSize(const TCHAR* sFileName); tstring getTempFile(); } #endif // POSIXUtil_H nsis-3.11/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp000077500000000000000000000237701477201124000232410ustar00rootroot00000000000000//--------------------------------------------------------------------------- // PatchGenerator.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #include "tchar.h" #include "PatchGenerator.h" #include #define TARGET_BUFFER_SIZE 65536 #define TARGET_LOOKAHEAD_SIZE 4096 #define MAX_BLOCK_SIZE 16384 #define DEFAULT_MAX_MATCHES 500 PatchGenerator::PatchGenerator(bistream& source, TFileOffset sourceSize, bistream& target, TFileOffset targetSize, bostream& patch) : source(source), sourceSize(sourceSize), target(target), targetSize(targetSize), patch(patch), targetCData(NULL), targetCDataBaseOffset(0), targetCDataSize(0), blockSize(64), maxMatches(DEFAULT_MAX_MATCHES), beVerbose(false) { targetCData = new unsigned char[TARGET_BUFFER_SIZE]; } PatchGenerator::~PatchGenerator() { if(targetCData != NULL) delete[] targetCData; } void PatchGenerator::execute(vector& sameBlocks) { ChunkedFile* sourceTree = new ChunkedFile(source,sourceSize,blockSize); // sameBlocks: this vector will store blocks that have been found to be the same // between files // the vector needs an 'empty' first block so checking for overlap with the // 'previous' block never fails SameBlock* firstBlock = new SameBlock; firstBlock->sourceOffset = 0; firstBlock->targetOffset = 0; firstBlock->size = 0; sameBlocks.push_back(firstBlock); targetCDataBaseOffset = 0; targetCDataSize = 0; bool firstRun = true; // currentOffset is in the target file for(TFileOffset currentOffset = 0; currentOffset < targetSize; ) { bool reloadTargetCData = true; if((currentOffset >= targetCDataBaseOffset) && (currentOffset + TARGET_LOOKAHEAD_SIZE < targetCDataBaseOffset + TARGET_BUFFER_SIZE)) { if(firstRun) { firstRun = false; } else { reloadTargetCData = false; } } if(reloadTargetCData) { // at least support looking back blockSize, if possible (findBlock relies on this!) targetCDataBaseOffset = currentOffset - blockSize; // handle start of file correctly if(currentOffset < blockSize) targetCDataBaseOffset = 0; targetCDataSize = TARGET_BUFFER_SIZE; // check if this does not extend beyond EOF if(targetCDataBaseOffset + targetCDataSize > targetSize) { targetCDataSize = targetSize - targetCDataBaseOffset; } // we need to update the memory cache of target if (beVerbose) { tout << _T("[CacheReload] File position = ") << static_cast(targetCDataBaseOffset) << _T("\n"); } target.seekg(targetCDataBaseOffset,ios::beg); target.read(reinterpret_cast(targetCData),targetCDataSize); } //tout << currentOffset << _T(" "); SameBlock* currentSameBlock = findBlock(sourceTree,currentOffset); if(currentSameBlock) { // we have a match SameBlock* previousBlock = sameBlocks.back(); if(previousBlock->targetOffset + previousBlock->size > currentSameBlock->targetOffset) { // there is overlap, resolve it TFileOffset difference = previousBlock->targetOffset + previousBlock->size - currentSameBlock->targetOffset; currentSameBlock->sourceOffset += difference; currentSameBlock->targetOffset += difference; currentSameBlock->size -= difference; } sameBlocks.push_back(currentSameBlock); // debug info if(beVerbose) { tout << _T("Block found: ") << static_cast(currentSameBlock->targetOffset) << _T(" ") << static_cast(currentSameBlock->size) << _T(" (source offset=") << static_cast(currentSameBlock->sourceOffset) << _T(")\n"); } currentOffset = currentSameBlock->targetOffset + currentSameBlock->size; } else { // no match, advance one byte currentOffset++; } } // add a block at the end, again to prevent bounds checking hassle SameBlock* lastBlock = new SameBlock; lastBlock->sourceOffset = 0; lastBlock->targetOffset = targetSize; lastBlock->size = 0; sameBlocks.push_back(lastBlock); delete sourceTree; } SameBlock* PatchGenerator::findBlock(ChunkedFile* sourceTree, TFileOffset targetFileStartOffset) { if(targetSize - targetFileStartOffset < blockSize) return NULL; TFileOffset preDataSize = targetFileStartOffset - targetCDataBaseOffset; //unsigned char* p = &(targetCData[preDataSize]); // SameBlock* currentSameBlock = findBlock(sourceTree,p,preDataSize, // targetCDataSize - preDataSize, // currentOffset); //unsigned char* targetData, // target data contains a memory part of target stream //TFileOffset targetDataPreSize, // this specifies how many bytes we can access in front (required to be at least blockSize) //TFileOffset targetDataSize, // this specifies how many bytes we can access in the pointer (must be at least blockSize) // read the current data part into memory TChunkChecksum checksum; sourceTree->calculateChecksum(&(targetCData[preDataSize]),blockSize,checksum); TFileOffset foundIndex; // location into sourceTree chunks array of found chunk if(sourceTree->search(checksum,&foundIndex)) { // we found something SameBlock* bestMatch = new SameBlock; bestMatch->sourceOffset = sourceTree->chunks[foundIndex].offset; bestMatch->targetOffset = targetFileStartOffset; bestMatch->size = 0; // default to 0, because they can all be mismatches as well // increase match size if possible, also check if it is a match at all int matchCount = 0; while((sourceTree->chunks[foundIndex].checksum == checksum) && ((maxMatches == 0) || (matchCount < maxMatches))) { // check if this one is better than the current match SameBlock match; match.sourceOffset = sourceTree->chunks[foundIndex].offset; match.targetOffset = targetFileStartOffset; match.size = 0; // default to 0, could be a mismatch with the same key improveSameBlockMatch(match,bestMatch->size); if(match.size > bestMatch->size) { *bestMatch = match; } foundIndex++; matchCount++; } if(beVerbose) { if(maxMatches != 0) { if(matchCount == maxMatches) { tout << _T("[FindBlock] Abort due to >") << static_cast(maxMatches) << _T(" matches; file position = ") << static_cast(targetFileStartOffset) << _T("\n"); } } } if(bestMatch->size == 0) return NULL; else return bestMatch; } else { return NULL; } } #define COMPARISON_SIZE 2048 void PatchGenerator::improveSameBlockMatch(SameBlock& match, TFileOffset currentBest) { // we should now try to make the match longer by reading big chunks of the // files to come source.seekg(match.sourceOffset + match.size,ios::beg); target.seekg(match.targetOffset + match.size,ios::beg); while(true) { unsigned char sourceData[COMPARISON_SIZE]; unsigned char targetData[COMPARISON_SIZE]; TFileOffset startTarget = match.targetOffset + match.size; TFileOffset startSource = match.sourceOffset + match.size; TFileOffset checkSize = COMPARISON_SIZE; if(checkSize > targetSize - startTarget) checkSize = targetSize - startTarget; if(checkSize > sourceSize - startSource) checkSize = sourceSize - startSource; if(checkSize == 0) break; source.read(reinterpret_cast(sourceData),checkSize); target.read(reinterpret_cast(targetData),checkSize); TFileOffset i = 0; while((sourceData[i] == targetData[i]) && (i < checkSize )) { match.size++; i++; } // check if we stopped because we had a mismatch if(i < checkSize) break; } if(match.size < blockSize) { match.size = 0; } else { // try to improve before match if this is useful if(match.size + blockSize <= currentBest) return; // do not do if there is no more data in the target... if(match.targetOffset == 0) return; // we know it is stored in the cache... so we just need the source one unsigned char sourceData[MAX_BLOCK_SIZE]; TFileOffset startSource = match.sourceOffset - blockSize; TFileOffset checkSize = blockSize; if(checkSize > match.sourceOffset) { checkSize = match.sourceOffset; startSource = 0; } if(checkSize == 0) return; source.seekg(startSource,ios::beg); source.read(reinterpret_cast(sourceData),checkSize); checkSize--; while(sourceData[checkSize] == targetCData[match.targetOffset - targetCDataBaseOffset - 1]) { match.targetOffset--; match.sourceOffset--; match.size++; checkSize--; if(checkSize == 0) break; if(match.targetOffset == 0) break; } } } nsis-3.11/Contrib/VPatch/Source/GenPat/PatchGenerator.h000077500000000000000000000051731477201124000227030ustar00rootroot00000000000000//--------------------------------------------------------------------------- // PatchGenerator.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #if !defined(PatchGenerator_H) #define PatchGenerator_H #include #include #include "GlobalTypes.h" #include "ChunkedFile.h" using namespace std; typedef struct SameBlock { TFileOffset sourceOffset; TFileOffset targetOffset; TFileOffset size; } SameBlock; class PatchGenerator { protected: bistream& source; TFileOffset sourceSize; bistream& target; TFileOffset targetSize; bostream& patch; // cache unsigned char* targetCData; TFileOffset targetCDataBaseOffset; TFileOffset targetCDataSize; SameBlock* findBlock(ChunkedFile* sourceTree, TFileOffset targetFileStartOffset); // SameBlock* findBlock(ChunkedFile* sourceTree, unsigned char* targetData, TFileOffset targetStartOffset); void improveSameBlockMatch(SameBlock& match, TFileOffset currentBest = 0); public: TFileOffset blockSize; int maxMatches; bool beVerbose; // load in the source, target streams PatchGenerator(bistream& source, TFileOffset sourceSize, bistream& target, TFileOffset targetSize, bostream& patch); ~PatchGenerator(); // construct the actual patch void execute(vector& sameBlocks); }; #endif // PatchGenerator_H nsis-3.11/Contrib/VPatch/Source/GenPat/SConscript000077500000000000000000000004741477201124000216350ustar00rootroot00000000000000target = "GenPat" files = Split(""" adler32.cpp Checksums.cpp ChunkedFile.cpp FileFormat1.cpp GlobalTypes.cpp main.cpp md5.c PatchGenerator.cpp POSIXUtil.cpp """) libs = Split(""" z """) Import('BuildUtil') BuildUtil(target, files, libs, flags = ['$EXCEPTION_FLAG'], cross_platform = True, cli = True) nsis-3.11/Contrib/VPatch/Source/GenPat/adler32.cpp000077500000000000000000000026221477201124000215600ustar00rootroot00000000000000/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2003 Mark Adler THIS IS A MODIFIED VERSION OF THE ORIGINAL ZLIB adler32.c! The following was copied from zlib.h: This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Reviewed for Unicode support by Jim Park -- 08/29/2007 (nothing changed.) */ #include "adler32.h" #include namespace zlib { #include } namespace Checksum { /* ========================================================================= */ uLong adler32(uLong adler, const Byte *buf, uInt len) { return zlib::adler32(adler, buf, len); } } nsis-3.11/Contrib/VPatch/Source/GenPat/adler32.h000077500000000000000000000010431477201124000212210ustar00rootroot00000000000000//--------------------------------------------------------------------------- // Adler32 //--------------------------------------------------------------------------- // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #if !defined(Adler32_H) #define Adler32_H namespace Checksum { typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ typedef unsigned char Byte; /* 8 bits */ uLong adler32(uLong adler, const Byte *buf, uInt len); } #endif // Adler32_H nsis-3.11/Contrib/VPatch/Source/GenPat/main.cpp000077500000000000000000000264411477201124000212550ustar00rootroot00000000000000//--------------------------------------------------------------------------- // main.cpp //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #ifdef __BORLANDC__ #pragma argsused #endif #if !defined(__BORLANDC__) && !defined(_MSC_VER) #include #endif #include "tchar.h" #if defined(__WIN32__) || defined(_WIN32) #define OPT_CHAR _T('/') #else #define OPT_CHAR _T('-') #endif const TCHAR OPT_CHARSTR[] = {OPT_CHAR, _T('\0')} ; // Win32 now supports "/" AND "-" switches (like makensis) but the filename warning only makes sense for "-" #define OPT_FSCONFLICTCHARSTR _T("-") inline bool ISSINGLESWITCHCHAR(const TCHAR c) { return ( OPT_CHAR==(c) || (OPT_CHAR!=_T('-') && _T('-')==(c)) ); } #undef OPT_CHAR #include "GlobalTypes.h" #include "POSIXUtil.h" #include "Checksums.h" #include "PatchGenerator.h" #include "FileFormat1.h" #include #include #ifdef _WIN32 #include "../../../../Source/Platform.h" NSIS_ENTRYPOINT_TMAIN #endif int _tmain( int argc, TCHAR * argv[] ) { tout << _T("GenPat v3.1\n"); tout << _T("===========\n\n(c) 2001-2005 Van de Sande Productions\n"); tout << _T("Website: http://www.tibed.net/vpatch\n\n"); tstring sourceFileName; tstring targetFileName; tstring patchFileName; bool showHelp = true; int blockSize = 64; int maxMatches = 500; bool beVerbose = false; bool beOptimal = false; bool existenceIsError = true; // flag error if patch already has source's MD5/CRC32? int fileNameArgument = 0; if(argc > 1) { for(int i = 1; i < argc; i++) { tstring s(argv[i]); if(s.size() > 0) { if(ISSINGLESWITCHCHAR(s[0])) { if(s.size() > 1) { if((s[1] == _T('v')) || (s[1] == _T('V'))) { beVerbose = true; } if((s[1] == _T('o')) || (s[1] == _T('O'))) { beOptimal = true; } if((s[1] == _T('r')) || (s[1] == _T('R'))) { existenceIsError = false; } } if(s.size() > 2) { if((s[1] == _T('b')) || (s[1] == _T('B'))) { if(s[2] == _T('=')) { tistringstream ss(s.substr(3)); ss >> blockSize; } } if((s[1] == _T('a')) || (s[1] == _T('A'))) { if(s[2] == _T('=')) { tistringstream ss(s.substr(3)); ss >> maxMatches; } } } } else { switch (fileNameArgument) { case 0: sourceFileName = s; break; case 1: targetFileName = s; break; case 2: patchFileName = s; showHelp = false; break; default: terr << _T("WARNING: extra filename argument not used: ") << s << _T("\n"); } fileNameArgument++; } } } } if(beOptimal) { maxMatches = 0; } if(showHelp) { tout << _T("This program will take (sourcefile) as input and create a (patchfile).\n"); tout << _T("With this patchfile, you can convert a (sourcefile) into (targetfile).\n\n"); tout << _T("Command line info:\n"); tout << _T(" GENPAT (sourcefile) (targetfile) (patchfile)\n\n"); tout << _T("Command line option (optional):\n"); tout << OPT_CHARSTR << _T("R Replace a patch with same contents as source silently if it\n already exists.\n"); tout << OPT_CHARSTR << _T("B=64 Set blocksize (default=64), multiple of 2 is required.\n"); tout << OPT_CHARSTR << _T("V More verbose information during patch creation.\n"); tout << OPT_CHARSTR << _T("O Deactivate match limit of the ") << OPT_CHARSTR << _T("A switch (sometimes smaller patches).\n"); tout << OPT_CHARSTR << _T("A=500 Maximum number of block matches per block (improves performance).\n"); tout << _T(" Default is 500, larger is slower. Use ") << OPT_CHARSTR << _T("V to see the cut-off aborts.\n\n"); tout << _T("Note: filenames should never start with ") << OPT_FSCONFLICTCHARSTR << _T(" character!\n\n"); tout << _T("Possible exit codes:\n"); tout << _T(" 0 Success\n"); tout << _T(" 1 Arguments missing\n"); tout << _T(" 2 Other error\n"); tout << _T(" 3 Source file already has a patch in specified patch file (=error)\n"); return 1; } tout << _T("[Source] ") << sourceFileName.c_str() << _T("\n"); tout << _T("[Target] ") << targetFileName.c_str() << _T("\n[PatchFile] ") << patchFileName.c_str() << _T("\n"); // get the file sizes TFileOffset sourceSize = 0; try { sourceSize = POSIX::getFileSize(sourceFileName.c_str()); } catch(TCHAR* s) { terr << _T("Source file size reading failed: ") << s << _T("\n"); return 2; } TFileOffset targetSize; try { targetSize = POSIX::getFileSize(targetFileName.c_str()); } catch(const TCHAR* s) { terr << _T("Target file size reading failed: ") << s << _T("\n"); return 2; } // calculate CRCs TChecksum* sourceCRC = new TChecksum(sourceFileName); sourceCRC->mode = TChecksum::MD5; // default TChecksum* targetCRC = new TChecksum(targetFileName); targetCRC->mode = TChecksum::MD5; // default tstring tempFileName = POSIX::getTempFile(); if (tempFileName == _T("")) return 2; // open the files bifstream source; source.open(sourceFileName.c_str(), std::ios_base::binary | std::ios_base::in); bifstream target; target.open(targetFileName.c_str(), std::ios_base::binary | std::ios_base::in); bofstream patch; patch.open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::out); // remove existing patch with sourceCRC TFileOffset fileCount = 0; while(true) { TFileOffset previousPatchSize = 0; try { previousPatchSize = POSIX::getFileSize(patchFileName.c_str()); } catch(const TCHAR* s) { tout << _T("Patch file does not yet exist: ") << s << _T(", it will be created.\n"); bofstream newfile; newfile.open(patchFileName.c_str(), std::ios_base::binary | std::ios_base::out); newfile.close(); } bifstream previousPatch; previousPatch.open(patchFileName.c_str(), std::ios_base::binary | std::ios_base::in); try { // this will copy the contents of previousPatch to patch, but without sourceCRC fileCount = FileFormat1::removeExistingPatch(previousPatch,previousPatchSize,patch,sourceCRC,existenceIsError); } catch(const TCHAR* s) { terr << _T("ERROR: ") << s << _T("\n"); patch.close(); _tunlink(tempFileName.c_str()); return 3; } // set them to the same checksum mode targetCRC->mode = sourceCRC->mode; tout << _T("[Checksum] Kind of checksums used: "); if(targetCRC->mode == TChecksum::MD5) tout << _T("MD5\n"); if(targetCRC->mode == TChecksum::CRC32) tout << _T("CRC32\n"); break; } if(source.good() && target.good() && patch.good()) { PatchGenerator* gen = new PatchGenerator(source,sourceSize,target,targetSize,patch); try { // clean up the blocksize to be a multiple of 2 int orgBlockSize = blockSize; int bs_counter = 0; while(blockSize != 0) { bs_counter++; blockSize >>= 1; } blockSize = 1; while(bs_counter != 0) { blockSize <<= 1; bs_counter--; } if((blockSize >> 1) == orgBlockSize) blockSize = orgBlockSize; if(blockSize != orgBlockSize) { tout << _T("[BlockSizeFix] Your blocksize had to be fixed since it is not a multiple of 2\n"); } if(blockSize < 16) { blockSize = 16; tout << _T("[BlockSizeFix] Your blocksize had to be fixed since it is smaller than 16\n"); } gen->blockSize = blockSize; tout << _T("[BlockSize] ") << static_cast(gen->blockSize) << _T(" bytes\n"); gen->maxMatches = maxMatches; if(gen->maxMatches == 0) { tout << _T("[FindBlockMatchLimit] Unlimited matches\n"); } else { tout << _T("[FindBlockMatchLimit] ") << gen->maxMatches << _T(" matches\n"); } gen->beVerbose = beVerbose; if(beVerbose) { tout << _T("[Debug] Verbose output during patch generation activated.\n"); } // create sameBlock storage vector sameBlocks; // run the patch generator to find similar blocks gen->execute(sameBlocks); // construct the actual patch in FileFormat1 FileFormat1::writePatch(patch,target,sameBlocks,sourceCRC,targetCRC,fileCount,POSIX::getFileTime(targetFileName.c_str())); // cleanup sameblocks for(vector::iterator iter = sameBlocks.begin(); iter != sameBlocks.end(); iter++) { delete *iter; *iter = NULL; } patch.close(); // Close the temporary patch file so we can open it again for reading TFileOffset patchSize = POSIX::getFileSize(tempFileName.c_str()); char* buf = new char[patchSize]; if (!buf) throw _T("Out of memory"); // In case we switch to nothrow_t // finally: copy the temporary file to the actual patch bifstream tempF; tempF.open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::in); tempF.read(buf,patchSize); if (tempF.fail()) throw _T("Could not read temp file"); tempF.close(); bofstream().open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::out); // empty the temporary file bofstream patchF; patchF.open(patchFileName.c_str(), std::ios_base::binary | std::ios_base::out); patchF.write(buf,patchSize); if (patchF.fail()) throw _T("Could not write patch file"); delete[] buf; } catch(tstring s) { terr << _T("Error thrown: ") << s.c_str(); return 2; } catch(const TCHAR* s) { terr << _T("Error thrown: ") << s; return 2; } catch(...) { terr << _T("Error thrown: Unknown error!\n"); return 2; } } else { terr << _T("There was a problem opening the files.\n"); return 2; } if(*sourceCRC == *targetCRC) terr << _T("WARNING: source and target file have equal CRCs!"); delete sourceCRC; delete targetCRC; _tunlink(tempFileName.c_str()); return 0; } nsis-3.11/Contrib/VPatch/Source/GenPat/md5.c000077500000000000000000000306141477201124000204530ustar00rootroot00000000000000/* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com Reviewed for Unicode support by Jim Park -- 08/29/2007 */ /* $Id: md5.c,v 1.1 2005/09/17 09:25:44 kichik Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include in library. 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program. 2002-02-21 lpd Added missing #include in test program. 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ #include "md5.h" void memcpy2( void *dest, const void *src, int count ) { md5_byte_t* bDest = (md5_byte_t*)dest; md5_byte_t* bSrc = (md5_byte_t*)src; int i = 0; for(; i < count; i++) { bDest[i] = bSrc[i]; } } #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ #ifdef ARCH_IS_BIG_ENDIAN # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) #else # define BYTE_ORDER 0 #endif #define T_MASK ((md5_word_t)~0) #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) #define T3 0x242070db #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) #define T6 0x4787c62a #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) #define T9 0x698098d8 #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) #define T13 0x6b901122 #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) #define T16 0x49b40821 #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) #define T19 0x265e5a51 #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) #define T22 0x02441453 #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) #define T25 0x21e1cde6 #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) #define T28 0x455a14ed #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) #define T31 0x676f02d9 #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) #define T35 0x6d9d6122 #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) #define T38 0x4bdecfa9 #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) #define T41 0x289b7ec6 #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) #define T44 0x04881d05 #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) #define T47 0x1fa27cf8 #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) #define T50 0x432aff97 #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) #define T53 0x655b59c3 #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) #define T57 0x6fa87e4f #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) #define T60 0x4e0811a1 #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) #define T63 0x2ad7d2bb #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) static void md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) { md5_word_t a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; md5_word_t t; #if BYTE_ORDER > 0 /* Define storage only for big-endian CPUs. */ md5_word_t X[16]; #else /* Define storage for little-endian or both types of CPUs. */ md5_word_t xbuf[16]; const md5_word_t *X; #endif { #if BYTE_ORDER == 0 /* * Determine dynamically whether this is a big-endian or * little-endian machine, since we can use a more efficient * algorithm on the latter. */ static const int w = 1; if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ #endif #if BYTE_ORDER <= 0 /* little-endian */ { /* * On little-endian machines, we can process properly aligned * data without copying it. */ if (!((data - (const md5_byte_t *)0) & 3)) { /* data are properly aligned */ X = (const md5_word_t *)data; } else { /* not aligned */ memcpy2(xbuf, data, 64); X = xbuf; } } #endif #if BYTE_ORDER == 0 else /* dynamic big-endian */ #endif #if BYTE_ORDER >= 0 /* big-endian */ { /* * On big-endian machines, we must arrange the bytes in the * right order. */ const md5_byte_t *xp = data; int i; # if BYTE_ORDER == 0 X = xbuf; /* (dynamic only) */ # else # define xbuf X /* (static only) */ # endif for (i = 0; i < 16; ++i, xp += 4) xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); } #endif } #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + F(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); SET(c, d, a, b, 2, 17, T3); SET(b, c, d, a, 3, 22, T4); SET(a, b, c, d, 4, 7, T5); SET(d, a, b, c, 5, 12, T6); SET(c, d, a, b, 6, 17, T7); SET(b, c, d, a, 7, 22, T8); SET(a, b, c, d, 8, 7, T9); SET(d, a, b, c, 9, 12, T10); SET(c, d, a, b, 10, 17, T11); SET(b, c, d, a, 11, 22, T12); SET(a, b, c, d, 12, 7, T13); SET(d, a, b, c, 13, 12, T14); SET(c, d, a, b, 14, 17, T15); SET(b, c, d, a, 15, 22, T16); #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + G(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); SET(c, d, a, b, 11, 14, T19); SET(b, c, d, a, 0, 20, T20); SET(a, b, c, d, 5, 5, T21); SET(d, a, b, c, 10, 9, T22); SET(c, d, a, b, 15, 14, T23); SET(b, c, d, a, 4, 20, T24); SET(a, b, c, d, 9, 5, T25); SET(d, a, b, c, 14, 9, T26); SET(c, d, a, b, 3, 14, T27); SET(b, c, d, a, 8, 20, T28); SET(a, b, c, d, 13, 5, T29); SET(d, a, b, c, 2, 9, T30); SET(c, d, a, b, 7, 14, T31); SET(b, c, d, a, 12, 20, T32); #undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ #define H(x, y, z) ((x) ^ (y) ^ (z)) #define SET(a, b, c, d, k, s, Ti)\ t = a + H(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 5, 4, T33); SET(d, a, b, c, 8, 11, T34); SET(c, d, a, b, 11, 16, T35); SET(b, c, d, a, 14, 23, T36); SET(a, b, c, d, 1, 4, T37); SET(d, a, b, c, 4, 11, T38); SET(c, d, a, b, 7, 16, T39); SET(b, c, d, a, 10, 23, T40); SET(a, b, c, d, 13, 4, T41); SET(d, a, b, c, 0, 11, T42); SET(c, d, a, b, 3, 16, T43); SET(b, c, d, a, 6, 23, T44); SET(a, b, c, d, 9, 4, T45); SET(d, a, b, c, 12, 11, T46); SET(c, d, a, b, 15, 16, T47); SET(b, c, d, a, 2, 23, T48); #undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + I(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); SET(c, d, a, b, 14, 15, T51); SET(b, c, d, a, 5, 21, T52); SET(a, b, c, d, 12, 6, T53); SET(d, a, b, c, 3, 10, T54); SET(c, d, a, b, 10, 15, T55); SET(b, c, d, a, 1, 21, T56); SET(a, b, c, d, 8, 6, T57); SET(d, a, b, c, 15, 10, T58); SET(c, d, a, b, 6, 15, T59); SET(b, c, d, a, 13, 21, T60); SET(a, b, c, d, 4, 6, T61); SET(d, a, b, c, 11, 10, T62); SET(c, d, a, b, 2, 15, T63); SET(b, c, d, a, 9, 21, T64); #undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ pms->abcd[0] += a; pms->abcd[1] += b; pms->abcd[2] += c; pms->abcd[3] += d; } void md5_init(md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->abcd[3] = 0x10325476; } void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) { const md5_byte_t *p = data; int left = nbytes; int offset = (pms->count[0] >> 3) & 63; md5_word_t nbits = (md5_word_t)(nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); memcpy2(pms->buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; md5_process(pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) md5_process(pms, p); /* Process a final partial block. */ if (left) memcpy2(pms->buf, p, left); } void md5_finish(md5_state_t *pms, md5_byte_t digest[16]) { static const md5_byte_t pad[64] = { 0x80, 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 }; md5_byte_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ md5_append(pms, data, 8); for (i = 0; i < 16; ++i) digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); } nsis-3.11/Contrib/VPatch/Source/GenPat/md5.h000077500000000000000000000065741477201124000204700ustar00rootroot00000000000000/* Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com Reviewed for Unicode support by Jim Park -- 08/29/2007 */ /* $Id: md5.h,v 1.1 2005/09/17 09:25:44 kichik Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Removed support for non-ANSI compilers; removed references to Ghostscript; clarified derivation from RFC 1321; now handles byte order either statically or dynamically. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ #ifndef md5_INCLUDED # define md5_INCLUDED /* * This package supports both compile-time and run-time determination of CPU * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is * defined as non-zero, the code will be compiled to run only on big-endian * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to * run on either big- or little-endian CPUs, but will run slightly less * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. */ typedef unsigned char md5_byte_t; /* 8-bit byte */ typedef unsigned int md5_word_t; /* 32-bit word */ /* Define the state of the MD5 Algorithm. */ typedef struct md5_state_s { md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; #ifdef __cplusplus extern "C" { #endif /* Initialize the algorithm. */ void md5_init(md5_state_t *pms); /* Append a string to the message. */ void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); /* Finish the message and return the digest. */ void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif #endif /* md5_INCLUDED */ nsis-3.11/Contrib/VPatch/Source/GenPat/tchar.h000077500000000000000000000014671477201124000211000ustar00rootroot00000000000000// Added for Unicode support by Jim Park -- 08/29/2007 #pragma once #include #include #ifdef _UNICODE # define tout wcout # define terr wcerr # define __T(x) L ## x # define _T(x) __T(x) # define _tmain wmain # define _tunlink _wunlink # define FOPEN _wfopen typedef std::wstring tstring; typedef std::wistringstream tistringstream; typedef wchar_t TCHAR; #else # define tout cout # define terr cerr # define _T(x) x # define _tmain main # ifdef _WIN32 # define _tunlink _unlink # else # define _tunlink unlink # endif # define FOPEN fopen typedef std::string tstring; typedef std::istringstream tistringstream; typedef char TCHAR; #endif nsis-3.11/Contrib/VPatch/Source/Plugin/000077500000000000000000000000001477201124000176735ustar00rootroot00000000000000nsis-3.11/Contrib/VPatch/Source/Plugin/SConscript000077500000000000000000000003341477201124000217100ustar00rootroot00000000000000target = 'VPatch' files = Split(""" apply_patch.c checksum.c md5.c vpatchdll.c """) libs = Split(""" kernel32 user32 """) Import('BuildPlugin env') BuildPlugin(target, files, libs, defines = ['DLL_CHECKSUMS']) nsis-3.11/Contrib/VPatch/Source/Plugin/apply_patch.c000077500000000000000000000177661477201124000223670ustar00rootroot00000000000000//--------------------------------------------------------------------------- // apply_patch.c //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #include "apply_patch.h" #include "checksum.h" /* ------------------------ patch application ----------------- */ #define BLOCKSIZE 16384 int DoPatch(HANDLE hPatch, HANDLE hSource, HANDLE hDest) { static char block[BLOCKSIZE]; unsigned long temp = 0; unsigned long read; unsigned long source_crc = 0; md5_byte_t source_md5[16]; unsigned long patch_dest_crc = 0; md5_byte_t patch_dest_md5[16]; int MD5Mode = 0; unsigned long patches = 0; int already_uptodate = 0; FILETIME targetModifiedTime; // special 'addition' for the dll: since the patch file is now // in a separate file, the VPAT header might be right at the start // of the file, and a pointer at the end of the file is probably missing // (because all patch generator versions don't append it, the linker/gui // does this). SetFilePointer(hPatch, 0, NULL, FILE_BEGIN); ReadFile(hPatch, &temp, 4, &read, NULL); // it's not at the start of file -> there must be a pointer at the end of // file then if (temp != 0x54415056) { SetFilePointer(hPatch, -4, NULL, FILE_END); ReadFile(hPatch, &temp, 4, &read, NULL); SetFilePointer(hPatch, temp, NULL, FILE_BEGIN); ReadFile(hPatch, &temp, 4, &read, NULL); if (temp != 0x54415056) return PATCH_CORRUPT; } // target file date is by default the current system time GetSystemTimeAsFileTime(&targetModifiedTime); // read the number of patches in the file ReadFile(hPatch, &patches, 4, &read, NULL); if(patches & 0x80000000) MD5Mode = 1; // MSB is now reserved for future extensions, anyone wanting more than // 16 million patches in a single file is nuts anyway patches = patches & 0x00FFFFFF; if(!MD5Mode) { if (!FileCRC(hSource, &source_crc)) return PATCH_ERROR; } else { if (!FileMD5(hSource, source_md5)) return PATCH_ERROR; } while (patches--) { long patch_blocks = 0, patch_size = 0; // flag which needs to be set by one of the checksum checks int currentPatchMatchesChecksum = 0; // read the number of blocks this patch has if(!ReadFile(hPatch, &patch_blocks, 4, &read, NULL)) { return PATCH_CORRUPT; } // read checksums if(!MD5Mode) { unsigned long patch_source_crc = 0; if(!ReadFile(hPatch, &patch_source_crc, 4, &read, NULL)) { return PATCH_CORRUPT; } if(!ReadFile(hPatch, &patch_dest_crc, 4, &read, NULL)) { return PATCH_CORRUPT; } // check to see if it's already up-to-date for some patch if (source_crc == patch_dest_crc) { already_uptodate = 1; } if (source_crc == patch_source_crc) { currentPatchMatchesChecksum = 1; } } else { int md5index; md5_byte_t patch_source_md5[16]; if(!ReadFile(hPatch, patch_source_md5, 16, &read, NULL)) { return PATCH_CORRUPT; } if(!ReadFile(hPatch, patch_dest_md5, 16, &read, NULL)) { return PATCH_CORRUPT; } // check to see if it's already up-to-date for some patch for(md5index = 0; md5index < 16; md5index++) { if(source_md5[md5index] != patch_dest_md5[md5index]) break; if(md5index == 15) already_uptodate = 1; } for(md5index = 0; md5index < 16; md5index++) { if(source_md5[md5index] != patch_source_md5[md5index]) break; if(md5index == 15) currentPatchMatchesChecksum = 1; } } // read the size of the patch, we can use this to skip over it if(!ReadFile(hPatch, &patch_size, 4, &read, NULL)) { return PATCH_CORRUPT; } if(currentPatchMatchesChecksum) { while (patch_blocks--) { unsigned char blocktype = 0; unsigned long blocksize = 0; if(!ReadFile(hPatch, &blocktype, 1, &read, NULL)) { return PATCH_CORRUPT; } switch (blocktype) { case 1: case 2: case 3: if (blocktype == 1) { unsigned char x; blocksize = ReadFile(hPatch,&x,1,&read,NULL)? x: 0; } else if (blocktype == 2) { unsigned short x; blocksize = ReadFile(hPatch,&x,2,&read,NULL)? x: 0; } else { unsigned long x; blocksize = ReadFile(hPatch,&x,4,&read,NULL)? x:0; } if (!blocksize || !ReadFile(hPatch, &temp, 4, &read, NULL) || read != 4) return PATCH_CORRUPT; SetFilePointer(hSource, temp, 0, FILE_BEGIN); do { if(!ReadFile(hSource, block, min(BLOCKSIZE, blocksize), &read, NULL)) { return PATCH_ERROR; } WriteFile(hDest, block, read, &temp, NULL); if (temp != min(BLOCKSIZE, blocksize)) return PATCH_ERROR; blocksize -= temp; } while (temp); break; case 5: case 6: case 7: if (blocktype == 5) { unsigned char x; blocksize = ReadFile(hPatch,&x,1,&read,NULL)? x:0; } else if (blocktype == 6) { unsigned short x; blocksize = ReadFile(hPatch,&x,2,&read,NULL)? x:0; } else { unsigned long x; blocksize = ReadFile(hPatch,&x,4,&read,NULL)? x:0; } if (!blocksize) return PATCH_CORRUPT; do { if(!ReadFile(hPatch, block, min(BLOCKSIZE, blocksize), &read, NULL)) { return PATCH_CORRUPT; } WriteFile(hDest, block, read, &temp, NULL); if (temp != min(BLOCKSIZE, blocksize)) return PATCH_ERROR; blocksize -= temp; } while (temp); break; case 255: // read the file modified time from the patch if(!ReadFile(hPatch,&targetModifiedTime,sizeof(targetModifiedTime),&read,NULL)) { return PATCH_CORRUPT; } break; default: return PATCH_CORRUPT; } } if(!MD5Mode) { unsigned long dest_crc = 0; if(!FileCRC(hDest, &dest_crc)) { return PATCH_ERROR; } if (dest_crc != patch_dest_crc) return PATCH_ERROR; } else { int md5index; md5_byte_t dest_md5[16]; if(!FileMD5(hDest, dest_md5)) { return PATCH_ERROR; } for(md5index = 0; md5index < 16; md5index++) { if(dest_md5[md5index] != patch_dest_md5[md5index]) return PATCH_ERROR; } } // set file time SetFileTime(hDest, NULL, NULL, &targetModifiedTime); return PATCH_SUCCESS; } else { SetFilePointer(hPatch, patch_size, NULL, FILE_CURRENT); } } // if already up to date, it doesn't matter that we didn't match if(already_uptodate) { return PATCH_UPTODATE; } else { return PATCH_NOMATCH; } } nsis-3.11/Contrib/VPatch/Source/Plugin/apply_patch.h000077500000000000000000000035161477201124000223600ustar00rootroot00000000000000//--------------------------------------------------------------------------- // apply_patch.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #ifndef apply_patch_INCLUDED #define apply_patch_INCLUDED #include /* ------------------------ patch application ----------------- */ // possible return values #define PATCH_SUCCESS 0 #define PATCH_ERROR 1 #define PATCH_CORRUPT 2 #define PATCH_NOMATCH 3 #define PATCH_UPTODATE 4 #define FILE_ERR_PATCH 5 #define FILE_ERR_SOURCE 6 #define FILE_ERR_DEST 7 int DoPatch(HANDLE hPatch, HANDLE hSource, HANDLE hDest); #endif nsis-3.11/Contrib/VPatch/Source/Plugin/checksum.c000077500000000000000000000071661477201124000216560ustar00rootroot00000000000000//--------------------------------------------------------------------------- // checksum.c //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 #include "checksum.h" #ifdef _MSC_VER # define FORCE_INLINE __forceinline #else # ifdef __GNUC__ # if __GNUC__ < 3 # define FORCE_INLINE inline # else # define FORCE_INLINE inline __attribute__ ((always_inline)) # endif # else # define FORCE_INLINE inline # endif #endif /* ------------------------ CRC32 checksum calculation ----------------- */ UINT CRCTable[256]; BOOL bInitCRC = FALSE; FORCE_INLINE void InitCRC() { int i, j; unsigned long c; for (c = i = 0; i < 256; c = ++i) { for (j = 0; j < 8; j++) { if (c & 1) c = (c>>1) ^ 0xEDB88320; else c >>= 1; } CRCTable[i] = c; } bInitCRC = TRUE; } #define CRCBLOCKSIZE 4096 BOOL FileCRC(HANDLE hFile, DWORD *crc) { static BYTE crcblock[CRCBLOCKSIZE]; DWORD read; BYTE *p; UINT c = 0xFFFFFFFF; if (bInitCRC == FALSE) InitCRC(); SetFilePointer(hFile, 0, NULL, FILE_BEGIN); do { if (ReadFile(hFile, crcblock, CRCBLOCKSIZE, &read, NULL) == FALSE) return FALSE; for (p = crcblock; p < crcblock + read; p++) c = CRCTable[(c & 0xFF) ^ *p] ^ (c >> 8); } while (read); *crc = (c ^ 0xFFFFFFFF); return TRUE; } void CRC32ToString(char* string, DWORD crc) { int i = 0; int j = 7; int a1, a2; for(i = 0; i < 4; i++) { a1 = (crc >> 4) % 16; a2 = crc % 16; string[j--] = a2 < 10 ? ('0' + a2) : ('A' + a2 - 10); string[j--] = a1 < 10 ? ('0' + a1) : ('A' + a1 - 10); crc = crc >> 8; } } /* ------------------------ MD5 checksum calculation ----------------- */ #define MD5BLOCKSIZE 16384 BOOL FileMD5(HANDLE hFile, md5_byte_t digest[16]) { static BYTE md5block[MD5BLOCKSIZE]; DWORD read; md5_state_t state; md5_init(&state); SetFilePointer(hFile, 0, NULL, FILE_BEGIN); do { if (ReadFile(hFile, md5block, MD5BLOCKSIZE, &read, NULL) == FALSE) return FALSE; md5_append(&state, md5block, read); } while (read); md5_finish(&state, digest); return TRUE; } void MD5ToString(char* string, md5_byte_t checksum[16]) { int i = 0; int j = 0; int a1, a2; for(i = 0; i < 16; i++) { a1 = (checksum[i] >> 4) % 16; a2 = checksum[i] % 16; string[j++] = a1 < 10 ? ('0' + a1) : ('A' + a1 - 10); string[j++] = a2 < 10 ? ('0' + a2) : ('A' + a2 - 10); } } nsis-3.11/Contrib/VPatch/Source/Plugin/checksum.h000077500000000000000000000036521477201124000216570ustar00rootroot00000000000000//--------------------------------------------------------------------------- // checksum.h //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Reviewed for Unicode support by Jim Park -- 08/29/2007 // The functions return ANSI strings so we use PushStringA to push it on // to the return stack correctly. #ifndef checksum_INCLUDED #define checksum_INCLUDED #include #include "md5.h" /* ------------------------ CRC32 checksum calculation ----------------- */ BOOL FileCRC(HANDLE hFile, DWORD *crc); void CRC32ToString(char* string, DWORD crc); /* ------------------------ MD5 checksum calculation ----------------- */ BOOL FileMD5(HANDLE hFile, md5_byte_t digest[16]); void MD5ToString(char* string, md5_byte_t checksum[16]); #endif nsis-3.11/Contrib/VPatch/Source/Plugin/md5.c000077500000000000000000000306301477201124000205310ustar00rootroot00000000000000/* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com Reviewed for Unicode support by Jim Park -- 08/29/2007 */ /* $Id: md5.c,v 1.2 2005/09/20 17:42:28 kichik Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include in library. 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program. 2002-02-21 lpd Added missing #include in test program. 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ #include "md5.h" void md5_memcpy( void *dest, const void *src, int count ) { md5_byte_t* bDest = (md5_byte_t*)dest; md5_byte_t* bSrc = (md5_byte_t*)src; int i = 0; for(; i < count; i++) { bDest[i] = bSrc[i]; } } #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ #ifdef ARCH_IS_BIG_ENDIAN # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) #else # define BYTE_ORDER 0 #endif #define T_MASK ((md5_word_t)~0) #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) #define T3 0x242070db #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) #define T6 0x4787c62a #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) #define T9 0x698098d8 #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) #define T13 0x6b901122 #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) #define T16 0x49b40821 #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) #define T19 0x265e5a51 #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) #define T22 0x02441453 #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) #define T25 0x21e1cde6 #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) #define T28 0x455a14ed #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) #define T31 0x676f02d9 #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) #define T35 0x6d9d6122 #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) #define T38 0x4bdecfa9 #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) #define T41 0x289b7ec6 #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) #define T44 0x04881d05 #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) #define T47 0x1fa27cf8 #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) #define T50 0x432aff97 #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) #define T53 0x655b59c3 #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) #define T57 0x6fa87e4f #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) #define T60 0x4e0811a1 #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) #define T63 0x2ad7d2bb #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) static void md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) { md5_word_t a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; md5_word_t t; #if BYTE_ORDER > 0 /* Define storage only for big-endian CPUs. */ md5_word_t X[16]; #else /* Define storage for little-endian or both types of CPUs. */ md5_word_t xbuf[16]; const md5_word_t *X; #endif { #if BYTE_ORDER == 0 /* * Determine dynamically whether this is a big-endian or * little-endian machine, since we can use a more efficient * algorithm on the latter. */ static const int w = 1; if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ #endif #if BYTE_ORDER <= 0 /* little-endian */ { /* * On little-endian machines, we can process properly aligned * data without copying it. */ if (!((data - (const md5_byte_t *)0) & 3)) { /* data are properly aligned */ X = (const md5_word_t *)data; } else { /* not aligned */ md5_memcpy(xbuf, data, 64); X = xbuf; } } #endif #if BYTE_ORDER == 0 else /* dynamic big-endian */ #endif #if BYTE_ORDER >= 0 /* big-endian */ { /* * On big-endian machines, we must arrange the bytes in the * right order. */ const md5_byte_t *xp = data; int i; # if BYTE_ORDER == 0 X = xbuf; /* (dynamic only) */ # else # define xbuf X /* (static only) */ # endif for (i = 0; i < 16; ++i, xp += 4) xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); } #endif } #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + F(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); SET(c, d, a, b, 2, 17, T3); SET(b, c, d, a, 3, 22, T4); SET(a, b, c, d, 4, 7, T5); SET(d, a, b, c, 5, 12, T6); SET(c, d, a, b, 6, 17, T7); SET(b, c, d, a, 7, 22, T8); SET(a, b, c, d, 8, 7, T9); SET(d, a, b, c, 9, 12, T10); SET(c, d, a, b, 10, 17, T11); SET(b, c, d, a, 11, 22, T12); SET(a, b, c, d, 12, 7, T13); SET(d, a, b, c, 13, 12, T14); SET(c, d, a, b, 14, 17, T15); SET(b, c, d, a, 15, 22, T16); #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + G(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); SET(c, d, a, b, 11, 14, T19); SET(b, c, d, a, 0, 20, T20); SET(a, b, c, d, 5, 5, T21); SET(d, a, b, c, 10, 9, T22); SET(c, d, a, b, 15, 14, T23); SET(b, c, d, a, 4, 20, T24); SET(a, b, c, d, 9, 5, T25); SET(d, a, b, c, 14, 9, T26); SET(c, d, a, b, 3, 14, T27); SET(b, c, d, a, 8, 20, T28); SET(a, b, c, d, 13, 5, T29); SET(d, a, b, c, 2, 9, T30); SET(c, d, a, b, 7, 14, T31); SET(b, c, d, a, 12, 20, T32); #undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ #define H(x, y, z) ((x) ^ (y) ^ (z)) #define SET(a, b, c, d, k, s, Ti)\ t = a + H(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 5, 4, T33); SET(d, a, b, c, 8, 11, T34); SET(c, d, a, b, 11, 16, T35); SET(b, c, d, a, 14, 23, T36); SET(a, b, c, d, 1, 4, T37); SET(d, a, b, c, 4, 11, T38); SET(c, d, a, b, 7, 16, T39); SET(b, c, d, a, 10, 23, T40); SET(a, b, c, d, 13, 4, T41); SET(d, a, b, c, 0, 11, T42); SET(c, d, a, b, 3, 16, T43); SET(b, c, d, a, 6, 23, T44); SET(a, b, c, d, 9, 4, T45); SET(d, a, b, c, 12, 11, T46); SET(c, d, a, b, 15, 16, T47); SET(b, c, d, a, 2, 23, T48); #undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + I(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); SET(c, d, a, b, 14, 15, T51); SET(b, c, d, a, 5, 21, T52); SET(a, b, c, d, 12, 6, T53); SET(d, a, b, c, 3, 10, T54); SET(c, d, a, b, 10, 15, T55); SET(b, c, d, a, 1, 21, T56); SET(a, b, c, d, 8, 6, T57); SET(d, a, b, c, 15, 10, T58); SET(c, d, a, b, 6, 15, T59); SET(b, c, d, a, 13, 21, T60); SET(a, b, c, d, 4, 6, T61); SET(d, a, b, c, 11, 10, T62); SET(c, d, a, b, 2, 15, T63); SET(b, c, d, a, 9, 21, T64); #undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ pms->abcd[0] += a; pms->abcd[1] += b; pms->abcd[2] += c; pms->abcd[3] += d; } void md5_init(md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->abcd[3] = 0x10325476; } void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) { const md5_byte_t *p = data; int left = nbytes; int offset = (pms->count[0] >> 3) & 63; md5_word_t nbits = (md5_word_t)(nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); md5_memcpy(pms->buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; md5_process(pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) md5_process(pms, p); /* Process a final partial block. */ if (left) md5_memcpy(pms->buf, p, left); } void md5_finish(md5_state_t *pms, md5_byte_t digest[16]) { static const md5_byte_t pad[64] = { 0x80, 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 }; md5_byte_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ md5_append(pms, data, 8); for (i = 0; i < 16; ++i) digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); } nsis-3.11/Contrib/VPatch/Source/Plugin/md5.h000077500000000000000000000065751477201124000205510ustar00rootroot00000000000000/* Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com Reviewed for Unicode support by Jim Park -- 08/29/2007 */ /* $Id: md5.h,v 1.1 2005/09/17 09:25:44 kichik Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Removed support for non-ANSI compilers; removed references to Ghostscript; clarified derivation from RFC 1321; now handles byte order either statically or dynamically. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ #ifndef md5_INCLUDED # define md5_INCLUDED /* * This package supports both compile-time and run-time determination of CPU * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is * defined as non-zero, the code will be compiled to run only on big-endian * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to * run on either big- or little-endian CPUs, but will run slightly less * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. */ typedef unsigned char md5_byte_t; /* 8-bit byte */ typedef unsigned int md5_word_t; /* 32-bit word */ /* Define the state of the MD5 Algorithm. */ typedef struct md5_state_s { md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; #ifdef __cplusplus extern "C" { #endif /* Initialize the algorithm. */ void md5_init(md5_state_t *pms); /* Append a string to the message. */ void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); /* Finish the message and return the digest. */ void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif #endif /* md5_INCLUDED */ nsis-3.11/Contrib/VPatch/Source/Plugin/vpatchdll.c000077500000000000000000000127271477201124000220340ustar00rootroot00000000000000//--------------------------------------------------------------------------- // vpatchdll.c: NSIS plug-in version of the VPatch runtime //--------------------------------------------------------------------------- // -=* VPatch *=- //--------------------------------------------------------------------------- // Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions //--------------------------------------------------------------------------- // Website: http://www.tibed.net/vpatch // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // // Unicode support by Jim Park -- 08/29/2007 #define WIN32_LEAN_AND_MEAN #include #include // nsis plugin #include "apply_patch.h" #include "checksum.h" /* ------------------------ Plug-in code ------------------------- */ HINSTANCE g_hInstance; HWND g_hwndParent; void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent=hwndParent; EXDLL_INIT(); { TCHAR source[MAX_PATH]; TCHAR dest[MAX_PATH]; TCHAR exename[MAX_PATH]; HANDLE hPatch, hSource, hDest; int result; popstring(exename); popstring(source); popstring(dest); hPatch = CreateFile(exename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hPatch == INVALID_HANDLE_VALUE) { pushstring(_T("Unable to open patch file")); return; } hSource = CreateFile(source, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hSource == INVALID_HANDLE_VALUE) { CloseHandle(hPatch); pushstring(_T("Unable to open source file")); return; } hDest = CreateFile(dest, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hDest == INVALID_HANDLE_VALUE) { CloseHandle(hPatch); CloseHandle(hSource); pushstring(_T("Unable to open output file")); return; } result = DoPatch(hPatch, hSource, hDest); CloseHandle(hDest); CloseHandle(hSource); CloseHandle(hPatch); if ((result != PATCH_SUCCESS)) { if (result == PATCH_ERROR) pushstring(_T("An error occurred while patching")); else if (result == PATCH_CORRUPT) pushstring(_T("Patch data is invalid or corrupt")); else if (result == PATCH_NOMATCH) pushstring(_T("No suitable patches were found")); else if (result == PATCH_UPTODATE) pushstring(_T("OK, new version already installed")); DeleteFile(dest); } else { pushstring(_T("OK")); } return; } } #ifdef DLL_CHECKSUMS void __declspec(dllexport) GetFileCRC32(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent=hwndParent; EXDLL_INIT(); { TCHAR filename[MAX_PATH]; char crc_string[9]; HANDLE hFile; unsigned long crc; popstring(filename); hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) { //pushstring("ERROR: Unable to open file for CRC32 calculation"); pushstring(_T("")); return; } if (!FileCRC(hFile, &crc)) { //pushstring("ERROR: Unable to calculate CRC32"); pushstring(_T("")); } else { crc_string[8] = '\0'; CRC32ToString(crc_string,crc); PushStringA(crc_string); } CloseHandle(hFile); } } void __declspec(dllexport) GetFileMD5(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent=hwndParent; EXDLL_INIT(); { TCHAR filename[MAX_PATH]; char md5_string[33]; HANDLE hFile; md5_byte_t digest[16]; popstring(filename); hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) { //pushstring("ERROR: Unable to open file for MD5 calculation"); pushstring(_T("")); return; } if (!FileMD5(hFile, digest)) { //pushstring("ERROR: Unable to calculate MD5"); pushstring(_T("")); } else { md5_string[32] = '\0'; MD5ToString(md5_string,digest); PushStringA(md5_string); } CloseHandle(hFile); } } #endif BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; return TRUE; } nsis-3.11/Contrib/VPatch/VPatchLib.nsh000077500000000000000000000013241477201124000175260ustar00rootroot00000000000000; PatchLib v3.0 ; ============= ; ; Library with macro for use with VPatch (DLL version) in NSIS 2.0.5+ ; Created by Koen van de Sande !include LogicLib.nsh !macro VPatchFile PATCHDATA SOURCEFILE TEMPFILE Push $1 Push $2 Push $3 Push $4 Push ${SOURCEFILE} Push ${TEMPFILE} Pop $2 # temp file Pop $3 # source file InitPluginsDir GetTempFileName $1 $PLUGINSDIR File /oname=$1 ${PATCHDATA} vpatch::vpatchfile $1 $3 $2 Pop $4 DetailPrint $4 StrCpy $4 $4 2 ${Unless} $4 == "OK" SetErrors ${EndIf} ${If} ${FileExists} $2 Delete $3 Rename /REBOOTOK $2 $3 ${EndIf} Delete $1 Pop $4 Pop $3 Pop $2 Pop $1 !macroend nsis-3.11/Contrib/VPatch/example.nsi000077500000000000000000000032061477201124000173470ustar00rootroot00000000000000;VPatch example ;Written by Joost Verburg ;-------------------------------- ; The name of the installer Name "VPatch Test" ; The file to write OutFile "vpatchtest.exe" ; The default installation directory InstallDir "$PROGRAMFILES\VPatch Test" ; The text to prompt the user to enter a directory DirText "Choose a folder in which to install the VPatch Test!" ; Show details ShowInstDetails show ;-------------------------------- ; The normal way to use VPatch ;-------------------------------- !include "VPatchLib.nsh" Section "Update file" ; Set output path to the installation directory SetOutPath $INSTDIR ; Extract the old file under name 'updatefile.txt' File /oname=updatefile.txt oldfile.txt ; Update the file - it will be replaced with the new version DetailPrint "Updating updatefile.txt using patch..." !insertmacro VPatchFile "patch.pat" "$INSTDIR\updatefile.txt" "$INSTDIR\temporaryfile.txt" SectionEnd ;------------------------------- ; The hard way to use VPatch ;------------------------------- Section "New version in separate file" ; Set output path to the installation directory SetOutPath $INSTDIR ; Extract the old file File oldfile.txt ; Extract the patch to the plug-ins folder (temporary) InitPluginsDir File /oname=$PLUGINSDIR\patch.pat patch.pat ; Update the old file to the new file using the patch DetailPrint "Updating oldfile.txt using patch to newfile.txt..." vpatch::vpatchfile "$PLUGINSDIR\patch.pat" "$INSTDIR\oldfile.txt" "$INSTDIR\newfile.txt" ; Show result Pop $R0 DetailPrint "Result: $R0" SectionEndnsis-3.11/Contrib/VPatch/newfile.txt000077500000000000000000000001751477201124000173750ustar00rootroot00000000000000*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE *** *** COMPILE EXAMPLE.NSI TO TEST *** newfile - vpatch 67890 - GHIJKLnsis-3.11/Contrib/VPatch/oldfile.txt000077500000000000000000000001751477201124000173620ustar00rootroot00000000000000*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE *** *** COMPILE EXAMPLE.NSI TO TEST *** oldfile - vpatch 12345 - ABCDEFnsis-3.11/Contrib/VPatch/patch.pat000077500000000000000000000001431477201124000170030ustar00rootroot00000000000000VPAT€Üû+ÑVüÒ€¯¦}jjÞ3=K'¸lLߎúÃh3["newfile - vpatch 67890 - GHIJKLÿƒ‚‹Ãnsis-3.11/Contrib/nsDialogs/000077500000000000000000000000001477201124000157335ustar00rootroot00000000000000nsis-3.11/Contrib/nsDialogs/InstallOptions.nsi000077500000000000000000000021571477201124000214400ustar00rootroot00000000000000!include LogicLib.nsh !include WinMessages.nsh Name "nsDialogs IO" OutFile "nsDialogs IO.exe" Page custom nsDialogsIO UpdateINIState Page instfiles XPStyle on ShowInstDetails show !include nsDialogs.nsh !insertmacro NSD_FUNCTION_INIFILE Function nsDialogsIO InitPluginsDir File /oname=$PLUGINSDIR\io.ini "..\InstallOptions\test.ini" ${If} ${Cmd} `MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Test the right-to-left version?" IDYES` WriteINIStr $PLUGINSDIR\io.ini Settings RTL 1 ${EndIf} StrCpy $0 $PLUGINSDIR\io.ini Call CreateDialogFromINI FunctionEnd Section ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 2" "State" DetailPrint "Install X=$0" ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 3" "State" DetailPrint "Install Y=$0" ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 4" "State" DetailPrint "Install Z=$0" ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 5" "State" DetailPrint "File=$0" ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 6" "State" DetailPrint "Dir=$0" ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 8" "State" DetailPrint "Info=$0" SectionEnd nsis-3.11/Contrib/nsDialogs/Readme.html000077500000000000000000001156301477201124000200270ustar00rootroot00000000000000 nsDialogs

NSIS nsDialogs Plug-in

Next generation of user interface design

Table of Contents

Introduction

nsDialogs allows creation of custom pages in the installer. On top of the built-in pages, nsDialogs can create pages with any type of controls in any order and arrangement. It can create everything from a simple page with one label to form which reacts to user's actions. Modern UI 2, for example, uses nsDialogs to create the welcome and finish pages.

nsDialogs is a NSIS plug-in, introduced in version 2.29 as a replacement for InstallOptions. nsDialogs doesn't use INI files, so it's way faster than InstallOptions. Integration with the script is tighter and more natural - creating controls is done using plug-in functions and notification is done by directly calling a function in the script. Unlike InstallOptions, there isn't a predefined set of available control type and by providing a lower level access to Windows API, every type of control can be created and pages can be more customizable.

The same thing that makes nsDialogs more flexible can also make it more complicated for users with no knowledge of Win32 API. This is solved by creating a library of predefined functions, defined in script, that allow creation and handling of controls. This way, novices get easy access to the flexibility, while advanced users still get access to the core functionality by modifying the library or simply avoid using it.

Step-by-Step Tutorial

Custom Page

Before you can start adding controls you need to create a nsDialogs custom page. nsDialogs pages can only be created in a custom page's creator function, not in sections nor regular functions. Lets create a basic script with a empty nsDialogs page as our skeleton:

!include LogicLib.nsh

Name nsDialogs
OutFile nsDialogs.exe
XPStyle on


Var Dialog

Page custom nsDialogsPage
Page instfiles

Function nsDialogsPage
	nsDialogs::Create 1018
	Pop $Dialog

	${If} $Dialog == error
		Abort
	${EndIf}

	nsDialogs::Show
FunctionEnd

Section
SectionEnd

The first call must always be to nsDialogs::Create. It will create a new dialog in the page and return its HWND on the stack. The result must be popped from the stack to prevent stack corruption. If the result is error, the dialog couldn't be created and the page must be aborted!

nsDialogs::Create accepts one parameter. It has a very specific function, but to keep things simple for this tutorial, it must always be 1018.

HWND is a number that uniquely identifies the dialog and can be used with SendMessage, SetCtlColors and Win32 API functions.

The dialog is not fully constructed at this point and you can make modifications to it before it is displayed. To finalize and display the dialog you must call nsDialogs::Show. This function will not return until the user clicks Next, Back or Cancel.

Adding Controls

Compiling the last script and running it results in an empty page which is not very useful. So now we'll add some controls to it to. To do so, we'll use ${NSD_Create*} macros from nsDialogs.nsh. Each of those macros takes 5 parameters - x, y, width, height and text. Each macro also returns one value on the stack, which is the new control's HWND. Like the dialogs HWND, it must be popped from the stack and saved.

Each of the measurements that the macros take can use one of three unit types - pixels, dialog units or percentage of the dialog's size. It can also be negative to indicate it should be measured from the end. To use dialog units, the measurement must be suffixed with the letter u. To use percentage, the measurement must be suffixed with the percentage sign - %. Any other suffix, or no suffix, means pixels.

Dialog units allow creation of dialogs that scale well when different fonts or DPI is used. Its size in pixels is determined at runtime based on the font and the DPI. For example, standard pages in the classic NSIS user interface are 266 dialog units wide and 130 dialog units high. Pages in Modern UI are 300 dialogs units wide and 140 dialog units high. In different resolutions, using different fonts or DPI settings, the dialogs will always have the same size in dialog units, but different size in pixels.

!include nsDialogs.nsh
!include LogicLib.nsh

Name nsDialogs
OutFile nsDialogs.exe
XPStyle on

Var Dialog
Var Label
Var Text

Page custom nsDialogsPage
Page instfiles

Function nsDialogsPage

	nsDialogs::Create 1018
	Pop $Dialog

	${If} $Dialog == error
		Abort
	${EndIf}

	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
	Pop $Label

	${NSD_CreateText} 0 13u 100% -13u "Type something here..."
	Pop $Text

	nsDialogs::Show

FunctionEnd

Section
SectionEnd

Available control types that can be created with ${NSD_Create*} are: HLine, VLine, Label, Icon, Bitmap, BrowseButton, Link, Button, GroupBox, CheckBox, RadioButton (FirstRadioButton and AdditionalRadioButton), Text, MLText, Password, Number, FileRequest, DirRequest, RichEdit, ComboBox, DropList, ListBox, SortedListBox, ProgressBar, Animation, HTrackBar, VTrackBar, UpDown, HotKey, DatePicker, IPAddress, NetAddress.

Control State

Now that we have some controls that the user can interact with, it's time to see what the user actually does with them. For that, we'll first add a "leave callback function" to our page. In that function, we'll query the state of the text control we've created and display it to the user. To do so, we'll use the ${NSD_GetText} macro. Use the ${NSD_GetState} macro for RadioButton and CheckBox controls.

Note that not all controls support ${NSD_GetText} and some require special handling with specific messages defined in WinMessages.nsh. For example, the ListBox control requires usage of LB_GETCURSEL and LB_GETTEXT. With time, the library of macros in nsDialogs.nsh will fill with more and more macros that'll handle more cases like this.

!include nsDialogs.nsh
!include LogicLib.nsh

Name nsDialogs
OutFile nsDialogs.exe
XPStyle on

Var Dialog
Var Label
Var Text

Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage

	nsDialogs::Create 1018
	Pop $Dialog

	${If} $Dialog == error
		Abort
	${EndIf}

	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
	Pop $Label

	${NSD_CreateText} 0 13u 100% -13u "Type something here..."
	Pop $Text

	nsDialogs::Show

FunctionEnd

Function nsDialogsPageLeave

	${NSD_GetText} $Text $0
	MessageBox MB_OK "You typed:$\n$\n$0"

FunctionEnd

Section
SectionEnd

Real-time Notification

One of the more exciting new features of nsDialogs is callback function notification of changes to the dialog. nsDialogs can call a function defined in a script in response to a user action such as changing of a text field or click of a button. To make nsDialogs notify us of events, we'll use ${NSD_OnClick} and ${NSD_OnChange}. Not every control supports both of the events. For example, there is nothing to notify about label changes, only clicks.

When the callback function is called, the control's HWND will be waiting on the stack and must be popped to prevent stack corruption. In this simple example, this is not so useful. But in case of a bigger script where several controls are associated with the same callback function, the HWND can shed some light on which control originated the event.

The new example will respond to the user typing "hello" in the text box.

!include nsDialogs.nsh
!include LogicLib.nsh

Name nsDialogs
OutFile nsDialogs.exe
XPStyle on

Var Dialog
Var Label
Var Text

Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage

	nsDialogs::Create 1018
	Pop $Dialog

	${If} $Dialog == error
		Abort
	${EndIf}

	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
	Pop $Label

	${NSD_CreateText} 0 13u 100% -13u "Type something here..."
	Pop $Text
	${NSD_OnChange} $Text nsDialogsPageTextChange

	nsDialogs::Show

FunctionEnd

Function nsDialogsPageLeave

	${NSD_GetText} $Text $0
	MessageBox MB_OK "You typed:$\n$\n$0"

FunctionEnd

Function nsDialogsPageTextChange

	Pop $1 # $1 == $ Text

	${NSD_GetText} $Text $0

	${If} $0 == "hello"

		MessageBox MB_OK "right back at ya!"

	${EndIf}

FunctionEnd

Section
SectionEnd

Memory

So far we have a page that has some basic input controls. But what happens when the user goes to the next page and comes back? With the current code, the user's input will not be remembered. To remember, we'll use the already present leave callback function to store the user's choice in variables and pass these values when creating the controls the next time. For a better example, we'll also add a checkbox to the page and use ${NSD_GetState} and ${NSD_SetState} to get and set its state.

For clarity, we'll remove some of the notifications from the previous step.

!include nsDialogs.nsh
!include LogicLib.nsh

Name nsDialogs
OutFile nsDialogs.exe
XPStyle on

Var Dialog
Var Label
Var Text
Var Text_State
Var Checkbox
Var Checkbox_State

Page custom nsDialogsPage nsDialogsPageLeave
Page license
Page instfiles

Function .onInit

	StrCpy $Text_State "Type something here..."

FunctionEnd

Function nsDialogsPage

	nsDialogs::Create 1018
	Pop $Dialog

	${If} $Dialog == error
		Abort
	${EndIf}

	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
	Pop $Label

	${NSD_CreateText} 0 13u 100% 12u $Text_State
	Pop $Text

	${NSD_CreateCheckbox} 0 30u 100% 10u "&Something"
	Pop $Checkbox

	${If} $Checkbox_State == ${BST_CHECKED}
		${NSD_Check} $Checkbox
	${EndIf}

	# alternative for the above ${If}:
	#${NSD_SetState} $Checkbox_State

	nsDialogs::Show

FunctionEnd

Function nsDialogsPageLeave

	${NSD_GetText} $Text $Text_State
	${NSD_GetState} $Checkbox $Checkbox_State

FunctionEnd

Section
SectionEnd

Function Reference

Create

nsDialogs::Create rect

Creates a new dialog. rect specific the identifier of the control whose location will be mimiced. This should usually be 1018, which is control mimiced for creation of built-in pages. The Modern UI also has control 1044 for the welcome and the finish page.

Returns the new dialog's HWND on the stack or error.

CreateControl

nsDialogs::CreateControl class style extended_style x y width height text

Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.

Returns the new control's HWND on the stack or error.

Show

nsDialogs::Show

Displays the page. Call this once finished with nsDialogs::Create, nsDialogs::CreateControl and the rest.

Returns nothing.

SelectFileDialog

nsDialogs::SelectFileDialog mode initial_selection filter

Displays a file selection dialog to the user. If mode is set to save, displays a file save dialog. If mode is set to open, displays a file open dialog.

initial_selection can be used to provide the user with a default file to look for and/or a default folder to look in. If initial_selection is empty no default filename will be provided for the user and the dialog will start in the current working directory. If initial_selection specifies just a filename, for example "test.exe", the dialog will be set up to look for a file called test.exe in the current working directory. If initial_selection specifies just a directory, for example "C:\Program Files", the dialog starts in the provided directory with no file name provided. If initial_selection specifies a directory and a filename, for example "C:\Windows\System32\calc.exe", the dialog will be set up to look for a file called calc.exe in the directory C:\Windows\System32.

filter is a list of available file filter pairs separated by pipes. A filter pair consists of a display string and a DOS-style wildcard pattern. If an empty string is passed, the default is used ("All Files|*.*").

Returns the selected file on the stack or an empty string if the user canceled the operation.

nsDialogs::SelectFileDialog open "$DOCUMENTS\Config.ini" ".ini files|*.ini|All Files|*.*"
Pop $0
StrCmp $0 "" ...

SelectFolderDialog

nsDialogs::SelectFolderDialog title initial_selection

Displays a directory selection dialog to the user.

Returns the selected directory on the stack or "error" in case the user canceled the operation or an error occurred.

SetRTL

nsDialogs::SetRTL rtl_setting

Sets right-to-left mode on or off. If rtl_setting is 0, it's set to off. If rtl_setting is 1, it's set to on. This function must be called before any calls to nsDialogs::CreateControl.

Returns nothing.

GetUserData

nsDialogs::GetUserData control_HWND

Returns user data associated with the control on the stack. Use nsDialogs::SetUserData to set this data.

SetUserData

nsDialogs::SetUserData control_HWND data

Associates data with the control. Use nsDialogs::GetUserData to get this data.

Returns nothing.

OnBack

nsDialogs::OnBack function_address

Sets the callback function for the Back button. This function will be called when the user clicks the back button. Call Abort in this function to prevent the user from going back to the last page.

Use GetFunctionAddress to get the address of the desired callback function.

Returns nothing.

OnChange

nsDialogs::OnChange control_HWND function_address

Sets a change notification callback function for the given control. Whenever the control changes, the function will be called and the control's HWND will be waiting on its stack.

Use GetFunctionAddress to get the address of the desired callback function.

Returns nothing.

OnClick

nsDialogs::OnClick control_HWND function_address

Sets a click notification callback function for the given control. Whenever the control is clicked, the function will be called and the control's HWND will be waiting on its stack.

Use GetFunctionAddress to get the address of the desired callback function.

Returns nothing.

OnNotify

nsDialogs::OnNotify control_HWND function_address

Sets a notification callback function for the given control. Whenever the control receives the WM_NOTIFY message, the function will be called and the control's HWND, notification code and a pointer to the NMHDR structure will be waiting on its stack. Use ${NSD_Return} to return a value.

Use GetFunctionAddress to get the address of the desired callback function.

Returns nothing.

CreateTimer

nsDialogs::CreateTimer function_address timer_interval

Sets a timer that'd call the callback function for the given control every in a constant interval. Interval times are specified in milliseconds.

Use GetFunctionAddress to get the address of the desired callback function.

Returns nothing.

KillTimer

nsDialogs::KillTimer function_address

Kills a previously set timer.

Use GetFunctionAddress to get the address of the desired callback function.

Returns nothing.

Macro Reference

nsDialogs.nsh contains a lot of macros that can make nsDialogs usage a lot easier. Below is a description of each of those macros including purpose, syntax, input and output.

NSD_Create*

${NSD_Create*} x y width height text

Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.

Available variants:

  • ${NSD_CreateHLine}
  • ${NSD_CreateVLine}
  • ${NSD_CreateLabel}
  • ${NSD_CreateIcon}
  • ${NSD_CreateBitmap}
  • ${NSD_CreateBrowseButton}
  • ${NSD_CreateLink}
  • ${NSD_CreateButton}
  • ${NSD_CreateGroupBox}
  • ${NSD_CreateCheckBox}
  • ${NSD_CreateRadioButton} (${NSD_CreateFirstRadioButton} and ${NSD_CreateAdditionalRadioButton})
  • ${NSD_CreateText}
  • ${NSD_CreateMLText}
  • ${NSD_CreatePassword}
  • ${NSD_CreateNumber}
  • ${NSD_CreateFileRequest}
  • ${NSD_CreateDirRequest}
  • ${NSD_CreateRichEdit}
  • ${NSD_CreateComboBox}
  • ${NSD_CreateDropList}
  • ${NSD_CreateListBox}
  • ${NSD_CreateSortedListBox}
  • ${NSD_CreateProgressBar}
  • ${NSD_CreateAnimation}
  • ${NSD_CreateHTrackBar}
  • ${NSD_CreateVTrackBar}
  • ${NSD_CreateUpDown}
  • ${NSD_CreateHotKey}
  • ${NSD_CreateDatePicker} (Requires IE 3.1 and ${NSD_InitCommonControlsEx})
  • ${NSD_CreateIPAddress} (Requires IE 4 and ${NSD_InitCommonControl_IPAddress})
  • ${NSD_CreateNetAddress} (Requires Vista and ${NSD_InitCommonControl_NetAddress})

Returns the new control's HWND on the stack or error

NSD_OnBack

${NSD_OnBack} function_name

See OnBack for more details.

NSD_OnChange

${NSD_OnChange} control_HWND function_name

See OnChange for more details.

See Real-time Notification for usage example.

NSD_OnClick

${NSD_OnClick} control_HWND function_name

See OnClick for more details.

NSD_OnNotify

${NSD_OnNotify} control_HWND function_name

See OnNotify for more details.

NSD_Return

${NSD_Return} value

Used to return a value back to Windows from a OnNotify callback.

NSD_SetFocus

${NSD_SetFocus} control_HWND

Sets focus to a control.

NSD_CreateTimer

${NSD_CreateTimer} function_name timer_interval

See CreateTimer for more details.

NSD_KillTimer

${NSD_KillTimer} function_name

See KillTimer for more details.

NSD_AddStyle

${NSD_AddStyle} control_HWND style

Adds one or more window styles to a control. Multiple styles should be separated with pipes `|'.

See MSDN for shared and per-control style descriptions.

NSD_AddExStyle

${NSD_AddExStyle} control_HWND style

Adds one or more extended window styles to a control. Multiple styles should be separated with pipes `|'.

See MSDN for style descriptions.

NSD_RemoveStyle

${NSD_RemoveStyle} control_HWND style

Removes one or more window styles from a control.

NSD_RemoveExStyle

${NSD_RemoveExStyle} control_HWND style

Removes one or more extended window styles from a control.

NSD_GetText

${NSD_GetText} control_HWND $output_variable

Retrieves the text of a control and stores it into output_variable. Especially useful for textual controls.

See Control State for usage example.

NSD_SetText

${NSD_SetText} control_HWND text

Sets the text of a control.

NSD_Edit_SetTextLimit

${NSD_Edit_SetTextLimit} control_HWND limit

Sets the input length limit for a text control.

NSD_Edit_SetReadOnly

${NSD_Edit_SetReadOnly} control_HWND readonly

1 to make the text control read-only or 0 to allow the user to input data.

NSD_Edit_SetCueBannerText

${NSD_Edit_SetCueBannerText} control_HWND displaywhenfocused text

Set a text hint displayed when the control is empty. The text is only visible on WinXP and later. Requires XPStyle on.

NSD_RichEd_SetTextLimit

${NSD_RichEd_SetTextLimit} control_HWND limit

Sets the input length limit.

NSD_RichEd_SetEventMask

${NSD_RichEd_SetEventMask} control_HWND eventmask

NSD_RichEd_SetCustomBackgroundColor

${NSD_RichEd_SetCustomBackgroundColor} control_HWND COLORREF

NSD_GetState

${NSD_GetState} control_HWND $output_variable

Retrieves the state of a check box or a radio button control. Possible outputs are ${BST_CHECKED} and ${BST_UNCHECKED}.

See Memory for usage example.

NSD_SetState

${NSD_SetState} control_HWND state

Sets the state of a check box or a radio button control. Possible values for state are ${BST_CHECKED} and ${BST_UNCHECKED}.

See Memory for usage example.

NSD_Check

${NSD_Check} control_HWND

Checks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_CHECKED}.

NSD_Uncheck

${NSD_Uncheck} control_HWND

Unchecks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_UNCHECKED}.

See Memory for usage example.

NSD_CB_AddString

${NSD_CB_AddString} combo_HWND string

Adds a string to a combo box.

NSD_CB_InsertString

${NSD_CB_InsertString} combo_HWND index string

${NSD_CB_PrependString} combo_HWND string

${NSD_CB_AppendString} combo_HWND string

Insert a string in a specified position in a combo box.

NSD_CB_SelectString

${NSD_CB_SelectString} combo_HWND string

Selects an item that begins with the characters in the string. Use NSD_CB_SelectStringExact to match the complete string.

NSD_CB_GetCount

${NSD_CB_GetCount} combo_HWND $output_variable

NSD_LB_AddString

${NSD_LB_AddString} listbox_HWND string

Adds a string to a list box.

NSD_LB_InsertString

${NSD_LB_InsertString} listbox_HWND index string

${NSD_LB_PrependString} listbox_HWND string

${NSD_LB_AppendString} listbox_HWND string

Insert a string in a specified position in a list box.

NSD_LB_DelString

${NSD_LB_DelString} listbox_HWND string

Deletes a string from a list box.

NSD_LB_DelItem

${NSD_LB_DelItem} listbox_HWND itemindex

Deletes a string from a list box.

NSD_LB_Clear

${NSD_LB_Clear} listbox_HWND

Deletes all strings from a list box.

NSD_LB_GetCount

${NSD_LB_GetCount} listbox_HWND $output_variable

Retrieves the number of strings from a list box.

NSD_LB_SelectString

${NSD_LB_SelectString} listbox_HWND string

Selects a string in a list box.

NSD_LB_GetSelection

${NSD_LB_GetSelection} listbox_HWND $output_variable

Retrieves the selected string from a list box. Returns an empty string if no string is selected.

NSD_Anim_OpenFile

${NSD_Anim_OpenFile} anim_HWND avi_path

Opens the specified (silent) .AVI movie clip.

NSD_Anim_Play

${NSD_Anim_Play} anim_HWND

Plays the movie clip repeatedly.

NSD_Anim_Stop

${NSD_Anim_Stop} anim_HWND

Stops playback.

NSD_TrackBar_GetPos

${NSD_TrackBar_GetPos} track_HWND $output

NSD_TrackBar_SetPos

${NSD_TrackBar_SetPos} track_HWND pos

NSD_TrackBar_SetRangeMin

${NSD_TrackBar_SetRangeMin} track_HWND minpos

NSD_TrackBar_SetRangeMax

${NSD_TrackBar_SetRangeMax} track_HWND maxpos

NSD_TrackBar_SetTicFreq

${NSD_TrackBar_SetTicFreq} track_HWND frequency

Sets the interval frequency for tick marks.

NSD_UD_SetBuddy

${NSD_UD_SetBuddy} ud_HWND buddy_HWND

NSD_UD_GetPos

${NSD_UD_GetPos} ud_HWND $output

NSD_UD_SetPos

${NSD_UD_SetPos} ud_HWND pos

NSD_UD_SetPackedRange

${NSD_UD_SetPackedRange} ud_HWND packedrange

Sets the min-max range. Two signed 16-bit numbers packed into 32-bits.

NSD_HK_GetHotKey

${NSD_HK_GetHotKey} hk_HWND $output

Bits 0..7 specify the virtual key code and bits 8..15 specify the HOTKEYF modifier flags.

NSD_HK_SetHotKey

${NSD_HK_SetHotKey} hk_HWND packedhotkey

NSD_Date_GetDateFields

${NSD_Date_GetDateFields} HWND

Returns the month, day and year on the stack.

NSD_SetBitmap

${NSD_SetBitmap} control_HWND image_path $output_variable

Loads a bitmap from image_path and displays it on control_HWND created by ${NSD_CreateBitmap}. The image handle is stored in output_variable and should be freed using ${NSD_FreeBitmap} once no longer necessary.

The image must be extracted to the user's computer prior to calling this macro. A good place to extract images is $PLUGINSDIR.

!include nsDialogs.nsh

Name nsDialogs
OutFile nsDialogs.exe

Page custom nsDialogsImage
Page instfiles

Var Dialog
Var ImageCtrl
Var BmpHandle

Function .onInit
	InitPluginsDir
	File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
FunctionEnd

Function nsDialogsImage
	nsDialogs::Create 1018
	Pop $Dialog

	${If} $Dialog == error
		Abort
	${EndIf}

	${NSD_CreateBitmap} 0 0 100% 100% ""
	Pop $ImageCtrl
	${NSD_SetBitmap} $ImageCtrl $PLUGINSDIR\image.bmp $BmpHandle

	nsDialogs::Show

	${NSD_FreeBitmap} $BmpHandle
FunctionEnd

Section
SectionEnd

NSD_SetStretchedBitmap

${NSD_SetStretchedBitmap} control_HWND image_path $output_variable

Loads and displays a bitmap just like ${NSD_SetImage} but stretches the image to fit the control.

NSD_ClearBitmap

${NSD_ClearBitmap} control_HWND

Clears a bitmap from a image control.

NSD_FreeBitmap

${NSD_FreeImage} image_handle

Frees an image handle previously loaded with ${NSD_SetImage} or ${NSD_SetStretchedBitmap}.

NSD_SetIcon

${NSD_SetIcon} control_HWND image_path $output_variable

Same as ${NSD_SetImage}, but used for loading and setting an icon in a control created by ${NSD_CreateIcon}. The image handle is stored in output_variable and should be freed using ${NSD_FreeIcon} once no longer necessary.

NSD_SetIconFromInstaller

${NSD_SetIconFromInstaller} control_HWND $output_variable

Loads the icon used in the installer and displays it on control_HWND created by ${NSD_CreateIcon}. The image handle is stored in output_variable and should be freed using ${NSD_FreeIcon} once no longer necessary.

NSD_ClearIcon

${NSD_ClearIcon} control_HWND

Clears an icon from a control.

NSD_FreeIcon

${NSD_FreeIcon} icon_handle

Frees an icon handle previously loaded with ${NSD_SetIcon} or ${NSD_SetIconFromInstaller}.

FAQ

  • Q: Can nsDialogs handle InstallOptions INI files?

    A: nsDialogs.nsh contains a function called CreateDialogFromINI that can create nsDialogs' dialog from an INI file. It can handle every type of control InstallOptions supports, but doesn't handle the flags or notifications. Examples\nsDialogs\InstallOptions.nsi shows a usage example of this function.

nsis-3.11/Contrib/nsDialogs/SConscript000077500000000000000000000012071477201124000177500ustar00rootroot00000000000000target = 'nsDialogs' files = Split(""" browse.c input.c nsDialogs.c nsDialogs.def rtl.c """) resources = Split(""" dialog.rc """) libs = Split(""" kernel32 user32 gdi32 shell32 comdlg32 ole32 """) docs = Split(""" Readme.html """) examples = Split(""" example.nsi InstallOptions.nsi timer.nsi welcome.nsi """) includes = Split(""" nsDialogs.nsh """) Import('BuildPlugin env PerformPluginExtrasDistOperationOnce') unicodetarget = 'UNICODE' in env['CPPDEFINES'] BuildPlugin(target, files, libs, examples, docs, res = resources) if PerformPluginExtrasDistOperationOnce(env, unicodetarget): env.DistributeInclude(includes) nsis-3.11/Contrib/nsDialogs/browse.c000077500000000000000000000100521477201124000174010ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/10/2007 #include #include #include // nsis plugin #include #include "defs.h" #ifndef COUNTOF #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #endif int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) { if (uMsg == BFFM_INITIALIZED) SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); return 0; } void __declspec(dllexport) SelectFolderDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { BROWSEINFO bi; TCHAR result[MAX_PATH]; TCHAR initial[MAX_PATH]; TCHAR title[1024]; LPITEMIDLIST resultPIDL; EXDLL_INIT(); if (popstringn(title, COUNTOF(initial))) { pushstring(_T("error")); return; } if (popstringn(initial, COUNTOF(title))) { pushstring(_T("error")); return; } bi.hwndOwner = hwndParent; bi.pidlRoot = NULL; bi.pszDisplayName = result; bi.lpszTitle = title; #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif bi.ulFlags = BIF_STATUSTEXT | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM) initial; bi.iImage = 0; /*if (pField->pszRoot) { LPSHELLFOLDER sf; ULONG eaten; LPITEMIDLIST root; int ccRoot = (lstrlen(pField->pszRoot) * 2) + 2; LPWSTR pwszRoot = (LPWSTR) MALLOC(ccRoot); MultiByteToWideChar(CP_ACP, 0, pField->pszRoot, -1, pwszRoot, ccRoot); SHGetDesktopFolder(&sf); sf->ParseDisplayName(hConfigWindow, NULL, pwszRoot, &eaten, &root, NULL); bi.pidlRoot = root; sf->Release(); FREE(pwszRoot); }*/ resultPIDL = SHBrowseForFolder(&bi); if (!resultPIDL) { pushstring(_T("error")); return; } if (SHGetPathFromIDList(resultPIDL, result)) { pushstring(result); } else { pushstring(_T("error")); } CoTaskMemFree(resultPIDL); } void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { OPENFILENAME ofn={0,}; int save; TCHAR type[5]; static TCHAR path[1024]; static TCHAR filter[1024+1]; static TCHAR currentDirectory[1024]; static TCHAR initialDir[1024]; DWORD gfa; EXDLL_INIT(); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndParent; ofn.lpstrFilter = filter; ofn.lpstrFile = path; ofn.nMaxFile = COUNTOF(path); //ofn.Flags = pField->nFlags & (OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_CREATEPROMPT | OFN_EXPLORER); ofn.Flags = OFN_CREATEPROMPT | OFN_EXPLORER; popstringn(type, COUNTOF(type)); popstringn(path, COUNTOF(path)); popstringn(filter, COUNTOF(filter)-1); save = !lstrcmpi(type, _T("save")); // Check if the path given is a folder. If it is we initialize the // ofn.lpstrInitialDir parameter gfa = GetFileAttributes(path); if ((gfa != INVALID_FILE_ATTRIBUTES) && (gfa & FILE_ATTRIBUTE_DIRECTORY)) { lstrcpy(initialDir, path); ofn.lpstrInitialDir = initialDir; path[0] = _T('\0'); // disable initial file selection as path is actually a directory } if (!filter[0]) { lstrcpy(filter, _T("All Files|*.*")); } { // Convert the filter to the format required by Windows: NULL after each // item followed by a terminating NULL TCHAR *p = filter; while (*p) { if (*p == _T('|')) { *p++ = 0; } else { p = CharNext(p); } } p++; *p = 0; } GetCurrentDirectory(COUNTOF(currentDirectory), currentDirectory); // save working dir if ((save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn))) { pushstring(path); } else if (CommDlgExtendedError() == FNERR_INVALIDFILENAME) { *path = _T('\0'); if ((save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn))) { pushstring(path); } else { pushstring(_T("")); } } else { pushstring(_T("")); } // restore working dir // OFN_NOCHANGEDIR doesn't always work (see MSDN) SetCurrentDirectory(currentDirectory); } nsis-3.11/Contrib/nsDialogs/defs.h000077500000000000000000000025521477201124000170340ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/24/2007 #ifndef __NS_DIALOGS__DEFS_H__ #define __NS_DIALOGS__DEFS_H__ #include #define NSDFUNC WINAPI #define GetVar(vars, varlen, varid) ( (vars) + ((varid) * (varlen)) ) #define DlgRet(hDlg, val) ( SetWindowLongPtr((hDlg), DWLP_MSGRESULT, (val)) | TRUE ) #define StrToIntPtr nsishelper_str_to_ptr typedef int nsFunction; enum nsControlType { NSCTL_UNKNOWN, NSCTL_BUTTON, NSCTL_EDIT, NSCTL_COMBOBOX, NSCTL_LISTBOX, NSCTL_RICHEDIT, NSCTL_RICHEDIT2, NSCTL_STATIC, NSCTL_LINK, NSCTL_TREE }; struct nsDialogCallbacks { nsFunction onBack; }; #define DLG_CALLBACK_IDX(x) (FIELD_OFFSET(struct nsDialogCallbacks, x)/sizeof(nsFunction)) struct nsControlCallbacks { nsFunction onClick; nsFunction onChange; nsFunction onNotify; }; #define CTL_CALLBACK_IDX(x) (FIELD_OFFSET(struct nsControlCallbacks, x)/sizeof(nsFunction)) #define USERDATA_SIZE 1024 struct nsControl { HWND window; enum nsControlType type; TCHAR userData[USERDATA_SIZE]; struct nsControlCallbacks callbacks; WNDPROC oldWndProc; }; struct nsDialog { HWND hwDialog; HWND hwParent; WNDPROC parentOriginalWndproc; BOOL rtl; struct nsDialogCallbacks callbacks; unsigned controlCount; struct nsControl* controls; }; #define NSCONTROL_ID_PROP _T("NSIS: nsControl pointer property") #endif//__NS_DIALOGS__DEFS_H__ nsis-3.11/Contrib/nsDialogs/dialog.rc000077500000000000000000000035161477201124000175300ustar00rootroot00000000000000#define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // 1 DIALOG DISCARDABLE 0, 0, 57, 41 STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG1, DIALOG STYLE DS_CONTROL | WS_CHILD BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 50 TOPMARGIN, 7 BOTTOMMARGIN, 34 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/nsDialogs/example.nsi000077500000000000000000000166341477201124000201160ustar00rootroot00000000000000Name "nsDialogs Example" OutFile "nsDialogs Example.exe" Caption "$(^Name)" Unicode True XPStyle on RequestExecutionLevel user !include nsDialogs.nsh !include LogicLib.nsh !include WinCore.nsh ; MAKELONG LicenseText "All the action takes place on the next page..." "Start" SubCaption 0 ": Ready?" Page license Page custom nsDialogsPage Page custom LBPage Page custom RangesPage Page custom NotifyPage Page custom RadioPage RadioLeave !pragma warning disable 8000 ; "Page instfiles not used, no sections will be executed!" Var BUTTON Var EDIT Var CHECKBOX Function nsDialogsPage nsDialogs::Create 1018 Pop $0 GetFunctionAddress $0 OnBack nsDialogs::OnBack $0 ${NSD_CreateButton} 0 0 100% 12u Test Pop $BUTTON GetFunctionAddress $0 OnClick nsDialogs::OnClick $BUTTON $0 ${NSD_CreateText} 0 35 100% 12u hello Pop $EDIT GetFunctionAddress $0 OnChange nsDialogs::OnChange $EDIT $0 ${NSD_Edit_SetCueBannerText} $EDIT 0 "Type 'hello there' and get a free surprise" ${NSD_CreateCheckbox} 0 -50 100% 8u Test Pop $CHECKBOX GetFunctionAddress $0 OnCheckbox nsDialogs::OnClick $CHECKBOX $0 ${NSD_CreateLabel} 0 40u 75% 40u "* Type `hello there` above.$\n* Click the button.$\n* Check the checkbox.$\n* Hit the Back button." Pop $0 nsDialogs::Show FunctionEnd Function OnClick Pop $0 # HWND MessageBox MB_OK clicky FunctionEnd Function OnChange Pop $0 # HWND System::Call user32::GetWindowText(p$EDIT,t.r0,i${NSIS_MAX_STRLEN}) ${If} $0 == "hello there" MessageBox MB_OK "right back at ya" ${EndIf} FunctionEnd Function OnBack MessageBox MB_YESNO "are you sure?" IDYES +2 Abort FunctionEnd Function OnCheckbox Pop $0 # HWND MessageBox MB_OK "checkbox clicked" FunctionEnd !macro BeginControlsTestPage title nsDialogs::Create 1018 Pop $0 ${NSD_SetText} $hWndParent "$(^Name): ${title}" !macroend !macro CreateButton x y w h txt var handler data ${NSD_CreateButton} ${x} ${y} ${w} ${h} "${txt}" Pop ${var} nsDialogs::SetUserData ${var} ${data} ${NSD_OnClick} ${var} ${handler} !macroend Function LBPage !insertmacro BeginControlsTestPage "ListBox" ${NSD_CreateSortedListBox} 1u 0 -2u 70u "" Pop $1 ${NSD_LB_AddString} $1 "Foo" ${NSD_LB_AddString} $1 "Bar" StrCpy $9 1 ${NSD_CreateText} 1u 75u -2u 12u "New item #$9" Pop $EDIT !insertmacro CreateButton 1u 90u 50u 12u "Add (&Sorted)" $0 LBAction Add !insertmacro CreateButton 53u 90u 50u 12u "&Prepend" $0 LBAction Prepend !insertmacro CreateButton 105u 90u 50u 12u "&Append" $0 LBAction Append !insertmacro CreateButton 160u 90u 50u 12u "&Delete Last" $0 LBAction DL !insertmacro CreateButton 215u 90u 50u 12u "&Clear" $0 LBAction Clear nsDialogs::Show FunctionEnd Function LBAction Pop $0 nsDialogs::GetUserData $0 Pop $0 ${NSD_GetText} $EDIT $8 ${Select} $0 ${Case} "Add" ${NSD_LB_AddString} $1 $8 ${Case} "Prepend" ${NSD_LB_PrependString} $1 $8 ${Case} "Append" ${NSD_LB_AppendString} $1 $8 ${Case} "DL" ${NSD_LB_GetCount} $1 $8 ${If} $8 U> 0 IntOp $8 $8 - 1 ${NSD_LB_DelItem} $1 $8 ${EndIf} Return ${Case} "Clear" ${NSD_LB_Clear} $1 Return ${EndSelect} IntOp $9 $9 + 1 ${NSD_SetText} $EDIT "New item #$9" FunctionEnd Function RangesPage !insertmacro BeginControlsTestPage "Ranges" ${NSD_CreateHTrackBar} 1 0 -2 20u "" Pop $1 ${NSD_TrackBar_SetRangeMax} $1 10 ${NSD_TrackBar_SetTicFreq} $1 1 ${NSD_TrackBar_SetPos} $1 3 StrCpy $9 20 ; Progress pos ${NSD_CreateProgressBar} 1 25u -2 8u "" Pop $2 ${NSD_CreateTimer} RangesTimer 1000 ${NSD_CreateNumber} 1 40u 50u 12u "42" Pop $3 ${NSD_CreateUpDown} 0 0 0 0 "" Pop $4 ${NSD_UD_SetBuddy} $4 $3 ${MAKELONG} $5 $0 50 0 ; 0..50 ${NSD_UD_SetPackedRange} $4 $5 nsDialogs::Show FunctionEnd Function RangesTimer IntOp $9 $9 + 5 ${IfThen} $9 > 100 ${|} StrCpy $9 0 ${|} ${NSD_ProgressBar_SetPos} $2 $9 FunctionEnd Function NotifyPage !insertmacro BeginControlsTestPage "WM_NOTIFY" nsDialogs::CreateControl "${__NSD_RichEdit_CLASS_20A}" "${__NSD_RichEdit_STYLE}" "${__NSD_RichEdit_EXSTYLE}" 1 1 -2 50u "" ; Forcing ANSI control, see forums.winamp.com/showthread.php?p=3169999 Pop $9 ${NSD_OnNotify} $9 OnNotify IntOp $8 ${ENM_LINK} | ${ENM_KEYEVENTS} ${NSD_RichEd_SetEventMask} $9 $8 SendMessage $9 ${EM_AUTOURLDETECT} 1 0 ${NSD_SetText} $9 "{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard http://nsis.sf.net\par {\b Click the link!}\par\par Type something and I will block every other character...}" ${NSD_InitCommonControlsEx} ${ICC_DATE_CLASSES} ${NSD_CreateDatePicker} 1% 55u 48% 12u "" Pop $1 ${NSD_OnNotify} $1 onDateTimeNotify ${NSD_CreateLabel} 51% 56u 48% 12u "Change the date..." Pop $9 /* ${NSD_CreateCalendar} 1% 23% 150u 90u "" Pop $1 ${NSD_AddStyle} $1 ${MCS_NOTODAY} System::Call 'USER32::SendMessage(p$1, i${MCM_GETMINREQRECT}, p0, @r2)' System::Call '*$2(i,i,i.r2,i.r3)' #System::Call 'USER32::SendMessage(p$1, i${MCM_GETMAXTODAYWIDTH}, p0, *i0r4)' #${IfThen} $4 > $2 ${|} StrCpy $2 $4 ${|} System::Call 'USER32::SetWindowPos(p$1,p0,i,i,ir2,ir3,i0x16)' */ nsDialogs::Show FunctionEnd Function OnNotify Pop $1 ; HWND Pop $2 ; Code Pop $3 ; NMHDR* ${If} $2 = ${EN_LINK} System::Call '*$3(p,p,p,p.r2,p,p,i.r4,i.r5)' ; Extract from ENLINK* ${IfThen} $2 <> ${WM_LBUTTONDOWN} ${|} Return ${|} IntOp $2 $5 - $4 System::Call '*(ir4,ir5,l,&t$2,i)p.r2' ; Create TEXTRANGE and a text buffer ${If} $2 P<> 0 IntPtrOp $3 $2 + 16 ; Find buffer System::Call '*$2(i,i,p$3)' ; Set buffer in TEXTRANGE SendMessage $1 ${EM_GETTEXTRANGE} "" $2 $4 ${If} $4 <> 0 System::Call 'SHELL32::ShellExecute(p$hWndParent, p0, pr3, p0, p0, i 1)' ${EndIf} System::Free $2 ${EndIf} ${ElseIf} $2 = ${EN_MSGFILTER} Var /Global Toggle System::Call '*$3(p,i,i,i.r4)' ; MSGFILTER->msg ${If} $4 = ${WM_CHAR} IntOp $Toggle $Toggle ^ 1 ${If} $Toggle & 1 ${NSD_Return} 1 ${EndIf} ${EndIf} ${EndIf} FunctionEnd Function onDateTimeNotify Pop $1 ; HWND Pop $2 ; Code Pop $3 ; NMHDR* ${If} $2 = ${DTN_DATETIMECHANGE} System::Call 'USER32::SendMessage(p$1, i${DTM_GETSYSTEMTIME}, p0, @r3)i.r0' ${If} $0 = ${GDT_VALID} System::Call '*$3(&i2.R1, &i2.R2, &i2, &i2.R3, &i2, &i2, &i2, &i2)' ; SYSTEMTIME StrCpy $0 "$R1/$R2/$R3" ${Else} StrCpy $0 "N/A" ${EndIf} ${NSD_SetText} $9 $0 ${EndIf} FunctionEnd Function RadioPage !insertmacro BeginControlsTestPage "Radio buttons" ; Group 1 ${NSD_CreateFirstRadioButton} 4u 0 40% 6% "NPR" Pop $1 ${NSD_OnClick} $1 onStationChanged ${NSD_CreateAdditionalRadioButton} 4u 12% 40% 6% "BBC" Pop $2 ${NSD_OnClick} $2 onStationChanged ${NSD_CreateLabel} 4u 30u 80% 12u "" Pop $3 ; Group 2 ${NSD_CreateFirstRadioButton} 4u 50u 50% 12u "FM" Pop $4 ${NSD_CreateAdditionalRadioButton} 4u 64u 50% 12u "AM" Pop $5 SendMessage $4 ${BM_CLICK} "" "" ; Must select a default SendMessage $2 ${BM_CLICK} "" "" ; Must select a default nsDialogs::Show FunctionEnd Function onStationChanged Pop $0 ${NSD_GetText} $0 $0 ${If} $0 == "NPR" ${NSD_SetText} $3 "America, f*(# yeah!" ${Else} ${NSD_SetText} $3 "Keep Calm and Carry On" ${EndIf} FunctionEnd Function RadioLeave ${NSD_GetChecked} $5 $0 ${If} $0 <> 0 MessageBox MB_YESNO "Are you sure you want to keep living in the past?" IDYES +2 Abort ${EndIf} FunctionEnd Section SectionEnd nsis-3.11/Contrib/nsDialogs/input.c000077500000000000000000000027431477201124000172470ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/24/2007 #include #include // nsis plugin #include "input.h" #include "defs.h" #include "rtl.h" extern struct nsDialog g_dialog; static int NSDFUNC ConvertPlacement(TCHAR *str, int total, int height) { TCHAR unit = *CharPrev(str, str + lstrlen(str)); int x = myatoi(str); if (unit == _T('%')) { if (x < 0) { return MulDiv(total, 100 + x, 100); } return MulDiv(total, x, 100); } else if (unit == _T('u')) { RECT r; r.left = r.top = x; r.right = r.bottom = 0; MapDialogRect(g_dialog.hwParent, &r); if (height) return x >= 0 ? r.top : total + r.top; else return x >= 0 ? r.left : total + r.left; } if (x < 0) { return total + x; } return x; } int NSDFUNC PopPlacement(int *x, int *y, int *width, int *height) { RECT dialogRect; int dialogWidth; int dialogHeight; TCHAR buf[1024]; GetClientRect(g_dialog.hwDialog, &dialogRect); dialogWidth = dialogRect.right; dialogHeight = dialogRect.bottom; if (popstringn(buf, 1024)) return 1; *x = ConvertPlacement(buf, dialogWidth, 0); if (popstringn(buf, 1024)) return 1; *y = ConvertPlacement(buf, dialogHeight, 1); if (popstringn(buf, 1024)) return 1; *width = ConvertPlacement(buf, dialogWidth, 0); if (popstringn(buf, 1024)) return 1; *height = ConvertPlacement(buf, dialogHeight, 1); ConvertPosToRTL(x, *width, dialogWidth); return 0; } nsis-3.11/Contrib/nsDialogs/input.h000077500000000000000000000003631477201124000172500ustar00rootroot00000000000000// Reviewed for Unicode support by Jim Park -- 08/24/2007 #ifndef __NS_DIALOGS__INPUT_H__ #define __NS_DIALOGS__INPUT_H__ #include "defs.h" int NSDFUNC PopPlacement(int *x, int *y, int *width, int *height); #endif//__NS_DIALOGS__INPUT_H__ nsis-3.11/Contrib/nsDialogs/nsDialogs.c000077500000000000000000000376511477201124000200410ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/10/2007 #include #include // nsis plugin #include "defs.h" #include "input.h" #include "rtl.h" #ifndef ODS_NOACCEL #define ODS_NOACCEL 0x0100 #define ODS_NOFOCUSRECT 0x0200 #endif #ifndef DT_HIDEPREFIX #define DT_HIDEPREFIX 0x00100000 #endif HINSTANCE g_hInstance; struct nsDialog g_dialog; extra_parameters* g_pluginParms; LPTSTR g_callbackRetVar; static COLORREF GetLinkColor() { COLORREF clr = GetSysColor(COLOR_HOTLIGHT); #ifndef _WIN64 // COLOR_HOTLIGHT is Win98/2000+. GetSysColorBrush is the correct way to // detect valid colors but here we just assume nobody uses black. if (!clr) clr = RGB(0,0,255); #endif return clr; } struct nsControl* NSDFUNC GetControl(HWND hwCtl) { unsigned id = (unsigned)(UINT_PTR) GetProp(hwCtl, NSCONTROL_ID_PROP); if (id == 0 || id > g_dialog.controlCount) { return NULL; } return &g_dialog.controls[id - 1]; } INT_PTR CALLBACK ParentProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { INT_PTR res; if (message == WM_NOTIFY_OUTER_NEXT) { if (wParam == (WPARAM)-1) { if (g_pluginParms->ExecuteCodeSegment(g_dialog.callbacks.onBack - 1, 0)) { return 0; } } } res = CallWindowProc(g_dialog.parentOriginalWndproc, hwnd, message, wParam, lParam); if (message == WM_NOTIFY_OUTER_NEXT && !res) { DestroyWindow(g_dialog.hwDialog); HeapFree(GetProcessHeap(), 0, g_dialog.controls); g_dialog.hwDialog = NULL; g_dialog.controls = NULL; } return res; } LRESULT CALLBACK LinkWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct nsControl* ctl = GetControl(hwnd); if(ctl == NULL) return 0; if(message == WM_SETCURSOR) { SetCursor(LoadCursor(NULL, IDC_HAND)); return TRUE; } return CallWindowProc(ctl->oldWndProc, hwnd, message, wParam, lParam); } INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // handle notifications case WM_COMMAND: { HWND hwCtl = GetDlgItem(hwndDlg, LOWORD(wParam)); struct nsControl* ctl = GetControl(hwCtl); if (ctl == NULL) break; if (HIWORD(wParam) == BN_CLICKED && (ctl->type == NSCTL_BUTTON || ctl->type == NSCTL_LINK)) { if (ctl->callbacks.onClick) { pushintptr((INT_PTR) hwCtl); g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onClick - 1, 0); } } else if (HIWORD(wParam) == EN_CHANGE && ctl->type == NSCTL_EDIT) { if (ctl->callbacks.onChange) { pushintptr((INT_PTR) hwCtl); g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0); } } else if (HIWORD(wParam) == LBN_SELCHANGE && ctl->type == NSCTL_LISTBOX) { if (ctl->callbacks.onChange) { pushintptr((INT_PTR) hwCtl); g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0); } } else if ((HIWORD(wParam) == CBN_EDITUPDATE || HIWORD(wParam) == CBN_SELCHANGE) && ctl->type == NSCTL_COMBOBOX) { if (ctl->callbacks.onChange) { pushintptr((INT_PTR) hwCtl); g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0); } } else if (HIWORD(wParam) == STN_CLICKED && ctl->type == NSCTL_STATIC) { if (ctl->callbacks.onClick) { pushintptr((INT_PTR) hwCtl); g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onClick - 1, 0); } } break; } case WM_NOTIFY: { LPNMHDR nmhdr = (LPNMHDR) lParam; struct nsControl* ctl = GetControl(nmhdr->hwndFrom); int *pFlag = &g_pluginParms->exec_flags->silent, orgFlag, ret; // The silent flag can only be changed in .onInit and custom pages will not be displayed in silent mode so we can use this flag in the callback if (ctl == NULL) break; if (!ctl->callbacks.onNotify) break; orgFlag = *pFlag, *pFlag = 0; pushintptr((INT_PTR) nmhdr); pushintptr(nmhdr->code); pushintptr((INT_PTR) nmhdr->hwndFrom); g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onNotify - 1, 0); ret = *pFlag, *pFlag = orgFlag; if (ret) return DlgRet(hwndDlg, StrToIntPtr(g_callbackRetVar)); } break; // handle links case WM_DRAWITEM: { DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; RECT rc; TCHAR text[1024]; // http://blogs.msdn.com/oldnewthing/archive/2005/05/03/414317.aspx#414357 // says we should call SystemParametersInfo(SPI_GETKEYBOARDCUES,...) to make // sure, does not seem to be required, might be a win2k bug, or it might // only apply to menus BOOL hideFocus = (lpdis->itemState & ODS_NOFOCUSRECT); BOOL hideAccel = (lpdis->itemState & ODS_NOACCEL); struct nsControl* ctl = GetControl(lpdis->hwndItem); if (ctl == NULL) break; // We need lpdis->rcItem later rc = lpdis->rcItem; // Get button's text text[0] = _T('\0'); GetWindowText(lpdis->hwndItem, text, 1024); // Calculate needed size of the control DrawText(lpdis->hDC, text, -1, &rc, DT_VCENTER | DT_WORDBREAK | DT_CALCRECT); // Make some more room so the focus rect won't cut letters off rc.right = min(rc.right + 2, lpdis->rcItem.right); // Move rect to right if in RTL mode if (g_dialog.rtl) { rc.left += lpdis->rcItem.right - rc.right; rc.right += lpdis->rcItem.right - rc.right; } if (lpdis->itemAction & ODA_DRAWENTIRE) { DWORD xtraDrawStyle = (g_dialog.rtl ? DT_RTLREADING : 0); if (hideAccel) xtraDrawStyle |= DT_HIDEPREFIX; // Use the system color unless the user has set another using SetCtlColors if (!GetWindowLongPtr(lpdis->hwndItem, GWLP_USERDATA)) SetTextColor(lpdis->hDC, GetLinkColor()); // Draw the text DrawText(lpdis->hDC, text, -1, &rc, xtraDrawStyle | DT_CENTER | DT_VCENTER | DT_WORDBREAK); } // Draw the focus rect if needed if (((lpdis->itemState & ODS_FOCUS) && (lpdis->itemAction & ODA_DRAWENTIRE)) || (lpdis->itemAction & ODA_FOCUS)) { // NB: when not in DRAWENTIRE mode, this will actually toggle the focus // rectangle since it's drawn in a XOR way if (!hideFocus) DrawFocusRect(lpdis->hDC, &rc); } return TRUE; } // handle colors case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: case WM_CTLCOLORBTN: case WM_CTLCOLORLISTBOX: // let the NSIS window handle colors, it knows best return SendMessage(g_dialog.hwParent, uMsg, wParam, lParam); // bye bye case WM_DESTROY: { unsigned i; for (i = 0; i < g_dialog.controlCount; i++) { RemoveProp(g_dialog.controls[i].window, NSCONTROL_ID_PROP); } break; } } return FALSE; } static UINT_PTR PluginCallback(enum NSPIM msg) { return 0; } void __declspec(dllexport) Create(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwPlacementRect; RECT rcPlacement; EXDLL_INIT(); extra->RegisterPluginCallback(g_hInstance, PluginCallback); g_dialog.hwParent = hwndParent; g_pluginParms = extra; g_callbackRetVar = GetVar(variables, string_size, 31); // The undocumented $_OUTDIR variable hwPlacementRect = GetDlgItem(hwndParent, popint()); GetWindowRect(hwPlacementRect, &rcPlacement); MapWindowPoints(NULL, hwndParent, (LPPOINT) &rcPlacement, 2); g_dialog.hwDialog = CreateDialog(g_hInstance, MAKEINTRESOURCE(1), hwndParent, DialogProc); if (g_dialog.hwDialog == NULL) { pushstring(_T("error")); return; } SetWindowPos( g_dialog.hwDialog, 0, rcPlacement.left, rcPlacement.top, rcPlacement.right - rcPlacement.left, rcPlacement.bottom - rcPlacement.top, SWP_NOZORDER | SWP_NOACTIVATE ); g_dialog.parentOriginalWndproc = (WNDPROC) SetWindowLongPtr(hwndParent, DWLP_DLGPROC, (LONG_PTR) ParentProc); g_dialog.rtl = FALSE; g_dialog.controlCount = 0; g_dialog.controls = (struct nsControl*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 0); g_dialog.callbacks.onBack = 0; pushintptr((INT_PTR) g_dialog.hwDialog); } void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { TCHAR *className; TCHAR *text; HWND hwItem; int x, y, width, height; DWORD style, exStyle; size_t id; // get info from stack className = (TCHAR *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (g_stringsize * 2)*sizeof(TCHAR)); text = &className[g_stringsize]; if (!className) { pushstring(_T("error")); return; } if (popstringn(className, 0)) { pushstring(_T("error")); HeapFree(GetProcessHeap(), 0, className); return; } style = (DWORD) popint_or(); exStyle = (DWORD) popint_or(); PopPlacement(&x, &y, &width, &height); if (popstringn(text, 0)) { pushstring(_T("error")); HeapFree(GetProcessHeap(), 0, className); return; } // create item descriptor id = g_dialog.controlCount; g_dialog.controlCount++; g_dialog.controls = (struct nsControl*) HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, g_dialog.controls, g_dialog.controlCount * sizeof(struct nsControl)); if (!lstrcmpi(className, _T("BUTTON"))) g_dialog.controls[id].type = NSCTL_BUTTON; else if (!lstrcmpi(className, _T("EDIT"))) g_dialog.controls[id].type = NSCTL_EDIT; else if (!lstrcmpi(className, _T("COMBOBOX"))) g_dialog.controls[id].type = NSCTL_COMBOBOX; else if (!lstrcmpi(className, _T("LISTBOX"))) g_dialog.controls[id].type = NSCTL_LISTBOX; else if (!lstrcmpi(className, _T("RichEdit"))) g_dialog.controls[id].type = NSCTL_RICHEDIT; else if (!lstrcmpi(className, _T("RICHEDIT_CLASS"))) g_dialog.controls[id].type = NSCTL_RICHEDIT2; else if (!lstrcmpi(className, _T("STATIC"))) g_dialog.controls[id].type = NSCTL_STATIC; else if (!lstrcmpi(className, _T("LINK"))) g_dialog.controls[id].type = NSCTL_LINK; else g_dialog.controls[id].type = NSCTL_UNKNOWN; // apply rtl to style ConvertStyleToRTL(g_dialog.controls[id].type, &style, &exStyle); // create item's window hwItem = CreateWindowEx( exStyle, lstrcmpi(className, _T("LINK")) ? className : _T("BUTTON"), text, style, x, y, width, height, g_dialog.hwDialog, (HMENU) (1200 + id), g_hInstance, NULL); g_dialog.controls[id].window = hwItem; // remember id SetProp(hwItem, NSCONTROL_ID_PROP, (HANDLE) (id + 1)); // set font SendMessage(hwItem, WM_SETFONT, SendMessage(g_dialog.hwParent, WM_GETFONT, 0, 0), TRUE); // set the WndProc for the link control if(g_dialog.controls[id].type == NSCTL_LINK) g_dialog.controls[id].oldWndProc = (WNDPROC) SetWindowLongPtr(hwItem, GWLP_WNDPROC, (LONG_PTR) LinkWndProc); // push back result pushintptr((INT_PTR) hwItem); // done HeapFree(GetProcessHeap(), 0, className); } // for backward compatibility (2.29 had CreateItem) void __declspec(dllexport) CreateItem(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { CreateControl(hwndParent, string_size, variables, stacktop, extra); } void __declspec(dllexport) SetUserData(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwCtl; struct nsControl* ctl; // get info from stack hwCtl = (HWND) popintptr(); if (!IsWindow(hwCtl)) { popintptr(); // remove user data from stack return; } // get descriptor ctl = GetControl(hwCtl); if (ctl == NULL) return; // set user data popstringn(ctl->userData, USERDATA_SIZE); } void __declspec(dllexport) GetUserData(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwCtl; struct nsControl* ctl; // get info from stack hwCtl = (HWND) popintptr(); if (!IsWindow(hwCtl)) { pushstring(_T("")); return; } // get descriptor ctl = GetControl(hwCtl); if (ctl == NULL) { pushstring(_T("")); return; } // return user data pushstring(ctl->userData); } void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { // we use a timer proc instead of WM_TIMER to make sure no one messes with the ids but us g_pluginParms->ExecuteCodeSegment((int)(idEvent - 1), 0); } void __declspec(dllexport) CreateTimer(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { UINT callback; UINT interval; // get info from stack callback = popint(); interval = popint(); if (!callback || !interval) return; // create timer SetTimer( g_dialog.hwDialog, callback, interval, TimerProc); } void nsdKillTimer(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { UINT id; // get timer id from stack id = popint(); // kill timer KillTimer(g_dialog.hwDialog, id); } void NSDFUNC SetControlCallback(size_t callbackIdx) { HWND hwCtl; nsFunction callback; nsFunction* callbacks; struct nsControl* ctl; // get info from stack hwCtl = (HWND) popintptr(); callback = (nsFunction) popint(); if (!IsWindow(hwCtl)) return; // get descriptor ctl = GetControl(hwCtl); if (ctl == NULL) return; // set callback callbacks = (nsFunction*) &ctl->callbacks; callbacks[callbackIdx] = callback; } void NSDFUNC SetDialogCallback(size_t callbackIdx) { nsFunction callback; nsFunction* callbacks; // get info from stack callback = (nsFunction) popint(); // set callback callbacks = (nsFunction*) &g_dialog.callbacks; callbacks[callbackIdx] = callback; } void __declspec(dllexport) OnClick(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { SetControlCallback(CTL_CALLBACK_IDX(onClick)); } void __declspec(dllexport) OnChange(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { SetControlCallback(CTL_CALLBACK_IDX(onChange)); } void __declspec(dllexport) OnNotify(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { SetControlCallback(CTL_CALLBACK_IDX(onNotify)); } void __declspec(dllexport) OnBack(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { SetDialogCallback(DLG_CALLBACK_IDX(onBack)); } void __declspec(dllexport) Show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { // tell NSIS to remove old inner dialog and pass handle of the new inner dialog SendMessage(hwndParent, WM_NOTIFY_CUSTOM_READY, (WPARAM) g_dialog.hwDialog, 0); ShowWindow(g_dialog.hwDialog, SW_SHOWNA); // message loop while (g_dialog.hwDialog) { MSG msg; GetMessage(&msg, NULL, 0, 0); if (!IsDialogMessage(g_dialog.hwDialog, &msg) && !IsDialogMessage(g_dialog.hwParent, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } // reset wndproc SetWindowLongPtr(hwndParent, DWLP_DLGPROC, (LONG_PTR) g_dialog.parentOriginalWndproc); } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance = hInst; return TRUE; } nsis-3.11/Contrib/nsDialogs/nsDialogs.def000077500000000000000000000000631477201124000203400ustar00rootroot00000000000000LIBRARY nsDialogs EXPORTS KillTimer=nsdKillTimernsis-3.11/Contrib/nsDialogs/nsDialogs.nsh000077500000000000000000001307021477201124000203760ustar00rootroot00000000000000/* nsDialogs.nsh Header file for creating custom installer pages with nsDialogs */ !ifndef NSDIALOGS_INCLUDED !verbose push 2 !define NSDIALOGS_INCLUDED !verbose 3 !include LogicLib.nsh !include WinMessages.nsh !define /ifndef WS_EX_DLGMODALFRAME 0x00000001 !define /ifndef WS_EX_NOPARENTNOTIFY 0x00000004 !define /ifndef WS_EX_TOPMOST 0x00000008 !define /ifndef WS_EX_ACCEPTFILES 0x00000010 !define /ifndef WS_EX_TRANSPARENT 0x00000020 !define /ifndef WS_EX_MDICHILD 0x00000040 !define /ifndef WS_EX_TOOLWINDOW 0x00000080 !define /ifndef WS_EX_WINDOWEDGE 0x00000100 !define /ifndef WS_EX_CLIENTEDGE 0x00000200 !define /ifndef WS_EX_CONTEXTHELP 0x00000400 !define /ifndef WS_EX_RIGHT 0x00001000 !define /ifndef WS_EX_LEFT 0x00000000 !define /ifndef WS_EX_RTLREADING 0x00002000 !define /ifndef WS_EX_LTRREADING 0x00000000 !define /ifndef WS_EX_LEFTSCROLLBAR 0x00004000 !define /ifndef WS_EX_RIGHTSCROLLBAR 0x00000000 !define /ifndef WS_EX_CONTROLPARENT 0x00010000 !define /ifndef WS_EX_STATICEDGE 0x00020000 !define /ifndef WS_EX_APPWINDOW 0x00040000 !define /ifndef WS_CHILD 0x40000000 !define /ifndef WS_VISIBLE 0x10000000 !define /ifndef WS_DISABLED 0x08000000 !define /ifndef WS_CLIPSIBLINGS 0x04000000 !define /ifndef WS_CLIPCHILDREN 0x02000000 !define /ifndef WS_MAXIMIZE 0x01000000 !define /ifndef WS_BORDER 0x00800000 !define /ifndef WS_VSCROLL 0x00200000 !define /ifndef WS_HSCROLL 0x00100000 !define /ifndef WS_GROUP 0x00020000 !define /ifndef WS_MINIMIZEBOX 0x00020000 !define /ifndef WS_MAXIMIZEBOX 0x00010000 !define /ifndef WS_TABSTOP 0x00010000 !define ES_LEFT 0x00000000 !define ES_CENTER 0x00000001 !define ES_RIGHT 0x00000002 !define ES_MULTILINE 0x00000004 !define ES_UPPERCASE 0x00000008 !define ES_LOWERCASE 0x00000010 !define ES_PASSWORD 0x00000020 !define ES_AUTOVSCROLL 0x00000040 !define ES_AUTOHSCROLL 0x00000080 !define ES_NOHIDESEL 0x00000100 !define ES_OEMCONVERT 0x00000400 !define ES_READONLY 0x00000800 !define ES_WANTRETURN 0x00001000 !define ES_NUMBER 0x00002000 !define ES_SAVESEL 0x00008000 !define SS_LEFT 0x00000000 !define SS_CENTER 0x00000001 !define SS_RIGHT 0x00000002 !define SS_ICON 0x00000003 !define SS_BLACKRECT 0x00000004 !define SS_GRAYRECT 0x00000005 !define SS_WHITERECT 0x00000006 !define SS_BLACKFRAME 0x00000007 !define SS_GRAYFRAME 0x00000008 !define SS_WHITEFRAME 0x00000009 !define SS_USERITEM 0x0000000A !define SS_SIMPLE 0x0000000B !define SS_LEFTNOWORDWRAP 0x0000000C !define SS_OWNERDRAW 0x0000000D !define SS_BITMAP 0x0000000E !define SS_ENHMETAFILE 0x0000000F !define SS_ETCHEDHORZ 0x00000010 !define SS_ETCHEDVERT 0x00000011 !define SS_ETCHEDFRAME 0x00000012 !define SS_TYPEMASK 0x0000001F !define SS_REALSIZECONTROL 0x00000040 !define SS_NOPREFIX 0x00000080 !define SS_NOTIFY 0x00000100 !define SS_CENTERIMAGE 0x00000200 !define SS_RIGHTJUST 0x00000400 !define SS_REALSIZEIMAGE 0x00000800 !define SS_SUNKEN 0x00001000 !define SS_EDITCONTROL 0x00002000 !define SS_ENDELLIPSIS 0x00004000 !define SS_PATHELLIPSIS 0x00008000 !define SS_WORDELLIPSIS 0x0000C000 !define SS_ELLIPSISMASK 0x0000C000 !define BS_PUSHBUTTON 0x00000000 !define BS_DEFPUSHBUTTON 0x00000001 !define BS_CHECKBOX 0x00000002 !define BS_AUTOCHECKBOX 0x00000003 !define BS_RADIOBUTTON 0x00000004 !define BS_3STATE 0x00000005 !define BS_AUTO3STATE 0x00000006 !define BS_GROUPBOX 0x00000007 !define BS_USERBUTTON 0x00000008 !define BS_AUTORADIOBUTTON 0x00000009 !define BS_PUSHBOX 0x0000000A !define BS_OWNERDRAW 0x0000000B !define BS_TYPEMASK 0x0000000F !define BS_LEFTTEXT 0x00000020 !define BS_TEXT 0x00000000 !define BS_ICON 0x00000040 !define BS_BITMAP 0x00000080 !define BS_LEFT 0x00000100 !define BS_RIGHT 0x00000200 !define BS_CENTER 0x00000300 !define BS_TOP 0x00000400 !define BS_BOTTOM 0x00000800 !define BS_VCENTER 0x00000C00 !define BS_PUSHLIKE 0x00001000 !define BS_MULTILINE 0x00002000 !define BS_NOTIFY 0x00004000 !define BS_FLAT 0x00008000 !define BS_RIGHTBUTTON ${BS_LEFTTEXT} !define CBS_SIMPLE 0x0001 !define CBS_DROPDOWN 0x0002 !define CBS_DROPDOWNLIST 0x0003 !define CBS_OWNERDRAWFIXED 0x0010 !define CBS_OWNERDRAWVARIABLE 0x0020 !define CBS_AUTOHSCROLL 0x0040 !define CBS_OEMCONVERT 0x0080 !define CBS_SORT 0x0100 !define CBS_HASSTRINGS 0x0200 !define CBS_NOINTEGRALHEIGHT 0x0400 !define CBS_DISABLENOSCROLL 0x0800 !define CBS_UPPERCASE 0x2000 !define CBS_LOWERCASE 0x4000 !define LBS_NOTIFY 0x0001 !define LBS_SORT 0x0002 !define LBS_NOREDRAW 0x0004 !define LBS_MULTIPLESEL 0x0008 !define LBS_OWNERDRAWFIXED 0x0010 !define LBS_OWNERDRAWVARIABLE 0x0020 !define LBS_HASSTRINGS 0x0040 !define LBS_USETABSTOPS 0x0080 !define LBS_NOINTEGRALHEIGHT 0x0100 !define LBS_MULTICOLUMN 0x0200 !define LBS_WANTKEYBOARDINPUT 0x0400 !define LBS_EXTENDEDSEL 0x0800 !define LBS_DISABLENOSCROLL 0x1000 !define LBS_NODATA 0x2000 !define LBS_NOSEL 0x4000 !define LBS_COMBOBOX 0x8000 !define ACS_CENTER 0x0001 !define ACS_TRANSPARENT 0x0002 ; The parent of the animation control must not have the WS_CLIPCHILDREN style !define ACS_AUTOPLAY 0x0004 !define ACS_TIMER 0x0008 ; < CC6 !define TBS_AUTOTICKS 0x0001 !define TBS_VERT 0x0002 !define TBS_HORZ 0x0000 !define TBS_TOP 0x0004 !define TBS_BOTTOM 0x0000 !define TBS_LEFT 0x0004 !define TBS_RIGHT 0x0000 !define TBS_BOTH 0x0008 !define TBS_NOTICKS 0x0010 !define TBS_ENABLESELRANGE 0x0020 !define TBS_FIXEDLENGTH 0x0040 !define TBS_NOTHUMB 0x0080 !define TBS_TOOLTIPS 0x0100 ; IE3 !define TBS_REVERSED 0x0200 ; IE5 !define TBS_DOWNISLEFT 0x0400 ; _WIN32_IE >= 0x0501 !define TBS_NOTIFYBEFOREMOVE 0x0800 ; IE6? !define TBS_TRANSPARENTBKGND 0x1000 ; Vista !define UDS_WRAP 0x0001 !define UDS_SETBUDDYINT 0x0002 !define UDS_ALIGNRIGHT 0x0004 !define UDS_ALIGNLEFT 0x0008 !define UDS_AUTOBUDDY 0x0010 !define UDS_ARROWKEYS 0x0020 !define UDS_HORZ 0x0040 !define UDS_NOTHOUSANDS 0x0080 !define UDS_HOTTRACK 0x0100 ; 98+ !define MCS_DAYSTATE 0x0001 !define MCS_MULTISELECT 0x0002 !define MCS_WEEKNUMBERS 0x0004 !define MCS_NOTODAYCIRCLE 0x0008 !define MCS_NOTODAY 0x0010 ; IE4+? !define MCS_NOTRAILINGDATES 0x0040 ; Vista+ !define MCS_SHORTDAYSOFWEEK 0x0080 ; Vista+ !define MCS_NOSELCHANGEONNAV 0x0100 ; Vista+ !define DTS_UPDOWN 0x01 !define DTS_SHOWNONE 0x02 !define DTS_SHORTDATEFORMAT 0x00 !define DTS_LONGDATEFORMAT 0x04 !define DTS_SHORTDATECENTURYFORMAT 0x0C !define DTS_TIMEFORMAT 0x09 !define DTS_APPCANPARSE 0x10 !define DTS_RIGHTALIGN 0x20 !define /ifndef LR_DEFAULTCOLOR 0x0000 !define /ifndef LR_MONOCHROME 0x0001 !define /ifndef LR_COLOR 0x0002 !define /ifndef LR_COPYRETURNORG 0x0004 !define /ifndef LR_COPYDELETEORG 0x0008 !define /ifndef LR_LOADFROMFILE 0x0010 !define /ifndef LR_LOADTRANSPARENT 0x0020 !define /ifndef LR_DEFAULTSIZE 0x0040 !define /ifndef LR_VGACOLOR 0x0080 !define /ifndef LR_LOADMAP3DCOLORS 0x1000 !define /ifndef LR_CREATEDIBSECTION 0x2000 !define /ifndef LR_COPYFROMRESOURCE 0x4000 !define /ifndef LR_SHARED 0x8000 !define /ifndef IMAGE_BITMAP 0 !define /ifndef IMAGE_ICON 1 !define /ifndef IMAGE_CURSOR 2 !define /ifndef IMAGE_ENHMETAFILE 3 !define /ifndef GWL_STYLE -16 !define /ifndef GWL_EXSTYLE -20 #define /ifndef ICC_LISTVIEW_CLASSES 0x0001 ; SysListView32 and SysHeader32 #define /ifndef ICC_TREEVIEW_CLASSES 0x0002 ; SysTabControl32 and tooltips_class32 #define /ifndef ICC_BAR_CLASSES 0x0004 ; ToolbarWindow32, msctls_statusbar32, msctls_trackbar32 and tooltips_class32 #define /ifndef ICC_TAB_CLASSES 0x0008 ; SysTabControl32 and tooltips_class32 #define /ifndef ICC_UPDOWN_CLASS 0x0010 ; msctls_updown32 #define /ifndef ICC_PROGRESS_CLASS 0x0020 ; msctls_progress32 #define /ifndef ICC_HOTKEY_CLASS 0x0040 ; msctls_hotkey32 #define /ifndef ICC_ANIMATE_CLASS 0x0080 ; SysAnimate32 #define /ifndef ICC_WIN95_CLASSES 0x00FF !define /ifndef ICC_DATE_CLASSES 0x0100 ; CC4.70+ (NT4+/IE3.1+/Win95 OSR2) SysDateTimePick32, SysMonthCal32 and CC6.10+(Vista+) DropDown !define /ifndef ICC_USEREX_CLASSES 0x0200 ; CC4.??+ (NT4+/IE3.?+/Win95 OSR2) ComboBoxEx32 !define /ifndef ICC_COOL_CLASSES 0x0400 ; CC4.70+ (NT4+/IE3.1+/Win95 OSR2) ReBarWindow32 !define /ifndef ICC_INTERNET_CLASSES 0x0800 ; CC4.71+ (IE4+) SysIPAddress32 !define /ifndef ICC_PAGESCROLLER_CLASS 0x1000 ; CC4.71+ (IE4+) SysPager !define /ifndef ICC_NATIVEFNTCTL_CLASS 0x2000 ; CC4.71+ (IE4+) NativeFontCtl !define /ifndef ICC_STANDARD_CLASSES 0x4000 ; WinXP+ Button, Static, Edit, ListBox, ComboBox, ComboLBox, ScrollBar and ReaderModeCtl !define /ifndef ICC_LINK_CLASS 0x8000 ; WinXP+ SysLink !define DEFAULT_STYLES ${WS_CHILD}|${WS_VISIBLE}|${WS_CLIPSIBLINGS} !define __NSD_HLine_CLASS STATIC !define __NSD_HLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDHORZ}|${SS_SUNKEN} !define __NSD_HLine_EXSTYLE ${WS_EX_TRANSPARENT} !define __NSD_VLine_CLASS STATIC !define __NSD_VLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDVERT}|${SS_SUNKEN} !define __NSD_VLine_EXSTYLE ${WS_EX_TRANSPARENT} !define __NSD_Label_CLASS STATIC !define __NSD_Label_STYLE ${DEFAULT_STYLES}|${SS_NOTIFY} !define __NSD_Label_EXSTYLE ${WS_EX_TRANSPARENT} !define __NSD_Icon_CLASS STATIC !define __NSD_Icon_STYLE ${DEFAULT_STYLES}|${SS_ICON}|${SS_NOTIFY} !define __NSD_Icon_EXSTYLE 0 !define __NSD_Bitmap_CLASS STATIC !define __NSD_Bitmap_STYLE ${DEFAULT_STYLES}|${SS_BITMAP}|${SS_NOTIFY} !define __NSD_Bitmap_EXSTYLE 0 !define __NSD_BrowseButton_CLASS BUTTON !define __NSD_BrowseButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} !define __NSD_BrowseButton_EXSTYLE 0 !define __NSD_Link_CLASS LINK !define __NSD_Link_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_OWNERDRAW} !define __NSD_Link_EXSTYLE 0 !define __NSD_Button_CLASS BUTTON !define __NSD_Button_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} !define __NSD_Button_EXSTYLE 0 !define __NSD_GroupBox_CLASS BUTTON !define __NSD_GroupBox_STYLE ${DEFAULT_STYLES}|${BS_GROUPBOX} !define __NSD_GroupBox_EXSTYLE ${WS_EX_TRANSPARENT} !define __NSD_CheckBox_CLASS BUTTON !define __NSD_CheckBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTOCHECKBOX}|${BS_MULTILINE} !define __NSD_CheckBox_EXSTYLE 0 !define __NSD_RadioButton_CLASS BUTTON !define __NSD_RadioButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE} !define __NSD_RadioButton_EXSTYLE 0 !define __NSD_FirstRadioButton_CLASS ${__NSD_RadioButton_CLASS} !define __NSD_FirstRadioButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_GROUP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE} !define __NSD_FirstRadioButton_EXSTYLE ${__NSD_RadioButton_EXSTYLE} !define __NSD_AdditionalRadioButton_CLASS ${__NSD_RadioButton_CLASS} !define __NSD_AdditionalRadioButton_STYLE ${DEFAULT_STYLES}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE} !define __NSD_AdditionalRadioButton_EXSTYLE ${__NSD_RadioButton_EXSTYLE} !define __NSD_Text_CLASS EDIT !define __NSD_Text_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL} !define __NSD_Text_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_MLText_CLASS EDIT !define __NSD_MLText_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_AUTOVSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${WS_HSCROLL}|${WS_VSCROLL} !define __NSD_MLText_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_Password_CLASS EDIT !define __NSD_Password_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_PASSWORD} !define __NSD_Password_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_Number_CLASS EDIT !define __NSD_Number_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_NUMBER} !define __NSD_Number_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_FileRequest_CLASS EDIT !define __NSD_FileRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL} !define __NSD_FileRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_DirRequest_CLASS EDIT !define __NSD_DirRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL} !define __NSD_DirRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_RichEdit_CLASS_10 "RICHEDIT" ; 1.0 (Riched32.dll) Win95/NT4 !define __NSD_RichEdit_CLASS_20A "RICHEDIT20A" ; 2.0 (Riched20.dll) Win98/NT4 (NSIS makes sure this is registered even on Windows 95) !define __NSD_RichEdit_CLASS_20W "RICHEDIT20W" !define __NSD_RichEdit_CLASS_41W "RICHEDIT50W" ; 4.1 (MsftEdit.DLL) WinXP.SP1 !ifdef NSIS_UNICODE !define /ifndef __NSD_RichEdit_CLASS ${__NSD_RichEdit_CLASS_20W} !else !define /ifndef __NSD_RichEdit_CLASS ${__NSD_RichEdit_CLASS_20A} !endif !define __NSD_RichEdit_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_AUTOVSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_SAVESEL}|${WS_HSCROLL}|${WS_VSCROLL} !define __NSD_RichEdit_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_ComboBox_CLASS COMBOBOX !define __NSD_ComboBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWN} !define __NSD_ComboBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_DropList_CLASS COMBOBOX !define __NSD_DropList_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWNLIST} !define __NSD_DropList_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_ListBox_CLASS LISTBOX !define __NSD_ListBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${LBS_DISABLENOSCROLL}|${LBS_HASSTRINGS}|${LBS_NOINTEGRALHEIGHT}|${LBS_NOTIFY} !define __NSD_ListBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_SortedListBox_CLASS LISTBOX !define __NSD_SortedListBox_STYLE ${__NSD_ListBox_STYLE}|${LBS_SORT} !define __NSD_SortedListBox_EXSTYLE ${__NSD_ListBox_EXSTYLE} !define __NSD_ProgressBar_CLASS msctls_progress32 !define __NSD_ProgressBar_STYLE ${DEFAULT_STYLES} !define __NSD_ProgressBar_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_Animation_CLASS SysAnimate32 !define __NSD_Animation_STYLE ${DEFAULT_STYLES}|${ACS_TRANSPARENT}|${ACS_AUTOPLAY} !define __NSD_Animation_EXSTYLE 0 !define __NSD_HTrackBar_CLASS msctls_trackbar32 !define __NSD_HTrackBar_STYLE ${DEFAULT_STYLES}|${TBS_HORZ}|${TBS_AUTOTICKS}|${TBS_TOOLTIPS} !define __NSD_HTrackBar_EXSTYLE 0 !define __NSD_VTrackBar_CLASS msctls_trackbar32 !define __NSD_VTrackBar_STYLE ${DEFAULT_STYLES}|${TBS_VERT}|${TBS_AUTOTICKS}|${TBS_TOOLTIPS} !define __NSD_VTrackBar_EXSTYLE 0 !define __NSD_UpDown_CLASS msctls_updown32 !define __NSD_UpDown_STYLE ${DEFAULT_STYLES}|${UDS_SETBUDDYINT}|${UDS_ARROWKEYS}|${UDS_NOTHOUSANDS}|${UDS_ALIGNRIGHT} !define __NSD_UpDown_EXSTYLE 0 !define __NSD_AutoUpDown_CLASS msctls_updown32 !define __NSD_AutoUpDown_STYLE ${__NSD_UpDown_STYLE}|${UDS_AUTOBUDDY} !define __NSD_AutoUpDown_EXSTYLE ${__NSD_UpDown_EXSTYLE} !define __NSD_HotKey_CLASS msctls_hotkey32 !define __NSD_HotKey_STYLE ${DEFAULT_STYLES} !define __NSD_HotKey_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_Calendar_CLASS SysMonthCal32 !define __NSD_Calendar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} !define __NSD_Calendar_EXSTYLE 0 !define __NSD_DatePicker_CLASS SysDateTimePick32 !define __NSD_DatePicker_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} !define __NSD_DatePicker_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_TimePicker_CLASS SysDateTimePick32 !define __NSD_TimePicker_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${DTS_TIMEFORMAT} !define __NSD_TimePicker_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !define __NSD_IPAddress_CLASS SysIPAddress32 ; IE4+/CC4.71+ !define __NSD_IPAddress_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} !define __NSD_IPAddress_EXSTYLE 0 !define __NSD_NetAddress_CLASS msctls_netaddress ; Vista+ !define __NSD_NetAddress_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} !define __NSD_NetAddress_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} !macro __NSD_DefineControl NAME !define NSD_Create${NAME} "nsDialogs::CreateControl ${__NSD_${Name}_CLASS} ${__NSD_${Name}_STYLE} ${__NSD_${Name}_EXSTYLE}" !macroend !insertmacro __NSD_DefineControl HLine !insertmacro __NSD_DefineControl VLine !insertmacro __NSD_DefineControl Label !insertmacro __NSD_DefineControl Icon !insertmacro __NSD_DefineControl Bitmap !insertmacro __NSD_DefineControl BrowseButton !insertmacro __NSD_DefineControl Link !insertmacro __NSD_DefineControl Button !insertmacro __NSD_DefineControl GroupBox !insertmacro __NSD_DefineControl CheckBox !insertmacro __NSD_DefineControl RadioButton !insertmacro __NSD_DefineControl FirstRadioButton !insertmacro __NSD_DefineControl AdditionalRadioButton !insertmacro __NSD_DefineControl Text !insertmacro __NSD_DefineControl MLText !insertmacro __NSD_DefineControl Password !insertmacro __NSD_DefineControl Number !insertmacro __NSD_DefineControl FileRequest !insertmacro __NSD_DefineControl DirRequest !insertmacro __NSD_DefineControl RichEdit !insertmacro __NSD_DefineControl ComboBox !insertmacro __NSD_DefineControl DropList !insertmacro __NSD_DefineControl ListBox !insertmacro __NSD_DefineControl SortedListBox !insertmacro __NSD_DefineControl ProgressBar !insertmacro __NSD_DefineControl Animation !insertmacro __NSD_DefineControl HTrackBar !insertmacro __NSD_DefineControl VTrackBar !insertmacro __NSD_DefineControl UpDown !insertmacro __NSD_DefineControl AutoUpDown !insertmacro __NSD_DefineControl HotKey !insertmacro __NSD_DefineControl Calendar !insertmacro __NSD_DefineControl DatePicker !insertmacro __NSD_DefineControl TimePicker !insertmacro __NSD_DefineControl IPAddress !insertmacro __NSD_DefineControl NetAddress !macro __NSD_OnControlEvent EVENT HWND FUNCTION Push $0 Push $1 StrCpy $1 "${HWND}" GetFunctionAddress $0 "${FUNCTION}" nsDialogs::On${EVENT} $1 $0 Pop $1 Pop $0 !macroend !macro __NSD_DefineControlCallback EVENT !define NSD_On${EVENT} `!insertmacro __NSD_OnControlEvent ${EVENT} ` !macroend !macro __NSD_OnDialogEvent EVENT FUNCTION Push $0 GetFunctionAddress $0 "${FUNCTION}" nsDialogs::On${EVENT} $0 Pop $0 !macroend !macro __NSD_DefineDialogCallback EVENT !define NSD_On${EVENT} `!insertmacro __NSD_OnDialogEvent ${EVENT} ` !macroend !insertmacro __NSD_DefineControlCallback Click !insertmacro __NSD_DefineControlCallback Change !insertmacro __NSD_DefineControlCallback Notify !insertmacro __NSD_DefineDialogCallback Back !define NSD_Return "!insertmacro NSD_Return " !macro NSD_Return val StrCpy $_OUTDIR ${val} SetSilent silent Return !macroend !define __NSD_MkCtlCmd "!insertmacro __NSD_MkCtlCmd " !macro __NSD_MkCtlCmd msg wp lp hCtl SendMessage ${hCtl} ${${msg}} ${wp} ${lp} !macroend !define __NSD_MkCtlCmd_WP "!insertmacro __NSD_MkCtlCmd_WP " !macro __NSD_MkCtlCmd_WP msg lp hCtl wp SendMessage ${hCtl} ${${msg}} ${wp} ${lp} !macroend !define __NSD_MkCtlCmd_LP "!insertmacro __NSD_MkCtlCmd_LP " !macro __NSD_MkCtlCmd_LP msg wp hCtl lp SendMessage ${hCtl} ${${msg}} ${wp} ${lp} !macroend !define __NSD_MkCtlCmd_WPLP "!insertmacro __NSD_MkCtlCmd_WPLP " !macro __NSD_MkCtlCmd_WPLP msg hCtl wp lp SendMessage ${hCtl} ${${msg}} ${wp} ${lp} !macroend !define __NSD_MkCtlCmd_RV "!insertmacro __NSD_MkCtlCmd_RV " !macro __NSD_MkCtlCmd_RV msg wp lp hCtl VAR SendMessage ${hCtl} ${${msg}} ${wp} ${lp} ${VAR} !macroend !define NSD_InitCommonControlsEx "!insertmacro __NSD_InitCommonControlsEx " !macro __NSD_InitCommonControlsEx ICC !pragma warning push !pragma warning disable 7070 ; Invalid number !if ${ICC} <> 0 !define /ReDef /IntFmt NSD_InitCommonControlsEx_TEMP "0x%X" ${ICC} System::Call 'COMCTL32::InitCommonControlsEx(*l${NSD_InitCommonControlsEx_TEMP}00000008)' !undef NSD_InitCommonControlsEx_TEMP !else System::Int64Op ${ICC} << 32 System::Int64Op 8 | System::Call 'COMCTL32::InitCommonControlsEx(*ls)' ; INITCOMMONCONTROLSEX as UINT64 !endif !pragma warning pop !macroend !define NSD_InitCommonControl_IPAddress `${NSD_InitCommonControlsEx} ${ICC_INTERNET_CLASSES}` !define NSD_InitCommonControl_NetAddress `System::Call SHELL32::InitNetworkAddressControl()i` !define NSD_InitCommonControl_SysLink `${NSD_InitCommonControlsEx} ${ICC_LINK_CLASS}` !define NSD_CreateTimer `!insertmacro _NSD_CreateTimer ` !macro _NSD_CreateTimer FUNCTION INTERVAL Push $0 GetFunctionAddress $0 "${FUNCTION}" nsDialogs::CreateTimer $0 "${INTERVAL}" Pop $0 !macroend !define NSD_KillTimer `!insertmacro _NSD_KillTimer ` !macro _NSD_KillTimer FUNCTION Push $0 GetFunctionAddress $0 "${FUNCTION}" nsDialogs::KillTimer $0 Pop $0 !macroend !define NSD_AddStyle "!insertmacro _NSD_GWLAddFlags ${GWL_STYLE} " !define NSD_AddExStyle "!insertmacro _NSD_GWLAddFlags ${GWL_EXSTYLE} " !macro _NSD_GWLAddFlags GWL HWND DATA System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s" System::Int64Op "${DATA}" | System::Call "user32::SetWindowLong(p${HWND},p${GWL},ps)" !macroend !define NSD_RemoveStyle "!insertmacro _NSD_GWLRemoveFlags ${GWL_STYLE} " !define NSD_RemoveExStyle "!insertmacro _NSD_GWLRemoveFlags ${GWL_EXSTYLE} " !macro _NSD_GWLRemoveFlags GWL HWND DATA System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s" System::Int64Op "${DATA}" ~ & ; Perform ~ and prepare the stack for & System::Int64Op ; Perform & System::Call "user32::SetWindowLong(p${HWND},i${GWL},ps)" !macroend !define NSD_GetStyle "!insertmacro _NSD_GWLGetFlags ${GWL_STYLE} " !define NSD_GetExStyle "!insertmacro _NSD_GWLGetFlags ${GWL_EXSTYLE} " !macro _NSD_GWLGetFlags GWL HWND RET System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s" Pop ${RET} !macroend !macro __NSD_GetStyleBit GWL BIT HWND RET !insertmacro _NSD_GWLGetFlags ${GWL} ${HWND} ${RET} IntOp ${RET} ${RET} & ${BIT} !macroend !define NSD_SetFocus `!insertmacro __NSD_SetFocus ` !macro __NSD_SetFocus HWND System::Call "user32::SetFocus(p${HWND})" !macroend !define NSD_GetText "!insertmacro __NSD_GetText " !macro __NSD_GetText CONTROL VAR System::Call user32::GetWindowText(p${CONTROL},t.s,i${NSIS_MAX_STRLEN}) Pop ${VAR} !macroend !define NSD_SetText "!insertmacro __NSD_SetText " !macro __NSD_SetText CONTROL TEXT SendMessage ${CONTROL} ${WM_SETTEXT} 0 `STR:${TEXT}` !macroend ### Edit ### !define NSD_Edit_GetTextLimit `${__NSD_MkCtlCmd_RV} EM_GETLIMITTEXT 0 0 ` !define NSD_Edit_SetTextLimit `${__NSD_MkCtlCmd_WP} EM_SETLIMITTEXT 0 ` !define NSD_Edit_SetPasswordChar `${__NSD_MkCtlCmd_WP} EM_SETPASSWORDCHAR 0 ` !define NSD_Edit_GetReadOnly `!insertmacro __NSD_GetStyleBit ${GWL_STYLE} ${ES_READONLY} ` ; Non-zero if read-only !define NSD_Edit_SetReadOnly `${__NSD_MkCtlCmd_WP} EM_SETREADONLY 0 ` ; Toggles the ES_READONLY style !define NSD_Edit_GetModify `${__NSD_MkCtlCmd_RV} EM_GETMODIFY 0 0 ` !define NSD_Edit_SetModify `${__NSD_MkCtlCmd_WP} EM_SETMODIFY 0 ` !define NSD_Edit_EmptyUndoBuffer `${__NSD_MkCtlCmd} EM_EMPTYUNDOBUFFER 0 0 ` !define NSD_Edit_CanUndo `${__NSD_MkCtlCmd_RV} EM_CANUNDO 0 0 ` !define NSD_Edit_ScrollCaret `${__NSD_MkCtlCmd} EM_SCROLLCARET 0 0 ` !define NSD_Edit_LineScroll `${__NSD_MkCtlCmd_WPLP} EM_LINESCROLL ` !define NSD_Edit_SetSel `${__NSD_MkCtlCmd_WPLP} EM_SETSEL ` ; WP:Start LP:End !define NSD_Edit_SetCueBannerText "!insertmacro __NSD_Edit_SetCueBannerText " ; CC6+ !macro __NSD_Edit_SetCueBannerText CONTROL SHOWWHENFOCUSED TEXT !if ${NSIS_CHAR_SIZE} > 1 SendMessage ${CONTROL} ${EM_SETCUEBANNER} ${SHOWWHENFOCUSED} `STR:${TEXT}` !else System::Call 'USER32::SendMessage(p${CONTROL},i${EM_SETCUEBANNER},p${SHOWWHENFOCUSED},ws)' `${TEXT}` ; Must be PWSTR !endif !macroend !define NSD_Edit_GetLineCount `${__NSD_MkCtlCmd_RV} EM_GETLINECOUNT 0 0 ` !define NSD_Edit_GetLine "!insertmacro __NSD_Edit_GetLine " !macro __NSD_Edit_GetLine CONTROL LINEINDEX OUTPUT System::Call '*(&i2 ${NSIS_MAX_STRLEN},&t${NSIS_MAX_STRLEN})p.s' System::Call 'USER32::SendMessage(p${CONTROL},i${EM_GETLINE},p${LINEINDEX},pss)' System::Call 'KERNEL32::lstrcpyn(t.s,pss,i${NSIS_MAX_STRLEN})' Pop ${OUTPUT} System::Free !macroend !define NSD_SetTextLimit `${NSD_Edit_SetTextLimit} ` ; Legacy alias ### RichEdit ### !define NSD_RichEd_SetTextLimit `${__NSD_MkCtlCmd_LP} EM_EXLIMITTEXT 0 ` !define NSD_RichEd_GetEventMask `${__NSD_MkCtlCmd_RV} EM_GETEVENTMASK 0 0 ` !define NSD_RichEd_SetEventMask `${__NSD_MkCtlCmd_LP} EM_SETEVENTMASK 0 ` ; LP:ENM_* !define NSD_RichEd_SetSystemBackgroundColor `${__NSD_MkCtlCmd} EM_SETBKGNDCOLOR 1 0 ` ; COLOR_WINDOW !define NSD_RichEd_SetCustomBackgroundColor `${__NSD_MkCtlCmd_LP} EM_SETBKGNDCOLOR 0 ` ; LP:COLORREF !define NSD_RichEd_SetHideSelection `${__NSD_MkCtlCmd_WP} EM_HIDESELECTION 0 ` ; WP(BOOL):HideSelWithoutFocus (Toggles ES_NOHIDESEL & TXTBIT_HIDESELECTION) ### CheckBox ### !define NSD_GetState `!insertmacro __NSD_GetState ` !macro __NSD_GetState CONTROL VAR SendMessage ${CONTROL} ${BM_GETCHECK} 0 0 ${VAR} !macroend !define NSD_SetState `!insertmacro __NSD_SetState ` !macro __NSD_SetState CONTROL STATE SendMessage ${CONTROL} ${BM_SETCHECK} ${STATE} 0 !macroend !define NSD_Check `!insertmacro __NSD_Check ` !macro __NSD_Check CONTROL ${NSD_SetState} ${CONTROL} ${BST_CHECKED} !macroend !define NSD_Uncheck `!insertmacro __NSD_Uncheck ` !macro __NSD_Uncheck CONTROL ${NSD_SetState} ${CONTROL} ${BST_UNCHECKED} !macroend !define NSD_GetChecked `!insertmacro __NSD_GetState ` !define NSD_SetChecked `!insertmacro __NSD_SetState ` ### ComboBox ### !define NSD_CB_AddString "!insertmacro _NSD_CB_AddString " !macro _NSD_CB_AddString CONTROL STRING SendMessage ${CONTROL} ${CB_ADDSTRING} 0 `STR:${STRING}` !macroend !define NSD_CB_InsertString "!insertmacro _NSD_CB_InsertString " !macro _NSD_CB_InsertString CONTROL INDEX STRING SendMessage ${CONTROL} ${CB_INSERTSTRING} ${INDEX} `STR:${STRING}` !macroend !define NSD_CB_PrependString "!insertmacro _NSD_CB_PrependString " !macro _NSD_CB_PrependString CONTROL STRING SendMessage ${CONTROL} ${CB_INSERTSTRING} 0 `STR:${STRING}` !macroend !define NSD_CB_AppendString "!insertmacro _NSD_CB_AppendString " !macro _NSD_CB_AppendString CONTROL STRING SendMessage ${CONTROL} ${CB_INSERTSTRING} -1 `STR:${STRING}` !macroend !define NSD_CB_SelectString "!insertmacro _NSD_CB_SelectString " !macro _NSD_CB_SelectString CONTROL STRING SendMessage ${CONTROL} ${CB_SELECTSTRING} -1 `STR:${STRING}` !macroend !define NSD_CB_SelectStringExact "!insertmacro _NSD_CB_SelectStringExact " !macro _NSD_CB_SelectStringExact CONTROL STRING !insertmacro _LOGICLIB_TEMP SendMessage ${CONTROL} ${CB_FINDSTRINGEXACT} -1 `STR:${STRING}` $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP -1 +2 SendMessage ${CONTROL} ${CB_SETCURSEL} $_LOGICLIB_TEMP 0 !macroend !define NSD_CB_FindStringExact "!insertmacro _NSD_CB_FindStringExact " !macro _NSD_CB_FindStringExact CONTROL STRING VAR SendMessage ${CONTROL} ${CB_FINDSTRINGEXACT} -1 `STR:${STRING}` ${VAR} !macroend !define NSD_CB_GetSelectionIndex `!insertmacro __NSD_CB_GetSelectionIndex ` !macro __NSD_CB_GetSelectionIndex CONTROL VAR SendMessage ${CONTROL} ${CB_GETCURSEL} 0 0 ${VAR} !macroend !define NSD_CB_SetSelectionIndex `!insertmacro __NSD_CB_SetSelectionIndex ` !macro __NSD_CB_SetSelectionIndex CONTROL INDEX SendMessage ${CONTROL} ${CB_SETCURSEL} ${INDEX} 0 !macroend !define NSD_CB_GetItemData `!insertmacro __NSD_CB_GetItemData ` !macro __NSD_CB_GetItemData CONTROL INDEX VAR SendMessage ${CONTROL} ${CB_GETITEMDATA} ${INDEX} 0 ${VAR} !macroend !define NSD_CB_SetItemData `${__NSD_MkCtlCmd_WPLP} CB_SETITEMDATA ` ; Index Data !define NSD_CB_DelItem `${__NSD_MkCtlCmd_WP} CB_DELETESTRING 0 ` !define NSD_CB_LimitText `${__NSD_MkCtlCmd_WP} CB_LIMITTEXT 0 ` !define /IfNDef NSD_CB_Clear `${__NSD_MkCtlCmd} CB_RESETCONTENT 0 0 ` !define /IfNDef NSD_CB_GetCount `${__NSD_MkCtlCmd_RV} CB_GETCOUNT 0 0 ` !ifndef NSD_CB_DelString !define NSD_CB_DelString `!insertmacro __NSD_CB_DelString ` !macro __NSD_CB_DelString CONTROL STRING System::Call 'USER32::SendMessage(p${CONTROL},i${CB_FINDSTRINGEXACT},p-1,ts)p.s' `${STRING}` System::Call 'USER32::SendMessage(p${CONTROL},i${CB_DELETESTRING},ps,p0)' !macroend !endif ;define /IfNDef NSD_CB_GetSelection ### ListBox ### !define NSD_LB_AddString "!insertmacro _NSD_LB_AddString " !macro _NSD_LB_AddString CONTROL STRING SendMessage ${CONTROL} ${LB_ADDSTRING} 0 `STR:${STRING}` !macroend !define NSD_LB_InsertString "!insertmacro _NSD_LB_InsertString " !macro _NSD_LB_InsertString CONTROL INDEX STRING SendMessage ${CONTROL} ${LB_INSERTSTRING} ${INDEX} `STR:${STRING}` !macroend !define NSD_LB_PrependString "!insertmacro _NSD_LB_PrependString " !macro _NSD_LB_PrependString CONTROL STRING SendMessage ${CONTROL} ${LB_INSERTSTRING} 0 `STR:${STRING}` !macroend !define NSD_LB_AppendString "!insertmacro _NSD_LB_AppendString " !macro _NSD_LB_AppendString CONTROL STRING SendMessage ${CONTROL} ${LB_INSERTSTRING} -1 `STR:${STRING}` !macroend !define NSD_LB_DelString `!insertmacro __NSD_LB_DelString ` !macro __NSD_LB_DelString CONTROL STRING System::Call 'USER32::SendMessage(p${CONTROL},i${LB_FINDSTRINGEXACT},p-1,ts)p.s' `${STRING}` System::Call 'USER32::SendMessage(p${CONTROL},i${LB_DELETESTRING},ps,p0)' !macroend !define NSD_LB_DelItem "!insertmacro __NSD_LB_DelItem " !macro __NSD_LB_DelItem CONTROL INDEX SendMessage ${CONTROL} ${LB_DELETESTRING} ${INDEX} 0 !macroend !define NSD_LB_Clear `${__NSD_MkCtlCmd} LB_RESETCONTENT 0 0 ` !define NSD_LB_GetCount `!insertmacro __NSD_LB_GetCount ` !macro __NSD_LB_GetCount CONTROL VAR SendMessage ${CONTROL} ${LB_GETCOUNT} 0 0 ${VAR} !macroend !define NSD_LB_SelectString "!insertmacro _NSD_LB_SelectString " !macro _NSD_LB_SelectString CONTROL STRING SendMessage ${CONTROL} ${LB_SELECTSTRING} -1 `STR:${STRING}` !macroend !define NSD_LB_GetSelection `!insertmacro __NSD_LB_GetSelection ` !macro __NSD_LB_GetSelection CONTROL VAR SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR} System::Call 'user32::SendMessage(p ${CONTROL}, i ${LB_GETTEXT}, p ${VAR}, t .s)' Pop ${VAR} !macroend !define NSD_LB_GetSelectionIndex `!insertmacro __NSD_LB_GetSelectionIndex ` !macro __NSD_LB_GetSelectionIndex CONTROL VAR SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR} !macroend !define NSD_LB_SetSelectionIndex `!insertmacro __NSD_LB_SetSelectionIndex ` !macro __NSD_LB_SetSelectionIndex CONTROL INDEX SendMessage ${CONTROL} ${LB_SETCURSEL} ${INDEX} 0 !macroend !define NSD_LB_GetSelectionCount `!insertmacro __NSD_LB_GetSelectionCount ` !macro __NSD_LB_GetSelectionCount CONTROL VAR SendMessage ${CONTROL} ${LB_GETSELCOUNT} 0 0 ${VAR} !macroend !define NSD_LB_GetItemText `!insertmacro __NSD_LB_GetItemText ` !macro __NSD_LB_GetItemText CONTROL INDEX VAR System::Call 'user32::SendMessage(p${CONTROL}, i${LB_GETTEXT}, p${INDEX}, t.s)' Pop ${VAR} !macroend !define NSD_LB_GetItemData `!insertmacro __NSD_LB_GetItemData ` !macro __NSD_LB_GetItemData CONTROL INDEX VAR SendMessage ${CONTROL} ${LB_GETITEMDATA} ${INDEX} 0 ${VAR} !macroend !define NSD_LB_SetItemData `${__NSD_MkCtlCmd_WPLP} LB_SETITEMDATA ` ; Index Data !define NSD_LB_FindStringPrefix `!insertmacro __NSD_LB_FindStringPrefix ` !macro __NSD_LB_FindStringPrefix CONTROL STRING VAR SendMessage ${CONTROL} ${LB_FINDSTRING} -1 `STR:${STRING}` ${VAR} !macroend !define NSD_LB_FindStringExact `!insertmacro __NSD_LB_FindStringExact ` !macro __NSD_LB_FindStringExact CONTROL STRING VAR SendMessage ${CONTROL} ${LB_FINDSTRINGEXACT} -1 `STR:${STRING}` ${VAR} !macroend ### ProgressBar ### !define NSD_ProgressBar_SetPos `${__NSD_MkCtlCmd_WP} PBM_SETPOS 0 ` !define NSD_ProgressBar_SetStep `${__NSD_MkCtlCmd_WP} PBM_SETSTEP 0 ` !define NSD_ProgressBar_StepIt `${__NSD_MkCtlCmd} PBM_STEPIT 0 0 ` !define NSD_ProgressBar_AdvanceBy `${__NSD_MkCtlCmd_WP} PBM_DELTAPOS 0 ` !define NSD_ProgressBar_SetPackedRange `${__NSD_MkCtlCmd_LP} PBM_SETRANGE 0 ` ; LP(DWORD):MAKELONG(min,max) !define NSD_ProgressBar_SetRange32 `${__NSD_MkCtlCmd_WPLP} PBM_SETRANGE32 ` ; [IE3+] WP:min LP:max !define NSD_ProgressBar_GetPos `${__NSD_MkCtlCmd_RV} PBM_GETPOS 0 0 ` ; [IE3+] ### Animation ### !define NSD_Anim_Close `${__NSD_MkCtlCmd} ACM_OPEN 0 0 ` !define NSD_Anim_Play `${__NSD_MkCtlCmd} ACM_PLAY -1 0xFFFF0000 ` !define NSD_Anim_PlayLoops `${__NSD_MkCtlCmd_WP} ACM_PLAY 0xFFFF0000 ` ; WP(UINT16):LoopCount !define NSD_Anim_Stop `${__NSD_MkCtlCmd} ACM_STOP 0 0 ` !define NSD_Anim_IsPlaying `${__NSD_MkCtlCmd_RV} ACM_ISPLAYING 0 0 ` !define NSD_Anim_OpenFile `!insertmacro __NSD_Anim_OpenFile ` !macro __NSD_Anim_OpenFile CONTROL PATH SendMessage ${CONTROL} ${ACM_OPEN} 0 "STR:${PATH}" !macroend !define NSD_Anim_OpenResource `!insertmacro __NSD_Anim_OpenResource ` !macro __NSD_Anim_OpenResource CONTROL HINSTANCE_CC471 RESID SendMessage ${CONTROL} ${ACM_OPEN} "${HINSTANCE_CC471}" "${RESID}" !macroend ### TrackBar ### !define NSD_TrackBar_GetPos `${__NSD_MkCtlCmd_RV} TBM_GETPOS 0 0 ` !define NSD_TrackBar_SetPos `${__NSD_MkCtlCmd_LP} TBM_SETPOS 1 ` !define NSD_TrackBar_SetRangeMin `${__NSD_MkCtlCmd_LP} TBM_SETRANGEMIN 1 ` !define NSD_TrackBar_SetRangeMax `${__NSD_MkCtlCmd_LP} TBM_SETRANGEMAX 1 ` !define NSD_TrackBar_GetLineSize `${__NSD_MkCtlCmd_RV} TBM_GETLINESIZE 0 0 ` !define NSD_TrackBar_SetLineSize `${__NSD_MkCtlCmd_LP} TBM_SETLINESIZE 0 ` !define NSD_TrackBar_GetPageSize `${__NSD_MkCtlCmd_RV} TBM_GETPAGESIZE 0 0 ` !define NSD_TrackBar_SetPageSize `${__NSD_MkCtlCmd_LP} TBM_SETPAGESIZE 0 ` !define NSD_TrackBar_ClearTics `${__NSD_MkCtlCmd} TBM_CLEARTICS 0 0 ` !define NSD_TrackBar_GetNumTics `${__NSD_MkCtlCmd_RV} TBM_GETNUMTICS 0 0 ` !define NSD_TrackBar_SetTic `${__NSD_MkCtlCmd_LP} TBM_SETTIC 0 ` !define NSD_TrackBar_SetTicFreq `${__NSD_MkCtlCmd_WP} TBM_SETTICFREQ 0 ` !define NSD_TrackBar_GetThumbLength `${__NSD_MkCtlCmd_RV} TBM_GETTHUMBLENGTH 0 0 ` !define NSD_TrackBar_SetBuddy `${__NSD_MkCtlCmd_WPLP} TBM_SETBUDDY ` ; WP(BOOL):Left/Right LP:HWND ### UpDown ### !define NSD_UD_SetBuddy `${__NSD_MkCtlCmd_WP} UDM_SETBUDDY 0 ` !define NSD_UD_GetPos `${__NSD_MkCtlCmd_RV} UDM_GETPOS 0 0 ` !define NSD_UD_SetPos `${__NSD_MkCtlCmd_LP} UDM_SETPOS 0 ` !define NSD_UD_GetPackedRange `${__NSD_MkCtlCmd_RV} UDM_GETRANGE 0 0 ` !define NSD_UD_SetPackedRange `${__NSD_MkCtlCmd_LP} UDM_SETRANGE 0 ` ; LP(DWORD):MAKELONG(min,max) !define NSD_UD_GetPos32 `${__NSD_MkCtlCmd_RV} UDM_GETPOS32 0 0 ` !define NSD_UD_SetPos32 `${__NSD_MkCtlCmd_LP} UDM_SETPOS32 0 ` !define NSD_UD_SetRange32 `${__NSD_MkCtlCmd_WPLP} UDM_SETRANGE32 ` ; WP(INT32):min LP(INT32):max !define NSD_UD_GetRange32 `!insertmacro __NSD_UD_GetRange32 ` !macro __NSD_UD_GetRange32 CONTROL OUTLO OUTHI System::Call 'USER32::SendMessage(p${CONTROL},i${UDM_GETRANGE32},*i.s,*i.s)' Pop ${OUTLO} Pop ${OUTHI} !macroend !define NSD_UD_SetStaticRange `!insertmacro __NSD_UD_SetStaticRange ` !macro __NSD_UD_SetStaticRange CONTROL MI MA !define /redef /math MI ${MI} << 16 !define /redef /math MA ${MA} & 0xffff !define /redef /math MA ${MI} | ${MA} SendMessage ${CONTROL} ${UDM_SETRANGE} 0 ${MA} !macroend ### HotKey ### !define NSD_HK_GetHotKey `${__NSD_MkCtlCmd_RV} HKM_GETHOTKEY 0 0 ` ; RV(WORD):MAKEWORD(VK,HOTKEYF) !define NSD_HK_SetHotKey `${__NSD_MkCtlCmd_WP} HKM_SETHOTKEY 0 ` !define NSD_HK_SetRules `${__NSD_MkCtlCmd_WPLP} HKM_SETRULES ` ### IP Address ### !define NSD_IPAddress_Clear `${__NSD_MkCtlCmd} IPM_CLEARADDRESS 0 0 ` !define NSD_IPAddress_SetPackedIPv4 `${__NSD_MkCtlCmd_LP} IPM_SETADDRESS 0 ` !define NSD_IPAddress_IsBlank `${__NSD_MkCtlCmd_RV} IPM_ISBLANK 0 0 ` !define NSD_IPAddress_GetPackedIPv4 `!insertmacro __NSD_IPAddress_GetPackedIPv4 ` !macro __NSD_IPAddress_GetPackedIPv4 CONTROL VAR System::Call 'USER32::SendMessage(p${CONTROL},i${IPM_GETADDRESS},p0,*i0s)' Pop ${VAR} !macroend ### Date ### !define NSD_Date_GetDateFields `!insertmacro __NSD_Date_GetDateFields ` !macro __NSD_Date_GetDateFields CONTROL Push $0 System::Call 'USER32::SendMessage(p${CONTROL},i${DTM_GETSYSTEMTIME},p0,@r0)' System::Call '*$0(&i2.s,&i2.s,&i2,&i2.s)' Exch 3 Pop $0 !macroend !define NSD_Time_GetTimeFields `!insertmacro __NSD_Time_GetTimeFields ` !macro __NSD_Time_GetTimeFields CONTROL Push $0 System::Call 'USER32::SendMessage(p${CONTROL},i${DTM_GETSYSTEMTIME},p0,@r0)' System::Call '*$0(&i2,&i2,&i2,&i2,&i2.s,&i2.s,&i2.s)' Exch 3 Pop $0 Exch !macroend ### Static ### !macro __NSD_LoadAndSetImage _LIHINSTMODE _IMGTYPE _LIHINSTSRC _LIFLAGS CONTROL IMAGE HANDLE !if "${_LIHINSTMODE}" == "exeresource" LoadAndSetImage /EXERESOURCE /STRINGID "${CONTROL}" ${_IMGTYPE} ${_LIFLAGS} "${IMAGE}" ${HANDLE} !else #if "${_LIHINSTMODE}" == "file" LoadAndSetImage /STRINGID "${CONTROL}" ${_IMGTYPE} ${_LIFLAGS} "${IMAGE}" ${HANDLE} !endif !macroend !macro __NSD_SetIconFromExeResource CONTROL IMAGE HANDLE LoadAndSetImage /EXERESOURCE /STRINGID "${CONTROL}" ${IMAGE_ICON} ${LR_DEFAULTSIZE} "${IMAGE}" ${HANDLE} !macroend !macro __NSD_SetIconFromInstaller CONTROL HANDLE LoadAndSetImage /EXERESOURCE "${CONTROL}" ${IMAGE_ICON} ${LR_DEFAULTSIZE} 103 ${HANDLE} !macroend !define NSD_SetImage `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_BITMAP} 0 "${LR_LOADFROMFILE}" ` !define NSD_SetBitmap `${NSD_SetImage} ` !define NSD_SetIcon `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_ICON} 0 "${LR_LOADFROMFILE}|${LR_DEFAULTSIZE}" ` !define NSD_SetIconFromExeResource `!insertmacro __NSD_SetIconFromExeResource ` !define NSD_SetIconFromInstaller `!insertmacro __NSD_SetIconFromInstaller ` !define NSD_SetStretchedImage `!insertmacro __NSD_SetStretchedImage ` !define NSD_SetStretchedBitmap `!insertmacro __NSD_SetStretchedImage ` !macro __NSD_SetStretchedImage CONTROL IMAGE HANDLE LoadAndSetImage /STRINGID /RESIZETOFIT "${CONTROL}" ${IMAGE_BITMAP} ${LR_LOADFROMFILE} "${IMAGE}" ${HANDLE} !macroend !define NSD_FreeImage `!insertmacro __NSD_FreeImage ` !define NSD_FreeBitmap `${NSD_FreeImage} ` !macro __NSD_FreeImage IMAGE ${If} ${IMAGE} P<> 0 System::Call gdi32::DeleteObject(ps) ${IMAGE} ${EndIf} !macroend !define NSD_FreeIcon `!insertmacro __NSD_FreeIcon ` !macro __NSD_FreeIcon IMAGE System::Call user32::DestroyIcon(ps) ${IMAGE} !macroend !define NSD_ClearImage `!insertmacro __NSD_ClearImage ${IMAGE_BITMAP} ` !define NSD_ClearBitmap `${NSD_ClearImage} ` !define NSD_ClearIcon `!insertmacro __NSD_ClearImage ${IMAGE_ICON} ` !macro __NSD_ClearImage _IMGTYPE CONTROL SendMessage ${CONTROL} ${STM_SETIMAGE} ${_IMGTYPE} 0 !macroend ### INI ### !define /IfNDef NSD_Debug `System::Call kernel32::OutputDebugString(ts)` !macro __NSD_ControlCase TYPE ${Case} ${TYPE} ${NSD_Create${TYPE}} $R3u $R4u $R5u $R6u $R7 Pop $R9 ${Break} !macroend !macro __NSD_ControlCaseEx TYPE ${Case} ${TYPE} Call ${TYPE} ${Break} !macroend !macro NSD_FUNCTION_INIFILE !insertmacro NSD_INIFILE "" !macroend !macro NSD_UNFUNCTION_INIFILE !insertmacro NSD_INIFILE un. !macroend !macro NSD_INIFILE UNINSTALLER_FUNCPREFIX ;Functions to create dialogs based on old InstallOptions INI files Function ${UNINSTALLER_FUNCPREFIX}CreateDialogFromINI # $0 = ini ReadINIStr $R0 $0 Settings RECT ${If} $R0 == "" StrCpy $R0 1018 ${EndIf} nsDialogs::Create $R0 Pop $R9 ReadINIStr $R0 $0 Settings RTL nsDialogs::SetRTL $R0 ReadINIStr $R0 $0 Settings NumFields ${NSD_Debug} "NumFields = $R0" ${For} $R1 1 $R0 ${NSD_Debug} "Creating field $R1" ReadINIStr $R2 $0 "Field $R1" Type ${NSD_Debug} " Type = $R2" ReadINIStr $R3 $0 "Field $R1" Left ${NSD_Debug} " Left = $R3" ReadINIStr $R4 $0 "Field $R1" Top ${NSD_Debug} " Top = $R4" ReadINIStr $R5 $0 "Field $R1" Right ${NSD_Debug} " Right = $R5" ReadINIStr $R6 $0 "Field $R1" Bottom ${NSD_Debug} " Bottom = $R6" IntOp $R5 $R5 - $R3 ${NSD_Debug} " Width = $R5" IntOp $R6 $R6 - $R4 ${NSD_Debug} " Height = $R6" ReadINIStr $R7 $0 "Field $R1" Text ${NSD_Debug} " Text = $R7" ${Switch} $R2 !insertmacro __NSD_ControlCase HLine !insertmacro __NSD_ControlCase VLine !insertmacro __NSD_ControlCase Label !insertmacro __NSD_ControlCase Icon !insertmacro __NSD_ControlCase Bitmap !insertmacro __NSD_ControlCaseEx Link !insertmacro __NSD_ControlCase Button !insertmacro __NSD_ControlCase GroupBox !insertmacro __NSD_ControlCase CheckBox !insertmacro __NSD_ControlCase RadioButton !insertmacro __NSD_ControlCase Text !insertmacro __NSD_ControlCase Password !insertmacro __NSD_ControlCaseEx FileRequest !insertmacro __NSD_ControlCaseEx DirRequest !insertmacro __NSD_ControlCase ComboBox !insertmacro __NSD_ControlCase DropList !insertmacro __NSD_ControlCase ListBox ${EndSwitch} WriteINIStr $0 "Field $R1" HWND $R9 ${Next} nsDialogs::Show FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}UpdateINIState ${NSD_Debug} "Updating INI state" ReadINIStr $R0 $0 Settings NumFields ${NSD_Debug} "NumField = $R0" ${For} $R1 1 $R0 ReadINIStr $R2 $0 "Field $R1" HWND ReadINIStr $R3 $0 "Field $R1" "Type" ${Switch} $R3 ${Case} "CheckBox" ${Case} "RadioButton" ${NSD_Debug} " HWND = $R2" ${NSD_GetState} $R2 $R2 ${NSD_Debug} " Window selection = $R2" ${Break} ${CaseElse} ${NSD_Debug} " HWND = $R2" ${NSD_GetText} $R2 $R2 ${NSD_Debug} " Window text = $R2" ${Break} ${EndSwitch} WriteINIStr $0 "Field $R1" STATE $R2 ${Next} FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}FileRequest IntOp $R5 $R5 - 15 IntOp $R8 $R3 + $R5 ${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ... Pop $R8 nsDialogs::SetUserData $R8 $R1 # remember field id WriteINIStr $0 "Field $R1" HWND2 $R8 ${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton ReadINIStr $R9 $0 "Field $R1" State ${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9 Pop $R9 FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}DirRequest IntOp $R5 $R5 - 15 IntOp $R8 $R3 + $R5 ${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ... Pop $R8 nsDialogs::SetUserData $R8 $R1 # remember field id WriteINIStr $0 "Field $R1" HWND2 $R8 ${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton ReadINIStr $R9 $0 "Field $R1" State ${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9 Pop $R9 FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton Pop $R0 nsDialogs::GetUserData $R0 Pop $R1 ReadINIStr $R2 $0 "Field $R1" HWND ReadINIStr $R4 $0 "Field $R1" Filter ${NSD_GetText} $R2 $R3 nsDialogs::SelectFileDialog save $R3 $R4 Pop $R3 ${If} $R3 != "" SendMessage $R2 ${WM_SETTEXT} 0 STR:$R3 ${EndIf} FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton Pop $R0 nsDialogs::GetUserData $R0 Pop $R1 ReadINIStr $R2 $0 "Field $R1" HWND ReadINIStr $R3 $0 "Field $R1" Text ${NSD_GetText} $R2 $R4 nsDialogs::SelectFolderDialog $R3 $R4 Pop $R3 ${If} $R3 != error SendMessage $R2 ${WM_SETTEXT} 0 STR:$R3 ${EndIf} FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}Link ${NSD_CreateLink} $R3u $R4u $R5u $R6u $R7 Pop $R9 nsDialogs::SetUserData $R9 $R1 # remember field id ${NSD_OnClick} $R9 ${UNINSTALLER_FUNCPREFIX}OnLink FunctionEnd Function ${UNINSTALLER_FUNCPREFIX}OnLink Pop $R0 nsDialogs::GetUserData $R0 Pop $R1 ReadINIStr $R1 $0 "Field $R1" STATE ExecShell "" $R1 FunctionEnd !macroend !verbose pop !endif nsis-3.11/Contrib/nsDialogs/rtl.c000077500000000000000000000035601477201124000167070ustar00rootroot00000000000000#include #include #include // nsis plugin #include "defs.h" #ifndef WS_EX_RIGHT # define WS_EX_RIGHT 0x1000 #endif #ifndef WS_EX_RTLREADING # define WS_EX_RTLREADING 0x2000 #endif #ifndef WS_EX_LEFTSCROLLBAR # define WS_EX_LEFTSCROLLBAR 0x4000 #endif #ifndef TVS_RTLREADING # define TVS_RTLREADING 64 #endif extern struct nsDialog g_dialog; void __declspec(dllexport) SetRTL(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { g_dialog.rtl = (BOOL) popint(); } void NSDFUNC ConvertStyleToRTL(enum nsControlType type, LPDWORD style, LPDWORD exStyle) { if (!g_dialog.rtl) return; switch (type) { case NSCTL_LINK: case NSCTL_BUTTON: *style ^= BS_LEFTTEXT | BS_RIGHT | BS_LEFT; if ((*style & (BS_LEFT|BS_RIGHT)) == (BS_LEFT|BS_RIGHT)) { *style ^= BS_LEFT | BS_RIGHT; if (*style & (BS_RADIOBUTTON | BS_CHECKBOX | BS_USERBUTTON)) { *style |= BS_RIGHT; } } break; case NSCTL_EDIT: if ((*style & ES_CENTER) == 0) { *style ^= ES_RIGHT; } break; case NSCTL_STATIC: if ((*style & SS_TYPEMASK) == SS_LEFT || (*style & SS_TYPEMASK) == SS_LEFTNOWORDWRAP) { *style &= ~SS_TYPEMASK; *style |= SS_RIGHT; } else if ((*style & SS_TYPEMASK) == SS_ICON) { *style |= SS_CENTERIMAGE; } break; case NSCTL_RICHEDIT: case NSCTL_RICHEDIT2: if ((*style & ES_CENTER) == 0) { *style ^= ES_RIGHT; } break; case NSCTL_TREE: *style |= TVS_RTLREADING; *exStyle |= WS_EX_RIGHT | WS_EX_LAYOUTRTL; break; default: *exStyle |= WS_EX_RIGHT; break; } *exStyle |= WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR; } void NSDFUNC ConvertPosToRTL(int *x, int width, int dialogWidth) { if (!g_dialog.rtl) return; *x = dialogWidth - width - *x; } nsis-3.11/Contrib/nsDialogs/rtl.h000077500000000000000000000004121477201124000167050ustar00rootroot00000000000000#ifndef __NS_DIALOGS__RTL_H__ #define __NS_DIALOGS__RTL_H__ #include "defs.h" void NSDFUNC ConvertStyleToRTL(enum nsControlType type, LPDWORD style, LPDWORD exStyle); void NSDFUNC ConvertPosToRTL(int *x, int width, int dialogWidth); #endif//__NS_DIALOGS__RTL_H__ nsis-3.11/Contrib/nsDialogs/timer.nsi000077500000000000000000000037631477201124000176020ustar00rootroot00000000000000!include LogicLib.nsh !include nsDialogs.nsh !include WinMessages.nsh Name "nsDialogs Timer Example" OutFile "nsDialogs Timer Example.exe" XPStyle on RequestExecutionLevel user Var DIALOG Var TEXT Var PROGBAR Var PROGBAR2 Var PROGBAR3 Var BUTTON Var BUTTON2 Page custom nsDialogsPage !pragma warning disable 8000 ; "Page instfiles not used, no sections will be executed!" Function OnTimer SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1 ${If} $1 = 100 SendMessage $PROGBAR ${PBM_SETPOS} 0 0 ${Else} SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0 ${EndIf} FunctionEnd Function OnTimer2 SendMessage $PROGBAR2 ${PBM_GETPOS} 0 0 $1 ${If} $1 = 100 SendMessage $PROGBAR2 ${PBM_SETPOS} 0 0 ${Else} SendMessage $PROGBAR2 ${PBM_DELTAPOS} 5 0 ${EndIf} FunctionEnd Function OnTimer3 SendMessage $PROGBAR3 ${PBM_GETPOS} 0 0 $1 ${If} $1 >= 100 ${NSD_KillTimer} OnTimer3 MessageBox MB_OK "Timer 3 killed" ${Else} SendMessage $PROGBAR3 ${PBM_DELTAPOS} 2 0 ${EndIf} FunctionEnd Function OnClick Pop $0 ${NSD_KillTimer} OnTimer FunctionEnd Function OnClick2 Pop $0 ${NSD_KillTimer} OnTimer2 FunctionEnd Function nsDialogsPage nsDialogs::Create 1018 Pop $DIALOG ${NSD_CreateLabel} 0u 0u 100% 9u "nsDialogs timer example" Pop $TEXT ${NSD_CreateProgressBar} 0u 10u 100% 12u "" Pop $PROGBAR ${NSD_CreateButton} 0u 25u 100u 14u "Kill Timer 1" Pop $BUTTON ${NSD_OnClick} $BUTTON OnClick ${NSD_CreateProgressBar} 0u 52u 100% 12u "" Pop $PROGBAR2 SendMessage $PROGBAR2 ${PBM_SETBARCOLOR} 0 0x0000FF ; No visual styles SendMessage $PROGBAR2 ${PBM_SETSTATE} ${PBST_ERROR} 0 ; Vista+ ${NSD_CreateButton} 0u 67u 100u 14u "Kill Timer 2" Pop $BUTTON2 ${NSD_OnClick} $BUTTON2 OnClick2 ${NSD_CreateProgressBar} 0u 114u 100% 12u "" Pop $PROGBAR3 ${NSD_CreateTimer} OnTimer 1000 ${NSD_CreateTimer} OnTimer2 100 ${NSD_CreateTimer} OnTimer3 200 nsDialogs::Show FunctionEnd Section SectionEnd nsis-3.11/Contrib/nsDialogs/welcome.nsi000077500000000000000000000127511477201124000201120ustar00rootroot00000000000000!include MUI.nsh !include LogicLib.nsh !include nsDialogs.nsh !include WinMessages.nsh !include FileFunc.nsh Name "nsDialogs Welcome" OutFile "nsDialogs Welcome.exe" Page custom nsDialogsWelcome Page custom nsDialogsDirectory !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_LANGUAGE English Var DIALOG Var HEADLINE Var TEXT Var IMAGECTL Var IMAGE Var DIRECTORY Var FREESPACE Var HEADLINE_FONT Function .onInit CreateFont $HEADLINE_FONT "$(^Font)" "14" "700" InitPluginsDir File /oname=$PLUGINSDIR\welcome.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-nsis.bmp" FunctionEnd Function HideControls LockWindow on GetDlgItem $0 $HWNDPARENT 1028 ShowWindow $0 ${SW_HIDE} GetDlgItem $0 $HWNDPARENT 1256 ShowWindow $0 ${SW_HIDE} GetDlgItem $0 $HWNDPARENT 1035 ShowWindow $0 ${SW_HIDE} GetDlgItem $0 $HWNDPARENT 1037 ShowWindow $0 ${SW_HIDE} GetDlgItem $0 $HWNDPARENT 1038 ShowWindow $0 ${SW_HIDE} GetDlgItem $0 $HWNDPARENT 1039 ShowWindow $0 ${SW_HIDE} GetDlgItem $0 $HWNDPARENT 1045 ShowWindow $0 ${SW_NORMAL} LockWindow off FunctionEnd Function ShowControls LockWindow on GetDlgItem $0 $HWNDPARENT 1028 ShowWindow $0 ${SW_NORMAL} GetDlgItem $0 $HWNDPARENT 1256 ShowWindow $0 ${SW_NORMAL} GetDlgItem $0 $HWNDPARENT 1035 ShowWindow $0 ${SW_NORMAL} GetDlgItem $0 $HWNDPARENT 1037 ShowWindow $0 ${SW_NORMAL} GetDlgItem $0 $HWNDPARENT 1038 ShowWindow $0 ${SW_NORMAL} GetDlgItem $0 $HWNDPARENT 1039 ShowWindow $0 ${SW_NORMAL} GetDlgItem $0 $HWNDPARENT 1045 ShowWindow $0 ${SW_HIDE} LockWindow off FunctionEnd Function nsDialogsWelcome nsDialogs::Create 1044 Pop $DIALOG nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 0 0 109u 193u "" Pop $IMAGECTL StrCpy $0 $PLUGINSDIR\welcome.bmp System::Call 'user32::LoadImage(p 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE})p.s' Pop $IMAGE SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 10u -130u 20u "Welcome to nsDialogs!" Pop $HEADLINE SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0 nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 32u -130u -32u "nsDialogs is the next generation of user interfaces in NSIS. It gives the developer full control over custom pages. Some of the features include control text containing variables, callbacks directly into script functions and creation of any type of control. Create boring old edit boxes or load some external library and create custom controls with no need of creating your own plug-in.$\r$\n$\r$\nUnlike InstallOptions, nsDialogs doesn't use INI files to communicate with the script. By interacting directly with the script, nsDialogs can perform much faster without the need of costly, old and inefficient INI operations. Direct interaction also allows direct calls to functions defined in the script and removes the need of conversion functions like Io2Nsis.$\r$\n$\r$\nHit the Next button to see how it all fits into a mock directory page." Pop $TEXT SetCtlColors $DIALOG 0 0xffffff SetCtlColors $HEADLINE 0 0xffffff SetCtlColors $TEXT 0 0xffffff Call HideControls nsDialogs::Show Call ShowControls System::Call gdi32::DeleteObject(p$IMAGE) FunctionEnd !define SHACF_FILESYSTEM 1 Function nsDialogsDirectory !insertmacro MUI_HEADER_TEXT "Choose Install Location" "Choose the folder in which to install $(^NameDA)." GetDlgItem $0 $HWNDPARENT 1 EnableWindow $0 0 nsDialogs::Create 1018 Pop $DIALOG nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_CENTER} 0 0 0 100% 30 "Directory page" Pop $HEADLINE SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0 nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 30 100% 40 "Select the installation directory of NSIS to continue. $_CLICK" Pop $TEXT nsDialogs::CreateControl EDIT ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${ES_AUTOHSCROLL}|${WS_TABSTOP} ${WS_EX_CLIENTEDGE} 0 75 100% 12u "" Pop $DIRECTORY SendMessage $HWNDPARENT ${WM_NEXTDLGCTL} $DIRECTORY 1 GetFunctionAddress $0 DirChange nsDialogs::OnChange $DIRECTORY $0 System::Call shlwapi::SHAutoComplete(p$DIRECTORY,i${SHACF_FILESYSTEM}) nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 -10u 100% 10u "" Pop $FREESPACE Call UpdateFreeSpace nsDialogs::Show FunctionEnd Function UpdateFreeSpace ${GetRoot} $INSTDIR $0 StrCpy $1 " bytes" System::Call kernel32::GetDiskFreeSpaceEx(tr0,*l,*l,*l.r0) ${If} $0 > 1024 ${OrIf} $0 < 0 System::Int64Op $0 / 1024 Pop $0 StrCpy $1 "kb" ${If} $0 > 1024 ${OrIf} $0 < 0 System::Int64Op $0 / 1024 Pop $0 StrCpy $1 "mb" ${If} $0 > 1024 ${OrIf} $0 < 0 System::Int64Op $0 / 1024 Pop $0 StrCpy $1 "gb" ${EndIf} ${EndIf} ${EndIf} SendMessage $FREESPACE ${WM_SETTEXT} 0 "STR:Free space: $0$1" FunctionEnd Function DirChange Pop $0 # dir hwnd GetDlgItem $0 $HWNDPARENT 1 System::Call user32::GetWindowText(p$DIRECTORY,t.d,i${NSIS_MAX_STRLEN}) ${If} ${FileExists} $INSTDIR\makensis.exe EnableWindow $0 1 ${Else} EnableWindow $0 0 ${EndIf} Call UpdateFreeSpace FunctionEnd Section SectionEnd nsis-3.11/Contrib/nsExec/000077500000000000000000000000001477201124000152355ustar00rootroot00000000000000nsis-3.11/Contrib/nsExec/SConscript000077500000000000000000000003711477201124000172530ustar00rootroot00000000000000target = 'nsExec' files = Split(""" nsexec.c """) libs = Split(""" advapi32 user32 kernel32 """) examples = Split(""" test.nsi """) docs = Split(""" nsExec.txt """) Import('BuildPlugin') BuildPlugin(target, files, libs, examples, docs) nsis-3.11/Contrib/nsExec/nsExec.txt000077500000000000000000000031401477201124000172240ustar00rootroot00000000000000nsExec ------ nsExec will execute command-line based programs and capture the output without opening a dos box. Usage ----- nsExec::Exec [/MBCS] [/OEM] [/TIMEOUT=x] path Pop $0 -or- nsExec::ExecToLog [/MBCS] [/OEM] [/TIMEOUT=x] path Pop $0 -or- nsExec::ExecToStack [/MBCS] [/OEM] [/TIMEOUT=x] path Pop $0 ; Return Pop $1 ; Output All functions are the same except ExecToLog will print the output to the log window and ExecToStack will push up to ${NSIS_MAX_STRLEN} characters of output onto the stack after the return value. Use the /MBCS switch to disable Unicode detection and always treat the text as ANSI. Use the /OEM switch to convert the output text from OEM to ANSI. The timeout value is optional. The timeout is the time in milliseconds nsExec will wait for output. If output from the process is received, the timeout value is reset and it will again wait for more output using the timeout value. See Return Value for how to check if there was a timeout. To ensure that command are executed without problems on all windows versions, is recommended to use the following syntax: nsExec::ExecToStack [OPTIONS] '"PATH" param1 param2 paramN' This way the application path may contain non 8.3 paths (with spaces) Return Value ------------ If nsExec is unable to execute the process, it will return "error" on the top of the stack, if the process timed out it will return "timeout", else it will return the return code from the executed process. Copyright Info -------------- Copyright (c) 2002 Robert Rainwater Thanks to Justin Frankel and Amir Szekelynsis-3.11/Contrib/nsExec/nsexec.c000077500000000000000000000507421477201124000167010ustar00rootroot00000000000000/* Copyright (C) 2002 Robert Rainwater Copyright (C) 2002-2025 Nullsoft and Contributors This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #include #include #include // nsis plugin #if defined(_MSC_VER) && !defined(GetVersion) #if _MSC_VER >= 1500 FORCEINLINE DWORD NoDepr_GetVersion() { __pragma(warning(push))__pragma(warning(disable:4996)) DWORD r = GetVersion(); __pragma(warning(pop)) return r; } #define GetVersion NoDepr_GetVersion #endif //~ _MSC_VER >= 1500 #endif //~ _MSC_VER #define TAB_REPLACE _T(" ") #define TAB_REPLACE_SIZE (sizeof(TAB_REPLACE) - sizeof(_T(""))) #define TAB_REPLACE_CCH (TAB_REPLACE_SIZE / sizeof(_T(""))) enum { MODE_IGNOREOUTPUT = 0, MODE_LINES = 1, MODE_STACK = 2 }; #define LOOPTIMEOUT 100 HWND g_hwndParent; HWND g_hwndList; HINSTANCE g_hInst; void ExecScript(BOOL log); TCHAR *my_strstr(TCHAR *a, TCHAR *b); unsigned int my_atoi(TCHAR *s); int WINAPI AsExeWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow); void __declspec(dllexport) Exec(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent = hwndParent; EXDLL_INIT(); ExecScript(MODE_IGNOREOUTPUT); } void __declspec(dllexport) ExecToLog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent = hwndParent; EXDLL_INIT(); ExecScript(MODE_LINES); } void __declspec(dllexport) ExecToStack(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent = hwndParent; EXDLL_INIT(); ExecScript(MODE_STACK); } BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInst = hInst; return TRUE; } static BOOL IsLeadSurrogateUTF16(unsigned short c) { return c >= 0xd800 && c <= 0xdbff; } static BOOL IsTrailSurrogateUTF16(unsigned short c) { return c >= 0xdc00 && c <= 0xdfff; } static PWSTR MyCharNext(PCWSTR p) { // Note: This is wrong for surrogate pair combining characters but CharNextW does // not support surrogate pairs correctly so we have to manually handle the pairs. if (!p[0]) return (PWSTR) p; if (IsLeadSurrogateUTF16(p[0]) && IsTrailSurrogateUTF16(p[1])) return (PWSTR) p + 2; // Current is a surrogate pair, we incorrectly assume that it is not followed by combining characters. if (IsLeadSurrogateUTF16(p[1]) && IsTrailSurrogateUTF16(p[2])) return (PWSTR) p + 1; // Next is a surrogate pair, we incorrectly assume that it is not a combining character for the current character. return (CharNextW)(p); } #define CharNextW MyCharNext static void TruncateStringUTF16LE(LPWSTR Buffer, SIZE_T Length, LPCWSTR Overflow, SIZE_T lenOver) { if (Length) { LPWSTR p = &Buffer[Length - 1]; UINT stripBaseCharIfCuttingCombining = TRUE; // CharNextW is buggy on XP&2003 but we don't care enough to call GetStringTypeW (http://archives.miloush.net/michkap/archive/2005/01/30/363420.html) if (stripBaseCharIfCuttingCombining && lenOver) { WCHAR buf[] = { *p, Overflow[0], lenOver > 1 ? Overflow[1] : L' ', L'\0' }; for (;;) { BOOL comb = CharNextW(buf) > buf + 1; if (!comb || p < Buffer) break; *((WORD*)((BYTE*)&buf[1])) = *((WORD*)((BYTE*)&buf[0])); buf[0] = *p; *p-- = L'\0'; } } if (IsLeadSurrogateUTF16(*p)) { *p = L'\0'; // Avoid incomplete pair } } } static void TruncateStringMB(UINT Codepage, LPSTR Buffer, SIZE_T Length, unsigned short OverflowCh) { if (Length) { CHAR *p = &Buffer[Length - 1], buf[] = { *p, ' ', ' ', '\0' }; if (CharNextExA(Codepage, buf, 0) > buf + 1) { // Remove incomplete DBCS character? *p = '\0'; } } } static BOOL IsWOW64() { #ifdef _WIN64 return FALSE; #else typedef BOOL (WINAPI*ISWOW64PROCESS)(HANDLE, BOOL*); ISWOW64PROCESS pfIsWow64Process; typedef BOOL (WINAPI*ISWOW64PROCESS2)(HANDLE, USHORT*, USHORT*); ISWOW64PROCESS2 pfIsWow64Process2; HANDLE hProcess = GetCurrentProcess(); HMODULE hK32 = GetModuleHandleA("KERNEL32"); UINT_PTR retval; USHORT appmach, image_file_machine_unknown = 0; CHAR funcnam[16] #if defined(_MSC_VER) && (_MSC_VER-0 <= 1400) = "IsWow64Process2"; // MOVSD * 4 #else ; lstrcpyA(funcnam, "IsWow64Process2"); #endif pfIsWow64Process2 = (ISWOW64PROCESS2) GetProcAddress(hK32, funcnam); if (pfIsWow64Process2 && pfIsWow64Process2(hProcess, &appmach, NULL)) { retval = image_file_machine_unknown != appmach; } else { BOOL wow64; pfIsWow64Process = (ISWOW64PROCESS) GetProcAddress(hK32, (funcnam[14] = '\0', funcnam)); retval = (UINT_PTR) pfIsWow64Process; if (pfIsWow64Process && (retval = pfIsWow64Process(hProcess, &wow64))) { retval = wow64; } } return (BOOL) (UINT) retval; #endif } // Tim Kosse's LogMessage #ifdef UNICODE static void LogMessage(const TCHAR *pStr, BOOL bOEM) { #else static void LogMessage(TCHAR *pStr, BOOL bOEM) { #endif LVITEM item; int nItemCount; if (!g_hwndList) return; //if (!*pStr) return; #ifndef UNICODE if (bOEM == TRUE) OemToCharBuff(pStr, pStr, lstrlen(pStr)); #endif nItemCount=(int) SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0); item.mask=LVIF_TEXT; item.pszText=(TCHAR *)pStr; item.cchTextMax=0; item.iItem=nItemCount, item.iSubItem=0; ListView_InsertItem(g_hwndList, &item); ListView_EnsureVisible(g_hwndList, item.iItem, 0); } void ExecScript(int mode) { TCHAR szRet[128]; TCHAR meDLLPath[MAX_PATH]; TCHAR *g_exec, *executor; TCHAR *pExec; int ignoreData = mode == MODE_IGNOREOUTPUT; int logMode = mode == MODE_LINES, stackMode = mode == MODE_STACK; unsigned int to, tabExpandLength = logMode ? TAB_REPLACE_CCH : 0, codepage; BOOL bOEM, forceNarrowInput = FALSE; *szRet = _T('\0'); if (sizeof(void*) < 8 && !IsWOW64()) { TCHAR* p; int nComSpecSize; nComSpecSize = GetModuleFileName(g_hInst, meDLLPath, MAX_PATH) + 2; // 2 chars for quotes g_exec = (TCHAR *)GlobalAlloc(GPTR, sizeof(TCHAR) * (g_stringsize+nComSpecSize+2)); // 1 for space, 1 for null p = meDLLPath + nComSpecSize - 2; // point p at null char of meDLLPath *g_exec = _T('"'); executor = g_exec + 1; // Look for the last '\' in path. do { if (*p == _T('\\')) break; p = CharPrev(meDLLPath, p); } while (p > meDLLPath); if (p == meDLLPath) { // bad path pushstring(_T("error")); GlobalFree(g_exec); return; } *p = 0; GetTempFileName(meDLLPath, _T("ns"), 0, executor); // executor = new temp file name in module path. *p = _T('\\'); if (CopyFile(meDLLPath, executor, FALSE)) // copy current DLL to temp file in module path. { HANDLE hFile, hMapping; LPBYTE pMapView; PIMAGE_NT_HEADERS pNTHeaders; hFile = CreateFile(executor, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0, 0); hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); pMapView = MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0); if (pMapView) { pNTHeaders = (PIMAGE_NT_HEADERS)(pMapView + ((PIMAGE_DOS_HEADER)pMapView)->e_lfanew); // Turning the copied DLL into a stripped down executable. pNTHeaders->FileHeader.Characteristics = IMAGE_FILE_32BIT_MACHINE | IMAGE_FILE_LOCAL_SYMS_STRIPPED | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE #ifdef _WIN64 | IMAGE_FILE_LARGE_ADDRESS_AWARE // For ARM64 (feature request #579) #endif ; // Windows character-mode user interface (CUI) subsystem. pNTHeaders->OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI; // g_hInst is assumed to be the very base of the DLL in memory. // WinMain will have the address of the WinMain function in memory. // Getting the difference gets you the relative location of the // WinMain function. pNTHeaders->OptionalHeader.AddressOfEntryPoint = (DWORD) ((DWORD_PTR)AsExeWinMain - (DWORD_PTR)g_hInst); UnmapViewOfFile(pMapView); } CloseHandle(hMapping); CloseHandle(hFile); } lstrcat(g_exec, _T("\"")); // add space pExec = g_exec + lstrlen(g_exec); *pExec = _T(' '); pExec++; } else { executor = NULL; g_exec = (TCHAR *)GlobalAlloc(GPTR, sizeof(TCHAR) * (g_stringsize+1)); // 1 for NULL pExec = g_exec; } to = 0; // default is no timeout bOEM = FALSE; // default is no OEM->ANSI conversion g_hwndList = NULL; // g_hwndParent = the caller, usually NSIS installer. if (g_hwndParent) // The window class name for dialog boxes is "#32770" g_hwndList = FindWindowEx(FindWindowEx(g_hwndParent, NULL, _T("#32770"), NULL), NULL, _T("SysListView32"), NULL); // g_exec is the complete command to run: It has the copy of this DLL turned // into an executable right now. params: // Get the command I need to run from the NSIS stack. popstring(pExec); if (my_strstr(pExec, _T("/TIMEOUT=")) == pExec) { TCHAR *szTimeout = pExec + 9; to = my_atoi(szTimeout); *pExec = 0; goto params; } if (!lstrcmpi(pExec, _T("/OEM"))) { bOEM = forceNarrowInput = TRUE; *pExec = 0; goto params; } if (!lstrcmpi(pExec, _T("/MBCS"))) { forceNarrowInput = TRUE; *pExec = 0; goto params; } if (!pExec[0]) { pushstring(_T("error")); if (pExec-2 >= g_exec) *(pExec-2) = _T('\0'); // skip space and quote if (executor) DeleteFile(executor); GlobalFree(g_exec); return; } // Got all the params off the stack. { STARTUPINFO si = { sizeof(si), }; SECURITY_ATTRIBUTES sa = { sizeof(sa), }; SECURITY_DESCRIPTOR sd = { 0, }; PROCESS_INFORMATION pi; const BOOL isNT = sizeof(void*) > 4 || (GetVersion() < 0x80000000); HANDLE newstdout = 0, read_stdout = 0; HANDLE newstdin = 0, read_stdin = 0; int utfSource = sizeof(TCHAR) > 1 && !forceNarrowInput ? -1 : FALSE, utfOutput = sizeof(TCHAR) > 1; DWORD cbRead, dwLastOutput; DWORD dwExit = 0, waitResult = WAIT_TIMEOUT; static BYTE bufSrc[1024]; BYTE *pSrc; SIZE_T cbSrcTot = sizeof(bufSrc), cbSrc = 0, cbSrcFree; TCHAR *bufOutput = 0, *pNewAlloc, *pD; SIZE_T cchAlloc, cbAlloc, cchFree; #ifndef _MSC_VER // Avoid GCC "may be used uninitialized in this function" warnings pD = NULL; cchAlloc = 0; #endif pi.hProcess = pi.hThread = NULL; codepage = bOEM ? CP_OEMCP : CP_ACP; if (!ignoreData) { cbAlloc = stackMode ? (g_stringsize * sizeof(TCHAR)) : sizeof(bufSrc) * 4, cchAlloc = cbAlloc / sizeof(TCHAR); pD = bufOutput = GlobalAlloc(GPTR, cbAlloc + sizeof(TCHAR)); // Include "hidden" space for a \0 if (!bufOutput) { lstrcpy(szRet, _T("error")); goto done; } *bufOutput = _T('\0'); } sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if (isNT) { InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); sa.lpSecurityDescriptor = &sd; } if (!CreatePipe(&read_stdout, &newstdout, &sa, 0)) { lstrcpy(szRet, _T("error")); goto done; } if (!CreatePipe(&read_stdin, &newstdin, &sa, 0)) { lstrcpy(szRet, _T("error")); goto done; } GetStartupInfo(&si); // Why? si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdInput = newstdin; si.hStdOutput = newstdout; si.hStdError = newstdout; if (!CreateProcess(NULL, g_exec, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { lstrcpy(szRet, _T("error")); goto done; } // Now I'm talking with an executable copy of myself. dwLastOutput = GetTickCount(); for (;;) { TCHAR bufCh[2]; waitForProcess: waitResult = WaitForSingleObject(pi.hProcess, 0); GetExitCodeProcess(pi.hProcess, &dwExit); readMore: PeekNamedPipe(read_stdout, 0, 0, 0, &cbRead, NULL); if (!cbRead) { if (waitResult == WAIT_OBJECT_0) { break; // No data in the pipe and process ended, we are done } if (to && GetTickCount() > dwLastOutput+to) { TerminateProcess(pi.hProcess, -1); lstrcpy(szRet, _T("timeout")); } else { Sleep(LOOPTIMEOUT); } continue; } dwLastOutput = GetTickCount(); ReadFile(read_stdout, bufSrc + cbSrc, (DWORD) (cbSrcFree = cbSrcTot - cbSrc), &cbRead, NULL); cbSrcFree -= cbRead, cbSrc = cbSrcTot - cbSrcFree; pSrc = bufSrc; if (utfSource < 0 && cbSrc) { // Simple UTF-16LE detection #ifdef UNICODE utfSource = IsTextUnicode(pSrc, (UINT) (cbSrc & ~1), NULL) != FALSE; #else utfSource = (cbSrc >= 3 && pSrc[0] && !pSrc[1]) || (cbSrc > 4 && pSrc[2] && !pSrc[3]); // Lame latin-only test utfSource |= (cbSrc > 3 && pSrc[0] == 0xFF && pSrc[1] == 0xFE && (pSrc[2] | pSrc[3])); // Lame BOM test #endif } if (ignoreData) { cbSrc = 0; // Overwrite the whole buffer every read continue; } if (!cbRead) { continue; // No new data, read more before trying to parse } parseLines: cchFree = cchAlloc - (pD - bufOutput); for (;;) { DWORD cbSrcChar = 1, cchDstChar, i; *pD = _T('\0'); // Terminate output buffer because we can unexpectedly run out of data if (!cbSrc) { goto readMore; } if (utfSource) { // UTF-16LE --> ?: if (cbSrc < 2) { goto readMore; } if (utfOutput) { // UTF-16LE --> UTF-16LE: bufCh[0] = ((TCHAR*)pSrc)[0], cbSrcChar = sizeof(WCHAR), cchDstChar = 1; // We only care about certain ASCII characters so we don't bother dealing with surrogate pairs. } else { // UTF-16LE --> DBCS // TODO: This is tricky because we need the complete base character (or surrogate pair) and all the trailing combining characters for a grapheme in the buffer before we can call WideCharToMultiByte. utfOutput = FALSE; // For now we just treat it as DBCS continue; } } else { // DBCS --> ?: if (utfOutput) { // DBCS --> UTF-16LE: BOOL isMb = IsDBCSLeadByteEx(codepage, ((CHAR*)pSrc)[0]); if (isMb && cbSrc < ++cbSrcChar) { goto readMore; } cchDstChar = MultiByteToWideChar(codepage, 0, (CHAR*)pSrc, cbSrcChar, (WCHAR*) bufCh, 2); } else { // DBCS --> DBCS: bufCh[0] = ((CHAR*)pSrc)[0], cchDstChar = 1; // Note: OEM codepage will be converted by LogMessage } } if (bufCh[0] == _T('\t') && tabExpandLength) { // Expand tab to spaces? if (cchFree < tabExpandLength) { goto resizeOutputBuffer; } lstrcpy(pD, TAB_REPLACE); pD += tabExpandLength, cchFree -= tabExpandLength; } else if (bufCh[0] == _T('\r') && logMode) { // Eating it } else if (bufCh[0] == _T('\n') && logMode) { LogMessage(bufOutput, bOEM); // Output has already been \0 terminated *(pD = bufOutput) = _T('\0'), cchFree = cchAlloc; } else { if (cchFree < cchDstChar) { SIZE_T cchOrgOffset; resizeOutputBuffer: if (stackMode) { ignoreData = TRUE; // Buffer was already maximum for the NSIS stack, we cannot handle more data if (utfOutput) TruncateStringUTF16LE((LPWSTR) bufOutput, pD - bufOutput, (LPCWSTR) bufCh, cchDstChar); else TruncateStringMB(codepage, (LPSTR) bufOutput, pD - bufOutput, bufCh[0]); goto waitForProcess; } cchAlloc += 1024, cbAlloc = cchAlloc / sizeof(TCHAR); pNewAlloc = GlobalReAlloc(bufOutput, cbAlloc + sizeof(TCHAR),GPTR|GMEM_MOVEABLE); // Include "hidden" space for a \0 if (!pNewAlloc) { lstrcpy(szRet, _T("error")); ignoreData = TRUE; goto waitForProcess; } cchOrgOffset = pD - bufOutput; *(pD = (bufOutput = pNewAlloc) + cchOrgOffset) = _T('\0'); goto parseLines; } for (i = 0; i < cchDstChar; ++i) { *pD++ = bufCh[i], --cchFree; } } pSrc += cbSrcChar, cbSrc -= cbSrcChar; } } done: if (stackMode) pushstring(bufOutput); if (logMode && *bufOutput) LogMessage(bufOutput,bOEM); // Write remaining output if (dwExit == STATUS_ILLEGAL_INSTRUCTION) lstrcpy(szRet, _T("error")); if (!szRet[0]) wsprintf(szRet,_T("%d"),dwExit); pushstring(szRet); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(newstdout); CloseHandle(read_stdout); CloseHandle(newstdin); CloseHandle(read_stdin); if (pExec-2 >= g_exec) *(pExec-2) = _T('\0'); // skip space and quote if (executor) DeleteFile(executor); GlobalFree(g_exec); if (bufOutput) GlobalFree(bufOutput); } } TCHAR *my_strstr(TCHAR *a, TCHAR *b) { int l = lstrlen(b); while (lstrlen(a) >= l) { TCHAR c = a[l]; a[l] = 0; if (!lstrcmpi(a, b)) { a[l] = c; return a; } a[l] = c; a = CharNext(a); } return NULL; } unsigned int my_atoi(TCHAR *s) { unsigned int v=0; if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) { s+=2; for (;;) { int c=*s++; if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; else break; v<<=4; v+=c; } } else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) { s++; for (;;) { int c=*s++; if (c >= _T('0') && c <= _T('7')) c-=_T('0'); else break; v<<=3; v+=c; } } else { for (;;) { int c=*s++ - _T('0'); if (c < 0 || c > 9) break; v*=10; v+=c; } } return (int)v; } int WINAPI AsExeWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DWORD Ret; STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; TCHAR command_line[1024]; //BUGBUG TCHAR seekchar=_T(' '); TCHAR *cmdline; si.cb = sizeof(si); // Make child process use this app's standard files. Not needed because the handles // we created when executing this process were inheritable. //si.dwFlags = STARTF_USESTDHANDLES; //si.hStdInput = GetStdHandle (STD_INPUT_HANDLE); //si.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE); //si.hStdError = GetStdHandle (STD_ERROR_HANDLE); lstrcpyn(command_line, GetCommandLine(), 1024); cmdline = command_line; if (*cmdline == _T('\"')) seekchar = *cmdline++; while (*cmdline && *cmdline != seekchar) cmdline=CharNext(cmdline); cmdline=CharNext(cmdline); // skip any spaces before the arguments while (*cmdline && *cmdline == _T(' ')) cmdline++; Ret = CreateProcess (NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ); if (Ret) { WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &Ret); CloseHandle (pi.hProcess); CloseHandle (pi.hThread); ExitProcess(Ret); } else { ExitProcess(STATUS_ILLEGAL_INSTRUCTION); } return 0; // dummy } nsis-3.11/Contrib/nsExec/test.nsi000077500000000000000000000014541477201124000167360ustar00rootroot00000000000000Name "nsExec Test" OutFile "nsExec Test.exe" ShowInstDetails show Section "Silent MakeNSIS" nsExec::Exec '"${NSISDIR}\makensis.exe"' Pop $0 # return value/error/timeout DetailPrint "" DetailPrint " Return value: $0" DetailPrint "" SectionEnd Section "MakeNSIS commands help" nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP' Pop $0 # return value/error/timeout DetailPrint "" DetailPrint " Return value: $0" DetailPrint "" SectionEnd Section "Output to variable" nsExec::ExecToStack '"${NSISDIR}\makensis.exe" /VERSION' Pop $0 # return value/error/timeout Pop $1 # printed text, up to ${NSIS_MAX_STRLEN} DetailPrint '"${NSISDIR}\makensis.exe" /VERSION printed: $1' DetailPrint "" DetailPrint " Return value: $0" DetailPrint "" SectionEndnsis-3.11/Contrib/zip2exe/000077500000000000000000000000001477201124000153765ustar00rootroot00000000000000nsis-3.11/Contrib/zip2exe/Base.nsh000077500000000000000000000033231477201124000167660ustar00rootroot00000000000000;Change this file to customize zip2exe generated installers Name "${ZIP2EXE_NAME}" OutFile "${ZIP2EXE_OUTFILE}" AllowRootDirInstall true !ifdef ZIP2EXE_COMPRESSOR_SOLID !define SETCOMPRESSOR_SWITCH /SOLID !else !define SETCOMPRESSOR_SWITCH !endif SetCompressor ${SETCOMPRESSOR_SWITCH} ${ZIP2EXE_COMPRESSOR} !ifdef ZIP2EXE_INSTALLDIR InstallDir "${ZIP2EXE_INSTALLDIR}" Function zip2exe.SetOutPath SetOutPath "$INSTDIR" FunctionEnd !else ifdef ZIP2EXE_INSTALLDIR_WINAMP InstallDir "$PROGRAMFILES\Winamp" InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString" Function .onVerifyInstDir IfFileExists $INSTDIR\winamp.exe WinampInstalled Abort WinampInstalled: FunctionEnd !ifdef ZIP2EXE_INSTALLDIR_WINAMPMODE Var ZIP2EXE_TEMP1 Var ZIP2EXE_TEMP2 Function zip2exe.SetOutPath !ifdef ZIP2EXE_INSTALLDIR_SKINS StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Skins" !else StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Plugins" !endif ReadINIStr $ZIP2EXE_TEMP2 "$INSTDIR\winamp.ini" "Winamp" "${ZIP2EXE_INSTALLDIR_WINAMPMODE}" StrCmp $ZIP2EXE_TEMP2 "" End IfFileExists $ZIP2EXE_TEMP2 0 End StrCpy $ZIP2EXE_TEMP1 $ZIP2EXE_TEMP2 End: SetOutPath $ZIP2EXE_TEMP1 FunctionEnd !else Function zip2exe.SetOutPath !ifdef ZIP2EXE_INSTALLDIR_PLUGINS SetOutPath "$INSTDIR\Plugins" !else SetOutPath "$INSTDIR" !endif FunctionEnd !endif !endif !macro SECTION_BEGIN Section "" Call zip2exe.SetOutPath !macroend !macro SECTION_END SectionEnd !macroendnsis-3.11/Contrib/zip2exe/Classic.nsh000077500000000000000000000001661477201124000174770ustar00rootroot00000000000000;Change this file to customize zip2exe generated installers with a classic interface Page directory Page instfilesnsis-3.11/Contrib/zip2exe/Modern.nsh000077500000000000000000000003251477201124000173370ustar00rootroot00000000000000;Change this file to customize zip2exe generated installers with a modern interface !include "MUI2.nsh" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_LANGUAGE "English"nsis-3.11/Contrib/zip2exe/SConscript000077500000000000000000000006651477201124000174220ustar00rootroot00000000000000target = "zip2exe" files = Split(""" main.cpp zlib/ioapi.c zlib/unzip.c """) resources = Split(""" zip2exe.xml icon.ico """) rc = 'res.rc' libs = Split(""" advapi32 shell32 shlwapi comctl32 comdlg32 user32 gdi32 z """) headers = Split(""" Base.nsh Classic.nsh Modern.nsh """) Import('BuildUtil defenv') BuildUtil(target, files, libs, res = rc, resources = resources) defenv.DistributeContrib(headers,path=target) nsis-3.11/Contrib/zip2exe/icon.ico000077500000000000000000000013761477201124000170340ustar00rootroot00000000000000 è( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwxÝxøðˆÝ™€p‡øýÙ™ˆxøð‡xˆÙ˜ˆ€xw‡‡øÙˆ‹°xøð‡xxxp ‹»°€xw‡‡»¸€xøð‡xˆ»xxp€xx»‰°‡‡€ÿð‡{¸›½ÿxxpÿðxw‰»½ø÷‡ÿð‡‡›»Ýxˆˆÿðˆˆ{½Ýˆøðˆpÿðˆˆ}݈€wwˆpÿðˆˆ÷wwÿÿÿÿpwwpˆˆwwwwwwwxpwwpˆˆ€ÿÿ÷ˆˆˆˆˆˆˆˆ‡wwwwpˆÿÿÿÿÿÿÿ‡wwð‡wwpð‡ÿÿðð‡wwpðð‡ðÿÿð‡ðÿÿð‡ðÿð‡ðÿ‡ð‡ð‡ÿÿÿÿÿÿÿ‡wwwwwwwwÿþÿÀøÿÀpÿÀ ÀÀ?À?À`?À`?À?À?ÀÀÀÀÀÀÀ€øüþÿÿøÿøÿøÿøÿøÿøÿøÿünsis-3.11/Contrib/zip2exe/main.cpp000077500000000000000000000622521477201124000170400ustar00rootroot00000000000000 #include "../../Source/Platform.h" #undef _tcsrchr // The fix for bug #1085 causes a MSVC redefinition warning when is included by zlib/unzip.h -> zlib/ioapi.h. // Platform.h includes our custom tchar.h and // VS2015 does not like this because we are about to pull in its tchar.h. // As a temporary workaround we just undefine the things it disagrees with: #undef _vstprintf #undef _tcstok #include #include #include #include #include #include #ifndef COUNTOF #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #endif /* version 0.40 (by Anders Kjersem) * The compressor can be specified with the ZIP2EXE_COMPRESSOR define version 0.39 (by Anders Kjersem) * Accept .zip as command line parameter version 0.38 (by Anders Kjersem) * Aborts if the zip file is encrypted version 0.37 (by Anders Kjersem) * Unicode checkbox * No output log length limit * Fixed tab order version 0.36 * Unicode support by Jim Park -- 08/27/2007 * This support allow Unicode *ZIP file* names but does NOT allow the archive * to store Unicode files inside it. That's a ZLIB limitation that I can't * do much about. version 0.35 * drag & drop support version 0.34 * preserve zip timestamps version 0.33 * Added solid compression checkbox version 0.32 * Fixed codepage problems version 0.31 (by Joost Verburg) * LZMA compression support * Fixed compression setting version 0.31 (by Joost Verburg) * Based on header files * Improved interface * Modern UI support * New script code * Immproved folder detection portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com) */ extern "C" { #include "zlib/unzip.h" }; #include "resource.h" #define WM_NOTIFYENDCOMPILE WM_APP const TCHAR *g_errcaption=_T("Zip2Exe Error"); const TCHAR *g_options=_T("/V3 /OUTPUTCHARSET UTF8"); HINSTANCE g_hInstance; HWND g_hwnd; HANDLE g_hThread; TCHAR g_cmdline[1024]; TCHAR tempzip_path[1024]; TCHAR nsifilename[MAX_PATH]; int g_extracting; int g_compressor; int g_compressor_solid; int g_mui; int g_zipfile_size; bool g_made; static INT_PTR CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); NSIS_ENTRYPOINT_SIMPLEGUI int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int ShowCmd) { InitCommonControls(); g_hInstance=hInst; return (int) DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc); } enum { COMPRESSORID_FIRST = IDC_ZLIB, COMPRESSORID_LAST = IDC_LZMA }; static LPCTSTR GetCompressorName() { #ifdef C_ASSERT C_ASSERT(3 == COMPRESSORID_LAST - COMPRESSORID_FIRST + 1); #endif switch (g_compressor) { case IDC_ZLIB + 1 - COMPRESSORID_FIRST: return _T("ZLIB"); case IDC_BZIP2 + 1 - COMPRESSORID_FIRST: return _T("BZIP2"); case IDC_LZMA + 1 - COMPRESSORID_FIRST: return _T("LZMA"); default: return _T("?"); } } static int GetCheckedCompressor(HWND hwndDlg) { for (UINT id = COMPRESSORID_FIRST; id <= COMPRESSORID_LAST; ++id) if (IsDlgButtonChecked(hwndDlg,id)) return id + 1 - COMPRESSORID_FIRST; return 0; } static bool IsEncrypted(unz_file_info&zfi) { const unsigned short gpf_encrypted = (1<< 0); // 2.0.0+ //nst unsigned short gpf_encstrong = (1<< 6); // 5.0.0+ APPNOTE says that bit 0 MUST be set if bit 6 is set const unsigned short gpf_enccntdir = (1<<13); // 6.2.0+ Central Directory Encryption return (zfi.flag & (gpf_encrypted|gpf_enccntdir)) != 0; } static void doRMDir(TCHAR *buf) { HANDLE h; WIN32_FIND_DATA fd; TCHAR *p=buf; while (*p) p++; lstrcpy(p,_T("\\*.*")); h = FindFirstFile(buf,&fd); if (h != INVALID_HANDLE_VALUE) { do { if (fd.cFileName[0] != _T('.') || (fd.cFileName[1] != _T('.') && fd.cFileName[1])) { lstrcpy(p+1,fd.cFileName); if (fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buf,fd.dwFileAttributes^FILE_ATTRIBUTE_READONLY); if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) doRMDir(buf); else { DeleteFile(buf); } } } while (FindNextFile(h,&fd)); FindClose(h); } p[0]=0; // fix buffer RemoveDirectory(buf); } static void doMKDir(TCHAR *directory) { TCHAR *p, *p2; TCHAR buf[MAX_PATH]; if (!*directory) return; lstrcpy(buf,directory); p=buf; while (*p) p++; while (p >= buf && *p != _T('\\')) p--; p2 = buf; if (p2[1] == _T(':')) p2+=4; else if (p2[0] == _T('\\') && p2[1] == _T('\\')) { p2+=2; while (*p2 && *p2 != _T('\\')) p2++; if (*p2) p2++; while (*p2 && *p2 != _T('\\')) p2++; if (*p2) p2++; } if (p >= p2) { *p=0; doMKDir(buf); } CreateDirectory(directory,NULL); } void tempzip_cleanup(HWND hwndDlg, int err) { if (tempzip_path[0]) doRMDir(tempzip_path); tempzip_path[0]=0; if (err) { SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_RESETCONTENT,0,0); EnableWindow(GetDlgItem(hwndDlg,IDOK),0); SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,_T("")); SetDlgItemText(hwndDlg,IDC_ZIPFILE,_T("")); SetDlgItemText(hwndDlg,IDC_OUTFILE,_T("")); } } int tempzip_make(HWND hwndDlg, TCHAR *fn) { TCHAR buf[MAX_PATH]; GetTempPath(MAX_PATH,buf); GetTempFileName(buf,_T("z2e"),GetTickCount(),tempzip_path); if (!CreateDirectory(tempzip_path,NULL)) { GetTempPath(MAX_PATH,tempzip_path); _tcscat(tempzip_path,_T("\\nsi")); if (!CreateDirectory(tempzip_path,NULL)) { tempzip_path[0]=0; MessageBox(hwndDlg,_T("Error creating temporary directory"),g_errcaption,MB_OK|MB_ICONSTOP); return 1; } } FILE *fp=_tfopen(fn,_T("rb")); if (fp) { fseek(fp,0,SEEK_END); g_zipfile_size=ftell(fp); fclose(fp); } else g_zipfile_size=0; unzFile f; f = unzOpen(fn); if (!f || unzGoToFirstFile(f) != UNZ_OK) { if (f) unzClose(f); MessageBox(hwndDlg,_T("Error opening ZIP file"),g_errcaption,MB_OK|MB_ICONSTOP); return 1; } int nf=0, nkb=0; g_extracting=1; do { char filenameA[MAX_PATH]; unz_file_info info; // ZREAD uses byte size, not TCHAR length. unzGetCurrentFileInfo(f,&info,filenameA,sizeof(filenameA),NULL,0,NULL,0); if (IsEncrypted(info)) { if (f) unzClose(f); g_extracting = 0; MessageBox(hwndDlg,_T("Encrypted ZIP files are not supported!"),g_errcaption,MB_OK|MB_ICONSTOP); return 1; } // was zip created on MS-DOS/Windows? if ((info.version & 0xFF00) == 0) { OemToCharBuffA(filenameA, filenameA, (DWORD)strlen(filenameA)); } #ifdef _UNICODE TCHAR filename[MAX_PATH]; if (MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filename, MAX_PATH) == 0) { if (f) unzClose(f); g_extracting = 0; MessageBox(hwndDlg,_T("Error converting filename to Unicode"), g_errcaption, MB_OK|MB_ICONSTOP); return 1; } #else char* filename = filenameA; #endif if (filename[0] && filename[_tcslen(filename)-1] != _T('\\') && filename[_tcslen(filename)-1] != _T('/')) { TCHAR *pfn=filename; while (*pfn) { if (*pfn == _T('/')) *pfn=_T('\\'); pfn++; } pfn=filename; if (pfn[1] == _T(':') && pfn[2] == _T('\\')) pfn+=3; while (*pfn == _T('\\')) pfn++; TCHAR out_filename[1024]; lstrcpy(out_filename,tempzip_path); lstrcat(out_filename,_T("\\")); lstrcat(out_filename,pfn); if (_tcsstr(pfn,_T("\\"))) { TCHAR buf[1024]; lstrcpy(buf,out_filename); TCHAR *p=buf+_tcslen(buf); while (p > buf && *p != _T('\\')) p--; *p=0; if (buf[0]) doMKDir(buf); } if (unzOpenCurrentFile(f) == UNZ_OK) { SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_ADDSTRING,0,(LPARAM)pfn); FILE *fp; int l; fp = _tfopen(out_filename,_T("wb")); if (fp) { do { // Jim Park: Local buf, no need to TCHAR char buf[1024]; l=unzReadCurrentFile(f,buf,sizeof(buf)); if (l > 0) { if (fwrite(buf,1,l,fp) != (unsigned int)l) { unzClose(f); fclose(fp); MessageBox(hwndDlg,_T("Error writing output file(s)"),g_errcaption,MB_OK|MB_ICONSTOP); g_extracting=0; return 1; } nkb++; } } while (l > 0); fclose(fp); { // set file time HANDLE hf = CreateFile(out_filename, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0); if (hf != INVALID_HANDLE_VALUE) { FILETIME ft, lft; DosDateTimeToFileTime(HIWORD(info.dosDate), LOWORD(info.dosDate), &ft); LocalFileTimeToFileTime(&ft, &lft); SetFileTime(hf, 0, 0, &lft); CloseHandle(hf); } } } else { unzClose(f); MessageBox(hwndDlg,_T("Error opening output file(s)"),g_errcaption,MB_OK|MB_ICONSTOP); g_extracting=0; return 1; } nf++; wsprintf(buf,_T("Extracting: %d files, %dKB"),nf,nkb); SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf); MSG msg; int quit=0; while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message == WM_DESTROY && msg.hwnd == g_hwnd) { quit++; break; } TranslateMessage(&msg); DispatchMessage(&msg); } unzCloseCurrentFile(f); if (quit) break; } else { unzClose(f); MessageBox(hwndDlg,_T("Error extracting from ZIP file"),g_errcaption,MB_OK|MB_ICONSTOP); g_extracting=0; return 1; } } } while (unzGoToNextFile(f) == UNZ_OK); g_extracting=0; wsprintf(buf,_T("Extracted: %d files, %dKB"),nf,nkb); SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf); unzClose(f); return 0; } const TCHAR *gp_winamp = _T("(WINAMP DIRECTORY)"); const TCHAR *gp_winamp_plugins = _T("(WINAMP PLUG-INS DIRECTORY)"); const TCHAR *gp_winamp_vis = _T("(WINAMP VIS PLUG-INS DIRECTORY)"); const TCHAR *gp_winamp_dsp = _T("(WINAMP DSP PLUG-INS DIRECTORY)"); const TCHAR *gp_winamp_skins = _T("(WINAMP SKINS DIRECTORY)"); const TCHAR *gp_poi = _T("(PATH OF INSTALLER)"); void wnd_printf(const TCHAR *str) { if (!*str) return; HWND hLog=GetDlgItem(g_hwnd,IDC_OUTPUTTEXT); SendMessage(hLog,EM_SETSEL,0x7fffffff,-1); SendMessage(hLog,EM_REPLACESEL,false,(LPARAM)str); } void ErrorMessage(const TCHAR *str) //display detailed error info { LPVOID msg; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &msg, 0, NULL ); wnd_printf(str); wnd_printf(_T(": ")); wnd_printf((TCHAR*)msg); LocalFree(msg); } DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor makensis { TCHAR buf[1024]; char iobuf[1024]; //i/o buffer STARTUPINFO si={sizeof(si),}; SECURITY_ATTRIBUTES sa={sizeof(sa),}; SECURITY_DESCRIPTOR sd={0,}; //security information for pipes PROCESS_INFORMATION pi={0,}; HANDLE newstdout=0,read_stdout=0; //pipe handles OSVERSIONINFO osv={sizeof(osv)}; GetVersionEx(&osv); if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) //initialize security descriptor (Windows NT) { InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, false); sa.lpSecurityDescriptor = &sd; } else sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = true; //allow inheritable handles if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //create stdout pipe { ErrorMessage(_T("CreatePipe")); PostMessage(g_hwnd,WM_NOTIFYENDCOMPILE,0,1); return 1; } GetStartupInfo(&si); //set startupinfo for the spawned process /* The dwFlags member tells CreateProcess how to make the process. STARTF_USESTDHANDLES validates the hStd* members. STARTF_USESHOWWINDOW validates the wShowWindow member. */ si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = newstdout; si.hStdError = newstdout; //set the new handles for the child process // ******************************************************************* // If there is a command line in the config file, use it for create process //spawn the child process if (!CreateProcess(NULL,g_cmdline,NULL,NULL,TRUE,CREATE_NEW_CONSOLE, NULL,tempzip_path,&si,&pi)) { ErrorMessage(_T("CreateProcess")); wnd_printf(_T("\r\nPlease make sure the path to makensis.exe is correct.")); CloseHandle(newstdout); CloseHandle(read_stdout); PostMessage(g_hwnd,WM_NOTIFYENDCOMPILE,0,1); return 1; } CloseHandle(newstdout); // close this handle (duplicated in subprocess) now so we get ERROR_BROKEN_PIPE DWORD dwLeft = 0, dwRead = 0; while (ReadFile(read_stdout, iobuf+dwLeft, sizeof(iobuf)-dwLeft-1, &dwRead, NULL)) //wait for buffer, or fails with ERROR_BROKEN_PIPE when subprocess exits { dwRead += dwLeft; iobuf[dwRead] = '\0'; #ifdef _UNICODE // this tweak is to prevent LogMessage from cutting in the middle of an UTF-8 sequence // we print only up to the latest \n of the buffer, and keep the remaining for the next loop char* lastLF = strrchr(iobuf,'\n'); if (lastLF == NULL) lastLF = iobuf+dwRead-1; char ch = *++lastLF; *lastLF = '\0'; MultiByteToWideChar(CP_UTF8,0,iobuf,(int)(lastLF+1-iobuf),buf,COUNTOF(buf)); wnd_printf(buf); *lastLF = ch; dwLeft = (DWORD)(iobuf+dwRead-lastLF); memmove(iobuf, lastLF, dwLeft); #else wnd_printf(iobuf); #endif } #ifdef _UNICODE // because of UTF-8 tweak, in rare case there can be some data remaining dwRead += dwLeft; iobuf[dwRead] = 0; MultiByteToWideChar(CP_UTF8,0,iobuf,dwRead+1,buf,COUNTOF(buf)); wnd_printf(buf); #endif CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(read_stdout); wsprintf(buf,_T("(source ZIP size was %d bytes)\r\n"),g_zipfile_size); wnd_printf(buf); PostMessage(g_hwnd,WM_NOTIFYENDCOMPILE,0,0); return 0; } void makeEXE(HWND hwndDlg) { TCHAR buf[2048]; GetTempPath(MAX_PATH,buf); GetTempFileName(buf,_T("zne"),0,nsifilename); #ifdef _UNICODE FILE *fp=_tfopen(nsifilename,_T("w, ccs=UNICODE")); // generate a Unicode .NSI file BUGBUG: MSVCRT version specific #else FILE *fp=_tfopen(nsifilename,_T("w")); #endif if (!fp) { MessageBox(hwndDlg,_T("Error writing .NSI file"),g_errcaption,MB_OK|MB_ICONSTOP); PostMessage(g_hwnd,WM_NOTIFYENDCOMPILE,0,0); return; } _ftprintf(fp,_T("Unicode %s\n"),IsDlgButtonChecked(hwndDlg,IDC_UNICODE)?_T("true"):_T("false")); GetDlgItemText(hwndDlg,IDC_INSTNAME,buf,sizeof(buf)); _ftprintf(fp,_T("!define ZIP2EXE_NAME `%s`\n"),buf); GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf)); _ftprintf(fp,_T("!define ZIP2EXE_OUTFILE `%s`\n"),buf); LPCTSTR compname = GetCompressorName(); _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR %s\n"), compname); _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_%s\n"), compname); // Compatibility define if (g_compressor_solid == 1) _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_SOLID\n")); GetDlgItemText(hwndDlg,IDC_INSTPATH,buf,sizeof(buf)); int iswinamp=0; LPCTSTR iswinampmode=NULL; if (!_tcscmp(buf,gp_poi)) lstrcpy(buf,_T("$EXEDIR")); if (!_tcscmp(buf,gp_winamp)) { iswinamp=1; } if (!_tcscmp(buf,gp_winamp_plugins)) { iswinamp=1; _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_PLUGINS\n")); } if (!_tcscmp(buf,gp_winamp_vis)) { iswinamp=1; iswinampmode=_T("VisDir"); } if (!_tcscmp(buf,gp_winamp_dsp)) { iswinamp=1; iswinampmode=_T("DSPDir"); } if (!_tcscmp(buf,gp_winamp_skins)) { iswinamp=1; iswinampmode=_T("SkinDir"); _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_SKINS\n")); } if (iswinamp) { _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_WINAMP\n")); if (iswinampmode) { _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_WINAMPMODE `%s`\n"),iswinampmode); } } else // set out path to $INSTDIR { _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR `%s`\n"),buf); } _ftprintf(fp,_T("!include `${NSISDIR}\\Contrib\\zip2exe\\Base.nsh`\n")); _ftprintf(fp,_T("!include `${NSISDIR}\\Contrib\\zip2exe\\%s.nsh`\n"),g_mui?_T("Modern"):_T("Classic")); _ftprintf(fp,_T("!insertmacro SECTION_BEGIN\n")); _ftprintf(fp,_T("File /r `%s\\*.*`\n"),tempzip_path); _ftprintf(fp,_T("!insertmacro SECTION_END\n")); fclose(fp); TCHAR g_makensis_path[MAX_PATH]; TCHAR *p=g_makensis_path; GetModuleFileName(g_hInstance,g_makensis_path,sizeof(g_makensis_path)); while (*p) p++; while (p >= g_makensis_path && *p != _T('\\')) p--; _tcscpy(p+1,_T("makensis.exe")); WIN32_FIND_DATA fd; HANDLE h=FindFirstFile(g_makensis_path,&fd); if (h==INVALID_HANDLE_VALUE) { if ((p-g_makensis_path>4)&&(_totlower(*(p-1))==_T('n'))&&(_totlower(*(p-2))==_T('i'))&&(_totlower(*(p-3))==_T('b'))&&(*(p-4)==_T('\\'))) { p -= 4; _tcscpy(p+1,_T("makensis.exe")); h=FindFirstFile(g_makensis_path,&fd); if (h==INVALID_HANDLE_VALUE) { MessageBox(hwndDlg,_T("Error finding makensis.exe."),g_errcaption,MB_OK|MB_ICONSTOP); PostMessage(g_hwnd,WM_NOTIFYENDCOMPILE,0,0); return; } } } if (h!=INVALID_HANDLE_VALUE) FindClose(h); wsprintf(g_cmdline,_T("\"%s\" %s \"%s\""),g_makensis_path,g_options,nsifilename); DWORD id; g_hThread=CreateThread(NULL,0,ThreadProc,0,0,&id); } int SetZip(HWND hwndDlg, TCHAR *path) { TCHAR buf2[1024]; lstrcpy(buf2,path); tempzip_cleanup(hwndDlg,1); SetDlgItemText(hwndDlg,IDC_ZIPFILE,path); TCHAR *t=path+lstrlen(path); while (t > path && *t != _T('\\') && *t != _T('.')) t--; { TCHAR *p=t; while (p >= path && *p != _T('\\')) p--; p++; *t=0; SetDlgItemText(hwndDlg,IDC_INSTNAME,p[0]?p:_T("Stuff")); } _tcscpy(t,_T(".exe")); SetDlgItemText(hwndDlg,IDC_OUTFILE,path); if (tempzip_make(hwndDlg,buf2)) { tempzip_cleanup(hwndDlg,1); return 1; } else { EnableWindow(GetDlgItem(hwndDlg,IDOK),1); return 0; } } INT_PTR CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int ids[]={IDC_INFO,IDC_NSISICON,IDC_SZIPFRAME,IDC_BROWSE,IDC_ZIPFILE,IDC_ZIPINFO_SUMMARY,IDC_ZIPINFO_FILES,IDC_OFRAME,IDC_INAMEST, IDC_INSTNAME,IDC_INSTPATH,IDC_OEFST,IDC_OUTFILE,IDC_BROWSE2,IDC_COMPRESSOR,IDC_ZLIB,IDC_BZIP2,IDC_LZMA,IDC_SOLID,IDC_INTERFACE,IDC_MODERNUI,IDC_CLASSICUI,IDC_UNICODE}; static HICON hIcon=0; static HFONT hFont=0; switch (uMsg) { case WM_SIZE: if (wParam == SIZE_MAXIMIZED) ShowWindow(hwndDlg, SW_SHOWNOACTIVATE); // Disallow STARTF_USESHOWWINDOW+SW_MAXIMIZE break; case WM_INITDIALOG: g_hwnd=hwndDlg; CheckDlgButton(hwndDlg,IDC_LZMA,BST_CHECKED); CheckDlgButton(hwndDlg,IDC_MODERNUI,BST_CHECKED); CheckDlgButton(hwndDlg,IDC_UNICODE,BST_CHECKED); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_poi); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$TEMP")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$SYSDIR")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$WINDIR")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$DESKTOP")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$DESKTOP\\YourNameHere")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$PROGRAMFILES\\YourNameHere")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$STARTMENU")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$SMPROGRAMS")); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_plugins); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_vis); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_dsp); SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_skins); SetDlgItemText(hwndDlg,IDC_INSTPATH,gp_poi); hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1)); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)hIcon); hFont=CreateFont(15,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,_T("Courier New")); SendDlgItemMessage(hwndDlg,IDC_OUTPUTTEXT,WM_SETFONT,(WPARAM)hFont,0); DragAcceptFiles(hwndDlg,TRUE); { LPTSTR args = PathGetArgs(GetCommandLine()); TCHAR buf[100]; lstrcpyn(buf, args, sizeof("/GENERATE")); BOOL generate = !_tcsicmp(buf, _T("/GENERATE")); args += generate ? sizeof("/GENERATE") : 0; while (*args <= ' ' && *args) ++args; PathUnquoteSpaces(args); if (*args && !SetZip(hwndDlg, args) && generate) PostMessage(hwndDlg, WM_COMMAND, IDOK, 0); } return 1; case WM_NCDESTROY: DeleteObject(hIcon); hIcon=0; DeleteObject(hFont); hFont=0; break; case WM_CLOSE: if (!g_hThread) { tempzip_cleanup(hwndDlg,0); EndDialog(hwndDlg,1); } break; case WM_NOTIFYENDCOMPILE: if (g_hThread) { if (!lParam) ShowWindow(GetDlgItem(hwndDlg,IDC_TEST),SW_SHOWNA); CloseHandle(g_hThread); g_hThread=0; } g_made=true; ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_SHOWNA); EnableWindow(GetDlgItem(hwndDlg,IDOK),1); if (nsifilename[0]) DeleteFile(nsifilename); nsifilename[0]=0; break; case WM_DROPFILES: { TCHAR dropped_file[MAX_PATH]=_T(""); if (DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0)==1) { DragQueryFile((HDROP)wParam,0,dropped_file,MAX_PATH); if (lstrlen(dropped_file)>0) { SetZip(hwndDlg,dropped_file); } } else { MessageBox(hwndDlg,_T("Dropping more than one zip file at a time is not supported"),g_errcaption,MB_OK|MB_ICONSTOP); } DragFinish((HDROP)wParam); return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BROWSE: if (!g_extracting) { OPENFILENAME l={sizeof(l),}; TCHAR buf[1024]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("ZIP Files\0*.zip\0All Files\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = 1023; l.lpstrTitle = _T("Open ZIP File"); l.lpstrDefExt = _T("zip"); l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST; buf[0]=0; if (GetOpenFileName(&l)) { SetZip(hwndDlg,buf); } } break; case IDC_BROWSE2: { OPENFILENAME l={sizeof(l),}; TCHAR buf[1024]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("Executables\0*.exe\0All Files\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = 1023; l.lpstrTitle = _T("Select Output EXE File"); l.lpstrDefExt = _T("exe"); l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER; GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf)); if (GetSaveFileName(&l)) { SetDlgItemText(hwndDlg,IDC_OUTFILE,buf); } } break; case IDC_BACK: if (!g_hThread) { g_made=false; ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_HIDE); ShowWindow(GetDlgItem(hwndDlg,IDC_TEST),SW_HIDE); ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_HIDE); { for (size_t x = 0; x < COUNTOF(ids); x ++) ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_SHOWNA); SetDlgItemText(hwndDlg,IDOK,_T("&Generate")); EnableWindow(GetDlgItem(hwndDlg,IDOK),1); } } break; case IDC_TEST: if (!g_hThread) { TCHAR buf[1024]; GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,COUNTOF(buf)); ShellExecute(hwndDlg,_T("open"),buf,_T(""),_T(""),SW_SHOW); } break; case IDOK: if (!g_hThread) { if (!g_made) { g_compressor = GetCheckedCompressor(hwndDlg); g_compressor_solid = IsDlgButtonChecked(hwndDlg,IDC_SOLID) != false; g_mui=!IsDlgButtonChecked(hwndDlg,IDC_CLASSICUI); SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, _T("")); for (size_t x = 0; x < COUNTOF(ids); x ++) ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_HIDE); ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_SHOWNA); SetDlgItemText(hwndDlg,IDOK,_T("&Close")); EnableWindow(GetDlgItem(hwndDlg,IDOK),0); makeEXE(hwndDlg); } else { tempzip_cleanup(hwndDlg,0); EndDialog(hwndDlg,0); } } break; } break; } return FALSE; } nsis-3.11/Contrib/zip2exe/res.rc000077500000000000000000000114301477201124000165170ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_DIALOG1 DIALOGEX 0, 0, 360, 271 STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Zip2Exe 0.40" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_ICON1,IDC_NSISICON,6,6,20,20 LTEXT "Zip2Exe converts a ZIP file to a self extracting archive (a simple NSIS installer). To customize the NSIS script code, modify the header files in the 'Contrib\\zip2exe' folder.", IDC_INFO,36,6,312,18 GROUPBOX "Source ZIP File",IDC_SZIPFRAME,7,31,347,101 PUSHBUTTON "&Open...",IDC_BROWSE,18,48,54,13 EDITTEXT IDC_ZIPFILE,78,48,264,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP LTEXT "",IDC_ZIPINFO_SUMMARY,18,66,324,8 LISTBOX IDC_ZIPINFO_FILES,18,78,324,45,LBS_NOINTEGRALHEIGHT | LBS_NOSEL | WS_VSCROLL GROUPBOX "Output Installer Options",IDC_OFRAME,6,138,347,108 LTEXT "Installer Name",IDC_INAMEST,18,156,48,8 EDITTEXT IDC_INSTNAME,78,156,264,12,ES_AUTOHSCROLL LTEXT "Interface",IDC_INTERFACE,18,174,30,8 CONTROL "Modern",IDC_MODERNUI,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,78,174, 42,12 CONTROL "Classic",IDC_CLASSICUI,"Button",BS_AUTORADIOBUTTON,132, 174,42,12 CONTROL "Unicode",IDC_UNICODE,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,180,174,42,12 LTEXT "Default Folder",IDC_DEPST,18,192,48,8 COMBOBOX IDC_INSTPATH,78,192,264,126,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL LTEXT "Output EXE File",IDC_OEFST,18,210,54,8 EDITTEXT IDC_OUTFILE,78,210,204,12,ES_AUTOHSCROLL PUSHBUTTON "&Browse...",IDC_BROWSE2,288,210,54,13 LTEXT "Compression",IDC_COMPRESSOR,18,228,42,8 CONTROL "LZMA",IDC_LZMA,"Button",BS_AUTORADIOBUTTON | WS_GROUP| WS_TABSTOP,78,228,36,10 CONTROL "BZip2",IDC_BZIP2,"Button",BS_AUTORADIOBUTTON,132,228,36, 10 CONTROL "ZLib",IDC_ZLIB,"Button",BS_AUTORADIOBUTTON,186,228,30, 10 CONTROL "Solid",IDC_SOLID,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,228,30, 10 DEFPUSHBUTTON "&Generate",IDOK,306,252,48,14,WS_DISABLED PUSHBUTTON "&Test",IDC_TEST,246,252,49,14,NOT WS_VISIBLE PUSHBUTTON "< &Back",IDC_BACK,6,252,48,14,NOT WS_VISIBLE EDITTEXT IDC_OUTPUTTEXT,0,0,359,246,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE | WS_VSCROLL | WS_HSCROLL END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_DIALOG1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 353 TOPMARGIN, 7 BOTTOMMARGIN, 264 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON "icon.ico" ///////////////////////////////////////////////////////////////////////////// // // RT_MANIFEST // 1 RT_MANIFEST "zip2exe.xml" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED nsis-3.11/Contrib/zip2exe/resource.h000077500000000000000000000033621477201124000174050ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by res.rc // #define IDD_DIALOG1 101 #define IDI_ICON1 102 #define IDC_ZIPFILE 1000 #define IDC_BROWSE 1001 #define IDC_ZIPINFO_SUMMARY 1002 #define IDC_ZIPINFO_FILES 1004 #define IDC_INSTPATH 1005 #define IDC_DESCTEXT 1006 #define IDC_OUTFILE 1007 #define IDC_BROWSE2 1008 #define IDC_INSTNAME 1009 #define IDC_SZIPFRAME 1010 #define IDC_OFRAME 1011 #define IDC_INAMEST 1012 #define IDC_DEPST 1014 #define IDC_OEFST 1015 #define IDC_OUTPUTTEXT 1016 #define IDC_TEST 1017 #define IDC_BACK 1018 #define IDC_COMPILER 1019 #define IDC_UNICODE 1020 #define IDC_MODERNUI 1021 #define IDC_COMPRESSOR 1022 #define IDC_INTERFACE 1023 #define IDC_SOLID 1024 #define IDC_CLASSICUI 1025 #define IDC_INFO 1026 #define IDC_NSISICON 1027 #define IDC_ZLIB 1028 #define IDC_BZIP2 1029 #define IDC_LZMA 1030 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1031 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Contrib/zip2exe/zip2exe.xml000077500000000000000000000016601477201124000175140ustar00rootroot00000000000000 Zip2Exe nsis-3.11/Contrib/zip2exe/zlib/000077500000000000000000000000001477201124000163365ustar00rootroot00000000000000nsis-3.11/Contrib/zip2exe/zlib/crypt.h000077500000000000000000000111411477201124000176510ustar00rootroot00000000000000/* crypt.h -- base code for crypt/uncrypt ZIPfile Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This code is a modified version of crypting code in Infozip distribution The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). If you don't need crypting in your application, just define symbols NOCRYPT and NOUNCRYPT. This code support the "Traditional PKWARE Encryption". The new AES encryption added on Zip format by Winzip (see the page http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong Encryption is not supported. */ #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) /*********************************************************************** * Return the next byte in the pseudo-random sequence */ static int decrypt_byte(unsigned long* pkeys,const z_crc_t FAR *pcrc_32_tab) { unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } /*********************************************************************** * Update the encryption keys with the next byte of plain text */ static int update_keys(unsigned long* pkeys,const z_crc_t FAR *pcrc_32_tab,int c) { (*(pkeys+0)) = CRC32((*(pkeys+0)), c); (*(pkeys+1)) += (*(pkeys+0)) & 0xff; (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; { register int keyshift = (int)((*(pkeys+1)) >> 24); (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); } return c; } /*********************************************************************** * Initialize the encryption keys and the random header according to * the given password. */ static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t FAR *pcrc_32_tab) { *(pkeys+0) = 305419896L; *(pkeys+1) = 591751049L; *(pkeys+2) = 878082192L; while (*passwd != '\0') { update_keys(pkeys,pcrc_32_tab,(int)*passwd); passwd++; } } #define zdecode(pkeys,pcrc_32_tab,c) \ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) #define zencode(pkeys,pcrc_32_tab,c,t) \ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED #define RAND_HEAD_LEN 12 /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 # define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # endif static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) const char *passwd; /* password string */ unsigned char *buf; /* where to write header */ int bufSize; unsigned long* pkeys; const unsigned long* pcrc_32_tab; unsigned long crcForCrypting; { int n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ unsigned char header[RAND_HEAD_LEN-2]; /* random header */ static unsigned calls = 0; /* ensure different random header each time */ if (bufSize> 7) & 0xff; header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); } /* Encrypt random header (last two bytes is high word of crc) */ init_keys(passwd, pkeys, pcrc_32_tab); for (n = 0; n < RAND_HEAD_LEN-2; n++) { buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); } buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); return n; } #endif nsis-3.11/Contrib/zip2exe/zlib/ioapi.c000077500000000000000000000072541477201124000176160ustar00rootroot00000000000000/* ioapi.c -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant Unicode support by Jim Park -- 08/28/2007 */ #include #include #include #include #include "ioapi.h" /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif voidpf ZCALLBACK fopen_file_func OF(( voidpf opaque, const TCHAR* filename, int mode)); uLong ZCALLBACK fread_file_func OF(( voidpf opaque, voidpf stream, void* buf, uLong size)); uLong ZCALLBACK fwrite_file_func OF(( voidpf opaque, voidpf stream, const void* buf, uLong size)); long ZCALLBACK ftell_file_func OF(( voidpf opaque, voidpf stream)); long ZCALLBACK fseek_file_func OF(( voidpf opaque, voidpf stream, uLong offset, int origin)); int ZCALLBACK fclose_file_func OF(( voidpf opaque, voidpf stream)); int ZCALLBACK ferror_file_func OF(( voidpf opaque, voidpf stream)); voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) voidpf opaque; const TCHAR* filename; int mode; { FILE* file = NULL; const TCHAR* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = _T("rb"); else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) mode_fopen = _T("r+b"); else if (mode & ZLIB_FILEFUNC_MODE_CREATE) mode_fopen = _T("wb"); if ((filename!=NULL) && (mode_fopen != NULL)) file = _tfopen(filename, mode_fopen); return file; } uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) voidpf opaque; voidpf stream; void* buf; uLong size; { uLong ret; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) voidpf opaque; voidpf stream; const void* buf; uLong size; { uLong ret; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } long ZCALLBACK ftell_file_func (opaque, stream) voidpf opaque; voidpf stream; { long ret; ret = ftell((FILE *)stream); return ret; } long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) voidpf opaque; voidpf stream; uLong offset; int origin; { int fseek_origin=0; long ret; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : fseek_origin = SEEK_CUR; break; case ZLIB_FILEFUNC_SEEK_END : fseek_origin = SEEK_END; break; case ZLIB_FILEFUNC_SEEK_SET : fseek_origin = SEEK_SET; break; default: return -1; } ret = 0; fseek((FILE *)stream, offset, fseek_origin); return ret; } int ZCALLBACK fclose_file_func (opaque, stream) voidpf opaque; voidpf stream; { int ret; ret = fclose((FILE *)stream); return ret; } int ZCALLBACK ferror_file_func (opaque, stream) voidpf opaque; voidpf stream; { int ret; ret = ferror((FILE *)stream); return ret; } void fill_fopen_filefunc (pzlib_filefunc_def) zlib_filefunc_def* pzlib_filefunc_def; { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->opaque = NULL; } nsis-3.11/Contrib/zip2exe/zlib/ioapi.h000077500000000000000000000050521477201124000176150ustar00rootroot00000000000000/* ioapi.h -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant Unicode support by Jim Park -- 08/28/2007 */ #ifndef _ZLIBIOAPI_H #define _ZLIBIOAPI_H #include #define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_CREATE (8) #ifndef ZCALLBACK #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #define ZCALLBACK CALLBACK #else #define ZCALLBACK #endif #endif #ifdef __cplusplus extern "C" { #endif typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const TCHAR* filename, int mode)); typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef struct zlib_filefunc_def_s { open_file_func zopen_file; read_file_func zread_file; write_file_func zwrite_file; tell_file_func ztell_file; seek_file_func zseek_file; close_file_func zclose_file; testerror_file_func zerror_file; voidpf opaque; } zlib_filefunc_def; void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); #define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) #define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) #define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) #define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) #define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) #define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) #ifdef __cplusplus } #endif #endif nsis-3.11/Contrib/zip2exe/zlib/unzip.c000077500000000000000000001404731477201124000176630ustar00rootroot00000000000000/* unzip.c -- IO for uncompress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant Read unzip.h for more info Unicode support by Jim Park -- 08/28/2007 (Unicode ZIP file name, but not the files in the archive itself.) */ /* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of compatibility with older software. The following is from the original crypt.c. Code woven in by Terry Thorsen 1/2003. */ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) */ /* This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). */ #include #include #include #include #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef CASESENSITIVITYDEFAULT_NO # if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) # define CASESENSITIVITYDEFAULT_NO # endif #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ int encrypted; # ifndef NOUNCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const z_crc_t FAR *pcrc_32_tab; # endif } unz_s; #ifndef NOUNCRYPT #include "crypt.h" #endif /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been successfully opened for reading. */ local int unzlocal_getByte OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; int *pi; { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ZERROR(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; uLong *pX; { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; uLong *pX; { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal (fileName1,fileName2) const char* fileName1; const char* fileName2; { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filenames (fileName1,fileName2). If iCaseSensitivity = 1, comparison is case sensitive (like strcmp) If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi or strcasecmp) If iCaseSensitivity = 0, case sensitivity is the default from your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) const char* fileName1; const char* fileName2; int iCaseSensitivity; { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer "zlib/zlib114.zip". If the zipfile cannot be opened (file doesn't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) const TCHAR *path; zlib_filefunc_def* pzlib_filefunc_def; { unz_s us; unz_s *s; uLong central_pos,uL; uLong number_disk; /* number of the current dist, used for spanning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; if (pzlib_filefunc_def==NULL) fill_fopen_filefunc(&us.z_filefunc); else us.z_filefunc = *pzlib_filefunc_def; us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); if (us.filestream==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); if (central_pos==0) err=UNZ_ERRNO; if (ZSEEK(us.z_filefunc, us.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); ZCLOSE(s->z_filefunc, s->filestream); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) unzFile file; unz_global_info *pglobal_info; { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) uLong ulDosDate; tm_unz* ptm; { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal (file, pfile_info, pfile_info_internal, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; unz_file_info_internal *pfile_info_internal; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (ZSEEK(s->z_filefunc, s->filestream, s->pos_in_central_dir+s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) { if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo (file, pfile_info, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (file) unzFile file; { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) unzFile file; const char *szFileName; int iCaseSensitivity; { unz_s* s; int err; /* We remember the 'current' position in the file so that we can jump * back there if we fail. */ unz_file_info cur_file_infoSaved; unz_file_info_internal cur_file_info_internalSaved; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; /* Save the current state */ num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; cur_file_infoSaved = s->cur_file_info; cur_file_info_internalSaved = s->cur_file_info_internal; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; err = unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (err == UNZ_OK) { if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } } /* We failed, so restore the state of the 'current file' to where we * were. */ s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; s->cur_file_info = cur_file_infoSaved; s->cur_file_info_internal = cur_file_info_internalSaved; return err; } /* /////////////////////////////////////////// // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) // I need random access // // Further optimization could be realized by adding an ability // to cache the directory in memory. The goal being a single // comprehensive file read to put the file I need in a memory. */ /* typedef struct unz_file_pos_s { uLong pos_in_zip_directory; // offset in file uLong num_of_file; // # of file } unz_file_pos; */ extern int ZEXPORT unzGetFilePos(file, file_pos) unzFile file; unz_file_pos* file_pos; { unz_s* s; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; file_pos->pos_in_zip_directory = s->pos_in_central_dir; file_pos->num_of_file = s->num_file; return UNZ_OK; } extern int ZEXPORT unzGoToFilePos(file, file_pos) unzFile file; unz_file_pos* file_pos; { unz_s* s; int err; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; /* jump to the right spot */ s->pos_in_central_dir = file_pos->pos_in_zip_directory; s->num_file = file_pos->num_of_file; /* set the current file */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); /* return results */ s->current_file_ok = (err == UNZ_OK); return err; } /* // Unzip Helper Functions - should be here? /////////////////////////////////////////// */ /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, poffset_local_extrafield, psize_local_extrafield) unz_s* s; uInt* piSizeVar; uLong *poffset_local_extrafield; uInt *psize_local_extrafield; { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) { if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) unzFile file; int* method; int* level; int raw; const char* password; { int err=UNZ_OK; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ # ifndef NOUNCRYPT char source[12]; # else if (password != NULL) return UNZ_PARAMERROR; # endif if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; pfile_in_zip_read_info->raw=raw; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if (method!=NULL) *method = (int)s->cur_file_info.compression_method; if (level!=NULL) { *level = 6; switch (s->cur_file_info.flag & 0x06) { case 6 : *level = 1; break; case 4 : *level = 2; break; case 2 : *level = 9; break; } } if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->filestream=s->filestream; pfile_in_zip_read_info->z_filefunc=s->z_filefunc; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; pfile_in_zip_read_info->stream.next_in = (voidpf)0; pfile_in_zip_read_info->stream.avail_in = 0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; else { TRYFREE(pfile_in_zip_read_info); return err; } /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; # ifndef NOUNCRYPT if (password != NULL) { int i; s->pcrc_32_tab = get_crc_table(); init_keys(password,s->keys,s->pcrc_32_tab); if (ZSEEK(s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET)!=0) return UNZ_INTERNALERROR; if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) return UNZ_INTERNALERROR; for (i = 0; i<12; i++) zdecode(s->keys,s->pcrc_32_tab,source[i]); s->pfile_in_zip_read->pos_in_zipfile+=12; s->encrypted=1; } # endif return UNZ_OK; } extern int ZEXPORT unzOpenCurrentFile (file) unzFile file; { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } extern int ZEXPORT unzOpenCurrentFilePassword (file, password) unzFile file; const char* password; { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) unzFile file; int* method; int* level; int raw; { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of bytes copied if some bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile (file, buf, len) unzFile file; voidp buf; unsigned len; { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->read_buffer == NULL)) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && (!(pfile_in_zip_read_info->raw))) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; if ((len>pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in) && (pfile_in_zip_read_info->raw)) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis)!=uReadThis) return UNZ_ERRNO; # ifndef NOUNCRYPT if(s->encrypted) { uInt i; for(i=0;iread_buffer[i] = zdecode(s->keys,s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]); } # endif pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) { uInt uDoCopy,i ; if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) return (iRead==0) ? UNZ_EOF : iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) err = Z_DATA_ERROR; uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) unzFile file; voidp buf; unsigned len; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf,read_now)!=read_now) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) unzFile file; char *szComment; uLong uSizeBuf; { // int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } /* Additions by RX '2004 */ extern uLong ZEXPORT unzGetOffset (file) unzFile file; { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return 0; if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) if (s->num_file==s->gi.number_entry) return 0; return s->pos_in_central_dir; } extern int ZEXPORT unzSetOffset (file, pos) unzFile file; uLong pos; { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir = pos; s->num_file = s->gi.number_entry; /* hack */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } nsis-3.11/Contrib/zip2exe/zlib/unzip.h000077500000000000000000000316201477201124000176610ustar00rootroot00000000000000/* unzip.h -- IO for uncompress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Multi volume ZipFile (span) are not supported. Encryption compatible with pkzip 2.04g only supported Old compressions used by old PKZip 1.x are not supported I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Unicode support by Jim Park -- 08/28/2007 (Support of the archive file name being Unicode but not the files in the archive itself. That requires modifying the ZLIB lib not just here but the user's zlib-based tool.) */ /* for more info about .ZIP format, see http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/ PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filenames (fileName1,fileName2). If iCaseSensitivity = 1, comparison is case sensitive (like strcmp) If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi or strcasecmp) If iCaseSensitivity = 0, case sensitivity is the default from your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const TCHAR *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 OF((const TCHAR *path, zlib_filefunc_def* pzlib_filefunc_def)); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ /* ****************************************** */ /* Ryan supplied functions */ /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_pos_s { uLong pos_in_zip_directory; /* offset in zip file directory */ uLong num_of_file; /* # of file */ } unz_file_pos; extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos); extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos); /* ****************************************** */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain some info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of bytes copied if some bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ /***************************************************************************/ /* Get the current file offset */ extern uLong ZEXPORT unzGetOffset (unzFile file); /* Set the current file offset */ extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); #ifdef __cplusplus } #endif #endif /* _unz_H */ nsis-3.11/Docs/000077500000000000000000000000001477201124000133005ustar00rootroot00000000000000nsis-3.11/Docs/src/000077500000000000000000000000001477201124000140675ustar00rootroot00000000000000nsis-3.11/Docs/src/SConscript000077500000000000000000000107701477201124000161110ustar00rootroot00000000000000# TODO FIXME extra files should be targets too, so they're rebuilt in case they're gone buts = Split(""" config.but intro.but tutorial.but usage.but script.but var.but labels.but jumps.but pages.but sections.but usection.but functions.but callback.but attributes.but compilerflags.but basic.but registry.but generalpurpose.but flowcontrol.but file.but uninstall.but misc.but string.but stack.but int.but reboot.but log.but sec.but ui.but langs.but plugin.but silent.but compiler.but defines.but modernui.but library.but usefulfunc.but usefulinfos.but headers.but history.but build.but credits.but license.but """) chapters = 5 appendices = 9 htmls = Split('IndexPage.html Contents.html') \ + list(map(lambda ch: 'Chapter' + str(ch + 1) + '.html', range(chapters))) \ + list(map(lambda ap: 'Appendix' + chr(ord('A') + ap) + '.html', range(appendices))) docsdefault_install_basepath = 'Docs' DOCS_CONFIG = { 'chm' : { 'NSISDOCCONFIG' : 'config_chm.but', 'NSISDOCEXTRAFILES' : File(Split('#Docs/style.css chmlink.js nsis.hhp')), 'NSISDOCEXTRAACTION' : Action('cd $BUILDDIR && "$HHC" nsis.hhp'), 'NSISDOCHTMLFIXES' : { }, 'NSISDOCTARGET' : 'NSIS.chm', 'NSISDOCINSTALLBASEPATH' : '', 'NSISEXTRADIST' : [], }, 'html' : { 'NSISDOCCONFIG' : 'config_html.but', 'NSISDOCEXTRAFILES' : File(Split('#Docs/style.css')), 'NSISDOCEXTRAACTION' : '', 'NSISDOCHTMLFIXES' : { }, 'NSISDOCTARGET' : htmls, 'NSISDOCINSTALLBASEPATH' : docsdefault_install_basepath, 'NSISEXTRADIST' : File(Split('#Docs/style.css')), }, 'web' : { 'NSISDOCCONFIG' : 'config_web.but', 'NSISDOCEXTRAFILES' : File(Split('#Docs/style.css #Docs/unreleased.png')), 'NSISDOCEXTRAACTION' : '', 'NSISDOCHTMLFIXES' : { }, 'NSISDOCTARGET' : htmls, 'NSISDOCINSTALLBASEPATH' : docsdefault_install_basepath, 'NSISEXTRADIST' : File(Split('#Docs/style.css #Docs/unreleased.png')), }, 'htmlsingle' : { 'NSISDOCCONFIG' : 'config_htmlsingle.but', 'NSISDOCEXTRAFILES' : [], 'NSISDOCEXTRAACTION' : '', 'NSISDOCHTMLFIXES' : { '---HTML:HEAD:STYLE:CSS---' : File('#/Docs/style.css').get_contents(), }, 'NSISDOCTARGET' : 'Manual.html', 'NSISDOCINSTALLBASEPATH' : docsdefault_install_basepath, 'NSISEXTRADIST' : [], }, } import os import re Import('halibut env build_doctype') # set up environment env['HHC'] = env.WhereIs('hhc', os.environ['PATH']) env['HALIBUT'] = halibut env['BUILDDIR'] = build_dir = Dir(GetBuildPath('.')).abspath env.Replace(**DOCS_CONFIG[build_doctype]) if not env['PLATFORM'] == 'win32': env['NSISDOCHTMLFIXES']['\\Defaults are bold and underlined\\\\ \S2{aaddbrandingimage} AddBrandingImage \c (left|right|top|bottom) (width|height) [padding] Adds a branding image on the top, bottom, left, or right of the installer. Its size will be set according to the width/height specified, the installer width/height and the installers font. The final size will not always be what you requested; have a look at the output of the command for the actual size. Because this depends on the installers font, you should use \R{asetfont}{SetFont} before AddBrandingImage. The default padding value is 2. The numbers can be suffixed with \c{u} to specify dialog units instead of pixels. AddBrandingImage only adds a placeholder for an image. To set the image itself at runtime, use \R{setbrandingimage}{SetBrandingImage}. \c AddBrandingImage left 100 \c AddBrandingImage right 50 \c AddBrandingImage top 20u 3u \c AddBrandingImage bottom 35 \c AddBrandingImage left 100 5 \S2{aallowrootdirinstall} AllowRootDirInstall \c true|\\false\\ Controls whether or not installs are allowed in the root directory of a drive, or directly into a network share. Set to 'true' to change the safe behavior, which prevents users from selecting C:\\ or \\\\Server\\Share as an install (and later on, uninstall) directory. For additional directory selection page customizability, see \R{onverifyinstdir}{.onVerifyInstDir}. \S2{aautoclosewindow} AutoCloseWindow \c true|\\false\\ Sets whether or not the install window automatically closes when completed. This is overridable from a section using \R{setautoclose}{SetAutoClose}. \S2{abgfont} BGFont \c [font_face [height [weight] [/ITALIC] [/UNDERLINE] [/STRIKE]]] Specifies the font used to show the text on the background gradient. To set the color use \R{abggradient}{BGGradient}. The default font will be used if no parameters are specified. The default font is bold and italic Times New Roman. \S2{abggradient} BGGradient \c [\\off\\|(topc botc [textcolor|notext])] Specifies whether or not to use a gradient background window. If 'off', the installer will not show a background window, if no parameters are specified, the default black to blue gradient is used, and otherwise the top_color or bottom_color are used to make a gradient. Top_color and bottom_color are specified using the form RRGGBB (in hexadecimal, as in HTML, only minus the leading '#', since # can be used for comments). 'textcolor' can be specified as well, or 'notext' can be specified to turn the big background text off. \S2{abrandingtext} BrandingText \c /TRIM(LEFT|RIGHT|CENTER) text Sets the text that is shown at the bottom of the install window (by default it is 'Nullsoft Install System vX.XX'). Setting this to an empty string ("") uses the default; to set the string to blank, use " " (a space). If it doesn't matter to you, leave it the default so that everybody can know why the installer didn't suck :). Use /TRIMLEFT, /TRIMRIGHT or /TRIMCENTER to trim down the size of the control to the size of the string. Accepts variables. If variables are used, they must be initialized on \R{oninit}{.onInit}. \S2{acaption} Caption \c caption When used outside a \R{pageex}{PageEx} block: Sets the text for the titlebar of the installer. By default it is '$(^Name) Setup', where Name is specified by the \R{aname}{Name} instruction. You can however override it with 'MyApp Installer' or whatever. If you specify an empty string (""), the default will be used (you can specify " " to simulate a empty string). When used inside a \R{pageex}{PageEx} block: Sets the subcaption of the current page. Accepts variables. If variables are used, they must be initialized on \R{oninit}{.onInit} or \R{onguiinit}{.onGUIInit}. \S2{achangeui} ChangeUI \c dialog ui_file.exe Replaces dialog (\e{IDD_LICENSE}, \e{IDD_DIR}, \e{IDD_SELCOM}, \e{IDD_INST}, \e{IDD_INSTFILES}, \e{IDD_UNINST} or \e{IDD_VERIFY}) with a dialog from ui_file.exe with the same resource ID. You can also specify 'all' as the dialog if you wish to replace all 7 of the dialogs at once from the same UI file. For some example UIs look at Contrib\\UIs under your NSIS directory. \b \e{IDD_LICENSE} must contain \e{IDC_EDIT1} (RICHEDIT control). \b \e{IDD_DIR} must contain \e{IDC_DIR} (edit box), \e{IDC_BROWSE} (button) and \e{IDC_CHECK1} (checkbox). \b \e{IDD_SELCOM} must contain \e{IDC_TREE1} (SysTreeView32 control), and \e{IDC_COMBO1} (combo box). \b \e{IDD_INST} must contain \e{IDC_BACK} (button), \e{IDC_CHILDRECT} (static control the size of all other dialogs), \e{IDC_VERSTR} (static), \e{IDOK} (button), and \e{IDCANCEL} (button). If an image control (static with \e{SS_BITMAP} style) will be found in this dialog it will be used as the default for \R{setbrandingimage}{SetBrandingImage}. \b \e{IDD_INSTFILES} must contain \e{IDC_LIST1} (SysListView32 control), \e{IDC_PROGRESS} (msctls_progress32 control), and \e{IDC_SHOWDETAILS} (button). \b \e{IDD_UNINST} must contain \e{IDC_EDIT1} (edit box). \b \e{IDD_VERIFY} must contain \e{IDC_STR} (static). \c ChangeUI all "${NSISDIR}\Contrib\UIs\sdbarker_tiny.exe" \S2{acheckbitmap} CheckBitmap \c bitmap.bmp Specifies the bitmap with the checkbox images used in the component-selection page treeview. This bitmap should have a size of 96x16 pixels, no more than 8bpp (256 colors) and contain six 16x16 images for the different states (in order: selection mask, not checked, checked, greyed out, unchecked & read-only, checked & read-only). Use magenta as mask color (this area will be transparent). \S2{acompletedtext} CompletedText \c text Replaces the default text ("Completed") that is printed at the end of the install if parameter is specified. Otherwise, the default is used. Accepts variables. If variables are used, they must be initialized before the message is printed. \S2{acomponenttext} ComponentText \c [text [subtext] [subtext2]] Used to change the default text on the component page. text: Text above the controls, to the right of the installation icon. subtext: Text next to the installation type selection. subtext2: Text to the left of the components list and below the installation type. The default string will be used if a string is empty (""). Accepts variables. If variables are used, they must be initialized before the components page is created. \S2{acrccheck} CRCCheck \c \\on\\|off|force Specifies whether or not the installer will perform a CRC on itself before allowing an install. Note that if the user uses /NCRC on the command line when executing the installer, and you didn't specify 'force', the CRC will not occur, and the user will be allowed to install a (potentially) corrupted installer. \S2{adetailsbuttontext} DetailsButtonText \c show_details_text Replaces the default details button text of "Show details", if parameter is specified (otherwise the default is used). Accepts variables. If variables are used, they must be initialized before the install log (instfiles) page is created. \S2{adirtext} DirText \c [text] [subtext] [browse_button_text] [browse_dlg_text] Used to change the default text on the directory page. text: Text above the controls, to the right of the installation icon. subtext: Text on the directory selection frame. browse_button_text: Text on the Browse button. browse_dlg_text: Text on the "Browse For Folder" dialog, appears after clicking on "Browse" button. The default string will be used if a string is empty (""). Accepts variables. If variables are used, they must be initialized before the directory page is created. \S2{adirvar} DirVar \c user_var(dir input/output) Specifies which variable is to be used to contain the directory selected. This variable should be initialized with a default value. This allows you to easily create two different directory pages that will not require you to move values in and out of $INSTDIR. The default variable is $INSTDIR. This can only be used in \R{pageex}{PageEx} for directory and uninstConfirm pages. \c Var ANOTHER_DIR \c PageEx directory \c DirVar $ANOTHER_DIR \c PageExEnd \c \c Section \c SetOutPath $INSTDIR \c File "a file.dat" \c SetOutPath $ANOTHER_DIR \c File "another file.dat" \c SectionEnd \S2{adirverify} DirVerify \c \\auto\\|leave If `\R{adirverify}{DirVerify} leave' is used, the Next button will not be disabled if the installation directory is not valid or there is not enough space. A flag that you can read in the leave function using \R{getinstdirerror}{GetInstDirError} will be set instead. \c PageEx directory \c DirVerify leave \c PageCallbacks "" "" dirLeave \c PageExEnd \S2{a} FileErrorText \c file_error_text [noignore_file_error_text] Replaces the default text that comes up when a file cannot be written to. This string can contain a reference to $0, which is the filename ($0 is temporarily changed to this value). Example: "Can not write to file $\\r$\\n$0$\\r$\\ngood luck.". Accepts variables. If variables are used, they must be initialized before \R{file}{File} is used. \S2{aicon} Icon \c [path\]icon.ico Sets the icon of the installer. Every image in the icon file will be included in the installer. Use \R{auninstallicon}{UninstallIcon} to set the uninstaller icon. \S2{ainstallbuttontext} InstallButtonText \c install_button_text If parameter is specified, overrides the default install button text (of "Install") with the specified text. Accepts variables. If variables are used, they must be initialized before the install button shows. \S2{ainstallcolors} InstallColors \c /windows | (foreground_color background_color) Sets the colors to use for the install info screen (the default is 00FF00 000000. Use the form RRGGBB (in hexadecimal, as in HTML, only minus the leading '#', since # can be used for comments). Note that if "/windows" is specified as the only parameter, the default windows colors will be used. \S2{ainstalldir} InstallDir \c definstdir Sets the default installation directory. See the \R{variables}{variables section} for variables that can be used to make this string (especially $PROGRAMFILES). Note that the part of this string following the last \\ will be used if the user selects 'browse', and may be appended back on to the string at install time (to disable this, end the directory with a \\ (which will require the entire parameter to be enclosed with quotes). If this doesn't make any sense, play around with the browse button a bit. \S2{ainstalldirregkey} InstallDirRegKey \c root_key subkey key_name This attribute tells the installer to check a string in the registry and use it as the install dir if that string is valid. If this attribute is present, it will override the \R{ainstalldir}{InstallDir} attribute if the registry key is valid, otherwise it will fall back to the \R{ainstalldir}{InstallDir} value. When querying the registry, this command will automatically remove any quotes. If the string ends in ".exe", it will automatically remove the filename component of the string (i.e. if the string is "C:\\Program Files\\Foo\\app.exe", it will know to use "C:\\Program Files\\Foo"). For more advanced install directory configuration, set $INSTDIR in .onInit. Language strings and variables cannot be used with \R{ainstalldirregkey}{InstallDirRegKey}. \c InstallDirRegKey HKLM Software\NSIS "" \c InstallDirRegKey HKLM Software\ACME\Thingy InstallLocation \S2{ainstprogressflags} InstProgressFlags \c [flag [...]] Valid values for flag are "smooth" (smooth the progress bar) or "colored" (color the progress bar with the colors set by \R{ainstallcolors}{InstallColors}. Examples: "InstProgressFlags" (default old-school windows look), "InstProgressFlags smooth" (new smooth look), "InstProgressFlags smooth colored" (colored smooth look whee). Note: neither "smooth" or "colored" work with \R{axpstyle}{XPStyle} on when the installer runs on Windows XP with a modern theme. \S2{ainsttype} InstType \c install_type_name [index_output] | /[UNINST]NOCUSTOM | /CUSTOMSTRING=str | /[UNINST]COMPONENTSONLYONCUSTOM Adds an install type to the install type list, or disables the custom install type. There can be as many as \#{NSIS_MAX_INST_TYPES}32 types, each one specifying the name of the install type. If the name is prefixed with 'un.' it is an uninstaller install type. The name can contain variables which will be processed at runtime before the components page shows. Another way of changing the \R{ainsttype}{InstType} name during runtime is the \R{sinsttypesettext}{InstTypeSetText} command. The difference is that with \R{sinsttypesettext}{InstTypeSetText} you are saving your precious user variables. The first type is the default (generally 'Typical' or 'Full'). If the /NOCUSTOM switch is specified, then the "custom" install type is disabled, and the user has to choose one of the pre-defined install types. Alternatively, if the /CUSTOMSTRING switch is specified, the parameter will override the "Custom" install type text. Alternatively, if the /COMPONENTSONLYONCUSTOM flag is specified, the component list will only be shown if the "Custom" install type is selected. Accepts variables for type names. If variables are used, they must be initialized before the components page is created. \R{ssectioninsttype}{SectionInstType} is used to bind \cw{Section}s to install types. \S2{alicensebkcolor} LicenseBkColor \c color | \\/gray\\ | /windows Sets the background color of the license data. Color is specified using the form RRGGBB (in hexadecimal, as in HTML, only minus the leading '#', since # can be used for comments). Default is '/gray'. You can also use the Windows OS defined color by using '/windows'. \S2{alicensedata} LicenseData \c licdata.(txt|rtf) Specifies a text file or a RTF file to use for the license that the user can read. Omit this to not have a license displayed. Note that the file must be in DOS text format (\\r\\n). To define a multilingual license data use \R{licenselangstring}{LicenseLangString}. If you are using a RTF file it is recommended that you edit it with WordPad and not MS Word. Using WordPad will result in a much smaller file. Use \R{licenselangstring}{LicenseLangString} to show a different license for every language. \S2{alicenseforceselection} LicenseForceSelection \c (checkbox [accept_text] | radiobuttons [accept_text] [decline_text] | \\off\\) Specifies if the displayed license must be explicitly accepted or not. This can be done either by a checkbox or by radiobuttons. By default the "next button" is disabled and will only be enabled if the checkbox is enabled or the correct radio button is selected. If off is specified the "next button" is enabled by default. \c LicenseForceSelection checkbox \c LicenseForceSelection checkbox "i accept" \c LicenseForceSelection radiobuttons \c LicenseForceSelection radiobuttons "i accept" \c LicenseForceSelection radiobuttons "i accept" "i decline" \c LicenseForceSelection radiobuttons "" "i decline" \c LicenseForceSelection off \S2{alicensetext} LicenseText \c [text [button_text]] Used to change the default text on the license page. text: Text above the controls, to the right of the installation icon. button_text: Text on the "I Agree" button. The default string will be used if a string is empty (""). Accepts variables. If variables are used, they must be initialized before the license page is created. \S2{amanifestdpiaware} ManifestDPIAware \c \\notset\\|true|false \# Note: true==System. PerMonitor is not documented because it is not fully supported yet, we need to handle WM_DPICHANGED. \# Example: ManifestDPIAware System ; System DPI on Vista/7/8/8.1/10(<10.1607(AU)) \# Example: ManifestDPIAwareness "PerMonitorV2,System" ; PMv2 on 10.1703(CU)+, System on 10.1607(AU) Declare that the installer is DPI-aware. A DPI-aware application is not scaled by the DWM (DPI virtualization) so the text is never blurry. NSIS does not scale the bitmap used by the tree control on the component page and some plugins might have compatibility issues so make sure that you test your installer at different DPI settings if you select \e{true}. See \W{http://msdn.microsoft.com/en-us/library/dd464660}{MSDN} for more information about DPI-aware applications. \# \S2{amanifestdpiawareness} ManifestDPIAwareness \# \# \c \\notset\\|comma_separated_string \S2{amanifestlongpathaware} ManifestLongPathAware \c \\notset\\|true|false Declare that the installer can handle paths longer than MAX_PATH. Only supported on Windows 10 Anniversary Update and later. \NsisWarnBlockContainerBegin \NsisBlockHeaderNote Instructions like CopyFiles and CreateShortcut do not support long paths! \NsisWarnBlockContainerEnd \NsisWarnBlockContainerBegin \NsisBlockHeaderNote Has no effect if the "Enable Win32 long paths" policy is not enabled. \NsisWarnBlockContainerEnd \S2{amanifestsupportedos} ManifestSupportedOS \c none|all|WinVista|\\Win7|Win8|Win8.1|Win10\\|{GUID} [...] Declare that the installer is compatible with the specified Windows version(s). This adds a SupportedOS entry in the compatibility section of the application manifest. The default is Win7+8+8.1+10. \e{none} is the default if \R{arequestexecutionlevel}{RequestExecutionLevel} is set to \e{none} for compatibility reasons. Windows 8.1 and later will fake its version number if you don't declare support for that particular version. You can read more about the other changes in behavior on \W{http://msdn.microsoft.com/en-us/library/windows/desktop/hh848036}{MSDN}. \# \S2{amanifestmaxversiontested} ManifestMaxVersionTested \# \# \c maj.min.bld.rev \S2{amiscbuttontext} MiscButtonText \c [back_button_text [next_button_text] [cancel_button_text] [close_button_text]] Replaces the default text strings for the four buttons (< Back, Next >, Cancel and Close). If parameters are omitted, the defaults are used. Accepts variables. If variables are used, they must be initialized in \R{oninit}{.onInit}. \S2{aname} Name \c name [name_doubled_ampersands] Sets the name of the installer. The name is usually simply the product name such as 'MyApp' or 'CrapSoft MyApp'. If you have one or more ampersands (&) in the name, set the second parameter to the same name, only with doubled ampersands. For example, if your product's name is "Foo & Bar", use: \c Name "Foo & Bar" "Foo && Bar" If you have ampersands in the name and use a \R{langstring}{LangString} for the name, you will have to create another one with doubled ampersands to use as the second parameter. Accepts variables. If variables are used, they must be initialized in \R{oninit}{.onInit}. \S2{aoutfile} OutFile \c [path\]install.exe Specifies the output file that the MakeNSIS should write the installer to. This is just the file that MakeNSIS writes, it doesn't affect the contents of the installer. \S2{apeaddresource} PEAddResource \c [/OVERWRITE|/REPLACE] file restype resname [reslang] Adds \cw{file} as a resource to the installer and uninstaller. \cw{restype} specifies the resource type and can be any string or # followed by a standard type or number. \cw{resname} must be # followed by a number. \cw{reslang} is optional and specifies the language id of the resource. Replacing standard NSIS resources is not supported, you should use \R{aicon}{Icon} and \R{achangeui}{ChangeUI} instead. \c PEAddResource "myimage.bmp" "#2" "#1337" \c PEAddResource "mybonus.ico" "#Icon" "#200" \c PEAddResource "myimage.png" "PNG" "#1234" \c PEAddResource "res://$%WINDIR%/Explorer.exe/#Icon/#101" "#Icon" "#1337" \S2{aperemoveresource} PERemoveResource \c [/NOERRORS] restype resname reslang|ALL Removes a resource added with \cw{PEAddResource}. \c PERemoveResource "#Icon" "#200" ALL \S2{arequestexecutionlevel} RequestExecutionLevel \c none|user|highest|\\admin\\ Specifies the requested execution level for Windows Vista and higher. The value is embedded in the installer and uninstaller's XML manifest and tells Windows which privilege level the installer requires. \e{user} requests the user's normal level with no administrative privileges. \e{highest} will request the highest execution level available for the current user and will cause Windows to prompt the user to verify privilege escalation if they are a member of the administrators group. The prompt might request for the user's password. \e{admin}, which is also the default, requests administrator level and will cause Windows to prompt the user as well. Specifying \e{none} will keep the manifest empty and let Windows decide which execution level is required. Windows automatically identifies NSIS installers and decides administrator privileges are required. Because of this, \e{none} and \e{admin} have virtually the same effect. It's recommended that every application is marked with a required execution level. Unmarked installers are subject to compatibility mode. Workarounds of this mode include automatically moving any shortcuts created in the user's start menu to all users' start menu. Installers that don't install anything into system folders nor write to the local machine registry (HKLM) should specify \e{user} execution level. More information about this topic can be found on \W{http://msdn.microsoft.com/en-us/library/bb756929}{MSDN}. \S2{asetfont} SetFont \c [/LANG=lang_id] font_face_name font_size Sets the installer font. Please remember that the font you choose must be present on the user's machine as well. Don't use rare fonts that only you have. Use the /LANG switch if you wish to set a different font for each language. For example: \c SetFont /LANG=${LANG_ENGLISH} "English Font" 9 \c SetFont /LANG=${LANG_FRENCH} "French Font" 10 There are two \R{langstring}{LangString}s named ^Font and ^FontSize which contain the font and font size for every language. \S2{ashowinstdetails} ShowInstDetails \c \\hide\\|show|nevershow Sets whether or not the details of the install are shown. Can be 'hide' to hide the details by default, allowing the user to view them, or 'show' to show them by default, or 'nevershow', to prevent the user from ever seeing them. Note that sections can override this using \R{setdetailsview}{SetDetailsView}. \S2{ashowuninstdetails} ShowUninstDetails \c \\hide\\|show|nevershow Sets whether or not the details of the uninstall are shown. Can be 'hide' to hide the details by default, allowing the user to view them, or 'show' to show them by default, or 'nevershow', to prevent the user from ever seeing them. Note that sections can override this using \R{setdetailsview}{SetDetailsView}. \S2{asilentinstall} SilentInstall \c \\normal\\|silent|silentlog Specifies whether or not the installer should be silent. If it is 'silent' or 'silentlog', all sections that have the SF_SELECTED flag are installed quietly (you can set this flag using \R{sectionsetflags}{SectionSetFlags}), with no screen output from the installer itself (the script can still display whatever it wants, use \R{messagebox}{MessageBox}'s /SD to specify a default for silent installers). Note that if this is set to 'normal' and the user runs the installer with /S (case sensitive) on the command line, it will behave as if \R{asilentinstall}{SilentInstall} 'silent' was used. Note: see also \R{logset}{LogSet}. See \k{silent} for more information. \S2{asilentuninstall} SilentUnInstall \c \\normal\\|silent Specifies whether or not the uninstaller should be silent. If it is 'silent' the uninstall sections will run quietly, with no screen output from the uninstaller itself (the script can still display whatever it wants, use \R{messagebox}{MessageBox}'s /SD to specify a default for silent uninstallers). Note that if this is set to 'normal' and the user runs the uninstaller with /S on the command line, it will behave as if \R{asilentuninstall}{SilentUnInstall} 'silent' was used. See \k{silent} for more information. \S2{aspacetexts} SpaceTexts \c [req_text [avail_text]] If parameters are specified, overrides the space required and space available text ("Space required: " and "Space available: " by default). If 'none' is specified as the required text no space texts will be shown. Accepts variables. If variables are used, they must be initialized before the components page is created. \S2{asubcaption} SubCaption \c [page_number subcaption] Overrides the subcaptions for each of the installer pages (0=": License Agreement",1=": Installation Options",2=": Installation Directory", 3=": Installing Files", 4=": Completed"). If you specify an empty string (""), the default will be used (you can however specify " " to achieve a blank string). You can also set a subcaption (or override the default) using \R{acaption}{Caption} inside a \R{pageex}{PageEx} block. Accepts variables. If variables are used, they must be initialized before the relevant page is created. \S2{auninstallbuttontext} UninstallButtonText \c text Changes the text of the button that by default says "Uninstall" in the uninstaller. If no parameter is specified, the default text is used. Accepts variables. If variables are used, they must be initialized before the uninstall button shows. \S2{auninstallcaption} UninstallCaption \c caption Sets what the titlebars of the uninstaller will display. By default it is '$(^Name) Uninstall', where Name is specified with the Name command. You can, however, override it with 'MyApp uninstaller' or whatever. If you specify an empty string (""), the default will be used (you can specify " " to simulate a empty string). Accepts variables. If variables are used, they must be initialized in \R{unonInit}{un.onInit}. \S2{auninstallicon} UninstallIcon \c [path\]icon.ico Sets the icon of the uninstaller. \S2{auninstallsubcaption} UninstallSubCaption \c page_number subcaption Sets the default subcaptions for the uninstaller pages (0=": Confirmation",1=": Uninstalling Files",2=": Completed"). If you specify an empty string (""), the default will be used (you can specify " " to simulate a empty string). You can also set a subcaption (or override the default) using \R{acaption}{Caption} inside a \R{pageex}{PageEx} block. Accepts variables. If variables are used, they must be initialized before the relevant page is created. \S2{auninstalltext} UninstallText \c text [subtext] Specifies the texts on the uninstaller confirm page. text: Text above the controls subtext: Text next to the uninstall location Accepts variables. If variables are used, they must be initialized before the uninstaller confirm page is created. \S2{awindowicon} WindowIcon \c \\on\\|off Sets whether or not the installer's icon is displayed on certain pages. \S2{axpstyle} XPStyle \c on|\\off\\ Sets whether or not a XP visual style manifest will be added to the installer. This manifest makes the installers controls use the new visual styles when running on Windows XP and later. This affects the uninstaller too. nsis-3.11/Docs/src/basic.but000077500000000000000000000263321477201124000156750ustar00rootroot00000000000000\H{instr} Instructions \S1{basicinstructions} Basic Instructions The instructions that NSIS uses for scripting are sort of a cross between PHP and assembly. There are no real high level language constructs but the instructions themselves are (for the most part) high level, and you have handy string capability (i.e. you don't have to worry about concatenating strings, etc). You essentially have 25 registers (20 general purpose, 5 special purpose), and a stack. \S2{delete} Delete \c [/REBOOTOK] file Delete file (which can be a file or wildcard, but should be specified with a full path) on the target system. If /REBOOTOK is specified and the file cannot be deleted then the file is deleted when the system reboots -- if the file will be deleted on a reboot, the reboot flag will be set. The error flag is set if files are found and cannot be deleted. The error flag is not set when trying to delete a file that does not exist. \c Delete $INSTDIR\somefile.dat \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning The /REBOOTOK switch requires administrator rights on Windows NT and later. \NsisWarnBlockContainerEnd \S2{exec} Exec \c command Execute the specified program and continue immediately. Note that the file specified must exist on the target system, not the compiling system. $OUTDIR is used as the working directory. The error flag is set if the process could not be launched. Note, if the command could have spaces, you should put it in quotes to delimit it from parameters. e.g.: Exec '"$INSTDIR\\command.exe" parameters'. If you don't put it in quotes it will \e{not} work on Windows 9x with or without parameters. \c Exec '"$INSTDIR\someprogram.exe"' \c Exec '"$INSTDIR\someprogram.exe" some parameters' \S2{execshell} ExecShell \c [flags] action file [parameters] [SW_SHOWDEFAULT | SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE] Execute the specified file using ShellExecuteEx. Note that \cw{action} is usually "open", "print", etc, but can be an empty string to use the default action. \cw{Parameters} and the show type are optional. $OUTDIR is used as the working directory. The error flag is set if the file could not be launched. \cw{Flags} can be any combination of /ALLOWERRORUI, /DOENVSUBST and /INVOKEIDLIST. \c ExecShell "open" "http://nsis.sf.net/" \c ExecShell "" "$SysDir\Notepad.exe" "" SW_SHOWMAXIMIZED \c ExecShell "print" "$INSTDIR\readme.txt" \c ExecShell /INVOKEIDLIST "properties" "$TEMP" \S2{execshellwait} ExecShellWait \c [flags] action file [parameters] [SW_SHOWDEFAULT | SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE] Execute the specified file using ExecShell and wait for executed process to quit. It will only wait for executable files, not other file types nor URLs. \S2{execwait} ExecWait \c command [user_var(exit code)] Execute the specified program and wait for the executed process to quit. See \R{exec}{Exec} for more information. If no output variable is specified \R{execwait}{ExecWait} sets the error flag if the program executed returns a nonzero error code, or if there is an error. If an output variable is specified, \R{execwait}{ExecWait} sets the variable with the exit code (and only sets the error flag if an error occurs; if an error occurs the contents of the user variable are undefined). Note, if the command could have spaces, you should put it in quotes to delimit it from parameters. e.g.: ExecWait '"$INSTDIR\\command.exe" parameters'. If you don't put it in quotes it will \e{not} work on Windows 9x with or without parameters. \c ExecWait '"$INSTDIR\someprogram.exe"' \c ExecWait '"$INSTDIR\someprogram.exe"' $0 \c DetailPrint "some program returned $0" \S2{file} File \c [/nonfatal] [/a] ([/r] [/x file|wildcard [...]] (file|wildcard) [...] | /oname=file.dat infile.dat) Adds file(s) to be extracted to the current output path ($OUTDIR). \b Note that the output file name is $OUTDIR\\filename_portion_of_file. \b Use /oname=X switch to change the output name. X may contain variables and can be a fully qualified path or a relative path in which case it will be appended to $OUTDIR set by \R{setoutpath}{SetOutPath}. When using this switch, only one file can be specified. If the output name contains spaces, quote the entire parameter, including /oname, as shown in the examples below. \b Wildcards are supported. \b If the /r switch is used, matching files and directories are recursively searched for in subdirectories. If just one path segment is specified (e.g. \c{File /r something}), the current directory will be recursively searched. If more than one segment is specified (e.g. \c{File /r something\\*.*}), the last path segment will be used as the matching condition and anything before it specifies which directory to search recursively. If a directory name matches, all of its contents is added recursively. Directory structure is preserved. \b Use the /x switch to exclude files and directories. \b If the /a switch is used, the attributes of the file(s) added will be preserved. \b The \R{file}{File} command sets the error flag if overwrite mode is set to 'try' and the file could not be overwritten, or if the overwrite mode is set to 'on' and the file could not be overwritten and the user selects ignore. \b If the /nonfatal switch is used and no files are found, a warning will be issued instead of an error. \c File something.exe \c File /a something.exe \c File *.exe \c File /r *.dat \c File /r data \c File /oname=temp.dat somefile.ext \c File /oname=$TEMP\temp.dat somefile.ext \c File "/oname=$TEMP\name with spaces.dat" somefile.ext \c File /nonfatal "a file that might not exist" \c File /r /x CVS myproject\*.* \c File /r /x *.res /x *.obj /x *.pch source\*.* \s{Note:} When using the \e{/r} switch, both matching directories and files will be searched. This is always done with or without the use of wildcards, even if the given path perfectly matches one directory. That means, the following directory structure: \c something \c file.dat \c another.dat \c dir \c something \c dir2 \c file2.dat \c another \c something \c readme.txt with the following \e{File} usage: \c File /r something will match the directory named \e{something} in the root directory, the file named \e{something} in the directory named \e{dir} and the directory named \e{something} in the directory named \e{another}. To match only the directory named \e{something} in the root directory, use the following: \c File /r something\*.* When adding \e{\\*.*}, it will be used as the matching condition and \e{something} will be used as the directory to search. When only \e{something} is specified, the current directory will be recursively searched for every file and directory named \e{something} and \e{another\\something} will be matched. \S2{rename} Rename \c [/REBOOTOK] source_file dest_file Rename source_file to dest_file. You can use it to move a file from anywhere on the system to anywhere else and you can move a directory to somewhere else on the same drive. The destination file must not exist or the move will fail (unless you are using /REBOOTOK). If /REBOOTOK is specified, and the file cannot be moved (if, for example, the destination exists), then the file is moved when the system reboots. If the file will be moved on a reboot, the reboot flag will be set. The error flag is set if the file cannot be renamed (and /REBOOTOK is not used) or if the source file does not exist. If no absolute path is specified the current folder will be used. The current folder is the folder set using the last \R{setoutpath}{SetOutPath} instruction. If you have not used \R{setoutpath}{SetOutPath} the current folder is \R{varother}{$EXEDIR}. \c Rename $INSTDIR\file.ext $INSTDIR\file.dat \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning The /REBOOTOK switch requires administrator rights on Windows NT and later. \NsisWarnBlockContainerEnd \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning Files cannot be moved from one drive to another if a reboot is required. \NsisWarnBlockContainerEnd \S2{reservefile} ReserveFile \c [/nonfatal] [/r] [/x file|wildcard [...]] file [file...] | [/nonfatal] /plugin file.dll Reserves a file in the data block for later use. Files are added to the compressed data block in the order they appear in the script. Functions, however, are not necessarily called in the order they appear in the script. Therefore, if you add a file in a function called early but put the function at the end of the script, all of the files added earlier will have to be decompressed to get to the required file. This process can take a long time if there a lot of files. \R{oninit}{.onInit} is one such function. It is called at the very beginning, before anything else appears. If you put it at the very end of the script, extract some files in it and have lots of files added before it, the installer might take a very long time to load. This is where this command comes useful, allowing you to speed up the loading process by including the file at the top of the data block instead of letting NSIS seek all the way down to the bottom of the \e{compressed} data block. Use /plugin to reserve a plugin in $\{NSISDIR\}\\Plugins\\*. See \R{file}{File} for more information about the parameters. \S2{rmdir} RMDir \c [/r] [/REBOOTOK] directory_name Remove the specified directory (fully qualified path with no wildcards). Without /r, the directory will only be removed if it is completely empty. If /r is specified the directory will be removed recursively, so all directories and files in the specified directory will be removed. If /REBOOTOK is specified, any file or directory which could not be removed during the process will be removed on reboot -- if any file or directory will be removed on a reboot, the reboot flag will be set. The error flag is set if any file or directory cannot be removed. \c RMDir $INSTDIR \c RMDir $INSTDIR\data \c RMDir /r /REBOOTOK $INSTDIR \c RMDir /REBOOTOK $INSTDIR\DLLs Note that the current working directory can not be deleted. The current working directory is set by \R{setoutpath}{SetOutPath}. For example, the following example will not delete the directory. \c SetOutPath $TEMP\dir \c RMDir $TEMP\dir The next example will succeed in deleting the directory. \c SetOutPath $TEMP\dir \c SetOutPath $TEMP \c RMDir $TEMP\dir \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning Using \e{RMDir /r $INSTDIR} in the uninstaller is not safe. Though it is unlikely, the user might select to install to the root of the Program Files folder and this command would wipe out the entire Program Files folder, including all other installed programs! The user can also put other files in the installation folder and wouldn't expect them to get deleted along with the program. Solutions are \W{https://nsis.sourceforge.io/Uninstall_only_installed_files}{available} for easily uninstalling only files which were installed by the installer. \NsisWarnBlockContainerEnd \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning The /REBOOTOK switch requires administrator rights on Windows NT and later. \NsisWarnBlockContainerEnd \S2{setoutpath} SetOutPath \c outpath Sets the output path ($OUTDIR) and creates it (recursively if necessary), if it does not exist. Must be a full pathname, usually is just $INSTDIR (you can specify $INSTDIR with a single "-" if you are lazy). \c SetOutPath $INSTDIR \c File program.exe nsis-3.11/Docs/src/bin/000077500000000000000000000000001477201124000146375ustar00rootroot00000000000000nsis-3.11/Docs/src/bin/halibut/000077500000000000000000000000001477201124000162675ustar00rootroot00000000000000nsis-3.11/Docs/src/bin/halibut/LICENSE000077500000000000000000000022071477201124000173000ustar00rootroot00000000000000Halibut is copyright (c) 1999-2001 Simon Tatham and James Aylett. Note: This version is modified by Robert Rainwater and Amir Szekely 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. nsis-3.11/Docs/src/bin/halibut/SConscript000077500000000000000000000005031477201124000203020ustar00rootroot00000000000000target = 'halibut' files = Split(""" biblio.c bk_xhtml.c contents.c error.c help.c index.c input.c keywords.c licence.c main.c malloc.c misc.c style.c tree234.c ustring.c version.c """) Import('env AddAvailableLibs') AddAvailableLibs(env, ['rt']) halibut = env.Program(target, files) Return('halibut') nsis-3.11/Docs/src/bin/halibut/biblio.c000077500000000000000000000052521477201124000177020ustar00rootroot00000000000000/* * biblio.c: process the bibliography */ #include #include "halibut.h" static wchar_t *gentext(int num) { wchar_t text[22]; wchar_t *p = text + sizeof(text); *--p = L'\0'; *--p = L']'; while (num != 0) { assert(p > text); *--p = L"0123456789"[num % 10]; num /= 10; } assert(p > text); *--p = L'['; return ustrdup(p); } static void cite_biblio(keywordlist * kl, wchar_t * key, filepos fpos) { keyword *kw = kw_lookup(kl, key); if (!kw) error(err_nosuchkw, &fpos, key); else { /* * We've found a \k reference. If it's a * bibliography entry ... */ if (kw->para->type == para_Biblio) { /* * ... then mark the paragraph as cited. */ kw->para->type = para_BiblioCited; } } } /* * Make a pass through the source form, generating citation formats * for bibliography entries and also marking which bibliography * entries are actually cited (or \nocite-ed). */ void gen_citations(paragraph * source, keywordlist * kl) { paragraph *para; int bibnum = 0; for (para = source; para; para = para->next) { word *ptr; /* * \BR and \nocite paragraphs get special processing here. */ if (para->type == para_BR) { keyword *kw = kw_lookup(kl, para->keyword); if (!kw) { error(err_nosuchkw, ¶->fpos, para->keyword); } else if (kw->text) { error(err_multiBR, ¶->fpos, para->keyword); } else { kw->text = dup_word_list(para->words); } } else if (para->type == para_NoCite) { wchar_t *wp = para->keyword; while (*wp) { cite_biblio(kl, wp, para->fpos); wp = uadv(wp); } } /* * Scan for keyword references. */ for (ptr = para->words; ptr; ptr = ptr->next) { if (ptr->type == word_UpperXref || ptr->type == word_LowerXref || ptr->type == word_FreeTextXref) cite_biblio(kl, ptr->text, ptr->fpos); } } /* * We're now almost done; all that remains is to scan through * the cited bibliography entries and invent default citation * texts for the ones that don't already have explicitly * provided \BR text. */ for (para = source; para; para = para->next) { if (para->type == para_BiblioCited) { keyword *kw = kw_lookup(kl, para->keyword); assert(kw != NULL); if (!kw->text) { word *wd = smalloc(sizeof(word)); wd->text = gentext(++bibnum); wd->type = word_Normal; wd->breaks = FALSE; wd->alt = NULL; wd->next = NULL; wd->aux = 0; kw->text = wd; } para->kwtext = kw->text; } } } nsis-3.11/Docs/src/bin/halibut/bk_xhtml.c000077500000000000000000001726511477201124000202620ustar00rootroot00000000000000/* * xhtml backend for Halibut * (initial implementation by James Aylett) * * Still to do: * * +++ doesn't handle non-breaking hyphens. Not sure how to yet. * +++ entity names (from a file -- ideally supply normal SGML files) * +++ configuration directive to file split where the current layout * code wouldn't. Needs changes to _ponder_layout() and _do_paras(), * perhaps others. * * Limitations: * * +++ biblio/index references target the nearest section marker, rather * than having a dedicated target themselves. In large bibliographies * this will cause problems. (The solution is to fake up a response * from xhtml_find_section(), probably linking it into the sections * chain just in case we need it again, and to make freeing it up * easier.) docsrc.pl used to work as we do, however, and SGT agrees that * this is acceptable for now. * +++ can't cope with leaf-level == 0. It's all to do with the * top-level file not being normal, probably not even having a valid * section level, and stuff like that. I question whether this is an * issue, frankly; small manuals that fit on one page should probably * not be written in halibut at all. */ #include #include #include #include #include "halibut.h" enum outputtype { OT_XHTML = 0x01, OT_CHM = 0x02, OT_HTML4 = 0x04, OT_HTML5 = 0x08 }; int g_outputtype = OT_XHTML; #define is_chm() ( (g_outputtype & OT_CHM) == OT_CHM ) #define is_xhtml() ( (g_outputtype & OT_XHTML) == OT_XHTML ) #define is_html5() ( (g_outputtype & OT_HTML5) == OT_HTML5 ) #define gettagtxt_br() ( is_xhtml() ? "
" : "
" ) #define gettagtxt_hr() ( is_xhtml() ? "
" : "
" ) struct xhtmlsection_Struct { struct xhtmlsection_Struct *next; /* next sibling (NULL if split across files) */ struct xhtmlsection_Struct *child; /* NULL if split across files */ struct xhtmlsection_Struct *parent; /* NULL if split across files */ struct xhtmlsection_Struct *chain; /* single structure independent of weird trees */ paragraph *para; struct xhtmlfile_Struct *file; /* which file is this a part of? */ char *fragment; /* fragment id within the file */ int level; }; struct xhtmlfile_Struct { struct xhtmlfile_Struct *next; struct xhtmlfile_Struct *child; struct xhtmlfile_Struct *parent; char *filename; struct xhtmlsection_Struct *sections; /* sections within this file (only one for non-leaf) */ int is_leaf; /* is this file a leaf file, ie does it not have any children? */ }; typedef struct xhtmlsection_Struct xhtmlsection; typedef struct xhtmlfile_Struct xhtmlfile; typedef struct xhtmlindex_Struct xhtmlindex; struct xhtmlindex_Struct { int nsection; int size; xhtmlsection **sections; }; typedef struct { int just_numbers; wchar_t *number_suffix; } xhtmlheadfmt; typedef struct { int contents_depth[6]; int leaf_contains_contents; int leaf_level; int leaf_smallest_contents; int include_version_id; wchar_t *author, *description; wchar_t *html_lang, *meta_charset; wchar_t *head_start, *head_middle, *head_end, *body, *body_start, *body_end; ustr_slist *meta_append; wchar_t *address_start, *address_end, *nav_attrs; wchar_t *rlink_prefix, *rlink_suffix; wchar_t *chm_toc_file, *chm_ind_file; int suppress_address; xhtmlheadfmt fchapter, *fsect; int nfsect; int keywordfragments; } xhtmlconfig; /*static void xhtml_level(paragraph *, int); static void xhtml_level_0(paragraph *); static void xhtml_docontents(FILE *, paragraph *, int); static void xhtml_dosections(FILE *, paragraph *, int); static void xhtml_dobody(FILE *, paragraph *, int);*/ static void xhtml_doheader(FILE *, word *); static void xhtml_dofooter(FILE *); static void xhtml_versionid(FILE *, word *, int); static void xhtml_utostr(wchar_t *, char **); static int xhtml_para_level(paragraph *); static int xhtml_reservedchar(int); static int xhtml_convert(wchar_t *, char **, int); static void xhtml_rdaddwc(rdstringc *, word *, word *); static void xhtml_para(FILE *, word *); static void xhtml_codepara(FILE *, word *); static void xhtml_heading(FILE *, paragraph *); static void chm_doheader(FILE *, word *); static void chm_dofooter(FILE *); /* File-global variables are much easier than passing these things * all over the place. Evil, but easier. We can replace this with a single * structure at some point. */ static xhtmlconfig conf; static keywordlist *keywords; static indexdata *idx; static xhtmlfile *topfile; static xhtmlsection *topsection; static paragraph *sourceparas; static xhtmlfile *lastfile; static xhtmlfile *xhtml_last_file = NULL; static int last_level = -1; static xhtmlsection *currentsection; static FILE* chm_toc = NULL; static FILE* chm_ind = NULL; static const wchar_t* normalizehtmlkeywordprefix(const wchar_t*s) // [x]html... --> html... { return s && utolower(s[0]) == 'x' && utolower(s[1]) == 'h' && utolower(s[2]) == 't' ? s + 1 : s; } static const wchar_t* ishtmlkeyword(const wchar_t*a, const wchar_t*b) { return !ustricmp(normalizehtmlkeywordprefix(a), normalizehtmlkeywordprefix(b)) ? a : 0; } static wchar_t* configurekeyword(wchar_t**dst, const wchar_t*keyword, const paragraph*source) { if (ishtmlkeyword(source->keyword, keyword)) return *dst = uadv(source->keyword); else return 0; } static xhtmlconfig xhtml_configure(paragraph * source) { xhtmlconfig ret; /* * Defaults. */ ret.contents_depth[0] = 2; ret.contents_depth[1] = 3; ret.contents_depth[2] = 4; ret.contents_depth[3] = 5; ret.contents_depth[4] = 6; ret.contents_depth[5] = 7; ret.leaf_level = 2; ret.leaf_smallest_contents = 4; ret.leaf_contains_contents = FALSE; ret.include_version_id = TRUE; ret.author = NULL; ret.description = NULL; ret.html_lang = NULL; ret.meta_charset = NULL; ret.head_start = ret.head_middle = ret.head_end = NULL; ret.body = NULL; ret.body_start = NULL; ret.body_end = NULL; ret.meta_append = NULL; ret.address_start = NULL; ret.address_end = NULL; ret.nav_attrs = NULL; ret.suppress_address = FALSE; ret.chm_toc_file = NULL; ret.chm_ind_file = NULL; chm_toc = NULL; chm_ind = NULL; ret.fchapter.just_numbers = FALSE; ret.fchapter.number_suffix = ustrdup(L": "); ret.nfsect = 2; ret.fsect = mknewa(xhtmlheadfmt, ret.nfsect); ret.fsect[0].just_numbers = FALSE; ret.fsect[0].number_suffix = ustrdup(L": "); ret.fsect[1].just_numbers = TRUE; ret.fsect[1].number_suffix = ustrdup(L" "); ret.rlink_prefix = NULL; ret.rlink_suffix = NULL; ret.keywordfragments = TRUE; for (; source; source = source->next) { if (source->type == para_Config) { if (ishtmlkeyword(source->keyword, L"html-version")) { const wchar_t* v = uadv(source->keyword); if (!ustricmp(v, L"html4")) g_outputtype = OT_HTML4; // Note: Upstream treats this as "W3C HTML 4.01 Strict" else if (!ustricmp(v, L"html5")) g_outputtype = OT_HTML5; else if (!ustricmp(v, L"xhtml1.0transitional")) g_outputtype = OT_XHTML; else error(err_whatever, "%ls unknown %ls", source->keyword, v); } else if (ishtmlkeyword(source->keyword, L"xhtml-contents-depth-0")) { ret.contents_depth[0] = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-contents-depth-1")) { ret.contents_depth[1] = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-contents-depth-2")) { ret.contents_depth[2] = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-contents-depth-3")) { ret.contents_depth[3] = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-contents-depth-4")) { ret.contents_depth[4] = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-contents-depth-5")) { ret.contents_depth[5] = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-leaf-level")) { ret.leaf_level = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-leaf-smallest-contents")) { ret.leaf_smallest_contents = utoi(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-versionid")) { ret.include_version_id = utob(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-leaf-contains-contents")) { ret.leaf_contains_contents = utob(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-suppress-address")) { ret.suppress_address = utob(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-author")) { ret.author = uadv(source->keyword); } else if (!ustricmp(source->keyword, L"chm-toc-file")) { ret.chm_toc_file = uadv(source->keyword); } else if (!ustricmp(source->keyword, L"chm-ind-file")) { ret.chm_ind_file = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-description")) { ret.description = uadv(source->keyword); } else if (configurekeyword(&ret.html_lang, L"xhtml-lang", source)) { } else if (configurekeyword(&ret.meta_charset, L"xhtml-meta-charset", source)) { } else if (configurekeyword(&ret.head_start, L"xhtml-head-start", source)) { } else if (configurekeyword(&ret.head_middle, L"xhtml-head-middle", source)) { } else if (configurekeyword(&ret.head_end, L"xhtml-head-end", source)) { } else if (ishtmlkeyword(source->keyword, L"xhtml-body-start")) { ret.body_start = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-body-tag")) { ret.body = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-body-end")) { ret.body_end = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"html-append-meta")) { ustr_slist_append(&ret.meta_append, uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-address-start")) { ret.address_start = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-address-end")) { ret.address_end = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-navigation-attributes")) { ret.nav_attrs = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-chapter-numeric")) { ret.fchapter.just_numbers = utob(uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-chapter-suffix")) { ustrreplacedup(&ret.fchapter.number_suffix, uadv(source->keyword)); } else if (ishtmlkeyword(source->keyword, L"xhtml-rlink-prefix")) { ret.rlink_prefix = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-rlink-suffix")) { ret.rlink_suffix = uadv(source->keyword); } else if (ishtmlkeyword(source->keyword, L"xhtml-section-numeric")) { wchar_t *p = uadv(source->keyword); int n = 0; if (uisdigit(*p)) { n = utoi(p); p = uadv(p); } if (n >= ret.nfsect) { int i; ret.fsect = resize(ret.fsect, n + 1); for (i = ret.nfsect; i <= n; i++) ret.fsect[i] = ret.fsect[ret.nfsect - 1]; ret.nfsect = n + 1; } ret.fsect[n].just_numbers = utob(p); } else if (ishtmlkeyword(source->keyword, L"xhtml-section-suffix")) { wchar_t *p = uadv(source->keyword); int n = 0; if (uisdigit(*p)) { n = utoi(p); p = uadv(p); } if (n >= ret.nfsect) { int i; ret.fsect = resize(ret.fsect, n + 1); for (i = ret.nfsect; i <= n; i++) ret.fsect[i] = ret.fsect[ret.nfsect - 1]; ret.nfsect = n + 1; } ustrreplacedup(&ret.fsect[n].number_suffix, p); } else if (ishtmlkeyword(source->keyword, L"xhtml-keywordfragments")) { ret.keywordfragments = utob(uadv(source->keyword)); } } } /* printf(" !!! leaf_level = %i\n", ret.leaf_level); printf(" !!! contentdepth-0 = %i\n", ret.contents_depth[0]); printf(" !!! contentdepth-1 = %i\n", ret.contents_depth[1]); printf(" !!! contentdepth-2 = %i\n", ret.contents_depth[2]); printf(" !!! contentdepth-3 = %i\n", ret.contents_depth[3]); printf(" !!! contentdepth-4 = %i\n", ret.contents_depth[4]); printf(" !!! contentdepth-5 = %i\n", ret.contents_depth[5]); printf(" !!! leaf_contains_contents = %i\n", ret.leaf_contains_contents); */ return ret; } #define element_close(rs__, tagname__) rdaddsc((rs__), "") #define element_open(rs__, tagname__) rdaddsc((rs__), "<" tagname__ ">") static xhtmlsection *xhtml_new_section(xhtmlsection * last) { xhtmlsection *ret = mknew(xhtmlsection); ret->next = NULL; ret->child = NULL; ret->parent = NULL; ret->chain = last; ret->para = NULL; ret->file = NULL; ret->fragment = NULL; ret->level = -1; /* marker: end of chain */ return ret; } /* Returns NULL or the section that marks that paragraph */ static xhtmlsection *xhtml_find_section(paragraph * p) { xhtmlsection *ret = topsection; if (xhtml_para_level(p) == -1) { /* first, we back-track to a section paragraph */ paragraph *p2 = sourceparas; paragraph *p3 = NULL; while (p2 && p2 != p) { if (xhtml_para_level(p2) != -1) { p3 = p2; } p2 = p2->next; } if (p3 == NULL) { /* for some reason, we couldn't find a section before this paragraph ... ? */ /* Note that this can happen, if you have a cross-reference to before the first chapter starts. * So don't do that, then. */ return NULL; } p = p3; } while (ret && ret->para != p) { /* printf(" xhtml_find_section(): checking %s for para @ %p\n", ret->fragment, p);*/ ret = ret->chain; } return ret; } static xhtmlfile *xhtml_new_file(xhtmlsection * sect) { xhtmlfile *ret = mknew(xhtmlfile); ret->next = NULL; ret->child = NULL; ret->parent = NULL; ret->filename = NULL; ret->sections = sect; ret->is_leaf = (sect != NULL && sect->level == conf.leaf_level); if (sect == NULL) { if (conf.leaf_level == 0) { /* currently unused */ #define FILENAME_MANUAL "Manual.html" #define FILENAME_CONTENTS "Contents.html" ret->filename = smalloc(strlen(FILENAME_MANUAL) + 1); sprintf(ret->filename, FILENAME_MANUAL); } else { ret->filename = smalloc(strlen(FILENAME_CONTENTS) + 1); sprintf(ret->filename, FILENAME_CONTENTS); } } else { paragraph *p = sect->para; rdstringc fname_c = { 0, 0, NULL }; char *c; word *w; for (w = (p->kwtext) ? (p->kwtext) : (p->words); w; w = w->next) { switch (removeattr(w->type)) { case word_Normal: /*case word_Emph: case word_Code: case word_WeakCode: */ xhtml_utostr(w->text, &c); rdaddsc(&fname_c, c); sfree(c); break; } } rdaddsc(&fname_c, ".html"); ret->filename = rdtrimc(&fname_c); } /* printf(" ! new file '%s', is_leaf == %s\n", ret->filename, (ret->is_leaf)?("true"):("false")); */ return ret; } /* * Walk the tree fixing up files which are actually leaf (ie * have no children) but aren't at leaf level, so they have the * leaf flag set. */ void xhtml_fixup_layout(xhtmlfile * file) { if (file->child == NULL) { file->is_leaf = TRUE; } else { xhtml_fixup_layout(file->child); } if (file->next) xhtml_fixup_layout(file->next); } /* * Create the tree structure so we know where everything goes. * Method: * * Ignoring file splitting, we have three choices with each new section: * * +-----------------+-----------------+ * | | | * X +----X----+ (1) * | | * Y (2) * | * (3) * * Y is the last section we added (currentsect). * If sect is the section we want to add, then: * * (1) if sect->level < currentsect->level * (2) if sect->level == currentsect->level * (3) if sect->level > currentsect->level * * This requires the constraint that you never skip section numbers * (so you can't have a.b.c.d without all of a, a.b and a.b.c existing). * * Note that you _can_ have 1.1.1.1 followed by 1.2 - you can change * more than one level at a time. Lots of asserts, and probably part of * the algorithm here, rely on this being true. (It currently isn't * enforced by halibut, however.) * * File splitting makes this harder. For instance, say we added at (3) * above and now need to add another section. We are splitting at level * 2, ie the level of Y. Z is the last section we added: * * +-----------------+-----------------+ * | | | * X +----X----+ (1) * | | * +----Y----+ (1) * | | * Z (2) * | * (3) * * The (1) case is now split; we need to search upwards to find where * to actually link in. The other two cases remain the same (and will * always be like this). * * File splitting makes this harder, however. The decision of whether * to split to a new file is always on the same condition, however (is * the level of this section higher than the leaf_level configuration * value or not). * * Treating the cases backwards: * * (3) same file if sect->level > conf.leaf_level, otherwise new file * * if in the same file, currentsect->child points to sect * otherwise the linking is done through the file tree (which works * in more or less the same way, ie currentfile->child points to * the new file) * * (2) same file if sect->level > conf.leaf_level, otherwise new file * * if in the same file, currentsect->next points to sect * otherwise file linking and currentfile->next points to the new * file (we know that Z must have caused a new file to be created) * * (1) same file if sect->level > conf.leaf_level, otherwise new file * * this is actually effectively the same case as (2) here, * except that we first have to travel up the sections to figure * out which section this new one will be a sibling of. In doing * so, we may disappear off the top of a file and have to go up * to its parent in the file tree. * */ static void xhtml_ponder_layout(paragraph * p) { xhtmlsection *lastsection; xhtmlsection *currentsect; xhtmlfile *currentfile; lastfile = NULL; topsection = xhtml_new_section(NULL); topfile = xhtml_new_file(NULL); lastsection = topsection; currentfile = topfile; currentsect = topsection; if (conf.leaf_level == 0) { topfile->is_leaf = 1; topfile->sections = topsection; topsection->file = topfile; } for (; p; p = p->next) { int level = xhtml_para_level(p); if (level > 0) { /* actually a section */ xhtmlsection *sect; word *w; char *c; rdstringc fname_c = { 0, 0, NULL }; sect = xhtml_new_section(lastsection); lastsection = sect; sect->para = p; for (w = (p->kwtext2) ? (p->kwtext2) : (p->words); w; w = w->next) { /* kwtext2 because we want numbers only! */ switch (removeattr(w->type)) { case word_Normal: /*case word_Emph: case word_Code: case word_WeakCode: */ xhtml_utostr(w->text, &c); rdaddsc(&fname_c, c); sfree(c); break; } } /* rdaddsc(&fname_c, ".html");*/ sect->fragment = rdtrimc(&fname_c); sect->level = level; /* printf(" ! adding para @ %p as sect %s, level %i\n", sect->para, sect->fragment, level); */ if (level > currentsect->level) { /* case (3) */ if (level > conf.leaf_level) { /* same file */ assert(currentfile->is_leaf); currentsect->child = sect; sect->parent = currentsect; sect->file = currentfile; /* printf("connected '%s' to existing file '%s' [I]\n", sect->fragment, currentfile->filename); */ currentsect = sect; } else { /* new file */ xhtmlfile *file = xhtml_new_file(sect); assert(!currentfile->is_leaf); currentfile->child = file; sect->file = file; file->parent = currentfile; /* printf("connected '%s' to new file '%s' [I]\n", sect->fragment, file->filename); */ currentfile = file; currentsect = sect; } } else if (level >= currentsect->file->sections->level) { /* Case (1) or (2) *AND* still under the section that starts * the current file. * * I'm not convinced that this couldn't be rolled in with the * final else {} leg further down. It seems a lot of effort * this way. */ if (level > conf.leaf_level) { /* stick within the same file */ assert(currentfile->is_leaf); sect->file = currentfile; while (currentsect && currentsect->level > level && currentsect->file == currentsect->parent->file) { currentsect = currentsect->parent; } assert(currentsect); currentsect->next = sect; assert(currentsect->level == sect->level); sect->parent = currentsect->parent; currentsect = sect; /* printf("connected '%s' to existing file '%s' [II]\n", sect->fragment, currentfile->filename); */ } else { /* new file */ xhtmlfile *file = xhtml_new_file(sect); sect->file = file; currentfile->next = file; file->parent = currentfile->parent; file->is_leaf = (level == conf.leaf_level); file->sections = sect; /* printf("connected '%s' to new file '%s' [II]\n", sect->fragment, file->filename); */ currentfile = file; currentsect = sect; } } else { /* Case (1) or (2) and we must move up the file tree first */ /* this loop is now probably irrelevant - we know we can't connect * to anything in the current file */ while (currentsect && level < currentsect->level) { currentsect = currentsect->parent; if (currentsect) { /* printf(" * up one level to '%s'\n", currentsect->fragment); */ } else { /* printf(" * up one level (off top of current file)\n"); */ } } if (currentsect) { /* I'm pretty sure this can now never fire */ assert(currentfile->is_leaf); /* printf("connected '%s' to existing file '%s' [III]\n", sect->fragment, currentfile->filename); */ sect->file = currentfile; currentsect->next = sect; currentsect = sect; } else { /* find a file we can attach to */ while (currentfile && currentfile->sections && level < currentfile->sections->level) { currentfile = currentfile->parent; if (currentfile) { /* printf(" * up one file level to '%s'\n", currentfile->filename); */ } else { /* printf(" * up one file level (off top of tree)\n"); */ } } if (currentfile) { /* new file (we had to skip up a file to get here, so we must be dealing with a level no lower than the configured leaf_level */ xhtmlfile *file = xhtml_new_file(sect); currentfile->next = file; sect->file = file; file->parent = currentfile->parent; file->is_leaf = (level == conf.leaf_level); file->sections = sect; /* printf("connected '%s' to new file '%s' [III]\n", sect->fragment, file->filename); */ currentfile = file; currentsect = sect; } else { fatal(err_whatever, "Ran off the top trying to connect sibling: strange document."); } } } } } topsection = lastsection; /* get correct end of the chain */ xhtml_fixup_layout(topfile); /* leaf files not at leaf level marked as such */ } static void xhtml_hack_xhtmlify(word*words) // "\" "" --> "\" "
" { int prevwasslash = 0; if (!is_xhtml()) return ; for (;words; words = words->next) { if (!words->text) continue; if (prevwasslash) { if (words->text[0] == '<' && !ustricmp(words->text, L"next && words->next->text && words->next->text[0] == '\\') ustrreplacedup(&words->text, L"
text[0] == '\\' && !words->text[1]; } } #define NAMEDFRAGMENT_MAXLEN 200 /* More than enough for our usage */ /* * Get formatted fragment name for html anchor. * Uses para->keyword if possible, falls back to the ?#.#.# default. */ static char* xhtml_get_fragmentname(const xhtmlsection * section, char * fragmentbuf) { if (conf.keywordfragments) { paragraph *para = section->para; if (para && para->keyword && *para->keyword) return ustrtoa(para->keyword, fragmentbuf, NAMEDFRAGMENT_MAXLEN); } return section->fragment; } static void xhtml_do_index(); static void xhtml_do_file(xhtmlfile * file); static void xhtml_do_top_file(xhtmlfile * file, paragraph * sourceform); static void xhtml_do_paras(FILE * fp, paragraph * p); static int xhtml_do_contents_limit(FILE * fp, xhtmlfile * file, int limit); static int xhtml_do_contents_section_limit(FILE * fp, xhtmlsection * section, int limit); static int xhtml_add_contents_entry(FILE * fp, xhtmlsection * section, int limit); static int xhtml_do_contents(FILE * fp, xhtmlfile * file); static int xhtml_do_naked_contents(FILE * fp, xhtmlfile * file); static void xhtml_do_sections(FILE * fp, xhtmlsection * sections); /* * Do all the files in this structure. */ static void xhtml_do_files(xhtmlfile * file) { xhtml_do_file(file); if (file->child) xhtml_do_files(file->child); if (file->next) xhtml_do_files(file->next); } /* * Free up all memory used by the file tree from 'xfile' downwards */ static void xhtml_free_file(xhtmlfile * xfile) { if (xfile == NULL) { return; } if (xfile->filename) { sfree(xfile->filename); } xhtml_free_file(xfile->child); xhtml_free_file(xfile->next); sfree(xfile); } /* * Main function. */ void xhtml_backend(paragraph * sourceform, keywordlist * in_keywords, indexdata * in_idx) { /* int i;*/ indexentry *ientry; int ti; xhtmlsection *xsect; sourceparas = sourceform; conf = xhtml_configure(sourceform); keywords = in_keywords; idx = in_idx; /* Clear up the index entries backend data pointers */ for (ti = 0; (ientry = (indexentry *) index234(idx->entries, ti)) != NULL; ti++) { ientry->backend_data = NULL; } xhtml_ponder_layout(sourceform); /* old system ... (writes to *.alt, but gets some stuff wrong and is ugly) */ /* xhtml_level_0(sourceform); for (i=1; i<=conf.leaf_level; i++) { xhtml_level(sourceform, i); }*/ /* new system ... (writes to *.html, but isn't fully trusted) */ xhtml_do_top_file(topfile, sourceform); assert(!topfile->next); /* shouldn't have a sibling at all */ if (topfile->child) { xhtml_do_files(topfile->child); xhtml_do_index(); } /* release file, section, index data structures */ xsect = topsection; while (xsect) { xhtmlsection *tmp = xsect->chain; if (xsect->fragment) { sfree(xsect->fragment); } sfree(xsect); xsect = tmp; } xhtml_free_file(topfile); for (ti = 0; (ientry = (indexentry *) index234(idx->entries, ti)) != NULL; ti++) { if (ientry->backend_data != NULL) { xhtmlindex *xi = (xhtmlindex *) ientry->backend_data; if (xi->sections != NULL) { sfree(xi->sections); } sfree(xi); } ientry->backend_data = NULL; } { int i; sfree(conf.fchapter.number_suffix); for (i = 0; i < conf.nfsect; i++) sfree(conf.fsect[i].number_suffix); sfree(conf.fsect); } free_ustr_slist(conf.meta_append); } static int xhtml_para_level(paragraph * p) { switch (p->type) { case para_Title: return 0; break; case para_UnnumberedChapter: case para_Chapter: case para_Appendix: return 1; break; /* case para_BiblioCited: return 2; break;*/ case para_Heading: case para_Subsect: return p->aux + 2; break; default: return -1; break; } } static char *xhtml_index_filename = "IndexPage.html"; /* Output the nav links for the current file. * file == NULL means we're doing the index */ static void xhtml_donavlinks(FILE * fp, xhtmlfile * file) { xhtmlfile *xhtml_next_file = NULL; fputs("", conf.nav_attrs); } else { fputs(">", fp); } if (xhtml_last_file == NULL) { fputs("Previous | ", fp); } else { fprintf(fp, "
Previous | ", xhtml_last_file->filename); } fputs("Contents | ", fp); if (file != NULL) { /* otherwise we're doing nav links for the index */ if (xhtml_next_file == NULL) xhtml_next_file = file->child; if (xhtml_next_file == NULL) xhtml_next_file = file->next; if (xhtml_next_file == NULL) xhtml_next_file = file->parent->next; } if (xhtml_next_file == NULL) { if (file == NULL) { /* index, so no next file */ fputs("Next ", fp); } else { fprintf(fp, "Next", xhtml_index_filename); } } else { fprintf(fp, "Next", xhtml_next_file->filename); } fputs("

\n", fp); } /* Write out the index file */ static void xhtml_do_index_body(FILE * fp) { indexentry *y; int ti; if (count234(idx->entries) == 0) return; /* don't write anything at all */ fputs("
\n", fp); /* iterate over idx->entries using the tree functions and display everything */ for (ti = 0; (y = (indexentry *) index234(idx->entries, ti)) != NULL; ti++) { if (y->backend_data) { int i; xhtmlindex *xi; fputs("
", fp); xhtml_para(fp, y->text); fputs("
\n
", fp); xi = (xhtmlindex *) y->backend_data; for (i = 0; i < xi->nsection; i++) { xhtmlsection *sect = xi->sections[i]; if (sect) { char fragmentbuf[NAMEDFRAGMENT_MAXLEN]; fprintf(fp, "", conf.leaf_level ? sect->file->filename : "", xhtml_get_fragmentname(sect, fragmentbuf)); if (sect->para->kwtext) { xhtml_para(fp, sect->para->kwtext); } else if (sect->para->words) { xhtml_para(fp, sect->para->words); } fputs("", fp); if (i + 1 < xi->nsection) { fputs(", ", fp); } } } fputs("
\n", fp); } } fputs("
\n", fp); } static void xhtml_do_index() { word temp_word = { NULL, NULL, word_Normal, 0, 0, L"Index", {NULL, 0, 0} }; FILE *fp = fopen(xhtml_index_filename, "w"); if (fp == NULL) fatal(err_cantopenw, xhtml_index_filename); xhtml_doheader(fp, &temp_word); xhtml_donavlinks(fp, NULL); xhtml_do_index_body(fp); xhtml_donavlinks(fp, NULL); xhtml_dofooter(fp); fclose(fp); } /* Output the given file. This includes whatever contents at beginning and end, etc. etc. */ static void xhtml_do_file(xhtmlfile * file) { FILE *fp = fopen(file->filename, "w"); if (fp == NULL) fatal(err_cantopenw, file->filename); if (file->sections->para->words) { xhtml_doheader(fp, file->sections->para->words); } else if (file->sections->para->kwtext) { xhtml_doheader(fp, file->sections->para->kwtext); } else { xhtml_doheader(fp, NULL); } xhtml_donavlinks(fp, file); if (file->is_leaf && conf.leaf_contains_contents && xhtml_do_contents(NULL, file) >= conf.leaf_smallest_contents) xhtml_do_contents(fp, file); xhtml_do_sections(fp, file->sections); if (!file->is_leaf) xhtml_do_naked_contents(fp, file); xhtml_donavlinks(fp, file); xhtml_dofooter(fp); fclose(fp); xhtml_last_file = file; } /* Output the top-level file. */ static void xhtml_do_top_file(xhtmlfile * file, paragraph * sourceform) { paragraph *p; char fname[4096]; int done = FALSE; FILE *fp = fopen(file->filename, "w"); if (fp == NULL) fatal(err_cantopenw, file->filename); if (conf.chm_toc_file || conf.chm_ind_file) g_outputtype = OT_CHM | (g_outputtype & (OT_XHTML|OT_HTML5)); ustrtoa(conf.chm_toc_file, fname, 4096); if(*fname) { chm_toc = fopen(fname, "w"); if (chm_toc == NULL) fatal(err_cantopenw, fname); } else chm_toc = NULL; ustrtoa(conf.chm_ind_file, fname, 4096); if(*fname){ chm_ind = fopen(fname, "w"); if (chm_ind == NULL) fatal(err_cantopenw, fname); } else chm_ind = NULL; /* Do the title -- only one allowed */ for (p = sourceform; p && !done; p = p->next) { if (p->type == para_Title) { xhtml_doheader(fp, p->words); if(chm_toc)chm_doheader(chm_toc, p->words); if(chm_ind)chm_doheader(chm_ind, p->words); done = TRUE; } } if (!done) xhtml_doheader(fp, NULL /* Eek! */ ); /* * Display the title. */ for (p = sourceform; p; p = p->next) { if (p->type == para_Title) { xhtml_heading(fp, p); break; } } /* Do the preamble and copyright */ for (p = sourceform; p; p = p->next) { if (p->type == para_Preamble) { fputs("

", fp); xhtml_hack_xhtmlify(p->words); xhtml_para(fp, p->words); fputs("

\n", fp); } } for (p = sourceform; p; p = p->next) { if (p->type == para_Copyright) { fputs("

", fp); xhtml_hack_xhtmlify(p->words); xhtml_para(fp, p->words); fputs("

\n", fp); } } xhtml_do_contents(fp, file); xhtml_do_sections(fp, file->sections); /* * Put the index in the top file if we're in single-file mode * (leaf-level 0). */ if (conf.leaf_level == 0 && count234(idx->entries) > 0) { fputs("

Index

\n", fp); xhtml_do_index_body(fp); } xhtml_dofooter(fp); if(chm_toc)chm_dofooter(chm_toc); if(chm_ind)chm_dofooter(chm_ind); fclose(fp); if(chm_toc) { fclose(chm_toc); chm_toc = NULL; } if(chm_ind) { fclose(chm_ind); chm_ind = NULL; } } /* Convert a Unicode string to an ASCII one. '?' is * used for unmappable characters. */ static void xhtml_utostr(wchar_t * in, char **out) { int l = ustrlen(in); int i; *out = smalloc(l + 1); for (i = 0; i < l; i++) { if (in[i] >= 32 && in[i] <= 126) (*out)[i] = (char) in[i]; else (*out)[i] = '?'; } (*out)[i] = 0; } /* * Write contents for the given file, and subfiles, down to * the appropriate contents depth. Returns the number of * entries written. */ static int xhtml_do_contents(FILE * fp, xhtmlfile * file) { int level, limit, start_level, count = 0; if (!file) return 0; level = (file->sections) ? (file->sections->level) : (0); limit = conf.contents_depth[(level > 5) ? (5) : (level)]; start_level = (file->is_leaf) ? (level - 1) : (level); last_level = start_level; count += xhtml_do_contents_section_limit(fp, file->sections, limit); count += xhtml_do_contents_limit(fp, file->child, limit); if (fp != NULL) { while (last_level > start_level) { last_level--; fputs("\n", fp); if(chm_toc)fprintf(chm_toc, "\n"); } } return count; } /* As above, but doesn't do anything in the current file */ static int xhtml_do_naked_contents(FILE * fp, xhtmlfile * file) { int level, limit, start_level, count = 0; if (!file) return 0; level = (file->sections) ? (file->sections->level) : (0); limit = conf.contents_depth[(level > 5) ? (5) : (level)]; start_level = (file->is_leaf) ? (level - 1) : (level); last_level = start_level; count = xhtml_do_contents_limit(fp, file->child, limit); if (fp != NULL) { while (last_level > start_level) { last_level--; fputs("\n", fp); if(chm_toc)fprintf(chm_toc, "\n"); } } return count; } /* * Write contents for the given file, children, and siblings, down to * given limit contents depth. */ static int xhtml_do_contents_limit(FILE * fp, xhtmlfile * file, int limit) { int count = 0; while (file) { count += xhtml_do_contents_section_limit(fp, file->sections, limit); count += xhtml_do_contents_limit(fp, file->child, limit); file = file->next; } return count; } /* * Write contents entries for the given section tree, down to the * limit contents depth. */ static int xhtml_do_contents_section_deep_limit(FILE * fp, xhtmlsection * section, int limit) { int count = 0; while (section) { if (!xhtml_add_contents_entry(fp, section, limit)) return 0; else count++; count += xhtml_do_contents_section_deep_limit(fp, section->child, limit); section = section->next; } return count; } /* * Write contents entries for the given section tree, down to the * limit contents depth. */ static int xhtml_do_contents_section_limit(FILE * fp, xhtmlsection * section, int limit) { int count = 0; if (!section) return 0; xhtml_add_contents_entry(fp, section, limit); count = 1; count += xhtml_do_contents_section_deep_limit(fp, section->child, limit); /* section=section->child; while (section && xhtml_add_contents_entry(fp, section, limit)) { section = section->next; } */ return count; } /* * Add a section entry, unless we're exceeding the limit, in which * case return FALSE (otherwise return TRUE). */ static int xhtml_add_contents_entry(FILE * fp, xhtmlsection * section, int limit) { char fragmentbuf[NAMEDFRAGMENT_MAXLEN], *fragment, *filename; if (!section || section->level > limit) return FALSE; if (fp == NULL || section->level < 0) return TRUE; while (last_level > section->level) { last_level--; fputs("\n", fp); if(chm_toc)fprintf(chm_toc, "\n"); } while (last_level < section->level) { last_level++; fputs("
    \n", fp); if(chm_toc)fprintf(chm_toc, "
      \n"); } filename = conf.leaf_level ? section->file->filename : ""; fragment = ""; if (section->para->type != para_Chapter || !conf.leaf_level) fragment = xhtml_get_fragmentname(section, fragmentbuf); fputs("
    • ", fp); fprintf(fp, "", (section->para->type == para_Chapter|| section->para->type == para_Appendix) ? "class=\"btitle\" " : "", filename, fragment); if(chm_toc)fprintf(chm_toc, "
    • para->type == para_Chapter || section->para->type == para_Appendix) fputs("", fp); if ((section->para->type != para_Heading && section->para->type != para_Subsect) || (section->para->kwtext && !section->para-> words)) { xhtml_para(fp, section->para->kwtext); if(chm_toc)xhtml_para(chm_toc, section->para->kwtext); if (section->para->words){ fputs(": ", fp); if(chm_toc)fprintf(chm_toc, ": "); } } if (section->para->type == para_Chapter || section->para->type == para_Appendix) fputs("", fp); if (section->para->words) { xhtml_para(fp, section->para->words); if(chm_toc)xhtml_para(chm_toc, section->para->words); if(chm_ind)xhtml_para(chm_ind, section->para->words); } fputs("\n", fp); if(chm_toc)fprintf(chm_toc,"\">\n"); if(chm_ind)fprintf(chm_ind,"\">
    • \n"); return TRUE; } /* * Write all the sections in this file. Do all paragraphs in this section, then all * children (recursively), then go on to the next one (tail recursively). */ static void xhtml_do_sections(FILE * fp, xhtmlsection * sections) { while (sections) { currentsection = sections; xhtml_do_paras(fp, sections->para); xhtml_do_sections(fp, sections->child); sections = sections->next; } } /* Write this list of paragraphs. Close off all lists at the end. */ static void xhtml_do_paras(FILE * fp, paragraph * p) { int last_type = -1, first = TRUE; if (!p) return; /* for (; p && (xhtml_para_level(p)>limit || xhtml_para_level(p)==-1 || first); p=p->next) {*/ for (; p && (xhtml_para_level(p) == -1 || first); p = p->next) { first = FALSE; switch (p->type) { /* * Things we ignore because we've already processed them or * aren't going to touch them in this pass. */ case para_IM: case para_BR: case para_Biblio: /* only touch BiblioCited */ case para_VersionID: case para_Copyright: case para_Preamble: case para_NoCite: case para_Title: break; /* * Chapter titles. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: xhtml_heading(fp, p); break; case para_Heading: case para_Subsect: xhtml_heading(fp, p); break; case para_Rule: fprintf(fp, "\n%s\n", gettagtxt_hr()); break; case para_Normal: fputs("\n

      ", fp); xhtml_para(fp, p->words); fputs("

      \n", fp); break; case para_Bullet: case para_NumberedList: case para_BiblioCited: if (last_type != p->type) { /* start up list if necessary */ if (p->type == para_Bullet) { fputs("
        \n", fp); } else if (p->type == para_NumberedList) { fputs("
          \n", fp); } else if (p->type == para_BiblioCited) { fputs("
          \n", fp); } } if (p->type == para_Bullet || p->type == para_NumberedList) fputs("
        1. ", fp); else if (p->type == para_BiblioCited) { fputs("
          ", fp); xhtml_para(fp, p->kwtext); fputs("
          \n
          ", fp); } xhtml_para(fp, p->words); if (p->type == para_BiblioCited) { fputs("
          \n", fp); } else if (p->type == para_Bullet || p->type == para_NumberedList) { fputs("
        2. ", fp); } if (p->type == para_Bullet || p->type == para_NumberedList || p->type == para_BiblioCited) /* close off list if necessary */ { paragraph *p2 = p->next; int close_off = FALSE; /* if (p2 && (xhtml_para_level(p2)>limit || xhtml_para_level(p2)==-1)) {*/ if (p2 && xhtml_para_level(p2) == -1) { if (p2->type != p->type) close_off = TRUE; } else { close_off = TRUE; } if (close_off) { if (p->type == para_Bullet) { fputs("
      \n", fp); } else if (p->type == para_NumberedList) { fputs("\n", fp); } else if (p->type == para_BiblioCited) { fputs("\n", fp); } } } break; case para_Code: xhtml_codepara(fp, p->words); break; } last_type = p->type; } } static void printoptstr(FILE * fp, const char*prefix, const wchar_t*str, const char*suffix) { if (str) { fprintf(fp, "%s%ls%s", prefix ? prefix : "", str, suffix ? suffix : ""); } } /* * Output a header for this XHTML file. */ static void xhtml_doheader(FILE * fp, word * title) { const int xhtml = is_xhtml(), html5 = is_html5(); const char *xhtmldoctype = "\n"; const char *html4doctype = "\n"; const char *xhtmlxmlns = xhtml ? " xmlns=\"http://www.w3.org/1999/xhtml\"" : 0; const char *voidend = xhtml ? " /" : ""; const wchar_t *tmpwstr; const ustr_slist *pussl; if (xhtml && html5) fatal(err_whatever, "indeterminate format"); fputs(html5 ? "\n" : xhtml ? xhtmldoctype : html4doctype, fp); fprintf(fp, "\n", fp); if (ustricmp(L"none", (tmpwstr = ustrdef(conf.meta_charset, L"UTF-8")))) fprintf(fp, (xhtml || !html5) ? "" : "\n", tmpwstr, voidend); printoptstr(fp, "", conf.head_start, "\n"); fputs("", fp); if (title == NULL) fputs("Documentation", fp); else xhtml_para(fp, title); fputs("\n", fp); for (pussl = conf.meta_append; pussl; pussl = pussl->next) fprintf(fp, "", pussl->string, voidend); printoptstr(fp, "", conf.head_middle, "\n"); fprintf(fp, "\n", version, voidend); if (conf.author) fprintf(fp, "\n", conf.author, voidend); if (conf.description) fprintf(fp, "\n", conf.description, voidend); printoptstr(fp, "", conf.head_end, "\n"); fputs("\n", fp); fprintf(fp, "%ls\n", conf.body ? conf.body : L""); if (conf.body_start) fprintf(fp, "%ls\n", conf.body_start); } static void chm_doheader(FILE * fp, word * title) { fputs("
      • \n", fp); } /* * Output a footer for this XHTML file. */ static void xhtml_dofooter(FILE * fp) { int hr = conf.body_end || !conf.suppress_address; if (hr) fprintf(fp, "\n%s\n\n", gettagtxt_hr()); if (conf.body_end) fprintf(fp, "%ls\n", conf.body_end); if (!conf.suppress_address) { fputs("
        \n", fp); if (conf.address_start) fprintf(fp, "%ls\n", conf.address_start); /* Do the version ID */ if (conf.include_version_id) { paragraph *p; int started = 0; for (p = sourceparas; p; p = p->next) if (p->type == para_VersionID) { xhtml_versionid(fp, p->words, started); started = 1; } } if (conf.address_end) fprintf(fp, "%ls\n", conf.address_end); fputs("
        \n", fp); } fputs("\n", fp); } static void chm_dofooter(FILE * fp) { fputs("
      \n", fp); } /* * Output the versionid paragraph. Typically this is a version control * ID string (such as $Id...$ in RCS). */ static void xhtml_versionid(FILE * fp, word * text, int started) { rdstringc t = { 0, 0, NULL }; rdaddc(&t, '['); /* FIXME: configurability */ xhtml_rdaddwc(&t, text, NULL); rdaddc(&t, ']'); /* FIXME: configurability */ if (started) fprintf(fp, "%s\n", gettagtxt_br()); fprintf(fp, "%s\n", t.text); sfree(t.text); } /* Is this an XHTML reserved character? */ static int xhtml_reservedchar(int c) { if (c == '&' || c == '<' || c == '>' || c == '"') return TRUE; else return FALSE; } /* * Convert a wide string into valid XHTML: Anything outside ASCII will * be fixed up as an entity. Currently we don't worry about constraining the * encoded character set, which we should probably do at some point (we can * still fix up and return FALSE - see the last comment here). We also don't * currently * * Because this is only used for words, spaces are HARD spaces (any other * spaces will be word_Whitespace not word_Normal). So they become   * Unless hard_spaces is FALSE, of course (code paragraphs break the above * rule). * * If `result' is non-NULL, mallocs the resulting string and stores a pointer to * it in `*result'. If `result' is NULL, merely checks whether all * characters in the string are feasible. * * Return is nonzero if all characters are OK. If not all * characters are OK but `result' is non-NULL, a result _will_ * still be generated! */ static int xhtml_convert(wchar_t * s, char **result, int hard_spaces) { int doing = (result != 0); int ok = TRUE; char *p = NULL; int plen = 0, psize = 0; for (; *s; s++) { wchar_t c = *s; #define ensure_size(i) if (i>=psize) { psize = i+256; p = resize(p, psize); } if (((c == 32 && !hard_spaces) || (c > 32 && c <= 126 && !xhtml_reservedchar(c)))) { /* Char is OK. */ if (doing) { ensure_size(plen); p[plen++] = (char) c; } } else { /* Char needs fixing up. */ /* ok = FALSE; -- currently we never return FALSE; we * might want to when considering a character set for the * encoded document. */ if (doing) { if (c == 32) { /* a space in a word is a hard space */ ensure_size(plen + 7); /* includes space for the NUL, which is subsequently stomped on */ sprintf(p + plen, " "); plen += 6; } else { switch (c) { case '&': ensure_size(plen + 6); /* includes space for the NUL, which is subsequently stomped on */ plen += sprintf(p + plen, "&"); break; case '"': ensure_size(plen + 7); /* includes space for the NUL, which is subsequently stomped on */ plen += sprintf(p + plen, """); break; case '<': if (plen > 1 && *(s - 1) == '\\' && *(s - 2) == '\\') { ensure_size(--plen); p[plen - 1] = (char) c; p[plen] = 0; } else { ensure_size(plen + 5); /* includes space for the NUL, which is subsequently stomped on */ plen += sprintf(p + plen, "<"); } break; case '>': if (plen > 1 && *(s - 1) == '\\' && *(s - 2) == '\\') { ensure_size(--plen); p[plen - 1] = (char) c; p[plen] = 0; } else { ensure_size(plen + 5); /* includes space for the NUL, which is subsequently stomped on */ plen += sprintf(p + plen, ">"); } break; default: ensure_size(plen + 8); /* includes space for the NUL, which is subsequently stomped on */ plen += sprintf(p + plen, "&#%04i;", (int) c); break; } } } } } if (doing) { p = resize(p, plen + 1); p[plen] = '\0'; *result = p; } return ok; } /* * This formats the given words as XHTML. */ static void xhtml_rdaddwc(rdstringc * rs, word * text, word * end) { char *c; keyword *kwl; xhtmlsection *sect; indextag *itag; int ti, style, type; wchar_t *s; for (; text && text != end; text = text->next) { switch (text->type) { case word_HyperLink: xhtml_utostr(text->text, &c); rdaddsc(rs, "
      "); sfree(c); break; case word_LocalHyperLink: xhtml_utostr(text->text, &c); rdaddsc(rs, ""); sfree(c); break; case word_UpperXref: case word_LowerXref: case word_FreeTextXref: kwl = kw_lookup(keywords, text->text); if (kwl) { sect = xhtml_find_section(kwl->para); if (sect) { char fragmentbuf[NAMEDFRAGMENT_MAXLEN]; rdaddsc(rs, "file->filename : ""); rdaddc(rs, '#'); rdaddsc(rs, xhtml_get_fragmentname(sect, fragmentbuf)); rdaddsc(rs, "\">"); } else { rdaddsc(rs, ""); error(err_whatever, "Couldn't locate cross-reference! (Probably a bibliography entry.)"); } } else { rdaddsc(rs, ""); error(err_whatever, "Couldn't locate cross-reference! (Wasn't in source file.)"); } break; case word_IndexRef: /* in theory we could make an index target here */ /* rdaddsc(rs, "text, &c); rdaddsc(rs, c); sfree(c); rdaddsc(rs, "\">");*/ /* what we _do_ need to do is to fix up the backend data * for any indexentry this points to. */ for (ti = 0; (itag = (indextag *) index234(idx->tags, ti)) != NULL; ti++) { /* FIXME: really ustricmp() and not ustrcmp()? */ if (ustricmp(itag->name, text->text) == 0) { break; } } if (itag != NULL) { if (itag->refs != NULL) { int i; for (i = 0; i < itag->nrefs; i++) { xhtmlindex *idx_ref; indexentry *ientry; ientry = itag->refs[i]; if (ientry->backend_data == NULL) { idx_ref = (xhtmlindex *) smalloc(sizeof(xhtmlindex)); if (idx_ref == NULL) fatal(err_nomemory); idx_ref->nsection = 0; idx_ref->size = 4; idx_ref->sections = (xhtmlsection **) smalloc(idx_ref->size * sizeof(xhtmlsection *)); if (idx_ref->sections == NULL) fatal(err_nomemory); ientry->backend_data = idx_ref; } else { idx_ref = ientry->backend_data; if (idx_ref->nsection + 1 > idx_ref->size) { int new_size = idx_ref->size * 2; idx_ref->sections = srealloc(idx_ref->sections, new_size * sizeof(xhtmlsection)); if (idx_ref->sections == NULL) { fatal(err_nomemory); } idx_ref->size = new_size; } } idx_ref->sections[idx_ref->nsection++] = currentsection; #if 0 #endif } } else { fatal(err_whatever, "Index tag had no entries!"); } } else { fprintf(stderr, "Looking for index entry '%ls'\n", text->text); fatal(err_whatever, "Couldn't locate index entry! (Wasn't in index.)"); } break; case word_HyperEnd: case word_XrefEnd: rdaddsc(rs, ""); break; case word_Html: xhtml_utostr(text->text, &c); rdaddsc(rs, c); sfree(c); break; case word_Normal: case word_Emph: case word_Strong: case word_Bold: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_BoldSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_BoldQuote: case word_CodeQuote: case word_WkCodeQuote: assert(text->type != word_CodeQuote && text->type != word_WkCodeQuote); style = towordstyle(text->type); type = removeattr(text->type); switch((attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only) ? style : word_NotWordType) { case word_Emph: element_open(rs, "em"); break; case word_Strong: element_open(rs, "strong"); break; case word_Bold: element_open(rs, "b"); break; case word_Code: element_open(rs, "code"); break; case word_WeakCode: element_open(rs, "code"); break; } if (removeattr(text->type) == word_Normal) { static int dont_convert = 0; if (dont_convert) { char buf[2] = " "; dont_convert = 0; s = text->text; for (; *s; s++) { buf[0] = (char) *s; rdaddsc(rs, buf); } buf[0] = 0; rdaddsc(rs, buf); } else { if (*text->text == '\\' && text->next && text->next->text && (*text->next->text == '&' || *text->next->text == '<' || *text->next->text == '>' || *text->next->text == '"')) dont_convert = 1; else { if (xhtml_convert(text->text, &c, TRUE)) /* spaces in the word are hard */ rdaddsc(rs, c); else xhtml_rdaddwc(rs, text->alt, NULL); sfree(c); } } } else if (removeattr(text->type) == word_WhiteSpace) { rdaddc(rs, ' '); } else if (removeattr(text->type) == word_Quote) { rdaddsc(rs, """); } switch((attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only) ? style : word_NotWordType) { case word_Emph: element_close(rs, "em"); break; case word_Strong: element_close(rs, "strong"); break; case word_Bold: element_close(rs, "b"); break; case word_Code: element_close(rs, "code"); break; case word_WeakCode: element_close(rs, "code"); break; } break; } } } /* Output a heading, formatted as XHTML. */ static void xhtml_heading(FILE * fp, paragraph * p) { rdstringc t = { 0, 0, NULL }; word *tprefix = p->kwtext; word *nprefix = p->kwtext2; word *text = p->words; int level = xhtml_para_level(p); xhtmlsection *sect = xhtml_find_section(p); xhtmlheadfmt *fmt; char fragmentbuf[NAMEDFRAGMENT_MAXLEN], *fragment; if (sect) { fragment = xhtml_get_fragmentname(sect, fragmentbuf); } else { if (p->type == para_Title) fragment = "title"; else { fragment = ""; /* FIXME: what else can we do? */ error(err_whatever, "Couldn't locate heading cross-reference!"); } } if (p->type == para_Title) fmt = NULL; else if (level == 1) fmt = &conf.fchapter; else if (level - 1 < conf.nfsect) fmt = &conf.fsect[level - 1]; else fmt = &conf.fsect[conf.nfsect - 1]; if (fmt && fmt->just_numbers && nprefix) { xhtml_rdaddwc(&t, nprefix, NULL); if (fmt) { char *c; if (xhtml_convert(fmt->number_suffix, &c, FALSE)) { rdaddsc(&t, c); sfree(c); } } } else if (fmt && !fmt->just_numbers && tprefix) { xhtml_rdaddwc(&t, tprefix, NULL); if (fmt) { char *c; if (xhtml_convert(fmt->number_suffix, &c, FALSE)) { rdaddsc(&t, c); sfree(c); } } } xhtml_rdaddwc(&t, text, NULL); /* * If we're outputting in single-file mode, we need to lower * the level of each heading by one, because the overall * document title will be sitting right at the top as an

      * and so chapters and sections should start at

      . * * Even if not, the document title will come back from * xhtml_para_level() as level zero, so we must increment that * no matter what leaf_level is set to. */ if (conf.leaf_level == 0 || level == 0) level++; fprintf(fp, "%s\n", fragment, level, t.text, level); sfree(t.text); } /* Output a paragraph. Styles are handled by xhtml_rdaddwc(). * This looks pretty simple; I may have missed something ... */ static void xhtml_para(FILE * fp, word * text) { rdstringc out = { 0, 0, NULL }; xhtml_rdaddwc(&out, text, NULL); fprintf(fp, "%s", out.text); sfree(out.text); } /* Output a code paragraph. I'm treating this as preformatted, which * may not be entirely correct. See xhtml_para() for my worries about * this being overly-simple; however I think that most of the complexity * of the text backend came entirely out of word wrapping anyway. */ static void xhtml_codepara(FILE * fp, word * text) { fputs("
      ", fp);
        for (; text; text = text->next)
          if (text->type == word_WeakCode)
          {
            char *c;
            xhtml_convert(text->text, &c, FALSE);
            fprintf(fp, "%s\n", c);
            sfree(c);
          }
        fputs("
      \n", fp); } nsis-3.11/Docs/src/bin/halibut/contents.c000077500000000000000000000135611477201124000203010ustar00rootroot00000000000000/* * contents.c: build a table of contents */ #include #include #include #include #include #include "halibut.h" struct numberstate_Tag { int chapternum; int appendixnum; int ischapter; int *sectionlevels; paragraph **currentsects; paragraph *lastsect; int oklevel; int maxsectlevel; int listitem; wchar_t *chaptertext; /* the word for a chapter */ wchar_t *sectiontext; /* the word for a section */ wchar_t *apptext; /* the word for an appendix */ }; numberstate *number_init(void) { numberstate *ret = mknew(numberstate); ret->chapternum = 0; ret->appendixnum = -1; ret->ischapter = 1; ret->oklevel = -1; /* not even in a chapter yet */ ret->maxsectlevel = 32; ret->sectionlevels = mknewa(int, ret->maxsectlevel); ret->currentsects = mknewa(paragraph *, ret->maxsectlevel + 1); memset(ret->currentsects, 0, (ret->maxsectlevel + 1) * sizeof(paragraph *)); ret->lastsect = NULL; ret->listitem = -1; return ret; } void number_free(numberstate * state) { sfree(state->sectionlevels); sfree(state->currentsects); sfree(state); } static void dotext(word *** wret, wchar_t * text) { word *mnewword = mknew(word); mnewword->text = ustrdup(text); mnewword->type = word_Normal; mnewword->alt = NULL; mnewword->next = NULL; mnewword->breaks = FALSE; mnewword->aux = 0; **wret = mnewword; *wret = &mnewword->next; } static void dospace(word *** wret) { word *mnewword = mknew(word); mnewword->text = NULL; mnewword->type = word_WhiteSpace; mnewword->alt = NULL; mnewword->next = NULL; mnewword->breaks = FALSE; mnewword->aux = 0; **wret = mnewword; *wret = &mnewword->next; } static void donumber(word *** wret, int num) { wchar_t text[20]; int i = 19; text[i] = L'\0'; while (num != 0) { assert(i >= 0); i--; text[i] = L"0123456789"[num % 10]; num /= 10; } dotext(wret, &text[i]); } static void doanumber(word *** wret, int num) { wchar_t text[20]; int i = 19; int nletters, aton; nletters = 1; aton = 25; while (num > aton) { nletters++; num -= aton + 1; if (aton < INT_MAX / 26) aton = (aton + 1) * 26 - 1; else aton = INT_MAX; } text[i] = L'\0'; while (nletters--) { assert(i >= 0); i--; text[i] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[num % 26]; num /= 26; } dotext(wret, &text[i]); } void number_cfg(numberstate * state, paragraph * source) { /* * Defaults */ state->chaptertext = L"Chapter"; state->sectiontext = L"Section"; state->apptext = L"Appendix"; for (; source; source = source->next) { if (source->type == para_Config) { if (!ustricmp(source->keyword, L"chapter")) { state->chaptertext = uadv(source->keyword); } else if (!ustricmp(source->keyword, L"section")) { state->sectiontext = uadv(source->keyword); } else if (!ustricmp(source->keyword, L"appendix")) { state->apptext = uadv(source->keyword); } } } } word *number_mktext(numberstate * state, paragraph * p, wchar_t * category, int prev, int *errflag) { word *ret = NULL; word **ret2 = &ret; word **pret = &ret; int i, level; level = -2; /* default for non-section-heading */ switch (p->type) { case para_Chapter: state->chapternum++; for (i = 0; i < state->maxsectlevel; i++) state->sectionlevels[i] = 0; dotext(&pret, category ? category : state->chaptertext); dospace(&pret); ret2 = pret; donumber(&pret, state->chapternum); state->ischapter = 1; state->oklevel = 0; level = -1; break; case para_Heading: case para_Subsect: level = (p->type == para_Heading ? 0 : p->aux); if (level > state->oklevel) { error(err_sectjump, &p->fpos); *errflag = TRUE; ret = NULL; break; } state->oklevel = level + 1; if (state->maxsectlevel <= level) { state->maxsectlevel = level + 32; state->sectionlevels = resize(state->sectionlevels, state->maxsectlevel); } state->sectionlevels[level]++; for (i = level + 1; i < state->maxsectlevel; i++) state->sectionlevels[i] = 0; dotext(&pret, category ? category : state->sectiontext); dospace(&pret); ret2 = pret; if (state->ischapter) donumber(&pret, state->chapternum); else doanumber(&pret, state->appendixnum); for (i = 0; i <= level; i++) { dotext(&pret, L"."); if (state->sectionlevels[i] == 0) state->sectionlevels[i] = 1; donumber(&pret, state->sectionlevels[i]); } break; case para_Appendix: state->appendixnum++; for (i = 0; i < state->maxsectlevel; i++) state->sectionlevels[i] = 0; dotext(&pret, category ? category : state->apptext); dospace(&pret); ret2 = pret; doanumber(&pret, state->appendixnum); state->ischapter = 0; state->oklevel = 0; level = -1; break; case para_UnnumberedChapter: level = -1; break; case para_NumberedList: ret2 = pret; if (prev != para_NumberedList) state->listitem = 0; state->listitem++; donumber(&pret, state->listitem); break; } /* * Now set up parent, child and sibling links. */ p->parent = p->child = p->sibling = NULL; if (level != -2) { if (state->currentsects[level + 1]) state->currentsects[level + 1]->sibling = p; if (level >= 0 && state->currentsects[level]) { p->parent = state->currentsects[level]; if (!state->currentsects[level]->child) state->currentsects[level]->child = p; } state->currentsects[level + 1] = state->lastsect = p; for (i = level + 2; i < state->maxsectlevel + 1; i++) state->currentsects[i] = NULL; } else { p->parent = state->lastsect; } p->kwtext2 = *ret2; return ret; } nsis-3.11/Docs/src/bin/halibut/error.c000077500000000000000000000144661477201124000176020ustar00rootroot00000000000000/* * error.c: Halibut error handling */ #include #include #include #include #include "halibut.h" /* * Error flags */ #define PREFIX 0x0001 /* give `halibut:' prefix */ #define FILEPOS 0x0002 /* give file position prefix */ static void do_error(int code, va_list ap) { char error[1024]; char auxbuf[256]; char *sp, *sp2; wchar_t *wsp; filepos *fpos, fpos2; int flags=0; switch (code) { case err_nomemory: /* no arguments */ sprintf(error, "out of memory"); flags = PREFIX; break; case err_optnoarg: sp = va_arg(ap, char *); sprintf(error, "option `-%.200s' requires an argument", sp); flags = PREFIX; break; case err_nosuchopt: sp = va_arg(ap, char *); sprintf(error, "unrecognised option `-%.200s'", sp); flags = PREFIX; break; case err_noinput: /* no arguments */ sprintf(error, "no input files"); flags = PREFIX; break; case err_cantopen: sp = va_arg(ap, char *); sprintf(error, "unable to open input file `%.200s'", sp); flags = PREFIX; break; case err_nodata: /* no arguments */ sprintf(error, "no data in input files"); flags = PREFIX; break; case err_brokencodepara: fpos = va_arg(ap, filepos *); sprintf(error, "every line of a code paragraph should begin `\\c'"); flags = FILEPOS; break; case err_kwunclosed: fpos = va_arg(ap, filepos *); sprintf(error, "expected `}' after paragraph keyword"); flags = FILEPOS; break; case err_kwexpected: fpos = va_arg(ap, filepos *); sprintf(error, "expected a paragraph keyword"); flags = FILEPOS; break; case err_kwillegal: fpos = va_arg(ap, filepos *); sprintf(error, "expected no paragraph keyword"); flags = FILEPOS; break; case err_kwtoomany: fpos = va_arg(ap, filepos *); sprintf(error, "expected only one paragraph keyword"); flags = FILEPOS; break; case err_bodyillegal: fpos = va_arg(ap, filepos *); sprintf(error, "expected no text after paragraph keyword"); flags = FILEPOS; break; case err_badparatype: wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); fpos = va_arg(ap, filepos *); sprintf(error, "command `%.200s' unrecognised at start of" " paragraph", sp); flags = FILEPOS; break; case err_badmidcmd: wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); fpos = va_arg(ap, filepos *); sprintf(error, "command `%.200s' unexpected in mid-paragraph", sp); flags = FILEPOS; break; case err_unexbrace: fpos = va_arg(ap, filepos *); sprintf(error, "brace character unexpected in mid-paragraph"); flags = FILEPOS; break; case err_explbr: fpos = va_arg(ap, filepos *); sprintf(error, "expected `{' after command"); flags = FILEPOS; break; case err_commenteof: fpos = va_arg(ap, filepos *); sprintf(error, "end of file unexpected inside `\\#{...}' comment"); flags = FILEPOS; break; case err_kwexprbr: fpos = va_arg(ap, filepos *); sprintf(error, "expected `}' after cross-reference"); flags = FILEPOS; break; case err_missingrbrace: fpos = va_arg(ap, filepos *); sprintf(error, "unclosed braces at end of paragraph"); flags = FILEPOS; break; case err_nestedstyles: fpos = va_arg(ap, filepos *); sprintf(error, "unable to nest text styles"); flags = FILEPOS; break; case err_nestedindex: fpos = va_arg(ap, filepos *); sprintf(error, "unable to nest index markings"); flags = FILEPOS; break; case err_nosuchkw: fpos = va_arg(ap, filepos *); wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); sprintf(error, "unable to resolve cross-reference to `%.200s'", sp); flags = FILEPOS; break; case err_multiBR: fpos = va_arg(ap, filepos *); wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); sprintf(error, "multiple `\\BR' entries given for `%.200s'", sp); flags = FILEPOS; break; case err_nosuchidxtag: wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); sprintf(error, "`\\IM' on unknown index tag `%.200s'", sp); flags = 0; /* FIXME: need to get a filepos to here somehow */ break; case err_cantopenw: sp = va_arg(ap, char *); sprintf(error, "unable to open output file `%.200s'", sp); flags = PREFIX; break; case err_macroexists: fpos = va_arg(ap, filepos *); wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); sprintf(error, "macro `%.200s' already defined", sp); flags = FILEPOS; break; case err_sectjump: fpos = va_arg(ap, filepos *); sprintf(error, "expected higher heading levels before this one"); flags = FILEPOS; break; case err_winhelp_ctxclash: fpos = va_arg(ap, filepos *); sp = va_arg(ap, char *); sp2 = va_arg(ap, char *); sprintf(error, "Windows Help context id `%.200s' clashes with " "previously defined `%.200s'", sp, sp2); flags = FILEPOS; break; case err_multikw: fpos = va_arg(ap, filepos *); fpos2 = *va_arg(ap, filepos *); wsp = va_arg(ap, wchar_t *); sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf)); sprintf(error, "paragraph keyword `%.200s' already defined at ", sp); sprintf(error + strlen(error), "%s:%d", fpos2.filename, fpos2.line); flags = FILEPOS; break; case err_unicodezero: fpos = va_arg(ap, filepos *); sprintf(error, "the Unicode zero character is not permitted in input"); flags = FILEPOS; case err_whatever: sp = va_arg(ap, char *); vsprintf(error, sp, ap); flags = PREFIX; break; } if (flags & PREFIX) fputs("halibut: ", stderr); if ((flags & FILEPOS) && fpos) { fprintf(stderr, "%s:", fpos->filename ? fpos->filename : ""); if (fpos->line > 0) fprintf(stderr, "%d:", fpos->line); if (fpos->col > 0) fprintf(stderr, "%d:", fpos->col); fputc(' ', stderr); } fputs(error, stderr); fputc('\n', stderr); } void fatal(int code, ...) { va_list ap; va_start(ap, code); do_error(code, ap); va_end(ap); exit(EXIT_FAILURE); } void error(int code, ...) { va_list ap; va_start(ap, code); do_error(code, ap); va_end(ap); } nsis-3.11/Docs/src/bin/halibut/halibut.h000077500000000000000000000324531477201124000201020ustar00rootroot00000000000000#ifndef HALIBUT_HALIBUT_H #define HALIBUT_HALIBUT_H #if defined(_WIN32) && !defined(_CRT_SECURE_NO_DEPRECATE) #define _CRT_SECURE_NO_DEPRECATE 1 #endif #include #include #include #ifdef __GNUC__ #define NORETURN __attribute__((__noreturn__)) #else #define NORETURN /* nothing */ #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* For suppressing unused-parameter warnings */ #define IGNORE(x) ( (x) = (x) ) #include "tree234.h" /* * Structure tags */ typedef struct input_Tag input; typedef struct filepos_Tag filepos; typedef struct paragraph_Tag paragraph; typedef struct word_Tag word; typedef struct keywordlist_Tag keywordlist; typedef struct keyword_Tag keyword; typedef struct userstyle_Tag userstyle; typedef struct numberstate_Tag numberstate; typedef struct indexdata_Tag indexdata; typedef struct indextag_Tag indextag; typedef struct indexentry_Tag indexentry; typedef struct macrostack_Tag macrostack; typedef struct ustr_slist_Tag { struct ustr_slist_Tag *next; wchar_t string[1]; } ustr_slist; /* * Data structure to hold a file name and index, a line and a * column number, for reporting errors */ struct filepos_Tag { char *filename; int line, col; }; /* * Data structure to hold all the file names etc for input */ typedef struct pushback_Tag { int chr; filepos pos; } pushback; struct input_Tag { char **filenames; /* complete list of input files */ int nfiles; /* how many in the list */ FILE *currfp; /* the currently open one */ int currindex; /* which one is that in the list */ pushback *pushback; /* pushed-back input characters */ int npushback, pushbacksize; filepos pos; int reportcols; /* report column numbers in errors */ macrostack *stack; /* macro expansions in force */ }; /* * Data structure to hold the input form of the source, ie a linked * list of paragraphs */ struct paragraph_Tag { paragraph *next; int type; wchar_t *keyword; /* for most special paragraphs */ word *words; /* list of words in paragraph */ int aux; /* number, in a numbered paragraph * or subsection level */ word *kwtext; /* chapter/section indication */ word *kwtext2; /* numeric-only form of kwtext */ filepos fpos; paragraph *parent, *child, *sibling; /* for hierarchy navigation */ void *private_data; /* for temp use in backends */ }; #define initpara(p) ( (p).type = para_NotParaType, (p).keyword = NULL, (p).words = NULL ) enum { para_IM, /* index merge */ para_BR, /* bibliography rewrite */ para_Rule, /* random horizontal rule */ para_Chapter, para_Appendix, para_UnnumberedChapter, para_Heading, para_Subsect, para_Normal, para_Biblio, /* causes no output unless turned ... */ para_BiblioCited, /* ... into this paragraph type */ para_Bullet, para_NumberedList, para_Code, para_Copyright, para_Preamble, para_NoCite, para_Title, para_VersionID, para_Config, /* configuration directive */ para_NotParaType /* placeholder value */ }; /* * Data structure to hold an individual word */ struct word_Tag { word *next, *alt; int type; int aux; int breaks; /* can a line break after it? */ wchar_t *text; filepos fpos; }; enum { /* ORDERING CONSTRAINT: these normal-word types ... */ word_Normal, word_Emph, word_Strong, word_Bold, word_Code, /* monospaced; `quoted' in text */ word_WeakCode, /* monospaced, normal in text */ /* ... must be in the same order as these space types ... */ word_WhiteSpace, /* text is NULL or ignorable */ word_EmphSpace, /* WhiteSpace when emphasised */ word_StrongSpace, /* WhiteSpace when strong */ word_BoldSpace, word_CodeSpace, /* WhiteSpace when code */ word_WkCodeSpace, /* WhiteSpace when weak code */ /* ... and must be in the same order as these quote types ... */ word_Quote, /* text is NULL or ignorable */ word_EmphQuote, /* Quote when emphasised */ word_StrongQuote, /* Quote when strong */ word_BoldQuote, word_CodeQuote, /* (can't happen) */ word_WkCodeQuote, /* (can't happen) */ /* END ORDERING CONSTRAINT */ word_internal_endattrs, word_UpperXref, /* \K */ word_LowerXref, /* \k */ word_XrefEnd, /* (invisible; no text) */ word_IndexRef, /* (always an invisible one) */ word_HyperLink, /* (invisible) */ word_HyperEnd, /* (also invisible; no text) */ word_LocalHyperLink, /* (invisible) */ word_FreeTextXref, /* \R */ word_Html, word_NotWordType /* placeholder value */ }; /* aux values for attributed words */ enum { attr_Only = 0x0000, /* a lone word with the attribute */ attr_First = 0x0001, /* the first of a series */ attr_Last = 0x0002, /* the last of a series */ attr_Always = 0x0003, /* any other part of a series */ attr_mask = 0x0003, }; /* aux values for quote-type words */ enum { quote_Open = 0x0010, quote_Close = 0x0020, quote_mask = 0x0030, }; #define isattr(x) ( ( (x) > word_Normal && (x) < word_WhiteSpace ) || \ ( (x) > word_WhiteSpace && (x) < word_internal_endattrs ) ) #define NATTRS (word_WhiteSpace - word_Normal) #define sameattr(x,y) ( (((x)-(y)) % NATTRS) == 0 ) #define towordstyle(x) ( word_Normal + ((x) % NATTRS) ) #define tospacestyle(x) ( word_WhiteSpace + ((x) % NATTRS) ) #define toquotestyle(x) ( word_Quote + ((x) % NATTRS) ) #define removeattr(x) ( word_Normal + ((x)/NATTRS * NATTRS) ) #define attraux(x) ( (x) & attr_mask ) #define quoteaux(x) ( (x) & quote_mask ) /* * error.c */ void fatal(int code, ...) NORETURN; void error(int code, ...); #define err_zerochar(fpos) error(err_unicodezero, (fpos)) enum { err_nomemory, /* out of memory */ err_optnoarg, /* option `-%s' requires an argument */ err_nosuchopt, /* unrecognised option `-%s' */ err_noinput, /* no input files */ err_cantopen, /* unable to open input file `%s' */ err_nodata, /* no data in input files */ err_brokencodepara, /* line in codepara didn't begin `\c' */ err_kwunclosed, /* expected `}' after keyword */ err_kwillegal, /* paragraph type expects no keyword */ err_kwexpected, /* paragraph type expects a keyword */ err_kwtoomany, /* paragraph type expects only 1 */ err_bodyillegal, /* paragraph type expects only kws! */ err_badparatype, /* invalid command at start of para */ err_badmidcmd, /* invalid command in mid-para */ err_unexbrace, /* unexpected brace */ err_explbr, /* expected `{' after command */ err_commenteof, /* EOF inside braced comment */ err_kwexprbr, /* expected `}' after cross-ref */ err_missingrbrace, /* unclosed braces at end of para */ err_nestedstyles, /* unable to nest text styles */ err_nestedindex, /* unable to nest `\i' thingys */ err_nosuchkw, /* unresolved cross-reference */ err_multiBR, /* multiple \BRs on same keyword */ err_nosuchidxtag, /* \IM on unknown index tag (warning) */ err_cantopenw, /* can't open output file for write */ err_macroexists, /* this macro already exists */ err_sectjump, /* jump a heading level, eg \C -> \S */ err_winhelp_ctxclash, /* WinHelp context ID hash clash */ err_multikw, /* keyword clash in sections */ err_unicodezero, err_whatever /* random error of another type */ }; /* * malloc.c */ #ifdef LOGALLOC void *smalloc(char *file, int line, int size); void *srealloc(char *file, int line, void *p, int size); void sfree(char *file, int line, void *p); #define smalloc(x) smalloc(__FILE__, __LINE__, x) #define srealloc(x, y) srealloc(__FILE__, __LINE__, x, y) #define sfree(x) sfree(__FILE__, __LINE__, x) #else void *smalloc(int size); void *srealloc(void *p, int size); void sfree(void *p); #endif void free_list(void*p); void free_word_list(word * w); void free_para_list(paragraph * p); word *dup_word_list(word * w); char *dupstr(char *s); #define mknew(type) ( (type *) smalloc (sizeof (type)) ) #define mknewa(type, number) ( (type *) smalloc ((number) * sizeof (type)) ) #define resize(array, len) ( srealloc ((array), (len) * sizeof (*(array))) ) #define lenof(array) ( sizeof(array) / sizeof(*(array)) ) /* * ustring.c */ #define asciistrdef(s, d) ( (s) ? (s) : (d) ) #define ustrdef(s, d) ( (s) ? (s) : (d) ) wchar_t *ustrdup(const wchar_t * s); wchar_t *ustrreplacedup(wchar_t **dest, const wchar_t *src); char *ustrtoa(const wchar_t * s, char *outbuf, int size); int ustrlen(const wchar_t * s); wchar_t *uadv(const wchar_t * s); wchar_t *ustrcpy(wchar_t * dest, const wchar_t * source); wchar_t utolower(wchar_t); int ustrcmp(const wchar_t * lhs, const wchar_t * rhs); int ustricmp(const wchar_t * lhs, const wchar_t * rhs); void ultou(unsigned long v, wchar_t *o); int utoi(const wchar_t *); int utob(const wchar_t *); int uisdigit(wchar_t); wchar_t *ustrlow(wchar_t * s); wchar_t *ustrftime(wchar_t * fmt, struct tm *timespec); #define free_ustr_slist free_list ustr_slist* ustr_slist_append(ustr_slist**headaddr, const wchar_t*str); /* * help.c */ void usage(void); void showversion(void); /* * licence.c */ void licence(void); /* * version.c */ void initversionstring(void); extern const char *const version; /* * misc.c */ typedef struct stackTag *stack; stack stk_new(void); void stk_free(stack); void stk_push(stack, void *); void *stk_pop(stack); typedef struct tagRdstring rdstring; struct tagRdstring { int pos, size; wchar_t *text; }; typedef struct tagRdstringc rdstringc; struct tagRdstringc { int pos, size; char *text; }; extern const rdstring empty_rdstring; extern const rdstringc empty_rdstringc; void rdadd(rdstring * rs, wchar_t c); void rdadds(rdstring * rs, wchar_t * p); wchar_t *rdtrim(rdstring * rs); void rdaddc(rdstringc * rs, char c); void rdaddsc(rdstringc * rs, char *p); char *rdtrimc(rdstringc * rs); int compare_wordlists(word * a, word * b); void mark_attr_ends(paragraph * sourceform); typedef struct tagWrappedLine wrappedline; struct tagWrappedLine { wrappedline *next; word *begin, *end; /* first & last words of line */ int nspaces; /* number of whitespaces in line */ int shortfall; /* how much shorter than max width */ }; wrappedline *wrap_para(word *, int, int, int (*)(word *)); void wrap_free(wrappedline *); unsigned long getutcunixtime(); time_t current_time(void); /* use in place of time(NULL) */ /* * input.c */ paragraph *read_input(input * in, indexdata * idx); /* * keywords.c */ struct keywordlist_Tag { int nkeywords; int size; tree234 *keys; /* sorted by `key' field */ word **looseends; /* non-keyword list element numbers */ int nlooseends; int looseendssize; }; struct keyword_Tag { wchar_t *key; /* the keyword itself */ word *text; /* "Chapter 2", "Appendix Q"... */ /* (NB: filepos are not set) */ paragraph *para; /* the paragraph referenced */ }; keyword *kw_lookup(keywordlist *, wchar_t *); keywordlist *get_keywords(paragraph *); void free_keywords(keywordlist *); void subst_keywords(paragraph *, keywordlist *); /* * index.c */ /* * Data structure to hold both sides of the index. */ struct indexdata_Tag { tree234 *tags; /* holds type `indextag' */ tree234 *entries; /* holds type `indexentry' */ }; /* * Data structure to hold an index tag (LHS of index). */ struct indextag_Tag { wchar_t *name; word *implicit_text; word **explicit_texts; int nexplicit, explicit_size; int nrefs; indexentry **refs; /* array of entries referenced by tag */ }; /* * Data structure to hold an index entry (RHS of index). */ struct indexentry_Tag { word *text; void *backend_data; /* private to back end */ }; indexdata *make_index(void); void cleanup_index(indexdata *); /* index_merge takes responsibility for freeing arg 3 iff implicit; never * takes responsibility for arg 2 */ void index_merge(indexdata *, int is_explicit, wchar_t *, word *); void build_index(indexdata *); void index_debug(indexdata *); indextag *index_findtag(indexdata * idx, wchar_t * name); /* * contents.c */ numberstate *number_init(void); void number_cfg(numberstate *, paragraph *); word *number_mktext(numberstate *, paragraph *, wchar_t *, int, int *); void number_free(numberstate *); /* * biblio.c */ void gen_citations(paragraph *, keywordlist *); /* * style.c */ struct userstyle_Tag { void* empty; }; /* * bk_xhtml.c */ void xhtml_backend(paragraph *, keywordlist *, indexdata *); #endif nsis-3.11/Docs/src/bin/halibut/help.c000077500000000000000000000005131477201124000173650ustar00rootroot00000000000000/* * help.c: usage instructions */ #include #include "halibut.h" static const char *const usagetext[] = { "halibut [options] file.but [file.but...]", NULL }; void usage(void) { const char *const *p; for (p = usagetext; *p; p++) puts(*p); } void showversion(void) { printf("Halibut, %s\n", version); } nsis-3.11/Docs/src/bin/halibut/index.c000077500000000000000000000137521477201124000175550ustar00rootroot00000000000000/* * index.c: create and collate index data structures */ #include #include #include "halibut.h" static int compare_tags(void *av, void *bv); static int compare_entries(void *av, void *bv); indexdata *make_index(void) { indexdata *ret = mknew(indexdata); ret->tags = newtree234(compare_tags); ret->entries = newtree234(compare_entries); return ret; } static indextag *make_indextag(void) { indextag *ret = mknew(indextag); ret->name = NULL; ret->implicit_text = NULL; ret->explicit_texts = NULL; ret->nexplicit = ret->explicit_size = ret->nrefs = 0; ret->refs = NULL; return ret; } static int compare_tags(void *av, void *bv) { indextag *a = (indextag *) av, *b = (indextag *) bv; return ustricmp(a->name, b->name); } static int compare_to_find_tag(void *av, void *bv) { wchar_t *a = (wchar_t *) av; indextag *b = (indextag *) bv; return ustricmp(a, b->name); } static int compare_entries(void *av, void *bv) { indexentry *a = (indexentry *) av, *b = (indexentry *) bv; return compare_wordlists(a->text, b->text); } /* * Back-end utility: find the indextag with a given name. */ indextag *index_findtag(indexdata * idx, wchar_t * name) { return find234(idx->tags, name, compare_to_find_tag); } /* * Add a \IM. `tags' points to a zero-terminated chain of * zero-terminated strings ("first\0second\0thirdandlast\0\0"). * `text' points to a word list. * * Guarantee on calling sequence: all implicit merges are given * before the explicit ones. */ void index_merge(indexdata * idx, int is_explicit, wchar_t * tags, word * text) { indextag *t, *existing; /* * FIXME: want to warn on overlapping source sets. */ for (; *tags; tags = uadv(tags)) { t = make_indextag(); t->name = tags; existing = add234(idx->tags, t); if (existing == t) { /* * Duplicate this so we can free it independently. */ t->name = ustrdup(tags); /* * Every tag has an implicit \IM. So if this tag * doesn't exist and we're explicit, then we should * warn (and drop it, since it won't be referenced). */ if (is_explicit) { error(err_nosuchidxtag, tags); continue; } /* * Otherwise, this is a new tag with an implicit \IM. */ t->implicit_text = text; } else { sfree(t); t = existing; if (!is_explicit) { /* * An implicit \IM for a tag that's had an implicit * \IM before. FIXME: we should check the text * against the existing text and warn on * differences. And check the tag for case match * against the existing tag, likewise. */ } else { /* * An explicit \IM added to a valid tag. In * particular, this removes the implicit \IM if * present. */ if (t->implicit_text) { free_word_list(t->implicit_text); t->implicit_text = NULL; } if (t->nexplicit >= t->explicit_size) { t->explicit_size = t->nexplicit + 8; t->explicit_texts = resize(t->explicit_texts, t->explicit_size); } t->explicit_texts[t->nexplicit++] = text; } } } } /* * Build the final-form index. We now have every tag, with every * \IM, set up in a 2-3 tree indexed by tag. We now want to collate * the RHSes of the \IMs, and sort by final form, and decorate the * entries in the original 2-3 tree with pointers to the RHS * entries. */ void build_index(indexdata * i) { indextag *t; word **ta; int ti; int j; for (ti = 0; (t = (indextag *) index234(i->tags, ti)) != NULL; ti++) { if (t->implicit_text) { t->nrefs = 1; ta = &t->implicit_text; } else { t->nrefs = t->nexplicit; ta = t->explicit_texts; } if (t->nrefs) { t->refs = mknewa(indexentry *, t->nrefs); for (j = 0; j < t->nrefs; j++) { indexentry *ent = mknew(indexentry); ent->text = *ta++; t->refs[j] = add234(i->entries, ent); if (t->refs[j] != ent) /* duplicate */ sfree(ent); } } } } void cleanup_index(indexdata * i) { indextag *t; indexentry *ent; int ti; for (ti = 0; (t = (indextag *) index234(i->tags, ti)) != NULL; ti++) { sfree(t->name); free_word_list(t->implicit_text); sfree(t->explicit_texts); sfree(t->refs); sfree(t); } freetree234(i->tags); for (ti = 0; (ent = (indexentry *) index234(i->entries, ti)) != NULL; ti++) { sfree(ent); } freetree234(i->entries); sfree(i); } static void dbg_prtwordlist(int level, word * w); static void dbg_prtmerge(int is_explicit, wchar_t * tag, word * text); void index_debug(indexdata * i) { indextag *t; indexentry *y; int ti; int j; printf("\nINDEX TAGS\n==========\n\n"); for (ti = 0; (t = (indextag *) index234(i->tags, ti)) != NULL; ti++) { printf("\n"); if (t->implicit_text) dbg_prtmerge(0, t->name, t->implicit_text); for (j = 0; j < t->nexplicit; j++) dbg_prtmerge(1, t->name, t->explicit_texts[j]); } printf("\nINDEX ENTRIES\n=============\n\n"); for (ti = 0; (y = (indexentry *) index234(i->entries, ti)) != NULL; ti++) { printf("\n"); printf("{\n"); dbg_prtwordlist(1, y->text); printf("}\n"); } } static void dbg_prtmerge(int is_explicit, wchar_t * tag, word * text) { printf("\\IM: %splicit: \"", is_explicit ? "ex" : "im"); for (; *tag; tag++) putchar(*tag); printf("\" {\n"); dbg_prtwordlist(1, text); printf("}\n"); } static void dbg_prtwordlist(int level, word * w) { for (; w; w = w->next) { wchar_t *wp; printf("%*sword %d ", level * 4, "", w->type); if (w->text) { printf("\""); for (wp = w->text; *wp; wp++) putchar(*wp); printf("\""); } else printf("(no text)"); if (w->alt) { printf(" alt = {\n"); dbg_prtwordlist(level + 1, w->alt); printf("%*s}", level * 4, ""); } printf("\n"); } } nsis-3.11/Docs/src/bin/halibut/input.c000077500000000000000000001225101477201124000175760ustar00rootroot00000000000000/* * input.c: read the source form */ #include #include #include #include "halibut.h" #define TAB_STOP 8 /* for column number tracking */ static void setpos(input * in, char *fname) { in->pos.filename = fname; in->pos.line = 1; in->pos.col = (in->reportcols ? 1 : -1); } static void unget(input * in, int c, filepos * pos) { if (in->npushback >= in->pushbacksize) { in->pushbacksize = in->npushback + 16; in->pushback = resize(in->pushback, in->pushbacksize); } in->pushback[in->npushback].chr = c; in->pushback[in->npushback].pos = *pos; /* structure copy */ in->npushback++; } /* ---------------------------------------------------------------------- */ /* * Macro subsystem */ typedef struct macro_Tag macro; struct macro_Tag { wchar_t *name, *text; }; struct macrostack_Tag { macrostack *next; wchar_t *text; int ptr, npushback; filepos pos; }; static int macrocmp(void *av, void *bv) { macro *a = (macro *) av, *b = (macro *) bv; return ustrcmp(a->name, b->name); } static void macrodef(tree234 * macros, wchar_t * name, wchar_t * text, filepos fpos) { macro *m = mknew(macro); m->name = name; m->text = text; if (add234(macros, m) != m) { error(err_macroexists, &fpos, name); sfree(name); sfree(text); } } static int macrolookup(tree234 * macros, input * in, wchar_t * name, filepos * pos) { macro m, *gotit; m.name = name; gotit = find234(macros, &m, NULL); if (gotit) { macrostack *expansion = mknew(macrostack); expansion->next = in->stack; expansion->text = gotit->text; expansion->pos = *pos; /* structure copy */ expansion->ptr = 0; expansion->npushback = in->npushback; in->stack = expansion; return TRUE; } else return FALSE; } static void macrocleanup(tree234 * macros) { int ti; macro *m; for (ti = 0; (m = (macro *) index234(macros, ti)) != NULL; ti++) { sfree(m->name); sfree(m->text); sfree(m); } freetree234(macros); } /* * Can return EOF */ static int get(input * in, filepos * pos) { int pushbackpt = in->stack ? in->stack->npushback : 0; if (in->npushback > pushbackpt) { --in->npushback; if (pos) *pos = in->pushback[in->npushback].pos; /* structure copy */ return in->pushback[in->npushback].chr; } else if (in->stack) { wchar_t c = in->stack->text[in->stack->ptr]; if (pos) *pos = in->stack->pos; if (in->stack->text[++in->stack->ptr] == L'\0') { macrostack *tmp = in->stack; in->stack = tmp->next; sfree(tmp); } return c; } else if (in->currfp) { int c = getc(in->currfp); if (c == EOF) { fclose(in->currfp); in->currfp = NULL; } /* Track line numbers, for error reporting */ if (pos) *pos = in->pos; if (in->reportcols) { switch (c) { case '\t': in->pos.col = 1 + (in->pos.col + TAB_STOP - 1) % TAB_STOP; break; case '\n': in->pos.col = 1; in->pos.line++; break; default: in->pos.col++; break; } } else { in->pos.col = -1; if (c == '\n') in->pos.line++; } /* FIXME: do input charmap translation. We should be returning * Unicode here. */ if (c == '\0') { err_zerochar(pos); return EOF; } return c; } else return EOF; } /* * Lexical analysis of source files. */ typedef struct token_Tag token; struct token_Tag { int type; int cmd, aux; wchar_t *text; filepos pos; }; enum { tok_eof, /* end of file */ tok_eop, /* end of paragraph */ tok_white, /* whitespace */ tok_word, /* a word or word fragment */ tok_cmd, /* \command */ tok_lbrace, /* { */ tok_rbrace /* } */ }; #define tokiscmd(t,c) ( (t).type == tok_cmd && (t).cmd == (c) ) /* Halibut command keywords. */ enum { c__invalid, /* invalid command */ c__comment, /* comment command (\#) */ c__escaped, /* escaped character */ c__nop, /* no-op */ c__nbsp, /* nonbreaking space */ c__midparacmd_unixnow, c_A, /* appendix heading */ c_B, /* bibliography entry */ c_BR, /* bibliography rewrite */ c_C, /* chapter heading */ c_H, /* heading */ c_I, /* invisible index mark */ c_IM, /* index merge/rewrite */ c_K, /* capitalised cross-reference */ c_S, /* aux field is 0, 1, 2, ... */ c_U, /* unnumbered-chapter heading */ c_W, /* Web hyperlink */ c_L, /* Relative/local hyperlink */ c_b, /* bulleted list */ c_bold, c_c, /* code */ c_cfg, /* configuration directive */ c_copyright, /* copyright statement */ c_cw, /* weak code */ c_date, /* document processing date */ c_define, /* macro definition */ c_e, /* emphasis */ c_html, /* html code */ c_i, /* visible index mark */ c_ii, /* uncapitalised visible index mark */ c_k, /* uncapitalised cross-reference */ c_R, /* free text cross-reference */ c_n, /* numbered list */ c_nocite, /* bibliography trickery */ c_preamble, /* document preamble text */ c_q, /* quote marks */ c_rule, /* horizontal rule */ c_s, /* strong */ c_title, /* document title */ c_u, /* aux field is char code */ c_versionid /* document RCS id */ }; #define getcmdstyle(c) \ (c) == c_c ? word_Code : \ (c) == c_cw ? word_WeakCode : \ (c) == c_e ? word_Emph : \ (c) == c_s ? word_Strong : \ (c) == c_bold ? word_Bold : \ (c) == c_html ? word_Html /* does c_html belong here? */ : \ word_Normal /* Perhaps whitespace should be defined in a more Unicode-friendly way? */ #define iswhite(c) ( (c)==32 || (c)==9 || (c)==13 || (c)==10 ) #define isnl(c) ( (c)==10 ) #define isdec(c) ( ((c)>='0'&&(c)<='9') ) #define fromdec(c) ( (c)-'0' ) #define ishex(c) ( ((c)>='0'&&(c)<='9') || ((c)>='A'&&(c)<='F') || ((c)>='a'&&(c)<='f')) #define fromhex(c) ( (c)<='9' ? (c)-'0' : ((c)&0xDF) - ('A'-10) ) #define iscmd(c) ( ((c)>='0'&&(c)<='9') || ((c)>='A'&&(c)<='Z') || ((c)>='a'&&(c)<='z')) /* * Keyword comparison function. Like strcmp, but between a wchar_t * * and a char *. */ static int kwcmp(wchar_t const *p, char const *q) { int i; do { i = *p - *q; } while (*p++ && *q++ && !i); return i; } /* * Match a keyword. */ static void match_kw(token * tok) { /* * FIXME. The ids are explicit in here so as to allow long-name * equivalents to the various very short keywords. * * This list must be sorted, it's searched using binary search. */ static const struct { char const *name; int id; } keywords[] = { { "#", c__comment }, /* comment command (\#) */ { "-", c__escaped }, /* nonbreaking hyphen */ { ".", c__nop }, { "A", c_A }, /* appendix heading */ { "B", c_B }, /* bibliography entry */ { "BR", c_BR }, /* bibliography rewrite */ { "C", c_C }, /* chapter heading */ { "H", c_H }, /* heading */ { "I", c_I }, /* invisible index mark */ { "IM", c_IM }, /* index merge/rewrite */ { "K", c_K }, /* capitalised cross-reference */ { "L", c_L }, /* Relative/local hyperlink */ { "R", c_R }, /* free text cross-reference */ { "U", c_U }, /* unnumbered-chapter heading */ { "W", c_W }, /* Web hyperlink */ { "\\", c__escaped }, /* escaped backslash (\\) */ { "_", c__nbsp }, /* nonbreaking space (\_) */ { "b", c_b }, /* bulleted list */ { "bold", c_bold }, { "c", c_c }, /* code */ { "cfg", c_cfg }, /* configuration directive */ { "copyright", c_copyright }, /* copyright statement */ { "cw", c_cw } , /* weak code */ { "date", c_date }, /* document processing date */ { "define", c_define }, /* macro definition */ { "e", c_e }, /* emphasis */ { "hackunixnow", c__midparacmd_unixnow }, { "html", c_html }, { "i", c_i }, /* visible index mark */ { "ii", c_ii }, /* uncapitalised visible index mark */ { "k", c_k }, /* uncapitalised cross-reference */ { "n", c_n }, /* numbered list */ { "nocite", c_nocite }, /* bibliography trickery */ { "preamble", c_preamble }, /* document preamble text */ { "q", c_q }, /* quote marks */ { "rule", c_rule }, /* horizontal rule */ { "s", c_s }, /* strong */ { "title", c_title }, /* document title */ { "versionid", c_versionid }, /* document RCS id */ { "{", c__escaped }, /* escaped lbrace (\{) */ { "}", c__escaped }, /* escaped rbrace (\}) */ }; int i, j, k, c; /* * Special cases: \S{0,1,2,...} and \uABCD. If the syntax * doesn't match correctly, we just fall through to the * binary-search phase. */ if (tok->text[0] == 'S') { /* We expect numeric characters thereafter. */ wchar_t *p = tok->text + 1; int n; if (!*p) n = 1; else { n = 0; while (*p && isdec(*p)) { n = 10 * n + fromdec(*p); p++; } } if (!*p) { tok->cmd = c_S; tok->aux = n; return; } } else if (tok->text[0] == 'u') { /* We expect hex characters thereafter. */ wchar_t *p = tok->text + 1; int n = 0, seen_a_char = 0; while (*p && ishex(*p)) { n = 16 * n + fromhex(*p); p++, seen_a_char++; } if (!*p && seen_a_char) { tok->cmd = c_u; tok->aux = n; return; } } i = -1; j = sizeof(keywords) / sizeof(*keywords); while (j - i > 1) { k = (i + j) / 2; c = kwcmp(tok->text, keywords[k].name); if (c < 0) j = k; else if (c > 0) i = k; else { /* c == 0 */ tok->cmd = keywords[k].id; return; } } tok->cmd = c__invalid; } /* * Read a token from the input file, in the normal way (`normal' in * the sense that code paragraphs work a different way). */ token get_token(input * in) { int c; int nls; token ret; rdstring rs = { 0, 0, NULL }; filepos cpos; ret.cmd = c__invalid; ret.aux = FALSE; ret.text = NULL; /* default */ c = get(in, &cpos); ret.pos = cpos; if (iswhite(c)) { /* tok_white or tok_eop */ nls = 0; do { if (isnl(c)) nls++; } while ((c = get(in, &cpos)) != EOF && iswhite(c)); if (c == EOF) { ret.type = tok_eof; return ret; } unget(in, c, &cpos); ret.type = (nls > 1 ? tok_eop : tok_white); return ret; } else if (c == EOF) { /* tok_eof */ ret.type = tok_eof; return ret; } else if (c == '\\') { /* tok_cmd */ c = get(in, &cpos); if (c == '-' || c == '\\' || c == '_' || c == '#' || c == '{' || c == '}' || c == '.') { /* single-char command */ rdadd(&rs, (wchar_t)c); } else if (c == 'u') { int len = 0; do { rdadd(&rs, (wchar_t)c); len++; c = get(in, &cpos); } while (ishex(c) && len < 5); unget(in, c, &cpos); } else if (iscmd(c)) { do { rdadd(&rs, (wchar_t)c); c = get(in, &cpos); } while (iscmd(c)); unget(in, c, &cpos); } /* * Now match the command against the list of available * ones. */ ret.type = tok_cmd; ret.text = ustrdup(rs.text); match_kw(&ret); sfree(rs.text); return ret; } else if (c == '{') { /* tok_lbrace */ ret.type = tok_lbrace; return ret; } else if (c == '}') { /* tok_rbrace */ ret.type = tok_rbrace; return ret; } else { /* tok_word */ /* * Read a word: the longest possible contiguous sequence of * things other than whitespace, backslash, braces and * hyphen. A hyphen terminates the word but is returned as * part of it; everything else is pushed back for the next * token. The `aux' field contains TRUE if the word ends in * a hyphen. */ ret.aux = FALSE; /* assumed for now */ while (1) { if (iswhite(c) || c == '{' || c == '}' || c == '\\' || c == EOF) { /* Put back the character that caused termination */ unget(in, c, &cpos); break; } else { rdadd(&rs, (wchar_t)c); if (c == '-') { ret.aux = TRUE; break; /* hyphen terminates word */ } } c = get(in, &cpos); } ret.type = tok_word; ret.text = ustrdup(rs.text); sfree(rs.text); return ret; } } /* * Determine whether the next input character is an open brace (for * telling code paragraphs from paragraphs which merely start with * code). */ int isbrace(input * in) { int c; filepos cpos; c = get(in, &cpos); unget(in, c, &cpos); return (c == '{'); } /* * Read the rest of a line that starts `\c'. Including nothing at * all (tok_word with empty text). */ token get_codepar_token(input * in) { int c; token ret; rdstring rs = { 0, 0, NULL }; filepos cpos; ret.type = tok_word; c = get(in, &cpos); /* expect (and discard) one space */ ret.pos = cpos; if (c == ' ') { c = get(in, &cpos); ret.pos = cpos; } while (!isnl(c) && c != EOF) { int c2 = c; c = get(in, &cpos); /* Discard \r just before \n. */ if (c2 != 13 || !isnl(c)) rdadd(&rs, (wchar_t)c2); } unget(in, c, &cpos); ret.text = ustrdup(rs.text); sfree(rs.text); return ret; } /* * Adds a new word to a linked list */ static word *addword(word newword, word *** hptrptr) { word *mnewword; if (!hptrptr) return NULL; mnewword = mknew(word); *mnewword = newword; /* structure copy */ mnewword->next = NULL; **hptrptr = mnewword; *hptrptr = &mnewword->next; return mnewword; } /* * Adds a new paragraph to a linked list */ static paragraph *addpara(paragraph newpara, paragraph *** hptrptr) { paragraph *mnewpara = mknew(paragraph); *mnewpara = newpara; /* structure copy */ mnewpara->next = NULL; **hptrptr = mnewpara; *hptrptr = &mnewpara->next; return mnewpara; } /* * Destructor before token is reassigned; should catch most memory * leaks */ #define dtor(t) ( sfree(t.text) ) static int is_special_midpara_cmd(token*t) { return tokiscmd(*t, c__midparacmd_unixnow); } static int handle_special_midpara_cmd(token*t, rdstring*rs, paragraph ***hptrptr) { wchar_t wbuf[100]; paragraph par; if (t->type != tok_cmd) return 0; initpara(par); par.fpos = t->pos; switch(t->cmd) { case c__midparacmd_unixnow: ultou(getutcunixtime(), wbuf); rdadds(rs, wbuf); return 1; } return 0; } #define stack_item_push(stck__, sitype__) do { \ struct stack_item *si__ = mknew(struct stack_item); \ si__->type = sitype__; \ stk_push((stck__), si__); \ } while(!__LINE__) /* * Reads a single file (ie until get() returns EOF) */ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *macros) { token t; paragraph par; word wd, **whptr, **idximplicit; wchar_t utext[2], *wdtext; int style, spcstyle, tmpstyle; int already; int iswhite, seenwhite; int type; struct stack_item { enum { stack_nop = 0, /* do nothing (for error recovery) */ stack_ualt = 1, /* \u alternative */ stack_style = 2, /* \e, \c, \cw */ stack_idx = 4, /* \I, \i, \ii */ stack_hyper = 8, /* \W */ stack_quote = 16, /* \q */ } type; word **whptr; /* to restore from \u alternatives */ word **idximplicit; /* to restore from \u alternatives */ } *sitem; stack parsestk; word *indexword=NULL, *uword=NULL, *iword=NULL; word *idxwordlist; rdstring indexstr; int index_downcase=0, index_visible=0, indexing=0; const rdstring nullrs = { 0, 0, NULL }; wchar_t uchr; t = get_token(in); already = TRUE; /* * Ignore tok_white if it appears at the very start of the file. * * At the start of most paragraphs, tok_white is guaranteed not to * appear, because get_token will have folded it into the * preceding tok_eop (since a tok_eop is simply a sequence of * whitespace containing at least two newlines). * * The one exception is if there isn't a preceding tok_eop, i.e. * if the very first paragraph begins with something that lexes as * a tok_white. Easiest way to get round that is to ignore it * here, by unsetting the 'already' flag which will force a new * token to be fetched below. */ if (t.type == tok_white) already = FALSE; /* * Loop on each paragraph. */ while (1) { int start_cmd = c__invalid; par.words = NULL; par.keyword = NULL; whptr = &par.words; /* * Get a token. */ if (!already) { dtor(t), t = get_token(in); } already = FALSE; if (t.type == tok_eof) break; /* * Parse code paragraphs separately. */ if (t.type == tok_cmd && t.cmd == c_c && !isbrace(in)) { par.type = para_Code; par.fpos = t.pos; while (1) { dtor(t), t = get_codepar_token(in); wd.type = word_WeakCode; wd.breaks = FALSE; /* shouldn't need this... */ wd.text = ustrdup(t.text); wd.alt = NULL; wd.fpos = t.pos; addword(wd, &whptr); dtor(t), t = get_token(in); if (t.type == tok_white) { /* * The newline after a code-paragraph line */ dtor(t), t = get_token(in); } if (t.type == tok_eop || t.type == tok_eof) break; else if (t.type != tok_cmd || t.cmd != c_c) { error(err_brokencodepara, &t.pos); addpara(par, ret); while (t.type != tok_eop) /* error recovery: */ dtor(t), t = get_token(in); /* eat rest of paragraph */ goto codeparabroken; /* ick, but such is life */ } } addpara(par, ret); codeparabroken: continue; } while (t.type == tok_cmd && macrolookup(macros, in, t.text, &t.pos)) { dtor(t), t = get_token(in); } /* * This token begins a paragraph. See if it's one of the * special commands that define a paragraph type. * * (note that \# is special in a way, and \nocite takes no * text) */ par.type = para_Normal; if (t.type == tok_cmd) { int needkw=0; int is_macro = FALSE; par.fpos = t.pos; switch (t.cmd) { default: needkw = -1; break; case c__invalid: error(err_badparatype, t.text, &t.pos); needkw = 4; break; case c__comment: if (isbrace(in)) { needkw = -1; // Upstream 56b96573 (r8312) break; /* `\#{': isn't a comment para */ } do { dtor(t), t = get_token(in); } while (t.type != tok_eop && t.type != tok_eof); continue; /* next paragraph */ /* * `needkw' values: * * 1 -- exactly one keyword * 2 -- at least one keyword * 4 -- any number of keywords including zero * 8 -- at least one keyword and then nothing else * 16 -- nothing at all! no keywords, no body * 32 -- no keywords at all */ case c_A: needkw = 2; par.type = para_Appendix; break; case c_B: needkw = 2; par.type = para_Biblio; break; case c_BR: needkw = 1; par.type = para_BR; start_cmd = c_BR; break; case c_C: needkw = 2; par.type = para_Chapter; break; case c_H: needkw = 2; par.type = para_Heading; par.aux = 0; break; case c_IM: needkw = 2; par.type = para_IM; start_cmd = c_IM; break; case c_S: needkw = 2; par.type = para_Subsect; par.aux = t.aux; break; case c_U: needkw = 32; par.type = para_UnnumberedChapter; break; /* For \b and \n the keyword is optional */ case c_b: needkw = 4; par.type = para_Bullet; break; case c_n: needkw = 4; par.type = para_NumberedList; break; case c_cfg: needkw = 8; par.type = para_Config; start_cmd = c_cfg; break; case c_copyright: needkw = 32; par.type = para_Copyright; break; case c_define: is_macro = TRUE; needkw = 1; break; /* For \nocite the keyword is _everything_ */ case c_nocite: needkw = 8; par.type = para_NoCite; break; case c_preamble: needkw = 32; par.type = para_Preamble; break; case c_rule: needkw = 16; par.type = para_Rule; break; case c_title: needkw = 32; par.type = para_Title; break; case c_versionid: needkw = 32; par.type = para_VersionID; break; } if (needkw > 0) { rdstring rs = { 0, 0, NULL }; int nkeys = 0; filepos fp; /* Get keywords. */ dtor(t), t = get_token(in); fp = t.pos; while (t.type == tok_lbrace) { /* This is a keyword. */ nkeys++; /* FIXME: there will be bugs if anyone specifies an * empty keyword (\foo{}), so trap this case. */ while (dtor(t), t = get_token(in), t.type == tok_word || t.type == tok_white || (t.type == tok_cmd && t.cmd == c__nbsp) || (t.type == tok_cmd && t.cmd == c__escaped) || /* TODO: Merge from upstream?: (t.type == tok_cmd && t.cmd == c_u) || */ is_special_midpara_cmd(&t)) { if (t.type == tok_white || (t.type == tok_cmd && t.cmd == c__nbsp)) rdadd(&rs, ' '); else if (!handle_special_midpara_cmd(&t, &rs, ret)) rdadds(&rs, t.text); } if (t.type != tok_rbrace) { error(err_kwunclosed, &t.pos); continue; } rdadd(&rs, 0); /* add string terminator */ dtor(t), t = get_token(in); /* eat right brace */ } rdadd(&rs, 0); /* add string terminator */ /* See whether we have the right number of keywords. */ if ((needkw & 48) && nkeys > 0) error(err_kwillegal, &fp); if ((needkw & 11) && nkeys == 0) error(err_kwexpected, &fp); if ((needkw & 5) && nkeys > 1) error(err_kwtoomany, &fp); if (is_macro) { /* * Macro definition. Get the rest of the line * as a code-paragraph token, repeatedly until * there's nothing more left of it. Separate * with newlines. */ rdstring macrotext = { 0, 0, NULL }; while (1) { dtor(t), t = get_codepar_token(in); if (macrotext.pos > 0) rdadd(¯otext, L'\n'); rdadds(¯otext, t.text); dtor(t), t = get_token(in); if (t.type == tok_eop || t.type == tok_eof) break; } macrodef(macros, rs.text, macrotext.text, fp); continue; /* next paragraph */ } par.keyword = rdtrim(&rs); /* Move to EOP in case of needkw==8 or 16 (no body) */ if (needkw & 24) { /* We allow whitespace even when we expect no para body */ while (t.type == tok_white) dtor(t), t = get_token(in); if (t.type != tok_eop && t.type != tok_eof && (start_cmd == c__invalid || t.type != tok_cmd || t.cmd != start_cmd)) { error(err_bodyillegal, &t.pos); /* Error recovery: eat the rest of the paragraph */ while (t.type != tok_eop && t.type != tok_eof && (start_cmd == c__invalid || t.type != tok_cmd || t.cmd != start_cmd)) dtor(t), t = get_token(in); } if (t.type == tok_cmd) already = TRUE; /* inhibit get_token at top of loop */ addpara(par, ret); continue; /* next paragraph */ } } } /* * Now read the actual paragraph, word by word, adding to * the paragraph list. * * Mid-paragraph commands: * * \K \k * \c \cw * \e * \i \ii * \I * \u * \W * \date * \\ \{ \} */ parsestk = stk_new(); style = word_Normal; spcstyle = word_WhiteSpace; indexing = FALSE; seenwhite = TRUE; while (t.type != tok_eop && t.type != tok_eof) { iswhite = FALSE; already = FALSE; /* Handle implicit paragraph breaks after \IM, \BR etc */ if (start_cmd != c__invalid && t.type == tok_cmd && t.cmd == start_cmd) { already = TRUE; /* inhibit get_token at top of loop */ break; } if (t.type == tok_cmd && t.cmd == c__nop) { dtor(t), t = get_token(in); continue; /* do nothing! */ } if (t.type == tok_cmd && t.cmd == c__escaped) { t.type = tok_word; /* nice and simple */ t.aux = 0; /* even if `\-' - nonbreaking! */ } if (t.type == tok_cmd && t.cmd == c__nbsp) { t.type = tok_word; /* nice and simple */ sfree(t.text); t.text = ustrdup(L" "); /* text is ` ' not `_' */ t.aux = 0; /* (nonbreaking) */ } switch (t.type) { case tok_white: if (whptr == &par.words) break; /* strip whitespace at start of para */ wd.text = NULL; wd.type = spcstyle; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; wd.breaks = FALSE; /* * Inhibit use of whitespace if it's (probably the * newline) before a repeat \IM / \BR type * directive. */ if (start_cmd != c__invalid) { dtor(t), t = get_token(in); already = TRUE; if (t.type == tok_cmd && t.cmd == start_cmd) break; } if (indexing) rdadd(&indexstr, ' '); if (!indexing || index_visible) addword(wd, &whptr); if (indexing) addword(wd, &idximplicit); iswhite = TRUE; break; case tok_word: if (indexing) rdadds(&indexstr, t.text); wd.type = style; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; wd.breaks = t.aux; if (!indexing || index_visible) { wd.text = ustrdup(t.text); addword(wd, &whptr); } if (indexing) { wd.text = ustrdup(t.text); addword(wd, &idximplicit); } break; case tok_lbrace: error(err_unexbrace, &t.pos); /* Error recovery: push nop */ sitem = mknew(struct stack_item); sitem->type = stack_nop; stk_push(parsestk, sitem); break; case tok_rbrace: sitem = stk_pop(parsestk); if (!sitem) { #ifdef HALIBUT_UPSTREAM /* * This closing brace could have been an * indication that the cross-paragraph stack * wants popping. Accordingly, we treat it here * as an indication that the paragraph is over. */ already = TRUE; goto finished_para; #endif error(err_unexbrace, &t.pos); } else { if (sitem->type & stack_ualt) { whptr = sitem->whptr; idximplicit = sitem->idximplicit; } if (sitem->type & stack_style) { style = word_Normal; spcstyle = word_WhiteSpace; } if (sitem->type & stack_idx ) { rdadds(&indexstr, L""); indexword->text = ustrdup(indexstr.text); if (index_downcase) { #ifdef HALIBUT_UPSTREAM word *w; ustrlow(indexword->text); ustrlow(indexstr.text); for (w = idxwordlist; w; w = w->next) if (w->text) ustrlow(w->text); #else ustrlow(indexword->text); #endif } indexing = FALSE; rdadd(&indexstr, L'\0'); index_merge(idx, FALSE, indexstr.text, idxwordlist); sfree(indexstr.text); } if (sitem->type & stack_hyper) { wd.text = NULL; wd.type = word_HyperEnd; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; wd.breaks = FALSE; if (!indexing || index_visible) addword(wd, &whptr); if (indexing) addword(wd, &idximplicit); } if (sitem->type & stack_quote) { wd.text = NULL; wd.type = toquotestyle(style); wd.alt = NULL; wd.aux = quote_Close; wd.fpos = t.pos; wd.breaks = FALSE; if (!indexing || index_visible) addword(wd, &whptr); if (indexing) { rdadd(&indexstr, L'"'); addword(wd, &idximplicit); } } } sfree(sitem); break; case tok_cmd: switch (t.cmd) { case c__comment: /* * In-paragraph comment: \#{ balanced braces } * * Anything goes here; even tok_eop. We should * eat whitespace after the close brace _if_ * there was whitespace before the \#. */ dtor(t), t = get_token(in); if (t.type != tok_lbrace) { error(err_explbr, &t.pos); } else { int braces = 1; while (braces > 0) { dtor(t), t = get_token(in); if (t.type == tok_lbrace) braces++; else if (t.type == tok_rbrace) braces--; else if (t.type == tok_eof) { error(err_commenteof, &t.pos); break; } } } if (seenwhite) { already = TRUE; dtor(t), t = get_token(in); if (t.type == tok_white) { iswhite = TRUE; already = FALSE; } } break; case c_q: dtor(t), t = get_token(in); if (t.type != tok_lbrace) { error(err_explbr, &t.pos); } else { wd.text = NULL; wd.type = toquotestyle(style); wd.alt = NULL; wd.aux = quote_Open; wd.fpos = t.pos; wd.breaks = FALSE; if (!indexing || index_visible) addword(wd, &whptr); if (indexing) { rdadd(&indexstr, L'"'); addword(wd, &idximplicit); } sitem = mknew(struct stack_item); sitem->type = stack_quote; stk_push(parsestk, sitem); } break; case c_K: case c_k: case c_R: case c_W: case c_L: case c_date: /* * Keyword, hyperlink, or \date. We expect a * left brace, some text, and then a right * brace. No nesting; no arguments. */ wd.fpos = t.pos; wd.breaks = FALSE; if (t.cmd == c_K) wd.type = word_UpperXref; else if (t.cmd == c_k) wd.type = word_LowerXref; else if (t.cmd == c_R) wd.type = word_FreeTextXref; else if (t.cmd == c_W) wd.type = word_HyperLink; else if (t.cmd == c_L) wd.type = word_LocalHyperLink; else wd.type = word_Normal; dtor(t), t = get_token(in); if (t.type != tok_lbrace) { if (wd.type == word_Normal) { time_t thetime = current_time(); struct tm *broken = localtime(&thetime); already = TRUE; wdtext = ustrftime(NULL, broken); wd.type = style; } else { error(err_explbr, &t.pos); wdtext = NULL; } } else { rdstring rs = { 0, 0, NULL }; while (dtor(t), t = get_token(in), t.type == tok_word || t.type == tok_white) { if (t.type == tok_white) rdadd(&rs, ' '); else rdadds(&rs, t.text); } if (wd.type == word_Normal) { time_t thetime = current_time(); struct tm *broken = localtime(&thetime); wdtext = ustrftime(rs.text, broken); wd.type = style; } else { wdtext = ustrdup(rs.text); } sfree(rs.text); if (t.type != tok_rbrace) { error(err_kwexprbr, &t.pos); } } wd.alt = NULL; wd.aux = 0; if (!indexing || index_visible) { wd.text = ustrdup(wdtext); addword(wd, &whptr); } if (indexing) { wd.text = ustrdup(wdtext); addword(wd, &idximplicit); } sfree(wdtext); if (wd.type == word_FreeTextXref || wd.type == word_HyperLink || wd.type == word_LocalHyperLink) { /* * Hyperlinks are different: they then * expect another left brace, to begin * delimiting the text marked by the link. */ dtor(t), t = get_token(in); /* * Special cases: \W{}\c, \W{}\e, \W{}\s, \W{}\bold \W{}\cw */ sitem = mknew(struct stack_item); sitem->type = stack_hyper; if (t.type == tok_cmd && (tmpstyle = getcmdstyle(t.cmd))) { if (style != word_Normal) error(err_nestedstyles, &t.pos); else { style = tmpstyle; spcstyle = tospacestyle(style); sitem->type |= stack_style; } dtor(t), t = get_token(in); } if (t.type != tok_lbrace) { error(err_explbr, &t.pos); sfree(sitem); } else { stk_push(parsestk, sitem); } } break; case c_html: if (style != word_Normal) fatal(err_nestedstyles, &t.pos); type = t.cmd, dtor(t), t = get_token(in); if (t.type == tok_lbrace || (error(err_explbr, &t.pos), FALSE)) { style = word_Html, spcstyle = tospacestyle(style); stack_item_push(parsestk, stack_style); } break; case c_c: case c_cw: case c_e: case c_s: case c_bold: type = t.cmd; if (style != word_Normal) { error(err_nestedstyles, &t.pos); /* Error recovery: eat lbrace, push nop. */ dtor(t), t = get_token(in); stack_item_push(parsestk, stack_nop); } dtor(t), t = get_token(in); if (t.type != tok_lbrace) { error(err_explbr, &t.pos); } else { style = getcmdstyle(type), spcstyle = tospacestyle(style); stack_item_push(parsestk, stack_style); } break; case c_i: case c_ii: case c_I: type = t.cmd; if (indexing) { error(err_nestedindex, &t.pos); /* Error recovery: eat lbrace, push nop. */ dtor(t), t = get_token(in); stack_item_push(parsestk, stack_nop); } sitem = mknew(struct stack_item); sitem->type = stack_idx; dtor(t), t = get_token(in); /* * Special cases: \i\c, \i\e, \i\s, \i\bold, \i\cw */ wd.fpos = t.pos; if (t.type == tok_cmd && (tmpstyle = getcmdstyle(t.cmd))) { if (style != word_Normal) error(err_nestedstyles, &t.pos); else { style = tmpstyle; spcstyle = tospacestyle(style); sitem->type |= stack_style; } dtor(t), t = get_token(in); } if (t.type != tok_lbrace) { sfree(sitem); error(err_explbr, &t.pos); } else { /* Add an index-reference word with no text as yet */ wd.type = word_IndexRef; wd.text = NULL; wd.alt = NULL; wd.aux = 0; wd.breaks = FALSE; indexword = addword(wd, &whptr); /* Set up a rdstring to read the index text */ indexstr = nullrs; /* Flags so that we do the Right Things with text */ index_visible = (type != c_I); index_downcase = (type == c_ii); indexing = TRUE; idxwordlist = NULL; idximplicit = &idxwordlist; /* Stack item to close the indexing on exit */ stk_push(parsestk, sitem); } break; case c_u: uchr = t.aux; if (uchr == 0) { err_zerochar(&t.pos); break; } utext[0] = uchr, utext[1] = 0; wd.type = style; wd.breaks = FALSE; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; if (!indexing || index_visible) { wd.text = ustrdup(utext); uword = addword(wd, &whptr); } else uword = NULL; if (indexing) { wd.text = ustrdup(utext); iword = addword(wd, &idximplicit); } else iword = NULL; dtor(t), t = get_token(in); if (t.type == tok_lbrace) { /* * \u with a left brace. Until the brace * closes, all further words go on a * sidetrack from the main thread of the * paragraph. */ sitem = mknew(struct stack_item); sitem->type = stack_ualt; sitem->whptr = whptr; sitem->idximplicit = idximplicit; stk_push(parsestk, sitem); whptr = uword ? &uword->alt : NULL; idximplicit = iword ? &iword->alt : NULL; } else { if (indexing) rdadd(&indexstr, uchr); already = TRUE; } break; default: if (!macrolookup(macros, in, t.text, &t.pos)) error(err_badmidcmd, t.text, &t.pos); break; } } if (!already) dtor(t), t = get_token(in); seenwhite = iswhite; } /* Check the stack is empty */ if (NULL != (sitem = stk_pop(parsestk))) { do { sfree(sitem); sitem = stk_pop(parsestk); } while (sitem); error(err_missingrbrace, &t.pos); } stk_free(parsestk); addpara(par, ret); } /* * We break to here rather than returning, because otherwise * this cleanup doesn't happen. */ dtor(t); } paragraph *read_input(input * in, indexdata * idx) { paragraph *head = NULL; paragraph **hptr = &head; tree234 *macros; macros = newtree234(macrocmp); while (in->currindex < in->nfiles) { in->currfp = fopen(in->filenames[in->currindex], "r"); if (in->currfp) { setpos(in, in->filenames[in->currindex]); read_file(&hptr, in, idx, macros); } in->currindex++; } macrocleanup(macros); return head; } nsis-3.11/Docs/src/bin/halibut/keywords.c000077500000000000000000000076461477201124000203220ustar00rootroot00000000000000/* * keywords.c: keep track of all cross-reference keywords */ #include #include #include #include "halibut.h" static int kwcmp(void *av, void *bv) { const keyword *a = (const keyword *) av; const keyword *b = (const keyword *) bv; return ustrcmp(a->key, b->key); } static int kwfind(void *av, void *bv) { wchar_t *a = (wchar_t *) av; const keyword *b = (const keyword *) bv; return ustrcmp(a, b->key); } keyword *kw_lookup(keywordlist * kl, wchar_t * str) { return find234(kl->keys, str, kwfind); } /* * This function reads through source form and collects the * keywords. They get collected in a heap, sorted by Unicode * collation, last at the top (so that we can Heapsort them when we * finish). */ keywordlist *get_keywords(paragraph * source) { int errors = FALSE; keywordlist *kl = mknew(keywordlist); numberstate *n = number_init(); int prevpara = para_NotParaType; number_cfg(n, source); kl->size = 0; kl->keys = newtree234(kwcmp); kl->nlooseends = kl->looseendssize = 0; kl->looseends = NULL; for (; source; source = source->next) { wchar_t *p, *q; p = q = source->keyword; /* * Look for the section type override (`example', * `question' or whatever - to replace `chapter' or * `section' on a per-section basis). */ if (q) { q = uadv(q); /* point q at the word beyond */ if (!*q) q = NULL; } /* * Number the chapter / section / list-item / whatever. * This also sets up the `parent', `child' and `sibling' * links. */ source->kwtext = number_mktext(n, source, q, prevpara, &errors); prevpara = source->type; if (p && *p) { if (source->kwtext || source->type == para_Biblio) { keyword *kw, *ret; kw = mknew(keyword); kw->key = p; kw->text = source->kwtext; kw->para = source; ret = add234(kl->keys, kw); if (ret != kw) { error(err_multikw, &source->fpos, &ret->para->fpos, p); sfree(kw); /* FIXME: what happens to kw->text? Does it leak? */ } } } else { if (kl->nlooseends >= kl->looseendssize) { kl->looseendssize = kl->nlooseends + 32; kl->looseends = resize(kl->looseends, kl->looseendssize); } kl->looseends[kl->nlooseends++] = source->kwtext; } } number_free(n); if (errors) { free_keywords(kl); return NULL; } return kl; } void free_keywords(keywordlist * kl) { keyword *kw; while (kl->nlooseends) free_word_list(kl->looseends[--kl->nlooseends]); sfree(kl->looseends); while ((kw = index234(kl->keys, 0)) != NULL) { delpos234(kl->keys, 0); free_word_list(kw->text); sfree(kw); } freetree234(kl->keys); sfree(kl); } void subst_keywords(paragraph * source, keywordlist * kl) { for (; source; source = source->next) { word *ptr; for (ptr = source->words; ptr; ptr = ptr->next) { if (ptr->type == word_UpperXref || ptr->type == word_LowerXref) { keyword *kw; word **endptr, *close, *subst; kw = kw_lookup(kl, ptr->text); if (!kw) { error(err_nosuchkw, &ptr->fpos, ptr->text); subst = NULL; } else subst = dup_word_list(kw->text); if (subst && ptr->type == word_LowerXref && kw->para->type != para_Biblio && kw->para->type != para_BiblioCited) ustrlow(subst->text); close = mknew(word); close->text = NULL; close->alt = NULL; close->type = word_XrefEnd; close->fpos = ptr->fpos; close->breaks = FALSE; close->aux = 0; close->next = ptr->next; ptr->next = subst; for (endptr = &ptr->next; *endptr; endptr = &(*endptr)->next) (*endptr)->fpos = ptr->fpos; *endptr = close; ptr = close; } } } } nsis-3.11/Docs/src/bin/halibut/licence.c000077500000000000000000000003261477201124000200410ustar00rootroot00000000000000/* * licence.c: licence text */ #include static char *licencetext[] = { "FIXME: licence text goes here", NULL }; void licence(void) { char **p; for (p = licencetext; *p; p++) puts(*p); } nsis-3.11/Docs/src/bin/halibut/main.c000077500000000000000000000144361477201124000173720ustar00rootroot00000000000000/* * main.c: command line parsing and top level */ #include #include #include #include "halibut.h" static void dbg_prtsource(paragraph * sourceform); static void dbg_prtwordlist(int level, word * w); static void dbg_prtkws(keywordlist * kws); int main(int argc, char **argv) { char **infiles; char *outfile; int nfiles; int nogo; int errs; int reportcols; int debug; #ifdef C_ASSERT { C_ASSERT(!word_Normal); /* For getcmdstyle */ } #endif initversionstring(); /* * Set up initial (default) parameters. */ infiles = mknewa(char *, argc); outfile = NULL; nfiles = 0; nogo = errs = FALSE; reportcols = 0; debug = 0; if (argc == 1) { usage(); exit(EXIT_SUCCESS); } /* * Parse command line arguments. */ while (--argc) { char *p = *++argv; if (*p == '-') { /* * An option. */ while (p && *++p) { char c = *p; switch (c) { case '-': /* * Long option. */ { char *opt, *val; opt = p++; /* opt will have _one_ leading - */ while (*p && *p != '=') p++; /* find end of option */ if (*p == '=') { *p++ = '\0'; val = p; } else val = NULL; if (!strcmp(opt, "-version")) { showversion(); nogo = TRUE; } else if (!strcmp(opt, "-licence") || !strcmp(opt, "-license")) { licence(); nogo = TRUE; } else if (!strcmp(opt, "-output")) { if (!val) errs = TRUE, error(err_optnoarg, opt); else outfile = val; } else if (!strcmp(opt, "-precise")) { reportcols = 1; } else { errs = TRUE, error(err_nosuchopt, opt); } } p = NULL; break; case 'V': case 'L': case 'P': case 'd': /* * Option requiring no parameter. */ switch (c) { case 'V': showversion(); nogo = TRUE; break; case 'L': licence(); nogo = TRUE; break; case 'P': reportcols = 1; break; case 'd': debug = TRUE; break; } break; case 'o': /* * Option requiring parameter. */ p++; if (!*p && argc > 1) --argc, p = *++argv; else if (!*p) { char opt[2]; opt[0] = c; opt[1] = '\0'; errs = TRUE, error(err_optnoarg, opt); } /* * Now c is the option and p is the parameter. */ switch (c) { case 'o': outfile = p; break; } p = NULL; /* prevent continued processing */ break; default: /* * Unrecognised option. */ { char opt[2]; opt[0] = c; opt[1] = '\0'; errs = TRUE, error(err_nosuchopt, opt); } } } } else { /* * A non-option argument. */ infiles[nfiles++] = p; } } if (errs) exit(EXIT_FAILURE); if (nogo) exit(EXIT_SUCCESS); /* * Do the work. */ if (nfiles == 0) { error(err_noinput); usage(); exit(EXIT_FAILURE); } { input in; paragraph *sourceform, *p; indexdata *idx; keywordlist *keywords; in.filenames = infiles; in.nfiles = nfiles; in.currfp = NULL; in.currindex = 0; in.npushback = in.pushbacksize = 0; in.pushback = NULL; in.reportcols = reportcols; in.stack = NULL; idx = make_index(); sourceform = read_input(&in, idx); if (!sourceform) exit(EXIT_FAILURE); sfree(in.pushback); mark_attr_ends(sourceform); sfree(infiles); keywords = get_keywords(sourceform); if (!keywords) exit(EXIT_FAILURE); gen_citations(sourceform, keywords); subst_keywords(sourceform, keywords); for (p = sourceform; p; p = p->next) if (p->type == para_IM) index_merge(idx, TRUE, p->keyword, p->words); build_index(idx); if (debug) { index_debug(idx); dbg_prtkws(keywords); dbg_prtsource(sourceform); } xhtml_backend(sourceform, keywords, idx); free_para_list(sourceform); free_keywords(keywords); cleanup_index(idx); } return 0; } static void dbg_prtsource(paragraph * sourceform) { /* * Output source form in debugging format. */ paragraph *p; for (p = sourceform; p; p = p->next) { wchar_t *wp; printf("para %d ", p->type); if (p->keyword) { wp = p->keyword; while (*wp) { putchar('\"'); for (; *wp; wp++) putchar(*wp); putchar('\"'); if (*++wp) printf(", "); } } else printf("(no keyword)"); printf(" {\n"); dbg_prtwordlist(1, p->words); printf("}\n"); } } static void dbg_prtkws(keywordlist * kws) { /* * Output keywords in debugging format. */ int i; keyword *kw; for (i = 0; (kw = index234(kws->keys, i)) != NULL; i++) { wchar_t *wp; printf("keyword "); wp = kw->key; while (*wp) { putchar('\"'); for (; *wp; wp++) putchar(*wp); putchar('\"'); if (*++wp) printf(", "); } printf(" {\n"); dbg_prtwordlist(1, kw->text); printf("}\n"); } } static void dbg_prtwordlist(int level, word * w) { for (; w; w = w->next) { wchar_t *wp; printf("%*sword %d ", level * 4, "", w->type); if (w->text) { printf("\""); for (wp = w->text; *wp; wp++) putchar(*wp); printf("\""); } else printf("(no text)"); if (w->breaks) printf(" [breaks]"); if (w->alt) { printf(" alt = {\n"); dbg_prtwordlist(level + 1, w->alt); printf("%*s}", level * 4, ""); } printf("\n"); } } nsis-3.11/Docs/src/bin/halibut/malloc.c000077500000000000000000000063511477201124000177120ustar00rootroot00000000000000/* * malloc.c: safe wrappers around malloc, realloc, free, strdup */ #include #include #include #include "halibut.h" #ifdef LOGALLOC #define LOGPARAMS char *file, int line, static FILE *logallocfp = NULL; static int logline = 2; /* off by 1: `null pointer is' */ static void loginc(void) { } static void logallocinit(void) { if (!logallocfp) { logallocfp = fopen("malloc.log", "w"); if (!logallocfp) { fprintf(stderr, "panic: unable to open malloc.log\n"); exit(10); } setvbuf(logallocfp, NULL, _IOLBF, BUFSIZ); fprintf(logallocfp, "null pointer is %p\n", NULL); } } static void logprintf(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(logallocfp, fmt, ap); va_end(ap); } #define LOGPRINT(x) ( logallocinit(), logprintf x ) #define LOGINC do { loginc(); logline++; } while (0) #else #define LOGPARAMS #define LOGPRINT(x) #define LOGINC ((void)0) #endif /* * smalloc should guarantee to return a useful pointer - Halibut * can do nothing except die when it's out of memory anyway. */ void *(smalloc) (LOGPARAMS int size) { void *p; LOGINC; LOGPRINT(("%s %d malloc(%ld)", file, line, (long) size)); p = malloc(size); if (!p) fatal(err_nomemory); LOGPRINT((" returns %p\n", p)); return p; } /* * sfree should guaranteeably deal gracefully with freeing NULL */ void (sfree) (LOGPARAMS void *p) { if (p) { LOGINC; LOGPRINT(("%s %d free(%p)\n", file, line, p)); free(p); } } /* * srealloc should guaranteeably be able to realloc NULL */ void *(srealloc) (LOGPARAMS void *p, int size) { void *q; if (p) { LOGINC; LOGPRINT(("%s %d realloc(%p,%ld)", file, line, p, (long) size)); q = realloc(p, size); LOGPRINT((" returns %p\n", q)); } else { LOGINC; LOGPRINT(("%s %d malloc(%ld)", file, line, (long) size)); q = malloc(size); LOGPRINT((" returns %p\n", q)); } if (!q) fatal(err_nomemory); return q; } /* * dupstr is like strdup, but with the never-return-NULL property * of smalloc (and also reliably defined in all environments :-) */ char *dupstr(char *s) { char *r = smalloc(1 + strlen(s)); strcpy(r, s); return r; } /* * Duplicate a linked list of words */ word *dup_word_list(word * w) { word *head, **eptr = &head; while (w) { word *newwd = mknew(word); *newwd = *w; /* structure copy */ newwd->text = ustrdup(w->text); if (w->alt) newwd->alt = dup_word_list(w->alt); *eptr = newwd; newwd->next = NULL; eptr = &newwd->next; w = w->next; } return head; } /* * Free a generic linked list */ void free_list(void*p) { void *s = p, *n; for (; p; p = n) { n = *(void**) p; /* Assumes next pointer is the first member! */ if (n == s) n = NULL; /* Around the ring? */ sfree(p); } } /* * Free a linked list of words */ void free_word_list(word * w) { word *t; while (w) { t = w; w = w->next; sfree(t->text); if (t->alt) free_word_list(t->alt); sfree(t); } } /* * Free a linked list of paragraphs */ void free_para_list(paragraph * p) { paragraph *t; while (p) { t = p; p = p->next; sfree(t->keyword); free_word_list(t->words); sfree(t); } } nsis-3.11/Docs/src/bin/halibut/misc.c000077500000000000000000000211221477201124000173670ustar00rootroot00000000000000/* * misc.c: miscellaneous useful items */ #include #include #include #include "halibut.h" struct stackTag { void **data; int sp; int size; }; stack stk_new(void) { stack s; s = mknew(struct stackTag); s->sp = 0; s->size = 0; s->data = NULL; return s; } void stk_free(stack s) { sfree(s->data); sfree(s); } void stk_push(stack s, void *item) { if (s->size <= s->sp) { s->size = s->sp + 32; s->data = resize(s->data, s->size); } s->data[s->sp++] = item; } void *stk_pop(stack s) { if (s->sp > 0) return s->data[--s->sp]; else return NULL; } /* * Small routines to amalgamate a string from an input source. */ const rdstring empty_rdstring = { 0, 0, NULL }; const rdstringc empty_rdstringc = { 0, 0, NULL }; void rdadd(rdstring * rs, wchar_t c) { if (rs->pos >= rs->size - 1) { rs->size = rs->pos + 128; rs->text = resize(rs->text, rs->size); } rs->text[rs->pos++] = c; rs->text[rs->pos] = 0; } void rdadds(rdstring * rs, wchar_t * p) { int len = ustrlen(p); if (rs->pos >= rs->size - len) { rs->size = rs->pos + len + 128; rs->text = resize(rs->text, rs->size); } ustrcpy(rs->text + rs->pos, p); rs->pos += len; } wchar_t *rdtrim(rdstring * rs) { rs->text = resize(rs->text, rs->pos + 1); return rs->text; } void rdaddc(rdstringc * rs, char c) { if (rs->pos >= rs->size - 1) { rs->size = rs->pos + 128; rs->text = resize(rs->text, rs->size); } rs->text[rs->pos++] = c; rs->text[rs->pos] = 0; } void rdaddsc(rdstringc * rs, char *p) { int len = strlen(p); if (rs->pos >= rs->size - len) { rs->size = rs->pos + len + 128; rs->text = resize(rs->text, rs->size); } strcpy(rs->text + rs->pos, p); rs->pos += len; } char *rdtrimc(rdstringc * rs) { rs->text = resize(rs->text, rs->pos + 1); return rs->text; } int compare_wordlists(word * a, word * b) { int t; while (a && b) { if (a->type != b->type) return (a->type < b->type ? -1 : +1); /* FIXME? */ t = a->type; if ((t != word_Normal && t != word_Code && t != word_WeakCode && t != word_Emph) || a->alt || b->alt) { int c; if (a->text && b->text) { c = ustricmp(a->text, b->text); if (c) return c; } c = compare_wordlists(a->alt, b->alt); if (c) return c; a = a->next; b = b->next; } else { wchar_t *ap = a->text, *bp = b->text; while (*ap && *bp) { wchar_t ac = utolower(*ap), bc = utolower(*bp); if (ac != bc) return (ac < bc ? -1 : +1); if (!*++ap && a->next && a->next->type == t && !a->next->alt) a = a->next, ap = a->text; if (!*++bp && b->next && b->next->type == t && !b->next->alt) b = b->next, bp = b->text; } if (*ap || *bp) return (*ap ? +1 : -1); a = a->next; b = b->next; } } if (a || b) return (a ? +1 : -1); else return 0; } void mark_attr_ends(paragraph * sourceform) { paragraph *p; word *w, *wp; for (p = sourceform; p; p = p->next) { wp = NULL; for (w = p->words; w; w = w->next) { if (isattr(w->type)) { int before = (wp && isattr(wp->type) && sameattr(wp->type, w->type)); int after = (w->next && isattr(w->next->type) && sameattr(w->next->type, w->type)); w->aux |= (before ? (after ? attr_Always : attr_Last) : (after ? attr_First : attr_Only)); } wp = w; } } } wrappedline *wrap_para(word * text, int width, int subsequentwidth, int (*widthfn) (word *)) { wrappedline *head = NULL, **ptr = &head; int nwords, wordsize; struct wrapword { word *begin, *end; int width; int spacewidth; int cost; int nwords; } *wrapwords; int i, j, n; /* * Break the line up into wrappable components. */ nwords = wordsize = 0; wrapwords = NULL; while (text) { if (nwords >= wordsize) { wordsize = nwords + 64; wrapwords = srealloc(wrapwords, wordsize * sizeof(*wrapwords)); } wrapwords[nwords].width = 0; wrapwords[nwords].begin = text; while (text) { wrapwords[nwords].width += widthfn(text); wrapwords[nwords].end = text->next; if (text->next && (text->next->type == word_WhiteSpace || text->next->type == word_EmphSpace || text->breaks)) break; text = text->next; } if (text && text->next && (text->next->type == word_WhiteSpace || text->next->type == word_EmphSpace)) { wrapwords[nwords].spacewidth = widthfn(text->next); text = text->next; } else { wrapwords[nwords].spacewidth = 0; } nwords++; if (text) text = text->next; } /* * Perform the dynamic wrapping algorithm: work backwards from * nwords-1, determining the optimal wrapping for each terminal * subsequence of the paragraph. */ for (i = nwords; i--;) { int best = -1; int bestcost = 0; int cost; int linelen = 0, spacewidth = 0; int seenspace; int thiswidth = (i == 0 ? width : subsequentwidth); j = 0; seenspace = 0; while (i + j < nwords) { /* * See what happens if we put j+1 words on this line. */ if (spacewidth) seenspace = 1; linelen += spacewidth + wrapwords[i + j].width; spacewidth = wrapwords[i + j].spacewidth; j++; if (linelen > thiswidth) { /* * If we're over the width limit, abandon ship, * _unless_ there is no best-effort yet (which will * only happen if the first word is too long all by * itself). */ if (best > 0) break; } if (i + j == nwords) { /* * Special case: if we're at the very end of the * paragraph, we don't score penalty points for the * white space left on the line. */ cost = 0; } else { cost = (thiswidth - linelen) * (thiswidth - linelen); cost += wrapwords[i + j].cost; } /* * We compare bestcost >= cost, not bestcost > cost, * because in cases where the costs are identical we * want to try to look like the greedy algorithm, * because readers are likely to have spent a lot of * time looking at greedy-wrapped paragraphs and * there's no point violating the Principle of Least * Surprise if it doesn't actually gain anything. */ if (best < 0 || bestcost >= cost) { bestcost = cost; best = j; } } /* * Now we know the optimal answer for this terminal * subsequence, so put it in wrapwords. */ wrapwords[i].cost = bestcost; wrapwords[i].nwords = best; } /* * We've wrapped the paragraph. Now build the output * `wrappedline' list. */ i = 0; while (i < nwords) { wrappedline *w = mknew(wrappedline); *ptr = w; ptr = &w->next; w->next = NULL; n = wrapwords[i].nwords; w->begin = wrapwords[i].begin; w->end = wrapwords[i + n - 1].end; /* * Count along the words to find nspaces and shortfall. */ w->nspaces = 0; w->shortfall = width; for (j = 0; j < n; j++) { w->shortfall -= wrapwords[i + j].width; if (j < n - 1 && wrapwords[i + j].spacewidth) { w->nspaces++; w->shortfall -= wrapwords[i + j].spacewidth; } } i += n; } sfree(wrapwords); return head; } void wrap_free(wrappedline * w) { while (w) { wrappedline *t = w->next; sfree(w); w = t; } } unsigned long getutcunixtime() { #ifndef _WIN32 struct timespec ts; ts.tv_sec = 0; /* gettimeofday()? */ #if (_XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 199309L) if (0 == clock_gettime(CLOCK_REALTIME, &ts)) return ts.tv_sec; #endif #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && defined(TIME_UTC) if (timespec_get(&ts, TIME_UTC)) /* implementation defined epoch :( */ return ts.tv_sec; #endif #endif /*~ _WIN32 */ return (unsigned long) time(NULL); } /* * Wrapper around the standard C time() function, which allows its * return value to be overridden by the environment variable * SOURCE_DATE_EPOCH, used to achieve reproducible builds by avoiding * baking different datestamps into repetitions of what ought to be * the same build. */ time_t current_time(void) { const char *epoch = getenv("SOURCE_DATE_EPOCH"); if (epoch) return atol(epoch); return time(NULL); }nsis-3.11/Docs/src/bin/halibut/style.c000077500000000000000000000001761477201124000176020ustar00rootroot00000000000000/* * style.c: load and keep track of user style preferences */ #include #include #include "halibut.h" nsis-3.11/Docs/src/bin/halibut/tree234.c000077500000000000000000002031321477201124000176270ustar00rootroot00000000000000/* * tree234.c: reasonably generic counted 2-3-4 tree routines. * * This file is copyright 1999-2001 Simon Tatham. * * 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 SIMON TATHAM 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 #include #include #include "tree234.h" #define smalloc malloc #define sfree free #define mknew(typ) ( (typ *) smalloc (sizeof (typ)) ) #ifdef TEST #define LOG(x) (printf x) #else #define LOG(x) #endif typedef struct node234_Tag node234; struct tree234_Tag { node234 *root; cmpfn234 cmp; }; struct node234_Tag { node234 *parent; node234 *kids[4]; int counts[4]; void *elems[3]; }; /* * Create a 2-3-4 tree. */ tree234 *newtree234(cmpfn234 cmp) { tree234 *ret = mknew(tree234); LOG(("created tree %p\n", ret)); ret->root = NULL; ret->cmp = cmp; return ret; } /* * Free a 2-3-4 tree (not including freeing the elements). */ static void freenode234(node234 * n) { if (!n) return; freenode234(n->kids[0]); freenode234(n->kids[1]); freenode234(n->kids[2]); freenode234(n->kids[3]); sfree(n); } void freetree234(tree234 * t) { freenode234(t->root); sfree(t); } /* * Internal function to count a node. */ static int countnode234(node234 * n) { int count = 0; int i; if (!n) return 0; for (i = 0; i < 4; i++) count += n->counts[i]; for (i = 0; i < 3; i++) if (n->elems[i]) count++; return count; } /* * Count the elements in a tree. */ int count234(tree234 * t) { if (t->root) return countnode234(t->root); else return 0; } /* * Propagate a node overflow up a tree until it stops. Returns 0 or * 1, depending on whether the root had to be split or not. */ static int add234_insert(node234 * left, void *e, node234 * right, node234 ** root, node234 * n, int ki) { int lcount, rcount; /* * We need to insert the new left/element/right set in n at * child position ki. */ lcount = countnode234(left); rcount = countnode234(right); while (n) { LOG((" at %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" need to insert %p/%d \"%s\" %p/%d at position %d\n", left, lcount, e, right, rcount, ki)); if (n->elems[1] == NULL) { /* * Insert in a 2-node; simple. */ if (ki == 0) { LOG((" inserting on left of 2-node\n")); n->kids[2] = n->kids[1]; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcount; } else { /* ki == 1 */ LOG((" inserting on right of 2-node\n")); n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcount; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; LOG((" done\n")); break; } else if (n->elems[2] == NULL) { /* * Insert in a 3-node; simple. */ if (ki == 0) { LOG((" inserting on left of 3-node\n")); n->kids[3] = n->kids[2]; n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = n->kids[1]; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcount; } else if (ki == 1) { LOG((" inserting in middle of 3-node\n")); n->kids[3] = n->kids[2]; n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcount; } else { /* ki == 2 */ LOG((" inserting on right of 3-node\n")); n->kids[3] = right; n->counts[3] = rcount; n->elems[2] = e; n->kids[2] = left; n->counts[2] = lcount; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; if (n->kids[3]) n->kids[3]->parent = n; LOG((" done\n")); break; } else { node234 *m = mknew(node234); m->parent = n->parent; LOG((" splitting a 4-node; created new node %p\n", m)); /* * Insert in a 4-node; split into a 2-node and a * 3-node, and move focus up a level. * * I don't think it matters which way round we put the * 2 and the 3. For simplicity, we'll put the 3 first * always. */ if (ki == 0) { m->kids[0] = left; m->counts[0] = lcount; m->elems[0] = e; m->kids[1] = right; m->counts[1] = rcount; m->elems[1] = n->elems[0]; m->kids[2] = n->kids[1]; m->counts[2] = n->counts[1]; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[0] = n->counts[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else if (ki == 1) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = left; m->counts[1] = lcount; m->elems[1] = e; m->kids[2] = right; m->counts[2] = rcount; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[0] = n->counts[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else if (ki == 2) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = left; m->counts[2] = lcount; /* e = e; */ n->kids[0] = right; n->counts[0] = rcount; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else { /* ki == 3 */ m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = n->kids[2]; m->counts[2] = n->counts[2]; n->kids[0] = left; n->counts[0] = lcount; n->elems[0] = e; n->kids[1] = right; n->counts[1] = rcount; e = n->elems[2]; } m->kids[3] = n->kids[3] = n->kids[2] = NULL; m->counts[3] = n->counts[3] = n->counts[2] = 0; m->elems[2] = n->elems[2] = n->elems[1] = NULL; if (m->kids[0]) m->kids[0]->parent = m; if (m->kids[1]) m->kids[1]->parent = m; if (m->kids[2]) m->kids[2]->parent = m; if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; LOG((" left (%p): %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", m, m->kids[0], m->counts[0], m->elems[0], m->kids[1], m->counts[1], m->elems[1], m->kids[2], m->counts[2])); LOG((" right (%p): %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1])); left = m; lcount = countnode234(left); right = n; rcount = countnode234(right); } if (n->parent) ki = (n->parent->kids[0] == n ? 0 : n->parent->kids[1] == n ? 1 : n->parent->kids[2] == n ? 2 : 3); n = n->parent; } /* * If we've come out of here by `break', n will still be * non-NULL and all we need to do is go back up the tree * updating counts. If we've come here because n is NULL, we * need to create a new root for the tree because the old one * has just split into two. */ if (n) { while (n->parent) { int count = countnode234(n); int childnum; childnum = (n->parent->kids[0] == n ? 0 : n->parent->kids[1] == n ? 1 : n->parent->kids[2] == n ? 2 : 3); n->parent->counts[childnum] = count; n = n->parent; } return 0; /* root unchanged */ } else { LOG((" root is overloaded, split into two\n")); (*root) = mknew(node234); (*root)->kids[0] = left; (*root)->counts[0] = lcount; (*root)->elems[0] = e; (*root)->kids[1] = right; (*root)->counts[1] = rcount; (*root)->elems[1] = NULL; (*root)->kids[2] = NULL; (*root)->counts[2] = 0; (*root)->elems[2] = NULL; (*root)->kids[3] = NULL; (*root)->counts[3] = 0; (*root)->parent = NULL; if ((*root)->kids[0]) (*root)->kids[0]->parent = (*root); if ((*root)->kids[1]) (*root)->kids[1]->parent = (*root); LOG((" new root is %p/%d \"%s\" %p/%d\n", (*root)->kids[0], (*root)->counts[0], (*root)->elems[0], (*root)->kids[1], (*root)->counts[1])); return 1; /* root moved */ } } /* * Add an element e to a 2-3-4 tree t. Returns e on success, or if * an existing element compares equal, returns that. */ static void *add234_internal(tree234 * t, void *e, int index) { node234 *n; int ki; void *orig_e = e; int c; LOG(("adding element \"%s\" to tree %p\n", e, t)); if (t->root == NULL) { t->root = mknew(node234); t->root->elems[1] = t->root->elems[2] = NULL; t->root->kids[0] = t->root->kids[1] = NULL; t->root->kids[2] = t->root->kids[3] = NULL; t->root->counts[0] = t->root->counts[1] = 0; t->root->counts[2] = t->root->counts[3] = 0; t->root->parent = NULL; t->root->elems[0] = e; LOG((" created root %p\n", t->root)); return orig_e; } n = t->root; while (n) { LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); if (index >= 0) { if (!n->kids[0]) { /* * Leaf node. We want to insert at kid position * equal to the index: * * 0 A 1 B 2 C 3 */ ki = index; } else { /* * Internal node. We always descend through it (add * always starts at the bottom, never in the * middle). */ if (index <= n->counts[0]) { ki = 0; } else if (index -= n->counts[0] + 1, index <= n->counts[1]) { ki = 1; } else if (index -= n->counts[1] + 1, index <= n->counts[2]) { ki = 2; } else if (index -= n->counts[2] + 1, index <= n->counts[3]) { ki = 3; } else return NULL; /* error: index out of range */ } } else { if ((c = t->cmp(e, n->elems[0])) < 0) ki = 0; else if (c == 0) return n->elems[0]; /* already exists */ else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) ki = 1; else if (c == 0) return n->elems[1]; /* already exists */ else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) ki = 2; else if (c == 0) return n->elems[2]; /* already exists */ else ki = 3; } LOG((" moving to child %d (%p)\n", ki, n->kids[ki])); if (!n->kids[ki]) break; n = n->kids[ki]; } add234_insert(NULL, e, NULL, &t->root, n, ki); return orig_e; } void *add234(tree234 * t, void *e) { if (!t->cmp) /* tree is unsorted */ return NULL; return add234_internal(t, e, -1); } void *addpos234(tree234 * t, void *e, int index) { if (index < 0 || /* index out of range */ t->cmp) /* tree is sorted */ return NULL; /* return failure */ return add234_internal(t, e, index); /* this checks the upper bound */ } /* * Look up the element at a given numeric index in a 2-3-4 tree. * Returns NULL if the index is out of range. */ void *index234(tree234 * t, int index) { node234 *n; if (!t->root) return NULL; /* tree is empty */ if (index < 0 || index >= countnode234(t->root)) return NULL; /* out of range */ n = t->root; while (n) { if (index < n->counts[0]) n = n->kids[0]; else if (index -= n->counts[0] + 1, index < 0) return n->elems[0]; else if (index < n->counts[1]) n = n->kids[1]; else if (index -= n->counts[1] + 1, index < 0) return n->elems[1]; else if (index < n->counts[2]) n = n->kids[2]; else if (index -= n->counts[2] + 1, index < 0) return n->elems[2]; else n = n->kids[3]; } /* We shouldn't ever get here. I wonder how we did. */ return NULL; } /* * Find an element e in a sorted 2-3-4 tree t. Returns NULL if not * found. e is always passed as the first argument to cmp, so cmp * can be an asymmetric function if desired. cmp can also be passed * as NULL, in which case the compare function from the tree proper * will be used. */ void *findrelpos234(tree234 * t, void *e, cmpfn234 cmp, int relation, int *index) { node234 *n; void *ret; int c; int idx, ecount, kcount, cmpret; if (t->root == NULL) return NULL; if (cmp == NULL) cmp = t->cmp; n = t->root; /* * Attempt to find the element itself. */ idx = 0; ecount = -1; /* * Prepare a fake `cmp' result if e is NULL. */ cmpret = 0; if (e == NULL) { assert(relation == REL234_LT || relation == REL234_GT); if (relation == REL234_LT) cmpret = +1; /* e is a max: always greater */ else if (relation == REL234_GT) cmpret = -1; /* e is a min: always smaller */ } while (1) { for (kcount = 0; kcount < 4; kcount++) { if (kcount >= 3 || n->elems[kcount] == NULL || (c = cmpret ? cmpret : cmp(e, n->elems[kcount])) < 0) { break; } if (n->kids[kcount]) idx += n->counts[kcount]; if (c == 0) { ecount = kcount; break; } idx++; } if (ecount >= 0) break; if (n->kids[kcount]) n = n->kids[kcount]; else break; } if (ecount >= 0) { /* * We have found the element we're looking for. It's * n->elems[ecount], at tree index idx. If our search * relation is EQ, LE or GE we can now go home. */ if (relation != REL234_LT && relation != REL234_GT) { if (index) *index = idx; return n->elems[ecount]; } /* * Otherwise, we'll do an indexed lookup for the previous * or next element. (It would be perfectly possible to * implement these search types in a non-counted tree by * going back up from where we are, but far more fiddly.) */ if (relation == REL234_LT) idx--; else idx++; } else { /* * We've found our way to the bottom of the tree and we * know where we would insert this node if we wanted to: * we'd put it in in place of the (empty) subtree * n->kids[kcount], and it would have index idx * * But the actual element isn't there. So if our search * relation is EQ, we're doomed. */ if (relation == REL234_EQ) return NULL; /* * Otherwise, we must do an index lookup for index idx-1 * (if we're going left - LE or LT) or index idx (if we're * going right - GE or GT). */ if (relation == REL234_LT || relation == REL234_LE) { idx--; } } /* * We know the index of the element we want; just call index234 * to do the rest. This will return NULL if the index is out of * bounds, which is exactly what we want. */ ret = index234(t, idx); if (ret && index) *index = idx; return ret; } void *find234(tree234 * t, void *e, cmpfn234 cmp) { return findrelpos234(t, e, cmp, REL234_EQ, NULL); } void *findrel234(tree234 * t, void *e, cmpfn234 cmp, int relation) { return findrelpos234(t, e, cmp, relation, NULL); } void *findpos234(tree234 * t, void *e, cmpfn234 cmp, int *index) { return findrelpos234(t, e, cmp, REL234_EQ, index); } /* * Tree transformation used in delete and split: move a subtree * right, from child ki of a node to the next child. Update k and * index so that they still point to the same place in the * transformed tree. Assumes the destination child is not full, and * that the source child does have a subtree to spare. Can cope if * the destination child is undersized. * * . C . . B . * / \ -> / \ * [more] a A b B c d D e [more] a A b c C d D e * * . C . . B . * / \ -> / \ * [more] a A b B c d [more] a A b c C d */ static void trans234_subtree_right(node234 * n, int ki, int *k, int *index) { node234 *src, *dest; int i, srclen, adjust; src = n->kids[ki]; dest = n->kids[ki + 1]; LOG((" trans234_subtree_right(%p, %d):\n", n, ki)); LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); /* * Move over the rest of the destination node to make space. */ dest->kids[3] = dest->kids[2]; dest->counts[3] = dest->counts[2]; dest->elems[2] = dest->elems[1]; dest->kids[2] = dest->kids[1]; dest->counts[2] = dest->counts[1]; dest->elems[1] = dest->elems[0]; dest->kids[1] = dest->kids[0]; dest->counts[1] = dest->counts[0]; /* which element to move over */ i = (src->elems[2] ? 2 : src->elems[1] ? 1 : 0); dest->elems[0] = n->elems[ki]; n->elems[ki] = src->elems[i]; src->elems[i] = NULL; dest->kids[0] = src->kids[i + 1]; dest->counts[0] = src->counts[i + 1]; src->kids[i + 1] = NULL; src->counts[i + 1] = 0; if (dest->kids[0]) dest->kids[0]->parent = dest; adjust = dest->counts[0] + 1; n->counts[ki] -= adjust; n->counts[ki + 1] += adjust; srclen = n->counts[ki]; if (k) { LOG((" before: k,index = %d,%d\n", (*k), (*index))); if ((*k) == ki && (*index) > srclen) { (*index) -= srclen + 1; (*k)++; } else if ((*k) == ki + 1) { (*index) += adjust; } LOG((" after: k,index = %d,%d\n", (*k), (*index))); } LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); } /* * Tree transformation used in delete and split: move a subtree * left, from child ki of a node to the previous child. Update k * and index so that they still point to the same place in the * transformed tree. Assumes the destination child is not full, and * that the source child does have a subtree to spare. Can cope if * the destination child is undersized. * * . B . . C . * / \ -> / \ * a A b c C d D e [more] a A b B c d D e [more] * * . A . . B . * / \ -> / \ * a b B c C d [more] a A b c C d [more] */ static void trans234_subtree_left(node234 * n, int ki, int *k, int *index) { node234 *src, *dest; int i, adjust; src = n->kids[ki]; dest = n->kids[ki - 1]; LOG((" trans234_subtree_left(%p, %d):\n", n, ki)); LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); /* where in dest to put it */ i = (dest->elems[1] ? 2 : dest->elems[0] ? 1 : 0); dest->elems[i] = n->elems[ki - 1]; n->elems[ki - 1] = src->elems[0]; dest->kids[i + 1] = src->kids[0]; dest->counts[i + 1] = src->counts[0]; if (dest->kids[i + 1]) dest->kids[i + 1]->parent = dest; /* * Move over the rest of the source node. */ src->kids[0] = src->kids[1]; src->counts[0] = src->counts[1]; src->elems[0] = src->elems[1]; src->kids[1] = src->kids[2]; src->counts[1] = src->counts[2]; src->elems[1] = src->elems[2]; src->kids[2] = src->kids[3]; src->counts[2] = src->counts[3]; src->elems[2] = NULL; src->kids[3] = NULL; src->counts[3] = 0; adjust = dest->counts[i + 1] + 1; n->counts[ki] -= adjust; n->counts[ki - 1] += adjust; if (k) { LOG((" before: k,index = %d,%d\n", (*k), (*index))); if ((*k) == ki) { (*index) -= adjust; if ((*index) < 0) { (*index) += n->counts[ki - 1] + 1; (*k)--; } } LOG((" after: k,index = %d,%d\n", (*k), (*index))); } LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); } /* * Tree transformation used in delete and split: merge child nodes * ki and ki+1 of a node. Update k and index so that they still * point to the same place in the transformed tree. Assumes both * children _are_ sufficiently small. * * . B . . * / \ -> | * a A b c C d a A b B c C d * * This routine can also cope with either child being undersized: * * . A . . * / \ -> | * a b B c a A b B c * * . A . . * / \ -> | * a b B c C d a A b B c C d */ static void trans234_subtree_merge(node234 * n, int ki, int *k, int *index) { node234 *left, *right; int i, leftlen, rightlen, lsize, rsize; left = n->kids[ki]; leftlen = n->counts[ki]; right = n->kids[ki + 1]; rightlen = n->counts[ki + 1]; LOG((" trans234_subtree_merge(%p, %d):\n", n, ki)); LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" left %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", left, left->kids[0], left->counts[0], left->elems[0], left->kids[1], left->counts[1], left->elems[1], left->kids[2], left->counts[2], left->elems[2], left->kids[3], left->counts[3])); LOG((" right %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", right, right->kids[0], right->counts[0], right->elems[0], right->kids[1], right->counts[1], right->elems[1], right->kids[2], right->counts[2], right->elems[2], right->kids[3], right->counts[3])); assert(!left->elems[2] && !right->elems[2]); /* neither is large! */ lsize = (left->elems[1] ? 2 : left->elems[0] ? 1 : 0); rsize = (right->elems[1] ? 2 : right->elems[0] ? 1 : 0); left->elems[lsize] = n->elems[ki]; for (i = 0; i < rsize + 1; i++) { left->kids[lsize + 1 + i] = right->kids[i]; left->counts[lsize + 1 + i] = right->counts[i]; if (left->kids[lsize + 1 + i]) left->kids[lsize + 1 + i]->parent = left; if (i < rsize) left->elems[lsize + 1 + i] = right->elems[i]; } n->counts[ki] += rightlen + 1; sfree(right); /* * Move the rest of n up by one. */ for (i = ki + 1; i < 3; i++) { n->kids[i] = n->kids[i + 1]; n->counts[i] = n->counts[i + 1]; } for (i = ki; i < 2; i++) { n->elems[i] = n->elems[i + 1]; } n->kids[3] = NULL; n->counts[3] = 0; n->elems[2] = NULL; if (k) { LOG((" before: k,index = %d,%d\n", (*k), (*index))); if ((*k) == ki + 1) { (*k)--; (*index) += leftlen + 1; } else if ((*k) > ki + 1) { (*k)--; } LOG((" after: k,index = %d,%d\n", (*k), (*index))); } LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" merged %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", left, left->kids[0], left->counts[0], left->elems[0], left->kids[1], left->counts[1], left->elems[1], left->kids[2], left->counts[2], left->elems[2], left->kids[3], left->counts[3])); } /* * Delete an element e in a 2-3-4 tree. Does not free the element, * merely removes all links to it from the tree nodes. */ static void *delpos234_internal(tree234 * t, int index) { node234 *n; void *retval; int ki, i; retval = NULL; n = t->root; /* by assumption this is non-NULL */ LOG(("deleting item %d from tree %p\n", index, t)); while (1) { node234 *sub; LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d index=%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3], index)); if (index <= n->counts[0]) { ki = 0; } else if (index -= n->counts[0] + 1, index <= n->counts[1]) { ki = 1; } else if (index -= n->counts[1] + 1, index <= n->counts[2]) { ki = 2; } else if (index -= n->counts[2] + 1, index <= n->counts[3]) { ki = 3; } else { assert(0); /* can't happen */ } if (!n->kids[0]) break; /* n is a leaf node; we're here! */ /* * Check to see if we've found our target element. If so, * we must choose a new target (we'll use the old target's * successor, which will be in a leaf), move it into the * place of the old one, continue down to the leaf and * delete the old copy of the new target. */ if (index == n->counts[ki]) { node234 *m; LOG((" found element in internal node, index %d\n", ki)); assert(n->elems[ki]); /* must be a kid _before_ an element */ ki++; index = 0; for (m = n->kids[ki]; m->kids[0]; m = m->kids[0]) continue; LOG((" replacing with element \"%s\" from leaf node %p\n", m->elems[0], m)); retval = n->elems[ki - 1]; n->elems[ki - 1] = m->elems[0]; } /* * Recurse down to subtree ki. If it has only one element, * we have to do some transformation to start with. */ LOG((" moving to subtree %d\n", ki)); sub = n->kids[ki]; if (!sub->elems[1]) { LOG((" subtree has only one element!\n")); if (ki > 0 && n->kids[ki - 1]->elems[1]) { /* * Child ki has only one element, but child * ki-1 has two or more. So we need to move a * subtree from ki-1 to ki. */ trans234_subtree_right(n, ki - 1, &ki, &index); } else if (ki < 3 && n->kids[ki + 1] && n->kids[ki + 1]->elems[1]) { /* * Child ki has only one element, but ki+1 has * two or more. Move a subtree from ki+1 to ki. */ trans234_subtree_left(n, ki + 1, &ki, &index); } else { /* * ki is small with only small neighbours. Pick a * neighbour and merge with it. */ trans234_subtree_merge(n, ki > 0 ? ki - 1 : ki, &ki, &index); sub = n->kids[ki]; if (!n->elems[0]) { /* * The root is empty and needs to be * removed. */ LOG((" shifting root!\n")); t->root = sub; sub->parent = NULL; sfree(n); n = NULL; } } } if (n) n->counts[ki]--; n = sub; } /* * Now n is a leaf node, and ki marks the element number we * want to delete. We've already arranged for the leaf to be * bigger than minimum size, so let's just go to it. */ assert(!n->kids[0]); if (!retval) retval = n->elems[ki]; for (i = ki; i < 2 && n->elems[i + 1]; i++) n->elems[i] = n->elems[i + 1]; n->elems[i] = NULL; /* * It's just possible that we have reduced the leaf to zero * size. This can only happen if it was the root - so destroy * it and make the tree empty. */ if (!n->elems[0]) { LOG((" removed last element in tree, destroying empty root\n")); assert(n == t->root); sfree(n); t->root = NULL; } return retval; /* finished! */ } void *delpos234(tree234 * t, int index) { if (index < 0 || index >= countnode234(t->root)) return NULL; return delpos234_internal(t, index); } void *del234(tree234 * t, void *e) { int index; if (!findrelpos234(t, e, NULL, REL234_EQ, &index)) return NULL; /* it wasn't in there anyway */ return delpos234_internal(t, index); /* it's there; delete it. */ } /* * Join two subtrees together with a separator element between * them, given their relative height. * * (Height<0 means the left tree is shorter, >0 means the right * tree is shorter, =0 means (duh) they're equal.) * * It is assumed that any checks needed on the ordering criterion * have _already_ been done. * * The value returned in `height' is 0 or 1 depending on whether the * resulting tree is the same height as the original larger one, or * one higher. */ static node234 *join234_internal(node234 * left, void *sep, node234 * right, int *height) { node234 *root, *node; int relht = *height; int ki; LOG((" join: joining %p \"%s\" %p, relative height is %d\n", left, sep, right, relht)); if (relht == 0) { /* * The trees are the same height. Create a new one-element * root containing the separator and pointers to the two * nodes. */ node234 *newroot; newroot = mknew(node234); newroot->kids[0] = left; newroot->counts[0] = countnode234(left); newroot->elems[0] = sep; newroot->kids[1] = right; newroot->counts[1] = countnode234(right); newroot->elems[1] = NULL; newroot->kids[2] = NULL; newroot->counts[2] = 0; newroot->elems[2] = NULL; newroot->kids[3] = NULL; newroot->counts[3] = 0; newroot->parent = NULL; if (left) left->parent = newroot; if (right) right->parent = newroot; *height = 1; LOG((" join: same height, brand new root\n")); return newroot; } /* * This now works like the addition algorithm on the larger * tree. We're replacing a single kid pointer with two kid * pointers separated by an element; if that causes the node to * overload, we split it in two, move a separator element up to * the next node, and repeat. */ if (relht < 0) { /* * Left tree is shorter. Search down the right tree to find * the pointer we're inserting at. */ node = root = right; while (++relht < 0) { node = node->kids[0]; } ki = 0; right = node->kids[ki]; } else { /* * Right tree is shorter; search down the left to find the * pointer we're inserting at. */ node = root = left; while (--relht > 0) { if (node->elems[2]) node = node->kids[3]; else if (node->elems[1]) node = node->kids[2]; else node = node->kids[1]; } if (node->elems[2]) ki = 3; else if (node->elems[1]) ki = 2; else ki = 1; left = node->kids[ki]; } /* * Now proceed as for addition. */ *height = add234_insert(left, sep, right, &root, node, ki); return root; } static int height234(tree234 * t) { int level = 0; node234 *n = t->root; while (n) { level++; n = n->kids[0]; } return level; } tree234 *join234(tree234 * t1, tree234 * t2) { int size2 = countnode234(t2->root); if (size2 > 0) { void *element; int relht; if (t1->cmp) { element = index234(t2, 0); element = findrelpos234(t1, element, NULL, REL234_GE, NULL); if (element) return NULL; } element = delpos234(t2, 0); relht = height234(t1) - height234(t2); t1->root = join234_internal(t1->root, element, t2->root, &relht); t2->root = NULL; } return t1; } tree234 *join234r(tree234 * t1, tree234 * t2) { int size1 = countnode234(t1->root); if (size1 > 0) { void *element; int relht; if (t2->cmp) { element = index234(t1, size1 - 1); element = findrelpos234(t2, element, NULL, REL234_LE, NULL); if (element) return NULL; } element = delpos234(t1, size1 - 1); relht = height234(t1) - height234(t2); t2->root = join234_internal(t1->root, element, t2->root, &relht); t1->root = NULL; } return t2; } /* * Split out the first elements in a tree and return a * pointer to the root node. Leave the root node of the remainder * in t. */ static node234 *split234_internal(tree234 * t, int index) { node234 *halves[2], *n, *sib, *sub; node234 *lparent, *rparent; int ki, pki=0, i, half, lcount, rcount; n = t->root; LOG(("splitting tree %p at point %d\n", t, index)); /* * Easy special cases. After this we have also dealt completely * with the empty-tree case and we can assume the root exists. */ if (index == 0) /* return nothing */ return NULL; if (index == countnode234(t->root)) { /* return the whole tree */ node234 *ret = t->root; t->root = NULL; return ret; } /* * Search down the tree to find the split point. */ lparent = rparent = NULL; while (n) { LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d index=%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3], index)); lcount = index; rcount = countnode234(n) - lcount; if (index <= n->counts[0]) { ki = 0; } else if (index -= n->counts[0] + 1, index <= n->counts[1]) { ki = 1; } else if (index -= n->counts[1] + 1, index <= n->counts[2]) { ki = 2; } else { index -= n->counts[2] + 1; ki = 3; } LOG((" splitting at subtree %d\n", ki)); sub = n->kids[ki]; LOG((" splitting at child index %d\n", ki)); /* * Split the node, put halves[0] on the right of the left * one and halves[1] on the left of the right one, put the * new node pointers in halves[0] and halves[1], and go up * a level. */ sib = mknew(node234); for (i = 0; i < 3; i++) { if (i + ki < 3 && n->elems[i + ki]) { sib->elems[i] = n->elems[i + ki]; sib->kids[i + 1] = n->kids[i + ki + 1]; if (sib->kids[i + 1]) sib->kids[i + 1]->parent = sib; sib->counts[i + 1] = n->counts[i + ki + 1]; n->elems[i + ki] = NULL; n->kids[i + ki + 1] = NULL; n->counts[i + ki + 1] = 0; } else { sib->elems[i] = NULL; sib->kids[i + 1] = NULL; sib->counts[i + 1] = 0; } } if (lparent) { lparent->kids[pki] = n; lparent->counts[pki] = lcount; n->parent = lparent; rparent->kids[0] = sib; rparent->counts[0] = rcount; sib->parent = rparent; } else { halves[0] = n; n->parent = NULL; halves[1] = sib; sib->parent = NULL; } lparent = n; rparent = sib; pki = ki; LOG((" left node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" right node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", sib, sib->kids[0], sib->counts[0], sib->elems[0], sib->kids[1], sib->counts[1], sib->elems[1], sib->kids[2], sib->counts[2], sib->elems[2], sib->kids[3], sib->counts[3])); n = sub; } /* * We've come off the bottom here, so we've successfully split * the tree into two equally high subtrees. The only problem is * that some of the nodes down the fault line will be smaller * than the minimum permitted size. (Since this is a 2-3-4 * tree, that means they'll be zero-element one-child nodes.) */ LOG((" fell off bottom, lroot is %p, rroot is %p\n", halves[0], halves[1])); lparent->counts[pki] = rparent->counts[0] = 0; lparent->kids[pki] = rparent->kids[0] = NULL; /* * So now we go back down the tree from each of the two roots, * fixing up undersize nodes. */ for (half = 0; half < 2; half++) { /* * Remove the root if it's undersize (it will contain only * one child pointer, so just throw it away and replace it * with its child). This might happen several times. */ while (halves[half] && !halves[half]->elems[0]) { LOG((" root %p is undersize, throwing away\n", halves[half])); halves[half] = halves[half]->kids[0]; sfree(halves[half]->parent); halves[half]->parent = NULL; LOG((" new root is %p\n", halves[half])); } n = halves[half]; while (n) { void (*toward) (node234 * n, int ki, int *k, int *index); int ni, merge; /* * Now we have a potentially undersize node on the * right (if half==0) or left (if half==1). Sort it * out, by merging with a neighbour or by transferring * subtrees over. At this time we must also ensure that * nodes are bigger than minimum, in case we need an * element to merge two nodes below. */ LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); if (half == 1) { ki = 0; /* the kid we're interested in */ ni = 1; /* the neighbour */ merge = 0; /* for merge: leftmost of the two */ toward = trans234_subtree_left; } else { ki = (n->kids[3] ? 3 : n->kids[2] ? 2 : 1); ni = ki - 1; merge = ni; toward = trans234_subtree_right; } sub = n->kids[ki]; if (sub && !sub->elems[1]) { /* * This node is undersized or minimum-size. If we * can merge it with its neighbour, we do so; * otherwise we must be able to transfer subtrees * over to it until it is greater than minimum * size. */ int undersized = (!sub->elems[0]); LOG((" child %d is %ssize\n", ki, undersized ? "under" : "minimum-")); LOG((" neighbour is %s\n", n->kids[ni]->elems[2] ? "large" : n->kids[ni]->elems[1] ? "medium" : "small")); if (!n->kids[ni]->elems[1] || (undersized && !n->kids[ni]->elems[2])) { /* * Neighbour is small, or possibly neighbour is * medium and we are undersize. */ trans234_subtree_merge(n, merge, NULL, NULL); sub = n->kids[merge]; if (!n->elems[0]) { /* * n is empty, and hence must have been the * root and needs to be removed. */ assert(!n->parent); LOG((" shifting root!\n")); halves[half] = sub; halves[half]->parent = NULL; sfree(n); } } else { /* Neighbour is big enough to move trees over. */ toward(n, ni, NULL, NULL); if (undersized) toward(n, ni, NULL, NULL); } } n = sub; } } t->root = halves[1]; return halves[0]; } tree234 *splitpos234(tree234 * t, int index, int before) { tree234 *ret; node234 *n; int count; count = countnode234(t->root); if (index < 0 || index > count) return NULL; /* error */ ret = newtree234(t->cmp); n = split234_internal(t, index); if (before) { /* We want to return the ones before the index. */ ret->root = n; } else { /* * We want to keep the ones before the index and return the * ones after. */ ret->root = t->root; t->root = n; } return ret; } tree234 *split234(tree234 * t, void *e, cmpfn234 cmp, int rel) { int before; int index; assert(rel != REL234_EQ); if (rel == REL234_GT || rel == REL234_GE) { before = 1; rel = (rel == REL234_GT ? REL234_LE : REL234_LT); } else { before = 0; } if (!findrelpos234(t, e, cmp, rel, &index)) index = 0; return splitpos234(t, index + 1, before); } static node234 *copynode234(node234 * n, copyfn234 copyfn, void *copyfnstate) { int i; node234 *n2 = mknew(node234); for (i = 0; i < 3; i++) { if (n->elems[i] && copyfn) n2->elems[i] = copyfn(copyfnstate, n->elems[i]); else n2->elems[i] = n->elems[i]; } for (i = 0; i < 4; i++) { if (n->kids[i]) { n2->kids[i] = copynode234(n->kids[i], copyfn, copyfnstate); n2->kids[i]->parent = n2; } else { n2->kids[i] = NULL; } n2->counts[i] = n->counts[i]; } return n2; } tree234 *copytree234(tree234 * t, copyfn234 copyfn, void *copyfnstate) { tree234 *t2; t2 = newtree234(t->cmp); t2->root = copynode234(t->root, copyfn, copyfnstate); t2->root->parent = NULL; return t2; } #ifdef TEST /* * Test code for the 2-3-4 tree. This code maintains an alternative * representation of the data in the tree, in an array (using the * obvious and slow insert and delete functions). After each tree * operation, the verify() function is called, which ensures all * the tree properties are preserved: * - node->child->parent always equals node * - tree->root->parent always equals NULL * - number of kids == 0 or number of elements + 1; * - tree has the same depth everywhere * - every node has at least one element * - subtree element counts are accurate * - any NULL kid pointer is accompanied by a zero count * - in a sorted tree: ordering property between elements of a * node and elements of its children is preserved * and also ensures the list represented by the tree is the same * list it should be. (This last check also doubly verifies the * ordering properties, because the `same list it should be' is by * definition correctly ordered. It also ensures all nodes are * distinct, because the enum functions would get caught in a loop * if not.) */ #include #define srealloc realloc /* * Error reporting function. */ void error(char *fmt, ...) { va_list ap; printf("ERROR: "); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); printf("\n"); } /* The array representation of the data. */ void **array; int arraylen, arraysize; cmpfn234 cmp; /* The tree representation of the same data. */ tree234 *tree; /* * Routines to provide a diagnostic printout of a tree. Currently * relies on every element in the tree being a one-character string * :-) */ typedef struct { char **levels; } dispctx; int dispnode(node234 * n, int level, dispctx * ctx) { if (level == 0) { int xpos = strlen(ctx->levels[0]); int len; if (n->elems[2]) len = sprintf(ctx->levels[0] + xpos, " %s%s%s", n->elems[0], n->elems[1], n->elems[2]); else if (n->elems[1]) len = sprintf(ctx->levels[0] + xpos, " %s%s", n->elems[0], n->elems[1]); else len = sprintf(ctx->levels[0] + xpos, " %s", n->elems[0]); return xpos + 1 + (len - 1) / 2; } else { int xpos[4], nkids; int nodelen, mypos, myleft, x, i; xpos[0] = dispnode(n->kids[0], level - 3, ctx); xpos[1] = dispnode(n->kids[1], level - 3, ctx); nkids = 2; if (n->kids[2]) { xpos[2] = dispnode(n->kids[2], level - 3, ctx); nkids = 3; } if (n->kids[3]) { xpos[3] = dispnode(n->kids[3], level - 3, ctx); nkids = 4; } if (nkids == 4) mypos = (xpos[1] + xpos[2]) / 2; else if (nkids == 3) mypos = xpos[1]; else mypos = (xpos[0] + xpos[1]) / 2; nodelen = nkids * 2 - 1; myleft = mypos - ((nodelen - 1) / 2); assert(myleft >= xpos[0]); assert(myleft + nodelen - 1 <= xpos[nkids - 1]); x = strlen(ctx->levels[level]); while (x <= xpos[0] && x < myleft) ctx->levels[level][x++] = ' '; while (x < myleft) ctx->levels[level][x++] = '_'; if (nkids == 4) x += sprintf(ctx->levels[level] + x, ".%s.%s.%s.", n->elems[0], n->elems[1], n->elems[2]); else if (nkids == 3) x += sprintf(ctx->levels[level] + x, ".%s.%s.", n->elems[0], n->elems[1]); else x += sprintf(ctx->levels[level] + x, ".%s.", n->elems[0]); while (x < xpos[nkids - 1]) ctx->levels[level][x++] = '_'; ctx->levels[level][x] = '\0'; x = strlen(ctx->levels[level - 1]); for (i = 0; i < nkids; i++) { int rpos, pos; rpos = xpos[i]; if (i > 0 && i < nkids - 1) pos = myleft + 2 * i; else pos = rpos; if (rpos < pos) rpos++; while (x < pos && x < rpos) ctx->levels[level - 1][x++] = ' '; if (x == pos) ctx->levels[level - 1][x++] = '|'; while (x < pos || x < rpos) ctx->levels[level - 1][x++] = '_'; if (x == pos) ctx->levels[level - 1][x++] = '|'; } ctx->levels[level - 1][x] = '\0'; x = strlen(ctx->levels[level - 2]); for (i = 0; i < nkids; i++) { int rpos = xpos[i]; while (x < rpos) ctx->levels[level - 2][x++] = ' '; ctx->levels[level - 2][x++] = '|'; } ctx->levels[level - 2][x] = '\0'; return mypos; } } void disptree(tree234 * t) { dispctx ctx; char *leveldata; int width = count234(t); int ht = height234(t) * 3 - 2; int i; if (!t->root) { printf("[empty tree]\n"); } leveldata = smalloc(ht * (width + 2)); ctx.levels = smalloc(ht * sizeof(char *)); for (i = 0; i < ht; i++) { ctx.levels[i] = leveldata + i * (width + 2); ctx.levels[i][0] = '\0'; } (void) dispnode(t->root, ht - 1, &ctx); for (i = ht; i--;) printf("%s\n", ctx.levels[i]); sfree(ctx.levels); sfree(leveldata); } typedef struct { int treedepth; int elemcount; } chkctx; int chknode(chkctx * ctx, int level, node234 * node, void *lowbound, void *highbound) { int nkids, nelems; int i; int count; /* Count the non-NULL kids. */ for (nkids = 0; nkids < 4 && node->kids[nkids]; nkids++); /* Ensure no kids beyond the first NULL are non-NULL. */ for (i = nkids; i < 4; i++) if (node->kids[i]) { error("node %p: nkids=%d but kids[%d] non-NULL", node, nkids, i); } else if (node->counts[i]) { error("node %p: kids[%d] NULL but count[%d]=%d nonzero", node, i, i, node->counts[i]); } /* Count the non-NULL elements. */ for (nelems = 0; nelems < 3 && node->elems[nelems]; nelems++); /* Ensure no elements beyond the first NULL are non-NULL. */ for (i = nelems; i < 3; i++) if (node->elems[i]) { error("node %p: nelems=%d but elems[%d] non-NULL", node, nelems, i); } if (nkids == 0) { /* * If nkids==0, this is a leaf node; verify that the tree * depth is the same everywhere. */ if (ctx->treedepth < 0) ctx->treedepth = level; /* we didn't know the depth yet */ else if (ctx->treedepth != level) error("node %p: leaf at depth %d, previously seen depth %d", node, level, ctx->treedepth); } else { /* * If nkids != 0, then it should be nelems+1, unless nelems * is 0 in which case nkids should also be 0 (and so we * shouldn't be in this condition at all). */ int shouldkids = (nelems ? nelems + 1 : 0); if (nkids != shouldkids) { error("node %p: %d elems should mean %d kids but has %d", node, nelems, shouldkids, nkids); } } /* * nelems should be at least 1. */ if (nelems == 0) { error("node %p: no elems", node, nkids); } /* * Add nelems to the running element count of the whole tree. */ ctx->elemcount += nelems; /* * Check ordering property: all elements should be strictly > * lowbound, strictly < highbound, and strictly < each other in * sequence. (lowbound and highbound are NULL at edges of tree * - both NULL at root node - and NULL is considered to be < * everything and > everything. IYSWIM.) */ if (cmp) { for (i = -1; i < nelems; i++) { void *lower = (i == -1 ? lowbound : node->elems[i]); void *higher = (i + 1 == nelems ? highbound : node->elems[i + 1]); if (lower && higher && cmp(lower, higher) >= 0) { error("node %p: kid comparison [%d=%s,%d=%s] failed", node, i, lower, i + 1, higher); } } } /* * Check parent pointers: all non-NULL kids should have a * parent pointer coming back to this node. */ for (i = 0; i < nkids; i++) if (node->kids[i]->parent != node) { error("node %p kid %d: parent ptr is %p not %p", node, i, node->kids[i]->parent, node); } /* * Now (finally!) recurse into subtrees. */ count = nelems; for (i = 0; i < nkids; i++) { void *lower = (i == 0 ? lowbound : node->elems[i - 1]); void *higher = (i >= nelems ? highbound : node->elems[i]); int subcount = chknode(ctx, level + 1, node->kids[i], lower, higher); if (node->counts[i] != subcount) { error("node %p kid %d: count says %d, subtree really has %d", node, i, node->counts[i], subcount); } count += subcount; } return count; } void verifytree(tree234 * tree, void **array, int arraylen) { chkctx ctx; int i; void *p; ctx.treedepth = -1; /* depth unknown yet */ ctx.elemcount = 0; /* no elements seen yet */ /* * Verify validity of tree properties. */ if (tree->root) { if (tree->root->parent != NULL) error("root->parent is %p should be null", tree->root->parent); chknode(&ctx, 0, tree->root, NULL, NULL); } printf("tree depth: %d\n", ctx.treedepth); /* * Enumerate the tree and ensure it matches up to the array. */ for (i = 0; NULL != (p = index234(tree, i)); i++) { if (i >= arraylen) error("tree contains more than %d elements", arraylen); if (array[i] != p) error("enum at position %d: array says %s, tree says %s", i, array[i], p); } if (ctx.elemcount != i) { error("tree really contains %d elements, enum gave %d", ctx.elemcount, i); } if (i < arraylen) { error("enum gave only %d elements, array has %d", i, arraylen); } i = count234(tree); if (ctx.elemcount != i) { error("tree really contains %d elements, count234 gave %d", ctx.elemcount, i); } } void verify(void) { verifytree(tree, array, arraylen); } void internal_addtest(void *elem, int index, void *realret) { int i, j; void *retval; if (arraysize < arraylen + 1) { arraysize = arraylen + 1 + 256; array = (array == NULL ? smalloc(arraysize * sizeof(*array)) : srealloc(array, arraysize * sizeof(*array))); } i = index; /* now i points to the first element >= elem */ retval = elem; /* expect elem returned (success) */ for (j = arraylen; j > i; j--) array[j] = array[j - 1]; array[i] = elem; /* add elem to array */ arraylen++; if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } verify(); } void addtest(void *elem) { int i; void *realret; realret = add234(tree, elem); i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; if (i < arraylen && !cmp(elem, array[i])) { void *retval = array[i]; /* expect that returned not elem */ if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } } else internal_addtest(elem, i, realret); } void addpostest(void *elem, int i) { void *realret; realret = addpos234(tree, elem, i); internal_addtest(elem, i, realret); } void delpostest(int i) { int index = i; void *elem = array[i], *ret; /* i points to the right element */ while (i < arraylen - 1) { array[i] = array[i + 1]; i++; } arraylen--; /* delete elem from array */ if (tree->cmp) ret = del234(tree, elem); else ret = delpos234(tree, index); if (ret != elem) { error("del returned %p, expected %p", ret, elem); } verify(); } void deltest(void *elem) { int i; i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; if (i >= arraylen || cmp(elem, array[i]) != 0) return; /* don't do it! */ delpostest(i); } /* A sample data set and test utility. Designed for pseudo-randomness, * and yet repeatability. */ /* * This random number generator uses the `portable implementation' * given in ANSI C99 draft N869. It assumes `unsigned' is 32 bits; * change it if not. */ int randomnumber(unsigned *seed) { *seed *= 1103515245; *seed += 12345; return ((*seed) / 65536) % 32768; } int mycmp(void *av, void *bv) { char const *a = (char const *) av; char const *b = (char const *) bv; return strcmp(a, b); } #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) char *strings[] = { "0", "2", "3", "I", "K", "d", "H", "J", "Q", "N", "n", "q", "j", "i", "7", "G", "F", "D", "b", "x", "g", "B", "e", "v", "V", "T", "f", "E", "S", "8", "A", "k", "X", "p", "C", "R", "a", "o", "r", "O", "Z", "u", "6", "1", "w", "L", "P", "M", "c", "U", "h", "9", "t", "5", "W", "Y", "m", "s", "l", "4", #if 0 "a", "ab", "absque", "coram", "de", "palam", "clam", "cum", "ex", "e", "sine", "tenus", "pro", "prae", "banana", "carrot", "cabbage", "broccoli", "onion", "zebra", "penguin", "blancmange", "pangolin", "whale", "hedgehog", "giraffe", "peanut", "bungee", "foo", "bar", "baz", "quux", "murfl", "spoo", "breen", "flarn", "octothorpe", "snail", "tiger", "elephant", "octopus", "warthog", "armadillo", "aardvark", "wyvern", "dragon", "elf", "dwarf", "orc", "goblin", "pixie", "basilisk", "warg", "ape", "lizard", "newt", "shopkeeper", "wand", "ring", "amulet" #endif }; #define NSTR lenof(strings) void findtest(void) { static const int rels[] = { REL234_EQ, REL234_GE, REL234_LE, REL234_LT, REL234_GT }; static const char *const relnames[] = { "EQ", "GE", "LE", "LT", "GT" }; int i, j, rel, index; char *p, *ret, *realret, *realret2; int lo, hi, mid, c; for (i = 0; i < (int) NSTR; i++) { p = strings[i]; for (j = 0; j < (int) (sizeof(rels) / sizeof(*rels)); j++) { rel = rels[j]; lo = 0; hi = arraylen - 1; while (lo <= hi) { mid = (lo + hi) / 2; c = strcmp(p, array[mid]); if (c < 0) hi = mid - 1; else if (c > 0) lo = mid + 1; else break; } if (c == 0) { if (rel == REL234_LT) ret = (mid > 0 ? array[--mid] : NULL); else if (rel == REL234_GT) ret = (mid < arraylen - 1 ? array[++mid] : NULL); else ret = array[mid]; } else { assert(lo == hi + 1); if (rel == REL234_LT || rel == REL234_LE) { mid = hi; ret = (hi >= 0 ? array[hi] : NULL); } else if (rel == REL234_GT || rel == REL234_GE) { mid = lo; ret = (lo < arraylen ? array[lo] : NULL); } else ret = NULL; } realret = findrelpos234(tree, p, NULL, rel, &index); if (realret != ret) { error("find(\"%s\",%s) gave %s should be %s", p, relnames[j], realret, ret); } if (realret && index != mid) { error("find(\"%s\",%s) gave %d should be %d", p, relnames[j], index, mid); } if (realret && rel == REL234_EQ) { realret2 = index234(tree, index); if (realret2 != realret) { error("find(\"%s\",%s) gave %s(%d) but %d -> %s", p, relnames[j], realret, index, index, realret2); } } #if 0 printf("find(\"%s\",%s) gave %s(%d)\n", p, relnames[j], realret, index); #endif } } realret = findrelpos234(tree, NULL, NULL, REL234_GT, &index); if (arraylen && (realret != array[0] || index != 0)) { error("find(NULL,GT) gave %s(%d) should be %s(0)", realret, index, array[0]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,GT) gave %s(%d) should be NULL", realret, index); } realret = findrelpos234(tree, NULL, NULL, REL234_LT, &index); if (arraylen && (realret != array[arraylen - 1] || index != arraylen - 1)) { error("find(NULL,LT) gave %s(%d) should be %s(0)", realret, index, array[arraylen - 1]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,LT) gave %s(%d) should be NULL", realret, index); } } void splittest(tree234 * tree, void **array, int arraylen) { int i; tree234 *tree3, *tree4; for (i = 0; i <= arraylen; i++) { tree3 = copytree234(tree, NULL, NULL); tree4 = splitpos234(tree3, i, 0); verifytree(tree3, array, i); verifytree(tree4, array + i, arraylen - i); join234(tree3, tree4); freetree234(tree4); /* left empty by join */ verifytree(tree3, array, arraylen); freetree234(tree3); } } int main(void) { int in[NSTR]; int i, j, k; int tworoot, tmplen; unsigned seed = 0; tree234 *tree2, *tree3, *tree4; int c; setvbuf(stdout, NULL, _IOLBF, 0); for (i = 0; i < (int) NSTR; i++) in[i] = 0; array = NULL; arraylen = arraysize = 0; tree = newtree234(mycmp); cmp = mycmp; verify(); for (i = 0; i < 10000; i++) { j = randomnumber(&seed); j %= NSTR; printf("trial: %d\n", i); if (in[j]) { printf("deleting %s (%d)\n", strings[j], j); deltest(strings[j]); in[j] = 0; } else { printf("adding %s (%d)\n", strings[j], j); addtest(strings[j]); in[j] = 1; } disptree(tree); findtest(); } while (arraylen > 0) { j = randomnumber(&seed); j %= arraylen; deltest(array[j]); } freetree234(tree); /* * Now try an unsorted tree. We don't really need to test * delpos234 because we know del234 is based on it, so it's * already been tested in the above sorted-tree code; but for * completeness we'll use it to tear down our unsorted tree * once we've built it. */ tree = newtree234(NULL); cmp = NULL; verify(); for (i = 0; i < 1000; i++) { printf("trial: %d\n", i); j = randomnumber(&seed); j %= NSTR; k = randomnumber(&seed); k %= count234(tree) + 1; printf("adding string %s at index %d\n", strings[j], k); addpostest(strings[j], k); } /* * While we have this tree in its full form, we'll take a copy * of it to use in split and join testing. */ tree2 = copytree234(tree, NULL, NULL); verifytree(tree2, array, arraylen); /* check the copy is accurate */ /* * Split tests. Split the tree at every possible point and * check the resulting subtrees. */ tworoot = (!tree2->root->elems[1]); /* see if it has a 2-root */ splittest(tree2, array, arraylen); /* * Now do the split test again, but on a tree that has a 2-root * (if the previous one didn't) or doesn't (if the previous one * did). */ tmplen = arraylen; while ((!tree2->root->elems[1]) == tworoot) { delpos234(tree2, --tmplen); } printf("now trying splits on second tree\n"); splittest(tree2, array, tmplen); freetree234(tree2); /* * Back to the main testing of uncounted trees. */ while (count234(tree) > 0) { printf("cleanup: tree size %d\n", count234(tree)); j = randomnumber(&seed); j %= count234(tree); printf("deleting string %s from index %d\n", (char *) array[j], j); delpostest(j); } freetree234(tree); /* * Finally, do some testing on split/join on _sorted_ trees. At * the same time, we'll be testing split on very small trees. */ tree = newtree234(mycmp); cmp = mycmp; arraylen = 0; for (i = 0; i < 16; i++) { addtest(strings[i]); tree2 = copytree234(tree, NULL, NULL); splittest(tree2, array, arraylen); freetree234(tree2); } freetree234(tree); /* * Test silly cases of join: join(emptytree, emptytree), and * also ensure join correctly spots when sorted trees fail the * ordering constraint. */ tree = newtree234(mycmp); tree2 = newtree234(mycmp); tree3 = newtree234(mycmp); tree4 = newtree234(mycmp); assert(mycmp(strings[0], strings[1]) < 0); /* just in case :-) */ add234(tree2, strings[1]); add234(tree4, strings[0]); array[0] = strings[0]; array[1] = strings[1]; verifytree(tree, array, 0); verifytree(tree2, array + 1, 1); verifytree(tree3, array, 0); verifytree(tree4, array, 1); /* * So: * - join(tree,tree3) should leave both tree and tree3 unchanged. * - joinr(tree,tree2) should leave both tree and tree2 unchanged. * - join(tree4,tree3) should leave both tree3 and tree4 unchanged. * - join(tree, tree2) should move the element from tree2 to tree. * - joinr(tree4, tree3) should move the element from tree4 to tree3. * - join(tree,tree3) should return NULL and leave both unchanged. * - join(tree3,tree) should work and create a bigger tree in tree3. */ assert(tree == join234(tree, tree3)); verifytree(tree, array, 0); verifytree(tree3, array, 0); assert(tree2 == join234r(tree, tree2)); verifytree(tree, array, 0); verifytree(tree2, array + 1, 1); assert(tree4 == join234(tree4, tree3)); verifytree(tree3, array, 0); verifytree(tree4, array, 1); assert(tree == join234(tree, tree2)); verifytree(tree, array + 1, 1); verifytree(tree2, array, 0); assert(tree3 == join234r(tree4, tree3)); verifytree(tree3, array, 1); verifytree(tree4, array, 0); assert(NULL == join234(tree, tree3)); verifytree(tree, array + 1, 1); verifytree(tree3, array, 1); assert(tree3 == join234(tree3, tree)); verifytree(tree3, array, 2); verifytree(tree, array, 0); return 0; } #endif #if 0 /* sorted list of strings might be useful */ { "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",} #endif nsis-3.11/Docs/src/bin/halibut/tree234.h000077500000000000000000000161631477201124000176420ustar00rootroot00000000000000/* * tree234.h: header defining functions in tree234.c. * * This file is copyright 1999-2001 Simon Tatham. * * 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 SIMON TATHAM 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 TREE234_H #define TREE234_H /* * This typedef is opaque outside tree234.c itself. */ typedef struct tree234_Tag tree234; typedef int (*cmpfn234) (void *, void *); typedef void *(*copyfn234) (void *state, void *element); /* * Create a 2-3-4 tree. If `cmp' is NULL, the tree is unsorted, and * lookups by key will fail: you can only look things up by numeric * index, and you have to use addpos234() and delpos234(). */ tree234 *newtree234(cmpfn234 cmp); /* * Free a 2-3-4 tree (not including freeing the elements). */ void freetree234(tree234 * t); /* * Add an element e to a sorted 2-3-4 tree t. Returns e on success, * or if an existing element compares equal, returns that. */ void *add234(tree234 * t, void *e); /* * Add an element e to an unsorted 2-3-4 tree t. Returns e on * success, NULL on failure. (Failure should only occur if the * index is out of range or the tree is sorted.) * * Index range can be from 0 to the tree's current element count, * inclusive. */ void *addpos234(tree234 * t, void *e, int index); /* * Look up the element at a given numeric index in a 2-3-4 tree. * Returns NULL if the index is out of range. * * One obvious use for this function is in iterating over the whole * of a tree (sorted or unsorted): * * for (i = 0; (p = index234(tree, i)) != NULL; i++) consume(p); * * or * * int maxcount = count234(tree); * for (i = 0; i < maxcount; i++) { * p = index234(tree, i); * assert(p != NULL); * consume(p); * } */ void *index234(tree234 * t, int index); /* * Find an element e in a sorted 2-3-4 tree t. Returns NULL if not * found. e is always passed as the first argument to cmp, so cmp * can be an asymmetric function if desired. cmp can also be passed * as NULL, in which case the compare function from the tree proper * will be used. * * Three of these functions are special cases of findrelpos234. The * non-`pos' variants lack the `index' parameter: if the parameter * is present and non-NULL, it must point to an integer variable * which will be filled with the numeric index of the returned * element. * * The non-`rel' variants lack the `relation' parameter. This * parameter allows you to specify what relation the element you * provide has to the element you're looking for. This parameter * can be: * * REL234_EQ - find only an element that compares equal to e * REL234_LT - find the greatest element that compares < e * REL234_LE - find the greatest element that compares <= e * REL234_GT - find the smallest element that compares > e * REL234_GE - find the smallest element that compares >= e * * Non-`rel' variants assume REL234_EQ. * * If `rel' is REL234_GT or REL234_LT, the `e' parameter may be * NULL. In this case, REL234_GT will return the smallest element * in the tree, and REL234_LT will return the greatest. This gives * an alternative means of iterating over a sorted tree, instead of * using index234: * * // to loop forwards * for (p = NULL; (p = findrel234(tree, p, NULL, REL234_GT)) != NULL ;) * consume(p); * * // to loop backwards * for (p = NULL; (p = findrel234(tree, p, NULL, REL234_LT)) != NULL ;) * consume(p); */ enum { REL234_EQ, REL234_LT, REL234_LE, REL234_GT, REL234_GE }; void *find234(tree234 * t, void *e, cmpfn234 cmp); void *findrel234(tree234 * t, void *e, cmpfn234 cmp, int relation); void *findpos234(tree234 * t, void *e, cmpfn234 cmp, int *index); void *findrelpos234(tree234 * t, void *e, cmpfn234 cmp, int relation, int *index); /* * Delete an element e in a 2-3-4 tree. Does not free the element, * merely removes all links to it from the tree nodes. * * delpos234 deletes the element at a particular tree index: it * works on both sorted and unsorted trees. * * del234 deletes the element passed to it, so it only works on * sorted trees. (It's equivalent to using findpos234 to determine * the index of an element, and then passing that index to * delpos234.) * * Both functions return a pointer to the element they delete, for * the user to free or pass on elsewhere or whatever. If the index * is out of range (delpos234) or the element is already not in the * tree (del234) then they return NULL. */ void *del234(tree234 * t, void *e); void *delpos234(tree234 * t, int index); /* * Return the total element count of a tree234. */ int count234(tree234 * t); /* * Split a tree234 into two valid tree234s. * * splitpos234 splits at a given index. If `before' is TRUE, the * items at and after that index are left in t and the ones before * are returned; if `before' is FALSE, the items before that index * are left in t and the rest are returned. * * split234 splits at a given key. You can pass any of the * relations used with findrel234, except for REL234_EQ. The items * in the tree that satisfy the relation are returned; the * remainder are left. */ tree234 *splitpos234(tree234 * t, int index, int before); tree234 *split234(tree234 * t, void *e, cmpfn234 cmp, int rel); /* * Join two tree234s together into a single one. * * All the elements in t1 are placed to the left of all the * elements in t2. If the trees are sorted, there will be a test to * ensure that this satisfies the ordering criterion, and NULL will * be returned otherwise. If the trees are unsorted, there is no * restriction on the use of join234. * * The tree returned is t1 (join234) or t2 (join234r), if the * operation is successful. */ tree234 *join234(tree234 * t1, tree234 * t2); tree234 *join234r(tree234 * t1, tree234 * t2); /* * Make a complete copy of a tree234. Element pointers will be * reused unless copyfn is non-NULL, in which case it will be used * to copy each element. (copyfn takes two `void *' parameters; the * first is private state and the second is the element. A simple * copy routine probably won't need private state.) */ tree234 *copytree234(tree234 * t, copyfn234 copyfn, void *copyfnstate); #endif /* TREE234_H */ nsis-3.11/Docs/src/bin/halibut/ustring.c000077500000000000000000000104361477201124000201350ustar00rootroot00000000000000/* * ustring.c: Unicode string routines */ #include "halibut.h" #include #include #include static void asciitou(wchar_t *dest, const char *src) { for (;;) if (!(*dest++ = *src++)) break; } wchar_t *ustrdup(const wchar_t * s) { wchar_t *r; if (s) { r = mknewa(wchar_t, 1 + ustrlen(s)); ustrcpy(r, s); } else { r = mknew(wchar_t); *r = 0; } return r; } wchar_t *ustrreplacedup(wchar_t **dest, const wchar_t *src) { sfree(*dest); return *dest = ustrdup(src); } char *ustrtoa(const wchar_t * s, char *outbuf, int size) { char *p; if (!s) { *outbuf = '\0'; return outbuf; } for (p = outbuf; *s && p < outbuf + size; p++, s++) *p = *(char*)s; if (p < outbuf + size) *p = '\0'; else outbuf[size - 1] = '\0'; return outbuf; } int ustrlen(const wchar_t * s) { int len = 0; while (*s++) len++; return len; } wchar_t *uadv(const wchar_t * s) { return ((wchar_t*) s) + 1 + ustrlen(s); } wchar_t *ustrcpy(wchar_t * dest, const wchar_t * source) { wchar_t *ret = dest; do { *dest++ = *source; } while (*source++); return ret; } int ustrcmp(const wchar_t * lhs, const wchar_t * rhs) { if (!lhs && !rhs) return 0; if (!lhs) return -1; if (!rhs) return +1; while (*lhs && *rhs && *lhs == *rhs) lhs++, rhs++; if (*lhs < *rhs) return -1; else if (*lhs > *rhs) return 1; return 0; } wchar_t utolower(wchar_t c) { if (c == L'\0') return c; /* this property needed by ustricmp */ /* FIXME: this doesn't even come close */ if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; return c; } int ustricmp(const wchar_t * lhs, const wchar_t * rhs) { wchar_t lc, rc; while ((lc = utolower(*lhs)) == (rc = utolower(*rhs)) && lc && rc) lhs++, rhs++; if (!lc && !rc) return 0; if (lc < rc) return -1; else return 1; } wchar_t *ustrlow(wchar_t * s) { wchar_t *p = s; while (*p) { *p = utolower(*p); p++; } return s; } void ultou(unsigned long v, wchar_t *o) { char buf[42]; sprintf(buf, "%lu", v); asciitou(o, buf); } int utoi(const wchar_t *s) { int sign = +1; int n; if (*s == L'-') { s++; sign = -1; } n = 0; while (*s && *s >= L'0' && *s <= L'9') { n *= 10; n += (*s - '0'); s++; } return n * sign; } int utob(const wchar_t * s) { if (!ustricmp(s, L"yes") || !ustricmp(s, L"y") || !ustricmp(s, L"true") || !ustricmp(s, L"t")) return TRUE; return FALSE; } int uisdigit(wchar_t c) { return c >= L'0' && c <= L'9'; } #define USTRFTIME_DELTA 128 wchar_t *ustrftime(wchar_t * wfmt, struct tm * timespec) { void *blk = NULL; wchar_t *wblk, *wp; char *fmt, *text, *p; size_t size = 0; size_t len; /* * strftime has the entertaining property that it returns 0 * _either_ on out-of-space _or_ on successful generation of * the empty string. Hence we must ensure our format can never * generate the empty string. Somebody throw a custard pie at * whoever was responsible for that. Please? */ if (wfmt) { len = ustrlen(wfmt); fmt = mknewa(char, 2 + len); ustrtoa(wfmt, fmt + 1, len + 1); fmt[0] = ' '; } else fmt = " %c"; while (1) { size += USTRFTIME_DELTA; blk = resize((char *) blk, size); len = strftime((char *) blk, size - 1, fmt, timespec); if (len > 0) break; } /* Note: +1 for the terminating 0, -1 for the initial space in fmt */ wblk = resize((wchar_t *) blk, len); text = mknewa(char, len); strftime(text, len, fmt + 1, timespec); /* * We operate in the C locale, so this all ought to be kosher * ASCII. If we ever move outside ASCII machines, we may need * to make this more portable... */ for (wp = wblk, p = text; *p; p++, wp++) *wp = *p; *wp = 0; if (wfmt) sfree(fmt); sfree(text); return wblk; } ustr_slist* ustr_slist_append(ustr_slist**headaddr, const wchar_t*str) { size_t cch = ustrlen(str) + 1; size_t cb = sizeof(ustr_slist) + (cch * sizeof(wchar_t)); ustr_slist *p = (ustr_slist*) mknewa(char, cb), *walk; if (p) { ustrcpy(p->string, str); p->next = NULL; for (walk = *headaddr; walk; walk = walk->next) if (!walk->next) walk->next = p, walk = p; if (!*headaddr) *headaddr = p; } return p; } nsis-3.11/Docs/src/bin/halibut/version.c000077500000000000000000000016371477201124000201320ustar00rootroot00000000000000/* * version.c: version string */ #include #include #include #ifndef VERSION #define VER "anonymous build (" __DATE__ " " __TIME__ ")" #else #define VER "version " VERSION #endif #define VERSTRFMT "v1.0 (NSIS Custom Build, %s)" #define VERSTRSCMREVMAX 20 static char versionbuf[sizeof(VERSTRFMT)-2+VERSTRSCMREVMAX]; const char *const version = versionbuf; void initversionstring(void) { char scmverbuf[VERSTRSCMREVMAX+1]; int cchsvnrev = 0; /* SCM trigger 20211223 */ const char*svnproprev = "$Revision: 7347 $"; if ('$' == *svnproprev++) { const char*p; while('$' != *svnproprev && !isdigit(*svnproprev)) svnproprev++; for (p = svnproprev; isdigit(*p); ++p) cchsvnrev++; } if (!cchsvnrev) { cchsvnrev = 1; svnproprev = "?"; } strcpy(scmverbuf, "SVN:r"); strncat(scmverbuf, svnproprev, cchsvnrev); sprintf(versionbuf,VERSTRFMT,scmverbuf); } nsis-3.11/Docs/src/build.but000077500000000000000000000205501477201124000157070ustar00rootroot00000000000000\A{build} Building NSIS NSIS version 2.07 introduced a new build system, based on \W{http://www.scons.org/}{SCons}. The build system can build the entire NSIS package so you no longer need to build it project by project. It allows building using several simultaneous jobs, installation without an installer on both Windows and POSIX and easy compilation with debugging symbols. \#{ MSVC6.SP5 direct link: http://web.archive.org/web/20060509123628/http://download.microsoft.com/download/vstudio60ent/SP5/Wideband-Full/WIN98Me/EN-US/vs6sp5.exe } The official release is built with MSVC6 \W{http://web.archive.org/web/20060509123628/http://msdn2.microsoft.com/en-us/vstudio/aa718363.aspx}{Service Pack 5} \W{http://dl.dropbox.com/u/20029891/vs6sp5.exe}{(Mirror)} with the \W{http://wayback.archive.org/web/20100923113933/http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx}{Processor Pack} and the February 2003 Platform SDK (5.2.3790.0). For recent versions of Windows you may need to follow \W{https://www.codeproject.com/Articles/1191047/Install-Visual-Studio-on-Windows}{special instructions} to install VC6. For recent versions of SCons to work with VC6, use \c{scons TOOLSET=msvc,mssdk,mslink,mslib,masm} or you may get compile errors about \c{GetWindowLongPtr} or missing symbols in libraries. \H{build_general} Building in General Source code is available in \W{http://nsis.svn.sourceforge.net/viewvc/nsis/}{SVN} and as a separate package with every \W{http://sourceforge.net/project/showfiles.php?group_id=22049}{NSIS distribution}. To build NSIS, \W{http://www.python.org/}{Python} and \W{http://www.scons.org/}{SCons} must be installed. Currently, the supported version of SCons is version 1.2.0 and above. Any version of Python 2.7 and above is supported. NSIS uses the \W{http://zlib.net}{zlib} compression library. As a consequence the header and library files of zlib must be installed. In case these zlib development files aren't present then they could be installed via a package manager (apt-get, aptitude, rpm, yum) on POSIX platforms. Another option is to build zlib from scratch and install it. For Windows it is recommended to download \W{http://zlib.net}{zlib} from \W{http://nsis.sf.net/Zlib}{http://nsis.sf.net/Zlib}. Extract the contents of this zip archive to a folder of your choice, e.g. \c{C:\\dev\\zlib-1.2.7} and set an environment variable named \c{ZLIB_W32} containing this path. \c C:\>set ZLIB_W32=C:\dev\zlib-1.2.7 Alternatively the command line option ZLIB_W32 specifying the path can be passed to scons instead of the environment variable. \c C:\dev\nsis>scons ZLIB_W32=C:\dev\zlib-1.2.7 The header and library files are assumed to be in %ZLIB_W32%. In addition scons checks for zlib header files in %ZLIB_W32%\\include, the import library zdll.lib in %ZLIB_W32%\\lib and the dynamic link library zlib1.dll in %ZLIB_W32% respectively %ZLIB_W32%\\lib. \cw{SOURCE_DATE_EPOCH} must be set to create reproducible builds. \cw{makensis /hdrinfo} will list \cw{NSIS_SOURCE_DATE_EPOCH} with the epoch if applicable. To build, open a console, change the working directory to the root directory of NSIS and type \c{scons}. That's it. For example: \c C:\>cd dev\nsis \c C:\dev\nsis>scons \c scons: Reading SConscript files ... \c Using Microsoft tools configuration \c Checking for main() in C library gdi32... (cached) yes \c Checking for main() in C library user32... (cached) yes \c Checking for main() in C library version... (cached) yes \c Checking for main() in C library pthread... (cached) no \c Checking for main() in C library stdc++... (cached) no \c Checking for main() in C library iconv... (cached) no \c Checking for main() in C library libiconv... (cached) no \c scons: done reading SConscript files. \c scons: Building targets ... \c ... To install the built files, type: \c scons PREFIX="C:\Program Files\NSIS" install To create an installer (only on Windows), type: \c scons dist-installer To create a distribution zip file, type: \c scons dist-zip To create both, type: \c scons dist To get a complete list of options that the build system has to offer, type: \c scons -h To get a complete list of options SCons has to offer, type: \c scons -H \H{build_windows} Building on Windows SCons will automatically detect Microsoft Visual C++. If you are looking for a free compiler to compile NSIS, we recommend \W{http://wayback.archive.org/web/20080409141506/http://www.microsoft.com/express/2005/download/offline.aspx}{Microsoft Visual C++ 2005 Express Edition}. When using the Microsoft Visual C++ Toolkit 2003, add MSTOOLKIT=yes to the build command line: \c scons MSTOOLKIT=yes In case of errors about the compiler or the Platform SDK not being found, use: \c set MSSDK=C:\Path\To\Platform SDK \c set VCToolkitInstallDir=C:\Path\To\VCToolkit \c scons MSTOOLKIT=yes The open-source \W{http://www.mingw.org/}{MinGW} can also be used to for building but this results in noticeably larger installers. Borland C++ or Open Watcom C/C++ might also work, but haven't been tested. To compile the documentation as a CHM file, hhc.exe must be in the PATH. It is available as part of \W{http://wayback.archive.org/web/20121021033631/http://msdn.microsoft.com/en-us/library/ms669985}{HTML Help Workshop}. To build NSIS Menu, install \W{http://www.wxwidgets.org/}{wxWidgets 2.8}, create an environment variable named \c{WXWIN} containing the path to the installation directory of wxWidgets, run \c{Contrib\\NSIS Menu\\wx\\wxbuild.bat} and build NSIS as usual. \\Important notes for Microsoft Visual C++ 6.0 users:\\ The 2003 Platform SDK must be installed before building, you can download it \W{http://groups.google.com/group/microsoft.public.platformsdk.sdk_install/msg/087b0178f5d8159e}{here} or \W{http://go.microsoft.com/fwlink/?LinkId=48615}{order it on CD}. Because of flaws in the libraries distributed with Microsoft Visual C++ 6.0, not installing the Platform SDK will result in crashes when using the \R{copyfiles}{CopyFiles} command. See \W{http://forums.winamp.com/showthread.php?s=&threadid=131964}{this forum topic} for more information. Installing the \W{http://wayback.archive.org/web/20100923113933/http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx}{Processor Pack} is highly recommended to decrease the size of the installer overhead. \\Important note for Microsoft Visual C++ 2012 users:\\ Installers generated using this release and beyond will not be able to run on Windows 9x or Windows 2000. The minimum requirement for 2012 is Windows XP. \H{build_posix} Building on POSIX As of NSIS 2.01, the compiler, makensis, also compiles on POSIX platforms. POSIX platforms include Linux, *BSD, Mac OS X and others. Since the generated installer will eventually run on Windows, a \W{http://www.libsdl.org/extras/win32/cross/README.txt}{cross-compiler} is needed in order to compile them. The command line option XGCC_W32_PREFIX could be used to explicitly select a specific win32 targeted cross compiler. The value of XGCC_W32_PREFIX has to be the prefix of the toolchain. For example XGCC_W32_PREFIX=i686-w64-mingw32- would deploy the win32 targeted MinGW-w64 cross compiler if it is available on the build system. If no cross-compiler is available, use the following: \c scons SKIPSTUBS=all SKIPPLUGINS=all SKIPUTILS=all SKIPMISC=all \c NSIS_CONFIG_CONST_DATA_PATH=no PREFIX=/path/to/extracted/zip \c install-compiler This should only build makensis and install it to the directory where a precompiled package, such as the \R{build_nightly}{nightly build} or a \W{http://sourceforge.net/project/showfiles.php?group_id=22049}{zipped release version} (nsis-x.xx.zip), is extracted. Note that the in order for this to work, the precompiled package must be compiled using the exact same sources as makensis. In particular, \c{Source\\exehead\\config.h}, the options passed to scons and \c{Source\\exehead\\fileform.h} must be identical. Nightly builds and zipped release versions are built with the default options. To build a native version of NSIS Menu, install \W{http://www.wxwidgets.org/}{wxWidgets 2.8} and build as usual. \c{wx-config} must be in the path. \H{build_nightly} Nightly Builds There is no need to manually build the latest SVN version for Windows. A \W{https://nsis.sourceforge.io/nightly/nsis.zip}{nightly build} is available. The nightly build is automatically generated every night, using the latest version of the source code from SVN. There is no official nightly build for other platforms. nsis-3.11/Docs/src/callback.but000077500000000000000000000177111477201124000163510ustar00rootroot00000000000000\S1{callbacks} Callback Functions You can create callback functions (which have special names), that will be called by the installer at certain points in the install. Below is a list of available callbacks: \S2{instcallbacks} Install Callbacks \S3{onguiinit} .onGUIInit This callback will be called just before the first page is loaded and the installer dialog is shown, allowing you to tweak the user interface. Example: \c !include "WinMessages.nsh" \c \c Function .onGUIInit \c # 1028 is the id of the branding text control \c GetDlgItem $R0 $HWNDPARENT 1028 \c CreateFont $R1 "Tahoma" 10 700 \c SendMessage $R0 ${WM_SETFONT} $R1 0 \c # set background color to white and text color to red \c SetCtlColors $R0 FFFFFF FF0000 \c FunctionEnd \S3{oninit} .onInit This callback will be called when the installer is nearly finished initializing. If the '.onInit' function calls \R{abort}{Abort}, the installer will quit instantly. Here are two examples of how this might be used: \c Function .onInit \c MessageBox MB_YESNO "This will install. Continue?" IDYES NoAbort \c Abort ; causes installer to quit. \c NoAbort: \c FunctionEnd or: \c Function .onInit \c ReadINIStr $INSTDIR $WINDIR\wincmd.ini Configuration InstallDir \c StrCmp $INSTDIR "" 0 NoAbort \c MessageBox MB_OK "Windows Commander not found. Unable to get install path." \c Abort ; causes installer to quit. \c NoAbort: \c FunctionEnd \S3{oninstfailed} .onInstFailed This callback is called when the user hits the 'cancel' button after the install has failed (if it could not extract a file, or the install script used the \R{abort}{Abort} command). Example: \c Function .onInstFailed \c MessageBox MB_OK "Better luck next time." \c FunctionEnd \S3{oninstsuccess} .onInstSuccess This callback is called when the install was successful, right before the install window closes (which may be after the user clicks 'Close' if \R{aautoclosewindow}{AutoCloseWindow} or \R{setautoclose}{SetAutoClose} is set to false). Example: \c Function .onInstSuccess \c MessageBox MB_YESNO "Congrats, it worked. View readme?" IDNO NoReadme \c Exec notepad.exe ; view readme or whatever, if you want. \c NoReadme: \c FunctionEnd \S3{onguiend} .onGUIEnd This callback is called right after the installer window closes. Use it to free any user interface related plug-ins if needed. \S3{onmouseoversection} .onMouseOverSection This callback is called whenever the mouse position over the sections tree has changed. This allows you to set a description for each section for example. The section id on which the mouse is over currently is stored, temporarily, in $0. Example: \c Function .onMouseOverSection \c FindWindow $R0 "#32770" "" $HWNDPARENT \c GetDlgItem $R0 $R0 1043 ; description item (must be added to the UI) \c \c StrCmp $0 0 "" +2 \c SendMessage $R0 ${WM_SETTEXT} 0 "STR:first section description" \c \c StrCmp $0 1 "" +2 \c SendMessage $R0 ${WM_SETTEXT} 0 "STR:second section description" \c FunctionEnd \S3{onrebootfailed} .onRebootFailed This callback is called if \R{reboot}{Reboot} fails. \R{writeuninstaller}{WriteUninstaller}, \R{plugindlls}{plug-ins}, \R{file}{File} and \R{writeregbin}{WriteRegBin} should not be used in this callback. Example: \c Function .onRebootFailed \c MessageBox MB_OK|MB_ICONSTOP "Reboot failed. Please reboot manually." /SD IDOK \c FunctionEnd \S3{onselchange} .onSelChange Called when the selection changes on the \R{pages}{component page}. Useful for using with \R{sectionsetflags}{SectionSetFlags} and \R{sectiongetflags}{SectionGetFlags}. Selection changes include both section selection and installation type changes. The section id of the changed section is stored in $0. $0 is -1 if the installation type changed. You only get notifications for changes initiated by the user and only one notification per action even if the action also affected child sections and/or parent groups. \S3{onuserabort} .onUserAbort This callback is called when the user hits the 'cancel' button, and the install hasn't already failed. If this function calls \R{abort}{Abort}, the install will not be aborted. Example: \c Function .onUserAbort \c MessageBox MB_YESNO "Abort install?" IDYES NoCancelAbort \c Abort ; causes installer to not quit. \c NoCancelAbort: \c FunctionEnd \S3{onverifyinstdir} .onVerifyInstDir This callback enables control over whether or not an installation path is valid for your installer. This code will be called every time the user changes the install directory, so it shouldn't do anything crazy with \R{messagebox}{MessageBox} or the like. If this function calls \R{abort}{Abort}, the installation path in $INSTDIR is deemed invalid. Example: \c Function .onVerifyInstDir \c IfFileExists $INSTDIR\Winamp.exe PathGood \c Abort ; if $INSTDIR is not a winamp directory, don't let us install there \c PathGood: \c FunctionEnd \S2{uninstcallbacks} Uninstall Callbacks \S3{unonguiinit} un.onGUIInit This callback will be called just before the first page is loaded and the installer dialog is shown, allowing you to tweak the user interface. Have a look at \R{onguiinit}{.onGUIInit} for an example. \S3{unonInit} un.onInit This callback will be called when the uninstaller is nearly finished initializing. If the ' \R{unonInit}{un.onInit}' function calls \R{abort}{Abort}, the uninstaller will quit instantly. Note that this function can verify and/or modify $INSTDIR if necessary. Here are two examples of how this might be used: \c Function un.onInit \c MessageBox MB_YESNO "This will uninstall. Continue?" IDYES NoAbort \c Abort ; causes uninstaller to quit. \c NoAbort: \c FunctionEnd or: \c Function un.onInit \c IfFileExists $INSTDIR\myfile.exe found \c Messagebox MB_OK "Uninstall path incorrect" \c Abort \c found: \c FunctionEnd \S3{unonuninstfailed} un.onUninstFailed This callback is called when the user hits the 'cancel' button after the uninstall has failed (if it used the \R{abort}{Abort command} or otherwise failed). Example: \c Function un.onUninstFailed \c MessageBox MB_OK "Better luck next time." \c FunctionEnd \S3{unonuninstsuccess} un.onUninstSuccess This callback is called when the uninstall was successful, right before the install window closes (which may be after the user clicks 'Close' if \R{setautoclose}{SetAutoClose} is set to false).. Example: \c Function un.onUninstSuccess \c MessageBox MB_OK "Congrats, it's gone." \c FunctionEnd \S3{unonguiend} un.onGUIEnd This callback is called right after the uninstaller window closes. Use it to free any user interface related plug-ins if needed. \S3{unonrebootfailed} un.onRebootFailed This callback is called if \R{reboot}{Reboot} fails. \R{writeuninstaller}{WriteUninstaller}, \R{plugindlls}{plug-ins}, \R{file}{File} and \R{writeregbin}{WriteRegBin} should not be used in this callback. Example: \c Function un.onRebootFailed \c MessageBox MB_OK|MB_ICONSTOP "Reboot failed. Please reboot manually." /SD IDOK \c FunctionEnd \S3{unonselchange} un.onSelChange Called when the selection changes on the \R{pages}{component page}. Useful for using with \R{sectionsetflags}{SectionSetFlags} and \R{sectiongetflags}{SectionGetFlags}. Selection changes include both section selection and installation type changes. The section id of the changed section is stored in $0. $0 is -1 if the installation type changed. You only get notifications for changes initiated by the user and only one notification per action even if the action also affected child sections and/or parent groups. \S3{unonuserabort} un.onUserAbort This callback is called when the user hits the 'cancel' button and the uninstall hasn't already failed. If this function calls \R{abort}{Abort}, the install will not be aborted. Example: \c Function un.onUserAbort \c MessageBox MB_YESNO "Abort uninstall?" IDYES NoCancelAbort \c Abort ; causes uninstaller to not quit. \c NoCancelAbort: \c FunctionEndnsis-3.11/Docs/src/chmlink.js000077500000000000000000000040141477201124000160540ustar00rootroot00000000000000function FolderExists(fn) { /*@cc_on @*/ /*@if (@_jscript_version >= 5) try { var objShell = new ActiveXObject("Shell.Application"); var fso = new ActiveXObject("Scripting.FileSystemObject"); return fso.FolderExists(fn); } catch(e) { } /*@end @*/ return false; } function FileExists(fn) { /*@cc_on @*/ /*@if (@_jscript_version >= 5) try { var fso = new ActiveXObject("Scripting.FileSystemObject"); return fso.FileExists(fn); } catch(e) { } /*@end @*/ return true; } function TryShellExec(fn) { /*@cc_on @*/ /*@if (@_jscript_version >= 5) try { var objShell = new ActiveXObject("Shell.Application"); objShell.ShellExecute(fn, "", "", "open", 1); return true; } catch(e) { } /*@end @*/ return false; } function parser(fn) { var X, Y, sl, a, ra, re; ra = /:/; a = location.href.search(ra); if (a == 2) X = 14; else X = 7; sl = "\\"; Y = location.href.lastIndexOf(sl) + 1; /*@cc_on @*/ /*@if (@_jscript_version >= 5) try { var fso = new ActiveXObject("Scripting.FileSystemObject"); } catch(e) { if (fn.substring(0, 3) == "../") { fn = fn.substring(3); } } @else @*/ if (fn.substring(0, 3) == "../") { fn = fn.substring(3); } /*@end @*/ lfn = location.href.substring(X, Y) + fn; re = /%20/g; lfn = lfn.replace(re, " "); re = /\//g; lfn = lfn.replace(re, "\\"); if (FolderExists(lfn)) { if (!TryShellExec(lfn)) { var objShell = new ActiveXObject("Shell.Application"); objShell.Open(lfn); } } else if (FileExists(lfn)) { execed = false; htmlre = /\.html?$/; txtre = /\.txt$/; if (!lfn.match(htmlre) && !lfn.match(txtre)) { execed = TryShellExec(lfn); } if (!execed) { re = /\\/g; lfn = lfn.replace(re, "/"); re = /\ /g; lfn = lfn.replace(re, "%20"); location.href = 'file:///' + lfn; } } else if (fn.substring(0, 3) == "../") { parser(fn.substring(3)); } else { alert(fn + " doesn't exist"); } }nsis-3.11/Docs/src/compiler.but000077500000000000000000000307261477201124000164300ustar00rootroot00000000000000\C{comptime} Compile Time Commands \S0{compcommands} Compiler Utility Commands These commands are similar to the C preprocessor in terms of purpose and functionality. They allow file inclusion, conditional compilation, executable header packing and process execution during the build process. Note: None of these commands allow the use of \R{variables}{variables}. Number literals support the \c{0b}, \c{0o}, \c{0n} and \c{0x} radix prefixes (base 2, 8, 10 and 16 respectively). Note: The deprecated plain \c{0} octal prefix is also supported in some places but its usage is discouraged. \S1{include} !include \# NOTE: \NsisInputCharset define cannot be used in a \c block \c [/NONFATAL] [/CHARSET=ACP|OEM|CP#|UTF8|UTF16LE|UTF16BE] file This command will include 'file' as if it was part of the original script. Note that if a file is included in another directory, the current directory is still where the script was compiled from (not where the included file resides). If the compiler can't find the file it will look for it in every include directory. See \R{addincludedir}{!addincludedir} for more information. If the /nonfatal switch is used and no files are found, a warning will be issued instead of an error. /charset can be used to specify a codepage for plain text files without a BOM. \c !include WinMessages.nsh \c !include Library.nsh \c !include /CHARSET=CP1252 C:\MyConfig.nsi \c !include ..\MyConfig.nsh \c !include /NONFATAL file_that_may_exist_or_not.nsh \S1{addincludedir} !addincludedir \c directory Adds another include directory to the include directories list. This list is searched when \R{include}{!include} is used. This list's initial value is $\{NSISDIR\}\\Include. \c !addincludedir ..\include \c !include something.nsh \S1{addplugindir} !addplugindir \c [/x86-ansi | /x86-unicode] directory Causes the NSIS compiler to scan the given directory for plug-in DLLs. If you don't specify the plug-in architecture it is assumed to match the current target architecture. If the architecture does not match the installer will probably crash! \c !addplugindir ..\myplugin \c MyPlugin::SomeFunction \S1{appendfile} !appendfile \# NOTE: \NsisOutputCharset define cannot be used in a \c block \c [/CHARSET=ACP|OEM|CP#|UTF8[SIG]|UTF16[BOM]] [/RawNL] file text Appends \e{text} to \e{file}. The text is written as ANSI (ACP) unless the file already has a BOM. Using /CHARSET will force a specific character encoding. \c{$\\n} will be translated to \c{$\\r$\\n} on Windows unless you specify /RawNL. \c !tempfile FILE \c !appendfile "${FILE}" "XPStyle on$\n" \c !appendfile "${FILE}" "Name 'test'$\n" \c !include "${FILE}" \c !delfile "${FILE}" \c !undef FILE \S1{cd} !cd \c new_path This command will change the compiler to the new directory, new_path. new_path can be relative or absolute. \c !cd ..\more-scripts\new \S1{delfile} !delfile \c [/nonfatal] file This command deletes a file. \c !tempfile FILE \c !delfile "${FILE}" \c !undef FILE \S1{echo} !echo \c message This command will echo a message to the user compiling the script. \c !echo "hello world" \S1{error} !error \c [message] This command will issue an error to the script compiler and will stop execution of the script. You can also add a message to this error. \c !ifdef VERSION & NOVERSION \c !error "both VERSION and NOVERSION are defined" \c !endif \S1{assert} !assert \c value [op value2] message This command will stop the compiler if the expression is not true. The expression is evaluated in a similar fashion to \R{if}{!if}. \c !assert ${NSIS_CHAR_SIZE} = 2 "Unicode required" \S1{execute} !execute \c command [compare comparevalue | symbol] This command will execute 'command' using a call to CreateProcess(). Unlike \R{system}{!system}, it does not use the command line processor, so input/output redirection and commands like 'cd', 'dir' and 'type' can not be used. Currently, the only known advantage of \R{execute}{!execute} over \R{system}{!system} is that it does not give trouble when the current working directory is specified using UNC. On POSIX platforms, \R{execute}{!execute} will use system() just like \R{system}{!system}. \c !execute '"$%WINDIR%\notepad.exe" /P "${NSISDIR}\COPYING"' \S1{makensis} !makensis \c parameters [compare comparevalue | symbol] This command will \R{execute}{!execute} a new instance of MakeNSIS with the parameters you specify. \c !makensis '-DGENERATEUNINST "${__FILE__}"' = 0 \c !system '"signtool" sign ...' = 0 \S1{packhdr} !packhdr \c tempfile command This option makes the compiler use an external EXE packer (such as \W{http://www.un4seen.com/petite/}{Petite} or \W{http://upx.sourceforge.net/}{UPX}) to compress the executable header. Specify a temporary file name (such as "temp.dat") and a command line (such as "C:\\program files\\upx\\upx -9 temp.dat") to compress the header. \c !packhdr "$%TEMP%\exehead.tmp" '"C:\Program Files\UPX\upx.exe" "$%TEMP%\exehead.tmp"' \S1{finalize} !finalize \c command [compare comparevalue] This option will execute 'command' using a call to system() after the installer EXE has been generated. You can typically use it to sign (Authenticode) your installer. If 'command' contains a '%1' it will be replaced by the executables filename. \c !finalize 'sign.bat "%1" "MyProduct Installer" http://example.com' \S1{uninstfinalize} !uninstfinalize \c command [compare comparevalue] This option will execute 'command' using a call to system() after the uninstaller EXE has been generated. You can typically use it to sign (Authenticode) your uninstaller. If 'command' contains a '%1' it will be replaced by the executables filename. \c !uninstfinalize 'sign.bat "%1" "MyProduct Installer" http://example.com' \S1{system} !system \c command [compare comparevalue | symbol] This command will execute 'command' using a call to system(). You can store the return value in a define ('symbol') or halt execution if the return value compared (using 'compare') to 'comparevalue' is false. 'compare' can be '<' or '>' or '<>' or '='. \c !system '"%WINDIR%\notepad.exe" "${NSISDIR}\COPYING"' \c !system 'echo !define something > newinclude.nsh' \c !include newinclude.nsh \c !ifdef something \c !echo "something is defined" \c !endif \c !system 'attrib +H Secret.txt' = 0 \c !system 'ping localhost' ERRLVL \c !echo "Ping returned ${ERRLVL}" \S1{tempfile} !tempfile \c symbol This command creates a temporary file. It puts its path into a define, named \e{symbol}. \c !tempfile PACKHDRTEMP \c !packhdr "${PACKHDRTEMP}" '"C:\Program Files\UPX\upx.exe" "${PACKHDRTEMP}"' \c !tempfile FILE \c !define /date DATE "%H:%M:%S %d %b, %Y" \c !system 'echo built on ${DATE} > "${FILE}"' \c !undef DATE \c File /oname=build.txt "${FILE}" \c !delfile "${FILE}" \c !undef FILE \S1{ppgetdllversion} !getdllversion \c [/noerrors] [/packed] [/productversion] localfilename define_basename This is similar to \R{getdllversionlocal}{GetDLLVersionLocal}, only it stores the version number in defines and can therefore be used anywhere, not just inside functions and sections. /packed returns the information in two DWORDs. \c !getdllversion "$%WINDIR%\Explorer.exe" Expv_ \c !echo "Explorer.exe version is ${Expv_1}.${Expv_2}.${Expv_3}.${Expv_4}" \S1{ppgettlbversion} !gettlbversion \c [/noerrors] [/packed] localfilename define_basename Get the version information from a .TLB file. \c !gettlbversion /packed "$%WINDIR%\System32\stdole32.tlb" TLBVER_ \c !echo "${TLBVER_HIGH}.${TLBVER_LOW}" \S1{warning} !warning \c [message] This command will issue a warning to the script compiler. You can also add a message to this warning. \c !ifdef USE_DANGEROUS_STUFF \c !warning "using dangerous stuff" \c !endif \S1{pragma} !pragma \c warning \c warning The pragma commands allows you to change compiler features and behavior. \c !pragma warning disable 9000 ; Disable warning about using "Setup.exe" as the name \c OutFile "Setup.exe" \S1{verbose} !verbose \c level | push | pop This command will set the level of verbosity: 4=all, 3=no script, 2=no info, 1=no warnings, 0=none. Passing push will cause !verbose to push the current verbosity level on a special stack. Passing pop will cause !verbose to pop the current verbosity level from the same stack and use it. \c !verbose push \c !verbose 1 \c !include WinMessages.nsh \c !verbose pop \S0{comppredefines} Predefines You can use these standard predefines to automatically add the build time to the title of development versions, add the date to the version number, etc. \S1{precounter} $\{__COUNTER__\} Expands to a number (Starting at 0 and incrementing by 1 every time it is used) \S1{prefile} $\{__FILE__\} Current script name. \S1{prefiledir} $\{__FILEDIR__\} Current script directory. \S1{preline} $\{__LINE__\} Current line number. \S1{predate} $\{__DATE__\} Date when the script started compiling according to the current locale. \S1{pretime} $\{__TIME__\} Time when the script started compiling according to the current locale. \S1{pretimestamp} $\{__TIMESTAMP__\} Date & time of the last modification to the script file according to the current locale. \S1{prensisversion} $\{NSIS_VERSION\} NSIS version used to build the script. \S1{prensispackedversion} $\{NSIS_PACKEDVERSION\} NSIS version as a 32-bit number. \c !if 0x3014000 >= "${NSIS_PACKEDVERSION}" \c !error "NSIS 3.15 or higher is required to build this installer!" \c !endif \S1{prensischarsize} $\{NSIS_CHAR_SIZE\} The size of a character code unit (in bytes). 1 in ANSI installers and 2 in Unicode installers. A \W{http://unicode.org/glossary/#grapheme}{grapheme} cluster consists of a base character plus optional combining characters and diacritics and is defined as one or more code points. One or more code units is required to encode a single code point. \S1{prensisptrsize} $\{NSIS_PTR_SIZE\} The size of a pointer (in bytes) in the generated installer. \S1{preunicodecodepoint} $\{U+1\}...$\{U+10FFFF\} A Unicode (UCS-4) character. \c DetailPrint "${U+2115}SIS" # DOUBLE-STRUCK CAPITAL N + "SIS" \S1{scopepredefines} Scope Predefines Standard predefines that contain information about the current code scope. \S2{prescopeglobal} $\{__GLOBAL__\} Defined in the global scope. \c Section test \c !ifdef __GLOBAL__ \c !error "this shouldn't be here!" \c !endif \c SectionEnd \c \c PageEx instfiles \c !ifdef __GLOBAL__ \c !error "this shouldn't be here!" \c !endif \c PageExEnd \S2{prescopesection} $\{__SECTION__\} Defined as the section name, without any prefixes, in \R{ssection}{section} scope. \c !ifdef __SECTION__ \c !error "this shouldn't be here!" \c !endif \c \c Section test \c !ifndef __SECTION__ \c !error "missing predefine!" \c !endif \c \c !if ${__SECTION__} != test \c !error "wrong predefine value!" \c !endif \c SectionEnd \c \c Section !test \c !if ${__SECTION__} != test \c !error "wrong predefine value!" \c !endif \c SectionEnd \c \c Section un.test \c !if ${__SECTION__} != test \c !error "wrong predefine value!" \c !endif \c SectionEnd \S2{prescopefunction} $\{__FUNCTION__\} Defined as the function name, without any prefixes, in \R{ffunction}{function} scope. \c !ifdef __FUNCTION__ \c !error "this shouldn't be here!" \c !endif \c \c Function test \c !ifndef __FUNCTION__ \c !error "missing predefine!" \c !endif \c \c !if ${__FUNCTION__} != test \c !error "wrong predefine value!" \c !endif \c FunctionEnd \c \c Function un.test \c !if ${__FUNCTION__} != test \c !error "wrong predefine value!" \c !endif \c FunctionEnd \S2{prescopepageex} $\{__PAGEEX__\} Defined as the page type in \R{pageex}{PageEx} scope. \c !ifdef __PAGEEX__ \c !error "this shouldn't be here!" \c !endif \c \c PageEx instfiles \c !ifndef __PAGEEX__ \c !error "missing predefine!" \c !endif \c \c !if ${__PAGEEX__} != instfiles \c !error "wrong page type" \c !endif \c PageExEnd \S2{prescopeuninstall} $\{__UNINSTALL__\} Defined in \R{ssection}{section}, \R{ffunction}{function} or \R{pageex}{PageEx} scopes of the uninstaller. \c !ifdef __UNINSTALL__ \c !error "this shouldn't be here!" \c !endif \c \c Function test \c !ifdef __UNINSTALL__ \c !error "this shouldn't be here!" \c !endif \c FunctionEnd \c \c Function un.test \c !ifndef __UNINSTALL__ \c !error "missing predefine!" \c !endif \c FunctionEnd \S2{prescopemacro} $\{__MACRO__\} Defined as the name of the current macro. \S0{compenvvarread} Read environment variables \S1{compenvvar} $%envVarName% $%envVarName% will be replaced at compile time by the environment variable envVarName. nsis-3.11/Docs/src/compilerflags.but000077500000000000000000000202611477201124000174360ustar00rootroot00000000000000\S1{flags} Compiler Flags The following commands affect how the compiler generates code and compresses data. Unless otherwise noted, these commands are valid anywhere in the script and affect every line below where each one is placed (until overridden by another command). They cannot be jumped over using \R{flowcontrol}{flow control instructions}. For example, in the following script, blah.dat will never be overwritten. \c ${If} $0 == 0 \c SetOverwrite on \c ${Else} \c SetOverwrite off \c ${EndIf} \c File blah.dat # overwrite is always off here! Instead, the following should be used. \c ${If} $0 == 0 \c SetOverwrite on \c File blah.dat \c ${Else} \c SetOverwrite off \c File blah.dat \c ${EndIf} \S2{asetallowskipfiles} AllowSkipFiles \c \\on\\|off This command specifies whether the user should be able to skip a file or not. A user has an option to skip a file if \R{asetoverwrite}{SetOverwrite} is set to on (default) and the installer fails to open a file for writing when trying to extract a file. If \e{off} is used the ignore button which allows the user to skip the file will not be shown and the user will only have an option to abort the installation (Cancel button) or retry opening the file for writing (Retry button). If \e{on} is used the user will have an option to skip the file (error flag will be set - see \R{asetoverwrite}{SetOverwrite}). \S2{afilebufsize} FileBufSize \c buffer_size_in_mb This command sets the size of the compiler's internal file buffers. This command allows you to control the compiler's memory usage by limiting how much of a given file it will load into memory at once. Since the compiler needs both input and output, twice the memory size specified could be used at any given time for file buffers. This command does not limit the compression buffers which could take another couple of MB, neither does it limit the compiler's other internal buffers, but those shouldn't normally top 1MB anyway. Specifying a very small number could decrease performance. Specifying a very large number could exhaust system resources and force the compiler to cancel the compilation process. The default value is 32MB. \S2{asetcompress} SetCompress \c \\auto\\|force|off This command sets the compress flag which is used by the installer to determine whether or not data should be compressed. Typically the \R{asetcompress}{SetCompress} flag will affect the commands after it, and the last \R{asetcompress}{SetCompress} command in the file also determines whether or not the install info section and uninstall data of the installer is compressed. If compressflag is 'auto', then files are compressed if the compressed size is smaller than the uncompressed size. If compressflag is set to 'force', then the compressed version is always used. If compressflag is 'off' then compression is not used (which can be faster). Note that this option has no effect when solid compression is used. \S2{asetcompressor} SetCompressor \c [/SOLID] [/FINAL] \\zlib\\|bzip2|lzma This command sets the compression algorithm used to compress files/data in the installer. It can only be used outside of sections and functions and before any data is compressed. Different compression methods can not be used for different files in the same installer. It is recommended to use it at the very top of the script to avoid compilation errors. Three compression methods are supported: ZLIB, BZIP2 and LZMA. ZLIB (the default) uses the deflate algorithm, it is a quick and simple method. With the default compression level it uses about 300 KB of memory. BZIP2 usually gives better compression ratios than ZLIB, but it is a bit slower and uses more memory. With the default compression level it uses about 4 MB of memory. LZMA is a new compression method that gives very good compression ratios. The decompression speed is high (10-20 MB/s on a 2 GHz CPU), the compression speed is lower. The memory size that will be used for decompression is the dictionary size plus a few KBs, the default is 8 MB. If \e{/FINAL} is used, subsequent calls to \R{asetcompressor}{SetCompressor} will be ignored. If \e{/SOLID} is used, all of the installer data is compressed in one block. This results in greater compression ratios. \S2{asetcompressordictsize} SetCompressorDictSize \c dict_size_mb Sets the dictionary size in megabytes (MB) used by the LZMA compressor (default is 8 MB). \S2{asetdatablockoptimize} SetDatablockOptimize \c \\on\\|off This command tells the compiler whether or not to do datablock optimizations. Datablock optimizations causes the compiler to check to see if any data being added to the data block is already in the data block, and if so, it is simply referenced as opposed to added (can save a little bit of size). It is highly recommended to leave this option on. \S2{asetdatesave} SetDateSave \c \\on\\|off This command sets the file date/time saving flag which is used by the \R{file}{File} command to determine whether or not to save the last write date and time of the file, so that it can be restored on installation. Valid flags are 'on' and 'off'. 'on' is the default. \S2{asetoverwrite} SetOverwrite \c \\on\\|off|try|ifnewer|ifdiff|lastused This command sets the overwrite flag which is used by the \R{file}{File} command to determine whether or not the file should overwrite any existing files that are present. If overwriteflag is 'on', files are overwritten (this is the default). If overwriteflag is 'off', files that are already present are not overwritten. If overwriteflag is 'try', files are overwritten if possible (meaning that if the file is not able to be written to, it is skipped without any user interaction). If overwriteflag is 'ifnewer', then files are only overwritten if the existing file is older than the new file. If overwriteflag is 'ifdiff', then files are only overwritten if the existing file is older or newer than the new file. Note that when in 'ifnewer' or 'ifdiff' mode, the destination file's date is set, regardless of what \R{asetdatesave}{SetDateSave} is set to. \c SetOverwrite off \c File program.cfg # config file we don't want to overwrite \c SetOverwrite on \S2{aunicodetarget} Unicode \c \\true\\|false Generate a \R{intro-unicode}{Unicode installer}. It can only be used outside of sections and functions and before any data is compressed. \S1{versioninfo} Version Information \S2{viaddversionkey} VIAddVersionKey \c [/LANG=lang_id] keyname value Adds a string entry to the version information stored in the installer and uninstaller. These can be viewed in the File Properties Version or Details tab. keyname can either be a special name known by Windows or a user defined name. /LANG=0 can be used to indicate a language neutral language id. The following names are known by Windows: \b ProductName \b Comments \b CompanyName \b LegalCopyright \b FileDescription \b FileVersion \b ProductVersion \b InternalName \b LegalTrademarks \b OriginalFilename \b PrivateBuild \b SpecialBuild The displayed name of these special entries are translated on the target system, whereas user defined keynames remain untranslated. \c VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application" \c VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment" \c VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company" \c VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company" \c VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "© Fake company" \c VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application" \c VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3" \S2{viproductversion} VIProductVersion \c version_string_X.X.X.X Sets the Product Version in the VS_FIXEDFILEINFO version information block. \c VIProductVersion 1.2.3.4 \S2{vifileversion} VIFileVersion \c version_string_X.X.X.X Sets the File Version in the VS_FIXEDFILEINFO version information block (You should also set the FileVersion string with VIAddVersionKey so the information is displayed at the top of the Version Tab in the Properties of the file). If you don't provide a File Version the Product Version is used in the VS_FIXEDFILEINFO block. \c VIFileVersion 1.2.3.4 nsis-3.11/Docs/src/config.but000077500000000000000000000027211477201124000160550ustar00rootroot00000000000000\#{**********************************************} \#{* Common config shared by all output formats *} \#{**********************************************} \cfg{html-lang}{en} \cfg{html-suppress-address}{true} \cfg{html-append-meta}{name="viewport" content="width=device-width, initial-scale=1"} \define{NsisCopyright} Copyright (C) 1999-2025 Contributors \copyright \NsisCopyright \preamble Check \W{https://nsis.sourceforge.io/}{http://nsis.sf.net} for news, information, support, examples, tutorials and more. \preamble Quick links:\\\W{https://nsis.sourceforge.io/support/faq/}{FAQ} - A list of frequently asked questions\\\W{https://nsis.sourceforge.io/wiki/}{NSIS Wiki} - Examples, functions, tutorials, plug-ins, software and more\\\W{http://forums.winamp.com/forumdisplay.php?forumid=65}{Forum} - Post questions or discuss NSIS features \define{NsisFuncReqU} This function is only available when building a \R{intro-unicode}{Unicode installer}. \define{NsisFuncReq64} This function is only available when building a 64-bit installer. \define{NsisACPcp} system default ANSI codepage (ACP) \define{NsisInputCharset} ACP|OEM|CP#|UTF8|UTF16 \define{NsisOutputCharset} ACP|OEM|CP#|UTF8[SIG]|UTF16[BOM] \define{NsisWarnBlockContainerBegin} \\
      \define{NsisWarnBlockContainerEnd} \\ \define{NsisBlockHeaderWarning} \s{Warning:} \define{NsisBlockHeaderNote} \s{Note:} \define{NsisBlockHeaderExeheadU} \s{Unicode:} nsis-3.11/Docs/src/config_chm.but000077500000000000000000000011241477201124000167000ustar00rootroot00000000000000\title NSIS Users Manual \#{ Unnamed fragments should generate a smaller file (It will prevent people from making mk:@MSITStore links to named fragments) } \cfg{xhtml-keywordfragments}{false} \cfg{xhtml-leaf-level}{2} \cfg{xhtml-leaf-contains-contents}{false} \cfg{xhtml-contents-depth-0}{5} \cfg{xhtml-head-end}{} \cfg{xhtml-rlink-prefix}{#" onclick="parser('} \cfg{xhtml-rlink-suffix}{')} \cfg{chm-toc-file}{toc.hhc} \cfg{chm-ind-file}{ind.hhk} nsis-3.11/Docs/src/config_html.but000077500000000000000000000005441477201124000171020ustar00rootroot00000000000000\title NSIS Users Manual \preamble NSIS is a free scriptable win32 installer/uninstaller system that doesn't suck and isn't huge. \cfg{xhtml-leaf-level}{1} \cfg{xhtml-leaf-smallest-contents}{3} \cfg{xhtml-leaf-contains-contents}{true} \cfg{xhtml-contents-depth-0}{3} \cfg{xhtml-head-end}{} nsis-3.11/Docs/src/config_htmlsingle.but000077500000000000000000000011721477201124000203020ustar00rootroot00000000000000\title NSIS Users Manual \preamble NSIS is a free scriptable win32 installer/uninstaller system that doesn't suck and isn't huge. \cfg{xhtml-leaf-level}{0} \#SConscript will replace ---HTML:HEAD:STYLE:CSS--- with the CSS from style.css \#To avoid a horizontal scrollbar for the whole document, pre blocks (code samples) use overflow:auto; and the extra padding is to prevent the scrollbar from obscuring single lines (In some versions of IE?) forums.winamp.com/showthread.php?t=365132 \cfg{xhtml-head-end}{} nsis-3.11/Docs/src/config_web.but000077500000000000000000000011541477201124000167110ustar00rootroot00000000000000\title NSIS Users Manual \preamble NSIS is a free scriptable win32 installer/uninstaller system that doesn't suck and isn't huge. \cfg{xhtml-leaf-level}{1} \cfg{xhtml-leaf-smallest-contents}{3} \cfg{xhtml-leaf-contains-contents}{true} \cfg{xhtml-contents-depth-0}{3} \cfg{xhtml-head-end}{} \cfg{xhtml-body-end}{SourceForge Logo} nsis-3.11/Docs/src/credits.but000077500000000000000000000115641477201124000162520ustar00rootroot00000000000000\A{credits} Credits \H{programmers} Programmers \e{Justin Frankel aka 0xDEADBEEF} \b Creating the all mighty NSIS \e{Amir "make me stop" Szekely aka KiCHiK} \b Multilingual NSIS \b RTF license text \b The new paging system \b Full color support for icons and bitmaps \b Branding image \b Customizable UI \b One makensis.exe for both zlib and bzip2 \e{Joost Verburg} \b Modern User Interface \b NSIS website \b NSIS Menu \b System for DLL/TLB library setup \b NSIS Update for NSIS distribution (original version by Nathan Purciful) \e{Robert Rainwater} \b MakeNSISW \b New documentation format \b Enhancing the TreeView \b Reorganizing NSIS directory structure \e{Dave "bit-by-bit" Laundon aka eccles} \b Massive optimizing \e{Ximon Eighteen aka Sunjammer} \b The new plug-ins system \b "Copy to clipboard" context menu for the Details window \b License text initial focus \e{Ramon aka Ramon18} \b Version information resource commands \b Named user variables \b Lots of UI fixes \b InstallOptions improvements \e{Jim Park} \b Unicode support \e{Olivier Marcoux aka Wizou} \b Unicode merge \e{nnop@newmail.ru} \e{Ryan Geiss} \e{Andras Varga} \e{Drew Davidson} \e{Peter Windridge} \e{Yaroslav Faybishenko} \e{Jeff Doozan} \b NSIS 2's new TreeView \e{Nike (nike@sendmail.ru)} \b HTML Help support for Halibut \e{Diego Pedroso aka deguix} \b New NSIS Wiki \e{Shengalts Aleksander aka Instructor} \e{Stuart Welch aka Afrow UK} \e{David Weiss aka Comm@nder21} \e{Anders Kjersem} \b NSIS 3 patron saint \b 64-bit support \b Unicode merge & support \b NSIS 3 POSIX support \H{testers} Testers \e{Jason Ross aka JasonFriday13} \b NSIS 3 POSIX support \H{designers} Designers \e{Nikos Adamamas} \b The new modern icons \e{Jan T. Sott / whyEye.org} \b Lots of icons and check marks \H{translators} Translators Albanian - \e{Besnik Bleta} Afrikaans - \e{Friedel Wolff} Arabic - \e{asdfuae, Rami Kattan} Armenian - \e{Hrant Ohanyan} Asturian - \e{Marcos (marcoscostales@gmail.com)} Basque - \e{I\u00F1{n}aki San Vicente} Belarusian - \e{Sitnikov Vjacheslav} Bosnian - \e{Salih CAVKIC} Breton - \e{Korvigello\uF9{u} An Drouizig} Bulgarian - \e{Asparouh Kalyandjiev, Plamen Penkov} Catalan - \e{falanko} Chinese (Simplified) - \e{Kii Ali, Tyson Tan\#{sf.net/u/tysontan}} Chinese (Traditional) - \e{Kii Ali, Walter Cheuk} Corsican - \e{Patriccollu di Santa Maria \uE8{e} Sich\uE8{e}} Croatian - \e{Igor Ostriz, Vedran "RIV@NVX" Miletic} Czech - \e{T.V. Zuggy, SELiCE} Danish - \e{Christopher, Casper Bergenstoff, Claus Futtrup} Dutch - \e{Hendri Adriaens, Joost Verburg} Esperanto - \e{Felipe Castro} Estonian - \e{izzo} Farsi - \e{Masoud Alinaqian, FzerorubigD, Elnaz Sarbar} Finnish - \e{AKX, Eclipser} French - \e{veekee, Sebastien Delahaye, Jerome Charaoui} Galician - \e{Ramon Flores} Georgian - \e{David Huriev} German - \e{L.King, K. Windszus, R. Bisswanger, M. Simmack, Tim Kosse} Greek - \e{Makidis N. Michael} Hebrew - \e{Amir Szekely (aka KiCHiK), Yaron Shahrabani} Hind\u012b{i} - \e{Ryan Pretorius} Hungarian - \e{Soft-Trans Bt., Jozsef Tamas Herczeg, Lajos Molnar (Orfanik)} Icelandic - \e{Gretar Orri Kristinsson} Indonesian - \e{\#{Ariel Silooy}ariel825010106} Italian - \e{Orfanik, sanface, Alessandro Staltari, Lorenzo Bevilacqua} Japanese - \e{Dnanako, Takahiro Yoshimura} Khmer - \e{yi sophally} Korean - \e{dTomoyo, linak, koder} Kurdish - \e{Erdal Ronahi} Latvian - \e{Valdis Gri\u00ED{i}is, Kristaps Me\u00F2{o}\u00EC{i}elis} Lithuanian - \e{NorCis, Vytautas Krivickas, Danielius Scepanskis} Luxembourgish - \e{Jo Hoeser} Macedonian - \e{Sasko Zdravkin} Mongolian - \e{Bayarsaikhan Enkhtaivan} Norwegian - \e{Jonas Christoffer Lindstrom, Jan Ivar Beddari} Norwegian Nynorsk - \e{Vebj\u00F8{o}rn Sture} Pashto - \e{Pakhtosoft} Polish - \e{Piotr Murawski, Rafa\u0142{l} Lampe, cube, SYSTEMsoft Group, Marek St\u0119{e}pie\u0144{n}, Mateusz Gola, Pawe\u0142{l} Porwisz} Portuguese - \e{DragonSoull, Dre', Ramon} Portuguese Brasil - \e{Layout do Brasil, deguix} Romanian - \e{Sorin Sbarnea, Cristian Pirvu, George Radu, Vlad Rusu} Russian - \e{Sergey `Timon` Kusnetsov, Nik Medved, Scam, THRaSH, Dmitry Yerokhin} Serbian - \e{Srdjan Obucina} Serbian Latin - \e{Srdjan Obucina, Vladan Obradovic} Slovak - \e{trace, Kypec, Mari\u00e1{a}n Hikan\u00ed{i}k} Slovenian - \e{Janez Dolinar, Martin Sebotnjak} Spanish - \e{MoNKi, Lobo Lunar, Darwin Rodrigo Toledo C\u00e1{a}ceres} Swedish - \e{Peter Gustafsson, Magnus Bonnevier, Rickard Angbratt} Tatar - \e{Bulat Azat uly} Thai - \e{SoKoOLz, TuW@nNu (asdfuae)} Turkish - \e{Bertan Kodamanoglu, Cagatay Dilsiz, Fatih BOY} Ukrainian - \e{Yuri Holubow, Nash-Soft} Uzbek - \e{Emil Garipov (emil.garipov@gmail.com)} Valencian - \e{Bernardo Arlandis Ma\uF1{n}\uF3{o}} Vietnamese - \e{Clytie Siddall} Welsh - \e{Rhoslyn Prys, Meddal.com} \H{writers} Writers \e{Sebastian Armbrust aka flizebogen} \b Tutorial nsis-3.11/Docs/src/defines.but000077500000000000000000000173241477201124000162320ustar00rootroot00000000000000\S0{compdefines} Conditional Compilation The compiler maintains a list of defined symbols, which can be defined using !define or the /D command line switch. These defined symbols can be used for conditional compilation (using !ifdef) or for symbol replacement (a simple form of macros). To replace a symbol with its value, use $\{SYMBOL\} (if SYMBOL is not defined, no translation will occur). The translation is first-come-first-served, meaning if you do: \c !define symbol_one ${symbol_two} If symbol_two is defined when that line occurs, it will be replaced. Otherwise, any replacing will occur when $\{symbol_one\} is referenced. Define/conditional compilation related commands: \S1{define} !define \c [/ifndef | /redef] ([/date|/utcdate] gflag [value]) | (/file gflag filename.txt) | (/intfmt gflag fmtstr value) | (/math gflag val1 OP val2) This command will add \e{gflag} to the global define list. This will have a similar effect as using the /D switch on the command line (the define only becomes effective after the !define command). If \e{/date} or \e{/utcdate} are used, \e{value} will be passed to strftime() and the result will be used as the value of \e{gflag}. strftime converts special symbols into certain parts of the current time or date. For example, %H will be converted into the current hour in 24-hour format. For a complete list of available symbols, search for strftime on \W{http://msdn.microsoft.com/}{MSDN}. On POSIX, you can get the list by using \c{man strftime}. If \e{/file} is used, the entire text file specified (including whitespace and newlines) will be read and placed into \e{gflag}. If \e{/intfmt} is used, \e{value} is interpreted as a integer and formatted using the same syntax as \R{intfmt}{IntFmt}. If \e{/math} is used, the result of 'val1 OP val2', where OP may be +,-,*,/,%,<<,>>,>>>,&,|,^,~,!,&& or ||, will be used as the value of \e{gflag}. Note that val1 AND val2 MUST be integer values! \c !define USE_SOMETHING \c !define VERSION 1.2 \c !define /date NOW "%H:%M:%S %d %b, %Y" \c !define /math RESULT 3 + 10 \c !define /math REST 15 % ${RESULT} \c !define /file BunchaStuff somesourcefile.cpp \c !define /redef USE_SOMETHING ${RESULT} ;redefine USE_SOMETHING \c !define /intfmt HEX "0x%X" 3133078222 \S1{undef} !undef \c [/noerrors] gflag [...] Removes an item from the global define list. Note that $\{SYMBOL\} where SYMBOL is undefined will be translated to "$\{SYMBOL\}". \c !define SOMETHING \c !undef SOMETHING \S1{ifdef} !ifdef \c gflag [bcheck gflag [...]] This command, when paired with an !endif command, will tell the compiler whether or not to compile the lines in between the two lines. If gflag is globally defined (using !define or the /D switch), then the contained lines will be compiled. Otherwise, they will be skipped. 'bcheck' can be specified as & (boolean and) or | (boolean or) along with more gflags -- precedence is simple, left to right. \c !define SOMETHING \c !ifdef SOMETHING \c !echo "SOMETHING is defined" \c !endif \c !undef SOMETHING \c !ifdef SOMETHING \c !echo "SOMETHING is defined" # will never be printed \c !endif \S1{ifndef} !ifndef \c gflag [bcheck gflag [...]]] The opposite of !ifdef. The lines will be compiled when the gflag has not been defined. \S1{if} !if \c [!] value [op value2] \c [!] /FileExists "c:\path\file.exe" This command, when paired with an !endif command, will tell the compiler whether or not to compile the lines in between the two lines. If value is non-zero, or the comparison of value and value2 depending on the operator results in true, the contained lines will be compiled. Otherwise, they will be skipped. op can be either == or != (case-insensitive string comparison), S== or S!= (case-sensitive string comparison), =, <>, <=, <, > or >= (int/hex/float comparison), & (bitwise AND comparison), && or || (boolean comparison). If [!] is set, the result will be flipped from true to false and vice versa. \c !if 1 < 0x2 \c !echo "1 is smaller than 2!!" \c !else if ! 3.1 > 1.99 \c !error "this line should never appear" \c !else \c !error "neither should this" \c !endif \c !if /FileExists ".\cert.pfx" \c !finalize '".\sign.bat" "%1"' \c !endif \S1{ifmacrodef} !ifmacrodef \c gflag [bcheck gflag [...]]] This command, when paired with an !endif command, will tell the compiler whether or not to compile the lines in between the two lines. If the macro gflag exists, then the contained lines will be compiled. Otherwise, they will be skipped. 'bcheck' can be specified as & (boolean and) or | (boolean or) along with more gflags -- precedence is simple, left to right. \c !macro SomeMacro \c !macroend \c !ifmacrodef SomeMacro \c !echo "SomeMacro is defined" \c !endif \S1{ifmacrondef} !ifmacrondef \c gflag [bcheck gflag [...]]] The opposite of !ifmacrodef. The lines will be compiled when the macro gflag does not exist. \S1{else} !else \c [if|ifdef|ifndef|ifmacrodef|ifmacrondef [...]] This command allows to easily insert different code when different defines or macros are set. You can create blocks like !ifdef/!else/!endif, !ifdef/!else ifdef/!else/!endif etc. \c !ifdef VERSION \c OutFile installer-${VERSION}.exe \c !else \c OutFile installer.exe \c !endif \S1{endif} !endif This command closes a block started with !if, !ifdef, !ifndef, !ifmacrodef or !ifmacrondef. \S1{insertmacro} !insertmacro \c macro_name [parameter] [...] Inserts the contents of a macro that was created with !macro. If the macro was created with parameters, then you must pass as many parameters to the macro as it requires. \c !macro Print text \c DetailPrint "${text}" \c !macroend \c !insertmacro Print "some text" \c !insertmacro Print "some more text" \S1{macro} !macro \c macro_name [parameter][...] Creates a macro named 'macro_name'. All lines between the !macro and the !macroend will be saved. To insert the macro later on, use !insertmacro. !macro definitions can have one or more parameters defined. The parameters may be accessed the same way a !define would (e.g. $\{PARMNAME\}) from inside the macro. \c !macro SomeMacro parm1 parm2 parm3 \c DetailPrint "${parm1}" \c MessageBox MB_OK "${parm2}" \c File "${parm3}" \c !macroend \S1{macroend} !macroend Ends a macro that was started with !macro. \S1{macroundef} !macroundef \c macro_name Deletes a macro. \S1{searchparse} !searchparse \c [/ignorecase] [/noerrors] [/file] source_string_or_file substring_start OUTPUTSYMBOL1 [substring [OUTPUTSYMBOL2 [substring ...]]] Parses \e{source_string_or_file} (which is treated as a string, or as a filename if \e{/file} is set), looking for \e{substring_start}. If \e{substring_start} is found, then \e{OUTPUTSYMBOL1} is defined to the rest of the string (minus any other \e{substring} that may be found). Any number of \e{OUTPUTSYMBOLx} may be specified, and the final \e{substring} is optional. If \e{/noerrors} is specified, matching less than the full number of strings is allowed (all \e{OUTPUTSYMBOLx} after the not-found substring will be ignored). If \e{/file} is specified, the file is treated as a series of lines. The file is searched until all substrings are matched. If \e{/noerrors} is specified and not all strings are matched, the first line with the most symbols matched is used. \c # search filename.cpp for a line '#define APP_VERSION "2.5"' and set ${VER_MAJOR} to 2, ${VER_MINOR} to 5. \c !searchparse /file filename.cpp `#define APP_VERSION "` VER_MAJOR `.` VER_MINOR `"` \S1{searchreplace} !searchreplace \c [/ignorecase] symbol_out source_string searchfor replacewith Searches \e{source_string}, looking for \e{searchfor} and replacing all instances of it with \e{replacewith}. Unlike !define, !searchreplace allows you to redefine \e{symbol_out} without warning or error. \c # defines ${blah} to "i like ponies" \c !searchreplace blah "i love ponies" "love" "like" nsis-3.11/Docs/src/file.but000077500000000000000000000160111477201124000155240ustar00rootroot00000000000000\S1{fileinst} File Instructions \S2{FileClose} FileClose \c handle Closes a file handle opened with \R{FileOpen}{FileOpen}. \S2{FileOpen} FileOpen \c user_var(handle output) filename openmode Opens a file named "filename" and sets the handle output variable with the handle. The openmode should be one of "r" (read) "w" (write, all contents of file are destroyed) or "a" (append, meaning opened for both read and write, contents preserved). In all open modes, the file pointer is placed at the beginning of the file. If the file cannot be opened the handle output is set to empty and the error flag is set. If no absolute path is specified the current folder will be used. The current folder is the folder set using the last \R{setoutpath}{SetOutPath} instruction. If you have not used \R{setoutpath}{SetOutPath} the current folder is \R{varother}{$EXEDIR}. \c FileOpen $0 $INSTDIR\file.dat r \c FileClose $0 \S2{FileRead} FileRead \c handle user_var(output) [maxlen] Reads a string (ANSI characters) from a file opened with \R{FileOpen}{FileOpen}. The string is read until either a newline (or carriage return newline pair) occurs, or until a null byte is read, or until maxlen is met (if specified). By default, strings are limited to 1024 characters (a special build with larger NSIS_MAX_STRLEN can be compiled or downloaded). If the end of file is reached and no more data is available, the output string will be empty and the error flag will be set. \NsisWarnBlockContainerBegin \NsisBlockHeaderExeheadU \#{This is a bug in exehead but it is probably a good idea to document it here...} DBCS text is supported but conversion output is limited to UCS-2/BMP, surrogate pairs are not supported. The \NsisACPcp is used during the conversion. \NsisWarnBlockContainerEnd \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat r \c IfErrors done \c FileRead $0 $1 \c DetailPrint $1 \c FileClose $0 \c done: \S2{FileReadUTF16LE} FileReadUTF16LE \c handle user_var(output) [maxlen] \NsisFuncReqU Reads a string (UTF-16LE characters) from a file opened with \R{FileOpen}{FileOpen}. The string is read until either a newline (or carriage return newline pair) occurs, or until a null wide-character is read, or until maxlen is met (if specified). By default, strings are limited to 1024 characters (a special build with larger NSIS_MAX_STRLEN can be compiled or downloaded). If the end of file is reached and no more data is available, the output string will be empty and the error flag will be set. If present, the BOM at the start of the file is skipped. \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat r \c IfErrors done \c FileReadUTF16LE $0 $1 \c DetailPrint $1 \c FileClose $0 \c done: \S2{FileReadByte} FileReadByte \c handle user_var(output) Reads a byte from a file opened with \R{FileOpen}{FileOpen}. The byte is stored in the output as an integer (0-255). If the end of file is reached and no more data is available, the output will be empty and the error flag will be set. \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat r \c IfErrors done \c FileReadByte $0 $1 \c FileReadByte $0 $2 \c DetailPrint "$1 $2" \c FileClose $0 \c done: \S2{FileReadWord} FileReadWord \c handle user_var(output) \NsisFuncReqU Reads a word (2-bytes) from a file opened with \R{FileOpen}{FileOpen}. The word is stored in the output as an integer (0-65535). If the end of file is reached and no more data is available, the output will be empty and the error flag will be set. \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat r \c IfErrors done \c FileReadWord $0 $1 \c FileReadWord $0 $2 \c DetailPrint "$1 $2" \c FileClose $0 \c done: \S2{FileSeek} FileSeek \c handle offset [mode] [user_var(new position)] Seeks a file opened with \R{FileOpen}{FileOpen}. If mode is omitted or specified as SET, the file is positioned to "offset", relative to the beginning of the file. If mode is specified as CUR, then the file is positioned to "offset", relative to the current file position. If mode is specified as END, then the file is positioned to "offset", relative to the end of the file. If the final parameter "new position" is specified, the new file position will be stored in that variable. \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat r \c IfErrors done \c FileSeek $0 -5 END \c FileRead $0 $1 \c DetailPrint $1 \c FileClose $0 \c done: \S2{FileWrite} FileWrite \c handle string Writes an ANSI string to a file opened with \R{FileOpen}{FileOpen}. If an error occurs writing, the error flag will be set. (If you are building a \R{intro-unicode}{Unicode installer}, the function converts the string to ANSI/MBCS. The \NsisACPcp is used during the conversion) \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat w \c IfErrors done \c FileWrite $0 "some text" \c FileClose $0 \c done: \S2{FileWriteUTF16LE} FileWriteUTF16LE \c [/BOM] handle string \NsisFuncReqU Writes a Unicode (UTF-16LE) string to a file opened with \R{FileOpen}{FileOpen}. If an error occurs, the error flag will be set. A BOM can be added to empty files with /BOM. \c ClearErrors \c FileOpen $0 $INSTDIR\file.dat w \c IfErrors done \c FileWriteUTF16LE $0 "some text" \c FileClose $0 \c done: \S2{FileWriteByte} FileWriteByte \c handle string Writes the integer interpretation of 'string' to a file opened with \R{FileOpen}{FileOpen}. The error flag is set if an error occurs while writing. The following code writes a "Carriage Return / Line Feed" pair to the file. \c FileWriteByte file_handle "13" \c FileWriteByte file_handle "10" Note that only the low byte of the integer is used, i.e. writing 256 is the same as writing 0, etc. \S2{FileWriteWord} FileWriteWord \c handle string \NsisFuncReqU Writes the integer interpretation of 'string' as a WORD (2-bytes, range: 0-65535) to a file opened with \R{FileOpen}{FileOpen}. The error flag is set if an error occurs while writing. The following code writes a "Carriage Return / Line Feed" pair to the file. \c FileWriteWord file_handle "13" \c FileWriteWord file_handle "10" Note that only the low WORD of the integer is used, i.e. writing 65536 is the same as writing 0, etc. \S2{FindClose} FindClose \c handle Closes a search opened with \R{FindFirst}{FindFirst}. \S2{FindFirst} FindFirst \c user_var(handle output) user_var(filename output) filespec Performs a search for 'filespec', placing the first file found in filename_output (a user variable). It also puts the handle of the search into handle_output (also a user variable). If no files are found, both outputs are set to empty and the error flag is set. \R{FindClose}{FindClose} must be used to close the handle. Note that the filename output is without path. \c FindFirst $0 $1 $INSTDIR\*.txt \c loop: \c StrCmp $1 "" done \c DetailPrint $1 \c FindNext $0 $1 \c Goto loop \c done: \c FindClose $0 \S2{FindNext} FindNext \c handle user_var(filename_output) Continues a search began with \R{FindFirst}{FindFirst}. handle should be the handle_output_variable returned by \R{FindFirst}{FindFirst}. If the search is completed (there are no more files), filename_output is set to empty and the error flag is set. Note that the filename output is without path. nsis-3.11/Docs/src/flowcontrol.but000077500000000000000000000260111477201124000171560ustar00rootroot00000000000000\S1{flowcontrol} Flow Control Instructions \S2{abort} Abort \c [user_message] Cancels the install, stops execution of script, and displays user_message in the status display. Note: you can use this from \R{callbacks}{Callback functions} to do special things. \R{pages}{Page callbacks} also uses \R{abort}{Abort} for special purposes. \c Abort \c Abort "can't install" \S2{call} Call \c function_name | :label_name | user_var(input) Calls the function named \e{function_name}, the label named \e{label_name}, or a variable that specifies an address. An address is returned by \R{getcurrentaddress}{GetCurrentAddress}, \R{getfunctionaddress}{GetFunctionAddress} or \R{getlabeladdress}{GetLabelAddress}. A call returns when it encounters a \R{return}{Return} instruction. Sections and functions are automatically ended with a \R{return}{Return} instruction. Uninstall functions cannot be called from installer functions and sections, and vice-versa. \c Function func \c Call :label \c DetailPrint "#1: This will only appear 1 time." \c label: \c DetailPrint "#2: This will appear before and after message #1." \c Call :.global_label \c FunctionEnd \c \c Section \c Call func \c Return \c \c .global_label: \c DetailPrint "#3: The global label was called" \c SectionEnd \S2{clearerrors} ClearErrors Clears the error flag. \c ClearErrors \c IfErrors 0 +2 \c MessageBox MB_OK "this message box will never show" \S2{getcurrentaddress} GetCurrentAddress \c user_var(output) Gets the address of the current instruction (the \R{getcurrentaddress}{GetCurrentAddress}) and stores it in the output user variable. This user variable then can be passed to \R{call}{Call} or \R{goto}{Goto}. \c Function func \c DetailPrint "function" \c IntOp $0 $0 + 2 ; Calculate the address after of the instruction after "Goto callFunc" in the Section \c Call $0 \c DetailPrint "function end" \c FunctionEnd \c \c Section \c DetailPrint "section" \c GetCurrentAddress $0 \c Goto callFunc \c \c DetailPrint "back in section" \c Return \c \c callFunc: \c Call func \c DetailPrint "section end" \c SectionEnd \S2{getfunctionaddress} GetFunctionAddress \c user_var(output) function_name Gets the address of the function and stores it in the output user variable. This user variable then can be passed to \R{call}{Call} or \R{goto}{Goto}. Note that if you \R{goto}{Goto} an address which is the output of \R{getfunctionaddress}{GetFunctionAddress}, your function will never be returned to (when the function you Goto'd to returns, you return instantly). \c Function func \c DetailPrint "function" \c FunctionEnd \c \c Section \c GetFunctionAddress $0 func \c Call $0 \c SectionEnd \S2{getlabeladdress} GetLabelAddress \c user_var(output) label Gets the address of the label and stores it in the output user variable. This user variable then can be passed to \R{call}{Call} or \R{goto}{Goto}. Note that you may only call this with labels accessible from your function, but you can call it from anywhere (which is potentially dangerous). Note that if you \R{call}{Call} the output of \R{getlabeladdress}{GetLabelAddress}, code will be executed until it Return's (explicitly or implicitly at the end of a function), and then you will be returned to the statement after the \R{call}{Call}. \c label: \c DetailPrint "label" \c GetLabelAddress $0 label \c IntOp $0 $0 + 4 \c Goto $0 \c DetailPrint "done" \S2{goto} Goto \c label_to_jump_to | +offset| -offset| user_var(target) If label is specified, goto the label 'label_to_jump_to:'. If +offset or -offset is specified, jump is relative by offset instructions. Goto +1 goes to the next instruction, Goto -1 goes to the previous instruction, etc. If a user variable is specified, jumps to absolute address (generally you will want to get this value from a function like \R{getlabeladdress}{GetLabelAddress}). Compiler flag commands and \R{ssectionin}{SectionIn} aren't instructions so jumping over them has no effect. \c Goto label \c Goto +2 \c Goto -2 \c Goto $0 \S2{ifabort} IfAbort \c label_to_goto_if_abort [label_to_goto_if_no_abort] Will "return" true if the installation has been aborted. This can happen if the user chose abort on a file that failed to create (or overwrite) or if the user aborted by hand. This function can only be called from the leave function of the instfiles \R{page}{page}. \c Page instfiles "" "" instfilesLeave \c \c Function instfilesLeave \c IfAbort 0 +2 \c MessageBox MB_OK "user aborted" \c FunctionEnd \S2{iferrors} IfErrors \c jumpto_iferror [jumpto_ifnoerror] Checks and clears the error flag, and if it is set, it will goto jumpto_iferror, otherwise it will goto jumpto_ifnoerror. The error flag is set by other instructions when a recoverable error (such as trying to delete a file that is in use) occurs. \c ClearErrors \c File file.dat \c IfErrors 0 +2 \c Call ErrorHandler \S2{iffileexists} IfFileExists \c file_to_check_for jump_if_present [jump_otherwise] Checks for existence of file(s) file_to_check_for (which can be a wildcard, or a directory), and Gotos jump_if_present if the file exists, otherwise Gotos jump_otherwise. If you want to check to see if a file is a directory, use \R{iffileexists}{IfFileExists} DIRECTORY\\*.* \c IfFileExists $WINDIR\notepad.exe 0 +2 \c MessageBox MB_OK "notepad is installed" \S2{ifrebootflag} IfRebootFlag \c jump_if_set [jump_if_not_set] Checks the reboot flag, and jumps to jump_if_set if the reboot flag is set, otherwise jumps to jump_if_not_set. The reboot flag can be set by \R{delete}{Delete} and \R{rename}{Rename}, or manually with \R{setrebootflag}{SetRebootFlag}. \c IfRebootFlag 0 noreboot \c MessageBox MB_YESNO "A reboot is required to finish the installation. Do you wish to reboot now?" IDNO noreboot \c Reboot \c noreboot: \S2{ifsilent} IfSilent \c jump_if_silent [jump_if_not] Checks the silent flag, and jumps to jump_if_silent if the installer is silent, otherwise jumps to jump_if_not. The silent flag can be set by \R{asilentinstall}{SilentInstall}, \R{asilentuninstall}{SilentUninstall}, \R{setsilent}{SetSilent} and by the user passing /S on the command line. \c IfSilent +2 \c ExecWait '"$INSTDIR\nonsilentprogram.exe"' \S2{ifshellvarcontextall} IfShellVarContextAll \c jump_if_true [jump_if_false] Checks if \R{setshellvarcontext}{SetShellVarContext} is set to \e{all}. \S2{ifrtllanguage} IfRtlLanguage \c jump_if_true [jump_if_false] Checks if active language is a RTL language. \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning Do not call this in [un].onInit because the language file has not been fully initialized. \NsisWarnBlockContainerEnd \S2{intcmp} IntCmp \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] Compares two integers val1 and val2. If val1 and val2 are equal, Gotos jump_if_equal, otherwise if val1 < val2, Gotos jump_if_val1_less, otherwise if val1 > val2, Gotos jump_if_val1_more. \c IntCmp $0 5 is5 lessthan5 morethan5 \c is5: \c DetailPrint "$$0 == 5" \c Goto done \c lessthan5: \c DetailPrint "$$0 < 5" \c Goto done \c morethan5: \c DetailPrint "$$0 > 5" \c Goto done \c done: \S2{intcmpu} IntCmpU \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] Same as \R{intcmp}{IntCmp}, but treats the values as unsigned integers. \S2{int64cmp} Int64Cmp \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] Same as \R{intcmp}{IntCmp}, but treats the values as 64-bit integers. \NsisFuncReq64 \S2{int64cmpu} Int64CmpU \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] Same as \R{intcmp}{IntCmp}, but treats the values as 64-bit unsigned integers. \NsisFuncReq64 \S2{intptrcmp} IntPtrCmp \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] Same as \R{intcmp}{IntCmp}, but treats the values as pointer sized integers. \S2{intptrcmpu} IntPtrCmpU \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] Same as \R{intcmp}{IntCmp}, but treats the values as pointer sized unsigned integers. \S2{messagebox} MessageBox \c mb_option_list messagebox_text [/SD return] [return_check jumpto [return_check_2 jumpto_2]] Displays a \R{messagebox}{MessageBox} containing the text "messagebox_text". mb_option_list must be one or more of the following, delimited by |s (e.g. MB_YESNO|MB_ICONSTOP). \b \e{MB_OK} - Display with an OK button \b \e{MB_OKCANCEL} - Display with an OK and a cancel button \b \e{MB_ABORTRETRYIGNORE} - Display with abort, retry, ignore buttons \b \e{MB_RETRYCANCEL} - Display with retry and cancel buttons \b \e{MB_YESNO} - Display with yes and no buttons \b \e{MB_YESNOCANCEL} - Display with yes, no, cancel buttons \b \e{MB_ICONEXCLAMATION} - Display with exclamation icon \b \e{MB_ICONINFORMATION} - Display with information icon \b \e{MB_ICONQUESTION} - Display with question mark icon \b \e{MB_ICONSTOP} - Display with stop icon \b \e{MB_USERICON} - Display with installer's icon \b \e{MB_TOPMOST} - Make messagebox topmost \b \e{MB_SETFOREGROUND} - Set foreground \b \e{MB_RIGHT} - Right align text \b \e{MB_RTLREADING} - RTL reading order \b \e{MB_DEFBUTTON1} - Button 1 is default \b \e{MB_DEFBUTTON2} - Button 2 is default \b \e{MB_DEFBUTTON3} - Button 3 is default \b \e{MB_DEFBUTTON4} - Button 4 is default Return_check can be 0 (or empty, or left off), or one of the following: \b \e{IDABORT} - Abort button \b \e{IDCANCEL} - Cancel button \b \e{IDIGNORE} - Ignore button \b \e{IDNO} - No button \b \e{IDOK} - OK button \b \e{IDRETRY} - Retry button \b \e{IDYES} - Yes button If the return value of the \R{messagebox}{MessageBox} is return_check, the installer will Goto jumpto. Use the /SD parameter with one of the return_check values above to specify the option that will be used when the installer is silent. See \k{silent} for more information. \c MessageBox MB_OK "simple message box" \c MessageBox MB_YESNO "is it true?" IDYES true IDNO false \c true: \c DetailPrint "it's true!" \c Goto next \c false: \c DetailPrint "it's false" \c next: \c MessageBox MB_YESNO "is it true? (defaults to yes on silent installations)" /SD IDYES IDNO false2 \c DetailPrint "it's true (or silent)!" \c Goto next2 \c false2: \c DetailPrint "it's false" \c next2: \S2{return} Return Returns from a function or section. \c Function func \c StrCmp $0 "return now" 0 +2 \c Return \c # do stuff \c FunctionEnd \c \c Section \c Call func \c ;"Return" will return here \c SectionEnd \S2{quit} Quit Causes the installer to exit as soon as possible. After \R{quit}{Quit} is called, the installer will exit (no callback functions will get a chance to run). \S2{seterrors} SetErrors Sets the error flag. \c SetErrors \c IfErrors 0 +2 \c MessageBox MB_OK "this message box will always show" \S2{strcmp} StrCmp \c str1 str2 jump_if_equal [jump_if_not_equal] Compares (case insensitively) str1 to str2. If str1 and str2 are equal, Gotos jump_if_equal, otherwise Gotos jump_if_not_equal. \c StrCmp $0 "a string" 0 +3 \c DetailPrint '$$0 == "a string"' \c Goto +2 \c DetailPrint '$$0 != "a string"' \S2{strcmps} StrCmpS \c str1 str2 jump_if_equal [jump_if_not_equal] Same as \R{strcmp}{StrCmp}, but case sensitive. nsis-3.11/Docs/src/functions.but000077500000000000000000000020511477201124000166140ustar00rootroot00000000000000\H{functions} Functions Functions are similar to Sections in that they contain zero or more instructions. User functions are not called by the installer directly, instead they are called from Sections using the \R{call}{Call} instruction. Callback functions will be called by the installer when a certain event occurs. Functions must be declared outside of Sections or other Functions. \S1{ffunctioncommands} Function Commands \S2{ffunction} Function \c [function_name] Begins and opens a new function. \R{ffunction}{Function} names beginning with "." (e.g. ".Whatever") are generally reserved for callback functions. \R{ffunction}{Function} names beginning with "un." are functions that will be generated in the Uninstaller. Hence, normal install Sections and functions cannot call uninstall functions, and the Uninstall Section and uninstall functions cannot call normal functions. \c Function func \c # some commands \c FunctionEnd \c \c Section \c Call func \c SectionEnd \S2{ffunctionend} FunctionEnd This command closes the current open function.nsis-3.11/Docs/src/generalpurpose.but000077500000000000000000000233421477201124000176450ustar00rootroot00000000000000\S1{generalpurpose} General Purpose Instructions \S2{callinstdll} CallInstDLL \c dllfile function_name Calls a function named \e{function_name} inside a NSIS extension DLL, a plug-in. See the \L{../Examples/Plugin/}{example plugin} for how to make one. Extension DLLs can access the stack and variables. Note: To automatically extract and call plug-in DLLs, use a plug-in command instead of \R{callinstdll}{CallInstDLL}. \c Push "a parameter" \c Push "another parameter" \c CallInstDLL $INSTDIR\somedll.dll somefunction For easier plug-in handling, use the new \R{plugindlls}{plug-in call syntax}. \S2{copyfiles} CopyFiles \c [/SILENT] [/FILESONLY] filespec_on_destsys destination_path [size_of_files_in_kb] Copies files from the source to the destination on the installing system. Useful with $EXEDIR if you want to copy from installation media, or to copy from one place to another on the system. You might see a Windows status window of the copy operation if the operation takes a lot of time (to disable this, use /SILENT). The last parameter can be used to specify the size of the files that will be copied (in kilobytes), so that the installer can approximate the disk space requirements. On error, or if the user cancels the copy (only possible when /SILENT was omitted), the error flag is set. If /FILESONLY is specified, only files are copied. Fully-qualified path names should always be used with this instruction. Using relative paths will have unpredictable results. \c CreateDirectory $INSTDIR\backup \c CopyFiles $INSTDIR\*.dat $INSTDIR\backup \S2{createdirectory} CreateDirectory \c path_to_create Creates (recursively if necessary) the specified directory. The error flag is set if the directory couldn't be created. You should always specify an absolute path. \c CreateDirectory $INSTDIR\some\directory \S2{createshortcut} CreateShortcut \c [/NoWorkingDir] link.lnk target.file [parameters [icon.file [icon_index_number [start_options [keyboard_shortcut [description]]]]]] Creates a shortcut 'link.lnk' that links to 'target.file', with optional parameters 'parameters'. You must specify an absolute path to the .lnk file. The icon used for the shortcut is 'icon.file,icon_index_number'; for default icon settings use empty strings for both icon.file and icon_index_number. start_options should be one of: \e{SW_SHOWNORMAL}, \e{SW_SHOWMAXIMIZED}, \e{SW_SHOWMINIMIZED}, or an empty string. keyboard_shortcut should be in the form of 'flag|c' where flag can be a combination (using |) of: \e{ALT}, \e{CONTROL}, \e{EXT}, or \e{SHIFT}. c is the character to use (a-z, A-Z, 0-9, F1-F24, etc). Note that no spaces are allowed in this string. A good example is "ALT|CONTROL|F8". $OUTDIR is stored as the shortcut's working directory property. You can change it by using \R{setoutpath}{SetOutPath} before creating the shortcut or use /NoWorkingDir if you don't need to set the working directory property. description should be the description of the shortcut, or comment as it is called under XP. The error flag is set if the shortcut cannot be created (i.e. either of the paths (link or target) does not exist, or some other error). \c CreateShortcut "$DESKTOP\My Program.lnk" "$INSTDIR\My Program.exe" \c CreateDirectory "$SMPROGRAMS\My Company" \c CreateShortcut "$SMPROGRAMS\My Company\My Program.lnk" "$INSTDIR\My Program.exe" \ \c "some command line parameters" "$INSTDIR\My Program.exe" 2 SW_SHOWNORMAL \ \c ALT|CONTROL|SHIFT|F5 "a description" \S2{getwinver} GetWinVer \c user_var(output) Major|Minor|Build|ServicePack Gets the Windows version as reported by GetVersionEx. WinVer.nsh is the preferred method for performing Windows version checks. \c GetWinVer $1 Build \S2{getdllversion} GetDLLVersion \c [/ProductVersion] filename user_var(high dword output) user_var(low dword output) Gets the version information from the DLL (or any other executable containing version information) in "filename". Sets the user output variables with the high and low dwords of version information on success; on failure the outputs are empty and the error flag is set. The following example reads the DLL version and copies a human readable version of it into $0: \c GetDllVersion "$INSTDIR\MyDLL.dll" $R0 $R1 \c IntOp $R2 $R0 / 0x00010000 \c IntOp $R3 $R0 & 0x0000FFFF \c IntOp $R4 $R1 / 0x00010000 \c IntOp $R5 $R1 & 0x0000FFFF \c StrCpy $0 "$R2.$R3.$R4.$R5" \S2{getdllversionlocal} GetDLLVersionLocal \c [/ProductVersion] localfilename user_var(high dword output) user_var(low dword output) This is similar to \R{getdllversion}{GetDLLVersion}, only it acts on the system building the installer (it actually compiles into two \R{StrCpy}{StrCpy} commands). Sets the two output variables with the DLL version information of the DLL on the build system. Use \R{ppgetdllversion}{!getdllversion} if you need to use the values with \R{viproductversion}{VIProductVersion}. \S2{getfiletime} GetFileTime \c filename user_var(high dword output) user_var(low dword output) Gets the last write time of "filename". Sets the user output variables with the high and low dwords of the FILETIME timestamp on success; on failure the outputs are empty and the error flag is set. \S2{getfiletimelocal} GetFileTimeLocal \c localfilename user_var(high dword output) user_var(low dword output) This is similar to \R{getfiletime}{GetFileTime}, only it acts on the system building the installer (it actually compiles into two \R{StrCpy}{StrCpy} commands). Sets the two output variables with the file timestamp of the file on the build system. \S2{getknownfolderpath} GetKnownFolderPath \c user_var(output) knownfolderid Get the path of a \W{https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid}{known folder}. The error flag is set and the output variable is empty if the call fails or the knownfolderid guid is not available. This function is only able to resolve known folders on Windows Vista or higher. \c !include WinCore.nsh \c !include LogicLib.nsh \c \c Function .onInit \c ${If} $InstDir == "" \c GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles} ; This exists on Win7+ \c StrCmp $InstDir "" 0 +2 \c StrCpy $InstDir "$LocalAppData\Programs" ; Fallback directory \c StrCpy $InstDir "$InstDir\$(^Name)" \c ${EndIf} \c FunctionEnd \S2{getfullpathname} GetFullPathName \c [/SHORT] user_var(output) path_or_file Assign the full path of the file specified to user variable $x. If the path portion of the parameter is not found, the error flag will be set and $x will be empty. If /SHORT is specified, the path is converted to the short filename form. However, if /SHORT is not specified, the path isn't converted to its long filename form. To get the long filename, call GetLongPathName using the System plug-in. Note that GetLongPathName is only available on Windows 98, Windows 2000 and above. \c StrCpy $INSTDIR $PROGRAMFILES\NSIS \c SetOutPath $INSTDIR \c GetFullPathName $0 .. \c DetailPrint $0 # will print C:\Program Files \c GetFullPathName /SHORT $0 $INSTDIR \c DetailPrint $0 # will print C:\Progra~1\NSIS \c StrCpy $0 C:\Progra~1\NSIS \c System::Call 'kernel32::GetLongPathName(t r0, t .r1, i ${NSIS_MAX_STRLEN}) i .r2' \c StrCmp $2 error +2 \c StrCpy $0 $1 \c DetailPrint $0 # will print C:\Program Files\NSIS, where supported \S2{gettempfilename} GetTempFileName \c user_var(output) [base_dir] Assign to the user variable $x, the name of a temporary file. The file will be created for you and it will be empty. The name of the temporary file is guaranteed to be unique. If to want the temporary file to be created in another directory other than the Windows temp directory, specify a base_dir. You should \R{delete}{Delete} the file when you are done with it. \c GetTempFileName $0 \c File /oname=$0 something.dat \c # do something with something.dat \c Delete $0 \S2{searchpath} SearchPath \c user_var(output) filename Assign to the user variable $x, the full path of the file named by the second parameter. The error flag will be set and $x will be empty if the file cannot be found. Uses \W{http://msdn.microsoft.com/en-us/library/aa365527}{SearchPath()} to search the system paths for the file. \S2{setfileattributes} SetFileAttributes \c filename attribute1|attribute2|... Sets the file attributes of 'filename'. Valid attributes can be combined with | and are: \b \e{NORMAL} or \e{FILE_ATTRIBUTE_NORMAL} (you can use 0 to abbreviate this) \b \e{ARCHIVE} or \e{FILE_ATTRIBUTE_ARCHIVE} \b \e{HIDDEN} or \e{FILE_ATTRIBUTE_HIDDEN} \b \e{OFFLINE} or \e{FILE_ATTRIBUTE_OFFLINE} \b \e{READONLY} or \e{FILE_ATTRIBUTE_READONLY} \b \e{SYSTEM} or \e{FILE_ATTRIBUTE_SYSTEM} \b \e{TEMPORARY} or \e{FILE_ATTRIBUTE_TEMPORARY} \b \e{NOTINDEXED} or \e{FILE_ATTRIBUTE_NOT_CONTENT_INDEXED} The error flag will be set if the file's attributes cannot be set (i.e. the file doesn't exist, or you don't have the right permissions). You can only set attributes. It's not possible to unset them. If you want to remove an attribute use NORMAL. This way all attributes are erased. This command doesn't support wildcards. \S2{regdll} RegDLL \c dllfile [entrypoint_name] Loads the specified DLL and calls DllRegisterServer (or entrypoint_name if specified). The error flag is set if an error occurs (i.e. it can't load the DLL, initialize OLE, find the entry point, or the function returned anything other than ERROR_SUCCESS (=0)). Use \R{setoutpath}{SetOutPath} to set the current directory for DLLs that depend on other DLLs that are now in the path or in the Windows directory. For example, if foo.dll depends on bar.dll which is located in $INSTDIR use: \c SetOutPath $INSTDIR \c RegDLL $INSTDIR\foo.dll \S2{unregdll} UnRegDLL \c dllfile Loads the specified DLL and calls DllUnregisterServer. The error flag is set if an error occurs (i.e. it can't load the DLL, initialize OLE, find the entry point, or the function returned anything other than ERROR_SUCCESS (=0)). nsis-3.11/Docs/src/headers.but000077500000000000000000002020461477201124000162250ustar00rootroot00000000000000\A{headers} Useful Headers \b \R{tut-logic}{LogicLib} - Evaluate various logic statements with helper macros. \b Memento.nsh - Remember the users components selection. \b \R{modernui}{Modern User Interface} - A MSI inspired interface. \b \L{../Docs/MultiUser/Readme.html}{Multi-User} - Install for a single user or for all users on the computer. \b Sections.nsh - Manipulate Sections. \b WinVer.nsh - Detect Windows version. \b x64.nsh - Detect CPU architecture and bitness. \H{filefunc} File Functions Header \S1{} Introduction Include header: \c !include "FileFunc.nsh" Call functions: \c Section Install \c ${GetFileExt} "C:\My Downloads\Index.html" $R0 \c ; $R0="html" \c SectionEnd \c Section un.Install \c ${GetParent} "C:\My Downloads\Index.html" $R0 \c ; $R0="C:\My Downloads" \c SectionEnd \S1{locate} Locate \b Find files, directories and empty directories with mask and size options. \\Syntax:\\ \c ${Locate} "[Path]" "[Options]" "Function" \c "[Path]" ; Disk or Directory \c ; \c "[Options]" ; /L=[FD|F|D|DE|FDE] \c ; /L=FD - Locate Files and Directories (default) \c ; /L=F - Locate Files only \c ; /L=D - Locate Directories only \c ; /L=DE - Locate Empty Directories only \c ; /L=FDE - Locate Files and Empty Directories \c ; /M=[mask] \c ; /M=*.* - Locate all (default) \c ; /M=*.doc - Locate Work.doc, 1.doc ... \c ; /M=Pho* - Locate PHOTOS, phone.txt ... \c ; /M=win???.exe - Locate winamp.exe, winver.exe ... \c ; /M=winamp.exe - Locate winamp.exe only \c ; /S=No:No[B|K|M|G] \c ; /S= - Don't locate file size (faster) (default) \c ; /S=0:0B - Locate only files of 0 Bytes exactly \c ; /S=5:9K - Locate only files of 5 to 9 Kilobytes \c ; /S=:10M - Locate only files of 10 Megabyte or less \c ; /S=1G - Locate only files of 1 Gigabyte or more \c ; /G=[1|0] \c ; /G=1 - Locate with subdirectories (default) \c ; /G=0 - Locate without subdirectories \c ; /B=[0|1] \c ; /B=0 - Banner isn't used (default) \c ; /B=1 - Banner is used. Callback when function \c ; start to search in new directory \c "Function" ; Callback function when found \c \c Function "Function" \c ; $R9 "path\name" \c ; $R8 "path" \c ; $R7 "name" \c ; $R6 "size" ($R6="" if directory, $R6="0" if file with /S=) \c \c ; $R0-$R5 are not used (save data in them). \c ; ... \c \c Push $var ; If $var="StopLocate" Then exit from function \c FunctionEnd \\Note:\\ \\- Error flag if disk or directory isn't exist \\- Error flag if syntax error \\- See also: \W{http://nsis.sf.net/Locate_plugin}{Locate plugin} \\Example (Find one file):\\ \c Section \c ${Locate} "C:\ftp" "/L=F /M=RPC DCOM.rar /S=1K" "Example1" \c ; 'RPC DCOM.rar' file in 'C:\ftp' with size 1 Kb or more \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c MessageBox MB_OK "$$R0=$R0" \c SectionEnd \c \c Function Example1 \c StrCpy $R0 $R9 \c ; $R0="C:\ftp\files\RPC DCOM.rar" \c \c MessageBox MB_YESNO '$R0$\n$\nFind next?' IDYES +2 \c StrCpy $0 StopLocate \c \c Push $0 \c FunctionEnd \\Example (Write results to a text file):\\ \c Section \c GetTempFileName $R0 \c FileOpen $R1 $R0 w \c ${Locate} "C:\ftp" "/S=:2M /G=0" "Example2" \c ; folders and all files with size 2 Mb or less \c ; don't scan subdirectories \c FileClose $R1 \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c Exec '"notepad.exe" "$R0"' \c SectionEnd \c \c Function Example2 \c StrCmp $R6 '' 0 +3 \c FileWrite $R1 "Directory=$R9$\r$\n" \c goto +2 \c FileWrite $R1 "File=$R9 Size=$R6 Mb$\r$\n" \c \c Push $0 \c FunctionEnd \\Example (Write results to an INI file):\\ \c Section \c GetTempFileName $R0 \c ${Locate} "C:\ftp" "/L=F /S=0K" "Example3" \c ; all files in 'C:\ftp' with size detect in Kb \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c Exec '"notepad.exe" "$R0"' \c SectionEnd \c \c Function Example3 \c WriteINIStr $R0 "$R8" "$R7" "$R6 Kb" \c \c Push $0 \c FunctionEnd \\Example (Delete empty directories):\\ \c Section \c StrCpy $R2 0 \c StrCpy $R3 0 \c \c loop: \c StrCpy $R1 0 \c ${Locate} "C:\ftp" "/L=DE" "Example4" \c IntOp $R3 $R3 + 1 \c IntOp $R2 $R2 + $R1 \c StrCmp $R0 StopLocate +2 \c StrCmp $R1 0 0 loop \c \c IfErrors 0 +2 \c MessageBox MB_OK 'error' IDOK +2 \c MessageBox MB_OK '$R2 directories were removed$\n$R3 loops' \c SectionEnd \c \c Function Example4 \c MessageBox MB_YESNOCANCEL 'Delete empty "$R9"?' IDNO end IDCANCEL cancel \c RMDir $R9 \c IntOp $R1 $R1 + 1 \c goto end \c \c cancel: \c StrCpy $R0 StopLocate \c \c end: \c Push $R0 \c FunctionEnd \\Example (Move all files into one folder):\\ \c Section \c StrCpy $R0 "C:\ftp" ;Directory move from \c StrCpy $R1 "C:\ftp2" ;Directory move into \c \c StrCpy $R2 0 \c StrCpy $R3 0 \c ${Locate} "$R0" "/L=F" "Example5" \c \c IfErrors 0 +2 \c MessageBox MB_OK 'error' IDOK +4 \c StrCmp $R3 0 0 +2 \c MessageBox MB_OK '$R2 files were moved' IDOK +2 \c MessageBox MB_OK '$R2 files were moved$\n$R3 files were NOT moved' \c SectionEnd \c \c Function Example5 \c StrCmp $R8 $R1 +6 \c IfFileExists '$R1\$R7' +4 \c Rename $R9 '$R1\$R7' \c IntOp $R2 $R2 + 1 \c goto +2 \c IntOp $R3 $R3 + 1 \c \c Push $0 \c FunctionEnd \\Example (Copy files with log):\\ \c Section \c StrCpy $R0 "C:\ftp" ;Directory copy from \c StrCpy $R1 "C:\ftp2" ;Directory copy into \c StrLen $R2 $R0 \c \c GetTempFileName $0 \c FileOpen $R3 $0 w \c ${Locate} "$R0" "/L=FDE" "Example6" \c FileClose $R3 \c \c IfErrors 0 +2 \c MessageBox MB_OK 'error' \c \c Exec '"notepad.exe" "$0"' ;view log \c SectionEnd \c \c Function Example6 \c StrCpy $1 $R8 '' $R2 \c \c StrCmp $R6 '' 0 +3 \c CreateDirectory '$R1$1\$R7' \c goto end \c CreateDirectory '$R1$1' \c CopyFiles /SILENT $R9 '$R1$1' \c \c IfFileExists '$R1$1\$R7' 0 +3 \c FileWrite $R3 "-old:$R9 -new:$R1$1\$R7 -success$\r$\n" \c goto +2 \c FileWrite $R3 "-old:$R9 -new:$R1$1\$R7 -failed$\r$\n" \c \c end: \c Push $0 \c FunctionEnd \\Example (Recreate directory structure):\\ \c Section \c StrCpy $R0 "C:\ftp" ;Directory structure from \c StrCpy $R1 "C:\ftp2" ;Directory structure into \c StrLen $R2 $R0 \c \c ${Locate} "$R0" "/L=D" "Example7" \c \c IfErrors 0 +2 \c MessageBox MB_OK 'error' \c SectionEnd \c \c Function Example7 \c StrCpy $1 $R9 '' $R2 \c CreateDirectory '$R1$1' \c \c Push $0 \c FunctionEnd \\Example (Locate with banner - \W{https://nsis.sourceforge.io/Nxs_plug-in}{NxS plugin} required):\\ \c Section \c nxs::Show /NOUNLOAD `$(^Name) Setup` /top \ \c `Setup searching something$\r$\nPlease wait... If you can..` \ \c /h 1 /can 1 /end \c ${Locate} "C:\WINDOWS" "/L=F /M=*.inf /B=1" "Example8" \c nxs::Destroy \c SectionEnd \c \c Function Example8 \c StrCmp $R0 $R8 abortcheck \c StrCpy $R0 $R8 \c nxs::Update /NOUNLOAD /sub "$R8" /pos 78 /end \c \c abortcheck: \c nxs::HasUserAborted /NOUNLOAD \c Pop $0 \c StrCmp $0 1 0 +2 \c StrCpy $0 StopLocate \c \c StrCmp $R9 '' end \c ;... \c \c end: \c Push $0 \c FunctionEnd \S1{getsize} GetSize \b Find the size of a file, files mask or directory. \b Find the sum of the files, directories and subdirectories. \\Syntax:\\ \c ${GetSize} "[Path]" "[Options]" $var1 $var2 $var3 \c "[Path]" ; Disk or Directory \c ; \c "[Options]" ; /M=[mask] \c ; /M=*.* - Find all (default) \c ; /M=*.doc - Find Work.doc, 1.doc ... \c ; /M=Pho* - Find PHOTOS, phone.txt ... \c ; /M=win???.exe - Find winamp.exe, winver.exe ... \c ; /M=winamp.exe - Find winamp.exe only \c ; /S=No:No[B|K|M|G] \c ; /S= - Don't find file size (faster) (default) \c ; /S=0:0B - Find only files of 0 Bytes exactly \c ; /S=5:9K - Find only files of 5 to 9 Kilobytes \c ; /S=:10M - Find only files of 10 Megabyte or less \c ; /S=1G - Find only files of 1 Gigabyte or more \c ; /G=[1|0] \c ; /G=1 - Find with subdirectories (default) \c ; /G=0 - Find without subdirectories \c ; \c $var1 ; Result1: Size \c $var2 ; Result2: Sum of files \c $var3 ; Result3: Sum of directories \\Note:\\ \\- Error flag if disk or directory isn't exist \\- Error flag if syntax error \\- See also: \W{http://nsis.sf.net/Locate_plugin}{Locate plugin} \\Examples:\\ \c Section 'Find file size of "$WINDIR\Explorer.exe" in KiB' \c \c ${GetSize} "$WINDIR" "/M=Explorer.exe /S=0K /G=0" $0 $1 $2 \c ; $0="220" KiB \c ; $1="1" files \c ; $2="" directories \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c Section 'Find folder size of "C:\Installs\Drivers" in MiB' \c \c ${GetSize} "C:\Installs\Drivers" "/S=0M" $0 $1 $2 \c ; $0="132" MiB \c ; $1="555" files \c ; $2="55" directories \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c Section 'Find sum of files and folders in "$WINDIR" (no subfolders)' \c \c ${GetSize} "$WINDIR" "/G=0" $0 $1 $2 \c ; $0="" size \c ; $1="253" files \c ; $2="46" directories \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \S1{drivespace} DriveSpace \b Get total, occupied or free space of the drive. \\Syntax:\\ \c ${DriveSpace} "[Drive]" "[Options]" $var \c "[Drive]" ; Disk to check \c ; \c "[Options]" ; /D=[T|O|F] \c ; /D=T - Total space (default) \c ; /D=O - Occupied space \c ; /D=F - Free space \c ; /S=[B|K|M|G] \c ; /S=B - size in Bytes (default) \c ; /S=K - size in Kilobytes \c ; /S=M - size in Megabytes \c ; /S=G - size in Gigabytes \c ; \c $var ; Result: Size \\Note:\\ \\- Error flag if disk isn't exist or not ready \\- Error flag if syntax error \\Example:\\ \c Section \c ${DriveSpace} "C:\" "/D=F /S=M" $R0 \c ; $R0="2530" megabytes free on drive C: \c SectionEnd \S1{getdrives} GetDrives \b Find all available drives in the system. \\Syntax:\\ \c ${GetDrives} "[Option]" "Function" \c "[Option]" ; [FDD+HDD+CDROM+NET+RAM] \c ; FDD Floppy Disk Drives \c ; HDD Hard Disk Drives \c ; CDROM CD-ROM Drives \c ; NET Network Drives \c ; RAM RAM Disk Drives \c ; \c ; [ALL] \c ; Find all drives by letter (default) \c ; \c "Function" ; Callback function when found \c \c Function "Function" \c ; $9 "drive letter" (a:\ c:\ ...) \c ; $8 "drive type" (FDD HDD ...) \c \c ; $R0-$R9 are not used (save data in them). \c ; ... \c \c Push $var ; If $var="StopGetDrives" Then exit from function \c FunctionEnd \\Example1:\\ \c Section \c ${GetDrives} "FDD+CDROM" "Example1" \c SectionEnd \c \c Function Example1 \c MessageBox MB_OK "$9 ($8 Drive)" \c \c Push $0 \c FunctionEnd \\Example2:\\ \c Section \c ${GetDrives} "ALL" "Example2" \c SectionEnd \c \c Function Example2 \c MessageBox MB_OK "$9 ($8 Drive)" \c \c Push $0 \c FunctionEnd \\Example3 (Get type of drive):\\ \c Section \c StrCpy $R0 "D:\" ;Drive letter \c StrCpy $R1 "invalid" \c \c ${GetDrives} "ALL" "Example3" \c \c MessageBox MB_OK "Type of drive $R0 is $R1" \c SectionEnd \c \c Function Example3 \c StrCmp $9 $R0 0 +3 \c StrCpy $R1 $8 \c StrCpy $0 StopGetDrives \c \c Push $0 \c FunctionEnd \S1{gettime} GetTime \b Get local or system time. \b Get file time (access, creation and modification). \\Syntax:\\ \c ${GetTime} "[File]" "[Option]" $var1 $var2 $var3 $var4 $var5 $var6 $var7 \c "[File]" ; Ignored if "L" or "LS" \c ; \c "[Option]" ; [Options] \c ; L Local time \c ; A last Access file time \c ; C Creation file time \c ; M Modification file time \c ; LS System time (UTC) \c ; AS last Access file time (UTC) \c ; CS Creation file time (UTC) \c ; MS Modification file time (UTC) \c ; \c $var1 ; Result1: day \c $var2 ; Result2: month \c $var3 ; Result3: year \c $var4 ; Result4: day of week name \c $var5 ; Result5: hour \c $var6 ; Result6: minute \c $var7 ; Result7: seconds \\Note:\\ \\- Error flag if file isn't exist \\- Error flag if syntax error \\- See also: \W{http://nsis.sf.net/Time_plugin}{Time plugin} \\Examples:\\ \c Section 'Get local time' \c ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6 \c ; $0="01" day \c ; $1="04" month \c ; $2="2005" year \c ; $3="Friday" day of week name \c ; $4="16" hour \c ; $5="05" minute \c ; $6="50" seconds \c \c MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6' \c SectionEnd \c Section 'Get file time' \c ${GetTime} "$WINDIR\Explorer.exe" "C" $0 $1 $2 $3 $4 $5 $6 \c ; $0="12" day \c ; $1="10" month \c ; $2="2004" year \c ; $3="Tuesday" day of week name \c ; $4="2" hour \c ; $5="32" minute \c ; $6="03" seconds \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6' \c SectionEnd \c Section 'Get system time' \c ${GetTime} "" "LS" $0 $1 $2 $3 $4 $5 $6 \c ; $0="01" day \c ; $1="04" month \c ; $2="2005" year \c ; $3="Friday" day of week name \c ; $4="11" hour \c ; $5="05" minute \c ; $6="50" seconds \c \c MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6' \c SectionEnd \c Section 'Convert time to 12-hour format AM/PM' \c ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6 \c \c StrCmp $4 0 0 +3 \c StrCpy $4 12 \c goto +3 \c StrCmp $4 12 +5 \c IntCmp $4 12 0 0 +3 \c StrCpy $7 AM \c goto +3 \c IntOp $4 $4 - 12 \c StrCpy $7 PM \c \c MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6 $7' \c SectionEnd \S1{getfileattributes} GetFileAttributes \b Get attributes of file or directory. \\Syntax:\\ \c ${GetFileAttributes} "[File]" "[Attributes]" $var \c "[File]" ; File or directory \c ; \c "[Attributes]" ; "ALL" (default) \c ; -all attributes of file combined with "|" to output \c ; \c ; "READONLY|HIDDEN|SYSTEM|DIRECTORY|ARCHIVE| \c ; DEVICE|NORMAL|TEMPORARY|SPARSE_FILE|REPARSE_POINT| \c ; COMPRESSED|OFFLINE|NOT_CONTENT_INDEXED|ENCRYPTED" \c ; -file must have specified attributes \c ; \c $var ; Result: \c ; $var=attr1|attr2|... (if used "ALL") \c ; $var=1 file has specified attributes \c ; $var=0 file has no specified attributes \\Note:\\ \\- Error flag is set if file doesn't exist \\Example:\\ \c Section \c ${GetFileAttributes} "C:\MSDOS.SYS" "ALL" $R0 \c ; $R0=READONLY|HIDDEN|SYSTEM|ARCHIVE \c \c ${GetFileAttributes} "C:\MSDOS.SYS" "SYSTEM|HIDDEN" $R0 \c ; $R0=1 \c \c ${GetFileAttributes} "C:\MSDOS.SYS" "NORMAL" $R0 \c ; $R0=0 \c SectionEnd \S1{getfileversion} GetFileVersion \b Get version information from executable file. \\Syntax:\\ \c ${GetFileVersion} "[Executable]" $var \c "[Executable]" ; Executable file (*.exe *.dll ...) \c $var ; Result: Version number \\Note:\\ \\- Error flag if file doesn't exist \\- Error flag if file doesn't contain version information \\Example:\\ \c ${GetFileVersion} "C:\ftp\program.exe" $R0 ; $R0="1.1.0.12" \S1{getexename} GetExeName \b Get installer filename (with valid case for Windows 98/Me). \\Syntax:\\ \c ${GetExeName} $var \\Example:\\ \c ${GetExeName} $R0 ; $R0="C:\ftp\program.exe" \S1{getexepath} GetExePath \b Get installer pathname ($EXEDIR with valid case for Windows 98/Me). \\Syntax:\\ \c ${GetExePath} $var \\Example:\\ \c ${GetExePath} $R0 ; $R0="C:\ftp" \S1{getparameters} GetParameters \b Get command line parameters. \\Syntax:\\ \c ${GetParameters} $var \\Example:\\ \c ${GetParameters} $R0 ; $R0="[parameters]" \S1{getoptions} GetOptions \b Get options from command line parameters. \\Syntax:\\ \c ${GetOptions} "[Parameters]" "[Option]" $var \c "[Parameters]" ; command line parameters \c ; \c "[Option]" ; option name \c ; \c $var ; Result: option string \\Note:\\ \\- The error flag is set if the option is not found \\- The first character in the option string is treated as a parameter delimiter \\Example1:\\ \c Section \c ${GetOptions} "/S /T" "/T" $R0 \c \c IfErrors 0 +2 \c MessageBox MB_OK "Not found" IDOK +2 \c MessageBox MB_OK "Found" \c SectionEnd \\Example2:\\ \c Section \c ${GetOptions} "-INSTDIR=C:\Program Files\Common Files -SILENT=yes" "-INSTDIR=" $R0 \c ;$R0=C:\Program Files\Common Files \c SectionEnd \\Example3:\\ \c Section \c ${GetOptions} '/SILENT=yes /INSTDIR="C:/Program Files/Common Files" /ADMIN=password' "/INSTDIR=" $R0 \c ;$R0=C:/Program Files/Common Files \c SectionEnd \\Example4:\\ \c Section \c ${GetOptions} `-SILENT=yes -INSTDIR='"C:/Program Files/Common Files"' -ADMIN=password` "-INSTDIR=" $R0 \c ;$R0="C:/Program Files/Common Files" \c SectionEnd \S1{getoptionss} GetOptionsS \b Same as \R{getoptions}{GetOptions}, but case sensitive. \S1{getroot} GetRoot \b Get root directory. \\Syntax:\\ \c ${GetRoot} "[FullPath]" $var \\Examples:\\ \c ${GetRoot} "C:\Program Files\NSIS" $R0 ; $R0="C:" \c ${GetRoot} "\\SuperPimp\NSIS\Source\exehead\Ui.c" $R0 ; $R0="\\SuperPimp\NSIS" \S1{getparent} GetParent \b Get parent directory. \\Syntax:\\ \c ${GetParent} "[PathString]" $var \\Example:\\ \c ${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0 ; $R0="C:\Program Files\Winamp" \S1{getfilename} GetFileName \b Get last part from directory path. \\Syntax:\\ \c ${GetFileName} "[PathString]" $var \\Example:\\ \c ${GetFileName} "C:\Program Files\Winamp\uninstwa.exe" $R0 ; $R0="uninstwa.exe" \S1{getbasename} GetBaseName \b Get file name without extension. \\Syntax:\\ \c ${GetBaseName} "[FileString]" $var \\Example:\\ \c ${GetBaseName} "C:\ftp\program.exe" $R0 ; $R0="program" \S1{getfileext} GetFileExt \b Get extension of file. \\Syntax:\\ \c ${GetFileExt} "[FileString]" $var \\Example:\\ \c ${GetFileExt} "C:\ftp\program.exe" $R0 ; $R0="exe" \S1{bannertrimpath} BannerTrimPath \b Trim string path for banner. \\Syntax:\\ \c ${BannerTrimPath} "[PathString]" "[Option]" $var \c "[PathString]" ; \c ; \c "[Option]" ; [Length][A|B|C|D] \c ; \c ; Length -Maximum string length \c ; A -Trim center path (default) \c ; (C:\root\...\third path) \c ; If A mode not possible Then will be used B mode \c ; B -Trim right path \c ; (C:\root\second path\...) \c ; If B mode not possible Then will be used C mode \c ; C -Trim right string \c ; (C:\root\second path\third p...) \c ; D -Trim right string + filename \c ; (C:\root\second p...\third path) \c ; If D mode not possible Then will be used C mode \c ; \c $var ; Result: Trimmed path \\Example:\\ \c Section \c ${BannerTrimPath} "C:\Server\Documents\Terminal\license.htm" "35A" $R0 \c ;$R0=C:\Server\...\Terminal\license.htm \c SectionEnd \\Example (Banner plugin):\\ \c !include "WinMessages.nsh" \c !include "FileFunc.nsh" \c \c Section \c Banner::show "Starting..." \c Banner::getWindow \c Pop $R1 \c ${Locate} "$WINDIR" "/L=F /M=*.* /B=1" "LocateCallback" \c Banner::destroy \c SectionEnd \c \c Function LocateCallback \c StrCmp $R0 $R8 code \c StrCpy $R0 $R8 \c ${BannerTrimPath} "$R8" "38B" $R8 \c GetDlgItem $1 $R1 1030 \c SendMessage $1 ${WM_SETTEXT} 0 "STR:$R8" \c \c code: \c StrCmp $R9 '' end \c ;... \c \c end: \c Push $0 \c FunctionEnd \\Example (\W{https://nsis.sourceforge.io/Nxs_plug-in}{NxS plugin}):\\ \c !include "FileFunc.nsh" \c \c Section \c nxs::Show /NOUNLOAD `$(^Name) Setup`\ \c /top `Setup searching something$\nPlease wait$\nIf you can...`\ \c /h 1 /can 1 /end \c ${Locate} "$WINDIR" "/L=F /M=*.* /B=1" "LocateCallback" \c nxs::Destroy \c SectionEnd \c \c Function LocateCallback \c StrCmp $R0 $R8 abortcheck \c StrCpy $R0 $R8 \c ${BannerTrimPath} "$R8" "55A" $R8 \c nxs::Update /NOUNLOAD /sub "$R8" /pos 78 /end \c \c abortcheck: \c nxs::HasUserAborted /NOUNLOAD \c Pop $0 \c StrCmp $0 1 0 +2 \c StrCpy $0 StopLocate \c \c StrCmp $R9 '' end \c ;... \c \c end: \c Push $0 \c FunctionEnd \S1{dirstate} DirState \b Check directory full, empty or not exist. \\Syntax:\\ \c ${DirState} "[path]" $var \c "[path]" ; Directory \c $var ; Result: \c ; $var=0 (empty) \c ; $var=1 (full) \c ; $var=-1 (directory not found) \\Example:\\ \c ${DirState} "$TEMP" $R0 ; $R0="1" (directory is full) \S1{refreshshellicons} RefreshShellIcons \b After changing file associations, you can call this function to refresh the shell immediately. \\Syntax:\\ \c ${RefreshShellIcons} \\Example:\\ \c Section \c WriteRegStr HKCR "Winamp.File\DefaultIcon" "" "$INSTDIR\WINAMP.EXE,2" \c ${RefreshShellIcons} \c SectionEnd \H{textfunc} Text Functions Header \S1{} Introduction Include header: \c !include "TextFunc.nsh" Call functions: \c Section Install \c ${LineRead} "C:\a.log" "-1" $R0 \c ; $R0="Last line$\r$\n" \c SectionEnd \c Section un.Install \c ${TrimNewLines} "Last line$\r$\n" $R0 \c ; $R0="Last line" \c SectionEnd \S1{linefind} LineFind \b Find specified lines in text file, and edit or view these lines in callback function. \\Syntax:\\ \c ${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function" \c "[File1]" ; Input text file \c ; \c "[File2|/NUL]" ; [File2] \c ; Output text file \c ; If empty then File2=File1 \c ; [/NUL] \c ; No output text file (only read File1) \c ; \c "[LineNumbers]" ; [No|-No|No:No|{No}|{-No}|{No:No}] \c ; 1:-1 all lines to change (default) \c ; 2 second line from start \c ; -3 third line from end \c ; 5:9 range of lines from 5 to 9 \c ; {2} only second line from start to output \c ; {-3} only third line from end to output \c ; {5:9} only range of lines from 5 to 9 to output \c ; \c "Function" ; Callback function for specified lines \c \c Function "Function" \c ; $R9 current line \c ; $R8 current line number \c ; $R7 current line negative number \c ; $R6 current range of lines \c ; $R5 handle of a file opened to read \c ; $R4 handle of a file opened to write ($R4="" if "/NUL") \c \c ; you can use any string functions \c ; $R0-$R3 are not used (save data in them). \c ; ... \c \c Push $var ; If $var="StopLineFind" Then exit from function \c ; If $var="SkipWrite" Then skip current line (ignored if "/NUL") \c FunctionEnd \\Note:\\ \\- Error flag if input file doesn't exist \\- Error flag if output file path doesn't exist \\- Ranges must be specified on growth (2 4:5 9:-8 -5:-4 -2:-1) \\- Output file will not be updated if no changes made. \\Example1 (delete first two symbols):\\ \c Section \c ${LineFind} "C:\a.log" "C:\a-edited.log" "3:-1" "Example1" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example1 \c ${TrimNewLines} '$R9' $R9 \c StrCpy $R9 $R9 '' 2 \c StrCpy $R9 '$R9$\r$\n' \c ;start from 3 line and delete first two symbols \c \c Push $0 \c FunctionEnd \\Example2 (show changed lines):\\ \c Section \c ${LineFind} "C:\a.log" "a.log" "{5:12 15 -6:-5 -1}" "Example2" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example2 \c ${TrimNewLines} '$R9' $R9 \c StrCpy $R9 "$R9 ~Changed line ($R8)~$\r$\n" \c \c Push $0 \c FunctionEnd \\Example3 (delete lines):\\ \c Section \c ${LineFind} "C:\a.log" "\logs\a.log" "2:3 10:-5 -3:-2" "Example3" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example3 \c StrCpy $0 SkipWrite \c \c Push $0 \c FunctionEnd \\Example4 (insert lines):\\ \c Section \c ${LineFind} "C:\a.log" "" "10" "Example4 \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example4 \c FileWrite $R4 "---First Line---$\r$\n" \c FileWrite $R4 "---Second Line ...---$\r$\n" \c \c Push $0 \c FunctionEnd \\Example5 (replace in file with count of changes - "WordFunc.nsh" required):\\ \c !include "WordFunc.nsh" \c \c Section \c StrCpy $R0 0 \c ${LineFind} "C:\a.log" "C:\logs\a.log" "1:-1" "Example5" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c MessageBox MB_OK "Changed lines=$R0" \c SectionEnd \c \c Function Example5 \c StrCpy $1 $R9 \c \c ${WordReplace} '$R9' ' ' '_' '+*' $R9 \c \c StrCmp $1 $R9 +2 \c IntOp $R0 $R0 + 1 \c ;$R0 count of changed lines \c \c Push $0 \c FunctionEnd \\Example6 (line string to cut or delete):\\ \c Section \c ${LineFind} "\a.log" "C:\logs\a.log" "" "Example6" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c MessageBox MB_OK "Processed lines=$R1:$R2" \c SectionEnd \c \c Function Example6 \c ;(Cut lines from a line to another line (also including that line)) \c StrCmp $R0 finish stop \c StrCmp $R0 start finish \c StrCmp $R9 'Start Line$\r$\n' 0 skip \c StrCpy $R0 start \c StrCpy $R1 $R8 \c goto code \c finish: \c StrCmp $R9 'Finish Line$\r$\n' 0 code \c StrCpy $R0 finish \c StrCpy $R2 $R8 \c goto code \c skip: \c StrCpy $0 SkipWrite \c goto output \c stop: \c StrCpy $0 StopLineFind \c goto output \c \c ;;(Delete lines from a line to another line (also including that line)) \c ; StrCmp $R0 finish code \c ; StrCmp $R0 start finish \c ; StrCmp $R9 'Start Line$\r$\n' 0 code \c ; StrCpy $R0 start \c ; StrCpy $R1 $R8 \c ; goto skip \c ; finish: \c ; StrCmp $R9 'Finish Line$\r$\n' 0 skip \c ; StrCpy $R0 finish \c ; StrCpy $R2 $R8 \c ; skip: \c ; StrCpy $0 SkipWrite \c ; goto output \c \c code: \c ;... \c \c output: \c Push $0 \c FunctionEnd \\Example7 (read lines):\\ \c Section \c ${LineFind} "C:\a.log" "/NUL" "1:-1" "Example7" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example7 \c MessageBox MB_OKCANCEL '$$R9 "Line"=[$R9]$\n$$R8 "#" =[$R8]' IDOK +2 \c StrCpy $0 StopLineFind \c \c Push $0 \c FunctionEnd \S1{lineread} LineRead \b Get line in file specified with number. \\Syntax:\\ \c ${LineRead} "[File]" "[LineNumber]" $var \c "[File]" ; Input text file \c ; \c "[LineNumber]" ; [No|-No] \c ; 3 line number from start \c ; -5 line number from end \c ; \c $var ; Result: Line \\Note:\\ \\- Error flag if input file doesn't exist \\- Error flag if line number not found \\Example:\\ \c Section \c ${LineRead} "C:\a.log" "-1" $R0 \c ; $R0="Last line$\r$\n" \c SectionEnd \S1{filereadfromend} FileReadFromEnd \b Read text file from end line by line. \\Syntax:\\ \c ${FileReadFromEnd} "[File]" "Function" \c "[File]" ; Input text file \c "Function" ; Callback function \c \c Function "Function" \c ; $9 current line \c ; $8 current line number \c ; $7 current line negative number \c \c ; $R0-$R9 are not used (save data in them). \c ; ... \c \c Push $var ; If $var="StopFileReadFromEnd" Then exit from function \c FunctionEnd \\Note:\\ \\- Error flag if input file doesn't exist \\Example1:\\ \c Section \c ${FileReadFromEnd} "C:\a.log" "Example1" \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example1 \c MessageBox MB_OKCANCEL '"Line"=[$9]$\n "#"=[$8]$\n "-#"=[$7]' IDOK +2 \c StrCpy $0 StopFileReadFromEnd \c \c Push $0 \c FunctionEnd \\Example2 (Reverse text file):\\ \c Section \c GetTempFileName $R0 \c FileOpen $R1 $R0 w \c ${FileReadFromEnd} "C:\a.log" "Example2" \c FileClose $R1 \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c Exec '"notepad.exe" "$R0"' \c SectionEnd \c \c Function Example2 \c StrCmp $7 -1 0 +5 \c StrCpy $1 $9 1 -1 \c StrCmp $1 '$\n' +3 \c StrCmp $1 '$\r' +2 \c StrCpy $9 '$9$\r$\n' \c \c FileWrite $R1 "$9" \c \c Push $0 \c FunctionEnd \S1{linesum} LineSum \b Get sum of lines in text file. \\Syntax:\\ \c ${LineSum} "[File]" $var \c "[File]" ; Input file \c $var ; Result: Sum of lines \\Note:\\ \\- Error flag if input file doesn't exist \\Example:\\ \c Section \c ${LineSum} "C:\a.log" $R0 \c ; $R0="54" \c SectionEnd \S1{filejoin} FileJoin \b Join two files in one (File1 + File2 = File3). \\Syntax:\\ \c ${FileJoin} "[File1]" "[File2]" "[File3]" \c "[File1]" ; Input File1 \c "[File2]" ; Input File2 \c "[File3]" ; Output File3 \c ; If [File3]="" Then add [File2] to [File1] \\Note:\\ \\- Error flag if input files don't exist \\- Error flag if output file path doesn't exist \\Example1 (Join: a.log + b.log = Z.log):\\ \c Section \c ${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\Z.log" \c SectionEnd \\Example2 (Add: a.log + b.log = a.log):\\ \c Section \c ${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\a.log" \c SectionEnd \S1{textcompare} TextCompare \b Compare two text files. \\Syntax:\\ \c ${TextCompare} "[File1]" "[File2]" "[Option]" "Function" \c "[File1]" ; File1 Compare these lines \c "[File2]" ; File2 Compare with these lines \c "[Options]" ; (line-by-line): \c ; FastDiff Compare line N (File1) with line N (File2) \c ; Call function if Different lines found \c ; FastEqual Compare line N (File1) with line N (File2) \c ; Call function if Equal lines found \c ; (line number independent): \c ; SlowDiff Compare line N (File1) with all lines (File2) \c ; Call function if line N (File1) Different \c ; SlowEqual Compare line N (File1) with all lines (File2) \c ; Call function if line N (File1) Equal \c "Function" ; Callback function \c \c Function "Function" \c ; $9 "Line File1" \c ; $8 "Line number" \c ; $7 "Line File2" (empty if SlowDiff) \c ; $6 "Line number" (empty if SlowDiff) \c \c ; $R0-$R9 are not used (save data in them). \c ; ... \c \c Push $var ; If $var="StopTextCompare" Then exit from function \c FunctionEnd \\Note:\\ \\- Error flag if File1 or File2 doesn't exist \\- Error flag if syntax error \\Example (Different or Equal):\\ \c Section \c StrCpy $R0 '' \c ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +4 \c \c StrCmp $R0 NotEqual 0 +2 \c MessageBox MB_OK "Files differ" IDOK +2 \c MessageBox MB_OK "Files identical" \c SectionEnd \c \c Function Example1 \c StrCpy $R0 NotEqual \c StrCpy $0 StopTextCompare \c \c Push $0 \c FunctionEnd \\Example (Compare line-by-line - Different):\\ \c Section \c StrCpy $R0 'Text1.txt' \c StrCpy $R1 'Text2.txt' \c \c GetTempFileName $R2 \c FileOpen $R3 $R2 w \c FileWrite $R3 "$R0 | $R1$\r$\n" \c ${TextCompare} "$R0" "$R1" "FastDiff" "Example2" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c \c Exec "notepad.exe $R2" \c FunctionEnd \c \c Function Example2 \c FileWrite $R3 '$8=$9' \c FileWrite $R3 '$6=$7$\r$\n' \c \c Push $0 \c FunctionEnd \\Example (Compare line-by-line - Equal):\\ \c Section \c StrCpy $R0 'Text1.txt' \c StrCpy $R1 'Text2.txt' \c \c GetTempFileName $R2 \c FileOpen $R3 $R2 w \c FileWrite $R3 "$R0 | $R1$\r$\n" \c ${TextCompare} "$R0" "$R1" "FastEqual" "Example3" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c \c Exec "notepad.exe $R2" \c FunctionEnd \c \c Function Example3 \c FileWrite $R3 '$8|$6=$9' \c \c Push $0 \c FunctionEnd \\Example (Compare all lines - Different):\\ \c Section \c StrCpy $R0 'Text1.txt' \c StrCpy $R1 'Text2.txt' \c \c GetTempFileName $R2 \c FileOpen $R3 $R2 w \c FileWrite $R3 "$R0 | $R1$\r$\n" \c ${TextCompare} "$R0" "$R1" "SlowDiff" "Example4" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK end \c \c FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n" \c ${TextCompare} "$R1" "$R0" "SlowDiff" "Example4" \c FileClose $R3 \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK end \c \c Exec "notepad.exe $R2" \c \c end: \c FunctionEnd \c \c Function Example4 \c FileWrite $R3 '$8=$9' \c \c Push $0 \c FunctionEnd \\Example (Compare all lines - Equal):\\ \c Section \c StrCpy $R0 'Text1.txt' \c StrCpy $R1 'Text2.txt' \c \c GetTempFileName $R2 \c FileOpen $R3 $R2 w \c FileWrite $R3 "$R0 | $R1$\r$\n" \c ${TextCompare} "$R0" "$R1" "SlowEqual" "Example5" \c IfErrors 0 +2 \c MessageBox MB_OK "Error" IDOK +2 \c \c Exec "notepad.exe $R2" \c FunctionEnd \c \c Function Example5 \c FileWrite $R3 '$8|$6=$9' \c \c Push $0 \c FunctionEnd \\Example (Show variables):\\ \c Section \c ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example6" \c \c IfErrors 0 +2 \c MessageBox MB_OK "Error" \c SectionEnd \c \c Function Example6 \c MessageBox MB_OKCANCEL '\ \c $$9 "Line File1" =[$9]$\n\ \c $$8 "Line #" =[$8]$\n\ \c $$7 "Line File2" =[$7]$\n\ \c $$6 "Line #" =[$6]'\ \c IDOK +2 \c StrCpy $0 StopTextCompare \c \c Push $0 \c FunctionEnd \S1{textcompares} TextCompareS \b Same as \R{textcompare}{TextCompare}, but case sensitive. \S1{configread} ConfigRead \b Read value from entry name in config file. \\Syntax:\\ \c ${ConfigRead} "[File]" "[Entry]" $var \c "[File]" ; config file \c ; \c "[Entry]" ; entry name \c ; \c $var ; Result: Value \\Note:\\ \\- Error flag if entry not found \\- Error flag if file doesn't exist \\Example1:\\ \c Section \c ${ConfigRead} "C:\AUTOEXEC.BAT" "SET winbootdir=" $R0 \c ;$R0=C:\WINDOWS \c SectionEnd \\Example2:\\ \c Section \c ${ConfigRead} "C:\apache\conf\httpd.conf" "Timeout " $R0 \c ;$R0=30 \c SectionEnd \S1{configreads} ConfigReadS \b Same as \R{configread}{ConfigRead}, but case sensitive. \S1{configwrite} ConfigWrite \b Write value from entry name in config file. \\Syntax:\\ \c ${ConfigWrite} "[File]" "[Entry]" "[Value]" $var \c "[File]" ; config file \c ; \c "[Entry]" ; entry name \c ; \c "[Value]" ; value name \c ; if "" then delete Entry \c ; \c $var ; Result: \c ; $var=CHANGED Value is written \c ; $var=DELETED Entry is deleted \c ; $var=ADDED Entry and Value are added \c ; $var=SAME Entry and Value already exist \\Note:\\ \\- Error flag if file doesn't exist \\- Error flag if file can't be opened \\Example1:\\ \c Section \c ${ConfigWrite} "C:\AUTOEXEC.BAT" "SET winbootdir=" "D:\WINDOWS" $R0 \c ;$R0=CHANGED \c SectionEnd \\Example2:\\ \c Section \c ${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "30" $R0 \c ;$R0=SAME \c SectionEnd \\Example3:\\ \c Section \c ${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "" $R0 \c ;$R0=DELETED \c SectionEnd \S1{configwrites} ConfigWriteS \b Same as \R{configwrite}{ConfigWrite}, but case sensitive. \S1{filerecode} FileRecode \b Recode text file from DOS to Windows format and vice-versa. \\Syntax:\\ \c ${FileRecode} "[File]" "[Format]" \c "[File]" ; \c ; \c "[Format]" ; OemToChar -from DOS to Windows \c ; CharToOem -from Windows to DOS \\Note:\\ \\- Error flag if file doesn't exist \\- Error flag if syntax error \\Example:\\ \c Section \c ${FileRecode} "C:\SCANDISK.LOG" "CharToOem" \c SectionEnd \S1{trimnewlines} TrimNewLines \b Trim newlines in a string. \\Syntax:\\ \c ${TrimNewLines} "[string]" $var \c "[string]" ; Input string \c $var ; Result: String without '$\r' and '$\n' at the end \\Example:\\ \c Section \c ${TrimNewLines} "Text line$\r$\n" $R0 \c ; $R0="Text line" \c SectionEnd \H{wordfunc} Word Functions Header \S1{} Introduction Include header: \c !include "WordFunc.nsh" Call functions: \c Section Install \c ${WordFind} "A--H---S" "-" "+2" $R0 \c ; $R0="H" \c SectionEnd \c Section un.Install \c ${WordReplace} "A--H---S" "-" "x" "+3*" $R0 \c ; $R0="A--HxS" \c SectionEnd \S1{wordfind} WordFind \b Multi-features string function. \c Strings: \c "[word+1][delimiter][word+2][delimiter][word+3]..." \c "[delimiter][word+1][delimiter][word+2][delimiter]..." \c "[delimiter][delimiter][word+1][delimiter][delimiter][delimiter]..." \c "...[word-3][delimiter][word-2][delimiter][word-1]" \c "...[delimiter][word-2][delimiter][word-1][delimiter]" \c "...[delimiter][delimiter][word-1][delimiter][delimiter][delimiter]" \\Syntax: \\ \c ${WordFind} "[string]" "[delimiter]" "[E][options]" $var \c "[string]" ;[string] \c ; input string \c "[delimiter]" ;[delimiter] \c ; one or several symbols \c "[E][options]" ;[options] \c ; +number : word number from start \c ; -number : word number from end \c ; +number} : delimiter number from start \c ; all space after this \c ; delimiter to output \c ; +number{ : delimiter number from start \c ; all space before this \c ; delimiter to output \c ; +number}} : word number from start \c ; all space after this word \c ; to output \c ; +number{{ : word number from start \c ; all space before this word \c ; to output \c ; +number{} : word number from start \c ; all space before and after \c ; this word (word exclude) \c ; +number*} : word number from start \c ; all space after this \c ; word to output with word \c ; +number{* : word number from start \c ; all space before this \c ; word to output with word \c ; # : sum of words to output \c ; * : sum of delimiters to output \c ; /word : number of word to output \c ; \c ;[E] \c ; with errorlevel output \c ; IfErrors: \c ; $var=1 delimiter not found \c ; $var=2 no such word number \c ; $var=3 syntax error (Use: +1,-1},#,*,/word,...) \c ;[] \c ; no errorlevel output (default) \c ; If some errors found then (result=input string) \c ; \c $var ;output (result) \\Note:\\ \\- Accepted numbers 1,01,001,... \\Example (Find word by number):\\ \c Section \c ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0 \c ; $R0="Program Files" \c SectionEnd \\Example (Delimiter exclude):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "-2}" $R0 \c ; $R0=" C:\logo.sys C:\WINDOWS" \c SectionEnd \\Example (Sum of words):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0 \c ; $R0="3" \c SectionEnd \\Example (Sum of delimiters):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0 \c ; $R0="2" \c SectionEnd \\Example (Find word number):\\ \c Section \c ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0 \c ; $R0="3" \c SectionEnd \\Example ( \}\} ):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0 \c ; $R0=" C:\WINDOWS" \c SectionEnd \\Example ( \{\} ):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0 \c ; $R0="C:\io.sys C:\WINDOWS" \c SectionEnd \\Example ( *\} ):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0 \c ; $R0="C:\logo.sys C:\WINDOWS" \c SectionEnd \\Example (Get parent directory):\\ \c Section \c StrCpy $R0 "C:\Program Files\NSIS\NSIS.chm" \c ; "C:\Program Files\NSIS\Include\" \c ; "C:\\Program Files\\NSIS\\NSIS.chm" \c \c ${WordFind} "$R0" "\" "-2{*" $R0 \c ; $R0="C:\Program Files\NSIS" \c ; "C:\\Program Files\\NSIS" \c SectionEnd \\Example (Coordinates):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0 \c ; $R0="C:\io.sys C" \c IfErrors end \c \c StrLen $0 $R0 ; $0 = Start position of word (11) \c StrLen $1 ':\lo' ; $1 = Word length (4) \c ; StrCpy $R0 $R1 $1 $0 ; $R0 = :\lo \c \c end: \c SectionEnd \\Example (With errorlevel output):\\ \c Section \c ${WordFind} "[string]" "[delimiter]" "E[options]" $R0 \c \c IfErrors 0 end \c StrCmp $R0 1 0 +2 ; errorlevel 1? \c MessageBox MB_OK 'delimiter not found' IDOK end \c StrCmp $R0 2 0 +2 ; errorlevel 2? \c MessageBox MB_OK 'no such word number' IDOK end \c StrCmp $R0 3 0 +2 ; errorlevel 3? \c MessageBox MB_OK 'syntax error' \c \c end: \c SectionEnd \\Example (Without errorlevel output):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0 \c \c ; $R0="C:\io.sys C:\logo.sys" (error: delimiter "_" not found) \c SectionEnd \\Example (If found):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0 \c \c IfErrors notfound found \c found: \c MessageBox MB_OK 'Found' IDOK end \c notfound: \c MessageBox MB_OK 'Not found' \c \c end: \c SectionEnd \\Example (If found 2):\\ \c Section \c ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0 \c \c StrCmp $R0 "C:\io.sys C:\logo.sys" notfound found ; error? \c found: \c MessageBox MB_OK 'Found' IDOK end \c notfound: \c MessageBox MB_OK 'Not found' \c \c end: \c SectionEnd \\Example (To accept one word in string if delimiter not found):\\ \c Section \c StrCpy $0 'OneWord' \c StrCpy $1 1 \c \c loop: \c ${WordFind} "$0" " " "E+$1" $R0 \c IfErrors 0 code \c StrCmp $1$R0 11 0 error \c StrCpy $R0 $0 \c goto end \c \c code: \c ; ... \c IntOp $1 $1 + 1 \c goto loop \c \c error: \c StrCpy $1 '' \c StrCpy $R0 '' \c \c end: \c ; $R0="OneWord" \c SectionEnd \S1{wordfinds} WordFindS \b Same as \R{wordfind}{WordFind}, but case sensitive. \S1{wordfind2x} WordFind2X \b Find word between two delimiters. \c Strings: \c "[delimiter1][word+1][delimiter2][delimiter1][word+2][delimiter2]..." \c "[text][delimiter1][text][delimiter1][word+1][delimiter2][text]..." \c "...[delimiter1][word-2][delimiter2][delimiter1][word-1][delimiter2]" \c "...[text][delimiter1][text][delimiter1][word-1][delimiter2][text]" \\Syntax:\\ \c ${WordFind2X} "[string]" "[delimiter1]" "[delimiter2]" "[E][options]" $var \c "[string]" ;[string] \c ; input string \c "[delimiter1]" ;[delimiter1] \c ; first delimiter \c "[delimiter2]" ;[delimiter2] \c ; second delimiter \c "[E][options]" ;[options] \c ; +number : word number from start \c ; -number : word number from end \c ; +number}} : word number from start all space \c ; after this word to output \c ; +number{{ : word number from end all space \c ; before this word to output \c ; +number{} : word number from start \c ; all space before and after \c ; this word (word exclude) \c ; +number*} : word number from start \c ; all space after this \c ; word to output with word \c ; +number{* : word number from start \c ; all space before this \c ; word to output with word \c ; # : sum of words to output \c ; /word : number of word to output \c ; \c ;[E] \c ; with errorlevel output \c ; IfErrors: \c ; $var=1 no words found \c ; $var=2 no such word number \c ; $var=3 syntax error (Use: +1,-1,#) \c ;[] \c ; no errorlevel output (default) \c ; If some errors found then (result=input string) \c ; \c $var ;output (result) \\Example (1):\\ \c Section \c ${WordFind2X} "[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]" "[C:\" "];" "+2" $R0 \c ; $R0="logo.sys" \c SectionEnd \\Example (2):\\ \c Section \c ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1" $R0 \c ; $R0="logo" \c SectionEnd \\Example (3):\\ \c Section \c ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{{" $R0 \c ; $R0="C:\WINDOWS C:\io.sys C:" \c SectionEnd \\Example (4):\\ \c Section \c ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{}" $R0 \c ; $R0="C:\WINDOWS C:\io.sys C:sys" \c SectionEnd \\Example (5):\\ \c Section \c ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{*" $R0 \c ; $R0="C:\WINDOWS C:\io.sys C:\logo." \c SectionEnd \\Example (6):\\ \c Section \c ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "/logo" $R0 \c ; $R0="2" \c SectionEnd \\Example (With errorlevel output):\\ \c Section \c ${WordFind2X} "[io.sys];[C:\logo.sys]" "\" "];" "E+1" $R0 \c ; $R0="1" ("\...];" not found) \c \c IfErrors 0 noerrors \c MessageBox MB_OK 'Errorlevel=$R0' IDOK end \c \c noerrors: \c MessageBox MB_OK 'No errors' \c \c end: \c SectionEnd \S1{wordfind2xs} WordFind2XS \b Same as \R{wordfind2x}{WordFind2X}, but case sensitive. \S1{wordfind3x} WordFind3X \b Find a word that contains a string, between two delimiters. \\Syntax:\\ \c ${WordFind3X} "[string]" "[delimiter1]" "[center]" "[delimiter2]" "[E][options]" $var \c "[string]" ;[string] \c ; input string \c "[delimiter1]" ;[delimiter1] \c ; first delimiter \c "[center]" ;[center] \c ; center string \c "[delimiter2]" ;[delimiter2] \c ; second delimiter \c "[E][options]" ;[options] \c ; +number : word number from start \c ; -number : word number from end \c ; +number}} : word number from start all space \c ; after this word to output \c ; +number{{ : word number from end all space \c ; before this word to output \c ; +number{} : word number from start \c ; all space before and after \c ; this word (word exclude) \c ; +number*} : word number from start \c ; all space after this \c ; word to output with word \c ; +number{* : word number from start \c ; all space before this \c ; word to output with word \c ; # : sum of words to output \c ; /word : number of word to output \c ; \c ;[E] \c ; with errorlevel output \c ; IfErrors: \c ; $var=1 no words found \c ; $var=2 no such word number \c ; $var=3 syntax error (Use: +1,-1,#) \c ;[] \c ; no errorlevel output (default) \c ; If some errors found then (result=input string) \c ; \c $var ;output (result) \\Example (1):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "+1" $R0 \c ; $R0="1.AAB" \c SectionEnd \\Example (2):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1" $R0 \c ; $R0="2.BAA" \c SectionEnd \\Example (3):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{{" $R0 \c ; $R0="[1.AAB];" \c SectionEnd \\Example (4):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{}" $R0 \c ; $R0="[1.AAB];[3.BBB];" \c SectionEnd \\Example (5):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{*" $R0 \c ; $R0="[1.AAB];[2.BAA];" \c SectionEnd \\Example (6):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "/2.BAA" $R0 \c ; $R0="2" \c SectionEnd \\Example (With errorlevel output):\\ \c Section \c ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "XX" "];" "E+1" $R0 \c ; $R0="1" ("[...XX...];" not found) \c \c IfErrors 0 noerrors \c MessageBox MB_OK 'Errorlevel=$R0' IDOK end \c \c noerrors: \c MessageBox MB_OK 'No errors' \c \c end: \c SectionEnd \S1{wordfind3xs} WordFind3XS \b Same as \R{wordfind3x}{WordFind3X}, but case sensitive. \S1{wordreplace} WordReplace \b Replace or delete word from string. \\Syntax:\\ \c ${WordReplace} "[string]" "[word1]" "[word2]" "[E][options]" $var \c "[string]" ;[string] \c ; input string \c "[word1]" ;[word1] \c ; word to replace or delete \c "[word2]" ;[word2] \c ; replace with (if empty delete) \c "[E][options]" ;[options] \c ; +number : word number from start \c ; -number : word number from end \c ; +number* : word number from start multiple-replace \c ; -number* : word number from end multiple-replace \c ; + : replace all results \c ; +* : multiple-replace all results \c ; { : if exists replace all delimiters \c ; from left edge \c ; } : if exists replace all delimiters \c ; from right edge \c ; {} : if exists replace all delimiters \c ; from edges \c ; {* : if exists multiple-replace all \c ; delimiters from left edge \c ; }* : if exists multiple-replace all \c ; delimiters from right edge \c ; {}* : if exists multiple-replace all \c ; delimiters from edges \c ; \c ;[E] \c ; with errorlevel output \c ; IfErrors: \c ; $var=1 word to replace not found \c ; $var=2 no such word number \c ; $var=3 syntax error (Use: +1,-1,+1*,-1*,+,+*,{},{}*) \c ;[] \c ; no errorlevel output (default) \c ; If some errors found then (result=input string) \c ; \c $var ;output (result) \\Example (replace):\\ \c Section \c ${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "bmp" "+2" $R0 \c ; $R0="C:\io.sys C:\logo.bmp C:\WINDOWS" \c SectionEnd \\Example (delete):\\ \c Section \c ${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "" "+" $R0 \c ; $R0="C:\io. C:\logo. C:\WINDOWS" \c SectionEnd \\Example (multiple-replace 1):\\ \c Section \c ${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" " " " " "+1*" $R0 \c ; +1* or +2* or +3* or +4* or +5* or +6* \c ; $R0="C:\io.sys C:\logo.sys C:\WINDOWS" \c SectionEnd \\Example (multiple-replace 2):\\ \c Section \c ${WordReplace} "C:\io.sys C:\logo.sysSYSsys C:\WINDOWS" "sys" "bmp" "+*" $R0 \c ; $R0="C:\io.bmp C:\logo.bmp C:\WINDOWS" \c SectionEnd \\Example (multiple-replace 3):\\ \c Section \c ${WordReplace} "sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys" "sys" "|" "{}*" $R0 \c ; $R0="|C:\io.sys C:\logo.sys C:\WINDOWS|" \c SectionEnd \\Example (With errorlevel output):\\ \c Section \c ${WordReplace} "C:\io.sys C:\logo.sys" "sys" "bmp" "E+3" $R0 \c ; $R0="2" (no such word number "+3") \c \c IfErrors 0 noerrors \c MessageBox MB_OK 'Errorlevel=$R0' IDOK end \c \c noerrors: \c MessageBox MB_OK 'No errors' \c \c end: \c SectionEnd \S1{wordreplaces} WordReplaceS \b Same as \R{wordreplace}{WordReplace}, but case sensitive. \S1{wordadd} WordAdd \b Add words to string1 from string2 if not exist or delete words if exist. \\Syntax:\\ \c ${WordAdd} "[string1]" "[delimiter]" "[E][options]" $var \c "[string1]" ;[string1] \c ; string for addition or removing \c "[delimiter]" ;[delimiter] \c ; one or several symbols \c "[E][options]" ;[options] \c ; +string2 : words to add \c ; -string2 : words to delete \c ; \c ;[E] \c ; with errorlevel output \c ; IfErrors: \c ; $var=1 delimiter is empty \c ; $var=3 syntax error (use: +text,-text) \c ;[] \c ; no errorlevel output (default) \c ; If some errors found then (result=input string) \c ; \c $var ;output (result) \\Example (add):\\ \c Section \c ${WordAdd} "C:\io.sys C:\WINDOWS" " " "+C:\WINDOWS C:\config.sys" $R0 \c ; $R0="C:\io.sys C:\WINDOWS C:\config.sys" \c SectionEnd \\Example (delete):\\ \c Section \c ${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS C:\config.sys C:\IO.SYS" $R0 \c ; $R0="C:\logo.sys" \c SectionEnd \\Example (add to one):\\ \c Section \c ${WordAdd} "C:\io.sys" " " "+C:\WINDOWS C:\config.sys C:\IO.SYS" $R0 \c ; $R0="C:\io.sys C:\WINDOWS C:\config.sys" \c SectionEnd \\Example (delete one):\\ \c Section \c ${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS" $R0 \c ; $R0="C:\io.sys C:\logo.sys" \c SectionEnd \\Example (No new words found):\\ \c Section \c ${WordAdd} "C:\io.sys C:\logo.sys" " " "+C:\logo.sys" $R0 \c StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2 \c MessageBox MB_OK "No new words found to add" \c SectionEnd \\Example (No words deleted):\\ \c Section \c ${WordAdd} "C:\io.sys C:\logo.sys" " " "-C:\config.sys" $R0 \c StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2 \c MessageBox MB_OK "No words found to delete" \c SectionEnd \\Example (With errorlevel output):\\ \c Section \c ${WordAdd} "C:\io.sys C:\logo.sys" "" "E-C:\logo.sys" $R0 \c ; $R0="1" (delimiter is empty "") \c \c IfErrors 0 noerrors \c MessageBox MB_OK 'Errorlevel=$R0' IDOK end \c \c noerrors: \c MessageBox MB_OK 'No errors' \c \c end: \c SectionEnd \S1{wordadds} WordAddS \b Same as \R{wordadd}{WordAdd}, but case sensitive. \S1{wordinsert} WordInsert \b Insert word in string. \\Syntax:\\ \c ${WordInsert} "[string]" "[delimiter]" "[word]" "[E][options]" $var \c "[string]" ;[string] \c ; input string \c "[delimiter]" ;[delimiter] \c ; one or several symbols \c "[word]" ;[word] \c ; word to insert \c "[E][options]" ;[options] \c ; +number : word number from start \c ; -number : word number from end \c ; \c ;[E] \c ; with errorlevel output \c ; IfErrors: \c ; $var=1 delimiter is empty \c ; $var=2 wrong word number \c ; $var=3 syntax error (Use: +1,-1) \c ;[] \c ; no errorlevel output (default) \c ; If some errors found then (result=input string) \c ; \c $var ;output (result) \\Example (1):\\ \c Section \c ${WordInsert} "C:\io.sys C:\WINDOWS" " " "C:\logo.sys" "-2" $R0 \c ; $R0="C:\io.sys C:\logo.sys C:\WINDOWS" \c SectionEnd \\Example (2):\\ \c Section \c ${WordInsert} "C:\io.sys" " " "C:\WINDOWS" "+2" $R0 \c ; $R0="C:\io.sys C:\WINDOWS" \c SectionEnd \\Example (3):\\ \c Section \c ${WordInsert} "" " " "C:\WINDOWS" "+1" $R0 \c ; $R0="C:\WINDOWS " \c SectionEnd \\Example (With errorlevel output):\\ \c Section \c ${WordInsert} "C:\io.sys C:\logo.sys" " " "C:\logo.sys" "E+4" $R0 \c ; $R0="2" (wrong word number "+4") \c \c IfErrors 0 noerrors \c MessageBox MB_OK 'Errorlevel=$R0' IDOK end \c \c noerrors: \c MessageBox MB_OK 'No errors' \c \c end: \c SectionEnd \S1{wordinserts} WordInsertS \b Same as \R{wordinsert}{WordInsert}, but case sensitive. \S1{strfilter} StrFilter \b Convert string to uppercase or lowercase. \b Set symbol filter. \\Syntax:\\ \c ${StrFilter} "[string]" "[options]" "[symbols1]" "[symbols2]" $var \c "[string]" ;[string] \c ; input string \c ; \c "[options]" ;[+|-][1|2|3|12|23|31][eng|rus] \c ; + : convert string to uppercase \c ; - : convert string to lowercase \c ; 1 : only Digits \c ; 2 : only Letters \c ; 3 : only Special \c ; 12 : only Digits + Letters \c ; 23 : only Letters + Special \c ; 31 : only Special + Digits \c ; eng : English symbols (default) \c ; rus : Russian symbols \c ; \c "[symbols1]" ;[symbols1] \c ; symbols include (not changeable) \c ; \c "[symbols2]" ;[symbols2] \c ; symbols exclude \c ; \c $var ;output (result) \\Note:\\ \\- Error flag if syntax error \\- Same symbol to include & to exclude = to exclude \\Example (UpperCase):\\ \c Section \c ${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0 \c ; $R0="123ABC 456DEF 7890|%#" \c SectionEnd \\Example (LowerCase):\\ \c Section \c ${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0 \c ; $R0="123abc 456dEF 7890|%#" \c SectionEnd \\Example (Filter1):\\ \c Section \c ${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0 \c ; $R0="abcDEF|%" ;only Letters + |% \c SectionEnd \\Example (Filter2):\\ \c Section \c ${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0 \c ; $R0="123a 6F 78|%#" ;only Digits + Special + af - 4590 \c SectionEnd \\Example (Filter3):\\ \c Section \c ${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0 \c ; $R0="123AbC4567890" ;only Digits + Letters + b - def \c SectionEnd \\Example (Filter4):\\ \c Section \c ${StrFilter} "123abcÖ°Ö±Ö² 456DEFדהו 7890|%#" "+12rus" "×”" "דו" $R0 \c ; $R0="123Ö°Ö±Ö²456×”7890" ;only Digits + Letters + ×” - דו \c SectionEnd \\Example (English + Russian Letters):\\ \c Section \c ${StrFilter} "123abcÖ°Ö±Ö² 456DEFדהו 7890|%#" "2rus" "" "" $R0 \c ; $R0="ְֱֲדהו" ;only Russian Letters \c ${StrFilter} "123abcÖ°Ö±Ö² 456DEFדהו 7890|%#" "2" "$R0" "" $R0 \c ; $R0="abcÖ°Ö±Ö²DEFדהו" ;only English + Russian Letters \c SectionEnd \\Example (Word Capitalize):\\ \c Section \c Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_" \c Call Capitalize \c Pop $R0 \c ; $R0="_01-Perpetuous_Dreamer__-__The_Sound_Of_Goodbye_(Orig._Mix).mp3_" \c \c ${WordReplace} "$R0" "_" " " "+*" $R0 \c ; $R0=" 01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3 " \c \c ${WordReplace} "$R0" " " "" "{}" $R0 \c ; $R0="01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3" \c SectionEnd \c \c Function Capitalize \c Exch $R0 \c Push $0 \c Push $1 \c Push $2 \c \c ${StrFilter} '$R0' '-eng' '' '' $R0 \c ${StrFilter} '$R0' '-rus' '' '' $R0 \c \c StrCpy $0 0 \c \c loop: \c IntOp $0 $0 + 1 \c StrCpy $1 $R0 1 $0 \c StrCmp $1 '' end \c StrCmp $1 ' ' +5 \c StrCmp $1 '_' +4 \c StrCmp $1 '-' +3 \c StrCmp $1 '(' +2 \c StrCmp $1 '[' 0 loop \c IntOp $0 $0 + 1 \c StrCpy $1 $R0 1 $0 \c StrCmp $1 '' end \c \c ${StrFilter} '$1' '+eng' '' '' $1 \c ${StrFilter} '$1' '+rus' '' '' $1 \c \c StrCpy $2 $R0 $0 \c IntOp $0 $0 + 1 \c StrCpy $R0 $R0 '' $0 \c IntOp $0 $0 - 2 \c StrCpy $R0 '$2$1$R0' \c goto loop \c \c end: \c Pop $2 \c Pop $1 \c Pop $0 \c Exch $R0 \c FunctionEnd \S1{strfilters} StrFilterS \b Same as \R{strfilter}{StrFilter}, but case sensitive. \S1{versioncompare} VersionCompare \b Compare version numbers. \\Syntax:\\ \c ${VersionCompare} "[Version1]" "[Version2]" $var \c "[Version1]" ; First version \c "[Version2]" ; Second version \c $var ; Result: \c ; $var=0 Versions are equal \c ; $var=1 Version1 is newer \c ; $var=2 Version2 is newer \\Example:\\ \c Section \c ${VersionCompare} "1.1.1.9" "1.1.1.01" $R0 \c ; $R0="1" \c SectionEnd \S1{versionconvert} VersionConvert \b Convert version in the numerical format which can be compared. \\Syntax:\\ \c ${VersionConvert} "[Version]" "[CharList]" $var \c "[Version]" ; Version \c ; \c "[CharList]" ; List of characters, which will be replaced by numbers \c ; "abcdefghijklmnopqrstuvwxyz" (default) \c ; \c $var ; Result: converted version \\Note:\\ \\- Converted letters are separated with dot \\- If character is non-digit and not in list then it will be converted to dot \\Example1:\\ \c Section \c ${VersionConvert} "9.0a" "" $R0 \c ; $R0="9.0.01" \c \c ${VersionConvert} "9.0c" "" $R1 \c ; $R1="9.0.03" \c \c ${VersionCompare} "$R0" "$R1" $R2 \c ; $R2="2" version2 is newer \c SectionEnd \\Example2:\\ \c Section \c ${VersionConvert} "0.15c-9m" "" $R0 \c ; $R0="0.15.03.9.13" \c \c ${VersionConvert} "0.15c-1n" "" $R1 \c ; $R1="0.15.03.1.14" \c \c ${VersionCompare} "$R0" "$R1" $R2 \c ; $R2="1" version1 is newer \c SectionEnd \\Example3:\\ \c Section \c ${VersionConvert} "0.15c+" "abcdefghijklmnopqrstuvwxyz+" $R0 \c ; $R0="0.15.0327" \c \c ${VersionConvert} "0.15c" "abcdefghijklmnopqrstuvwxyz+" $R1 \c ; $R1="0.15.03" \c \c ${VersionCompare} "$R0" "$R1" $R2 \c ; $R2="1" version1 is newer \c SectionEnd nsis-3.11/Docs/src/history.but000077500000000000000000004563631477201124000163300ustar00rootroot00000000000000\A{history} Changelog and Release Notes \H{v3.11} 3.11 Released on March 8th, 2025 \S1{v3.11-rl} Release Notes Your installer will still fit on a single floppy disk. Or even eight. \S1{v3.11-cl} Changelog \S2{} Security \b Retry creating restricted $PLUGINSDIR (thanks Sandro Poppi for responsibly disclosing, \W{http://sf.net/p/nsis/bugs/1315}{bug #1315})\\This stops a possible privilege escalation. A malicious actor can create the temporary plugins directory ($PLUGINSDIR) at just the right time and fill it with malicious files that the installer might use. Installers running as SYSTEM use \cw{C:\\windows\\temp} which is accessible by all users on the system. Any user can use this bug to gain SYSTEM privileges by winning the race condition with an installer that starts as SYSTEM. \S2{} Minor Changes \b Retry opening self if there is a sharing error (partial \W{http://sf.net/p/nsis/patches/316}{patch #316}) \b Support setting source file decoding charset with magic comment (\W{http://sf.net/p/nsis/patches/292}{patch #292}) \b Fixed LicenseBkColor for uninstaller (\W{http://sf.net/p/nsis/bugs/1314}{bug #1314}) \b Handle CHARSET command line parameter in MakeNSISW (\W{http://sf.net/p/nsis/patches/315}{patch #315}) \b Make System/Resource.dll reproducible (\W{http://sf.net/p/nsis/patches/312}{patch #312}) \b Zip2Exe accepts .zip as command line parameter \S2{} Translations \b Updated Finnish (\W{http://sf.net/p/nsis/patches/313}{patch #313}) \H{v3.10} 3.10 Released on March 30th, 2024 \S1{v3.10-cl} Changelog \S2{} Minor Changes \b Fixed LogicLib SafePPO bug (\W{http://sf.net/p/nsis/bugs/1291}{bug #1291}) \b NSISdl now supports relative URLs in location redirects (\W{https://github.com/kichik/nsis/pull/24}{PR #24}) \b Added \R{ainsttype}{InstType} /UNINSTNOCUSTOM and /UNINSTCOMPONENTSONLYONCUSTOM \b Fixed bug with \cw{SetDetailsPrint lastused} and plugins introduced in 3.09 (\W{http://sf.net/p/nsis/bugs/1300}{bug #1300}) \b Added \cw{NSD_CB_Find} \cw{SelectStringExact} support for nsDialogs \b Fix RTL text in section selection page \H{v3.09} 3.09 Released on July 1st, 2023 \S1{v3.09-cl} Changelog \S2{} Major Changes \b Use isolated uninstaller directory for every instance (\W{http://sf.net/p/nsis/bugs/1296}{bug #1296}, thanks Richard Warren) \S2{} Minor Changes \b Added \R{assert}{!assert} \b Fixed \cw{!uninstfinalize} bug on large uninstallers (\W{http://sf.net/p/nsis/bugs/1279}{bug #1279}) \b Fixed creation of missing special folders on old Windows versions where SHGetFolderPath is not available \b Fixed plug-in call overwriting \cw{SetDetailsPrint lastused} (\W{http://sf.net/p/nsis/bugs/1271}{bug #1271}) \b Fixed \cw{!appendfile} not writing to non-empty files with a BOM \b Fixed LogicLib \cw{$\{Switch\}} Unicode bug\#{ stackoverflow.com/q/73530905/ } \b Fixed \L{../Docs/makensisw/Readme.txt}{MakeNSISW} editor zoom level bug (\W{http://sf.net/p/nsis/bugs/1282}{bug #1282}) \S2{} Translations \b Updated Brazilian Portuguese (\W{http://sf.net/p/nsis/bugs/1269}{bug #1269}) \b Updated Ukrainian (\W{http://sf.net/p/nsis/patches/308}{patch #308}) \S2{} Build System \b Fixed halibut \#{fprintf format security}compiler warnings (\W{http://sf.net/p/nsis/patches/304}{patch #304}) \b Fixed various issues with very old and new GCC versions (\W{http://sf.net/p/nsis/bugs/1275}{bug #1275}, \W{http://sf.net/p/nsis/patches/307}{patch #307}, \W{http://sf.net/p/nsis/patches/310}{patch #310}) \b Disable stub relocations in newer GCC (\W{http://sf.net/p/nsis/bugs/1283}{bug #1283}) \H{v3.08} 3.08 Released on September 25th, 2021 \S1{v3.08-rl} Release Notes This release is filled with features that a lot of people have been requesting for a while. Enjoy! \S1{v3.08-cl} Changelog \S2{} Major Changes \b Added \R{uninstfinalize}{!uninstfinalize} (\W{http://sf.net/p/nsis/patches/280}{patch #280}, \W{http://sf.net/p/nsis/bugs/1241}{bug #1241}) \S2{} Minor Changes \b Added \cw{$USER..} and \cw{$COMMON..} alias constants \b Added \R{getdllversion}{GetDLLVersion} /ProductVersion switch \b Added \R{getwinver}{GetWinVer} instruction \b Disallow start maximized mode \b Added /LAUNCH compiler switch \b PEAddResource now supports the res:// protocol \b System::Store can push/pop the flags state \H{v3.07} 3.07 Released on July 24th, 2021 \S1{v3.07-rl} Release Notes Unicode is now the default. \S1{v3.07-cl} Changelog \S2{} Major Changes \b \R{aunicodetarget}{Unicode} now defaults to \cw{true} \S2{} Minor Changes \b Added nsExec /MBCS switch \b Memento now supports overridable storage macros \b Fixed Unicode compiler crash (\W{http://sf.net/p/nsis/bugs/1254}{bug #1254}, \W{http://sf.net/p/nsis/patches/300}{patch #300}) \b Fixed !addplugindir relative path bug (\W{http://sf.net/p/nsis/bugs/1264}{bug #1264}) \b Fixed StrClb Unicode bug (\W{http://sf.net/p/nsis/patches/302}{patch #302}) \b Fixed $\{GetTime\} hour padding (\W{http://sf.net/p/nsis/bugs/980}{bug #980}) \S2{} Translations \b Updated Albanian (\W{http://sf.net/p/nsis/patches/303}{patch #303}), Corsican\#{(forum)} and Japanese (maboroshin PR\#{github.com/maboroshin}) \b Fixed clipped Chinese text (\W{http://sf.net/p/nsis/bugs/1261}{bug #1261}) \H{v3.06.1} 3.06.1 Released on July 31st, 2020 \S1{v3.06.1-rl} Release Notes 20th anniversary! The first public release of NSIS was v1.0f on July 31st, 2000. \S1{v3.06.1-cl} Changelog \S2{} Major Changes \b Fixed \R{setbrandingimage}{SetBrandingImage} crash \H{v3.06} 3.06 Released on July 31st, 2020 \S1{v3.06-cl} Changelog \S2{} Major Changes \b \cw{DeleteRegKey /ifempty} now also checks for values, not just subkeys. Use \cw{/ifnosubkeys} for the old behavior. \b Added \R{getknownfolderpath}{GetKnownFolderPath} \b Added UnpinShortcut macro (Integration.nsh) \S2{} Minor Changes \b Added \R{ifshellvarcontextall}{IfShellVarContextAll} and \R{ifrtllanguage}{IfRtlLanguage} \# Undocumented: \b Added GetShellVarContext, IfAltRegView and GetRegView | Documenting these would require documenting the parameter name to number mapping \# Undocumented: \b Added ManifestAppendCustomString \b Added \cw{!define /intfmt} \b Added Date/Time \L{../Docs/nsDialogs/Readme.html}{nsDialogs} controls and macros \b \L{../Docs/MultiUser/Readme.html}{MultiUser}: Fixed INSTALLMODE_FUNCTION and added INSTALLMODEPAGE_SHOWUSERNAME \S2{} Translations \b Updated German (SebStange PR\#{github.com/SebStange}) and Simplified Chinese (\W{http://sf.net/p/nsis/patches/297}{patch #297}) \S2{} Build System \b Primitive SOURCE_DATE_EPOCH support (\W{http://sf.net/p/nsis/patches/294}{patch #294}) \b Python 3 fixes (\W{http://sf.net/p/nsis/patches/296}{patch #296}) \b GCC 10 memmove workaround (\W{http://sf.net/p/nsis/bugs/1248}{bug #1248}) \H{v3.05} 3.05 Released on December 15th, 2019 \S1{v3.05-rl} Release Notes ANSI targets are deprecated, consider moving to Unicode. \S1{v3.05-cl} Changelog \S2{} Major Changes \b Added \R{apeaddresource}{PEAddResource} and \R{aperemoveresource}{PERemoveResource} \b Added \R{loadandsetimage}{LoadAndSetImage} \b Allow quoted library path in System::Call (\W{http://sf.net/p/nsis/bugs/546}{bug #546} and \W{http://sf.net/p/nsis/bugs/1225}{bug #1225}) \b Improved \L{../Docs/nsExec/nsExec.txt}{nsExec} Unicode and tab output parsing (\W{http://sf.net/p/nsis/bugs/1232}{bug #1232}) \S2{} Minor Changes \b Added experimental \R{amanifestlongpathaware}{ManifestLongPathAware} attribute \# Undocumented: \b Added ManifestMaxVersionTested \b %1 in \R{finalize}{!finalize} command can be specified multiple times \b Fixed -O stderr stream issue (\W{http://sf.net/p/nsis/bugs/1221}{bug #1221}) \b Fixed \R{library_install}{InstallLib} .NSI space-in-path bug (\W{http://sf.net/p/nsis/bugs/1222}{bug #1222}) \b \L{../Docs/StrFunc/StrFunc.txt}{StrFunc} now supports a "using" idiom to help with forward-declaration of functions (\W{http://sf.net/p/nsis/bugs/1229}{bug #1229}) \b Added \R{ssectioninsttype}{SectionInstType} \b Zero uninitialized data in icon group (\W{http://sf.net/p/nsis/bugs/1230}{bug #1230}) \b Automatically doubles ampersands in the \R{aname}{Name} attribute \b Fixed \L{../Docs/nsDialogs/Readme.html}{nsDialogs} CB/LB_Get/SetItemData macros (\W{http://sf.net/p/nsis/bugs/1238}{bug #1238}) \S2{} Translations \b Updated Hindi (\W{http://sf.net/p/nsis/patches/291}{patch #291}) and Portuguese (\W{http://sf.net/p/nsis/bugs/1219}{bug #1219}) \H{v3.04} 3.04 Released on December 15th, 2018 \S1{v3.04-cl} Changelog \S2{} Major Changes \b Added IsNativeMachineArchitecture helper macros to x64.nsh \b Added experimental WinVer "Windows as a Service" detection macros \b Added \L{../Docs/makensisw/Readme.txt}{MakeNSISW} window info "spy" tool \S2{} Minor Changes \b Added MUI_TEXTCOLOR setting \b nsDialogs::OnNotify can now return values back to Windows \b Added LIBRARY_INSTALL_EQUAL_VERSION \R{library_install}{InstallLib} option \b Added NTMARTA to preload list to fix rare Windows 7 security issue (\W{http://sf.net/p/nsis/bugs/1204}{bug #1204}) \b AddBrandingImage now supports dialog units \# Undocumented: \b Added ManifestDisableWindowFiltering and ManifestGdiScaling \b Fixed !macroundef of last defined macro bug \b Fixed \L{../Docs/MultiUser/Readme.html}{MultiUser} caption string bug (\W{http://sf.net/p/nsis/bugs/1012}{bug #1012}) \b !undef issues warnings instead of errors \b MakeNSIS prints -CMDHELP to stdout (\W{http://sf.net/p/nsis/bugs/1203}{bug #1203}) \b Removed LibraryLocal utility \S2{} Translations \b Added Hind\u012b{i} (\W{http://sf.net/p/nsis/patches/289}{patch #289}) \b Updated Belarusian, German (\W{http://sf.net/p/nsis/bugs/1023}{bug #1023}), Mongolian and Spanish (\W{http://sf.net/p/nsis/bugs/1205}{bug #1205}) \H{v3.03} 3.03 Released on January 29th, 2018 \S1{v3.03-rn} Release Notes \b Building NSIS with Python 2.6 or older is no longer supported \S1{v3.03-cl} Changelog \S2{} Major Changes \b Added more NSD controls and macros (\W{http://sf.net/p/nsis/feature-requests/543}{RFE #543}) \b Added \R{ppgettlbversion}{!gettlbversion} \b \R{library}{Library} TLB and VxD version support on POSIX (\W{http://sf.net/p/nsis/patches/284}{patch #284}) \S2{} Minor Changes \b Added System plug-in v2 syntax option \b Added System plug-in B and H types \b Added \R{intptrcmp}{IntPtrCmp}, IntPtrCmpU, and \R{intptrop}{IntPtrOp} \b Added Int64Cmp, Int64CmpU and Int64Fmt (64-bit only) \b Added IntOp and System::Int64Op >>> operator \b Added more !define /math operators \# Undocumented: \b Added ManifestDPIAwareness \b Added WinVer.nsh IsDomainController (\W{http://sf.net/p/nsis/patches/286}{patch #286}) \b Plug-ins now set the ASLR, DEP, LAA, NOSEH and TS PE flags (\W{http://sf.net/p/nsis/bugs/1188}{bug #1188}) \b MakeNSIS exits with code 0 for various information commands (\W{http://sf.net/p/nsis/bugs/1193}{bug #1193}) \b Added error and warning states to !pragma warning \b Removed unused NSD_LB_Clear macro parameter \S2{} Translations \b Added Tatar (\W{http://sf.net/p/nsis/patches/281}{patch #281}) \b Fixed and updated Scottish Gaelic (\W{http://sf.net/p/nsis/patches/285}{patch #285}, \W{http://sf.net/p/nsis/bugs/1197}{bug #1197}) \b Updated Italian (\W{http://sf.net/p/nsis/bugs/1194}{bug #1194}) \S2{} Build System \b Added support for Python 3 \b Dropped support for Python 2.6 and older \H{v3.02.1} 3.02.1 Released on July 31st, 2017 \S1{v3.02.1-cl} Changelog \S2{} Translations \b Fixed Chinese (Traditional) and Romanian translation bugs (\W{http://sf.net/p/nsis/bugs/1189}{bug #1189} and \W{http://sf.net/p/nsis/bugs/1191}{bug #1191}) \b Fixed Scots Gaelic MUI finish page translation \H{v3.02} 3.02 Released on July 23rd, 2017 \S1{v3.02-cl} Changelog \S2{} Major Changes \b Fixed NSIS3 RegTool Win9x bug \b Added the HKCR32, HKCR64, HKCU32, HKCU64, HKLM32 and HKLM64 root keys \b Unsupported \R{setregview}{SetRegView} mode now fails all registry operations \b Added \R{execshellwait}{ExecShellWait} \b Added \R{writeregmultistr}{WriteRegMultiStr} (\W{http://sf.net/p/nsis/feature-requests/382}{RFE #382}, \W{http://sf.net/p/nsis/patches/219}{patch #219}) and WriteRegNone \b Added \R{pragma}{!pragma warning} (\W{http://sf.net/p/nsis/patches/267}{patch #267}) \b \R{varconstant}{$LocalAppData} now resolves to the ProgramData folder in the \R{setshellvarcontext}{SetShellVarContext all} context \S2{} Minor Changes \b Variables used in \R{acaption}{Caption} can now be set in \R{onguiinit}{.onGUIInit} (\W{http://sf.net/p/nsis/feature-requests/539}{RFE #539}) \b \L{../Docs/MultiUser/Readme.html}{MultiUser} now supports \R{varconstant}{$ProgramFiles64} (\W{http://sf.net/p/nsis/bugs/843}{bug #843}) \b Added support for MUI_UNCONFIRMPAGE_VARIABLE (\W{http://sf.net/p/nsis/feature-requests/511}{RFE #511}) and MUI_PAGE_CUSTOMFUNCTION_DESTROYED \b Unicode \L{../Docs/nsExec/nsExec.txt}{nsExec} now supports the /OEM switch (\W{http://sf.net/p/nsis/bugs/1171}{bug #1171}) \S2{} Translations \b Chinese (Traditional) updates by Walter Cheuk \b Minor French improvements (\W{http://sf.net/p/nsis/patches/221}{patch #221}) \H{v3.01} 3.01 Released on December 11th, 2016 \S1{v3.01-cl} Changelog \S2{} Major Changes \b Error messages are now written to stderr by default \b New icons by Jan T. Sott \S2{} Minor Changes \b \R{setctlcolors}{SetCtlColors} now supports Windows color constant values \b StrCpy "" maxlen handling (\W{http://sf.net/p/nsis/bugs/1122}{bug #1122}) \b Fixed buffer size bug in winchar.cpp (\W{http://sf.net/p/nsis/patches/271}{patch #271}) \S2{} Translations \b Added Corsican (\W{http://sf.net/p/nsis/patches/268}{patch #268}) \b PortugueseBR fixes (\W{http://sf.net/p/nsis/patches/276}{patch #276}) \b Updated Danish translation (\W{http://sf.net/p/nsis/bugs/1164}{bug #1164}) \b Arabic, Norwegian, Portuguese, Ukrainian and Swedish \L{../Docs/MultiUser/Readme.html}{MultiUser} fixes (\W{http://sf.net/p/nsis/patches/278}{patch #278}, \W{http://sf.net/p/nsis/patches/279}{patch #279}, \W{http://sf.net/p/nsis/patches/274}{patch #274}, \W{http://sf.net/p/nsis/patches/275}{patch #275} & \W{http://sf.net/p/nsis/patches/277}{patch #277}) \H{v3.0} 3.0 Released on July 24th, 2016 \S1{v3.0-rl} Release Notes Long-awaited version 3 of NSIS is finally ready. It comes with optional \R{aunicodetarget}{Unicode} support, still works on all the same versions of Windows, supports Windows 10, and adds a lot of other small features and fixes. Huge thanks goes out to Anders and Wizou for making this happen and Jim Park for the original patch. \S1{v3.0-cl} Changelog \S2{} Minor Changes \b \R{finalize}{!finalize} command now supports the same compare operators as !system (\W{http://sf.net/p/nsis/bugs/1148}{bug #1148}) \S2{} Translations \b PortugueseBR fixes (\W{http://sf.net/p/nsis/bugs/1149}{bug #1149}) \H{v3.0rc2} 3.0 Release Candidate 2 Released on July 8th, 2016 \S1{v3.0rc2-cl} Changelog \S2{} Major Changes \b Fixed LogicLib nested $\{Select\} bug \b \R{makensis}{!makensis} command must force Unicode output to be UTF-8 (\W{http://sf.net/p/nsis/bugs/1147}{bug #1147}) \S2{} Minor Changes \b Zip2Exe aborts if the zip file is encrypted (\W{http://sf.net/p/nsis/bugs/1141}{bug #1141}) \b Added LogicLib & operator \b NSIS Menu POSIX fixes (\W{http://sf.net/p/nsis/bugs/1144}{bug #1144}) \S2{} Translations \b PortugueseBR fixes (deguix) \b Minor tweaks to Danish.nlf (scootergrisen) (\W{http://sf.net/p/nsis/bugs/1140}{bug #1140}) \H{v3.0rc1} 3.0 Release Candidate 1 Released on April 3rd, 2016 \S1{v3.0rc1-cl} Changelog \S2{} Major Changes \b Fixed \R{appendfile}{!appendfile} on POSIX and LogicLib $\{Switch\} \b More security hardening to prevent dll hijacking \S2{} Minor Changes \b Documentation improvements \b The name of the uninstaller created in %TEMP%\\~nsu.tmp has changed from %UNIQUE%u_.exe to Un_%UNIQUE%.exe \b Various warning and error improvements \S2{} Translations \b Added missing MULTIUSER_* entries to Japanese.nsh (\W{http://sf.net/p/nsis/patches/266}{patch #266}) \H{v3.0b3} 3.0 Beta 3 Released on December 26th, 2015 \S1{v3.0b3-cl} Changelog \S2{} Major Changes \b \R{arequestexecutionlevel}{RequestExecutionLevel} now defaults to \c{admin} \b LoadLibrary security hardening to prevent dll hijacking (\W{http://sf.net/p/nsis/bugs/1125}{bug #1125}) \b \R{FileReadUTF16LE}{FileReadUTF16LE} now skips the optional BOM at the start of a file \S2{} Minor Changes \b Fixed System plugin GUID type output bug on Win98 \b \R{FileWriteUTF16LE}{FileWriteUTF16LE} can add a BOM with the /BOM switch \b \R{createshortcut}{CreateShortcut} icon index can now be larger than 255 (\W{http://sf.net/p/nsis/bugs/1123/}{bug #1123}) \b \R{system}{!system} and \R{execute}{!execute} now provide an empty StdIn pipe to work around bugs in some Windows utilities \b Added support for 0o octal radix prefix on number literals in the preprocessor \b The single parameter version of \R{if}{!if} now also supports floats \b Preprocessor now warns when invalid floating point numbers are used in math operations \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW} now uses WinInet when checking for updates \S2{} Translations \b Brazilian Portuguese updated (Felipe) (\W{http://sf.net/p/nsis/patches/263/}{patch #263}) \b Polish updated (Pawe\u0142{l} Porwisz) \H{v3.0b2} 3.0 Beta 2 Released on August 4th, 2015 \S1{v3.0b2-cl} Changelog \S2{} Major Changes \b Preliminary Windows 10 support \S2{} Minor Changes \b Added !appendfile /RawNL switch \b Added PESubsysVer attribute \b Exec[Wait] sets the CREATE_DEFAULT_ERROR_MODE flag when creating a process \b Fixed 4+ TiB freespace calculation bug (\W{http://sf.net/p/nsis/bugs/1115/}{bug #1115}) \b Fixed CreateShortcut /NoWorkingDir parsing bug (\W{http://sf.net/p/nsis/bugs/1110/}{bug #1110}) \b Fixed minor issues in the Pascal NSIS plug-in SDK and removed the \cw{extrap} global variable \b nsDialogs and InstallOptions now use the system link color \S2{} Build System \b Linux stdcall warning fix (\W{http://sf.net/p/nsis/patches/261}{patch #261}) \b Linux test-scripts fix (\W{http://sf.net/p/nsis/patches/260}{patch #260}) \b Win64 fixes (including \W{http://sf.net/p/nsis/patches/258}{patch #258}, \W{http://sf.net/p/nsis/bugs/1105/}{bug #1105}) \b Visual C 2012 fixes \H{v3.0b1} 3.0 Beta 1 Released on October 6th, 2014 \S1{v3.0b1-rl} Release Notes \b This release addresses a lot of build issues, reintroduces the \W{https://drone.io/github.com/kichik/nsis}{nightly builds} and adds automatic nightly test execution \S1{v3.0b1-cl} Changelog \S2{} Major Changes \b !insertmacro allows macro recursion (\W{http://sf.net/p/nsis/feature-requests/497}{RFE #497}) \b Added \R{makensis}{!makensis} command \b Added new MUI2 bitmap stretch modes, *_NOSTRETCH is now deprecated (\W{http://sf.net/p/nsis/feature-requests/521}{RFE #521}) \b \c{InitiateShutdown()} is used to reboot the machine if available (\W{http://sf.net/p/nsis/patches/247}{patch #247}) \b Added PPO and SafePPO preprocess-only compiler switches \b MakeNSIS WM_COPYDATA messages now use the QH_OUTPUTCHARSET encoding with CP_ACP as the default for compatibility with old IDEs. \S2{} Minor Changes \b Added IsWow64 to x64.nsh \b Added PEDllCharacteristics attribute \b Added System::Call direct register memory access type. (\W{http://sf.net/p/nsis/patches/249}{patch #249}) \b Added WX compiler switch \b Allow skipping ExDLL build with SKIPPLUGINS ((\W{http://sf.net/p/nsis/patches/254}{patch #254})) \b Changed default DllCharacteristics to TS_AWARE+NO_SEH+NX_COMPAT+DYNAMIC_BASE \b Fixed Mac OS X builds (\W{http://sf.net/p/nsis/patches/253}{patch #253} and \W{http://sf.net/p/nsis/bugs/1085}{bug #1085}) \b Fixed POSIX !searchparse bug (\W{http://sf.net/p/nsis/patches/251}{patch #251}) \b Fixed !macroundef \b Fixed test-code build target on POSIX and enabled it in nightly builds (\W{http://sf.net/p/nsis/bugs/1088/}{bug #1098}) \b Fixed Visual Studio 2012 builds \S2{} Translations \b Added Armenian (Hrant Ohanyan) \H{v3.0b0} 3.0 Beta 0 Released on May 11th, 2014 \S1{v3.0b0-rl} Release Notes \b POSIX builds work again! Please let us know if your favorite platform is still having build issues. We mainly test on Linux. \S1{v3.0b0-cl} Changelog \S2{} Major Changes \b Basic AMD64 System::Call support \b Fixed POSIX builds \S2{} Minor Changes \b Added CreateShortcut /NoWorkingDir parameter \b Added Int<32|64|Ptr> helper macros to Util.nsh \b Added P<, P<=, P=, P<>, P>= and P> LogicLib ptrdiff_t tests \b Try harder to find duplicate strings in string block (\W{http://sf.net/p/nsis/bugs/1088/}{bug #1088}) \b !system will decode child output as OEMCP if GetConsoleOutputCP() == GetOEMCP() \b !system and !execute can store the exit code in a define \b !execute supports comparing the exit code with the same syntax as !system \b Preprocessor supports \cw{0n} and \cw{0b} radix prefix on number literals \H{v3.0a2} 3.0 Alpha 2 Released on December 24th, 2013 \S1{v3.0a2-rl} Release Notes It's the holiday gift you've been waiting for! \S2{} Known Issues \b The POSIX build is getting much closer, but still currently broken \b LangDLL doesn't display localized language name with \R{aunicodetarget}{Unicode} false \S1{v3.0a2-cl} Changelog \S2{} Major Changes \b !include defaults to UTF-8 after \cw{Unicode True} \b Preprocessor does not parse all branches and will not validate code that is never executed (\W{http://sf.net/p/nsis/bugs/1086/}{bug #1086}) \S2{} Minor Changes \b FileRead in Unicode installers can handle DBCS, conversion output is limited to UCS-2. \b FileRead in Unicode installers now uses the Unicode replacement character (U+FFFD) for invalid characters and not '?'. \b FileReadByte no longer performs a Unicode conversion on non-ASCII characters \b Windows 8.1 & 2012R2 support in WinVer.nsh \b Fixed !define Unicode null terminator bug (\W{http://sf.net/p/nsis/bugs/1079/}{bug #1079}) \b Unicode stubs create WCHAR richedit controls (\W{http://sf.net/p/nsis/bugs/1080/}{bug #1080}) \b Fixed \L{../Docs/makensisw/Readme.txt}{MakeNSISW} default pushbutton and tab order \b Fixed incorrect page count in compiler statistics \H{v3.0a1} 3.0 Alpha 1 Released on July 14th, 2013 \S1{v3.0a1-rl} Release Notes \S2{} Known Issues \b The POSIX build is currently broken \b LangDLL doesn't display localized language name with \R{aunicodetarget}{Unicode} false \b \R{FileRead}{FileRead} may return '?' for MBCS letters with \R{aunicodetarget}{Unicode} true \S1{v3.0a1-cl} Changelog \S2{} Major Changes \b Default verbosity is /V3 without logo, \L{../Docs/makensisw/Readme.txt}{MakeNSISW} still uses /V4. \b \R{amanifestsupportedos}{ManifestSupportedOS} added support for the Windows 8.1 GUID and it is set by default to avoid GetVersionEx compatibility behavior. \S2{} Minor Changes \b Fixed !finalize %1 \b Fixed !searchparse (\W{https://sourceforge.net/p/nsis/bugs/1073/}{bug #1073}) \b Made installers always respect /S on command line, even when installer file can't be read (\W{https://sourceforge.net/p/nsis/bugs/1076/}{bug #1076}) \b Minor \L{../Docs/makensisw/Readme.txt}{MakeNSISW} fixes and tweaks \b Added Zip2Exe Unicode checkbox \H{v3.0a0} 3.0 Alpha 0 Released on May 19th, 2013 \S1{v3.0a0-rl} Release Notes \b MakeNSIS can now generate ANSI and \R{intro-unicode}{Unicode} installers. Source files can be UTF8SIG, UTF16BOM or traditional MBCS text files (which are converted to Unicode with ACP unless you specify a different codepage). The default plugins are now stored in sub-folders based on their CPU target and character set encoding. \S2{} Known Issues \b The POSIX build is currently broken \b LangDLL doesn't display localized language name with \R{aunicodetarget}{Unicode} false \b \R{FileRead}{FileRead} may return '?' for MBCS letters with \R{aunicodetarget}{Unicode} true \S1{v3.0a0-cl} Changelog \S2{} Major Changes \b Added the \R{aunicodetarget}{Unicode} attribute (\W{http://sourceforge.net/support/tracker.php?aid=1238132}{RFE #1238132}, \W{http://sourceforge.net/support/tracker.php?aid=1795257}{patch #1795257}) \b Added support for Windows 8 and Windows Server 2012 \b MakeNSIS can read UTF8SIG and UTF16BOM script files (\W{http://sourceforge.net/support/tracker.php?aid=2026892}{RFE #2026892}) \b All NLF and NSH language files are stored as UTF-16LE (\W{http://sourceforge.net/support/tracker.php?aid=1879642}{RFE #1879642}) \b Scripts can control the SupportedOS list in the application manifest using \R{amanifestsupportedos}{ManifestSupportedOS} (\W{http://sourceforge.net/support/tracker.php?aid=2725883}{bug #2725883}, \W{http://sourceforge.net/support/tracker.php?aid=3020103}{RFE #3020103}) \b Installers can claim DPI-awareness with \R{amanifestdpiaware}{ManifestDPIAware} (\W{http://sourceforge.net/support/tracker.php?aid=2897169}{bug #2897169}) \b The index of the changed section is stored in $0 during .onSelChange callbacks (\W{http://sourceforge.net/support/tracker.php?aid=1634936}{RFE #1634936}) \b $\{U+1\}...$\{U+10FFFF\} are treated as a Unicode character unless there is already a define with that name (\W{http://sourceforge.net/support/tracker.php?aid=2084797}{RFE #2084797}) \S2{} Minor Changes \b Added \R{ppgetdllversion}{!getdllversion} (\W{http://sourceforge.net/support/tracker.php?aid=2809308}{bug #2809308}) \b Added !appendfile /CHARSET parameter \b Added \R{if}{!if} support for /fileexists, case sensitive comparisons, hex and float \b Added more definitions to WinMessages.nsh \b %temp%\\Low will be used if the installer cannot write to %temp% nor %windir%\\Temp (\W{http://sourceforge.net/support/tracker.php?aid=2909242}{bug #2909242}, \W{http://sourceforge.net/support/tracker.php?aid=2912824}{patch #2912824}) \b Added $\{NSIS_PACKEDVERSION\}, the NSIS version packed as a hex number (\W{http://sourceforge.net/support/tracker.php?aid=2680832}{patch #2680832}) \b Added \R{prescopemacro}{$\{__MACRO__\}} and \R{precounter}{$\{__COUNTER__\}} predefines \b Added UnsafeStrCpy instruction, it can write to special variables like $PLUGINSDIR \b Added \R{vifileversion}{VIFileVersion} \b Added \R{finalize}{!finalize} for post-build commands (like signing the installer) \b Plugins in $\{NSISDIR\}\\Plugins have to be reserved with \c{ReserveFile /plugin} \b MakeNSIS /NOTIFYHWND uses a (optional) new event name to abort compilation, see build.cpp/h for details. \b Reduced !include/!insertmacro recursion stack usage (\W{http://sourceforge.net/support/tracker.php?aid=3067954}{bug #3067954}) \b Fixed minor MakeNSIS leaks (\W{http://sourceforge.net/support/tracker.php?aid=3474662}{bug #3474662}) \b Fixed MUI_FINISHPAGE_TITLE_3LINES padding when reboot is required (\W{http://sourceforge.net/support/tracker.php?aid=3400067}{bug #3400067}, \W{http://sourceforge.net/support/tracker.php?aid=3408407}{bug #3408407}) \b Fixed removal of read only attribute even if Delete or RMDir fails (\W{http://sourceforge.net/support/tracker.php?aid=3072159}{bug #3072159}) \b Fixed $\{__SECTION__\} in hidden sections (\W{http://sourceforge.net/support/tracker.php?aid=1787648}{RFE #1787648}) \b Various documentation fixes (\W{http://sourceforge.net/support/tracker.php?aid=3063566}{bug #3063566}, \W{http://sourceforge.net/support/tracker.php?aid=3567313}{bug #3567313}, \W{http://sourceforge.net/support/tracker.php?aid=3307144}{patch #3307144}) \b Lots of other small fixes... \S2{} Translations \b Changed LANGFILE macro in LangFile.nsh \b Warnings are now displayed for missing strings (LANGFILE_INCLUDE_WITHDEFAULT) \b Added Georgian (David Huriev) \b Added Pashto (Pakhtosoft) \b Added Scottish Gaelic (GunChleoc) \b Fixed Korean MUI_[UN]TEXT_FINISH_INFO_* (\W{http://sourceforge.net/support/tracker.php?aid=3541515}{bug #3541515}) \H{v2.51} 2.51 Released on April 1st, 2016 \S1{v2.51-cl} Changelog \S2{} Minor Changes \b More security hardening to prevent dll hijacking \b Backported support for system 'p' type and logiclib P and Z tests \S2{} Translations \b Added missing MULTIUSER_* entries to Japanese.nsh (\W{http://sf.net/p/nsis/patches/266}{patch #266}) \H{v2.50} 2.50 Released on December 26th, 2015 \S1{v2.50-cl} Changelog \S2{} Major Changes \b \R{arequestexecutionlevel}{RequestExecutionLevel} now defaults to \c{admin} \S2{} Minor Changes \b Preload certain system libraries to prevent dll hijacking (\W{http://sf.net/p/nsis/bugs/1125}{bug #1125}) \H{v2.49} 2.49 Released on December 16th, 2015 \S1{v2.49-cl} Changelog \b Fixed CreateShortcut failure on Vista caused by security changes in 2.47 \H{v2.48} 2.48 Released on December 10th, 2015 \S1{v2.48-cl} Changelog \b Fixed CHM (\W{http://sf.net/p/nsis/bugs/1129/}{bug #1129}) \H{v2.47} 2.47 Released on December 8th, 2015 \S1{v2.47-rl} Release Notes \b This is a maintenance and security release \S1{v2.47-cl} Changelog \S2{} Major Changes \b LoadLibrary security hardening to prevent dll hijacking (\W{http://sf.net/p/nsis/bugs/1125}{bug #1125}) \b \c{InitiateShutdown()} is used to reboot the machine if available (\W{http://sf.net/p/nsis/patches/247}{patch #247}) \S2{} Minor Changes \b Fixed 4+ TiB freespace calculation bug (\W{http://sf.net/p/nsis/bugs/1115/}{bug #1115}) \b Windows 8 & 2012 support in WinVer.nsh \H{v2.46} 2.46 Released on December 6th, 2009 \S1{v2.46-cl} Changelog \S2{} Minor Changes \b Fixed \R{searchparse}{!searchparse} (\W{http://sourceforge.net/support/tracker.php?aid=2803622}{bug #2803622}) \b Fixed Vista error message when canceling uninstaller (\W{http://sourceforge.net/support/tracker.php?aid=2803097}{bug #2803097}) \b Resolve warning for LogicLib's endless Do..Loop (\W{http://sourceforge.net/support/tracker.php?aid=2849872}{bug #2849872}) \b \L{../Docs/StartMenu/Readme.txt}{StartMenu}: fixed random number prefixes when clicking on an empty spot (\W{http://sourceforge.net/support/tracker.php?aid=2810188}{bug #2810188}) \b Updates to NSIS.pas for plug-in development (\W{http://sourceforge.net/support/tracker.php?aid=2802794}{patch #2802794}) \S2{} Translations \b PortugueseBR typo (\W{http://sourceforge.net/support/tracker.php?aid=2826598}{patch #2826598}) \b Removed double spaces in Italian (\W{http://sourceforge.net/support/tracker.php?aid=2873598}{bug #2873598}) \S2{} Build System \b Fixed mingw builds of \L{../Docs/Math/Math.txt}{Math} plug-in (\W{http://sourceforge.net/support/tracker.php?aid=2835731}{patch #2835731}) \H{v2.45} 2.45 Released on June 6th, 2009 \S1{v2.45-rl} Release Notes \b Support for Microsoft's upcoming release of Windows 7 has been added based on RC1 testing and documentation. Please report any related issues and don't forget to use \R{arequestexecutionlevel}{RequestExecutionLevel}. \S1{v2.45-cl} Changelog \S2{} Major Changes \b Added support for Windows 7 installers - use \R{arequestexecutionlevel}{RequestExecutionLevel}, just like with Vista (\W{http://sourceforge.net/support/tracker.php?aid=2725883}{bug #2725883}) \b Added WinVer.nsh Windows 7 and Windows 2008 R2 support \b Installers now identify as Terminal Services aware (IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE) so $WINDIR will no longer be under the user's profile when installing on Terminal Services \b Less UAC annoyance in Add/Remove control panel (\W{http://sourceforge.net/support/tracker.php?aid=2697027}{bug #2697027}) \S2{} Minor Changes \b Added wildcard and /nonfatal support for \R{delfile}{!delfile} (\W{http://sourceforge.net/support/tracker.php?aid=1505425}{RFE #1505425}) \b Fixed \R{searchparse}{!searchparse} (\W{http://sourceforge.net/support/tracker.php?aid=2680110}{bug #2680110}) \b Fixed input validation for \R{createfont}{CreateFont} (\W{http://sourceforge.net/support/tracker.php?aid=2801024}{bug #2801024}) \b Fixed NSIS Menu handling of working directory (\W{http://sourceforge.net/support/tracker.php?aid=2781948}{bug #2781948}) \b Fixed Vista issues with shell folders ($DOCUMENTS, $PROFILE, etc.) on root directories (\W{http://sourceforge.net/support/tracker.php?aid=2138075}{bug #2138075}) \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=2705878}{bug #2705878}, \W{http://sourceforge.net/support/tracker.php?aid=2606525}{bug #2606525}) \b Use SW_SHOWDEFAULT for \R{execshell}{ExecShell} by default (\W{http://sourceforge.net/support/tracker.php?aid=2796189}{bug #2796189}) \S2{} Modern UI \b Call finish page show function only after the page is fully initialized (\W{http://sourceforge.net/support/tracker.php?aid=2720968}{bug #2720968}) \b Fixed translation of uninstaller directory page (\W{http://sourceforge.net/support/tracker.php?aid=2690112}{bug #2690112}) \b Fixed installation type text position in components page (\W{http://sourceforge.net/support/tracker.php?aid=2801317}{patch #2801317}) \b Fixed missing MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE (\W{http://sourceforge.net/support/tracker.php?aid=2788620}{bug #2788620}) \S2{} Translations \b Updated Indonesian (\W{http://sourceforge.net/support/tracker.php?aid=2790571}{patch #2790571}) \b Updated Portuguese BR (\W{http://sourceforge.net/support/tracker.php?aid=2642542}{patch #2642542}) \S2{} Build System \b Fixed some GCC warnings \H{v2.44} 2.44 Released on February 21st, 2009 \S1{v2.44-cl} Changelog \S2{} Major Changes \b Fixed a bug introduced in 2.43 causing script build issues with some icons (\W{http://sourceforge.net/support/tracker.php?aid=2572035}{bug #2572035}) \S2{} Minor Changes \b Fixed nsDialogs CreateTimer documentation (\W{http://sourceforge.net/support/tracker.php?aid=2595565}{bug #2595565}) \b Global labels didn't work when declared in unused functions (\W{http://sourceforge.net/support/tracker.php?aid=2593369}{bug #2593369}) \H{v2.43} 2.43 Released on February 5th, 2009 \S1{v2.43-rl} Release Notes \b A few minor changes were made to the new plug-in API that break backward compatibility. Header and library paths were changed and RegisterPluginCallback has changed its return value. \S1{v2.43-cl} Changelog \S2{} Minor Changes \b Added WinCore.nsh, WinDef.nsh, WinError.nsh, WinNT.nsh and WinUser.nsh for more useful Windows definitions \b Fixed a crash caused by \R{packhdr}{!packhdr} compressing resources (\W{http://sourceforge.net/support/tracker.php?aid=2533431}{bug #2533431}) \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=2564005}{bug #2564005}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Fixed MUI_DIRECTORYPAGE_BGCOLOR (\W{http://sourceforge.net/support/tracker.php?aid=2494528}{bug #2494528}) \S2{} Utilities and Plug-ins \b \L{../Docs/Banner/Readme.txt}{Banner}: Fixed installer showing on the background when Banner was used in .onInit \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Added Ctrl+K hotkey for build cancellation (\W{http://sourceforge.net/support/tracker.php?aid=2557392}{RFE #2557392}) \b \L{../Docs/nsDialogs/Readme.html}{nsDialogs}: Added NSD_SetIcon (\W{http://sourceforge.net/support/tracker.php?aid=2500960}{patch #2500960}) \S2{} Translations \b Added Esperanto \b Bulgarian fixes \S2{} Plug-in API \b Added VS2008 project files \b Better installation of header and library files under POSIX - see INSTALL file for more information \b Header and library files were moved to a subdirectory named \e{nsis} to prevent collisions \b \e{RegisterPluginCallback} now returns \e{int} instead of \e{BOOL} for a wider range of error reporting \S2{} Build System \b Added fink's mingw prefixes (\W{http://sourceforge.net/support/tracker.php?aid=2495138}{bug #2495138}) \b Fixed BOOL build issue on OS X (\W{http://sourceforge.net/support/tracker.php?aid=2497290}{bug #2497290}) \b Fixed iconv dependency detection on OS X (\W{http://sourceforge.net/support/tracker.php?aid=2494539}{bug #2494539}) \b Fixed Solaris builds (\W{http://sourceforge.net/support/tracker.php?aid=2497172}{patch #2497172}) \H{v2.42} 2.42 Released on December 20th, 2008 \S1{v2.42-rl} Release Notes \b Merry Christmas and a happy Hanukkah! \b Plug-in developers should check out the new plug-in API in Examples\\Plugin and convert their plug-ins, especially in case they require staying loaded. \S1{v2.42-cl} Changelog \S2{} Major Changes \b Deprecated /NOUNLOAD and SetPluginsUnload to make scripts simpler and safer (\W{http://sourceforge.net/support/tracker.php?aid=1912699}{patch #1912699}) \b \R{headers}{Useful header functions} no longer require usage declaration and different syntax for uninstaller functions \b Revamped plug-in API now comes in the form of pluginapi.lib, API version information and more common functions (\W{http://sourceforge.net/support/tracker.php?aid=2359978}{patch #2359978}) \S2{} Minor Changes \b Added \R{searchreplace}{!searchreplace} preprocessor command for compile time text search/replaces \b Added support for \R{library}{registration} of EXE COM servers (\W{http://sourceforge.net/support/tracker.php?aid=2315740}{RFE #2315740}) \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=2386821}{bug #2386821}) \b \L{../Docs/nsDialogs/Readme.html}{nsDialogs}: Added timer support (\W{http://sourceforge.net/support/tracker.php?aid=2135855}{patch #2135855}) \b \L{../Docs/nsDialogs/Readme.html}{nsDialogs}: Added progress bar support \b \L{../Include/WinVer.nsh}{WinVer.nsh}: Added IsServer, IsWin2003R2, IsStarterEdition, OSHasMediaCenter and OSHasTabletSupport \b \L{../Include/WinVer.nsh}{WinVer.nsh}: Fixed 95/NT4 ambiguity (\W{http://sourceforge.net/support/tracker.php?aid=2053642}{bug #2053642}) \b \L{../Include/WinVer.nsh}{WinVer.nsh}: Proper Windows XP x64 detection (\W{http://sourceforge.net/support/tracker.php?aid=2053700}{bug #2053700}) \b \L{../Include/WinVer.nsh}{WinVer.nsh}: Windows 2008 detection support (\W{http://sourceforge.net/support/tracker.php?aid=1949260}{RFE #1949260}) \S2{} Translations \b Minor English grammar improvements (\W{http://sourceforge.net/support/tracker.php?aid=2323452}{bug #2323452}) \S2{} Build System \b Full \L{../Docs/System/System.html}{System} compatibility with GCC (\W{http://sourceforge.net/support/tracker.php?aid=2193442}{patch #2193442}) \H{v2.41} 2.41 Released on November 20th, 2008 \S1{v2.41-cl} Changelog \S2{} Minor Changes \b Fixed LangDLL memory leaks for invalid input (\W{http://sourceforge.net/support/tracker.php?aid=1939573}{bug #1939573}) \b Fixed uninstaller generation on big-endian systems (\W{http://sourceforge.net/support/tracker.php?aid=2166401}{bug #2166401}, \W{http://sourceforge.net/support/tracker.php?aid=2167958}{bug #2167958}) \S2{} Translations \b Brazilian Portuguese corrections \b Consistency fixes for Simplified Chinese (\W{http://sourceforge.net/support/tracker.php?aid=2189117}{patch #2189117}) \S2{} Build System \b Added support for SCons 1.1.0 \b Fixed directory and components page text issues on VC8 builds (\W{http://sourceforge.net/support/tracker.php?aid=1982084}{patch #1982084}) \b System's Resource.dll now built from source \H{v2.40} 2.40 Released on October 10th, 2008 \S1{v2.40-cl} Changelog \S2{} Major Changes \b Service pack macros added to WinVer in version 2.39 now work (\W{http://sourceforge.net/support/tracker.php?aid=2070708}{bug #2070708}, \W{http://sourceforge.net/support/tracker.php?aid=2095363}{patch #2095363}) \S2{} Minor Changes \b Added initial folder selection option for \L{../Docs/nsDialogs/Readme.html}{nsDialogs}::SelectFileDialog (\W{http://sourceforge.net/support/tracker.php?aid=2016003}{patch #2016003}) \b Fixed \R{getparameters}{GetParameters} handling of MBCS characters (\W{http://sourceforge.net/support/tracker.php?aid=2067946}{bug #2067946}) \b Fixed incorrect $\{NSD_OnBack\} documentation (\W{http://sourceforge.net/support/tracker.php?aid=2059651}{bug #2059651}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Set focus to checkboxes on the finish page (\W{http://sourceforge.net/support/tracker.php?aid=2110357}{bug #2110357}) \S2{} Translations \b Portuguese corrections (\W{http://sourceforge.net/support/tracker.php?aid=2086988}{bug #2086988}) \b Simplified Chinese corrections (\W{http://sourceforge.net/support/tracker.php?aid=2056906}{patch #2056906}) \H{v2.39} 2.39 Released on August 16th, 2008 \S1{v2.39-cl} Changelog \S2{} Major Changes \b Added \R{define}{!define} \e{/file} and \R{searchparse}{!searchparse} (\W{http://sourceforge.net/support/tracker.php?aid=2016254}{patch #2016254}) \b Added service pack macros (AtLeastServicePack, IsServicePack, AtMostServicePack) to WinVer.nsh (\W{http://sourceforge.net/support/tracker.php?aid=2036802}{patch #2036802}) \S2{} Minor Changes \b Added more \L{../Docs/nsDialogs/Readme.html}{nsDialogs} list box handling macros (\W{http://sourceforge.net/support/tracker.php?aid=2041919}{patch #2041919}) \b Added Unicode version compatible \L{../Docs/System/System.html}{System} string type (\W{http://sourceforge.net/support/tracker.php?aid=2025721}{patch #2025721}, \W{http://sourceforge.net/support/tracker.php?aid=1961307}{RFE #1961307}) \b Fixed \L{../Docs/nsDialogs/Readme.html}{nsDialogs} atom leak (\W{http://sourceforge.net/support/tracker.php?aid=2053522}{bug #2053522}) \b Minor documentation improvements \b Show hand cursor for \L{../Docs/nsDialogs/Readme.html}{nsDialogs} links (\W{http://sourceforge.net/support/tracker.php?aid=2004129}{patch #2004129}) \H{v2.38} 2.38 Released on July 12th, 2008 \S1{v2.38-cl} Changelog \S2{} Major Changes \b Fixed a bug in nsDialogs that caused it to pollute the stack if callbacks are not set for each control (\W{http://sourceforge.net/support/tracker.php?aid=2013317}{bug #2013317}) \S2{} Minor Changes \b Added IfNotThen support for LogicLib (\W{http://sourceforge.net/support/tracker.php?aid=1990761}{patch #1990761}) \b Added support for NTFS mounts points on the directory page (\W{http://sourceforge.net/support/tracker.php?aid=1946112}{bug #1946112}) \b Fixed branding image control detection on Debian, due to improper identification of static controls (\W{http://sourceforge.net/support/tracker.php?aid=1951417}{bug #1951417}) \b Log actual creation of directories and not just failures and final directory (\W{http://sourceforge.net/support/tracker.php?aid=1992325}{patch #1992325}) \b Made log close when \e{LogSet off} is used (\W{http://sourceforge.net/support/tracker.php?aid=1986692}{patch #1986692}) \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=1990955}{bug #1990955}) \b \L{../Docs/MultiUser/Readme.html}{MultiUser}: Fixed MULTIUSER_INSTALLMODE_INSTDIR handling for the uninstaller \S2{} Modern UI \b Document page leave callback function (\W{http://sourceforge.net/support/tracker.php?aid=1964719}{bug #1964719}) \b Fixed MUI_FINISHPAGE_CANCEL_ENABLED \b Fixed wasted variable warnings (\W{http://sourceforge.net/support/tracker.php?aid=1995024}{bug #1995024}) \S2{} Translations \b Fixed French translation of MUI_UNTEXT_FINISH_INFO_REBOOT (\W{http://sourceforge.net/support/tracker.php?aid=1967032}{patch #1967032}) \b Removed non-ANSI characters from French display name (\W{http://sourceforge.net/support/tracker.php?aid=1979491}{bug #1979491}) \b Updated Slovenian (\W{http://sourceforge.net/support/tracker.php?aid=2014106}{patch #2014106}) \H{v2.37} 2.37 Released on May 3rd, 2008 \S1{v2.37-cl} Changelog \S2{} Major Changes \b Fixed a bug introduced in 2.32 that caused blurry icons on Windows versions prior to XP (\W{http://sourceforge.net/support/tracker.php?aid=1956350}{bug #1956350}) \b Use $PROGRAMFILES as a default for $PROGRAMFILES64 instead of "C:\\Program Files" (\W{http://sourceforge.net/support/tracker.php?aid=1947702}{bug #1947702}) \S2{} Minor Changes \b Automatically select language in case there is only one available choice (\W{http://sourceforge.net/support/tracker.php?aid=1939571}{bug #1939571}) \b \L{../Docs/MultiUser/Readme.html}{MultiUser}: Fixed build errors with manual inclusion of StrFunc.nsh \b Support for compression of files up to 2GB (\W{http://sourceforge.net/support/tracker.php?aid=1948700}{patch #1948700}) \S2{} Utilities and Plug-ins \b Fixed $\{NSD_OnBack\} (\W{http://sourceforge.net/support/tracker.php?aid=1947388}{bug #1947388}) \b Fixed \L{../Docs/nsDialogs/Readme.html}{nsDialogs}::SelectFileDialog return value for user cancellation (\W{http://sourceforge.net/support/tracker.php?aid=1955803}{bug #1955803}) \b Fixed possible \L{../Docs/BgImage/BgImage.txt}{BgImage} crash when calling BgImage::Destroy more than once (\W{http://sourceforge.net/support/tracker.php?aid=1951248}{patch #1951248}) \b Minor documentation improvements \S2{} Translation \b Brazilian Portuguese updates \b Polish updates (\W{http://sourceforge.net/support/tracker.php?aid=1927421}{patch #1927421}) \b Slovak updates (\W{http://sourceforge.net/support/tracker.php?aid=1939669}{patch #1939669}) \b Spanish updates \S2{} Build System \b SCons requirement upgraded to 0.98 \H{v2.36} 2.36 Released on March 29th, 2008 \S1{v2.36-rl} Release Notes \b nsDialogs is picking up its pace and offers lots of new macros in this release. Keep the patches and requests coming! \S1{v2.36-cl} Changelog \S2{} Major Changes \b \L{../Docs/nsExec/nsExec.txt}{nsExec}: Support for x64 disabled redirection (\W{http://sourceforge.net/support/tracker.php?aid=1778973}{RFE #1778973}, \W{http://sourceforge.net/support/tracker.php?aid=1889317}{bug #1889317}) \S2{} Modern UI \b Added missing MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END \b Fixed start menu page setting the error flag (\W{http://sourceforge.net/support/tracker.php?aid=1891106}{bug #1891106}) \S2{} nsDialogs \b NSD_AddStyle and NSD_AddExStyle for easy customization (\W{http://sourceforge.net/support/tracker.php?aid=1900588}{patch #1900588}) \b NSD_CB_AddString, NSD_CB_SelectString, NSD_LB_AddString and NSD_LB_SelectString for easier handling of combo and list boxes \b NSD_CreateNumber and NSD_SetTextLimit for limited input fields \b NSD_SetImage, NSD_SetStretchedImage, NSD_ClearImage and NSD_FreeImage for image handling \b NSD_SetState, NSD_GetState, NSD_Check and NSD_Uncheck for handling of check boxes and radio buttons (\W{http://sourceforge.net/support/tracker.php?aid=1900588}{patch #1900588}) \b NSD_SetText for easily setting control's text \b OnClick support for labels (\W{http://sourceforge.net/support/tracker.php?aid=1908732}{bug #1908732}) \b Support for edit box change notification in combo box \S2{} Minor Changes \b Fixed exception handling of UPX compressed icons (\W{http://sourceforge.net/support/tracker.php?aid=1896500}{bug #1896500}) \b Fixed InstallDirRegKey example in bigtest.nsi \b Fixed Memento's documentation to include $\{MementoSectionDone\} \b Fixed rare decompression error with 0x4001 bytes of compressed data (\W{http://sourceforge.net/support/tracker.php?aid=1874297}{bug #1874297}) \b LangFile.nsh: Added LANGFILE_INCLUDE_WITHDEFAULT to load language file with defaults being obtained from a default file. This replaces the LANGFILE_DEFAULT setting and makes it easier to use LangFile.nsh for multiple sets of languages file without having to care about the different LANGFILE_DEFAULT settings. \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=1891266}{bug #1891266}, \W{http://sourceforge.net/support/tracker.php?aid=1894033}{bug #1894033}, \W{http://sourceforge.net/support/tracker.php?aid=1896803}{bug #1896803}) \b \L{../Docs/MultiUser/Readme.html}{MultiUser}: Fixed error when a custom installation mode initialization function is used only for the installer \b \L{../Docs/MultiUser/Readme.html}{MultiUser}: Fixed default installation mode based on registry key (\W{http://sourceforge.net/support/tracker.php?aid=1913029}{bug #1913029}) \b \L{../Docs/MultiUser/Readme.html}{MultiUser}: Fixed no uninstaller handling (MULTIUSER_NOUNINSTALL) \S2{} Utilities and Plug-ins \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Avoid opening executables with identical folder names when opening script's folder (\W{http://sourceforge.net/support/tracker.php?aid=1891066}{bug #1891066}) \b \L{../Docs/nsExec/nsExec.txt}{nsExec}: Fixed return code handling so 259 won't cause an infinite loop (\W{http://sourceforge.net/support/tracker.php?aid=1909458}{bug #1909458}) \b \L{../Docs/VPatch/Readme.html}{VPatch}: Added MD5 functions (\W{http://sourceforge.net/support/tracker.php?aid=1900226}{RFE #1900226}) \S2{} Translation \b Albanian updates (\W{http://sourceforge.net/support/tracker.php?aid=1919360}{patch #1919360}) \b French fixes (\W{http://sourceforge.net/support/tracker.php?aid=1916564}{patch #1916564}) \b Polish updates (\W{http://sourceforge.net/support/tracker.php?aid=1894983}{patch #1894983}) \S2{} Build System \b Fixed build of NSIS Menu with wxGTK (\W{http://sourceforge.net/support/tracker.php?aid=1900233}{bug #1900233}) \b Use CRLF for DSW and DSP files to avoid corruption messages \b Various build fixes for GCC 4.3, amd64 and Linux in general \H{v2.35} 2.35 Released on February 8th, 2008 \S1{v2.35-cl} Changelog \S2{} Major Changes \b Added \L{../Docs/MultiUser/Readme.html}{MultiUser} - installer configuration for multi-user Windows environments \b More user friendly corrupted installer message (\W{http://sourceforge.net/support/tracker.php?aid=1795426}{RFE #1795426}) \b Switched all examples to Modern UI 2 \S2{} Minor Changes \b Fixed uninitialized memory leaking into resources (\W{http://sourceforge.net/support/tracker.php?aid=1874297}{bug #1874297}) \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=1861941}{bug #1861941}, \W{http://sourceforge.net/support/tracker.php?aid=1883917}{bug #1883917}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Fit images in welcome/finish page by default and fix support for MUI_(UN)WELCOMEFINISHPAGE_BITMAP_NOSTRETCH (\W{http://sourceforge.net/support/tracker.php?aid=1875945}{bug #1875945}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Fixed default finish page reboot selection (\W{http://sourceforge.net/support/tracker.php?aid=1864690}{bug #1864690}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Fixed MUI_STARTMENU_GETFOLDER (\W{http://sourceforge.net/support/tracker.php?aid=1864507}{bug #1864507}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Fixed unreferenced mui.StartMenuPage.Create warning (\W{http://sourceforge.net/support/tracker.php?aid=1861944}{bug #1861944}) \b New simplified code for \R{library_vb6}{installation of VisualBasic 6 runtime} \b Simplified NSIS Menu providing easier access to all documentation \S2{} Utilities and Plug-ins \b Added keyboard cues support for LINK controls in \L{../Docs/nsDialogs/Readme.html}{nsDialogs} (\W{http://sourceforge.net/support/tracker.php?aid=1871856}{patch #1871856}) \b Fixed a rare nsDialogs crash on Windows 98 with non-standard builds of nsDialogs (\W{http://sourceforge.net/support/tracker.php?aid=1889720}{bug #1889720}) \H{v2.34} 2.34 Released on December 24th, 2007 \S1{v2.34-rl} Release Notes \b Thanks to user input on \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}, it is now ready for mass consumption at no better time than the holiday season. The installer for NSIS itself now exploits the wonders of MUI2 and \L{../Docs/nsDialogs/Readme.html}{nsDialogs} and so should you. \S1{v2.34-cl} Changelog \S2{} Major Changes \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}: Simpler code, easier to extend and makes use of the faster \L{../Docs/nsDialogs/Readme.html}{nsDialogs} \S2{} Minor Changes \b Added IfNot support for LogicLib (\W{http://sourceforge.net/support/tracker.php?aid=1846785}{patch #1846785}) \b Added some deprecation messages in MUI2 (\W{http://sourceforge.net/support/tracker.php?aid=1784470}{bug #1784470}) \b Allow overwrite of LANGFILE_*_NAME defines in new LangFile.nsh (\W{http://sourceforge.net/support/tracker.php?aid=1848952}{bug #1848952}) \b Better RTL support in instfiles and components page (\W{http://sourceforge.net/support/tracker.php?aid=1841573}{bug #1841573}) \b Don't warn of comments containing line-continuation character when it has no effect (\W{http://sourceforge.net/support/tracker.php?aid=1701051}{bug #1701051}, \W{http://sourceforge.net/support/tracker.php?aid=1686589}{RFE #1686589}) \b Fixed deletion of files with relative paths, a.k.a the EVE bug (\W{http://sourceforge.net/support/tracker.php?aid=1851273}{bug #1851273}) \b Fixed input verification of \R{sgetcurinsttype}{GetCurInstType} and \R{getfullpathname}{GetFullPathName} \b Fixed \R{wordfind}{WordFind} handling of MBCS characters (\W{http://sourceforge.net/support/tracker.php?aid=1852141}{bug #1852141}) \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=1842326}{bug #1842326}) \b Use CRLF in examples (\W{http://sourceforge.net/support/tracker.php?aid=1835866}{bug #1835866}) \S2{} Utilities and Plug-ins \b Added missing stack handling in \L{../Docs/nsDialogs/Readme.html}{nsDialogs} examples \b Added NSD_GetState for checkboxes and radio buttons, NSD_SetFocus, NSD_CreatePassword and NSD_CreateDropList (\W{http://sourceforge.net/support/tracker.php?aid=1848940}{patch #1848940}) \b Fixed documentation of \L{../Docs/nsDialogs/Readme.html}{nsDialogs}::SelectFolderDialog (\W{http://sourceforge.net/support/tracker.php?aid=1841120}{bug #1841120}) \b Fixed NSD_CreateComboBox so it'd work like InstallOptions (\W{http://sourceforge.net/support/tracker.php?aid=1851136}{bug #1851136}) \S2{} Translations \b Bulgarian updates \b German fixes \S2{} Build System \b Fixed build issues on Mac OS (\W{http://sourceforge.net/support/tracker.php?aid=1851365}{bug #1851365}) \b Fixed endianity issues introduced in version 2.32 (\W{http://sourceforge.net/support/tracker.php?aid=1851365}{bug #1851365}) \H{v2.33} 2.33 Released on November 17th, 2007 \S1{v2.33-rl} Release Notes \b This is a quick fix release for a bug, introduced in 2.32, that prevented the welcome page to display properly on Windows 9x. The problem was caused by the move from CVS to Subversion that messed with the line-breaks format of the INI files. \S1{v2.33-cl} Changelog \S2{} Major Changes \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: Fixed a bug, introduced in 2.32, that caused display problems for the welcome and finish pages on Windows 9x (\W{http://sourceforge.net/support/tracker.php?aid=1831677}{bug #1831677}) \S2{} Minor Changes \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: Allow MUI_LANGDLL_ALLLANGUAGES to be defined after insertion of MUI_LANGUAGE macro \S2{} Utilities and Plug-ins \b Made \L{../Docs/nsExec/nsExec.txt}{nsExec}'s internal process always exit cleanly to avoid false return values and delays (reported in the \W{http://forums.winamp.com/showthread.php?threadid=279683}{forum}) \b \L{../Docs/nsDialogs/Readme.html}{nsDialogs}: Added OnClick support for static controls \b \L{../Docs/VPatch/Readme.html}{VPatch}: Fixed VPatchFile macro path handling (\W{http://sourceforge.net/support/tracker.php?aid=1829540}{bug #1829540}) \S2{} Translations \b Spanish updates \S2{} Build System \b Separate strip options for win32 and cross-platform binaries \H{v2.32} 2.32 Released on November 9th, 2007 \S1{v2.32-rl} Release Notes \b Vista PNG icons are now supported without the need for any special tricks. \S1{v2.32-cl} Changelog \S2{} Major Changes \b Added support for mismatching installer and uninstaller icons \b NSIS source code is now hosted on Subversion instead of CVS \S2{} Minor Changes \b Fixed synchronization that could allow the user to cause extraction errors in rare cases (reported in the \W{http://forums.winamp.com/showthread.php?s=&threadid=274333}{forum}) \b Fixed syntax validation of \R{var}{Var} \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=1811876}{bug #1811876}, \W{http://sourceforge.net/support/tracker.php?aid=1819946}{bug #1819946}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed 3-line title on welcome/finish page \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed components page description and lock \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed default language selection from registry \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed MUI_DIRECTORYPAGE_BGCOLOR \S2{} Utilities and Plug-ins \b \L{../Docs/nsDialogs/Readme.html}{nsDialogs}: Added link support \S2{} Translations \b Bulgarian corrections \b Fixed Japanese and Norwegian Nynorsk MUI line breaks (\W{http://sourceforge.net/support/tracker.php?aid=1817289}{bug #1817289}) \S2{} Build System \b Check compiler's \e{-m32} flag before the linker's to avoid gcc segfault \H{v2.31} 2.31 Released on September 29th, 2007 \S1{v2.31-rl} Release Notes \b Please continue to report any issues and suggestions regarding \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}. Input for the previous version was very helpful in improving MUI2. \S1{v2.31-cl} Changelog \S2{} Minor Changes \b Added BST_* definitions to WinMessages.nsh (\W{http://sourceforge.net/support/tracker.php?aid=1792422}{bug #1792422}) \b Added \R{setregview}{SetRegView} \e{lastused} \b Minor documentation improvements \b \R{library}{Library} will now revert registry view settings (\R{setregview}{SetRegView}) after it's finished \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: Fixed empty welcome page with Chinese (\W{http://sourceforge.net/support/tracker.php?aid=1786899}{bug #1786899}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: Fixed finish button text (\W{http://sourceforge.net/support/tracker.php?aid=1789492}{bug #1789492}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: Fixed uninstaller comportments page text (\W{http://sourceforge.net/support/tracker.php?aid=1793811}{bug #1793811}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: Fixed unused function warnings \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed header bitmap issues, including NOSTRETCH and compilation errors \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed language selection dialog \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed reboot finish page \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed unloading of nsDialogs on finish page \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Fixed unused variable warnings \S2{} Utilities and Plug-ins \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Fixed command line parsing error (\W{http://sourceforge.net/support/tracker.php?aid=1796053}{bug #1796053}) \S2{} Translations \b Korean corrections \b Persian improvements (\W{http://sourceforge.net/support/tracker.php?aid=1776386}{patch #1776386}) \b Romanian improvements (\W{http://sourceforge.net/support/tracker.php?aid=1783853}{patch #1783853}) \S2{} Build System \b Fixed build failures with MinGW's GCC 4 (\W{http://sourceforge.net/support/tracker.php?aid=1800834}{bug #1800834}) \H{v2.30} 2.30 Released on August 25th, 2007 \S1{v2.30-rl} Release Notes \b This release includes a beta of \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2}. Please report any issues and suggestions. \b The format of Modern UI language files has been modified to better support external strings. Private language files should be converted (and submitted as a \W{http://sourceforge.net/tracker/?group_id=22049&atid=373087}{patch} in the spirit of open source). \S1{v2.30-cl} Changelog \S2{} Major Changes \b Fixed a bug introduced in version 2.29 that caused invalid $SMPROGRAMS value on Windows 98 (\W{http://sourceforge.net/support/tracker.php?aid=1766268}{bug #1766268}) \b \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 beta}: Simpler code, easier to extend and makes use of nsDialogs \S2{} Minor Changes \b Added InstallOptions.nsh with relevant usage macros, based on the old Modern UI macros \b Added LangFile.nsh allowing creation of language files that can be included with a single command with defaults for missing strings (when LANGFILE_DEFAULT is set) \b Added LB_ERR and CB_ERR to WinMessages.nsh (\W{http://sourceforge.net/support/tracker.php?aid=1771644}{bug #1771644}) \b Fixed \R{createdirectory}{CreateDirectory} logging (\W{http://sourceforge.net/support/tracker.php?aid=1768584}{patch #1768584}) \b Fixed escaping of quotes with $\\ in macros (\W{http://sourceforge.net/support/tracker.php?aid=1713708}{bug #1713708}) \b Minor documentation improvements \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.80}: New language files structure based on LangFile.nsh \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.80}: MUI_LANGDLL_DISPLAY now reads previous settings on silent installations as well \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.80}: Added MUI_CUSTOMFUNCTION_MOUSEOVERSECTION (\W{http://sourceforge.net/support/tracker.php?aid=1762003}{patch #1762003}) \S2{} Utilities and Plug-ins \b Various nsDialogs improvements including RTL support, more macros in nsDialogs.nsh and \L{../Docs/nsDialogs/Readme.html}{initial documentation} \S2{} Translations \b Catalan returns \b Danish corrections \b Slovak corrections (\W{http://sourceforge.net/support/tracker.php?aid=1762627}{patch #1762627}) \S2{} Build System \b More HPUX fixes (\W{http://sourceforge.net/support/tracker.php?aid=1755148}{bug #1755148}, \W{http://sourceforge.net/support/tracker.php?aid=1753063}{bug #1753063}, \W{http://sourceforge.net/support/tracker.php?aid=1758873}{bug #1758873}, \W{http://sourceforge.net/support/tracker.php?aid=1758863}{patch #1758863}) \b Ignore known failing tests by default on POSIX \H{v2.29} 2.29 Released on July 14th, 2007 \S1{v2.29-rl} Release Notes \b The most notable addition in this release is nsDialogs - a faster and far more capable replacement for InstallOptions. It allows creating controls of any type directly from the script and removes the need to mess with slow INI files. It integrates directly into the script by calling functions for notification, including change notification for edit boxes. \W{https://nsis.sourceforge.io/Community}{Speak up} if you have any suggestions/comments/patches for it. \S1{v2.29-cl} Changelog \S2{} Major Changes \b Added \L{../Examples/nsDialogs}{nsDialogs} - a replacement for InstallOptions \S2{} Minor Changes \b Disable Windows error messages for the entire installer and not just for an incomplete list of fail-points (\W{http://sourceforge.net/support/tracker.php?aid=1741061}{bug #1741061}) \b Fixed incorrect large version handling of \R{getfileversion}{GetFileVersion} (\W{http://sourceforge.net/support/tracker.php?aid=1742255}{bug #1742255}, \W{http://sourceforge.net/support/tracker.php?aid=1742562}{patch #1742562}) \b Fixed the ReverseSection macro in Sections.nsh (\W{http://sourceforge.net/support/tracker.php?aid=1742793}{bug #1742793}) \b Minor documentation improvements \b Simplified \R{readreg_multi_sz}{REG_MULTI_SZ reader} \b Use SHGetFolderPath where available to better support all users' folders \S2{} Utilities and Plug-ins \b \L{../Docs/Banner/Readme.txt}{Banner}: Avoid possible hangs when called from page callbacks (\W{http://sourceforge.net/support/tracker.php?aid=1743801}{bug #1743801}) \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: added /TRANSLATE2 for more "translator-friendly" strings (\W{http://sourceforge.net/support/tracker.php?aid=1656076}{patch #1656076}) \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: support downloads over 2gb (\W{http://sourceforge.net/support/tracker.php?aid=1723131}{patch #1723131}) \S2{} Translations \b Added International Spanish \S2{} Build System \b Added support for HPUX (\W{http://sourceforge.net/support/tracker.php?aid=1714416}{patch #1714416}) \H{v2.28} 2.28 Released on June 8th, 2007 \S1{v2.28-cl} Changelog \S2{} Major Changes \b Added a workaround for a Windows 2000 bug that caused infinite loops when hitting a key on the instfiles page (\W{http://sourceforge.net/support/tracker.php?aid=1733692}{bug #1733692}) \S2{} Minor Changes \b Improved compiler error strings (\W{http://sourceforge.net/support/tracker.php?aid=1722147}{patch #1722147}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: added MUI_STARTMENUPAGE_BGCOLOR and MUI_DIRECTORYPAGE_BGCOLOR (\W{http://sourceforge.net/support/tracker.php?aid=1706187}{patch #1706187}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: added MUI_LANGDLL_ALLLANGUAGES that forces the language selection dialog to display all languages (\W{http://sourceforge.net/support/tracker.php?aid=1724876}{patch #1724876}) \S2{} Utilities and Plug-ins \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions}: corrected documentation of TxtColor (\W{http://sourceforge.net/support/tracker.php?aid=1716614}{bug #1716614}) \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: added compatibility with some buggy servers that don't close the connection (\W{http://sourceforge.net/support/tracker.php?aid=1713562}{bug #1713562}) \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: fixed 100% CPU usage during domain resolution (\W{http://sourceforge.net/support/tracker.php?aid=1713560}{bug #1713560}) \S2{} Translations \b Valencian and Catalan are no longer installed (\W{http://sourceforge.net/support/tracker.php?aid=1558822}{patch #1558822}) \S2{} Build System \b Added IGNORETESTS for ignoring certain test files \b Added wxWidgets to the requirement list \b \L{../Docs/System/System.html}{System} now builds with GCC, but without System::Get and System::Call (\W{http://sourceforge.net/support/tracker.php?aid=1711089}{patch #1711089}) \H{v2.27} 2.27 Released on May 5th, 2007 \S1{v2.27-rl} Release Notes \b This is a quick-fix release that addresses a bug introduced in the last version, 2.26, that caused $PROGRAMFILES and $COMMONFILES to translate into random strings in the uninstaller. \S1{v2.27-cl} Changelog \S2{} Major Changes \b Fixed a bug introduced in 2.26 that made $PROGRAMFILES and $COMMONFILES unavailable in the uninstaller \S2{} Minor Changes \b Disable the X button on InstallOptions pages when CancelEnabled is 0 \b Fixed incomplete \R{messagebox}{MessageBox} usage line (\W{http://sourceforge.net/support/tracker.php?aid=1709460}{bug #1709460}) \S2{} Build System \b Added \c{TOOLSET} option to allow selection of specific build tools (e.g. \c{scons TOOLSET=mingw}) \H{v2.26} 2.26 Released on April 27th, 2007 \S1{v2.26-rl} Release Notes \b Installation on x64 systems is now fully supported with $PROGRAMFILES64, \R{setregview}{SetRegView} and \R{library}{Library}'s LIBRARY_X64 option. \S1{v2.26-cl} Changelog \S2{} Major Changes \b Added LIBRARY_X64 option for \R{library_install}{InstallLib} and \R{library_uninstall}{UnInstallLib} for installing and uninstalling x64 libraries \b Added \R{varconstant}{$PROGRAMFILES32}, \R{varconstant}{$PROGRAMFILES64}, \R{varconstant}{$COMMONFILES32} and \R{varconstant}{$COMMONFILES64} \S2{} Minor Changes \b Added \R{varconstant}{$EXEPATH} and \R{varconstant}{$EXEFILE} \b Added $(^Language) language string which holds the language name (\W{http://sourceforge.net/support/tracker.php?aid=1235616}{RFE #1235616}) \b Added LIBRARY_IGNORE_VERSION option for \R{library_install}{InstallLib} (\W{http://sourceforge.net/support/tracker.php?aid=1699435}{patch #1699435}) \b Added VXD support for \R{getdllversionlocal}{GetDLLVersionLocal} on Windows NT4/2000/XP/Vista (\W{http://sourceforge.net/support/tracker.php?aid=1706624}{patch #1706624}) \b Avoid \R{library}{Library} warning when UnInstallLib is unused (\W{http://sourceforge.net/support/tracker.php?aid=1692761}{bug #1692761}) \b Fixed error handling of \R{copyfiles}{CopyFiles} on Windows NT4 (\W{http://sourceforge.net/support/tracker.php?aid=774966}{bug #774966}) \b Fixed font name encoding broken since 2.24 \b Fixed \L{../Examples/LogicLib.nsi}{LogicLib} duplicate labels across included files \b Fixed preservation of folder attributes with \c{\R{file}{File} /a} (\W{http://sourceforge.net/support/tracker.php?aid=1699474}{bug #1699474}) \b Improved unused variable warning (\W{http://sourceforge.net/support/tracker.php?aid=1701050}{bug #1701050}) \b \R{library}{Library} macros no longer require version information for DLL files on POSIX \b Minor documentation improvements (including \W{http://sourceforge.net/support/tracker.php?aid=971467}{RFE #971467}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: added MUI_FINISHPAGE_CANCEL_ENABLED \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: added MUI_FINISHPAGE_REBOOTLATER_DEFAULT (\W{http://sourceforge.net/support/tracker.php?aid=1143843}{RFE #1143843}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: block unsupported languages in the language selection dialog (\W{http://sourceforge.net/support/tracker.php?aid=1564986}{RFE #1564986}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: disable Cancel button on the finish page (\W{http://sourceforge.net/support/tracker.php?aid=1267491}{bug #1267491}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI}: reduce flicker caused by MUI_HEADER_TRANSPARENT_TEXT (\W{http://sourceforge.net/support/tracker.php?aid=1696610}{patch #1696610}) \b Support \R{quit}{Quit} in \R{pagecallbacks_explain}{show page functions} \S2{} New/Changed Commands \b Added \R{setregview}{SetRegView} to allow access to the x64 registry view \b Installer icon support for \R{messagebox}{MessageBox} using MB_USERICON (\W{http://sourceforge.net/support/tracker.php?aid=1682748}{patch #1682748}, \W{http://sourceforge.net/support/tracker.php?aid=1530388}{RFE #1530388}) \S2{} Utilities and Plug-ins \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.47}: line breaks support in Link controls (\W{http://sourceforge.net/support/tracker.php?aid=1683186}{patch #1683186}, \W{http://sourceforge.net/support/tracker.php?aid=1495949}{RFE #1495949}), added HLine and VLine controls (\W{http://sourceforge.net/support/tracker.php?aid=1683189}{patch #1683189}) \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: fixed broken command line parameter handling introduced in the last version (\W{http://sourceforge.net/support/tracker.php?aid=1696534}{bug #1696534}) \b \L{../Examples/UserInfo/UserInfo.nsi}{UserInfo}: return effective user group on Vista, added GetOriginalAccountType (\W{http://sourceforge.net/support/tracker.php?aid=1687456}{patch #1687456}, \W{http://sourceforge.net/support/tracker.php?aid=1684777}{bug #1684777}) \S2{} Translations \b Added Afrikaans translation (\W{http://sourceforge.net/support/tracker.php?aid=1699558}{patch #1699558}) \b French corrections (\W{http://sourceforge.net/support/tracker.php?aid=1676101}{patch #1676101}) \b German corrections \S2{} Build System \b Added SKIPTESTS option \b Avoid a lot of code warnings (\W{http://sourceforge.net/support/tracker.php?aid=1676243}{bug #1676243}) \b Detect wxWidgets instead of assuming its existence on POSIX (\W{http://sourceforge.net/support/tracker.php?aid=1672315}{bug #1672315}) \b Fixed big-endian platform support broken since 2.24 \H{v2.25} 2.25 Released on March 31st, 2007 \S1{v2.25-cl} Changelog \S2{} Major Changes \b Added \L{../Include/Memento.nsh}{Memento.nsh} for easy persistency of user selections across different runs of the installer (\W{http://sourceforge.net/support/tracker.php?aid=1677624}{RFE #1677624}) \b Fixed a bug introduced in 2.24 that allowed the license page to be skipped even with agreement check box or radio buttons (\W{http://sourceforge.net/support/tracker.php?aid=1664428}{bug #1664428}) \S2{} Minor Changes \b Added Vista manifest to StartMenu.nsi example to avoid backward compatibility mode that moves shortcuts (\W{http://sourceforge.net/support/tracker.php?aid=1664957}{bug #1664957}) \b Both dashes and slashes are supported as switch prefixes on makensis.exe (\W{http://sourceforge.net/support/tracker.php?aid=1661503}{bug #1661503}) \b Delete uninstaller temporary directory on reboot (\W{http://sourceforge.net/support/tracker.php?aid=1660626}{patch #1660626}) \b Distribute \L{../Examples/Plugin}{Plug-in example} with the NSIS package and not only with the source code \b Fixed lossy Unicode conversion of dialog template strings (\W{http://sourceforge.net/support/tracker.php?aid=1662190}{bug #1662190}) \b Fixed \L{../Include/Sections.nsh}{Sections.nsh} macros support for $0 as input (\W{http://sourceforge.net/support/tracker.php?aid=1664648}{bug #1664648}) \b Fixed uninstallers support for the /D= command line switch \b Improved logging of WriteReg commands \b Minor documentation updates and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1662419}{patch #1662419}) \S2{} New/Changed Commands \b Added bitwise operators support for \R{define}{!define} /math (\W{http://sourceforge.net/support/tracker.php?aid=1669513}{RFE #1669513}) \b \R{scopepredefines}{__PAGEEX__} contains the page type (\W{http://sourceforge.net/support/tracker.php?aid=1644712}{patch #1644712}) \S2{} Utilities and Plug-ins \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.46}: Use installer's name for message boxes (\W{http://sourceforge.net/support/tracker.php?aid=1661677}{bug #1661677}) \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Use Escape button to close (\W{http://sourceforge.net/support/tracker.php?aid=1666501}{RFE #1666501}) \b \L{../Docs/Math/Math.txt}{Math}: Removed mathcrt.lib \b \L{../Docs/StartMenu/Readme.txt}{StartMenu}: Refuse empty paths (\W{http://sourceforge.net/support/tracker.php?aid=1684751}{bug #1684751}) \S2{} Translations \b Fixed Galician language files (\W{http://sourceforge.net/support/tracker.php?aid=1663795}{bug #1663795}) \S2{} Build System \b Added APPEND_LIBPATH and APPEND_CPPATH instead of the malfunctioning CPPPATH and LIBPATH \b Added ChangeLog to source code package (\W{http://sourceforge.net/support/tracker.php?aid=1680508}{patch #1680508}) \b Avoid some warnings on VS2005 (\W{http://sourceforge.net/support/tracker.php?aid=1667950}{patch #1667950}) \b Fixed lzma test segfault on POSIX (\W{http://sourceforge.net/support/tracker.php?aid=1666873}{bug #1666873}) \b More strict-aliasing compatibility (\W{http://sourceforge.net/support/tracker.php?aid=1635841}{bug #1635841}) \b NSIS Menu finally built from source \H{v2.24} 2.24 Released on February 17th, 2007 \S1{v2.24-cl} Changelog \S2{} Major Changes \b \R{library}{Library} uninstall-reinstall-reboot problems workaround (\W{http://sourceforge.net/support/tracker.php?aid=1097642}{bug #1097642}) \b Minimized number of cases where an error message appears in silent mode \b New compiler predefines for \R{scopepredefines}{code scope} (\W{http://sourceforge.net/support/tracker.php?aid=1644712}{patch #1644712}) \S2{} Minor Changes \b Added \R{usagereference}{/P command line option} for setting process priority of makensis (\W{http://sourceforge.net/support/tracker.php?aid=1638974}{patch #1638974}) \b Added support for 64-bit PE on POSIX to \R{getdllversionlocal}{GetDLLVersionLocal} (\W{http://sourceforge.net/support/tracker.php?aid=1643633}{patch #1643633}) \b Append last part of \R{ainstalldir}{InstallDir} only to $INSTDIR on directory pages (\W{http://sourceforge.net/support/tracker.php?aid=1174184}{bug #1174184}) \b Avoid permissions change of output files for \R{linefind}{LineFind} and \R{filejoin}{FileJoin} (\W{http://sourceforge.net/support/tracker.php?aid=1631773}{bug #1631773}) \b Fixed erroneous warnings on uninstall sections (\W{http://sourceforge.net/support/tracker.php?aid=1631889}{bug #1631889}) \b Fixed lossy Unicode conversion in resource editor (\W{http://sourceforge.net/support/tracker.php?aid=1083492}{bug #1083492}) \b Ignore invalid preprocessor commands in ignored block or comments \b Made \R{viaddversionkey}{VIAddVersionKey} only query language tables instead of creating them and generating warnings (\W{http://sourceforge.net/support/tracker.php?aid=1626504}{bug #1626504}) \b Minor documentation updates and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1642107}{bug #1642107}, \W{http://sourceforge.net/support/tracker.php?aid=1649187}{patch #1649187}) \b Warn when continuing a comment line using backslash (\W{http://sourceforge.net/support/tracker.php?aid=1554178}{bug #1554178}) \S2{} New/Changed Commands \b \R{regdll}{RegDLL} and \R{unregdll}{UnregDLL} now use LOAD_WITH_ALTERED_SEARCH_PATH, so there's no need to use \R{setoutpath}{SetOutPath} to set the working directory (\W{http://sourceforge.net/support/tracker.php?aid=1638191}{bug #1638191}) \S2{} Utilities and Plug-ins \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.45}: Added FOCUS flag (\W{http://sourceforge.net/support/tracker.php?aid=1634704}{patch #1634704}) and fixed paste with ONLY_NUMBERS flag (\W{http://sourceforge.net/support/tracker.php?aid=1652075}{bug #1652075}) \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: settings in HKCU instead of HKLM (\W{http://sourceforge.net/support/tracker.php?aid=1411970}{bug #1411970}) and MRU menu accelerators \S2{} Translations \b Added Galician translation (\W{http://sourceforge.net/support/tracker.php?aid=1631765}{patch #1631765}) \S2{} Build System \b Added a workaround for building on x64 POSIX platforms (\W{http://sourceforge.net/support/tracker.php?aid=1646170}{bug #1646170}) \b Added a workaround for strict-aliasing compatibility (\W{http://sourceforge.net/support/tracker.php?aid=1635841}{bug #1635841}) \b Added compression tests \b Added STRIP, APPEND_CCFLAGS and APPEND_LINKFLAGS build options \b Fixed SCons 0.96.94 compatibility \H{v2.23} 2.23 Released on January 13th, 2007 \S1{v2.23-cl} Changelog \S2{} Minor Changes \b Fixed compiler crash on Mac OS X (\W{http://sourceforge.net/support/tracker.php?aid=1611866}{patch #1611866}) \b Fixed deletion of start menu icons in NSIS installer on Vista (\W{http://sourceforge.net/support/tracker.php?aid=1611251}{bug #1611251}) \S2{} Utilities and Plug-ins \b Fixed incorrect \L{../Docs/nsExec/nsExec.txt}{nsExec} message handling in silent mode (\W{http://sourceforge.net/support/tracker.php?aid=1605581}{bug #1605581}) \b Fixed \L{../Docs/System/System.html}{System} crash when System::Store is called on an empty private stack (\W{http://sourceforge.net/support/tracker.php?aid=1620178}{bug #1620178}) \b Fixed \L{../Docs/System/System.html}{System} crash with parenthesis in filename (\W{http://sourceforge.net/support/tracker.php?aid=1616267}{bug #1616267}) \b Minor VPatch documentation enhancements (\W{http://sourceforge.net/support/tracker.php?aid=1624292}{patch #1624292}) \S2{} Build System \b Fixed build failures on mingw32 (\W{http://sourceforge.net/support/tracker.php?aid=1610773}{bug #1610773}) \b Fixed build problems with MSTOOLKIT=yes \H{v2.22} 2.22 Released on November 27th, 2006 \S1{v2.22-rl} Release Notes \b Some changes have been made to the credit and license files in order to avoid copyrights and license related confusions. This does not change in any way how NSIS should or could be used. NSIS itself is still licensed with the permissive BSD-like \W{https://nsis.sourceforge.io/License}{zlib license}. \b Upgrade is recommended for early adopters of WinVer.nsh, due to a bug in Windows 98 and ME detection. \S1{v2.22-cl} Changelog \S2{} Minor Changes \b Fixed context menu not disappearing when moving from instfiles page (\W{http://sourceforge.net/support/tracker.php?aid=1115825}{bug #1115825}) \b Fixed \L{../Include/WinVer.nsh}{WinVer.nsh}'s detection of Windows 98 and ME (reported on the \W{http://forums.winamp.com/showthread.php?s=&threadid=257994&highlight=winver.nsh}{forum}) \b Fixed \R{writeuninstaller}{WriteUninstaller} failure to overwrite read-only uninstallers (\W{http://sourceforge.net/support/tracker.php?aid=1542530}{bug #1542530}) \b Licensed lzma under \R{cpl-license}{CPL} with a \R{lzma-special-exception}{special exception}, instead of LGPL \b Minor documentation updates and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1584618}{bug #1584618}, \W{http://sourceforge.net/support/tracker.php?aid=1589877}{bug #1589877}) \b Updated comments in MUI examples (\W{http://sourceforge.net/support/tracker.php?aid=1595500}{bug #1595500}) \S2{} New/Changed Commands \b Added `highest` option for \R{arequestexecutionlevel}{RequestExecutionLevel} \S2{} Translations \b Added Uzbek translation \b Fixed corruption in Lithuanian (\W{http://sourceforge.net/support/tracker.php?aid=1602673}{bug #1602673}) \b Minor Breton fixes \b Slovenian corrections (\W{http://sourceforge.net/support/tracker.php?aid=1590108}{patch #1590108}) \S2{} Build System \b Added \W{https://web.archive.org/web/20060203051838/http://msdn.microsoft.com:80/vstudio/express/visualc/}{Microsoft Visual C++ 2005 Express} support \b SCons requirement upgraded to 0.96.93 \H{v2.21} 2.21 Released on October 20th, 2006 \S1{v2.21-cl} Changelog \S2{} Major Changes \b Added \L{../Include/WinVer.nsh}{WinVer.nsh} for easy Windows version comparisons \b Upgraded to lzma sdk 4.43 for faster compression \S2{} Minor Changes \b Added Vista support to GetWindowsVersion \b Added \L{../Include/x64.nsh}{x64.nsh} including a few simple macros for handling x64 installations \b Fixed a handle leak in \R{locate}{Locate} \b Minor documentation updates and fixes \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.76}: Added MUI_ABORTWARNING_CANCEL_DEFAULT (\W{http://sourceforge.net/support/tracker.php?aid=1547844}{RFE #1547844}) \S2{} New/Changed Commands \b Added \R{arequestexecutionlevel}{RequestExecutionLevel} (\W{http://sourceforge.net/support/tracker.php?aid=1524709}{RFE #1524709}) \S2{} Translations \b Added Valencian translation (\W{http://sourceforge.net/support/tracker.php?aid=1558822}{patch #1558822}) \b Bulgarian corrections \b Slovenian corrections \S2{} Build System \b SCons requirement upgraded to 0.96.92 \H{v2.20} 2.20 Released on September 9th, 2006 \S1{v2.20-cl} Changelog \S2{} Minor Changes \b Better LogicLib errors (\W{http://sourceforge.net/support/tracker.php?aid=1537976}{bug #1537976}) \b Fixed incomplete plug-in call error messages (\W{http://sourceforge.net/support/tracker.php?aid=1535995}{bug #1535995}) \b Fixed incorrect file timestamp querying on big-endian platforms (\W{http://sourceforge.net/support/tracker.php?aid=1536377}{bug #1536377}) \b Minor documentation updates and fixes \S2{} Translations \b Danish corrections (\W{http://sourceforge.net/support/tracker.php?aid=1548190}{bug #1548190}) \b Fixed incorrectly encoded Turkish translation (\W{http://sourceforge.net/support/tracker.php?aid=1542765}{bug #1542765}) \b French corrections \b Italian corrections (\W{http://sourceforge.net/support/tracker.php?aid=1546183}{bug #1546183}) \b Spanish corrections \b Swedish corrections (\W{http://sourceforge.net/support/tracker.php?aid=1542680}{bug #1542680}) \b Ukrainian corrections \S2{} Build System \b Fixed NSIS_CONFIG_CONST_DATA_PATH being ignored on POSIX platforms (\W{http://sourceforge.net/support/tracker.php?aid=1515592}{bug #1515592}) \H{v2.19} 2.19 Released on August 6th, 2006 \S1{v2.19-cl} Changelog \S2{} Minor Changes \b Fixed \R{system}{!system} and \R{packhdr}{!packhdr} failure with quoted long file names (\W{http://sourceforge.net/support/tracker.php?aid=1509909}{bug #1509909}) \b Fixed build problems on 64bit platforms (\W{http://sourceforge.net/support/tracker.php?aid=1504772}{bug #1504772}) \b Fixed negative total size for data larger than 2GB in script compilation summary (\W{http://sourceforge.net/support/tracker.php?aid=1468852}{bug #1468852}) \b Minor documentation updates and fixes \b Replaced \R{detect.netframework}{IsDotNETInstalled} with a simpler and better version \S2{} New/Changed Commands \b Made \R{if}{!if} compare strings case insensitively, like \R{strcmp}{StrCmp} and \R{ifdef}{!ifdef} \S2{} Plug-ins \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: fixed random DNS errors (\W{http://forums.winamp.com/showthread.php?s=&threadid=247723}{reported in the forums}) \b \L{../Docs/System/System.html}{System}: fixed a bug that caused stack corruption and stopped the installer from deleting System.dll when a function with no arguments was called (\W{http://sourceforge.net/support/tracker.php?aid=1535005}{bug #1535005}) \b \L{../Docs/System/System.html}{System}: fixed wrong return values for functions that return \c{short} or \c{char} (\W{http://sourceforge.net/support/tracker.php?aid=1535007}{bug #1535007}) \S2{} Translations \b Added Norwegian Nynorsk translation (\W{http://sourceforge.net/support/tracker.php?aid=1503208}{patch #1503208}) \b Fixed typos in the French translation (\W{http://sourceforge.net/support/tracker.php?aid=1531874}{bug #1531874}) \H{v2.18} 2.18 Released on July 1st, 2006 \S1{v2.18-cl} Changelog \S2{} Minor Changes \b CRC32 implementation used potentially non-32bit types (\W{http://sourceforge.net/support/tracker.php?aid=1504758}{bug #1504758}) \b Fixed errors on multiple inclusion of \R{headers}{useful headers} \b Fixed \R{getfileattributes}{GetFileAttributes} \b Fixed incorrect text on browse dialog with \R{onverifyinstdir}{.onVerifyInstDir} (\W{http://sourceforge.net/support/tracker.php?aid=1504297}{bug #1504297}) \b Fixed \R{library}{Library}'s implementation on POSIX \b Minor documentation updates and fixes \S2{} Translations \b Added Irish translation (\W{http://sourceforge.net/support/tracker.php?aid=1503639}{patch #1503639}) \b Catalan corrections (\W{http://sourceforge.net/support/tracker.php?aid=1504104}{bug #1504104}) \b Dutch corrections \b Finnish corrections (Mozilla bug #341643) \b Fixed Serbian grammar and typos \b Italian corrections (Mozilla bug #340450) \b Polish corrections (Mozilla bug #224532) \b Portuguese (Brazil) corrections (Mozilla bug #340885) \b Romanian corrections (Mozilla bug #340645) \b Thai corrections \b Turkish corrections (Mozilla bug #340511) \H{v2.17} 2.17 Released on May 19th, 2006 \S1{v2.17-cl} Changelog \S2{} Minor Changes \b Fixed build failures and segfaults on PowerPC Mac OS X (\W{http://sourceforge.net/support/tracker.php?aid=1474597}{bug #1474597}, \W{http://sourceforge.net/support/tracker.php?aid=1481044}{bug #1481044}) \b Fixed \R{library}{Library}'s TLB version interpretation (\W{http://sourceforge.net/support/tracker.php?aid=1471341}{bug #1471341}) \b Fixed possible stack corruption when using TypeLib.dll on an invalid TLB \b Fixed \R{rmdir}{RMDir} deletion failure of read-only folders (\W{http://sourceforge.net/support/tracker.php?aid=1481664}{bug #1481664}) \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Fixed toolbar compressor selection menu, broken in the previous version (\W{http://sourceforge.net/support/tracker.php?aid=1466486}{bug #1466486}) \b Minor documentation improvements and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1469306}{bug #1469306}, \W{http://sourceforge.net/support/tracker.php?aid=1491616}{bug #1491616}) \S2{} Translations \b Added missing Basque and Welsh files (\W{http://sourceforge.net/support/tracker.php?aid=1469471}{bug #1469471}) \b Brazilian Portuguese updates \b Bulgarian fixes \b Fixed a typo in Hebrew translation (\W{http://sourceforge.net/support/tracker.php?aid=1474587 }{bug #1474587}) \b Icelandic fixes and improvements \H{v2.16} 2.16 Released on April 7th, 2006 \S1{v2.16-rn} Release Notes \b The script compiler, makensis, builds and works on big-endian platforms. This change enlarges the portability range of NSIS to theoretically every POSIX platform. Please \W{http://sourceforge.net/tracker/?group_id=22049&atid=373085}{report} any incompatibility with specific platforms or build-tools. \b The internal changes made to support big-endian platforms also pave the road to x64 installers. There is now a central function which writes data to disk. This function currently only converts the endianity of integers, but it can be changed to selectively write 64-bit integers. Hopefully, there'll soon be a simple method of compiling a script to both x86 and x64 installers. \b Changing Source/exehead/fileform.h to alter the internal structure of installers is no longer enough. The compiler has its own definitions of the structures which must also be changed in Source/fileform.cpp. In the future, fileform.cpp should be automatically generated from fileform.h, but for now, the synchronization must be done manually. \S1{v2.16-cl} Changelog \S2{} Major Changes \b Big-endian platforms are now fully supported by makensis \b \R{library}{Library} now available on non-Windows platforms as well, although it requires the installed DLL to have version information \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW 2.1}: added "Cancel compilation" menu item \S2{} New/Changed Commands \b Added /utcdate switch to \R{define}{!define} for UTC dates (\W{http://sourceforge.net/support/tracker.php?aid=1459210}{RFE #1459210}) \S2{} Minor Changes \b Added an optional timestamp in the log - NSIS_CONFIG_LOG_TIMESTAMP build setting (\W{http://sourceforge.net/support/tracker.php?aid=1460586}{RFE #1460586}) \b Added NSIS_WIN32_MAKENSIS define, defined only when compiling on Windows \b Exported validate_filename to plug-ins \b Fixed a crash in CResourceEditor when adding resources to a PE that already contains named resources \b Fixed a small resource leak in the TypeLib::GetLibVersion plug-in function \b Fixed CResourceEditor input sanity checks \b Fixed incorrect \R{FileOpen}{FileOpen} input validation (\W{http://sourceforge.net/support/tracker.php?aid=1459789}{bug #1459789}) \b Fixed \R{library}{Library} failure with DLLs marked as read-only \b Fixed lzma's POSIX implementation thread synchronization issues and resource leaks \b Fixed makensis self-path detection on non-Windows platforms (NSIS_CONFIG_CONST_DATA_PATH=no) \b Fixed replace_icon and generate_uninstall_icon_data icon validation \b Made external CHM links safer to script exceptions (\W{http://sourceforge.net/support/tracker.php?aid=1449879}{bug #1449879}) \b Minor documentation improvements and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1077439}{bug #1077439}, \W{http://sourceforge.net/support/tracker.php?aid=1448374}{bug #1448374}, \W{http://sourceforge.net/support/tracker.php?aid=1464446}{RFE #1464446}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.75}: added show function for the start menu page (\W{http://sourceforge.net/support/tracker.php?aid=1448176}{RFE #1448176}), added MUI_HEADER_TRANSPARENT_TEXT for transparent header texts (\W{http://sourceforge.net/support/tracker.php?aid=1447766}{RFE #1447766}) \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: better header detection for better compatibility with proxies like WinProxy (\W{http://sourceforge.net/support/tracker.php?aid=1445735}{bug #1445735}), fail if no headers are sent, faster downloads (\W{http://sourceforge.net/support/tracker.php?aid=1465378}{patch #1465378}) \b \L{../Docs/StartMenu/Readme.txt}{StartMenu}: validate user input (\W{http://sourceforge.net/support/tracker.php?aid=1440636}{bug #1440636}) \S2{} Translations \b Added Basque translation \b Minor Slovenian fixes \S2{} Build System \b Added code tests for CResourceEditor and CDialogTemplate \b Automatically pass build settings to script, eliminating the need to edit build.cpp for new settings \b Fixed $PREFIX expansion during installation on POSIX platforms (\W{http://sourceforge.net/support/tracker.php?aid=1456943}{bug #1456943}) \b Fixed CHM dependencies \b Fixed compatibility issue with EclipseNSIS (version wasn't prefixed with 'v') \b Fixed GCC 4.1 compatibility (\W{http://sourceforge.net/support/tracker.php?aid=1456861}{patch #1456861}) \b Test for -Wl,-Map availability \H{v2.15} 2.15 Released on March 4th, 2006 \S1{v2.15-cl} Changelog \S2{} New/Changed Commands \b Added \R{if}{!if} for more complex compile-time flow control (\W{http://sourceforge.net/support/tracker.php?aid=1412982}{patch #1412982}) \b Added /math switch to \R{define}{!define} for simple compile-time mathematical operations (\W{http://sourceforge.net/support/tracker.php?aid=1372561}{patch #1372561}) \S2{} Minor Changes \b Added more replacement options to \R{wordreplace}{WordReplace} \b Added NSIS_CONFIG_LOG_STDOUT configuration option for logging to stdout \b Added path translation for \R{addincludedir}{!addincludedir} (\W{http://sourceforge.net/support/tracker.php?aid=1431958}{bug #1431958}) \b \R{configread}{ConfigRead} now sets the error flag, if the entry wasn't found \b Documented \R{nop}{Nop} \b Edit box in the installation directory selection page is now always LTR, even for RTL languages \b Fixed improper iterator usage in dir_reader (\W{http://sourceforge.net/support/tracker.php?aid=1431593}{bug #1431593}) \b Fixed \c{\R{messagebox}{MessageBox} MB_TOPMOST} not showing up, if used as the first sections' instruction (\W{http://sourceforge.net/support/tracker.php?aid=1400995}{bug #1400995}) \b Fixed \R{rmdir}{RMDir} skipping files with names starting with two dots (\W{http://sourceforge.net/support/tracker.php?aid=1420657}{bug #1420657}) \b \R{getoptions}{GetOptions} now sets the error flag, if the option wasn't found \b Made \R{include}{!include} stop searching the include directories after a match is found (\W{http://sourceforge.net/support/tracker.php?aid=1441877}{bug #1441877}) \b Made \R{headers}{header functions} use /NOUNLOAD for faster plug-in calls \b Minor documentation improvements and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1420352}{bug #1420352}, \W{http://sourceforge.net/support/tracker.php?aid=1432423}{bug #1432423}) \b More informative \R{aicon}{Icon} error messages (\W{http://sourceforge.net/support/tracker.php?aid=1174742}{bug #1174742}) \b New case-sensitive functions in headers: \R{wordfinds}{WordFindS}, \R{wordfind2xs}{WordFind2XS}, \R{wordfind3xs}{WordFind3XS}, \R{wordreplaces}{WordReplaceS}, \R{wordadds}{WordAddS}, \R{wordinserts}{WordInsertS}, \R{strfilters}{StrFilterS}, \R{textcompares}{TextCompareS}, \R{configreads}{ConfigReadS}, \R{configwrites}{ConfigWriteS}, \R{getoptionss}{GetOptionsS} \S2{} Translations \b Added proper language identifier for Breton \b Breton translation improvements \b Bulgarian translation improvements \b Fixed Czech grammar mistakes (\W{http://sourceforge.net/support/tracker.php?aid=1427189}{patch #1427189}) \b Fixed Italian typo (\W{http://sourceforge.net/support/tracker.php?aid=1416988}{patch #1416988}) \b Updated Mongolian \S2{} Build System \b Fixed __BIG_ENDIAN__ definition \b Fixed improper handling of paths passed to the compiler (\W{http://sourceforge.net/support/tracker.php?aid=1434215}{bug #1434215}) \b Improved GCC 4.2 compatibility (\W{http://sourceforge.net/support/tracker.php?aid=1434174}{patch #1434174}) \b Moved NSIS_VARS_SECTION from config.h to scons \b Write all configuration to sconf.h instead of passing it on the command line \H{v2.14} 2.14 Released on January 24th, 2006 \S1{v2.14-rn} Release Notes \b This release fixes a critical bug that caused installers using plug-ins to fail loading on Windows 9x and NT. Upgrading from 2.13 is highly recommended. \S1{v2.14-cl} Changelog \S2{} Major Changes \b Fixed a bug that corrupted $TEMP under Windows 9x and NT and caused \R{initpluginsdir}{InitPluginsDir} to fail (\W{http://sourceforge.net/support/tracker.php?aid=1412159}{bug #1412159}) \S2{} Minor Changes \b Fixed a possible buffer overflow caused by long values of $0, when using large NSIS_MAX_STRLEN builds (above 4096) \H{v2.13} 2.13 Released on January 21st, 2006 \S1{v2.13-rn} Release Notes \b Language detection has changed. The default language is now set to the user's user-interface language instead of the locale language, as suggested by \W{http://web.archive.org/web/20050913082611/http://msdn.microsoft.com/library/en-us/intl/nls_0xrn.asp}{MSDN}. To restore the old behavior, use \c{System::Call "kernel32::GetUserDefaultLangID()i.a"} in \R{oninit}{.onInit}. \S1{v2.13-cl} Changelog \S2{} Major Changes \b Default $LANGUAGE value is now based on user's UI language instead of locale (\W{http://sourceforge.net/support/tracker.php?aid=1324734}{bug #1324734}) \S2{} New/Changed Commands \b Added \R{strcmps}{StrCmpS} for case sensitive string comparison (\W{http://sourceforge.net/support/tracker.php?aid=1381929}{patch #1381929}) \S2{} Minor Changes \b Added system time support to \R{filefunc}{GetTime} \b Fixed components page checkbox redraw problem under Windows 95 (\W{http://sourceforge.net/support/tracker.php?aid=1397031}{bug #1397031}) \b Fixed constant maximum string length in \R{FileRead}{FileRead} (changed from 1024 to NSIS_MAX_STRLEN) \b Fixed empty $INSTDIR value in directory page show callback function (\W{http://sourceforge.net/support/tracker.php?aid=1209843}{bug #1209843}) \b Fixed relative jumps ignoring \c{\R{file}{File} /nonfatal} (\W{http://sourceforge.net/support/tracker.php?aid=1299100}{bug #1299100}) \b Fixed typo in NSIS Menu (\W{http://sourceforge.net/support/tracker.php?aid=1387748}{bug #1387748}) \b Issue a warning when \c{\R{abrandingtext}{BrandingText} /TRIM*} actually expands the label (\W{http://sourceforge.net/support/tracker.php?aid=1362443}{bug #1362443}) \b Made \c{\R{rmdir}{RMDir} /r} remove Unicode paths as well using short names (\W{http://sourceforge.net/support/tracker.php?aid=1378785}{bug #1378785}) \b Minor documentation improvements and fixes \S2{} Utilities and Plug-ins \b Fixed System plug-in \L{../Docs/System/System.html}{documentation} of callback functions (\W{http://sourceforge.net/support/tracker.php?aid=1403608}{bug #1403608}) \b Fixed System plug-in heap corruption (\W{http://sourceforge.net/support/tracker.php?aid=1403601}{bug #1403601}) \S2{} Translations \b Mongolian translation improvements \S2{} Build System \b Better installation under POSIX with proper $\{NSISDIR\} detection and appropriate directory paths (/usr/bin, /usr/share/doc, etc.) \H{v2.12} 2.12 Released on December 17th, 2005 \S1{v2.12-cl} Changelog \S2{} Major Changes \b Fixed compile-time assertion failure for big uninstallers (\W{http://sourceforge.net/support/tracker.php?aid=1380447}{bug #1380447}) \b \R{tutorial}{Tutorial} enhancements (including \W{http://sourceforge.net/support/tracker.php?aid=1366431}{bug #1366431}) \S2{} New/Changed Commands \b Added /NONFATAL switch to \R{include}{!include} (\W{http://sourceforge.net/support/tracker.php?aid=1372048}{patch #1372048}) \S2{} Minor Changes \b Clearer error message for double label definition (\W{http://sourceforge.net/support/tracker.php?aid=1374675}{patch #1374675}) \b Fixed browsed network root directory not being accepted (\W{http://sourceforge.net/support/tracker.php?aid=1331292}{bug #1331292}) \b Fixed incorrect \R{acompletedtext}{CompletedText} parsing (\W{http://sourceforge.net/support/tracker.php?aid=1349810}{bug #1349810}) \b Fixed sdbarker_tiny.exe's compatibility with NSIS_CONFIG_LOG (\W{http://sourceforge.net/support/tracker.php?aid=1365869}{bug #1365869}) \b Implemented nicer registry commands log (\W{http://sourceforge.net/support/tracker.php?aid=1340255}{patch #1340255}) \b Minor documentation improvements and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1355653}{patch #1355653}, \W{http://sourceforge.net/support/tracker.php?aid=1349810}{bug #1349810}) \b Multi-line comments are no longer ignored inside !ifdef'd block \S2{} Utilities and Plug-ins \b Added drag & drop support for zip2exe \b Better drag & drop error handling in \L{../Docs/makensisw/Readme.txt}{MakeNSISW} \b Fixed Math plug-in array issues (\W{http://sourceforge.net/support/tracker.php?aid=1235875}{bug #1235875}) \S2{} Translations \b Added browse button Danish translation \b Breton translation fixes and improvements \b Fixed finish button Swedish translation \S2{} Build System \b Fixed endianness detection problem on POSIX platforms (\W{http://sourceforge.net/support/tracker.php?aid=1370179}{bug #1370179}) \b Generated installers use nsis-VERSION-setup.exe template \H{v2.11} 2.11 Released on November 12th, 2005 \S1{v2.11-rl} Release Notes \b Rebuilding existing installers that use \c{\R{asetoverwrite}{SetOverwrite} ifdiff}, might falsely overwrite files once \S1{v2.11-cl} Changelog \S2{} Major Changes \b Added a workaround for a bug that prevented detection of some special folders (e.g. \R{varother}{$DESKTOP} for all users) on Windows 9x (\W{http://sourceforge.net/support/tracker.php?aid=1008632}{bug #1008632}) \b Fixed a crash caused by copying very long details to clipboard in the installation log page (\W{http://sourceforge.net/support/tracker.php?aid=1314004}{bug #1314004}) \S2{} New/Changed Commands \b Added \R{tempfile}{!tempfile}, \R{delfile}{!delfile} and \R{appendfile}{!appendfile} for cross-platform handling of text files during compilation \b Fixed \R{achangeui}{ChangeUI} input handling (\W{http://sourceforge.net/support/tracker.php?aid=1348473}{patch #1348473}) \b \R{ssectionin}{SectionIn} RO is no longer case sensitive \S2{} Minor Changes \b Added support URL to the NSIS package entry in the Add/Remove control panel (\W{http://sourceforge.net/support/tracker.php?aid=1349867}{RFE #1349867}) \b Fixed comment handling (\W{http://sourceforge.net/support/tracker.php?aid=1324898}{patch #1324898}) \b Fixed duplicate RegTool test in \R{library}{Library} \b Fixed invalid language selection according to \R{varother}{$LANGUAGE} in \R{oninit}{.onInit} when only primary language match is found (\W{http://sourceforge.net/support/tracker.php?aid=1328629}{bug #1328629}) \b Fixed missing RegTool error after install-reboot-install-reboot sequence with \R{library}{Library} \b Fixed portability issues with \L{../Examples/LogicLib.nsi}{LogicLib} (\W{http://sourceforge.net/support/tracker.php?aid=1320297}{bug #1320297}, \W{http://sourceforge.net/support/tracker.php?aid=1248336}{patch #1248336}) \b Fixed \c{\R{asetoverwrite}{SetOverwrite} ifdiff} always overwriting on FAT file system (\W{http://sourceforge.net/support/tracker.php?aid=1338423}{bug #1338423}) \b Fixed wrong size of red.bmp check box image \b Larger browse button for localized texts (\W{http://sourceforge.net/support/tracker.php?aid=1314682}{bug #1314682}) \b Minor documentation improvements and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1349810}{bug #1349810}) \b Sort language names in language selection dialog \b Use the temporary directory for \R{library}{Library} temporary files, instead of the possibly write-protected installation directory \S2{} Utilities and Plug-ins \b Added /OEM switch for OEM to ANSI conversion in \L{../Docs/nsExec/nsExec.txt}{nsExec} (\W{http://sourceforge.net/support/tracker.php?aid=1346737}{patch #1346737}) \b Added /PROXY switch for manual proxy configuration in \L{../Docs/NSISdl/ReadMe.txt}{NSISdl} (\W{http://sourceforge.net/support/tracker.php?aid=1334166}{patch #1334166}) \b Added solid compression check box to zip2exe (\W{http://sourceforge.net/support/tracker.php?aid=1334155}{patch #1334155}) \b Added stdin in MakeNSISw to allow xcopy to run \b Added timestamp handling to zip2exe (\W{http://sourceforge.net/support/tracker.php?aid=1349853}{bug #1349853}) \b Fixed input validation of \L{../Docs/nsExec/nsExec.txt}{nsExec} \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.44}: Added HWND and HWND2 entries to the INI file to avoid messy calculations of the correct control id \S2{} Translations \b Slovenian translation fixes and improvements \S2{} Build System \b Added a workaround for linking errors caused by a bad library included in recent Platform SDK versions \b Check for and use -pthread linker flag \b Improved FreeBSD portability \b Nicer error message for SCons version older than 0.96.90 \H{v2.10} 2.10 Released on October 4th, 2005 \S1{v2.10-cl} Changelog \S2{} Major Changes \b Added auto completion to the directory page \b Fixed a bug, introduced in 2.09, that caused \R{aallowrootdirinstall}{AllowRootDirInstall} to fail \b Fixed a thread leak in the POSIX implementation of LZMA \b \L{../Docs/VPatch/Readme.html}{VPatch 3.1}: MD5 checksums, better performance, and some bug fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1219806}{bug #1219806}) \S2{} Minor Changes \b Added rounding of required and available size on the directory page (1.59 => 1.6 instead of 1.5) \b Added WS_EX_LEFTSCROLLBAR style in RTL mode (\W{http://sourceforge.net/support/tracker.php?aid=1283528}{bug #1283528}) \b Fixed alteration of the working directory by FileRequest in InstallOptions (\W{http://sourceforge.net/support/tracker.php?aid=1287731}{bug #1287731}) \b Fixed bad mnemonic key in MakeNSISw menu (\W{http://sourceforge.net/support/tracker.php?aid=1288159}{bug #1288159}) \b Fixed negative size values showing up after the decimal point in the directory page for very big sizes \b Minor documentation improvements and fixes \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.74}: Fixed compile error when checkboxes are used on multiple finish pages \S2{} Translations \b Fixed a bug in Slovenian translation that caused lots of missing language string warnings \b Fixed typos in Serbian translation \b Fixed typos in Thai translation \b Updated Simplified Chinese translation \S2{} Build System \b Automatic fix for \W{http://forums.winamp.com/showthread.php?s=&threadid=179848}{VC6 SP6 compile error} \b Moved most of the configuration from config.h to the build system \b Removed all optimizations and symbol stripping in debug mode \b SCons requirement updated to 0.96.91 \b VPatch can be built on POSIX as well \H{v2.09} 2.09 Released on August 26th, 2005 \S1{v2.09-cl} Changelog \S2{} Major Changes \b Fixed a bug introduced in 2.08, that prevented uninstallers from deleting $INSTDIR \b Fixed a bug that caused "C:\\ " to be considered a valid installation directory, even without \R{aallowrootdirinstall}{AllowRootDirInstall} \S2{} New/Changed Commands \b \R{var}{Var} can now be used in sections and functions, but only with the /GLOBAL flag \S2{} Minor Changes \b Applied \W{http://sourceforge.net/support/tracker.php?aid=1248335}{patch #1248335} for greater portability of examples \b \R{filefunc}{FileFunc}: workaround for GetLongPathName which is not available on Windows 95 (Instructor) \b Fixed an unused label warning in \R{library}{Library} \b Fixed duplicate label errors in \L{../Examples/LogicLib.nsi}{LogicLib} and \R{library}{Library} when used in different files (\W{http://sourceforge.net/support/tracker.php?aid=1243865}{bug #1243865}) \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.73}: fixed checkboxes on uninstaller finish page or multiple finish pages \b \R{wordfunc}{WordFunc}: fixed incorrect replacement of first word in WordReplace, under some conditions (Instructor) \S2{} Translations \b Renamed Malaysian to Malay \b Update Thai translation to the latest version \b Updated Kurdish MUI translation to the latest version \S2{} Build System \b Fixed a number of build problems on POSIX platforms which caused plug-ins to malfunction and installers to crash \H{v2.08} 2.08 Released on July 23rd, 2005 \S1{v2.08-rn} Release Notes \b The Archive has been replaced with a \W{https://nsis.sourceforge.io/wiki/}{Wiki}. The new Wiki allows everyone to edit all pages so there's no longer need to hunt for the original author. It also allows everyone to upload plug-ins and not just administrators. And as if that's not enough, it looks better and provides easier and more feature-rich syntax. \S1{v2.08-cl} Changelog \S2{} Major Changes \b Added Instructor's \R{headers}{header files of useful functions} \b \R{library}{Library} improvements: ordered registration after reboot, smaller RegTool and separate process for each registration to avoid conflicts (thanks stb) \S2{} Minor Changes \b Added Bosnian and Kurdish translations \b Added per-user nsisconf.nsh file in %APPDATA% or $HOME, depending on the platform (\W{http://sourceforge.net/support/tracker.php?aid=1223041}{patch #1223041}) \b Documentation improvements and fixes (including \W{http://sourceforge.net/support/tracker.php?aid=1202495}{bug #1202495}, \W{http://sourceforge.net/support/tracker.php?aid=1227610}{bug #1227610}, \W{http://sourceforge.net/support/tracker.php?aid=1238686}{bug #1238686}, \W{http://sourceforge.net/support/tracker.php?aid=1225167}{patch #1225167}, \W{http://sourceforge.net/support/tracker.php?aid=1240601}{RFE #1240601}) \b Fixed _?= being ignored, if the uninstaller path is not quoted and is separated with only space from _?= \b Fixed \R{library}{Library} failing on paths with spaces (\W{http://sourceforge.net/support/tracker.php?aid=1234283}{bug #1234283}) \b Fixed UpgradeDLL compilation error (\W{http://sourceforge.net/support/tracker.php?aid=1230336}{bug #1230336}) \b Improved French, Ukrainian and Luxembourgish translation \b Made \R{rmdir}{RMDir} set the error flag, if passed an invalid directory path (\W{http://sourceforge.net/support/tracker.php?aid=1227553}{bug #1227553}) \b Made uninstallers copy themselves into a subdirectory of the temporary directory to avoid DLLs left in the temporary directory from being loaded by the uninstaller (\W{http://sourceforge.net/support/tracker.php?aid=1214319}{patch #1214319}) \b Missing \R{langstring}{LangString} warning now uses the language name, if possible \b zip2exe: fixed restriction of extraction path length and updated to \W{http://www.zlib.net/}{zlib} 1.2.3 (\W{http://sourceforge.net/support/tracker.php?aid=1226381}{bug #1226381}) \S2{} Build System \b Added linker script to assure correct order of sections when building using GNU tools \b Added \c{test} target \b UIs are now built from source \H{v2.07} 2.07 Released on June 20th, 2005 \S1{v2.07-rn} Release Notes \b NSIS Update was removed and the update check was moved back to MakeNSISw (Help -> NSIS Update). Use the \R{build_nightly}{nightly builds} to get the latest compiled binaries from CVS. \b Solid compression is no longer the default for bzip2 and lzma, use \c{SetCompressor /SOLID bzip2} or \c{SetCompressor /SOLID lzma} for solid compression. \b Source code is no longer supplied with the installer package. Source code can be downloaded from CVS or from the \W{https://nsis.sourceforge.io/download/}{download page}. \b The directory structure of the installation has been changed. All documentation is now in the Docs folder and all examples are in the Examples folder. \S1{v2.07-cl} Changelog \S2{} Major Changes \b Added /SOLID switch for \R{asetcompressor}{SetCompressor} \b New build system (see \k{build}) \b Stubs (exeheads) are no longer compiled into makensis.exe, but kept in the Stubs folder \S2{} New/Changed Commands \b \R{enumregvalue}{EnumRegValue} sets the error flag, if the enumeration index is out of range (\W{http://sourceforge.net/support/tracker.php?aid=1178756}{bug #1178756}) \b \R{expandenvstrings}{ExpandEnvStrings} now sets the error flag as the documentation states \b Made \R{file}{File} /oname throw an error if the first character is a quote \S2{} Minor Changes \b Added \R{varconstant}{$LOCALAPPDATA} (\W{http://sourceforge.net/support/tracker.php?aid=1172123}{RFE #1172123}) \b Changed MUI dialogs charset from ANSI_CHARSET to DEFAULT_CHARSET (\W{http://sourceforge.net/support/tracker.php?aid=1193736}{bug #1193736}, \W{http://sourceforge.net/support/tracker.php?aid=1201712}{bug #1201712}) \b Fixed \R{varother}{$INSTDIR} changing, even if user clicked Cancel in browse dialog \b Fixed a crash in makensis when using \R{awindowicon}{WindowIcon} off (\W{http://sourceforge.net/support/tracker.php?aid=1123353}{bug #1123353}) \b Fixed \R{call}{Call} :label in uninstall code \b Fixed compilation error without NSIS_CONFIG_COMPONENTPAGE \b Fixed compilation errors on various platforms (including \W{http://sourceforge.net/support/tracker.php?aid=1179116}{patch #1179116}, \W{http://sourceforge.net/support/tracker.php?aid=1193692}{patch #1193692}) \b Fixed \R{createdirectory}{CreateDirectory} setting the error flag for directories with two consecutive backslashes (\W{http://sourceforge.net/support/tracker.php?aid=1119442}{bug #1119442}) \b Fixed \R{library}{InstallLib} setting the error flag for new shared libraries (\W{http://sourceforge.net/support/tracker.php?aid=1181951}{bug #1181951}) \b Fixed letters case in examples (\W{http://sourceforge.net/support/tracker.php?aid=1184571}{patch #1184571}) \b Fixed logging state being reset after the directory page (\W{http://sourceforge.net/support/tracker.php?aid=1168711}{bug #1168711}) \b Fixed overlapping icon in welcome page (\W{http://sourceforge.net/support/tracker.php?aid=1221772}{bug #1221772}) \b Fixed \R{rmdir}{RMDir} /REBOOTOK setting the reboot flag when trying to delete non-existent directory (\W{http://sourceforge.net/support/tracker.php?aid=1073792}{bug #1073792}) \b Minor documentation fixes and improvements (including \W{http://sourceforge.net/support/tracker.php?aid=1220940}{bug #1220940}) \b Removed NSIS Update, MakeNSISw checks for new versions again \S2{} Include Files \b More messages in \L{../Include/WinMessages.nsh}{WinMessages.nsh} (Shengalts Aleksander) \b Some more useful macros in \L{../Include/Colors.nsh}{Colors.nsh} (Joel) \S2{} Utilities and Plug-ins \b Fixed halibut segfaults on PowerPC (\W{http://sourceforge.net/support/tracker.php?aid=1180886}{patch #1180886}) \b \L{../Docs/Math/Math.txt}{Math}: Fixed memory leak (brainsucker) \b zip2exe: upgraded to zlib 1.2.2 \S2{} Translations \b Added Malaysian translation (Azwa) \b Added Welsh translation (Rhoslyn Prys) \b Fixed Breton NLF file (credits weren't commented) \b Fixed duplicate accelerator in French translation (\W{http://sourceforge.net/support/tracker.php?aid=1168652}{bug #1168652}) \b Improved French translation (\W{http://sourceforge.net/support/tracker.php?aid=1220277}{bug #1220277}) \b Updated Russian translation (Dmitry) \b Updated translation credits (\W{http://sourceforge.net/support/tracker.php?aid=1223362}{patch #1223362}) \H{v2.06} 2.06 Released on March 19th, 2005 \S1{v2.06-cl} Changelog \S2{} Major Changes \b Fixed a bug, introduced in 2.05, that made components selection not function properly if the first section in the script was a section group \b Fixed a bug, introduced in 2.05, that corrupted the state of section groups inside section groups (\W{http://sourceforge.net/support/tracker.php?aid=1155836}{bug #1155836}) \S2{} New/Changed Commands \b Added MB_RTLREADING style to \R{messagebox}{MessageBox} (\W{http://sourceforge.net/support/tracker.php?aid=1159701}{RFE #1159701}) \b All registry instructions now accept SHCTX which is replaced with HKLM or HKCU at runtime according to \R{setshellvarcontext}{SetShellVarContext} (\W{http://sourceforge.net/support/tracker.php?aid=1124901}{RFE #1124901}) \S2{} Minor Changes \b Added Belarusian and Icelandic language files \b Added components.c to the Makefile (\W{http://sourceforge.net/support/tracker.php?aid=1123154}{patch #1123154}) \b Added missing \R{clearerrors}{ClearErrors} in GetWindowsVersion (\W{http://sourceforge.net/support/tracker.php?aid=1155588}{bug #1155588}) \b Fixed a bug in install.sh that made it try to install a non existing directory \b Fixed a bug in the Russian language file distributed with 2.05 \b Fixed a bug that caused \R{asetfont}{SetFont} to not function properly with RTL languages on Windows 9x (\W{http://sourceforge.net/support/tracker.php?aid=1159700}{bug #1159700}) \b Fixed a bug, introduced in 2.05, that caused problems with \R{ainsttype}{InstType} /COMPONENTSONLYONCUSTOM (\W{http://sourceforge.net/support/tracker.php?aid=1155060}{bug #1155060}) \b Fixed a crash caused by compiling large uninstallers (\W{http://sourceforge.net/support/tracker.php?aid=1144763}{bug #1144763}) \b Fixed compile error without NSIS_CONFIG_CRC_SUPPORT \b Fixed compile errors of MinGW on POSIX for source code under Contrib (\W{http://sourceforge.net/support/tracker.php?aid=1164307}{patch #1164307}) \b Fixed plug-ins directory initialization for extremely restricted guest users with no directory listing access to the temporary directory \b Made install.sh not use $(tempfile) and install files under /usr/share instead of /lib (\W{http://sourceforge.net/support/tracker.php?aid=1120399}{patch #1120399}) \b Minor documentation updates and fixes \b Updated Slovenian, Serbian and Serbian Latin language files \S2{} Utilities and Plug-ins \b \L{../Docs/AdvSplash/advsplash.txt}{AdvSplash}: Fixed a small memory leak (Thanks Takhir) \b \L{../Docs/StartMenu/Readme.txt}{StartMenu}: Added support for \R{setctlcolors}{SetCtlColors} (\W{http://sourceforge.net/support/tracker.php?aid=711900}{RFE #711900}) \H{v2.05} 2.05 Released on February 4th, 2005 \S1{v2.05-rn} Release Notes \b A lot of changes were made to the behavior of sections/components and related instructions. The changes were thoroughly tested, but may still cause minor incompatibilities with old scripts. Please let us know if your script no longer functions as expected with these changes. \S1{v2.05-cl} Changelog \S2{} New/Changed Commands \b Renamed SubSection and SubSectionEnd to \R{ssectiongroup}{SectionGroup} and \R{ssectiongroupend}{SectionGroupEnd} \b \R{sectionsetflags}{SectionSetFlags}, when used on a section group, toggles its children too \b \R{sectionsettext}{SectionSetText} works better with variables (parses immediately and treats an empty variable as an empty string) \b \R{ssetcurinsttype}{SetCurInstType} works without the components page \S2{} Minor Changes \b Added Breton translation \b \L{../Docs/AdvSplash/advsplash.txt}{AdvSplash}: Fixed double delay time in some cases \b Documentation fixes and enhancements (including \W{http://sourceforge.net/support/tracker.php?aid=1098454}{patch #1098454}) \b Fixed case sensitive name comparison with \R{file}{File} /x, when not using wildcards \b Fixed extraction status ending prior to 100% \b Fixed negative values of available space in the directory page (\W{http://sourceforge.net/support/tracker.php?aid=1114876}{bug #1114876}) \b Fixed system.nsi example crash (\W{http://sourceforge.net/support/tracker.php?aid=1102255}{bug #1102255}) \b Fixed unused label warnings with \R{library}{Library macros} \b Improved some error messages \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.42}: Added an image displaying example, added TRANSPARENT flag for BITMAP fields (\W{http://sourceforge.net/support/tracker.php?aid=1079715}{RFE #1079715} - funded by Chris Morgan) \b Invisible sections weren't always affected by a change of the installation type (\W{http://sourceforge.net/support/tracker.php?aid=1045722}{bug #1045722}) \b Language file fixes \b Made pages refresh after an aborted leave function \b Partially selected section groups can now be toggled \H{v2.04} 2.04 Released on January 7th, 2005 \S1{v2.04-cl} Changelog \S2{} Major Changes \b Fixed $0 changed by \R{file}{File} /r \b Fixed empty directory not included by \R{file}{File} /r \b Fixed invalid directory creation by \R{file}{File} /r on POSIX \b Fixed Unicode conversion problems on POSIX \S2{} Minor Changes \b Added new test for dir_reader::matches \b Fixed LibraryLocal failure with UNC paths \b Fixed VC 7.1 and GCC 3.4 compile errors \b Language file fixes \H{v2.03} 2.03 Released on December 3rd, 2004 \S1{v2.03-rn} Release Notes \b If you're using \c{File /r folder} in your script, it's recommended you replace it with \c{File /r folder\\*} for faster compilation and so no other folders named \e{folder} will be included \b Command line switches prefix on POSIX has changed to a dash \b The plug-in API change is backward compatible \S1{v2.03-cl} Changelog \S2{} Major Changes \b Added another parameter to plug-in functions with a pointer to exec_flags and ExecuteCodeSegment \b Fixed handling of absolute paths on POSIX \b Made \R{regdll}{RegDLL} load and unload a DLL exactly once to fix crashes with COM DLLs registration \S2{} New/Changed Commands \b Added /date switch to !define for definition of date and time constants \b Added /x switch for \R{file}{File} and \R{reservefile}{ReserveFile} to exclude files and directories \b Made \R{file}{File}'s /r switch always search in subdirectories, even if the given path points to an existing directory \S2{} Minor Changes \b Added LIBRARY_SHELL_EXTENSION and LIBRARY_COM to \R{library}{Library} \b Added missing #include \b Added NSIS_LZMA_COMPRESS_WHOLE to the script define list \b Documentation fixes and improvements \b Fixed an access violation in case of a script jump beyond the last entry \b Fixed keyboard navigation in the instfiles page while installing \b Fixed unpacking window not showing when \R{abggradient}{BGGradient} is used \b Fixed unused label warning in \R{library}{Library.nsh} \b Language file fixes \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.72}: Fixed state of Cancel button on Finish page when used in installer and uninstaller, added a string for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE \b nsisconf.nsh was not always parsed when compiling using MakeNSISw \H{v2.02} 2.02 Released on October 23rd, 2004 \S1{v2.02-cl} Changelog \S2{} Major Changes \b Added lots of small usage examples to the documentation \b Made \R{jumps}{relative jumps} work with instructions that add multiple entries \b Made the datablock optimizer much faster \b Made the installer deny reboots while running (\W{http://msdn.microsoft.com/en-us/library/aa376890}{WM_QUERYENDSESSION}) \b Made the \R{reboot}{Reboot} command first quit and then reboot so everything is always cleaned-up \S2{} New/Changed Commands \b Added << and >> to \R{intop}{IntOp} \b Added \R{geterrorlevel}{GetErrorLevel} and \R{seterrorlevel}{SetErrorLevel} \b Fixed \R{copyfiles}{CopyFiles} usage checking problem \b Made \R{reboot}{Reboot} call \R{onrebootfailed}{.onRebootFailed} and quit on failure instead of setting the error flag \S2{} Minor Changes \b Added Albanian language files \b Added NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE configuration option which makes components only be toggled when the user clicks on the checkbox and makes \R{onmouseoversection}{.onMouseOverSection} only be called when the user selects a component \b Added some CppUnit tests \b Both _?= and /D= now require a space before them so they can safely remove the space from $CMDLINE \b Fixed a bug that caused the uninstaller CRC-check to fail if \R{packhdr}{!packhdr} created a non-512-bytes-aligned exehead \b Fixed a compiler crash caused by using \R{getcurrentaddress}{GetCurrentAddress} \b Fixed errors when using '\R{file}{File} /r .' on Windows \b Fixed gcc 3.4 compile errors \b Fixed inconsistencies between error levels and the \R{errorlevels}{documentation} \b Fixed some minor memory leaks \b Language file fixes \b Makefile improvements \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.71}: Made the selected language only be saved if the installation was successful \b Some code refactoring \b \L{../Docs/StrFunc/StrFunc.txt}{StrFunc}: Rewrote StrSort and fixed StrStrAdv. See the \L{../Docs/StrFunc/StrFunc.txt}{readme} for a complete changelog \S2{} Utilities and Plug-ins \b \L{../Docs/Banner/Readme.txt}{Banner}: Fixed some cases where the banner would not show on the foreground \H{v2.01} 2.01 Released on September 24th, 2004 \S1{v2.01-rn} Release Notes \b See \R{build_posix}{Compiling NSIS Sources} for information about compiling makensis on POSIX platforms \b NSIS doesn't create installers for Linux/Mac OS X etc., but you can compile Windows installers on these platforms \b UpgradeDLL is still provided in UpgradeDLL.nsh for backwards compatibility \S1{v2.01-cl} Changelog \S2{} Major Changes \b Compiler (makensis) supports POSIX platforms (Linux, *BSD, Mac OS X, etc.) \b \R{library}{New system} for DLL/TLB library setup \S2{} New/Changed Commands \b Added \R{abgfont}{BGFont} that allows setting the background text font \b Added SW_HIDE to \R{execshell}{ExecShell}'s accepted show modes \b \R{rmdir}{RMDir} can now be used with both /r and /REBOOTOK at the same time \b Extended maximum binary data for \R{writeregbin}{WriteRegBin} to 3 * NSIS_MAX_STRLEN \b Added \R{execute}{!execute} \S2{} Minor Changes \b LZMA exehead is now 34KB and should also decompress faster \b Windows 95 (OSR2)/98/ME no longer see drive free space capped to 2GB \b \L{../Docs/Modern UI/Readme.html}{Modern User Interface}: New orange theme by MoNKi \b Speedup background gradient painting \b \L{../Examples/LogicLib.nsi}{LogicLib} 2.5: Added AndIf, AndUnless, OrIf, OrUnless. Avoids unused variable warnings by requiring !defines before using certain features. \b \L{../Docs/StrFunc/StrFunc.txt}{StrFunc}: Added support for uninstaller, some fixes and improvements. See the \L{../Docs/StrFunc/StrFunc.txt}{readme} for a complete changelog \b The plug-ins folder is properly removed when the system is rebooted \b \R{setoutpath}{SetOutPath} "-" works again \b Fixed a bug which made plug-ins that didn't have lower case extension not be found \b Fixed a bug that caused directories with drives that had their current directory set to an invalid directory to not be accepted in the directory selection page \b Fixed a crash in makensis caused by defining a macro in a file included by another macro \b makensis shows meaningful errors for compression errors instead of just magic numbers \b Fixed a bug with \R{aallowrootdirinstall}{AllowRootDirInstall} used along with \R{ainstalldirregkey}{InstallDirRegKey} that caused the directory in the registry to be ignored \b Fixed \R{FileRead}{FileRead} setting the error flag when a null character is the first character it reads \b Fixed a bug which caused the background gradient to paint slowly \b \R{file}{File} paths relative to the root folder work again \b Added \L{../Include/Colors.nsh}{Colors.nsh} \b Made Times New Roman default font for the background text because it should always have support for the locale's language \b Fixed compilation of NSISdl under VS.NET \b \R{setctlcolors}{SetCtlColors} /BRANDING wasn't working right, if just one of the background or text color were specified \b Language file fixes and improvements \S2{} Utilities and Plug-ins \b \L{../Docs/System/System.html}{System}: New, hopefully more informative, documentation; fixed some bugs \b \L{../Docs/Banner/Readme.txt}{Banner}: Added getWindow to allow greater control over the banner window \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.41}: Bitmaps are now automatically centered, fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages, fixed a rare freeze \b Zip2Exe 0.32: Fixed codepage problems \b \L{../Docs/nsExec/nsExec.txt}{nsExec}: Always create a valid input handle, fixed a problem when called from a path with spaces \b \L{../Docs/VPatch/Readme.html}{VPatch}: Close all open file handles when one of them fail to open \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: Added /NOIEPROXY (based on memph's code) \H{v2.0} 2.0 Released on February 7th, 2004 \S1{v2.0-rn} Release Notes \b Finnish, Bulgarian and Thai language files are outdated and do not contain all needed translations \S1{v2.0-cl} Changelog \S2{} Changes from 1.98 \b \R{langs}{Multiple languages in one installer support} (with RTL support) \b \R{plugindlls}{Easier plug-in system} \b \L{../Docs/Modern UI/Readme.html}{Modern User Interface} (optional) \b \W{http://www.7-zip.org/}{LZMA} compression which provides installers 20% smaller than bzip2 \b \R{pages}{Easier paging system} (no more .onNextPage, .onPrevPage) \b Components are presented as a tree which allows sub components \b \R{varuser}{User variables} ($VARNAME) \b \R{aicon}{Icon} and \R{auninstallicon}{UninstallIcon} support any color depth and sizes, not just 32x32x16 \b \R{acheckbitmap}{CheckBitmap} supports any color depth \b Improved large files handling \b \R{alicensedata}{License data} can be RTF \b CHM documentation for easy browsing \b \R{silent}{Better silent support} \b New include files for easier scripting: \L{../Examples/LogicLib.nsi}{LogicLib}, \L{../Docs/StrFunc/StrFunc.txt}{StrFunc} and \L{../Include/Sections.nsh}{Sections} \b Improved plug-ins: \L{../Docs/InstallOptions/Readme.html}{InstallOptions}, \L{../Docs/NSISdl/ReadMe.txt}{NSISdl} and \L{../Docs/Splash/splash.txt}{Splash} \b New plug-ins: \L{../Docs/AdvSplash/advsplash.txt}{AdvSplash}, \L{../Docs/Banner/Readme.txt}{Banner}, \L{../Docs/BgImage/BgImage.txt}{BgImage}, \L{../Docs/Dialer/Dialer.txt}{Dialer}, \L{../Examples/languages.nsi}{LangDLL}, \L{../Docs/Math/Math.txt}{Math}, \L{../Docs/nsExec/nsExec.txt}{nsExec}, \L{../Docs/StartMenu/Readme.txt}{StartMenu}, \L{../Docs/System/System.html}{System}, \L{../Examples/UserInfo/UserInfo.nsi}{UserInfo} and \L{../Docs/VPatch/Readme.html}{VPatch} \b New and improved utilities: \L{../Docs/makensisw/Readme.txt}{MakeNSISw}, NSIS Menu (NSIS.exe), NSIS Update (Bin\\NSIS Update.exe) and zip2exe (Bin\\zip2exe.exe) \b New commands: \R{addplugindir}{!addplugindir}, \R{echo}{!echo}, \R{ifmacrodef}{!ifmacrodef}, \R{ifmacrondef}{!ifmacrondef}, \R{verbose}{!verbose}, \R{aaddbrandingimage}{AddBrandingImage}, \R{asetallowskipfiles}{AllowSkipFiles}, \R{achangeui}{ChangeUI}, \R{acheckbitmap}{CheckBitmap}, \R{createfont}{CreateFont}, \R{adirvar}{DirVar}, \R{adirverify}{DirVerify}, \R{enablewindow}{EnableWindow}, \R{afilebufsize}{FileBufSize}, \R{flushini}{FlushINI}, \R{sgetcurinsttype}{GetCurInstType}, \R{getdlgitem}{GetDlgItem}, \R{getinstdirerror}{GetInstDirError}, \R{ifabort}{IfAbort}, \R{ifsilent}{IfSilent}, \R{initpluginsdir}{InitPluginsDir}, \R{sinsttypegettext}{InstTypeGetText}, \R{sinsttypesettext}{InstTypeSetText}, \R{langstring}{LangString}, \R{alicensebkcolor}{LicenseBkColor}, \R{alicenseforceselection}{LicenseForceSelection}, \R{licenselangstring}{LicenseLangString}, \R{loadlanguagefile}{LoadLanguageFile}, \R{lockwindow}{LockWindow}, \R{page}{Page}, \R{pageex}{PageEx}, \R{reservefile}{ReserveFile}, \R{sectiongetinsttypes}{SectionGetInstTypes}, \R{ssectiongetsize}{SectionGetSize}, \R{sectionsetinsttypes}{SectionSetInstTypes}, \R{ssectionsetsize}{SectionSetSize}, \R{setbrandingimage}{SetBrandingImage}, SetCompressionLevel, \R{asetcompressor}{SetCompressor}, \R{asetcompressordictsize}{SetCompressorDictSize}, \R{setctlcolors}{SetCtlColors}, \R{ssetcurinsttype}{SetCurInstType}, SetPluginUnload, \R{setsilent}{SetSilent}, \R{showwindow}{ShowWindow}, SubSection (replaced by \R{ssectiongroup}{SectionGroup}), SubSectionEnd (replaced by \R{ssectiongroupend}{SectionGroupEnd}), \R{var}{Var}, \R{viaddversionkey}{VIAddVersionKey}, \R{viproductversion}{VIProductVersion} and \R{axpstyle}{XPStyle} \b Removed commands: DirShow, DisabledBitmap, EnabledBitmap and SectionDivider \b All this and a smaller overhead! =) \b A lot more... See below for more information \S2{} Changes from RC4 \b Command line parser ignored any switches after tokens that are not switches \b Last part of the path specified in \R{ainstalldir}{InstallDir} was appended even if selected folder name was the same \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.70}: Improved documentation, new Init custom function for Welcome and Finish page \b Added \L{../Docs/StrFunc/StrFunc.txt}{StrFunc} by deguix \b Updated and fixed language files \b Updated, fixed and improved documentation \H{v2.0rc4} 2.0 Release Candidate 4 Released on February 2nd, 2004 \S1{v2.0rc4-cl} Changelog \S2{} Major Changes \b Fixed MBCS mishandling in exehead, InstallOptions and nsExec \S2{} Minor Changes \b Language files updates and fixes \b Fixed logging (NSIS_CONFIG_LOG) \b Fixed compile errors caused by removing some config.h options \b NSIS compiles without PSDK again \b Documentation fixes \S2{} Utilities and Plug-ins \b \L{../Docs/NSISdl/ReadMe.txt}{NSISdl}: All potential and rare crashes should be completely fixed now \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions}: Fixed a rare crash related to ListItems and a small memory leak when using ValidateText \H{v2.0rc3} 2.0 Release Candidate 3 Released on January 26th, 2004 \S1{v2.0rc3-cl} Changelog \S2{} Minor Changes \b Fixed some bugs with LZMA/bzip2 and non-solid compression \b Fixed a bug that caused escaping not to be ignored on extended !define lines \b Language files updates and fixes \b Fixed installer crash when certain language strings were not referenced in all languages \b Some new and improved graphics \b Made CreateShortcut case insensitive when parsing hot key \b Some documentation improvements and fix-ups \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.69}: Made all uninstaller pages work without installer pages and fixed top text on uninstaller license page \S2{} Utilities and Plug-ins \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Fixed resize bug, fixed some UI issues in the settings dialog \b NSIS Update: Improved UI \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions}: Fixed minor problems with the new NOTIFY flag \H{v2.0rc2} 2.0 Release Candidate 2 Released on January 5th, 2004 \S1{v2.0rc2-cl} Changelog \S2{} Minor Changes \b Set focus to the main control in each page to ease keyboard control (plug-ins too) \b LangStrings and user variables limit is now 16383 and is enforced \b Fixed control colors set using \R{setctlcolors}{SetCtlColors} not changing when the system colors were changed \b Log window now responds to the context menu key \b Fixed a bug which caused beeping when the space key is hit on the components tree \b Added code to prevent weird usage of WM_COMMAND which can cause weird behavior \b Fixed compile errors when NSIS_CONFIG_COMPONENTPAGE, NSIS_CONFIG_PLUGIN_SUPPORT or NSIS_SUPPORT_HWNDS are not defined \b More language files updated to the latest version \b Fixed CHM's script errors \b Documentation improvements \S2{} Utilities and Plug-ins \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.4}: NOTIFY for link, drop list and list box; UI fixes and improvements. See IO's \L{../Docs/InstallOptions/Changelog.txt}{change log} for a complete list \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: Improved user interface, added support for named symbol sets and fixed best compressor selector \H{v2.0rc1} 2.0 Release Candidate 1 Released on December 27th, 2003 \S1{v2.0rc1-rn} Release Notes \b Trying the LZMA compression method for your installer is recommended. It often gives a 20% better compression ratio. \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.68}: The setting to change the title size on the Welcome page and Finish page has been changed \S1{v2.0rc1-cl} Changelog \S2{} Major Changes \b LZMA compression support. Added \R{asetcompressordictsize}{SetCompresssorDictSize}. \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.68}: New settings for extra space for title and text on Welcome page and Finish page, improved handling of verbose settings, language file string for uninstaller reboot information, more \b Shell folders are now detected using shell API functions and not the registry. This is the recommended method by Microsoft. New constants have been added in the process ($FONTS, $SENDTO and more...). See \k{varconstant} for more details. \b Added \L{../Examples/LogicLib.nsi}{LogicLib} to distribution (easier conditional execution etc.) \b Added \R{adirverify}{DirVerify} and \R{getinstdirerror}{GetInstDirError} to allow custom error checking when the installation directory is invalid or the drive does not have enough space \b Support for reading environmental variables at compile time: \R{compenvvar}{$%envVarName%} \b Added /SD parameter for \R{messagebox}{MessageBox}. Allows to set default for silent installers. \b New conditional compilation options: \R{ifmacrodef}{!ifmacrodef} and \R{ifmacrondef}{!ifmacrondef}. \b New sections macros for mutually exclusive section selection \b Improved RTL support by adding WS_EX_RTLREADING wherever possible \S2{} Utilities and Plug-ins \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.3}: Added new control type "Button", added new flag "NOTIFY", added new flag "NOWORDWRAP" for multi-line text boxes, reduced size down to 12K \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW}: More options to set the compression method \b Zip2Exe 0.31: Fixed compression setting, LZMA compression support \b \L{../Docs/VPatch/Readme.html}{VPatch 2.1}: Better error handling and exit code for GenPat \H{v2.0b4} 2.0 Beta 4 Released on November 19th, 2003 \S1{v2.0b4-rn} Release Notes \b The /LANG parameter is no longer available for any text setting instructions. You must use a \R{langstring}{LangString} if you want to make a certain text multilingual. This means you can also set one text for all languages. To make the license data multilingual you should use \R{licenselangstring}{LicenseLangString}. \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.67}: Because of the new syntax for pages, renaming of settings and variable names etc., you have to make some changes to your scripts, see the \L{../Docs/Modern UI/Readme.html}{Modern UI Readme} for details. \b \R{page}{Custom Pages} now have a leave function. As this parameter is placed before the caption you have to add another "" empty string for the title to work. \b \R{onselchange}{.onSelChange} is no longer called when the components page is created. \b The icons folder has been renamed to Graphics and was reorganized. If you were using any files from Contrib\\Icons in your script, you should update it to point to the new image or icon path. \b UpgradeDLL has been changed, it's \e{highly recommend} that you include the new version in your script using \c{!include "UpgradeDLL.nsh"} instead of the old one. \S1{v2.0b4-cl} Changelog \S2{} Major Changes \b CHM documentation - searchable and comes with an index \b User variables ($VARNAME) that can be declared with the \R{var}{Var} command \b Support for all pages in both installer and uninstaller. Components, directory and license pages can be used for the uninstaller \b Improved large files handling (way lower requirements to compile a 2GB installer now) \b Full support for RTL languages, including support for LTR and RTL languages in one installer \b \L{../Docs/Modern UI/Readme.html}{Modern UI 1.67}: New system & syntax for pages, settings (support for multiple pages of the same type, page specific settings, more customization options etc.), Welcome/Finish pages for uninstaller, \R{alicenseforceselection}{LicenseForceSelection} support, new options for Finish page / language selection dialog, fixes, more \b Extraction progress \b No more unprocessed strings, variables can be used everywhere \b Leave function for custom \R{pages}{pages}: Input on InstallOptions pages can be validated using script code \b Interface improvements: Better ClearType support, no more flickering \b \R{onmouseoversection}{OnMouseOver text} is only displayed when mouse over section \b NLF language files (v6): language specific fonts, RTL and more strings \b Inner LangStrings can be used in the script \b No more /LANG, only LangStrings - easier to set one string to all languages \b LangStrings are no longer installer/uninstaller specific (no un.) \S2{} New/Changed Commands \b Added \R{pageex}{PageEx}, \R{pagecallbacks}{PageCallbacks} and \R{adirvar}{DirVar} - it's now a lot easier to add the same page type twice \b Added \R{afilebufsize}{FileBufSize} \b Added \R{viaddversionkey}{VIAddVersionKey}: add version information resource to the installer \b Added \R{asetallowskipfiles}{AllowSkipFiles}: set whether the user should be able to skip a file when overwriting failed \b Added \R{alicenseforceselection}{LicenseForceSelection}: checkbox or radio buttons on license page to let user agree with license or not \b Added \R{ssectionsetsize}{SectionSetSize}, \R{ssectiongetsize}{SectionGetSize}, \R{ssetcurinsttype}{SetCurInstType} and \R{sgetcurinsttype}{GetCurInstType} \b Replaced SetBkColor with \R{setctlcolors}{SetCtlColors} which can set text color too \b Added \R{ifsilent}{IfSilent} and \R{setsilent}{SetSilent} to allow better /S interaction \b Added support for standard predefines: $\{__DATE__\}, $\{__TIME__\}, $\{__TIMESTAMP__\}, $\{__FILE__\}, $\{__LINE__\} \b Added ifdiff and lastusd for \R{asetoverwrite}{SetOverwrite} \b /o Switch for \R{ssection}{Section} provides ability to unselect the section by default \b New parameter for DirText to set the browse dialog text \b Added \R{rmdir}{RMDir /REBOOTOK}: remove folders on reboot \b \R{ainsttype}{InstType} /NOCUSTOM and /COMPONENTSONLYONCUSTOM work together \b Added base_dir for \R{gettempfilename}{GetTempFileName} \S2{} Minor Changes \b RO sections can now be in \R{ainsttype}{InstTypes} too (defaults to old behavior) \b Increased limit of InstTypes to 32 \b Improved macros & functions: UpgradeDLL, GetParent, GetParameters. Using the new versions is recommended. \b Fixed SetOutPath not setting current directory if the directory didn't exist before \b Components tree: fixed problems with sub-sections with RO sections as children, SF_EXPAND now refreshes the components tree and added SF_PSELECTED for partially selected sub-sections \b Improved \R{aaddbrandingimage}{AddBrandingImage}: doesn't depend on the UI, can set image on the bottom and on the right, support for custom padding value \b Better installation directory verification \b Fixed all known problems with temporary files and directories \b Documentation fixes \b Minor bug fixes \b Code clean-ups and some more comments \b More... \S2{} Utilities and Plug-ins \b \L{../Docs/makensisw/Readme.txt}{MakeNSISW 2.0}: UI to define symbols, easy access to recent scripts, toolbar and more \b Zip2Exe 0.3: based on header files, improved interface, Modern UI support, new script code, improved folder detection \b \L{../Docs/InstallOptions/Readme.html}{InstallOptions 2.2}: added LINK control, added EXTENDEDSELECT flag for list boxes which replaces MULTISELECT that now acts exactly as the real style flag ([double] click turns on or off selection), fixes \b BgImage plug-in stability fixes \b Added vPatch: patch generator and plug-in that applies the patches \b Banner plug-in improvements: responds to messages and some new /set tricks by brainsucker \b AdvSpalsh plug-in improvements: smaller, better transparency support and a possible bug fix \b System plug-in improvements: Unicode, GUID and COM support \b nsExec plug-in improvements: ability to run 16 bit code and tabs to spaces conversion \b Math plug-in \b Delphi unit for NSIS plug-ins \H{v2.0b3} 2.0 Beta 3 Released on March 16th, 2003 \b Modern UI 1.63: Header bitmap support, new defines to change the description area, single macro for language selection dialog, more! \b New tutorial in the documentation \b define_if_last in \R{page}{Page} command also works when a define has not been specified for all \R{page}{Page} commands.\\This fixes the problem with the Modern UI "Click Next" / "Click Install" texts. \b Added \R{sectionsetinsttypes}{SectionSetInstTypes} and \R{sectiongetinsttypes}{SectionGetInstTypes} \b \R{reboot}{Reboot} command does not force a reboot anymore (allows the user to save work) \b !if[n]def/!else fixes \b \R{logset}{LogSet} on now really starts logging \b Cancel button available on all pages after the instfiles page but the last page unless /ENABLECANCEL was used in its \R{page}{Page} command \b License page: No more limit on RTF size \b LangDLL: Option to auto-count number of languages, shell font support \b \R{page}{Page} and \R{uninstpage}{UninstPage} can not be used inside sections/functions \b \R{createdirectory}{CreateDirectory} now uses the error flag \b \R{enumregkey}{EnumRegKey}/Value output_var check fixed \b Updated translations \b Dreaded BSOD after plug-ins enumeration finally banished \b Minimize button and \R{abggradient}{BGGradient} and BGImage compatibility fixes \b \R{writeinistr}{WriteINIStr} with empty value works again \b Added \R{flushini}{FlushINI} \H{v2.0b2} 2.0 Beta 2 Released on February 26th, 2003 \b NSIS Menu: links to all NSIS utilities, documentation and websites \b NSIS Update: check for new releases, download latest development files \b Dialer plugin to connect to the internet \b Improved filename validation \b VC7 compiler compatibility issues fixed \b \R{createdirectory}{CreateDirectory} sets error flag \b InstallOptions: INI File State value fixed \b Updated translations \b Minor fixes \H{v2.0b1} 2.0 Beta 1 Released on February 9th, 2003 \b User interface improvements: better order/grouping of controls, button selection problems fixed, added minimize box, transparent \R{abrandingtext}{BrandingText} \b \R{langstring}{LangString} improvements: can be used before they have been defined, warning if not present in all language tables \b New version of the Modern User Interface with UI improvements, bugfixes and some small new features \b InstallOptions 2.0 with support for custom font and DPI settings, groupboxes, grouped controls, lots of bugfixes etc. \b No more random compression ratios \b \R{setoutpath}{SetOutPath} now sets the working directory \b File names are validated, directory given by the user will now always work \b $QUICKLAUNCH now works with \R{setshellvarcontext}{SetShellVarContext} all \b Automatically appended directory name in the directory selection dialog will no longer contain squares if not all characters are ASCII. \b Fixed a bug with remote drives and available space (\\\\remote\\drive) \b Plug-in function's names are now case insensitive \b Fixed a bug with specifying \R{aicon}{Icon} twice \b Include dirs (!addincludedir) \b On leave function for pages \b Installers can now really contain more than one branding image \b All !if/!else/!endif problems should be solved now \b SetFont "MS Shell Dlg" adds the DS_SHELLFONT style \b Win9x rename on reboot now also works when the destination file does not exist \b \R{deleteregkey}{DeleteRegKey} works on default value \b nsExec can be called from an installer executed by CreateProcess \b \R{writeuninstaller}{WriteUninstaller} sets error code \b Banner.dll compatible with Modern UI \b Fixed focus problems in MakeNSISw \b Updated and new translations \b Some new bitmaps for the MUI by Virtlink \b Faster and better MakeNSISw integration \b \R{detect.netframework}{New .NET Framework detection function} \b Minor bugfixes \b Code clean-ups (compiles on VC7) \H{v2.0b0} 2.0 Beta 0 Released on December 6th, 2002 \b New paging system \b Added \R{page}{Page} and \R{uninstpage}{UninstPage} \b Removed .onNextPage, .onPrevPage, .onInitDialog \b New easier version of the Modern User Interface with better multilanguage support, InstallOptions integration, welcome and finish page etc. \b Custom pages no longer flicker when created \b Added accelerator keys \b Added \R{langstring}{LangString} and LangStringUP for user defined multilingual strings \b Added support for transparent check marks \b Added InitPluginsDir \b Renamed nsisconf.nsi to nsisconf.nsh \b Added CreateShortcut comment/description parameter \b Splash.exe is now a plugin (splash.dll) \b Added new plugins: System, AdvSplash, nsExec, UserInfo, BgImage, Banner and StartMenu \b !ifdef and friends can now be used in macros \b \R{sendmessage}{SendMessage} can send strings (put \cw{STR:} before a param) and supports timeouts \b Right mouse button "Copy to clipboard" context menu for the Details window \b Plugin syntax now requires dll name, e.g. dll::func not just func \b Licence text receives initial focus (page up & down work immediately, return key still works) \b Made Win9x move/delete on reboot support proper and function like on Win2k \b Now always loads RichEdit v2 if present (links work on Win9x) \b \R{deleteregkey}{DeleteRegKey} now complains if given a third parameter (other than /ifempty) \b \R{regdll}{RegDLL} now works with DLLs dependent on DLLs from the same directory \b $\{LANG_langName\} defined as the language id when loading a NLF \b Fixed a few bugs that caused the installer to load slower than before \b Uninstall can now get command line parameters too \b Added ReserveFile \b Added ExDLL.h \b Included makensisw 1.9 (lots of changes) \b Updated InstallOptions \b Updated ZIP2EXE \b Updated HTTP download plugin, NSIS-dl (timeout added, better proxy detection) \b A lot of new language files \b A lot of new icons and check marks \b Changed section flags values \b \R{sectionsetflags}{SectionSetFlags} can now set bold too \b \R{sectionsetflags}{SectionSetFlags} now works in silent installers too \b SectionSetName for sub sections doesn't need '-' in front of the name \b Added SetPluginUnload \b Hidden section can now use \R{ssectionin}{SectionIn} too \b \R{file}{File} /nonfatal switch added \b Plugins no longer add size to their containing section \b Defines can now be used inside define names ($\{bla$\{blo\}\}) \b New docs format (WOOHA!) \b EXE header size a lot smaller, 33.5KB for bzip2 and 34KB for zlib \b Lots of other bugs fixed... \H{v2.0a7} 2.0 Alpha 7 Released on August 29th, 2002 \b Can now select the language from .onInit ($LANGUAGE is a variable) \b Added CreateFont \b Added \R{onmouseoversection}{.onMouseOverSection} \b Added .onInitDialog and un.onInitDialog \b Added SetStaticBkColor \b Disabled UseOuterUIItem \b SendMessage WM_SETTEXT treats lParam as a string and not a number \b \R{copyfiles}{CopyFiles} script message no longer always prints (silent) \b Custom install type text can now be changed \b \R{achangeui}{ChangeUI} can now change IDD_VERIFY \b Default license color now fits the user system \b Summary reports the right number of required sections \b Checkbox is only required in IDD_DIR if logging is enabled \b Not using /LANG now really causes the script compiler to use the last used language \b Fixed a bug with MBCS and the uninstaller text \b MBCS to Unicode and Unicode to MBCS conversion bugs fixed \b Fixed a bug that caused RTF not to show on Windows 9x \b Added a dialog that shows up if compress whole is used and initial decompressing lasts longer than a second \b Updated to InstallOptions 1.3 \b MakeNSISw 1.7 included \b Added modern UI by Joost Verburg (Examples\\Modern UI) \b Added new full color icons by adni18 \b Added Dutch, Korean, Russian, Swedish and Traditional Chinese language files \b Updated Spanish language file version (thanks to LsMoNKi) \b Added /TRIM(LEFT|RIGHT|CENTER) for BrandingText \b EXE header size down to 36.5KB \b Added yi-pixel.ico and yi-pixel-uninstall.ico by Jan T. Sott \b Fixed a bug with macros at the end of the file \b Sub-sections can now have defined names too \b Added LangDLL.dll plugin \b \R{callinstdll}{CallInstDLL} /NOUNLOAD added (works on plugin calls too) \H{v2.0a6} 2.0 Alpha 6 Released on August 10th, 2002 \b Fixed two bugs with the plug-in mechanism \b Fixed infinite loop bug \H{v2.0a5} 2.0 Alpha 5 Released on August 9th, 2002 \b Added UseOuterUIItem \b Enhanced \R{achangeui}{ChangeUI} \b Enhanced SetDlgItemText \b Added one-section.nsi example file \b Optimized Ximon's code for plug-in DLLs (back to 37KB) \b If default user language doesn't fit exactly, will try to find primary language match \b Fixed some strings that got replaced (space available and required etc.) \b Compiles without MS Platform SDK \b Included Spanish.nlf \b Included MagicLime.exe by snowchyld \H{v2.0a4} 2.0 Alpha 4 Released on August 5th, 2002 \b Added automatic detection, packing, unpacking and deletion of plugin dlls \b Added simplified calling syntax for plugin dlls \b Added PluginDir \H{v2.0a3} 2.0 Alpha 3 Released on August 4th, 2002 \b Added \R{loadlanguagefile}{LoadLanguageFile} \b Added $LANGUAGE \b Added /LANG option to string setters (\R{aname}{Name}, \R{acaption}{Caption}, etc.) \b 'LogSet on' now builds a log file if not already created \H{v2.0a2} 2.0 Alpha 2 Released on July 31st, 2002 \b Added $\{NSISDIR\} \b Added \R{axpstyle}{XPStyle} \b Added \R{asetfont}{SetFont} \b Added \R{achangeui}{ChangeUI} \b Added AddBrandingImage, and \R{setbrandingimage}{SetBrandingImage} \b Added \R{asetcompressor}{SetCompressor} (no more makensis-bz2.exe) \b Added \R{alicensebkcolor}{LicenseBkColor} \b 'SpaceTexts none' now causes no space texts to appear \b \R{aicon}{Icon} and \R{auninstallicon}{UninstallIcon} now support icons of any type \b \R{acheckbitmap}{CheckBitmap} now support bitmaps with any color table/depth \b Unused resources are removed before writing out the installer \b Documented \R{error}{!error} and \R{warning}{!warning} \b Added \R{echo}{!echo} and \R{verbose}{!verbose} \b Added force option for \R{acrccheck}{CRCCheck} \b Updated to Makensisw 1.6 \b Updated to InstallOptions 1.2 \b Installer can now be compressed using UPX \b A hint is shown if a line is longer than the detail window \b Modern style folder select dialog \b License data can now be RTF \b \R{awindowicon}{WindowIcon} is now handled in the compiler \b Removed debug version (it never worked anyway) \b Faster compile time (WIN32_LEAN_AND_MEAN) \H{v2.0a1} 2.0 Alpha 1 Released on July 9th, 2002 \b Added expand node option to \R{ssection}{Section} and SubSection \b Added preserve file attribute option to \R{file}{File} command \b Copy-All bug fix in Makensisw \b Added NSISDIR to the define list \b Reorganized NSIS directory structure \H{v2.0a0} 2.0 Alpha 0 Released on May 22nd, 2002 \b TreeView component list (care of Jeff Doozan) \b No more SectionDivider, but SubSection and SubSectionEnd. \b No more EnabledBitmap/DisabledBitmap, just \R{acheckbitmap}{CheckBitmap}. (with tons of button states) \b Bugfixes of brokenness. \b Added ! for \R{ssection}{Section}/SubSection to make bold. \b Made config.h have hacks for easier building for me. :) \H{cl-older} Older Versions \W{http://wayback.archive.org/web/20100820151646/http://www.nullsoft.com/free/nsis/version-history.html}{NSIS 1.x version history} nsis-3.11/Docs/src/int.but000077500000000000000000000041051477201124000154000ustar00rootroot00000000000000\S1{intinst} Integer Support \S2{intfmt} IntFmt \c user_var(output) format numberstring Formats the number in "numberstring" using the format "format", and sets the output to user variable $x. The format string supports the same syntax as \W{https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-wsprintfw}{wsprintf} except that the \cw{I[32|64]} length fields and the \cw{p} type are not supported. Example format strings include "%08X" and "%u". \c IntFmt $0 "0x%08X" 195948557 \c IntFmt $1 "%c" 0x41 \S2{int64fmt} Int64Fmt \c user_var(output) format numberstring Supports the \cw{I} and \cw{I64} length fields and the \cw{p} type in addition to the syntax supported by \cw{IntFmt}. \NsisFuncReq64 \c Int64Fmt $0 "%I64x" 244837743786702 \# InternalNote: There is no IntPtrFmt instruction because "%p" is 2000+ and "%Ix" is XP+. Consequently, all code needs to check ${NSIS_PTR_SIZE}. \S2{intop} IntOp \c user_var(output) value1 OP [value2] Combines value1 and (depending on OP) value2 into the specified user variable (\c{user_var}). OP is defined as one of the following: \b \e{+} ADDs value1 and value2 \b \e{-} SUBTRACTs value2 from value1 \b \e{*} MULTIPLIEs value1 and value2 \b \e{/} DIVIDEs value1 by value2 \b \e{%} MODULUSs value1 by value2 \b \e{|} BINARY ORs value1 and value2 \b \e{&} BINARY ANDs value1 and value2 \b \e{^} BINARY XORs value1 and value2 \b \e{<<} LEFT SHIFTs value1 by value2 \b \e{>>} ARITHMETIC RIGHT SHIFTs value1 by value2 \b \e{>>>} LOGICALLY RIGHT SHIFTs value1 by value2 \b \e{~} BITWISE NEGATEs value1 (i.e. 7 becomes 4294967288) \b \e{!} LOGICALLY NEGATEs value1 (i.e. 7 becomes 0) \b \e{||} LOGICALLY ORs value1 and value2 \b \e{&&} LOGICALLY ANDs value1 and value2 \c IntOp $0 1 + 1 \c IntOp $0 $0 + 1 \c IntOp $0 $0 << 2 \c IntOp $0 $0 ~ \c IntOp $0 $0 & 0xF \S2{intptrop} IntPtrOp \c user_var(output) value1 OP [value2] Combines value1 and (depending on OP) value2 into the specified user variable (\c{user_var}). OP is the same list of operators as supported by \c{IntOp}. \c IntPtrOp $FieldAddress $MyBuffer + $FieldOffsetnsis-3.11/Docs/src/intro.but000077500000000000000000000173051477201124000157470ustar00rootroot00000000000000\C{intro} Introduction to NSIS \H{intro-about} About NSIS The installer is your application's first impression. Slow or unsuccessful software installations is one of the most irritating computer problems. A quick and user friendly installer is therefore an essential part of your software product. NSIS (Nullsoft Scriptable Install System) is a tool that allows programmers to create such installers for Windows. It is released under an open source license and is \R{license}{completely free for any use}. NSIS creates installers that are capable of installing, uninstalling, setting system settings, extracting files, etc. Because it's based on script files you can fully control every part of your installer. The scripting language supports variables, functions and string manipulation, just like a normal programming language - but designed for the creation of installers. Even with all these features, NSIS is still the smallest installer system available. With the default options, it has an overhead of only 34 KB. \H{intro-features} Main Features \\Small overhead size\\ NSIS has been designed to be small, fast and efficient. While other installers often add hundreds of kilobytes or several megabytes to your installer data, a fully featured NSIS installer has a overhead of only 34 KB. \\Compatible with all major Windows versions\\ You can create a single installer that is compatible with Windows 95, 98, ME, NT4, 2000, XP, 2003, Vista, Server 2008, 7, Server 2008R2, 8, Server 2012, 8.1, Server 2012R2 and Windows 10. \\Unique compression methods\\ You can choose between three different integrated compression methods (ZLib, BZip2, LZMA). LZMA compression gives better results than any other common compression method. You don't have to use large self-extracting archive modules or other applications, the compression support is included in the 34 KB overhead. \\Script based\\ Unlike other systems that can only generate installers based on a list of files and registry keys, NSIS has a powerful \R{tutscriptfiles}{scripting language}. This script language is designed for installers and has commands that help you to perform many installation tasks. You can easily add custom logic and handle different upgrades, version checks and more. On the \W{https://nsis.sourceforge.io/wiki/}{NSIS Wiki} you can find a lot more. \\Multiple languages in one installer\\ One installer can support multiple interface languages. More than 60 translations are already included and you can also create your own language files. RTL (right-to-left) languages such as Arabic and Hebrew are fully supported. Creating a \R{intro-unicode}{Unicode native installer} is also possible, targeting all the languages supported by the OS without display issues. \\Many features and checks for the target system\\ The script language provides commands you can use on the target system. From simple features like folder creation and registry editing to text/binary file modification, modification of environment variables and system reboots. By using one of the provided plug-ins you can even call the Windows API directly. \\Custom dialogs and interfaces\\ You can create custom wizard pages to get user input or integrate configuration options. NSIS includes a classic and modern wizard interface, but it is even possible to create your own custom interface. \\Plug-in system\\ NSIS can be extended with plug-ins that can communicate with the installer. They can be written in C, C++, Delphi or another language and can be used to perform installation tasks or extend the installer interface. You can use the plug-in with a single line of script code. Plug-ins are also be compressed like other installation data and will only be included when you are using their features. \\Support for web installation, file patching\\ The NSIS distribution includes a set of plug-ins that allow you to download files from the internet, make internet connections, patch existing files and more. \\Project integration, different releases and automatic builds\\ The NSIS compiler features a powerful preprocessor. This allows you to easily integrate multiple projects into a single installer or automatically generate installer builds. You can also generate different releases such as lite and full versions. \\Easy and human readable file formats\\ The NSIS script format and the format used for interface dialogs are easy, documented and humanly readable, so you can edit your files with your favorite editor. This also makes automatic script generation possible. \H{intro-featurelist} Feature List \b Generates self contained executable installers \b Support for ZLIB, BZIP2 and LZMA data compression (files can be compressed individually or together) \b Uninstall support (installer can generate an uninstaller) \b Customizable user interface (dialogs, fonts, backgrounds, icons, text, checkmarks, images etc.) \b Classic and Modern wizard interface \b Fully multilingual, support for multiple languages in one installer. More than 60 translations are available, but you can also create your own. Unicode support allowing even more languages. \b Page system: You can add standard wizard pages or custom pages \b User selection of installation components, tree for component selection \b Multiple install configurations (usually Minimal, Typical, Full), and custom configuration \b Installer self-verification using a CRC32 checksum \b Small overhead over compressed data size (34 KB with default options) \b Ability to display a license agreement in text or RTF format \b Ability to detect destination directory from the registry \b Easy to use plug-in system (lots of plug-ins for creation of custom dialogs, internet connections, HTTP downloading, file patching, Win32 API calls etc. are included) \b Installers can be as large as 2GB \b Optional \R{silent}{silent} mode for automated installations \b A preprocessor with support for defined symbols, macro's, conditional compilation, standard predefines \b A lovely coding experience with elements of PHP and assembly (includes user variables, a stack, real flow control, etc.) \b Installers have their own VMs that let you write code that can support: \\ \b File extraction (with configurable overwrite parameters) \b File/directory copying, renaming, deletion, searching \b Plug-in DLL calling \b DLL/ActiveX control registration/deregistration \b Executable execution (shell execute and wait options) \b Shortcut creation \b Registry key reading/setting/enumerating/deleting \b INI file reading/writing \b Generic text file reading/writing \b Powerful string and integer manipulation \b Window finding based on class name or title \b User interface manipulation (font/text setting) \b Window message sending \b User interaction with message boxes or custom pages \b Branching, comparisons, etc. \b Error checking \b Reboot support, including delete or rename on reboot \b Installer behaviour commands (such as show/hide/wait/etc) \b User functions in script \b Callback functions for user actions \\ \b Completely free for any use. See \R{license}{license}. \H{intro-unicode} Unicode installers Starting with NSIS v3.0 you can choose to create Unicode installers by setting the \R{aunicodetarget}{Unicode} attribute. These installers will not work on Windows 95/98/ME but they will allow you to display your installer in any Unicode language supported by the OS. When building a Unicode installer NSIS variables can hold Unicode characters (0001-FFFF). There should be no need to modify your existing scripts. If you want to read/write Unicode files, specific instructions have been added to read/write UTF-16LE strings from/to disk. nsis-3.11/Docs/src/jumps.but000077500000000000000000000036371477201124000157550ustar00rootroot00000000000000\S0{jumps} Relative Jumps Unlike labels, relative jumps are, as the name suggests, relative to the place they are called from. You can use relative jumps wherever you can use labels. Relative jumps are marked by numbers. +1 jumps to the next instruction (the default advancement), +2 will skip one instruction and go to the second instruction from the current instruction, -2 will jump two instructions backward, and +10 will skip 9 instructions, jumping to the tenth instruction from the current instruction. A instruction is every command that is executed at run-time, when the installer is running. \R{messagebox}{MessageBox}, \R{goto}{Goto}, \R{getdllversion}{GetDLLVersion}, \R{FileRead}{FileRead}, \R{setshellvarcontext}{SetShellVarContext} are all instructions. \R{saddsize}{AddSize}, \R{ssection}{Section}, \R{ssectiongroup}{SectionGroup}, \R{ssectionend}{SectionEnd}, \R{asetoverwrite}{SetOverwrite} (and everything under \R{flags}{Compiler Flags}), \R{aname}{Name}, \R{asetfont}{SetFont}, \R{langstring}{LangString}, are not instructions because they are executed at compile time. Examples: \c Goto +2 \c MessageBox MB_OK "You will never ever see this message box" \c MessageBox MB_OK "The last message was skipped, this one should be shown" \c Goto +4 \c MessageBox MB_OK "The following message will be skipped" \c Goto +3 \c MessageBox MB_OK "You will never ever see this message box" \c Goto -3 \c MessageBox MB_OK "Done" Note that \R{insertmacro}{macro insertion} is not considered as one instruction when it comes to relative jumps. The macro is expanded before relative jumps are applied, and so relative jumps can jump into code inside an inserted macro. The following code, for example, will not skip the macro. It will show a message box. \c !macro relative_jump_test \c MessageBox MB_OK "first macro line" \c MessageBox MB_OK "second macro line" \c !macroend \c \c Goto +2 \c !insertmacro relative_jump_test nsis-3.11/Docs/src/labels.but000077500000000000000000000016461477201124000160570ustar00rootroot00000000000000\S0{labels} Labels Labels are the targets of \R{goto}{Goto} instructions and the various branching instructions (such as \R{iferrors}{IfErrors}, \R{messagebox}{MessageBox}, \R{iffileexists}{IfFileExists}, and \R{strcmp}{StrCmp}). Labels must be within a \R{ssection}{Section} or a \R{ffunction}{Function}. Labels are local in scope, meaning they are only accessible from within the \R{ssection}{Section} or \R{ffunction}{Function} that they reside in. To declare a label, simply use: \e{MyLabel:} Labels cannot begin with a -, +, !, $, or 0-9. When specifying labels for the various instructions that require them, remember that both an empty string ("") and 0 both represent the next instruction (meaning no \R{goto}{Goto} will occur). Labels beginning with a period (.) are global, meaning you can jump to them from any function or section (though you cannot jump to an uninstall global label from the installer, and vice versa).nsis-3.11/Docs/src/langs.but000077500000000000000000000120741477201124000157160ustar00rootroot00000000000000\S1{langsinstructions} Multiple Languages Instructions \S2{loadlanguagefile} LoadLanguageFile \c language_file.nlf Loads a language file for the construction of a language table. All of the language files that ship with NSIS are in \L{../Contrib/Language files}{Contrib\\Language Files} After you have inserted the language file $\{LANG_langfile\} will be defined as the language id (for example, $\{LANG_ENGLISH\} will be defined as 1033). Use it with \R{langstring}{LangString}, \R{licenselangstring}{LicenseLangString}, \R{langdll}{LangDLL} and \R{viaddversionkey}{VIAddVersionKey}. \S2{langstring} LangString \c name language_id|0 string Defines a multilingual string. This means its value may be different (or not, it's up to you) for every language. It allows you to easily make your installer multilingual without the need to add massive switches to the script. Each language string has a name that identifies it and a value for each language used by the installer. They can be used in any runtime string in the script. To use a language string all you need to add to the string is $(LangString_name_here) where you want the \R{langstring}{LangString} to be inserted. \\Notes:\\ \b Unlike defines that use curly braces - \{\}, language strings use parenthesis - (). \b If you change the language in the .onInit function, note that language strings in .onInit will still use the detected language based on the user's default Windows language because the language is initialized after .onInit. \b Always set language strings for every language in your script. \b If you set the language ID to 0 the last used language by \R{langstring}{LangString} or \R{loadlanguagefile}{LoadLanguageFile} will be used. \\Example of usage:\\ \c LangString message ${LANG_ENGLISH} "English message" \c LangString message ${LANG_FRENCH} "French message" \c LangString message ${LANG_KOREAN} "Korean message" \c \c MessageBox MB_OK "A translated message: $(message)" \S2{licenselangstring} LicenseLangString \c name language_id|0 license_path Does the same as \R{langstring}{LangString} only it loads the string from a text/RTF file and defines a special LangString that can only be used by \R{alicensedata}{LicenseData}. \c LicenseLangString license ${LANG_ENGLISH} license-english.txt \c LicenseLangString license ${LANG_FRENCH} license-french.txt \c LicenseLangString license ${LANG_GERMAN} license-german.txt \c \c LicenseData $(license) \S0{langs} Multiple Languages As of version 2 NSIS fully supports multiple languages. The interface of one installer can support multiple languages. Use \R{loadlanguagefile}{LoadLanguageFile} for every language to load the default interface texts and language properties. Visit the \W{http://forums.winamp.com/showthread.php?t=157119}{NSIS translations forum} for more information about creating new language files. The default interface texts can easily be changed using instructions like \R{acomponenttext}{ComponentText} etc. You can also use the contents of the standard language strings in your own strings (for example, $(^Name) contains the installer's name set using the \R{aname}{Name} instruction). The names of all standard language strings are listed as comments just above the strings in the language files. The language files are located in \L{../Contrib/Language files}{Contrib\\Language Files}. To create your own language strings, use \R{langstring}{LangString}. For an example of an installer with multiple languages, see \L{../Examples/languages.nsi}{languages.nsi}. \S1{langselection} Language Selection When the installer starts up it goes through these steps to select the interface language: \n Get user's default Windows UI language \n Find a perfect match for the language \n If there is no perfect match, find a primary language match \n If there is no match, use the first language defined in the script (make sure your first language is a common one like English) \n If the language variable \R{varconstant}{$LANGUAGE} has changed during .onInit, NSIS goes through steps 2 to 4 again. \S1{langdll} LangDLL Plug-in The LangDLL plug-in allows you to give the user an option to choose the language of the installer. Just push the language id ($\{LANG_langfile\}) and its name for every language in your installer, then the number of languages pushed, the caption, and the text that tells the user to select the language, call the plug-in function named LangDialog, pop the returned value into $LANGUAGE and you're good to go. If the user clicks on the cancel button the return value will be "cancel". For an example of usage see \L{../Examples/languages.nsi}{languages.nsi}. \S1{rtl} RTL Languages RTL languages are languages that are written from right to left (e.g. Arabic and Hebrew). NSIS fully supports RTL languages. In the language file there is a place to specify if the language is RTL or not. To find out at runtime if the current language is RTL or not, check the value of the $(^RTL) language string. It will be 1 if the language is RTL and 0 otherwise. This can be useful when using plug-ins that create dialogs, they usually have RTL settings too. nsis-3.11/Docs/src/library.but000077500000000000000000000227151477201124000162610ustar00rootroot00000000000000\A{library} DLL/TLB Library Setup \H{library_intro} Introduction The Library header file can be used to setup dynamic link libraries (DLL) and type libraries (TLB). If necessary, the following actions will be performed: \b File copying \b File copying on reboot \b Version checks \b Registration and unregistration \b Registration and unregistration on reboot \b Shared DLL counting \b Windows File Protection checks The macros are stored in the header file Library.nsh, which should be included in scripts using this system: \c !include Library.nsh Note that the library macros are limited on non-Windows platforms. DLL version information is required when compiling on non-Windows platforms. \H{library_install} Library Installation \S1{} Introduction The InstallLib macro allows you to install a library. It sets the error flag if something went wrong during library setup. To ask the user for a reboot, if required, use the Modern UI with a Finish page or use \R{ifrebootflag}{IfRebootFlag} and make your own page or message box. \S1{library_install_parameters} Parameters \c libtype shared install localfile destfile tempbasedir \\libtype\\ The type of the library DLL - Dynamic link library (DLL)\\ REGDLL - DLL that has to be registered\\ REGEXE - EXE COM server that has to be registered using /regserver\\ TLB - Type library or DLL that contains a type library\\ REGDLLTLB - DLL that has to be registered and contains a type library\\ \\shared\\ Specify whether the library is shared with other applications NOTSHARED - The library is not shared\\ $VARNAME - Variable that is empty when the application is installed for the first time, which is when the shared library count will be increased.\\ \\install\\ Specify the installation method REBOOT_PROTECTED \b Upgrade the library on reboot when in use (required for system files). \b Upgrade the library if the file is not protected by Windows File Protection. NOREBOOT_PROTECTED \b Warns the user when the library is in use. The user will have to close applications using the library. \b Upgrade the library if the file is not protected by Windows File Protection. REBOOT_NOTPROTECTED \b Upgrade the library on reboot when in use (required for system files). \b Upgrade the library without checking for Windows File Protection. NOREBOOT_NOTPROTECTED \b Warns the user when the library is in use. The user will have to close applications using the library. \b Upgrade the library without checking for Windows File Protection. \\localfile\\ Location of the library on the compiler system \\destfile\\ Location to store the library on the user's system \\tempbasedir\\ Directory on the user's system to store a temporary file when the system has to be rebooted. For Windows 9x/ME support, this directory should be on the same volume as the destination file (destfile). The Windows temp directory could be located on any volume, so you cannot use this directory. \S1{library_install_options} Options \R{define}{Define} any of the following before inserting a InstallLib macro to modify its behavior as specified. \S2{} LIBRARY_X64 \b Installs a DLL built for Windows x64. \b \s{Warning:} This resets \R{setregview}{SetRegView} and file system redirection. \S2{} LIBRARY_SHELL_EXTENSION \b Define this before inserting InstallLib macro to call SHChangeNotify with SHCNE_ASSOCCHANGED after registration. \b Use this to refresh the shell when installing a shell extension or when changing file associations. \S2{} LIBRARY_COM \b Define this before inserting InstallLib macro to call CoFreeUnusedLibraries after registration. \b Use this for unloading all unnecessary libraries from memory when installing COM libraries. \S2{} LIBRARY_IGNORE_VERSION \b Define this before inserting InstallLib macro to ignore version information in the file and always install it, even if it already exists. \b Use this when an older or specific version is required. \b Not recommended for DLLs installed to $SYSDIR. \S2{} LIBRARY_INSTALL_EQUAL_VERSION \b Define this before inserting InstallLib macro to overwrite the file even if the version is the same as the existing file. \S1{library_install_notes} Notes \b If you need to support Windows 9x/ME, you can only use short filenames (8.3). \b \s{Warning:} Always use redistributable files when deploying DLLs, never copy files from your system directory! \S1{library_install_examples} Example \S2{} Unshared DLL \c !insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR \S2{} Shared DLL \c ;Add code here that sets $ALREADY_INSTALLED to a non-zero value if the application is \c ;already installed. For example: \c \c IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;Replace MyApp.exe with your application filename \c StrCpy $ALREADY_INSTALLED 1 \c new_installation: \c \c !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR \H{library_uninstall} Library Uninstallation \S1{} Introduction The UnInstallLib macro allows you to uninstall a library. It sets the error flag if something went wrong during library removal. \S1{library_uninstall_parameters} Parameters \c libtype shared uninstall file \\libtype\\ The type of the library DLL - Dynamic link library (DLL)\\ REGDLL - DLL that has to be unregistered\\ REGEXE - EXE COM server that has to be unregistered using /unregserver\\ TLB - Type library or DLL that contains a type library\\ REGDLLTLB - DLL that has to be unregistered and contains a type library\\ \\shared\\ Specify whether the library is shared with other applications NOTSHARED - The library is not shared\\ SHARED - The library is shared and should be removed if the shared library count indicates that the file is not in use anymore..\\ \\uninstall\\ Specify the uninstallation method NOREMOVE \b The library should not be removed. You should use this option for common or important system files such as the Visual Basic/C++/MFC runtimes. REBOOT_PROTECTED \b Remove the library on reboot when in use (required for system files). \b Remove the library if the file is not protected by Windows File Protection. NOREBOOT_PROTECTED \b Warns the user when the library is in use. The user will have to close applications using the library. \b Remove the library if the file is not protected by Windows File Protection. REBOOT_NOTPROTECTED \b Remove the library on reboot when in use (required for system files). \b Remove the library without checking for Windows File Protection. NOREBOOT_NOTPROTECTED \b Warns the user when the library is in use. The user will have to close applications using the library. \b Remove the library without checking for Windows File Protection. \\file\\ Location of the library \S1{library_uninstall_options} Options \R{define}{Define} any of the following before inserting a UnInstallLib macro to modify its behavior as specified. \S2{} LIBRARY_X64 \b Uninstalls a DLL built for Windows x64. \b \s{Warning:} This resets \R{setregview}{SetRegView} and file system redirection. \S2{} LIBRARY_SHELL_EXTENSION \b Define this before inserting UninstallLib macro to call SHChangeNotify with SHCNE_ASSOCCHANGED after unregistration. Use this to refresh the shell when uninstalling a shell extension or when changing file associations. \S2{} LIBRARY_COM \b Define this before inserting UninstallLib macro to call CoFreeUnusedLibraries after unregistration. Use this for unloading all unnecessary libraries from memory when uninstalling COM libraries. \S1{library_uninstall_examples} Example \c !insertmacro UnInstallLib REGDLL SHARED REBOOT_NOTPROTECTED $SYSDIR\dllname.dll \H{library_vb6} Visual Basic 6 Run-Time Files A new VB6RunTime.nsh header file is available for the setup of the VB6 run-time files. To obtain the latest run-time files, download \W{https://nsis.sourceforge.io/vb6runtime.zip}{vb6runtime.zip} and extract this file. \c !include VB6RunTime.nsh \c \c Var AlreadyInstalled \c \c Section "-Install VB6 run-time files" \c \c ;Add code here that sets $AlreadyInstalled to a non-zero value if the application is already installed. For example: \c IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;Replace MyApp.exe with your application filename \c StrCpy $AlreadyInstalled 1 \c new_installation: \c \c !insertmacro VB6RunTimeInstall C:\vb6runtimes $AlreadyInstalled ;Replace C:\vb6runtimes with the location of the files \c \c SectionEnd \c \c Section "-un.Uninstall VB6 run-time files" \c \c !insertmacro VB6RunTimeUnInstall \c \c SectionEnd Remarks: \b You may have to install additional files for such Visual Basic application to work, such as OCX files for user interface controls. \b Installation of the run-time files requires Administrator or Power User privileges. Use the Multi-User header file to verify whether these privileges are available. \b Add a Modern UI finish page or another check (see \R{ifrebootflag}{IfRebootFlag}) to allow the user to restart the computer when necessary. nsis-3.11/Docs/src/license.but000077500000000000000000000357151477201124000162430ustar00rootroot00000000000000\A{license} License \H{copyright} Copyright \NsisCopyright More detailed copyright information can be found in the individual source code files. \H{licenses} Applicable licenses \b All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license. \b The zlib compression module for NSIS is licensed under the zlib/libpng license. \b The bzip2 compression module for NSIS is licensed under the bzip2 license. \b The lzma compression module for NSIS is licensed under the Common Public License version 1.0. \H{zlib-license} zlib/libpng license This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: \n The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. \n Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. \n This notice may not be removed or altered from any source distribution. \H{bzip2-license} bzip2 license Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \n Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \n The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. \n Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. \n The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. \W{mailto:jseward@acm.org}{jseward@acm.org} \H{cpl-license} Common Public License version 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \H{lzma-special-exception} Special exception for LZMA compression module Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0.nsis-3.11/Docs/src/log.but000077500000000000000000000012121477201124000153630ustar00rootroot00000000000000\S1{installlog} Install Logging Instructions \S2{logset} LogSet \c on|\\off\\ Sets whether install logging to $INSTDIR\\install.log will happen. $INSTDIR must have a value before you call this function or it will not work. Note that the \e{NSIS_CONFIG_LOG} build setting must be set (\c{scons NSIS_CONFIG_LOG=yes}) when building (it is not set by default) to support this. See \R{build}{Building NSIS} for more information about recompiling NSIS. \S2{logtext} LogText \c text If installer logging is enabled, inserts text "text" into the log file. \c IfFileExists $WINDIR\notepad.exe 0 +2 \c LogText "$$WINDIR\notepad.exe exists" nsis-3.11/Docs/src/misc.but000077500000000000000000000056161477201124000155510ustar00rootroot00000000000000\S1{miscinst} Miscellaneous Instructions \S2{geterrorlevel} GetErrorLevel \c user_var(error level output) Returns the last error level set by \R{seterrorlevel}{SetErrorLevel} or -1 if it has never been set. \c GetErrorLevel $0 \c IntOp $0 $0 + 1 \c SetErrorLevel $0 \S2{getinstdirerror} GetInstDirError \c user_var(error output) Use in the leave function of a directory page. Reads the flag set if '\R{adirverify}{DirVerify leave}' is used. Possible values: 0: No error 1: Invalid installation directory 2: Not enough space on installation drive \c !include LogicLib.nsh \c PageEx directory \c DirVerify leave \c PageCallbacks "" "" dirLeave \c PageExEnd \c \c Function dirLeave \c GetInstDirError $0 \c ${Switch} $0 \c ${Case} 0 \c MessageBox MB_OK "valid installation directory" \c ${Break} \c ${Case} 1 \c MessageBox MB_OK "invalid installation directory!" \c Abort \c ${Break} \c ${Case} 2 \c MessageBox MB_OK "not enough free space!" \c Abort \c ${Break} \c ${EndSwitch} \c FunctionEnd \S2{initpluginsdir} InitPluginsDir Initializes the plug-ins dir (\R{varconstant}{$PLUGINSDIR}) if not already initialized. \c InitPluginsDir \c File /oname=$PLUGINSDIR\image.bmp image.bmp \S2{nop} Nop Does nothing. \S2{seterrorlevel} SetErrorLevel \c error_level Sets the error level of the installer or uninstaller to \e{error_level}. See \R{errorlevels}{Error Levels} for more information. \c IfRebootFlag 0 +2 \c SetErrorLevel 4 \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning -1 is reserved for internal use. Negative numbers should be avoided for compatibility with batch scripts. \NsisWarnBlockContainerEnd \S2{setshellvarcontext} SetShellVarContext \c \\current\\|all|lastused Sets the context of $SMPROGRAMS and other \R{varconstant}{shell folders}. If set to 'current' (the default), the current user's shell folders are used. If set to 'all', the 'all users' shell folder is used. The all users folder may not be supported on all OSes. If the all users folder is not found, the current user folder will be used. Please take into consideration that a "normal user" has no rights to write in the all users area. Only admins have full access rights to the all users area. You can check this by using the UserInfo plug-in. See Contrib\\UserInfo\\UserInfo.nsi for an example. Note that, if used in installer code, this will only affect the installer, and if used in uninstaller code, this will only affect the uninstaller. To affect both, it needs to be used in both. \c SetShellVarContext current \c StrCpy $0 $DESKTOP \c SetShellVarContext all \c StrCpy $1 $DESKTOP \c MessageBox MB_OK $0$\n$1 \S2{sleep} Sleep \c sleeptime_in_ms Pauses execution in the installer for sleeptime_in_ms milliseconds. sleeptime_in_ms can be a variable, e.g. "$0" or a number, i.e. "4321". \c DetailPrint "sleeping..." \c Sleep 3000 \c DetailPrint "back to work" nsis-3.11/Docs/src/modernui.but000077500000000000000000000020121477201124000164230ustar00rootroot00000000000000\A{modernui} Modern User Interface NSIS 2 makes it is possible to create installers with a custom user interface. The Modern UI is a interface with a style like the wizards of recent Windows versions. This new interface also features new pages (Welcome, Finish, Start Menu) and a description area on the components page. The interface and the graphics can be customized using the provided settings. Using the Modern UI macros and language files, writing scripts with a modern interface is easy. For more information and documentation see the \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 Readme}. NSIS 2.34 brought with it a new version of Modern UI - version 2. It is faster and more extendible. It allows plug-ins to add new types of pages and even change existing pages using a simple NSH file. It also uses \L{../Docs/nsDialogs/Readme.html}{nsDialogs} which faster than its elder sibling - InstallOptions. For more information and documentation of the old version see the \L{../Docs/Modern UI/Readme.html}{Modern UI Readme}.nsis-3.11/Docs/src/nsis.hhp000077500000000000000000000006471477201124000155560ustar00rootroot00000000000000[OPTIONS] Compatibility=1.1 or later Compiled file=NSIS.chm Contents file=toc.hhc Default Window=Main Default topic=Contents.html Display compile progress=Yes Full-text search=Yes Index file=ind.hhk Language=0x409 English (United States) Title=NSIS Users Manual [WINDOWS] Main="NSIS User Manual","toc.hhc","ind.hhk","Contents.html","Contents.html",,,,,0x23520,,0x387e,,0xb0000,,,,,,0 [FILES] Contents.html [INFOTYPES] nsis-3.11/Docs/src/pages.but000077500000000000000000000173541477201124000157170ustar00rootroot00000000000000\H{pages} Pages Each (non-silent) NSIS installer has a set of pages. Each page can be a NSIS built-in page or a custom page created by a user's function (with \L{../Docs/nsDialogs/Readme.html}{nsDialogs} or \L{../Docs/InstallOptions/Readme.html}{InstallOptions} for example). The script controls the page order, appearance, and behavior. You can skip pages, paint them white, force the user to stay in a certain page until a certain condition is met, show a readme page, show custom designed pages for input and more. In this section you will learn how to do all of the above. There are two basic commands regarding pages, \R{page}{Page} and \R{uninstpage}{UninstPage}. The first adds a page to the installer, the second adds a page to the uninstaller. On top of those two there is the \R{pageex}{PageEx} command which allows you to add a page to either one and with greater amount of options. \R{pageex}{PageEx} allows you to set options to the specific page you are adding instead of using the default that's set outside of \R{pageex}{PageEx}. \S{pageoreder} Ordering The page order is set simply by the order \R{page}{Page}, \R{uninstpage}{UninstPage} and \R{pageex}{PageEx} appear in the script. For example: \c Page license \c Page components \c Page directory \c Page instfiles \c UninstPage uninstConfirm \c UninstPage instfiles This code will tell NSIS to first show the license page, then the components selection page, then the directory selection page and finally the install log where sections are executed. The uninstaller will first show the uninstall confirmation page and then the uninstallation log. You can specify the same page type more than once. For backwards compatibility with old NSIS scripts, the following installer pages will be added if no installer page commands are used: license (if \R{alicensetext}{LicenseText} and \R{alicensedata}{LicenseData} were specified), components (if \R{acomponenttext}{ComponentText} was specified and there is more than one visible section), directory (if \R{adirtext}{DirText} was specified) and instfiles. When there are no uninstaller page commands the following uninstaller pages will be added: uninstall confirmation page (if \R{auninstalltext}{UninstallText} was specified) and instfiles. This method is deprecated, converting scripts to use page commands is highly recommended because you can use the new standard language strings. \S{pageoptions} Page Options Each page has its unique set of data that defines how it will look and act. This section describes what data each type of page uses and how you can set it. \R{pagecallbacks_explain}{Callback functions} are described below and are not dealt with in this section. The list below lists the commands that affect a certain page type. Unless otherwise mentioned, these commands can be used both inside and outside of a \R{pageex}{PageEx} block. If used inside a \R{pageex}{PageEx} block they will only affect the current page being set by PageEx, otherwise they will set the default for all other pages. \e{License page} \b \R{alicensetext}{LicenseText} \b \R{alicensedata}{LicenseData} \b \R{alicenseforceselection}{LicenseForceSelection} \e{Components selection page} \b \R{acomponenttext}{ComponentText} \e{Directory selection page} \b \R{adirtext}{DirText} \b \R{adirvar}{DirVar} (can only be used in \R{pageex}{PageEx}) \b \R{adirverify}{DirVerify} \e{Un/Installation log page} \b \R{adetailsbuttontext}{DetailsButtonText} \b \R{acompletedtext}{CompletedText} \e{Uninstall confirmation page} \b \R{adirvar}{DirVar} (can only be used in \R{pageex}{PageEx}) \b \R{auninstalltext}{UninstallText} Use \R{acaption}{Caption} to set the page caption. \S{pagecallbacks_explain} Callbacks Each built-in page has three callback functions: the pre-function, the show function and the leave-function. The pre-function is called right before the page is created, the show-function is called right after it has been created but before it is shown and the leave-function is called right after the user has pressed the next button (before actually leaving the page). \b The pre-function allows you to skip the page using \R{abort}{Abort}. \b The show-function allows you to tweak the page's user interface with \R{createfont}{CreateFont}, \R{setctlcolors}{SetCtlColors}, \R{sendmessage}{SendMessage} etc. \b The leave-function allows you to force the user to stay on the current page using \R{abort}{Abort}. A custom page only has two callback functions, one that creates it which is mandatory, and one leave-function that acts just like the leave-function for built-in pages. Examples: \c Page license skipLicense "" stayInLicense \c Page custom customPage "" ": custom page" \c Page instfiles \c \c Function skipLicense \c MessageBox MB_YESNO "Do you want to skip the license page?" IDNO no \c Abort \c no: \c FunctionEnd \c \c Function stayInLicense \c MessageBox MB_YESNO "Do you want to stay in the license page?" IDNO no \c Abort \c no: \c FunctionEnd \c \c Function customPage \c GetTempFileName $R0 \c File /oname=$R0 customPage.ini \c InstallOptions::dialog $R0 \c Pop $R1 \c StrCmp $R1 "cancel" done \c StrCmp $R1 "back" done \c StrCmp $R1 "success" done \c error: MessageBox MB_OK|MB_ICONSTOP "InstallOptions error:$\r$\n$R1" \c done: \c FunctionEnd \S{page} Page \c custom [creator_function] [leave_function] [caption] [/ENABLECANCEL] \c OR \c internal_page_type [pre_function] [show_function] [leave_function] [/ENABLECANCEL] Adds an installer page. See the above sections for more information about built-in versus custom pages and about callback functions. \e{internal_page_type} can be: \b \e{license} - license page \b \e{components} - components selection page \b \e{directory} - installation directory selection page \b \e{instfiles} - installation page where the sections are executed \b \e{uninstConfirm} - uninstall confirmation page The last page of the installer has its cancel button disabled to prevent confusion. To enable it anyway, use \e{/ENABLECANCEL}. \S{uninstpage} UninstPage \c custom [creator_function] [leave_function] [caption] [/ENABLECANCEL] \c OR \c internal_page_type [pre_function] [show_function] [leave_function] [/ENABLECANCEL] Adds an uninstaller page. See the above sections for more information about built-in versus custom pages and about callback functions. See \R{page}{Page} for possible values of \e{internal_page_type}. \S{pageex} PageEx \c [un.](custom|uninstConfirm|license|components|directory|instfiles) Adds an installer page or an uninstaller page if the un. prefix was used. Every PageEx must have a matching \R{pageexend}{PageExEnd}. In a PageEx block you can set options that are specific to this page and will not be used for other pages. Options that are not set will revert to what was set outside the PageEx block or the default if nothing was set. To set the sub-caption for a page use \R{acaption}{Caption} or \R{asubcaption}{SubCaption} to set the default. To set the callback functions for a page set with PageEx use \R{pagecallbacks}{PageCallbacks}. See the above sections for more information about built-in versus custom pages. Example usage: \c PageEx license \c LicenseText "Readme" \c LicenseData readme.rtf \c PageExEnd \c \c PageEx license \c LicenseData license.txt \c LicenseForceSelection checkbox \c PageExEnd \S{pageexend} PageExEnd Ends a \R{pageex}{PageEx} block. \S{pagecallbacks} PageCallbacks \c ([creator_function] [leave_function]) | ([pre_function] [show_function] [leave_function]) Sets the callback functions for a page defined using \R{pageex}{PageEx}. Can only be used inside a \R{pageex}{PageEx} block. See the above sections for more information about callback functions. \c PageEx license \c PageCallbacks licensePre licenseShow licenseLeave \c PageExEnd nsis-3.11/Docs/src/plugin.but000077500000000000000000000034131477201124000161050ustar00rootroot00000000000000\S0{plugindlls} Plug-in DLLs The abilities of the NSIS scripting language can be extended by utilising functionality provided in a DLL file. Probably the best known example of this is the InstallOptions.dll bundled with every NSIS release. When the NSIS compiler starts it scans the plug-ins directory for DLLs and makes a list of the plug-ins found and their exported functions. During compilation, if a sequence such as fred::flintstone is encountered where the compiler expected to find a language keyword the compiler will look through this list. If a list entry specifies that fred.dll exports function flintstone NSIS will pack the fred.dll file into the created installer binary. During execution of a plug-in command NSIS will unpack the necessary DLL to a temporary folder ($PLUGINSDIR), push all of the arguments specified (right-to-left order), and then execute the DLL function. \S1{usingplug} Using Plug-in Commands A plug-in call looks like this: \c InstallOptions::dialog "ini_file_location.ini" All parameters are pushed onto the stack (in this case, the plug-in function only needs one parameter). Some plug-in commands may not need any parameters on the stack, others might require more of them. To use a plug-in command you will need to read the documentation for the plug-in so that you know what parameters its functions require. \S1{calldiskplug} Calling plug-ins manually If you want to call a plug-in that is stored on user's hard drive or somewhere else, use \R{callinstdll}{CallInstDLL}. Almost all plug-ins provide installer functionality, so using plug-in commands is way easier. Using \R{callinstdll}{CallInstDLL} can be useful when you have created plug-ins that are linked to a certain version of your application and are being copied to the installation folder. nsis-3.11/Docs/src/reboot.but000077500000000000000000000011241477201124000160760ustar00rootroot00000000000000\S{rebootinst} Reboot Instructions \S2{reboot} Reboot Reboots the computer. Be careful with this one. If it fails, \R{onrebootfailed}{.onRebootFailed} is called. In any case, this instruction never returns, just like \R{quit}{Quit}. \c MessageBox MB_YESNO|MB_ICONQUESTION "Do you wish to reboot the system?" IDNO +2 \c Reboot \S2{setrebootflag} SetRebootFlag \c true|false Sets the reboot flag to either true or false. The flag's value can be read using \R{ifrebootflag}{IfRebootFlag}. \c SetRebootFlag true \c IfRebootFlag 0 +2 \c MessageBox MB_OK "this message box will always show" nsis-3.11/Docs/src/registry.but000077500000000000000000000247221477201124000164650ustar00rootroot00000000000000\S1{registry} Registry, INI, File Instructions In all of the below registry instructions use an empty string (just two quotes with nothing between them - "") as the key name to specify the default key which is shown as (Default) in regedit.exe. Use \R{setregview}{SetRegView} on 64-bit Windows to choose which registry view is used. If a full path is not specified for any of the INI handling instructions, the Windows directory will be used. \S2{deleteinisec} DeleteINISec \c ini_filename section_name Deletes the entire section [section_name] from ini_filename. If the section could not be removed from the ini file, the error flag is set. It does not set the error flag if the section could not be found. \c WriteINIStr $TEMP\something.ini section1 something 123 \c WriteINIStr $TEMP\something.ini section1 somethingelse 1234 \c WriteINIStr $TEMP\something.ini section2 nsis true \c DeleteINISec $TEMP\something.ini section1 \S2{deleteinistr} DeleteINIStr \c ini_filename section_name str_name Deletes the string str_name from section [section_name] from ini_filename. If the string could not be removed from the ini file, the error flag is set. It does not set the error flag if the string could not be found. \c WriteINIStr $TEMP\something.ini section1 something 123 \c WriteINIStr $TEMP\something.ini section1 somethingelse 1234 \c DeleteINIStr $TEMP\something.ini section1 somethingelse \S2{deleteregkey} DeleteRegKey \c [/ifempty | /ifnosubkeys | /ifnovalues] root_key subkey Deletes a registry key. If /ifempty is specified, the registry key will only be deleted if it has no subkeys and no values (otherwise, the whole registry tree will be removed). Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. The error flag is set if the key could not be removed from the registry (or if it didn't exist to begin with). \c DeleteRegKey HKLM "Software\My Company\My Software" \c DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys" \S2{deleteregvalue} DeleteRegValue \c root_key subkey key_name Deletes a registry value. Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. The error flag is set if the value could not be removed from the registry (or if it didn't exist to begin with). \c DeleteRegValue HKLM "Software\My Company\My Software" "some value" \S2{enumregkey} EnumRegKey \c user_var(output) root_key subkey index Set user variable $x with the name of the 'index'th registry key in root_key\\Subkey. Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. Returns an empty string if there are no more keys, and returns an empty string and sets the error flag if there is an error. \c StrCpy $0 0 \c loop: \c EnumRegKey $1 HKLM Software $0 \c StrCmp $1 "" done \c IntOp $0 $0 + 1 \c MessageBox MB_YESNO|MB_ICONQUESTION "$1$\n$\nMore?" IDYES loop \c done: \S2{enumregvalue} EnumRegValue \c user_var(output) root_key subkey index Set user variable $x with the name of the 'index'th registry value in root_key\\Subkey. Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. Returns an empty string and sets the error flag if there are no more values or if there is an error. \c StrCpy $0 0 \c loop: \c ClearErrors \c EnumRegValue $1 HKLM Software\Microsoft\Windows\CurrentVersion $0 \c IfErrors done \c IntOp $0 $0 + 1 \c ReadRegStr $2 HKLM Software\Microsoft\Windows\CurrentVersion $1 \c MessageBox MB_YESNO|MB_ICONQUESTION "$1 = $2$\n$\nMore?" IDYES loop \c done: \S2{expandenvstrings} ExpandEnvStrings \c user_var(output) string Expands environment variables in \e{string} into the user variable \e{$x}. If an environment variable doesn't exist, it will not be replaced. For example, if you use "%var%" and var doesn't exists, the result will be "%var%". If there is an error, the variable is set to empty, and the error flag is set. \c ExpandEnvStrings $0 "WINDIR=%WINDIR%$\nTEMP=%TEMP%" \S2{flushini} FlushINI \c ini_filename Flushes the INI file's buffers. Windows 9x keeps all changes to the INI file in memory. This command causes the changes to be written to the disk immediately. Use it if you edit the INI manually, delete it, move it or copy it right after you change it with \R{writeinistr}{WriteINIStr}, \R{deleteinisec}{DeleteINISec} or \R{deleteinistr}{DeleteINStr}. \c WriteINIStr $TEMP\something.ini test test test \c FlushINI $TEMP\something.ini \c Delete $TEMP\something.ini \S2{readenvstr} ReadEnvStr \c user_var(output) name Reads from the environment string "name" and sets the value into the user variable $x. If there is an error reading the string, the user variable is set to empty, and the error flag is set. \c ReadEnvStr $0 WINDIR \c ReadEnvStr $1 TEMP \S2{readinistr} ReadINIStr \c user_var(output) ini_filename section_name entry_name Reads from entry_name in [section_name] of ini_filename and stores the value into user variable $x. The error flag will be set and $x will be assigned to an empty string if the entry is not found. \c ReadINIStr $0 $INSTDIR\winamp.ini winamp outname \S2{readregdword} ReadRegDWORD \c user_var(output) root_key sub_key name Reads a 32-bit DWORD from the registry into the user variable $x. Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. The error flag will be set and $x will be set to an empty string ("" which is interpreted as 0 in math operations) if the DWORD is not present. If the value is present, but is not a DWORD, it will be read as a string and the error flag will be set. \c ReadRegDWORD $0 HKLM Software\NSIS VersionBuild \S2{readregstr} ReadRegStr \c user_var(output) root_key sub_key name Reads from the registry into the user variable $x. Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. The error flag will be set and $x will be set to an empty string ("") if the string is not present. If the value is present, but is of type REG_DWORD, it will be read and converted to a string and the error flag will be set. \c ReadRegStr $0 HKLM Software\NSIS "" \c DetailPrint "NSIS is installed at: $0" \S2{writeinistr} WriteINIStr \c ini_filename section_name entry_name value Writes entry_name=value into [section_name] of ini_filename. The error flag is set if the string could not be written to the ini file. \c WriteINIStr $TEMP\something.ini section1 something 123 \c WriteINIStr $TEMP\something.ini section1 somethingelse 1234 \c WriteINIStr $TEMP\something.ini section2 nsis true \S2{writeregbin} WriteRegBin \c root_key subkey key_name valuedata This command writes a block of binary data to the registry. Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. Valuedata is in hexadecimal (e.g. DEADBEEF01223211151). The error flag is set if the binary data could not be written to the registry. If the registry key doesn't exist it will be created. \c WriteRegBin HKLM "Software\My Company\My Software" "Binary Value" DEADBEEF01223211151 \S2{writeregnone} WriteRegNone \c root_key subkey key_name Writes a value without data to the registry. \S2{writeregdword} WriteRegDWORD \c root_key subkey key_name value This command writes a DWORD (32-bit integer) to the registry (a user variable can be specified). Valid values for root_key are listed under \R{writeregstr}{WriteRegStr}. The error flag is set if the dword could not be written to the registry. If the registry key doesn't exist it will be created. \c WriteRegDWORD HKLM "Software\My Company\My Software" "DWORD Value" 0xDEADBEEF \S2{writeregstr} WriteRegStr \c root_key subkey key_name value Write a string to the registry. See \R{writeregexpandstr}{WriteRegExpandStr} for more details. \c WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef" \S2{writeregexpandstr} WriteRegExpandStr \c root_key subkey key_name value Write a string to the registry. \e{root_key} must be one of: \b \e{HKCR} or \e{HKEY_CLASSES_ROOT} \b \e{HKLM} or \e{HKEY_LOCAL_MACHINE} \b \e{HKCU} or \e{HKEY_CURRENT_USER} \b \e{HKU} or \e{HKEY_USERS} \b \e{HKCC} or \e{HKEY_CURRENT_CONFIG} \b \e{HKDD} or \e{HKEY_DYN_DATA} \b \e{HKPD} or \e{HKEY_PERFORMANCE_DATA} \b \e{SHCTX} or \e{SHELL_CONTEXT} \b \e{HKCR32} or \e{HKCR64} \b \e{HKCU32} or \e{HKCU64} \b \e{HKLM32} or \e{HKLM64} If \e{root_key} is \e{SHCTX} or \e{SHELL_CONTEXT}, it will be replaced with \e{HKLM} if \R{setshellvarcontext}{SetShellVarContext} is set to \e{all} and with \e{HKCU} if \R{setshellvarcontext}{SetShellVarContext} is set to \e{current}. The error flag is set if the string could not be written to the registry. The type of the string will be REG_SZ for \R{writeregstr}{WriteRegStr}, or REG_EXPAND_STR for \R{writeregexpandstr}{WriteRegExpandStr}. If the registry key doesn't exist it will be created. \c WriteRegExpandStr HKLM "Software\My Company\My Software" "Expand String Value" "%WINDIR%\notepad.exe" \S2{writeregmultistr} WriteRegMultiStr \c /REGEDIT5 root_key subkey key_name value Writes a multi-string value. The /REGEDIT5 switch must be used and specifies that the data is in the hex format used by .reg files on Windows 2000 and later. \c WriteRegMultiStr /REGEDIT5 HKCU "Software\NSIS\Test" "Multi Value" 66,00,6f,00,6f,00,00,00,62,00,61,00,72,00,00,00,00,00 \S2{setregview} SetRegView \c 32|64|\\default\\|lastused Sets the registry view affected by \R{registry}{registry commands} (root keys with a 32/64 suffix are not affected). On 64-bit versions of Windows there are two views; one for 32-bit applications and one for 64-bit applications. By default, 32-bit applications running on 64-bit systems (WOW64) only have access to the 32-bit view. Using \c{SetRegView 64} allows the installer to access keys in the 64-bit view of the registry. Registry operations will fail if the selected view is not supported by Windows. Affects \R{deleteregkey}{DeleteRegKey}, \R{deleteregvalue}{DeleteRegValue}, \R{enumregkey}{EnumRegKey}, \R{enumregvalue}{EnumRegValue}, \R{readregdword}{ReadRegDWORD}, \R{readregstr}{ReadRegStr}, \R{writeregbin}{WriteRegBin}, \R{writeregdword}{WriteRegDWORD}, \R{writeregstr}{WriteRegStr} and \R{writeregexpandstr}{WriteRegExpandStr}. Does not affect \R{ainstalldirregkey}{InstallDirRegKey}. Instead, the registry must be read using \R{readregstr}{ReadRegStr} in \R{oninit}{.onInit}. \c SetRegView 32 \c ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir \c DetailPrint $0 # prints C:\Program Files (x86) \c !include x64.nsh \c ${If} ${RunningX64} \c SetRegView 64 \c ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir \c DetailPrint $0 # prints C:\Program Files \c ${EndIf} \c SetRegView Default nsis-3.11/Docs/src/script.but000077500000000000000000000072461477201124000161230ustar00rootroot00000000000000\C{scriptref} Scripting Reference \H{fileformat} Script File Format A NSIS Script File (.nsi) is just a text file with script code. \\Commands\\ Commands lines are in the format 'command [parameters]' \c File "myfile" \\Comments\\ Lines beginning with ; or # are comments. You can put comments after commands. You can also use C-style comments to comment one or more lines. \c ; Comment \c # Comment \c \c # Comment \ \c Another comment line (see `Long commands` section below) \c \c /* \c Comment \c Comment \c */ \c \c Name /* comment */ mysetup \c \c File "myfile" ; Comment If you want a parameter to start with ; or # put it in quotes. If the first or second line in the file is a \#{pep263}comment with the following format, the rest of the file is decoded using the specified character set. \c # -*- coding: utf-8 -*- \\Plug-ins\\ To call a plug-in, use 'plugin::command [parameters]'. For more info see \R{plugindlls}{Plug-in DLLs}. \c nsExec::Exec "myfile" \\Numbers\\ For parameters that are treated as numbers, use decimal (the number) or hexadecimal (with 0x prepended to it, i.e. 0x12345AB), or octal (numbers beginning with a 0 and no x). Colors should be set in hexadecimal RGB format, like HTML but without the #. \c IntCmp 1 0x1 lbl_equal \c \c SetCtlColors $HWND CCCCCC \\Strings\\ To represent strings that have spaces, use quotes: \c MessageBox MB_OK "Hi there!" Quotes only have the property of containing a parameter if they surround the rest of the parameter. They can be either single quotes, double quotes, or the backward single quote. You can escape quotes using $\\: \c MessageBox MB_OK "I'll be happy" ; this one puts a ' inside a string \c MessageBox MB_OK 'And he said to me "Hi there!"' ; this one puts a " inside a string \c MessageBox MB_OK `And he said to me "I'll be happy!"` ; this one puts both ' and "s inside a string \c MessageBox MB_OK "$\"A quote from a wise man$\" said the wise man" ; this one shows escaping of quotes It is also possible to put newlines, tabs etc. in a string using $\\r, $\\n, $\\t etc. \R{varstrings}{More information...} \\Variables\\ Variables start with $. User variables must be declared. \c Var MYVAR \c \c StrCpy $MYVAR "myvalue" \R{variables}{More information...} \\Long commands\\ To extend a command over multiple lines, use a backslash (\\) at the end of the line. The next line will effectively be concatenated to the end of it. For example: \c CreateShortcut "$SMPROGRAMS\NSIS\ZIP2EXE project workspace.lnk" \ \c "$INSTDIR\source\zip2exe\zip2exe.dsw" \c \c MessageBox MB_YESNO|MB_ICONQUESTION \ \c "Do you want to remove all files in the folder? \ \c (If you have anything you created that you want \ \c to keep, click No)" \ \c IDNO NoRemoveLabel Line extension for long commands works for comments as well. It can be a bit confusing, so it should be avoided. \c # A comment \ \c still a comment here... \\Compiler Commands\\ Compiler commands start with a ! and are executed at compile time. \c !define MESSAGE "Hello" \c \c !ifdef MESSAGE \c MessageBox MB_OK "${MESSAGE}" \c !else \c !error "MESSAGE not defined, cannot continue!" \c !endif \R{comptime}{More information...} \\Configuration file\\ If a file named "nsisconf.nsh" in the config directory exists, it will be included by default before any scripts (unless the /NOCONFIG command line parameter is used). The config directory on Windows is the same directory as makensis.exe is in. On other platforms this is set at install time and defaults to $PREFIX/etc/. You can alter this at runtime, see \k{usageenvironment} for more information. nsis-3.11/Docs/src/sec.but000077500000000000000000000156721477201124000153730ustar00rootroot00000000000000\S1{secmanage} Section Management \S2{sectionsetflags} SectionSetFlags \c section_index section_flags Sets the section's flags. The flag is a 32-bit integer. The first bit (lowest) represents whether the section is currently selected, the second bit represents whether the section is a section group (don't modify this unless you really know what you are doing), the third bit represents whether the section is a section group end (again, don't modify), the fourth bit represents whether the section is shown in bold or not, the fifth bit represents whether the section is read-only, the sixth bit represents whether the section group is to be automatically expanded, the seventh bit is set for section groups which are partially selected, the eighth bit is internally used for partially selected section group toggling and the ninth bit is used for reflecting section name changes. The error flag will be set if an out of range section is specified. Each flag has a name, prefixed with `SF_`: \c !define SF_SELECTED 1 \c !define SF_SECGRP 2 \c !define SF_SECGRPEND 4 \c !define SF_BOLD 8 \c !define SF_RO 16 \c !define SF_EXPAND 32 \c !define SF_PSELECTED 64 For an example of usage please see the \L{../Examples/one-section.nsi}{one-section.nsi} example. For more useful macros and definitions, see Include\\Sections.nsh. \c Section test test_section_id \c SectionEnd \c \c Function .onInit \c # set section 'test' as selected and read-only \c IntOp $0 ${SF_SELECTED} | ${SF_RO} \c SectionSetFlags ${test_section_id} $0 \c FunctionEnd \S2{sectiongetflags} SectionGetFlags \c section_index user_var(output) Retrieves the section's flags. See SectionSetFlags for a description of the flags. The error flag will be set if an out of range section is specified. \c Section test test_section_id \c SectionEnd \c \c Function .onSelChange \c # keep section 'test' selected \c SectionGetFlags ${test_section_id} $0 \c IntOp $0 $0 | ${SF_SELECTED} \c SectionSetFlags ${test_section_id} $0 \c FunctionEnd \S2{sectionsettext} SectionSetText \c section_index section_text Sets the description for the section section_index. If the text is set to "" then the section will be hidden. The error flag will be set if an out of range section is specified. \c Section "" test_section_id \c SectionEnd \c \c Function .onInit \c # change section's name to $WINDIR \c SectionSetText ${test_section_id} $WINDIR \c FunctionEnd \S2{sectiongettext} SectionGetText \c section_index user_var(output) Stores the text description of the section section_index into the output. If the section is hidden, stores an empty string. The error flag will be set if an out of range section is specified. \c Section test test_section_id \c SectionEnd \c \c Function .onInit \c # append $WINDIR to section's name \c SectionGetText ${test_section_id} $0 \c StrCpy $0 "$0 - $WINDIR" \c SectionSetText ${test_section_id} $0 \c FunctionEnd \S2{sectionsetinsttypes} SectionSetInstTypes \c section_index inst_types Sets the install types the section specified by section_index defaults to the enabled state in. Note that the section index starts with zero. Every bit of inst_types is a flag that tells if the section is in that install type or not. For example, if you have 3 install types and you want the first section to be included in install types 1 and 3, then the command should look like this: \c SectionSetInstTypes 0 5 because the binary value for 5 is "...00101". The error flag will be set if the section index specified is out of range. \c Section test test_section_id \c SectionEnd \c \c Function .onInit \c # associate section 'test' with installation types 3 and 4 \c SectionSetInstTypes ${test_section_id} 12 \c FunctionEnd \S2{sectiongetinsttypes} SectionGetInstTypes \c section_index user_var(output) Retrieves the install types flags array of a section. See above explanation about \R{sectionsetinsttypes}{SectionSetInstTypes} for a description of how to deal with the output. The error flag will be set if the section index is out of range. \c Section test test_section_id \c SectionEnd \c \c Function .onInit \c # associate section 'test' with installation types 5, on top of its existing associations \c SectionGetInstTypes ${test_section_id} $0 \c IntOp $0 $0 | 16 \c SectionSetInstTypes ${test_section_id} $0 \c FunctionEnd \S2{ssectionsetsize} SectionSetSize \c section_index new_size Sets the size of the section specified by section_index. Note that the index starts with zero. The Value for Size must be entered in KiloByte and supports only whole numbers. \c Section test test_section_id \c SectionEnd \c \c Function .onInit \c # set required size of section 'test' to 100 bytes \c SectionSetSize ${test_section_id} 100 \c FunctionEnd \S2{ssectiongetsize} SectionGetSize \c section_index user_var Gets the size of the section specified by section_index and stores the value in the given user variable. Note that the index starts with zero. The error flag will be set if the section index is out of range. \c Section test test_section_id \c SectionEnd \c \c Function .onInit \c # increase required size of section 'test' by 100 KiB \c SectionGetSize ${test_section_id} $0 \c IntOp $0 $0 + 100 \c SectionSetSize ${test_section_id} $0 \c FunctionEnd \S2{ssetcurinsttype} SetCurInstType \c inst_type_idx Sets the current \R{ainsttype}{InstType}. inst_type_idx should be between 0 and 31. The error flag is \s{not} set if an out of range \R{ainsttype}{InstType} was used. \S2{sgetcurinsttype} GetCurInstType \c user_var Get the current \R{ainsttype}{InstType} and stores it in user_var. If the first install type is selected, 0 will be put in user_var. If the second install type is selected, 1 will be put in user_var, and so on. The value of $\{NSIS_MAX_INST_TYPES\} (32 by default) means that the user selected a custom set of sections (Simply selecting "Custom" in the drop-down menu is not enough to trigger this, the value is calculated by the sections actually selected). \S2{sinsttypesettext} InstTypeSetText \c inst_type_idx text Sets the text of the specified \R{ainsttype}{InstType}. If the text is empty then the \R{ainsttype}{InstType} is removed. By using a previously unused inst_type_idx number you can create new InstTypes. To add/remove Sections to this new \R{ainsttype}{InstType} see \R{sectionsetinsttypes}{SectionSetInstTypes}. Unlike \R{ssectionin}{SectionIn} the index is zero based, which means the first install type's index is 0. \c InstType a \c InstType b \c \c Function .onInit \c # set first installation type's name to $WINDIR \c InstTypeSetText 0 $WINDIR \c # set second installation type's name to $TEMP \c InstTypeSetText 1 $TEMP \c FunctionEnd \S2{sinsttypegettext} InstTypeGetText \c inst_type_idx user_var Gets the text of the specified \R{ainsttype}{InstType}. \c InstType a \c InstType b \c \c Function .onInit \c InstTypeGetText 0 $0 \c DetailPrint $0 # prints 'a' \c InstTypeGetText 1 $0 \c DetailPrint $0 # prints 'b' \c FunctionEnd nsis-3.11/Docs/src/sections.but000077500000000000000000000101331477201124000164330ustar00rootroot00000000000000\H{sections} Sections Each NSIS installer contains one or more sections. Each of these sections are created, modified, and ended with the following commands. \b Each section contains zero or more instructions. \b Sections are executed in order by the resulting installer, and if a component page is used, the user will have the option of disabling/enabling each visible section. \b If a section's name is 'Uninstall' or is prefixed with 'un.', it's an uninstaller section. \S1{ssectioncommands} Section Commands \S2{saddsize} AddSize \c size_kb Tells the installer that the current section needs an additional "size_kb" kilobytes of disk space. Only valid within a section (will have no effect outside of a section or in a function). \c Section \c AddSize 500 \c SectionEnd \S2{ssection} Section \c [/o] [([!]|[-])section_name] [section_index_output] Begins and opens a new section. If section_name is empty, omitted, or begins with a -, then it is a hidden section and the user will not have the option of disabling it. If the section name is 'Uninstall' or is prefixed with 'un.', then it is a an uninstaller section. If \e{section_index_output} is specified, the parameter will be \R{define}{!defined} with the section index (can be used with \R{sectionsettext}{SectionSetText} etc). If the section name begins with a !, the section will be displayed as bold. If the /o switch is specified, the section will be unselected by default. \c Section "-hidden section" \c SectionEnd \c \c Section # hidden section \c SectionEnd \c \c Section "!bold section" \c SectionEnd \c \c Section /o "optional" \c SectionEnd \c \c Section "install something" SEC_IDX \c SectionEnd To access the section index, curly brackets must be used and the code must be located below the section in the script. \c Section test1 sec1_id \c SectionEnd \c \c Section test2 sec2_id \c SectionEnd \c \c Function .onInit \c SectionGetText ${sec2_id} $0 \c MessageBox MB_OK "name of ${sec2_id}:$\n$0" # will correctly display 'name of 1: test2' \c FunctionEnd \c Function .onInit \c SectionGetText ${sec2_id} $0 \c MessageBox MB_OK "name of ${sec2_id}:$\n$0" # will incorrectly display 'name of ${sec2_id}: test1' \c # plus a warning stating: \c # unknown variable/constant "{sec2_id}" detected, ignoring \c FunctionEnd \c \c Section test1 sec1_id \c SectionEnd \c \c Section test2 sec2_id \c SectionEnd \S2{ssectionend} SectionEnd This command closes the current open section. \S2{ssectioninsttype} SectionInstType \c insttype_index [insttype_index [...]] [RO] This command specifies which install types (see \R{ainsttype}{InstType}) the current section defaults to the enabled state in. Multiple \cw{SectionInstType} commands can be specified (they are combined). If you specify RO as a parameter, then the section will be read-only, meaning the user won't be able to change its state. \c InstType "Full" IT_FULL \c InstType "Minimal" IT_MIN \c \c Section "Help" \c SectionInstType ${IT_FULL} ${IT_MIN} \c SectionEnd \c \c Section "Bonus content" \c SectionInstType ${IT_FULL} \c SectionEnd \S2{ssectionin} SectionIn \c insttype_index [insttype_index [...]] [RO] Works like \cw{SectionInstType} except that the first install type defined using \R{ainsttype}{InstType} is indexed 1, the next 2 and so on. \# DEPRECATED \S2{ssectiongroup} SectionGroup \c [/e] section_group_name [index_output] This command inserts a section group. The section group must be closed with \R{ssectiongroupend}{SectionGroupEnd}, and should contain 1 or more sections. If the section group name begins with a !, its name will be displayed with a bold font. If /e is present, the section group will be expanded by default. If \e{index_output} is specified, the parameter will be !defined with the section index (can be used with \R{sectionsettext}{SectionSetText} etc). If the name is prefixed with 'un.' the section group is an uninstaller section group. \c SectionGroup "some stuff" \c Section "a section" \c SectionEnd \c Section "another section" \c SectionEnd \c SectionGroupEnd \S2{ssectiongroupend} SectionGroupEnd Closes a section group opened with \R{ssectiongroup}{SectionGroup}. nsis-3.11/Docs/src/silent.but000077500000000000000000000062451477201124000161130ustar00rootroot00000000000000\S0{silent} Silent Installers/Uninstallers Silent installers are installers which require no user intervention and have no user interface. The user doesn't see any dialog and isn't asked any questions. This is useful for network administrators who wish to install or uninstall something without user intervention so they can perform the operation quickly over any number of computers. It is also useful for other developers who wish to embed another installer in their own and collect all of the required information on their installer instead of showing two installers. NSIS installers and uninstallers can be both silent and not silent. When an installer or an uninstaller is silent, not all callback functions are called. \R{onguiinit}{.onGUIInit}, \R{onguiend}{.onGUIEnd}, their uninstaller equivalents and any callback related to a specific page or page type will not be called. There are several methods to make an installer or an uninstaller silent: \n \R{asilentinstall}{SilentInstall} and \R{asilentuninstall}{SilentUninstall} \n \R{setsilent}{SetSilent} \n Passing /S on the command line (case sensitive) To check if the installer/uninstaller is silent use \R{ifsilent}{IfSilent}. To make sure your installer will be silent when it needs to, you should check with \R{ifsilent}{IfSilent} before each command that might require user intervention or create a window. The \R{messagebox}{MessageBox} command, which is the most common culprit in silent installers, has the /SD switch to set a default answer for silent installers. If you want your installer/uninstaller to be able to be completely silent you should use this switch. All internal NSIS message boxes have defaults for silent installers. The \L{../Examples/silent.nsi}{silent.nsi example} demonstrates all aspects of this topic. Since the directory page is not shown in silent installers the user has an option to specify the installation directory on the command line (this also works on non-silent installers/uninstallers). To do that, the user uses the /D switch as in the following example: \c foo.exe /S /D=C:\Program Files\Foo If your installer/uninstaller requires some more information that can not be gathered when silent, you can allow the user to specify that information on the command line and process it in .onInit. You can use \R{getoptions}{GetOptions}. \c !include FileFunc.nsh \c !insertmacro GetParameters \c !insertmacro GetOptions \c \c Function .onInit \c ${GetParameters} $R0 \c ClearErrors \c ${GetOptions} $R0 /USERNAME= $0 \c FunctionEnd The above example will copy the value the user passes on after /USERNAME= into $0. This allows the user to specify the required information on the command line instead of using the interactive user interface. The user can use: \c foo.exe /S /USERNAME=Bar /D=C:\Program Files\Foo or: \c foo.exe /S /USERNAME=string with spaces /D=C:\Program Files\Foo or: \c foo.exe /S /USERNAME="string with spaces" /D=C:\Program Files\Foo If your installer/uninstaller requires a lot of information and you want it to be able to be silent, you should allow the user to pass on a path to an answers file. This would be much more comfortable than writing all of the information on the command line.nsis-3.11/Docs/src/stack.but000077500000000000000000000024341477201124000157160ustar00rootroot00000000000000\S1{stackinst} Stack Support The stack is a temporary storage area useful for saving the state of registers/variables and for communicating with functions and plug-ins. See \W{https://en.wikipedia.org/wiki/Stack_(abstract_data_type)}{Wikipedia} for a general introduction to stacks. \S2{Exch} Exch \c [user_var | stack_index] When no parameter is specified, exchanges the top two elements of the stack. When a parameter is specified and is a user variable, exchanges the top element of the stack with the parameter. When a parameter is specified and is a positive integer, \R{Exch}{Exch} will swap the item on the top of the stack with the item that is specified by the offset from the top of the stack in the parameter. If there are not enough items on the stack to accomplish the exchange, a fatal error will occur (to help you debug your code :). \c Push 1 \c Push 2 \c Exch \c Pop $0 # = 1 \c Push 1 \c Push 2 \c Push 3 \c Exch 2 \c Pop $0 # = 1 \c StrCpy $0 1 \c Push 2 \c Exch $0 # = 2 \c Pop $1 # = 1 \S2{Pop} Pop \c user_var(out) Pops a string off of the stack into user variable $x. If the stack is empty, the error flag will be set. \c Push 1 \c Pop $0 # = 1 \S2{Push} Push \c string Pushes a string onto the stack. The string can then be Pop'ed off of the stack. \c Push "a string" nsis-3.11/Docs/src/string.but000077500000000000000000000017331477201124000161200ustar00rootroot00000000000000\S1{stringinst} String Manipulation Instructions \S2{StrCpy} StrCpy \c user_var(destination) str [maxlen] [start_offset] Sets the user variable $x with str. str can contain variables (including the user variable being set (concatenating strings this way is possible, etc)). If maxlen is specified, the string will be a maximum of maxlen characters (if maxlen is negative, the string will be truncated abs(maxlen) characters from the end). If start_offset is specified, the source is offset by it (if start_offset is negative, it will start abs(start_offset) from the end of the string). \c StrCpy $0 "a string" # = "a string" \c StrCpy $0 "a string" 3 # = "a s" \c StrCpy $0 "a string" -1 # = "a strin" \c StrCpy $0 "a string" "" 2 # = "string" \c StrCpy $0 "a string" "" -3 # = "ing" \c StrCpy $0 "a string" 3 -4 # = "rin" \c StrCpy $0 "$0$0" # = "rinrin" \S2{StrLen} StrLen \c user_var(length output) str Sets user variable $x to the length of str. \c StrLen $0 "123456" # = 6 nsis-3.11/Docs/src/tutorial.but000077500000000000000000000457271477201124000164700ustar00rootroot00000000000000\C{tutorial} Tutorial: The Basics \H{tutintro} Introduction Most software packages you download or buy come with an installer. The installer copies and/or updates files, writes registry keys, writes configuration, creates shortcuts, etc. All of this is done automatically for the user. All the user needs to do is supply some information and the installer will do the rest. The user goes through a wizard, makes the appropriate choices and waits until the installer finishes. After the installer has finished the user is left only with the simple task of starting the program. The user doesn't have to worry about things he might have forgotten because all of the necessary steps were done by the installer. NSIS is a tool for developers to create such installers. NSIS allows you to create everything from basic installers that just copies files to very complex installers that handle a lot of advanced tasks such as writing registry keys, settings environment variables, downloading the latest files from the internet, customizing configuration files and more. NSIS is very flexible and its scripting language is easy to learn. NSIS compiles all of the files and the installation script into one executable file so your application will be easy to distribute. NSIS adds only about 34KB of code of its own (for the default configuration) to the data. NSIS boasts the smallest overhead available while still providing a lot of options thanks to its powerful scripting language and support of external plug-ins. \H{tutscriptfiles} Script Files To create a NSIS installer you first have to write a NSIS script. A NSIS script is just a regular text file with a special syntax. You can edit scripts with any text editor. It's recommended to use a text editor that shows line numbers because NSIS uses line numbers to indicate where errors lie, and to warn you about where errors might lie. An editor that supports syntax highlighting is also recommended. You can download editors made especially for NSIS and files for syntax highlighting from the \W{http://nsis.sf.net/}{NSIS Wiki}. In a NSIS script every line is treated as a command. If your command is too long for one line you can use a back-slash - '\\' - at the end of the line. The compiler will treat the new line as an addition to the previous line and will not expect a new command. For example: \c Messagebox MB_OK|MB_ICONINFORMATION \ \c "This is a sample that shows how to use line breaks for larger commands in NSIS scripts" If you want to use a double-quote in a string you can either use $\\\\" to escape the quote or quote the string with a different type of quote such as ` or '. For more details about the script format, see \R{fileformat}{Script File Format}. The default extension for a script file is .nsi. Header files have the .nsh extension. Header files can help you arrange your script by dividing it to more than one block of code, you can also put functions or macros in header files and include the header files in multiple installers. This makes updating easier and it also makes your scripts easier to read. To include a header file in your script use \R{include}{!include}. Header files that reside in the Include directory under your NSIS directory can be included just by their name. For example: \c !include Sections.nsh \H{tutstructure} Scripting structure A NSIS script contains Installer Attributes, Pages and Sections/Functions. You can also use Compiler Commands for compile-time operations. The \R{aoutfile}{OutFile} instruction is required and tells NSIS where to write the installer, you also need at least one section. \S1{installerattributes} Installer Attributes Installer Attributes determine the behavior and the look and feel of your installer. With these attributes you can change texts that will be shown during the installation, the number of installation types etc. Most of these commands can only be set and are not changeable during runtime. Other basic instructions are \R{aname}{Name} and \R{ainstalldir}{InstallDir}. For more information about installer attributes, have a look at \R{instattribs}{Installer Attributes}. \S1{tut-pages} Pages A non-silent installer has a set of wizard pages to let the user configure the installer. You can set which pages to display using the \R{page}{Page} command (or \R{pageex}{PageEx} for more advanced settings). A typical set of pages looks like this: \c Page license \c Page components \c Page directory \c Page instfiles \c UninstPage uninstConfirm \c UninstPage instfiles For the installer, this typical set of pages will display a license agreement, allow selection of components to install, allow selection of an installation directory, and finally install the selected components in the instfiles page. For the uninstaller, it will display a confirmation page, and uninstall in the instfiles page. \S1{tut-sections} Sections It's common for installers to have several things the user can install. For example in the NSIS distribution installer you can choose to install additional tools, plug-ins, examples and more. Each of these components has its own piece of code. If the user selects to install this component then the installer will execute that code. In the script, that code is defined in sections. Each section corresponds to one component on the components page. The section's name is the displayed component name and the section code will be executed if that component is selected. It is possible to build your installer with only one section but if you want to use the components page and let the user choose what to install, you'll have to use more than one section. Uninstallers can also have multiple sections. Uninstaller section names are prefixed with 'un.'. For example: \c Section "Installer Section" \c SectionEnd \c \c Section "un.Uninstaller Section" \c SectionEnd The instructions that can be used in sections are very different from the installer attributes instructions, they are executed at runtime on the user's computer. Those instructions can extract files, read from and write to the registry, INI files or normal files, create directories, create shortcuts and a lot more. You can find out more in \R{instr}{Instructions}. The most basic instructions are \R{setoutpath}{SetOutPath} which tells the installer where to extract files and \R{file}{File} which extracts files. Example: \c Section "My Program" \c SetOutPath $INSTDIR \c File "My Program.exe" \c File "Readme.txt" \c SectionEnd For more information about sections see \R{sections}{Sections}. \S1{tut-functions} Functions Functions can contain script code, just like sections. The difference between sections and functions is the way they are called. There are two types of functions, user functions and callback functions. User functions are called by the user from within sections or other functions using the \R{call}{Call} instruction. User functions will not execute unless you call them. After the code in the function has executed the installer will continue executing the instructions that came after the \R{call}{Call} instruction, unless you have aborted the installation inside the function. User functions are very useful if you have a set of instructions that need to be executed at several locations in the installers. If you put the code into a function you can save the copying time and you can maintain the code more easily. Callback functions are called by the installer upon certain defined events such as when the installer starts. Callbacks are optional. If for example you want to welcome the user to your installer you can define a function called .onInit. The NSIS compiler will recognize this function as a callback function by the name and will call it when the installer starts. \c Function .onInit \c MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo \c Abort \c gogogo: \c FunctionEnd \R{abort}{Abort} has a special meaning in callback functions. Each callback function has its own meaning for it, have a look at \R{callbacks}{Callback Functions} for more information. In the above example \R{abort}{Abort} tells the installer to stop initializing the installer and quit immediately. For more information about functions see \R{functions}{Functions}. \S1{tut-working-with-scripts} Working with Scripts \S2{tut-logic} Logical Code Structures Conditionally executing code, or executing code in a loop can be done using \R{strcmp}{StrCmp}, \R{intcmp}{IntCmp}, \R{iferrors}{IfErrors}, \R{goto}{Goto} and more. However, there's a much easier way do this. The LogicLib provides some very simple macros that allow easy construction of complex logical structures. Its syntax, explained in \L{../Include/LogicLib.nsh}{LogicLib.nsh}, is similar to other programming languages and can prove to be simpler for beginners and advanced users alike. For example, checking a value of a variable without the LogicLib can be done as follows. \c StrCmp $0 'some value' 0 +3 \c MessageBox MB_OK '$$0 is some value' \c Goto done \c StrCmp $0 'some other value' 0 +3 \c MessageBox MB_OK '$$0 is some other value' \c Goto done \c # else \c MessageBox MB_OK '$$0 is "$0"' \c done: However, with the LogicLib the code is much more readable and easy to understand, as can be seen in the following example. \c ${If} $0 == 'some value' \c MessageBox MB_OK '$$0 is some value' \c ${ElseIf} $0 == 'some other value' \c MessageBox MB_OK '$$0 is some other value' \c ${Else} \c MessageBox MB_OK '$$0 is "$0"' \c ${EndIf} The same can also be done using a switch, as shown in the following example. \c ${Switch} $0 \c ${Case} 'some value' \c MessageBox MB_OK '$$0 is some value' \c ${Break} \c ${Case} 'some other value' \c MessageBox MB_OK '$$0 is some other value' \c ${Break} \c ${Default} \c MessageBox MB_OK '$$0 is "$0"' \c ${Break} \c ${EndSwitch} Multiple conditions are also supported. The following example will notify the user, if both $0 and $1 are empty. \c ${If} $0 == '' \c ${AndIf} $1 == '' \c MessageBox MB_OK|MB_ICONSTOP 'both are empty!' \c ${EndIf} The LogicLib removes the need for labels and relative jumps, thus prevents label name conflicts, and removes the need to manually adjust relative jump offsets every time the script is changed. It also simplifies looping by supporting the common while, do and for loops. All of the following examples count to five using the LogicLib. \c StrCpy $R1 0 \c ${While} $R1 < 5 \c IntOp $R1 $R1 + 1 \c DetailPrint $R1 \c ${EndWhile} \c ${For} $R1 1 5 \c DetailPrint $R1 \c ${Next} \c StrCpy $R1 0 \c ${Do} \c IntOp $R1 $R1 + 1 \c DetailPrint $R1 \c ${LoopUntil} $R1 >= 5 To use the LogicLib the following line needs to be added near the top of the script. \c !include LogicLib.nsh More examples can be found in \L{../Examples/LogicLib.nsi}{LogicLib.nsi}. \S2{tutVariables} Variables You can declare your own variables ($VARNAME) with the \R{var}{Var} command. Variables are global and can be used in any \R{ssection}{Section} or \R{ffunction}{Function}. Declaring and using a user variable: \c Var BLA ;Declare the variable \c \c Section bla \c \c StrCpy $BLA "123" ;Now you can use the variable $BLA \c \c SectionEnd In addition there is a stack, which can also be used for temporary storage. To access the stack use the commands \R{Push}{Push} and \R{Pop}{Pop}. \R{Push}{Push} adds a value to the stack, \R{Pop}{Pop} removes one and sets the variable. For shared code, there are \R{varother}{20 registers available} (like $0 and $R0). These static variables don't have to be declared and you won't get any name conflicts. If you want to use these variables in shared code, store the original values on the stack and restore the original values afterwards. After calling the function, the variables contain the same value as before. Note the order when using multiple variables (last-in first-out): \c Function bla \c \c Push $R0 \c Push $R1 \c \c ...code... \c \c Pop $R1 \c Pop $R0 \c \c FunctionEnd \S2{tutdebug} Debugging Scripts The more you work with NSIS the more complex the scripts will become. This will increase the potential of mistakes, especially when dealing with lots of variables. There are a few possibilities to help you debugging the code. To display the contents of variables you should use \R{messagebox}{MessageBoxes} or \R{detailprint}{DetailPrint}. To get a brief overview about all variables you should use the plug-in \W{https://nsis.sourceforge.io/DumpState}{DumpState}. By default all actions of the Installer are printed out in the Log Window. You can access the log if you right-click in the Log Window and select "Copy Details To Clipboard". There is also a way to write it directly to a file, see \R{dumplogtofile}{here}. \S1{tutscriptexecution} Script Execution When a user runs an installer or uninstaller, pages are displayed in the order they were defined in the script. When the instfiles page is reached, sections, corresponding to the selected components, are executed in the order they were defined in the script. If the components page is not displayed, all sections are executed, assuming they were not unselected or somehow disabled by the script. Beside code in sections, there's also code in callback functions. If defined, they might be executed before the sections code. For example, the \R{oninit}{.onInit} callback function is executed before anything else in the script. There are also \R{pagecallbacks_explain}{page callback functions} which are executed at certain points of the page display process. \S1{compilercommands} Compiler Commands Compiler commands will be executed at compile time on your computer. They can be used for conditional compilation, to include header files, to execute applications, to change the working directory and more. The most common usage is defines. Defines are compile time constants. You can define your product's version number and use it in your script. For example: \c !define VERSION "1.0.3" \c Name "My Program ${VERSION}" \c OutFile "My Program Installer - ${VERSION}.exe" For more information about defines see \R{compdefines}{Conditional Compilation}. Another common use is macros. Macros are used to insert code at compile time, depending on defines and using the values of the defines. The macro's commands are inserted at compile time. This allows you to write a general code only once and use it a lot of times but with a few changes. For example: \c !macro MyFunc UN \c Function ${UN}MyFunc \c Call ${UN}DoRegStuff \c ReadRegStr $0 HKLM Software\MyProgram key \c DetailPrint $0 \c FunctionEnd \c !macroend \c \c !insertmacro MyFunc "" \c !insertmacro MyFunc "un." This macro helps you avoid writing the same code for both the installer and the uninstaller. The two !insertmacros insert two functions, one for the installer called MyFunc and one for the uninstaller called un.MyFunc and both do exactly the same thing. For more information see \R{comptime}{Compile Time Commands}. \H{tutcompiler} Compiler The second thing you need to do in order to create your installer after you have created your script is to compile your script. MakeNSIS.exe is the NSIS compiler. It reads your script, parses it and creates an installer for you. To compile you can right-click your .nsi file and select Compile NSIS Script. This will cause MakeNSISW, the NSIS Compiler Interface, to launch and call MakeNSIS to compile your script. MakeNSISW receives the output of MakeNSIS and presents it to you in a window where you can see it, copy it, test the installer and more. Using makensis.exe from the command prompt is also possible. The compiler will check your script and give you warnings or an error. If an error occurs (i.e. 2 parameters required but only 1 given) the compiler will abort and a short error message including the line number will be displayed. For non-critical errors the compiler will give a warning (i.e. two \R{adirtext}{DirText} commands in one script). If your script has no errors the compiler will output an installer for you to distribute. NSIS supports different compression methods, as explained \R{asetcompressor}{here}. ZLIB is the default compression method, which is fast and uses only a little bit of memory. LZMA is a good method for the creation of small installers for internet distribution. BZIP2 usually compresses better than ZLIB but not as good as LZMA, it is useful if you need lower memory usage or fast script compilation. It is also possible to compile Windows installers on Linux, BSD or Mac OS X servers. See \R{build}{Building NSIS} for details. \H{tutmodernui} Modern UI A popular user interface for NSIS is the Modern User Interface. It has an interface like the wizards of recent Windows versions. The Modern UI is not only a customized resource file, it has a lots of new interface elements. It features a white header to describe the current step, a description area on the component page, a welcome page, a finish page that allows the user to run the application or reboot the system and more. For more information, see the \L{../Docs/Modern UI 2/Readme.html}{Modern UI 2 Readme} and the \L{../Examples/Modern UI}{Modern UI Examples}. \H{tutplugin} Plug-ins NSIS support plug-ins that can be called from the script. Plug-ins are DLL files written in C, C++, Delphi or another programming language and therefore provide a more powerful code base to NSIS. A plug-in call looks like this: \c DLLName::FunctionName "parameter number 1" "parameter number 2" "parameter number 3" Every plug-in's function has its own requirements when it comes to parameters, some will require none, some will accept as many parameters as you want to send. Examples: \c nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP' \c Pop $0 ; Process exit code or "error" \c InstallOptions::dialog "$PLUGINSDIR\test.ini" \c Pop $0 ; success/back/cancel/error \c NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0 \c Pop $0 ; "success" or a error code The plug-ins that NSIS knows of are listed at the top of the compiler output (verbose level 4). NSIS searches for plug-ins in the \L{../Plugins/}{Plugins folder} under your NSIS directory and lists all of their available functions. You can use \R{addplugindir}{!addplugindir} to tell NSIS to search in other directories too. The NSIS distribution already includes many plug-ins. \L{../Docs/InstallOptions/Readme.html}{InstallOptions} is a popular plug-in that allows you to create custom pages, in combination with the NSIS Page commands (See \R{pages}{Pages}). The \L{../Docs/StartMenu/Readme.txt}{Startmenu plug-in} provides a page that allows the user to choose a Start Menu folder. There are a lot of plug-ins for different purposes, take a look in the \L{../Docs/}{Docs folder} for help files and examples. You can find additional plug-ins online: \W{http://nsis.sf.net/}{NSIS Wiki}. You can also create a plug-in yourself. C/C++ and Delphi header files are already available, see the \L{../Examples/Plugin/}{example plugin} for how to do this. Source code of included plug-ins can also be found in the source code package. \H{tutmore} More This tutorial has described the basic NSIS features, to learn more about everything NSIS can do, take some time to read the rest of this manual. nsis-3.11/Docs/src/ui.but000077500000000000000000000217571477201124000152370ustar00rootroot00000000000000\S1{ui} User Interface Instructions \S2{BringToFront} BringToFront Makes the installer window visible and brings it to the top of the window list. If an application was executed that shows itself in front of the installer, \R{BringToFront}{BringToFront} would bring the installer back in focus. Recent Windows versions restrict the setting of foreground windows. If the user is working with another application during installation, the user may be notified using a different method. \S2{createfont} CreateFont \c user_var(handle output) face_name [height] [weight] [/ITALIC] [/UNDERLINE] [/STRIKE] Creates a font and puts its handle into user_var. For more information about the different parameters have a look at \W{http://msdn.microsoft.com/en-us/library/dd183499}{MSDN's page about the Win32 API function CreateFont()}. You can get the current font used by NSIS using the ^Font and ^FontSize \R{langstring}{LangString}s. \c !include WinMessages.nsh \c GetDlgItem $0 $HWNDPARENT 1 \c CreateFont $1 "Times New Roman" "7" "700" /UNDERLINE \c SendMessage $0 ${WM_SETFONT} $1 1 \S2{detailprint} DetailPrint \c user_message Adds the string "user_message" to the details view of the installer. \c DetailPrint "this message will be shown in the installation window" \S2{enablewindow} EnableWindow \c hwnd state(1|0) Enables or disables mouse and keyboard input to the specified window or control. Possible states are 0 (disabled) or 1 (enabled). \c GetDlgItem $0 $HWNDPARENT 1 \c EnableWindow $0 0 \c Sleep 1000 \c EnableWindow $0 1 \S2{findwindow} FindWindow \c user_var(hwnd output) windowclass [windowtitle] [windowparent] [childafter] Searches for a window. Behaves like Win32's FindWindowEx(). Searches by windowclass (and/or windowtitle if specified). If windowparent or childafter are specified, the search will be restricted as such. If windowclass or windowtitle is specified as "", they will not be used for the search. If the window is not found the user variable is set to 0. \c FindWindow $1 "#32770" "" $HWNDPARENT # Finds the inner dialog \c FindWindow $2 "EDIT" "" $1 # Finds the first edit control in the inner dialog \S2{getdlgitem} GetDlgItem \c user_var(output) dialog item_id Retrieves the handle of a control identified by item_id in the specified dialog box dialog. If you want to get the handle of a control in the inner dialog, first use FindWindow to get the handle of the inner dialog. \c GetDlgItem $0 $HWNDPARENT 1 # next/install button \S2{hidewindow} HideWindow Hides the installer window. \S2{iswindow} IsWindow \c HWND jump_if_window [jump_if_not_window] If HWND is a window, Gotos jump_if_window, otherwise, Gotos jump_if_not_window (if specified). \c GetDlgItem $0 $HWNDPARENT 1 \c IsWindow $0 0 +3 \c MessageBox MB_OK "found a window" \c Goto +2 \c MessageBox MB_OK "no window" \S2{loadandsetimage} LoadAndSetImage \c [/EXERESOURCE] [/STRINGID] [/RESIZETOFIT[WIDTH|HEIGHT]] ctrl imagetype lrflags imageid [user_var(imagehandle)] Loads and sets a image on a static control. \cw{ctrl} is the handle of the control. \cw{imagetype} must 0 for bitmaps and 1 for icons (and the control style must match the image type). \cw{lrflags} should be 0x10 to load from a file or 0 to load from a resource. \cw{imageid} specifies the file path or resource name. Use \cw{/EXERESOURCE} to load a resource from the installer .EXE. Use \cw{/STRINGID} if \cw{imageid} is a string, otherwise it is interpreted as a number. Use \cw{/RESIZETOFIT[WIDTH|HEIGHT]} to resize the image to the dimensions of the control. \cw{imagehandle} can optionally receive the handle of the loaded image. Images loaded on individual pages should be destroyed to minimize resource leaks. If images are loaded into the same control multiple times, the previous image will only be destroyed if it is a bitmap image. Previous icons and 32-bit ARGB bitmaps must be retrieved with \cw{STM_GETIMAGE} and destroyed. \c LoadAndSetImage /EXERESOURCE $hIconStatic 1 0 103 \c LoadAndSetImage /STRINGID /RESIZETOFITWIDTH $hBmpStatic 0 0x10 "$PluginsDir\myimg.bmp" \S2{lockwindow} LockWindow \c on|off \e{LockWindow on} prevents the main window from redrawing itself upon changes. When \e{LockWindow off} is used, all controls that weren't redrawn since \e{LockWindow on} will be redrawn. This makes the pages flickering look nicer because now it flickers a group of controls at the same time, instead of one control at a time. The individual control flickering is more noticeable on old computers. \S2{sendmessage} SendMessage \c HWND msg wparam lparam [user_var(return value)] [/TIMEOUT=time_in_ms] Sends a message to HWND. If a user variable $x is specified as the last parameter (or one before the last if you use /TIMEOUT), the return value from SendMessage will be stored in it. Note that when specifying 'msg' you must just use the integer value of the message. Include WinMessages.nsh to have all Windows messages defined in your script. If you wish to send strings use "STR:a string" as wParam or lParam where needed. Use /TIMEOUT=time_in_ms to specify the duration, in milliseconds, of the time-out period. \c !include WinMessages.nsh \c FindWindow $0 "Winamp v1.x" \c SendMessage $0 ${WM_CLOSE} 0 0 \c \c GetDlgItem $1 $HWNDPARENT 2 \c SendMessage $1 ${WM_SETTEXT} 0 "STR:Goodbye" \S2{setautoclose} SetAutoClose \c true|false Overrides the default auto window-closing flag (specified for the installer using \R{aautoclosewindow}{AutoCloseWindow}, and false for the uninstaller). Specify 'true' to have the install window immediately disappear after the install has completed, or 'false' to make it require a manual close. \S2{setbrandingimage} SetBrandingImage \c [/IMGID=item_id_in_dialog] [/RESIZETOFIT] path_to_bitmap_file.bmp Sets the current bitmap file displayed as the branding image. If no IMGID is specified, the first image control found will be used, or the image control created by \R{aaddbrandingimage}{AddBrandingImage}. Note that this bitmap must be present on the user's machine. Use \cw{File} first to put it there. If /RESIZETOFIT is specified the image will be automatically resized (very poorly) to the image control size. If you used \R{aaddbrandingimage}{AddBrandingImage} you can get this size by compiling your script and watching for \R{aaddbrandingimage}{AddBrandingImage} output, it will tell you the size. SetBrandingImage will not work when called from .onInit! \S2{setdetailsview} SetDetailsView \c show|hide Shows or hides the details on the InstFiles page, depending on which parameter you pass. Overrides the default details view, which is set via \R{ashowinstdetails}{ShowInstDetails}. \S2{setdetailsprint} SetDetailsPrint \c none|listonly|textonly|both|lastused Sets mode at which commands print their status. None has commands be quiet, listonly has status text only added to the listbox, textonly has status text only printed to the status bar, and both enables both (the default). For extracting many small files, textonly is recommended (especially on Win9x with smooth scrolling enabled). \c SetDetailsPrint none \c File "secret file.dat" \c SetDetailsPrint both \S2{setctlcolors} SetCtlColors \c hwnd [/BRANDING] [text_color|SYSCLR:text_color_id] [transparent|bg_color|SYSCLR:bg_color_id] Sets the text and background color of a static control, edit control, button or a dialog. \e{text_color} and \e{bg_color} don't accept variables. Use \R{getdlgitem}{GetDlgItem} to get the handle (HWND) of the control. To make the control transparent specify \c{transparent} as the background color value. Prefix the color value with \cw{SYSCLR:} to specify a Windows \cw{COLOR_*} constant. You can also specify \cw{/BRANDING} with or without text color and background color to make the control completely gray (or any other color you choose). This is used by the branding text control in the MUI. \c Page Components "" CmpntPageShow \c Function CmpntPageShow \c FindWindow $1 "#32770" "" $HWNDPARENT \c GetDlgItem $0 $1 1006 \c SetCtlColors $0 0xFF0000 0x00FF00 ; Red on Green \c GetDlgItem $0 $1 1022 \c SetCtlColors $0 SYSCLR:23 SYSCLR:24 ; COLOR_INFOTEXT on COLOR_INFOBK \c FunctionEnd \NsisWarnBlockContainerBegin \NsisBlockHeaderWarning Setting the background color of check boxes to \c{transparent} may not function properly when using \c{\R{axpstyle}{XPStyle} on}. The background may be completely black instead of transparent when using certain Windows themes. The text color might also be ignored when Visual Styles are enabled. \NsisWarnBlockContainerEnd \S2{setsilent} SetSilent \c silent | normal Sets the installer to silent mode or normal mode. See \R{asilentinstall}{SilentInstall} for more information about silent installations. Can only be used in \R{oninit}{.onInit}. \S2{showwindow} ShowWindow \c hwnd show_state Sets the visibility of a window. Possible show_states are the same as the Windows \W{http://msdn2.microsoft.com/en-us/library/ms633548}{ShowWindow} function. SW_* constants are defined in \L{../Include/WinMessages.nsh}{Include\\WinMessages.nsh}. \c !include WinMessages.nsh \c GetDlgItem $0 $HWNDPARENT 1 \c ShowWindow $0 ${SW_HIDE} \c Sleep 1000 \c ShowWindow $0 ${SW_SHOW} nsis-3.11/Docs/src/uninstall.but000077500000000000000000000006511477201124000166210ustar00rootroot00000000000000\S1{uninst} Uninstaller Instructions \S2{writeuninstaller} WriteUninstaller \c [Path\]exename.exe Writes the uninstaller to the filename (and optionally path) specified. Only valid from within an install section or function and requires that you have an uninstall section in your script. You can call this one or more times to write out one or more copies of the uninstaller. \c WriteUninstaller $INSTDIR\uninstaller.exe nsis-3.11/Docs/src/usage.but000077500000000000000000000115261477201124000157170ustar00rootroot00000000000000\C{cmdlineusage} Command Line Usage \H{usage} MakeNSIS Usage NSIS installers are generated by using the 'MakeNSIS' program to compile a NSIS script (.NSI) into an installer executable. The NSIS development kit installer sets up your computer so that you can compile a .nsi file by simply right-clicking on it in Explorer and selecting 'compile'. If you want to use MakeNSIS on the command line, the syntax of makensis is: \c makensis [ option | script.nsi | - ] [...] \S1{usagereference} Options \b /LICENSE displays license information. \b The /V switch followed by a number between 0 and 4 will set the verbosity of output accordingly. 0=no output, 1=errors only, 2=warnings and errors, 3=info, warnings, and errors, 4=all output. \b The /P switch followed by a number between 0 and 5 will set the priority of the compiler process accordingly. 0=idle, 1=below normal, 2=normal (default), 3=above normal, 4=high, 5=realtime. \b The /O switch followed by a filename tells the compiler to print its log to that file (instead of the screen) \b /LAUNCH executes the generated installer. \b /PAUSE makes makensis pause before quitting, which is useful when executing directly from Windows. \b /NOCONFIG disables inclusion of nsisconf.nsh. Without this parameter, installer defaults are set from nsisconf.nsh. \b /CMDHELP prints basic usage information for command (if specified), or all commands (if command is not specified). \b /HDRINFO prints information about which options were used to compile makensis. \b /NOCD disables the current directory change to that of the .nsi file \b /INPUTCHARSET allows you to specify a specific codepage for files without a BOM. (\NsisInputCharset) \b /OUTPUTCHARSET allows you to specify the codepage used by stdout when the output is redirected. (\NsisOutputCharset) \b /PPO or /SAFEPPO will only run the preprocessor and print the result to stdout. The safe version will not execute instructions like !appendfile or !system. !packhdr and !finalize are never executed. \b /WX treats warnings as errors \b Using the /D switch one or more times will add to symbols to the globally defined list (See !define). \b Using the /X switch one or more times will execute the code you specify following it. Example: "/XAutoCloseWindow false" \b Specifying a dash (-) for the script name will tell makensis to use the standard input as a source. \S1{usagenotes} Notes \b Parameters are processed in order. \c{makensis /Ddef script.nsi} is not the same as \c{makensis script.nsi /Ddef}. \b If multiple scripts are specified, they are treated as one concatenated script. \S1{usageenvironment} Environment variables makensis checks a number of environment variables that tell it where to locate the things it needs in order to create installers. These variables include: \b NSISDIR, NSISCONFDIR - Places where nsis data and config files are installed. NSISDIR alters the script variable $\{NSISDIR\}. See \k{varconstant} for more info. \b APPDATA (on Windows) or HOME (on other platforms) - Location of the per-user configuration file. \S1{usageexamples} Examples Basic usage: \c makensis.exe myscript.nsi Quiet mode: \c makensis.exe /V1 myscript.nsi Force compressor: \c makensis.exe /X"SetCompressor /FINAL lzma" myscript.nsi Change script behavior: \c makensis.exe /DUSE_UPX /DVERSION=1.337 /DNO_IMAGES myscript.nsi Parameters order: \c makensis /XSection sectioncontents.nsi /XSectionEnd \H{installerusage} Installer Usage Generated installers and uninstallers accept a few options on the command line. These options give the user a bit more control over the installation process. \S1{installerusagecommon} Common Options \b /NCRC disables the CRC check, unless \c{\R{acrccheck}{CRCCheck} force} was used in the script. \b /S runs the installer or uninstaller silently. See \k{silent} for more information. \b /D sets the default installation directory (\R{varother}{$INSTDIR}), overriding \R{ainstalldir}{InstallDir} and \R{ainstalldirregkey}{InstallDirRegKey}. It must be the last parameter used in the command line and must not contain any quotes, even if the path contains spaces. Only absolute paths are supported. \S1{installerusageuninstaller} Uninstaller Specific Options \b _?= sets $INSTDIR. It also stops the uninstaller from copying itself to the temporary directory and running from there. It can be used along with \R{execwait}{ExecWait} to wait for the uninstaller to finish. It must be the last parameter used in the command line and must not contain any quotes, even if the path contains spaces. \S1{installerusageexamples} Examples \c installer.exe /NCRC \c installer.exe /S \c installer.exe /D=C:\Program Files\NSIS \c installer.exe /NCRC /S /D=C:\Program Files\NSIS \c uninstaller.exe /S _?=C:\Program Files\NSIS \c # uninstall old version \c ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR' \c Delete "$INSTDIR\uninstaller.exe" \c RMDir $INSTDIR nsis-3.11/Docs/src/usection.but000077500000000000000000000015501477201124000164400ustar00rootroot00000000000000\S1{UninstallSection} Uninstall Section A special \R{ssection}{Section} named 'Uninstall' must be created in order to generate an uninstaller. This section should remove all files, registry keys etc etc that were installed by the installer, from the system. Here is an example of a simple uninstall section: \c Section "Uninstall" \c Delete $INSTDIR\Uninst.exe ; delete self (see explanation below why this works) \c Delete $INSTDIR\myApp.exe \c RMDir $INSTDIR \c DeleteRegKey HKLM SOFTWARE\myApp \c SectionEnd The first \R{delete}{Delete} instruction works (deleting the uninstaller), because the uninstaller is transparently copied to the system temporary directory for the uninstall. Note that in uninstaller code, $INSTDIR contains the directory where the uninstaller lies. It does \s{not} necessarily contain the same value it contained in the installer. nsis-3.11/Docs/src/usefulfunc.but000077500000000000000000000073651477201124000170000ustar00rootroot00000000000000\A{usefulfunctions} Useful Scripts \H{getieversion} Get Internet Explorer version \c ; GetIEVersion \c ; \c ; Returns 1-11 (IE Version) or '' (IE is not installed) on top of the stack \c ; \c ; Usage: \c ; Call GetIEVersion \c ; Pop $R0 ; $R0 is "5" etc. \c \c Function GetIEVersion \c Push $R0 \c ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "svcVersion" ; IE v10+ \c StrCpy $R0 $R0 2 \c IntCmp $R0 9 "" "" lbl_done \c ClearErrors \c ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "Version" ; IE v4..9 \c IfErrors lbl_123 \c StrCpy $R0 $R0 1 ; Note: This truncates 5.50 to 5 etc. \c Goto lbl_done \c lbl_123: \c !if "${NSIS_PTR_SIZE}" > 4 \c StrCpy $R0 "" \c !else \c ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "IVer" ; IE v1..3 \c IntCmp $R0 99 "" "" +3 \c StrCpy $R0 "" \c Goto lbl_done \c IntOp $R0 $R0 & 3 ; 100..103->0..3 \c IntCmp $R0 2 +2 "" +2 \c IntOp $R0 $R0 + 1 ; Bump 100->v1 and 101->v2 (Is 101 v1.5 or 2.0?) \c !endif \c lbl_done: \c Exch $R0 \c FunctionEnd \H{detect.netframework} Is .NET Framework installed? \c ; IsDotNETInstalled \c ; \c ; NOTE: This is only able to detect .NET v1.x and v2.x! \c ; \c ; Based on GetDotNETVersion \c ; https://nsis.sourceforge.io/Get_.NET_Version \c ; \c ; Usage: \c ; Call IsDotNETInstalled \c ; Pop $0 ; 0 or 1 \c ; StrCmp $0 1 found_dotNETFramework_v1_or_v2 no_dotNETFramework \c \c Function IsDotNETInstalled \c Push $0 \c System::Call '"$SysDir\MSCOREE.dll"::GetCORVersion(w,i${NSIS_MAX_STRLEN},*i)i.r0?u' \c IntOp $0 $0 ! ; HRESULT (S_OK) -> BOOL \c Exch $0 \c FunctionEnd \H{isflashinstalled} Is Macromedia Flash Player installed? \c ; IsFlashInstalled \c ; \c ; Usage: \c ; Call IsFlashInstalled \c ; Pop $R0 ; 1 or "" \c \c Function IsFlashInstalled \c Push $R0 \c ReadRegStr $R0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" "" \c StrCmp $R0 "" +2 \c StrCpy $R0 "1" \c Exch $R0 \c FunctionEnd \H{connectinternet} Connect to the Internet \c ; ConnectInternet (uses Dialer plug-in) - Written by Joost Verburg \c ; \c ; This function attempts to make a connection to the internet if there is no \c ; connection available. If you are not sure that a system using the installer \c ; has an active internet connection, call this function before downloading \c ; files with NSISdl. \c ; \c ; The function requires Internet Explorer 3, but asks to connect manually if \c ; IE3 is not installed. \c \c Function ConnectInternet \c \c Push $R0 \c \c ClearErrors \c Dialer::AttemptConnect \c IfErrors noie3 \c \c Pop $R0 \c StrCmp $R0 "online" connected \c MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet." \c Quit ; This will quit the installer. You might want to add your own error handling. \c \c noie3: \c \c ; IE3 not installed \c MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now." \c \c connected: \c \c Pop $R0 \c \c FunctionEnd \H{multipleinstances} Prevent Multiple Instances Put the following code in your \R{oninit}{.onInit function}: \c System::Call 'kernel32::CreateMutex(p 0, i 0, t "myMutex") p .r1 ?e' \c Pop $R0 \c \c StrCmp $R0 0 +3 \c MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running." \c Abort 'myMutex' \e{must} be replaced by a unique string or GUID! \H{morefuncs} More You can find more useful scripts on \W{https://nsis.sourceforge.io/wiki/}{the NSIS Wiki}, \W{http://forums.winamp.com/forumdisplay.php?s=&forumid=65}{the NSIS forum} and the \W{https://nsis.sourceforge.io/}{NSIS development page}.nsis-3.11/Docs/src/usefulinfos.but000077500000000000000000000353431477201124000171600ustar00rootroot00000000000000\A{usefulinfos} Useful Information \H{errorlevels}Error Levels Like other applications, installers made by NSIS return error levels as a result of their execution. Checking the error level can be useful if you call an NSIS installer from another application or installer. \b 0 - Normal execution (no error) \b 1 - Installation aborted by user (cancel button) \b 2 - Installation aborted by script You can set the error level to other values using \R{seterrorlevel}{SetErrorLevel}. Note that uninstallers copy themselves to the temporary directory and execute from there so the original uninstaller can be deleted. This means the error level the uninstaller sets is not available to the executing process, unless it simulates this copy process and executes the copied uninstaller. To simulate this process, use: \c InitPluginsDir \c CopyFiles $INSTDIR\uninstaller.exe $PLUGINSDIR \c ExecWait '"$PLUGINSDIR\uninstaller.exe" _?=$INSTDIR' $0 \c DetailPrint "uninstaller set error level $0" If you don't do this, you'll only be able to know if the uninstaller failed copying itself to the temporary directory. \H{useful_add_uninst_infos}Add uninstall information to Add/Remove Programs Create a key with your product name (or a GUID) under HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall to add entries to the "Add/Remove Programs" section in the Control Panel. For Windows NT (NT4/2000/XP and later), it's also possible to create the key in the HKCU hive, so it will only appear for the current user. There are several values you can write to key to give information about your application and the uninstaller. Write a value using the \R{writeregstr}{WriteRegStr} command (for strings) or \R{writeregdword}{WriteRegDWORD} command (for DWORD values). Example: \c WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProduct" "DisplayName" "Application Name" \c WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProduct" "UninstallString" '"$INSTDIR\uninst.exe"' \s{Required values:} \e{DisplayName} (string) - Name of the application \\ \e{UninstallString} (string) - Path and filename of the uninstaller. You should \s{always} quote the path. \s{Optional values:} Some of the following values will not be used by older Windows versions. \e{QuietUninstallString} (string) - Quiet uninstall command (\cw{"$INSTDIR\\uninst.exe" /S}) \e{InstallLocation} (string) - Installation directory ($INSTDIR) \\ \e{DisplayIcon} (string) - Path, filename and index of the icon that will be displayed next to your application name \e{Publisher} (string) - (Company) name of the publisher \e{ModifyPath} (string) - Path and filename of the application modify program \\ \e{InstallSource} (string) - Location where the application was installed from \e{ProductID} (string) - Product ID of the application \\ \e{RegOwner} (string) - Registered owner of the application \\ \e{RegCompany} (string) - Registered company of the application \e{HelpLink} (string) - Link to the support website \\ \e{HelpTelephone} (string) - Telephone number for support \e{URLUpdateInfo} (string) - Link to the website for application updates \\ \e{URLInfoAbout} (string) - Link to the application home page \e{DisplayVersion} (string) - Displayed version of the application \\ \e{VersionMajor} (DWORD) - Major version number of the application \\ \e{VersionMinor} (DWORD) - Minor version number of the application \e{NoModify} (DWORD) - 1 if uninstaller has no option to modify the installed application \\ \e{NoRepair} (DWORD) - 1 if the uninstaller has no option to repair the installation If both NoModify and NoRepair are set to 1, the button displays "Remove" instead of "Modify/Remove". \H{useful_system_plugin} Calling an external DLL using the System.dll plug-in Some installers need to call functions in third-party DLLs. A prime example of this is when installing a Palm(TM) conduit. \\Some background about System.dll\\ \\ The System.dll plug-in enables calling of external DLLs by using its 'Call' function. There are a number of other functions provided by System.dll but they will not be covered here. For more details about the other functions, lock the doors, take the phone off the hook, screw your head on *real* tight and head on over to the \L{../Docs/System/System.html}{System readme}. \\Data Types\\ \\ System.dll recognises the following data types: \b v - void (generally for return) \b p - pointer (includes void*, HANDLE, HWND, UINT_PTR and so on) \b i - int (a 32bit integer) \b l - large integer (also known as int64) \b t - text, string (LPTSTR, pointer to first character) \b k - callback. See Callback section in system.html. \b * - pointer specifier -> the proc needs the pointer to type, affects next char (parameter) [ex: '*i' - pointer to int] \\Mapping System.dll variables to NSIS script variables\\ \\ There's not much point in being able to call an external function if you can't get any data back. System.dll maps function variables to NSIS script variables in the following way: NSIS $0..$9 becomes System.dll r0..r9 NSIS $R0..$R9 becomes System.dll r10..r19 Each parameter is specified by type, input and output. To skip input or output use a dot. Examples: String (pointer to a character array), input is 'happy calling': \c t 'happy calling' String (pointer to a character array), input is taken from $5 and changes to the array made by the callee are saved into $R8: \c t r5R8 Pointer to an integer, value taken from $1 and put into $2: \c *i r1r2 Pointer to a 64-bit integer, output pushed on stack, no input: \c *l .s Using System.dll::Call To call a function in a third party DLL, the Call function is used like this: \c System::Call 'YourDllName::YourDllFunction(i, *i, t) i(r0, .r1, r2) .r3' The '(r0, .r1, r2) .r3' section at the end are the parameters that are passed between your DLL and your NSIS script. As can be seen in this parameters list, type and input/output can be separated. Each block of "(parms list) return value" overrides and/or adds to the last one. In this case, the first block specifies the types and the second specifies input and output. \\Before starting to code the NSIS script\\ \\ Before you start to code any NSIS code you need to know the full prototype of the function you are going to call. For the purposes of this example, we will use the 'CmGetHotSyncExecPath' function from the Palm 'CondMgr.dll'. This function is used to return the full path of 'HotSync.exe'. \\Function Definition\\ \\ int __stdcall CmGetHotSyncExecPath(TCHAR *pPath, int *piSize); where \b pPath is a pointer to a character buffer. Upon return, this is the path & file name of the installed HotSync manager. \b piSize is a pointer to an integer that specifies the size (in TCHAR's), of the buffer referenced by the pPath parameter. return values: \b 0: No error \b -1: A non-specific error occurred \b ERR_REGISTRY_ACCESS(-1006):Unable to access the Palm configuration entries \b ERR_BUFFER_TOO_SMALL(-1010): The buffer is too small to hold the requested information \b ERR_INVALID_POINTER(-1013):The specified pointer is not a valid pointer Also, if the buffer is too small the value in *int is the size (in TCHARs) that the buffer should be. This function definition maps to the following System.dll definition: CmGetHotSyncExecPath(t, *i) i i.e. It takes a text variable, a pointer to int, and returns an int value. \\Using the external dll function\\ \\ Now that we've sorted out what the function does and how it maps to the System.dll format we can use the function in a NSIS script. First you have to change the output directory to that where the DLL you want to use is. It may also work if the DLL is in the system path but this hasn't been tested. The following code fragment will install 'condmgr.dll' to a temporary directory, execute the CmGetHotSyncExecPath function and display returned data. Save this script \c Function loadDll \c \c SetOutPath $TEMP\eInspect ; create temp directory \c File bin\CondMgr.dll ; copy dll there \c StrCpy $1 ${NSIS_MAX_STRLEN} ; assign memory to $0 \c System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2' \c DetailPrint 'Path: "$0"' \c DetailPrint "Path length: $1" \c DetailPrint "Return value: $2" \c \c FunctionEnd and this function produces the following output in the 'details' page: Output folder: c:\\windows\\TEMP\\eInspect \\ Extract: CondMgr.dll \\ Path: "C:\\Dave\\palm\\Hotsync.exe" \\ Path length: 24 \\ Return value: 0 Written by \W{https://web.archive.org/web/2018/http://nsis.sourceforge.net/archive/profile.php?userid=78}{djc} \# \\Acknowledgements & Thanks\\ \\ \# Lots of thanks go to \\kichik\\ and \\Sunjammer\\ for spending a lot of time assisting in solving this problem. Also to \\brainsucker\\ for creating the System.dll plug-in in the first place. \# Good Luck! \H{dumplogtofile} Dump Content of Log Window to File This function will dump the log of the installer (installer details) to a file of your choice. To use it, push a file name and call it. It will dump the log to the file specified. For example: \c GetTempFileName $0 \c DetailPrint "Writing log to $0" \c Push $0 \c Call DumpLog If you're building a \R{intro-unicode}{Unicode installer} you can \cw{!define DumpLog_As_UTF16LE} to output as UTF-16LE or \cw{!define DumpLog_As_UTF16LE "/BOM"} to output as UTF-16LE with a BOM. Here is the function: \c !define /IfNDef LVM_GETITEMCOUNT 0x1004 \c !define /IfNDef LVM_GETITEMTEXTA 0x102D \c !define /IfNDef LVM_GETITEMTEXTW 0x1073 \c !if "${NSIS_CHAR_SIZE}" > 1 \c !define /IfNDef LVM_GETITEMTEXT ${LVM_GETITEMTEXTW} \c !else \c !define /IfNDef LVM_GETITEMTEXT ${LVM_GETITEMTEXTA} \c !endif \c \c Function DumpLog \c Exch $5 \c Push $0 \c Push $1 \c Push $2 \c Push $3 \c Push $4 \c Push $6 \c FindWindow $0 "#32770" "" $HWNDPARENT \c GetDlgItem $0 $0 1016 \c StrCmp $0 0 exit \c FileOpen $5 $5 "w" \c StrCmp $5 "" exit \c SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6 \c System::Call '*(&t${NSIS_MAX_STRLEN})p.r3' \c StrCpy $2 0 \c System::Call "*(i, i, i, i, i, p, i, i, i) i (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1" \c loop: StrCmp $2 $6 done \c System::Call "User32::SendMessage(i, i, i, i) i ($0, ${LVM_GETITEMTEXT}, $2, r1)" \c System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)" \c !ifdef DumpLog_As_UTF16LE \c FileWriteUTF16LE ${DumpLog_As_UTF16LE} $5 "$4$\r$\n" \c !else \c FileWrite $5 "$4$\r$\n" ; Unicode will be translated to ANSI! \c !endif \c IntOp $2 $2 + 1 \c Goto loop \c done: \c FileClose $5 \c System::Free $1 \c System::Free $3 \c exit: \c Pop $6 \c Pop $4 \c Pop $3 \c Pop $2 \c Pop $1 \c Pop $0 \c Pop $5 \c FunctionEnd \H{readreg_multi_sz} How to Read REG_MULTI_SZ Values \#{KiCHiK wrote this script to help rpetges in \W{http://forums.winamp.com/showthread.php?s=&threadid=131154}{this forum thread}.} This example reads a registry value of the type REG_MULTI_SZ and prints it out. Don't forget to edit where it says "Edit this!" when you test this script. The values must point to a REG_MULTI_SZ value or the example will spit out an error. \c OutFile "REG_MULTI_SZ Reader.exe" \c Name "REG_MULTI_SZ Reader" \c ShowInstDetails show \c \c !define HKEY_CLASSES_ROOT 0x80000000 \c !define HKEY_CURRENT_USER 0x80000001 \c !define HKEY_LOCAL_MACHINE 0x80000002 \c !define HKEY_USERS 0x80000003 \c !define HKEY_PERFORMANCE_DATA 0x80000004 \c !define HKEY_PERFORMANCE_TEXT 0x80000050 \c !define HKEY_PERFORMANCE_NLSTEXT 0x80000060 \c !define HKEY_CURRENT_CONFIG 0x80000005 \c !define HKEY_DYN_DATA 0x80000006 \c !define KEY_QUERY_VALUE 0x0001 \c !define KEY_ENUMERATE_SUB_KEYS 0x0008 \c !define REG_NONE 0 \c !define REG_SZ 1 \c !define REG_EXPAND_SZ 2 \c !define REG_BINARY 3 \c !define REG_DWORD 4 \c !define REG_DWORD_LITTLE_ENDIAN 4 \c !define REG_DWORD_BIG_ENDIAN 5 \c !define REG_LINK 6 \c !define REG_MULTI_SZ 7 \c \c !define RegOpenKeyEx "Advapi32::RegOpenKeyEx(p, t, i, i, *p) i" \c !define RegQueryValueEx "Advapi32::RegQueryValueEx(p, t, p, *i, p, *i) i" \c !define RegCloseKey "Advapi32::RegCloseKeyA(p) i" \c \c ####### Edit this! \c \c !define ROOT_KEY ${HKEY_LOCAL_MACHINE} \c !define SUB_KEY "SYSTEM\CurrentControlSet\Control\Lsa" \c !define VALUE "Security Packages" \c \c ####### Stop editing \c \c Section "Read" \c StrCpy $1 "" \c StrCpy $2 "" \c StrCpy $3 "" \c System::Call "${RegOpenKeyEx}(${ROOT_KEY}, '${SUB_KEY}', \ \c 0, ${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, 0 r0) .r3" \c \c StrCmp $3 0 goon \c MessageBox MB_OK|MB_ICONSTOP "Can't open registry key! ($3)" \c Goto done \c goon: \c \c System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, .r1, 0, .r2) .r3" \c \c StrCmp $3 0 read \c MessageBox MB_OK|MB_ICONSTOP "Can't query registry value size! ($3)" \c Goto done \c \c read: \c \c StrCmp $1 ${REG_MULTI_SZ} multisz \c MessageBox MB_OK|MB_ICONSTOP "Registry value not a REG_MULTI_SZ! ($3)" \c Goto done \c \c multisz: \c \c StrCmp $2 0 0 multiszalloc \c MessageBox MB_OK|MB_ICONSTOP "Registry value empty! ($3)" \c Goto done \c \c multiszalloc: \c \c System::Alloc $2 \c Pop $1 \c \c StrCmp $1 0 0 multiszget \c MessageBox MB_OK|MB_ICONSTOP "Can't allocate enough memory! ($3)" \c Goto done \c \c multiszget: \c \c System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, n, r1, r2) .r3" \c \c StrCmp $3 0 multiszprocess \c MessageBox MB_OK|MB_ICONSTOP "Can't query registry value data! ($3)" \c Goto done \c \c multiszprocess: \c \c StrCpy $4 $1 \c \c loop: \c \c System::Call "*$4(&t${NSIS_MAX_STRLEN} .r3)" \c StrCmp $3 "" done \c DetailPrint $3 \c StrLen $5 $3 \c !if "${NSIS_CHAR_SIZE}" > 1 \c IntOp $5 $5 * ${NSIS_CHAR_SIZE} \c !endif \c IntPtrOp $4 $4 + $5 \c IntPtrOp $4 $4 + ${NSIS_CHAR_SIZE} \c Goto loop \c \c done: \c \c System::Free $1 \c \c StrCmp $0 0 noClose \c System::Call "${RegCloseKey}(r0)" \c \c noClose: \c \c SectionEnd \H{unicode_defines}Predefined Macros for Unicode support There are two macros that can help you write scripts that work for both Unicode and ANSI installers. To figure out if the script is being compiled to generate a Unicode installer, use !ifdef to check for NSIS_UNICODE. To see what the size of a character is, use $\{NSIS_CHAR_SIZE\}. It will be 1 for ANSI and 2 for Unicode installers. nsis-3.11/Docs/src/var.but000077500000000000000000000276361477201124000154140ustar00rootroot00000000000000\H{variables} Variables All variables are global and can be used in Sections or Functions. Note that by default, variables are limited to 1024 characters. To extend this limit, \R{build}{build NSIS} with a bigger value of the NSIS_MAX_STRLEN build setting or use the \W{https://nsis.sourceforge.io/download/specialbuilds/}{special build}. \S1{varuser} User Variables \e{$VARNAME} User variables must be declared with the \R{var}{Var} command. You can use these variables to store values, work with string manipulation etc. \S2{var} Var \c [/GLOBAL] var_name Declare a user variable. Allowed characters for variables names: [a-z][A-Z][0-9], '.' and '_'. All defined variables are global, even if defined in a section or a function. To make this clear, variables defined in a section or a function must use the /GLOBAL flag. The /GLOBAL flag is not required outside of sections and functions. \c Var example \c \c Function testVar \c Var /GLOBAL example2 \c \c StrCpy $example "example value" \c StrCpy $example2 "another example value" \c FunctionEnd \S1{varother} Other Writable Variables \e{$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $R0, $R1, $R2, $R3, $R4, $R5, $R6, $R7, $R8, $R9} Registers. These variables can be used just like user variables, but are usually used in shared functions or macros. You don't have to declare these variables so you won't get any name conflicts when using them in shared code. When using these variables in shared code it's recommended that you use the stack to save and restore their original values. These variables can also be used for communication with plug-ins because they can be read and written by the plug-in DLLs. \e{$INSTDIR} The installation directory ($INSTDIR is modifiable using \R{StrCpy}{StrCpy}, \R{readregstr}{ReadRegStr}, \R{readinistr}{ReadINIStr}, etc. - This could be used, for example, in the \R{oninit}{.onInit} function to do a more advanced detection of install location). Note that in uninstaller code, $INSTDIR contains the directory where the uninstaller lies. It does \s{not} necessarily contain the same value it contained in the installer. For example, if you write the uninstaller to $WINDIR and the user doesn't move it, $INSTDIR will be $WINDIR in the uninstaller. If you write the uninstaller to another location, you should keep the installer's $INSTDIR in the registry or an alternative storing facility and read it in the uninstaller. \e{$OUTDIR} The current output directory (set implicitly via \R{setoutpath}{SetOutPath} or explicitly via \R{StrCpy}{StrCpy}, \R{readregstr}{ReadRegStr}, \R{readinistr}{ReadINIStr}, etc) \e{$CMDLINE} The command line of the installer. The format of the command line can be one of the following: \b "full\\path to\\installer.exe" PARAMETER PARAMETER PARAMETER \b installer.exe PARAMETER PARAMETER PARAMETER \b For parsing out the PARAMETER portion, see \R{getparameters}{GetParameters}. If /D= is specified on the command line (to override the install directory) it won't show up in $CMDLINE. \e{$LANGUAGE} The identifier of the language that is currently used. For example, English is 1033. You can only change this variable in \R{oninit}{.onInit}. \S1{varconstant} Constants Constants can also be used in the \R{ainstalldir}{InstallDir} attribute. Note that some of the new constants will not work on every OS. For example, $CDBURN_AREA will only work on Windows XP and above. If it's used on Windows 98, it'll be empty. Unless mentioned otherwise, a constant should be available on every OS. \e{$PROGRAMFILES}, \e{$PROGRAMFILES32}, \e{$PROGRAMFILES64} The program files directory (usually \c{C:\\Program Files} but detected at runtime). On 64-bit Windows, $PROGRAMFILES and $PROGRAMFILES32 point to \c{C:\\Program Files (x86)} while $PROGRAMFILES64 points to \c{C:\\Program Files}. Use $PROGRAMFILES64 when installing 64-bit applications. \e{$COMMONFILES}, \e{$COMMONFILES32}, \e{$COMMONFILES64} The common files directory. This is a directory for components that are shared across applications (usually \c{C:\\Program Files\\Common Files} but detected at runtime). On 64-bit Windows, $COMMONFILES and $COMMONFILES32 point to \c{C:\\Program Files (x86)\\Common Files} while $COMMONFILES64 points to \c{C:\\Program Files\\Common Files}. Use $COMMONFILES64 when installing 64-bit applications. \e{$DESKTOP} The Windows desktop directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. \e{$EXEDIR} The directory containing the installer executable (technically this is a variable and you can modify it, but it is probably not a good idea). \e{$EXEFILE} The base name of the installer executable. \e{$EXEPATH} The full path of the installer executable. \e{$\{NSISDIR\}} A symbol that contains the path where NSIS is installed. Useful if you want to reference resources that are in NSIS directory e.g. Icons, UIs etc. When compiled with support for keeping makensis and the data in the same place (the default on Windows), it is in the same place as makensis, on other platforms it is set at compile time (See the INSTALL file for info). In both instances you can modify it at runtime by setting the NSISDIR environment variable. See \k{usageenvironment} for more info. \e{$WINDIR} The Windows directory (usually \c{C:\\Windows} or \c{C:\\WinNT} but detected at runtime). \e{$SYSDIR} The Windows system directory (usually \c{C:\\Windows\\System} or \c{C:\\WinNT\\System32} but detected at runtime). \e{$TEMP} The temporary directory. \e{$STARTMENU} The start menu folder (useful for adding start menu items using \R{createshortcut}{CreateShortcut}). The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. \e{$SMPROGRAMS} The start menu programs folder (use this whenever you want $STARTMENU\\Programs). The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. \e{$SMSTARTUP} The start menu programs / startup folder. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. \e{$QUICKLAUNCH} The quick launch folder for IE4 active desktop and above. If quick launch is not available it simply returns the same as $TEMP. \e{$DOCUMENTS} The documents directory. A typical path for the current user is \c{C:\\Users\\Foo\\My Documents}. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. This constant is not available on Windows 95 unless Internet Explorer 4 is installed. \e{$SENDTO} The directory that contains Send To menu shortcut items. \e{$RECENT} The directory that contains shortcuts to the user's recently used documents. \e{$FAVORITES} The directory that contains shortcuts to the user's favorite websites, documents, etc. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. This constant is not available on Windows 95 unless Internet Explorer 4 is installed. \e{$MUSIC} The user's music files directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. This constant is available on Windows ME, XP and above. \e{$PICTURES} The user's picture files directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. This constant is available on Windows 2000, XP, ME and above. \e{$VIDEOS} The user's video files directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. This constant is available on Windows ME, XP and above. \e{$NETHOOD} The directory that contains link objects that may exist in the My Network Places/Network Neighborhood folder. This constant is not available on Windows 95 unless Internet Explorer 4 with Active Desktop is installed. \e{$FONTS} The system's fonts directory. \e{$TEMPLATES} The document templates directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. \e{$APPDATA} The (roaming) application data directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. Detection of the current user path requires Internet Explorer 4 and above. Detection of the all users path requires Internet Explorer 5 and above. This constant is not available on Windows 95 unless Internet Explorer 4 with Active Desktop is installed. \e{$LOCALAPPDATA} The local (non-roaming) application data directory. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. The All Users location is also known as \cw{%ProgramData%} on Vista and above. This constant is available on Windows ME, 2000 and above. \e{$PRINTHOOD} The directory that contains link objects that may exist in the Printers folder. This constant is not available on Windows 95 and Windows 98. \e{$INTERNET_CACHE} Internet Explorer's temporary internet files directory. This constant is not available on Windows 95 nor Windows NT 4 unless Internet Explorer 4 with Active Desktop is installed. \e{$COOKIES} Internet Explorer's cookies directory. This constant is not available on Windows 95 nor Windows NT 4 unless Internet Explorer 4 with Active Desktop is installed. \e{$HISTORY} Internet Explorer's history directory. This constant is not available on Windows 95 nor Windows NT 4 unless Internet Explorer 4 with Active Desktop is installed. \e{$PROFILE} The user's profile directory. A typical path is \c{C:\\Users\\Foo}. This constant is available on Windows 2000 and above. \e{$ADMINTOOLS} A directory where administrative tools are kept. The context of this constant (All Users or Current user) depends on the \R{setshellvarcontext}{SetShellVarContext} setting. The default is the current user. This constant is available on Windows 2000, ME and above. \e{$RESOURCES} The resources directory that stores themes and other Windows resources (usually \c{$WINDIR\\Resources} but detected at runtime). This constant is available on Windows XP and above. \e{$RESOURCES_LOCALIZED} The localized resources directory that stores themes and other Windows resources (usually \c{$WINDIR\\Resources\\1033} but detected at runtime). This constant is available on Windows XP and above. \e{$CDBURN_AREA} A directory where files awaiting to be burned to CD are stored. This constant is available on Windows XP and above. \e{$HWNDPARENT} HWND of the main window (in decimal). \e{$PLUGINSDIR} The path to a temporary folder created upon the first usage of a plug-in or a call to \R{initpluginsdir}{InitPluginsDir}. This folder is automatically deleted when the installer exits. This makes this folder the ideal folder to hold INI files for \L{../Docs/InstallOptions/Readme.html}{InstallOptions}, bitmaps for the splash plug-in, or any other file that a plug-in needs to work. \e{$USER..} and \e{$COMMON..} A handful of constants are available as aliases that are not affected by \R{setshellvarcontext}{SetShellVarContext}: \e{$USERTEMPLATES}, \e{$USERSTARTMENU}, \e{$USERSMPROGRAMS}, \e{$USERDESKTOP}, \e{$COMMONTEMPLATES}, \e{$COMMONSTARTMENU}, \e{$COMMONSMPROGRAMS}, \e{$COMMONDESKTOP} and \e{$COMMONPROGRAMDATA}. \S1{varstrings} Constants Used in Strings \e{$$} Use to represent $. \e{$\\r} Use to represent a carriage return (\\r). \e{$\\n} Use to represent a newline (\\n). \e{$\\t} Use to represent a tab (\\t). nsis-3.11/Docs/style.css000077500000000000000000000025111477201124000151540ustar00rootroot00000000000000html, body { font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; background-color: #ffffff; } html { font-size: 0.8em; } body { font-size: 1em; font-size: 1rem; } p, li { font-size: 100%; } h1 { font-size: 170%; } h2 { font-size: 150%; } h3 { font-size: 130%; } h4 { font-size: 120%; } h5 { font-size: 115%; } h6 { font-size: 110%; } pre, code { font-family: Courier New, Courier, monospace,serif; /* code.iamkate.com/html-and-css/fixing-browsers-broken-monospace-font-handling/ */ } code { font-size: 100%; } pre { font-size: 100%; background-color: #F7F7F7; padding: 1px; } pre b { text-decoration: underline; } a { color: #567599; text-decoration: none; } a:hover { color: #303030; text-decoration: underline; } .btitle { color: #000000; text-decoration: none; } .btitle:hover { color: #000000; text-decoration: underline; } .wb { color: #000000; background-color: #FFFFD8; border: 1px solid #CECEAA; padding: 0.2em; } :root { color-scheme: light dark; } @media (prefers-color-scheme: dark) { html, body { color: #eee; background-color:#161616; } a, a:link, a:visited, a:active { color: #8ce; } a:hover { color: #29c; } .btitle { color: #ccc !important; } .btitle:hover { color: #aaa !important; } pre { background-color: #202020; } .wb { color: #a6a688; background-color: #454535; border-color: #3b3b30; } }nsis-3.11/Docs/unreleased.png000077500000000000000000000121671477201124000161470ustar00rootroot00000000000000‰PNG  IHDR-S¯F1ˆgAMA± üa.IDATxíÝGšà’4Ô3#&[A‘lÉõq²GAprË”íø0¬#¦™éþêw5myÉ>}ÏÓ ÑäüU/Tø?$:®†ýþc@¶˜·Çàxù@g*OóÍ­‘P C½xù÷€“$oåéÎÅP •P-ÿN<ÊVóôôF¨…$ÔB9 ‰–ºWó4[_o„z¨÷¢e°=Ý]úñª o¤3«,¿I¨‡$TÂгF¼Û›Tuà låyºs©,õP ¥¿/e·òôt)TBùµë.ÐÉÓÎj’¼¸ ê.äi÷öÕXu©†ò…¡ïk¯y1€:ËÎå„Fqv4•§YëîHHŠ’þéÓ.¼–“©<=¾qvf¹Ÿd­<}záyÝ¥ú¤W‡y6õaJ}Å , v–óôðæ§Ý|0Ú]ÍÓ“ë¡VDÍ?Ö³<-¾îúöl:?^`ðNù`!Û|!kóÏ››•:í•ßL}·Œ`L¨Ök§½Y—Úïͺœ.ÅXùîB- É_œ¬äéÖdŸ‹`0ï²×›uùëf¨ŸÍºNÇK{uu¸¸[lf­Îz¨þ.\²+íI5˜—.ƒëÝÕï~oÖåÊP¶–§§ËÙfwã³™¢òrx=Oß Õ¢g¬xsÿA]{ò+è›*ýnÖ% î4b¯ØXòþd{=OŸÌW’P=º‘§w'Šž±§µ¼•§{CÙٹ̺ÄSÈi|òZlB¾8ºw3OOV>/T®ŒÄ벉R³<½Yì$3ùr³.ñŸÆòôp1FK¼ ûz®xLìd%4Š-cyš­ß‰ï¾$¢å\f]â?RÊZµáâÙ°Z¨}4Ÿ »;_{¹ßÛ2öëñئl ?ý8œËÓ½k#؈¼R ÕùƳ±WìÖp÷Nž~¹˜qf _Ó¥ÃÅ<í®ïÌ.f­ÝËI “rýd9v޽˜)£à5Êú§ã5X|S¾ öÕ+yÚ½³Ñ›ùÕôÉrw­{»½¸e LÿÌé¿?úùÄõ¢âR½×{Qÿ‹ÉPŸlî]³æÍxS?6'1Zþ¼žmkì^‹±ò­%0oÀ£Ç•P®´_lûòB<±œ®®Œ¼t Ð0í2tøbËX¹ÑYÏÓ£c LÎæ]%g[ÆÞ‹¥ü‘Æ»S/_#ZèÇï^ÔOþy&O®…F~ÙÑòÚlûz"O÷—BãåK`Bi«z4¼]µn€¾ë.wʯ^ªÇ—ó^Ôtnn5Â๕T]b\¼b LHš•-§ ÇKY+ßü~&”L»ô@ÀL½t LHŠöãOb1¿úÃqÚåñlüE¸¼K`¦«ßŒïL=hÆŠL,÷ÏÔ;kYk£¡kìXón£»š§ñëÞúf&FM¨í-æé½Ó.oÀ˜Pi/çi÷öogŸÎµWóôô­·›W“îzž~4¡%ùµXÊïÖâ’Ê4ŠW\îÍv7²ÖñòYK²sËkÐŒ¿÷ÊyšmÔ’b§XHþl¸s;.†yg<þ=UÛž>¹°?rmдK¿k/ÕÝ…xV)¾ÎÚÅfˆ_ËúßÎÄ*̑؎üQS;r¿4$Wê?ŸÜ_ŠÓ.M„F±úåàjžž¼UîUa~3“§Ûó¯SÖÀúÊêo/çéÖ¥xbÙköÿº›_í-³¼§{K¡¦ùu˜v©üp<Ôc´oÞhUCéÞXÜŽü«Ù$µ«÷gBòâÜR|ð ¿;»„Úz#6$_¬Ä°yt1O»­‘P‹ÿ&ÔNµ—³µìv{ñ›º–}0L9WÉZÙF5TcÔ\‹=cñ¼rµv´ÔÛ>Öê®ÅAËí™0$^8÷ìæd!OÏ…Z —_ŽÇ0 õÐ –¬õèB’„ä¯Fâ~ä­É¾zÆ0Lù—å¸Ylga³9_‹køÞ ³ñÄrºº:\Lî/6³Vg=Tû \­T–ò´ø²Öß—šõ<=^Î6»ŸÍKa¯ç黣}7$`Öå§ã» ÇË; Æ&ò´{g¸ùSíõ<}2_IBõèFžÞµþÏ-˜u©‘Cã‹Ùøôqh„á‹£{7ãfäOGãÿÊÈk®ÞÀ¬KÑtüådod2ÎéÇʹ8ïò'«÷Ͼžîè–xi3r|Û¥|³šµ:kÃ1X’5ÅgïN+a¶§²·ò4oun”^YâÀÛ.S¥Ø†Ü]ß™?\ÌZ»—'’^&9èM»|3/ÎÒáö­lc=9^ÊÓÎêTo.æßöNÇk°¸y¾ƒ£ú(N»lþ|<ÆLüþa,OO–cØüC,ðŸí{4$—CõýÑÏ'®—êl5[ÏÓ§‹`)~;‰U—´¸,ë§{ =c±c,éÅHåéd¬±ÔzÁÿŽåþøfåöµ0Üë%«¹ë €–¡c$”N.çé÷—ŠšK¯ª2tº§ÛýhI Sö@ÇØÐóoðôrž~=êg³-Ç“±ÊòþhñN¥Ë°þ0ð»ow,OnœY¶’¼•§O/„ä)_.ÈÚ7ót{ñÆ~ÐØí®æéÉõP{^y)¿~°ÀÀrœv9ûºkó,/_Y™÷4hHþ«æç¿½§]>ÿ]ËñŸYNJÙÊAÍ›úýÐ3V Õ§—ótëRh†æ«ª,¸–Ù“Ç}°!ù‡ãqùþ««,Ý…<ÝŸ‹-Ëýô !¹T S¾òAã8·ÿn3Ô^o«†)K᥯´7ò´»jg[Å~5Bñ€õû/­¤t.æéÎå³…•Û#ÙZw郾N/¦|©l9O?‰Ã•ÓÕ£+ùfžvo}5ò¼¨ÿº`k(ßìގÔWãþ½ËÅk.o.ÐÏÓý+•dk.kåi{åÓ‘b{òYÑÿ5úóyº5}Ø{"컹Z •úϧ—»kÝÛ§‹f]^ÙZ •<=XÞ‹`¦{×ò4þÖ]‹×cßÏ¥| ÔbŒt7~qáùaõýÞ{ú__('!ùË‘“•<Ýšô¶KÿØ8Z¼ce8ËÖlŒšÓÕ•‘Јßb3kuÖ_Ô]ú€ÊòÙûùõj¼;^Î6»ŸÍ„Füíðzž¾;ê…—~P,‚©„j<™ÜÎÓìÎXýýÉözž>™¯$¡zt#OïN¼XÅß7,‚ CSyzt-ÔÃðÅѽ›yz²òéh,ñ¯ŒËøo>_½ß<{|8ž§K¡^ô¿žË6ó4ÌÙ£Çí+yëp¼ß~1ø¤”µ:kÃÅ“aµPûh¬³–§w§Š—^žNÄfäg“?¬ß)÷/0p8—§{×FqÁþJ-Tç_̯S¾SÏ6b´3/ÏfúYÓ¥øž~w}gþp1kí^žHBÒ뫵—ã˜3?œÚ^ÌÓÃëÞvé€~±‡Óñ,¾§¿?_¯õzÇ*û—cïØf³W‡iþtúR£è.œg ÷äqõýÑÏ'®—j(;£æþd|¹˜vKþyæÙÜ·c3}.À{úÕbÿq¬¹¼W‹ï]=¬ Õ¤s+Oã×½õ°ÙïÙWB%”ÇË›±Ê’ô‚¥x?ÿd!O;·¾˜|z)ÛÈZßNþ~Õ%»Ò™xÙÃcxðx¨øN.ÄŽ°·›E9¿x ,[ÍÓogâ/wF:kYë£æÙ¬~wÙ<¸Ñû}£»+/ßÏ„>Á`ÇXå§ã» ÇË; ÆâHg=O·ã˜ÆÞµ7ßÌÆ‹±¿9YÉÓ­ÉþzÅЊ\+6Š•‡½‡ŽËõиçö7ÿi"Ô‹o©™µ:ë¡Ú_¸`eŒ—Úã¹xNÙŽ!O/ßÍõ¶#׋ÉG7òôýÑPõ²K,°,…ò?5;«_MÇÌ&ãbå³`©Äù–Óå<ýl"Ôú<·`2FÌXq~I¾½˜§» !FKR´ß­d­<½5\,µ¼9xPSРŸQÊbgXå»é<ýþJ±x¿¸ë\Ëøã/ñJ¬}%oŽë ï50ŸÕòÍöjùy„Á“¸^?ýÅD-O'b3ò³©“úœgàìrìèJžî.]j„êxùh&ßÌÓýùØ’’wzk`Н»¾=Û×´ fªt´ûÅN–»ë1DŽ–*½å¤Ö^ŽWc¿™úxâÞ…ÎZžî_‰ ,…Ëùô•¿š>y+ÆJûyßX¨ÿÁ˜fhN6c¸|>ªk¬Â¥x4,)B¥–/z5—/'{½c^Ô,æéƒÙ8JÙß´ †)«½x‰_í¯êñ=ʽ«Ïæª3Õx]ö“©Ø’ìÜÀyΚ‘{……òh¹s3VY’³`©„ÒñÕ<íÜ>ë$-ô=J»ÀN.IJþÛÍxf))÷ÆcòƃhàM^¥|–d+¦B-K ’ûµØ„¼})FÍ›\ˆÀÀLQدÅ`¹8”­äi{ùìzìÍ—V`%α´/Å&ä?oÁâÌòï` L<MÈ÷&Î.ÜYþÔ]:syzxõ¬î"Xþýx2Ò,^§ô~Ë ³úUÿð6åèbJ„KüË4Eýÿ ð/d:g= 1IEND®B`‚nsis-3.11/Examples/000077500000000000000000000000001477201124000141665ustar00rootroot00000000000000nsis-3.11/Examples/AppGen.nsi000077500000000000000000000037771477201124000160740ustar00rootroot00000000000000/* Note: This is not a installer example script, it's a script for a simple application used by some of the other examples. */ !define /math ARCBITS ${NSIS_PTR_SIZE} * 8 Name "${NAME}" !define /IfNDef OUTFILE "" OutFile "${OUTFILE}" Unicode True !define /IfNDef REL User RequestExecutionLevel ${REL} XPStyle On ManifestDPIAware True AutoCloseWindow True BrandingText " " Caption "$(^Name) (${ARCBITS}-bit)" MiscButtonText " " " " "E&xit" " " LicenseBkColor /windows !ifdef COMPANY !ifndef NOPEVI !define /IfNDef VER 1.2.3.4 VIProductVersion ${VER} VIAddVersionKey /LANG=0 "FileVersion" "${VER}" VIAddVersionKey /LANG=0 "CompanyName" "${COMPANY}" VIAddVersionKey /LANG=0 "LegalCopyright" "${U+00A9} ${COMPANY}" VIAddVersionKey /LANG=0 "FileDescription" "${NAME}" !endif !endif !include WinMessages.nsh !include LogicLib.nsh PageEx License Caption " " LicenseText "$ExeFile$\n$ExePath" "E&xit" PageCallbacks "" OnShow PageExEnd Page InstFiles Function .onInit !ifdef AUMI System::Call 'SHELL32::SetCurrentProcessExplicitAppUserModelID(ws)' "${AUMI}" !endif FunctionEnd Function OnShow FindWindow $0 "#32770" "" $hWndParent GetDlgItem $R9 $0 0x3E8 !ifdef MSG SendMessage $R9 ${EM_REPLACESEL} "" "STR:${MSG}$\r$\n$\r$\n" !endif !ifdef TMPLDATA ${IfNot} ${FileExists} "$AppData\${NAME}\*" ; Copy template data from the shared source to this users profile CreateDirectory "$AppData\${NAME}" CopyFiles /Silent "${TMPLDATA}\*" "$AppData\${NAME}" ${EndIf} ReadIniStr $2 "$AppData\${NAME}\Data.ini" Example Count IntOp $2 $2 + 1 WriteIniStr "$AppData\${NAME}\Data.ini" Example Count $2 SendMessage $R9 ${EM_REPLACESEL} "" "STR:Launch Count=$2$\r$\n$\r$\n" !endif SendMessage $R9 ${EM_REPLACESEL} "" "STR:CmdLine=$CmdLine$\r$\n" ReadEnvStr $2 "USERNAME" SendMessage $R9 ${EM_REPLACESEL} "" "STR:%USERNAME%=$2$\r$\n" ReadEnvStr $2 "__COMPAT_LAYER" StrCmp $2 "" +2 SendMessage $R9 ${EM_REPLACESEL} "" "STR:Compatibility=$2$\r$\n" FunctionEnd Section SectionEnd nsis-3.11/Examples/FileFunc.ini000077500000000000000000000027761477201124000164010ustar00rootroot00000000000000[Settings] NumFields=11 NextButtonText=&Enter [Field 1] Type=Droplist Flags=NOTIFY State=" 1. Locate" ListItems=| 1. Locate| 2. GetSize (file)| (directory)| (no size, no subdir)| 3. DriveSpace| 4. GetDrives (by type)| (all by letter)| 5. GetTime (local time)| (file time)| 6. GetFileAttributes| 7. GetFileVersion| 8. GetExeName| 9. GetExePath|10. GetParameters|11. GetOptions|12. GetRoot|13. GetParent|14. GetFileName|15. GetBaseName|16. GetFileExt|17. BannerTrimPath|18. DirState|19. RefreshShellIcons Left=44 Right=190 Top=1 Bottom=210 [Field 2] Type=FileRequest Left=44 Right=-10 Top=22 Bottom=33 [Field 3] Type=DirRequest Left=44 Right=-10 Top=22 Bottom=33 [Field 4] Type=Text Left=44 Right=-10 Top=36 Bottom=49 [Field 5] Type=Text State=LocateCallback Left=44 Right=232 Top=53 Bottom=66 [Field 6] Type=Button Text=view Flags=NOTIFY Left=236 Right=255 Top=54 Bottom=65 [Field 7] Type=Text Flags=MULTILINE|VSCROLL|HSCROLL|READONLY Left=44 Right=-10 Top=73 Bottom=128 [Field 8] Type=Label Text=Path Left=10 Right=43 Top=24 Bottom=36 [Field 9] Type=Label Text=Options Left=10 Right=43 Top=40 Bottom=52 [Field 10] Type=Label Text=Function Left=10 Right=44 Top=56 Bottom=67 [Field 11] Type=Label Text=Result: Left=12 Right=42 Top=94 Bottom=102 nsis-3.11/Examples/FileFunc.nsi000077500000000000000000000456711477201124000164140ustar00rootroot00000000000000;_____________________________________________________________________________ ; ; File Functions ;_____________________________________________________________________________ ; ; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "File Functions" OutFile "FileFunc.exe" Caption "$(^Name)" XPStyle on RequestExecutionLevel user !include "WinMessages.nsh" !include "FileFunc.nsh" Var INI Var HWND Var STATE Var FUNCTION Var LOCATE1 Var LOCATE2 Var GETSIZE1 Var GETSIZE2 Var GETSIZE3 Var GETSIZE4 Var GETSIZE5 Var GETSIZE6 Var DRIVESPACE1 Var DRIVESPACE2 Var GETDRIVES1 Var GETTIME1 Var GETTIME2 Var GETFILEATTRIBUTES1 Var GETFILEATTRIBUTES2 Var GETFILEVERSION1 Var GETOPTIONS1 Var GETOPTIONS2 Var GETROOT1 Var GETPARENT1 Var GETFILENAME1 Var GETBASENAME1 Var GETFILEEXT1 Var BANNERTRIMPATH1 Var BANNERTRIMPATH2 Var DIRSTATE1 Page Custom ShowCustom LeaveCustom Function ShowCustom InstallOptions::initDialog "$INI" Pop $hwnd GetDlgItem $1 $HWND 1201 ShowWindow $1 0 GetDlgItem $1 $HWND 1202 ShowWindow $1 0 GetDlgItem $1 $HWND 1206 EnableWindow $1 0 SendMessage $1 ${WM_ENABLE} 1 0 StrCpy $LOCATE1 $DOCUMENTS StrCpy $LOCATE2 '/L=FD /M=*.* /S=0B /G=1 /B=0' StrCpy $GETSIZE1 '$WINDIR' StrCpy $GETSIZE2 '/M=Explorer.exe /S=0K /G=0' StrCpy $GETSIZE3 '$PROGRAMFILES\Common Files' StrCpy $GETSIZE4 '/S=0M' StrCpy $GETSIZE5 '$WINDIR' StrCpy $GETSIZE6 '/G=0' StrCpy $DRIVESPACE1 'C:\' StrCpy $DRIVESPACE2 '/D=F /S=M' StrCpy $GETDRIVES1 'FDD+CDROM' StrCpy $GETTIME1 '$WINDIR\Explorer.exe' StrCpy $GETTIME2 'C' StrCpy $GETFILEATTRIBUTES1 'C:\IO.SYS' StrCpy $GETFILEATTRIBUTES2 'ALL' StrCpy $GETFILEVERSION1 '$WINDIR\Explorer.exe' StrCpy $GETOPTIONS1 '/SILENT=yes /INSTDIR="$PROGRAMFILES\Common Files"' StrCpy $GETOPTIONS2 '/INSTDIR=' StrCpy $GETROOT1 'C:\path\file.dll' StrCpy $GETPARENT1 'C:\path\file.dll' StrCpy $GETFILENAME1 'C:\path\file.dll' StrCpy $GETBASENAME1 'C:\path\file.dll' StrCpy $GETFILEEXT1 'C:\path\file.dll' StrCpy $BANNERTRIMPATH1 'C:\Server\Documents\Terminal\license.htm' StrCpy $BANNERTRIMPATH2 '34A' StrCpy $DIRSTATE1 '$TEMP' GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE1" GetDlgItem $1 $HWND 1205 SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE2" InstallOptions::show Pop $0 FunctionEnd Function LeaveCustom ReadINIStr $STATE $INI "Field 1" "State" ReadINIStr $R1 $INI "Field 2" "State" ReadINIStr $R2 $INI "Field 3" "State" ReadINIStr $R3 $INI "Field 4" "State" ReadINIStr $R4 $INI "Field 5" "State" ReadINIStr $0 $INI "Settings" "State" StrCmp $0 6 view StrCmp $0 0 Enter goto main view: StrCpy $0 '$$' StrCpy $1 'n' StrCpy $2 'r' StrCmp $R4 "LocateCallback" 0 +3 StrCpy $R0 `Function LocateCallback$\r$\n MessageBox MB_OKCANCEL '$0$$R9 "path\name"=[$$R9]$0\$1$0$$R8 "path" =[$$R8]$0\$1$0$$R7 "name" =[$$R7]$0\$1$0$$R6 "size" =[$$R6]' IDOK +2$\r$\n StrCpy $$R0 StopLocate$\r$\n$\r$\n Push $$R0$\r$\nFunctionEnd` goto send StrCmp $R4 "GetDrivesCallback" 0 error StrCpy $R0 `Function GetDrivesCallback$\r$\n MessageBox MB_OKCANCEL '$0$$9 "drive letter"=[$$9]$0\$1$0$$8 "drive type" =[$$8]' IDOK +2$\r$\n StrCpy $$R0 StopGetDrives$\r$\n StrCpy $$R5 '$$R5$$9 [$$8 Drive]$$\$2$$\$1'$\r$\n$\r$\n Push $$R0$\r$\nFunctionEnd` goto send main: StrCmp $FUNCTION '' DefaultSend StrCmp $FUNCTION Locate 0 +4 StrCpy $LOCATE1 $R2 StrCpy $LOCATE2 $R3 goto DefaultSend StrCmp $FUNCTION GetSize1 0 +4 StrCpy $GETSIZE1 $R2 StrCpy $GETSIZE2 $R3 goto DefaultSend StrCmp $FUNCTION GetSize2 0 +4 StrCpy $GETSIZE3 $R2 StrCpy $GETSIZE4 $R3 goto DefaultSend StrCmp $FUNCTION GetSize3 0 +4 StrCpy $GETSIZE5 $R2 StrCpy $GETSIZE6 $R3 goto DefaultSend StrCmp $FUNCTION DriveSpace 0 +4 StrCpy $DRIVESPACE1 $R1 StrCpy $DRIVESPACE2 $R3 goto DefaultSend StrCmp $FUNCTION GetDrives 0 +3 StrCpy $GETDRIVES1 $R1 goto DefaultSend StrCmp $FUNCTION GetTime 0 +4 StrCpy $GETTIME1 $R1 StrCpy $GETTIME2 $R3 goto DefaultSend StrCmp $FUNCTION GetFileAttributes 0 +4 StrCpy $GETFILEATTRIBUTES1 $R1 StrCpy $GETFILEATTRIBUTES2 $R3 goto DefaultSend StrCmp $FUNCTION GetFileVersion 0 +3 StrCpy $GETFILEVERSION1 $R1 goto DefaultSend StrCmp $FUNCTION GetOptions 0 +4 StrCpy $GETOPTIONS1 $R1 StrCpy $GETOPTIONS2 $R3 goto DefaultSend StrCmp $FUNCTION GetRoot 0 +3 StrCpy $GETROOT1 $R1 goto DefaultSend StrCmp $FUNCTION GetParent 0 +3 StrCpy $GETPARENT1 $R1 goto DefaultSend StrCmp $FUNCTION GetFileName 0 +3 StrCpy $GETFILENAME1 $R1 goto DefaultSend StrCmp $FUNCTION GetBaseName 0 +3 StrCpy $GETBASENAME1 $R1 goto DefaultSend StrCmp $FUNCTION GetFileExt 0 +3 StrCpy $GETFILEEXT1 $R1 goto DefaultSend StrCmp $FUNCTION BannerTrimPath 0 +4 StrCpy $BANNERTRIMPATH1 $R1 StrCpy $BANNERTRIMPATH2 $R3 goto DefaultSend StrCmp $FUNCTION DirState 0 +2 StrCpy $DIRSTATE1 $R2 DefaultSend: GetDlgItem $1 $HWND 1201 EnableWindow $1 1 ShowWindow $1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1202 EnableWindow $1 1 ShowWindow $1 0 GetDlgItem $1 $HWND 1203 EnableWindow $1 1 ShowWindow $1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1204 EnableWindow $1 1 ShowWindow $1 0 GetDlgItem $1 $HWND 1205 EnableWindow $1 1 GetDlgItem $1 $HWND 1206 ShowWindow $1 0 EnableWindow $1 0 GetDlgItem $1 $HWND 1207 ShowWindow $1 0 GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:" ReadINIStr $0 $INI "Field 1" "State" StrCmp $0 " 1. Locate" 0 GetSize1Send StrCpy $FUNCTION Locate GetDlgItem $1 $HWND 1203 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE1" GetDlgItem $1 $HWND 1204 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE2" GetDlgItem $1 $HWND 1206 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:LocateCallback" GetDlgItem $1 $HWND 1207 ShowWindow $1 1 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Path" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Function" abort GetSize1Send: StrCmp $0 " 2. GetSize (file)" 0 GetSize2Send StrCpy $FUNCTION 'GetSize1' GetDlgItem $1 $HWND 1203 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE1" GetDlgItem $1 $HWND 1204 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE2" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:File" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" Abort GetSize2Send: StrCmp $0 " (directory)" 0 GetSize3Send StrCpy $FUNCTION 'GetSize2' GetDlgItem $1 $HWND 1203 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE3" GetDlgItem $1 $HWND 1204 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE4" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" Abort GetSize3Send: StrCmp $0 " (no size, no subdir)" 0 DriveSpaceSend StrCpy $FUNCTION 'GetSize3' GetDlgItem $1 $HWND 1203 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE5" GetDlgItem $1 $HWND 1204 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE6" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" Abort DriveSpaceSend: StrCmp $0 " 3. DriveSpace" 0 GetDrivesSend StrCpy $FUNCTION DriveSpace GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$DRIVESPACE1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 EnableWindow $1 0 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$DRIVESPACE2" GetDlgItem $1 $HWND 1206 ShowWindow $1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1207 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Drive" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" abort GetDrivesSend: StrCmp $0 " 4. GetDrives (by type)" 0 GetDrives2Send StrCpy $FUNCTION GetDrives GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETDRIVES1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 EnableWindow $1 0 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1206 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:GetDrivesCallback" GetDlgItem $1 $HWND 1207 ShowWindow $1 1 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Function" abort GetDrives2Send: StrCmp $0 " (all by letter)" 0 GetTime1Send StrCpy $FUNCTION '' GetDlgItem $1 $HWND 1201 ShowWindow $1 1 EnableWindow $1 0 SendMessage $1 ${WM_ENABLE} 1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:ALL" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 EnableWindow $1 0 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1206 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:GetDrivesCallback" GetDlgItem $1 $HWND 1207 ShowWindow $1 1 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Function" abort GetTime1Send: StrCmp $0 " 5. GetTime (local time)" 0 GetTime2Send StrCpy $FUNCTION '' GetDlgItem $1 $HWND 1201 ShowWindow $1 1 EnableWindow $1 0 SendMessage $1 ${WM_ENABLE} 1 0 GetDlgItem $1 $HWND 1202 ShowWindow $1 1 EnableWindow $1 0 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 EnableWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:L" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" Abort GetTime2Send: StrCmp $0 " (file time)" 0 GetFileAttributesSend StrCpy $FUNCTION GetTime GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETTIME1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETTIME2" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:File" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" Abort GetFileAttributesSend: StrCmp $0 " 6. GetFileAttributes" 0 GetFileVersionSend StrCpy $FUNCTION GetFileAttributes GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEATTRIBUTES1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEATTRIBUTES2" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Path" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Attrib" Abort GetFileVersionSend: StrCmp $0 " 7. GetFileVersion" 0 GetCmdSend StrCpy $FUNCTION GetFileVersion GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEVERSION1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:File" Abort GetCmdSend: StrCmp $0 " 8. GetExeName" +3 StrCmp $0 " 9. GetExePath" +2 StrCmp $0 "10. GetParameters" 0 GetOptionsSend StrCpy $FUNCTION '' GetDlgItem $1 $HWND 1205 ShowWindow $1 0 Abort GetOptionsSend: StrCmp $0 "11. GetOptions" 0 GetRootSend StrCpy $FUNCTION GetOptions GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETOPTIONS1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 EnableWindow $1 0 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETOPTIONS2" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Parameters" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" Abort GetRootSend: StrCmp $0 "12. GetRoot" 0 GetParentSend StrCpy $FUNCTION GetRoot GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETROOT1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:FullPath" Abort GetParentSend: StrCmp $0 "13. GetParent" 0 GetFileNameSend StrCpy $FUNCTION GetParent GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETPARENT1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString" Abort GetFileNameSend: StrCmp $0 "14. GetFileName" 0 GetBaseNameSend StrCpy $FUNCTION GetFileName GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILENAME1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString" Abort GetBaseNameSend: StrCmp $0 "15. GetBaseName" 0 GetFileExtSend StrCpy $FUNCTION GetBaseName GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETBASENAME1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:FileString" Abort GetFileExtSend: StrCmp $0 "16. GetFileExt" 0 BannerTrimPathSend StrCpy $FUNCTION GetFileExt GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEEXT1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:FileString" Abort BannerTrimPathSend: StrCmp $0 "17. BannerTrimPath" 0 DirStateSend StrCpy $FUNCTION BannerTrimPath GetDlgItem $1 $HWND 1201 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$BANNERTRIMPATH1" GetDlgItem $1 $HWND 1202 ShowWindow $1 1 EnableWindow $1 0 GetDlgItem $1 $HWND 1205 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$BANNERTRIMPATH2" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" Abort DirStateSend: StrCmp $0 "18. DirState" 0 RefreshShellIconsSend StrCpy $FUNCTION DirState GetDlgItem $1 $HWND 1203 ShowWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:$DIRSTATE1" GetDlgItem $1 $HWND 1204 ShowWindow $1 1 GetDlgItem $1 $HWND 1205 ShowWindow $1 0 GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory" Abort RefreshShellIconsSend: StrCmp $0 "19. RefreshShellIcons" 0 Abort StrCpy $FUNCTION '' GetDlgItem $1 $HWND 1205 ShowWindow $1 0 Abort: Abort ;=Enter= Enter: StrCpy $R0 '' StrCpy $R5 '' StrCmp $STATE " 1. Locate" Locate StrCmp $STATE " 2. GetSize (file)" GetSize StrCmp $STATE " (directory)" GetSize StrCmp $STATE " (no size, no subdir)" GetSize StrCmp $STATE " 3. DriveSpace" DriveSpace StrCmp $STATE " 4. GetDrives (by type)" GetDrives StrCmp $STATE " (all by letter)" GetDrives StrCmp $STATE " 5. GetTime (local time)" GetTime StrCmp $STATE " (file time)" GetTime StrCmp $STATE " 6. GetFileAttributes" GetFileAttributes StrCmp $STATE " 7. GetFileVersion" GetFileVersion StrCmp $STATE " 8. GetExeName" GetExeName StrCmp $STATE " 9. GetExePath" GetExePath StrCmp $STATE "10. GetParameters" GetParameters StrCmp $STATE "11. GetOptions" GetOptions StrCmp $STATE "12. GetRoot" GetRoot StrCmp $STATE "13. GetParent" GetParent StrCmp $STATE "14. GetFileName" GetFileName StrCmp $STATE "15. GetBaseName" GetBaseName StrCmp $STATE "16. GetFileExt" GetFileExt StrCmp $STATE "17. BannerTrimPath" BannerTrimPath StrCmp $STATE "18. DirState" DirState StrCmp $STATE "19. RefreshShellIcons" RefreshShellIcons Abort Locate: ${Locate} "$R2" "$R3" "LocateCallback" IfErrors error StrCmp $R0 StopLocate 0 +3 StrCpy $R0 'stopped' goto send StrCpy $R0 'done' goto send GetSize: ${GetSize} "$R2" "$R3" $0 $1 $2 IfErrors error StrCpy $R0 "Size=$0$\r$\nFiles=$1$\r$\nFolders=$2" goto send DriveSpace: ${DriveSpace} "$R1" "$R3" $0 IfErrors error StrCpy $R0 "$0" goto send GetDrives: ${GetDrives} "$R1" "GetDrivesCallback" StrCmp $R0 StopGetDrives 0 +3 StrCpy $R0 '$R5stopped' goto send StrCpy $R0 '$R5done' goto send GetTime: ${GetTime} "$R1" "$R3" $0 $1 $2 $3 $4 $5 $6 IfErrors error StrCpy $R0 'Date=$0/$1/$2 ($3)$\r$\nTime=$4:$5:$6' goto send GetFileAttributes: ${GetFileAttributes} "$R1" "$R3" $0 IfErrors error StrCpy $R0 '$0' goto send GetFileVersion: ${GetFileVersion} "$R1" $0 IfErrors error StrCpy $R0 '$0' goto send GetExeName: ${GetExeName} $0 StrCpy $R0 '$0' goto send GetExePath: ${GetExePath} $0 StrCpy $R0 '$0' goto send GetParameters: ${GetParameters} $0 StrCpy $R0 '$0' StrCmp $R0 '' 0 send StrCpy $R0 'no parameters' goto send GetOptions: ${GetOptions} "$R1" "$R3" $0 IfErrors error StrCpy $R0 '$0' goto send GetRoot: ${GetRoot} "$R1" $0 StrCpy $R0 '$0' goto send GetParent: ${GetParent} "$R1" $0 StrCpy $R0 '$0' goto send GetFileName: ${GetFileName} "$R1" $0 StrCpy $R0 '$0' goto send GetBaseName: ${GetBaseName} "$R1" $0 StrCpy $R0 '$0' goto send GetFileExt: ${GetFileExt} "$R1" $0 StrCpy $R0 '$0' goto send BannerTrimPath: ${BannerTrimPath} "$R1" "$R3" $0 StrCpy $R0 '$0' goto send DirState: ${DirState} "$R2" $0 StrCpy $R0 '$0' goto send RefreshShellIcons: ${RefreshShellIcons} StrCpy $R0 'done' goto send error: StrCpy $R0 'error' send: GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:$R0" abort FunctionEnd Function LocateCallback MessageBox MB_OKCANCEL '$$R9 "path\name"=[$R9]$\n$$R8 "path" =[$R8]$\n$$R7 "name" =[$R7]$\n$$R6 "size" =[$R6]' IDOK +2 StrCpy $R0 StopLocate Push $R0 FunctionEnd Function GetDrivesCallback MessageBox MB_OKCANCEL '$$9 "drive letter"=[$9]$\n$$8 "drive type" =[$8]' IDOK +2 StrCpy $R0 StopGetDrives StrCpy $R5 '$R5$9 [$8 Drive]$\r$\n' Push $R0 FunctionEnd Function .onInit InitPluginsDir GetTempFileName $INI $PLUGINSDIR File /oname=$INI "FileFunc.ini" FunctionEnd Page instfiles Section "Empty" SectionEnd nsis-3.11/Examples/FileFuncTest.nsi000077500000000000000000000337131477201124000172460ustar00rootroot00000000000000;_____________________________________________________________________________ ; ; File Functions Test ;_____________________________________________________________________________ ; ; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "File Functions Test" OutFile "FileFuncTest.exe" Caption "$(^Name)" ShowInstDetails show XPStyle on RequestExecutionLevel user Var FUNCTION Var OUT1 Var OUT2 Var OUT3 Var OUT4 Var OUT5 Var OUT6 Var OUT7 !include "FileFunc.nsh" !include "LogicLib.nsh" ;############### INSTALL ############### !define StackVerificationStart `!insertmacro StackVerificationStart` !macro StackVerificationStart _FUNCTION StrCpy $FUNCTION ${_FUNCTION} Call StackVerificationStart !macroend !define StackVerificationEnd `!insertmacro StackVerificationEnd` !macro StackVerificationEnd Call StackVerificationEnd !macroend Function StackVerificationStart StrCpy $0 !0 StrCpy $1 !1 StrCpy $2 !2 StrCpy $3 !3 StrCpy $4 !4 StrCpy $5 !5 StrCpy $6 !6 StrCpy $7 !7 StrCpy $8 !8 StrCpy $9 !9 StrCpy $R0 !R0 StrCpy $R1 !R1 StrCpy $R2 !R2 StrCpy $R3 !R3 StrCpy $R4 !R4 StrCpy $R5 !R5 StrCpy $R6 !R6 StrCpy $R7 !R7 StrCpy $R8 !R8 StrCpy $R9 !R9 FunctionEnd Function StackVerificationEnd IfErrors +3 DetailPrint 'PASSED $FUNCTION no errors' goto +2 DetailPrint 'FAILED $FUNCTION error' StrCmp $0 '!0' 0 error StrCmp $1 '!1' 0 error StrCmp $2 '!2' 0 error StrCmp $3 '!3' 0 error StrCmp $4 '!4' 0 error StrCmp $5 '!5' 0 error StrCmp $6 '!6' 0 error StrCmp $7 '!7' 0 error StrCmp $8 '!8' 0 error StrCmp $9 '!9' 0 error StrCmp $R0 '!R0' 0 error StrCmp $R1 '!R1' 0 error StrCmp $R2 '!R2' 0 error StrCmp $R3 '!R3' 0 error StrCmp $R4 '!R4' 0 error StrCmp $R5 '!R5' 0 error StrCmp $R6 '!R6' 0 error StrCmp $R7 '!R7' 0 error StrCmp $R8 '!R8' 0 error StrCmp $R9 '!R9' 0 error DetailPrint 'PASSED $FUNCTION stack' goto end error: DetailPrint 'FAILED $FUNCTION stack' ; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 ; quit end: FunctionEnd Section Locate ${StackVerificationStart} Locate ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'LocateCallback' ${StackVerificationEnd} SectionEnd Function LocateCallback ; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2 ; StrCpy $0 StopLocate Push $0 FunctionEnd Section GetSize ${StackVerificationStart} GetSize ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 ${StackVerificationEnd} SectionEnd Section DriveSpace ${StackVerificationStart} DriveSpace ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1 ${StackVerificationEnd} SectionEnd Section GetDrives ${StackVerificationStart} GetDrives ${GetDrives} 'FDD+CDROM' 'GetDrivesCallback' ${StackVerificationEnd} SectionEnd Function GetDrivesCallback ; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2 ; StrCpy $0 StopGetDrives Push $0 FunctionEnd Section GetTime ${StackVerificationStart} GetTime ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 ${StackVerificationEnd} SectionEnd Section GetFileAttributes ${StackVerificationStart} GetFileAttributes ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 ${StackVerificationEnd} SectionEnd Section GetFileVersion ${StackVerificationStart} GetFileVersion ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1 ${StackVerificationEnd} SectionEnd Section GetExeName ${StackVerificationStart} GetExeName ${GetExeName} $OUT1 ${StackVerificationEnd} SectionEnd Section GetExePath ${StackVerificationStart} GetExePath ${GetExePath} $OUT1 ${StackVerificationEnd} SectionEnd Section GetParameters ${StackVerificationStart} GetParameters # basic stuff StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe"' ${GetParameters} $OUT1 StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" test' ${GetParameters} $OUT2 StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" "test"' ${GetParameters} $OUT3 StrCpy $CMDLINE 'C:\Hello.exe' ${GetParameters} $OUT4 StrCpy $CMDLINE 'C:\Hello.exe test' ${GetParameters} $OUT5 StrCpy $CMDLINE 'C:\Hello.exe "test"' ${GetParameters} $OUT6 StrCpy $CMDLINE 'C:\Hello.exe test test ' ${GetParameters} $OUT7 ${If} $OUT1 != "" ${OrIf} $OUT2 != "test" ${OrIf} $OUT3 != '"test"' ${OrIf} $OUT4 != "" ${OrIf} $OUT5 != "test" ${OrIf} $OUT6 != '"test"' ${OrIf} $OUT7 != 'test test' SetErrors ${EndIf} # some corner cases StrCpy $CMDLINE '' ${GetParameters} $OUT1 StrCpy $CMDLINE '"' ${GetParameters} $OUT2 StrCpy $CMDLINE '""' ${GetParameters} $OUT3 StrCpy $CMDLINE '"" test' ${GetParameters} $OUT4 StrCpy $CMDLINE ' test' ${GetParameters} $OUT5 StrCpy $CMDLINE ' test' # left over bug(?) from old GetParameters # it starts looking for ' ' from the third char ${GetParameters} $OUT6 StrCpy $CMDLINE ' ' ${GetParameters} $OUT7 ${If} $OUT1 != "" ${OrIf} $OUT2 != "" ${OrIf} $OUT3 != "" ${OrIf} $OUT4 != "" ${OrIf} $OUT5 != "" ${OrIf} $OUT6 != "" ${OrIf} $OUT7 != "" SetErrors ${EndIf} ${StackVerificationEnd} SectionEnd Section GetOptions ${StackVerificationStart} GetOptions ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:\Program Files\Common Files' 0 error ${GetOptions} '-TMP=temp.tmp -INSTDIR="C:/Program Files/Common Files" -SILENT=yes' '-INSTDIR=' $OUT1 StrCmp $OUT1 'C:/Program Files/Common Files' 0 error ${GetOptions} "/INSTDIR='C:/Program Files/Common Files' /SILENT=yes" '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:/Program Files/Common Files' 0 error StrCpy $OUT1 '/INSTDIR=`C:/Program Files/Common Files` /SILENT=yes' ${GetOptions} '$OUT1' '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:/Program Files/Common Files' 0 error ${GetOptions} '/SILENT=yes /INSTDIR=C:\Program Files\Common Files' '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:\Program Files\Common Files' 0 error ${GetOptions} "/INSTDIR=common directory: 'C:\Program Files\Common Files' /SILENT=yes" '/INSTDIR=' $OUT1 StrCmp $OUT1 "common directory: 'C:\Program Files\Common Files'" 0 error ${GetOptions} '/INSTDIR=WxxxW /SILENT=yes' '/INSTDIR=' $OUT1 StrCmp $OUT1 'WxxxW' 0 error ${GetOptions} "/Prm='/D=True' /D=1" '/D=' $OUT1 StrCmp $OUT1 "1" 0 error ${GetOptions} "/D=1 /Prm='/D=True'" '/Prm=' $OUT1 StrCmp $OUT1 "/D=True" 0 error ${GetOptions} `/D=1 /Prm='/D="True" /S="/Temp"'` '/Prm=' $OUT1 StrCmp $OUT1 '/D="True" /S="/Temp"' 0 error ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR=' $OUT1 StrCmp $OUT1 '"C:/Program Files/Common Files"' 0 error ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR*=' $OUT1 IfErrors 0 error StrCmp $OUT1 '' 0 error ${GetOptions} `/INSTDIR="C:/Program Files/Common Files" /SILENT=yes` '' $OUT1 IfErrors 0 error StrCmp $OUT1 '' 0 error ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1 IfErrors error StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetOptionsS ${StackVerificationStart} GetOptionsS ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 IfErrors error StrCmp $OUT1 'C:\Program Files\Common Files' 0 error ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/Instdir=' $OUT1 IfErrors 0 error StrCmp $OUT1 '' 0 error ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1 IfErrors error StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetRoot ${StackVerificationStart} GetRoot ${GetRoot} 'C:\Program Files\NSIS' $OUT1 StrCmp $OUT1 'C:' 0 error ${GetRoot} '\\SuperPimp\NSIS\Source\exehead\Ui.c' $OUT1 StrCmp $OUT1 '\\SuperPimp\NSIS' 0 error ${GetRoot} '\\Program Files\NSIS' $OUT1 StrCmp $OUT1 '\\Program Files\NSIS' 0 error ${GetRoot} '\\Program Files\NSIS\' $OUT1 StrCmp $OUT1 '\\Program Files\NSIS' 0 error ${GetRoot} '\\Program Files\NSIS\Source\exehead\Ui.c' $OUT1 StrCmp $OUT1 '\\Program Files\NSIS' 0 error ${GetRoot} '\Program Files\NSIS' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetParent ${StackVerificationStart} GetParent ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'C:\Program Files\Winamp' 0 error ${GetParent} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 'C:\Program Files\Winamp' 0 error ${GetParent} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 'C:\Program Files\Winamp' 0 error ${GetParent} 'C:\' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetFileName ${StackVerificationStart} GetFileName ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa.exe' 0 error ${GetFileName} 'uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa.exe' 0 error ${GetFileName} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 'plugins' 0 error ${GetFileName} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 'plugins' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetBaseName ${StackVerificationStart} GetBaseName ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa' 0 error ${GetBaseName} 'uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa' 0 error ${GetBaseName} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 'plugins' 0 error ${GetBaseName} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetFileExt ${StackVerificationStart} GetFileExt ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'exe' 0 error ${GetFileExt} 'uninstwa.exe' $OUT1 StrCmp $OUT1 'exe' 0 error ${GetFileExt} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 '' 0 error ${GetFileExt} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section BannerTrimPath ${StackVerificationStart} BannerTrimPath ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 StrCmp $OUT1 'C:\Server\...\Terminal\license.htm' 0 error ${BannerTrimPath} 'C:\12\3456\789' '3A' $OUT1 StrCmp $OUT1 '' 0 error ${BannerTrimPath} 'C:\12\3456\789' '4A' $OUT1 StrCmp $OUT1 'C...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11A' $OUT1 StrCmp $OUT1 'C:\12\...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '13A' $OUT1 StrCmp $OUT1 'C:\12\...\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1 StrCmp $OUT1 'C:\12\3456\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1 StrCmp $OUT1 'C:\12\3456\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11B' $OUT1 StrCmp $OUT1 'C:\12\...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1 StrCmp $OUT1 'C:...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1 StrCmp $OUT1 'C:...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11C' $OUT1 StrCmp $OUT1 'C:\12\34...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '9D' $OUT1 StrCmp $OUT1 'C:\12\...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '10D' $OUT1 StrCmp $OUT1 'C:\...\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11D' $OUT1 StrCmp $OUT1 'C:\1...\789' 0 error ${BannerTrimPath} '123456789' '5D' $OUT1 StrCmp $OUT1 '12...' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section DirState ${StackVerificationStart} DirState ${DirState} '$TEMP' $OUT1 ${StackVerificationEnd} SectionEnd Section RefreshShellIcons ${StackVerificationStart} RefreshShellIcons ${RefreshShellIcons} ${StackVerificationEnd} SectionEnd Section WriteUninstaller goto +2 WriteUninstaller '$EXEDIR\un.FileFuncTest.exe' SectionEnd ;############### UNINSTALL ############### Section un.Uninstall ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'un.LocateCallback' ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1 ${GetDrives} 'FDD+CDROM' 'un.GetDrivesCallback' ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1 ${GetExeName} $OUT1 ${GetExePath} $OUT1 ${GetParameters} $OUT1 ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 ${GetRoot} 'C:\Program Files\NSIS' $OUT1 ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 ${DirState} '$TEMP' $OUT1 ${RefreshShellIcons} SectionEnd Function un.LocateCallback Push $0 FunctionEnd Function un.GetDrivesCallback Push $0 FunctionEnd nsis-3.11/Examples/Library.nsi000077500000000000000000000202561477201124000163150ustar00rootroot00000000000000# This example tests the compile time aspect of the Library macros # more than the runtime aspect. It is more of a syntax example, # rather than a usage example. !include "Library.nsh" Name "Library Test" OutFile "Library Test.exe" InstallDir "$TEMP\Library Test" Page directory Page instfiles XPStyle on RequestExecutionLevel user !define TestDLL '"${NSISDIR}\Plugins\${NSIS_CPU}-unicode\LangDLL.dll"' !define TestEXE '"${NSISDIR}\Contrib\UIs\default.exe"' Section !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib DLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib TLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGDLLTLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR !insertmacro InstallLib REGEXE $0 REBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR !insertmacro InstallLib REGEXE $0 NOREBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR !insertmacro InstallLib REGEXE $0 REBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR !insertmacro InstallLib REGEXE $0 NOREBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR WriteUninstaller $INSTDIR\uninstall.exe SectionEnd Section uninstall !insertmacro UninstallLib DLL NOTSHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL NOTSHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib REGDLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB NOTSHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib TLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB NOTSHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL SHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib DLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL SHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib REGDLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB SHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib TLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib TLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB SHARED NOREMOVE $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll !insertmacro UninstallLib REGEXE SHARED NOREMOVE $INSTDIR\test.exe !insertmacro UninstallLib REGEXE SHARED REBOOT_PROTECTED $INSTDIR\test.exe !insertmacro UninstallLib REGEXE SHARED NOREBOOT_PROTECTED $INSTDIR\test.exe !insertmacro UninstallLib REGEXE SHARED REBOOT_NOTPROTECTED $INSTDIR\test.exe !insertmacro UninstallLib REGEXE SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.exe SectionEnd nsis-3.11/Examples/LogicLib.nsi000077500000000000000000000303351477201124000163740ustar00rootroot00000000000000!verbose 2 Name "NSIS LogicLib Example" OutFile "LogicLib.exe" ShowInstDetails show RequestExecutionLevel user !include "LogicLib.nsh" ;!undef LOGICLIB_VERBOSITY ;!define LOGICLIB_VERBOSITY 4 ; For debugging - watch what logiclib does with your code! Page components "" "" ComponentsLeave Page instfiles Section /o "Run tests" TESTS ; kinds of if other than "value1 comparison value2" ClearErrors FindFirst $R1 $R2 "$PROGRAMFILES\*" ${Unless} ${Errors} ${Do} ${Select} $R2 ${Case2} "." ".." ; Do nothing ${CaseElse} DetailPrint "Found $PROGRAMFILES\$R2" ${EndSelect} FindNext $R1 $R2 ${LoopUntil} ${Errors} FindClose $R1 ${EndUnless} ${If} ${FileExists} "${__FILE__}" DetailPrint 'Source file "${__FILE__}" still exists' ${Else} DetailPrint 'Source file "${__FILE__}" has gone' ${EndIf} ; if..endif StrCpy $R1 1 StrCpy $R2 "" ${If} $R1 = 1 StrCpy $R2 $R2A ${EndIf} ${If} $R1 = 2 StrCpy $R2 $R2B ${EndIf} ${If} $R1 < 2 StrCpy $R2 $R2C ${EndIf} ${If} $R1 < -2 StrCpy $R2 $R2D ${EndIf} ${If} $R1 > 2 StrCpy $R2 $R2E ${EndIf} ${If} $R1 > -2 StrCpy $R2 $R2F ${EndIf} ${If} $R1 <> 1 StrCpy $R2 $R2G ${EndIf} ${If} $R1 <> 2 StrCpy $R2 $R2H ${EndIf} ${If} $R1 >= 2 StrCpy $R2 $R2I ${EndIf} ${If} $R1 >= -2 StrCpy $R2 $R2J ${EndIf} ${If} $R1 <= 2 StrCpy $R2 $R2K ${EndIf} ${If} $R1 <= -2 StrCpy $R2 $R2L ${EndIf} ${If} $R2 == "ACFHJK" DetailPrint "PASSED If..EndIf test" ${Else} DetailPrint "FAILED If..EndIf test" ${EndIf} ; if..elseif..else..endif StrCpy $R1 A StrCpy $R2 "" ${If} $R1 == A StrCpy $R2 $R2A ${ElseIf} $R1 == B StrCpy $R2 $R2B ${ElseUnless} $R1 != C StrCpy $R2 $R2C ${Else} StrCpy $R2 $R2D ${EndIf} ${If} $R1 == D StrCpy $R2 $R2D ${ElseIf} $R1 == A StrCpy $R2 $R2A ${ElseUnless} $R1 != B StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2C ${EndIf} ${If} $R1 == C StrCpy $R2 $R2C ${ElseIf} $R1 == D StrCpy $R2 $R2D ${ElseUnless} $R1 != A StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} $R1 == B StrCpy $R2 $R2B ${ElseIf} $R1 == C StrCpy $R2 $R2C ${ElseUnless} $R1 != D StrCpy $R2 $R2D ${Else} StrCpy $R2 $R2A ${EndIf} ${If} $R2 == "$R1$R1$R1$R1" DetailPrint "PASSED If..ElseIf..Else..EndIf test" ${Else} DetailPrint "FAILED If..ElseIf..Else..EndIf test" ${EndIf} ; if..andif..orif..endif StrCpy $R2 "" ${If} 1 = 1 ${AndIf} 2 = 2 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 2 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 2 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 2 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 2 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 3 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 2 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 3 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 2 ${OrIf} 3 = 4 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 3 ${OrIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 2 ${OrIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 3 ${OrIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 2 ${AndIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 3 ${AndIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 2 ${AndIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 3 ${AndIf} 3 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 2 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 3 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 2 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 3 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} $R2 == "AAAAAAAAAAAAAAAAAAAAAAAA" DetailPrint "PASSED If..AndIf..OrIf..Else..EndIf test" ${Else} DetailPrint "FAILED If..AndIf..OrIf..Else..EndIf test" ${EndIf} ; ifthen..|..| StrCpy $R1 1 StrCpy $R2 "" ${IfThen} $R1 = 1 ${|} StrCpy $R2 $R2A ${|} ${IfThen} $R1 = 2 ${|} StrCpy $R2 $R2B ${|} ${IfNotThen} $R1 = 1 ${|} StrCpy $R2 $R2C ${|} ${IfNotThen} $R1 = 2 ${|} StrCpy $R2 $R2D ${|} ${If} $R2 == "AD" DetailPrint "PASSED IfThen test" ${Else} DetailPrint "FAILED IfThen test" ${EndIf} ; ifcmd..||..| and if/unless cmd StrCpy $R2 "" ${IfCmd} MessageBox MB_YESNO "Please click Yes" IDYES ${||} StrCpy $R2 $R2A ${|} ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 "Please click No" IDYES` StrCpy $R2 $R2B ${EndUnless} ${If} $R2 == "AB" DetailPrint "PASSED IfCmd/If Cmd test" ${Else} DetailPrint "FAILED IfCmd/If Cmd test" ${EndIf} ; select..case..case2..case3..case4..case5..caseelse..endselect StrCpy $R1 1 StrCpy $R2 "" ${Select} $R1 ${Case} "1" StrCpy $R2 $R2A ${Case} "2" StrCpy $R2 $R2B ${Case2} "3" "4" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${Select} $R1 ${Case} "2" StrCpy $R2 $R2A ${Case} "3" StrCpy $R2 $R2B ${Case2} "4" "5" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${Select} $R1 ${Case} "3" StrCpy $R2 $R2A ${Case} "4" StrCpy $R2 $R2B ${Case2} "5" "1" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${Select} $R1 ${Case} "4" StrCpy $R2 $R2A ${Case} "5" StrCpy $R2 $R2B ${Case2} "1" "2" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${If} $R2 == "ADCC" DetailPrint "PASSED Select..Case*..EndSelect test" ${Else} DetailPrint "FAILED Select..Case*..EndSelect test" ${EndIf} ; switch..case..caseelse..endswitch StrCpy $R2 "" ${For} $R1 1 10 ${Switch} $R1 ${Case} 3 StrCpy $R2 $R2A ${Case} 4 StrCpy $R2 $R2B ${Break} ${Case} 5 StrCpy $R2 $R2C ${EndSwitch} ${Switch} $R1 ${Case} 1 StrCpy $R2 $R2D ${Default} StrCpy $R2 $R2E ${Break} ${Case} 2 StrCpy $R2 $R2F ${EndSwitch} ${Switch} $R1 ${Case} 6 ${Case} 7 StrCpy $R2 $R2G ${If} $R1 = 6 ${Case} 8 StrCpy $R2 $R2H ${Switch} $R1 ${Case} 6 StrCpy $R2 $R2I ${Break} ${Case} 8 StrCpy $R2 $R2J ${EndSwitch} ${EndIf} StrCpy $R2 $R2K ${Break} ${Default} StrCpy $R2 $R2L ${Case} 9 StrCpy $R2 $R2M ${EndSwitch} ${Next} ${If} $R2 == "DELMFLMABELMBELMCELMEGHIKEGKEHJKEMELM" DetailPrint "PASSED Switch..Case*..EndSwitch test" ${Else} DetailPrint "FAILED Switch..Case*..EndSwitch test" ${EndIf} ; for[each]..exitfor..next StrCpy $R2 "" ${For} $R1 1 5 StrCpy $R2 $R2$R1 ${Next} ${ForEach} $R1 10 1 - 1 StrCpy $R2 $R2$R1 ${Next} ${For} $R1 1 0 StrCpy $R2 $R2$R1 ${Next} ${If} $R2 == "1234510987654321" DetailPrint "PASSED For[Each]..Next test" ${Else} DetailPrint "FAILED For[Each]..Next test" ${EndIf} ; do..loop StrCpy $R1 0 Call DoLoop ${If} $R1 == 5 DetailPrint "PASSED Do..Loop test" ${Else} DetailPrint "FAILED Do..Loop test" ${EndIf} ; do..exitdo..loop StrCpy $R1 0 StrCpy $R2 "" ${Do} StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${If} $R1 > 10 ${ExitDo} ${EndIf} ${Loop} ${If} $R2 == "012345678910" DetailPrint "PASSED Do..ExitDo..Loop test" ${Else} DetailPrint "FAILED Do..ExitDo..Loop test" ${EndIf} ; do..exitdo..loopuntil StrCpy $R1 0 StrCpy $R2 "" ${Do} StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${LoopUntil} $R1 >= 5 ${If} $R2 == "01234" DetailPrint "PASSED Do..ExitDo..LoopUntil test" ${Else} DetailPrint "FAILED Do..ExitDo..LoopUntil test" ${EndIf} ; dountil..exitdo..loop StrCpy $R1 0 StrCpy $R2 "" ${DoUntil} $R1 >= 5 StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${Loop} ${If} $R2 == "01234" DetailPrint "PASSED DoUntil..ExitDo..Loop test" ${Else} DetailPrint "FAILED DoUntil..ExitDo..Loop test" ${EndIf} ; nested do test StrCpy $R1 0 StrCpy $R2 0 StrCpy $R3 "" ${Do} StrCpy $R3 $R3$R1$R2 IntOp $R1 $R1 + 1 ${If} $R1 > 5 ${ExitDo} ${EndIf} StrCpy $R2 0 ${Do} StrCpy $R3 $R3$R1$R2 IntOp $R2 $R2 + 1 ${If} $R2 >= 5 ${ExitDo} ${EndIf} ${Loop} ${Loop} ${If} $R3 == "00101112131415202122232425303132333435404142434445505152535455" DetailPrint "PASSED nested Do test" ${Else} DetailPrint "FAILED nested Do test" ${EndIf} ; while..exitwhile..endwhile (exact replica of dowhile..enddo} StrCpy $R1 0 StrCpy $R2 "" ${While} $R1 < 5 StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${EndWhile} ${If} $R2 == "01234" DetailPrint "PASSED While..ExitWhile..EndWhile test" ${Else} DetailPrint "FAILED While..ExitWhile..EndWhile test" ${EndIf} ; Unsigned integer tests StrCpy $R2 "" ${If} -1 < 1 StrCpy $R2 $R2A ${EndIf} ${If} -1 U< 1 StrCpy $R2 $R2B ${EndIf} ${If} 0xFFFFFFFF > 1 StrCpy $R2 $R2C ${EndIf} ${If} 0xFFFFFFFF U> 1 StrCpy $R2 $R2D ${EndIf} ${If} $R2 == "AD" DetailPrint "PASSED unsigned integer test" ${Else} DetailPrint "FAILED unsigned integer test" ${EndIf} ; 64-bit integer tests (uses System.dll) StrCpy $R2 "" ${If} 0x100000000 L= 4294967296 StrCpy $R2 $R2A ${EndIf} ${If} 0x100000000 L< 0x200000000 StrCpy $R2 $R2B ${EndIf} ${If} 0x500000000 L>= 0x500000000 StrCpy $R2 $R2C ${EndIf} ${If} $R2 == "ABC" DetailPrint "PASSED 64-bit integer test" ${Else} DetailPrint "FAILED 64-bit integer test" ${EndIf} ; Extra string tests (uses System.dll) StrCpy $R2 "" ${If} "A" S< "B" StrCpy $R2 $R2A ${EndIf} ${If} "b" S> "A" StrCpy $R2 $R2B ${EndIf} ${If} "a" S<= "B" StrCpy $R2 $R2C ${EndIf} ${If} "B" S< "B" StrCpy $R2 $R2D ${EndIf} ${If} "A" S== "A" StrCpy $R2 $R2E ${EndIf} ${If} "A" S== "a" StrCpy $R2 $R2F ${EndIf} ${If} "A" S!= "a" StrCpy $R2 $R2G ${EndIf} ${If} $R2 == "ABCEG" DetailPrint "PASSED extra string test" ${Else} DetailPrint "FAILED extra string test" ${EndIf} SectionEnd Function ComponentsLeave ; Section flags tests (requires sections.nsh be included) ${Unless} ${SectionIsSelected} ${TESTS} MessageBox MB_OK "Please select the component" Abort ${EndIf} FunctionEnd Function DoLoop ${Do} IntOp $R1 $R1 + 1 ${If} $R1 == 5 Return ${EndIf} ${Loop} FunctionEnd !verbose 3 nsis-3.11/Examples/Memento.nsi000077500000000000000000000027741477201124000163220ustar00rootroot00000000000000!include LogicLib.nsh !include Memento.nsh Name Memento OutFile Memento.exe XPStyle on ShowInstDetails show Page components Page instfiles RequestExecutionLevel user # settings !define MEMENTO_REGISTRY_ROOT HKCU !define MEMENTO_REGISTRY_KEY "Software\NSIS\Memento Test" # restore Function .onInit ${If} ${Cmd} `MessageBox MB_YESNO "Would you like to load an example state?" IDYES` DeleteRegKey HKCU "Software\NSIS\Memento Test" WriteRegStr HKCU "Software\NSIS\Memento Test" MementoSectionUsed "" WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_horse 1 WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_chicken 1 WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_donkey 0 WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_croc 0 ${EndIf} ${MementoSectionRestore} FunctionEnd # sections ${MementoSection} horse sec_horse ${MementoSectionEnd} ${MementoSection} donkey sec_donkey ${MementoSectionEnd} ${MementoSection} chicken sec_chicken ${MementoSectionEnd} SectionGroup /e group SectionGroup /e group ${MementoSection} croc sec_croc ${MementoSectionEnd} ${MementoSection} cow sec_cow ${MementoSectionEnd} SectionGroupEnd SectionGroupEnd ${MementoUnselectedSection} dinosaur sec_dinosaur ${MementoSectionEnd} # done... ${MementoSectionDone} # save Function .onInstSuccess ${MementoSectionSave} FunctionEnd nsis-3.11/Examples/Modern UI/000077500000000000000000000000001477201124000157105ustar00rootroot00000000000000nsis-3.11/Examples/Modern UI/Basic.nsi000077500000000000000000000036611477201124000174550ustar00rootroot00000000000000;NSIS Modern User Interface ;Basic Example Script ;Written by Joost Verburg ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Name and file Name "Modern UI Test" OutFile "Basic.exe" Unicode True ;Default installation folder InstallDir "$LOCALAPPDATA\Modern UI Test" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Modern UI Test" "" ;Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Dummy Section" SecDummy SetOutPath "$INSTDIR" ;ADD YOUR OWN FILES HERE... ;Store installation folder WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ;ADD YOUR OWN FILES HERE... Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" DeleteRegKey /ifempty HKCU "Software\Modern UI Test" SectionEndnsis-3.11/Examples/Modern UI/HeaderBitmap.nsi000077500000000000000000000040741477201124000207600ustar00rootroot00000000000000;NSIS Modern User Interface ;Header Bitmap Example Script ;Written by Joost Verburg ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Name and file Name "Modern UI Test" OutFile "HeaderBitmap.exe" Unicode True ;Default installation folder InstallDir "$LOCALAPPDATA\Modern UI Test" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Modern UI Test" "" ;Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ;Interface Configuration !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" ; optional !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Dummy Section" SecDummy SetOutPath "$INSTDIR" ;ADD YOUR OWN FILES HERE... ;Store installation folder WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ;ADD YOUR OWN FILES HERE... Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" DeleteRegKey /ifempty HKCU "Software\Modern UI Test" SectionEndnsis-3.11/Examples/Modern UI/MultiLanguage.nsi000077500000000000000000000135531477201124000211730ustar00rootroot00000000000000;NSIS Modern User Interface ;Multilingual Example Script ;Written by Joost Verburg !pragma warning error all ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!) Unicode true ;Name and file Name "Modern UI Test" OutFile "MultiLanguage.exe" ;Default installation folder InstallDir "$LOCALAPPDATA\Modern UI Test" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Modern UI Test" "" ;Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;Show all languages, despite user's codepage !define MUI_LANGDLL_ALLLANGUAGES ;-------------------------------- ;Language Selection Dialog Settings ;Remember the installer language !define MUI_LANGDLL_REGISTRY_ROOT "HKCU" !define MUI_LANGDLL_REGISTRY_KEY "Software\Modern UI Test" !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" ;-------------------------------- ;Pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_UNPAGE_COMPONENTS !insertmacro MUI_UNPAGE_DIRECTORY !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ; The first language is the default language !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "SpanishInternational" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "Japanese" !insertmacro MUI_LANGUAGE "Korean" !insertmacro MUI_LANGUAGE "Italian" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "Danish" !insertmacro MUI_LANGUAGE "Swedish" !insertmacro MUI_LANGUAGE "Norwegian" !insertmacro MUI_LANGUAGE "NorwegianNynorsk" !insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Ukrainian" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Slovak" !insertmacro MUI_LANGUAGE "Croatian" !insertmacro MUI_LANGUAGE "Bulgarian" !insertmacro MUI_LANGUAGE "Hungarian" !insertmacro MUI_LANGUAGE "Thai" !insertmacro MUI_LANGUAGE "Romanian" !insertmacro MUI_LANGUAGE "Latvian" !insertmacro MUI_LANGUAGE "Macedonian" !insertmacro MUI_LANGUAGE "Estonian" !insertmacro MUI_LANGUAGE "Turkish" !insertmacro MUI_LANGUAGE "Lithuanian" !insertmacro MUI_LANGUAGE "Slovenian" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "SerbianLatin" !insertmacro MUI_LANGUAGE "Arabic" !insertmacro MUI_LANGUAGE "Farsi" !insertmacro MUI_LANGUAGE "Hebrew" !insertmacro MUI_LANGUAGE "Indonesian" !insertmacro MUI_LANGUAGE "Mongolian" !insertmacro MUI_LANGUAGE "Luxembourgish" !insertmacro MUI_LANGUAGE "Albanian" !insertmacro MUI_LANGUAGE "Breton" !insertmacro MUI_LANGUAGE "Belarusian" !insertmacro MUI_LANGUAGE "Icelandic" !insertmacro MUI_LANGUAGE "Malay" !insertmacro MUI_LANGUAGE "Bosnian" !insertmacro MUI_LANGUAGE "Kurdish" !insertmacro MUI_LANGUAGE "Irish" !insertmacro MUI_LANGUAGE "Uzbek" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "Afrikaans" !insertmacro MUI_LANGUAGE "Catalan" !insertmacro MUI_LANGUAGE "Esperanto" !insertmacro MUI_LANGUAGE "Asturian" !insertmacro MUI_LANGUAGE "Basque" !insertmacro MUI_LANGUAGE "Pashto" !insertmacro MUI_LANGUAGE "ScotsGaelic" !insertmacro MUI_LANGUAGE "Georgian" !insertmacro MUI_LANGUAGE "Vietnamese" !insertmacro MUI_LANGUAGE "Welsh" !insertmacro MUI_LANGUAGE "Armenian" !insertmacro MUI_LANGUAGE "Corsican" !insertmacro MUI_LANGUAGE "Tatar" !insertmacro MUI_LANGUAGE "Hindi" ;-------------------------------- ;Reserve Files ;If you are using solid compression, files that are required before ;the actual installation should be stored first in the data block, ;because this will make your installer start faster. !insertmacro MUI_RESERVEFILE_LANGDLL ;-------------------------------- ;Installer Sections Section "Dummy Section" SecDummy SetOutPath "$INSTDIR" ;ADD YOUR OWN FILES HERE... ;Store installation folder WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd ;-------------------------------- ;Installer Functions Function .onInit !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd ;-------------------------------- ;Descriptions ;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGUAGE SPECIFIC ;Assign descriptions to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} "A test section." !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ;ADD YOUR OWN FILES HERE... Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" DeleteRegKey /ifempty HKCU "Software\Modern UI Test" SectionEnd ;-------------------------------- ;Uninstaller Functions Function un.onInit !insertmacro MUI_UNGETLANGUAGE FunctionEndnsis-3.11/Examples/Modern UI/StartMenu.nsi000077500000000000000000000054061477201124000203550ustar00rootroot00000000000000;NSIS Modern User Interface ;Start Menu Folder Selection Example Script ;Written by Joost Verburg ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Name and file Name "Modern UI Test" OutFile "StartMenu.exe" Unicode True ;Default installation folder InstallDir "$LOCALAPPDATA\Modern UI Test" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Modern UI Test" "" ;Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ;Variables Var StartMenuFolder ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Modern UI Test" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Dummy Section" SecDummy SetOutPath "$INSTDIR" ;ADD YOUR OWN FILES HERE... ;Store installation folder WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ;ADD YOUR OWN FILES HERE... Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" DeleteRegKey /ifempty HKCU "Software\Modern UI Test" SectionEndnsis-3.11/Examples/Modern UI/WelcomeFinish.nsi000077500000000000000000000041021477201124000211570ustar00rootroot00000000000000;NSIS Modern User Interface ;Welcome/Finish Page Example Script ;Written by Joost Verburg ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Name and file Name "Modern UI Test" OutFile "WelcomeFinish.exe" Unicode True ;Default installation folder InstallDir "$LOCALAPPDATA\Modern UI Test" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Modern UI Test" "" ;Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Dummy Section" SecDummy SetOutPath "$INSTDIR" ;ADD YOUR OWN FILES HERE... ;Store installation folder WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ;ADD YOUR OWN FILES HERE... Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" DeleteRegKey /ifempty HKCU "Software\Modern UI Test" SectionEnd nsis-3.11/Examples/MultiUser.nsi000077500000000000000000000035361477201124000166440ustar00rootroot00000000000000Name "MultiUser example" OutFile "MultiUser.exe" !define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${UNINSTKEY}" !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "CurrentUser" !define MULTIUSER_INSTALLMODE_INSTDIR "$(^Name)" !define MULTIUSER_INSTALLMODE_COMMANDLINE !define MULTIUSER_EXECUTIONLEVEL Highest !define MULTIUSER_MUI !include "LogicLib.nsh" !include "MultiUser.nsh" !include "MUI2.nsh" !insertmacro MUI_PAGE_WELCOME !insertmacro MULTIUSER_PAGE_INSTALLMODE !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" Function .onInit !insertmacro MULTIUSER_INIT FunctionEnd Function un.onInit !insertmacro MULTIUSER_UNINIT FunctionEnd Section SetOutPath "$InstDir" WriteUninstaller "$InstDir\Uninstall.exe" WriteRegStr ShCtx "${UNINSTKEY}" DisplayName "$(^Name)" WriteRegStr ShCtx "${UNINSTKEY}" UninstallString '"$InstDir\Uninstall.exe"' WriteRegStr ShCtx "${UNINSTKEY}" $MultiUser.InstallMode 1 ; Write MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME so the correct context can be detected in the uninstaller. !tempfile APP !makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NsisMultiUserExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0 File "/oname=$InstDir\MyApp.exe" "${APP}" ; Pretend that we have a real application to install !delfile "${APP}" SectionEnd Section "Start Menu shortcut" CreateShortcut /NoWorkingDir "$SMPrograms\$(^Name).lnk" "$InstDir\MyApp.exe" SectionEnd Section "-Uninstall" Delete "$SMPrograms\$(^Name).lnk" Delete "$InstDir\MyApp.exe" Delete "$InstDir\Uninstall.exe" DeleteRegKey ShCtx "${UNINSTKEY}" RMDir $InstDir SectionEnd nsis-3.11/Examples/NSISMenu.nsi000077500000000000000000000313311477201124000163060ustar00rootroot00000000000000OutFile "NSIS.exe" Name "NSIS Menu" Unicode True RequestExecutionLevel User XPStyle On ManifestDPIAware System SetCompressor LZMA ChangeUI IDD_INST "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe" Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis-menu.ico" BrandingText " " MiscButtonText " " " " " " " " InstallButtonText " " CompletedText " " LangString ^ClickInstall 0 " " Caption "$(^Name)" !macro UNPACKVERFIELD out in shr mask fmt !define /redef /math ${out} ${in} >>> ${shr} !define /redef /math ${out} ${${out}} & ${mask} !define /redef /intfmt ${out} "${fmt}" ${${out}} !macroend !ifndef VER_MAJOR & VER_MINOR !ifdef NSIS_PACKEDVERSION !insertmacro UNPACKVERFIELD VER_MAJOR ${NSIS_PACKEDVERSION} 24 0x0ff "%X" !insertmacro UNPACKVERFIELD VER_MINOR ${NSIS_PACKEDVERSION} 12 0xfff "%X" !insertmacro UNPACKVERFIELD VER_REVISION ${NSIS_PACKEDVERSION} 4 255 "%X" !insertmacro UNPACKVERFIELD VER_BUILD ${NSIS_PACKEDVERSION} 00 0x00f "%X" !endif !endif !ifdef VER_MAJOR & VER_MINOR !define /ifndef VER_REVISION 0 !define /ifndef VER_BUILD 0 !searchreplace VERSTR "${NSIS_VERSION}" "v" "" VIProductVersion ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} VIAddVersionKey "ProductName" "NSIS" VIAddVersionKey "ProductVersion" "${VERSTR}" VIAddVersionKey "FileVersion" "${VERSTR}" VIAddVersionKey "FileDescription" "NSIS Menu" VIAddVersionKey "LegalCopyright" "http://nsis.sf.net/License" !endif !include nsDialogs.nsh !include WinMessages.nsh !include LogicLib.nsh !define /IfNDef IDC_CHILDRECT 1018 !define QUIT_ON_EXECUTE !define PR $ExeDir ; Local root path !define PD "Docs" ; Local with WWW fallback (located at the same relative path) !define WWW "http://nsis.sf.net" !define CB_HEADER '0x755585 0x222222' !define UY_HEADER 28 !define CT_PAGE '0x000000 0xaaaaaa' !define CB_PAGE '0xffffff 0x111111' !define CT_SECTION '0x666666 0xeeeeee' !define CB_SECTION '${CB_PAGE}' !define UY_SECTION 11 ; Height of a section !define UY_SECTIONBPAD 2 ; Extra padding on the bottom of section headers !define UY_TXT 9 ; Height of a normal item !define UY_TXTBPAD 1 ; Extra padding on the bottom of normal items !define UX_COLPAD 7 ; Spacing between columns !define UY_ROW2 104 ; Absolute position of the 2nd row !define CT_LINK '0x0c6e97 0x0c6e97' ; SYSCLR:HOTLIGHT !define /Math UX_PAGE 00 + ${UX_COLPAD} !define /Math UY_PAGE ${UY_HEADER} + 20 !define UX ${UX_PAGE} !define CB_FOOTERLINE '0xc4c4c4 0x333333' !define CT_FOOTER '0xbbbbbb 0x444444' Var UseLightTheme Function .onGUIInit ReadRegDWORD $UseLightTheme HKCU "Software\NSIS" "UseLightTheme" StrCmp $UseLightTheme "" 0 +2 ReadRegDWORD $UseLightTheme HKCU "Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" "AppsUseLightTheme" StrCmp $UseLightTheme "" 0 +2 StrCpy $UseLightTheme 1 ; Default StrCmp $UseLightTheme "0" 0 +5 System::Call 'DWMAPI::DwmSetWindowAttribute(p$hWndParent,i20,*i1,i4)i.r0' ; 20H1 IntCmp $0 0 +3 +3 System::Call 'DWMAPI::DwmSetWindowAttribute(p$hWndParent,i19,*i1,i4)i.r0' ; ; 19H1 System::Call 'USER32::SetProp(p$hWndParent,t"UseImmersiveDarkModeColors",i1)' ; 1809 FunctionEnd !define SetCtlColors "!insertmacro SetCtlColors " !macro SetCtlColors hWnd ctlig ctdar cblig cbdar StrCmp $UseLightTheme "0" 0 +3 SetCtlColors ${hWnd} "${ctdar}" ${cbdar} Goto +2 SetCtlColors ${hWnd} "${ctlig}" ${cblig} !macroend Function PageLeave System::Call 'USER32::GetFocus()p.r0' System::Call 'USER32::GetDlgCtrlID(pr0)i.r1' System::Call 'USER32::GetParent(pr0)p.r2' SendMessage $2 ${WM_COMMAND} $1 $0 ; Handle in dialog by pretending it was a click on the active control Abort FunctionEnd Function PageCreate GetDlgItem $0 $hWndParent 1 ShowWindow $0 0 GetDlgItem $0 $hWndParent 2 ShowWindow $0 0 System::Call 'USER32::GetClientRect(p$hWndParent,@r0)' System::Call '*$0(i,i,i.r3,i.r4)' GetDlgItem $0 $hWndParent ${IDC_CHILDRECT} System::Call 'USER32::MoveWindow(pr0,i0,i0,ir3,ir4,i0)' nsDialogs::Create ${IDC_CHILDRECT} Pop $R9 ${SetCtlColors} $R9 ${CT_PAGE} ${CB_PAGE} !macro StartColumn W !define /ReDef UY ${UY_PAGE} !define /ReDef UX_W ${W} !ifdef UX_INTERNAL_PREV_W !define /ReDef /Math UX ${UX} + ${UX_INTERNAL_PREV_W} !define /ReDef /Math UX ${UX} + ${UX_COLPAD} !define /ReDef UX_INTERNAL_PREV_W ${UX_W} !else !define /Math UX_INTERNAL_PREV_W 0 + ${UX_W} !endif !macroend !macro CreateHeader Txt W !define /ReDef /Math W ${W} + 4 ; Make it slightly wider ${NSD_CreateLabel} ${UX}u ${UY}u ${W}u ${UY_SECTION}u "${Txt}" Pop $0 ${SetCtlColors} $0 ${CT_SECTION} transparent transparent SendMessage $0 ${WM_SETFONT} ${HF_HEADER} 1 !define /ReDef /Math UY ${UY} + ${UY_SECTION} !define /ReDef /Math UY ${UY} + ${UY_SECTIONBPAD} !macroend !macro CreateControl Class Txt W H ${NSD_Create${Class}} ${UX}u ${UY}u ${W}u ${H}u "${Txt}" !define /ReDef /Math UY ${UY} + ${H} !define /ReDef /Math UY ${UY} + ${UY_TXTBPAD} !macroend !macro CreateSimpleLinkHelper Txt Url W !insertmacro CreateControl Link "${Txt}|${Url}" ${W} ${UY_TXT} !macroend !macro CreateSimpleLink Txt Url W !insertmacro CreateSimpleLinkHelper "${Txt}" "${Url}" ${W} Call ConfigureLink !macroend ; --- Header --- !define HF_HEADER $R8 CreateFont ${HF_HEADER} "Arial" ${UY_SECTION} 700 nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE} ${__NSD_Label_EXSTYLE} 33u 0 -33u ${UY_HEADER}u "" Pop $0 ${SetCtlColors} $0 0xffffff 0xffffff ${CB_HEADER} ; CCv5 does not paint the background outside of the icon correctly when SS_CENTERIMAGE is used so we have to overlay a small icon on top of the background nsDialogs::CreateControl ${__NSD_Icon_CLASS} ${__NSD_Icon_STYLE} ${__NSD_Icon_EXSTYLE} 4u 4u 33u ${UY_HEADER}u "" Pop $0 ${SetCtlColors} $0 "" "" ${CB_HEADER} ${NSD_SetIconFromInstaller} $0 $1 nsDialogs::CreateControl ${__NSD_Icon_CLASS} ${__NSD_Icon_STYLE}|${SS_CENTERIMAGE}|${SS_CENTER} ${__NSD_Icon_EXSTYLE} 0 0 33u ${UY_HEADER}u "" Pop $0 ${SetCtlColors} $0 "" "" ${CB_HEADER} CreateFont $1 "Trebuchet MS" 17 !searchreplace VERSTR "${NSIS_VERSION}" "v" "" nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_ENDELLIPSIS} ${__NSD_Label_EXSTYLE} 34u 1u -34u ${UY_HEADER}u "nullsoft scriptable install system ${VERSTR}" Pop $0 SetCtlColors $0 0x3A2A42 transparent SendMessage $0 ${WM_SETFONT} $1 1 nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_ENDELLIPSIS} ${__NSD_Label_EXSTYLE} 33u 0 -33u ${UY_HEADER}u "nullsoft scriptable install system ${VERSTR}" Pop $0 SetCtlColors $0 0xffffff transparent SendMessage $0 ${WM_SETFONT} $1 1 ; --- Page --- !insertmacro StartColumn 90 !insertmacro CreateHeader "Compiler" ${UX_W} !insertmacro CreateSimpleLink "Compile NSI scripts" "${PR}\MakeNSISW" ${UX_W} !insertmacro CreateSimpleLink "Installer based on .ZIP file" "${PR}\bin\Zip2Exe" ${UX_W} !define /ReDef UY ${UY_ROW2} !insertmacro CreateHeader "Developer Center" ${UX_W} !define /ReDef UY_MULTILINE 42 !insertmacro CreateControl Label "Many more examples, tutorials, plug-ins and NSIS-related software are available at the online Developer Center." ${UX_W} ${UY_MULTILINE} Pop $0 ${SetCtlColors} $0 ${CT_PAGE} ${CB_PAGE} !insertmacro StartColumn 80 !insertmacro CreateHeader "Documentation" ${UX_W} !insertmacro CreateSimpleLink "NSIS Users Manual" "${PR}\NSIS.chm|${WWW}/Docs/" ${UX_W} !insertmacro CreateSimpleLink "Example scripts" "${PR}\Examples|${WWW}/Examples" ${UX_W} !insertmacro CreateSimpleLink "Modern UI 2" "${PD}\Modern UI 2\Readme.html" ${UX_W} !define /ReDef UY ${UY_ROW2} !insertmacro CreateHeader "Online Help" ${UX_W} !insertmacro CreateSimpleLink "Developer Center" "${WWW}/Developer_Center" ${UX_W} !insertmacro CreateSimpleLink "FAQ" "${WWW}/FAQ" ${UX_W} !insertmacro CreateSimpleLink "Forum" "http://forums.winamp.com/forumdisplay.php?forumid=65" ${UX_W} ;"Project Tracker" "http://sourceforge.net/tracker/?group_id=22049" !insertmacro CreateSimpleLink "Bug Tracker" "http://sourceforge.net/tracker/?group_id=22049&atid=373085" ${UX_W} !insertmacro CreateSimpleLink "Stackoverflow" "http://stackoverflow.com/questions/tagged/nsis" ${UX_W} !insertmacro CreateSimpleLink "Chat" "${WWW}/r/Chat" ${UX_W} ;insertmacro CreateSimpleLink "IRC channel" "irc://irc.landoleet.org/nsis" ${UX_W} ;"Pastebin" "http://nsis.pastebin.com/index/1FtyKP89" ;"Search" "http://www.google.com/cse/home?cx=005317984255499820329:c_glv1-6a6a" !insertmacro StartColumn 130 !insertmacro CreateHeader "Plug-ins" ${UX_W} !macro CreatePluginLink Name Desc Url !define /ReDef SAVE_UY ${UY} !insertmacro CreateSimpleLinkHelper "${Name}" "${Url}" ${UX_W} ; AdjustLinkPair will configure this link !define /ReDef UY ${SAVE_UY} !insertmacro CreateControl Label "${Name} - ${Desc}" ${UX_W} ${UY_TXT} Call AdjustLinkPair !macroend !insertmacro CreatePluginLink "AdvSplash" "splash with fade in/out" "${PD}\AdvSplash\advsplash.txt" !insertmacro CreatePluginLink "Banner" "banner with custom text" "${PD}\Banner\Readme.txt" !insertmacro CreatePluginLink "BgImage" "background image" "${PD}\BgImage\BgImage.txt" !insertmacro CreatePluginLink "Dialer" "internet connection" "${PD}\Dialer\Dialer.txt" !insertmacro CreatePluginLink "Math" "math operations" "${PD}\Math\Math.txt" !insertmacro CreatePluginLink "nsDialogs" "custom wizard pages" "${PD}\nsDialogs\Readme.html" !insertmacro CreatePluginLink "nsExec" "launch command line tools" "${PD}\nsExec\nsExec.txt" !insertmacro CreatePluginLink "NSISdl" "download files" "${PD}\NSISdl\Readme.txt" !insertmacro CreatePluginLink "Splash" "splash screen" "${PD}\Splash\splash.txt" !insertmacro CreatePluginLink "StartMenu" "Start Menu folder selection" "${PD}\StartMenu\Readme.txt" !insertmacro CreatePluginLink "System" "Windows API calls" "${PD}\System\System.html" !insertmacro CreatePluginLink "VPatch" "update existing files" "${PD}\VPatch\Readme.html" ; --- Footer --- ${NSD_CreateLabel} 0 -22u 100% 1 "" Pop $0 ${SetCtlColors} $0 000000 000000 ${CB_FOOTERLINE} nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_NOTIFY} ${__NSD_Label_EXSTYLE} -110u -20u 100% 20u "nsis.sourceforge.net" Pop $0 ${SetCtlColors} $0 ${CT_FOOTER} transparent transparent SendMessage $0 ${WM_SETFONT} ${HF_HEADER} 1 nsDialogs::SetUserData $0 "https://nsis.sourceforge.io" ${NSD_OnClick} $0 OnLinkClick nsDialogs::Show FunctionEnd Function OnLinkClick Pop $1 ; HWND nsDialogs::GetUserData $1 Call SplitPipe Pop $0 ; First URL in UserData from SplitPipe StrCpy $3 "" StrCpy $1 $0 4 ; Copy length of ${PD} ${IfThen} $1 == "${PD}" ${|} StrCpy $3 "${PR}\" ${|} !ifdef QUIT_ON_EXECUTE System::Call 'USER32::GetKeyState(i0x11)i.r9' ; VK_CONTROL !endif ClearErrors ExecShell "" "$3$0" Pop $1 ; ... the rest of SplitPipe ... ${If} $1 != "" ; ... might contain a fallback location StrCpy $0 $1 StrCpy $3 "" ${ElseIf} $3 != "" ; Local docs path failed, use WWW fallback StrCpy $3 0 slashconvloop: StrCpy $2 $0 1 $3 ${If} $2 == "\" StrCpy $2 $0 $3 IntOp $3 $3 + 1 StrCpy $0 $0 "" $3 StrCpy $0 "$2/$0" ${Else} IntOp $3 $3 + 1 ${EndIf} StrCmp $2 "" 0 slashconvloop StrCpy $3 "${WWW}/" ${EndIf} ${If} "$3$1" != "" ${AndIf} ${Errors} ExecShell "" "$3$0" ${EndIf} ${If} ${Errors} !ifdef QUIT_ON_EXECUTE StrCpy $9 0 ; Don't allow close !endif MessageBox MB_IconStop 'Error: Unable to open "$0"!' ${EndIf} !ifdef QUIT_ON_EXECUTE ${IfThen} $9 & 0x8000 ${|} SendMessage $hWndParent ${WM_CLOSE} 0 0 ${|} !endif FunctionEnd Function ConfigureLink Pop $1 ; HWND ${NSD_OnClick} $1 OnLinkClick ${SetCtlColors} $1 ${CT_LINK} ${CB_PAGE} ${NSD_GetText} $1 $4 Push $4 Call SplitPipe Pop $4 Pop $2 ${NSD_SetText} $1 $4 nsDialogs::SetUserData $1 $2 System::Call 'USER32::GetDC(pr1)p.r3' SendMessage $1 ${WM_GETFONT} 0 0 $5 System::Call 'GDI32::SelectObject(pr3,pr5)p.s' StrLen $5 $4 System::Call 'GDI32::GetTextExtentPoint32(pr3,tr4,ir5,@r5)' System::Call '*$5(i.r6)' System::Call 'GDI32::SelectObject(pr3,ps)' System::Call 'USER32::ReleaseDC(pr1,pr3)' System::Call 'USER32::GetWindowRect(pr1,@r3)' System::Call '*$3(i,i.r5,i,i.r7)' IntOp $7 $7 - $5 IntOp $6 $6 + 4 ; Padding for focus rect System::Call 'USER32::SetWindowPos(pr1,p,i,i,ir6,ir7,i0x16)' FunctionEnd Function AdjustLinkPair Pop $2 ; Label ${SetCtlColors} $2 ${CT_PAGE} ${CB_PAGE} Call ConfigureLink FunctionEnd Function SplitPipe Exch $0 Push $1 Push $2 StrCpy $2 0 findSep: StrCpy $1 $0 1 $2 IntOp $2 $2 + 1 StrCmp $1 "" +2 StrCmp $1 "|" "" findSep StrCpy $1 $0 "" $2 IntOp $2 $2 - 1 StrCpy $0 $0 $2 Pop $2 Exch $1 Exch Exch $0 FunctionEnd Section SectionEnd Page Custom PageCreate PageLeave !pragma warning disable 8000 ; Page instfiles not usednsis-3.11/Examples/SConscript000077500000000000000000000014271477201124000162070ustar00rootroot00000000000000examples = Split(""" bigtest.nsi example1.nsi example2.nsi FileFunc.ini FileFunc.nsi FileFuncTest.nsi gfx.nsi AppGen.nsi install-per-user.nsi install-shared.nsi languages.nsi Library.nsi LogicLib.nsi makensis.nsi Memento.nsi MultiUser.nsi NSISMenu.nsi one-section.nsi primes.nsi rtest.nsi silent.nsi StrFunc.nsi TextFunc.ini TextFunc.nsi TextFuncTest.nsi unicode.nsi VersionInfo.nsi waplugin.nsi WordFunc.ini WordFunc.nsi WordFuncTest.nsi """) mui_examples = [ 'Modern UI/Basic.nsi', 'Modern UI/HeaderBitmap.nsi', 'Modern UI/MultiLanguage.nsi', 'Modern UI/StartMenu.nsi', 'Modern UI/WelcomeFinish.nsi' ] Import('env') env.DistributeExamples(examples) env.DistributeExamples(mui_examples, path='Modern UI') nsis-3.11/Examples/StrFunc.nsi000077500000000000000000000521421477201124000162740ustar00rootroot00000000000000Name "NSIS StrFunc Example" OutFile "StrFunc.exe" ShowInstDetails show ShowUninstDetails show XPStyle on RequestExecutionLevel user !include "StrFunc.nsh" # Declare used functions ${StrCase} ${StrClb} ${StrIOToNSIS} ${StrLoc} ${StrNSISToIO} ${StrRep} ${StrStr} ${StrStrAdv} ${StrTok} ${StrTrimNewLines} ${StrSort} ${UnStrCase} ${UnStrClb} ${UnStrIOToNSIS} ${UnStrLoc} ${UnStrNSISToIO} ${UnStrRep} ${UnStrStr} ${UnStrStrAdv} ${UnStrTok} ${UnStrTrimNewLines} ${UnStrSort} Var SFPass Var SFTotl !macro EndStrFuncTestEx lbl name IfErrors ${lbl} DetailPrint "PASSED ${name} test" IntOp $SFPass $SFPass + 1 IntOp $SFTotl $SFTotl + 1 Goto +3 ${lbl}: DetailPrint "FAILED ${name} test" IntOp $SFTotl $SFTotl + 1 !macroend !macro EndStrFuncTest name !insertmacro EndStrFuncTestEx "${name}error" "${name}" !macroend CompletedText "Passed $SFPass of $SFTotl tests" !macro CompletedAllTests StrCmp $SFPass $SFTotl +2 SetErrorLevel 42 !macroend !macro StackVerificationStart StrCpy $0 S0 StrCpy $1 S1 StrCpy $2 S2 StrCpy $3 S3 StrCpy $4 S4 StrCpy $5 S5 StrCpy $6 S6 StrCpy $7 S7 StrCpy $8 S8 StrCpy $9 S9 StrCpy $R0 SR0 StrCpy $R1 SR1 StrCpy $R2 SR2 StrCpy $R3 SR3 StrCpy $R4 SR4 StrCpy $R5 SR5 StrCpy $R6 SR6 StrCpy $R7 SR7 StrCpy $R8 SR8 StrCpy $R9 SR9 !macroend !macro StackVerificationEnd ClearErrors ${If} $1 != "S1" ${OrIf} $2 != "S2" ${OrIf} $3 != "S3" ${OrIf} $4 != "S4" ${OrIf} $5 != "S5" ${OrIf} $6 != "S6" ${OrIf} $7 != "S7" ${OrIf} $8 != "S8" ${OrIf} $9 != "S9" ${OrIf} $R0 != "SR0" ${OrIf} $R1 != "SR1" ${OrIf} $R2 != "SR2" ${OrIf} $R3 != "SR3" ${OrIf} $R4 != "SR4" ${OrIf} $R5 != "SR5" ${OrIf} $R6 != "SR6" ${OrIf} $R7 != "SR7" ${OrIf} $R8 != "SR8" ${OrIf} $R9 != "SR9" SetErrors ${EndIf} !macroend Section # Test case conversion !insertmacro StackVerificationStart ${StrCase} $0 "This is just an example. A very simple one." "" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror ${StrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror ${StrCase} $0 "This is just an example. A very simple one." "L" StrCmp $0 "this is just an example. a very simple one." 0 strcaseerror ${StrCase} $0 "This is just an example. A very simple one." "U" StrCmp $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." 0 strcaseerror ${StrCase} $0 "This is just an example. A very simple one." "T" StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror ${StrCase} $0 "This is just an example. A very simple one." "<>" StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror ${StrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S" StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror ${StrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>" StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror ${StrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S" StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrCase # Test clipboard function !insertmacro StackVerificationStart !verbose push 4 ${StrClb} $0 "StrFunc clipboard test" ">" !verbose pop StrCmp $0 "" 0 strclberror ${StrClb} $0 "StrFunc clipboard test #2" "<>" StrCmp $0 "StrFunc clipboard test" 0 strclberror ${StrClb} $0 "" "<" StrCmp $0 "StrFunc clipboard test #2" 0 strclberror ${StrClb} $0 "" "" StrCmp $0 "" 0 strclberror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrClb # Test IO functions !insertmacro StackVerificationStart !macro testio str ${StrNSISToIO} $0 "${str}" ${StrIOToNSIS} $0 $0 StrCmp $0 "${str}" 0 ioerror !macroend !insertmacro testio "$\rtest$\n" !insertmacro testio "test$\n" !insertmacro testio "$\rtest" !insertmacro testio "test" !insertmacro testio "$\r\$\t$\n" !insertmacro testio "$\r \ $\t $\n $$" !insertmacro testio "" !insertmacro testio " " !insertmacro StackVerificationEnd !insertmacro EndStrFuncTestEx ioerror "StrNSISToIO/StrIOToNSIS" # Test string search functions !insertmacro StackVerificationStart ${StrLoc} $0 "This is just an example" "just" "<" StrCmp $0 "11" 0 strlocerror ${StrLoc} $0 a abc < StrCmp $0 "" 0 strlocerror ${StrLoc} $0 a abc > StrCmp $0 "" 0 strlocerror ${StrLoc} $0 abc a > StrCmp $0 "0" 0 strlocerror ${StrLoc} $0 abc b > StrCmp $0 "1" 0 strlocerror ${StrLoc} $0 abc c > StrCmp $0 "2" 0 strlocerror ${StrLoc} $0 abc a < StrCmp $0 "2" 0 strlocerror ${StrLoc} $0 abc b < StrCmp $0 "1" 0 strlocerror ${StrLoc} $0 abc c < StrCmp $0 "0" 0 strlocerror ${StrLoc} $0 abc d < StrCmp $0 "" 0 strlocerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrLoc # Test string replacement !insertmacro StackVerificationStart ${StrRep} $0 "This is just an example" "an" "one" StrCmp $0 "This is just one example" 0 strreperror ${StrRep} $0 "test... test... 1 2 3..." "test" "testing" StrCmp $0 "testing... testing... 1 2 3..." 0 strreperror ${StrRep} $0 "" "test" "testing" StrCmp $0 "" 0 strreperror ${StrRep} $0 "test" "test" "testing" StrCmp $0 "testing" 0 strreperror ${StrRep} $0 "test" "test" "" StrCmp $0 "" 0 strreperror ${StrRep} $0 "test" "" "abc" StrCmp $0 "test" 0 strreperror ${StrRep} $0 "test" "" "" StrCmp $0 "test" 0 strreperror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrRep # Test sorting !insertmacro StackVerificationStart ${StrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0" StrCmp $0 "This is an exam" 0 strsorterror ${StrSort} $0 "This is just an example" " " "j" " " "0" "" "0" StrCmp $0 "just" 0 strsorterror ${StrSort} $0 "This is just an example" "" "j" "" "0" "1" "0" StrCmp $0 "This is just an example" 0 strsorterror ${StrSort} $0 "This is just an example" " " "us" "" "0" "1" "0" StrCmp $0 "just an example" 0 strsorterror ${StrSort} $0 "This is just an example" "" "u" " " "0" "1" "0" StrCmp $0 "This is just" 0 strsorterror ${StrSort} $0 "This is just an example" " " "just" " " "0" "1" "0" StrCmp $0 "just" 0 strsorterror ${StrSort} $0 "This is just an example" " " "t" " " "0" "1" "0" StrCmp $0 "This" 0 strsorterror ${StrSort} $0 "This is just an example" " " "le" " " "0" "1" "0" StrCmp $0 "example" 0 strsorterror ${StrSort} $0 "This is just an example" " " "le" " " "1" "0" "0" StrCmp $0 " examp" 0 strsorterror ${StrSort} $0 "an error has occurred" " " "e" " " "0" "1" "0" StrCmp $0 "error" 0 strsorterror ${StrSort} $0 "" " " "something" " " "0" "1" "0" StrCmp $0 "" 0 strsorterror ${StrSort} $0 "This is just an example" " " "j" " " "" "" "" StrCmp $0 " just " 0 strsorterror ${StrSort} $0 "This is just an example" " " "j" " " "1" "0" "1" StrCmp $0 " ust " 0 strsorterror ${StrSort} $0 "This is just an example" "" "j" "" "0" "0" "1" StrCmp $0 "This is ust an example" 0 strsorterror ${StrSort} $0 "This is just an example" " " "us" "" "1" "0" "0" StrCmp $0 " jt an example" 0 strsorterror ${StrSort} $0 "This is just an example" "" "u" " " "0" "0" "1" StrCmp $0 "This is jst " 0 strsorterror ${StrSort} $0 "This is just an example" " " "just" " " "1" "0" "1" StrCmp $0 " " 0 strsorterror ${StrSort} $0 "an error has occurred" " " "e" "h" "1" "0" "0" StrCmp $0 " rror " 0 strsorterror ${StrSort} $0 "" " " "something" " " "1" "0" "1" StrCmp $0 "" 0 strsorterror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrSort !insertmacro StackVerificationStart ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "g" StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga" StrCmp $0 "" 0 strstrerror ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "" StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror ${StrStr} $0 "a" "abcefghijklmnopqrstuvwxyz" StrCmp $0 "" 0 strstrerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrStr !insertmacro StackVerificationStart ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0" StrCmp $0 "abcabcabc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0" StrCmp $0 "abcabc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "2" "0" StrCmp $0 "abc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "3" "0" StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" ">" "<" "1" "1" "0" StrCmp $0 "abcabc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" ">" "<" "0" "1" "0" StrCmp $0 "abc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" "<" "<" "1" "0" "0" StrCmp $0 "abcabcabc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" "<" "<" "0" "0" "0" StrCmp $0 "abcabc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "0" "0" StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0" StrCmp $0 "abc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1" StrCmp $0 "abcabc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1" StrCmp $0 "abc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "2" "1" StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "3" "1" StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "1" "1" "1" StrCmp $0 "ABCabcabc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "0" "1" "1" StrCmp $0 "ABCabc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "1" "0" "1" StrCmp $0 "ABCabcabc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "0" "0" "1" StrCmp $0 "ABCabc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "0" "1" StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1" StrCmp $0 "abc" 0 strstradverror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrStrAdv # Test tokenizer !insertmacro StackVerificationStart ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1" StrCmp $0 "not" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0" StrCmp $0 "is" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "152" "0" StrCmp $0 "" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "" "0" StrCmp $0 "example" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "L" "0" StrCmp $0 "example" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "0" "0" StrCmp $0 "This" 0 strtokerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrTok # Test trim new lines !insertmacro StackVerificationStart ${StrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n" StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrTrimNewlines InitPluginsDir WriteUninstaller $PluginsDir\UnStrFunc.exe ExecWait '"$PluginsDir\UnStrFunc.exe" _?=$PluginsDir' !insertmacro CompletedAllTests SectionEnd Section Uninstall # Test case conversion !insertmacro StackVerificationStart ${UnStrCase} $0 "This is just an example. A very simple one." "" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror ${UnStrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror ${UnStrCase} $0 "This is just an example. A very simple one." "L" StrCmp $0 "this is just an example. a very simple one." 0 strcaseerror ${UnStrCase} $0 "This is just an example. A very simple one." "U" StrCmp $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." 0 strcaseerror ${UnStrCase} $0 "This is just an example. A very simple one." "T" StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror ${UnStrCase} $0 "This is just an example. A very simple one." "<>" StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror ${UnStrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S" StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror ${UnStrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>" StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror ${UnStrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S" StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrCase # Test clipboard function !insertmacro StackVerificationStart ${UnStrClb} $0 "StrFunc clipboard test" ">" StrCmp $0 "" 0 strclberror ${UnStrClb} $0 "StrFunc clipboard test #2" "<>" StrCmp $0 "StrFunc clipboard test" 0 strclberror ${UnStrClb} $0 "" "<" StrCmp $0 "StrFunc clipboard test #2" 0 strclberror ${UnStrClb} $0 "" "" StrCmp $0 "" 0 strclberror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrClb # Test IO functions !insertmacro StackVerificationStart !macro untestio str ${UnStrNSISToIO} $0 "${str}" ${UnStrIOToNSIS} $0 $0 StrCmp $0 "${str}" 0 ioerror !macroend !insertmacro untestio "$\rtest$\n" !insertmacro untestio "test$\n" !insertmacro untestio "$\rtest" !insertmacro untestio "test" !insertmacro untestio "$\r\$\t$\n" !insertmacro untestio "$\r \ $\t $\n $$" !insertmacro untestio "" !insertmacro untestio " " !insertmacro StackVerificationEnd !insertmacro EndStrFuncTestEx ioerror "StrNSISToIO/StrIOToNSIS" # Test string search functions !insertmacro StackVerificationStart ${UnStrLoc} $0 "This is just an example" "just" "<" StrCmp $0 "11" 0 strlocerror ${UnStrLoc} $0 a abc < StrCmp $0 "" 0 strlocerror ${UnStrLoc} $0 a abc > StrCmp $0 "" 0 strlocerror ${UnStrLoc} $0 abc a > StrCmp $0 "0" 0 strlocerror ${UnStrLoc} $0 abc b > StrCmp $0 "1" 0 strlocerror ${UnStrLoc} $0 abc c > StrCmp $0 "2" 0 strlocerror ${UnStrLoc} $0 abc a < StrCmp $0 "2" 0 strlocerror ${UnStrLoc} $0 abc b < StrCmp $0 "1" 0 strlocerror ${UnStrLoc} $0 abc c < StrCmp $0 "0" 0 strlocerror ${UnStrLoc} $0 abc d < StrCmp $0 "" 0 strlocerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrLoc # Test string replacement !insertmacro StackVerificationStart ${UnStrRep} $0 "This is just an example" "an" "one" StrCmp $0 "This is just one example" 0 strreperror ${UnStrRep} $0 "test... test... 1 2 3..." "test" "testing" StrCmp $0 "testing... testing... 1 2 3..." 0 strreperror ${UnStrRep} $0 "" "test" "testing" StrCmp $0 "" 0 strreperror ${UnStrRep} $0 "test" "test" "testing" StrCmp $0 "testing" 0 strreperror ${UnStrRep} $0 "test" "test" "" StrCmp $0 "" 0 strreperror ${UnStrRep} $0 "test" "" "abc" StrCmp $0 "test" 0 strreperror ${UnStrRep} $0 "test" "" "" StrCmp $0 "test" 0 strreperror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrRep # Test sorting !insertmacro StackVerificationStart ${UnStrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0" StrCmp $0 "This is an exam" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "j" " " "0" "" "0" StrCmp $0 "just" 0 strsorterror ${UnStrSort} $0 "This is just an example" "" "j" "" "0" "1" "0" StrCmp $0 "This is just an example" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "us" "" "0" "1" "0" StrCmp $0 "just an example" 0 strsorterror ${UnStrSort} $0 "This is just an example" "" "u" " " "0" "1" "0" StrCmp $0 "This is just" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "just" " " "0" "1" "0" StrCmp $0 "just" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "t" " " "0" "1" "0" StrCmp $0 "This" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "le" " " "0" "1" "0" StrCmp $0 "example" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "le" " " "1" "0" "0" StrCmp $0 " examp" 0 strsorterror ${UnStrSort} $0 "an error has occurred" " " "e" " " "0" "1" "0" StrCmp $0 "error" 0 strsorterror ${UnStrSort} $0 "" " " "something" " " "0" "1" "0" StrCmp $0 "" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "j" " " "" "" "" StrCmp $0 " just " 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "j" " " "1" "0" "1" StrCmp $0 " ust " 0 strsorterror ${UnStrSort} $0 "This is just an example" "" "j" "" "0" "0" "1" StrCmp $0 "This is ust an example" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "us" "" "1" "0" "0" StrCmp $0 " jt an example" 0 strsorterror ${UnStrSort} $0 "This is just an example" "" "u" " " "0" "0" "1" StrCmp $0 "This is jst " 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "just" " " "1" "0" "1" StrCmp $0 " " 0 strsorterror ${UnStrSort} $0 "an error has occurred" " " "e" "h" "1" "0" "0" StrCmp $0 " rror " 0 strsorterror ${UnStrSort} $0 "" " " "something" " " "1" "0" "1" StrCmp $0 "" 0 strsorterror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrSort !insertmacro StackVerificationStart ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "g" StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga" StrCmp $0 "" 0 strstrerror ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "" StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror ${UnStrStr} $0 "a" "abcefghijklmnopqrstuvwxyz" StrCmp $0 "" 0 strstrerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrStr !insertmacro StackVerificationStart ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0" StrCmp $0 "abcabcabc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0" StrCmp $0 "abcabc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "2" "0" StrCmp $0 "abc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "3" "0" StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" ">" "<" "1" "1" "0" StrCmp $0 "abcabc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" ">" "<" "0" "1" "0" StrCmp $0 "abc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" "<" "1" "0" "0" StrCmp $0 "abcabcabc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" "<" "0" "0" "0" StrCmp $0 "abcabc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "0" "0" StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0" StrCmp $0 "abc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1" StrCmp $0 "abcabc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1" StrCmp $0 "abc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "2" "1" StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "3" "1" StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "1" "1" "1" StrCmp $0 "ABCabcabc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "0" "1" "1" StrCmp $0 "ABCabc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "1" "0" "1" StrCmp $0 "ABCabcabc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "0" "0" "1" StrCmp $0 "ABCabc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "0" "1" StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1" StrCmp $0 "abc" 0 strstradverror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrStrAdv # Test tokenizer !insertmacro StackVerificationStart ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "1" StrCmp $0 "not" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "0" StrCmp $0 "is" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "152" "0" StrCmp $0 "" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "" "0" StrCmp $0 "example" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "L" "0" StrCmp $0 "example" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "0" "0" StrCmp $0 "This" 0 strtokerror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrTok # Test trim new lines !insertmacro StackVerificationStart ${UnStrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n" StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror !insertmacro StackVerificationEnd !insertmacro EndStrFuncTest StrTrimNewLines !insertmacro CompletedAllTests SectionEnd nsis-3.11/Examples/TextFunc.ini000077500000000000000000000037271477201124000164430ustar00rootroot00000000000000[Settings] NumFields=15 NextButtonText=&Enter [Field 1] Type=Droplist Flags=NOTIFY State=1. LineFind ListItems=1. LineFind|2. LineRead|3. FileReadFromEnd|4. LineSum|5. FileJoin|6. TextCompare|7. ConfigRead|8. ConfigWrite|9. FileRecode Left=44 Right=139 Top=9 Bottom=100 [Field 2] Type=FileRequest Left=44 Right=-17 Top=30 Bottom=41 [Field 3] Type=FileRequest Left=44 Right=-17 Top=46 Bottom=57 [Field 4] Type=FileRequest State=3:-1 Left=44 Right=-17 Top=62 Bottom=75 [Field 5] Type=Droplist Flags=NOTIFY State=Example1 (delete first two symbols) ListItems=Example1 (delete first two symbols)|Example2 (show changed lines)|Example3 (delete lines)|Example4 (insert lines)|Example5 (replace in file - WordFunc.nsh required)|Example6 (line string to cut or delete)|Example7 (read lines) Left=44 Right=-36 Top=81 Bottom=155 [Field 6] Type=Droplist Flags=NOTIFY State=Example1 (Different or Equal) ListItems=Example1 (Different or Equal)|Example2 (Compare line-by-line - Different)|Example3 (Compare line-by-line - Equal)|Example4 (Compare all lines - Different)|Example5 (Compare all lines - Equal) Left=44 Right=-36 Top=81 Bottom=140 [Field 7] Type=Droplist State=FileReadFromEndCallback ListItems=FileReadFromEndCallback Left=44 Right=-36 Top=81 Bottom=92 [Field 8] Type=Text Flags=READONLY Left=9 Right=-36 Top=108 Bottom=120 [Field 9] Type=Button Text=Edit Flags=NOTIFY Left=234 Right=256 Top=81 Bottom=92 [Field 10] Type=Button Text=Log Flags=NOTIFY|DISABLED Left=234 Right=256 Top=108 Bottom=120 [Field 11] Type=Label Text=InputFile Left=10 Right=43 Top=32 Bottom=44 [Field 12] Type=Label Text=OutputFile Left=10 Right=43 Top=48 Bottom=60 [Field 13] Type=Label Text=Range Left=10 Right=44 Top=65 Bottom=75 [Field 14] Type=Label Text=Function Left=10 Right=43 Top=81 Bottom=92 [Field 15] Type=Label Text=Result: Left=10 Right=229 Top=97 Bottom=105 nsis-3.11/Examples/TextFunc.nsi000077500000000000000000000572431477201124000164570ustar00rootroot00000000000000;_____________________________________________________________________________ ; ; Text Functions ;_____________________________________________________________________________ ; ; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "Text Functions" OutFile "TextFunc.exe" Caption "$(^Name)" XPStyle on RequestExecutionLevel user !include "WinMessages.nsh" !include "TextFunc.nsh" Var HWND Var INI Var LOG Var PROJECT Var CALLBACK Var VIEW Var FUNCTION Var LINEFIND1 Var LINEFIND2 Var LINEFIND3 Var LINEREAD1 Var LINEREAD2 Var FILEREADFROMEND1 Var LINESUM1 Var FILEJOIN1 Var FILEJOIN2 Var FILEJOIN3 Var TEXTCOMPARE1 Var TEXTCOMPARE2 Var TEXTCOMPARE3 Var CONFIGREAD1 Var CONFIGREAD2 Var CONFIGWRITE1 Var CONFIGWRITE2 Var CONFIGWRITE3 Var FILERECODE1 Var FILERECODE2 Page Custom ShowCustom LeaveCustom Function ShowCustom InstallOptions::initDialog "$INI" Pop $hwnd GetDlgItem $0 $HWND 1206 ShowWindow $0 0 GetDlgItem $0 $HWND 1208 ShowWindow $0 0 GetDlgItem $0 $HWND 1209 ShowWindow $0 0 StrCpy $FUNCTION LineFind StrCpy $LINEREAD2 10 StrCpy $TEXTCOMPARE3 FastDiff StrCpy $CONFIGREAD1 "$WINDIR\system.ini" StrCpy $CONFIGREAD2 "shell=" StrCpy $FILERECODE2 CharToOem InstallOptions::show Pop $0 FunctionEnd Function LeaveCustom ReadINIStr $0 $INI "Settings" "State" ReadINIStr $R0 $INI "Field 1" "State" ReadINIStr $R1 $INI "Field 2" "State" ReadINIStr $R2 $INI "Field 3" "State" ReadINIStr $R3 $INI "Field 4" "State" ReadINIStr $R4 $INI "Field 5" "State" ReadINIStr $R5 $INI "Field 6" "State" StrCpy $R4 $R4 8 StrCpy $R5 $R5 8 StrCpy $6 0 StrCpy $7 '$${' StrCpy $8 'r' StrCpy $9 'n' StrCmp $0 10 Log StrCmp $0 9 ViewOrEdit StrCmp $0 0 Enter goto MainSend Log: Exec 'notepad.exe $LOG' Abort ViewOrEdit: StrCmp $FUNCTION FileReadFromEnd 0 Edit StrCmp $VIEW '' 0 ViewFileReadFromEndCallback GetTempFileName $VIEW $PLUGINSDIR StrCpy $7 '$$' FileOpen $0 $VIEW w FileWrite $0 `Function FileReadFromEndCallback$\r$\n` FileWrite $0 ` MessageBox MB_OKCANCEL '$7$$9 "Line"=[$$9]$7\$9$7$$8 "#"=[$$8]$7\$9$7$$7 "-#"=[$$7]' IDOK +2$\r$\n` FileWrite $0 ` StrCpy $$R0 StopFileReadFromEnd$\r$\n$\r$\n` FileWrite $0 ` Push $$R0$\r$\n` FileWrite $0 `FunctionEnd$\r$\n` FileClose $0 StrCpy $7 '$${' SetFileAttributes $VIEW READONLY ViewFileReadFromEndCallback: Exec 'notepad.exe $VIEW' Abort Edit: StrCmp $CALLBACK '' +5 StrCmp $6$R6 '0$R0$R4$R5' showproject StrCmp $R6 '$R0$R4$R5' +3 Delete $CALLBACK StrCpy $CALLBACK '' StrCpy $R6 '$R0$R4$R5' #Project# StrCmp $6$R0 "01. LineFind" 0 +5 IfFileExists $CALLBACK +2 GetTempFileName $CALLBACK $PLUGINSDIR FileOpen $0 $CALLBACK w goto function IfFileExists $PROJECT +2 GetTempFileName $PROJECT $PLUGINSDIR FileOpen $0 $PROJECT w #Name# FileWrite $0 'Name "$FUNCTION"$\r$\n' FileWrite $0 'OutFile "$PROJECT.exe"$\r$\n$\r$\n' #!include# StrCmp $R0$R4 '1. LineFindExample5' 0 TextFuncInclude IfFileExists '$EXEDIR\WordFunc.nsh' 0 +3 FileWrite $0 '!include "$EXEDIR\WordFunc.nsh"$\r$\n' goto +2 FileWrite $0 '!include "WordFunc.nsh"$\r$\n' FileWrite $0 '!insertmacro WordFind$\r$\n' FileWrite $0 '!insertmacro WordFindS$\r$\n' FileWrite $0 '!insertmacro WordFind2X$\r$\n' FileWrite $0 '!insertmacro WordFind2XS$\r$\n' FileWrite $0 '!insertmacro WordFind3X$\r$\n' FileWrite $0 '!insertmacro WordFind3XS$\r$\n' FileWrite $0 '!insertmacro WordReplace$\r$\n' FileWrite $0 '!insertmacro WordReplaceS$\r$\n' FileWrite $0 '!insertmacro WordAdd$\r$\n' FileWrite $0 '!insertmacro WordAddS$\r$\n' FileWrite $0 '!insertmacro WordInsert$\r$\n' FileWrite $0 '!insertmacro WordInsertS$\r$\n' FileWrite $0 '!insertmacro StrFilter$\r$\n' FileWrite $0 '!insertmacro StrFilterS$\r$\n' TextFuncInclude: IfFileExists '$EXEDIR\TextFunc.nsh' 0 +3 FileWrite $0 '!include "$EXEDIR\TextFunc.nsh"$\r$\n' goto +2 FileWrite $0 '!include "TextFunc.nsh"$\r$\n' FileWrite $0 '!insertmacro $FUNCTION$\r$\n' StrCmp $FUNCTION TextCompare +2 FileWrite $0 '!insertmacro TrimNewLines$\r$\n' #Section# FileWrite $0 '$\r$\nSection -empty$\r$\n' FileWrite $0 'SectionEnd$\r$\n$\r$\n' #Function .onInit# FileWrite $0 'Function .onInit$\r$\n' StrCmp $R0$R5 "6. TextCompareExample1" 0 TextCompareExample235 FileWrite $0 ' StrCpy $$R0 ""$\r$\n' FileWrite $0 ' $7TextCompare} "$R1" "$R2" "$R3" "$R5"$\r$\n' FileWrite $0 ' IfErrors error$\r$\n' FileWrite $0 ' StrCmp $$R0 NotEqual 0 +2$\r$\n' FileWrite $0 ' MessageBox MB_OK " Files differ" IDOK +2$\r$\n' FileWrite $0 ' MessageBox MB_OK " Files identical"$\r$\n' FileWrite $0 ' goto end$\r$\n$\r$\n' goto endoninit TextCompareExample235: StrCmp $R0$R5 "6. TextCompareExample2" +3 StrCmp $R0$R5 "6. TextCompareExample3" +2 StrCmp $R0$R5 "6. TextCompareExample5" 0 TextCompareExample4 FileWrite $0 ' StrCpy $$R0 "$R1"$\r$\n' FileWrite $0 ' StrCpy $$R1 "$R2"$\r$\n$\r$\n' FileWrite $0 ' GetTempFileName $$R2$\r$\n' FileWrite $0 ' FileOpen $$R3 $$R2 w$\r$\n' FileWrite $0 ' FileWrite $$R3 "$$R0 | $$R1$$\$8$$\$9"$\r$\n' FileWrite $0 ' $7TextCompare} "$$R0" "$$R1" "$R3" "$R5"$\r$\n' FileWrite $0 ' IfErrors error$\r$\n' FileWrite $0 ' Exec "notepad.exe $$R2"$\r$\n' FileWrite $0 ' goto end$\r$\n$\r$\n' goto endoninit TextCompareExample4: StrCmp $R0$R5 "6. TextCompareExample4" 0 LineFindExample123456 FileWrite $0 ' StrCpy $$R0 "$R1"$\r$\n' FileWrite $0 ' StrCpy $$R1 "$R2"$\r$\n$\r$\n' FileWrite $0 ' GetTempFileName $$R2$\r$\n' FileWrite $0 ' FileOpen $$R3 $$R2 w$\r$\n' FileWrite $0 ' FileWrite $$R3 "$$R0 | $$R1$$\$8$$\$9"$\r$\n' FileWrite $0 ' $7TextCompare} "$$R0" "$$R1" "$R3" "$R5"$\r$\n' FileWrite $0 ' IfErrors error$\r$\n' FileWrite $0 ' FileWrite $$R3 "$$\$8$$\$9$$R1 | $$R0$$\$8$$\$9"$\r$\n' FileWrite $0 ' $7TextCompare} "$$R1" "$$R0" "$R3" "$R5"$\r$\n' FileWrite $0 ' FileClose $$R3$\r$\n' FileWrite $0 ' IfErrors error$\r$\n' FileWrite $0 ' Exec "notepad.exe $$R2"$\r$\n$\r$\n' FileWrite $0 ' goto end$\r$\n$\r$\n' goto endoninit LineFindExample123456: FileWrite $0 ' $7$FUNCTION} "$R1" "$R2" "$R3" "$R4"$\r$\n' FileWrite $0 ' IfErrors error$\r$\n' FileWrite $0 ' MessageBox MB_YESNO " Open output file?" IDNO end$\r$\n' FileWrite $0 ' StrCmp "$R2" "" 0 +3$\r$\n' FileWrite $0 ` Exec 'notepad.exe "$R1"'$\r$\n` FileWrite $0 ' goto end$\r$\n' FileWrite $0 ' SearchPath $$R2 "$R2"$\r$\n' FileWrite $0 ` Exec 'notepad.exe "$$R2"'$\r$\n` FileWrite $0 ' goto end$\r$\n$\r$\n' endoninit: FileWrite $0 ' error:$\r$\n' FileWrite $0 ' MessageBox MB_OK "Error"$\r$\n$\r$\n' FileWrite $0 ' end:$\r$\n' FileWrite $0 ' Quit$\r$\n' FileWrite $0 'FunctionEnd$\r$\n$\r$\n' #FunctionEnd# #Function CallBack# StrCmp $CALLBACK '' 0 close function: StrCmp $R0 '1. LineFind' 0 +8 FileWrite $0 'Function $R4$\r$\n' StrCmp $R4 "Example1" Example1LF StrCmp $R4 "Example2" Example2LF StrCmp $R4 "Example3" Example3LF StrCmp $R4 "Example4" Example4LF StrCmp $R4 "Example5" Example5LF StrCmp $R4 "Example6" Example6LF FileWrite $0 'Function $R5$\r$\n' StrCmp $R5 "Example1" Example1TC StrCmp $R5 "Example2" Example2TC StrCmp $R5 "Example3" Example3TC StrCmp $R5 "Example4" Example4TC StrCmp $R5 "Example5" Example3TC Example1LF: FileWrite $0 " $7TrimNewLines} '$$R9' $$R9$\r$\n" FileWrite $0 " StrCpy $$R9 $$R9 '' 2 ;delete first two symbols$\r$\n" FileWrite $0 " StrCpy $$R9 '$$R9$$\$8$$\$9'$\r$\n$\r$\n" goto endwrite Example2LF: FileWrite $0 " $7TrimNewLines} '$$R9' $$R9$\r$\n" FileWrite $0 " StrCpy $$R9 '$$R9 ~Changed line ($$R8)~$$\$8$$\$9'$\r$\n$\r$\n" goto endwrite Example3LF: FileWrite $0 " StrCpy $$0 SkipWrite$\r$\n$\r$\n" goto endwrite Example4LF: FileWrite $0 " FileWrite $$R4 '---First Line---$$\$8$$\$9'$\r$\n" FileWrite $0 " FileWrite $$R4 '---Second Line ...---$$\$8$$\$9'$\r$\n$\r$\n" goto endwrite Example5LF: FileWrite $0 " ; You can use:$\r$\n" FileWrite $0 " ; $7WordFind}|$7WordFindS}|$7WordFind2X}|$7WordFind2XS}|$\r$\n" FileWrite $0 " ; $7WordFind3X}|$7WordFind3XS}|$7WordReplace}|$7WordReplaceS}|$\r$\n" FileWrite $0 " ; $7WordAdd}|$7WordAddS}|$7WordInsert}|$7WordInsertS}|$\r$\n" FileWrite $0 " ; $7StrFilter}|$7StrFilterS}$\r$\n$\r$\n" FileWrite $0 " $7WordReplace} '$$R9' ' ' '_' '+*' $$R9$\r$\n$\r$\n" goto endwrite Example6LF: FileWrite $0 ' ;(Cut lines from a line to another line (also including that line))$\r$\n' FileWrite $0 ' StrCmp $$R0 finish stop$\r$\n' FileWrite $0 ' StrCmp $$R0 start finish$\r$\n' FileWrite $0 ' StrCmp $$R9 "Start Line$$\$8$$\$9" 0 skip$\r$\n' FileWrite $0 ' StrCpy $$R0 start$\r$\n' FileWrite $0 ' StrCpy $$R1 $$R9$\r$\n' FileWrite $0 ' goto code$\r$\n' FileWrite $0 ' finish:$\r$\n' FileWrite $0 ' StrCmp $$R9 "Finish Line$$\$8$$\$9" 0 code$\r$\n' FileWrite $0 ' StrCpy $$R0 finish$\r$\n' FileWrite $0 ' StrCpy $$R2 $$R8$\r$\n' FileWrite $0 ' goto code$\r$\n' FileWrite $0 ' skip:$\r$\n' FileWrite $0 ' StrCpy $$0 SkipWrite$\r$\n' FileWrite $0 ' goto output$\r$\n' FileWrite $0 ' stop:$\r$\n' FileWrite $0 ' StrCpy $$0 StopLineFind$\r$\n' FileWrite $0 ' goto output$\r$\n$\r$\n' FileWrite $0 ' ;;(Delete lines from a line to another line (also including that line))$\r$\n' FileWrite $0 ' ; StrCmp $$R0 finish code$\r$\n' FileWrite $0 ' ; StrCmp $$R0 start finish$\r$\n' FileWrite $0 ' ; StrCmp $$R9 "Start Line$$\$8$$\$9" 0 code$\r$\n' FileWrite $0 ' ; StrCpy $$R0 start$\r$\n' FileWrite $0 ' ; StrCpy $$R1 $$R8$\r$\n' FileWrite $0 ' ; goto skip$\r$\n' FileWrite $0 ' ; finish:$\r$\n' FileWrite $0 ' ; StrCmp $$R9 "Finish Line$$\$8$$\$9" 0 skip$\r$\n' FileWrite $0 ' ; StrCpy $$R0 finish$\r$\n' FileWrite $0 ' ; StrCpy $$R2 $$R8$\r$\n' FileWrite $0 ' ; skip:$\r$\n' FileWrite $0 ' ; StrCpy $$0 SkipWrite$\r$\n' FileWrite $0 ' ; goto output$\r$\n$\r$\n' FileWrite $0 ' code:$\r$\n' FileWrite $0 ' ;...$\r$\n$\r$\n' FileWrite $0 ' output:$\r$\n' goto endwrite Example1TC: FileWrite $0 " StrCpy $$R0 NotEqual$\r$\n" FileWrite $0 " StrCpy $$0 StopTextCompare$\r$\n$\r$\n" goto endwrite Example2TC: FileWrite $0 " FileWrite $$R3 '$$8=$$9'$\r$\n" FileWrite $0 " FileWrite $$R3 '$$6=$$7$$\$8$$\$9'$\r$\n$\r$\n" goto endwrite Example3TC: FileWrite $0 " FileWrite $$R3 '$$8|$$6=$$9'$\r$\n$\r$\n" goto endwrite Example4TC: FileWrite $0 " FileWrite $$R3 '$$8=$$9'$\r$\n$\r$\n" goto endwrite endwrite: FileWrite $0 ' Push $$0$\r$\n' FileWrite $0 'FunctionEnd$\r$\n' close: FileClose $0 goto $6 #FunctionEnd# showproject: StrCmp $R0 '1. LineFind' 0 +3 ExecWait 'notepad.exe $CALLBACK' goto +4 SetFileAttributes $PROJECT READONLY ExecWait 'notepad.exe $PROJECT' SetFileAttributes $PROJECT NORMAL Abort MainSend: GetDlgItem $0 $HWND 1210 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1203 ShowWindow $0 1 EnableWindow $0 1 GetDlgItem $0 $HWND 1204 ShowWindow $0 1 EnableWindow $0 1 GetDlgItem $0 $HWND 1205 EnableWindow $0 1 GetDlgItem $0 $HWND 1206 ShowWindow $0 0 GetDlgItem $0 $HWND 1207 ShowWindow $0 0 GetDlgItem $0 $HWND 1208 ShowWindow $0 0 GetDlgItem $0 $HWND 1209 ShowWindow $0 0 GetDlgItem $0 $HWND 1211 EnableWindow $0 1 StrCmp $FUNCTION LineFind 0 +5 StrCpy $LINEFIND1 $R1 StrCpy $LINEFIND2 $R2 StrCpy $LINEFIND3 $R3 goto LineFindSend StrCmp $FUNCTION LineRead 0 +4 StrCpy $LINEREAD1 $R1 StrCpy $LINEREAD2 $R2 goto LineFindSend StrCmp $FUNCTION FileReadFromEnd 0 +3 StrCpy $FILEREADFROMEND1 $R1 goto LineFindSend StrCmp $FUNCTION LineSum 0 +3 StrCpy $LINESUM1 $R1 goto LineFindSend StrCmp $FUNCTION FileJoin 0 +5 StrCpy $FILEJOIN1 $R1 StrCpy $FILEJOIN2 $R2 StrCpy $FILEJOIN3 $R3 goto LineFindSend StrCmp $FUNCTION TextCompare 0 +5 StrCpy $TEXTCOMPARE1 $R1 StrCpy $TEXTCOMPARE2 $R2 StrCpy $TEXTCOMPARE3 $R3 goto LineFindSend StrCmp $FUNCTION ConfigRead 0 +4 StrCpy $CONFIGREAD1 $R1 StrCpy $CONFIGREAD2 $R2 goto LineFindSend StrCmp $FUNCTION ConfigWrite 0 +5 StrCpy $CONFIGWRITE1 $R1 StrCpy $CONFIGWRITE2 $R2 StrCpy $CONFIGWRITE3 $R3 goto LineFindSend StrCmp $FUNCTION FileRecode 0 +3 StrCpy $FILERECODE1 $R1 StrCpy $FILERECODE2 $R2 LineFindSend: StrCmp $R0 "1. LineFind" 0 LineReadSend StrCmp $FUNCTION LineFind 0 LineFindSend2 StrCmp $R4 "Example1" 0 +3 StrCpy $LINEFIND3 "3:-1" goto LineFindSend2 StrCmp $R4 "Example2" 0 +3 StrCpy $LINEFIND3 "{5:12 15 -6:-5 -1}" goto LineFindSend2 StrCmp $R4 "Example3" 0 +3 StrCpy $LINEFIND3 "2:3 10:-5 -3:-2" goto LineFindSend2 StrCmp $R4 "Example4" 0 +3 StrCpy $LINEFIND3 "10" goto LineFindSend2 StrCmp $R4 "Example5" 0 +3 StrCpy $LINEFIND3 "1:-1" goto LineFindSend2 StrCmp $R4 "Example6" 0 +3 StrCpy $LINEFIND3 "" goto LineFindSend2 StrCmp $R4 "Example7" 0 +2 StrCpy $LINEFIND3 "1:-1" LineFindSend2: StrCpy $FUNCTION LineFind StrCmp $LINEFIND2 '/NUL' 0 +2 StrCpy $LINEFIND2 '' GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND1" GetDlgItem $0 $HWND 1203 SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND2" GetDlgItem $0 $HWND 1205 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND3" GetDlgItem $0 $HWND 1207 ShowWindow $0 1 GetDlgItem $0 $HWND 1211 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:Edit" GetDlgItem $0 $HWND 1212 ShowWindow $0 1 StrCmp $LOG '' +2 EnableWindow $0 1 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:OutputFile" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:Range" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:Function" StrCmp $R4 "Example7" 0 +9 GetDlgItem $0 $HWND 1203 EnableWindow $0 0 SendMessage $0 ${WM_ENABLE} 1 0 SendMessage $0 ${WM_SETTEXT} 1 "STR:/NUL" GetDlgItem $0 $HWND 1204 EnableWindow $0 0 GetDlgItem $0 $HWND 1211 EnableWindow $0 0 abort LineReadSend: StrCmp $R0 "2. LineRead" 0 FileReadFromEndSend StrCpy $FUNCTION LineRead GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEREAD1" GetDlgItem $0 $HWND 1203 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEREAD2" GetDlgItem $0 $HWND 1204 ShowWindow $0 0 GetDlgItem $0 $HWND 1205 ShowWindow $0 0 GetDlgItem $0 $HWND 1211 ShowWindow $0 0 GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:Line #" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:" Abort FileReadFromEndSend: StrCmp $R0 "3. FileReadFromEnd" 0 LineSumSend StrCpy $FUNCTION FileReadFromEnd GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEREADFROMEND1" GetDlgItem $0 $HWND 1203 ShowWindow $0 0 GetDlgItem $0 $HWND 1204 ShowWindow $0 0 GetDlgItem $0 $HWND 1205 ShowWindow $0 0 GetDlgItem $0 $HWND 1209 ShowWindow $0 1 GetDlgItem $0 $HWND 1211 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:View" GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:Function" Abort LineSumSend: StrCmp $R0 "4. LineSum" 0 FileJoinSend StrCpy $FUNCTION LineSum GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINESUM1" GetDlgItem $0 $HWND 1203 ShowWindow $0 0 GetDlgItem $0 $HWND 1204 ShowWindow $0 0 GetDlgItem $0 $HWND 1205 ShowWindow $0 0 GetDlgItem $0 $HWND 1211 ShowWindow $0 0 GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:" Abort FileJoinSend: StrCmp $R0 "5. FileJoin" 0 TextCompareSend StrCpy $FUNCTION FileJoin GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN1" GetDlgItem $0 $HWND 1203 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN2" GetDlgItem $0 $HWND 1204 ShowWindow $0 1 GetDlgItem $0 $HWND 1205 ShowWindow $0 1 EnableWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN3" GetDlgItem $0 $HWND 1206 ShowWindow $0 1 GetDlgItem $0 $HWND 1211 ShowWindow $0 0 GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile1" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile2" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:OutputFile" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:" Abort TextCompareSend: StrCmp $R0 "6. TextCompare" 0 ConfigReadSend StrCmp $FUNCTION TextCompare 0 TextCompareSend2 StrCmp $R5 "Example1" 0 +3 StrCpy $TEXTCOMPARE3 "FastDiff" goto TextCompareSend2 StrCmp $R5 "Example2" 0 +3 StrCpy $TEXTCOMPARE3 "FastDiff" goto TextCompareSend2 StrCmp $R5 "Example3" 0 +3 StrCpy $TEXTCOMPARE3 "FastEqual" goto TextCompareSend2 StrCmp $R5 "Example4" 0 +3 StrCpy $TEXTCOMPARE3 "SlowDiff" goto TextCompareSend2 StrCmp $R5 "Example5" 0 +2 StrCpy $TEXTCOMPARE3 "SlowEqual" TextCompareSend2: StrCpy $FUNCTION TextCompare GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE1" GetDlgItem $0 $HWND 1203 SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE2" GetDlgItem $0 $HWND 1204 ShowWindow $0 1 GetDlgItem $0 $HWND 1205 ShowWindow $0 1 EnableWindow $0 0 SendMessage $0 ${WM_ENABLE} 1 0 SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE3" GetDlgItem $0 $HWND 1208 ShowWindow $0 1 GetDlgItem $0 $HWND 1211 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:View" GetDlgItem $0 $HWND 1212 ShowWindow $0 1 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:TextFile1" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:TextFile2" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:Option" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:Function" abort ConfigReadSend: StrCmp $R0 "7. ConfigRead" 0 ConfigWriteSend StrCpy $FUNCTION ConfigRead GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGREAD1" GetDlgItem $0 $HWND 1203 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGREAD2" GetDlgItem $0 $HWND 1204 ShowWindow $0 0 GetDlgItem $0 $HWND 1205 ShowWindow $0 0 GetDlgItem $0 $HWND 1211 ShowWindow $0 0 GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:Entry" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:" Abort ConfigWriteSend: StrCmp $R0 "8. ConfigWrite" 0 FileRecodeSend StrCpy $FUNCTION ConfigWrite GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE1" GetDlgItem $0 $HWND 1203 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE2" GetDlgItem $0 $HWND 1204 ShowWindow $0 0 GetDlgItem $0 $HWND 1205 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE3" GetDlgItem $0 $HWND 1211 ShowWindow $0 0 GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:Entry" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:Value" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:" Abort FileRecodeSend: StrCmp $R0 "9. FileRecode" 0 Abort StrCpy $FUNCTION FileRecode GetDlgItem $0 $HWND 1201 SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILERECODE1" GetDlgItem $0 $HWND 1203 ShowWindow $0 1 SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILERECODE2" GetDlgItem $0 $HWND 1204 ShowWindow $0 0 GetDlgItem $0 $HWND 1205 ShowWindow $0 0 GetDlgItem $0 $HWND 1211 ShowWindow $0 0 GetDlgItem $0 $HWND 1212 ShowWindow $0 0 GetDlgItem $0 $HWND 1213 SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" GetDlgItem $0 $HWND 1214 SendMessage $0 ${WM_SETTEXT} 1 "STR:Format" GetDlgItem $0 $HWND 1215 SendMessage $0 ${WM_SETTEXT} 1 "STR:" GetDlgItem $0 $HWND 1216 SendMessage $0 ${WM_SETTEXT} 1 "STR:" Abort ;=Enter= Enter: StrCmp $R1 '' 0 +3 StrCpy $0 'Choose InputFile' goto send IfFileExists $R1 +3 StrCpy $0 'InputFile is not exist' goto send StrCmp $R0 "1. LineFind" LineFindRead StrCmp $R0 "2. LineRead" LineRead StrCmp $R0 "3. FileReadFromEnd" FileReadFromEnd StrCmp $R0 "4. LineSum" LineSum StrCmp $R0 "5. FileJoin" FileJoin StrCmp $R0 "6. TextCompare" LineFind-TextCompare StrCmp $R0 "7. ConfigRead" ConfigRead StrCmp $R0 "8. ConfigWrite" ConfigWrite StrCmp $R0 "9. FileRecode" FileRecode Abort LineFindRead: StrCmp $R4 "Example7" 0 LineFind-TextCompare ${LineFind} '$R1' '/NUL' '$R3' LineFindCallback IfErrors error StrCmp $R0 StopLineFind 0 done StrCpy $0 'stopped' goto send LineFind-TextCompare: GetLabelAddress $6 LineFindBack goto Edit LineFindBack: FileClose $0 StrCmp $R0 "6. TextCompare" Compile StrCmp $CALLBACK '' Compile ${FileJoin} "$PROJECT" "$CALLBACK" "" Compile: StrCmp $LOG '' 0 +4 GetTempFileName $LOG $PLUGINSDIR GetDlgItem $0 $HWND 1212 EnableWindow $0 1 ReadRegStr $0 HKLM "SOFTWARE\NSIS" "" IfErrors 0 +2 StrCpy $0 "${NSISDIR}" nsExec::Exec '"$0\makensis.exe" /O$LOG $PROJECT' Pop $0 StrCmp $0 0 0 +6 ExecWait '$PROJECT.exe' $0 Delete $PROJECT Delete $PROJECT.exe StrCpy $PROJECT '' goto done MessageBox MB_YESNO|MB_ICONEXCLAMATION "Compile error. Open log?" IDNO +2 Exec 'notepad.exe $LOG' StrCpy $0 "Compile Error" goto send LineRead: ${LineRead} "$R1" "$R2" $0 IfErrors error send FileReadFromEnd: ${FileReadFromEnd} "$R1" "FileReadFromEndCallback" IfErrors error StrCmp $R0 StopFileReadFromEnd 0 done StrCpy $0 'stopped' goto send LineSum: ${LineSum} "$R1" $0 IfErrors error send FileJoin: ${FileJoin} "$R1" "$R2" "$R3" IfErrors error MessageBox MB_YESNO " Open output file?" IDNO done StrCmp $R3 '' 0 +3 Exec '"notepad.exe" "$R1"' goto done Exec '"notepad.exe" "$R3"' goto done ConfigRead: ${ConfigRead} "$R1" "$R2" $0 IfErrors error send ConfigWrite: ${ConfigWrite} "$R1" "$R2" "$R3" $0 IfErrors error MessageBox MB_YESNO " Open output file?" IDNO send Exec '"notepad.exe" "$R1"' goto send FileRecode: ${FileRecode} "$R1" "$R2" IfErrors error MessageBox MB_YESNO " Open output file?" IDNO done Exec '"notepad.exe" "$R1"' goto done error: StrCpy $0 'error' goto send done: StrCpy $0 'Done' send: GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:$0" abort: Abort FunctionEnd Function LineFindCallback MessageBox MB_OKCANCEL '$$R9 "Line"=[$R9]$\n$$R8 "#"=[$R8]$\n$$R7 "-#"=[$R7]$\n$$R6 "Range"=[$R6]$\n$$R5 "Read"=[$R5]$\n$$R4 "Write"=[$R4]' IDOK +2 StrCpy $R0 StopLineFind Push $R0 FunctionEnd Function FileReadFromEndCallback MessageBox MB_OKCANCEL '$$9 "Line"=[$9]$\n$$8 "#"=[$8]$\n$$7 "-#"=[$7]' IDOK +2 StrCpy $R0 StopFileReadFromEnd Push $R0 FunctionEnd Function .onInit InitPluginsDir GetTempFileName $INI $PLUGINSDIR File /oname=$INI "TextFunc.ini" FunctionEnd Page instfiles Section -Empty SectionEnd nsis-3.11/Examples/TextFuncTest.nsi000077500000000000000000000215661477201124000173160ustar00rootroot00000000000000;_____________________________________________________________________________ ; ; Text Functions Test ;_____________________________________________________________________________ ; ; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "Text Functions Test" OutFile "TextFuncTest.exe" Caption "$(^Name)" ShowInstDetails show XPStyle on RequestExecutionLevel user Var FUNCTION Var TEMPFILE1 Var TEMPFILE2 Var TEMPFILE3 Var HANDLE Var OUT !include "TextFunc.nsh" ;############### INSTALL ############### !define StackVerificationStart `!insertmacro StackVerificationStart` !macro StackVerificationStart _FUNCTION StrCpy $FUNCTION ${_FUNCTION} Call StackVerificationStart !macroend !define StackVerificationEnd `!insertmacro StackVerificationEnd` !macro StackVerificationEnd Call StackVerificationEnd !macroend Function StackVerificationStart StrCpy $0 !0 StrCpy $1 !1 StrCpy $2 !2 StrCpy $3 !3 StrCpy $4 !4 StrCpy $5 !5 StrCpy $6 !6 StrCpy $7 !7 StrCpy $8 !8 StrCpy $9 !9 StrCpy $R0 !R0 StrCpy $R1 !R1 StrCpy $R2 !R2 StrCpy $R3 !R3 StrCpy $R4 !R4 StrCpy $R5 !R5 StrCpy $R6 !R6 StrCpy $R7 !R7 StrCpy $R8 !R8 StrCpy $R9 !R9 FunctionEnd Function StackVerificationEnd IfErrors +3 DetailPrint 'PASSED $FUNCTION no errors' goto +2 DetailPrint 'FAILED $FUNCTION error' StrCmp $0 '!0' 0 error StrCmp $1 '!1' 0 error StrCmp $2 '!2' 0 error StrCmp $3 '!3' 0 error StrCmp $4 '!4' 0 error StrCmp $5 '!5' 0 error StrCmp $6 '!6' 0 error StrCmp $7 '!7' 0 error StrCmp $8 '!8' 0 error StrCmp $9 '!9' 0 error StrCmp $R0 '!R0' 0 error StrCmp $R1 '!R1' 0 error StrCmp $R2 '!R2' 0 error StrCmp $R3 '!R3' 0 error StrCmp $R4 '!R4' 0 error StrCmp $R5 '!R5' 0 error StrCmp $R6 '!R6' 0 error StrCmp $R7 '!R7' 0 error StrCmp $R8 '!R8' 0 error StrCmp $R9 '!R9' 0 error DetailPrint 'PASSED $FUNCTION stack' goto end error: DetailPrint 'FAILED $FUNCTION stack' ; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 ; quit end: FunctionEnd Section CreateTestFile GetTempFileName $TEMPFILE1 FileOpen $HANDLE $TEMPFILE1 w FileWrite $HANDLE '1A=a$\r$\n' FileWrite $HANDLE '2B=b$\r$\n' FileWrite $HANDLE '3C=c$\r$\n' FileWrite $HANDLE '4D=d$\r$\n' FileWrite $HANDLE '5E=e$\r$\n' FileClose $HANDLE GetTempFileName $TEMPFILE2 GetTempFileName $TEMPFILE3 SectionEnd Section LineFind ${StackVerificationStart} LineFind ${LineFind} '$TEMPFILE1' '/NUL' '1:-4 3 -1' 'LineFindCallback1' IfErrors error StrCmp $OUT '|1:2|-5|1|1A=a$\r$\n|1:2|-4|2|2B=b$\r$\n|3:3|-3|3|3C=c$\r$\n' 0 error StrCpy $OUT '' SetDetailsPrint none ${LineFind} '$TEMPFILE1' '$TEMPFILE2' '1:-1' 'LineFindCallback2' SetDetailsPrint both IfErrors error StrCmp $OUT '|1:-1||1|1A=a$\r$\n|1:-1||2|4D=d$\r$\n|1:-1||3|3C=c$\r$\n|1:-1||4|2B=B$\r$\n|1:-1||5|5E=e$\r$\n' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Function LineFindCallback1 StrCpy $OUT '$OUT|$R6|$R7|$R8|$R9' StrCmp $R8 3 0 +2 StrCpy $0 StopLineFind Push $0 FunctionEnd Function LineFindCallback2 StrCmp $R8 2 0 +2 StrCpy $R9 '4D=d$\r$\n' StrCmp $R8 4 0 +2 StrCpy $R9 '2B=B$\r$\n' StrCpy $OUT '$OUT|$R6|$R7|$R8|$R9' Push $0 FunctionEnd Section LineRead ${StackVerificationStart} LineRead ${LineRead} '$TEMPFILE1' '-1' $OUT IfErrors error StrCmp $OUT '5E=e$\r$\n' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section FileReadFromEnd ${StackVerificationStart} FileReadFromEnd StrCpy $OUT '' ${FileReadFromEnd} '$TEMPFILE1' 'FileReadFromEndCallback' IfErrors error StrCmp $OUT '|-1|5|5E=e$\r$\n|-2|4|4D=d$\r$\n|-3|3|3C=c$\r$\n|-4|2|2B=b$\r$\n' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Function FileReadFromEndCallback StrCpy $OUT '$OUT|$7|$8|$9' StrCmp $8 2 0 +2 StrCpy $0 StopFileReadFromEnd Push $0 FunctionEnd Section LineSum ${StackVerificationStart} LineSum ${LineSum} '$TEMPFILE1' $OUT IfErrors error StrCmp $OUT '5' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section FileJoin ${StackVerificationStart} FileJoin SetDetailsPrint none ${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3' SetDetailsPrint both ${StackVerificationEnd} SectionEnd Section TextCompare ${StackVerificationStart} TextCompare StrCpy $OUT '' ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'TextCompareCallback' StrCmp $OUT '|2|4D=d$\r$\n|2|2B=b$\r$\n|4|2B=B$\r$\n|4|4D=d$\r$\n' 0 error StrCpy $OUT '' ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastEqual' 'TextCompareCallback' StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error StrCpy $OUT '' ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback' StrCmp $OUT '' 0 error StrCpy $OUT '' ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback' StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|4|2B=B$\r$\n|2|2B=b$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|2|4D=d$\r$\n|4|4D=d$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section TextCompareS ${StackVerificationStart} TextCompareS StrCpy $OUT '' ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback' StrCmp $OUT '|||2|2B=b$\r$\n' 0 error StrCpy $OUT '' ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback' StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|2|4D=d$\r$\n|4|4D=d$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Function TextCompareCallback StrCpy $OUT '$OUT|$6|$7|$8|$9' Push $0 FunctionEnd Section ConfigRead ${StackVerificationStart} ConfigRead ${ConfigRead} '$TEMPFILE1' '3c=' $OUT StrCmp $OUT 'c' 0 error ${ConfigRead} '$TEMPFILE1' '6F=' $OUT StrCmp $OUT '' 0 error ${ConfigRead} '$TEMPFILE1' 'FF=' $OUT IfErrors 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section ConfigReadS ${StackVerificationStart} ConfigReadS ${ConfigReadS} '$TEMPFILE1' '3C=' $OUT StrCmp $OUT 'c' 0 error ${ConfigReadS} '$TEMPFILE1' '3c=' $OUT IfErrors 0 error StrCmp $OUT '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section ConfigWrite ${StackVerificationStart} ConfigWrite ${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT StrCmp $OUT 'CHANGED' 0 error ${ConfigWrite} '$TEMPFILE1' '2B=' '' $OUT StrCmp $OUT 'DELETED' 0 error ${ConfigWrite} '$TEMPFILE1' '3c=' 'c' $OUT StrCmp $OUT 'SAME' 0 error ${ConfigWrite} '$TEMPFILE1' '6F=' '*' $OUT StrCmp $OUT 'ADDED' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section ConfigWriteS ${StackVerificationStart} ConfigWriteS ${ConfigWriteS} '$TEMPFILE1' '5e=' 'e**' $OUT StrCmp $OUT 'ADDED' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section FileRecode ${StackVerificationStart} FileRecode ${FileRecode} '$TEMPFILE1' 'CharToOem' ${StackVerificationEnd} SectionEnd Section TrimNewLines ${StackVerificationStart} TrimNewLines ${TrimNewLines} 'Text Line$\r$\n' $OUT StrCmp $OUT 'Text Line' 0 error ${TrimNewLines} 'Text Line' $OUT StrCmp $OUT 'Text Line' 0 error ${TrimNewLines} 'Text Line$\n' $OUT StrCmp $OUT 'Text Line' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WriteUninstaller SetDetailsPrint none Delete $TEMPFILE1 Delete $TEMPFILE2 Delete $TEMPFILE3 SetDetailsPrint both goto +2 WriteUninstaller '$EXEDIR\un.TextFuncTest.exe' SectionEnd ;############### UNINSTALL ############### Section un.Uninstall ${LineFind} '$TEMPFILE1' '/NUL' '1:-1' 'un.LineFindCallback' ${LineRead} '$TEMPFILE1' '-1' $OUT ${FileReadFromEnd} '$TEMPFILE1' 'un.FileReadFromEndCallback' ${LineSum} '$TEMPFILE1' $OUT ${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3' ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback' ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback' ${ConfigRead} '$TEMPFILE1' '3c=' $OUT ${ConfigReadS} '$TEMPFILE1' '3c=' $OUT ${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT ${ConfigWriteS} '$TEMPFILE1' '5E=' 'e**' $OUT ${FileRecode} '$TEMPFILE1' 'CharToOem' ${TrimNewLines} 'Text Line$\r$\n' $OUT SectionEnd Function un.LineFindCallback Push $0 FunctionEnd Function un.FileReadFromEndCallback Push $0 FunctionEnd Function un.TextCompareCallback Push $0 FunctionEnd nsis-3.11/Examples/VersionInfo.nsi000077500000000000000000000020051477201124000171420ustar00rootroot00000000000000; VersionInfo.nsi ; ; This script shows you how to add version information to an installer. ; Windows shows this information on the Version tab of the File properties. ;-------------------------------- Name "Version Info" OutFile "VersionInfo.exe" LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf" ;-------------------------------- ;Version Information VIProductVersion "1.2.3.4" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application" VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company" VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company" VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright Fake company" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3" ;-------------------------------- Section "" SectionEnd nsis-3.11/Examples/WordFunc.ini000077500000000000000000000034041477201124000164220ustar00rootroot00000000000000[Settings] NumFields=13 NextButtonText=&Enter [Field 1] Type=Droplist Flags=NOTIFY State=1. WordFind (Find word by number) ListItems=1. WordFind (Find word by number)| (Delimiter exclude)| (Sum of words)| (Sum of delimiters)| (Find word number)| ( }} )| ( {} )| ( *} )|2. WordFind2X|3. WordReplace (Replace)| (Delete)| (Multiple-replace)|4. WordAdd (Add)| (Delete) |5. WordInsert|6. StrFilter (UpperCase)| (LowerCase)| (Filter)|7. VersionCompare|8. VersionConvert Left=44 Right=190 Top=10 Bottom=191 [Field 2] Type=Text State=C:\io.sys|C:\logo.sys|C:\Program Files|C:\WINDOWS Left=44 Right=-10 Top=30 Bottom=41 [Field 3] Type=Text State=|C:\ Left=44 Right=-10 Top=46 Bottom=59 [Field 4] Type=Text Flags=DISABLED Left=44 Right=-10 Top=62 Bottom=75 [Field 5] Type=Text State=-4 Left=44 Right=-10 Top=80 Bottom=92 [Field 6] Type=Text Left=10 Right=-30 Top=108 Bottom=120 [Field 7] Type=Text Left=-22 Right=-10 Top=108 Bottom=120 [Field 8] Type=Label Text=String Left=10 Right=43 Top=32 Bottom=44 [Field 9] Type=Label Text=Delimiter Left=10 Right=43 Top=48 Bottom=60 [Field 10] Type=Label Left=10 Right=44 Top=65 Bottom=76 [Field 11] Type=Label Text=Word # Left=10 Right=43 Top=81 Bottom=94 [Field 12] Type=Label Text=Result (Word): Left=10 Right=236 Top=97 Bottom=110 [Field 13] Type=Label Text=EL Left=-21 Right=-10 Top=97 Bottom=110 nsis-3.11/Examples/WordFunc.nsi000077500000000000000000000400651477201124000164400ustar00rootroot00000000000000;_____________________________________________________________________________ ; ; Word Functions ;_____________________________________________________________________________ ; ; 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "Word Functions" OutFile "WordFunc.exe" Caption "$(^Name)" XPStyle on RequestExecutionLevel user Var INI Var HWND Var STATE !include "WinMessages.nsh" !include "WordFunc.nsh" Page Custom ShowCustom LeaveCustom Function ShowCustom InstallOptions::initDialog "$INI" Pop $hwnd InstallOptions::show Pop $0 FunctionEnd Function LeaveCustom ReadINIStr $0 $INI "Settings" "State" StrCmp $0 0 Enter GetDlgItem $1 $HWND 1202 EnableWindow $1 1 GetDlgItem $1 $HWND 1203 ShowWindow $1 1 GetDlgItem $1 $HWND 1204 ShowWindow $1 1 GetDlgItem $1 $HWND 1206 EnableWindow $1 1 GetDlgItem $1 $HWND 1205 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1206 SendMessage $1 ${WM_SETTEXT} 1 "STR:" ReadINIStr $0 $INI "Field 1" "State" StrCmp $0 "1. WordFind (Find word by number)" 0 WordFind2Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:-4" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word):" goto WordFindSend WordFind2Send: StrCmp $0 " (Delimiter exclude)" 0 WordFind3Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E-2{" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{ or }after delimiter):" goto WordFindSend WordFind3Send: StrCmp $0 " (Sum of words)" 0 WordFind4Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:#" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Sum of words):" goto WordFindSend WordFind4Send: StrCmp $0 " (Sum of delimiters)" 0 WordFind5Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E*" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Sum of delimiters):" goto WordFindSend WordFind5Send: StrCmp $0 " (Find word number)" 0 WordFind6Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:/Program Files" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:/Word" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word #):" goto WordFindSend WordFind6Send: StrCmp $0 " ( }} )" 0 WordFind7Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2}}" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{{ or }}after word):" goto WordFindSend WordFind7Send: StrCmp $0 " ( {} )" 0 WordFind8Send GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:+2{}" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Without word):" goto WordFindSend WordFind8Send: StrCmp $0 " ( *} )" 0 WordFind2XSend GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2*}" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{* or *}after word with word):" goto WordFindSend WordFind2XSend: StrCmp $0 "2. WordFind2X" 0 WordReplace1Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:[C:\" GetDlgItem $1 $HWND 1203 EnableWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:];" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2" GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:String" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter1" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter2" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word):" abort WordReplace1Send: StrCmp $0 "3. WordReplace (Replace)" 0 WordReplace2Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:SYS" GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:bmp" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:+2" goto WordReplaceSend WordReplace2Send: StrCmp $0 " (Delete)" 0 WordReplace3Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:SYS" GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E+" goto WordReplaceSend WordReplace3Send: StrCmp $0 " (Multiple-replace)" 0 WordAdd1Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys||||||C:\logo.sys|||C:\WINDOWS" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|" GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:|" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:+1*" goto WordReplaceSend WordAdd1Send: StrCmp $0 "4. WordAdd (Add)" 0 WordAdd2Send GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:+C:\WINDOWS|C:\config.sys|C:\IO.SYS" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String1 + String2):" goto WordAddSend WordAdd2Send: StrCmp $0 " (Delete) " 0 WordInsertSend GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E-C:\WINDOWS|C:\config.sys|C:\IO.SYS" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String1 - String2):" goto WordAddSend WordInsertSend: StrCmp $0 "5. WordInsert" 0 StrFilter1Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\WINDOWS" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|" GetDlgItem $1 $HWND 1203 EnableWindow $1 1 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\logo.sys" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2" GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:String" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result:" abort StrFilter1Send: StrCmp $0 "6. StrFilter (UpperCase)" 0 StrFilter2Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:+" GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String in uppercase):" goto StrFilterSend StrFilter2Send: StrCmp $0 " (LowerCase)" 0 StrFilter3Send GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:-" GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:ef" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String in lowercase except EF):" goto StrFilterSend StrFilter3Send: StrCmp $0 " (Filter)" 0 VersionCompareSend GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:+12" GetDlgItem $1 $HWND 1203 SendMessage $1 ${WM_SETTEXT} 1 "STR:b" GetDlgItem $1 $HWND 1204 SendMessage $1 ${WM_SETTEXT} 1 "STR:def" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String Digits + Letters + b - def):" goto StrFilterSend VersionCompareSend: StrCmp $0 "7. VersionCompare" 0 VersionConvertSend GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:1.1.1.9" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:1.1.1.01" GetDlgItem $1 $HWND 1203 ShowWindow $1 0 GetDlgItem $1 $HWND 1204 ShowWindow $1 0 GetDlgItem $1 $HWND 1206 EnableWindow $1 0 GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:Version1" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Version2" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (0-equal 1-newer 2-older):" abort VersionConvertSend: StrCmp $0 "8. VersionConvert" 0 Abort GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:9.0c" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1203 ShowWindow $1 0 GetDlgItem $1 $HWND 1204 ShowWindow $1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1206 EnableWindow $1 0 GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:Version" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:CharList" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (numerical version format):" abort Abort: Abort WordFindSend: GetDlgItem $1 $HWND 1203 EnableWindow $1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\Program Files|C:\WINDOWS" GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:String" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:" Abort WordReplaceSend: GetDlgItem $1 $HWND 1203 EnableWindow $1 1 GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:String" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Replace it" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR: with" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" GetDlgItem $1 $HWND 1211 SendMessage $1 ${WM_SETTEXT} 1 "STR:Result:" Abort WordAddSend: GetDlgItem $1 $HWND 1203 EnableWindow $1 0 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1201 SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS" GetDlgItem $1 $HWND 1202 SendMessage $1 ${WM_SETTEXT} 1 "STR:|" GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:String1" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:String2" Abort StrFilterSend: GetDlgItem $1 $HWND 1203 EnableWindow $1 1 GetDlgItem $1 $HWND 1206 EnableWindow $1 0 GetDlgItem $1 $HWND 1207 SendMessage $1 ${WM_SETTEXT} 1 "STR:String" GetDlgItem $1 $HWND 1208 SendMessage $1 ${WM_SETTEXT} 1 "STR:Filter" GetDlgItem $1 $HWND 1209 SendMessage $1 ${WM_SETTEXT} 1 "STR:Include" GetDlgItem $1 $HWND 1210 SendMessage $1 ${WM_SETTEXT} 1 "STR:Exclude" Abort ;=Enter= Enter: StrCpy $0 '' ReadINIStr $STATE $INI "Field 1" "State" ReadINIStr $R1 $INI "Field 2" "State" ReadINIStr $R2 $INI "Field 3" "State" ReadINIStr $R3 $INI "Field 4" "State" ReadINIStr $R4 $INI "Field 5" "State" StrCmp $STATE "1. WordFind (Find word by number)" WordFind StrCmp $STATE " (Delimiter exclude)" WordFind StrCmp $STATE " (Find in string)" WordFind StrCmp $STATE " (Sum of words)" WordFind StrCmp $STATE " (Sum of delimiters)" WordFind StrCmp $STATE " (Find word number)" WordFind StrCmp $STATE " ( }} )" WordFind StrCmp $STATE " ( {} )" WordFind StrCmp $STATE " ( *} )" WordFind StrCmp $STATE "2. WordFind2X" WordFind2X StrCmp $STATE "3. WordReplace (Replace)" WordReplace StrCmp $STATE " (Delete)" WordReplace StrCmp $STATE " (Multiple-replace)" WordReplace StrCmp $STATE "4. WordAdd (Add)" WordAdd StrCmp $STATE " (Delete) " WordAdd StrCmp $STATE "5. WordInsert" WordInsert StrCmp $STATE "6. StrFilter (UpperCase)" StrFilter StrCmp $STATE " (LowerCase)" StrFilter StrCmp $STATE " (Filter)" StrFilter StrCmp $STATE "7. VersionCompare" VersionCompare StrCmp $STATE "8. VersionConvert" VersionConvert Abort WordFind: ${WordFind} "$R1" "$R2" "$R4" $R0 IfErrors 0 Send StrCpy $0 $R0 StrCmp $R0 3 0 +3 StrCpy $3 '"+1" "-1" "+1}" "+1{" "#" "/word"' goto error3 StrCmp $R0 2 0 error1 StrCpy $R4 $R4 '' 1 StrCpy $1 $R4 1 StrCmp $1 / 0 error2 StrCpy $R4 $R4 '' 1 StrCpy $R0 '"$R4" no such word.' goto Send WordFind2X: ${WordFind2X} "$R1" "$R2" "$R3" "$R4" $R0 IfErrors 0 Send StrCpy $0 $R0 StrCmp $R0 3 0 +3 StrCpy $3 '"+1" "-1"' goto error3 StrCmp $R0 2 +3 StrCpy $R0 '"$R2...$R3" no words found.' goto Send StrCpy $R4 $R4 '' 1 StrCpy $1 $R4 1 StrCmp $1 / 0 +2 StrCpy $R4 $R4 '' 1 StrCpy $R0 '"$R4" no such word.' goto Send WordReplace: ${WordReplace} "$R1" "$R2" "$R3" "$R4" $R0 IfErrors 0 Send StrCpy $0 $R0 StrCmp $R0 3 0 +3 StrCpy $3 '"+1" "+1*" "+" "+*" "{}"' goto error3 StrCmp $R0 2 0 error1 StrCpy $R4 $R4 '' 1 goto error2 WordAdd: ${WordAdd} "$R1" "$R2" "$R4" $R0 IfErrors 0 Send StrCpy $0 $R0 StrCmp $R0 3 0 error1empty StrCpy $3 '"+text" "-text"' goto error3 WordInsert: ${WordInsert} "$R1" "$R2" "$R3" "$R4" $R0 IfErrors 0 Send StrCpy $0 $R0 StrCmp $R0 3 0 +3 StrCpy $3 '"+1" "-1"' goto error3 StrCmp $R0 2 0 error1empty StrCpy $R4 $R4 '' 1 goto error2 StrFilter: ${StrFilter} "$R1" "$R2" "$R3" "$R4" $R0 IfErrors 0 Send StrCpy $R0 'Syntax error' goto Send VersionCompare: ${VersionCompare} "$R1" "$R2" $R0 goto Send VersionConvert: ${VersionConvert} "$R1" "$R2" $R0 goto Send error3: StrCpy $R0 '"$R4" syntax error ($3)' goto Send error2: StrCpy $R0 '"$R4" no such word number' goto Send error1empty: StrCpy $R0 '"$R2" delimiter is empty' goto Send error1: StrCpy $R0 '"$R2" delimiter not found in string' goto Send Send: GetDlgItem $1 $HWND 1205 SendMessage $1 ${WM_SETTEXT} 1 "STR:$R0" GetDlgItem $1 $HWND 1206 SendMessage $1 ${WM_SETTEXT} 1 "STR:$0" abort FunctionEnd Function .onInit InitPluginsDir GetTempFileName $INI $PLUGINSDIR File /oname=$INI "WordFunc.ini" FunctionEnd Page instfiles Section "Empty" SectionEnd nsis-3.11/Examples/WordFuncTest.nsi000077500000000000000000000400701477201124000172740ustar00rootroot00000000000000;_____________________________________________________________________________ ; ; Word Functions Test ;_____________________________________________________________________________ ; ; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "Word Functions Test" OutFile "WordFuncTest.exe" Caption "$(^Name)" ShowInstDetails show XPStyle on RequestExecutionLevel user Var FUNCTION Var OUT !include "WordFunc.nsh" ;############### INSTALL ############### !define StackVerificationStart `!insertmacro StackVerificationStart` !macro StackVerificationStart _FUNCTION StrCpy $FUNCTION ${_FUNCTION} Call StackVerificationStart !macroend !define StackVerificationEnd `!insertmacro StackVerificationEnd` !macro StackVerificationEnd Call StackVerificationEnd !macroend Function StackVerificationStart StrCpy $0 !0 StrCpy $1 !1 StrCpy $2 !2 StrCpy $3 !3 StrCpy $4 !4 StrCpy $5 !5 StrCpy $6 !6 StrCpy $7 !7 StrCpy $8 !8 StrCpy $9 !9 StrCpy $R0 !R0 StrCpy $R1 !R1 StrCpy $R2 !R2 StrCpy $R3 !R3 StrCpy $R4 !R4 StrCpy $R5 !R5 StrCpy $R6 !R6 StrCpy $R7 !R7 StrCpy $R8 !R8 StrCpy $R9 !R9 FunctionEnd Function StackVerificationEnd IfErrors +3 DetailPrint 'PASSED $FUNCTION no errors' goto +2 DetailPrint 'FAILED $FUNCTION error' StrCmp $0 '!0' 0 error StrCmp $1 '!1' 0 error StrCmp $2 '!2' 0 error StrCmp $3 '!3' 0 error StrCmp $4 '!4' 0 error StrCmp $5 '!5' 0 error StrCmp $6 '!6' 0 error StrCmp $7 '!7' 0 error StrCmp $8 '!8' 0 error StrCmp $9 '!9' 0 error StrCmp $R0 '!R0' 0 error StrCmp $R1 '!R1' 0 error StrCmp $R2 '!R2' 0 error StrCmp $R3 '!R3' 0 error StrCmp $R4 '!R4' 0 error StrCmp $R5 '!R5' 0 error StrCmp $R6 '!R6' 0 error StrCmp $R7 '!R7' 0 error StrCmp $R8 '!R8' 0 error StrCmp $R9 '!R9' 0 error DetailPrint 'PASSED $FUNCTION stack' goto end error: DetailPrint 'FAILED $FUNCTION stack' ; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 ; quit end: FunctionEnd Section WordFind ${StackVerificationStart} WordFind ${WordFind} '||io.sys|||Program Files|||WINDOWS' '||' '-02' $OUT StrCmp $OUT '|Program Files' 0 error ${WordFind} '||io.sys||||Program Files||||WINDOWS' '||' '-2' $OUT StrCmp $OUT 'Program Files' 0 error ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '-2}' $OUT StrCmp $OUT '|logo.sys|||WINDOWS' 0 error ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '#' $OUT StrCmp $OUT '3' 0 error ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '*' $OUT StrCmp $OUT '2' 0 error ${WordFind} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT StrCmp $OUT '2' 0 error ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2}}' $OUT StrCmp $OUT '|||WINDOWS' 0 error ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2{}' $OUT StrCmp $OUT 'C:\io.sys|||WINDOWS' 0 error ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2*}' $OUT StrCmp $OUT '|logo.sys|||WINDOWS' 0 error ${WordFind} 'C:\\Program Files\\NSIS\\NSIS.chm' '\' '-2{*' $OUT StrCmp $OUT 'C:\\Program Files\\NSIS' 0 error ${WordFind} 'C:\io.sys|||Program Files|||WINDOWS|||' '||' '-1' $OUT StrCmp $OUT '|' 0 error ${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '-1}' $OUT StrCmp $OUT '' 0 error ${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '+1{' $OUT StrCmp $OUT '' 0 error ${WordFind} 'C:\io.sys|||logo.sys' '_' 'E+1' $OUT IfErrors 0 error StrCmp $OUT 1 0 error ${WordFind} 'C:\io.sys|||logo.sys|||' '\' 'E+3' $OUT IfErrors 0 error StrCmp $OUT 2 0 error ${WordFind} 'C:\io.sys|||logo.sys' '\' 'E1' $OUT IfErrors 0 error StrCmp $OUT 3 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordFindS ${StackVerificationStart} WordFindS ${WordFindS} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|PROGRAM FILES' $OUT StrCmp $OUT 'C:\io.sys|||Program Files|||WINDOWS' 0 error ${WordFindS} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT StrCmp $OUT '2' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordFind2X ${StackVerificationStart} WordFind2X ${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT StrCmp $OUT 'logo.sys' 0 error ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1' $OUT StrCmp $OUT 'logo' 0 error ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{{' $OUT StrCmp $OUT 'C:\WINDOWS C:\io.sys C:' 0 error ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{}' $OUT StrCmp $OUT 'C:\WINDOWS C:\io.sys C:sys' 0 error ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{*' $OUT StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.' 0 error ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT StrCmp $OUT '2' 0 error ${WordFind2X} '||a||b||c' '||' '||' 'E+1' $OUT StrCmp $OUT 'a' 0 error ${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E+1' $OUT IfErrors 0 error StrCmp $OUT 1 0 error ${WordFind2X} '[io.sys];[C:\logo.sys]' '[' '];' 'E+2' $OUT IfErrors 0 error StrCmp $OUT 2 0 error ${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E2' $OUT IfErrors 0 error StrCmp $OUT 3 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordFind2XS ${StackVerificationStart} WordFind2XS ${WordFind2XS} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/LOGO' $OUT StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.sys' 0 error ${WordFind2XS} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT StrCmp $OUT '2' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordFind3X ${StackVerificationStart} WordFind3X ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT StrCmp $OUT '1.AAB' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1' $OUT StrCmp $OUT '2.BAA' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{{' $OUT StrCmp $OUT '[1.AAB];' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{}' $OUT StrCmp $OUT '[1.AAB];[3.BBB];' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{*' $OUT StrCmp $OUT '[1.AAB];[2.BAA];' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT StrCmp $OUT '2' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'XX' '];' 'E+1' $OUT IfErrors 0 error StrCmp $OUT '1' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E+3' $OUT IfErrors 0 error StrCmp $OUT '2' 0 error ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E3' $OUT IfErrors 0 error StrCmp $OUT '3' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordFind3XS ${StackVerificationStart} WordFind3XS ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.baa' $OUT StrCmp $OUT '[1.AAB];[2.BAA];[3.BBB];' 0 error ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT StrCmp $OUT '2' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordReplace ${StackVerificationStart} WordReplace ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' '' '+' $OUT StrCmp $OUT 'C:\io. C:\logo. C:\WINDOWS' 0 error ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'C:\io.sys' '' '+' $OUT StrCmp $OUT ' C:\logo.sys C:\WINDOWS' 0 error ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' ' ' '+1*' $OUT StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error ${WordReplace} 'C:\io.sys C:\logo.sysSYSsys C:\WINDOWS' 'sys' 'bmp' '+*' $OUT StrCmp $OUT 'C:\io.bmp C:\logo.bmp C:\WINDOWS' 0 error ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{' $OUT StrCmp $OUT '||C:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 0 error ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '}' $OUT StrCmp $OUT 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWS|||' 0 error ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}' $OUT StrCmp $OUT '||C:\io.sys C:\logo.sys C:\WINDOWS|||' 0 error ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{*' $OUT StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 0 error ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '}*' $OUT StrCmp $OUT 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWS|' 0 error ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error ${WordReplace} 'sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error ${WordReplace} 'C:\io.sys C:\logo.sys' '#sys' '|sys|' 'E+1' $OUT IfErrors 0 error StrCmp $OUT '1' 0 error ${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E+3' $OUT IfErrors 0 error StrCmp $OUT '2' 0 error ${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E3' $OUT IfErrors 0 error StrCmp $OUT '3' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordReplaceS ${StackVerificationStart} WordReplaceS ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'sys' 'bmp' '+2' $OUT StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordAdd ${StackVerificationStart} WordAdd ${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error ${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT StrCmp $OUT 'C:\logo.sys' 0 error ${WordAdd} 'C:\io.sys' ' ' '+C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error ${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS' $OUT StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error ${WordAdd} 'C:\io.sys C:\logo.sys' ' ' '+C:\logo.sys' $OUT StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error ${WordAdd} 'C:\io.sys C:\logo.sys' ' ' 'E-' $OUT StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error IfErrors error ${WordAdd} 'C:\io.sys C:\logo.sys' '' 'E-C:\logo.sys' $OUT IfErrors 0 error StrCmp $OUT '1' 0 error ${WordAdd} 'C:\io.sys C:\logo.sys' '' 'EC:\logo.sys' $OUT IfErrors 0 error StrCmp $OUT '3' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordAddS ${StackVerificationStart} WordAddS ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\windows C:\config.sys' $OUT StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\windows C:\config.sys' 0 error ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordInsert ${StackVerificationStart} WordInsert ${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error ${WordInsert} 'C:\io.sys' ' ' 'C:\WINDOWS' '+2' $OUT StrCmp $OUT 'C:\io.sys C:\WINDOWS' 0 error ${WordInsert} '' ' ' 'C:\WINDOWS' '+1' $OUT StrCmp $OUT 'C:\WINDOWS ' 0 error ${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E+1' $OUT IfErrors 0 error StrCmp $OUT '1' 0 error ${WordInsert} 'C:\io.sys C:\logo.sys' ' ' 'C:\logo.sys' 'E+4' $OUT IfErrors 0 error StrCmp $OUT '2' 0 error ${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E1' $OUT IfErrors 0 error StrCmp $OUT '3' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WordInsertS ${StackVerificationStart} WordInsertS ${WordInsertS} 'C:\io.sys x C:\logo.sys' ' X ' 'C:\NTLDR' '+2' $OUT StrCmp $OUT 'C:\io.sys x C:\logo.sys X C:\NTLDR' 0 error ${WordInsertS} 'C:\io.sys x C:\logo.sys' ' x ' 'C:\NTLDR' '+2' $OUT StrCmp $OUT 'C:\io.sys x C:\NTLDR x C:\logo.sys' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section StrFilter ${StackVerificationStart} StrFilter ${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT IfErrors error StrCmp $OUT '123ABC 456DEF 7890|%#' 0 error ${StrFilter} '123abc 456DEF 7890|%#' '-' 'ef' '' $OUT IfErrors error StrCmp $OUT '123abc 456dEF 7890|%#' 0 error ${StrFilter} '123abc 456DEF 7890|%#' '2' '|%' '' $OUT IfErrors error StrCmp $OUT 'abcDEF|%' 0 error ${StrFilter} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT IfErrors error StrCmp $OUT '123a 6F 78|%#' 0 error ${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT IfErrors error StrCmp $OUT '123AbC4567890' 0 error ${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT IfErrors error StrCmp $OUT '123AbC4567890' 0 error ${StrFilter} '123abc 456DEF 7890|%#' '123' 'b' 'def' $OUT IfErrors 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section StrFilterS ${StackVerificationStart} StrFilterS ${StrFilterS} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT IfErrors error StrCmp $OUT '123a 6 78|%#' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section VersionCompare ${StackVerificationStart} VersionCompare ${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT StrCmp $OUT '1' 0 error ${VersionCompare} '1.1.1.1' '1.1.1.10' $OUT StrCmp $OUT '2' 0 error ${VersionCompare} '91.1.1.1' '101.1.1.9' $OUT StrCmp $OUT '2' 0 error ${VersionCompare} '1.1.1.1' '1.1.1.1' $OUT StrCmp $OUT '0' 0 error ${VersionCompare} '1.1.1.9' '1.1.1.10' $OUT StrCmp $OUT '2' 0 error ${VersionCompare} '1.1.1.0' '1.1.1' $OUT StrCmp $OUT '0' 0 error ${VersionCompare} '1.1.0.0' '1.1' $OUT StrCmp $OUT '0' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section VersionConvert ${StackVerificationStart} VersionConvert ${VersionConvert} '9.0a' '' $OUT StrCmp $OUT '9.0.01' 0 error ${VersionConvert} '9.0c' '' $OUT StrCmp $OUT '9.0.03' 0 error ${VersionConvert} '0.15c-9m' '' $OUT StrCmp $OUT '0.15.03.9.13' 0 error ${VersionConvert} '0.15c+' 'abcdefghijklmnopqrstuvwxyz+' $OUT StrCmp $OUT '0.15.0327' 0 error ${VersionConvert} '0.0xa12.x.ax|.|.|x|a|.3|a.4.||5.|' '' $OUT StrCmp $OUT '0.0.2401.12.24.0124.24.01.3.01.4.5' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section WriteUninstaller goto +2 WriteUninstaller '$EXEDIR\un.WordFuncTest.exe' SectionEnd ;############### UNINSTALL ############### Section un.Uninstall ${WordFind} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT ${WordFindS} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT ${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT ${WordFind2XS} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT ${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT ${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT ${WordInsertS} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT ${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT ${StrFilterS} '123abc 456DEF 7890|%#' '+' '' '' $OUT ${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT ${VersionConvert} '9.0a' '' $OUT SectionEnd nsis-3.11/Examples/bigtest.nsi000077500000000000000000000206701477201124000163520ustar00rootroot00000000000000; bigtest.nsi ; ; This script attempts to test most of the functionality of the NSIS exehead. ;-------------------------------- !ifdef HAVE_UPX !packhdr tmp.dat "upx\upx -9 tmp.dat" !endif !ifdef NOCOMPRESS SetCompress off !endif ;-------------------------------- Name "BigNSISTest" Caption "NSIS Big Test" Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico" OutFile "bigtest.exe" SetDateSave on SetDatablockOptimize on CRCCheck on SilentInstall normal BGGradient 000000 800000 FFFFFF InstallColors FF8080 000030 XPStyle on InstallDir "$PROGRAMFILES\NSISTest\BigNSISTest" InstallDirRegKey HKLM "Software\NSISTest\BigNSISTest" "Install_Dir" CheckBitmap "${NSISDIR}\Contrib\Graphics\Checks\classic-cross.bmp" LicenseText "A test text, make sure it's all there" LicenseData "bigtest.nsi" RequestExecutionLevel admin ManifestSupportedOS all ;-------------------------------- Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles ;-------------------------------- !ifndef NOINSTTYPES ; only if not defined InstType "Most" InstType "Full" InstType "More" InstType "Base" ;InstType /NOCUSTOM ;InstType /COMPONENTSONLYONCUSTOM !endif AutoCloseWindow false ShowInstDetails show ;-------------------------------- Section "" ; empty string makes it hidden, so would starting with - ; write reg info StrCpy $1 "Hello World" DetailPrint "I like to be able to see what is going on (debug) $1" WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "Install_Dir" "$INSTDIR" ; write uninstall strings WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "DisplayName" "BigNSISTest (remove only)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "UninstallString" '"$INSTDIR\bt-uninst.exe"' SetOutPath $INSTDIR File /a "silent.nsi" CreateDirectory "$INSTDIR\MyProjectFamily\MyProject" ; 2 recursively create a directory for fun. WriteUninstaller "$INSTDIR\bt-uninst.exe" Nop ; for fun SectionEnd Section "TempTest" SectionIn 1 2 3 Start: MessageBox MB_OK "Start:" MessageBox MB_YESNO "Goto MyLabel" IDYES MyLabel MessageBox MB_OK "Right before MyLabel:" MyLabel: MessageBox MB_OK "MyLabel:" MessageBox MB_OK "Right after MyLabel:" MessageBox MB_YESNO "Goto Start:?" IDYES Start SectionEnd SectionGroup /e SectionGroup1 Section "Test Registry/INI functions" SectionIn 1 4 3 WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "StrTest_INSTDIR" "$INSTDIR" WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0xDEADBEEF" 0xdeadbeef WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_123456" 123456 WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0123" 0123 WriteRegBin HKLM SOFTWARE\NSISTest\BigNSISTest "BinTest_deadbeef01f00dbeef" "DEADBEEF01F00DBEEF" StrCpy $8 "$SYSDIR\IniTest" WriteINIStr "$INSTDIR\test.ini" "MySection" "Value1" $8 WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value1" $8 WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value2" $8 WriteINIStr "$INSTDIR\test.ini" "IniOn" "Value1" $8 Call MyFunctionTest DeleteINIStr "$INSTDIR\test.ini" "IniOn" "Value1" DeleteINISec "$INSTDIR\test.ini" "MySectionIni" ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1" StrCmp $1 "" INIDelSuccess MessageBox MB_OK "DeleteINISec failed" INIDelSuccess: ClearErrors ReadRegStr $1 HKCR "software\microsoft" xyz_cc_does_not_exist IfErrors 0 NoError MessageBox MB_OK "could not read from HKCR\software\microsoft\xyz_cc_does_not_exist" Goto ErrorYay NoError: MessageBox MB_OK "read '$1' from HKCR\software\microsoft\xyz_cc_does_not_exist" ErrorYay: SectionEnd Section "Test CreateShortcut" SectionIn 1 2 3 Call CSCTest SectionEnd SectionGroup Group2 !define ASSERT `!insertmacro ASSERT "${U+24}{__FILE__}" ${U+24}{__LINE__} ` !macro ASSERT __file __line __xpr ${__xpr} +2 MessageBox MB_ICONSTOP `ASSERT: ${__xpr} (${__file}:${__line})` !macroend Section "Integer" IntOp $0 0xffffffff >> 31 ${ASSERT} `IntCmpU $0 -1` IntOp $0 0xffffffff >>> 31 ${ASSERT} `IntCmpU $0 1` IntOp $0 1 << 31 ${ASSERT} `IntCmpU $0 0x80000000` IntOp $0 0x80000000 ^ 0x40000000 ${ASSERT} `IntCmpU $0 0xC0000000` ClearErrors IntOp $0 1 / 0 ${ASSERT} `IfErrors ` ; Division by zero must set the error flag ${ASSERT} `IntCmpU $0 0` ; Unspecified result, hopefully it's zero SectionEnd Section "Test Branching" BeginTestSection: SectionIn 1 2 3 SetOutPath $INSTDIR IfFileExists "$INSTDIR\LogicLib.nsi" 0 BranchTest69 MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to overwrite $INSTDIR\LogicLib.nsi?" IDNO NoOverwrite ; skipped if file doesn't exist BranchTest69: SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS NoOverwrite: File "LogicLib.nsi" ; skipped if answered no SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to skip the rest of this section?" IDYES EndTestBranch MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to go back to the beginning of this section?" IDYES BeginTestSection MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to hide the installer and wait five seconds?" IDNO NoHide HideWindow Sleep 5000 BringToFront NoHide: MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to call the function 5 times?" IDNO NoRecurse StrCpy $1 "x" LoopTest: Call myfunc StrCpy $1 "x$1" StrCmp $1 "xxxxxx" 0 LoopTest NoRecurse: EndTestBranch: SectionEnd SectionGroupEnd Section "Test CopyFiles" SectionIn 1 2 3 SetOutPath $INSTDIR\cpdest CopyFiles "$WINDIR\*.ini" "$INSTDIR\cpdest" 0 SectionEnd SectionGroupEnd Section "Test Exec functions" TESTIDX SectionIn 1 2 3 SearchPath $1 notepad.exe MessageBox MB_OK "notepad.exe=$1" Exec '"$1"' ExecShell "open" '"$INSTDIR"' Sleep 500 BringToFront SectionEnd Section "Test ActiveX control registration" SectionIn 2 UnRegDLL "$SYSDIR\spin32.ocx" Sleep 1000 RegDLL "$SYSDIR\spin32.ocx" Sleep 1000 SectionEnd ;-------------------------------- Function "CSCTest" CreateDirectory "$SMPROGRAMS\Big NSIS Test" SetOutPath $INSTDIR ; for working directory CreateShortcut "$SMPROGRAMS\Big NSIS Test\Uninstall BIG NSIS Test.lnk" "$INSTDIR\bt-uninst.exe" ; use defaults for parameters, icon, etc. ; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q) CreateShortcut "$SMPROGRAMS\Big NSIS Test\silent.nsi.lnk" "$INSTDIR\silent.nsi" "" "$WINDIR\notepad.exe" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q CreateShortcut "$SMPROGRAMS\Big NSIS Test\TheDir.lnk" "$INSTDIR\" "" "" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z FunctionEnd Function myfunc StrCpy $2 "MyTestVar=$1" MessageBox MB_OK "myfunc: $2" FunctionEnd Function MyFunctionTest ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1" StrCmp $1 $8 NoFailedMsg MessageBox MB_OK "WriteINIStr failed" NoFailedMsg: FunctionEnd Function .onSelChange SectionGetText ${TESTIDX} $0 StrCmp $0 "" e SectionSetText ${TESTIDX} "" Goto e2 e: SectionSetText ${TESTIDX} "TextInSection" e2: FunctionEnd ;-------------------------------- ; Uninstaller UninstallText "This will uninstall example2. Hit next to continue." UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-uninstall.ico" Section "Uninstall" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" DeleteRegKey HKLM "SOFTWARE\NSISTest\BigNSISTest" Delete "$INSTDIR\silent.nsi" Delete "$INSTDIR\LogicLib.nsi" Delete "$INSTDIR\bt-uninst.exe" Delete "$INSTDIR\test.ini" Delete "$SMPROGRAMS\Big NSIS Test\*.*" RMDir "$SMPROGRAMS\BiG NSIS Test" MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to remove the directory $INSTDIR\cpdest?" IDNO NoDelete Delete "$INSTDIR\cpdest\*.*" RMDir "$INSTDIR\cpdest" ; skipped if no NoDelete: RMDir "$INSTDIR\MyProjectFamily\MyProject" RMDir "$INSTDIR\MyProjectFamily" RMDir "$INSTDIR" IfFileExists "$INSTDIR" 0 NoErrorMsg MessageBox MB_OK "Note: $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist NoErrorMsg: SectionEnd nsis-3.11/Examples/example1.nsi000077500000000000000000000017721477201124000164270ustar00rootroot00000000000000; example1.nsi ; ; This script is perhaps one of the simplest NSIs you can make. All of the ; optional settings are left to their default settings. The installer simply ; prompts the user asking them where to install, and drops a copy of example1.nsi ; there. ; ; example2.nsi expands on this by adding a uninstaller and start menu shortcuts. ;-------------------------------- ; The name of the installer Name "Example1" ; The file to write OutFile "example1.exe" ; Request application privileges for Windows Vista RequestExecutionLevel user ; Build Unicode installer Unicode True ; The default installation directory InstallDir $DESKTOP\Example1 ;-------------------------------- ; Pages Page directory Page instfiles ;-------------------------------- ; The stuff to install Section "" ;No components page, name is not important ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File example1.nsi SectionEnd nsis-3.11/Examples/example2.nsi000077500000000000000000000053301477201124000164220ustar00rootroot00000000000000; example2.nsi ; ; This script is based on example1.nsi but it remembers the directory, ; has uninstall support and (optionally) installs start menu shortcuts. ; ; It will install example2.nsi into a directory that the user selects. ; ; See install-shared.nsi for a more robust way of checking for administrator rights. ; See install-per-user.nsi for a file association example. ;-------------------------------- ; The name of the installer Name "Example2" ; The file to write OutFile "example2.exe" ; Request application privileges for Windows Vista and higher RequestExecutionLevel admin ; Build Unicode installer Unicode True ; The default installation directory InstallDir $PROGRAMFILES\Example2 ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir" ;-------------------------------- ; Pages Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles ;-------------------------------- ; The stuff to install Section "Example2 (required)" SectionIn RO ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File "example2.nsi" ; Write the installation path into the registry WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR" ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1 WriteUninstaller "$INSTDIR\uninstall.exe" SectionEnd ; Optional section (can be disabled by the user) Section "Start Menu Shortcuts" CreateDirectory "$SMPROGRAMS\Example2" CreateShortcut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe" CreateShortcut "$SMPROGRAMS\Example2\Example2 (MakeNSISW).lnk" "$INSTDIR\example2.nsi" SectionEnd ;-------------------------------- ; Uninstaller Section "Uninstall" ; Remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" DeleteRegKey HKLM SOFTWARE\NSIS_Example2 ; Remove files and uninstaller Delete $INSTDIR\example2.nsi Delete $INSTDIR\uninstall.exe ; Remove shortcuts, if any Delete "$SMPROGRAMS\Example2\*.lnk" ; Remove directories RMDir "$SMPROGRAMS\Example2" RMDir "$INSTDIR" SectionEnd nsis-3.11/Examples/gfx.nsi000077500000000000000000000063451477201124000155000ustar00rootroot00000000000000; gfx.nsi ; ; This script shows some examples of using all of the new ; graphic related additions introduced in NSIS 2 ; ; Written by Amir Szkeley 22nd July 2002 ;-------------------------------- !macro BIMAGE IMAGE PARMS Push $0 GetTempFileName $0 File /oname=$0 "${IMAGE}" SetBrandingImage ${PARMS} $0 Delete $0 Pop $0 !macroend ;-------------------------------- Name "Graphical effects" OutFile "gfx.exe" ; Adds an XP manifest to the installer XPStyle on ; Add branding image to the installer (an image placeholder on the side). ; It is not enough to just add the placeholder, we must set the image too... ; We will later set the image in every pre-page function. ; We can also set just one persistent image in .onGUIInit AddBrandingImage left 100u ; Sets the font of the installer SetFont "Comic Sans MS" 8 ; Just to make it three pages... SubCaption 0 ": Yet another page..." SubCaption 2 ": Yet another page..." LicenseText "License page" LicenseData "gfx.nsi" DirText "Lets make a third page!" ; Install dir InstallDir "${NSISDIR}\Examples" ; Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ; Pages Page license licenseImage Page custom customPage Page directory dirImage Page instfiles instImage ;-------------------------------- Section "" ; You can also use the BI_NEXT macro here... MessageBox MB_YESNO "We can change the branding image from within a section too!$\nDo you want me to change it?" IDNO done !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\nsis.bmp" "" done: WriteUninstaller $INSTDIR\uninst.exe SectionEnd ;-------------------------------- Function licenseImage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" /RESIZETOFIT MessageBox MB_YESNO 'Would you like to skip the license page?' IDNO no Abort no: FunctionEnd Function customPage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" /RESIZETOFIT MessageBox MB_OK 'This is a nice custom "page" with yet another image :P' #insert install options/start menu/ here FunctionEnd Function dirImage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\win.bmp" /RESIZETOFIT FunctionEnd Function instImage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" /RESIZETOFIT FunctionEnd ;-------------------------------- ; Uninstall pages UninstPage uninstConfirm un.uninstImage UninstPage custom un.customPage UninstPage instfiles un.instImage Function un.uninstImage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" /RESIZETOFIT FunctionEnd Function un.customPage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\win.bmp" /RESIZETOFIT MessageBox MB_OK 'This is a nice uninstaller custom "page" with yet another image :P' #insert install options/start menu/ here FunctionEnd Function un.instImage !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" /RESIZETOFIT FunctionEnd ;-------------------------------- ; Uninstaller ; Another page for uninstaller UninstallText "Another page..." Section uninstall MessageBox MB_OK "Bla" SectionEnd nsis-3.11/Examples/install-per-user.nsi000077500000000000000000000213711477201124000201160ustar00rootroot00000000000000/* This example script installs a simple application for a single user. If multiple users on the same machine run this installer, each user will end up with a separate install that is not affected by update/removal operations performed by other users. Per-user installers should only write to HKCU and folders inside the users profile. */ !define NAME "Per-user example" !define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" Name "${NAME}" OutFile "Install ${NAME}.exe" Unicode True RequestExecutionLevel User ; We don't need UAC elevation InstallDir "" ; Don't set a default $InstDir so we can detect /D= and InstallDirRegKey InstallDirRegKey HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" !include LogicLib.nsh !include WinCore.nsh !include Integration.nsh Page Directory Page InstFiles Uninstpage UninstConfirm Uninstpage InstFiles Function .onInit SetShellVarContext Current ${If} $InstDir == "" ; No /D= nor InstallDirRegKey? GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles} ; This folder only exists on Win7+ StrCmp $InstDir "" 0 +2 StrCpy $InstDir "$LocalAppData\Programs" ; Fallback directory StrCpy $InstDir "$InstDir\$(^Name)" ${EndIf} FunctionEnd Function un.onInit SetShellVarContext Current FunctionEnd Section "Program files (Required)" SectionIn Ro SetOutPath $InstDir WriteUninstaller "$InstDir\Uninst.exe" WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "QuietUninstallString" '"$InstDir\Uninst.exe" /S' WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 !tempfile APP !makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NSISPerUserAppExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0 File "/oname=$InstDir\MyApp.exe" "${APP}" ; Pretend that we have a real application to install !delfile "${APP}" SectionEnd Section "Start Menu shortcut" CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" SectionEnd /* This Section registers a fictional .test-nullsoft file extension and the Nullsoft.Test ProgId. Proprietary file types are encouraged (by Microsoft) to use long file extensions and ProgIds that include the company name. When registering with "Open With" your executable should ideally have a somewhat unique name, otherwise there could be a naming collision with a different application (with the same name) installed on the same machine. REGISTER_DEFAULTPROGRAMS is not defined because proprietary file types do not typically use the Default Programs functionality. If your application registers a standard file type such as .mp3 or .html or a protocol like HTTP it should register as a Default Program. It should also register as a client (https://docs.microsoft.com/en-us/windows/win32/shell/reg-middleware-apps#common-registration-elements-for-all-client-types). */ !define ASSOC_EXT ".test-nullsoft" !define ASSOC_PROGID "Nullsoft.Test" !define ASSOC_VERB "MyApp" !define ASSOC_APPEXE "MyApp.exe" Section -ShellAssoc # Register file type WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" "" "$InstDir\${ASSOC_APPEXE},0" ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "" "Nullsoft Test App" [Optional] ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "MUIVerb" "@$InstDir\${ASSOC_APPEXE},-42" ; WinXP+ [Optional] Localizable verb display name WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' WriteRegStr ShCtx "Software\Classes\${ASSOC_EXT}" "" "${ASSOC_PROGID}" # Register "Open With" [Optional] WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" ; Win2000+ [Optional] ;WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" ; WinXP+ [Optional] WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\shell\open\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "FriendlyAppName" "Nullsoft Test App" ; [Optional] WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "ApplicationCompany" "Nullsoft" ; [Optional] WriteRegNone ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\SupportedTypes" "${ASSOC_EXT}" ; [Optional] Only allow "Open With" with specific extension(s) on WinXP+ # Register "Default Programs" [Optional] !ifdef REGISTER_DEFAULTPROGRAMS WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" "ApplicationDescription" "Shell association example test application" WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities\FileAssociations" "${ASSOC_EXT}" "${ASSOC_PROGID}" WriteRegStr ShCtx "Software\RegisteredApplications" "Nullsoft Test App" "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" !endif ${NotifyShell_AssocChanged} SectionEnd Section -un.ShellAssoc # Unregister file type ClearErrors DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}\shell" ${IfNot} ${Errors} DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" ${EndIf} ReadRegStr $0 ShCtx "Software\Classes\${ASSOC_EXT}" "" DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}" ${IfNot} ${Errors} ${AndIf} $0 == "${ASSOC_PROGID}" DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}" "" DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" ${EndIf} # Unregister "Open With" DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" # Unregister "Default Programs" !ifdef REGISTER_DEFAULTPROGRAMS DeleteRegValue ShCtx "Software\RegisteredApplications" "Nullsoft Test App" DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" DeleteRegKey /IfEmpty ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" !endif # Attempt to clean up junk left behind by the Windows shell DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "$InstDir\${ASSOC_APPEXE}" DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.FriendlyAppName" DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.ApplicationCompany" DeleteRegValue HKCU "Software\Microsoft\Windows\ShellNoRoam\MUICache" "$InstDir\${ASSOC_APPEXE}" ; WinXP DeleteRegValue HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store" "$InstDir\${ASSOC_APPEXE}" DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "${ASSOC_PROGID}_${ASSOC_EXT}" DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "Applications\${ASSOC_APPEXE}_${ASSOC_EXT}" DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithList" DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}" ;DeleteRegKey HKCU "Software\Microsoft\Windows\Roaming\OpenWith\FileExts\${ASSOC_EXT}" ;DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\${ASSOC_EXT}" ${NotifyShell_AssocChanged} SectionEnd !macro DeleteFileOrAskAbort path ClearErrors Delete "${path}" IfErrors 0 +3 MessageBox MB_ABORTRETRYIGNORE|MB_ICONSTOP 'Unable to delete "${path}"!' IDRETRY -3 IDIGNORE +2 Abort "Aborted" !macroend Section -Uninstall !insertmacro DeleteFileOrAskAbort "$InstDir\MyApp.exe" Delete "$InstDir\Uninst.exe" RMDir "$InstDir" DeleteRegKey HKCU "${REGPATH_UNINSTSUBKEY}" ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" Delete "$SMPrograms\${NAME}.lnk" SectionEnd nsis-3.11/Examples/install-shared.nsi000077500000000000000000000055541477201124000176270ustar00rootroot00000000000000/* This example script installs a simple application for all users on a machine. All-users installers should only write to HKLM, $ProgramFiles, $CommonFiles and the "All context" versions of $LocalAppData, $Templates, $SMPrograms etc. It should not write to HKCU nor any folders in the users profile! If the application requires writable template data in $AppData it must copy the required files from a shared location the first time a user launches the application. */ !define NAME "All-users example" !define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" Name "${NAME}" OutFile "Install ${NAME}.exe" Unicode True RequestExecutionLevel Admin ; Request admin rights on WinVista+ (when UAC is turned on) InstallDir "$ProgramFiles\$(^Name)" InstallDirRegKey HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" !include LogicLib.nsh !include Integration.nsh Page Directory Page InstFiles Uninstpage UninstConfirm Uninstpage InstFiles !macro EnsureAdminRights UserInfo::GetAccountType Pop $0 ${If} $0 != "admin" ; Require admin rights on WinNT4+ MessageBox MB_IconStop "Administrator rights required!" SetErrorLevel 740 ; ERROR_ELEVATION_REQUIRED Quit ${EndIf} !macroend Function .onInit SetShellVarContext All !insertmacro EnsureAdminRights FunctionEnd Function un.onInit SetShellVarContext All !insertmacro EnsureAdminRights FunctionEnd Section "Program files (Required)" SectionIn Ro SetOutPath $InstDir WriteUninstaller "$InstDir\Uninst.exe" WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "QuietUninstallString" '"$InstDir\Uninst.exe" /S' WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 !tempfile APP !makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NSISSharedAppExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0 File "/oname=$InstDir\MyApp.exe" "${APP}" ; Pretend that we have a real application to install !delfile "${APP}" SectionEnd Section "Start Menu shortcut" CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" SectionEnd !macro DeleteFileOrAskAbort path ClearErrors Delete "${path}" IfErrors 0 +3 MessageBox MB_ABORTRETRYIGNORE|MB_ICONSTOP 'Unable to delete "${path}"!' IDRETRY -3 IDIGNORE +2 Abort "Aborted" !macroend Section -Uninstall !insertmacro DeleteFileOrAskAbort "$InstDir\MyApp.exe" Delete "$InstDir\Uninst.exe" RMDir "$InstDir" DeleteRegKey HKLM "${REGPATH_UNINSTSUBKEY}" ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" Delete "$SMPrograms\${NAME}.lnk" SectionEnd nsis-3.11/Examples/languages.nsi000077500000000000000000000163061477201124000166600ustar00rootroot00000000000000; languages.nsi ; ; This is an example of a multilingual installer ; The user can select the language on startup !pragma warning error all ;-------------------------------- OutFile languages.exe XPStyle on RequestExecutionLevel user Unicode True ;-------------------------------- Page license Page components Page instfiles ;-------------------------------- ; First is default LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Czech.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Dutch.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\French.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Spanish.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Swedish.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\TradChinese.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf" LoadLanguageFile "${NSISDIR}\Contrib\Language files\Slovak.nlf" ; License data ; Not exactly translated, but it shows what's needed LicenseLangString myLicenseData ${LANG_ENGLISH} "bigtest.nsi" LicenseLangString myLicenseData ${LANG_CZECH} "WordFuncTest.nsi" LicenseLangString myLicenseData ${LANG_DUTCH} "waplugin.nsi" LicenseLangString myLicenseData ${LANG_FRENCH} "example1.nsi" LicenseLangString myLicenseData ${LANG_GERMAN} "example2.nsi" LicenseLangString myLicenseData ${LANG_KOREAN} "gfx.nsi" LicenseLangString myLicenseData ${LANG_RUSSIAN} "languages.nsi" LicenseLangString myLicenseData ${LANG_SPANISH} "LogicLib.nsi" LicenseLangString myLicenseData ${LANG_SWEDISH} "makensis.nsi" LicenseLangString myLicenseData ${LANG_TRADCHINESE} "one-section.nsi" LicenseLangString myLicenseData ${LANG_SIMPCHINESE} "primes.nsi" LicenseLangString myLicenseData ${LANG_SLOVAK} "silent.nsi" LicenseData $(myLicenseData) ; Set name using the normal interface (Name command) LangString Name ${LANG_ENGLISH} "English" LangString Name ${LANG_CZECH} "Czech" LangString Name ${LANG_DUTCH} "Dutch" LangString Name ${LANG_FRENCH} "French" LangString Name ${LANG_GERMAN} "German" LangString Name ${LANG_KOREAN} "Korean" LangString Name ${LANG_RUSSIAN} "Russian" LangString Name ${LANG_SPANISH} "Spanish" LangString Name ${LANG_SWEDISH} "Swedish" LangString Name ${LANG_TRADCHINESE} "Traditional Chinese" LangString Name ${LANG_SIMPCHINESE} "Simplified Chinese" LangString Name ${LANG_SLOVAK} "Slovak" Name $(Name) ; Directly change the inner lang strings (Same as ComponentText) LangString ^ComponentsText ${LANG_ENGLISH} "English component page" LangString ^ComponentsText ${LANG_CZECH} "Czech component page" LangString ^ComponentsText ${LANG_DUTCH} "Dutch component page" LangString ^ComponentsText ${LANG_FRENCH} "French component page" LangString ^ComponentsText ${LANG_GERMAN} "German component page" LangString ^ComponentsText ${LANG_KOREAN} "Korean component page" LangString ^ComponentsText ${LANG_RUSSIAN} "Russian component page" LangString ^ComponentsText ${LANG_SPANISH} "Spanish component page" LangString ^ComponentsText ${LANG_SWEDISH} "Swedish component page" LangString ^ComponentsText ${LANG_TRADCHINESE} "Traditional Chinese component page" LangString ^ComponentsText ${LANG_SIMPCHINESE} "Simplified Chinese component page" LangString ^ComponentsText ${LANG_SLOVAK} "Slovak component page" ; Set one text for all languages (simply don't use a LangString) CompletedText "Languages example completed" ; A LangString for the section name LangString Sec1Name ${LANG_ENGLISH} "English section #1" LangString Sec1Name ${LANG_CZECH} "Czech section #1" LangString Sec1Name ${LANG_DUTCH} "Dutch section #1" LangString Sec1Name ${LANG_FRENCH} "French section #1" LangString Sec1Name ${LANG_GERMAN} "German section #1" LangString Sec1Name ${LANG_KOREAN} "Korean section #1" LangString Sec1Name ${LANG_RUSSIAN} "Russian section #1" LangString Sec1Name ${LANG_SPANISH} "Spanish section #1" LangString Sec1Name ${LANG_SWEDISH} "Swedish section #1" LangString Sec1Name ${LANG_TRADCHINESE} "Traditional Chinese section #1" LangString Sec1Name ${LANG_SIMPCHINESE} "Simplified Chinese section #1" LangString Sec1Name ${LANG_SLOVAK} "Slovak section #1" ; A multilingual message LangString Message ${LANG_ENGLISH} "English message" LangString Message ${LANG_CZECH} "Czech message" LangString Message ${LANG_DUTCH} "Dutch message" LangString Message ${LANG_FRENCH} "French message" LangString Message ${LANG_GERMAN} "German message" LangString Message ${LANG_KOREAN} "Korean message" LangString Message ${LANG_RUSSIAN} "Russian message" LangString Message ${LANG_SPANISH} "Spanish message" LangString Message ${LANG_SWEDISH} "Swedish message" LangString Message ${LANG_TRADCHINESE} "Traditional Chinese message" LangString Message ${LANG_SIMPCHINESE} "Simplified Chinese message" LangString Message ${LANG_SLOVAK} "Slovak message" ;-------------------------------- ;Section names set by Language strings ;It works with ! too Section !$(Sec1Name) sec1 MessageBox MB_OK $(Message) SectionEnd ; The old, slow, wasteful way ; Look at this section and see why LangString is so much easier Section "Section number two" StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2 MessageBox MB_OK "Installing English stuff" StrCmp $LANGUAGE ${LANG_CZECH} 0 +2 MessageBox MB_OK "Installing Czech stuff" StrCmp $LANGUAGE ${LANG_DUTCH} 0 +2 MessageBox MB_OK "Installing Dutch stuff" StrCmp $LANGUAGE ${LANG_FRENCH} 0 +2 MessageBox MB_OK "Installing French stuff" StrCmp $LANGUAGE ${LANG_GERMAN} 0 +2 MessageBox MB_OK "Installing German stuff" StrCmp $LANGUAGE ${LANG_KOREAN} 0 +2 MessageBox MB_OK "Installing Korean stuff" StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2 MessageBox MB_OK "Installing Russian stuff" StrCmp $LANGUAGE ${LANG_SPANISH} 0 +2 MessageBox MB_OK "Installing Spanish stuff" StrCmp $LANGUAGE ${LANG_SWEDISH} 0 +2 MessageBox MB_OK "Installing Swedish stuff" StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +2 MessageBox MB_OK "Installing Traditional Chinese stuff" StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +2 MessageBox MB_OK "Installing Simplified Chinese stuff" StrCmp $LANGUAGE ${LANG_SLOVAK} 0 +2 MessageBox MB_OK "Installing Slovak stuff" SectionEnd ;-------------------------------- Function .onInit ;Language selection dialog Push "" Push ${LANG_ENGLISH} Push English Push ${LANG_CZECH} Push Czech Push ${LANG_DUTCH} Push Dutch Push ${LANG_FRENCH} Push French Push ${LANG_GERMAN} Push German Push ${LANG_KOREAN} Push Korean Push ${LANG_RUSSIAN} Push Russian Push ${LANG_SPANISH} Push Spanish Push ${LANG_SWEDISH} Push Swedish Push ${LANG_TRADCHINESE} Push "Traditional Chinese" Push ${LANG_SIMPCHINESE} Push "Simplified Chinese" Push ${LANG_SLOVAK} Push Slovak Push A ; A means auto count languages ; for the auto count to work the first empty push (Push "") must remain LangDLL::LangDialog "Installer Language" "Please select the language of the installer" Pop $LANGUAGE StrCmp $LANGUAGE "cancel" 0 +2 Abort FunctionEndnsis-3.11/Examples/makensis.nsi000077500000000000000000001045751477201124000165320ustar00rootroot00000000000000;NSIS Setup Script ;-------------------------------- !pragma warning error all !pragma warning warning 7010 ; File /NonFatal !ifdef VER_MAJOR & VER_MINOR !define /ifndef VER_REVISION 0 !define /ifndef VER_BUILD 0 !endif !define /ifndef VERSION 'anonymous-build' ;-------------------------------- ;Configuration !if ${NSIS_PTR_SIZE} > 4 !define BITS 64 !define NAMESUFFIX " (64 bit)" !else !define BITS 32 !define NAMESUFFIX "" !endif !ifndef OUTFILE !define OUTFILE "..\nsis${BITS}-${VERSION}-setup.exe" !searchreplace OUTFILE "${OUTFILE}" nsis32 nsis !endif OutFile "${OUTFILE}" Unicode true SetCompressor /SOLID lzma InstType "Full" InstType "Lite" InstType "Minimal" InstallDir $PROGRAMFILES${BITS}\NSIS InstallDirRegKey HKLM Software\NSIS "" RequestExecutionLevel admin ;-------------------------------- ;Header Files !include "MUI2.nsh" !include "Sections.nsh" !include "LogicLib.nsh" !include "Memento.nsh" !include "WordFunc.nsh" !include "Util.nsh" !include "Integration.nsh" ;-------------------------------- ;Configuration ;Names Name "NSIS" Caption "NSIS ${VERSION}${NAMESUFFIX} Setup" !define REG_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" ;Memento Settings !define MEMENTO_REGISTRY_ROOT HKLM !define MEMENTO_REGISTRY_KEY "${REG_UNINST_KEY}" ;Interface Settings !define MUI_ABORTWARNING !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis3-branding-r.bmp" !define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\nsis3-branding.bmp" !define MUI_COMPONENTSPAGE_SMALLDESC ;Pages !define MUI_WELCOMEPAGE_TITLE "Welcome to the NSIS ${VERSION} Setup Wizard" !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of NSIS (Nullsoft Scriptable Install System) ${VERSION}, the next generation of the Windows installer and uninstaller system that doesn't suck and isn't huge.$\r$\n$\r$\nNSIS includes a Modern User Interface, LZMA compression, support for multiple languages and an easy plug-in system.$\r$\n$\r$\n$_CLICK" !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "..\COPYING" !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD Page custom PageReinstall PageLeaveReinstall !endif !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_LINK "Visit the NSIS site for the latest news, FAQs and support" !define MUI_FINISHPAGE_LINK_LOCATION "http://nsis.sf.net/" !define MUI_FINISHPAGE_RUN "$INSTDIR\NSIS.exe" !define MUI_FINISHPAGE_NOREBOOTSUPPORT !define MUI_FINISHPAGE_SHOWREADME !define MUI_FINISHPAGE_SHOWREADME_TEXT "Show release notes" !define MUI_FINISHPAGE_SHOWREADME_FUNCTION ShowReleaseNotes !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Version information !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD VIProductVersion ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} VIAddVersionKey "FileVersion" "${VERSION}" VIAddVersionKey "FileDescription" "NSIS Setup" VIAddVersionKey "LegalCopyright" "http://nsis.sf.net/License" !endif ;-------------------------------- ;Installer Sections !macro InstallPlugin pi !if ${BITS} >= 64 File "/oname=$InstDir\Plugins\amd64-unicode\${pi}.dll" ..\Plugins\amd64-unicode\${pi}.dll !else File "/oname=$InstDir\Plugins\x86-ansi\${pi}.dll" ..\Plugins\x86-ansi\${pi}.dll File "/oname=$InstDir\Plugins\x86-unicode\${pi}.dll" ..\Plugins\x86-unicode\${pi}.dll !endif !macroend !macro InstallStub stub !if ${BITS} >= 64 File ..\Stubs\${stub}-amd64-unicode !else File ..\Stubs\${stub}-x86-ansi File ..\Stubs\${stub}-x86-unicode !endif !macroend ${MementoSection} "NSIS Core Files (required)" SecCore SetDetailsPrint textonly DetailPrint "Installing NSIS Core Files..." SetDetailsPrint listonly SectionIn 1 2 3 RO SetOutPath $INSTDIR IfFileExists $INSTDIR\nsisconf.nsi "" +2 Rename $INSTDIR\nsisconf.nsi $INSTDIR\nsisconf.nsh SetOverwrite off File ..\nsisconf.nsh SetOverwrite on File ..\makensis.exe File ..\makensisw.exe File ..\COPYING File ..\NSIS.chm !pragma verifychm "..\NSIS.chm" !if /FileExists "..\NSIS.exe" !if /FileExists "..\NSIS.exe.manifest" File "..\NSIS.exe.manifest" !endif !else !define NO_NSISMENU_HTML 1 !makensis '-v2 "NSISMenu.nsi" "-XOutFile ..\NSIS.exe"' = 0 !endif File ..\NSIS.exe SetOutPath $INSTDIR\Bin File ..\Bin\makensis.exe !ifdef USE_NEW_ZLIB File ..\Bin\zlib.dll !else File ..\Bin\zlib1.dll !endif SetOutPath $INSTDIR\Stubs File ..\Stubs\uninst !insertmacro InstallStub bzip2 !insertmacro InstallStub bzip2_solid !insertmacro InstallStub lzma !insertmacro InstallStub lzma_solid !insertmacro InstallStub zlib !insertmacro InstallStub zlib_solid SetOutPath $INSTDIR\Include File ..\Include\WinMessages.nsh File ..\Include\Sections.nsh File ..\Include\Library.nsh File ..\Include\UpgradeDLL.nsh File ..\Include\LogicLib.nsh File ..\Include\StrFunc.nsh File ..\Include\Colors.nsh File ..\Include\FileFunc.nsh File ..\Include\TextFunc.nsh File ..\Include\WordFunc.nsh File ..\Include\WinVer.nsh File ..\Include\x64.nsh File ..\Include\Memento.nsh File ..\Include\LangFile.nsh File ..\Include\InstallOptions.nsh File ..\Include\MultiUser.nsh File ..\Include\VB6RunTime.nsh File ..\Include\Util.nsh File ..\Include\Integration.nsh File ..\Include\WinCore.nsh SetOutPath $INSTDIR\Include\Win File ..\Include\Win\WinDef.nsh File ..\Include\Win\WinError.nsh File ..\Include\Win\WinNT.nsh File ..\Include\Win\WinUser.nsh File ..\Include\Win\COM.nsh File ..\Include\Win\Propkey.nsh File ..\Include\Win\RestartManager.nsh SetOutPath $INSTDIR\Docs\StrFunc File ..\Docs\StrFunc\StrFunc.txt SetOutPath $INSTDIR\Docs\MultiUser File ..\Docs\MultiUser\Readme.html SetOutPath $INSTDIR\Docs\makensisw File ..\Docs\makensisw\*.txt !ifndef NO_NSISMENU_HTML SetOutPath $INSTDIR\Menu File ..\Menu\*.html SetOutPath $INSTDIR\Menu\images File ..\Menu\images\header.gif File ..\Menu\images\line.gif File ..\Menu\images\site.gif !endif Delete $INSTDIR\makensis.htm Delete $INSTDIR\Docs\*.html Delete $INSTDIR\Docs\style.css RMDir $INSTDIR\Docs SetOutPath $INSTDIR\Bin !if ${BITS} >= 64 File /NonFatal ..\Bin\RegTool-x86.bin File ..\Bin\RegTool-amd64.bin !else File ..\Bin\RegTool-x86.bin !if /FileExists ..\Bin\RegTool-amd64.bin ; It is unlikely that this exists, avoid the /NonFatal warning. File ..\Bin\RegTool-amd64.bin !endif !endif CreateDirectory $INSTDIR\Plugins\x86-ansi CreateDirectory $INSTDIR\Plugins\x86-unicode !if ${BITS} >= 64 CreateDirectory $INSTDIR\Plugins\amd64-unicode !endif !insertmacro InstallPlugin TypeLib ReadRegStr $R0 HKCR ".nsi" "" StrCmp $R0 "NSISFile" 0 +2 DeleteRegKey HKCR "NSISFile" WriteRegStr HKCR ".nsi" "" "NSIS.Script" WriteRegStr HKCR ".nsi" "PerceivedType" "text" WriteRegStr HKCR "NSIS.Script" "" "NSIS Script File" WriteRegStr HKCR "NSIS.Script\DefaultIcon" "" "$INSTDIR\makensisw.exe,1" ReadRegStr $R0 HKCR "NSIS.Script\shell\open\command" "" ${If} $R0 == "" WriteRegStr HKCR "NSIS.Script\shell" "" "open" WriteRegStr HKCR "NSIS.Script\shell\open\command" "" 'notepad.exe "%1"' ${EndIf} WriteRegStr HKCR "NSIS.Script\shell\compile" "" "Compile NSIS Script" WriteRegStr HKCR "NSIS.Script\shell\compile\command" "" '"$INSTDIR\makensisw.exe" "%1"' WriteRegStr HKCR "NSIS.Script\shell\compile-compressor" "" "Compile NSIS Script (Choose Compressor)" WriteRegStr HKCR "NSIS.Script\shell\compile-compressor\command" "" '"$INSTDIR\makensisw.exe" /ChooseCompressor "%1"' ReadRegStr $R0 HKCR ".nsh" "" StrCmp $R0 "NSHFile" 0 +2 DeleteRegKey HKCR "NSHFile" WriteRegStr HKCR ".nsh" "" "NSIS.Header" WriteRegStr HKCR ".nsh" "PerceivedType" "text" WriteRegStr HKCR "NSIS.Header" "" "NSIS Header File" WriteRegStr HKCR "NSIS.Header\DefaultIcon" "" "$INSTDIR\makensisw.exe,2" ReadRegStr $R0 HKCR "NSIS.Header\shell\open\command" "" ${If} $R0 == "" WriteRegStr HKCR "NSIS.Header\shell" "" "open" WriteRegStr HKCR "NSIS.Header\shell\open\command" "" 'notepad.exe "%1"' ${EndIf} ${NotifyShell_AssocChanged} ${MementoSectionEnd} ${MementoSection} "Script Examples" SecExample SetDetailsPrint textonly DetailPrint "Installing Script Examples..." SetDetailsPrint listonly SectionIn 1 2 SetOutPath $INSTDIR\Examples File ..\Examples\makensis.nsi File ..\Examples\example1.nsi File ..\Examples\example2.nsi File ..\Examples\AppGen.nsi File ..\Examples\install-per-user.nsi File ..\Examples\install-shared.nsi File ..\Examples\waplugin.nsi File ..\Examples\bigtest.nsi File ..\Examples\primes.nsi File ..\Examples\rtest.nsi File ..\Examples\gfx.nsi File ..\Examples\one-section.nsi File ..\Examples\languages.nsi File ..\Examples\Library.nsi File ..\Examples\VersionInfo.nsi File ..\Examples\LogicLib.nsi File ..\Examples\silent.nsi File ..\Examples\StrFunc.nsi File ..\Examples\FileFunc.nsi File ..\Examples\FileFunc.ini File ..\Examples\FileFuncTest.nsi File ..\Examples\TextFunc.nsi File ..\Examples\TextFunc.ini File ..\Examples\TextFuncTest.nsi File ..\Examples\WordFunc.nsi File ..\Examples\WordFunc.ini File ..\Examples\WordFuncTest.nsi File ..\Examples\Memento.nsi File ..\Examples\MultiUser.nsi File ..\Examples\unicode.nsi File ..\Examples\NSISMenu.nsi SetOutPath $INSTDIR\Examples\Plugin File ..\Examples\Plugin\exdll.c File ..\Examples\Plugin\exdll.dpr File ..\Examples\Plugin\exdll.dsp File ..\Examples\Plugin\exdll.dsw File ..\Examples\Plugin\exdll_with_unit.dpr File ..\Examples\Plugin\exdll-vs2008.sln File ..\Examples\Plugin\exdll-vs2008.vcproj File ..\Examples\Plugin\extdll.inc File ..\Examples\Plugin\nsis.pas SetOutPath $INSTDIR\Examples\Plugin\nsis File ..\Examples\Plugin\nsis\pluginapi.h File /nonfatal ..\Examples\Plugin\nsis\pluginapi*.lib File ..\Examples\Plugin\nsis\api.h File ..\Examples\Plugin\nsis\nsis_tchar.h ${MementoSectionEnd} ${MementoSection} "Start Menu Shortcut" SecShortcuts SetDetailsPrint textonly DetailPrint "Installing Start Menu shortcut..." SetDetailsPrint listonly SectionIn 1 2 SetOutPath $INSTDIR CreateShortcut "$SMPROGRAMS\NSIS${NAMESUFFIX}.lnk" "$INSTDIR\NSIS.exe" ${MementoSectionEnd} SectionGroup "User Interfaces" SecInterfaces ${MementoSection} "Modern User Interface" SecInterfacesModernUI SetDetailsPrint textonly DetailPrint "Installing User Interfaces | Modern User Interface..." SetDetailsPrint listonly SectionIn 1 2 SetOutPath "$INSTDIR\Examples\Modern UI" File "..\Examples\Modern UI\Basic.nsi" File "..\Examples\Modern UI\HeaderBitmap.nsi" File "..\Examples\Modern UI\MultiLanguage.nsi" File "..\Examples\Modern UI\StartMenu.nsi" File "..\Examples\Modern UI\WelcomeFinish.nsi" SetOutPath "$INSTDIR\Contrib\Modern UI" File "..\Contrib\Modern UI\System.nsh" File "..\Contrib\Modern UI\ioSpecial.ini" SetOutPath "$INSTDIR\Docs\Modern UI" File "..\Docs\Modern UI\Readme.html" File "..\Docs\Modern UI\Changelog.txt" File "..\Docs\Modern UI\License.txt" SetOutPath "$INSTDIR\Docs\Modern UI\images" File "..\Docs\Modern UI\images\header.gif" File "..\Docs\Modern UI\images\screen1.png" File "..\Docs\Modern UI\images\screen2.png" File "..\Docs\Modern UI\images\open.gif" File "..\Docs\Modern UI\images\closed.gif" SetOutPath $INSTDIR\Contrib\UIs File "..\Contrib\UIs\modern.exe" File "..\Contrib\UIs\modern_headerbmp.exe" File "..\Contrib\UIs\modern_headerbmpr.exe" File "..\Contrib\UIs\modern_nodesc.exe" File "..\Contrib\UIs\modern_smalldesc.exe" SetOutPath $INSTDIR\Include File "..\Include\MUI.nsh" SetOutPath "$INSTDIR\Contrib\Modern UI 2" File "..\Contrib\Modern UI 2\Deprecated.nsh" File "..\Contrib\Modern UI 2\Interface.nsh" File "..\Contrib\Modern UI 2\Localization.nsh" File "..\Contrib\Modern UI 2\MUI2.nsh" File "..\Contrib\Modern UI 2\Pages.nsh" SetOutPath "$INSTDIR\Contrib\Modern UI 2\Pages" File "..\Contrib\Modern UI 2\Pages\Components.nsh" File "..\Contrib\Modern UI 2\Pages\Directory.nsh" File "..\Contrib\Modern UI 2\Pages\Finish.nsh" File "..\Contrib\Modern UI 2\Pages\InstallFiles.nsh" File "..\Contrib\Modern UI 2\Pages\License.nsh" File "..\Contrib\Modern UI 2\Pages\StartMenu.nsh" File "..\Contrib\Modern UI 2\Pages\UninstallConfirm.nsh" File "..\Contrib\Modern UI 2\Pages\Welcome.nsh" SetOutPath "$INSTDIR\Docs\Modern UI 2" File "..\Docs\Modern UI 2\Readme.html" File "..\Docs\Modern UI 2\License.txt" SetOutPath "$INSTDIR\Docs\Modern UI 2\images" File "..\Docs\Modern UI 2\images\header.gif" File "..\Docs\Modern UI 2\images\screen1.png" File "..\Docs\Modern UI 2\images\screen2.png" File "..\Docs\Modern UI 2\images\open.gif" File "..\Docs\Modern UI 2\images\closed.gif" SetOutPath $INSTDIR\Include File "..\Include\MUI2.nsh" ${MementoSectionEnd} ${MementoSection} "Default User Interface" SecInterfacesDefaultUI SetDetailsPrint textonly DetailPrint "Installing User Interfaces | Default User Interface..." SetDetailsPrint listonly SectionIn 1 SetOutPath "$INSTDIR\Contrib\UIs" File "..\Contrib\UIs\default.exe" ${MementoSectionEnd} ${MementoSection} "Tiny User Interface" SecInterfacesTinyUI SetDetailsPrint textonly DetailPrint "Installing User Interfaces | Tiny User Interface..." SetDetailsPrint listonly SectionIn 1 SetOutPath "$INSTDIR\Contrib\UIs" File "..\Contrib\UIs\sdbarker_tiny.exe" ${MementoSectionEnd} SectionGroupEnd ${MementoSection} "Graphics" SecGraphics SetDetailsPrint textonly DetailPrint "Installing Graphics..." SetDetailsPrint listonly SectionIn 1 Delete $INSTDIR\Contrib\Icons\*.ico Delete $INSTDIR\Contrib\Icons\*.bmp RMDir $INSTDIR\Contrib\Icons SetOutPath $INSTDIR\Contrib\Graphics File /r "..\Contrib\Graphics\*.ico" File /r "..\Contrib\Graphics\*.bmp" ${MementoSectionEnd} ${MementoSection} "Language Files" SecLangFiles SetDetailsPrint textonly DetailPrint "Installing Language Files..." SetDetailsPrint listonly SectionIn 1 SetOutPath "$INSTDIR\Contrib\Language files" File "..\Contrib\Language files\*.nlf" SetOutPath $INSTDIR\Bin File ..\Bin\MakeLangID.exe ${If} ${SectionIsSelected} ${SecInterfacesModernUI} SetOutPath "$INSTDIR\Contrib\Language files" File "..\Contrib\Language files\*.nsh" ${EndIf} ${MementoSectionEnd} SectionGroup "Tools" SecTools ${MementoSection} "Zip2Exe" SecToolsZ2E SetDetailsPrint textonly DetailPrint "Installing Tools | Zip2Exe..." SetDetailsPrint listonly SectionIn 1 SetOutPath $INSTDIR\Bin File ..\Bin\zip2exe.exe SetOutPath $INSTDIR\Contrib\zip2exe File ..\Contrib\zip2exe\Base.nsh File ..\Contrib\zip2exe\Modern.nsh File ..\Contrib\zip2exe\Classic.nsh ${MementoSectionEnd} SectionGroupEnd SectionGroup "Plug-ins" SecPluginsPlugins ${MementoSection} "Banner" SecPluginsBanner SetDetailsPrint textonly DetailPrint "Installing Plug-ins | Banner..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin Banner SetOutPath $INSTDIR\Docs\Banner File ..\Docs\Banner\Readme.txt SetOutPath $INSTDIR\Examples\Banner File ..\Examples\Banner\Example.nsi ${MementoSectionEnd} ${MementoSection} "Language DLL" SecPluginsLangDLL SetDetailsPrint textonly DetailPrint "Installing Plug-ins | Language DLL..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin LangDLL ${MementoSectionEnd} ${MementoSection} "nsExec" SecPluginsnsExec SetDetailsPrint textonly DetailPrint "Installing Plug-ins | nsExec..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin nsExec SetOutPath $INSTDIR\Docs\nsExec File ..\Docs\nsExec\nsExec.txt SetOutPath $INSTDIR\Examples\nsExec File ..\Examples\nsExec\test.nsi ${MementoSectionEnd} ${MementoSection} "Splash" SecPluginsSplash SetDetailsPrint textonly DetailPrint "Installing Plug-ins | Splash..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin Splash SetOutPath $INSTDIR\Docs\Splash File ..\Docs\Splash\splash.txt SetOutPath $INSTDIR\Examples\Splash File ..\Examples\Splash\Example.nsi ${MementoSectionEnd} ${MementoSection} "AdvSplash" SecPluginsSplashT SetDetailsPrint textonly DetailPrint "Installing Plug-ins | AdvSplash..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin AdvSplash SetOutPath $INSTDIR\Docs\AdvSplash File ..\Docs\AdvSplash\advsplash.txt SetOutPath $INSTDIR\Examples\AdvSplash File ..\Examples\AdvSplash\Example.nsi ${MementoSectionEnd} ${MementoSection} "BgImage" SecPluginsBgImage SetDetailsPrint textonly DetailPrint "Installing Plug-ins | BgImage..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin BgImage SetOutPath $INSTDIR\Docs\BgImage File ..\Docs\BgImage\BgImage.txt SetOutPath $INSTDIR\Examples\BgImage File ..\Examples\BgImage\Example.nsi ${MementoSectionEnd} ${MementoSection} "InstallOptions" SecPluginsIO SetDetailsPrint textonly DetailPrint "Installing Plug-ins | InstallOptions..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin InstallOptions SetOutPath $INSTDIR\Docs\InstallOptions File ..\Docs\InstallOptions\Readme.html File ..\Docs\InstallOptions\Changelog.txt SetOutPath $INSTDIR\Examples\InstallOptions File ..\Examples\InstallOptions\test.ini File ..\Examples\InstallOptions\test.nsi File ..\Examples\InstallOptions\testimgs.ini File ..\Examples\InstallOptions\testimgs.nsi File ..\Examples\InstallOptions\testlink.ini File ..\Examples\InstallOptions\testlink.nsi File ..\Examples\InstallOptions\testnotify.ini File ..\Examples\InstallOptions\testnotify.nsi ${MementoSectionEnd} ${MementoSection} "nsDialogs" SecPluginsDialogs SetDetailsPrint textonly DetailPrint "Installing Plug-ins | nsDialogs..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin nsDialogs SetOutPath $INSTDIR\Examples\nsDialogs File ..\Examples\nsDialogs\example.nsi File ..\Examples\nsDialogs\InstallOptions.nsi File ..\Examples\nsDialogs\timer.nsi File ..\Examples\nsDialogs\welcome.nsi SetOutPath $INSTDIR\Include File ..\Include\nsDialogs.nsh SetOutPath $INSTDIR\Docs\nsDialogs File ..\Docs\nsDialogs\Readme.html ${MementoSectionEnd} ${MementoSection} "Math" SecPluginsMath SetDetailsPrint textonly DetailPrint "Installing Plug-ins | Math..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin Math SetOutPath $INSTDIR\Docs\Math File ..\Docs\Math\Math.txt SetOutPath $INSTDIR\Examples\Math File ..\Examples\Math\math.nsi File ..\Examples\Math\mathtest.txt File ..\Examples\Math\mathtest.nsi File ..\Examples\Math\mathtest.ini ${MementoSectionEnd} ${MementoSection} "NSISdl" SecPluginsNSISDL SetDetailsPrint textonly DetailPrint "Installing Plug-ins | NSISdl..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin NSISdl SetOutPath $INSTDIR\Docs\NSISdl File ..\Docs\NSISdl\ReadMe.txt File ..\Docs\NSISdl\License.txt ${MementoSectionEnd} ${MementoSection} "System" SecPluginsSystem SetDetailsPrint textonly DetailPrint "Installing Plug-ins | System..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin System SetOutPath $INSTDIR\Docs\System File ..\Docs\System\System.html File ..\Docs\System\WhatsNew.txt SetOutPath $INSTDIR\Examples\System File ..\Examples\System\Resource.dll File ..\Examples\System\SysFunc.nsh File ..\Examples\System\System.nsh File ..\Examples\System\System.nsi ${MementoSectionEnd} ${MementoSection} "StartMenu" SecPluginsStartMenu SetDetailsPrint textonly DetailPrint "Installing Plug-ins | StartMenu..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin StartMenu SetOutPath $INSTDIR\Docs\StartMenu File ..\Docs\StartMenu\Readme.txt SetOutPath $INSTDIR\Examples\StartMenu File ..\Examples\StartMenu\Example.nsi ${MementoSectionEnd} ${MementoSection} "UserInfo" SecPluginsUserInfo SetDetailsPrint textonly DetailPrint "Installing Plug-ins | UserInfo..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin UserInfo SetOutPath $INSTDIR\Examples\UserInfo File ..\Examples\UserInfo\UserInfo.nsi ${MementoSectionEnd} ${MementoSection} "Dialer" SecPluginsDialer SetDetailsPrint textonly DetailPrint "Installing Plug-ins | Dialer..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin Dialer SetOutPath $INSTDIR\Docs\Dialer File ..\Docs\Dialer\Dialer.txt ${MementoSectionEnd} ${MementoSection} "VPatch" SecPluginsVPatch SetDetailsPrint textonly DetailPrint "Installing Plug-ins | VPatch..." SetDetailsPrint listonly SectionIn 1 !insertmacro InstallPlugin VPatch SetOutPath $INSTDIR\Examples\VPatch File ..\Examples\VPatch\example.nsi File ..\Examples\VPatch\oldfile.txt File ..\Examples\VPatch\newfile.txt File ..\Examples\VPatch\patch.pat SetOutPath $INSTDIR\Docs\VPatch File ..\Docs\VPatch\Readme.html SetOutPath $INSTDIR\Bin File ..\Bin\GenPat.exe SetOutPath $INSTDIR\Include File ..\Include\VPatchLib.nsh ${MementoSectionEnd} ${MementoSectionDone} SectionGroupEnd Section -post ; When Modern UI is installed: ; * Always install the English language file ; * Always install default icons / bitmaps ${If} ${SectionIsSelected} ${SecInterfacesModernUI} SetDetailsPrint textonly DetailPrint "Configuring Modern UI..." SetDetailsPrint listonly ${IfNot} ${SectionIsSelected} ${SecLangFiles} SetOutPath "$INSTDIR\Contrib\Language files" File "..\Contrib\Language files\English.nlf" File "..\Contrib\Language files\English.nsh" ${EndIf} ${IfNot} ${SectionIsSelected} ${SecGraphics} SetOutPath $INSTDIR\Contrib\Graphics\Checks File "..\Contrib\Graphics\Checks\modern.bmp" SetOutPath $INSTDIR\Contrib\Graphics\Icons File "..\Contrib\Graphics\Icons\modern-install.ico" File "..\Contrib\Graphics\Icons\modern-uninstall.ico" SetOutPath $INSTDIR\Contrib\Graphics\Header File "..\Contrib\Graphics\Header\nsis.bmp" SetOutPath $INSTDIR\Contrib\Graphics\Wizard File "..\Contrib\Graphics\Wizard\win.bmp" ${EndIf} ${EndIf} SetDetailsPrint textonly DetailPrint "Creating Registry Keys..." SetDetailsPrint listonly SetOutPath $INSTDIR WriteRegStr HKLM "Software\NSIS" "" $INSTDIR !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD WriteRegDword HKLM "Software\NSIS" "VersionMajor" "${VER_MAJOR}" WriteRegDword HKLM "Software\NSIS" "VersionMinor" "${VER_MINOR}" WriteRegDword HKLM "Software\NSIS" "VersionRevision" "${VER_REVISION}" WriteRegDword HKLM "Software\NSIS" "VersionBuild" "${VER_BUILD}" !endif WriteRegStr HKLM "${REG_UNINST_KEY}" "UninstallString" '"$INSTDIR\uninst-nsis.exe"' WriteRegStr HKLM "${REG_UNINST_KEY}" "QuietUninstallString" '"$INSTDIR\uninst-nsis.exe" /S' WriteRegStr HKLM "${REG_UNINST_KEY}" "InstallLocation" "$INSTDIR" WriteRegStr HKLM "${REG_UNINST_KEY}" "DisplayName" "Nullsoft Install System${NAMESUFFIX}" WriteRegStr HKLM "${REG_UNINST_KEY}" "DisplayIcon" "$INSTDIR\NSIS.exe" WriteRegStr HKLM "${REG_UNINST_KEY}" "DisplayVersion" "${VERSION}" !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD WriteRegDWORD HKLM "${REG_UNINST_KEY}" "VersionMajor" "${VER_MAJOR}" ; Required by WACK WriteRegDWORD HKLM "${REG_UNINST_KEY}" "VersionMinor" "${VER_MINOR}" ; Required by WACK !endif WriteRegStr HKLM "${REG_UNINST_KEY}" "Publisher" "Nullsoft and Contributors" ; Required by WACK WriteRegStr HKLM "${REG_UNINST_KEY}" "URLInfoAbout" "https://nsis.sourceforge.io/" WriteRegStr HKLM "${REG_UNINST_KEY}" "HelpLink" "https://nsis.sourceforge.io/Support" WriteRegDWORD HKLM "${REG_UNINST_KEY}" "NoModify" "1" WriteRegDWORD HKLM "${REG_UNINST_KEY}" "NoRepair" "1" ${MakeARPInstallDate} $1 WriteRegStr HKLM "${REG_UNINST_KEY}" "InstallDate" $1 WriteUninstaller $INSTDIR\uninst-nsis.exe ${MementoSectionSave} SetDetailsPrint both SectionEnd ;-------------------------------- ;Descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} "The core files required to use NSIS (compiler etc.)" !insertmacro MUI_DESCRIPTION_TEXT ${SecExample} "Example installation scripts that show you how to use NSIS" !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} "Add icon to your start menu for easy access" !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfaces} "User interface designs that can be used to change the installer look and feel" !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesModernUI} "A modern user interface like the wizards of recent Windows versions" !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesDefaultUI} "The default NSIS user interface which you can customize to make your own UI" !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesTinyUI} "A tiny version of the default user interface" !insertmacro MUI_DESCRIPTION_TEXT ${SecTools} "Tools that help you with NSIS development" !insertmacro MUI_DESCRIPTION_TEXT ${SecToolsZ2E} "A utility that converts a ZIP file to a NSIS installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecGraphics} "Icons, checkbox images and other graphics" !insertmacro MUI_DESCRIPTION_TEXT ${SecLangFiles} "Language files used to support multiple languages in an installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsPlugins} "Useful plugins that extend NSIS's functionality" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBanner} "Plugin that lets you show a banner before installation starts" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsLangDLL} "Plugin that lets you add a language select dialog to your installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsnsExec} "Plugin that executes console programs and prints its output in the NSIS log window or hides it" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplash} "Splash screen add-on that lets you add a splash screen to an installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplashT} "Splash screen add-on with transparency support that lets you add a splash screen to an installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSystem} "Plugin that lets you call Win32 API or external DLLs" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsMath} "Plugin that lets you evaluate complicated mathematical expressions" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialer} "Plugin that provides internet connection functions" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsIO} "Plugin that lets you add custom pages to an installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialogs} "Plugin that lets you add custom pages to an installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsStartMenu} "Plugin that lets the user select the start menu folder" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBgImage} "Plugin that lets you show a persistent background image plugin and play sounds" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsUserInfo} "Plugin that that gives you the user name and the user account type" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsNSISDL} "Plugin that lets you create a web based installer" !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsVPatch} "Plugin that lets you create patches to upgrade older files" !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Installer Functions Function .onInit ${MementoSectionRestore} FunctionEnd !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD Var ReinstallPageCheck Function PageReinstall ReadRegStr $R0 HKLM "Software\NSIS" "" ReadRegStr $R1 HKLM "${REG_UNINST_KEY}" "UninstallString" ${IfThen} "$R0$R1" == "" ${|} Abort ${|} StrCpy $R4 "older" ReadRegDWORD $R0 HKLM "Software\NSIS" "VersionMajor" ReadRegDWORD $R1 HKLM "Software\NSIS" "VersionMinor" ReadRegDWORD $R2 HKLM "Software\NSIS" "VersionRevision" ReadRegDWORD $R3 HKLM "Software\NSIS" "VersionBuild" ${IfThen} $R0 = 0 ${|} StrCpy $R4 "unknown" ${|} ; Anonymous builds have no version number StrCpy $R0 $R0.$R1.$R2.$R3 ${VersionCompare} ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} $R0 $R0 ${If} $R0 == 0 StrCpy $R1 "NSIS ${VERSION} is already installed. Select the operation you want to perform and click Next to continue." StrCpy $R2 "Add/Reinstall components" StrCpy $R3 "Uninstall NSIS" !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose the maintenance option to perform." StrCpy $R0 "2" ${ElseIf} $R0 == 1 StrCpy $R1 "An $R4 version of NSIS is installed on your system. It's recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue." StrCpy $R2 "Uninstall before installing" StrCpy $R3 "Do not uninstall" !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install NSIS." StrCpy $R0 "1" ${ElseIf} $R0 == 2 StrCpy $R1 "A newer version of NSIS is already installed! It is not recommended that you install an older version. If you really want to install this older version, it's better to uninstall the current version first. Select the operation you want to perform and click Next to continue." StrCpy $R2 "Uninstall before installing" StrCpy $R3 "Do not uninstall" !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install NSIS." StrCpy $R0 "1" ${Else} Abort ${EndIf} nsDialogs::Create 1018 Pop $R4 ${NSD_CreateLabel} 0 0 100% 24u $R1 Pop $R1 ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2 Pop $R2 ${NSD_OnClick} $R2 PageReinstallUpdateSelection ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3 Pop $R3 ${NSD_OnClick} $R3 PageReinstallUpdateSelection ${If} $ReinstallPageCheck != 2 SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0 ${Else} SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0 ${EndIf} ${NSD_SetFocus} $R2 nsDialogs::Show FunctionEnd Function PageReinstallUpdateSelection Pop $R1 ${NSD_GetState} $R2 $R1 ${If} $R1 == ${BST_CHECKED} StrCpy $ReinstallPageCheck 1 ${Else} StrCpy $ReinstallPageCheck 2 ${EndIf} FunctionEnd Function PageLeaveReinstall ${NSD_GetState} $R2 $R1 StrCmp $R0 "1" 0 +2 ; Existing install is not the same version? StrCmp $R1 "1" reinst_uninstall reinst_done StrCmp $R1 "1" reinst_done ; Same version, skip to add/reinstall components? reinst_uninstall: ReadRegStr $R1 HKLM "${REG_UNINST_KEY}" "UninstallString" ;Run uninstaller HideWindow ClearErrors ExecWait '$R1 _?=$INSTDIR' $0 BringToFront ${IfThen} ${Errors} ${|} StrCpy $0 2 ${|} ; ExecWait failed, set fake exit code ${If} $0 <> 0 ${OrIf} ${FileExists} "$INSTDIR\Bin\makensis.exe" ${If} $0 = 1 ; User aborted uninstaller? StrCmp $R0 "2" 0 +2 ; Is the existing install the same version? Quit ; ...yes, already installed, we are done Abort ${EndIf} MessageBox MB_ICONEXCLAMATION "Unable to uninstall!" Abort ${Else} StrCpy $0 $R1 1 ${IfThen} $0 == '"' ${|} StrCpy $R1 $R1 -1 1 ${|} ; Strip quotes from UninstallString Delete $R1 RMDir $INSTDIR ${EndIf} reinst_done: FunctionEnd !endif # VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD Function ShowReleaseNotes StrCpy $0 $WINDIR\hh.exe ${IfNotThen} ${FileExists} $0 ${|} SearchPath $0 hh.exe ${|} ${If} ${FileExists} $0 Exec '"$0" mk:@MSITStore:$INSTDIR\NSIS.chm::/SectionF.1.html' ${Else} ExecShell "" "https://nsis.sourceforge.io/Docs/AppendixF.html#F.1" ${EndIf} FunctionEnd ;-------------------------------- ;Uninstaller Section Section Uninstall SetDetailsPrint textonly DetailPrint "Uninstalling NSI Development Shell Extensions..." SetDetailsPrint listonly IfFileExists $INSTDIR\Bin\makensis.exe nsis_installed MessageBox MB_YESNO "It does not appear that NSIS is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" IDYES nsis_installed Abort "Uninstall aborted by user" nsis_installed: SetDetailsPrint textonly DetailPrint "Deleting Registry Keys..." SetDetailsPrint listonly !macro AssocDeleteFileExtAndProgId _hkey _dotext _pid ReadRegStr $R0 ${_hkey} "Software\Classes\${_dotext}" "" StrCmp $R0 "${_pid}" 0 +2 DeleteRegKey ${_hkey} "Software\Classes\${_dotext}" DeleteRegKey ${_hkey} "Software\Classes\${_pid}" !macroend !insertmacro AssocDeleteFileExtAndProgId HKLM ".nsi" "NSIS.Script" !insertmacro AssocDeleteFileExtAndProgId HKLM ".nsh" "NSIS.Header" ${NotifyShell_AssocChanged} DeleteRegKey HKLM "${REG_UNINST_KEY}" DeleteRegKey HKLM "Software\NSIS" SetDetailsPrint textonly DetailPrint "Deleting Files..." SetDetailsPrint listonly Delete "$SMPROGRAMS\NSIS${NAMESUFFIX}.lnk" Delete "$DESKTOP\NSIS${NAMESUFFIX}.lnk" ; Remove legacy shortcut Delete $INSTDIR\makensis.exe Delete $INSTDIR\makensisw.exe Delete $INSTDIR\NSIS.exe Delete $INSTDIR\NSIS.exe.manifest Delete $INSTDIR\license.txt Delete $INSTDIR\COPYING Delete $INSTDIR\uninst-nsis.exe Delete $INSTDIR\nsisconf.nsi Delete $INSTDIR\nsisconf.nsh Delete $INSTDIR\NSIS.chm RMDir /r $INSTDIR\Bin RMDir /r $INSTDIR\Contrib RMDir /r $INSTDIR\Docs RMDir /r $INSTDIR\Examples RMDir /r $INSTDIR\Include RMDir /r $INSTDIR\Menu RMDir /r $INSTDIR\Plugins RMDir /r $INSTDIR\Stubs RMDir $INSTDIR SetDetailsPrint both SectionEnd nsis-3.11/Examples/one-section.nsi000077500000000000000000000030701477201124000171270ustar00rootroot00000000000000; one-section.nsi ; ; This example demonstrates how to control section selection. ; It allows only one of the sections of a group to be selected. ;-------------------------------- ; Section define/macro header file ; See this header file for more info !include "Sections.nsh" ;-------------------------------- Name "One Section" OutFile "one-section.exe" RequestExecutionLevel user ;-------------------------------- ; Pages Page Components Page InstFiles ;-------------------------------- ; Sections Section !Required SectionIn RO SectionEnd Section "Group 1 - Option 1" g1o1 SectionEnd Section /o "Group 1 - Option 2" g1o2 SectionEnd Section /o "Group 1 - Option 3" g1o3 SectionEnd Section "Group 2 - Option 1" g2o1 SectionEnd Section /o "Group 2 - Option 2" g2o2 SectionEnd Section /o "Group 2 - Option 3" g2o3 SectionEnd ;-------------------------------- ; Functions ; $1 stores the status of group 1 ; $2 stores the status of group 2 Function .onInit StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default StrCpy $2 ${g2o1} ; Group 2 - Option 1 is selected by default FunctionEnd Function .onSelChange !insertmacro StartRadioButtons $1 !insertmacro RadioButton ${g1o1} !insertmacro RadioButton ${g1o2} !insertmacro RadioButton ${g1o3} !insertmacro EndRadioButtons !insertmacro StartRadioButtons $2 !insertmacro RadioButton ${g2o1} !insertmacro RadioButton ${g2o2} !insertmacro RadioButton ${g2o3} !insertmacro EndRadioButtons FunctionEndnsis-3.11/Examples/primes.nsi000077500000000000000000000031701477201124000162040ustar00rootroot00000000000000; primes.nsi ; ; This is an example of the possibilities of the NSIS Script language. ; It calculates prime numbers. ;-------------------------------- Name "primes" AllowRootDirInstall true OutFile "primes.exe" Caption "Prime number generator" ShowInstDetails show AllowRootDirInstall true InstallDir "$EXEDIR" RequestExecutionLevel user DirText "Select a directory to write primes.txt. $_CLICK" ;-------------------------------- ;Pages Page directory Page instfiles ;-------------------------------- Section "" SetOutPath $INSTDIR Call DoPrimes SectionEnd ;-------------------------------- Function DoPrimes ; we put this in here so it doesn't update the progress bar (faster) !define PPOS $0 ; position in prime searching !define PDIV $1 ; divisor !define PMOD $2 ; the result of the modulus !define PCNT $3 ; count of how many we've printed FileOpen $9 $INSTDIR\primes.txt w DetailPrint "2 is prime!" FileWrite $9 "2 is prime!$\r$\n" DetailPrint "3 is prime!" FileWrite $9 "3 is prime!$\r$\n" Strcpy ${PPOS} 3 Strcpy ${PCNT} 2 outerloop: StrCpy ${PDIV} 3 innerloop: IntOp ${PMOD} ${PPOS} % ${PDIV} IntCmp ${PMOD} 0 notprime IntOp ${PDIV} ${PDIV} + 2 IntCmp ${PDIV} ${PPOS} 0 innerloop 0 DetailPrint "${PPOS} is prime!" FileWrite $9 "${PPOS} is prime!$\r$\n" IntOp ${PCNT} ${PCNT} + 1 IntCmp ${PCNT} 100 0 innerloop StrCpy ${PCNT} 0 MessageBox MB_YESNO "Process more?" IDNO stop notprime: IntOp ${PPOS} ${PPOS} + 2 Goto outerloop stop: FileClose $9 FunctionEndnsis-3.11/Examples/rtest.nsi000077500000000000000000000024551477201124000160530ustar00rootroot00000000000000; rtest.nsi ; ; This script tests some advanced NSIS functions. ;-------------------------------- Name "rtest" OutFile "rtest.exe" ComponentText "Select tests!" ShowInstDetails show RequestExecutionLevel user ;-------------------------------- Section "Test 1" StrCpy $R0 "a" GetFunctionAddress $R1 test1 Call $R1 StrCmp $R0 "a182345678" success DetailPrint "Test 1 failed (output: $R0)" Goto end success: DetailPrint "Test 1 succeeded (output: $R0)" end: SectionEnd Function test1 GetLabelAddress $9 skip IntOp $9 $9 - 1 StrCpy $R0 $R01 Call $9 StrCpy $R0 $R02 StrCpy $R0 $R03 StrCpy $R0 $R04 StrCpy $R0 $R05 StrCpy $R0 $R06 StrCpy $R0 $R07 StrCpy $R0 $R08 skip: FunctionEnd ;-------------------------------- Section "Test 2" StrCpy $R0 "0" StrCpy $R1 "11" Call test2 StrCmp $R1 "11,10,9,8,7,6,5,4,3,2,1" success DetailPrint "Test 2 failed (output: $R1)" Goto end success: DetailPrint "Test 2 succeeded (output: $R1)" end: SectionEnd Function test2 IntOp $R0 $R0 + 1 IntCmp $R0 10 done Push $R0 GetFunctionAddress $R2 test2 Call $R2 Pop $R0 done: StrCpy $R1 "$R1,$R0" FunctionEndnsis-3.11/Examples/silent.nsi000077500000000000000000000042511477201124000162040ustar00rootroot00000000000000# This example shows how to handle silent installers. # In short, you need IfSilent and the /SD switch for MessageBox to make your installer # really silent when the /S switch is used. Name "Silent" OutFile "silent.exe" RequestExecutionLevel user # uncomment the following line to make the installer silent by default. ; SilentInstall silent Function .onInit # `/SD IDYES' tells MessageBox to automatically choose IDYES if the installer is silent # in this case, the installer can only be silent if the user used the /S switch or if # you've uncommented line number 5 MessageBox MB_YESNO|MB_ICONQUESTION "Would you like the installer to be silent from now on?" \ /SD IDYES IDNO no IDYES yes # SetSilent can only be used in .onInit and doesn't work well along with `SetSilent silent' yes: SetSilent silent Goto done no: SetSilent normal done: FunctionEnd Section IfSilent 0 +2 MessageBox MB_OK|MB_ICONINFORMATION 'This is a "silent" installer' # there is no need to use IfSilent for this one because the /SD switch takes care of that MessageBox MB_OK|MB_ICONINFORMATION "This is not a silent installer" /SD IDOK # when `SetOverwrite on' (which is the default) is used, the installer will show a message # if it can't open a file for writing. On silent installers, the ignore option will be # automatically selected. if `AllowSkipFiles off' (default is on) was used, there is no # ignore option and the cancel option will be automatically selected. # on is default ; AllowSkipFiles on # lock file FileOpen $0 $TEMP\silentOverwrite w # try to extract - will fail File /oname=$TEMP\silentOverwrite silent.nsi # unlcok FileClose $0 # this will always show on silent installers because ignore is the option automatically # selected when a file can't be opened for writing on a silent installer MessageBox MB_OK|MB_ICONINFORMATION "This message box always shows if the installer is silent" AllowSkipFiles off # lock file FileOpen $0 $TEMP\silentOverwrite w # try to extract - will fail File /oname=$TEMP\silentOverwrite silent.nsi # unlcok FileClose $0 SectionEndnsis-3.11/Examples/unicode.nsi000077500000000000000000000020111477201124000163240ustar00rootroot00000000000000; Unicode installers will not be able to run on Windows 9x! Unicode true Name "Unicode Games" OutFile "unicode.exe" RequestExecutionLevel User ShowInstDetails show XPStyle on Section "Unicode in UI" DetailPrint "Hello World!" DetailPrint "×©×œ×•× ×¢×•×œ×!" DetailPrint "مرحبا العالم!" DetailPrint "ã“ã‚“ã«ã¡ã¯ã€ä¸–界ï¼" DetailPrint "你好世界ï¼" DetailPrint "привет мир!" DetailPrint "안녕하세요!" DetailPrint "${U+00A9}" # arbitrary unicode chars SectionEnd Section "Unicode in Files" Var /Global Message InitPluginsDir FileOpen $0 "$PluginsDir\Test.txt" w IfErrors done FileWriteUTF16LE /BOM $0 "Hello World " FileWriteWord $0 0xD83C # Manually write ${U+1F30D} FileWriteWord $0 0xDF0D # as surrogate-pair FileWriteUTF16LE $0 " and Sun ${U+2600}$\r$\n" FileClose $0 FileOpen $0 "$PluginsDir\Test.txt" r IfErrors done FileReadUTF16LE $0 $Message FileClose $0 DetailPrint "Message: $Message" done: SectionEnd nsis-3.11/Examples/waplugin.nsi000077500000000000000000000111441477201124000165330ustar00rootroot00000000000000; waplugin.nsi ; ; This script will generate an installer that installs a Winamp 2 plug-in. ; ; This installer will automatically alert the user that installation was ; successful, and ask them whether or not they would like to make the ; plug-in the default and run Winamp. ;-------------------------------- ; Uncomment the next line to enable auto Winamp download ; !define WINAMP_AUTOINSTALL ; The name of the installer Name "TinyVis Plug-in" ; The file to write OutFile "waplugin.exe" ; The default installation directory InstallDir $PROGRAMFILES\Winamp ; detect winamp path from uninstall string if available InstallDirRegKey HKLM \ "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \ "UninstallString" ; The text to prompt the user to enter a directory DirText "Please select your Winamp path below (you will be able to proceed when Winamp is detected):" # currently doesn't work - DirShow hide ; automatically close the installer when done. AutoCloseWindow true ; hide the "show details" box ShowInstDetails nevershow ; Request application privileges for Windows Vista RequestExecutionLevel admin ;-------------------------------- ;Pages Page directory Page instfiles ;-------------------------------- ; The stuff to install Section "" !ifdef WINAMP_AUTOINSTALL Call MakeSureIGotWinamp !endif Call QueryWinampVisPath SetOutPath $1 ; File to extract #File "C:\program files\winamp\plugins\vis_nsfs.dll" File /oname=vis_nsfs.dll "${NSISDIR}\Plugins\x86-ansi\TypeLib.dll" # dummy plug-in ; prompt user, and if they select no, go to NoWinamp MessageBox MB_YESNO|MB_ICONQUESTION \ "The plug-in was installed. Would you like to run Winamp now with TinyVis as the default plug-in?" \ IDNO NoWinamp WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_name" "vis_nsfs.dll" WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_num" "0" Exec '"$INSTDIR\Winamp.exe"' NoWinamp: SectionEnd ;-------------------------------- Function .onVerifyInstDir !ifndef WINAMP_AUTOINSTALL ;Check for Winamp installation IfFileExists $INSTDIR\Winamp.exe Good Abort Good: !endif ; WINAMP_AUTOINSTALL FunctionEnd Function QueryWinampVisPath ; sets $1 with vis path StrCpy $1 $INSTDIR\Plugins ; use DSPDir instead of VISDir to get DSP plugins directory ReadINIStr $9 $INSTDIR\winamp.ini Winamp VisDir StrCmp $9 "" End IfFileExists $9 0 End StrCpy $1 $9 ; update dir End: FunctionEnd !ifdef WINAMP_AUTOINSTALL Function GetWinampInstPath Push $0 Push $1 Push $2 ReadRegStr $0 HKLM \ "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \ "UninstallString" StrCmp $0 "" fin StrCpy $1 $0 1 0 ; get firstchar StrCmp $1 '"' "" getparent ; if first char is ", let's remove "'s first. StrCpy $0 $0 "" 1 StrCpy $1 0 rqloop: StrCpy $2 $0 1 $1 StrCmp $2 '"' rqdone StrCmp $2 "" rqdone IntOp $1 $1 + 1 Goto rqloop rqdone: StrCpy $0 $0 $1 getparent: ; the uninstall string goes to an EXE, let's get the directory. StrCpy $1 -1 gploop: StrCpy $2 $0 1 $1 StrCmp $2 "" gpexit StrCmp $2 "\" gpexit IntOp $1 $1 - 1 Goto gploop gpexit: StrCpy $0 $0 $1 StrCmp $0 "" fin IfFileExists $0\winamp.exe fin StrCpy $0 "" fin: Pop $2 Pop $1 Exch $0 FunctionEnd Function MakeSureIGotWinamp Call GetWinampInstPath Pop $0 StrCmp $0 "" getwinamp Return getwinamp: Call ConnectInternet ;Make an internet connection (if no connection available) StrCpy $2 "$TEMP\Winamp Installer.exe" NSISdl::download http://download.nullsoft.com/winamp/client/winamp281_lite.exe $2 Pop $0 StrCmp $0 success success SetDetailsView show DetailPrint "download failed: $0" Abort success: ExecWait '"$2" /S' Delete $2 Call GetWinampInstPath Pop $0 StrCmp $0 "" skip StrCpy $INSTDIR $0 skip: FunctionEnd Function ConnectInternet Push $R0 ClearErrors Dialer::AttemptConnect IfErrors noie3 Pop $R0 StrCmp $R0 "online" connected MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet." Quit noie3: ; IE3 not installed MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now." connected: Pop $R0 FunctionEnd !endif ; WINAMP_AUTOINSTALLnsis-3.11/INSTALL000077500000000000000000000056421477201124000134530ustar00rootroot00000000000000INSTALLING NSIS ~~~~~~~~~~~~~~~ This is a trimmed version of Appendix "Building NSIS" of the documentation. - Requirements * Python version 2.7 and above (http://www.python.org/) * SCons version 1.2.0 and above (http://www.scons.org/) * zlib version 1.2.3 and above (http://www.zlib.net/) * C compiler - Optional Tools * HTML Help Workshop for CHM documentation (http://msdn.microsoft.com/) * Cross compiler on POSIX platforms, i.e. MinGW (http://www.mingw.org/) * wxWidgets 2.8 for NSIS Menu (http://www.wxwidgets.org) - Preparation * Unpack the zip archive of the downloaded zlib compiled DLL package to a folder of your choice, e.g. C:\Dev\zlib-1.2.4 and set the ZLIB_W32 environment variable, type: set ZLIB_W32=C:\Dev\zlib-1.2.4 * See Contrib\NSIS Menu\wx\build.txt for wxWidgets build steps. Optionally, you can skip this by using: scons SKIPUTILS="NSIS Menu" - For Unicode version of NSIS * type: scons UNICODE=yes - Installing * type: scons PREFIX="C:\Program Files\NSIS" install - More options * For build options, type: scons -h * For SCons options, type: scons -H - Special cases * If using the Microsoft Visual C++ Toolkit 2003 and Platform SDK, add MSTOOLKIT=yes to the build command line. For example: scons MSTOOLKIT=yes PREFIX=C:\NSIS install If path problems occur, try: set MSSDK=C:\Path\To\Platform SDK set VCToolkitInstallDir=C:\Path\To\VCToolkit scons MSTOOLKIT=yes * If a cross compiler is not available on POSIX, use: scons SKIPSTUBS=all SKIPPLUGINS=all SKIPUTILS=all SKIPMISC=all NSIS_CONFIG_CONST_DATA_PATH=no PREFIX=/path/to/extracted/zip install-compiler This should only build makensis and install it to the directory where a precompiled package, such as the nightly build or a zipped release version (nsis-x.xx.zip), is extracted. * Options for POSIX installs PREFIX: defaults to /usr/local PREFIX_BIN: Where to put native binaries. Defaults to $PREFIX/bin/ PREFIX_CONF: Where to put the config file. Defaults to $PREFIX/etc/ PREFIX_DATA: Where to put the plugins, stubs, etc. Defaults to $PREFIX/share/nsis/ PREFIX_DOC: Where to put the docs and examples. Defaults to $PREFIX/share/doc/nsis/ PREFIX_DEST: The install root Useful for packagers. Defaults to the root directory. PREFIX_PLUGINAPI_INC: Where to put the plugin api headers. Defaults to not installed. PREFIX_PLUGINAPI_LIB: Where to put the plugin api static lib. Defaults to not installed. - Problems * Get help in the forum: http://forums.winamp.com/forumdisplay.php?forumid=65 * Report bugs in the bug tracker: http://sourceforge.net/tracker/?group_id=22049&atid=373085 nsis-3.11/Include/000077500000000000000000000000001477201124000137735ustar00rootroot00000000000000nsis-3.11/Include/Colors.nsh000077500000000000000000000035021477201124000157510ustar00rootroot00000000000000!ifndef COLORS_NSH !define COLORS_NSH !verbose push !verbose 3 # Squad # Rob Segal # Joel # Yathosho # Predefined HTML Hex colors !define WHITE "FFFFFF" !define BLACK "000000" !define YELLOW "FFFF00" !define RED "FF0000" !define GREEN "00FF00" !define BLUE "0000FF" !define MAGENTA "FF00FF" !define CYAN "00FFFF" # Function to convert red , green and blue integer values to HTML Hex format !define RGB '!insertmacro rgb2hex' # Function to convert red, green and blue integer values to Hexadecimal (0xRRGGBB) format !define HEX '!insertmacro rgb2hex2' # Function to get the r value from a RGB number !define GetRvalue '!insertmacro redvalue' # Function to get the g value from a RGB number !define GetGvalue '!insertmacro greenvalue' # Function to get the b value from a RGB number !define GetBvalue '!insertmacro bluevalue' # Function to get the r value from a Hex number !define GetRvalueX '!insertmacro bluevalue' # Function to get the g value from a Hex number !define GetGvalueX '!insertmacro greenvalue' # Function to get the r value from a HEX number !define GetBvalueX '!insertmacro redvalue' !macro rgb2hex output R G B IntFmt "${output}" "%02X" "${R}" IntFmt "${output}" "${output}%02X" "${G}" IntFmt "${output}" "${output}%02X" "${B}" !macroend !macro rgb2hex2 output R G B IntFmt "${output}" "%02X" "${B}" IntFmt "${output}" "${output}%02X" "${G}" IntFmt "${output}" "${output}%02X" "${R}" !macroend !macro redvalue output hexval StrCpy ${output} ${hexval} 2 0 IntFmt "${output}" "%02i" "0x${output}" !macroend !macro greenvalue output hexval StrCpy ${output} ${hexval} 2 2 IntFmt "${output}" "%02i" "0x${output}" !macroend !macro bluevalue output hexval StrCpy ${output} ${hexval} 2 4 IntFmt "${output}" "%02i" "0x${output}" !macroend !verbose pop !endifnsis-3.11/Include/FileFunc.nsh000077500000000000000000001171121477201124000162060ustar00rootroot00000000000000/* _____________________________________________________________________________ File Functions Header v3.4 _____________________________________________________________________________ 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) See documentation for more information about the following functions. Usage in script: 1. !include "FileFunc.nsh" 2. [Section|Function] ${FileFunction} "Param1" "Param2" "..." $var [SectionEnd|FunctionEnd] FileFunction=[Locate|GetSize|DriveSpace|GetDrives|GetTime|GetFileAttributes| GetFileVersion|GetExeName|GetExePath|GetParameters|GetOptions| GetOptionsS|GetRoot|GetParent|GetFileName|GetBaseName|GetFileExt| BannerTrimPath|DirState|RefreshShellIcons] _____________________________________________________________________________ Thanks to: _____________________________________________________________________________ GetSize KiCHiK (Function "FindFiles") DriveSpace sunjammer (Function "CheckSpaceFree") GetDrives deguix (Based on his idea of Function "DetectDrives") GetTime Takhir (Script "StatTest") and deguix (Function "FileModifiedDate") GetFileVersion KiCHiK (Based on his example for command "GetDLLVersion") GetParameters sunjammer (Based on his Function "GetParameters") GetRoot KiCHiK (Based on his Function "GetRoot") GetParent sunjammer (Based on his Function "GetParent") GetFileName KiCHiK (Based on his Function "GetFileName") GetBaseName comperio (Based on his idea of Function "GetBaseName") GetFileExt opher (author) RefreshShellIcons jerome tremblay (author) */ ;_____________________________________________________________________________ ; ; Macros ;_____________________________________________________________________________ ; ; Change log window verbosity (default: 3=no script) ; ; Example: ; !include "FileFunc.nsh" ; !insertmacro Locate ; ${FILEFUNC_VERBOSE} 4 # all verbosity ; !insertmacro VersionCompare ; ${FILEFUNC_VERBOSE} 3 # no script !ifndef FILEFUNC_INCLUDED !verbose push 3 !define /IfNDef _FILEFUNC_VERBOSE 3 !verbose ${_FILEFUNC_VERBOSE} !define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE` !define FILEFUNC_INCLUDED !include Util.nsh !macro FILEFUNC_VERBOSE _VERBOSE !verbose push 3 !define /ReDef _FILEFUNC_VERBOSE ${_VERBOSE} !verbose pop !macroend !macro LocateCall _PATH _OPTIONS _FUNC !verbose push !verbose ${_FILEFUNC_VERBOSE} Push $0 Push `${_PATH}` Push `${_OPTIONS}` GetFunctionAddress $0 `${_FUNC}` Push `$0` ${CallArtificialFunction} Locate_ Pop $0 !verbose pop !macroend !macro GetSizeCall _PATH _OPTIONS _RESULT1 _RESULT2 _RESULT3 !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PATH}` Push `${_OPTIONS}` ${CallArtificialFunction} GetSize_ Pop ${_RESULT1} Pop ${_RESULT2} Pop ${_RESULT3} !verbose pop !macroend !macro DriveSpaceCall _DRIVE _OPTIONS _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_DRIVE}` Push `${_OPTIONS}` ${CallArtificialFunction} DriveSpace_ Pop ${_RESULT} !verbose pop !macroend !macro GetDrivesCall _DRV _FUNC !verbose push !verbose ${_FILEFUNC_VERBOSE} Push $0 Push `${_DRV}` GetFunctionAddress $0 `${_FUNC}` Push `$0` ${CallArtificialFunction} GetDrives_ Pop $0 !verbose pop !macroend !macro GetTimeCall _FILE _OPTION _RESULT1 _RESULT2 _RESULT3 _RESULT4 _RESULT5 _RESULT6 _RESULT7 !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_FILE}` Push `${_OPTION}` ${CallArtificialFunction} GetTime_ Pop ${_RESULT1} Pop ${_RESULT2} Pop ${_RESULT3} Pop ${_RESULT4} Pop ${_RESULT5} Pop ${_RESULT6} Pop ${_RESULT7} !verbose pop !macroend !macro GetFileAttributesCall _PATH _ATTR _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PATH}` Push `${_ATTR}` ${CallArtificialFunction} GetFileAttributes_ Pop ${_RESULT} !verbose pop !macroend !macro GetFileVersionCall _FILE _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_FILE}` ${CallArtificialFunction} GetFileVersion_ Pop ${_RESULT} !verbose pop !macroend !macro GetExeNameCall _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} ${CallArtificialFunction} GetExeName_ Pop ${_RESULT} !verbose pop !macroend !macro GetExePathCall _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} ${CallArtificialFunction} GetExePath_ Pop ${_RESULT} !verbose pop !macroend !macro GetParametersCall _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} ${CallArtificialFunction} GetParameters_ Pop ${_RESULT} !verbose pop !macroend !macro GetOptionsCall _PARAMETERS _OPTION _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PARAMETERS}` Push `${_OPTION}` ${CallArtificialFunction} GetOptions_ Pop ${_RESULT} !verbose pop !macroend !macro GetOptionsSCall _PARAMETERS _OPTION _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PARAMETERS}` Push `${_OPTION}` ${CallArtificialFunction} GetOptionsS_ Pop ${_RESULT} !verbose pop !macroend !macro GetRootCall _FULLPATH _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_FULLPATH}` ${CallArtificialFunction} GetRoot_ Pop ${_RESULT} !verbose pop !macroend !macro GetParentCall _PATHSTRING _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PATHSTRING}` ${CallArtificialFunction} GetParent_ Pop ${_RESULT} !verbose pop !macroend !macro GetFileNameCall _PATHSTRING _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PATHSTRING}` ${CallArtificialFunction} GetFileName_ Pop ${_RESULT} !verbose pop !macroend !macro GetBaseNameCall _FILESTRING _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_FILESTRING}` ${CallArtificialFunction} GetBaseName_ Pop ${_RESULT} !verbose pop !macroend !macro GetFileExtCall _FILESTRING _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_FILESTRING}` ${CallArtificialFunction} GetFileExt_ Pop ${_RESULT} !verbose pop !macroend !macro BannerTrimPathCall _PATH _LENGHT _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PATH}` Push `${_LENGHT}` ${CallArtificialFunction} BannerTrimPath_ Pop ${_RESULT} !verbose pop !macroend !macro DirStateCall _PATH _RESULT !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${_PATH}` ${CallArtificialFunction} DirState_ Pop ${_RESULT} !verbose pop !macroend !macro RefreshShellIconsCall !verbose push !verbose ${_FILEFUNC_VERBOSE} ${CallArtificialFunction} RefreshShellIcons_ !verbose pop !macroend !define Locate `!insertmacro LocateCall` !define un.Locate `!insertmacro LocateCall` !macro Locate !macroend !macro un.Locate !macroend !macro Locate_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R6 Push $R7 Push $R8 Push $R9 ClearErrors StrCpy $3 '' StrCpy $4 '' StrCpy $5 '' StrCpy $6 '' StrCpy $7 '' StrCpy $8 0 StrCpy $R7 '' StrCpy $R9 $0 1 -1 StrCmp $R9 '\' 0 +3 StrCpy $0 $0 -1 goto -3 IfFileExists '$0\*.*' 0 FileFunc_Locate_error FileFunc_Locate_option: StrCpy $R9 $1 1 StrCpy $1 $1 '' 1 StrCmp $R9 ' ' -2 StrCmp $R9 '' FileFunc_Locate_sizeset StrCmp $R9 '/' 0 -4 StrCpy $9 -1 IntOp $9 $9 + 1 StrCpy $R9 $1 1 $9 StrCmp $R9 '' +2 StrCmp $R9 '/' 0 -3 StrCpy $R8 $1 $9 StrCpy $R8 $R8 '' 2 StrCpy $R9 $R8 '' -1 StrCmp $R9 ' ' 0 +3 StrCpy $R8 $R8 -1 goto -3 StrCpy $R9 $1 2 StrCpy $1 $1 '' $9 StrCmp $R9 'L=' 0 FileFunc_Locate_mask StrCpy $3 $R8 StrCmp $3 '' +6 StrCmp $3 'FD' +5 StrCmp $3 'F' +4 StrCmp $3 'D' +3 StrCmp $3 'DE' +2 StrCmp $3 'FDE' 0 FileFunc_Locate_error goto FileFunc_Locate_option FileFunc_Locate_mask: StrCmp $R9 'M=' 0 FileFunc_Locate_size StrCpy $4 $R8 goto FileFunc_Locate_option FileFunc_Locate_size: StrCmp $R9 'S=' 0 FileFunc_Locate_gotosubdir StrCpy $6 $R8 goto FileFunc_Locate_option FileFunc_Locate_gotosubdir: StrCmp $R9 'G=' 0 FileFunc_Locate_banner StrCpy $7 $R8 StrCmp $7 '' +3 StrCmp $7 '1' +2 StrCmp $7 '0' 0 FileFunc_Locate_error goto FileFunc_Locate_option FileFunc_Locate_banner: StrCmp $R9 'B=' 0 FileFunc_Locate_error StrCpy $R7 $R8 StrCmp $R7 '' +3 StrCmp $R7 '1' +2 StrCmp $R7 '0' 0 FileFunc_Locate_error goto FileFunc_Locate_option FileFunc_Locate_sizeset: StrCmp $6 '' FileFunc_Locate_default StrCpy $9 0 StrCpy $R9 $6 1 $9 StrCmp $R9 '' +4 StrCmp $R9 ':' +3 IntOp $9 $9 + 1 goto -4 StrCpy $5 $6 $9 IntOp $9 $9 + 1 StrCpy $1 $6 1 -1 StrCpy $6 $6 -1 $9 StrCmp $5 '' +2 IntOp $5 $5 + 0 StrCmp $6 '' +2 IntOp $6 $6 + 0 StrCmp $1 'B' 0 +3 StrCpy $1 1 goto FileFunc_Locate_default StrCmp $1 'K' 0 +3 StrCpy $1 1024 goto FileFunc_Locate_default StrCmp $1 'M' 0 +3 StrCpy $1 1048576 goto FileFunc_Locate_default StrCmp $1 'G' 0 FileFunc_Locate_error StrCpy $1 1073741824 FileFunc_Locate_default: StrCmp $3 '' 0 +2 StrCpy $3 'FD' StrCmp $4 '' 0 +2 StrCpy $4 '*.*' StrCmp $7 '' 0 +2 StrCpy $7 '1' StrCmp $R7 '' 0 +2 StrCpy $R7 '0' StrCpy $7 'G$7B$R7' StrCpy $8 1 Push $0 SetDetailsPrint textonly FileFunc_Locate_nextdir: IntOp $8 $8 - 1 Pop $R8 StrCpy $9 $7 2 2 StrCmp $9 'B0' +3 GetLabelAddress $9 FileFunc_Locate_findfirst goto call DetailPrint 'Search in: $R8' FileFunc_Locate_findfirst: FindFirst $0 $R7 '$R8\$4' IfErrors FileFunc_Locate_subdir StrCmp $R7 '.' 0 FileFunc_Locate_dir FindNext $0 $R7 StrCmp $R7 '..' 0 FileFunc_Locate_dir FindNext $0 $R7 IfErrors 0 FileFunc_Locate_dir FindClose $0 goto FileFunc_Locate_subdir FileFunc_Locate_dir: IfFileExists '$R8\$R7\*.*' 0 FileFunc_Locate_file StrCpy $R6 '' StrCmp $3 'DE' +4 StrCmp $3 'FDE' +3 StrCmp $3 'FD' FileFunc_Locate_precall StrCmp $3 'F' FileFunc_Locate_findnext FileFunc_Locate_precall FindFirst $9 $R9 '$R8\$R7\*.*' StrCmp $R9 '.' 0 +4 FindNext $9 $R9 StrCmp $R9 '..' 0 +2 FindNext $9 $R9 FindClose $9 IfErrors FileFunc_Locate_precall FileFunc_Locate_findnext FileFunc_Locate_file: StrCmp $3 'FDE' +3 StrCmp $3 'FD' +2 StrCmp $3 'F' 0 FileFunc_Locate_findnext StrCpy $R6 0 StrCmp $5$6 '' FileFunc_Locate_precall FileOpen $9 '$R8\$R7' r IfErrors +3 FileSeek $9 0 END $R6 FileClose $9 System::Int64Op $R6 / $1 Pop $R6 StrCmp $5 '' +2 IntCmp $R6 $5 0 FileFunc_Locate_findnext StrCmp $6 '' +2 IntCmp $R6 $6 0 0 FileFunc_Locate_findnext FileFunc_Locate_precall: StrCpy $9 0 StrCpy $R9 '$R8\$R7' call: Push $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R7 Push $R8 StrCmp $9 0 +4 StrCpy $R6 '' StrCpy $R7 '' StrCpy $R9 '' Call $2 Pop $R9 Pop $R8 Pop $R7 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 IfErrors 0 +3 FindClose $0 goto FileFunc_Locate_error StrCmp $R9 'StopLocate' 0 +3 FindClose $0 goto FileFunc_Locate_clearstack goto $9 FileFunc_Locate_findnext: FindNext $0 $R7 IfErrors 0 FileFunc_Locate_dir FindClose $0 FileFunc_Locate_subdir: StrCpy $9 $7 2 StrCmp $9 'G0' FileFunc_Locate_end FindFirst $0 $R7 '$R8\*.*' StrCmp $R7 '.' 0 FileFunc_Locate_pushdir FindNext $0 $R7 StrCmp $R7 '..' 0 FileFunc_Locate_pushdir FindNext $0 $R7 IfErrors 0 FileFunc_Locate_pushdir FindClose $0 StrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir FileFunc_Locate_pushdir: IfFileExists '$R8\$R7\*.*' 0 +3 Push '$R8\$R7' IntOp $8 $8 + 1 FindNext $0 $R7 IfErrors 0 FileFunc_Locate_pushdir FindClose $0 StrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir FileFunc_Locate_error: SetErrors FileFunc_Locate_clearstack: StrCmp $8 0 FileFunc_Locate_end IntOp $8 $8 - 1 Pop $R8 goto FileFunc_Locate_clearstack FileFunc_Locate_end: SetDetailsPrint both Pop $R9 Pop $R8 Pop $R7 Pop $R6 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !verbose pop !macroend !define GetSize `!insertmacro GetSizeCall` !define un.GetSize `!insertmacro GetSizeCall` !macro GetSize !macroend !macro un.GetSize !macroend !macro GetSize_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R3 Push $R4 Push $R5 Push $R6 Push $R7 Push $R8 Push $R9 ClearErrors StrCpy $R9 $0 1 -1 StrCmp $R9 '\' 0 +3 StrCpy $0 $0 -1 goto -3 IfFileExists '$0\*.*' 0 FileFunc_GetSize_error StrCpy $3 '' StrCpy $4 '' StrCpy $5 '' StrCpy $6 '' StrCpy $8 0 StrCpy $R3 '' StrCpy $R4 '' StrCpy $R5 '' FileFunc_GetSize_option: StrCpy $R9 $1 1 StrCpy $1 $1 '' 1 StrCmp $R9 ' ' -2 StrCmp $R9 '' FileFunc_GetSize_sizeset StrCmp $R9 '/' 0 -4 StrCpy $9 -1 IntOp $9 $9 + 1 StrCpy $R9 $1 1 $9 StrCmp $R9 '' +2 StrCmp $R9 '/' 0 -3 StrCpy $8 $1 $9 StrCpy $8 $8 '' 2 StrCpy $R9 $8 '' -1 StrCmp $R9 ' ' 0 +3 StrCpy $8 $8 -1 goto -3 StrCpy $R9 $1 2 StrCpy $1 $1 '' $9 StrCmp $R9 'M=' 0 FileFunc_GetSize_size StrCpy $4 $8 goto FileFunc_GetSize_option FileFunc_GetSize_size: StrCmp $R9 'S=' 0 FileFunc_GetSize_gotosubdir StrCpy $6 $8 goto FileFunc_GetSize_option FileFunc_GetSize_gotosubdir: StrCmp $R9 'G=' 0 FileFunc_GetSize_error StrCpy $7 $8 StrCmp $7 '' +3 StrCmp $7 '1' +2 StrCmp $7 '0' 0 FileFunc_GetSize_error goto FileFunc_GetSize_option FileFunc_GetSize_sizeset: StrCmp $6 '' FileFunc_GetSize_default StrCpy $9 0 StrCpy $R9 $6 1 $9 StrCmp $R9 '' +4 StrCmp $R9 ':' +3 IntOp $9 $9 + 1 goto -4 StrCpy $5 $6 $9 IntOp $9 $9 + 1 StrCpy $1 $6 1 -1 StrCpy $6 $6 -1 $9 StrCmp $5 '' +2 IntOp $5 $5 + 0 StrCmp $6 '' +2 IntOp $6 $6 + 0 StrCmp $1 'B' 0 +4 StrCpy $1 1 StrCpy $2 bytes goto FileFunc_GetSize_default StrCmp $1 'K' 0 +4 StrCpy $1 1024 StrCpy $2 Kb goto FileFunc_GetSize_default StrCmp $1 'M' 0 +4 StrCpy $1 1048576 StrCpy $2 Mb goto FileFunc_GetSize_default StrCmp $1 'G' 0 FileFunc_GetSize_error StrCpy $1 1073741824 StrCpy $2 Gb FileFunc_GetSize_default: StrCmp $4 '' 0 +2 StrCpy $4 '*.*' StrCmp $7 '' 0 +2 StrCpy $7 '1' StrCpy $8 1 Push $0 SetDetailsPrint textonly FileFunc_GetSize_nextdir: IntOp $8 $8 - 1 Pop $R8 FindFirst $0 $R7 '$R8\$4' IfErrors FileFunc_GetSize_show StrCmp $R7 '.' 0 FileFunc_GetSize_dir FindNext $0 $R7 StrCmp $R7 '..' 0 FileFunc_GetSize_dir FindNext $0 $R7 IfErrors 0 FileFunc_GetSize_dir FindClose $0 goto FileFunc_GetSize_show FileFunc_GetSize_dir: IfFileExists '$R8\$R7\*.*' 0 FileFunc_GetSize_file IntOp $R5 $R5 + 1 goto FileFunc_GetSize_findnext FileFunc_GetSize_file: StrCpy $R6 0 StrCmp $5$6 '' 0 +3 IntOp $R4 $R4 + 1 goto FileFunc_GetSize_findnext FileOpen $9 '$R8\$R7' r IfErrors +3 FileSeek $9 0 END $R6 FileClose $9 StrCmp $5 '' +2 IntCmp $R6 $5 0 FileFunc_GetSize_findnext StrCmp $6 '' +2 IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext IntOp $R4 $R4 + 1 System::Int64Op $R3 + $R6 Pop $R3 FileFunc_GetSize_findnext: FindNext $0 $R7 IfErrors 0 FileFunc_GetSize_dir FindClose $0 FileFunc_GetSize_show: StrCmp $5$6 '' FileFunc_GetSize_nosize System::Int64Op $R3 / $1 Pop $9 DetailPrint 'Size:$9 $2 Files:$R4 Folders:$R5' goto FileFunc_GetSize_subdir FileFunc_GetSize_nosize: DetailPrint 'Files:$R4 Folders:$R5' FileFunc_GetSize_subdir: StrCmp $7 0 FileFunc_GetSize_preend FindFirst $0 $R7 '$R8\*.*' StrCmp $R7 '.' 0 FileFunc_GetSize_pushdir FindNext $0 $R7 StrCmp $R7 '..' 0 FileFunc_GetSize_pushdir FindNext $0 $R7 IfErrors 0 FileFunc_GetSize_pushdir FindClose $0 StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir FileFunc_GetSize_pushdir: IfFileExists '$R8\$R7\*.*' 0 +3 Push '$R8\$R7' IntOp $8 $8 + 1 FindNext $0 $R7 IfErrors 0 FileFunc_GetSize_pushdir FindClose $0 StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir FileFunc_GetSize_preend: StrCmp $R3 '' FileFunc_GetSize_nosizeend System::Int64Op $R3 / $1 Pop $R3 FileFunc_GetSize_nosizeend: StrCpy $2 $R4 StrCpy $1 $R5 StrCpy $0 $R3 goto FileFunc_GetSize_end FileFunc_GetSize_error: SetErrors StrCpy $0 '' StrCpy $1 '' StrCpy $2 '' FileFunc_GetSize_end: SetDetailsPrint both Pop $R9 Pop $R8 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Exch $2 Exch Exch $1 Exch 2 Exch $0 !verbose pop !macroend !define DriveSpace `!insertmacro DriveSpaceCall` !define un.DriveSpace `!insertmacro DriveSpaceCall` !macro DriveSpace !macroend !macro un.DriveSpace !macroend !macro DriveSpace_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 ClearErrors StrCpy $2 $0 1 -1 StrCmp $2 '\' 0 +3 StrCpy $0 $0 -1 goto -3 IfFileExists '$0\NUL' 0 FileFunc_DriveSpace_error StrCpy $5 '' StrCpy $6 '' FileFunc_DriveSpace_option: StrCpy $2 $1 1 StrCpy $1 $1 '' 1 StrCmp $2 ' ' -2 StrCmp $2 '' FileFunc_DriveSpace_default StrCmp $2 '/' 0 -4 StrCpy $3 -1 IntOp $3 $3 + 1 StrCpy $2 $1 1 $3 StrCmp $2 '' +2 StrCmp $2 '/' 0 -3 StrCpy $4 $1 $3 StrCpy $4 $4 '' 2 StrCpy $2 $4 1 -1 StrCmp $2 ' ' 0 +3 StrCpy $4 $4 -1 goto -3 StrCpy $2 $1 2 StrCpy $1 $1 '' $3 StrCmp $2 'D=' 0 FileFunc_DriveSpace_unit StrCpy $5 $4 StrCmp $5 '' +4 StrCmp $5 'T' +3 StrCmp $5 'O' +2 StrCmp $5 'F' 0 FileFunc_DriveSpace_error goto FileFunc_DriveSpace_option FileFunc_DriveSpace_unit: StrCmp $2 'S=' 0 FileFunc_DriveSpace_error StrCpy $6 $4 goto FileFunc_DriveSpace_option FileFunc_DriveSpace_default: StrCmp $5 '' 0 +2 StrCpy $5 'T' StrCmp $6 '' 0 +3 StrCpy $6 '1' goto FileFunc_DriveSpace_getspace StrCmp $6 'B' 0 +3 StrCpy $6 1 goto FileFunc_DriveSpace_getspace StrCmp $6 'K' 0 +3 StrCpy $6 1024 goto FileFunc_DriveSpace_getspace StrCmp $6 'M' 0 +3 StrCpy $6 1048576 goto FileFunc_DriveSpace_getspace StrCmp $6 'G' 0 FileFunc_DriveSpace_error StrCpy $6 1073741824 FileFunc_DriveSpace_getspace: System::Call 'kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l)i(r0,.r2,.r3,.)' StrCmp $5 T 0 +3 StrCpy $0 $3 goto FileFunc_DriveSpace_getsize StrCmp $5 O 0 +4 System::Int64Op $3 - $2 Pop $0 goto FileFunc_DriveSpace_getsize StrCmp $5 F 0 +2 StrCpy $0 $2 FileFunc_DriveSpace_getsize: System::Int64Op $0 / $6 Pop $0 goto FileFunc_DriveSpace_end FileFunc_DriveSpace_error: SetErrors StrCpy $0 '' FileFunc_DriveSpace_end: Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetDrives `!insertmacro GetDrivesCall` !define un.GetDrives `!insertmacro GetDrivesCall` !macro GetDrives !macroend !macro un.GetDrives !macroend !macro GetDrives_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $8 Push $9 System::StrAlloc 1024 Pop $2 System::Call 'kernel32::GetLogicalDriveStrings(i,i) i(1024, r2)' StrCmp $0 ALL FileFunc_GetDrives_drivestring StrCmp $0 '' 0 FileFunc_GetDrives_typeset StrCpy $0 ALL goto FileFunc_GetDrives_drivestring FileFunc_GetDrives_typeset: StrCpy $6 -1 IntOp $6 $6 + 1 StrCpy $8 $0 1 $6 StrCmp $8$0 '' FileFunc_GetDrives_enumex StrCmp $8 '' +2 StrCmp $8 '+' 0 -4 StrCpy $8 $0 $6 IntOp $6 $6 + 1 StrCpy $0 $0 '' $6 StrCmp $8 'FDD' 0 +3 StrCpy $6 2 goto FileFunc_GetDrives_drivestring StrCmp $8 'HDD' 0 +3 StrCpy $6 3 goto FileFunc_GetDrives_drivestring StrCmp $8 'NET' 0 +3 StrCpy $6 4 goto FileFunc_GetDrives_drivestring StrCmp $8 'CDROM' 0 +3 StrCpy $6 5 goto FileFunc_GetDrives_drivestring StrCmp $8 'RAM' 0 FileFunc_GetDrives_typeset StrCpy $6 6 FileFunc_GetDrives_drivestring: StrCpy $3 $2 FileFunc_GetDrives_enumok: System::Call 'kernel32::lstrlen(t) i(i r3) .r4' StrCmp $4$0 '0ALL' FileFunc_GetDrives_enumex StrCmp $4 0 FileFunc_GetDrives_typeset System::Call 'kernel32::GetDriveType(t) i(i r3) .r5' StrCmp $0 ALL +2 StrCmp $5 $6 FileFunc_GetDrives_letter FileFunc_GetDrives_enumnext StrCmp $5 2 0 +3 StrCpy $8 FDD goto FileFunc_GetDrives_letter StrCmp $5 3 0 +3 StrCpy $8 HDD goto FileFunc_GetDrives_letter StrCmp $5 4 0 +3 StrCpy $8 NET goto FileFunc_GetDrives_letter StrCmp $5 5 0 +3 StrCpy $8 CDROM goto FileFunc_GetDrives_letter StrCmp $5 6 0 FileFunc_GetDrives_enumex StrCpy $8 RAM FileFunc_GetDrives_letter: System::Call '*$3(&t1024 .r9)' Push $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 Push $8 Call $1 Pop $9 Pop $8 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 StrCmp $9 'StopGetDrives' FileFunc_GetDrives_enumex FileFunc_GetDrives_enumnext: IntOp $4 $4 * ${NSIS_CHAR_SIZE} IntOp $3 $3 + $4 IntOp $3 $3 + ${NSIS_CHAR_SIZE} goto FileFunc_GetDrives_enumok FileFunc_GetDrives_enumex: System::Free $2 Pop $9 Pop $8 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !verbose pop !macroend !define GetTime `!insertmacro GetTimeCall` !define un.GetTime `!insertmacro GetTimeCall` !macro GetTime !macroend !macro un.GetTime !macroend !macro GetTime_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 ClearErrors StrCmp $1 'L' FileFunc_GetTime_gettime StrCmp $1 'A' FileFunc_GetTime_getfile StrCmp $1 'C' FileFunc_GetTime_getfile StrCmp $1 'M' FileFunc_GetTime_getfile StrCmp $1 'LS' FileFunc_GetTime_gettime StrCmp $1 'AS' FileFunc_GetTime_getfile StrCmp $1 'CS' FileFunc_GetTime_getfile StrCmp $1 'MS' FileFunc_GetTime_getfile goto FileFunc_GetTime_error FileFunc_GetTime_getfile: IfFileExists $0 0 FileFunc_GetTime_error System::Call '*(i,l,l,l,i,i,i,i,&t260,&t14) p .r6' System::Call 'kernel32::FindFirstFile(t,p)p(r0,r6) .r2' System::Call 'kernel32::FindClose(i)i(r2)' FileFunc_GetTime_gettime: System::Call '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) p .r7' StrCmp $1 'L' 0 FileFunc_GetTime_systemtime System::Call 'kernel32::GetLocalTime(p)i(r7)' goto FileFunc_GetTime_convert FileFunc_GetTime_systemtime: StrCmp $1 'LS' 0 FileFunc_GetTime_filetime System::Call 'kernel32::GetSystemTime(p)i(r7)' goto FileFunc_GetTime_convert FileFunc_GetTime_filetime: System::Call '*$6(i,l,l,l,i,i,i,i,&t260,&t14)p(,.r4,.r3,.r2)' System::Free $6 StrCmp $1 'A' 0 +3 StrCpy $2 $3 goto FileFunc_GetTime_tolocal StrCmp $1 'C' 0 +3 StrCpy $2 $4 goto FileFunc_GetTime_tolocal StrCmp $1 'M' FileFunc_GetTime_tolocal StrCmp $1 'AS' FileFunc_GetTime_tosystem StrCmp $1 'CS' 0 +3 StrCpy $3 $4 goto FileFunc_GetTime_tosystem StrCmp $1 'MS' 0 +3 StrCpy $3 $2 goto FileFunc_GetTime_tosystem FileFunc_GetTime_tolocal: System::Call 'kernel32::FileTimeToLocalFileTime(*l,*l)i(r2,.r3)' FileFunc_GetTime_tosystem: System::Call 'kernel32::FileTimeToSystemTime(*l,i)i(r3,r7)' FileFunc_GetTime_convert: System::Call '*$7(&i2.r5,&i2.r6,&i2.r4,&i2.r0,&i2.r3,&i2.r2,&i2.r1,&i2)' System::Free $7 IntFmt $6 "%.2u" $6 ; Month IntFmt $0 "%.2u" $0 ; Day IntFmt $3 "%.2u" $3 ; Hour IntFmt $2 "%.2u" $2 ; Minute IntFmt $1 "%.2u" $1 ; Second StrCmp $4 0 0 +3 StrCpy $4 Sunday goto FileFunc_GetTime_end StrCmp $4 1 0 +3 StrCpy $4 Monday goto FileFunc_GetTime_end StrCmp $4 2 0 +3 StrCpy $4 Tuesday goto FileFunc_GetTime_end StrCmp $4 3 0 +3 StrCpy $4 Wednesday goto FileFunc_GetTime_end StrCmp $4 4 0 +3 StrCpy $4 Thursday goto FileFunc_GetTime_end StrCmp $4 5 0 +3 StrCpy $4 Friday goto FileFunc_GetTime_end StrCmp $4 6 0 FileFunc_GetTime_error StrCpy $4 Saturday goto FileFunc_GetTime_end FileFunc_GetTime_error: SetErrors StrCpy $0 '' StrCpy $1 '' StrCpy $2 '' StrCpy $3 '' StrCpy $4 '' StrCpy $5 '' StrCpy $6 '' FileFunc_GetTime_end: Pop $7 Exch $6 Exch Exch $5 Exch 2 Exch $4 Exch 3 Exch $3 Exch 4 Exch $2 Exch 5 Exch $1 Exch 6 Exch $0 !verbose pop !macroend !define GetFileAttributes `!insertmacro GetFileAttributesCall` !define un.GetFileAttributes `!insertmacro GetFileAttributesCall` !macro GetFileAttributes !macroend !macro un.GetFileAttributes !macroend !macro GetFileAttributes_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 System::Call 'kernel32::GetFileAttributes(t r0)i .r2' StrCmp $2 -1 FileFunc_GetFileAttributes_error StrCpy $3 '' IntOp $0 $2 & 0x4000 IntCmp $0 0 +2 StrCpy $3 'ENCRYPTED|' IntOp $0 $2 & 0x2000 IntCmp $0 0 +2 StrCpy $3 'NOT_CONTENT_INDEXED|$3' IntOp $0 $2 & 0x1000 IntCmp $0 0 +2 StrCpy $3 'OFFLINE|$3' IntOp $0 $2 & 0x0800 IntCmp $0 0 +2 StrCpy $3 'COMPRESSED|$3' IntOp $0 $2 & 0x0400 IntCmp $0 0 +2 StrCpy $3 'REPARSE_POINT|$3' IntOp $0 $2 & 0x0200 IntCmp $0 0 +2 StrCpy $3 'SPARSE_FILE|$3' IntOp $0 $2 & 0x0100 IntCmp $0 0 +2 StrCpy $3 'TEMPORARY|$3' IntOp $0 $2 & 0x0080 IntCmp $0 0 +2 StrCpy $3 'NORMAL|$3' IntOp $0 $2 & 0x0040 IntCmp $0 0 +2 StrCpy $3 'DEVICE|$3' IntOp $0 $2 & 0x0020 IntCmp $0 0 +2 StrCpy $3 'ARCHIVE|$3' IntOp $0 $2 & 0x0010 IntCmp $0 0 +2 StrCpy $3 'DIRECTORY|$3' IntOp $0 $2 & 0x0004 IntCmp $0 0 +2 StrCpy $3 'SYSTEM|$3' IntOp $0 $2 & 0x0002 IntCmp $0 0 +2 StrCpy $3 'HIDDEN|$3' IntOp $0 $2 & 0x0001 IntCmp $0 0 +2 StrCpy $3 'READONLY|$3' StrCpy $0 $3 -1 StrCmp $1 '' FileFunc_GetFileAttributes_end StrCmp $1 'ALL' FileFunc_GetFileAttributes_end FileFunc_GetFileAttributes_attrcmp: StrCpy $5 0 IntOp $5 $5 + 1 StrCpy $4 $1 1 $5 StrCmp $4 '' +2 StrCmp $4 '|' 0 -3 StrCpy $2 $1 $5 IntOp $5 $5 + 1 StrCpy $1 $1 '' $5 StrLen $3 $2 StrCpy $5 -1 IntOp $5 $5 + 1 StrCpy $4 $0 $3 $5 StrCmp $4 '' FileFunc_GetFileAttributes_notfound StrCmp $4 $2 0 -3 StrCmp $1 '' 0 FileFunc_GetFileAttributes_attrcmp StrCpy $0 1 goto FileFunc_GetFileAttributes_end FileFunc_GetFileAttributes_notfound: StrCpy $0 0 goto FileFunc_GetFileAttributes_end FileFunc_GetFileAttributes_error: SetErrors StrCpy $0 '' FileFunc_GetFileAttributes_end: Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetFileVersion `!insertmacro GetFileVersionCall` !define un.GetFileVersion `!insertmacro GetFileVersionCall` !macro GetFileVersion !macroend !macro un.GetFileVersion !macroend !macro GetFileVersion_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 ClearErrors GetDllVersion '$0' $1 $2 IfErrors FileFunc_GetFileVersion_error IntOp $3 $1 >> 16 IntOp $3 $3 & 0x0000FFFF IntOp $4 $1 & 0x0000FFFF IntOp $5 $2 >> 16 IntOp $5 $5 & 0x0000FFFF IntOp $6 $2 & 0x0000FFFF StrCpy $0 '$3.$4.$5.$6' goto FileFunc_GetFileVersion_end FileFunc_GetFileVersion_error: SetErrors StrCpy $0 '' FileFunc_GetFileVersion_end: Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetExeName `!insertmacro GetExeNameCall` !define un.GetExeName `!insertmacro GetExeNameCall` !macro GetExeName !macroend !macro un.GetExeName !macroend !macro GetExeName_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Push $0 Push $1 Push $2 System::Call 'kernel32::GetModuleFileName(p 0, t.r0, i ${NSIS_MAX_STRLEN})' System::Call 'kernel32::GetLongPathName(t r0, t.r1, i ${NSIS_MAX_STRLEN})i.r2' StrCmp $2 error +2 StrCpy $0 $1 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetExePath `!insertmacro GetExePathCall` !define un.GetExePath `!insertmacro GetExePathCall` !macro GetExePath !macroend !macro un.GetExePath !macroend !macro GetExePath_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Push $0 Push $1 Push $2 StrCpy $0 $EXEDIR System::Call 'kernel32::GetLongPathName(t r0, t.r1, i ${NSIS_MAX_STRLEN})i.r2' StrCmp $2 error +2 StrCpy $0 $1 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetParameters `!insertmacro GetParametersCall` !define un.GetParameters `!insertmacro GetParametersCall` !macro GetParameters !macroend !macro un.GetParameters !macroend !macro GetParameters_ !verbose push !verbose ${_FILEFUNC_VERBOSE} ;cmdline-check StrCmp $CMDLINE "" 0 +3 Push "" Return ;vars Push $0 ;tmp Push $1 ;length Push $2 ;parameter offset Push $3 ;separator ;length/offset StrLen $1 $CMDLINE StrCpy $2 2 ;start with third character ;separator StrCpy $3 $CMDLINE 1 ;first character StrCmp $3 '"' +2 StrCpy $3 ' ' FileFunc_GetParameters_token: ;finding second separator IntCmp $2 $1 FileFunc_GetParameters_strip 0 FileFunc_GetParameters_strip StrCpy $0 $CMDLINE 1 $2 IntOp $2 $2 + 1 StrCmp $3 $0 0 FileFunc_GetParameters_token FileFunc_GetParameters_strip: ;strip white space IntCmp $2 $1 FileFunc_GetParameters_copy 0 FileFunc_GetParameters_copy StrCpy $0 $CMDLINE 1 $2 StrCmp $0 ' ' 0 FileFunc_GetParameters_copy IntOp $2 $2 + 1 Goto FileFunc_GetParameters_strip FileFunc_GetParameters_copy: StrCpy $0 $CMDLINE "" $2 ;strip white spaces from end FileFunc_GetParameters_rstrip: StrCpy $1 $0 1 -1 StrCmp $1 ' ' 0 FileFunc_GetParameters_done StrCpy $0 $0 -1 Goto FileFunc_GetParameters_rstrip FileFunc_GetParameters_done: Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !macro GetOptionsBody _FILEFUNC_S Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 ClearErrors StrCpy $2 $1 '' 1 StrCpy $1 $1 1 StrLen $3 $2 StrCpy $7 0 FileFunc_GetOptions${_FILEFUNC_S}_begin: StrCpy $4 -1 StrCpy $6 '' FileFunc_GetOptions${_FILEFUNC_S}_quote: IntOp $4 $4 + 1 StrCpy $5 $0 1 $4 StrCmp${_FILEFUNC_S} $5$7 '0' FileFunc_GetOptions${_FILEFUNC_S}_notfound StrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_trimright StrCmp${_FILEFUNC_S} $5 '"' 0 +7 StrCmp${_FILEFUNC_S} $6 '' 0 +3 StrCpy $6 '"' goto FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $6 '"' 0 +3 StrCpy $6 '' goto FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $5 `'` 0 +7 StrCmp${_FILEFUNC_S} $6 `` 0 +3 StrCpy $6 `'` goto FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $6 `'` 0 +3 StrCpy $6 `` goto FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $5 '`' 0 +7 StrCmp${_FILEFUNC_S} $6 '' 0 +3 StrCpy $6 '`' goto FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $6 '`' 0 +3 StrCpy $6 '' goto FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $6 '"' FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $6 `'` FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $6 '`' FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $5 $1 0 FileFunc_GetOptions${_FILEFUNC_S}_quote StrCmp${_FILEFUNC_S} $7 0 FileFunc_GetOptions${_FILEFUNC_S}_trimleft FileFunc_GetOptions${_FILEFUNC_S}_trimright FileFunc_GetOptions${_FILEFUNC_S}_trimleft: IntOp $4 $4 + 1 StrCpy $5 $0 $3 $4 StrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_notfound StrCmp${_FILEFUNC_S} $5 $2 0 FileFunc_GetOptions${_FILEFUNC_S}_quote IntOp $4 $4 + $3 StrCpy $0 $0 '' $4 StrCpy $4 $0 1 StrCmp${_FILEFUNC_S} $4 ' ' 0 +3 StrCpy $0 $0 '' 1 goto -3 StrCpy $7 1 goto FileFunc_GetOptions${_FILEFUNC_S}_begin FileFunc_GetOptions${_FILEFUNC_S}_trimright: StrCpy $0 $0 $4 StrCpy $4 $0 1 -1 StrCmp${_FILEFUNC_S} $4 ' ' 0 +3 StrCpy $0 $0 -1 goto -3 StrCpy $3 $0 1 StrCpy $4 $0 1 -1 StrCmp${_FILEFUNC_S} $3 $4 0 FileFunc_GetOptions${_FILEFUNC_S}_end StrCmp${_FILEFUNC_S} $3 '"' +3 StrCmp${_FILEFUNC_S} $3 `'` +2 StrCmp${_FILEFUNC_S} $3 '`' 0 FileFunc_GetOptions${_FILEFUNC_S}_end StrCpy $0 $0 -1 1 goto FileFunc_GetOptions${_FILEFUNC_S}_end FileFunc_GetOptions${_FILEFUNC_S}_notfound: SetErrors StrCpy $0 '' FileFunc_GetOptions${_FILEFUNC_S}_end: Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !macroend !define GetOptions `!insertmacro GetOptionsCall` !define un.GetOptions `!insertmacro GetOptionsCall` !macro GetOptions !macroend !macro un.GetOptions !macroend !macro GetOptions_ !verbose push !verbose ${_FILEFUNC_VERBOSE} !insertmacro GetOptionsBody '' !verbose pop !macroend !define GetOptionsS `!insertmacro GetOptionsSCall` !define un.GetOptionsS `!insertmacro GetOptionsSCall` !macro GetOptionsS !macroend !macro un.GetOptionsS !macroend !macro GetOptionsS_ !verbose push !verbose ${_FILEFUNC_VERBOSE} !insertmacro GetOptionsBody 'S' !verbose pop !macroend !define GetRoot `!insertmacro GetRootCall` !define un.GetRoot `!insertmacro GetRootCall` !macro GetRoot !macroend !macro un.GetRoot !macroend !macro GetRoot_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 Push $3 StrCpy $1 $0 2 StrCmp $1 '\\' FileFunc_GetRoot_UNC StrCpy $2 $1 1 1 StrCmp $2 ':' 0 FileFunc_GetRoot_empty StrCpy $0 $1 goto FileFunc_GetRoot_end FileFunc_GetRoot_UNC: StrCpy $2 1 StrCpy $3 '' FileFunc_GetRoot_loop: IntOp $2 $2 + 1 StrCpy $1 $0 1 $2 StrCmp $1$3 '' FileFunc_GetRoot_empty StrCmp $1 '' +5 StrCmp $1 '\' 0 FileFunc_GetRoot_loop StrCmp $3 '1' +3 StrCpy $3 '1' goto FileFunc_GetRoot_loop StrCpy $0 $0 $2 StrCpy $2 $0 1 -1 StrCmp $2 '\' 0 FileFunc_GetRoot_end FileFunc_GetRoot_empty: StrCpy $0 '' FileFunc_GetRoot_end: Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetParent `!insertmacro GetParentCall` !define un.GetParent `!insertmacro GetParentCall` !macro GetParent !macroend !macro un.GetParent !macroend !macro GetParent_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 StrCpy $2 $0 1 -1 StrCmp $2 '\' 0 +3 StrCpy $0 $0 -1 goto -3 StrCpy $1 0 IntOp $1 $1 - 1 StrCpy $2 $0 1 $1 StrCmp $2 '\' +2 StrCmp $2 '' 0 -3 StrCpy $0 $0 $1 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetFileName `!insertmacro GetFileNameCall` !define un.GetFileName `!insertmacro GetFileNameCall` !macro GetFileName !macroend !macro un.GetFileName !macroend !macro GetFileName_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 StrCpy $2 $0 1 -1 StrCmp $2 '\' 0 +3 StrCpy $0 $0 -1 goto -3 StrCpy $1 0 IntOp $1 $1 - 1 StrCpy $2 $0 1 $1 StrCmp $2 '' FileFunc_GetFileName_end StrCmp $2 '\' 0 -3 IntOp $1 $1 + 1 StrCpy $0 $0 '' $1 FileFunc_GetFileName_end: Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetBaseName `!insertmacro GetBaseNameCall` !define un.GetBaseName `!insertmacro GetBaseNameCall` !macro GetBaseName !macroend !macro un.GetBaseName !macroend !macro GetBaseName_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 Push $3 StrCpy $1 0 StrCpy $3 '' FileFunc_GetBaseName_loop: IntOp $1 $1 - 1 StrCpy $2 $0 1 $1 StrCmp $2 '' FileFunc_GetBaseName_trimpath StrCmp $2 '\' FileFunc_GetBaseName_trimpath StrCmp $3 'noext' FileFunc_GetBaseName_loop StrCmp $2 '.' 0 FileFunc_GetBaseName_loop StrCpy $0 $0 $1 StrCpy $3 'noext' StrCpy $1 0 goto FileFunc_GetBaseName_loop FileFunc_GetBaseName_trimpath: StrCmp $1 -1 FileFunc_GetBaseName_empty IntOp $1 $1 + 1 StrCpy $0 $0 '' $1 goto FileFunc_GetBaseName_end FileFunc_GetBaseName_empty: StrCpy $0 '' FileFunc_GetBaseName_end: Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define GetFileExt `!insertmacro GetFileExtCall` !define un.GetFileExt `!insertmacro GetFileExtCall` !macro GetFileExt !macroend !macro un.GetFileExt !macroend !macro GetFileExt_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 StrCpy $1 0 FileFunc_GetFileExt_loop: IntOp $1 $1 - 1 StrCpy $2 $0 1 $1 StrCmp $2 '' FileFunc_GetFileExt_empty StrCmp $2 '\' FileFunc_GetFileExt_empty StrCmp $2 '.' 0 FileFunc_GetFileExt_loop StrCmp $1 -1 FileFunc_GetFileExt_empty IntOp $1 $1 + 1 StrCpy $0 $0 '' $1 goto FileFunc_GetFileExt_end FileFunc_GetFileExt_empty: StrCpy $0 '' FileFunc_GetFileExt_end: Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define BannerTrimPath `!insertmacro BannerTrimPathCall` !define un.BannerTrimPath `!insertmacro BannerTrimPathCall` !macro BannerTrimPath !macroend !macro un.BannerTrimPath !macroend !macro BannerTrimPath_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 StrCpy $3 $1 1 -1 IntOp $1 $1 + 0 StrLen $2 $0 IntCmp $2 $1 FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_end IntOp $1 $1 - 3 IntCmp $1 0 FileFunc_BannerTrimPath_empty FileFunc_BannerTrimPath_empty StrCmp $3 'A' FileFunc_BannerTrimPath_A-trim StrCmp $3 'B' FileFunc_BannerTrimPath_B-trim StrCmp $3 'C' FileFunc_BannerTrimPath_C-trim StrCmp $3 'D' FileFunc_BannerTrimPath_D-trim FileFunc_BannerTrimPath_A-trim: StrCpy $3 $0 1 1 StrCpy $2 0 StrCmp $3 ':' 0 +2 IntOp $2 $2 + 2 FileFunc_BannerTrimPath_loopleft: IntOp $2 $2 + 1 StrCpy $3 $0 1 $2 StrCmp $2 $1 FileFunc_BannerTrimPath_C-trim StrCmp $3 '\' 0 FileFunc_BannerTrimPath_loopleft StrCpy $3 $0 $2 IntOp $2 $2 - $1 IntCmp $2 0 FileFunc_BannerTrimPath_B-trim 0 FileFunc_BannerTrimPath_B-trim FileFunc_BannerTrimPath_loopright: IntOp $2 $2 + 1 StrCpy $4 $0 1 $2 StrCmp $2 0 FileFunc_BannerTrimPath_B-trim StrCmp $4 '\' 0 FileFunc_BannerTrimPath_loopright StrCpy $4 $0 '' $2 StrCpy $0 '$3\...$4' goto FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_B-trim: StrCpy $2 $1 IntOp $2 $2 - 1 StrCmp $2 -1 FileFunc_BannerTrimPath_C-trim StrCpy $3 $0 1 $2 StrCmp $3 '\' 0 -3 StrCpy $0 $0 $2 StrCpy $0 '$0\...' goto FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_C-trim: StrCpy $0 $0 $1 StrCpy $0 '$0...' goto FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_D-trim: StrCpy $3 -1 IntOp $3 $3 - 1 StrCmp $3 -$2 FileFunc_BannerTrimPath_C-trim StrCpy $4 $0 1 $3 StrCmp $4 '\' 0 -3 StrCpy $4 $0 '' $3 IntOp $3 $1 + $3 IntCmp $3 2 FileFunc_BannerTrimPath_C-trim FileFunc_BannerTrimPath_C-trim StrCpy $0 $0 $3 StrCpy $0 '$0...$4' goto FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_empty: StrCpy $0 '' FileFunc_BannerTrimPath_end: Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define DirState `!insertmacro DirStateCall` !define un.DirState `!insertmacro DirStateCall` !macro DirState !macroend !macro un.DirState !macroend !macro DirState_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 ClearErrors FindFirst $1 $0 '$0\*.*' IfErrors 0 +3 StrCpy $0 -1 goto FileFunc_DirState_end StrCmp $0 '.' 0 +4 FindNext $1 $0 StrCmp $0 '..' 0 +2 FindNext $1 $0 FindClose $1 IfErrors 0 +3 StrCpy $0 0 goto FileFunc_DirState_end StrCpy $0 1 FileFunc_DirState_end: Pop $1 Exch $0 !verbose pop !macroend !define RefreshShellIcons `!insertmacro RefreshShellIconsCall` !define un.RefreshShellIcons `!insertmacro RefreshShellIconsCall` !macro RefreshShellIcons !macroend !macro un.RefreshShellIcons !macroend !macro RefreshShellIcons_ !verbose push !verbose ${_FILEFUNC_VERBOSE} System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)' !verbose pop !macroend !verbose pop !endif nsis-3.11/Include/Integration.nsh000077500000000000000000000023301477201124000167710ustar00rootroot00000000000000!verbose push 3 !ifndef INTEGRATION_INCLUDED !define INTEGRATION_INCLUDED 1 !include "Util.nsh" !define NotifyShell_AssocChanged `System::Call 'SHELL32::SHChangeNotify(i0x8000000,i0,p0,p0)'` ; Notify the shell with SHCNE_ASSOCCHANGED !define UnpinShortcut "!insertmacro UnpinShortcut " !macro UnpinShortcut lnkpath Push "${lnkpath}" ${CallArtificialFunction} UnpinShortcut_Implementation !macroend !macro UnpinShortcut_Implementation !include "LogicLib.nsh" !include "Win\COM.nsh" Exch $0 Push $1 !insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r1 "" ${If} $1 P<> 0 System::Call 'SHELL32::SHCreateItemFromParsingName(wr0,p0,g"${IID_IShellItem}",*p0r0)' ${If} $0 P<> 0 ${IStartMenuPinnedList::RemoveFromList} $1 '(r0)' ${IUnknown::Release} $0 "" ${EndIf} ${IUnknown::Release} $1 "" !ifdef NSIS_IX86 | NSIS_AMD64 ${Else} !insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} "{ec35e37a-6579-4f3c-93cd-6e62c4ef7636}" r1 "" ${If} $1 P<> 0 ExecShellWait /INVOKEIDLIST "unpin" $0 ; WinXP ${IUnknown::Release} $1 "" ${EndIf} !endif ${EndIf} Pop $1 Pop $0 !macroend !endif #!INCLUDED !verbose pop nsis-3.11/Include/LangFile.nsh000077500000000000000000000125661477201124000162030ustar00rootroot00000000000000/* LangFile.nsh Header file to create language files that can be included with a single command. Copyright 2008-2025 Joost Verburg, Anders Kjersem * Either LANGFILE_INCLUDE or LANGFILE_INCLUDE_WITHDEFAULT can be called from the script to include a language file. - LANGFILE_INCLUDE takes the language file name as parameter. - LANGFILE_INCLUDE_WITHDEFAULT takes as additional second parameter, the default language file to load missing strings from. * Language strings in the language file have the format: ${LangFileString} LANGSTRING_NAME "Text" * There are two types of language header files: - NSIS multi-lang support; these must start with the LANGFILE macro and provide strings for features like MUI and MultiUser. If you are adding support for a new language to NSIS you should make a copy of English.nsh and translate this .nsh along with the .nlf. - Custom installer strings; these must start with the LANGFILE_EXT macro and contain translated versions of custom strings used in a particular installer. This is useful if you want to put the translations for each language in their own separate file. * Example: ; Setup.nsi !include "MUI.nsh" !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_LANGUAGE "Danish" !insertmacro LANGFILE_INCLUDE "DanishExtra.nsh" !insertmacro MUI_LANGUAGE "Swedish" !insertmacro LANGFILE_INCLUDE "SwedishExtra.nsh" Section MessageBox MB_OK "$(myCustomString)" SectionEnd ; SwedishExtra.nsh !insertmacro LANGFILE_EXT Swedish ${LangFileString} myCustomString "Bork bork" */ !ifndef LANGFILE_INCLUDED !define LANGFILE_INCLUDED !macro LANGFILE_INCLUDE FILENAME ;Called from script: include a language file !ifdef LangFileString !undef LangFileString !endif !define LangFileString "!insertmacro LANGFILE_SETSTRING" !define LANGFILE_SETNAMES !include "${FILENAME}" !undef LANGFILE_SETNAMES ;Create language strings !define /redef LangFileString "!insertmacro LANGFILE_LANGSTRING" !include "${FILENAME}" !macroend !macro LANGFILE_INCLUDE_WITHDEFAULT FILENAME FILENAME_DEFAULT ;Called from script: include a language file ;Obtains missing strings from a default file !ifdef LangFileString !undef LangFileString !endif !define LangFileString "!insertmacro LANGFILE_SETSTRING" !define LANGFILE_SETNAMES !include "${FILENAME}" !undef LANGFILE_SETNAMES ;Include default language for missing strings !define LANGFILE_PRIV_INCLUDEISFALLBACK "${FILENAME_DEFAULT}" !include "${FILENAME_DEFAULT}" !undef LANGFILE_PRIV_INCLUDEISFALLBACK ;Create language strings !define /redef LangFileString "!insertmacro LANGFILE_LANGSTRING" !include "${FILENAME_DEFAULT}" !macroend !macro LANGFILE NLFID ENGNAME NATIVENAME NATIVEASCIINAME ;Start of standard NSIS language file ; NLFID: Must match the name of the .nlf file ; ENGNAME: English name of language, "=" if it is the same as NLFID ; NATIVENAME: Native name of language. (In Unicode) ; NATIVEASCIINAME: Native name of language using only ASCII, "=" if it is the same as NATIVENAME ; Example: LANGFILE "Swedish" = "Svenska" = (This is the same as LANGFILE "Swedish" "Swedish" "Svenska" "Svenska") ; For more examples, see French.nsh, Greek.nsh and PortugueseBR.nsh !ifdef LANGFILE_SETNAMES !ifdef LANGFILE_IDNAME !undef LANGFILE_IDNAME !endif !define LANGFILE_IDNAME "${NLFID}" ; ModernUI or the .nsi can change LANGFILE_LANGDLL_FMT if desired !ifndef LANGFILE_LANGDLL_FMT !ifndef NSIS_UNICODE !define LANGFILE_LANGDLL_FMT "%ENGNAME% / %NATIVEASCIINAME%" !endif !define /ifndef LANGFILE_LANGDLL_FMT "%NATIVENAME%" !endif !ifndef "LANGFILE_${NLFID}_NAME" !if "${ENGNAME}" == "=" !define /redef ENGNAME "${NLFID}" !endif !if "${NATIVEASCIINAME}" == "=" !define /redef NATIVEASCIINAME "${NATIVENAME}" !endif !define "LANGFILE_${NLFID}_ENGLISHNAME" "${ENGNAME}" !ifdef NSIS_UNICODE !define "LANGFILE_${NLFID}_NAME" "${NATIVENAME}" !else !define "LANGFILE_${NLFID}_NAME" "${NATIVEASCIINAME}" !endif !searchreplace LANGFILE_${NLFID}_LANGDLL "${LANGFILE_LANGDLL_FMT}" %NATIVEASCIINAME% "${NATIVEASCIINAME}" !searchreplace LANGFILE_${NLFID}_LANGDLL "${LANGFILE_${NLFID}_LANGDLL}" %NATIVENAME% "${NATIVENAME}" !searchreplace LANGFILE_${NLFID}_LANGDLL "${LANGFILE_${NLFID}_LANGDLL}" %ENGNAME% "${ENGNAME}" !endif !endif !macroend !macro LANGFILE_EXT IDNAME ;Start of installer language file !ifdef LANGFILE_SETNAMES !ifdef LANGFILE_IDNAME !undef LANGFILE_IDNAME !endif !define LANGFILE_IDNAME "${IDNAME}" !endif !macroend !macro LANGFILE_SETSTRING NAME VALUE ;Set define with translated string !ifndef ${NAME} !define "${NAME}" "${VALUE}" !ifdef LANGFILE_PRIV_INCLUDEISFALLBACK !warning 'LangString "${NAME}" for language ${LANGFILE_IDNAME} is missing, using fallback from "${LANGFILE_PRIV_INCLUDEISFALLBACK}"' !endif !endif !macroend !macro LANGFILE_LANGSTRING NAME DUMMY ;Create a language string from a define and undefine LangString "${NAME}" "${LANG_${LANGFILE_IDNAME}}" "${${NAME}}" !undef "${NAME}" !macroend !endif nsis-3.11/Include/Library.nsh000077500000000000000000000524311477201124000161210ustar00rootroot00000000000000# # Library.nsh # # A system for the installation and uninstallation of dynamic # link libraries (DLL) and type libraries (TLB). Using this # system you can handle the complete setup with one single # line of code: # # * File copying # * File copying on reboot # * Version checks # * Registration and unregistration # * Registration and unregistration on reboot # * Shared DLL counting # * Windows File Protection checks # # For more information, read appendix B in the documentation. # !verbose push !verbose 3 !ifndef LIB_INCLUDED !define LIB_INCLUDED !ifndef SHCNE_ASSOCCHANGED !define SHCNE_ASSOCCHANGED 0x08000000 !endif !ifndef SHCNF_IDLIST !define SHCNF_IDLIST 0x0000 !endif !define REGTOOL_VERSION v3 !define REGTOOL_KEY NSIS.Library.RegTool.${REGTOOL_VERSION} !include LogicLib.nsh !include x64.nsh ### GetParent macro, don't pass $1 or $2 as INPUT or OUTPUT !macro __InstallLib_Helper_GetParent INPUT OUTPUT # Copied from FileFunc.nsh StrCpy ${OUTPUT} ${INPUT} Push $1 Push $2 StrCpy $2 ${OUTPUT} 1 -1 StrCmp $2 '\' 0 +3 StrCpy ${OUTPUT} ${OUTPUT} -1 goto -3 StrCpy $1 0 IntOp $1 $1 - 1 StrCpy $2 ${OUTPUT} 1 $1 StrCmp $2 '\' +2 StrCmp $2 '' 0 -3 StrCpy ${OUTPUT} ${OUTPUT} $1 Pop $2 Pop $1 !macroend ### Initialize session id (GUID) !macro __InstallLib_Helper_InitSession !ifndef __InstallLib_SessionGUID_Defined !define __InstallLib_SessionGUID_Defined Var /GLOBAL __INSTALLLLIB_SESSIONGUID !endif !define __InstallLib_Helper_InitSession_Label "Library_${__FILE__}${__LINE__}" StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 "${__InstallLib_Helper_InitSession_Label}" System::Call 'ole32::CoCreateGuid(g .s)' Pop $__INSTALLLLIB_SESSIONGUID "${__InstallLib_Helper_InitSession_Label}:" !undef __InstallLib_Helper_InitSession_Label !macroend ### Add a RegTool entry to register after reboot !macro __InstallLib_Helper_AddRegToolEntry mode filename tempdir Push $R0 Push $R1 Push $R2 Push $R3 ;------------------------ ;Copy the parameters Push "${filename}" Push "${tempdir}" Pop $R2 ; temporary directory Pop $R1 ; file name to register ;------------------------ ;Initialize session id !insertmacro __InstallLib_Helper_InitSession ;------------------------ ;Advance counter StrCpy $R0 0 ReadRegDWORD $R0 HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" IntOp $R0 $R0 + 1 WriteRegDWORD HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" "$R0" ;------------------------ ;Setup RegTool !if ! /FileExists "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" !error "Missing RegTool for ${NSIS_CPU}!" !endif ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "${REGTOOL_KEY}" StrCpy $R3 $R3 -4 1 IfFileExists $R3 +3 File /oname=$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ "${REGTOOL_KEY}" '"$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe" /S' ;------------------------ ;Add RegTool entry WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.file" "$R1" WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.mode" "${mode}" Pop $R3 Pop $R2 Pop $R1 Pop $R0 !macroend !macro __InstallLib_Helper_CmpPackedVer64 oldhi oldlo newhi newlo jeq jle jgt IntCmpU ${oldhi} ${newhi} "0" "${jle}" "${jgt}" IntCmpU ${oldlo} ${newlo} "${jeq}" "${jle}" "${jgt}" !macroend ### Get library version !macro __InstallLib_Helper_GetVersion TYPE FILE !if "${TYPE}" == "D" !getdllversion /NoErrors /Packed "${FILE}" LIBRARY_VERSION_ !else if "${TYPE}" == "T" !gettlbversion /NoErrors /Packed "${FILE}" LIBRARY_VERSION_ !endif ; Emulate the old LibraryLocal defines !ifndef LIBRARY_VERSION_HIGH !define LIBRARY_VERSION_FILENOTFOUND !else if "${LIBRARY_VERSION_HIGH}" == "" !define LIBRARY_VERSION_NONE !undef LIBRARY_VERSION_HIGH !undef LIBRARY_VERSION_LOW !endif !macroend ### Install library !macro InstallLib libtype shared install localfile destfile tempbasedir !verbose push !verbose 3 Push $R0 Push $R1 Push $R2 Push $R3 Push $R4 Push $R5 ;------------------------ ;Define !define INSTALLLIB_UNIQUE "${__FILE__}${__LINE__}" !define INSTALLLIB_LIBTYPE_${libtype} !define INSTALLLIB_LIBTYPE_SET INSTALLLIB_LIBTYPE_${libtype} !define INSTALLLIB_SHARED_${shared} !define INSTALLLIB_SHARED_SET INSTALLLIB_SHARED_${shared} !define INSTALLLIB_INSTALL_${install} !define INSTALLLIB_INSTALL_SET INSTALLLIB_INSTALL_${install} ;------------------------ ;Validate !ifndef INSTALLLIB_LIBTYPE_DLL & INSTALLLIB_LIBTYPE_REGDLL & INSTALLLIB_LIBTYPE_TLB & \ INSTALLLIB_LIBTYPE_REGDLLTLB & INSTALLLIB_LIBTYPE_REGEXE !error "InstallLib: Incorrect setting for parameter: libtype" !endif !ifndef INSTALLLIB_INSTALL_REBOOT_PROTECTED & INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED & \ INSTALLLIB_INSTALL_NOREBOOT_PROTECTED & INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED !error "InstallLib: Incorrect setting for parameter: install" !endif ;------------------------ ;x64 settings !ifdef LIBRARY_X64 ${DisableX64FSRedirection} !endif ;------------------------ ;Copy the parameters used on run-time to a variable ;This allows the usage of variables as parameter StrCpy $R4 "${destfile}" StrCpy $R5 "${tempbasedir}" ;------------------------ ;Shared library count !ifndef INSTALLLIB_SHARED_NOTSHARED StrCmp ${shared} "" 0 "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}" !ifdef LIBRARY_X64 SetRegView 64 !endif ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 ClearErrors IntOp $R0 $R0 + 1 WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 $R0 !ifdef LIBRARY_X64 SetRegView lastused !endif "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}:" !endif ;------------------------ ;Check Windows File Protection !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_PROTECTED !define LIBRARY_DEFINE_DONE_LABEL System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0" StrCmp $R0 "error" "installlib.notprotected_${INSTALLLIB_UNIQUE}" StrCmp $R0 "0" "installlib.notprotected_${INSTALLLIB_UNIQUE}" Goto "installlib.done_${INSTALLLIB_UNIQUE}" "installlib.notprotected_${INSTALLLIB_UNIQUE}:" !endif ;------------------------ ;Check file IfFileExists $R4 0 "installlib.copy_${INSTALLLIB_UNIQUE}" ;------------------------ ;Get version information !ifndef LIBRARY_IGNORE_VERSION !insertmacro __InstallLib_Helper_GetVersion D "${LOCALFILE}" !ifdef LIBRARY_VERSION_FILENOTFOUND !error "InstallLib: The library ${LOCALFILE} could not be found." !endif !ifndef LIBRARY_VERSION_NONE !define LIBRARY_DEFINE_UPGRADE_LABEL !define LIBRARY_DEFINE_REGISTER_LABEL StrCpy $R0 ${LIBRARY_VERSION_HIGH} StrCpy $R1 ${LIBRARY_VERSION_LOW} GetDLLVersion $R4 $R2 $R3 !undef LIBRARY_VERSION_HIGH !undef LIBRARY_VERSION_LOW !ifndef INSTALLLIB_LIBTYPE_TLB & INSTALLLIB_LIBTYPE_REGDLLTLB !ifdef LIBRARY_INSTALL_EQUAL_VERSION !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.upgrade_${INSTALLLIB_UNIQUE}" \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !else !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !endif !else !insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}" !ifdef LIBRARY_VERSION_FILENOTFOUND !error "InstallLib: The library ${LOCALFILE} could not be found." !endif !ifndef LIBRARY_VERSION_NONE !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 0 \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !else !ifdef LIBRARY_INSTALL_EQUAL_VERSION !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.upgrade_${INSTALLLIB_UNIQUE}" \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !else !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !endif !endif !endif !else !undef LIBRARY_VERSION_NONE !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB !insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}" !endif !endif !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB !ifndef LIBRARY_VERSION_NONE !ifndef LIBRARY_DEFINE_UPGRADE_LABEL !define LIBRARY_DEFINE_UPGRADE_LABEL !endif !ifndef LIBRARY_DEFINE_REGISTER_LABEL !define LIBRARY_DEFINE_REGISTER_LABEL !endif StrCpy $R0 ${LIBRARY_VERSION_HIGH} StrCpy $R1 ${LIBRARY_VERSION_LOW} TypeLib::GetLibVersion $R4 Pop $R3 Pop $R2 !ifdef LIBRARY_INSTALL_EQUAL_VERSION !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.upgrade_${INSTALLLIB_UNIQUE}" \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !else !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" \ "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" !endif !undef LIBRARY_VERSION_HIGH !undef LIBRARY_VERSION_LOW !else !undef LIBRARY_VERSION_NONE !endif !endif !endif ;~LIBRARY_IGNORE_VERSION ;------------------------ ;Upgrade !ifdef LIBRARY_DEFINE_UPGRADE_LABEL !undef LIBRARY_DEFINE_UPGRADE_LABEL "installlib.upgrade_${INSTALLLIB_UNIQUE}:" !endif ;------------------------ ;Copy !ifdef INSTALLLIB_INSTALL_NOREBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED "installlib.copy_${INSTALLLIB_UNIQUE}:" StrCpy $R0 $R4 Call ":installlib.file_${INSTALLLIB_UNIQUE}" !else !ifndef LIBRARY_DEFINE_REGISTER_LABEL !define LIBRARY_DEFINE_REGISTER_LABEL !endif !ifndef LIBRARY_DEFINE_DONE_LABEL !define LIBRARY_DEFINE_DONE_LABEL !endif ClearErrors StrCpy $R0 $R4 Call ":installlib.file_${INSTALLLIB_UNIQUE}" IfErrors 0 "installlib.register_${INSTALLLIB_UNIQUE}" SetOverwrite lastused ;------------------------ ;Copy on reboot GetTempFileName $R0 $R5 Call ":installlib.file_${INSTALLLIB_UNIQUE}" Rename /REBOOTOK $R0 $R4 ;------------------------ ;Register on reboot Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}" Goto "installlib.done_${INSTALLLIB_UNIQUE}" "installlib.copy_${INSTALLLIB_UNIQUE}:" StrCpy $R0 $R4 Call ":installlib.file_${INSTALLLIB_UNIQUE}" !endif ;------------------------ ;Register !ifdef LIBRARY_DEFINE_REGISTER_LABEL !undef LIBRARY_DEFINE_REGISTER_LABEL "installlib.register_${INSTALLLIB_UNIQUE}:" !endif !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB | INSTALLLIB_LIBTYPE_REGEXE !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED IfRebootFlag 0 "installlib.regnoreboot_${INSTALLLIB_UNIQUE}" Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}" Goto "installlib.registerfinish_${INSTALLLIB_UNIQUE}" "installlib.regnoreboot_${INSTALLLIB_UNIQUE}:" !endif !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB TypeLib::Register $R4 !endif !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB !ifndef LIBRARY_X64 RegDll $R4 !else ExecWait '"$SYSDIR\regsvr32.exe" /s "$R4"' !endif !endif !ifdef INSTALLLIB_LIBTYPE_REGEXE ExecWait '"$R4" /regserver' !endif !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED "installlib.registerfinish_${INSTALLLIB_UNIQUE}:" !endif !endif !ifdef LIBRARY_SHELL_EXTENSION System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' !endif !ifdef LIBRARY_COM System::Call 'Ole32::CoFreeUnusedLibraries()' !endif ;------------------------ ;Done !ifdef LIBRARY_DEFINE_DONE_LABEL !undef LIBRARY_DEFINE_DONE_LABEL "installlib.done_${INSTALLLIB_UNIQUE}:" !endif Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Pop $R0 ;------------------------ ;End Goto "installlib.end_${INSTALLLIB_UNIQUE}" ;------------------------ ;Extract !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED SetOverwrite try !else SetOverwrite on !endif "installlib.file_${INSTALLLIB_UNIQUE}:" SetFileAttributes $R0 FILE_ATTRIBUTE_NORMAL ClearErrors File /oname=$R0 "${LOCALFILE}" Return SetOverwrite lastused ;------------------------ ;Register on reboot !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED "installlib.regonreboot_${INSTALLLIB_UNIQUE}:" !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB !ifndef LIBRARY_X64 !insertmacro __InstallLib_Helper_AddRegToolEntry 'D' "$R4" "$R5" !else !insertmacro __InstallLib_Helper_AddRegToolEntry 'DX' "$R4" "$R5" !endif !endif !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB !insertmacro __InstallLib_Helper_AddRegToolEntry 'T' "$R4" "$R5" !endif !ifdef INSTALLLIB_LIBTYPE_REGEXE !insertmacro __InstallLib_Helper_AddRegToolEntry 'E' "$R4" "$R5" !endif Return !endif ;------------------------ ;End label "installlib.end_${INSTALLLIB_UNIQUE}:" !ifdef LIBRARY_X64 ${EnableX64FSRedirection} !endif ;------------------------ ;Undefine !undef INSTALLLIB_UNIQUE !undef ${INSTALLLIB_LIBTYPE_SET} !undef INSTALLLIB_LIBTYPE_SET !undef ${INSTALLLIB_SHARED_SET} !undef INSTALLLIB_SHARED_SET !undef ${INSTALLLIB_INSTALL_SET} !undef INSTALLLIB_INSTALL_SET !verbose pop !macroend ### Uninstall library !macro UnInstallLib libtype shared uninstall file !verbose push !verbose 3 Push $R0 Push $R1 ;------------------------ ;Define !define UNINSTALLLIB_UNIQUE "${__FILE__}${__LINE__}" !define UNINSTALLLIB_LIBTYPE_${libtype} !define UNINSTALLLIB_LIBTYPE_SET UNINSTALLLIB_LIBTYPE_${libtype} !define UNINSTALLLIB_SHARED_${shared} !define UNINSTALLLIB_SHARED_SET UNINSTALLLIB_SHARED_${shared} !define UNINSTALLLIB_UNINSTALL_${uninstall} !define UNINSTALLLIB_UNINSTALL_SET UNINSTALLLIB_UNINSTALL_${uninstall} ;------------------------ ;Validate !ifndef UNINSTALLLIB_LIBTYPE_DLL & UNINSTALLLIB_LIBTYPE_REGDLL & UNINSTALLLIB_LIBTYPE_TLB & \ UNINSTALLLIB_LIBTYPE_REGDLLTLB & UNINSTALLLIB_LIBTYPE_REGEXE !error "UnInstallLib: Incorrect setting for parameter: libtype" !endif !ifndef UNINSTALLLIB_SHARED_NOTSHARED & UNINSTALLLIB_SHARED_SHARED !error "UnInstallLib: Incorrect setting for parameter: shared" !endif !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE & UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED & \ UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED & UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED & \ UNINSTALLLIB_UNINSTALL_NOREBOOT_NOTPROTECTED !error "UnInstallLib: Incorrect setting for parameter: uninstall" !endif ;------------------------ ;x64 settings !ifdef LIBRARY_X64 ${DisableX64FSRedirection} !endif ;------------------------ ;Copy the parameters used on run-time to a variable ;This allows the usage of variables as parameter StrCpy $R1 "${file}" ;------------------------ ;Shared library count !ifdef UNINSTALLLIB_SHARED_SHARED !define UNINSTALLLIB_DONE_LABEL !ifdef LIBRARY_X64 SetRegView 64 !endif ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 StrCmp $R0 "" "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}" IntOp $R0 $R0 - 1 IntCmp $R0 0 "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" \ "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}" "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}:" DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 !ifndef UNINSTALLLIB_SHARED_SHAREDNOREMOVE Goto "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}" !endif "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}:" WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 $R0 !ifdef LIBRARY_X64 SetRegView lastused !endif Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}" "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}:" !ifdef LIBRARY_X64 SetRegView lastused !endif !endif ;------------------------ ;Remove !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE ;------------------------ ;Check Windows File Protection !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED !ifndef UNINSTALLLIB_DONE_LABEL !define UNINSTALLLIB_DONE_LABEL !endif System::Call "sfc::SfcIsFileProtected(i 0, w $R1) i.R0" StrCmp $R0 "error" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}" StrCmp $R0 "0" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}" Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}:" !endif ;------------------------ ;Unregister !ifdef UNINSTALLLIB_LIBTYPE_REGDLL | UNINSTALLLIB_LIBTYPE_REGDLLTLB !ifndef LIBRARY_X64 UnRegDLL $R1 !else ExecWait '"$SYSDIR\regsvr32.exe" /s /u "$R1"' !endif !endif !ifdef UNINSTALLLIB_LIBTYPE_REGEXE ExecWait '"$R1" /unregserver' !endif !ifdef UNINSTALLLIB_LIBTYPE_TLB | UNINSTALLLIB_LIBTYPE_REGDLLTLB TypeLib::UnRegister $R1 !endif !ifdef LIBRARY_SHELL_EXTENSION System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' !endif !ifdef LIBRARY_COM System::Call 'Ole32::CoFreeUnusedLibraries()' !endif ;------------------------ ;Delete Delete $R1 !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED ${If} ${FileExists} $R1 # File is in use, can't just delete. # Move file to another location before using Delete /REBOOTOK. This way, if # the user installs a new version of the DLL, it won't be deleted after # reboot. See bug #1097642 for more information on this. # Try moving to $TEMP. GetTempFileName $R0 Delete $R0 Rename $R1 $R0 ${If} ${FileExists} $R1 # Still here, delete temporary file, in case the file was copied # and not deleted. This happens when moving from network drives, # for example. Delete $R0 # Try moving to directory containing the file. !insertmacro __InstallLib_Helper_GetParent $R1 $R0 GetTempFileName $R0 $R0 Delete $R0 Rename $R1 $R0 ${If} ${FileExists} $R1 # Still here, delete temporary file. Delete $R0 # Give up moving, simply Delete /REBOOTOK the file. StrCpy $R0 $R1 ${EndIf} ${EndIf} # Delete the moved file. Delete /REBOOTOK $R0 ${EndIf} !endif !endif ;------------------------ ;Done !ifdef UNINSTALLLIB_DONE_LABEL !undef UNINSTALLLIB_DONE_LABEL "uninstalllib.done_${UNINSTALLLIB_UNIQUE}:" !endif !ifdef LIBRARY_X64 ${EnableX64FSRedirection} !endif Pop $R1 Pop $R0 ;------------------------ ;Undefine !undef UNINSTALLLIB_UNIQUE !undef ${UNINSTALLLIB_LIBTYPE_SET} !undef UNINSTALLLIB_LIBTYPE_SET !undef ${UNINSTALLLIB_SHARED_SET} !undef UNINSTALLLIB_SHARED_SET !undef ${UNINSTALLLIB_UNINSTALL_SET} !undef UNINSTALLLIB_UNINSTALL_SET !verbose pop !macroend !endif !verbose pop nsis-3.11/Include/LogicLib.nsh000077500000000000000000001026561477201124000162060ustar00rootroot00000000000000; NSIS LOGIC LIBRARY - LogicLib.nsh ; Version 2.6 - 08/12/2007 ; By dselkirk@hotmail.com ; and eccles@users.sf.net ; with IfNot support added by Message ; ; Questions/Comments - ; See http://forums.winamp.com/showthread.php?s=&postid=1116241 ; ; Description: ; Provides the use of various logic statements within NSIS. ; ; Usage: ; The following "statements" are available: ; If|IfNot|Unless..{ElseIf|ElseIfNot|ElseUnless}..[Else]..EndIf|EndUnless ; - Conditionally executes a block of statements, depending on the value ; of an expression. IfNot and Unless are equivalent and ; interchangeable, as are ElseIfNot and ElseUnless. ; AndIf|AndIfNot|AndUnless|OrIf|OrIfNot|OrUnless ; - Adds any number of extra conditions to If, IfNot, Unless, ElseIf, ; ElseIfNot and ElseUnless statements. ; IfThen|IfNotThen..|..| ; - Conditionally executes an inline statement, depending on the value ; of an expression. ; IfCmd..||..| ; - Conditionally executes an inline statement, depending on a true ; value of the provided NSIS function. ; Select..{Case[2|3|4|5]}..[CaseElse|Default]..EndSelect ; - Executes one of several blocks of statements, depending on the value ; of an expression. ; Switch..{Case|CaseElse|Default}..EndSwitch ; - Jumps to one of several labels, depending on the value of an ; expression. ; Do[While|Until]..{ExitDo|Continue|Break}..Loop[While|Until] ; - Repeats a block of statements until stopped, or depending on the ; value of an expression. ; While..{ExitWhile|Continue|Break}..EndWhile ; - An alias for DoWhile..Loop (for backwards-compatibility) ; For[Each]..{ExitFor|Continue|Break}..Next ; - Repeats a block of statements varying the value of a variable. ; ; The following "expressions" are available: ; Standard (built-in) string tests (which are case-insensitive): ; a == b; a != b ; Additional case-insensitive string tests (using System.dll): ; a S< b; a S>= b; a S> b; a S<= b ; Case-sensitive string tests: ; a S== b; a S!= b ; Standard (built-in) signed integer tests: ; a = b; a <> b; a < b; a >= b; a > b; a <= b; a & b ; Standard (built-in) unsigned integer tests: ; a U< b; a U>= b; a U> b; a U<= b ; 64-bit integer tests (using System.dll): ; a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b ; ptrdiff_t integer tests ; a P= b; a P<> b; a P< b; a P>= b; a P> b; a P<= b ; size_t integer tests ; a Z= b; a Z<> b; a Z< b; a Z>= b; a Z> b; a Z<= b ; Built-in NSIS flag tests: ; ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}; ${RtlLanguage}; ; ${ShellVarContextAll} ; Built-in NSIS other tests: ; ${FileExists} a ; Any conditional NSIS instruction test: ; ${Cmd} a ; Section flag tests: ; ${SectionIsSelected} a; ${SectionIsSectionGroup} a; ; ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a; ; ${SectionIsReadOnly} a; ${SectionIsExpanded} a; ; ${SectionIsPartiallySelected} a ; Additional tests: ; HK RegKeyIsEmpty SubKey ; ; Examples: ; See LogicLib.nsi in the Examples folder for lots of example usage. !verbose push !verbose 3 !ifndef LOGICLIB_VERBOSITY !define LOGICLIB_VERBOSITY 3 !endif !define _LOGICLIB_VERBOSITY ${LOGICLIB_VERBOSITY} !undef LOGICLIB_VERBOSITY !verbose ${_LOGICLIB_VERBOSITY} !ifndef LOGICLIB !define LOGICLIB !define | "'" !define || "' '" !define LOGICLIB_COUNTER 0 !include Sections.nsh !macro _LOGICLIB_TEMP !ifndef _LOGICLIB_TEMP !define _LOGICLIB_TEMP Var /GLOBAL _LOGICLIB_TEMP ; Temporary variable to aid the more elaborate logic tests !endif !macroend !macro LogicLib_JumpToBranch _Jump _Skip !if `${_Jump}${_Skip}` != `` StrCmp "" "" `${_Jump}` ${_Skip} !endif !macroend !macro _IncreaseCounter !define /redef /math LOGICLIB_COUNTER `${LOGICLIB_COUNTER}` + 1 !macroend !macro _PushLogic !insertmacro _PushScope Logic _LogicLib_Label_${LOGICLIB_COUNTER} !insertmacro _IncreaseCounter !macroend !macro _PopLogic !insertmacro _PopScope Logic !macroend !macro _PushScope Type label !ifdef _${Type} ; If we already have a statement !define _Cur${Type} ${_${Type}} !undef _${Type} !define _${Type} ${label} !define ${_${Type}}Prev${Type} ${_Cur${Type}} ; Save the current logic !undef _Cur${Type} !else !define _${Type} ${label} ; Initialise for first statement !endif !macroend !macro _PopScope Type !ifndef _${Type} !error "Cannot use _Pop${Type} without a preceding _Push${Type}" !endif !ifdef ${_${Type}}Prev${Type} ; If a previous statement was active then restore it !define _Cur${Type} ${_${Type}} !undef _${Type} !define _${Type} ${${_Cur${Type}}Prev${Type}} !undef ${_Cur${Type}}Prev${Type} !undef _Cur${Type} !else !undef _${Type} !endif !macroend !macro _LogicLib_AlwaysTrue _a _b _t _f !insertmacro LogicLib_JumpToBranch `${_t}` `${_f}` !macroend !macro _LogicLib_AlwaysFalse _a _b _t _f !insertmacro LogicLib_JumpToBranch `${_f}` `${_t}` !macroend ; String tests !macro _== _a _b _t _f StrCmp `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _!= _a _b _t _f !insertmacro _== `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Case-sensitive string tests !macro _S== _a _b _t _f StrCmpS `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _S!= _a _b _t _f !insertmacro _S== `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Extra string tests (cannot do these case-sensitively - I tried and lstrcmp still ignored the case) !macro _StrCmpI _a _b _e _l _m !insertmacro _LOGICLIB_TEMP System::Call `kernel32::lstrcmpi(ts, ts) i.s` `${_a}` `${_b}` Pop $_LOGICLIB_TEMP IntCmp $_LOGICLIB_TEMP 0 `${_e}` `${_l}` `${_m}` !macroend !macro _S< _a _b _t _f !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _S>= _a _b _t _f !insertmacro _S< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _S> _a _b _t _f !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _S<= _a _b _t _f !insertmacro _S> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Integer tests !macro _= _a _b _t _f IntCmp `${_a}` `${_b}` `${_t}` `${_f}` `${_f}` !macroend !macro _<> _a _b _t _f !insertmacro _= `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _< _a _b _t _f IntCmp `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _>= _a _b _t _f !insertmacro _< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _> _a _b _t _f IntCmp `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _<= _a _b _t _f !insertmacro _> `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _& _a _b _t _f !insertmacro _LOGICLIB_TEMP IntOp $_LOGICLIB_TEMP `${_a}` & `${_b}` !insertmacro _<> $_LOGICLIB_TEMP 0 `${_t}` `${_f}` !macroend ; Unsigned integer tests (NB: no need for extra equality tests) !macro _U< _a _b _t _f IntCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _U>= _a _b _t _f !insertmacro _U< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _U> _a _b _t _f IntCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _U<= _a _b _t _f !insertmacro _U> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Int64 tests !macro _Int64Cmp _a _o _b _t _f !insertmacro _LOGICLIB_TEMP System::Int64Op `${_a}` `${_o}` `${_b}` Pop $_LOGICLIB_TEMP !insertmacro _= $_LOGICLIB_TEMP 0 `${_f}` `${_t}` !macroend !macro _L= _a _b _t _f !insertmacro _Int64Cmp `${_a}` = `${_b}` `${_t}` `${_f}` !macroend !macro _L<> _a _b _t _f !insertmacro _L= `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _L< _a _b _t _f !insertmacro _Int64Cmp `${_a}` < `${_b}` `${_t}` `${_f}` !macroend !macro _L>= _a _b _t _f !insertmacro _L< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _L> _a _b _t _f !insertmacro _Int64Cmp `${_a}` > `${_b}` `${_t}` `${_f}` !macroend !macro _L<= _a _b _t _f !insertmacro _L> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; ptrdiff_t & size_t tests !macro LogicLib_PtrDiffTest _o _a _b _t _f !if "${NSIS_PTR_SIZE}" <= 4 !insertmacro _${_o} `${_a}` `${_b}` `${_t}` `${_f}` !else !insertmacro _L${_o} `${_a}` `${_b}` `${_t}` `${_f}` !endif !macroend !macro _P= _a _b _t _f !insertmacro LogicLib_PtrDiffTest = `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _P<> _a _b _t _f !insertmacro LogicLib_PtrDiffTest <> `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _P< _a _b _t _f !insertmacro LogicLib_PtrDiffTest < `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _P>= _a _b _t _f !insertmacro LogicLib_PtrDiffTest >= `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _P> _a _b _t _f !insertmacro LogicLib_PtrDiffTest > `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _P<= _a _b _t _f !insertmacro LogicLib_PtrDiffTest <= `${_a}` `${_b}` `${_t}` `${_f}` !macroend !include Util.nsh !macro _Z= _a _b _t _f !insertmacro LogicLib_PtrDiffTest = `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _Z<> _a _b _t _f !insertmacro LogicLib_PtrDiffTest <> `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _Z< _a _b _t _f !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _Z>= _a _b _t _f !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_t}` `${_f}` `${_t}` !macroend !macro _Z> _a _b _t _f !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _Z<= _a _b _t _f !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_t}` `${_t}` `${_f}` !macroend ; Flag tests !macro _Abort _a _b _t _f IfAbort `${_t}` `${_f}` !macroend !define Abort `"" Abort ""` !macro _Errors _a _b _t _f IfErrors `${_t}` `${_f}` !macroend !define Errors `"" Errors ""` !macro _FileExists _a _b _t _f IfFileExists `${_b}` `${_t}` `${_f}` !macroend !define FileExists `"" FileExists` !macro _RebootFlag _a _b _t _f IfRebootFlag `${_t}` `${_f}` !macroend !define RebootFlag `"" RebootFlag ""` !macro _Silent _a _b _t _f IfSilent `${_t}` `${_f}` !macroend !define Silent `"" Silent ""` !macro _ShellVarContextAll _a _b _t _f IfShellVarContextAll `${_t}` `${_f}` !macroend !define ShellVarContextAll `"" ShellVarContextAll ""` !macro _RtlLanguage _a _b _t _f IfRtlLanguage `${_t}` `${_f}` !macroend !define RtlLanguage `"" RtlLanguage ""` !macro _AltRegView _a _b _t _f IfAltRegView `${_t}` `${_f}` !macroend !define AltRegView `"" AltRegView ""` !macro _RegKeyIsEmpty _a _b _t _f !insertmacro _LOGICLIB_TEMP ClearErrors EnumRegValue $_LOGICLIB_TEMP ${_a} `${_b}` "" !if `${_f}` != `` IfErrors "" `${_f}` ; Skip calls to EnumRegKey and _== if possible !else IfErrors +3 StrCpy $_LOGICLIB_TEMP "1" ; The default value is also named "", make sure we don't mistake it as empty Goto +2 !endif EnumRegKey $_LOGICLIB_TEMP ${_a} `${_b}` "" !insertmacro _== $_LOGICLIB_TEMP "" `${_t}` `${_f}` !macroend !define RegKeyIsEmpty `RegKeyIsEmpty` ; "Any instruction" test !macro _Cmd _a _b _t _f !define _t=${_t} !ifdef _t= ; If no true label then make one !define __t _LogicLib_Label_${LOGICLIB_COUNTER} !insertmacro _IncreaseCounter !else !define __t ${_t} !endif ${_b} ${__t} !define _f=${_f} !ifndef _f= ; If a false label then go there Goto ${_f} !endif !undef _f=${_f} !ifdef _t= ; If we made our own true label then place it ${__t}: !endif !undef __t !undef _t=${_t} !macroend !define Cmd `"" Cmd` ; Section flag test !macro _SectionFlagIsSet _a _b _t _f !insertmacro _LOGICLIB_TEMP SectionGetFlags `${_b}` $_LOGICLIB_TEMP IntOp $_LOGICLIB_TEMP $_LOGICLIB_TEMP & `${_a}` !insertmacro _= $_LOGICLIB_TEMP `${_a}` `${_t}` `${_f}` !macroend !define SectionIsSelected `${SF_SELECTED} SectionFlagIsSet` !define SectionIsSubSection `${SF_SUBSEC} SectionFlagIsSet` !define SectionIsSubSectionEnd `${SF_SUBSECEND} SectionFlagIsSet` !define SectionIsSectionGroup `${SF_SECGRP} SectionFlagIsSet` !define SectionIsSectionGroupEnd `${SF_SECGRPEND} SectionFlagIsSet` !define SectionIsBold `${SF_BOLD} SectionFlagIsSet` !define SectionIsReadOnly `${SF_RO} SectionFlagIsSet` !define SectionIsExpanded `${SF_EXPAND} SectionFlagIsSet` !define SectionIsPartiallySelected `${SF_PSELECTED} SectionFlagIsSet` !define IfCmd `!insertmacro _IfThen "" Cmd ${|}` !macro _If _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !define ${_Logic}If !define ${_Logic}Else _LogicLib_ElseLabel_${LOGICLIB_COUNTER} ; Get a label for the Else !insertmacro _IncreaseCounter !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} !verbose pop !macroend !define If `!insertmacro _If true` !define Unless `!insertmacro _If false` !define IfNot `!insertmacro _If false` !macro _And _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use And without a preceding If or IfNot/Unless" !endif !ifndef ${_Logic}Else !error "Cannot use And following an Else" !endif !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} !verbose pop !macroend !define AndIf `!insertmacro _And true` !define AndUnless `!insertmacro _And false` !define AndIfNot `!insertmacro _And false` !macro _Or _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use Or without a preceding If or IfNot/Unless" !endif !ifndef ${_Logic}Else !error "Cannot use Or following an Else" !endif !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Skip this test as we already !insertmacro _IncreaseCounter Goto ${_label} ; have a successful result ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !define ${_Logic}Else _LogicLib_ElseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If !insertmacro _IncreaseCounter !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} ${_label}: !undef _label !verbose pop !macroend !define OrIf `!insertmacro _Or true` !define OrUnless `!insertmacro _Or false` !define OrIfNot `!insertmacro _Or false` !macro _Else !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use Else without a preceding If or IfNot/Unless" !endif !ifndef ${_Logic}Else !error "Cannot use Else following an Else" !endif !ifndef ${_Logic}EndIf ; First Else for this If? !define ${_Logic}EndIf _LogicLib_EndIfLabel_${LOGICLIB_COUNTER} ; Get a label for the EndIf !insertmacro _IncreaseCounter !endif Goto ${${_Logic}EndIf} ; Go to the EndIf ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !verbose pop !macroend !define Else `!insertmacro _Else` !macro _ElseIf _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} ${Else} ; Perform the Else !define ${_Logic}Else _LogicLib_ElseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If !insertmacro _IncreaseCounter !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} !verbose pop !macroend !define ElseIf `!insertmacro _ElseIf true` !define ElseUnless `!insertmacro _ElseIf false` !define ElseIfNot `!insertmacro _ElseIf false` !macro _EndIf _n !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use End${_n} without a preceding If or IfNot/Unless" !endif !ifdef ${_Logic}Else ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !endif !ifdef ${_Logic}EndIf ${${_Logic}EndIf}: ; Place the EndIf !undef ${_Logic}EndIf ; and remove it !endif !undef ${_Logic}If !insertmacro _PopLogic !verbose pop !macroend !define EndIf `!insertmacro _EndIf If` !define EndUnless `!insertmacro _EndIf Unless` !macro _IfThen _a _o _b _t !verbose push !verbose ${LOGICLIB_VERBOSITY} ${If} `${_a}` `${_o}` `${_b}` ${_t} ${EndIf} !verbose pop !macroend !define IfThen `!insertmacro _IfThen` !macro _IfNotThen _a _o _b _t !verbose push !verbose ${LOGICLIB_VERBOSITY} ${IfNot} `${_a}` `${_o}` `${_b}` ${_t} ${EndIf} !verbose pop !macroend !define IfNotThen `!insertmacro _IfNotThen` !macro _ForEach _v _f _t _o _s !verbose push !verbose ${LOGICLIB_VERBOSITY} StrCpy "${_v}" "${_f}" ; Assign the initial value Goto +2 ; Skip the loop expression for the first iteration !define _DoLoopExpression `IntOp "${_v}" "${_v}" "${_o}" "${_s}"` ; Define the loop expression !define _o=${_o} !ifdef _o=+ ; Check the loop expression operator !define __o > ; to determine the correct loop condition !else ifdef _o=- !define __o < !else !error "Unsupported ForEach step operator (must be + or -)" !endif !undef _o=${_o} !insertmacro _Do For false `${_v}` `${__o}` `${_t}` ; Let Do do the rest !undef __o !verbose pop !macroend !define ForEach `!insertmacro _ForEach` !macro _For _v _f _t !verbose push !verbose ${LOGICLIB_VERBOSITY} ${ForEach} `${_v}` `${_f}` `${_t}` + 1 ; Pass on to ForEach !verbose pop !macroend !define For `!insertmacro _For` !define ExitFor `!insertmacro _Goto ExitFor For` !define Next `!insertmacro _Loop For Next "" "" "" ""` !define While `!insertmacro _Do While true` !define ExitWhile `!insertmacro _Goto ExitWhile While` !define EndWhile `!insertmacro _Loop While EndWhile "" "" "" ""` !macro _Do _n _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !define ${_Logic}${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the start of the loop !insertmacro _IncreaseCounter ${${_Logic}${_n}}: !insertmacro _PushScope Exit${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the loop !insertmacro _IncreaseCounter !insertmacro _PushScope Break ${_Exit${_n}} ; Break goes to the end of the loop !ifdef _DoLoopExpression ${_DoLoopExpression} ; Special extra parameter for inserting code !undef _DoLoopExpression ; between the Continue label and the loop condition !endif !define _c=${_c} !ifdef _c= ; No starting condition !insertmacro _PushScope Continue _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for Continue at the end of the loop !insertmacro _IncreaseCounter !else !insertmacro _PushScope Continue ${${_Logic}${_n}} ; Continue goes to the start of the loop !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${_Exit${_n}} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} "" !endif !endif !undef _c=${_c} !define ${_Logic}Condition ${_c} ; Remember the condition used !verbose pop !macroend !define Do `!insertmacro _Do Do "" "" "" ""` !define DoWhile `!insertmacro _Do Do true` !define DoUntil `!insertmacro _Do Do false` !macro _Goto _n _s !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _${_n} !error "Cannot use ${_n} without a preceding ${_s}" !endif Goto ${_${_n}} !verbose pop !macroend !define ExitDo `!insertmacro _Goto ExitDo Do` !macro _Loop _n _e _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}${_n} !error "Cannot use ${_e} without a preceding ${_n}" !endif !define _c=${${_Logic}Condition} !ifdef _c= ; If Do had no condition place the Continue label ${_Continue}: !endif !undef _c=${${_Logic}Condition} !define _c=${_c} !ifdef _c= ; No ending condition Goto ${${_Logic}${_n}} !else ifdef _c=true ; If condition is true !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}${_n}} ${_Exit${_n}} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} ${${_Logic}${_n}} !endif !undef _c=${_c} Goto ${_Continue} ; Just to ensure it is referenced at least once Goto ${_Exit${_n}} ; Just to ensure it is referenced at least once ${_Exit${_n}}: ; Place the loop exit point !undef ${_Logic}Condition !insertmacro _PopScope Continue !insertmacro _PopScope Break !insertmacro _PopScope Exit${_n} !undef ${_Logic}${_n} !insertmacro _PopLogic !verbose pop !macroend !define Loop `!insertmacro _Loop Do Loop "" "" "" ""` !define LoopWhile `!insertmacro _Loop Do LoopWhile true` !define LoopUntil `!insertmacro _Loop Do LoopUntil false` !define Continue `!insertmacro _Goto Continue "For or Do or While"` !define Break `!insertmacro _Goto Break "For or Do or While"` !macro _Select _a !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !define ${_Logic}Select `${_a}` ; Remember the left hand side of the comparison !verbose pop !macroend !define Select `!insertmacro _Select` !macro _Select_CaseElse !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}Select !error "Cannot use Case without a preceding Select" !endif !ifdef ${_Logic}EndSelect ; This is set only after the first case !ifndef ${_Logic}Else !error "Cannot use Case following a CaseElse" !endif Goto ${${_Logic}EndSelect} ; Go to EndSelect (Ends the previous Case) !define /IfNDef _LogicLib_EndSelectLabelUsed_${_Logic} ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !else !define ${_Logic}EndSelect _LogicLib_EndSelectLabel_${LOGICLIB_COUNTER} ; Get a label for the EndSelect !insertmacro _IncreaseCounter !endif !verbose pop !macroend !define CaseElse `!insertmacro _CaseElse` !define Case_Else `!insertmacro _CaseElse` ; Compatibility with 2.2 and earlier !define Default `!insertmacro _CaseElse` ; For the C-minded !macro _Select_Case _a !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` "" ${${_Logic}Else} !verbose pop !macroend !define Case `!insertmacro _Case` !macro _Case2 _a _b !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_b}` "" ${${_Logic}Else} !verbose pop !macroend !define Case2 `!insertmacro _Case2` !macro _Case3 _a _b _c !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +3 "" !insertmacro _== `${${_Logic}Select}` `${_b}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_c}` "" ${${_Logic}Else} !verbose pop !macroend !define Case3 `!insertmacro _Case3` !macro _Case4 _a _b _c _d !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +4 "" !insertmacro _== `${${_Logic}Select}` `${_b}` +3 "" !insertmacro _== `${${_Logic}Select}` `${_c}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_d}` "" ${${_Logic}Else} !verbose pop !macroend !define Case4 `!insertmacro _Case4` !macro _Case5 _a _b _c _d _e !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +5 "" !insertmacro _== `${${_Logic}Select}` `${_b}` +4 "" !insertmacro _== `${${_Logic}Select}` `${_c}` +3 "" !insertmacro _== `${${_Logic}Select}` `${_d}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_e}` "" ${${_Logic}Else} !verbose pop !macroend !define Case5 `!insertmacro _Case5` !macro _EndSelect !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}Select !error "Cannot use EndSelect without a preceding Select" !endif !ifdef ${_Logic}Else ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !endif !ifdef ${_Logic}EndSelect ; This won't be set if there weren't any cases !ifdef _LogicLib_EndSelectLabelUsed_${_Logic} ; There is no jump to ${${_Logic}EndSelect}: if there is only one Case ${${_Logic}EndSelect}: ; Place the EndSelect !undef _LogicLib_EndSelectLabelUsed_${_Logic} !endif !undef ${_Logic}EndSelect ; and remove it !endif !undef ${_Logic}Select !insertmacro _PopLogic !verbose pop !macroend !define EndSelect `!insertmacro _EndSelect` !macro _Switch _a !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !insertmacro _PushScope Switch ${_Logic} ; Keep a separate stack for switch data !insertmacro _PushScope Break _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for beyond the end of the switch !insertmacro _IncreaseCounter !define ${_Switch}Var `${_a}` ; Remember the left hand side of the comparison !ifdef LL_NOAPPENDMEMFILE !tempfile ${_Switch}Tmp ; Create a temporary file !if "${NSIS_CHAR_SIZE}" > 1 !appendfile /CHARSET=UTF8SIG "${${_Switch}Tmp}" "" ; Make sure the file uses Unicode !endif !else !appendmemfile ${_Switch}Tmp ; Create a temporary file !endif !define ${_Logic}Switch _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the switch !insertmacro _IncreaseCounter Goto ${${_Logic}Switch} ; and go there !verbose pop !macroend !define Switch `!insertmacro _Switch` !macro _Case _a !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifdef _Logic & ${_Logic}Select ; Check for an active Select !insertmacro _Select_Case `${_a}` !else ifndef _Switch ; If not then check for an active Switch !error "Cannot use Case without a preceding Select or Switch" !else !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for this case, !insertmacro _IncreaseCounter ${_label}: ; place it and add it's check to the temp file !ifdef LL_NOAPPENDMEMFILE !appendfile "${${_Switch}Tmp}" `!insertmacro _== $\`${${_Switch}Var}$\` $\`${_a}$\` ${_label} ""$\n` !else !appendmemfile ${_Switch}Tmp `!insertmacro _== $\`${${_Switch}Var}$\` $\`${_a}$\` ${_label} ""$\n` !endif !undef _label !endif !verbose pop !macroend !macro _CaseElse !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifdef _Logic & ${_Logic}Select ; Check for an active Select !insertmacro _Select_CaseElse !else ifndef _Switch ; If not then check for an active Switch !error "Cannot use Case without a preceding Select or Switch" !else ifdef ${_Switch}Else ; Already had a default case? !error "Cannot use CaseElse following a CaseElse" !else !define ${_Switch}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the default case, !insertmacro _IncreaseCounter ${${_Switch}Else}: ; and place it !endif !verbose pop !macroend !macro _EndSwitch !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}Switch !error "Cannot use EndSwitch without a preceding Switch" !endif Goto ${_Break} ; Skip the jump table ${${_Logic}Switch}: ; Place the end of the switch !undef ${_Logic}Switch !ifdef LL_NOAPPENDMEMFILE !include "${${_Switch}Tmp}" ; Include the jump table !delfile "${${_Switch}Tmp}" ; and delete it !undef ${_Switch}Tmp !else !include /memfile ${_Switch}Tmp ; Include the jump table !appendmemfile '' ${_Switch}Tmp ; and delete it !endif !ifdef ${_Switch}Else ; Was there a default case? Goto ${${_Switch}Else} ; then go there if all else fails !undef ${_Switch}Else !endif !undef ${_Switch}Var ${_Break}: ; Place the break label !insertmacro _PopScope Break !insertmacro _PopScope Switch !insertmacro _PopLogic !verbose pop !macroend !define EndSwitch `!insertmacro _EndSwitch` !endif ; LOGICLIB !verbose 3 !define LOGICLIB_VERBOSITY ${_LOGICLIB_VERBOSITY} !undef _LOGICLIB_VERBOSITY !verbose pop nsis-3.11/Include/MUI.nsh000077500000000000000000000000621477201124000151400ustar00rootroot00000000000000!include "${NSISDIR}\Contrib\Modern UI\System.nsh"nsis-3.11/Include/MUI2.nsh000077500000000000000000000000621477201124000152220ustar00rootroot00000000000000!include "${NSISDIR}\Contrib\Modern UI 2\MUI2.nsh"nsis-3.11/Include/Memento.nsh000077500000000000000000000275131477201124000161240ustar00rootroot00000000000000!verbose push !verbose 3 !include LogicLib.nsh !include Sections.nsh !ifndef ___MEMENTO_NSH___ !define ___MEMENTO_NSH___ ##################################### ### Memento ### ##################################### /* Memento is a set of macros that allow installers to remember user selection across separate runs of the installer. Currently, it can remember the state of sections and mark new sections as bold. In the future, it'll integrate InstallOptions and maybe even the Modern UI. A usage example can be found in `Examples\Memento.nsi`. */ ##################################### ### Usage Instructions ### ##################################### /* 1. Declare usage of Memento by including Memento.nsh at the top of the script. !include Memento.nsh 2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key where sections' state should be saved. !define MEMENTO_REGISTRY_ROOT HKLM !define MEMENTO_REGISTRY_KEY \ Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram 3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd} for sections that whose state should be remembered by Memento. For sections that should be unselected by default, use ${MementoSection}'s brother - ${MementoUnselectedSection}. Sections that don't already have an identifier must be assigned one. Section identifiers must stay the same across different versions of the installer or their state will be forgotten. 4. Use ${MementoSectionDone} after the last ${MementoSection}. 5. Add a call to ${MementoSectionRestore} to .onInit to restore the state of all sections from the registry. Function .onInit ${MementoSectionRestore} FunctionEnd 6. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state of all sections to the registry. Function .onInstSuccess ${MementoSectionSave} FunctionEnd 7. Tattoo the location of the chosen registry key on your arm. */ ##################################### ### User API ### ##################################### ; ; ${MementoSection} ; ; Defines a section whose state is remembered by Memento. ; ; Usage is similar to Section. ; ; ${MementoSection} "name" "id" ; ; ${MementoSectionEx} "[flags]" "name" "memento_id" "section_id" ; !define MementoSection "!insertmacro MementoSection" !define MementoSectionEx "!insertmacro MementoSectionEx" ; ; ${MementoSectionEnd} ; ; Ends a section previously opened using ${MementoSection}. ; ; Usage is similar to SectionEnd. ; ; ${MementoSection} "name" "id" ; # some code... ; ${MementoSectionEnd} ; ; ; ${MementoUnselectedSection} ; ; Defines a section whose state is remembered by Memento and is ; unselected by default. ; ; Usage is similar to Section with the /o switch. ; ; ${MementoUnselectedSection} "name" "id" ; !define MementoUnselectedSection "!insertmacro MementoUnselectedSection" ; ; ${MementoSectionEnd} ; ; Ends a section previously opened using ${MementoSection}. ; ; Usage is similar to SectionEnd. ; ; ${MementoSection} "name" "id" ; # some code... ; ${MementoSectionEnd} ; !define MementoSectionEnd "!insertmacro MementoSectionEnd" ; ; ${MementoSectionDone} ; ; Used after all ${MementoSection} have been set. ; ; ${MementoSection} "name1" "some_id1" ; # some code... ; ${MementoSectionEnd} ; ; ${MementoSection} "name2" "some_id2" ; # some code... ; ${MementoSectionEnd} ; ; ${MementoSection} "name3" "some_id3" ; # some code... ; ${MementoSectionEnd} ; ; ${MementoSectionDone} ; !define MementoSectionDone "!insertmacro MementoSectionDone" ; ; ${MementoSectionRestore} ; ; Restores the state of all Memento sections from the registry. ; ; Commonly used in .onInit. ; ; Function .onInit ; ; ${MementoSectionRestore} ; ; FunctionEnd ; !define MementoSectionRestore "!insertmacro MementoSectionRestore" ; ; ${MementoSectionSave} ; ; Saves the state of all Memento sections to the registry. ; ; Commonly used in .onInstSuccess. ; ; Function .onInstSuccess ; ; ${MementoSectionSave} ; ; FunctionEnd ; !define MementoSectionSave "!insertmacro MementoSectionSave" ; ; MementoSection ; ; Replaceable macros that allow custom storage methods to be used. ; !define /IfNDef MementoSectionStorageSeparator '_' !ifmacrondef MementoSectionReadInt !define __MementoSectionStdRegReadWrite !define /IfNDef MementoSectionStoragePrefix "MementoSection" !macro MementoSectionReadInt outvar name ReadRegDWord ${outvar} ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` !macroend !macro MementoSectionWriteInt name val WriteRegDWord ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` `${val}` !macroend !macro MementoSectionReadMarker outvar name ReadRegStr ${outvar} ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` !macroend !macro MementoSectionWriteMarker name WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` `` !macroend !endif ##################################### ### Internal Defines ### ##################################### !define __MementoSectionIndex 1 ##################################### ### Internal Macros ### ##################################### !macro __MementoCheckSettings !ifdef __MementoSectionStdRegReadWrite !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY !error "MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros" !endif !endif !macroend !macro __MementoSection flags name mementoid sectionid !insertmacro __MementoCheckSettings !ifndef __MementoSectionIndex !error "MementoSectionDone already used!" !endif !define __MementoSectionLastMementoId `${mementoid}` !define __MementoSectionLastSectionId `${sectionid}` !define __MementoSectionLastFlags `${flags}` !verbose pop Section ${flags} `${name}` `${sectionid}` !verbose push !verbose 3 !macroend ##################################### ### User Macros ### ##################################### !macro MementoSectionEx flags name mid sid !verbose push 3 !insertmacro __MementoSection `${flags}` `${name}` `${mid}` `${sid}` !verbose pop !macroend !macro MementoSection name id !verbose push 3 !insertmacro __MementoSection "" `${name}` `${id}` `${id}` !verbose pop !macroend !macro MementoUnselectedSection name id !verbose push 3 !insertmacro __MementoSection /o `${name}` `${id}` `${id}` !verbose pop !macroend !macro MementoSectionEnd SectionEnd !verbose push !verbose 3 !insertmacro __MementoCheckSettings !ifndef __MementoSectionIndex !error "MementoSectionDone already used!" !endif !define /MATH __MementoSectionIndexNext \ ${__MementoSectionIndex} + 1 Function __MementoSectionMarkNew${__MementoSectionIndex} ClearErrors !insertmacro MementoSectionReadInt $0 `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` ${If} ${Errors} !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD} ${EndIf} GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext} Goto $0 FunctionEnd Function __MementoSectionRestoreStatus${__MementoSectionIndex} ClearErrors !insertmacro MementoSectionReadInt $0 `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` !searchparse /ignorecase /noerrors `${__MementoSectionLastFlags}-` `/o` __MementoSectionUnselected !ifndef __MementoSectionUnselected ${If} ${Errors} ${OrIf} $0 != 0 !insertmacro SelectSection `${${__MementoSectionLastSectionId}}` ${Else} !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}` ${EndIf} !else !undef __MementoSectionUnselected ${If} ${Errors} ${OrIf} $0 == 0 !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}` ${Else} !insertmacro SelectSection `${${__MementoSectionLastSectionId}}` ${EndIf} !endif GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext} Goto $0 FunctionEnd Function __MementoSectionSaveStatus${__MementoSectionIndex} ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}` !insertmacro MementoSectionWriteInt `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` 1 ${Else} !insertmacro MementoSectionWriteInt `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` 0 ${EndIf} GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext} Goto $0 FunctionEnd !undef __MementoSectionIndex !define __MementoSectionIndex ${__MementoSectionIndexNext} !undef __MementoSectionIndexNext !undef __MementoSectionLastMementoId !undef __MementoSectionLastSectionId !undef __MementoSectionLastFlags !verbose pop !macroend !macro MementoSectionDone !verbose push !verbose 3 !insertmacro __MementoCheckSettings Function __MementoSectionMarkNew${__MementoSectionIndex} FunctionEnd Function __MementoSectionRestoreStatus${__MementoSectionIndex} FunctionEnd Function __MementoSectionSaveStatus${__MementoSectionIndex} FunctionEnd !undef __MementoSectionIndex !verbose pop !macroend !macro MementoSectionRestore !verbose push !verbose 3 !insertmacro __MementoCheckSettings Push $0 Push $1 Push $2 Push $3 # check for first usage ClearErrors !insertmacro MementoSectionReadMarker $0 `Used` ${If} ${Errors} # use script defaults on first run Goto done ${EndIf} # mark new components in bold Call __MementoSectionMarkNew1 # mark section groups in bold StrCpy $0 0 StrCpy $1 "" StrCpy $2 "" StrCpy $3 "" loop: ClearErrors ${If} ${SectionIsBold} $0 ${If} $1 != "" !insertmacro SetSectionFlag $1 ${SF_BOLD} ${EndIf} ${If} $2 != "" !insertmacro SetSectionFlag $2 ${SF_BOLD} ${EndIf} ${If} $3 != "" !insertmacro SetSectionFlag $3 ${SF_BOLD} ${EndIf} ${ElseIf} ${Errors} Goto loop_end ${EndIf} ${If} ${SectionIsSectionGroup} $0 ${If} $1 == "" StrCpy $1 $0 ${ElseIf} $2 == "" StrCpy $2 $0 ${ElseIf} $3 == "" StrCpy $3 $0 ${EndIf} ${EndIf} ${If} ${SectionIsSectionGroupEnd} $0 ${If} $3 != "" StrCpy $3 "" ${ElseIf} $2 != "" StrCpy $2 "" ${ElseIf} $1 != "" StrCpy $1 "" ${EndIf} ${EndIf} IntOp $0 $0 + 1 Goto loop loop_end: # restore sections' status Call __MementoSectionRestoreStatus1 # all done done: Pop $3 Pop $2 Pop $1 Pop $0 !verbose pop !macroend !macro MementoSectionSave !verbose push !verbose 3 !insertmacro __MementoCheckSettings Push $0 !insertmacro MementoSectionWriteMarker `Used` Call __MementoSectionSaveStatus1 Pop $0 !verbose pop !macroend !endif # ___MEMENTO_NSH___ !verbose pop nsis-3.11/Include/SConscript000077500000000000000000000011571477201124000160140ustar00rootroot00000000000000includes = Split(""" Colors.nsh FileFunc.nsh Integration.nsh LangFile.nsh Library.nsh LogicLib.nsh Memento.nsh MUI.nsh MUI2.nsh Sections.nsh StrFunc.nsh TextFunc.nsh UpgradeDLL.nsh Util.nsh VB6RunTime.nsh WinCore.nsh WinMessages.nsh WinVer.nsh WordFunc.nsh x64.nsh """) includesWin = Split(""" Win/COM.nsh Win/Propkey.nsh Win/RestartManager.nsh Win/WinDef.nsh Win/WinError.nsh Win/WinNT.nsh Win/WinUser.nsh """) Import('env') env.DistributeInclude(includes) env.DistributeInclude(includesWin, path='Win') env.DistributeDocs('StrFunc.txt', path='StrFunc') nsis-3.11/Include/Sections.nsh000077500000000000000000000150201477201124000162750ustar00rootroot00000000000000; Sections.nsh ; ; Defines and macros for section control ; ; Include in your script using: ; !include "Sections.nsh" ;-------------------------------- !ifndef SECTIONS_INCLUDED !define SECTIONS_INCLUDED ;-------------------------------- ; Generic section defines # section or section group is selected !define SF_SELECTED 1 # section group !define SF_SECGRP 2 !define SF_SUBSEC 2 # deprecated # section group end marker !define SF_SECGRPEND 4 !define SF_SUBSECEND 4 # deprecated # bold text (Section !blah) !define SF_BOLD 8 # read only (SectionIn RO) !define SF_RO 16 # expanded section group (SectionGroup /e blah) !define SF_EXPAND 32 # section group is partially selected !define SF_PSELECTED 64 # internal # internal !define SF_TOGGLED 128 # internal !define SF_NAMECHG 256 # internal # mask to toggle off the selected flag !define SECTION_OFF 0xFFFFFFFE ;-------------------------------- ; Select / unselect / reserve section !macro SelectSection SECTION Push $0 Push $1 StrCpy $1 "${SECTION}" SectionGetFlags $1 $0 IntOp $0 $0 | ${SF_SELECTED} SectionSetFlags $1 $0 Pop $1 Pop $0 !macroend !macro UnselectSection SECTION Push $0 Push $1 StrCpy $1 "${SECTION}" SectionGetFlags $1 $0 IntOp $0 $0 & ${SECTION_OFF} SectionSetFlags $1 $0 Pop $1 Pop $0 !macroend ; If section selected, will unselect, if unselected, will select !macro ReverseSection SECTION Push $0 Push $1 StrCpy $1 "${SECTION}" SectionGetFlags $1 $0 IntOp $0 $0 ^ ${SF_SELECTED} SectionSetFlags $1 $0 Pop $1 Pop $0 !macroend ;-------------------------------- ; Macros for mutually exclusive section selection ; Written by Tim Gallagher ; ; See one-section.nsi for an example of usage ; Starts the Radio Button Block ; You should pass a variable that keeps the selected section ; as the first parameter for this macro. This variable should ; be initialized to the default section's index. ; ; As this macro uses $R0 and $R1 you can't use those two as the ; variable which will keep the selected section. !macro StartRadioButtons var !define StartRadioButtons_Var "${var}" Push $R0 SectionGetFlags "${StartRadioButtons_Var}" $R0 IntOp $R0 $R0 & ${SECTION_OFF} SectionSetFlags "${StartRadioButtons_Var}" $R0 Push $R1 StrCpy $R1 "${StartRadioButtons_Var}" !macroend ; A radio button !macro RadioButton SECTION_NAME SectionGetFlags ${SECTION_NAME} $R0 IntOp $R0 $R0 & ${SF_SELECTED} IntCmp $R0 ${SF_SELECTED} 0 +2 +2 StrCpy "${StartRadioButtons_Var}" ${SECTION_NAME} !macroend ; Ends the radio button block !macro EndRadioButtons StrCmp $R1 "${StartRadioButtons_Var}" 0 +4 ; selection hasn't changed SectionGetFlags "${StartRadioButtons_Var}" $R0 IntOp $R0 $R0 | ${SF_SELECTED} SectionSetFlags "${StartRadioButtons_Var}" $R0 Pop $R1 Pop $R0 !undef StartRadioButtons_Var !macroend ;-------------------------------- ; These are two macros you can use to set a Section in an InstType ; or clear it from an InstType. ; ; Written by Robert Kehl ; ; For details, see https://nsis.sourceforge.io/wiki/SetSectionInInstType%2C_ClearSectionInInstType ; ; Use the defines below for the WANTED_INSTTYPE parameter. !define INSTTYPE_1 1 !define INSTTYPE_2 2 !define INSTTYPE_3 4 !define INSTTYPE_4 8 !define INSTTYPE_5 16 !define INSTTYPE_6 32 !define INSTTYPE_7 64 !define INSTTYPE_8 128 !define INSTTYPE_9 256 !define INSTTYPE_10 512 !define INSTTYPE_11 1024 !define INSTTYPE_12 2048 !define INSTTYPE_13 4096 !define INSTTYPE_14 8192 !define INSTTYPE_15 16384 !define INSTTYPE_16 32768 !define INSTTYPE_17 65536 !define INSTTYPE_18 131072 !define INSTTYPE_19 262144 !define INSTTYPE_20 524288 !define INSTTYPE_21 1048576 !define INSTTYPE_22 2097152 !define INSTTYPE_23 4194304 !define INSTTYPE_24 8388608 !define INSTTYPE_25 16777216 !define INSTTYPE_26 33554432 !define INSTTYPE_27 67108864 !define INSTTYPE_28 134217728 !define INSTTYPE_29 268435456 !define INSTTYPE_30 536870912 !define INSTTYPE_31 1073741824 !define INSTTYPE_32 2147483648 !macro SetSectionInInstType SECTION_NAME WANTED_INSTTYPE Push $0 Push $1 StrCpy $1 "${SECTION_NAME}" SectionGetInstTypes $1 $0 IntOp $0 $0 | ${WANTED_INSTTYPE} SectionSetInstTypes $1 $0 Pop $1 Pop $0 !macroend !macro ClearSectionInInstType SECTION_NAME WANTED_INSTTYPE Push $0 Push $1 Push $2 StrCpy $2 "${SECTION_NAME}" SectionGetInstTypes $2 $0 StrCpy $1 ${WANTED_INSTTYPE} IntOp $1 $1 ~ IntOp $0 $0 & $1 SectionSetInstTypes $2 $0 Pop $2 Pop $1 Pop $0 !macroend ;-------------------------------- ; Set / clear / check bits in a section's flags ; Written by derekrprice ; Set one or more bits in a sections's flags !macro SetSectionFlag SECTION BITS Push $R0 Push $R1 StrCpy $R1 "${SECTION}" SectionGetFlags $R1 $R0 IntOp $R0 $R0 | "${BITS}" SectionSetFlags $R1 $R0 Pop $R1 Pop $R0 !macroend ; Clear one or more bits in section's flags !macro ClearSectionFlag SECTION BITS Push $R0 Push $R1 Push $R2 StrCpy $R2 "${SECTION}" SectionGetFlags $R2 $R0 IntOp $R1 "${BITS}" ~ IntOp $R0 $R0 & $R1 SectionSetFlags $R2 $R0 Pop $R2 Pop $R1 Pop $R0 !macroend ; Check if one or more bits in section's flags are set ; If they are, jump to JUMPIFSET ; If not, jump to JUMPIFNOTSET !macro SectionFlagIsSet SECTION BITS JUMPIFSET JUMPIFNOTSET Push $R0 SectionGetFlags "${SECTION}" $R0 IntOp $R0 $R0 & "${BITS}" IntCmp $R0 "${BITS}" +3 Pop $R0 StrCmp "" "${JUMPIFNOTSET}" +3 "${JUMPIFNOTSET}" Pop $R0 Goto "${JUMPIFSET}" !macroend ;-------------------------------- ; Removes a section by unselecting and hiding it !macro RemoveSection SECTION Push $R0 Push $R1 StrCpy $R1 `${SECTION}` SectionGetFlags $R1 $R0 IntOp $R0 $R0 & ${SECTION_OFF} SectionSetFlags $R1 $R0 SectionSetText $R1 `` Pop $R1 Pop $R0 !macroend ; Undoes the RemoveSection action !macro UnremoveSection SECTION SECTION_TEXT Push $R0 Push $R1 Push $R2 StrCpy $R1 `${SECTION}` StrCpy $R2 `${SECTION_TEXT}` SectionGetFlags $R1 $R0 IntOp $R0 $R0 | ${SF_SELECTED} SectionSetFlags $R1 $R0 SectionSetText $R1 $R2 Pop $R2 Pop $R1 Pop $R0 !macroend ;-------------------------------- !endifnsis-3.11/Include/StrFunc.nsh000077500000000000000000001316321477201124000161020ustar00rootroot00000000000000/* o-----------------------------------------------------------------------------o |String Functions Header File 1.10 | (-----------------------------------------------------------------------------) | By deguix / A Header file for NSIS 2.01 | | -------------------------------| | | | This header file contains NSIS functions for string manipulation. | | ---------| | !include "StrFunc.nsh" / Example | | ${Using:StrFunc} StrRep -----------| | | | Section | | ${StrRep} $0 "Hello world!" "world" "everyone" | | MessageBox mb_ok $0 | | SectionEnd | | | o-----------------------------------------------------------------------------o */ !verbose push 3 !define /IfNDef STRFUNC_VERBOSITY 3 !define /IfNDef _STRFUNC_VERBOSITY ${STRFUNC_VERBOSITY} !define /IfNDef _STRFUNC_CREDITVERBOSITY ${STRFUNC_VERBOSITY} !undef STRFUNC_VERBOSITY !verbose ${_STRFUNC_VERBOSITY} !include LogicLib.nsh !ifndef STRFUNC !define /IfNDef FALSE 0 !define /IfNDef TRUE 1 ;Header File Identification !define STRFUNC `String Functions Header File` ;define STRFUNC_SHORT `StrFunc` !define STRFUNC_CREDITS `2004 Diego Pedroso` ;Header File Version !define STRFUNC_VERMAJ 1 !define STRFUNC_VERMED 10 ;!define STRFUNC_VERMIN 0 ;!define STRFUNC_VERBLD 0 !define STRFUNC_VER `${STRFUNC_VERMAJ}.${STRFUNC_VERMED}` ;Header File Init Message Prefix and Postfix !define STRFUNC_INITMSGPRE `----------------------------------------------------------------------$\r$\n` !define STRFUNC_INITMSGPOST `$\r$\n----------------------------------------------------------------------$\r$\n` ;Header File Init Message !verbose push ${_STRFUNC_CREDITVERBOSITY} !echo `${STRFUNC_INITMSGPRE}NSIS ${STRFUNC} ${STRFUNC_VER} - Copyright ${STRFUNC_CREDITS}${STRFUNC_INITMSGPOST}` !verbose pop ;Header File Function Macros !ifdef STRFUNC_USECALLARTIFICIALFUNCTION !include Util.nsh !endif !define "Using:StrFunc" `!insertmacro STRFUNC_USING ` !macro STRFUNC_USING Name !if "${STRFUNC_VERBOSITY}" > 4 !verbose push 4 !endif !ifndef ${Name}_INCLUDED !ifndef STRFUNC_USECALLARTIFICIALFUNCTION ${${Name}} ; Invoke !insertmacro STRFUNC_MAKEFUNC !endif !endif !if "${STRFUNC_VERBOSITY}" > 4 !verbose pop !endif !macroend !macro STRFUNC_FUNCLIST_INSERT Name !ifdef StrFunc_List !define /ReDef StrFunc_List `${StrFunc_List}|${Name}` !else !define StrFunc_List `${Name}` !endif !macroend !macro STRFUNC_DEFFUNC Name List TypeList !insertmacro STRFUNC_FUNCLIST_INSERT ${Name} !define `${Name}_List` `${List}` !define `${Name}_TypeList` `${TypeList}` !ifdef STRFUNC_USECALLARTIFICIALFUNCTION !define `${Name}` `!insertmacro STRFUNC_CALL_${Name} "" ` !define `Un${Name}` `!insertmacro STRFUNC_CALL_${Name} Un ` !else !define `${Name}` `!insertmacro STRFUNC_MAKEFUNC ${Name} "" #` !define `Un${Name}` `!insertmacro STRFUNC_MAKEFUNC ${Name} Un #` !endif !macroend !macro STRFUNC_MAKEFUNC basename un !ifndef __GLOBAL__ !error "You forgot ${U+24}{Using:StrFunc} ${un}${basename}" !endif !insertmacro STRFUNC_MAKEFUNC_${basename} !macroend !macro STRFUNC_BEGINFUNC basename un credits !verbose push ${_STRFUNC_CREDITVERBOSITY} !echo `${U+24}{${un}${basename}} - Copyright ${credits}` !verbose pop !define /IfNDef ${un}${basename}_INCLUDED !ifndef STRFUNC_USECALLARTIFICIALFUNCTION !define /ReDef ${un}${basename} `!insertmacro STRFUNC_CALL_${basename} "${un}" ` !if "${un}" != "" Function un.${basename} !else Function ${basename} !endif !endif !macroend !macro STRFUNC_ENDFUNC !ifndef STRFUNC_USECALLARTIFICIALFUNCTION FunctionEnd !endif !macroend !macro STRFUNC_CALL basename un !ifdef STRFUNC_USECALLARTIFICIALFUNCTION ${CallArtificialFunction} STRFUNC_MAKEFUNC_${basename} !else !if "${un}" != "" Call un.${basename} !else Call ${basename} !endif !endif !macroend ############################################################################ # StrCase !insertmacro STRFUNC_DEFFUNC StrCase `ResultVar|String|Type` `Output|Text|Option U L T S <>` !macro STRFUNC_CALL_StrCase un ResultVar String Type !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrCase} "${ResultVar}" "${String}" "${Type}"` !verbose 2 Push `${String}` Push `${Type}` !insertmacro STRFUNC_CALL StrCase "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrCase !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Dave Laundon` /*After this point: ------------------------------------------ $0 = String (input) $1 = Type (input) $2 = StrLength (temp) $3 = StartChar (temp) $4 = EndChar (temp) $5 = ResultStr (temp) $6 = CurrentChar (temp) $7 = LastChar (temp) $8 = Temp (temp)*/ ;Get input from user Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 ;Initialize variables StrCpy $2 "" StrCpy $3 "" StrCpy $4 "" StrCpy $5 "" StrCpy $6 "" StrCpy $7 "" StrCpy $8 "" ;Upper and lower cases are simple to use ${If} $1 == "U" ;Upper Case System: ;------------------ ; Convert all characters to upper case. System::Call "User32::CharUpper(t r0 r5)i" Goto StrCase_End ${ElseIf} $1 == "L" ;Lower Case System: ;------------------ ; Convert all characters to lower case. System::Call "User32::CharLower(t r0 r5)i" Goto StrCase_End ${EndIf} ;For the rest of cases: ;Get "String" length StrLen $2 $0 ;Make a loop until the end of "String" ${For} $3 0 $2 ;Add 1 to "EndChar" counter also IntOp $4 $3 + 1 # Step 1: Detect one character at a time ;Remove characters before "StartChar" except when ;"StartChar" is the first character of "String" ${If} $3 <> 0 StrCpy $6 $0 `` $3 ${EndIf} ;Remove characters after "EndChar" except when ;"EndChar" is the last character of "String" ${If} $4 <> $2 ${If} $3 = 0 StrCpy $6 $0 1 ${Else} StrCpy $6 $6 1 ${EndIf} ${EndIf} # Step 2: Convert to the advanced case user chose: ${If} $1 == "T" ;Title Case System: ;------------------ ; Convert all characters after a non-alphabetic character to upper case. ; Else convert to lower case. ;Use "IsCharAlpha" for the job System::Call "*(&t1 r7) p .r8" System::Call "*$8(&i1 .r7)" System::Free $8 System::Call "user32::IsCharAlpha(i r7) i .r8" ;Verify "IsCharAlpha" result and convert the character ${If} $8 = 0 System::Call "User32::CharUpper(t r6 r6)i" ${Else} System::Call "User32::CharLower(t r6 r6)i" ${EndIf} ${ElseIf} $1 == "S" ;Sentence Case System: ;------------------ ; Convert all characters after a ".", "!" or "?" character to upper case. ; Else convert to lower case. Spaces or tabs after these marks are ignored. ;Detect current characters and ignore if necessary ${If} $6 == " " ${OrIf} $6 == "$\t" Goto IgnoreLetter ${EndIf} ;Detect last characters and convert ${If} $7 == "." ${OrIf} $7 == "!" ${OrIf} $7 == "?" ${OrIf} $7 == "" System::Call "User32::CharUpper(t r6 r6)i" ${Else} System::Call "User32::CharLower(t r6 r6)i" ${EndIf} ${ElseIf} $1 == "<>" ;Switch Case System: ;------------------ ; Switch all characters cases to their inverse case. ;Use "IsCharUpper" for the job System::Call "*(&t1 r6) p .r8" System::Call "*$8(&i1 .r7)" System::Free $8 System::Call "user32::IsCharUpper(i r7) i .r8" ;Verify "IsCharUpper" result and convert the character ${If} $8 = 0 System::Call "User32::CharUpper(t r6 r6)i" ${Else} System::Call "User32::CharLower(t r6 r6)i" ${EndIf} ${EndIf} ;Write the character to "LastChar" StrCpy $7 $6 IgnoreLetter: ;Add this character to "ResultStr" StrCpy $5 `$5$6` ${Next} StrCase_End: /*After this point: ------------------------------------------ $0 = OutVar (output)*/ ; Copy "ResultStr" to "OutVar" StrCpy $0 $5 ;Return output to user Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrClb !insertmacro STRFUNC_DEFFUNC StrClb `ResultVar|String|Action` `Output|Text|Option > < <>` !macro STRFUNC_CALL_StrClb un ResultVar String Action !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrClb} "${ResultVar}" "${String}" "${Action}"` !verbose 2 Push `${String}` Push `${Action}` !insertmacro STRFUNC_CALL StrClb "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrClb !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Nik Medved` /*After this point: ------------------------------------------ $0 = String (input) $1 = Action (input) $2 = Lock/Unlock (temp) $3 = Temp (temp) $4 = Temp2 (temp)*/ ;Get input from user Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 StrCpy $2 "" StrCpy $3 "" StrCpy $4 "" ;Open the clipboard to do the operations the user chose (kichik's fix) System::Call 'user32::OpenClipboard(p $HWNDPARENT)' ${If} $1 == ">" ;Set ;Step 1: Clear the clipboard System::Call 'user32::EmptyClipboard()' ;Step 2: Allocate global heap StrLen $2 $0 IntOp $2 $2 + 1 !if "${NSIS_CHAR_SIZE}" > 1 IntOp $2 $2 * ${NSIS_CHAR_SIZE} !endif System::Call 'kernel32::GlobalAlloc(i 2, i r2) p.r2' ;Step 3: Lock the handle System::Call 'kernel32::GlobalLock(p r2) i.r3' ;Step 4: Copy the text to locked clipboard buffer System::Call 'kernel32::lstrcpy(p r3, t r0)' ;Step 5: Unlock the handle again System::Call 'kernel32::GlobalUnlock(p r2)' ;Step 6: Set the information to the clipboard !if "${NSIS_CHAR_SIZE}" > 1 System::Call 'user32::SetClipboardData(i 13, p r2)' !else System::Call 'user32::SetClipboardData(i 1, p r2)' !endif StrCpy $0 "" ${ElseIf} $1 == "<" ;Get ;Step 1: Get clipboard data !if "${NSIS_CHAR_SIZE}" > 1 System::Call 'user32::GetClipboardData(i 13)p.r2' !else System::Call 'user32::GetClipboardData(i 1)p.r2' !endif ;Step 2: Lock and copy data (kichik's fix) System::Call 'kernel32::GlobalLock(p r2) t .r0' ;Step 3: Unlock (kichik's fix) System::Call 'kernel32::GlobalUnlock(p r2)' ${ElseIf} $1 == "<>" ;Swap ;Step 1: Get clipboard data !if "${NSIS_CHAR_SIZE}" > 1 System::Call 'user32::GetClipboardData(i 13)p.r2' !else System::Call 'user32::GetClipboardData(i 1)p.r2' !endif ;Step 2: Lock and copy data (kichik's fix) System::Call 'kernel32::GlobalLock(p r2) t .r4' ;Step 3: Unlock (kichik's fix) System::Call 'kernel32::GlobalUnlock(p r2)' ;Step 4: Clear the clipboard System::Call 'user32::EmptyClipboard()' ;Step 5: Allocate global heap StrLen $2 $0 IntOp $2 $2 + 1 !if "${NSIS_CHAR_SIZE}" > 1 IntOp $2 $2 * ${NSIS_CHAR_SIZE} !endif System::Call 'kernel32::GlobalAlloc(i 2, i r2) p.r2' ;Step 6: Lock the handle System::Call 'kernel32::GlobalLock(p r2) i.r3' ;Step 7: Copy the text to locked clipboard buffer System::Call 'kernel32::lstrcpy(p r3, t r0)' ;Step 8: Unlock the handle again System::Call 'kernel32::GlobalUnlock(p r2)' ;Step 9: Set the information to the clipboard !if "${NSIS_CHAR_SIZE}" > 1 System::Call 'user32::SetClipboardData(i 13, p r2)' !else System::Call 'user32::SetClipboardData(i 1, p r2)' !endif StrCpy $0 $4 ${Else} ;Clear ;Step 1: Clear the clipboard System::Call 'user32::EmptyClipboard()' StrCpy $0 "" ${EndIf} ;Close the clipboard System::Call 'user32::CloseClipboard()' /*After this point: ------------------------------------------ $0 = OutVar (output)*/ ;Return result to user Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrIOToNSIS !insertmacro STRFUNC_DEFFUNC StrIOToNSIS `ResultVar|String` `Output|Text` !macro STRFUNC_CALL_StrIOToNSIS un ResultVar String !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrIOToNSIS} "${ResultVar}" "${String}"` !verbose 2 Push `${String}` !insertmacro STRFUNC_CALL StrIOToNSIS "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrIOToNSIS !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso` /*After this point: ------------------------------------------ $R0 = String (input/output) $R1 = StartCharPos (temp) $R2 = StrLen (temp) $R3 = TempStr (temp) $R4 = TempRepStr (temp)*/ ;Get input from user Exch $R0 Push $R1 Push $R2 Push $R3 Push $R4 ;Get "String" length StrLen $R2 $R0 ;Loop until "String" end is reached ${For} $R1 0 $R2 ;Get the next "String" characters StrCpy $R3 $R0 2 $R1 ;Detect if current character is: ${If} $R3 == "\\" ;Back-slash StrCpy $R4 "\" ${ElseIf} $R3 == "\r" ;Carriage return StrCpy $R4 "$\r" ${ElseIf} $R3 == "\n" ;Line feed StrCpy $R4 "$\n" ${ElseIf} $R3 == "\t" ;Tab StrCpy $R4 "$\t" ${Else} ;Anything else StrCpy $R4 "" ${EndIf} ;Detect if "TempRepStr" is not empty ${If} $R4 != "" ;Replace the old characters with the new one StrCpy $R3 $R0 $R1 IntOp $R1 $R1 + 2 StrCpy $R0 $R0 "" $R1 StrCpy $R0 "$R3$R4$R0" IntOp $R2 $R2 - 1 ;Decrease "StrLen" IntOp $R1 $R1 - 2 ;Go back to the next character ${EndIf} ${Next} Pop $R4 Pop $R3 Pop $R2 Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrLoc !insertmacro STRFUNC_DEFFUNC StrLoc `ResultVar|String|StrToSearchFor|CounterDirection` `Output|Text|Text|Option > <` !macro STRFUNC_CALL_StrLoc un ResultVar String StrToSearchFor OffsetDirection !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrLoc} "${ResultVar}" "${String}" "${StrToSearchFor}" "${OffsetDirection}"` !verbose 2 Push `${String}` Push `${StrToSearchFor}` Push `${OffsetDirection}` !insertmacro STRFUNC_CALL StrLoc "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrLoc !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` /*After this point: ------------------------------------------ $R0 = OffsetDirection (input) $R1 = StrToSearch (input) $R2 = String (input) $R3 = StrToSearchLen (temp) $R4 = StrLen (temp) $R5 = StartCharPos (temp) $R6 = TempStr (temp)*/ ;Get input from user Exch $R0 Exch Exch $R1 Exch 2 Exch $R2 Push $R3 Push $R4 Push $R5 Push $R6 ;Get "String" and "StrToSearch" length StrLen $R3 $R1 StrLen $R4 $R2 ;Start "StartCharPos" counter StrCpy $R5 0 ;Loop until "StrToSearch" is found or "String" reaches its end ${Do} ;Remove everything before and after the searched part ("TempStr") StrCpy $R6 $R2 $R3 $R5 ;Compare "TempStr" with "StrToSearch" ${If} $R6 == $R1 ${If} $R0 == `<` IntOp $R6 $R3 + $R5 IntOp $R0 $R4 - $R6 ${Else} StrCpy $R0 $R5 ${EndIf} ${ExitDo} ${EndIf} ;If not "StrToSearch", this could be "String" end ${If} $R5 >= $R4 StrCpy $R0 `` ${ExitDo} ${EndIf} ;If not, continue the loop IntOp $R5 $R5 + 1 ${Loop} ;Return output to user Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Exch Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrNSISToIO !insertmacro STRFUNC_DEFFUNC StrNSISToIO `ResultVar|String` `Output|Text` !macro STRFUNC_CALL_StrNSISToIO un ResultVar String !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrNSISToIO} "${ResultVar}" "${String}"` !verbose 2 Push `${String}` !insertmacro STRFUNC_CALL StrNSISToIO "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrNSISToIO !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso` /*After this point: ------------------------------------------ $R0 = String (input/output) $R1 = StartCharPos (temp) $R2 = StrLen (temp) $R3 = TempStr (temp) $R4 = TempRepStr (temp)*/ ;Get input from user Exch $R0 Push $R1 Push $R2 Push $R3 Push $R4 ;Get "String" length StrLen $R2 $R0 ;Loop until "String" end is reached ${For} $R1 0 $R2 ;Get the next "String" character StrCpy $R3 $R0 1 $R1 ;Detect if current character is: ${If} $R3 == "$\r" ;Back-slash StrCpy $R4 "\r" ${ElseIf} $R3 == "$\n" ;Carriage return StrCpy $R4 "\n" ${ElseIf} $R3 == "$\t" ;Line feed StrCpy $R4 "\t" ${ElseIf} $R3 == "\" ;Tab StrCpy $R4 "\\" ${Else} ;Anything else StrCpy $R4 "" ${EndIf} ;Detect if "TempRepStr" is not empty ${If} $R4 != "" ;Replace the old character with the new ones StrCpy $R3 $R0 $R1 IntOp $R1 $R1 + 1 StrCpy $R0 $R0 "" $R1 StrCpy $R0 "$R3$R4$R0" IntOp $R2 $R2 + 1 ;Increase "StrLen" ${EndIf} ${Next} ;Return output to user Pop $R4 Pop $R3 Pop $R2 Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrRep !insertmacro STRFUNC_DEFFUNC StrRep `ResultVar|String|StrToReplace|ReplacementString` `Output|Text|Text|Text` !macro STRFUNC_CALL_StrRep un ResultVar String StringToReplace ReplacementString !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrRep} "${ResultVar}" "${String}" "${StringToReplace}" "${ReplacementString}"` !verbose 2 Push `${String}` Push `${StringToReplace}` Push `${ReplacementString}` !insertmacro STRFUNC_CALL StrRep "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrRep !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Hendri Adriaens` /*After this point: ------------------------------------------ $R0 = ReplacementString (input) $R1 = StrToSearch (input) $R2 = String (input) $R3 = RepStrLen (temp) $R4 = StrToSearchLen (temp) $R5 = StrLen (temp) $R6 = StartCharPos (temp) $R7 = TempStrL (temp) $R8 = TempStrR (temp)*/ ;Get input from user Exch $R0 Exch Exch $R1 Exch Exch 2 Exch $R2 Push $R3 Push $R4 Push $R5 Push $R6 Push $R7 Push $R8 ;Return "String" if "StrToSearch" is "" ${IfThen} $R1 == "" ${|} Goto Done ${|} ;Get "ReplacementString", "String" and "StrToSearch" length StrLen $R3 $R0 StrLen $R4 $R1 StrLen $R5 $R2 ;Start "StartCharPos" counter StrCpy $R6 0 ;Loop until "StrToSearch" is found or "String" reaches its end ${Do} ;Remove everything before and after the searched part ("TempStrL") StrCpy $R7 $R2 $R4 $R6 ;Compare "TempStrL" with "StrToSearch" ${If} $R7 == $R1 ;Split "String" to replace the string wanted StrCpy $R7 $R2 $R6 ;TempStrL ;Calc: "StartCharPos" + "StrToSearchLen" = EndCharPos IntOp $R8 $R6 + $R4 StrCpy $R8 $R2 "" $R8 ;TempStrR ;Insert the new string between the two separated parts of "String" StrCpy $R2 $R7$R0$R8 ;Now calculate the new "StrLen" and "StartCharPos" StrLen $R5 $R2 IntOp $R6 $R6 + $R3 ${Continue} ${EndIf} ;If not "StrToSearch", this could be "String" end ${IfThen} $R6 >= $R5 ${|} ${ExitDo} ${|} ;If not, continue the loop IntOp $R6 $R6 + 1 ${Loop} Done: /*After this point: ------------------------------------------ $R0 = OutVar (output)*/ ;Return output to user StrCpy $R0 $R2 Pop $R8 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrSort !insertmacro STRFUNC_DEFFUNC StrSort `ResultVar|String|CenterStr|LeftStr|RightStr|IncludeLeftStr|IncludeCenterStr|IncludeRightStr` `Output|Text|Text|Text|Text|Option 1 0|Option 1 0|Option 1 0` !macro STRFUNC_CALL_StrSort un ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrSort} "${ResultVar}" "${String}" "${CenterStr}" "${LeftStr}" "${RightStr}" "${IncludeCenterStr}" "${IncludeLeftStr}" "${IncludeRightStr}"` !verbose 2 Push `${String}` Push `${CenterStr}` Push `${LeftStr}` Push `${RightStr}` Push `${IncludeCenterStr}` Push `${IncludeLeftStr}` Push `${IncludeRightStr}` !insertmacro STRFUNC_CALL StrSort "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrSort !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Stuart Welch` /*After this point: ------------------------------------------ $R0 = String (input) $R1 = LeftStr (input) $R2 = CenterStr (input) $R3 = RightStr (input) $R4 = IncludeLeftStr (input) $R5 = IncludeCenterStr (input) $R6 = IncludeRightStr (input) $0 = StrLen (temp) $1 = LeftStrLen (temp) $2 = CenterStrLen (temp) $3 = RightStrLen (temp) $4 = StartPos (temp) $5 = EndPos (temp) $6 = StartCharPos (temp) $7 = EndCharPos (temp) $8 = TempStr (temp)*/ ;Get input from user Exch $R6 Exch Exch $R5 Exch Exch 2 Exch $R4 Exch 2 Exch 3 Exch $R3 Exch 3 Exch 4 Exch $R2 Exch 4 Exch 5 Exch $R1 Exch 5 Exch 6 Exch $R0 Exch 6 Push $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 ;Parameter defaults ${IfThen} $R4 == `` ${|} StrCpy $R4 `1` ${|} ${IfThen} $R5 == `` ${|} StrCpy $R5 `1` ${|} ${IfThen} $R6 == `` ${|} StrCpy $R6 `1` ${|} ;Get "String", "CenterStr", "LeftStr" and "RightStr" length StrLen $0 $R0 StrLen $1 $R1 StrLen $2 $R2 StrLen $3 $R3 ;Start "StartCharPos" counter StrCpy $6 0 ;Start "EndCharPos" counter based on "CenterStr" length IntOp $7 $6 + $2 ;Loop until "CenterStr" is found or "String" reaches its end ${Do} ;Remove everything before and after the searched part ("TempStr") StrCpy $8 $R0 $2 $6 ;Compare "TempStr" with "CenterStr" ${IfThen} $8 == $R2 ${|} ${ExitDo} ${|} ;If not, this could be "String" end ${IfThen} $7 >= $0 ${|} Goto Done ${|} ;If not, continue the loop IntOp $6 $6 + 1 IntOp $7 $7 + 1 ${Loop} # "CenterStr" was found ;Remove "CenterStr" from "String" if the user wants ${If} $R5 = ${FALSE} StrCpy $8 $R0 $6 StrCpy $R0 $R0 `` $7 StrCpy $R0 $8$R0 ${EndIf} ;"StartPos" and "EndPos" will record "CenterStr" coordinates for now StrCpy $4 $6 StrCpy $5 $7 ;"StartCharPos" and "EndCharPos" should be before "CenterStr" IntOp $6 $6 - $1 IntOp $7 $6 + $1 ;Loop until "LeftStr" is found or "String" reaches its start ${Do} ;Remove everything before and after the searched part ("TempStr") StrCpy $8 $R0 $1 $6 ;If "LeftStr" is empty ${If} $R1 == `` StrCpy $6 0 StrCpy $7 0 ${ExitDo} ${EndIf} ;Compare "TempStr" with "LeftStr" ${IfThen} $8 == $R1 ${|} ${ExitDo} ${|} ;If not, this could be "String" start ${IfThen} $6 <= 0 ${|} ${ExitDo} ${|} ;If not, continue the loop IntOp $6 $6 - 1 IntOp $7 $7 - 1 ${Loop} # "LeftStr" is found or "String" start was reached ;Remove "LeftStr" from "String" if the user wants ${If} $R4 = ${FALSE} IntOp $6 $6 + $1 ${EndIf} ;Record "LeftStr" first character position on "TempStr" (temporarily) StrCpy $8 $6 ;"StartCharPos" and "EndCharPos" should be after "CenterStr" ${If} $R5 = ${FALSE} StrCpy $6 $4 ${Else} IntOp $6 $4 + $2 ${EndIf} IntOp $7 $6 + $3 ;Record "LeftStr" first character position on "StartPos" StrCpy $4 $8 ;Loop until "RightStr" is found or "String" reaches its end ${Do} ;Remove everything before and after the searched part ("TempStr") StrCpy $8 $R0 $3 $6 ;If "RightStr" is empty ${If} $R3 == `` StrCpy $6 $0 StrCpy $7 $0 ${ExitDo} ${EndIf} ;Compare "TempStr" with "RightStr" ${IfThen} $8 == $R3 ${|} ${ExitDo} ${|} ;If not, this could be "String" end ${IfThen} $7 >= $0 ${|} ${ExitDo} ${|} ;If not, continue the loop IntOp $6 $6 + 1 IntOp $7 $7 + 1 ${Loop} ;Remove "RightStr" from "String" if the user wants ${If} $R6 = ${FALSE} IntOp $7 $7 - $3 ${EndIf} ;Record "RightStr" last character position on "StartPos" StrCpy $5 $7 ;As the positionment is relative... IntOp $5 $5 - $4 ;Write the string and finish the job StrCpy $R0 $R0 $5 $4 Goto +2 Done: StrCpy $R0 `` /*After this point: ------------------------------------------ $R0 = OutVar (output)*/ ;Return output to user Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrStr !insertmacro STRFUNC_DEFFUNC StrStr `ResultVar|String|StrToSearchFor` `Output|Text|Text` !macro STRFUNC_CALL_StrStr un ResultVar String StrToSearchFor !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrStr} "${ResultVar}" "${String}" "${StrToSearchFor}"` !verbose 2 Push `${String}` Push `${StrToSearchFor}` !insertmacro STRFUNC_CALL StrStr "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrStr !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` /*After this point: ------------------------------------------ $R0 = StrToSearch (input) $R1 = String (input) $R2 = StrToSearchLen (temp) $R3 = StrLen (temp) $R4 = StartCharPos (temp) $R5 = TempStr (temp)*/ ;Get input from user Exch $R0 Exch Exch $R1 Push $R2 Push $R3 Push $R4 Push $R5 ;Get "String" and "StrToSearch" length StrLen $R2 $R0 StrLen $R3 $R1 ;Start "StartCharPos" counter StrCpy $R4 0 ;Loop until "StrToSearch" is found or "String" reaches its end ${Do} ;Remove everything before and after the searched part ("TempStr") StrCpy $R5 $R1 $R2 $R4 ;Compare "TempStr" with "StrToSearch" ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|} ;If not "StrToSearch", this could be "String" end ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|} ;If not, continue the loop IntOp $R4 $R4 + 1 ${Loop} /*After this point: ------------------------------------------ $R0 = OutVar (output)*/ ;Remove part before "StrToSearch" on "String" (if there has one) StrCpy $R0 $R1 `` $R4 ;Return output to user Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrStrAdv !insertmacro STRFUNC_DEFFUNC StrStrAdv `ResultVar|String|StrToSearchFor|SearchDirection|ResultStrDirection|DisplayStrToSearch|Loops|CaseSensitive` `Output|Text|Text|Option > <|Option > <|Option 1 0|Text|Option 0 1` !macro STRFUNC_CALL_StrStrAdv un ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrStrAdv} "${ResultVar}" "${String}" "${StrToSearchFor}" "${SearchDirection}" "${ResultStrDirection}" "${DisplayStrToSearch}" "${Loops}" "${CaseSensitive}"` !verbose 2 Push `${String}` Push `${StrToSearchFor}` Push `${SearchDirection}` Push `${ResultStrDirection}` Push `${DisplayStrToSearch}` Push `${Loops}` Push `${CaseSensitive}` !insertmacro STRFUNC_CALL StrStrAdv "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrStrAdv !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2003-2004 Diego Pedroso` /*After this point: ------------------------------------------ $0 = String (input) $1 = StringToSearch (input) $2 = DirectionOfSearch (input) $3 = DirectionOfReturn (input) $4 = ShowStrToSearch (input) $5 = NumLoops (input) $6 = CaseSensitive (input) $7 = StringLength (temp) $8 = StrToSearchLength (temp) $9 = CurrentLoop (temp) $R0 = EndCharPos (temp) $R1 = StartCharPos (temp) $R2 = OutVar (output) $R3 = Temp (temp)*/ ;Get input from user Exch $6 Exch Exch $5 Exch Exch 2 Exch $4 Exch 2 Exch 3 Exch $3 Exch 3 Exch 4 Exch $2 Exch 4 Exch 5 Exch $1 Exch 5 Exch 6 Exch $0 Exch 6 Push $7 Push $8 Push $9 Push $R3 Push $R2 Push $R1 Push $R0 ; Clean $R0-$R3 variables StrCpy $R0 "" StrCpy $R1 "" StrCpy $R2 "" StrCpy $R3 "" ; Verify if we have the correct values on the variables ${If} $0 == `` SetErrors ;AdvStrStr_StrToSearch not found Goto AdvStrStr_End ${EndIf} ${If} $1 == `` SetErrors ;No text to search Goto AdvStrStr_End ${EndIf} ${If} $2 != < StrCpy $2 > ${EndIf} ${If} $3 != < StrCpy $3 > ${EndIf} ${If} $4 <> 0 StrCpy $4 1 ${EndIf} ${If} $5 <= 0 StrCpy $5 0 ${EndIf} ${If} $6 <> 1 StrCpy $6 0 ${EndIf} ; Find "AdvStrStr_String" length StrLen $7 $0 ; Then find "AdvStrStr_StrToSearch" length StrLen $8 $1 ; Now set up basic variables ${If} $2 == < IntOp $R1 $7 - $8 StrCpy $R2 $7 ${Else} StrCpy $R1 0 StrCpy $R2 $8 ${EndIf} StrCpy $9 0 ; First loop ;Let's begin the search ${Do} ; Step 1: If the starting or ending numbers are negative ; or more than AdvStrStr_StringLen, we return ; error ${If} $R1 < 0 StrCpy $R1 `` StrCpy $R2 `` StrCpy $R3 `` SetErrors ;AdvStrStr_StrToSearch not found Goto AdvStrStr_End ${ElseIf} $R2 > $7 StrCpy $R1 `` StrCpy $R2 `` StrCpy $R3 `` SetErrors ;AdvStrStr_StrToSearch not found Goto AdvStrStr_End ${EndIf} ; Step 2: Start the search depending on ; AdvStrStr_DirectionOfSearch. Chop down not needed ; characters. ${If} $R1 <> 0 StrCpy $R3 $0 `` $R1 ${EndIf} ${If} $R2 <> $7 ${If} $R1 = 0 StrCpy $R3 $0 $8 ${Else} StrCpy $R3 $R3 $8 ${EndIf} ${EndIf} ; Step 3: Make sure that's the string we want ; Case-Sensitive Support <- Use "AdvStrStr_Temp" ; variable because it won't be used anymore ${If} $6 == 1 System::Call `kernel32::lstrcmp(ts, ts) i.s` `$R3` `$1` Pop $R3 ${If} $R3 = 0 StrCpy $R3 1 ; Continue ${Else} StrCpy $R3 0 ; Break ${EndIf} ${Else} ${If} $R3 == $1 StrCpy $R3 1 ; Continue ${Else} StrCpy $R3 0 ; Break ${EndIf} ${EndIf} ; After the comparison, confirm that it is the ; value we want. ${If} $R3 = 1 ;We found it, return except if the user has set up to ;search for another one: ${If} $9 >= $5 ;Now, let's see if the user wants ;AdvStrStr_StrToSearch to appear: ${If} $4 == 0 ;Return depends on AdvStrStr_DirectionOfReturn ${If} $3 == < ; RTL StrCpy $R0 $0 $R1 ${Else} ; LTR StrCpy $R0 $0 `` $R2 ${EndIf} ${Break} ${Else} ;Return depends on AdvStrStr_DirectionOfReturn ${If} $3 == < ; RTL StrCpy $R0 $0 $R2 ${Else} ; LTR StrCpy $R0 $0 `` $R1 ${EndIf} ${Break} ${EndIf} ${Else} ;If the user wants to have more loops, let's do it so! IntOp $9 $9 + 1 ${If} $2 == < IntOp $R1 $R1 - 1 IntOp $R2 $R2 - 1 ${Else} IntOp $R1 $R1 + 1 IntOp $R2 $R2 + 1 ${EndIf} ${EndIf} ${Else} ; Step 4: We didn't find it, so do steps 1 thru 3 again ${If} $2 == < IntOp $R1 $R1 - 1 IntOp $R2 $R2 - 1 ${Else} IntOp $R1 $R1 + 1 IntOp $R2 $R2 + 1 ${EndIf} ${EndIf} ${Loop} AdvStrStr_End: ;Add 1 to AdvStrStr_EndCharPos to be supportable ;by "StrCpy" IntOp $R2 $R2 - 1 ;Return output to user Exch $R0 Exch Pop $R1 Exch Pop $R2 Exch Pop $R3 Exch Pop $9 Exch Pop $8 Exch Pop $7 Exch Pop $6 Exch Pop $5 Exch Pop $4 Exch Pop $3 Exch Pop $2 Exch Pop $1 Exch Pop $0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrTok !insertmacro STRFUNC_DEFFUNC StrTok `ResultVar|String|Separators|ResultPart|SkipEmptyParts` `Output|Text|Text|Mixed L|Option 1 0` !macro STRFUNC_CALL_StrTok un ResultVar String Separators ResultPart SkipEmptyParts !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrTok} "${ResultVar}" "${String}" "${Separators}" "${ResultPart}" "${SkipEmptyParts}"` !verbose 2 Push `${String}` Push `${Separators}` Push `${ResultPart}` Push `${SkipEmptyParts}` !insertmacro STRFUNC_CALL StrTok "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrTok !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by "bigmac666"` /*After this point: ------------------------------------------ $0 = SkipEmptyParts (input) $1 = ResultPart (input) $2 = Separators (input) $3 = String (input) $4 = StrToSearchLen (temp) $5 = StrLen (temp) $6 = StartCharPos (temp) $7 = TempStr (temp) $8 = CurrentLoop $9 = CurrentSepChar $R0 = CurrentSepCharNum */ ;Get input from user Exch $0 Exch Exch $1 Exch Exch 2 Exch $2 Exch 2 Exch 3 Exch $3 Exch 3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R0 ;Parameter defaults ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|} ${IfThen} $1 == `` ${|} StrCpy $1 `L` ${|} ${IfThen} $0 == `` ${|} StrCpy $0 `0` ${|} ;Get "String" and "StrToSearch" length StrLen $4 $2 StrLen $5 $3 ;Start "StartCharPos" and "ResultPart" counters StrCpy $6 0 StrCpy $8 -1 ;Loop until "ResultPart" is met, "StrToSearch" is found or ;"String" reaches its end ResultPartLoop: ;"CurrentLoop" Loop ;Increase "CurrentLoop" counter IntOp $8 $8 + 1 StrSearchLoop: ${Do} ;"String" Loop ;Remove everything before and after the searched part ("TempStr") StrCpy $7 $3 1 $6 ;Verify if it's the "String" end ${If} $6 >= $5 ;If "CurrentLoop" is what the user wants, remove the part ;after "TempStr" and itself and get out of here ${If} $8 == $1 ${OrIf} $1 == `L` StrCpy $3 $3 $6 ${Else} ;If not, empty "String" and get out of here StrCpy $3 `` ${EndIf} StrCpy $R0 `End` ${ExitDo} ${EndIf} ;Start "CurrentSepCharNum" counter (for "Separators" Loop) StrCpy $R0 0 ${Do} ;"Separators" Loop ;Use one "Separators" character at a time ${If} $R0 <> 0 StrCpy $9 $2 1 $R0 ${Else} StrCpy $9 $2 1 ${EndIf} ;Go to the next "String" char if it's "Separators" end ${IfThen} $R0 >= $4 ${|} ${ExitDo} ${|} ;Or, if "TempStr" equals "CurrentSepChar", then... ${If} $7 == $9 StrCpy $7 $3 $6 ;If "String" is empty because this result part doesn't ;contain data, verify if "SkipEmptyParts" is activated, ;so we don't return the output to user yet ${If} $7 == `` ${AndIf} $0 = ${TRUE} IntOp $6 $6 + 1 StrCpy $3 $3 `` $6 StrCpy $6 0 Goto StrSearchLoop ${ElseIf} $8 == $1 StrCpy $3 $3 $6 StrCpy $R0 "End" ${ExitDo} ${EndIf} ;If not, go to the next result part IntOp $6 $6 + 1 StrCpy $3 $3 `` $6 StrCpy $6 0 Goto ResultPartLoop ${EndIf} ;Increase "CurrentSepCharNum" counter IntOp $R0 $R0 + 1 ${Loop} ${IfThen} $R0 == "End" ${|} ${ExitDo} ${|} ;Increase "StartCharPos" counter IntOp $6 $6 + 1 ${Loop} /*After this point: ------------------------------------------ $3 = OutVar (output)*/ ;Return output to user Pop $R0 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $0 Pop $1 Pop $2 Exch $3 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ # StrTrimNewLines !insertmacro STRFUNC_DEFFUNC StrTrimNewLines `ResultVar|String` `Output|Text` !macro STRFUNC_CALL_StrTrimNewLines un ResultVar String !verbose push ${STRFUNC_VERBOSITY} !echo `${U+24}{${un}StrTrimNewLines} "${ResultVar}" "${String}"` !verbose 2 Push `${String}` !insertmacro STRFUNC_CALL StrTrimNewLines "${un}" Pop ${ResultVar} !verbose pop !macroend !macro STRFUNC_MAKEFUNC_StrTrimNewLines !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` /*After this point: ------------------------------------------ $R0 = String (input) $R1 = TrimCounter (temp) $R2 = Temp (temp)*/ ;Get input from user Exch $R0 Push $R1 Push $R2 ;Initialize trim counter StrCpy $R1 0 loop: ;Subtract to get "String"'s last characters IntOp $R1 $R1 - 1 ;Verify if they are either $\r or $\n StrCpy $R2 $R0 1 $R1 ${If} $R2 == `$\r` ${OrIf} $R2 == `$\n` Goto loop ${EndIf} ;Trim characters (if needed) IntOp $R1 $R1 + 1 ${If} $R1 < 0 StrCpy $R0 $R0 $R1 ${EndIf} /*After this point: ------------------------------------------ $R0 = OutVar (output)*/ ;Return output to user Pop $R2 Pop $R1 Exch $R0 !insertmacro STRFUNC_ENDFUNC !macroend ############################################################################ !endif !verbose 3 !define STRFUNC_VERBOSITY ${_STRFUNC_VERBOSITY} !undef _STRFUNC_VERBOSITY !verbose pop nsis-3.11/Include/StrFunc.txt000077500000000000000000000573671477201124000161450ustar00rootroot00000000000000String Functions Header File Readme ----------------------------------- String Functions Header File contains a set of good string manipulation functions in a much simpler way to include and call in NSIS scripts. How to use ---------- Basic Syntax ------------ Parameters are specified in this format: required (required) (option1 | option2) [optional or add. options] [option1 | option2] The stars in command titles (*****) are the function usefulness in my opinion. The more starts, the more useful it is. 5 stars (*****) is the most useful. Any time when is mentioned "Default is" means that you can use the value mentioned or keep it blank, the result is the same. If you want a certain value (e.g. a text) to be language-specific, set a language string (using LangString) and define $(STRINGNAME) as value. If you want to add ` to a string, you should always escape it using $\` because the header file macro functions use ` to separate parameters. 1. Include Header file ---------------------- !include "StrFunc.nsh" StrFunc.nsh is inside the Include directory, so you don't have to specify a path. You have to put this command before any command used in this header file. 2. Defines ---------- This header file contains defines that automate the life of some who fear a lot of changes sometimes imposed in this header file, or who have applications that put it to work at maximum capacity. Before you try these, take a look at the information below: - Every item on a define value is separated by a "|", and every subitem (items in an item) is separated by " ". - Use ${StrTok} $var "${DefineName}" "|" "$counter" "0" to get every item inside the define. For subitems, use ${StrTok} $var2 "$var" " " "$counter2" "0" after getting the value for a desired item. - ${StrFunc_List} is automatically made by the header file. The rest is manually added to the header. 2.1 Defines List: ----------------- StrFunc_List - Lists all function names currently available on StrFunc header file. *_List - Lists all parameter names currently available for "*" function. (* = function name - i.e. StrTok_List). *_TypeList - Lists the types of all parameters on "*" function. (* = function name - i.e. StrTok_List). Possible types for each parameter: - Output - Needs a variable to output a function result. - Text - Needs text or number to be input. - Mixed - Needs text, number or option to be input. Each subitem following the "Mixed" word is an option. The first option is ever the default one. Two following spaces " " means that that subitem is empty. - Option - Needs an option to be input. Each subitem following the "Option" word is an option. The first option is ever the default one. Two following spaces " " means that that subitem is empty. 3. Commands ----------- Some commands have special specifications to work. Consult command's documentation on "3.3 Commands" section. 3.1 How To Use Commands In Install Sections and Functions --------------------------------------------------------- Every command used in install sections and functions have to be declared before (and outside of) any sections and functions, and without parameters. Example: -------- ${UsingStrFunc} StrStr 3.2 How To Use Commands In Uninstall Sections and Functions ----------------------------------------------------------- Commands for uninstall sections and functions have "Un" before the name. Example: -------- ${UsingStrFunc} UnStrStr A complete example with both Install and Uninstall Commands: ------------------------------------------------------------ !include "StrFunc.nsh" ${UsingStrFunc} StrStr # Supportable for Install Sections and Functions ${UsingStrFunc} UnStrStr # Supportable for Uninstall Sections and Functions Section ${StrStr} $0 "OK! Now what?" "wh" SectionEnd Section Uninstall ${UnStrStr} $0 "OK! Now what?" "wh" SectionEnd 3.3 Commands ------------ ========================================================================= ** ${StrCase} ------------------------------------------------------------------------- ResultVar String Type(|L|U|T|S|<>) ========================================================================= Converts "String" to "Type" Case. Uses LogicLib. Parameters: ResultVar Destination where result is returned. String String to convert to "Type" case. Type Type of string case to convert to: - "" = Original Case (same as "String") - L = Lower Case (this is just an example. a very simple one.) - U = Upper Case (THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.) - T = Title Case (This Is Just An Example. A Very Simple One.) - S = Sentence Case (This is just an example. A very simple one.) - <> = Switch Case (This is just an example. A very simple one.) Default value is "" (Original Case). Result Value -> ResultVar: "String" in "Type" case. Example: ${StrCase} $0 '"Você" is "You" in English.' "U" [__(_)__()___()__()__(____)_] $0 = '"VOCÊ" IS "YOU" IN ENGLISH.' ========================================================================= * ${StrClb} ------------------------------------------------------------------------- ResultVar String Action(|>|<|<>) ========================================================================= Makes an action with the clipboard depending on value of parameter "Action". Uses LogicLib. Parameters: String If "Action" = ">" or "<>" - String to put on the clipboard. Action Can be one of the following values: - "" = Cleans the clipboard. - ">" = Set string to clipboard. - "<" = Get string from clipboard. - "<>" = Swap string with clipboard's. Result Value -> ResultVar: If "Action" = "<" or "<>" - String found on the clipboard. ========================================================================= *** ${StrIOToNSIS} ------------------------------------------------------------------------- ResultVar String ========================================================================= Convert "String" from Install Options plugin to be supported by NSIS. Escape, back-slash, carriage return, line feed and tab characters are converted. Parameters: ResultVar Destination where result is returned. String String to convert to be supportable for NSIS. Result Value -> ResultVar: "String" supportable for NSIS. Example: ${StrIOToNSIS} $0 "\r\n\t\\This is just an example\\" [()()()()_______________________()] $0 = "$\r$\n$\t\This is just an example\" ========================================================================= * ${StrLoc} ------------------------------------------------------------------------- ResultVar String StrToSearchFor CounterDirection(>|<) ========================================================================= Searches for "StrToSearchFor" in "String" and returns its location, according to "CounterDirection". Parameters: ResultVar Destination where result is returned. String String where to search "StrToSearchFor". StrToSearchFor String to search in "String". CounterDirection(>|<) Direction where the counter increases to. Default is ">". (> = increases from left to right, < = increases from right to left) Result Value -> ResultVar: Where "StrToSearchFor" is, according to "OffsetDirection". Example: ${StrLoc} $0 "This is just an example" "just" "<" (__)<<<<<<<<<<< $0 = "11" ========================================================================= *** ${StrNSISToIO} ------------------------------------------------------------------------- ResultVar String ========================================================================= Converts "String" from NSIS to be supported by Install Options plugin. Escape, back-slash, carriage return, line feed and tab characters are converted. Parameters: ResultVar Destination where result is returned. String String to convert to be supportable for Install Options plugin. Result Value -> ResultVar: "String" supportable for Install Options plugin. Example: ${StrNSISToIO} $0 "$\r$\n$\t\This is just an example\" [(_)(_)(_)^_______________________^] $0 = "\r\n\t\\This is just an example\\" ========================================================================= ***** ${StrRep} ------------------------------------------------------------------------- ResultVar String StrToReplace ReplacementString ========================================================================= Searches for all "StrToReplace" in "String" replacing those with "ReplacementString". Parameters: ResultVar Destination where result is returned. String String where to search "StrToReplace". StrToReplaceFor String to search in "String". StringToBeReplacedWith String to replace "StringToReplace" when it is found in "String". Result Value -> ResultVar: "String" with all occurrences of "StringToReplace" replaced with "ReplacementString". Example: ${StrRep} $0 "This is just an example" "an" "one" [____________()_______] $0 = "This is just one example" ========================================================================= *** ${StrSort} ------------------------------------------------------------------------- ResultVar String CenterStr LeftStr RightStr IncludeLeftStr(1|0) IncludeCenterStr(1|0) IncludeRightStr(1|0) ========================================================================= Searches for "CenterStr" in "String", and returns only the value between "LeftStr" and "RightStr", including or not the "CenterStr" using "IncludeCenterStr" and/or the "LeftStr" using "IncludeLeftStr" and "RightStr" using "IncludeRightStr". Parameters: ResultVar Destination where result is returned. String String where to search "CenterStr". CenterStr String to search in "String". LeftStr The first occurrence of "LeftStr" on the left of "CenterStr". If it is an empty value, or was not found, will return everything on the left of "CenterStr". RightStr The first occurrence of "RightStr" on the right of "CenterStr". If it is an empty value, or was not found, will return everything on the right of "CenterStr". IncludeLeftStr(1|0) Include or not the "LeftStr" in the result value. Default is 1 (True). (1 = True, 0 = False) IncludeCenterStr(1|0) Include or not the "CenterStr" in the result value. Default is 1 (True). (1 = True, 0 = False) IncludeRightStr(1|0) Include or not the "RightStr" in the result value. Default is 1 (True). (1 = True, 0 = False) Result Value -> ResultVar: String between "LeftStr" and "RightStr" of a found "CenterStr" including or not the "LeftStr" and "RightStr" if "IncludeLeftRightStr" is 1 and/or the "CenterStr" if "IncludeCenterStr" is 1. Example: ${StrSort} $0 "This is just an example" " just" "" "ple" "0" "0" "0" [_______(___)_______]( ) C R $0 = "This is an exam" ========================================================================= ***** ${StrStr} ------------------------------------------------------------------------- ResultVar String StrToSearchFor ========================================================================= Searches for "StrToSearchFor" in "String". Parameters: ResultVar Destination where result is returned. String String where to search "StrToSearchFor". StrToSearchFor String to search in "String". Result Value -> ResultVar: "StrToSearchFor" + the string after where "StrToSearchFor" was found in "String". Example: ${StrStr} $0 "This is just an example" "just" >>>>>>>>>{_)____________] $0 = "just an example" ========================================================================= ***** ${StrStrAdv} ------------------------------------------------------------------------- ResultVar String StrToSearchFor SearchDirection(>|<) ResultStrDirection(>|<) DisplayStrToSearch(1|0) Loops CaseSensitive(0|1) ========================================================================= Searches for "StrToSearchFor" in "String" in the direction specified by "SearchDirection" and looping "Loops" times. Parameters: ResultVar Destination where result is returned. String String where to search "StrToSearchFor". StrToSearchFor String to search in "String". SearchDirection (>|<) Where do you want to direct the search. Default is ">" (to right). (< = To left, > = To right) ResultStrDirection (>|<) Where the result string will be based on in relation of "StrToSearchFor" position. Default is ">" (to right). (< = To left, > = To right) DisplayStrToSearch (1|0) Display "StrToSearchFor" in the result. Default is "1" (True). (1 = True, 0 = False) Loops Number of times the code will search "StrToSearchFor" in "String" not including the original execution. Default is "0" (1 code execution). CaseSensitive(0|1) If "1" the search will be case-sensitive (differentiates between cases). If "0" it is case-insensitive (does not differentiate between cases). Default is "0" (Case-Insensitive). Result Value -> ResultVar: "StrToSearchFor" if "DisplayStrToSearch" is 1 + the result string after or before "StrToSearchFor", depending on "ResultStrDirection". Result with Errors: When "StrToSearchFor" was not found, will return an empty string. When you put nothing in "StrToSearchFor", will return "String" and set error flag. When you put nothing in "String", will return an empty string and set error flag. Example: ${StrStrAdv} $0 "This IS really just an example" "IS " ">" ">" "0" "0" "1" >>>>>( )[____________________] $0 = "really just an example" ========================================================================= **** ${StrTok} ------------------------------------------------------------------------- ResultVar String Separators ResultPart[L] SkipEmptyParts(1|0) ========================================================================= Returns the part "ResultPart" between two "Separators" inside "String". Parameters: ResultVar Destination where result is returned. String String where to search for "Separators". Separators Characters to find on "String". ResultPart[L] The part want to be found on "StrToTokenize" between two "Separators". Can be any number, starting at 0, and "L" that is the last part. Default is L (Last part). SkipEmptyParts(1|0) Skips empty string parts between two "Separators". Default is 1 (True). (1 = True, 0 = False) Result Value -> ResultVar: "String" part number "Part" between two "Separators". Examples: 1) ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1" ( ) () () () [_] ( ) () ( ) 0 1 2 3 4 5 6 7 $0 = "not" 2) ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0" ( ) () ^() [] ( ) ^( ) () ( ) 0 1 23 4 5 67 8 9 $0 = "is" ========================================================================= * ${StrTrimNewLines} ------------------------------------------------------------------------- ResultVar String ========================================================================= Deletes unnecessary new lines at end of "String". Parameters: ResultVar Destination where result is returned. String String where to search unnecessary new lines at end of "String". Result Value -> ResultVar: "String" with unnecessary end new lines removed. Example: ${StrTrimNewLines} $0 "$\r$\nThis is just an example$\r$\n$\r$\n" [_____________________________(_)(_)(_)(_)] $0 = "$\r$\nThis is just an example" Functions included and not included -------------------------------------------------- 11 functions have been included They are not available on Archive They are on LogicLib format 15 functions have not been included 12 were not included because of better functions 6 were not included because of AdvStrTok (called here as StrTok) First String Part Function Save on Variables Function Sort Strings (1, 2 and 3) Functions StrTok Function 2 were not included because of StrCase StrLower Function StrUpper Function 2 were not included because of StrClb StrClbSet Function StrClbGet Function 1 was not included because of NSISToIO and IOToNSIS Convert / to // in Paths Function 1 was not included because of original String Replace Function (called here as StrRep) Another String Replace Function 2 were not included because they aren't useful anymore Slash <-> Backslash Converter Function Trim Function 1 was not included because of bugs Number to String Converter Function Version History --------------- 1.09 - 10/22/2004 - Fixed stack problems involving: StrCase, StrRep, StrSort, StrTok. - Fixed StrClb: When "Action" = "<>", handle was wrongly output as text. - Fixed StrSort, StrStrAdv documentation examples. - Fixed StrIOToNSIS, StrLoc, StrNSISToIO, StrRep, StrStr: sometimes didn't find "StrToSearch" at all. 1.08 - 10/12/2004 - Converted all the functions to LogicLib. - StrSort: Totally remade and it can break old scripts. See documentation for details. - StrTok: "ResultPart" has to start from 0 and it can break old scripts. See documentation for details. - Added defines: StrFunc_List, *_List and *_TypeList. - Fixed StrStrAdv: Variables $R0-$R3 couldn't be used in scripts before calling. - StrRep: Cut down some variables. - Arranged correctly the order of StrSort on the documentation. 1.07 - 09/21/2004 - Removed ${UnStrFunc} command. Now you can just include uninstall functions commands like ${UnStrStr} to be supported by uninstall functions and sections. - Added case-sensitive comparison option for StrStrAdv. - StrCase now uses System.dll which makes case conversions effective with all latin letters (i.e. ê). - Added switch case and original case for StrCase. - StrClbSet and StrClbGet removed, added StrClb. - Made compact the most usual operations inside the header file. File size reduced. 1.06 - 03/26/2004 - StrNumToStr removed due to complex number handling on some languages. - Fixed the bug where the old string was attached to string returned by StrCase when $R5 variable was used. 1.05 - 03/17/2004 - Fixed a bug with StrCase, Title Case wasn't working as should be. - Fixed a bug with StrStrAdv, previous fix created another bug, string not returned correctly when using backwards search with "DisplayStrToSearch" as "0". 1.04 - 03/07/2004 - Added new StrCase, removed StrLower and StrUpper. - Organized by name commands inside header and readme files. 1.03 - 02/12/2004 - Added commands support for uninstall sections and functions. - Fixed variables switch in "StrLoc" and "StrTok" after using these. 1.02 - 02/07/2004 - Fixed StrLoc. - Fixed Documentation about StrLoc. "Direction" is really "OffsetDirection". - Added my new AdvStrSort, and removed the old one. 1.01 - 02/05/2004 - Fixed Documentation about StrSort and StrTok. - Fixed StrTok default value for the string part. Now it's "L". - Fixed StrStrAdv fixed wrong search when had a combination of same substrings one after another in a string. - Fixed StrLoc: when a string isn't found, don't return any value at all. 1.00 - 02/01/2004 - Added documentation. - Renamed header file to "StrFunc.nsh". - Added 1 function, StrLoc. - Modified StrStrAdv, removed some lines. - Fixed StrTok, 2 simple numbers made it loop every time. - Fixed some small issues on the header file. 0.02 - 01/24/2004 - Completed StrFunc.nsh file. Need some tests and the readme. 0.01 - 01/22/2004 - First version to test ideas... Credits ------- Made by Diego Pedroso (aka deguix). Functions Credits ----------------- - All functions are made by Diego Pedroso on LogicLib format. They are based on functions by Amir Szekely, Dave Laundon, Hendri Adriaens, Nik Medved, Joost Verburg, Stuart Welch, Ximon Eighteen, "bigmac666" and "bluenet". "bluenet"'s version of StrIOToNSIS and StrNSISToIO on LogicLib format were included. License ------- This header file is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages arising from the use of this header file. Permission is granted to anyone to use this header file for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this header file must not be misrepresented; you must not claim that you wrote the original header file. If you use this header file in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original header file. 3. This notice may not be removed or altered from any distribution.nsis-3.11/Include/TextFunc.nsh000077500000000000000000000574341477201124000162650ustar00rootroot00000000000000/* _____________________________________________________________________________ Text Functions Header v2.4 _____________________________________________________________________________ 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) See documentation for more information about the following functions. Usage in script: 1. !include "TextFunc.nsh" 2. [Section|Function] ${TextFunction} "File" "..." $var [SectionEnd|FunctionEnd] TextFunction=[LineFind|LineRead|FileReadFromEnd|LineSum|FileJoin| TextCompare|TextCompareS|ConfigRead|ConfigReadS| ConfigWrite|ConfigWriteS|FileRecode|TrimNewLines] _____________________________________________________________________________ Thanks to: _____________________________________________________________________________ LineRead Afrow UK (Based on his idea of Function "ReadFileLine") LineSum Afrow UK (Based on his idea of Function "LineCount") FileJoin Afrow UK (Based on his idea of Function "JoinFiles") ConfigRead vbgunz (His idea) ConfigWrite vbgunz (His idea) TrimNewLines sunjammer (Based on his Function "TrimNewLines") */ ;_____________________________________________________________________________ ; ; Macros ;_____________________________________________________________________________ ; ; Change log window verbosity (default: 3=no script) ; ; Example: ; !include "TextFunc.nsh" ; !insertmacro LineFind ; ${TEXTFUNC_VERBOSE} 4 # all verbosity ; !insertmacro LineSum ; ${TEXTFUNC_VERBOSE} 3 # no script !ifndef TEXTFUNC_INCLUDED !verbose push 3 !define /IfNDef _TEXTFUNC_VERBOSE 3 !verbose ${_TEXTFUNC_VERBOSE} !define TEXTFUNC_VERBOSE `!insertmacro TEXTFUNC_VERBOSE` !define TEXTFUNC_INCLUDED !include FileFunc.nsh !include Util.nsh !macro TEXTFUNC_VERBOSE _VERBOSE !verbose push 3 !define /ReDef _TEXTFUNC_VERBOSE ${_VERBOSE} !verbose pop !macroend !macro LineFindCall _INPUT _OUTPUT _RANGE _FUNC !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push $0 Push `${_INPUT}` Push `${_OUTPUT}` Push `${_RANGE}` GetFunctionAddress $0 `${_FUNC}` Push `$0` ${CallArtificialFunction} LineFind_ Pop $0 !verbose pop !macroend !macro LineReadCall _FILE _NUMBER _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` Push `${_NUMBER}` ${CallArtificialFunction} LineRead_ Pop ${_RESULT} !verbose pop !macroend !macro FileReadFromEndCall _FILE _FUNC !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push $0 Push `${_FILE}` GetFunctionAddress $0 `${_FUNC}` Push `$0` ${CallArtificialFunction} FileReadFromEnd_ Pop $0 !verbose pop !macroend !macro LineSumCall _FILE _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` ${CallArtificialFunction} LineSum_ Pop ${_RESULT} !verbose pop !macroend !macro FileJoinCall _FILE1 _FILE2 _FILE3 !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE1}` Push `${_FILE2}` Push `${_FILE3}` ${CallArtificialFunction} FileJoin_ !verbose pop !macroend !macro TextCompareCall _FILE1 _FILE2 _OPTION _FUNC !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push $0 Push `${_FILE1}` Push `${_FILE2}` Push `${_OPTION}` GetFunctionAddress $0 `${_FUNC}` Push `$0` ${CallArtificialFunction} TextCompare_ Pop $0 !verbose pop !macroend !macro TextCompareSCall _FILE1 _FILE2 _OPTION _FUNC !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push $0 Push `${_FILE1}` Push `${_FILE2}` Push `${_OPTION}` GetFunctionAddress $0 `${_FUNC}` Push `$0` ${CallArtificialFunction} TextCompareS_ Pop $0 !verbose pop !macroend !macro ConfigReadCall _FILE _ENTRY _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` Push `${_ENTRY}` ${CallArtificialFunction} ConfigRead_ Pop ${_RESULT} !verbose pop !macroend !macro ConfigReadSCall _FILE _ENTRY _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` Push `${_ENTRY}` ${CallArtificialFunction} ConfigReadS_ Pop ${_RESULT} !verbose pop !macroend !macro ConfigWriteCall _FILE _ENTRY _VALUE _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` Push `${_ENTRY}` Push `${_VALUE}` ${CallArtificialFunction} ConfigWrite_ Pop ${_RESULT} !verbose pop !macroend !macro ConfigWriteSCall _FILE _ENTRY _VALUE _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` Push `${_ENTRY}` Push `${_VALUE}` ${CallArtificialFunction} ConfigWriteS_ Pop ${_RESULT} !verbose pop !macroend !macro FileRecodeCall _FILE _FORMAT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` Push `${_FORMAT}` ${CallArtificialFunction} FileRecode_ !verbose pop !macroend !macro TrimNewLinesCall _FILE _RESULT !verbose push !verbose ${_TEXTFUNC_VERBOSE} Push `${_FILE}` ${CallArtificialFunction} TrimNewLines_ Pop ${_RESULT} !verbose pop !macroend !macro _TextFunc_TempFileForFile _FILE _RESULT # XXX replace with GetParent Push `${_FILE}` Exch $0 Push $1 Push $2 StrCpy $2 $0 1 -1 StrCmp $2 '\' 0 +3 StrCpy $0 $0 -1 goto -3 StrCpy $1 0 IntOp $1 $1 - 1 StrCpy $2 $0 1 $1 StrCmp $2 '\' +2 StrCmp $2 '' 0 -3 StrCpy $0 $0 $1 Pop $2 Pop $1 Exch $0 Pop ${_RESULT} # XXX StrCmp ${_RESULT} "" 0 +2 StrCpy ${_RESULT} $EXEDIR GetTempFileName ${_RESULT} ${_RESULT} StrCmp ${_RESULT} "" 0 +2 GetTempFileName ${_RESULT} ClearErrors !macroend !define LineFind `!insertmacro LineFindCall` !define un.LineFind `!insertmacro LineFindCall` !macro LineFind !macroend !macro un.LineFind !macroend !macro LineFind_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $3 Exch Exch $2 Exch Exch 2 Exch $1 Exch 2 Exch 3 Exch $0 Exch 3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R4 Push $R5 Push $R6 Push $R7 Push $R8 Push $R9 ClearErrors IfFileExists '$0' 0 TextFunc_LineFind_error StrCmp $1 '/NUL' TextFunc_LineFind_begin StrCpy $8 0 IntOp $8 $8 - 1 StrCpy $9 $1 1 $8 StrCmp $9 \ +2 StrCmp $9 '' +3 -3 StrCpy $9 $1 $8 IfFileExists '$9\*.*' 0 TextFunc_LineFind_error TextFunc_LineFind_begin: StrCpy $4 1 StrCpy $5 -1 StrCpy $6 0 StrCpy $7 0 StrCpy $R4 '' StrCpy $R6 '' StrCpy $R7 '' StrCpy $R8 0 StrCpy $8 $2 1 StrCmp $8 '{' 0 TextFunc_LineFind_delspaces StrCpy $2 $2 '' 1 StrCpy $8 $2 1 -1 StrCmp $8 '}' 0 TextFunc_LineFind_delspaces StrCpy $2 $2 -1 StrCpy $R6 TextFunc_LineFind_cut TextFunc_LineFind_delspaces: StrCpy $8 $2 1 StrCmp $8 ' ' 0 +3 StrCpy $2 $2 '' 1 goto -3 StrCmp $2$7 '0' TextFunc_LineFind_file StrCpy $4 '' StrCpy $5 '' StrCmp $2 '' TextFunc_LineFind_writechk TextFunc_LineFind_range: StrCpy $8 0 StrCpy $9 $2 1 $8 StrCmp $9 '' +5 StrCmp $9 ' ' +4 StrCmp $9 ':' +3 IntOp $8 $8 + 1 goto -5 StrCpy $5 $2 $8 IntOp $5 $5 + 0 IntOp $8 $8 + 1 StrCpy $2 $2 '' $8 StrCmp $4 '' 0 +2 StrCpy $4 $5 StrCmp $9 ':' TextFunc_LineFind_range IntCmp $4 0 0 +2 IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp StrCmp $R7 '' 0 TextFunc_LineFind_minus2plus StrCpy $R7 0 FileOpen $8 $0 r FileRead $8 $9 IfErrors +3 IntOp $R7 $R7 + 1 Goto -3 FileClose $8 TextFunc_LineFind_minus2plus: IntCmp $4 0 +5 0 +5 IntOp $4 $R7 + $4 IntOp $4 $4 + 1 IntCmp $4 0 +2 0 +2 StrCpy $4 0 IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp IntOp $5 $R7 + $5 IntOp $5 $5 + 1 TextFunc_LineFind_growthcmp: IntCmp $4 $5 TextFunc_LineFind_goto TextFunc_LineFind_goto StrCpy $5 $4 TextFunc_LineFind_goto: goto $7 TextFunc_LineFind_file: StrCmp $1 '/NUL' TextFunc_LineFind_notemp !insertmacro _TextFunc_TempFileForFile $1 $R4 Push $R4 FileOpen $R4 $R4 w TextFunc_LineFind_notemp: FileOpen $R5 $0 r IfErrors TextFunc_LineFind_preerror TextFunc_LineFind_loop: IntOp $R8 $R8 + 1 FileRead $R5 $R9 IfErrors TextFunc_LineFind_handleclose TextFunc_LineFind_cmp: StrCmp $2$4$5 '' TextFunc_LineFind_writechk IntCmp $4 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_writechk StrCmp $5 -1 TextFunc_LineFind_call IntCmp $5 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_call GetLabelAddress $7 TextFunc_LineFind_cmp goto TextFunc_LineFind_delspaces TextFunc_LineFind_call: StrCpy $7 $R9 Push $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $R4 Push $R5 Push $R6 Push $R7 Push $R8 StrCpy $R6 '$4:$5' StrCmp $R7 '' +3 IntOp $R7 $R8 - $R7 IntOp $R7 $R7 - 1 Call $3 Pop $9 Pop $R8 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 IfErrors TextFunc_LineFind_preerror StrCmp $9 'StopLineFind' 0 +3 IntOp $6 $6 + 1 goto TextFunc_LineFind_handleclose StrCmp $1 '/NUL' TextFunc_LineFind_loop StrCmp $9 'SkipWrite' 0 +3 IntOp $6 $6 + 1 goto TextFunc_LineFind_loop StrCmp $7 $R9 TextFunc_LineFind_write IntOp $6 $6 + 1 goto TextFunc_LineFind_write TextFunc_LineFind_writechk: StrCmp $1 '/NUL' TextFunc_LineFind_loop StrCmp $R6 TextFunc_LineFind_cut 0 TextFunc_LineFind_write IntOp $6 $6 + 1 goto TextFunc_LineFind_loop TextFunc_LineFind_write: FileWrite $R4 $R9 goto TextFunc_LineFind_loop TextFunc_LineFind_preerror: SetErrors TextFunc_LineFind_handleclose: StrCmp $1 '/NUL' +3 FileClose $R4 Pop $R4 FileClose $R5 IfErrors TextFunc_LineFind_error StrCmp $1 '/NUL' TextFunc_LineFind_end StrCmp $1 '' 0 +2 StrCpy $1 $0 StrCmp $6 0 0 TextFunc_LineFind_rename FileOpen $7 $0 r FileSeek $7 0 END $8 FileClose $7 FileOpen $7 $R4 r FileSeek $7 0 END $9 FileClose $7 IntCmp $8 $9 0 TextFunc_LineFind_rename Delete $R4 StrCmp $1 $0 TextFunc_LineFind_end CopyFiles /SILENT $0 $1 goto TextFunc_LineFind_end TextFunc_LineFind_rename: Delete '$EXEDIR\$1' Rename $R4 '$EXEDIR\$1' IfErrors 0 TextFunc_LineFind_end Delete $1 Rename $R4 $1 IfErrors 0 TextFunc_LineFind_end TextFunc_LineFind_error: SetErrors TextFunc_LineFind_end: Pop $R9 Pop $R8 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !verbose pop !macroend !define LineRead `!insertmacro LineReadCall` !define un.LineRead `!insertmacro LineReadCall` !macro LineRead !macroend !macro un.LineRead !macroend !macro LineRead_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 ClearErrors IfFileExists $0 0 TextFunc_LineRead_error IntOp $1 $1 + 0 IntCmp $1 0 TextFunc_LineRead_error 0 TextFunc_LineRead_plus StrCpy $4 0 FileOpen $2 $0 r IfErrors TextFunc_LineRead_error FileRead $2 $3 IfErrors +3 IntOp $4 $4 + 1 Goto -3 FileClose $2 IntOp $1 $4 + $1 IntOp $1 $1 + 1 IntCmp $1 0 TextFunc_LineRead_error TextFunc_LineRead_error TextFunc_LineRead_plus: FileOpen $2 $0 r IfErrors TextFunc_LineRead_error StrCpy $3 0 IntOp $3 $3 + 1 FileRead $2 $0 IfErrors +4 StrCmp $3 $1 0 -3 FileClose $2 goto TextFunc_LineRead_end FileClose $2 TextFunc_LineRead_error: SetErrors StrCpy $0 '' TextFunc_LineRead_end: Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define FileReadFromEnd `!insertmacro FileReadFromEndCall` !define un.FileReadFromEnd `!insertmacro FileReadFromEndCall` !macro FileReadFromEnd !macroend !macro un.FileReadFromEnd !macroend !macro FileReadFromEnd_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $7 Push $8 Push $9 ClearErrors StrCpy $7 -1 StrCpy $8 0 IfFileExists $0 0 TextFunc_FileReadFromEnd_error FileOpen $0 $0 r IfErrors TextFunc_FileReadFromEnd_error FileRead $0 $9 IfErrors +4 Push $9 IntOp $8 $8 + 1 goto -4 FileClose $0 TextFunc_FileReadFromEnd_nextline: StrCmp $8 0 TextFunc_FileReadFromEnd_end Pop $9 Push $1 Push $7 Push $8 Call $1 Pop $0 Pop $8 Pop $7 Pop $1 IntOp $7 $7 - 1 IntOp $8 $8 - 1 IfErrors TextFunc_FileReadFromEnd_error StrCmp $0 'StopFileReadFromEnd' TextFunc_FileReadFromEnd_clearstack TextFunc_FileReadFromEnd_nextline TextFunc_FileReadFromEnd_error: SetErrors TextFunc_FileReadFromEnd_clearstack: StrCmp $8 0 TextFunc_FileReadFromEnd_end Pop $9 IntOp $8 $8 - 1 goto TextFunc_FileReadFromEnd_clearstack TextFunc_FileReadFromEnd_end: Pop $9 Pop $8 Pop $7 Pop $1 Pop $0 !verbose pop !macroend !define LineSum `!insertmacro LineSumCall` !define un.LineSum `!insertmacro LineSumCall` !macro LineSum !macroend !macro un.LineSum !macroend !macro LineSum_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $0 Push $1 Push $2 ClearErrors IfFileExists $0 0 TextFunc_LineSum_error StrCpy $2 0 FileOpen $0 $0 r IfErrors TextFunc_LineSum_error FileRead $0 $1 IfErrors +3 IntOp $2 $2 + 1 Goto -3 FileClose $0 StrCpy $0 $2 goto TextFunc_LineSum_end TextFunc_LineSum_error: SetErrors StrCpy $0 '' TextFunc_LineSum_end: Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define FileJoin `!insertmacro FileJoinCall` !define un.FileJoin `!insertmacro FileJoinCall` !macro FileJoin !macroend !macro un.FileJoin !macroend !macro FileJoin_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Push $3 Push $4 Push $5 ClearErrors IfFileExists $0 0 TextFunc_FileJoin_error IfFileExists $1 0 TextFunc_FileJoin_error StrCpy $3 0 IntOp $3 $3 - 1 StrCpy $4 $2 1 $3 StrCmp $4 \ +2 StrCmp $4 '' +3 -3 StrCpy $4 $2 $3 IfFileExists '$4\*.*' 0 TextFunc_FileJoin_error StrCmp $2 $0 0 +2 StrCpy $2 '' StrCmp $2 '' 0 +3 StrCpy $4 $0 Goto TextFunc_FileJoin_notemp !insertmacro _TextFunc_TempFileForFile $2 $4 CopyFiles /SILENT $0 $4 TextFunc_FileJoin_notemp: FileOpen $3 $4 a IfErrors TextFunc_FileJoin_error FileSeek $3 -1 END FileRead $3 $5 StrCmp $5 '$\r' +3 StrCmp $5 '$\n' +2 FileWrite $3 '$\r$\n' ;FileWrite $3 '$\r$\n--Divider--$\r$\n' FileOpen $0 $1 r IfErrors TextFunc_FileJoin_error FileRead $0 $5 IfErrors +3 FileWrite $3 $5 goto -3 FileClose $0 FileClose $3 StrCmp $2 '' TextFunc_FileJoin_end Delete '$EXEDIR\$2' Rename $4 '$EXEDIR\$2' IfErrors 0 TextFunc_FileJoin_end Delete $2 Rename $4 $2 IfErrors 0 TextFunc_FileJoin_end TextFunc_FileJoin_error: SetErrors TextFunc_FileJoin_end: Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !verbose pop !macroend !macro TextCompareBody _TEXTFUNC_S Exch $3 Exch Exch $2 Exch Exch 2 Exch $1 Exch 2 Exch 3 Exch $0 Exch 3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 ClearErrors IfFileExists $0 0 TextFunc_TextCompare${_TEXTFUNC_S}_error IfFileExists $1 0 TextFunc_TextCompare${_TEXTFUNC_S}_error StrCmp $2 'FastDiff' +5 StrCmp $2 'FastEqual' +4 StrCmp $2 'SlowDiff' +3 StrCmp $2 'SlowEqual' +2 goto TextFunc_TextCompare${_TEXTFUNC_S}_error FileOpen $4 $0 r IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error FileOpen $5 $1 r IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error SetDetailsPrint textonly StrCpy $6 0 StrCpy $8 0 TextFunc_TextCompare${_TEXTFUNC_S}_nextline: StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_fast IntOp $8 $8 + 1 FileRead $4 $9 IfErrors 0 +4 FileClose $4 StrCpy $4 '' StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_end StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_fast StrCmp $2 'FastEqual' TextFunc_TextCompare${_TEXTFUNC_S}_fast TextFunc_TextCompare${_TEXTFUNC_S}_slow TextFunc_TextCompare${_TEXTFUNC_S}_fast: StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_call IntOp $6 $6 + 1 FileRead $5 $7 IfErrors 0 +5 FileClose $5 StrCpy $5 '' StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_end StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_close StrCmp $2 'FastDiff' 0 +2 StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_call StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_slow: StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_close StrCpy $6 '' DetailPrint '$8. $9' FileSeek $5 0 TextFunc_TextCompare${_TEXTFUNC_S}_slownext: FileRead $5 $7 IfErrors 0 +2 StrCmp $2 'SlowDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline StrCmp $2 'SlowDiff' 0 +2 StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_slownext IntOp $6 $6 + 1 StrCmp${_TEXTFUNC_S} $7 $9 0 TextFunc_TextCompare${_TEXTFUNC_S}_slownext TextFunc_TextCompare${_TEXTFUNC_S}_call: Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Call $3 Pop $0 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 StrCmp $0 'StopTextCompare' 0 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_close: FileClose $4 FileClose $5 goto TextFunc_TextCompare${_TEXTFUNC_S}_end TextFunc_TextCompare${_TEXTFUNC_S}_error: SetErrors TextFunc_TextCompare${_TEXTFUNC_S}_end: SetDetailsPrint both Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !macroend !define TextCompare `!insertmacro TextCompareCall` !define un.TextCompare `!insertmacro TextCompareCall` !macro TextCompare !macroend !macro un.TextCompare !macroend !macro TextCompare_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} !insertmacro TextCompareBody '' !verbose pop !macroend !define TextCompareS `!insertmacro TextCompareSCall` !define un.TextCompareS `!insertmacro TextCompareSCall` !macro TextCompareS !macroend !macro un.TextCompareS !macroend !macro TextCompareS_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} !insertmacro TextCompareBody 'S' !verbose pop !macroend !macro ConfigReadBody _TEXTFUNC_S Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 ClearErrors FileOpen $2 $0 r IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error StrLen $0 $1 StrCmp${_TEXTFUNC_S} $0 0 TextFunc_ConfigRead${_TEXTFUNC_S}_error TextFunc_ConfigRead${_TEXTFUNC_S}_readnext: FileRead $2 $3 IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error StrCpy $4 $3 $0 StrCmp${_TEXTFUNC_S} $4 $1 0 TextFunc_ConfigRead${_TEXTFUNC_S}_readnext StrCpy $0 $3 '' $0 StrCpy $4 $0 1 -1 StrCmp${_TEXTFUNC_S} $4 '$\r' +2 StrCmp${_TEXTFUNC_S} $4 '$\n' 0 TextFunc_ConfigRead${_TEXTFUNC_S}_close StrCpy $0 $0 -1 goto -4 TextFunc_ConfigRead${_TEXTFUNC_S}_error: SetErrors StrCpy $0 '' TextFunc_ConfigRead${_TEXTFUNC_S}_close: FileClose $2 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !macroend !define ConfigRead `!insertmacro ConfigReadCall` !define un.ConfigRead `!insertmacro ConfigReadCall` !macro ConfigRead !macroend !macro un.ConfigRead !macroend !macro ConfigRead_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} !insertmacro ConfigReadBody '' !verbose pop !macroend !define ConfigReadS `!insertmacro ConfigReadSCall` !define un.ConfigReadS `!insertmacro ConfigReadSCall` !macro ConfigReadS !macroend !macro un.ConfigReadS !macroend !macro ConfigReadS_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} !insertmacro ConfigReadBody 'S' !verbose pop !macroend !macro ConfigWriteBody _TEXTFUNC_S Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Push $3 Push $4 Push $5 Push $6 ClearErrors IfFileExists $0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_error FileOpen $3 $0 a IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_error StrLen $0 $1 StrCmp${_TEXTFUNC_S} $0 0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext StrCpy $0 '' goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext: FileRead $3 $4 IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_add StrCpy $5 $4 $0 StrCmp${_TEXTFUNC_S} $5 $1 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext StrCpy $5 0 IntOp $5 $5 - 1 StrCpy $6 $4 1 $5 StrCmp${_TEXTFUNC_S} $6 '$\r' -2 StrCmp${_TEXTFUNC_S} $6 '$\n' -3 StrCpy $6 $4 StrCmp${_TEXTFUNC_S} $5 -1 +3 IntOp $5 $5 + 1 StrCpy $6 $4 $5 StrCmp${_TEXTFUNC_S} $2 '' TextFunc_ConfigWrite${_TEXTFUNC_S}_change StrCmp${_TEXTFUNC_S} $6 '$1$2' 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_change StrCpy $0 SAME goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close TextFunc_ConfigWrite${_TEXTFUNC_S}_change: FileSeek $3 0 CUR $5 StrLen $4 $4 IntOp $4 $5 - $4 FileSeek $3 0 END $6 IntOp $6 $6 - $5 System::Alloc $6 Pop $0 FileSeek $3 $5 SET System::Call 'kernel32::ReadFile(p r3, p r0, i $6, t.,)' FileSeek $3 $4 SET StrCmp${_TEXTFUNC_S} $2 '' +2 FileWrite $3 '$1$2$\r$\n' System::Call 'kernel32::WriteFile(p r3, p r0, i $6, t.,)' System::Call 'kernel32::SetEndOfFile(p r3)' System::Free $0 StrCmp${_TEXTFUNC_S} $2 '' +3 StrCpy $0 CHANGED goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close StrCpy $0 DELETED goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close TextFunc_ConfigWrite${_TEXTFUNC_S}_add: StrCmp${_TEXTFUNC_S} $2 '' 0 +3 StrCpy $0 SAME goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close FileSeek $3 -1 END FileRead $3 $4 IfErrors +4 StrCmp${_TEXTFUNC_S} $4 '$\r' +3 StrCmp${_TEXTFUNC_S} $4 '$\n' +2 FileWrite $3 '$\r$\n' FileWrite $3 '$1$2$\r$\n' StrCpy $0 ADDED TextFunc_ConfigWrite${_TEXTFUNC_S}_close: FileClose $3 goto TextFunc_ConfigWrite${_TEXTFUNC_S}_end TextFunc_ConfigWrite${_TEXTFUNC_S}_error: SetErrors StrCpy $0 '' TextFunc_ConfigWrite${_TEXTFUNC_S}_end: Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !macroend !define ConfigWrite `!insertmacro ConfigWriteCall` !define un.ConfigWrite `!insertmacro ConfigWriteCall` !macro ConfigWrite !macroend !macro un.ConfigWrite !macroend !macro ConfigWrite_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} !insertmacro ConfigWriteBody '' !verbose pop !macroend !define ConfigWriteS `!insertmacro ConfigWriteSCall` !define un.ConfigWriteS `!insertmacro ConfigWriteSCall` !macro ConfigWriteS !macroend !macro un.ConfigWriteS !macroend !macro ConfigWriteS_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} !insertmacro ConfigWriteBody 'S' !verbose pop !macroend !define FileRecode `!insertmacro FileRecodeCall` !define un.FileRecode `!insertmacro FileRecodeCall` !macro FileRecode !macroend !macro un.FileRecode !macroend !macro FileRecode_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 IfFileExists $0 0 TextFunc_FileRecode_error StrCmp $1 OemToChar +2 StrCmp $1 CharToOem 0 TextFunc_FileRecode_error FileOpen $2 $0 a FileSeek $2 0 END $3 System::Alloc $3 Pop $4 FileSeek $2 0 SET System::Call 'kernel32::ReadFile(p r2, p r4, i $3, t.,)' System::Call 'user32::$1Buff(p r4, p r4, i $3)' FileSeek $2 0 SET System::Call 'kernel32::WriteFile(p r2, p r4, i $3, t.,)' System::Free $4 FileClose $2 goto TextFunc_FileRecode_end TextFunc_FileRecode_error: SetErrors TextFunc_FileRecode_end: Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !verbose pop !macroend !define TrimNewLines `!insertmacro TrimNewLinesCall` !define un.TrimNewLines `!insertmacro TrimNewLinesCall` !macro TrimNewLines !macroend !macro un.TrimNewLines !macroend !macro TrimNewLines_ !verbose push !verbose ${_TEXTFUNC_VERBOSE} Exch $0 Push $1 Push $2 StrCpy $1 0 IntOp $1 $1 - 1 StrCpy $2 $0 1 $1 StrCmp $2 '$\r' -2 StrCmp $2 '$\n' -3 StrCmp $1 -1 +3 IntOp $1 $1 + 1 StrCpy $0 $0 $1 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !verbose pop !endif nsis-3.11/Include/UpgradeDLL.nsh000077500000000000000000000120141477201124000164310ustar00rootroot00000000000000/* NOTE: ----- This macro is provided for backwards compatibility with NSIS 2.0 scripts. It's recommended you update your scripts to use the new Library.nsh macros. Macro - Upgrade DLL File Written by Joost Verburg ------------------------ Parameters: LOCALFILE Location of the new DLL file (on the compiler system) DESTFILE Location of the DLL file that should be upgraded (on the user's system) TEMPBASEDIR Directory on the user's system to store a temporary file when the system has to be rebooted. For Win9x/ME support, this should be on the same volume as DESTFILE. The Windows temp directory could be located on any volume, so you cannot use this directory. Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered. Notes: * If you want to support Windows 9x/ME, you can only use short filenames (8.3). * This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries. This command is only supported when compiling on a Windows system. ------------------------ Example: !insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR" */ !ifndef UPGRADEDLL_INCLUDED !define UPGRADEDLL_INCLUDED !macro __UpgradeDLL_Helper_AddRegToolEntry mode filename tempdir Push $R0 Push $R1 Push $R2 Push $R3 ;------------------------ ;Copy the parameters Push "${filename}" Push "${tempdir}" Pop $R2 ; temporary directory Pop $R1 ; file name to register ;------------------------ ;Advance counter StrCpy $R0 0 ReadRegDWORD $R0 HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "count" IntOp $R0 $R0 + 1 WriteRegDWORD HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "count" "$R0" ;------------------------ ;Setup RegTool !if ! /FileExists "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" !error "Missing RegTool for ${NSIS_CPU}!" !endif ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool.v3" StrCpy $R3 $R3 -4 1 IfFileExists $R3 +3 File /oname=$R2\NSIS.Library.RegTool.v3.$HWNDPARENT.exe "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ "NSIS.Library.RegTool.v3" '"$R2\NSIS.Library.RegTool.v3.$HWNDPARENT.exe" /S' ;------------------------ ;Add RegTool entry WriteRegStr HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "$R0.file" "$R1" WriteRegStr HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "$R0.mode" "${mode}" Pop $R3 Pop $R2 Pop $R1 Pop $R0 !macroend !macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR Push $R0 Push $R1 Push $R2 Push $R3 Push $R4 Push $R5 !define UPGRADEDLL_UNIQUE "${__FILE__}${__LINE__}" SetOverwrite try ;------------------------ ;Copy the macro parameters to a run-time to a variable, ;this allows the usage of variables as parameter StrCpy $R4 "${DESTFILE}" StrCpy $R5 "${TEMPBASEDIR}" ;------------------------ ;Get version information IfFileExists $R4 0 "upgradedll.copy_${UPGRADEDLL_UNIQUE}" ClearErrors GetDLLVersionLocal "${LOCALFILE}" $R0 $R1 GetDLLVersion $R4 $R2 $R3 IfErrors "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" IntCmpU $R0 $R2 0 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" IntCmpU $R1 $R3 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.done_${UPGRADEDLL_UNIQUE}" \ "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" ;------------------------ ;Upgrade "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:" !ifndef UPGRADEDLL_NOREGISTER ;Unregister the DLL UnRegDLL $R4 !endif ;------------------------ ;Copy ClearErrors StrCpy $R0 $R4 Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" IfErrors 0 "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}" ;------------------------ ;Copy on reboot GetTempFileName $R0 $R5 Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" Rename /REBOOTOK $R0 $R4 ;------------------------ ;Register on reboot !insertmacro __UpgradeDLL_Helper_AddRegToolEntry 'D' $R4 $R5 Goto "upgradedll.done_${UPGRADEDLL_UNIQUE}" ;------------------------ ;DLL does not exist "upgradedll.copy_${UPGRADEDLL_UNIQUE}:" StrCpy $R0 $R4 Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" ;------------------------ ;Register "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:" !ifndef UPGRADEDLL_NOREGISTER RegDLL $R4 !endif ;------------------------ ;Done "upgradedll.done_${UPGRADEDLL_UNIQUE}:" Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Pop $R0 ;------------------------ ;End Goto "upgradedll.end_${UPGRADEDLL_UNIQUE}" ;------------------------ ;Extract "upgradedll.file_${UPGRADEDLL_UNIQUE}:" File /oname=$R0 "${LOCALFILE}" Return "upgradedll.end_${UPGRADEDLL_UNIQUE}:" SetOverwrite lastused !undef UPGRADEDLL_UNIQUE !macroend !endif nsis-3.11/Include/Util.nsh000077500000000000000000000121341477201124000154260ustar00rootroot00000000000000; --------------------- ; Util.nsh ; --------------------- ; ; Voodoo macros to make end-user usage easier. This may be documented someday. !verbose push 3 !ifndef ___UTIL__NSH___ !define ___UTIL__NSH___ # CallArtificialFunction, see WinVer.nsh and *Func.nsh for usage examples !macro CallArtificialFunctionHelper TYPE NAME !verbose pop Call :.${NAME}${TYPE} !ifndef ${NAME}${TYPE}_DEFINED !verbose push 2 Goto ${NAME}${TYPE}_DONE !define ${NAME}${TYPE}_DEFINED !verbose pop .${NAME}${TYPE}: !insertmacro ${NAME} Return ${NAME}${TYPE}_DONE: !endif !verbose push 2 !macroend !macro CallArtificialFunction NAME !verbose push 2 !ifdef __UNINSTALL__ !insertmacro CallArtificialFunctionHelper uninst ${NAME} !else !insertmacro CallArtificialFunctionHelper inst ${NAME} !endif !verbose pop !macroend !define CallArtificialFunction `!insertmacro CallArtificialFunction` !macro CallArtificialFunction2 NAME ; Retained for v2.4x..v3.0b0 compatibility ${CallArtificialFunction} ${NAME} !macroend !define CallArtificialFunction2 `!insertmacro CallArtificialFunction` !define Int32Op '!insertmacro Int32Op ' !define Int64Op '!insertmacro Int64Op ' !define IntPtrOp '!insertmacro IntPtrOp ' !macro Int32Op r a o b IntOp `${r}` `${a}` `${o}` ${b} !macroend !macro Int64Op r a o b !echo "Int64Op ${r}=${a}${o}${b}" !verbose push 2 System::Int64Op `${a}` `${o}` ${b} Pop ${r} !verbose pop !macroend !macro IntPtrOp r a o b IntPtrOp `${r}` `${a}` `${o}` `${b}` !macroend !define Int32Cmp '!insertmacro Int32Cmp ' !define Int64Cmp '!insertmacro Int64Cmp ' !define IntPtrCmp '!insertmacro IntPtrCmp ' !macro Int32Cmp a b jeek jles jgtr IntCmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !macroend !macro Int64Cmp a b jeek jles jgtr !if ${NSIS_PTR_SIZE} <= 4 !ifmacrondef _LOGICLIB_TEMP !include LogicLib.nsh !endif !echo "Int64Cmp ${a}:${b} =${jeek}, <${jles}, >${jgtr}" !verbose push 2 ${IfThen} ${a} L= ${b} ${|} Goto ${jeek} ${|} !insertmacro _L< ${a} ${b} `${jles}` `${jgtr}` !verbose pop !else Int64Cmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !endif !macroend !macro IntPtrCmp a b jeek jles jgtr IntPtrCmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !macroend !define Int32CmpU '!insertmacro Int32CmpU ' !define Int64CmpU '!insertmacro Int64CmpU ' !define IntPtrCmpU '!insertmacro IntPtrCmpU ' !macro Int32CmpU a b jeek jles jgtr IntCmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !macroend !macro Int64CmpUHelper ; This macro performs "$_LOGICLIB_TEMP = a < b ? -1 : a > b ? 1 : 0" but System::Int64Op does not support unsigned operations so we have to perform multiple steps !ifmacrondef _LOGICLIB_TEMP !include LogicLib.nsh !endif !insertmacro _LOGICLIB_TEMP Exch $2 ; b Exch Exch $1 ; a ; if (a == b) return 0; ; if (a < 0) ; { ; if (b >= 0) return 1 ; } ; else ; { ; if (b < 0) return -1 ; } ; return a < b ? -1 : 1 System::Int64Op $1 ^ $2 ; Using xor so $_LOGICLIB_TEMP ends up as 0 when they are equal Pop $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP 0 ret ; NOTE: Must use StrCmp, IntCmp fails on "0x8000000000000001 Z> 1" System::Int64Op $1 < 0 Pop $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP 0 checkNegOther System::Int64Op $2 < 0 ; System::Int64Op does not support the >= operator so we invert the operation Pop $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP 0 retPos finalCmp retPos: StrCpy $_LOGICLIB_TEMP "1" Goto ret checkNegOther: System::Int64Op $2 < 0 Pop $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP 0 finalCmp retNeg retNeg: StrCpy $_LOGICLIB_TEMP "-1" Goto ret finalCmp: System::Int64Op $1 < $2 Pop $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP 0 retPos retNeg ret: Pop $1 Pop $2 !macroend !macro Int64CmpU a b jeek jles jgtr !if ${NSIS_PTR_SIZE} <= 4 !echo "Int64CmpU ${a}:${b} =${jeek}, <${jles}, >${jgtr}" !verbose push 2 Push `${a}` Push `${b}` !insertmacro CallArtificialFunction Int64CmpUHelper IntCmp $_LOGICLIB_TEMP 0 `${jeek}` `${jles}` `${jgtr}` !verbose pop !else Int64CmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !endif !macroend !macro IntPtrCmpU a b jeek jles jgtr IntPtrCmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !macroend !define MakeARPInstallDate "!insertmacro MakeARPInstallDate " !macro MakeARPInstallDate _outvar System::Call 'KERNEL32::GetDateFormat(i0x409,i0,p0,t"yyyyMMdd",t.s,i${NSIS_MAX_STRLEN})' Pop ${_outvar} !macroend !define /IfNDef SPI_GETHIGHCONTRAST 0x42 !define /IfNDef HCF_HIGHCONTRASTON 0x01 !define /IfNDef /math SYSSIZEOF_HIGHCONTRAST 8 + ${NSIS_PTR_SIZE} !define IsHighContrastModeActive '"" IsHighContrastModeActive ""' !macro _IsHighContrastModeActive _lhs _rhs _t _f !ifmacrondef _LOGICLIB_TEMP !include LogicLib.nsh !endif !insertmacro _LOGICLIB_TEMP Push $1 System::Call '*(i${SYSSIZEOF_HIGHCONTRAST},i0,p)p.r1' System::Call 'USER32::SystemParametersInfo(i${SPI_GETHIGHCONTRAST},i${SYSSIZEOF_HIGHCONTRAST},pr1,i0)' System::Call '*$1(i,i.s)' Pop $_LOGICLIB_TEMP System::Free $1 Pop $1 !insertmacro _& $_LOGICLIB_TEMP ${HCF_HIGHCONTRASTON} `${_t}` `${_f}` !macroend !endif # !___UTIL__NSH___ !verbose pop nsis-3.11/Include/VB6RunTime.nsh000077500000000000000000000066101477201124000164140ustar00rootroot00000000000000/* VB6RunTime.nsh Setup of Visual Basic 6.0 run-time files, including the Oleaut32.dll security update Copyright 2008-2025 Joost Verburg To obtain the run-time files, download and extract https://nsis.sourceforge.io/vb6runtime.zip Script code for installation: !insertmacro InstallVB6RunTime FOLDER ALREADY_INSTALLED in which FOLDER is the location of the run-time files and ALREADY_INSTALLED is the name of a variable that is empty when the application is installed for the first time and non-empty otherwise Script code for uninstallation: !insertmacro UnInstallVB6RunTime Remarks: * You may have to install additional files for such Visual Basic application to work, such as OCX files for user interface controls. * Installation of the run-time files requires Administrator or Power User privileges. Use the Multi-User header file to verify whether these privileges are available. * Add a Modern UI finish page or another check (see IfRebootFlag in the NSIS Users Manual) to allow the user to restart the computer when necessary. */ !ifndef VB6_INCLUDED !define VB6_INCLUDED !verbose push !verbose 3 !include Library.nsh !include WinVer.nsh !macro VB6RunTimeInstall FOLDER ALREADY_INSTALLED !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\msvbvm60.dll" "$SYSDIR\msvbvm60.dll" "$SYSDIR" ;The files below will only be installed on Win9x/NT4 !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\olepro32.dll" "$SYSDIR\olepro32.dll" "$SYSDIR" !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\comcat.dll" "$SYSDIR\comcat.dll" "$SYSDIR" !insertmacro InstallLib DLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\asycfilt.dll" "$SYSDIR\asycfilt.dll" "$SYSDIR" !insertmacro InstallLib TLB "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\stdole2.tlb" "$SYSDIR\stdole2.tlb" "$SYSDIR" Push $R0 ${if} ${IsNT} ${if} ${IsWinNT4} ReadRegStr $R0 HKLM "System\CurrentControlSet\Control" "ProductOptions" ${if} $R0 == "Terminal Server" !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4TS\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR" ${else} !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR" ${endif} ${endif} ${else} ;No Oleaut32.dll with the security update has been released for Windows 9x. ;The NT4 version is used because NT4 and Win9x used to share the same 2.40 version ;and version 2.40.4519.0 is reported to work fine on Win9x. !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR" ${endif} Pop $R0 !macroend !macro VB6RunTimeUnInstall !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\msvbvm60.dll" !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\oleaut32.dll" !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\olepro32.dll" !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\comcat.dll" !insertmacro UnInstallLib DLL SHARED NOREMOVE "$SYSDIR\asycfilt.dll" !insertmacro UnInstallLib TLB SHARED NOREMOVE "$SYSDIR\stdole2.tlb" !macroend !verbose pop !endif nsis-3.11/Include/Win/000077500000000000000000000000001477201124000145305ustar00rootroot00000000000000nsis-3.11/Include/Win/COM.nsh000077500000000000000000000415401477201124000156670ustar00rootroot00000000000000/* ------------- COM.nsh ------------- COM defines and helper macros ; Example usage: !include LogicLib.nsh !include Win\COM.nsh !include Win\Propkey.nsh !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 "" ${If} $0 P<> 0 ${IShellLink::SetPath} $0 '("%COMSPEC%").r1' ${IShellLink::SetArguments} $0 '("/k echo HelloWorld").r2' ${If} $1 = 0 ${AndIf} $2 = 0 ${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r1)' ${If} $1 P<> 0 System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_StartPinOption})p.r2' System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_UI4},,&i4 ${APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL})p.r3' ${IPropertyStore::SetValue} $1 '($2,$3)' ; Reuse the PROPERTYKEY & PROPVARIANT buffers to set another property System::Call '*$2${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ExcludeFromShowInNewInstall})' System::Call '*$3${SYSSTRUCT_PROPVARIANT}(${VT_BOOL},,&i2 ${VARIANT_TRUE})' ${IPropertyStore::SetValue} $1 '($2,$3)' System::Free $2 System::Free $3 ${IPropertyStore::Commit} $1 "" ${IUnknown::Release} $1 "" ${EndIf} ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)' ${If} $1 P<> 0 ${IPersistFile::Save} $1 '("$SMPrograms\nsis_test.lnk",1)' ${IUnknown::Release} $1 "" ${EndIf} ${EndIf} ${IUnknown::Release} $0 "" ${EndIf} */ !ifndef __WIN_COM__INC !define __WIN_COM__INC ${NSIS_CHAR_SIZE} !verbose push !verbose 3 !define /ifndef STGM_READ 0 !define /ifndef STGM_WRITE 1 !define /ifndef STGM_READWRITE 2 !define /ifndef STGM_SHARE_DENY_NONE 0x00000040 !define /ifndef STGM_SHARE_DENY_READ 0x00000030 !define /ifndef STGM_SHARE_DENY_WRITE 0x00000020 !define /ifndef STGM_SHARE_EXCLUSIVE 0x00000010 !define /ifndef STGM_PRIORITY 0x00040000 !define /ifndef STGM_CREATE 0x00001000 !define /ifndef STGM_CONVERT 0x00020000 !define /ifndef STGM_FAILIFTHERE 0 !define /ifndef STGM_DELETEONRELEASE 0x04000000 !define /ifndef CLSCTX_INPROC_SERVER 0x1 !define /ifndef CLSCTX_INPROC_HANDLER 0x2 !define /ifndef CLSCTX_LOCAL_SERVER 0x4 !define /ifndef CLSCTX_REMOTE_SERVER 0x10 !define /ifndef CLSCTX_ACTIVATE_32_BIT_SERVER 0x40000 !define /ifndef CLSCTX_ACTIVATE_64_BIT_SERVER 0x80000 !define /ifndef CLSCTX_ENABLE_CLOAKING 0x100000 !define NSISCOMCALL "!insertmacro NSISCOMCALL " !macro NSISCOMCALL vtblidx decl ptr params !if ${NSIS_CHAR_SIZE} <> ${__WIN_COM__INC} ; Warn if QueryInterface() for IID_IShellLink etc will return the wrong interface !warning "NSIS_CHAR_SIZE changed, existing defines and macros might not work correctly!" !endif System::Call `${ptr}->${vtblidx}${decl}${params}` !macroend !define NSISCOMIFACEDECL "!insertmacro NSISCOMIFACEDECL " !macro NSISCOMIFACEDECL iface method vtblidx decl !define ${iface}::${method} `${NSISCOMCALL} ${vtblidx} ${decl} ` !macroend !macro ComHlpr_CreateInstance clsid iid sysoutvarIFacePtr sysret System::Call 'OLE32::CoCreateInstance(g"${clsid}",i0,i23,g"${iid}",*p.${sysoutvarIFacePtr})i${sysret}' !macroend !macro ComHlpr_CreateInProcInstance clsid iid sysoutvarIFacePtr sysret System::Call 'OLE32::CoCreateInstance(g"${clsid}",i0,i${CLSCTX_INPROC_SERVER},g"${iid}",*p.${sysoutvarIFacePtr})i${sysret}' !macroend !macro ComHlpr_SafeRelease _p ${If} ${_p} P<> 0 ${IUnknown::Release} ${_p} "" ${EndIf} !macroend !macro ComHlpr_SafeReleaseAndNull _p ${If} ${_p} P<> 0 ${IUnknown::Release} ${_p} "" StrCpy ${_p} 0 ${EndIf} !macroend !ifndef IID_IUnknown !define IID_IUnknown {00000000-0000-0000-C000-000000000046} ${NSISCOMIFACEDECL}IUnknown QueryInterface 0 (g,*p)i ${NSISCOMIFACEDECL}IUnknown AddRef 1 ()i ${NSISCOMIFACEDECL}IUnknown Release 2 ()i !endif !ifndef IID_IPersist !define IID_IPersist {0000010c-0000-0000-C000-000000000046} ${NSISCOMIFACEDECL}IPersist GetClassID 3 (g)i !endif !ifndef IID_IPersistStream !define IID_IPersistStream {00000109-0000-0000-C000-000000000046} ; IPersist> ${NSISCOMIFACEDECL}IPersistStream IsDirty 4 ()i ${NSISCOMIFACEDECL}IPersistStream Load 5 (p,i)i ${NSISCOMIFACEDECL}IPersistStream Save 6 (p,i)i ${NSISCOMIFACEDECL}IPersistStream GetSizeMax 7 (*l)i !endif !ifndef IID_IPersistStreamInit !define IID_IPersistStreamInit {7FD52380-4E07-101B-AE2D-08002B2EC713} ; IPersist> ${NSISCOMIFACEDECL}IPersistStreamInit IsDirty 4 ()i ${NSISCOMIFACEDECL}IPersistStreamInit Load 5 (p,i)i ${NSISCOMIFACEDECL}IPersistStreamInit Save 6 (p,i)i ${NSISCOMIFACEDECL}IPersistStreamInit GetSizeMax 7 (*l)i ${NSISCOMIFACEDECL}IPersistStreamInit InitNew 8 ()i !endif !ifndef IID_IPersistFile !define IID_IPersistFile {0000010b-0000-0000-C000-000000000046} ; IPersist> ${NSISCOMIFACEDECL}IPersistFile IsDirty 4 ()i ${NSISCOMIFACEDECL}IPersistFile Load 5 (w,i)i ${NSISCOMIFACEDECL}IPersistFile Save 6 (w,i)i ${NSISCOMIFACEDECL}IPersistFile SaveCompleted 7 (w)i ${NSISCOMIFACEDECL}IPersistFile GetCurFile 8 (*w)i !endif !ifndef CLSID_ShellLink !define CLSID_ShellLink {00021401-0000-0000-c000-000000000046} !endif !ifndef IID_IShellLink !define IID_IShellLinkA {000214ee-0000-0000-c000-000000000046} !define IID_IShellLinkW {000214f9-0000-0000-c000-000000000046} !ifdef NSIS_UNICODE !define IID_IShellLink ${IID_IShellLinkW} !else !define IID_IShellLink ${IID_IShellLinkA} !endif ${NSISCOMIFACEDECL}IShellLink GetPath 3 (t,i,p,i)i ${NSISCOMIFACEDECL}IShellLink GetIDList 4 (*p)i ${NSISCOMIFACEDECL}IShellLink SetIDList 5 (p)i ${NSISCOMIFACEDECL}IShellLink GetDescription 6 (t,i)i ${NSISCOMIFACEDECL}IShellLink SetDescription 7 (t)i ${NSISCOMIFACEDECL}IShellLink GetWorkingDirectory 8 (t,i)i ${NSISCOMIFACEDECL}IShellLink SetWorkingDirectory 9 (t)i ${NSISCOMIFACEDECL}IShellLink GetArguments 10 (t,i)i ${NSISCOMIFACEDECL}IShellLink SetArguments 11 (t)i ${NSISCOMIFACEDECL}IShellLink GetHotkey 12 (*i0)i ${NSISCOMIFACEDECL}IShellLink SetHotkey 13 (&i2)i ${NSISCOMIFACEDECL}IShellLink GetShowCmd 14 (*i)i ${NSISCOMIFACEDECL}IShellLink SetShowCmd 15 (i)i ${NSISCOMIFACEDECL}IShellLink GetIconLocation 16 (t,i,*i)i ${NSISCOMIFACEDECL}IShellLink SetIconLocation 17 (t,i)i ${NSISCOMIFACEDECL}IShellLink SetRelativePath 18 (t,i)i ${NSISCOMIFACEDECL}IShellLink Resolve 19 (p,i)i ${NSISCOMIFACEDECL}IShellLink SetPath 20 (t)i !endif !ifndef IID_IShellLinkDataList !define IID_IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1} ${NSISCOMIFACEDECL}IShellLinkDataList AddDataBlock 3 (p)i ${NSISCOMIFACEDECL}IShellLinkDataList CopyDataBlock 4 (i,*p)i ${NSISCOMIFACEDECL}IShellLinkDataList RemoveDataBlock 5 (i)i ${NSISCOMIFACEDECL}IShellLinkDataList GetFlags 6 (*i)i ${NSISCOMIFACEDECL}IShellLinkDataList SetFlags 7 (i)i !endif !define /ifndef EXP_SZ_LINK_SIG 0xA0000001 !define /ifndef NT_CONSOLE_PROPS_SIG 0xA0000002 !define /ifndef NT_FE_CONSOLE_PROPS_SIG 0xA0000004 !define /ifndef EXP_SPECIAL_FOLDER_SIG 0xA0000005 !define /ifndef EXP_DARWIN_ID_SIG 0xA0000006 !define /ifndef EXP_SZ_ICON_SIG 0xA0000007 !define /ifndef EXP_PROPERTYSTORAGE_SIG 0xA0000009 ;SHELL_LINK_DATA_FLAGS !define /ifndef SLDF_HAS_ID_LIST 0x00000001 !define /ifndef SLDF_HAS_LINK_INFO 0x00000002 !define /ifndef SLDF_HAS_NAME 0x00000004 !define /ifndef SLDF_HAS_RELPATH 0x00000008 !define /ifndef SLDF_HAS_WORKINGDIR 0x00000010 !define /ifndef SLDF_HAS_ARGS 0x00000020 !define /ifndef SLDF_HAS_ICONLOCATION 0x00000040 !define /ifndef SLDF_UNICODE 0x00000080 !define /ifndef SLDF_FORCE_NO_LINKINFO 0x00000100 !define /ifndef SLDF_HAS_EXP_SZ 0x00000200 !define /ifndef SLDF_RUN_IN_SEPARATE 0x00000400 !define /ifndef SLDF_HAS_LOGO3ID 0x00000800 !define /ifndef SLDF_HAS_DARWINID 0x00001000 !define /ifndef SLDF_RUNAS_USER 0x00002000 !define /ifndef SLDF_HAS_EXP_ICON_SZ 0x00004000 !define /ifndef SLDF_NO_PIDL_ALIAS 0x00008000 !define /ifndef SLDF_FORCE_UNCNAME 0x00010000 !define /ifndef SLDF_RUN_WITH_SHIMLAYER 0x00020000 !define /ifndef SLDF_FORCE_NO_LINKTRACK 0x00040000 ;[Vista+] !define /ifndef SLDF_ENABLE_TARGET_METADATA 0x00080000 !define /ifndef SLDF_DISABLE_LINK_PATH_TRACKING 0x00100000 ;[Seven+] !define /ifndef SLDF_DISABLE_KNOWNFOLDER_RELATIVE_TRACKING 0x00200000 !define /ifndef SLDF_NO_KF_ALIAS 0x00400000 !define /ifndef SLDF_ALLOW_LINK_TO_LINK 0x00800000 !define /ifndef SLDF_UNALIAS_ON_SAVE 0x01000000 !define /ifndef SLDF_PREFER_ENVIRONMENT_PATH 0x02000000 !define /ifndef SLDF_KEEP_LOCAL_IDLIST_FOR_UNC_TARGET 0x04000000 !define /ifndef SLDF_PERSIST_VOLUME_ID_RELATIVE 0x08000000 ;[Eight+] !ifndef IID_IShellItem !define IID_IShellItem {43826d1e-e718-42ee-bc55-a1e261c37bfe} ${NSISCOMIFACEDECL}IShellItem BindToHandler 3 (p,g,g,*p)i ${NSISCOMIFACEDECL}IShellItem GetParent 4 (*p)i ${NSISCOMIFACEDECL}IShellItem GetDisplayName 5 (i,*p)i ${NSISCOMIFACEDECL}IShellItem GetAttributes 6 (i,*i)i ${NSISCOMIFACEDECL}IShellItem Compare 7 (p,i,*i)i !endif !ifndef CLSID_StartMenuPin !define CLSID_StartMenuPin {a2a9545d-a0c2-42b4-9708-a0b2badd77c8} !endif !ifndef IID_IStartMenuPinnedList !define IID_IStartMenuPinnedList {4CD19ADA-25A5-4A32-B3B7-347BEE5BE36B} ${NSISCOMIFACEDECL}IStartMenuPinnedList RemoveFromList 3 (p)i !endif !ifndef CLSID_ApplicationDestinations !define CLSID_ApplicationDestinations {86c14003-4d6b-4ef3-a7b4-0506663b2e68} !endif !ifndef IID_IApplicationDestinations !define IID_IApplicationDestinations {12337D35-94C6-48A0-BCE7-6A9C69D4D600} ;[Seven+] ${NSISCOMIFACEDECL}IApplicationDestinations SetAppID 3 (w)i ${NSISCOMIFACEDECL}IApplicationDestinations RemoveDestination 4 (p)i ; IShellItem or IShellLink ${NSISCOMIFACEDECL}IApplicationDestinations RemoveAllDestinations 5 ()i !endif !ifndef CLSID_DestinationList !define CLSID_DestinationList {77f10cf0-3db5-4966-b520-b7c54fd35ed6} !endif !ifndef IID_ICustomDestinationList !define IID_ICustomDestinationList {6332debf-87b5-4670-90c0-5e57b408a49e} ;[Seven+] ${NSISCOMIFACEDECL}ICustomDestinationList SetAppID 3 (w)i ${NSISCOMIFACEDECL}ICustomDestinationList BeginList 4 (*i,g,*p)i ; IObjectArray or IEnumObjects ${NSISCOMIFACEDECL}ICustomDestinationList AppendCategory 5 (w,p)i ; IObjectArray* ${NSISCOMIFACEDECL}ICustomDestinationList AppendKnownCategory 6 (i)i ${NSISCOMIFACEDECL}ICustomDestinationList AddUserTasks 7 (p)i ; IObjectArray* ${NSISCOMIFACEDECL}ICustomDestinationList CommitList 8 ()i ${NSISCOMIFACEDECL}ICustomDestinationList GetRemovedDestinations 9 (g,*p)i ; IObjectCollection ${NSISCOMIFACEDECL}ICustomDestinationList DeleteList 10 (w)i ${NSISCOMIFACEDECL}ICustomDestinationList AbortList 11 ()i !endif !ifndef CLSID_EnumerableObjectCollection !define CLSID_EnumerableObjectCollection {2d3468c1-36a7-43b6-ac24-d3f02fd9607a} !endif !ifndef IID_IObjectArray !define IID_IObjectArray {92CA9DCD-5622-4bba-A805-5E9F541BD8C9} ${NSISCOMIFACEDECL}IObjectArray GetCount 3 (*i)i ${NSISCOMIFACEDECL}IObjectArray GetAt 4 (i,g,*p)i !endif !ifndef IID_IObjectCollection !define IID_IObjectCollection {5632b1a4-e38a-400a-928a-d4cd63230295} ; IObjectArray> ${NSISCOMIFACEDECL}IObjectCollection AddObject 5 (p)i ; IUnknown* ${NSISCOMIFACEDECL}IObjectCollection AddFromArray 6 (p)i ; IObjectArray* ${NSISCOMIFACEDECL}IObjectCollection RemoveObjectAt 7 (i)i ${NSISCOMIFACEDECL}IObjectCollection Clear 8 ()i !endif !ifndef IID_IEnumObjects !define IID_IEnumObjects {2c1c7e2e-2d0e-4059-831e-1e6f82335c2e} ${NSISCOMIFACEDECL}IEnumObjects Next 3 (i,g,*p,*i)i ${NSISCOMIFACEDECL}IEnumObjects Skip 4 (i)i ${NSISCOMIFACEDECL}IEnumObjects Reset 5 ()i ${NSISCOMIFACEDECL}IEnumObjects Clone 6 (*p)i !endif !ifndef IID_IEnumUnknown !define IID_IEnumUnknown {00000100-0000-0000-C000-000000000046} ${NSISCOMIFACEDECL}IEnumUnknown Next 3 (i,*p,*i)i ${NSISCOMIFACEDECL}IEnumUnknown Skip 4 (i)i ${NSISCOMIFACEDECL}IEnumUnknown Reset 5 ()i ${NSISCOMIFACEDECL}IEnumUnknown Clone 6 (*p)i !endif !ifndef IID_IPropertyStore !define IID_IPropertyStore {886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99} ${NSISCOMIFACEDECL}IPropertyStore GetCount 3 (*i)i ${NSISCOMIFACEDECL}IPropertyStore GetAt 4 (i,p)i ${NSISCOMIFACEDECL}IPropertyStore GetValue 5 (p,p)i ${NSISCOMIFACEDECL}IPropertyStore SetValue 6 (p,p)i ${NSISCOMIFACEDECL}IPropertyStore Commit 7 ()i !endif !ifndef IID_IPropertyStorage !define IID_IPropertyStorage {00000138-0000-0000-C000-000000000046} ${NSISCOMIFACEDECL}IPropertyStorage ReadMultiple 3 (i,p,p)i ${NSISCOMIFACEDECL}IPropertyStorage WriteMultiple 4 (i,p,p,i)i ${NSISCOMIFACEDECL}IPropertyStorage DeleteMultiple 5 (i,p)i ${NSISCOMIFACEDECL}IPropertyStorage ReadPropertyNames 6 (p,p)i ${NSISCOMIFACEDECL}IPropertyStorage WritePropertyNames 7 (i,p,p)i ${NSISCOMIFACEDECL}IPropertyStorage DeletePropertyNames 8 (i,p)i ${NSISCOMIFACEDECL}IPropertyStorage Commit 9 (i)i ; Note: Some implementations might return E_NOTIMPL ${NSISCOMIFACEDECL}IPropertyStorage Revert 10 ()i ${NSISCOMIFACEDECL}IPropertyStorage Enum 11 (*p)i ${NSISCOMIFACEDECL}IPropertyStorage SetTimes 12 (p,p,p)i ${NSISCOMIFACEDECL}IPropertyStorage SetClass 13 (g)i ${NSISCOMIFACEDECL}IPropertyStorage Stat 14 (p)i !endif !ifndef IID_IPropertySetStorage !define IID_IPropertySetStorage {0000013A-0000-0000-C000-000000000046} ${NSISCOMIFACEDECL}IPropertySetStorage Create 3 (g,g,i,i,*p)i ${NSISCOMIFACEDECL}IPropertySetStorage Open 4 (g,i,*p)i ${NSISCOMIFACEDECL}IPropertySetStorage Delete 5 (g)i ${NSISCOMIFACEDECL}IPropertySetStorage Enum 6 (*p)i !endif !ifndef CLSID_ApplicationAssociationRegistration !define CLSID_ApplicationAssociationRegistration {591209c7-767b-42b2-9fba-44ee4615f2c7} !endif !ifndef IID_IApplicationAssociationRegistration !define IID_IApplicationAssociationRegistration {4e530b0a-e611-4c77-a3ac-9031d022281b} ;[Vista+] ${NSISCOMIFACEDECL}IApplicationAssociationRegistration QueryCurrentDefault 3 (w,i,i,*p)i ${NSISCOMIFACEDECL}IApplicationAssociationRegistration QueryAppIsDefault 4 (w,i,i,w,*i)i ${NSISCOMIFACEDECL}IApplicationAssociationRegistration QueryAppIsDefaultAll 5 (i,w,*i)i ${NSISCOMIFACEDECL}IApplicationAssociationRegistration SetAppAsDefault 6 (w,w,i)i ${NSISCOMIFACEDECL}IApplicationAssociationRegistration SetAppAsDefaultAll 7 (w)i ${NSISCOMIFACEDECL}IApplicationAssociationRegistration ClearUserAssociations 8 ()i !endif !ifndef CLSID_ApplicationAssociationRegistrationUI !define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1} !endif !ifndef IID_IApplicationAssociationRegistrationUI !define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+] ${NSISCOMIFACEDECL}IApplicationAssociationRegistrationUI LaunchAdvancedAssociationUI 3 (w)i !endif !ifndef CLSID_GameExplorer !define CLSID_GameExplorer {9A5EA990-3034-4D6F-9128-01F3C61022BC} !endif !ifndef IID_IGameExplorer !define IID_IGameExplorer {E7B2FB72-D728-49B3-A5F2-18EBF5F1349E} ;[Vista+] ${NSISCOMIFACEDECL}IGameExplorer AddGame 3 (p,p,i,g)i ${NSISCOMIFACEDECL}IGameExplorer RemoveGame 4 (i,i,i,i)i ; The parameter is a GUID, not REFGUID so the 'g' type cannot be used! ${NSISCOMIFACEDECL}IGameExplorer UpdateGame 5 (i,i,i,i)i ${NSISCOMIFACEDECL}IGameExplorer VerifyAccess 6 (p,*i)i !endif !define /ifndef GIS_NOT_INSTALLED 1 !define /ifndef GIS_CURRENT_USER 2 !define /ifndef GIS_ALL_USERS 3 !ifndef IID_IGameExplorer2 !define IID_IGameExplorer2 {86874AA7-A1ED-450d-A7EB-B89E20B2FFF3} ;[Seven+] ${NSISCOMIFACEDECL}IGameExplorer2 InstallGame 3 (w,w,i)i ${NSISCOMIFACEDECL}IGameExplorer2 UninstallGame 4 (w)i ${NSISCOMIFACEDECL}IGameExplorer2 CheckAccess 5 (w,*i)i !endif !ifndef CLSID_GameStatistics !define CLSID_GameStatistics {DBC85A2C-C0DC-4961-B6E2-D28B62C11AD4} !endif !ifndef IID_IGameStatisticsMgr !define IID_IGameStatisticsMgr {AFF3EA11-E70E-407d-95DD-35E612C41CE2} ;[Seven+] ${NSISCOMIFACEDECL}IGameStatisticsMgr GetGameStatistics 3 (w,i,*i,*p)i ${NSISCOMIFACEDECL}IGameStatisticsMgr RemoveGameStatistics 4 (w)i !endif !ifndef CLSID_InternetShortcut !define CLSID_InternetShortcut {FBF23B40-E3F0-101B-8488-00AA003E56F8} !endif !ifndef IID_IUniformResourceLocator !define IID_IUniformResourceLocatorA {FBF23B80-E3F0-101B-8488-00AA003E56F8} !define IID_IUniformResourceLocatorW {CABB0DA0-DA57-11CF-9974-0020AFD79762} !ifdef NSIS_UNICODE !define IID_IUniformResourceLocator ${IID_IUniformResourceLocatorW} !else !define IID_IUniformResourceLocator ${IID_IUniformResourceLocatorA} !endif ${NSISCOMIFACEDECL}IUniformResourceLocator SetURL 3 (t,i)i ${NSISCOMIFACEDECL}IUniformResourceLocator GetURL 4 (*p)i ${NSISCOMIFACEDECL}IUniformResourceLocator InvokeCommand 5 (p)i !endif !verbose pop !endif /* __WIN_COM__INC */ nsis-3.11/Include/Win/Propkey.nsh000077500000000000000000000204751477201124000167060ustar00rootroot00000000000000!ifndef __WIN_PROPKEY__INC !define __WIN_PROPKEY__INC !verbose push !verbose 3 /************************************************** WTypes.h **************************************************/ ;NOTE: This list is incomplete !define VT_EMPTY 0 !define VT_NULL 1 !define VT_I2 2 !define VT_I4 3 !define VT_BSTR 8 !define VT_BOOL 11 !define VT_I1 16 !define VT_UI1 17 !define VT_UI2 18 !define VT_UI4 19 !define VT_I8 20 !define VT_UI8 21 !define VT_INT 22 !define VT_UINT 23 !define VT_HRESULT 25 !define VT_PTR 26 !define VT_SAFEARRAY 27 !define VT_LPSTR 30 ; SHStrDupA !define VT_LPWSTR 31 ; SHStrDupW !define VT_FILETIME 64 !define VT_STREAM 66 !define VT_CLSID 72 ; Pointer to CoTaskMem allocated GUID !define VT_TYPEMASK 0xFFF !define VT_VECTOR 0x1000 !define VT_ARRAY 0x2000 !define VT_BYREF 0x4000 !define /ifndef VARIANT_TRUE -1 !define /ifndef VARIANT_FALSE 0 !define SYSSIZEOF_PROPERTYKEY 20 !define SYSSTRUCT_PROPERTYKEY (&g16,&i4) ;System.dll is buggy when it comes to g and forces us to specify the size !define STGC_DEFAULT 0 !define STGC_OVERWRITE 1 !define STGC_ONLYIFCURRENT 2 !define STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE 4 !define STGC_CONSOLIDATE 8 /************************************************** OAIdl.h **************************************************/ !if "${NSIS_PTR_SIZE}" > 4 !define SYSSIZEOF_VARIANT 24 !define SYSSTRUCT_VARIANT (&i2,&i6,&i8,&i8) !else !define SYSSIZEOF_VARIANT 16 !define SYSSTRUCT_VARIANT (&i2,&i6,&i8) !endif /************************************************** PropIdl.h **************************************************/ !if "${NSIS_PTR_SIZE}" > 4 !define SYSSIZEOF_PROPVARIANT 24 !define SYSSTRUCT_PROPVARIANT (&i2,&i6,&i8,&i8) !else !define SYSSIZEOF_PROPVARIANT 16 !define SYSSTRUCT_PROPVARIANT (&i2,&i6,&i8) !endif !define PRSPEC_LPWSTR 0 !define PRSPEC_PROPID 1 !define SYSSTRUCT_PROPSPEC (p,p) /************************************************** Propkey.h **************************************************/ !define PKEY_AppUserModel_RelaunchCommand '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",2' ; VT_LPWSTR (SHGetPropertyStoreForWindow) !define PKEY_AppUserModel_RelaunchIconResource '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",3' ; VT_LPWSTR (SHGetPropertyStoreForWindow, optional. Path to icon or module, with resource ID or index.) !define PKEY_AppUserModel_RelaunchDisplayNameResource '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",4' ; VT_LPWSTR (SHGetPropertyStoreForWindow. @ style indirect resource string or a plain string.) !define PKEY_AppUserModel_ID '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",5' ; VT_LPWSTR !define PKEY_AppUserModel_IsDestListSeparator '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",6' ; VT_BOOL !define PKEY_AppUserModel_ExcludeFromShowInNewInstall '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",8' ; VT_BOOL !define PKEY_AppUserModel_PreventPinning '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",9' ; VT_BOOL !define PKEY_AppUserModel_IsDualMode '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",11' ; [Eight+] VT_BOOL !define APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL 1 !define APPUSERMODEL_STARTPINOPTION_USERPINNED 2 !define PKEY_AppUserModel_StartPinOption '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",12' ; [Eight+] VT_UI4 !define PKEY_AppUserModel_ToastActivatorCLSID '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",26' ; [10FU1507+] VT_CLSID !define PKEY_EdgeGesture_DisableTouchWhenFullscreen '"{32CE38B2-2C9A-41B1-9BC5-B3784394AA44}",2' ; [Eight+] VT_BOOL (SHGetPropertyStoreForWindow) /************************************************** ShlGuid.h & ShlObj.h **************************************************/ !define FMTID_Intshcut {000214A0-0000-0000-C000-000000000046} !define PID_IS_URL 2 ; VT_LPWSTR !define PID_IS_HOTKEY 6 ; VT_UI2 !define PID_IS_ICONINDEX 8 ; VT_I4 !define PID_IS_ICONFILE 9 ; VT_LPWSTR !define PKEY_Intshcut_Url '"${FMTID_Intshcut}",${PID_IS_URL}' ; Undocumented !define FMTID_InternetSite {000214A1-0000-0000-C000-000000000046} !define PID_INTSITE_LASTVISIT 4 ; VT_FILETIME !define PID_INTSITE_VISITCOUNT 6 ; VT_UI4 /************************************************** Helper macros **************************************************/ !define V_GetVT '!insertmacro V_GetVT ' !macro V_GetVT pPV sysdst System::Call '*${pPV}(&i2.${sysdst})' !macroend !define V_SetVT '!insertmacro V_SetVT ' !macro V_SetVT pPV syssrc System::Call '*${pPV}(&i2 ${syssrc})' !macroend !macro V_GetHelper sysvaltyp pPV sysdst System::Call '*${pPV}(l,${sysvaltyp}.${sysdst})' !macroend !macro V_GenericSetHelper sysvaltyp pPV VT syssrc !if "${VT}" != "" ; Setting the VT is optional System::Call '*${pPV}(&i2 ${VT},&i6,${sysvaltyp}${syssrc})' !else System::Call '*${pPV}(l,${sysvaltyp}${syssrc})' !endif !macroend !macro V_SpecificSetHelper VT sysvaltyp pPV syssrc System::Call '*${pPV}(&i2 ${VT},&i6,${sysvaltyp}${syssrc})' !macroend !macro Make_V_GetterSetter name sysvaltyp setsep !define V_Get${name} '!insertmacro V_GetHelper "${sysvaltyp}" ' !ifdef VT_${name} !define V_Set${name} '!insertmacro V_SpecificSetHelper ${VT_${name}} "${sysvaltyp}${setsep}" ' !else !define V_Set${name} '!insertmacro V_GenericSetHelper "${sysvaltyp}${setsep}" ' !endif !macroend !insertmacro Make_V_GetterSetter Int8 "&i1" " " ; Generic !insertmacro Make_V_GetterSetter Int16 "&i2" " " ; Generic !insertmacro Make_V_GetterSetter Int32 "i" "" ; Generic !insertmacro Make_V_GetterSetter Int64 "l" "" ; Generic !insertmacro Make_V_GetterSetter Pointer "p" "" ; Generic !insertmacro Make_V_GetterSetter I4 "i" " " !insertmacro Make_V_GetterSetter BOOL "&i2" " " !insertmacro Make_V_GetterSetter FILETIME "l" "" !macro VariantInit pV ${V_SetVT} ${pV} ${VT_EMPTY} !macroend !macro VariantClear pV System::Call 'OLEAUT32::#9(p${pV})' !macroend !macro VariantCopy pDstV pSrcV sysretHR System::Call 'OLEAUT32::#10(p${pDstV},p${pSrcV})i.${sysretHR}' ; (Frees the destination variant before it copies the source) !macroend !macro VariantCopyInd pDstV pSrcV sysretHR System::Call 'OLEAUT32::#11(p${pDstV},p${pSrcV})i.${sysretHR}' ; (Frees the destination variant before it copies the source) !macroend !macro VariantChangeType pDstV pSrcV Flags VT sysretHR System::Call 'OLEAUT32::#12(p${pDstV},p${pSrcV},i${Flags},i${VT})i.${sysretHR}' ; (Might free the destination on success) !macroend !macro PropVariantClear pPV System::Call 'OLE32::PropVariantClear(p${pPV})' ; WinNT4.SP0+, Win98+, IE4+ !macroend !macro PropVariantCopy pDstPV pSrcPV sysretHR System::Call 'OLE32::PropVariantCopy(p${pDstPV},p${pSrcPV})i.${sysretHR}' ; WinNT4.SP0+, Win98+, IE4+ (Does NOT free the destination before it copies the source) !macroend !macro PropVariantChangeType pDstPV pSrcPV VT sysretHR !ifdef NSIS_ARM | NSIS_ARM32 | NSIS_ARMNT | NSIS_ARM64 System::Call 'PROPSYS::PropVariantChangeType(p${pDstPV},p${pSrcPV},i0,i${VT})i.${sysretHR}' !else Push "${VT}" Push ${pSrcPV} Push ${pDstPV} !include Util.nsh ${CallArtificialFunction} TryPropVariantChangeType System::Call 'KERNEL32::SetLastError(is${sysretHR})' ; A hack to move the result from the stack to somewhere with System variable syntax !endif !macroend !macro TryPropVariantChangeType System::Store S System::Call 'PROPSYS::PropVariantChangeType(psr1,psr2,i0,isr3)i.r0' ; Vista+ (Source and destination cannot be the same address) StrCmp $0 error "" done System::Call 'OLE32::PropVariantChangeType(pr1,pr2,i0,i0,ir3})i.r0' ; 2000+ (Source and destination cannot be the same address) !if ${NSIS_PTR_SIZE} < 8 StrCmp $0 error "" done !insertmacro VariantChangeType $1 $2 0 $3 r0 ; This is not really correct but there is no PROPVARIANT support on these platforms. Might free the destination! !endif done: Push $0 System::Store L !macroend !macro IPropertyStorage_ReadPropById pPS ID pPV sysoutHR System::Call '*(p${PRSPEC_PROPID},p${ID})p.s' ${IPropertyStorage::ReadMultiple} ${pPS} '(1,pss,p${pPV})${sysoutHR}' System::Free !macroend !macro IPropertyStorage_WritePropById pPS ID pPV sysoutHR System::Call '*(p${PRSPEC_PROPID},p${ID})p.s' ${IPropertyStorage::WriteMultiple} ${pPS} '(1,pss,p${pPV},2)${sysoutHR}' System::Free !macroend !verbose pop !endif /* __WIN_PROPKEY__INC */ nsis-3.11/Include/Win/RestartManager.nsh000077500000000000000000000067721477201124000202000ustar00rootroot00000000000000!ifndef __WIN_RESTARTMANAGER__INC !define __WIN_RESTARTMANAGER__INC 1 /************************************************** WinBase.h **************************************************/ !define /IfNDef RESTART_MAX_CMD_LINE 1024 !define /IfNDef RESTART_NO_CRASH 1 !define /IfNDef RESTART_NO_HANG 2 !define /IfNDef RESTART_NO_PATCH 4 !define /IfNDef RESTART_NO_REBOOT 8 ; Do not restart the process when the system is rebooted due to patch installations !define /IfNDef RECOVERY_DEFAULT_PING_INTERVAL 5000 !define /IfNDef /math RECOVERY_MAX_PING_INTERVAL 5000 * 60 /************************************************** RestartManager.h **************************************************/ !define RM_SESSION_KEY_LEN 16 !define CCH_RM_SESSION_KEY 32 !define CCH_RM_MAX_APP_NAME 255 !define CCH_RM_MAX_SVC_NAME 63 !define RM_INVALID_TS_SESSION -1 !define RM_INVALID_PROCESS -1 !define RmUnknownApp 0 !define RmMainWindow 1 !define RmOtherWindow 2 !define RmService 3 !define RmExplorer 4 !define RmConsole 5 !define RmCritical 1000 ; Application is critical system process where a reboot is required to restart !define RmForceShutdown 0x1 ; Force unresponsive applications and services to shut down after the timeout period !define RmShutdownOnlyRegistered 0x10 ; Only shutdown apps if all apps registered for restart (RegisterApplicationRestart) !define RmStatusUnknown 0 !define RmStatusRunning 1 !define RmStatusStopped 2 ; Application stopped by Restart Manager !define RmStatusStoppedOther 4 !define RmStatusRestarted 8 !define RmStatusErrorOnStop 0x10 !define RmStatusErrorOnRestart 0x20 !define RmStatusShutdownMasked 0x40 !define RmStatusRestartMasked 0x80 !define RmRebootReasonNone 0 !define RmRebootReasonPermissionDenied 1 !define RmRebootReasonSessionMismatch 2 !define RmRebootReasonCriticalProcess 4 !define RmRebootReasonCriticalService 8 !define RmRebootReasonDetectedSelf 0x10 !define SYSSIZEOF_RM_UNIQUE_PROCESS 12 !define SYSSTRUCT_RM_UNIQUE_PROCESS (i,l) !include LogicLib.nsh !include Util.nsh !macro RestartManager_StartSession outvarhandle System::Call 'RSTRTMGR::RmStartSession(*i-1s, i0, w)i.s' Pop ${outvarhandle} ${If} ${outvarhandle} <> 0 ${OrIf} ${outvarhandle} == error Pop ${outvarhandle} Push "" ${EndIf} Pop ${outvarhandle} !macroend !macro RestartManager_EndSession handle System::Call 'RSTRTMGR::RmEndSession(i${handle})' !macroend !macro RestartManager_RegisterFile handle path System::Call 'RSTRTMGR::RmRegisterResources(i${handle},i1,*ws,i0,p0,i0,p0)i.r0' "${path}" !macroend !macro RestartManager_Shutdown handle System::Call 'RSTRTMGR::RmShutdown(i${handle}, i${RmForceShutdown}, p0)' !macroend !macro RestartManager_Restart handle System::Call 'RSTRTMGR::RmRestart(i${handle}, i0, p0)' !macroend !macro RestartManager_ShutdownFile fullpath outvar_errcode Push "${fullpath}" !insertmacro CallArtificialFunction RestartManager_ShutdownFileImp Pop ${outvar_errcode} !macroend !macro RestartManager_ShutdownFileImp Exch $1 Push $0 System::Call 'RSTRTMGR::RmStartSession(*i-1s, i0, w)i.r0' ${If} $0 == error Pop $0 StrCpy $0 1150 ${Else} System::Call 'RSTRTMGR::RmRegisterResources(isr1,i1,*wr1,i0,p0,i0,p0)i.r0' ${If} $0 = 0 System::Call 'RSTRTMGR::RmShutdown(ir1, i${RmForceShutdown}, p0)i.r0' ${EndIf} System::Call 'RSTRTMGR::RmEndSession(ir1)' ${EndIf} Exch Pop $1 Exch $0 !macroend !endif ;~ Include guard nsis-3.11/Include/Win/WinDef.nsh000077500000000000000000000034041477201124000164220ustar00rootroot00000000000000!ifndef __WIN_WINDEF__INC !define __WIN_WINDEF__INC !verbose push !verbose 3 !ifndef __WIN_NOINC_WINDEF !define /ifndef MAX_PATH 260 #define NULL 0 !macro _Win_MINMAX _intcmp _j1 _j2 _outvar _a _b ${_intcmp} "${_a}" "${_b}" ${_j1} ${_j1} ${_j2} StrCpy ${_outvar} "${_a}" goto +2 StrCpy ${_outvar} "${_b}" !macroend !ifndef __WIN_MS_NOMINMAX & min & max & min_u & max_u !define min "!insertmacro _Win_MINMAX IntCmp +1 +3 " !define max "!insertmacro _Win_MINMAX IntCmp +3 +1 " !define min_u "!insertmacro _Win_MINMAX IntCmpU +1 +3 " !define max_u "!insertmacro _Win_MINMAX IntCmpU +3 +1 " !endif !macro _Win_LOBYTE _outvar _in IntOp ${_outvar} "${_in}" & 0xFF !macroend !define LOBYTE "!insertmacro _Win_LOBYTE " !macro _Win_HIBYTE _outvar _in IntOp ${_outvar} "${_in}" >> 8 ${LOBYTE} ${_outvar} ${_outvar} !macroend !define HIBYTE "!insertmacro _Win_HIBYTE " !macro _Win_LOWORD _outvar _in IntOp ${_outvar} "${_in}" & 0xFFFF !macroend !define LOWORD "!insertmacro _Win_LOWORD " !macro _Win_HIWORD _outvar _in IntOp ${_outvar} "${_in}" >>> 16 !macroend !define HIWORD "!insertmacro _Win_HIWORD " !macro _Win_MAKEWORD _outvar _tmpvar _lo _hi ${LOBYTE} ${_outvar} "${_hi}" ${LOBYTE} ${_tmpvar} "${_lo}" IntOp ${_outvar} ${_outvar} << 8 IntOp ${_outvar} ${_outvar} | ${_tmpvar} !macroend !define MAKEWORD "!insertmacro _Win_MAKEWORD " !macro _Win_MAKELONG32 _outvar _tmpvar _wlo _whi ${LOWORD} ${_outvar} "${_wlo}" IntOp ${_tmpvar} "${_whi}" << 16 IntOp ${_outvar} ${_outvar} | ${_tmpvar} !macroend !define MAKELONG "!insertmacro _Win_MAKELONG32 " !define MAKEWPARAM "${MAKELONG}" !define MAKELPARAM "${MAKELONG}" !define MAKELRESULT "${MAKELONG}" !endif /* __WIN_NOINC_WINDEF */ !verbose pop !endif /* __WIN_WINDEF__INC */nsis-3.11/Include/Win/WinError.nsh000077500000000000000000000200561477201124000170170ustar00rootroot00000000000000!ifndef __WIN_WINERROR__INC !define __WIN_WINERROR__INC !verbose push !verbose 3 !ifndef __WIN_NOINC_WINERROR #define NO_ERROR 0 !define ERROR_SUCCESS 0 !define ERROR_INVALID_FUNCTION 1 !define ERROR_FILE_NOT_FOUND 2 !define ERROR_PATH_NOT_FOUND 3 !define ERROR_TOO_MANY_OPEN_FILES 4 !define ERROR_ACCESS_DENIED 5 !define ERROR_INVALID_HANDLE 6 !define ERROR_ARENA_TRASHED 7 !define ERROR_NOT_ENOUGH_MEMORY 8 !define ERROR_INVALID_BLOCK 9 !define ERROR_BAD_ENVIRONMENT 10 !define ERROR_BAD_FORMAT 11 !define ERROR_INVALID_ACCESS 12 !define ERROR_INVALID_DATA 13 !define ERROR_OUTOFMEMORY 14 !define ERROR_INVALID_DRIVE 15 !define ERROR_CURRENT_DIRECTORY 16 !define ERROR_NOT_SAME_DEVICE 17 !define ERROR_NO_MORE_FILES 18 !define ERROR_WRITE_PROTECT 19 !define ERROR_BAD_UNIT 20 !define ERROR_NOT_READY 21 !define ERROR_BAD_COMMAND 22 !define ERROR_CRC 23 !define ERROR_BAD_LENGTH 24 !define ERROR_SEEK 25 !define ERROR_NOT_DOS_DISK 26 !define ERROR_SECTOR_NOT_FOUND 27 !define ERROR_OUT_OF_PAPER 28 !define ERROR_WRITE_FAULT 29 !define ERROR_READ_FAULT 30 !define ERROR_GEN_FAILURE 31 !define ERROR_SHARING_VIOLATION 32 !define ERROR_LOCK_VIOLATION 33 !define ERROR_WRONG_DISK 34 !define ERROR_SHARING_BUFFER_EXCEEDED 36 !define ERROR_HANDLE_EOF 38 !define ERROR_HANDLE_DISK_FULL 39 !define ERROR_NOT_SUPPORTED 50 !define ERROR_CANNOT_MAKE 82 ; "The directory or file cannot be created" !define ERROR_INVALID_PARAMETER 87 !define ERROR_DISK_FULL 112 !define ERROR_CALL_NOT_IMPLEMENTED 120 ; "This function is not supported on this system" !define ERROR_INSUFFICIENT_BUFFER 122 !define ERROR_INVALID_NAME 123 ; "The filename, directory name, or volume label syntax is incorrect" !define ERROR_MOD_NOT_FOUND 126 ; "The specified module could not be found" !define ERROR_BAD_ARGUMENTS 160 !define ERROR_BAD_PATHNAME 161 !define ERROR_LOCK_FAILED 167 ; "Unable to lock a region of a file" !define ERROR_BUSY 170 ; "The requested resource is in use" !define ERROR_ALREADY_EXISTS 183 ; "Cannot create a file when that file already exists" !define ERROR_FILENAME_EXCED_RANGE 206 ; "The filename or extension is too long" !define ERROR_EXE_MACHINE_TYPE_MISMATCH 216 ; "This version of %1 is not compatible with the version of Windows you're running" !define ERROR_IMAGE_SUBSYSTEM_NOT_PRESENT 308 !define ERROR_DATA_CHECKSUM_ERROR 323 !define ERROR_ELEVATION_REQUIRED 740 !define ERROR_SERVICE_DOES_NOT_EXIST 1060 !define ERROR_NO_MEDIA_IN_DRIVE 1112 !define ERROR_NO_UNICODE_TRANSLATION 1113 !define ERROR_DLL_INIT_FAILED 1114 !define ERROR_SHUTDOWN_IN_PROGRESS 1115 !define ERROR_OLD_WIN_VERSION 1150 ; "The specified program requires a newer version of Windows" !define ERROR_APP_WRONG_OS 1151 ; "The specified program is not a Windows or MS-DOS program" !define ERROR_SINGLE_INSTANCE_APP 1152 ; "Cannot start more than one instance of the specified program" !define ERROR_RMODE_APP 1153 ; "The specified program was written for an earlier version of Windows" !define ERROR_INVALID_DLL 1154 !define ERROR_NO_ASSOCIATION 1155 !define ERROR_DDE_FAIL 1156 !define ERROR_DLL_NOT_FOUND 1157 !define ERROR_NOT_FOUND 1168 ; "Element not found" !define ERROR_NO_MATCH 1169 ; "There was no match for the specified key in the index" !define ERROR_NO_VOLUME_ID 1173 !define ERROR_UNABLE_TO_REMOVE_REPLACED 1175 ; "Unable to remove the file to be replaced" !define ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176 !define ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177 !define ERROR_SHUTDOWN_IS_SCHEDULED 1190 !define ERROR_SHUTDOWN_USERS_LOGGED_ON 1191 ; "The system shutdown cannot be initiated because there are other users logged on to the computer" !define ERROR_NO_NETWORK 1222 !define ERROR_CANCELLED 1223 ; "The operation was canceled by the user" !define ERROR_RETRY 1237 !define ERROR_SERVICE_NOT_FOUND 1243 !define ERROR_NOT_AUTHENTICATED 1244 !define ERROR_UNIDENTIFIED_ERROR 1287 !define ERROR_PRIVILEGE_NOT_HELD 1314 !define ERROR_LOGON_FAILURE 1326 ; "The user name or password is incorrect" !define ERROR_INTERNAL_ERROR 1359 ; "An internal error occurred" !define ERROR_FILE_CORRUPT 1392 ; "The file or directory is corrupted and unreadable" !define ERROR_INVALID_WINDOW_HANDLE 1400 ; "Invalid window handle" !define ERROR_INVALID_INDEX 1413 !define ERROR_TIMEOUT 1460 !define ERROR_SYMLINK_NOT_SUPPORTED 1464 !define ERROR_XML_PARSE_ERROR 1465 !define ERROR_RESTART_APPLICATION 1467 ; "This application must be restarted" !define ERROR_INSTALL_USEREXIT 1602 ; "User cancelled installation" !define ERROR_INSTALL_FAILURE 1603 ; "Fatal error during installation" !define ERROR_INSTALL_SUSPEND 1604 ; "Installation suspended, incomplete" !define ERROR_UNKNOWN_PRODUCT 1605 ; "This action is only valid for products that are currently installed" !define ERROR_BAD_CONFIGURATION 1610 !define ERROR_INSTALL_SOURCE_ABSENT 1612 !define ERROR_PRODUCT_UNINSTALLED 1614 !define ERROR_INSTALL_ALREADY_RUNNING 1618 ; "Another installation is already in progress. Complete that installation before proceeding with this install." !define ERROR_INSTALL_PACKAGE_INVALID 1620 !define ERROR_INSTALL_LOG_FAILURE 1622 !define ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623 !define ERROR_FUNCTION_FAILED 1627 !define ERROR_DATATYPE_MISMATCH 1629 !define ERROR_UNSUPPORTED_TYPE 1630 !define ERROR_INSTALL_TEMP_UNWRITABLE 1632 ; "The Temp folder is on a drive that is full or is inaccessible" !define ERROR_INSTALL_PLATFORM_UNSUPPORTED 1633 ; "This installation package is not supported by this processor type. Contact your product vendor." !define ERROR_PRODUCT_VERSION 1638 ; "Another version of this product is already installed" !define ERROR_SUCCESS_REBOOT_INITIATED 1641 ; "The requested operation completed successfully. The system will be restarted so the changes can take effect." !define ERROR_INSTALL_REJECTED 1654 ; "The app that you are trying to run is not supported on this version of Windows" !define ERROR_TAG_NOT_FOUND 2012 !define ERROR_BAD_USERNAME 2202 ; "The user name or group name parameter is invalid" !define ERROR_SUCCESS_REBOOT_REQUIRED 3010 !define ERROR_SUCCESS_RESTART_REQUIRED 3011 !define ERROR_INSTALL_INVALID_PACKAGE 15602 !define ERROR_INSTALL_OUT_OF_DISK_SPACE 15604 !define ERROR_INSTALL_CANCEL 15608 ; "User cancelled the install request" !define ERROR_INSTALL_FAILED 15609 !define ERROR_REMOVE_FAILED 15610 !define ERROR_NEEDS_REMEDIATION 15612 ; "The application cannot be started. Try reinstalling the application to fix the problem." !define SEVERITY_SUCCESS 0 !define SEVERITY_ERROR 1 !define FACILITY_STORAGE 3 !define FACILITY_WIN32 7 !define FACILITY_SECURITY 9 !define FACILITY_SETUPAPI 15 !define FACILITY_SXS 23 !define /IfNDef S_OK 0 !define /IfNDef S_FALSE 1 !define E_UNEXPECTED 0x8000FFFF !define E_NOTIMPL 0x80004001 !define E_OUTOFMEMORY 0x8007000E !define E_INVALIDARG 0x80070057 !define E_NOINTERFACE 0x80004002 !define E_POINTER 0x80004003 !define E_HANDLE 0x80070006 !define E_ABORT 0x80004004 !define E_FAIL 0x80004005 !define E_ACCESSDENIED 0x80070005 !define E_PENDING 0x8000000A !endif /* __WIN_NOINC_WINERROR */ !verbose pop !endif /* __WIN_WINERROR__INC */ nsis-3.11/Include/Win/WinNT.nsh000077500000000000000000000242171477201124000162520ustar00rootroot00000000000000!ifndef __WIN_WINNT__INC !define __WIN_WINNT__INC !verbose push !verbose 3 !ifndef __WIN_NOINC_WINNT #define MINCHAR 0x80 #define MAXCHAR 0x7f !define MINSHORT 0x8000 !define MAXSHORT 0x7fff !define MINLONG 0x80000000 !define MAXLONG 0x7fffffff !define MAXBYTE 0xff !define MAXWORD 0xffff !define MAXDWORD 0xffffffff !ifndef WIN32_NO_STATUS !define STATUS_WAIT_0 0x00000000 !define STATUS_ABANDONED_WAIT_0 0x00000080 !define STATUS_USER_APC 0x000000C0 !define STATUS_TIMEOUT 0x00000102 !define STATUS_PENDING 0x00000103 !define DBG_EXCEPTION_HANDLED 0x00010001 !define DBG_CONTINUE 0x00010002 !define STATUS_SEGMENT_NOTIFICATION 0x40000005 !define DBG_TERMINATE_THREAD 0x40010003 !define DBG_TERMINATE_PROCESS 0x40010004 !define DBG_CONTROL_C 0x40010005 !define DBG_CONTROL_BREAK 0x40010008 !define DBG_COMMAND_EXCEPTION 0x40010009 !define STATUS_GUARD_PAGE_VIOLATION 0x80000001 !define STATUS_DATATYPE_MISALIGNMENT 0x80000002 !define STATUS_BREAKPOINT 0x80000003 !define STATUS_SINGLE_STEP 0x80000004 !define DBG_EXCEPTION_NOT_HANDLED 0x80010001 !define STATUS_ACCESS_VIOLATION 0xC0000005 !define STATUS_IN_PAGE_ERROR 0xC0000006 !define STATUS_INVALID_HANDLE 0xC0000008 !define STATUS_NO_MEMORY 0xC0000017 !define STATUS_ILLEGAL_INSTRUCTION 0xC000001D !define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025 !define STATUS_INVALID_DISPOSITION 0xC0000026 !define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C !define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D !define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E !define STATUS_FLOAT_INEXACT_RESULT 0xC000008F !define STATUS_FLOAT_INVALID_OPERATION 0xC0000090 !define STATUS_FLOAT_OVERFLOW 0xC0000091 !define STATUS_FLOAT_STACK_CHECK 0xC0000092 !define STATUS_FLOAT_UNDERFLOW 0xC0000093 !define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094 !define STATUS_INTEGER_OVERFLOW 0xC0000095 !define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096 !define STATUS_STACK_OVERFLOW 0xC00000FD !define STATUS_CONTROL_C_EXIT 0xC000013A !define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4 !define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5 !define STATUS_REG_NAT_CONSUMPTION 0xC00002C9 !define STATUS_SXS_EARLY_DEACTIVATION 0xC015000F !define STATUS_SXS_INVALID_DEACTIVATION 0xC0150010 !endif /*WIN32_NO_STATUS*/ #define MAXIMUM_WAIT_OBJECTS 64 !define DELETE 0x00010000 !define READ_CONTROL 0x00020000 !define WRITE_DAC 0x00040000 !define WRITE_OWNER 0x00080000 !define SYNCHRONIZE 0x00100000 !define STANDARD_RIGHTS_REQUIRED 0x000F0000 !define STANDARD_RIGHTS_READ ${READ_CONTROL} !define STANDARD_RIGHTS_WRITE ${READ_CONTROL} !define STANDARD_RIGHTS_EXECUTE ${READ_CONTROL} !define STANDARD_RIGHTS_ALL 0x001F0000 !define SPECIFIC_RIGHTS_ALL 0x0000FFFF !define ACCESS_SYSTEM_SECURITY 0x01000000 !define MAXIMUM_ALLOWED 0x02000000 !define GENERIC_READ 0x80000000 !define GENERIC_WRITE 0x40000000 !define GENERIC_EXECUTE 0x20000000 !define GENERIC_ALL 0x10000000 !define SE_PRIVILEGE_ENABLED_BY_DEFAULT 0x00000001 !define SE_PRIVILEGE_ENABLED 0x00000002 !define SE_PRIVILEGE_REMOVED 0x00000004 !define SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000 !define SE_CREATE_TOKEN_NAME "SeCreateTokenPrivilege" !define SE_ASSIGNPRIMARYTOKEN_NAME "SeAssignPrimaryTokenPrivilege" !define SE_LOCK_MEMORY_NAME "SeLockMemoryPrivilege" !define SE_INCREASE_QUOTA_NAME "SeIncreaseQuotaPrivilege" !define SE_UNSOLICITED_INPUT_NAME "SeUnsolicitedInputPrivilege" !define SE_MACHINE_ACCOUNT_NAME "SeMachineAccountPrivilege" !define SE_TCB_NAME "SeTcbPrivilege" !define SE_SECURITY_NAME "SeSecurityPrivilege" !define SE_TAKE_OWNERSHIP_NAME "SeTakeOwnershipPrivilege" !define SE_LOAD_DRIVER_NAME "SeLoadDriverPrivilege" !define SE_SYSTEM_PROFILE_NAME "SeSystemProfilePrivilege" !define SE_SYSTEMTIME_NAME "SeSystemtimePrivilege" !define SE_PROF_SINGLE_PROCESS_NAME "SeProfileSingleProcessPrivilege" !define SE_INC_BASE_PRIORITY_NAME "SeIncreaseBasePriorityPrivilege" !define SE_CREATE_PAGEFILE_NAME "SeCreatePagefilePrivilege" !define SE_CREATE_PERMANENT_NAME "SeCreatePermanentPrivilege" !define SE_BACKUP_NAME "SeBackupPrivilege" !define SE_RESTORE_NAME "SeRestorePrivilege" !define SE_SHUTDOWN_NAME "SeShutdownPrivilege" !define SE_DEBUG_NAME "SeDebugPrivilege" !define SE_AUDIT_NAME "SeAuditPrivilege" !define SE_SYSTEM_ENVIRONMENT_NAME "SeSystemEnvironmentPrivilege" !define SE_CHANGE_NOTIFY_NAME "SeChangeNotifyPrivilege" !define SE_REMOTE_SHUTDOWN_NAME "SeRemoteShutdownPrivilege" !define SE_UNDOCK_NAME "SeUndockPrivilege" !define SE_SYNC_AGENT_NAME "SeSyncAgentPrivilege" !define SE_ENABLE_DELEGATION_NAME "SeEnableDelegationPrivilege" !define SE_MANAGE_VOLUME_NAME "SeManageVolumePrivilege" !define SE_IMPERSONATE_NAME "SeImpersonatePrivilege" !define SE_CREATE_GLOBAL_NAME "SeCreateGlobalPrivilege" !define TOKEN_ASSIGN_PRIMARY 0x0001 !define TOKEN_DUPLICATE 0x0002 !define TOKEN_IMPERSONATE 0x0004 !define TOKEN_QUERY 0x0008 !define TOKEN_QUERY_SOURCE 0x0010 !define TOKEN_ADJUST_PRIVILEGES 0x0020 !define TOKEN_ADJUST_GROUPS 0x0040 !define TOKEN_ADJUST_DEFAULT 0x0080 !define TOKEN_ADJUST_SESSIONID 0x0100 !define TOKEN_ALL_ACCESS_P 0xF00FF !define /math TOKEN_ALL_ACCESS ${TOKEN_ALL_ACCESS_P} | ${TOKEN_ADJUST_SESSIONID} !define /math TOKEN_READ ${STANDARD_RIGHTS_READ} | ${TOKEN_QUERY} !define TOKEN_WRITE 0x200E0 ;(STANDARD_RIGHTS_WRITE|TOKEN_ADJUST_PRIVILEGES|TOKEN_ADJUST_GROUPS|TOKEN_ADJUST_DEFAULT) !define TOKEN_EXECUTE ${STANDARD_RIGHTS_EXECUTE} !define PROCESS_TERMINATE 0x0001 !define PROCESS_CREATE_THREAD 0x0002 !define PROCESS_SET_SESSIONID 0x0004 !define PROCESS_VM_OPERATION 0x0008 !define PROCESS_VM_READ 0x0010 !define PROCESS_VM_WRITE 0x0020 !define PROCESS_DUP_HANDLE 0x0040 !define PROCESS_CREATE_PROCESS 0x0080 !define PROCESS_SET_QUOTA 0x0100 !define PROCESS_SET_INFORMATION 0x0200 !define PROCESS_QUERY_INFORMATION 0x0400 !define PROCESS_SUSPEND_RESUME 0x0800 !define PROCESS_ALL_ACCESS 0x1F0FFF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF) !define THREAD_TERMINATE 0x0001 !define THREAD_SUSPEND_RESUME 0x0002 !define THREAD_GET_CONTEXT 0x0008 !define THREAD_SET_CONTEXT 0x0010 !define THREAD_SET_INFORMATION 0x0020 !define THREAD_QUERY_INFORMATION 0x0040 !define THREAD_SET_THREAD_TOKEN 0x0080 !define THREAD_IMPERSONATE 0x0100 !define THREAD_DIRECT_IMPERSONATION 0x0200 !define THREAD_ALL_ACCESS 0x1F03FF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) !define JOB_OBJECT_ASSIGN_PROCESS 0x0001 !define JOB_OBJECT_SET_ATTRIBUTES 0x0002 !define JOB_OBJECT_QUERY 0x0004 !define JOB_OBJECT_TERMINATE 0x0008 !define JOB_OBJECT_SET_SECURITY_ATTRIBUTES 0x0010 !define JOB_OBJECT_ALL_ACCESS 0x1F001F ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1F ) !define EVENT_MODIFY_STATE 0x0002 !define EVENT_ALL_ACCESS 0x1F0003 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) !define MUTANT_QUERY_STATE 0x0001 !define MUTANT_ALL_ACCESS 0x1F0001 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE) !define FILE_SHARE_READ 0x00000001 !define FILE_SHARE_WRITE 0x00000002 !define FILE_SHARE_DELETE 0x00000004 !define FILE_ATTRIBUTE_READONLY 0x00000001 !define FILE_ATTRIBUTE_HIDDEN 0x00000002 !define FILE_ATTRIBUTE_SYSTEM 0x00000004 !define FILE_ATTRIBUTE_DIRECTORY 0x00000010 !define FILE_ATTRIBUTE_ARCHIVE 0x00000020 !define FILE_ATTRIBUTE_DEVICE 0x00000040 !define FILE_ATTRIBUTE_NORMAL 0x00000080 !define FILE_ATTRIBUTE_TEMPORARY 0x00000100 !define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 !define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 !define FILE_ATTRIBUTE_COMPRESSED 0x00000800 !define FILE_ATTRIBUTE_OFFLINE 0x00001000 !define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 !define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 !define DUPLICATE_CLOSE_SOURCE 0x00000001 !define DUPLICATE_SAME_ACCESS 0x00000002 !define /ifndef VER_PLATFORM_WIN32s 0 !define /ifndef VER_PLATFORM_WIN32_WINDOWS 1 !define /ifndef VER_PLATFORM_WIN32_NT 2 !ifndef REG_SZ & NSIS_WINDOWS__NO_REGTYPES !define REG_NONE 0 !define REG_SZ 1 !define REG_EXPAND_SZ 2 !define REG_BINARY 3 !define REG_DWORD 4 !define REG_DWORD_LITTLE_ENDIAN 4 !define REG_DWORD_BIG_ENDIAN 5 !define REG_LINK 6 !define REG_MULTI_SZ 7 !endif !define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF !define PROCESSOR_ARCHITECTURE_INTEL 0 ; x86 !define PROCESSOR_ARCHITECTURE_ARM 5 !define PROCESSOR_ARCHITECTURE_IA64 6 ; Itanium !define PROCESSOR_ARCHITECTURE_AMD64 9 ; x86-64/x64 !define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10 !define PROCESSOR_ARCHITECTURE_ARM64 12 !define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13 !define IMAGE_FILE_MACHINE_UNKNOWN 0 !define IMAGE_FILE_MACHINE_I386 332 ; x86 !define IMAGE_FILE_MACHINE_ARMNT 452 !define IMAGE_FILE_MACHINE_IA64 512 ; Itanium !define IMAGE_FILE_MACHINE_AMD64 34404 ; x86-64/x64 !define IMAGE_FILE_MACHINE_ARM64 43620 !endif /* __WIN_NOINC_WINNT */ !verbose pop !endif /* __WIN_WINNT__INC */nsis-3.11/Include/Win/WinUser.nsh000077500000000000000000000142701477201124000166450ustar00rootroot00000000000000!ifndef __WIN_WINUSER__INC !define __WIN_WINUSER__INC !verbose push !verbose 3 !ifndef __WIN_MS_NOUSER & __WIN_NOINC_WINUSER !ifndef __WIN_MS_NOVIRTUALKEYCODES !define VK_LBUTTON 0x01 !define VK_RBUTTON 0x02 !define VK_CANCEL 0x03 !define VK_MBUTTON 0x04 /* NOT contiguous with L & RBUTTON */ !define VK_XBUTTON1 0x05 /* NOT contiguous with L & RBUTTON */ !define VK_XBUTTON2 0x06 /* NOT contiguous with L & RBUTTON */ !define VK_BACK 0x08 !define VK_TAB 0x09 !define VK_CLEAR 0x0C !define VK_RETURN 0x0D !define VK_SHIFT 0x10 !define VK_CONTROL 0x11 !define VK_MENU 0x12 !define VK_PAUSE 0x13 !define VK_CAPITAL 0x14 !define VK_ESCAPE 0x1B !define VK_CONVERT 0x1C !define VK_NONCONVERT 0x1D !define VK_ACCEPT 0x1E !define VK_MODECHANGE 0x1F !define VK_SPACE 0x20 !define VK_PRIOR 0x21 !define VK_NEXT 0x22 !define VK_END 0x23 !define VK_HOME 0x24 !define VK_LEFT 0x25 !define VK_UP 0x26 !define VK_RIGHT 0x27 !define VK_DOWN 0x28 !define VK_SELECT 0x29 !define VK_PRINT 0x2A !define VK_EXECUTE 0x2B !define VK_SNAPSHOT 0x2C !define VK_INSERT 0x2D !define VK_DELETE 0x2E !define VK_HELP 0x2F ; VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39) ; VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A) !define VK_LWIN 0x5B !define VK_RWIN 0x5C !define VK_APPS 0x5D !define VK_SLEEP 0x5F !define VK_NUMPAD0 0x60 !define VK_NUMPAD1 0x61 !define VK_NUMPAD2 0x62 !define VK_NUMPAD3 0x63 !define VK_NUMPAD4 0x64 !define VK_NUMPAD5 0x65 !define VK_NUMPAD6 0x66 !define VK_NUMPAD7 0x67 !define VK_NUMPAD8 0x68 !define VK_NUMPAD9 0x69 !define VK_MULTIPLY 0x6A !define VK_ADD 0x6B !define VK_SEPARATOR 0x6C !define VK_SUBTRACT 0x6D !define VK_DECIMAL 0x6E !define VK_DIVIDE 0x6F !define VK_F1 0x70 !define VK_F2 0x71 !define VK_F3 0x72 !define VK_F4 0x73 !define VK_F5 0x74 !define VK_F6 0x75 !define VK_F7 0x76 !define VK_F8 0x77 !define VK_F9 0x78 !define VK_F10 0x79 !define VK_F11 0x7A !define VK_F12 0x7B !define VK_NUMLOCK 0x90 !define VK_SCROLL 0x91 !define VK_OEM_NEC_EQUAL 0x92 ; '=' key on numpad !define VK_LSHIFT 0xA0 !define VK_RSHIFT 0xA1 !define VK_LCONTROL 0xA2 !define VK_RCONTROL 0xA3 !define VK_LMENU 0xA4 !define VK_RMENU 0xA5 !endif !ifndef __WIN_MS_NOWINOFFSETS !define /ifndef GWL_STYLE -16 !define /ifndef GWL_EXSTYLE -20 !define /ifndef GWLP_WNDPROC -4 !define /ifndef GWLP_HINSTANCE -6 !define /ifndef GWLP_HWNDPARENT -8 !define /ifndef GWLP_USERDATA -21 !define /ifndef GWLP_ID -12 !define DWLP_MSGRESULT 0 !define /math DWLP_DLGPROC ${DWLP_MSGRESULT} + ${NSIS_PTR_SIZE} ;DWLP_MSGRESULT + sizeof(LRESULT) !define /math DWLP_USER ${DWLP_DLGPROC} + ${NSIS_PTR_SIZE} ;DWLP_DLGPROC + sizeof(DLGPROC) !endif !ifndef __WIN_MS_NONCMESSAGES !define HTERROR -2 !define HTTRANSPARENT -1 !define HTNOWHERE 0 !define HTCLIENT 1 !define HTCAPTION 2 !define HTSYSMENU 3 !define HTGROWBOX 4 !define HTSIZE ${HTGROWBOX} !define HTMENU 5 !define HTHSCROLL 6 !define HTVSCROLL 7 !define HTMINBUTTON 8 !define HTMAXBUTTON 9 !define HTLEFT 10 !define HTRIGHT 11 !define HTTOP 12 !define HTTOPLEFT 13 !define HTTOPRIGHT 14 !define HTBOTTOM 15 !define HTBOTTOMLEFT 16 !define HTBOTTOMRIGHT 17 !define HTBORDER 18 !define HTREDUCE ${HTMINBUTTON} !define HTZOOM ${HTMAXBUTTON} !define HTSIZEFIRST ${HTLEFT} !define HTSIZELAST ${HTBOTTOMRIGHT} !define HTOBJECT 19 !define HTCLOSE 20 !define HTHELP 21 !endif !ifndef __WIN_MS_NOSYSCOMMANDS !define SC_SIZE 0xF000 !define SC_MOVE 0xF010 !define SC_MINIMIZE 0xF020 !define SC_MAXIMIZE 0xF030 !define SC_NEXTWINDOW 0xF040 !define SC_PREVWINDOW 0xF050 !define SC_CLOSE 0xF060 !define SC_VSCROLL 0xF070 !define SC_HSCROLL 0xF080 !define SC_MOUSEMENU 0xF090 !define SC_KEYMENU 0xF100 !define SC_ARRANGE 0xF110 !define SC_RESTORE 0xF120 !define SC_TASKLIST 0xF130 !define SC_SCREENSAVE 0xF140 !define SC_HOTKEY 0xF150 !define SC_DEFAULT 0xF160 !define SC_MONITORPOWER 0xF170 !define SC_CONTEXTHELP 0xF180 !define SC_SEPARATOR 0xF00F !endif !define /ifndef IDC_ARROW 32512 !define /ifndef IDC_IBEAM 32513 !define /ifndef IDC_WAIT 32514 !define /ifndef IDC_CROSS 32515 !define /ifndef IDC_UPARROW 32516 !define /ifndef IDC_SIZE 32640 !define /ifndef IDC_ICON 32641 !define /ifndef IDC_SIZENWSE 32642 !define /ifndef IDC_SIZENESW 32643 !define /ifndef IDC_SIZEWE 32644 !define /ifndef IDC_SIZENS 32645 !define /ifndef IDC_SIZEALL 32646 !define /ifndef IDC_NO 32648 !define /ifndef IDC_HAND 32649 !define /ifndef IDC_APPSTARTING 32650 !define /ifndef IDC_HELP 32651 !define /ifndef IMAGE_BITMAP 0 !define /ifndef IMAGE_ICON 1 !define /ifndef IMAGE_CURSOR 2 !define /ifndef IMAGE_ENHMETAFILE 3 !define /ifndef LR_DEFAULTCOLOR 0x0000 !define /ifndef LR_MONOCHROME 0x0001 !define /ifndef LR_COLOR 0x0002 !define /ifndef LR_COPYRETURNORG 0x0004 !define /ifndef LR_COPYDELETEORG 0x0008 !define /ifndef LR_LOADFROMFILE 0x0010 !define /ifndef LR_LOADTRANSPARENT 0x0020 !define /ifndef LR_DEFAULTSIZE 0x0040 !define /ifndef LR_VGACOLOR 0x0080 !define /ifndef LR_LOADMAP3DCOLORS 0x1000 !define /ifndef LR_CREATEDIBSECTION 0x2000 !define /ifndef LR_COPYFROMRESOURCE 0x4000 !define /ifndef LR_SHARED 0x8000 !define GA_PARENT 1 !define GA_ROOT 2 !define GA_ROOTOWNER 3 !endif /* __WIN_MS_NOUSER & __WIN_NOINC_WINUSER */ !verbose pop !endif /* __WIN_WINUSER__INC */nsis-3.11/Include/WinCore.nsh000077500000000000000000000272171477201124000160670ustar00rootroot00000000000000/* WinCore.nsh & Win\*.nsh - Collection of common windows defines !define __WIN_NOINC_xxx to exclude a windows header file !define __WIN_MS_xxx to exclude specific things (The original #ifdef xxx checks can be found in the official Microsoft headers) */ !ifndef __WIN_WINDOWS__INC !define __WIN_WINDOWS__INC !verbose push !verbose 3 !include Win\WinDef.nsh !include Win\WinError.nsh !include Win\WinNT.nsh !include Win\WinUser.nsh !ifndef __WIN_MS_NOWINMESSAGES !include WinMessages.nsh !endif /************************************************** WinBase.h **************************************************/ !ifndef __WIN_NOINC_WINBASE !define /ifndef INVALID_HANDLE_VALUE -1 !define /ifndef INVALID_FILE_SIZE 0xFFFFFFFF !define /ifndef INVALID_SET_FILE_POINTER -1 !define /ifndef INVALID_FILE_ATTRIBUTES -1 !define WAIT_FAILED 0xFFFFFFFF !define WAIT_OBJECT_0 0 ;((STATUS_WAIT_0 ) + 0 ) !define WAIT_ABANDONED 0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 ) !define WAIT_ABANDONED_0 0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 ) !define DRIVE_UNKNOWN 0 !define DRIVE_NO_ROOT_DIR 1 !define DRIVE_REMOVABLE 2 !define DRIVE_FIXED 3 !define DRIVE_REMOTE 4 !define DRIVE_CDROM 5 !define DRIVE_RAMDISK 6 !define FILE_TYPE_UNKNOWN 0x0000 !define FILE_TYPE_DISK 0x0001 !define FILE_TYPE_CHAR 0x0002 !define FILE_TYPE_PIPE 0x0003 !define FILE_TYPE_REMOTE 0x8000 !define STD_INPUT_HANDLE -10 !define STD_OUTPUT_HANDLE -11 !define STD_ERROR_HANDLE -12 #define IGNORE 0 ; Ignore signal !define INFINITE 0xFFFFFFFF ; Infinite timeout !endif /* __WIN_NOINC_WINBASE */ /************************************************** WinGDI.h **************************************************/ !ifndef __WIN_MS_NOGDI & __WIN_NOINC_WINGDI !define HORZRES 8 !define VERTRES 10 !define BITSPIXEL 12 !define LOGPIXELSX 88 !define LOGPIXELSY 90 !define COLORRES 108 !define VREFRESH 116 !define DESKTOPVERTRES 117 !define DESKTOPHORZRES 118 !endif /* __WIN_MS_NOGDI & __WIN_NOINC_WINGDI */ /************************************************** WinReg.h **************************************************/ !ifndef __WIN_NOINC_WINREG !ifndef __WIN_NOHKEY & HKEY_CLASSES_ROOT & HKEY_CURRENT_USER & HKEY_LOCAL_MACHINE & HKEY_USERS !define HKEY_CLASSES_ROOT 0x80000000 !define HKEY_CURRENT_USER 0x80000001 !define HKEY_LOCAL_MACHINE 0x80000002 !define HKEY_USERS 0x80000003 !define HKEY_PERFORMANCE_DATA 0x80000004 !define HKEY_PERFORMANCE_TEXT 0x80000050 !define HKEY_PERFORMANCE_NLSTEXT 0x80000060 !define HKEY_CURRENT_CONFIG 0x80000005 !define HKEY_DYN_DATA 0x80000006 !ifndef __WIN_NOSHORTHKEY & HKCR & HKCU & HKLM !define HKCR ${HKEY_CLASSES_ROOT} !define HKCU ${HKEY_CURRENT_USER} !define HKLM ${HKEY_LOCAL_MACHINE} !endif !endif !endif /* __WIN_NOINC_WINREG */ /************************************************** WindowsX.h **************************************************/ !ifndef __WIN_NOINC_WINDOWSX !ifndef GET_X_LPARAM & GET_Y_LPARAM !macro _Win_GET_X_LPARAM _outvar _in IntOp ${_outvar} "${_in}" << 16 ;We can't just use LOWORD, we need to keep the sign, IntOp ${_outvar} ${_outvar} >> 16 ;so we let NSIS sign extend for us !macroend !define GET_X_LPARAM "!insertmacro _Win_GET_X_LPARAM " !macro _Win_GET_Y_LPARAM _outvar _in IntOp ${_outvar} "${_in}" >> 16 !macroend !define GET_Y_LPARAM "!insertmacro _Win_GET_Y_LPARAM " !endif !endif /* __WIN_NOINC_WINDOWSX */ /************************************************** ShlObj.h **************************************************/ !ifndef __WIN_NOINC_SHLOBJ !ifndef __WIN_NOSHELLFOLDERCSIDL !define CSIDL_DESKTOP 0x0000 !define CSIDL_INTERNET 0x0001 ;Internet Explorer (icon on desktop) !define CSIDL_PROGRAMS 0x0002 ;Start Menu\Programs !define CSIDL_CONTROLS 0x0003 ;My Computer\Control Panel !define CSIDL_PRINTERS 0x0004 ;My Computer\Printers !define CSIDL_PERSONAL 0x0005 ;My Documents !define CSIDL_FAVORITES 0x0006 ;\Favorites !define CSIDL_STARTUP 0x0007 ;Start Menu\Programs\Startup !define CSIDL_RECENT 0x0008 ;\Recent !define CSIDL_SENDTO 0x0009 ;\SendTo !define CSIDL_BITBUCKET 0x000a ;\Recycle Bin !define CSIDL_STARTMENU 0x000b ;\Start Menu !define CSIDL_MYDOCUMENTS 0x000c ;logical "My Documents" desktop icon !define CSIDL_MYMUSIC 0x000d ;"My Music" folder !define CSIDL_MYVIDEO 0x000e ;"My Videos" folder !define CSIDL_DESKTOPDIRECTORY 0x0010 ;\Desktop !define CSIDL_DRIVES 0x0011 ;My Computer !define CSIDL_NETWORK 0x0012 ;Network Neighborhood !define CSIDL_NETHOOD 0x0013 ;\nethood !define CSIDL_FONTS 0x0014 ;windows\fonts !define CSIDL_TEMPLATES 0x0015 !define CSIDL_COMMON_STARTMENU 0x0016 ;All Users\Start Menu !define CSIDL_COMMON_PROGRAMS 0x0017 ;All Users\Start Menu\Programs !define CSIDL_COMMON_STARTUP 0x0018 ;All Users\Startup !define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 ;All Users\Desktop !define CSIDL_APPDATA 0x001a ;\Application Data !define CSIDL_PRINTHOOD 0x001b ;\PrintHood !define CSIDL_LOCAL_APPDATA 0x001c ;\Local Settings\Application Data (non roaming) !define CSIDL_ALTSTARTUP 0x001d ;non localized startup !define CSIDL_COMMON_ALTSTARTUP 0x001e ;non localized common startup !define CSIDL_COMMON_FAVORITES 0x001f !define CSIDL_INTERNET_CACHE 0x0020 !define CSIDL_COOKIES 0x0021 !define CSIDL_HISTORY 0x0022 !define CSIDL_COMMON_APPDATA 0x0023 ;All Users\Application Data !define CSIDL_WINDOWS 0x0024 ;GetWindowsDirectory !define CSIDL_SYSTEM 0x0025 ;GetSystemDirectory !define CSIDL_PROGRAM_FILES 0x0026 ;C:\Program Files !define CSIDL_MYPICTURES 0x0027 !define CSIDL_PROFILE 0x0028 ;USERPROFILE !define CSIDL_SYSTEMX86 0x0029 ;x86 system directory on RISC !define CSIDL_PROGRAM_FILESX86 0x002a ;x86 C:\Program Files on RISC !define CSIDL_PROGRAM_FILES_COMMON 0x002b ;C:\Program Files\Common !define CSIDL_PROGRAM_FILES_COMMONX86 0x002c ;x86 Program Files\Common on RISC !define CSIDL_COMMON_TEMPLATES 0x002d ;All Users\Templates !define CSIDL_COMMON_DOCUMENTS 0x002e ;All Users\Documents !define CSIDL_COMMON_ADMINTOOLS 0x002f ;All Users\Start Menu\Programs\Administrative Tools !define CSIDL_ADMINTOOLS 0x0030 ;\Start Menu\Programs\Administrative Tools !define CSIDL_CONNECTIONS 0x0031 ;Network and Dial-up Connections !define CSIDL_COMMON_MUSIC 0x0035 ;All Users\My Music !define CSIDL_COMMON_PICTURES 0x0036 ;All Users\My Pictures !define CSIDL_COMMON_VIDEO 0x0037 ;All Users\My Video !define CSIDL_RESOURCES 0x0038 ;Resource Directory !define CSIDL_RESOURCES_LOCALIZED 0x0039 ;Localized Resource Directory !define CSIDL_COMMON_OEM_LINKS 0x003a ;Links to All Users OEM specific apps !define CSIDL_CDBURN_AREA 0x003b ;USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning !define CSIDL_COMPUTERSNEARME 0x003d ;Computers Near Me (computered from Workgroup membership) !define CSIDL_FLAG_CREATE 0x8000 ;combine with CSIDL_ value to force folder creation in SHGetFolderPath() !define CSIDL_FLAG_DONT_VERIFY 0x4000 ;combine with CSIDL_ value to return an unverified folder path !define CSIDL_FLAG_NO_ALIAS 0x1000 ;combine with CSIDL_ value to insure non-alias versions of the pidl !define CSIDL_FLAG_PER_USER_INIT 0x0800 ;combine with CSIDL_ value to indicate per-user init (eg. upgrade) !define CSIDL_FLAG_MASK 0xFF00 !endif /* __WIN_NOSHELLFOLDERCSIDL */ !endif /* __WIN_NOINC_SHLOBJ */ /************************************************** Shobjidl.h **************************************************/ !ifndef __WIN_NOINC_SHOBJIDL ; ASSOCIATIONLEVEL !define AL_MACHINE 0 !define AL_EFFECTIVE 1 !define AL_USER 2 ; ASSOCIATIONTYPE !define AT_FILEEXTENSION 0 !define AT_URLPROTOCOL 1 !define AT_STARTMENUCLIENT 2 !define AT_MIMETYPE 3 !endif /* __WIN_NOINC_SHOBJIDL */ /************************************************** ShlGuid.h **************************************************/ !ifndef __WIN_NOINC_SHLGUID !define FOLDERID_Public {DFDF76A2-C82A-4D63-906A-5644AC457385} ; Vista+ Fixed=%SystemDrive%\Users\Public !define FOLDERID_Games {CAC52C1A-B53D-4edc-92D7-6B2E8AC19434} ; Vista+ && < 10 (1803) Virtual !define FOLDERID_SavedGames {4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4} ; Vista+ PerUser=%USERPROFILE%\Saved Games !define FOLDERID_GameTasks {054FAE61-4DD8-4787-80B6-090220C4B700} ; Vista+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\GameExplorer !define FOLDERID_PublicGameTasks {DEBF2536-E1A8-4c59-B6A2-414586476AEA} ; Vista+ Common=%ALLUSERSPROFILE%\Microsoft\Windows\GameExplorer !define FOLDERID_Contacts {56784854-C6CB-462b-8169-88E350ACB882} ; Vista+ PerUser=%USERPROFILE%\Contacts !define FOLDERID_Downloads {374DE290-123F-4565-9164-39C4925E467B} ; Vista+ PerUser=%USERPROFILE%\Downloads !define FOLDERID_PublicDownloads {3D644C9B-1FB8-4f30-9B45-F670235F79C0} ; Vista+ Common=%PUBLIC%\Downloads !define FOLDERID_UserProfiles {0762D272-C50A-4BB0-A382-697DCD729B80} ; Vista+ Fixed=%SystemDrive%\Users !define FOLDERID_UserProgramFiles {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; 7+ PerUser=%LOCALAPPDATA%\Programs !define FOLDERID_UserProgramFilesCommon {BCBD3057-CA5C-4622-B42D-BC56DB0AE516} ; 7+ PerUser=%LOCALAPPDATA%\Programs\Common !define FOLDERID_PublicLibraries {48DAF80B-E6CF-4F4E-B800-0E69D84EE384} ; 7+ Common=%ALLUSERSPROFILE%\Microsoft\Windows\Libraries !define FOLDERID_UserPinned {9E3995AB-1F9C-4F13-B827-48B24B6C7174} ; 7+ PerUser=%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned !define FOLDERID_ImplicitAppShortcuts {BCB5256F-79F6-4CEE-B725-DC34E402FD46} ; 7+ PerUser=%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts !define FOLDERID_DeviceMetadataStore {5CE4A5E9-E4EB-479D-B89F-130C02886155} ; 7+ Common=%ALLUSERSPROFILE%\Microsoft\Windows\DeviceMetadataStore !define FOLDERID_ApplicationShortcuts {A3918781-E5F2-4890-B3D9-A7E54332328C} ; 8.0+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\Application Shortcuts !define FOLDERID_RoamingTiles {00BCFC5A-ED94-4e48-96A1-3F6217F21990} ; 8.0+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\RoamingTiles !define FOLDERID_RoamedTileImages {AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E} ; 8.0+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\RoamedTileImages !define FOLDERID_PublicUserTiles {0482af6c-08f1-4c34-8c90-e17ec98b1e17} ; 8.0+ Common=%PUBLIC%\AccountPictures !define FOLDERID_AccountPictures {008ca0b1-55b4-4c56-b8a8-4de4b299d3be} ; 8.0+ PerUser=%APPDATA%\Microsoft\Windows\AccountPictures !define FOLDERID_Screenshots {b7bede81-df94-4682-a7d8-57a52620b86f} ; 8.0+ PerUser=%USERPROFILE%\Pictures\Screenshots !define FOLDERID_SkyDrive {A52BBA46-E9E1-435f-B3D9-28DAA648C0F6} ; 8.1+ PerUser=%USERPROFILE%\OneDrive !define FOLDERID_AppDataProgramData {559D40A3-A036-40FA-AF61-84CB430A4D34} ; 10 (1709)+ PerUser=%LOCALAPPDATA%\ProgramData !endif /* __WIN_NOINC_SHLGUID */ !verbose pop !endif /* __WIN_WINDOWS__INC */nsis-3.11/Include/WinMessages.nsh000077500000000000000000001076251477201124000167500ustar00rootroot00000000000000/* _____________________________________________________________________________ List of common Windows Messages _____________________________________________________________________________ 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Usage example: --------------------------------------------------- Name "Output" OutFile "Output.exe" !include "WinMessages.nsh" Section FindWindow $0 '#32770' '' $HWNDPARENT GetDlgItem $1 $0 1027 SendMessage $1 ${WM_SETTEXT} 0 'STR:MyText' SectionEnd --------------------------------------------------- Prefix Message category ------------------------- SW ShowWindow Commands CCM Generic Common Control BM Button control CB Combo box control EM Edit control LB List box control WM General window ABM Application desktop toolbar DBT Device DM Default push button control HDM Header control LVM List view control SB Status bar window SBM Scroll bar control STM Static control TCM Tab control PBM Progress bar ACM Animation control TBM Track bar UDM Up-down control HKM Hot key control IPM IP address control NCM Network address control ----------------------------------- NOT included messages (WM_USER + X) ----------------------------------- CBEM Extended combo box control CDM Common dialog box DL Drag list box PGM Pager control PSM Property sheet RB Rebar control TB Toolbar TTM Tooltip control TVM Tree-view control ----------------------------------- */ !ifndef WINMESSAGES_INCLUDED !define WINMESSAGES_INCLUDED !verbose push !verbose 3 !define _NSIS_DEFAW '!insertmacro _NSIS_DEFAW ' !macro _NSIS_DEFAW d !ifdef NSIS_UNICODE !define ${d} "${${d}W}" !else !define ${d} "${${d}A}" !endif !macroend !define HWND_BROADCAST 0xFFFF #ShowWindow Commands# !define SW_HIDE 0 !define SW_SHOWNORMAL 1 !define SW_NORMAL 1 !define SW_SHOWMINIMIZED 2 !define SW_SHOWMAXIMIZED 3 !define SW_MAXIMIZE 3 !define SW_SHOWNOACTIVATE 4 !define SW_SHOW 5 !define SW_MINIMIZE 6 !define SW_SHOWMINNOACTIVE 7 !define SW_SHOWNA 8 !define SW_RESTORE 9 !define SW_SHOWDEFAULT 10 !define SW_FORCEMINIMIZE 11 !define SW_MAX 11 #Generic Common Control Messages# !define CCM_FIRST 0x2000 !define /math CCM_SETBKCOLOR ${CCM_FIRST} + 0x1 ; IE4 !define /math CCM_SETUNICODEFORMAT ${CCM_FIRST} + 0x5 !define /math CCM_GETUNICODEFORMAT ${CCM_FIRST} + 0x6 !define /math CCM_SETVERSION ${CCM_FIRST} + 0x7 ; IE5 !define /math CCM_GETVERSION ${CCM_FIRST} + 0x8 !define /math CCM_SETWINDOWTHEME ${CCM_FIRST} + 0xB ; WinXP !define /math CCM_DPISCALE ${CCM_FIRST} + 0xC !define WM_USER 0x400 !define CCS_TOP 1 !define CCS_BOTTOM 3 !define CCS_NODIVIDER 64 !define CCS_LEFT 129 !define CCS_RIGHT 131 !define I_IMAGENONE -2 #Button Control Messages# !define BM_CLICK 0x00F5 !define BM_GETCHECK 0x00F0 !define BM_GETIMAGE 0x00F6 !define BM_GETSTATE 0x00F2 !define BM_SETCHECK 0x00F1 !define BM_SETIMAGE 0x00F7 !define BM_SETSTATE 0x00F3 !define BM_SETSTYLE 0x00F4 !define BCM_SETSHIELD 0x160C ; WinVista + ComCtl32 v6 !define BST_UNCHECKED 0 !define BST_CHECKED 1 !define BST_INDETERMINATE 2 !define BST_PUSHED 4 !define BST_FOCUS 8 #Combo Box Messages# !define CB_ADDSTRING 0x0143 !define CB_DELETESTRING 0x0144 !define CB_DIR 0x0145 !define CB_FINDSTRING 0x014C !define CB_FINDSTRINGEXACT 0x0158 !define CB_GETCOUNT 0x0146 !define CB_GETCURSEL 0x0147 !define CB_GETDROPPEDCONTROLRECT 0x0152 !define CB_GETDROPPEDSTATE 0x0157 !define CB_GETDROPPEDWIDTH 0x015f !define CB_GETEDITSEL 0x0140 !define CB_GETEXTENDEDUI 0x0156 !define CB_GETHORIZONTALEXTENT 0x015d !define CB_GETITEMDATA 0x0150 !define CB_GETITEMHEIGHT 0x0154 !define CB_GETLBTEXT 0x0148 !define CB_GETLBTEXTLEN 0x0149 !define CB_GETLOCALE 0x015A !define CB_GETTOPINDEX 0x015b !define CB_INITSTORAGE 0x0161 !define CB_INSERTSTRING 0x014A !define CB_LIMITTEXT 0x0141 !define CB_MSGMAX 0x015B # 0x0162 0x0163 !define CB_MULTIPLEADDSTRING 0x0163 !define CB_RESETCONTENT 0x014B !define CB_SELECTSTRING 0x014D !define CB_SETCURSEL 0x014E !define CB_SETDROPPEDWIDTH 0x0160 !define CB_SETEDITSEL 0x0142 !define CB_SETEXTENDEDUI 0x0155 !define CB_SETHORIZONTALEXTENT 0x015e !define CB_SETITEMDATA 0x0151 !define CB_SETITEMHEIGHT 0x0153 !define CB_SETLOCALE 0x0159 !define CB_SETTOPINDEX 0x015c !define CB_SHOWDROPDOWN 0x014F !define CBM_FIRST 0x1700 ; Vista+ !define /math CB_SETMINVISIBLE ${CBM_FIRST} + 1 !define /math CB_GETMINVISIBLE ${CBM_FIRST} + 2 !define /math CB_SETCUEBANNER ${CBM_FIRST} + 3 !define /math CB_GETCUEBANNER ${CBM_FIRST} + 4 !define CB_ERR -1 #Edit Control Messages# !define EM_CANUNDO 0x00C6 !define EM_CHARFROMPOS 0x00D7 !define EM_EMPTYUNDOBUFFER 0x00CD !define EM_FMTLINES 0x00C8 !define EM_GETFIRSTVISIBLELINE 0x00CE !define EM_GETHANDLE 0x00BD !define EM_GETIMESTATUS 0x00D9 !define EM_GETLIMITTEXT 0x00D5 !define EM_GETLINE 0x00C4 !define EM_GETLINECOUNT 0x00BA !define EM_GETMARGINS 0x00D4 !define EM_GETMODIFY 0x00B8 !define EM_GETPASSWORDCHAR 0x00D2 !define EM_GETRECT 0x00B2 !define EM_GETSEL 0x00B0 !define EM_GETTHUMB 0x00BE !define EM_GETWORDBREAKPROC 0x00D1 !define EM_LIMITTEXT 0x00C5 !define EM_LINEFROMCHAR 0x00C9 !define EM_LINEINDEX 0x00BB !define EM_LINELENGTH 0x00C1 !define EM_LINESCROLL 0x00B6 !define EM_POSFROMCHAR 0x00D6 !define EM_REPLACESEL 0x00C2 !define EM_SCROLL 0x00B5 !define EM_SCROLLCARET 0x00B7 !define EM_SETHANDLE 0x00BC !define EM_SETIMESTATUS 0x00D8 !define EM_SETLIMITTEXT 0x00C5 # Same as EM_LIMITTEXT !define EM_SETMARGINS 0x00D3 !define EM_SETMODIFY 0x00B9 !define EM_SETPASSWORDCHAR 0x00CC !define EM_SETREADONLY 0x00CF !define EM_SETRECT 0x00B3 !define EM_SETRECTNP 0x00B4 !define EM_SETSEL 0x00B1 !define EM_SETTABSTOPS 0x00CB !define EM_SETWORDBREAKPROC 0x00D0 !define EM_UNDO 0x00C7 !define ECM_FIRST 0x1500 ; CC6+ !define /math EM_SETCUEBANNER ${ECM_FIRST} + 1 #RichEdit Messages# !define /math EM_EXGETSEL ${WM_USER} + 52 !define /math EM_EXLIMITTEXT ${WM_USER} + 53 !define /math EM_EXLINEFROMCHAR ${WM_USER} + 54 !define /math EM_GETEVENTMASK ${WM_USER} + 59 !define /math EM_GETOLEINTERFACE ${WM_USER} + 60 !define /math EM_HIDESELECTION ${WM_USER} + 63 !define /math EM_SETBKGNDCOLOR ${WM_USER} + 67 !define /math EM_SETEVENTMASK ${WM_USER} + 69 !define /math EM_STREAMIN ${WM_USER} + 73 !define /math EM_STREAMOUT ${WM_USER} + 74 !define /math EM_GETTEXTRANGE ${WM_USER} + 75 !define /math EM_SETOPTIONS ${WM_USER} + 77 !define /math EM_GETOPTIONS ${WM_USER} + 78 !define /math EM_SETUNDOLIMIT ${WM_USER} + 82 ; v2+ !define /math EM_AUTOURLDETECT ${WM_USER} + 91 !define /Math EM_SETTEXTEX ${WM_USER} + 97 ; v3+ !define /math EM_SETEDITSTYLE ${WM_USER} + 204 !define /math EM_SETFONTSIZE ${WM_USER} + 223 !define EN_MSGFILTER 0x0700 !define EN_SELCHANGE 0x0702 !define EN_LINK 0x070b !define ENM_NONE 0x00000000 !define ENM_CHANGE 0x00000001 !define ENM_UPDATE 0x00000002 !define ENM_SCROLL 0x00000004 !define ENM_SCROLLEVENTS 0x00000008 !define ENM_KEYEVENTS 0x00010000 !define ENM_MOUSEEVENTS 0x00020000 !define ENM_SELCHANGE 0x00080000 !define ENM_LINK 0x04000000 ; v2+ #Listbox Messages# !define LB_ADDFILE 0x0196 !define LB_ADDSTRING 0x0180 !define LB_DELETESTRING 0x0182 !define LB_DIR 0x018D !define LB_FINDSTRING 0x018F !define LB_FINDSTRINGEXACT 0x01A2 !define LB_GETANCHORINDEX 0x019D !define LB_GETCARETINDEX 0x019F !define LB_GETCOUNT 0x018B !define LB_GETCURSEL 0x0188 !define LB_GETHORIZONTALEXTENT 0x0193 !define LB_GETITEMDATA 0x0199 !define LB_GETITEMHEIGHT 0x01A1 !define LB_GETITEMRECT 0x0198 !define LB_GETLOCALE 0x01A6 !define LB_GETSEL 0x0187 !define LB_GETSELCOUNT 0x0190 !define LB_GETSELITEMS 0x0191 !define LB_GETTEXT 0x0189 !define LB_GETTEXTLEN 0x018A !define LB_GETTOPINDEX 0x018E !define LB_INITSTORAGE 0x01A8 !define LB_INSERTSTRING 0x0181 !define LB_ITEMFROMPOINT 0x01A9 !define LB_MSGMAX 0x01A8 # 0x01B0 0x01B1 !define LB_MULTIPLEADDSTRING 0x01B1 !define LB_RESETCONTENT 0x0184 !define LB_SELECTSTRING 0x018C !define LB_SELITEMRANGE 0x019B !define LB_SELITEMRANGEEX 0x0183 !define LB_SETANCHORINDEX 0x019C !define LB_SETCARETINDEX 0x019E !define LB_SETCOLUMNWIDTH 0x0195 !define LB_SETCOUNT 0x01A7 !define LB_SETCURSEL 0x0186 !define LB_SETHORIZONTALEXTENT 0x0194 !define LB_SETITEMDATA 0x019A !define LB_SETITEMHEIGHT 0x01A0 !define LB_SETLOCALE 0x01A5 !define LB_SETSEL 0x0185 !define LB_SETTABSTOPS 0x0192 !define LB_SETTOPINDEX 0x0197 !define LB_ERR -1 #Window Messages# !define WM_ACTIVATE 0x0006 !define WM_ACTIVATEAPP 0x001C !define WM_AFXFIRST 0x0360 !define WM_AFXLAST 0x037F !define WM_APP 0x8000 !define WM_APPCOMMAND 0x0319 !define WM_ASKCBFORMATNAME 0x030C !define WM_CANCELJOURNAL 0x004B !define WM_CANCELMODE 0x001F !define WM_CAPTURECHANGED 0x0215 !define WM_CHANGECBCHAIN 0x030D !define WM_CHANGEUISTATE 0x0127 !define WM_CHAR 0x0102 !define WM_CHARTOITEM 0x002F !define WM_CHILDACTIVATE 0x0022 !define WM_CLEAR 0x0303 !define WM_CLOSE 0x0010 !define WM_COMMAND 0x0111 !define WM_COMMNOTIFY 0x0044 # no longer supported !define WM_COMPACTING 0x0041 !define WM_COMPAREITEM 0x0039 !define WM_CONTEXTMENU 0x007B !define WM_CONVERTREQUESTEX 0x108 !define WM_COPY 0x0301 !define WM_COPYDATA 0x004A !define WM_CREATE 0x0001 !define WM_CTLCOLOR 0x0019 !define WM_CTLCOLORBTN 0x0135 !define WM_CTLCOLORDLG 0x0136 !define WM_CTLCOLOREDIT 0x0133 !define WM_CTLCOLORLISTBOX 0x0134 !define WM_CTLCOLORMSGBOX 0x0132 !define WM_CTLCOLORSCROLLBAR 0x0137 !define WM_CTLCOLORSTATIC 0x0138 !define WM_CUT 0x0300 !define WM_DDE_FIRST 0x3E0 !define WM_DEADCHAR 0x0103 !define WM_DELETEITEM 0x002D !define WM_DESTROY 0x0002 !define WM_DESTROYCLIPBOARD 0x0307 !define WM_DEVICECHANGE 0x0219 !define WM_DEVMODECHANGE 0x001B !define WM_DISPLAYCHANGE 0x007E !define WM_DRAWCLIPBOARD 0x0308 !define WM_DRAWITEM 0x002B !define WM_DROPFILES 0x0233 !define WM_ENABLE 0x000A !define WM_ENDSESSION 0x0016 !define WM_ENTERIDLE 0x0121 !define WM_ENTERMENULOOP 0x0211 !define WM_ENTERSIZEMOVE 0x0231 !define WM_ERASEBKGND 0x0014 !define WM_EXITMENULOOP 0x0212 !define WM_EXITSIZEMOVE 0x0232 !define WM_FONTCHANGE 0x001D !define WM_GETDLGCODE 0x0087 !define WM_GETFONT 0x0031 !define WM_GETHOTKEY 0x0033 !define WM_GETICON 0x007F !define WM_GETMINMAXINFO 0x0024 !define WM_GETOBJECT 0x003D !define WM_GETTEXT 0x000D !define WM_GETTEXTLENGTH 0x000E !define WM_HANDHELDFIRST 0x0358 !define WM_HANDHELDLAST 0x035F !define WM_HELP 0x0053 !define WM_HOTKEY 0x0312 !define WM_HSCROLL 0x0114 !define WM_HSCROLLCLIPBOARD 0x030E !define WM_ICONERASEBKGND 0x0027 !define WM_IME_CHAR 0x0286 !define WM_IME_COMPOSITION 0x010F !define WM_IME_COMPOSITIONFULL 0x0284 !define WM_IME_CONTROL 0x0283 !define WM_IME_ENDCOMPOSITION 0x010E !define WM_IME_KEYDOWN 0x0290 !define WM_IME_KEYLAST 0x010F !define WM_IME_KEYUP 0x0291 !define WM_IME_NOTIFY 0x0282 !define WM_IME_REQUEST 0x0288 !define WM_IME_SELECT 0x0285 !define WM_IME_SETCONTEXT 0x0281 !define WM_IME_STARTCOMPOSITION 0x010D !define WM_INITDIALOG 0x0110 !define WM_INITMENU 0x0116 !define WM_INITMENUPOPUP 0x0117 !define WM_INPUT 0x00FF !define WM_INPUTLANGCHANGE 0x0051 !define WM_INPUTLANGCHANGEREQUEST 0x0050 !define WM_KEYDOWN 0x0100 !define WM_KEYFIRST 0x0100 !define WM_KEYLAST 0x0108 !define WM_KEYUP 0x0101 !define WM_KILLFOCUS 0x0008 !define WM_LBUTTONDBLCLK 0x0203 !define WM_LBUTTONDOWN 0x0201 !define WM_LBUTTONUP 0x0202 !define WM_MBUTTONDBLCLK 0x0209 !define WM_MBUTTONDOWN 0x0207 !define WM_MBUTTONUP 0x0208 !define WM_MDIACTIVATE 0x0222 !define WM_MDICASCADE 0x0227 !define WM_MDICREATE 0x0220 !define WM_MDIDESTROY 0x0221 !define WM_MDIGETACTIVE 0x0229 !define WM_MDIICONARRANGE 0x0228 !define WM_MDIMAXIMIZE 0x0225 !define WM_MDINEXT 0x0224 !define WM_MDIREFRESHMENU 0x0234 !define WM_MDIRESTORE 0x0223 !define WM_MDISETMENU 0x0230 !define WM_MDITILE 0x0226 !define WM_MEASUREITEM 0x002C !define WM_MENUCHAR 0x0120 !define WM_MENUCOMMAND 0x0126 !define WM_MENUDRAG 0x0123 !define WM_MENUGETOBJECT 0x0124 !define WM_MENURBUTTONUP 0x0122 !define WM_MENUSELECT 0x011F !define WM_MOUSEACTIVATE 0x0021 !define WM_MOUSEFIRST 0x0200 !define WM_MOUSEHOVER 0x02A1 !define WM_MOUSELAST 0x0209 # 0x020A 0x020D !define WM_MOUSELEAVE 0x02A3 !define WM_MOUSEMOVE 0x0200 !define WM_MOUSEWHEEL 0x020A !define WM_MOVE 0x0003 !define WM_MOVING 0x0216 !define WM_NCACTIVATE 0x0086 !define WM_NCCALCSIZE 0x0083 !define WM_NCCREATE 0x0081 !define WM_NCDESTROY 0x0082 !define WM_NCHITTEST 0x0084 !define WM_NCLBUTTONDBLCLK 0x00A3 !define WM_NCLBUTTONDOWN 0x00A1 !define WM_NCLBUTTONUP 0x00A2 !define WM_NCMBUTTONDBLCLK 0x00A9 !define WM_NCMBUTTONDOWN 0x00A7 !define WM_NCMBUTTONUP 0x00A8 !define WM_NCMOUSEHOVER 0x02A0 !define WM_NCMOUSELEAVE 0x02A2 !define WM_NCMOUSEMOVE 0x00A0 !define WM_NCPAINT 0x0085 !define WM_NCRBUTTONDBLCLK 0x00A6 !define WM_NCRBUTTONDOWN 0x00A4 !define WM_NCRBUTTONUP 0x00A5 !define WM_NCXBUTTONDBLCLK 0x00AD !define WM_NCXBUTTONDOWN 0x00AB !define WM_NCXBUTTONUP 0x00AC !define WM_NEXTDLGCTL 0x0028 !define WM_NEXTMENU 0x0213 !define WM_NOTIFY 0x004E !define WM_NOTIFYFORMAT 0x0055 !define WM_NULL 0x0000 !define WM_PAINT 0x000F !define WM_PAINTCLIPBOARD 0x0309 !define WM_PAINTICON 0x0026 !define WM_PALETTECHANGED 0x0311 !define WM_PALETTEISCHANGING 0x0310 !define WM_PARENTNOTIFY 0x0210 !define WM_PASTE 0x0302 !define WM_PENWINFIRST 0x0380 !define WM_PENWINLAST 0x038F !define WM_POWER 0x0048 !define WM_POWERBROADCAST 0x0218 !define WM_PRINT 0x0317 !define WM_PRINTCLIENT 0x0318 !define WM_QUERYDRAGICON 0x0037 !define WM_QUERYENDSESSION 0x0011 !define WM_QUERYNEWPALETTE 0x030F !define WM_QUERYOPEN 0x0013 !define WM_QUERYUISTATE 0x0129 !define WM_QUEUESYNC 0x0023 !define WM_QUIT 0x0012 !define WM_RBUTTONDBLCLK 0x0206 !define WM_RBUTTONDOWN 0x0204 !define WM_RBUTTONUP 0x0205 !define WM_RASDIALEVENT 0xCCCD !define WM_RENDERALLFORMATS 0x0306 !define WM_RENDERFORMAT 0x0305 !define WM_SETCURSOR 0x0020 !define WM_SETFOCUS 0x0007 !define WM_SETFONT 0x0030 !define WM_SETHOTKEY 0x0032 !define WM_SETICON 0x0080 !define WM_SETREDRAW 0x000B !define WM_SETTEXT 0x000C !define WM_SETTINGCHANGE 0x001A # Same as WM_WININICHANGE !define WM_SHOWWINDOW 0x0018 !define WM_SIZE 0x0005 !define WM_SIZECLIPBOARD 0x030B !define WM_SIZING 0x0214 !define WM_SPOOLERSTATUS 0x002A !define WM_STYLECHANGED 0x007D !define WM_STYLECHANGING 0x007C !define WM_SYNCPAINT 0x0088 !define WM_SYSCHAR 0x0106 !define WM_SYSCOLORCHANGE 0x0015 !define WM_SYSCOMMAND 0x0112 !define WM_SYSDEADCHAR 0x0107 !define WM_SYSKEYDOWN 0x0104 !define WM_SYSKEYUP 0x0105 !define WM_TABLET_FIRST 0x02C0 !define WM_TABLET_LAST 0x02DF !define WM_THEMECHANGED 0x031A !define WM_TCARD 0x0052 !define WM_TIMECHANGE 0x001E !define WM_TIMER 0x0113 !define WM_UNDO 0x0304 !define WM_UNICHAR 0x0109 !define WM_UNINITMENUPOPUP 0x0125 !define WM_UPDATEUISTATE 0x0128 !define WM_USERCHANGED 0x0054 !define WM_VKEYTOITEM 0x002E !define WM_VSCROLL 0x0115 !define WM_VSCROLLCLIPBOARD 0x030A !define WM_WINDOWPOSCHANGED 0x0047 !define WM_WINDOWPOSCHANGING 0x0046 !define WM_WININICHANGE 0x001A !define WM_WTSSESSION_CHANGE 0x02B1 !define WM_XBUTTONDBLCLK 0x020D !define WM_XBUTTONDOWN 0x020B !define WM_XBUTTONUP 0x020C #Application desktop toolbar# !define ABM_ACTIVATE 0x00000006 # lParam == TRUE/FALSE means activate/deactivate !define ABM_GETAUTOHIDEBAR 0x00000007 !define ABM_GETSTATE 0x00000004 !define ABM_GETTASKBARPOS 0x00000005 !define ABM_NEW 0x00000000 !define ABM_QUERYPOS 0x00000002 !define ABM_REMOVE 0x00000001 !define ABM_SETAUTOHIDEBAR 0x00000008 # This can fail, you MUST check the result !define ABM_SETPOS 0x00000003 !define ABM_WINDOWPOSCHANGED 0x0000009 #Device# !define DBT_APPYBEGIN 0x0000 !define DBT_APPYEND 0x0001 !define DBT_CONFIGCHANGECANCELED 0x0019 !define DBT_CONFIGCHANGED 0x0018 !define DBT_CONFIGMGAPI32 0x0022 !define DBT_CONFIGMGPRIVATE 0x7FFF !define DBT_CUSTOMEVENT 0x8006 # User-defined event !define DBT_DEVICEARRIVAL 0x8000 # System detected a new device !define DBT_DEVICEQUERYREMOVE 0x8001 # Wants to remove, may fail !define DBT_DEVICEQUERYREMOVEFAILED 0x8002 # Removal aborted !define DBT_DEVICEREMOVECOMPLETE 0x8004 # Device is gone !define DBT_DEVICEREMOVEPENDING 0x8003 # About to remove, still avail. !define DBT_DEVICETYPESPECIFIC 0x8005 # Type specific event !define DBT_DEVNODES_CHANGED 0x0007 !define DBT_DEVTYP_DEVICEINTERFACE 0x00000005 # Device interface class !define DBT_DEVTYP_DEVNODE 0x00000001 # Devnode number !define DBT_DEVTYP_HANDLE 0x00000006 # File system handle !define DBT_DEVTYP_NET 0x00000004 # Network resource !define DBT_DEVTYP_OEM 0x00000000 # Oem-defined device type !define DBT_DEVTYP_PORT 0x00000003 # Serial, parallel !define DBT_DEVTYP_VOLUME 0x00000002 # Logical volume !define DBT_LOW_DISK_SPACE 0x0048 !define DBT_MONITORCHANGE 0x001B !define DBT_NO_DISK_SPACE 0x0047 !define DBT_QUERYCHANGECONFIG 0x0017 !define DBT_SHELLLOGGEDON 0x0020 !define DBT_USERDEFINED 0xFFFF !define DBT_VOLLOCKLOCKFAILED 0x8043 !define DBT_VOLLOCKLOCKRELEASED 0x8045 !define DBT_VOLLOCKLOCKTAKEN 0x8042 !define DBT_VOLLOCKQUERYLOCK 0x8041 !define DBT_VOLLOCKQUERYUNLOCK 0x8044 !define DBT_VOLLOCKUNLOCKFAILED 0x8046 !define DBT_VPOWERDAPI 0x8100 # VPOWERD API for Win95 !define DBT_VXDINITCOMPLETE 0x0023 #Default push button control# !define DM_BITSPERPEL 0x00040000 !define DM_COLLATE 0x00008000 !define DM_COLOR 0x00000800 !define DM_COPIES 0x00000100 !define DM_DEFAULTSOURCE 0x00000200 !define DM_DISPLAYFLAGS 0x00200000 !define DM_DISPLAYFREQUENCY 0x00400000 !define DM_DITHERTYPE 0x04000000 !define DM_DUPLEX 0x00001000 !define DM_FORMNAME 0x00010000 !define DM_GRAYSCALE 0x00000001 # This flag is no longer valid !define DM_ICMINTENT 0x01000000 !define DM_ICMMETHOD 0x00800000 !define DM_INTERLACED 0x00000002 # This flag is no longer valid !define DM_LOGPIXELS 0x00020000 !define DM_MEDIATYPE 0x02000000 !define DM_NUP 0x00000040 !define DM_ORIENTATION 0x00000001 !define DM_PANNINGHEIGHT 0x10000000 !define DM_PANNINGWIDTH 0x08000000 !define DM_PAPERLENGTH 0x00000004 !define DM_PAPERSIZE 0x00000002 !define DM_PAPERWIDTH 0x00000008 !define DM_PELSHEIGHT 0x00100000 !define DM_PELSWIDTH 0x00080000 !define DM_POSITION 0x00000020 !define DM_PRINTQUALITY 0x00000400 !define DM_SCALE 0x00000010 !define DM_SPECVERSION 0x0320 # 0x0400 0x0401 !define DM_TTOPTION 0x00004000 !define DM_YRESOLUTION 0x00002000 #Header control# !define HDM_FIRST 0x1200 #List view control# !define LVS_SINGLESEL 4 !define LVS_SHOWSELALWAYS 8 !define LVS_SORTASCENDING 0x10 !define LVS_SORTDESCENDING 0x20 !define LVS_SHAREIMAGELISTS 0x40 !define LVS_EDITLABELS 0x200 !define LVS_NOSCROLL 0x2000 !define LVS_NOCOLUMNHEADER 0x4000 !define LVS_NOSORTHEADER 0x8000 !define LVS_ICON 0 !define LVS_REPORT 1 !define LVS_SMALLICON 2 !define LVS_LIST 3 !define LVS_EX_CHECKBOXES 4 !define LVS_EX_FULLROWSELECT 0x20 !define LVS_EX_INFOTIP 0x400 !define LVS_EX_LABELTIP 0x4000 !define LVS_EX_DOUBLEBUFFER 0x10000 !define LVIF_TEXT 1 !define LVIF_IMAGE 2 !define LVIF_PARAM 4 !define LVIF_STATE 8 !define LVIS_STATEIMAGEMASK 0xF000 !define LVCF_FMT 1 !define LVCF_WIDTH 2 !define LVCF_TEXT 4 !define LVCF_SUBITEM 8 !define SYSSTRUCT_LVITEM_V1 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p) !define SYSSTRUCT_LVITEM_V2 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p,i) ; IE3 !define SYSSTRUCT_LVITEM_V3 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p,i,i,i,i) ; WinXP + ComCtl32 v6 !define SYSSTRUCT_LVITEM_V4 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p,i,i,i,i,i,i) ; WinVista + ComCtl32 v6 !define LVSCW_AUTOSIZE -1 !define LVSCW_AUTOSIZE_USEHEADER -2 !define LVM_FIRST 0x00001000 !define /math LVM_GETIMAGELIST ${LVM_FIRST} + 2 !define /math LVM_SETIMAGELIST ${LVM_FIRST} + 3 !define /math LVM_GETITEMCOUNT ${LVM_FIRST} + 4 !define /math LVM_GETITEMA ${LVM_FIRST} + 5 !define /math LVM_SETITEMA ${LVM_FIRST} + 6 !define /math LVM_INSERTITEMA ${LVM_FIRST} + 7 !define /math LVM_DELETEITEM ${LVM_FIRST} + 8 !define /math LVM_DELETEALLITEMS ${LVM_FIRST} + 9 !define /math LVM_INSERTCOLUMNA ${LVM_FIRST} + 27 !define /math LVM_SETCOLUMNWIDTH ${LVM_FIRST} + 30 !define /math LVM_SETITEMSTATE ${LVM_FIRST} + 43 !define /math LVM_GETITEMSTATE ${LVM_FIRST} + 44 !define /math LVM_GETITEMTEXTA ${LVM_FIRST} + 45 !define /math LVM_SETITEMTEXTA ${LVM_FIRST} + 46 !define /math LVM_SETITEMCOUNT ${LVM_FIRST} + 47 !define /math LVM_SORTITEMS ${LVM_FIRST} + 48 !define /math LVM_SETEXTENDEDLISTVIEWSTYLE ${LVM_FIRST} + 54 !define /math LVM_GETEXTENDEDLISTVIEWSTYLE ${LVM_FIRST} + 55 !define /math LVM_GETITEMW ${LVM_FIRST} + 75 !define /math LVM_SETITEMW ${LVM_FIRST} + 76 !define /math LVM_INSERTITEMW ${LVM_FIRST} + 77 !define /math LVM_INSERTCOLUMNW ${LVM_FIRST} + 97 !define /math LVM_GETITEMTEXTW ${LVM_FIRST} + 115 !define /math LVM_SETITEMTEXTW ${LVM_FIRST} + 116 !define /math LVM_SETSELECTEDCOLUMN ${LVM_FIRST} + 140 ${_NSIS_DEFAW} LVM_GETITEM ${_NSIS_DEFAW} LVM_SETITEM ${_NSIS_DEFAW} LVM_INSERTITEM ${_NSIS_DEFAW} LVM_INSERTCOLUMN ${_NSIS_DEFAW} LVM_GETITEMTEXT ${_NSIS_DEFAW} LVM_SETITEMTEXT #Status bar window# !define SB_SIMPLEID 0x00ff #Scroll bar control# !define SBM_ENABLE_ARROWS 0x00E4 # Not in win3.1 !define SBM_GETPOS 0x00E1 # Not in win3.1 !define SBM_GETRANGE 0x00E3 # Not in win3.1 !define SBM_GETSCROLLINFO 0x00EA !define SBM_SETPOS 0x00E0 # Not in win3.1 !define SBM_SETRANGE 0x00E2 # Not in win3.1 !define SBM_SETRANGEREDRAW 0x00E6 # Not in win3.1 !define SBM_SETSCROLLINFO 0x00E9 #Static control# !define STM_SETICON 0x0170 !define STM_GETICON 0x0171 !define STM_SETIMAGE 0x0172 !define STM_GETIMAGE 0x0173 !define STM_MSGMAX 0x0174 #Tab control# !define TCS_SCROLLOPPOSITE 0x0001 !define TCIF_TEXT 1 !define TCIF_PARAM 8 !define SYSSTRUCT_TCITEM (i,i,&i${NSIS_PTR_SIZE},t,i,i,p) !define TCM_FIRST 0x1300 !define /math TCM_INSERTITEMA ${TCM_FIRST} + 7 !define /math TCM_GETCURSEL ${TCM_FIRST} + 11 !define /math TCM_ADJUSTRECT ${TCM_FIRST} + 40 !define /math TCM_INSERTITEMW ${TCM_FIRST} + 62 !define TCN_SELCHANGE -551 !define TCN_SELCHANGING -552 ${_NSIS_DEFAW} TCM_INSERTITEM #Progress bar control# !define PBM_SETRANGE 0x401 !define PBM_SETPOS 0x402 !define PBM_DELTAPOS 0x403 !define PBM_SETSTEP 0x404 !define PBM_STEPIT 0x405 !define PBM_SETRANGE32 0x406 ; IE3 + ComCtl32 v4.70 !define PBM_GETRANGE 0x407 !define PBM_GETPOS 0x408 !define PBM_SETBARCOLOR 0x409 ; IE4 + ComCtl32 v4.71 !define PBM_SETBKCOLOR ${CCM_SETBKCOLOR} !define PBM_SETMARQUEE 0x40A ; WinXP + ComCtl32 v6 !define PBM_GETSTEP 0x40D ; WinVista !define PBM_GETBKCOLOR 0x40E !define PBM_GETBARCOLOR 0x40F !define PBM_SETSTATE 0x410 !define PBM_GETSTATE 0x411 !define PBST_NORMAL 1 !define PBST_ERROR 2 !define PBST_PAUSED 3 #Animation control# !define /math ACM_OPENA ${WM_USER} + 100 !define /math ACM_PLAY ${WM_USER} + 101 !define /math ACM_STOP ${WM_USER} + 102 !define /math ACM_OPENW ${WM_USER} + 103 ${_NSIS_DEFAW} ACM_OPEN #TrackBar control# !define /math TBM_GETPOS ${WM_USER} + 0 !define /math TBM_GETRANGEMIN ${WM_USER} + 1 !define /math TBM_GETRANGEMAX ${WM_USER} + 2 !define /math TBM_GETTIC ${WM_USER} + 3 !define /math TBM_SETTIC ${WM_USER} + 4 !define /math TBM_SETPOS ${WM_USER} + 5 !define /math TBM_SETRANGE ${WM_USER} + 6 !define /math TBM_SETRANGEMIN ${WM_USER} + 7 !define /math TBM_SETRANGEMAX ${WM_USER} + 8 !define /math TBM_CLEARTICS ${WM_USER} + 9 !define /math TBM_SETSEL ${WM_USER} + 10 !define /math TBM_SETSELSTART ${WM_USER} + 11 !define /math TBM_SETSELEND ${WM_USER} + 12 !define /math TBM_GETPTICS ${WM_USER} + 14 !define /math TBM_GETTICPOS ${WM_USER} + 15 !define /math TBM_GETNUMTICS ${WM_USER} + 16 !define /math TBM_GETSELSTART ${WM_USER} + 17 !define /math TBM_GETSELEND ${WM_USER} + 18 !define /math TBM_CLEARSEL ${WM_USER} + 19 !define /math TBM_SETTICFREQ ${WM_USER} + 20 ; TBS_AUTOTICKS required !define /math TBM_SETPAGESIZE ${WM_USER} + 21 !define /math TBM_GETPAGESIZE ${WM_USER} + 22 !define /math TBM_SETLINESIZE ${WM_USER} + 23 !define /math TBM_GETLINESIZE ${WM_USER} + 24 !define /math TBM_GETTHUMBRECT ${WM_USER} + 25 !define /math TBM_GETCHANNELRECT ${WM_USER} + 26 !define /math TBM_SETTHUMBLENGTH ${WM_USER} + 27 !define /math TBM_GETTHUMBLENGTH ${WM_USER} + 28 !define /math TBM_SETTOOLTIPS ${WM_USER} + 29 ; IE3 !define /math TBM_GETTOOLTIPS ${WM_USER} + 30 ; IE3 !define /math TBM_SETTIPSIDE ${WM_USER} + 31 ; IE3 !define /math TBM_SETBUDDY ${WM_USER} + 32 ; IE3 !define /math TBM_GETBUDDY ${WM_USER} + 33 ; IE3 !define TBM_SETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4 !define TBM_GETUNICODEFORMAT ${CCM_GETUNICODEFORMAT} ; IE4 !define /math TBM_SETPOSNOTIFY ${WM_USER} + 34 ; 7? #UpDown controls# !define /math UDM_SETRANGE ${WM_USER} + 101 !define /math UDM_GETRANGE ${WM_USER} + 102 !define /math UDM_SETPOS ${WM_USER} + 103 !define /math UDM_GETPOS ${WM_USER} + 104 !define /math UDM_SETBUDDY ${WM_USER} + 105 !define /math UDM_GETBUDDY ${WM_USER} + 106 !define /math UDM_SETACCEL ${WM_USER} + 107 !define /math UDM_GETACCEL ${WM_USER} + 108 !define /math UDM_SETBASE ${WM_USER} + 109 !define /math UDM_GETBASE ${WM_USER} + 110 !define /math UDM_SETRANGE32 ${WM_USER} + 111 ; IE4 !define /math UDM_GETRANGE32 ${WM_USER} + 112 ; IE4 !define UDM_SETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4 !define UDM_GETUNICODEFORMAT ${CCM_GETUNICODEFORMAT} ; IE4 !define /math UDM_SETPOS32 ${WM_USER} + 113 ; IE5 !define /math UDM_GETPOS32 ${WM_USER} + 114 ; IE5 #HotKey control# !define /math HKM_SETHOTKEY ${WM_USER} + 1 !define /math HKM_GETHOTKEY ${WM_USER} + 2 !define /math HKM_SETRULES ${WM_USER} + 3 !define /IfNDef HOTKEYF_SHIFT 0x01 !define /IfNDef HOTKEYF_CONTROL 0x02 !define /IfNDef HOTKEYF_ALT 0x04 !define /IfNDef HOTKEYF_EXT 0x08 !define HKCOMB_NONE 0x01 !define HKCOMB_S 0x02 !define HKCOMB_C 0x04 !define HKCOMB_A 0x08 !define HKCOMB_SC 0x10 !define HKCOMB_SA 0x20 !define HKCOMB_CA 0x40 !define HKCOMB_SCA 0x80 #IPAddress control# !define /math IPM_CLEARADDRESS ${WM_USER} + 100 !define /math IPM_SETADDRESS ${WM_USER} + 101 !define /math IPM_GETADDRESS ${WM_USER} + 102 !define /math IPM_SETRANGE ${WM_USER} + 103 !define /math IPM_SETFOCUS ${WM_USER} + 104 !define /math IPM_ISBLANK ${WM_USER} + 105 #NetworkAddress control# !define /math NCM_GETADDRESS ${WM_USER} + 1 ; Vista+ !define /math NCM_SETALLOWTYPE ${WM_USER} + 2 !define /math NCM_GETALLOWTYPE ${WM_USER} + 3 !define /math NCM_DISPLAYERRORTIP ${WM_USER} + 4 #Month calendar control# !define MCM_FIRST 0x1000 !define /math MCM_GETCURSEL ${MCM_FIRST} + 1 !define /math MCM_SETCURSEL ${MCM_FIRST} + 2 !define /math MCM_GETMAXSELCOUNT ${MCM_FIRST} + 3 !define /math MCM_SETMAXSELCOUNT ${MCM_FIRST} + 4 !define /math MCM_GETSELRANGE ${MCM_FIRST} + 5 !define /math MCM_SETSELRANGE ${MCM_FIRST} + 6 !define /math MCM_GETMONTHRANGE ${MCM_FIRST} + 7 !define /math MCM_SETDAYSTATE ${MCM_FIRST} + 8 !define /math MCM_GETMINREQRECT ${MCM_FIRST} + 9 !define /math MCM_SETCOLOR ${MCM_FIRST} + 10 !define /math MCM_GETCOLOR ${MCM_FIRST} + 11 !define /math MCM_SETTODAY ${MCM_FIRST} + 12 !define /math MCM_GETTODAY ${MCM_FIRST} + 13 !define /math MCM_HITTEST ${MCM_FIRST} + 14 !define /math MCM_SETFIRSTDAYOFWEEK ${MCM_FIRST} + 15 !define /math MCM_GETFIRSTDAYOFWEEK ${MCM_FIRST} + 16 !define /math MCM_GETRANGE ${MCM_FIRST} + 17 !define /math MCM_SETRANGE ${MCM_FIRST} + 18 !define /math MCM_GETMONTHDELTA ${MCM_FIRST} + 19 !define /math MCM_SETMONTHDELTA ${MCM_FIRST} + 20 !define /math MCM_GETMAXTODAYWIDTH ${MCM_FIRST} + 21 !define MCM_SETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4+ !define MCM_GETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4+ !define /math MCM_GETCURRENTVIEW ${MCM_FIRST} + 22 ; Vista+ !define /math MCM_GETCALENDARCOUNT ${MCM_FIRST} + 23 !define /math MCM_GETCALENDARGRIDINFO ${MCM_FIRST} + 24 !define /math MCM_GETCALID ${MCM_FIRST} + 27 !define /math MCM_SETCALID ${MCM_FIRST} + 28 !define /math MCM_SIZERECTTOMIN ${MCM_FIRST} + 29 !define /math MCM_SETCALENDARBORDER ${MCM_FIRST} + 30 !define /math MCM_GETCALENDARBORDER ${MCM_FIRST} + 31 !define /math MCM_SETCURRENTVIEW ${MCM_FIRST} + 32 !define MCN_SELCHANGE -749 !define MCN_GETDAYSTATE -747 !define MCN_SELECT -746 !define MCN_VIEWCHANGE -750 ; Vista+? #DateTime control# !define DTM_FIRST 0x1000 !define /math DTM_GETSYSTEMTIME ${DTM_FIRST} + 1 !define /math DTM_SETSYSTEMTIME ${DTM_FIRST} + 2 !define /math DTM_SETFORMATA ${DTM_FIRST} + 5 !define /math DTM_SETFORMATW ${DTM_FIRST} + 50 ${_NSIS_DEFAW} DTM_SETFORMAT !define /math DTM_GETMONTHCAL ${DTM_FIRST} + 8 !define /math DTM_SETMCFONT ${DTM_FIRST} + 9 ; IE4+? !define /math DTM_GETMCFONT ${DTM_FIRST} + 10 ; IE4+? !define /math DTM_SETMCSTYLE ${DTM_FIRST} + 11 ; Vista+? !define /math DTM_GETMCSTYLE ${DTM_FIRST} + 12 ; Vista+? !define /math DTM_CLOSEMONTHCAL ${DTM_FIRST} + 13 ; Vista+? !define DTN_DATETIMECHANGE -759 !define /IfNDef GDT_ERROR -1 !define /IfNDef GDT_VALID 0 !define /IfNDef GDT_NONE 1 !verbose pop !endif nsis-3.11/Include/WinVer.nsh000077500000000000000000000600471477201124000157310ustar00rootroot00000000000000; --------------------- ; WinVer.nsh ; --------------------- ; ; LogicLib extensions for handling Windows versions and service packs. ; ; IsNT checks if the installer is running on Windows NT family (NT4, 2000, XP, etc.) ; ; ${If} ${IsNT} ; DetailPrint "Running on NT. Installing Unicode enabled application." ; ${Else} ; DetailPrint "Not running on NT. Installing ANSI application." ; ${EndIf} ; ; IsServerOS checks if the installer is running on a server version of Windows (2000, 2003, 2008, etc.) ; IsDomainController checks if the server is a domain controller ; ; AtLeastWin checks if the installer is running on Windows version at least as specified. ; IsWin checks if the installer is running on Windows version exactly as specified. ; AtMostWin checks if the installer is running on Windows version at most as specified. ; AtLeastBuild checks if the installer is running on a Windows version with a minimum build number. ; AtMostBuild checks if the installer is running on a Windows version with a maximum build number. ; AtLeastWaaS and AtMostWaaS checks Windows 10 "friendly names" against the build number. ; ; can be replaced with the following values: ; ; 95 ; 98 ; ME ; ; NT4 ; 2000 ; XP ; 2003 ; Vista ; 2008 ; 7 ; 2008R2 ; 8 ; 2012 ; 8.1 ; 2012R2 ; 10 ; 11 ; ; Note: Windows 8.1 and later will be detected as Windows 8 unless ManifestSupportedOS is set correctly! ; ; AtLeastServicePack checks if the installer is running on Windows service pack version at least as specified. ; IsServicePack checks if the installer is running on Windows service pack version exactly as specified. ; AtMostServicePack checks if the installer is running on Windows service version pack at most as specified. ; ; Usage examples: ; ; ${If} ${IsNT} ; DetailPrint "Running on NT family." ; DetailPrint "Surely not running on 95, 98 or ME." ; ${AndIf} ${AtLeastWinNT4} ; DetailPrint "Running on NT4 or better. Could even be 2003." ; ${EndIf} ; ; ${If} ${AtLeastWinXP} ; DetailPrint "Running on XP or better." ; ${EndIf} ; ; ${If} ${IsWin2000} ; DetailPrint "Running on 2000." ; ${EndIf} ; ; ${If} ${IsWin2000} ; ${AndIf} ${AtLeastServicePack} 3 ; ${OrIf} ${AtLeastWinXP} ; DetailPrint "Running Win2000 SP3 or above" ; ${EndIf} ; ; ${If} ${AtMostWinXP} ; DetailPrint "Running on XP or older. Surely not running on Vista. Maybe 98, or even 95." ; ${EndIf} ; ; Warning: ; ; Windows 95 and NT both use the same version number. To avoid getting NT4 misidentified ; as Windows 95 and vice-versa or 98 as a version higher than NT4, always use IsNT to ; check if running on the NT family. ; ; ${If} ${AtLeastWin95} ; ${AndIf} ${AtMostWinME} ; DetailPrint "Running 95, 98 or ME." ; DetailPrint "Actually, maybe it's NT4?" ; ${If} ${IsNT} ; DetailPrint "Yes, it's NT4! oops..." ; ${Else} ; DetailPrint "Nope, not NT4. phew..." ; ${EndIf} ; ${EndIf} ; ; ; Other useful extensions are: ; ; * IsWin2003R2 ; * IsStarterEdition ; * OSHasMediaCenter ; * OSHasTabletSupport ; !verbose push !verbose 3 !ifndef ___WINVER__NSH___ !define ___WINVER__NSH___ !include LogicLib.nsh !include Util.nsh # masks for our variables !define _WINVER_VERXBIT 0x00000001 ; Used to boost $__WINVERV !define _WINVER_MASKVMAJ 0x7F000000 ; $__WINVERV mask !define _WINVER_MASKVMIN 0x00FF0000 ; $__WINVERV mask !define _WINVER_NTMASK 0x7FFFFFFF ; $__WINVERV mask used by AtMost/AtLeast !define _WINVER_NTBIT 0x80000000 ; $__WINVERV bit used by Is and $__WINVERSP bit used by IsNT !define _WINVER_NTSRVBIT 0x40000000 ; $__WINVERSP bit for !VER_NT_WORKSTATION !define _WINVER_NTDCBIT 0x20000000 ; $__WINVERSP bit for VER_NT_DOMAIN_CONTROLLER !define _WINVER_MASKVBLD 0x0000FFFF ; $__WINVERSP mask for OS build number !define _WINVER_MASKSP 0x000F0000 ; $__WINVERSP mask for OS service pack # possible variable values for different versions !define WINVER_95_NT 0x04000000 ;4.00.0950 !define WINVER_95 0x04000000 ;4.00.0950 !define WINVER_98_NT 0x040a0000 ;4.10.1998 !define WINVER_98 0x040a0000 ;4.10.1998 ;define WINVER_98SE 0x040a0000 ;4.10.2222 !define WINVER_ME_NT 0x045a0000 ;4.90.3000 !define WINVER_ME 0x045a0000 ;4.90.3000 ;define WINVER_NT3.51 ;3.51.1057 !define WINVER_NT4_NT 0x84000000 ;4.00.1381 !define WINVER_NT4 0x04000000 ;4.00.1381 !define WINVER_2000_NT 0x85000000 ;5.00.2195 !define WINVER_2000 0x05000000 ;5.00.2195 !define WINVER_XP_NT 0x85010000 ;5.01.2600 !define WINVER_XP 0x05010000 ;5.01.2600 ;define WINVER_XP64 ;5.02.3790 !define WINVER_2003_NT 0x85020000 ;5.02.3790 !define WINVER_2003 0x05020000 ;5.02.3790 !define WINVER_VISTA_NT 0x86000000 ;6.00.6000 !define WINVER_VISTA 0x06000000 ;6.00.6000 !define WINVER_2008_NT 0x86000001 ;6.00.6001 !define WINVER_2008 0x06000001 ;6.00.6001 !define WINVER_7_NT 0x86010000 ;6.01.7600 !define WINVER_7 0x06010000 ;6.01.7600 !define WINVER_2008R2_NT 0x86010001 ;6.01.7600 !define WINVER_2008R2 0x06010001 ;6.01.7600 !define WINVER_8_NT 0x86020000 ;6.02.9200 !define WINVER_8 0x06020000 ;6.02.9200 !define WINVER_2012_NT 0x86020001 ;6.02.9200 !define WINVER_2012 0x06020001 ;6.02.9200 !define WINVER_8.1_NT 0x86030000 ;6.03.9600 !define WINVER_8.1 0x06030000 ;6.03.9600 !define WINVER_2012R2_NT 0x86030001 ;6.03.9600 !define WINVER_2012R2 0x06030001 ;6.03.9600 !define WINVER_10_NT 0x8A000000 ;10.0.10240 !define WINVER_10 0x0A000000 ;10.0.10240 !define WINVER_2016_NT 0x8A000001 ;10.0.14393 !define WINVER_2016 0x0A000001 ;10.0.14393 # use this to make all nt > 9x !ifdef WINVER_NT4_OVER_W95 !define /redef /math WINVER_NT4 ${WINVER_NT4} | ${_WINVER_VERXBIT} !endif # some definitions from header files !define OSVERSIONINFOW_SIZE 276 !define OSVERSIONINFOEXW_SIZE 284 !define OSVERSIONINFOA_SIZE 148 !define OSVERSIONINFOEXA_SIZE 156 !define /ifndef VER_PLATFORM_WIN32_NT 2 !define /ifndef VER_NT_WORKSTATION 1 !define /ifndef VER_NT_DOMAIN_CONTROLLER 2 !define /ifndef VER_NT_SERVER 3 !define SM_TABLETPC 86 !define SM_MEDIACENTER 87 !define SM_STARTER 88 !define SM_SERVERR2 89 # variable declaration !macro __WinVer_DeclareVars !ifndef __WINVER_VARS_DECLARED !define __WINVER_VARS_DECLARED Var /GLOBAL __WINVERV Var /GLOBAL __WINVERSP !endif !macroend !macro __WinVer_Optimize !ifndef __WINVER_NOOPTIMIZE !if "${NSIS_CHAR_SIZE}" > 1 !define /ReDef AtMostWin95 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWin98 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWinME '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin95 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin98 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinME '"" LogicLib_AlwaysFalse ""' !endif !if "${NSIS_PTR_SIZE}" > 4 !define /ReDef AtMostWin95 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWin98 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWinME '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWinNT4 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin95 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin98 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinME '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinNT4 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtLeastWin95 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin98 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWinME '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWinNT4 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin2000 '"" LogicLib_AlwaysTrue ""' !endif !ifdef NSIS_ARM | NSIS_ARM32 | NSIS_ARMNT | NSIS_ARM64 !define /ReDef AtMostWin2000 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWinXP '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWin2003 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWinVista '"" LogicLib_AlwaysFalse ""' !define /ReDef AtMostWin7 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin95 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin98 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinME '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinNT4 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin2000 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinXP '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin2003 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWinVista '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin2008 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin7 '"" LogicLib_AlwaysFalse ""' !define /ReDef IsWin2008R2 '"" LogicLib_AlwaysFalse ""' !define /ReDef AtLeastWin95 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin98 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWinME '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWinNT4 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin2000 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWinXP '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin2003 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWinVista '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin2008 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin7 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin2008R2 '"" LogicLib_AlwaysTrue ""' !define /ReDef AtLeastWin8 '"" LogicLib_AlwaysTrue ""' !endif !endif !macroend # lazy initialization macro !define /IfNDef __WinVer_GWV GetWinVer !macro __WinVer_InitVars_NEW !insertmacro __WinVer_DeclareVars !insertmacro __WinVer_Optimize # only calculate version once StrCmp $__WINVERV "" _winver_noveryet Return _winver_noveryet: Push $0 ${__WinVer_GWV} $0 Product ${__WinVer_GWV} $__WINVERV NTDDIMajMin IntOp $__WINVERV $__WINVERV << 16 ; _WINVER_MASKVMAJ & _WINVER_MASKVMIN IntOp $__WINVERSP $0 & 2 IntOp $__WINVERSP $__WINVERSP << 29 ; _WINVER_NTSRVBIT & _WINVER_NTDCBIT !ifndef NSIS_ARM64 IntCmp $__WINVERSP 0 notServer IntCmpU 0x06000000 $__WINVERV "" "" not2008 ; ${If} $__WINVERV U>= 0x06000000 IntCmpU 0x09000000 $__WINVERV not2008 not2008 "" ; ${AndIf} $__WINVERV U< 0x09000000 IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; Extra bit so Server 2008 comes after Vista SP1 that has the same minor version, same for Win7 vs 2008R2 not2008: Goto endServer notServer: IntCmp $__WINVERV 0x05020000 "" notXP64 notXP64 StrCpy $__WINVERV 0x05010000 ; Change XP 64-bit from 5.2 to 5.1 so it's still XP notXP64: endServer: !endif IntCmp $0 0 notNT !if "${NSIS_PTR_SIZE}" <= 4 !ifdef WINVER_NT4_OVER_W95 IntCmp $__WINVERV 0x04000000 "" nt4eq95 nt4eq95 IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; change NT 4.0.reserved.0 to 4.0.reserved.1 nt4eq95: !endif !endif IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT} ; _WINVER_NTBIT IntOp $__WINVERV $__WINVERV | ${_WINVER_NTBIT} ; _WINVER_NTBIT notNT: ${__WinVer_GWV} $0 Build IntOp $__WINVERSP $__WINVERSP | $0 ; _WINVER_MASKVBLD ${__WinVer_GWV} $0 ServicePack IntOp $0 $0 << 16 IntOp $__WINVERSP $__WINVERSP | $0 ; _WINVER_MASKSP Pop $0 !macroend !ifmacrondef __WinVer_Call_GetVersionEx !macro __WinVer_Call_GetVersionEx STRUCT_SIZE System::Call '*$0(i ${STRUCT_SIZE})' System::Call kernel32::GetVersionEx(pr0)i.r3 !macroend !endif !macro __WinVer_InitVars_OLD # variables !insertmacro __WinVer_DeclareVars !insertmacro __WinVer_Optimize # only calculate version once StrCmp $__WINVERV "" _winver_noveryet Return _winver_noveryet: # push used registers on the stack Push $0 Push $1 ;maj Push $2 ;min Push $3 ;bld Push $R0 ;temp # a plugin call will lock the Unicode mode, it is now safe to set the struct size !ifdef NSIS_UNICODE !define /redef OSVERSIONINFO_SIZE ${OSVERSIONINFOW_SIZE} !define /redef OSVERSIONINFOEX_SIZE ${OSVERSIONINFOEXW_SIZE} !else !define /redef OSVERSIONINFO_SIZE ${OSVERSIONINFOA_SIZE} !define /redef OSVERSIONINFOEX_SIZE ${OSVERSIONINFOEXA_SIZE} !endif # allocate memory System::Call '*(&i${OSVERSIONINFOEX_SIZE})p.r0' # use OSVERSIONINFOEX !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEX_SIZE} IntCmp $3 0 "" _winver_ex _winver_ex # OSVERSIONINFOEX not allowed (Win9x or NT4 w/SP < 6), use OSVERSIONINFO !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFO_SIZE} _winver_ex: # get results from struct System::Call '*$0(i.s,i.r1,i.r2,i.r3,i.s,&t128.s,&i2.s,&i2,&i2,&i1.s,&i1)' # free struct System::Free $0 # win9x has major and minor info in high word of dwBuildNumber - remove it IntOp $3 $3 & 0xFFFF # get dwOSVersionInfoSize Pop $R0 # get dwPlatformId Pop $0 # NT? IntCmp $0 ${VER_PLATFORM_WIN32_NT} "" _winver_notnt _winver_notnt IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT} IntOp $__WINVERV $__WINVERV | ${_WINVER_NTBIT} _winver_notnt: !ifndef NSIS_UNICODE !if "${NSIS_PTR_SIZE}" <= 4 # get service pack information IntCmp $0 ${VER_PLATFORM_WIN32_NT} _winver_nt "" _winver_nt # win9x # get szCSDVersion Pop $0 # copy second char StrCpy $0 $0 1 1 # discard invalid wServicePackMajor and wProductType Pop $R0 Pop $R0 # switch StrCmp $0 'A' "" +3 StrCpy $0 1 Goto _winver_sp_done StrCmp $0 'B' "" +3 StrCpy $0 2 Goto _winver_sp_done StrCmp $0 'C' "" +3 StrCpy $0 3 Goto _winver_sp_done StrCpy $0 0 Goto _winver_sp_done _winver_nt: # nt !endif #~ 32-bit !endif #~ ANSI IntCmp $R0 ${OSVERSIONINFOEX_SIZE} "" _winver_sp_noex _winver_sp_noex # discard szCSDVersion Pop $0 # get wProductType Exch Pop $0 # is server? IntCmp $0 ${VER_NT_WORKSTATION} _winver_nt_notsrv IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTSRVBIT} IntCmp $0 ${VER_NT_DOMAIN_CONTROLLER} "" _winver_nt_notdc _winver_nt_notdc IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTDCBIT} _winver_nt_notdc: _winver_nt_notsrv: # get wServicePackMajor Pop $0 # done with sp Goto _winver_sp_done _winver_sp_noex: # OSVERSIONINFO, not OSVERSIONINFOEX #### TODO ## For IsServerOS to support < NT4SP6, we need to check the registry ## here to see if we are a server and/or DC # get szCSDVersion Pop $0 # discard invalid wServicePackMajor and wProductType Pop $R0 Pop $R0 # get service pack number from text StrCpy $R0 $0 13 StrCmp $R0 "Service Pack " "" +3 StrCpy $0 $0 "" 13 # cut "Service Pack " Goto +2 StrCpy $0 0 # no service pack !ifdef WINVER_NT4_OVER_W95 IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; change NT 4.0.reserved.0 to 4.0.reserved.1 !endif _winver_sp_done: # store service pack IntOp $0 $0 << 16 IntOp $__WINVERSP $__WINVERSP | $0 ### now for the version # is server? IntOp $0 $__WINVERSP & ${_WINVER_NTSRVBIT} # windows xp x64? IntCmp $0 0 "" _winver_not_xp_x64 _winver_not_xp_x64 # not server IntCmp $1 5 "" _winver_not_xp_x64 _winver_not_xp_x64 # maj 5 IntCmp $2 2 "" _winver_not_xp_x64 _winver_not_xp_x64 # min 2 # change XP x64 from 5.2 to 5.1 so it's still XP StrCpy $2 1 _winver_not_xp_x64: # server 2008? IntCmp $0 0 _winver_not_ntserver # server IntCmp 6 $1 "" "" _winver_not_ntserver # maj 6 # extra bit so Server 2008 comes after Vista SP1 that has the same minor version, same for Win7 vs 2008R2 IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} _winver_not_ntserver: # pack version IntOp $1 $1 << 24 # VerMajor IntOp $__WINVERV $__WINVERV | $1 IntOp $0 $2 << 16 IntOp $__WINVERV $__WINVERV | $0 # VerMinor IntOp $__WINVERSP $__WINVERSP | $3 # VerBuild # restore registers Pop $R0 Pop $3 Pop $2 Pop $1 Pop $0 !macroend !macro __WinVer_InitVars !ifndef WinVer_v3_7 !insertmacro __WinVer_InitVars_NEW !else !insertmacro __WinVer_InitVars_OLD !endif !macroend # version comparison LogicLib macros !macro _WinVerAtLeast _a _b _t _f !insertmacro _LOGICLIB_TEMP ${CallArtificialFunction} __WinVer_InitVars IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK} !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` !macroend !macro _WinVerIs _a _b _t _f ${CallArtificialFunction} __WinVer_InitVars !insertmacro _= $__WINVERV `${_b}` `${_t}` `${_f}` !macroend !macro _WinVerAtMost _a _b _t _f !insertmacro _LOGICLIB_TEMP ${CallArtificialFunction} __WinVer_InitVars IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK} !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` !macroend !macro __WinVer_DefineOSTest Test OS Suffix !define ${Test}Win${OS} `"" WinVer${Test} ${WINVER_${OS}${Suffix}}` !macroend !macro __WinVer_DefineOSTests Test Suffix !insertmacro __WinVer_DefineOSTest ${Test} 95 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 98 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} ME '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} NT4 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2000 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} XP '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2003 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} VISTA '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2008 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 7 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2008R2 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 8 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2012 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 8.1 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2012R2 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 10 '${Suffix}' !insertmacro __WinVer_DefineOSTest ${Test} 2016 '${Suffix}' !define /IfNDef AtLeastWin11 'U>= WinVer_BuildNumCheck 22000' !define /IfNDef AtMostWin11 'U<= WinVer_BuildNumCheck 22000' !macroend !insertmacro __WinVer_DefineOSTests AtLeast "" !insertmacro __WinVer_DefineOSTests Is _NT !insertmacro __WinVer_DefineOSTests AtMost "" # version feature LogicLib macros !macro __WinVer_LL_IsBitSet _v _b _t _f !insertmacro _LOGICLIB_TEMP ${CallArtificialFunction} __WinVer_InitVars IntOp $_LOGICLIB_TEMP ${_v} & ${_b} !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` !macroend !define IsNT `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTBIT}` !define IsServerOS `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTSRVBIT}` !define IsDomainController `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTDCBIT}` # service pack macros !macro _WinVer_GetServicePackLevel OUTVAR !ifndef WinVer_v3_7 ${__WinVer_GWV} ${OUTVAR} ServicePack !else ${CallArtificialFunction} __WinVer_InitVars IntOp ${OUTVAR} $__WINVERSP & ${_WINVER_MASKSP} IntOp ${OUTVAR} ${OUTVAR} >> 16 !endif !macroend !define WinVerGetServicePackLevel '!insertmacro _WinVer_GetServicePackLevel ' !macro _AtLeastServicePack _a _b _t _f !insertmacro _LOGICLIB_TEMP ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` !macroend !define AtLeastServicePack `"" AtLeastServicePack` !macro _AtMostServicePack _a _b _t _f !insertmacro _LOGICLIB_TEMP ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` !macroend !define AtMostServicePack `"" AtMostServicePack` !macro _IsServicePack _a _b _t _f !insertmacro _LOGICLIB_TEMP ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP !insertmacro _= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` !macroend !define IsServicePack `"" IsServicePack` # special feature LogicLib macros !macro _WinVer_SysMetricCheck m _b _t _f !insertmacro _LOGICLIB_TEMP System::Call user32::GetSystemMetrics(i${m})i.s pop $_LOGICLIB_TEMP !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` !macroend !define IsWin2003R2 `${SM_SERVERR2} WinVer_SysMetricCheck ""` !define IsStarterEdition `${SM_STARTER} WinVer_SysMetricCheck ""` !define OSHasMediaCenter `${SM_MEDIACENTER} WinVer_SysMetricCheck ""` !define OSHasTabletSupport `${SM_TABLETPC} WinVer_SysMetricCheck ""` !define IsSafeBootMode `67 WinVer_SysMetricCheck ""` # version retrieval macros !macro __WinVer_GetVer var rshift mask outvar ${CallArtificialFunction} __WinVer_InitVars !if "${mask}" != "" IntOp ${outvar} ${var} & ${mask} !if "${rshift}" != "" IntOp ${outvar} ${outvar} >> ${rshift} !endif !else IntOp ${outvar} ${var} >> ${rshift} !endif !macroend !define WinVerGetMajor '!insertmacro __WinVer_GetVer $__WINVERV 24 ${_WINVER_MASKVMAJ}' !define WinVerGetMinor '!insertmacro __WinVer_GetVer $__WINVERV 16 ${_WINVER_MASKVMIN}' !ifndef WinVer_v3_7 !macro __WinVer_GetVerBuild outvar ${__WinVer_GWV} ${outvar} Build !macroend !define WinVerGetBuild '!insertmacro __WinVer_GetVerBuild ' !else !define WinVerGetBuild '!insertmacro __WinVer_GetVer $__WINVERSP "" ${_WINVER_MASKVBLD}' !endif !macro _WinVer_BuildNumCheck op num _t _f !insertmacro _LOGICLIB_TEMP ${WinVerGetBuild} $_LOGICLIB_TEMP !insertmacro _${op} $_LOGICLIB_TEMP ${num} `${_t}` `${_f}` !macroend !define AtLeastBuild `U>= WinVer_BuildNumCheck ` !define AtMostBuild `U<= WinVer_BuildNumCheck ` # Windows as a Service macros !macro WinVer_WaaS id build fu codename marketingname !if "${id}" == "?" # Ignore !else if "${id}" == ${fu} !define WinVer_WaaS_Build ${build} !else if "${id}" == "${codename}" !define WinVer_WaaS_Build ${build} !else if "${id}" == "${marketingname}" !define WinVer_WaaS_Build ${build} !endif !macroend !macro _WinVer_WaaS op id _t _f !insertmacro WinVer_WaaS "${id}" 10240 1507 "Threshold" "Windows 10" ; 10240.16384 !insertmacro WinVer_WaaS "${id}" 10586 1511 "Threshold 2" "November Update" ; 10586.0? !insertmacro WinVer_WaaS "${id}" 14393 1607 "Redstone" "Anniversary Update" ; 14393.10 !insertmacro WinVer_WaaS "${id}" 15063 1703 "Redstone 2" "Creators Update" ; 15063.13 !insertmacro WinVer_WaaS "${id}" 16299 1709 "Redstone 3" "Fall Creators Update" ; 16299.19 !insertmacro WinVer_WaaS "${id}" 17134 1803 "Redstone 4" "April 2018 Update" ; 17134.1 !insertmacro WinVer_WaaS "${id}" 17763 1809 "Redstone 5" "October 2018 Update" ; 17763.1 !insertmacro WinVer_WaaS "${id}" 18362 1903 "19H1" "May 2019 Update" ; 18362.116 !insertmacro WinVer_WaaS "${id}" 18363 1909 "19H2" "November 2019 Update" ; 18363.418 !insertmacro WinVer_WaaS "${id}" 19041 2004 "20H1" "May 2020 Update" ; 19041.264? !insertmacro WinVer_WaaS "${id}" 19042 20H2 "20H2" "October 2020 Update" ; 19042.572? A.K.A. 2009 !insertmacro WinVer_WaaS "${id}" 19043 21H1 "21H1" "May 2021 Update" ; 19043.928 !insertmacro WinVer_WaaS "${id}" 19044 21H2 "21H2" "November 2021 Update" ; 19044.1288 !insertmacro WinVer_WaaS "${id}" 19045 "?" "?" "October 2022 Update" ; 19045.2130 22H2 !insertmacro WinVer_WaaS "${id}" 22000 "?" "Sun Valley" "Windows 11" ; 10.0.22000.194 21H2 !insertmacro WinVer_WaaS "${id}" 22621 22H2 "Sun Valley 2" "2022 Update" ; 10.0.22621.521 !insertmacro WinVer_WaaS "${id}" 22631 23H2 "Sun Valley 3" "2023 Update" !insertmacro WinVer_WaaS "${id}" 26100 24H2 "Hudson Valley" "2024 Update" !ifmacrodef WinVerExternal_WaaS_MapToBuild !insertmacro WinVerExternal_WaaS_MapToBuild ${op} "${id}" WinVer_WaaS_Build !endif !define /IfNDef WinVer_WaaS_Build 0 !if "${WinVer_WaaS_Build}" <= 9600 !error 'WinVer: Unknown WaaS name: ${id}' !endif !insertmacro _WinVer_BuildNumCheck ${op} ${WinVer_WaaS_Build} `${_t}` `${_f}` !undef WinVer_WaaS_Build !macroend !define AtLeastWaaS `U>= WinVer_WaaS ` !define AtMostWaaS `U<= WinVer_WaaS ` !endif # !___WINVER__NSH___ !verbose pop nsis-3.11/Include/WordFunc.nsh000077500000000000000000001250701477201124000162440ustar00rootroot00000000000000/* _____________________________________________________________________________ Word Functions Header v3.3 _____________________________________________________________________________ 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) See documentation for more information about the following functions. Usage in script: 1. !include "WordFunc.nsh" 2. [Section|Function] ${WordFunction} "Param1" "Param2" "..." $var [SectionEnd|FunctionEnd] WordFunction=[WordFind|WordFindS|WordFind2X|WordFind2XS|WordFind3X|WordFind3XS| WordReplace|WordReplaceS|WordAdd|WordAddS|WordInsert|WordInsertS| StrFilter|StrFilterS|VersionCompare|VersionConvert] _____________________________________________________________________________ Thanks to: _____________________________________________________________________________ WordFind3X Afrow UK (Based on his idea of Function "StrSortLR") StrFilter sunjammer (Function "StrUpper") VersionCompare Afrow UK (Based on his Function "VersionCheckNew2") VersionConvert Afrow UK (Based on his idea of Function "CharIndexReplace") */ ;_____________________________________________________________________________ ; ; Macros ;_____________________________________________________________________________ ; ; Change log window verbosity (default: 3=no script) ; ; Example: ; !include "WordFunc.nsh" ; !insertmacro WordFind ; ${WORDFUNC_VERBOSE} 4 # all verbosity ; !insertmacro WordReplace ; ${WORDFUNC_VERBOSE} 3 # no script !ifndef WORDFUNC_INCLUDED !verbose push 3 !define /IfNDef _WORDFUNC_VERBOSE 3 !verbose ${_WORDFUNC_VERBOSE} !define WORDFUNC_VERBOSE `!insertmacro WORDFUNC_VERBOSE` !define WORDFUNC_INCLUDED !include Util.nsh !macro WORDFUNC_VERBOSE _VERBOSE !verbose push 3 !define /ReDef _WORDFUNC_VERBOSE ${_VERBOSE} !verbose pop !macroend !macro WordFindCall _ART _STRING _DELIMITER _OPTION _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER}` Push `${_OPTION}` ${CallArtificialFunction}${_ART} WordFind_ Pop ${_RESULT} !verbose pop !macroend !macro WordFindSCall _ART _STRING _DELIMITER _OPTION _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER}` Push `${_OPTION}` ${CallArtificialFunction}${_ART} WordFindS_ Pop ${_RESULT} !verbose pop !macroend !macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER1}` Push `${_DELIMITER2}` Push `${_NUMBER}` ${CallArtificialFunction} WordFind2X_ Pop ${_RESULT} !verbose pop !macroend !macro WordFind2XSCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER1}` Push `${_DELIMITER2}` Push `${_NUMBER}` ${CallArtificialFunction} WordFind2XS_ Pop ${_RESULT} !verbose pop !macroend !macro WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER1}` Push `${_CENTER}` Push `${_DELIMITER2}` Push `${_NUMBER}` ${CallArtificialFunction} WordFind3X_ Pop ${_RESULT} !verbose pop !macroend !macro WordFind3XSCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER1}` Push `${_CENTER}` Push `${_DELIMITER2}` Push `${_NUMBER}` ${CallArtificialFunction} WordFind3XS_ Pop ${_RESULT} !verbose pop !macroend !macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_WORD1}` Push `${_WORD2}` Push `${_NUMBER}` ${CallArtificialFunction} WordReplace_ Pop ${_RESULT} !verbose pop !macroend !macro WordReplaceSCall _STRING _WORD1 _WORD2 _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_WORD1}` Push `${_WORD2}` Push `${_NUMBER}` ${CallArtificialFunction} WordReplaceS_ Pop ${_RESULT} !verbose pop !macroend !macro WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING1}` Push `${_DELIMITER}` Push `${_STRING2}` ${CallArtificialFunction} WordAdd_ Pop ${_RESULT} !verbose pop !macroend !macro WordAddSCall _STRING1 _DELIMITER _STRING2 _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING1}` Push `${_DELIMITER}` Push `${_STRING2}` ${CallArtificialFunction} WordAddS_ Pop ${_RESULT} !verbose pop !macroend !macro WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER}` Push `${_WORD}` Push `${_NUMBER}` ${CallArtificialFunction} WordInsert_ Pop ${_RESULT} !verbose pop !macroend !macro WordInsertSCall _STRING _DELIMITER _WORD _NUMBER _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_DELIMITER}` Push `${_WORD}` Push `${_NUMBER}` ${CallArtificialFunction} WordInsertS_ Pop ${_RESULT} !verbose pop !macroend !macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_FILTER}` Push `${_INCLUDE}` Push `${_EXCLUDE}` ${CallArtificialFunction} StrFilter_ Pop ${_RESULT} !verbose pop !macroend !macro StrFilterSCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_STRING}` Push `${_FILTER}` Push `${_INCLUDE}` Push `${_EXCLUDE}` ${CallArtificialFunction} StrFilterS_ Pop ${_RESULT} !verbose pop !macroend !macro VersionCompareCall _VER1 _VER2 _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_VER1}` Push `${_VER2}` ${CallArtificialFunction} VersionCompare_ Pop ${_RESULT} !verbose pop !macroend !macro VersionConvertCall _VERSION _CHARLIST _RESULT !verbose push !verbose ${_WORDFUNC_VERBOSE} Push `${_VERSION}` Push `${_CHARLIST}` ${CallArtificialFunction} VersionConvert_ Pop ${_RESULT} !verbose pop !macroend !macro WordFindBody _WORDFUNC_S Exch $1 Exch Exch $0 Exch Exch 2 Exch $R0 Exch 2 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 Push $R2 ClearErrors StrCpy $9 '' StrCpy $2 $1 1 StrCpy $1 $1 '' 1 StrCmp $2 'E' 0 +3 StrCpy $9 E goto -4 StrCpy $3 '' StrCmp${_WORDFUNC_S} $2 '+' +6 StrCmp${_WORDFUNC_S} $2 '-' +5 StrCmp${_WORDFUNC_S} $2 '/' WordFunc_WordFind${_WORDFUNC_S}_restart StrCmp${_WORDFUNC_S} $2 '#' WordFunc_WordFind${_WORDFUNC_S}_restart StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_restart goto WordFunc_WordFind${_WORDFUNC_S}_error3 StrCpy $4 $1 1 -1 StrCmp${_WORDFUNC_S} $4 '*' +4 StrCmp${_WORDFUNC_S} $4 '}' +3 StrCmp${_WORDFUNC_S} $4 '{' +2 goto +4 StrCpy $1 $1 -1 StrCpy $3 '$4$3' goto -7 StrCmp${_WORDFUNC_S} $3 '*' WordFunc_WordFind${_WORDFUNC_S}_error3 StrCmp${_WORDFUNC_S} $3 '**' WordFunc_WordFind${_WORDFUNC_S}_error3 StrCmp${_WORDFUNC_S} $3 '}{' WordFunc_WordFind${_WORDFUNC_S}_error3 IntOp $1 $1 + 0 StrCmp${_WORDFUNC_S} $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_restart: StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind${_WORDFUNC_S}_error1 StrCpy $4 0 StrCpy $5 0 StrCpy $6 0 StrLen $7 $0 goto WordFunc_WordFind${_WORDFUNC_S}_loop WordFunc_WordFind${_WORDFUNC_S}_preloop: IntOp $6 $6 + 1 WordFunc_WordFind${_WORDFUNC_S}_loop: StrCpy $8 $R0 $7 $6 StrCmp${_WORDFUNC_S} $8$5 0 WordFunc_WordFind${_WORDFUNC_S}_error1 StrLen $R2 $8 IntCmp $R2 0 +2 StrCmp${_WORDFUNC_S} $8 $0 +5 WordFunc_WordFind${_WORDFUNC_S}_preloop StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordFind${_WORDFUNC_S}_minus StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordFind${_WORDFUNC_S}_minus StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_minus StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_minus +5 StrCmp${_WORDFUNC_S} $3 '{' +4 StrCmp${_WORDFUNC_S} $3 '}' +3 StrCmp${_WORDFUNC_S} $2 '*' +2 StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_nextword IntOp $4 $4 + 1 StrCmp${_WORDFUNC_S} $2$4 +$1 WordFunc_WordFind${_WORDFUNC_S}_plus StrCmp${_WORDFUNC_S} $2 '/' 0 WordFunc_WordFind${_WORDFUNC_S}_nextword IntOp $8 $6 - $5 StrCpy $8 $R0 $8 $5 StrCmp${_WORDFUNC_S} $1 $8 0 WordFunc_WordFind${_WORDFUNC_S}_nextword StrCpy $R1 $4 goto WordFunc_WordFind${_WORDFUNC_S}_end WordFunc_WordFind${_WORDFUNC_S}_nextword: IntOp $6 $6 + $7 StrCpy $5 $6 goto WordFunc_WordFind${_WORDFUNC_S}_loop WordFunc_WordFind${_WORDFUNC_S}_minus: StrCmp${_WORDFUNC_S} $2 '-' 0 WordFunc_WordFind${_WORDFUNC_S}_sum StrCpy $2 '+' IntOp $1 $4 - $1 IntOp $1 $1 + 1 IntCmp $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_restart WordFunc_WordFind${_WORDFUNC_S}_sum: StrCmp${_WORDFUNC_S} $2 '#' 0 WordFunc_WordFind${_WORDFUNC_S}_sumdelim StrCpy $R1 $4 goto WordFunc_WordFind${_WORDFUNC_S}_end WordFunc_WordFind${_WORDFUNC_S}_sumdelim: StrCmp${_WORDFUNC_S} $2 '*' 0 WordFunc_WordFind${_WORDFUNC_S}_error2 StrCpy $R1 $4 goto WordFunc_WordFind${_WORDFUNC_S}_end WordFunc_WordFind${_WORDFUNC_S}_plus: StrCmp${_WORDFUNC_S} $3 '' 0 +4 IntOp $6 $6 - $5 StrCpy $R1 $R0 $6 $5 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '{' 0 +3 StrCpy $R1 $R0 $6 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '}' 0 +4 IntOp $6 $6 + $7 StrCpy $R1 $R0 '' $6 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '{*' +2 StrCmp${_WORDFUNC_S} $3 '*{' 0 +3 StrCpy $R1 $R0 $6 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '*}' +2 StrCmp${_WORDFUNC_S} $3 '}*' 0 +3 StrCpy $R1 $R0 '' $5 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '}}' 0 +3 StrCpy $R1 $R0 '' $6 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '{{' 0 +3 StrCpy $R1 $R0 $5 goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $3 '{}' 0 WordFunc_WordFind${_WORDFUNC_S}_error3 StrLen $3 $R0 StrCmp${_WORDFUNC_S} $3 $6 0 +3 StrCpy $0 '' goto +2 IntOp $6 $6 + $7 StrCpy $8 $R0 '' $6 StrCmp${_WORDFUNC_S} $4$8 1 +6 StrCmp${_WORDFUNC_S} $4 1 +2 +7 IntOp $6 $6 + $7 StrCpy $3 $R0 $7 $6 StrCmp${_WORDFUNC_S} $3 '' +2 StrCmp${_WORDFUNC_S} $3 $0 -3 +3 StrCpy $R1 '' goto WordFunc_WordFind${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $5 0 0 +3 StrCpy $0 '' goto +2 IntOp $5 $5 - $7 StrCpy $3 $R0 $5 StrCpy $R1 '$3$0$8' goto WordFunc_WordFind${_WORDFUNC_S}_end WordFunc_WordFind${_WORDFUNC_S}_error3: StrCpy $R1 3 goto WordFunc_WordFind${_WORDFUNC_S}_error WordFunc_WordFind${_WORDFUNC_S}_error2: StrCpy $R1 2 goto WordFunc_WordFind${_WORDFUNC_S}_error WordFunc_WordFind${_WORDFUNC_S}_error1: StrCpy $R1 1 WordFunc_WordFind${_WORDFUNC_S}_error: StrCmp $9 'E' 0 +3 SetErrors WordFunc_WordFind${_WORDFUNC_S}_end: StrCpy $R0 $R1 Pop $R2 Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define WordFind `!insertmacro WordFindCall ''` !define un.WordFind `!insertmacro WordFindCall ''` !macro WordFind !macroend !macro un.WordFind !macroend !macro WordFind_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordFindBody '' !verbose pop !macroend !define WordFindS `!insertmacro WordFindSCall ''` !define un.WordFindS `!insertmacro WordFindSCall ''` !macro WordFindS !macroend !macro un.WordFindS !macroend !macro WordFindS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordFindBody 'S' !verbose pop !macroend !macro WordFind2XBody _WORDFUNC_S Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Exch 3 Exch $R0 Exch 3 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 Push $R2 ClearErrors StrCpy $R2 '' StrCpy $3 $2 1 StrCpy $2 $2 '' 1 StrCmp $3 'E' 0 +3 StrCpy $R2 E goto -4 StrCmp${_WORDFUNC_S} $3 '+' +5 StrCmp${_WORDFUNC_S} $3 '-' +4 StrCmp${_WORDFUNC_S} $3 '#' WordFunc_WordFind2X${_WORDFUNC_S}_restart StrCmp${_WORDFUNC_S} $3 '/' WordFunc_WordFind2X${_WORDFUNC_S}_restart goto WordFunc_WordFind2X${_WORDFUNC_S}_error3 StrCpy $4 $2 2 -2 StrCmp${_WORDFUNC_S} $4 '{{' +9 StrCmp${_WORDFUNC_S} $4 '}}' +8 StrCmp${_WORDFUNC_S} $4 '{*' +7 StrCmp${_WORDFUNC_S} $4 '*{' +6 StrCmp${_WORDFUNC_S} $4 '*}' +5 StrCmp${_WORDFUNC_S} $4 '}*' +4 StrCmp${_WORDFUNC_S} $4 '{}' +3 StrCpy $4 '' goto +2 StrCpy $2 $2 -2 IntOp $2 $2 + 0 StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_restart: StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind2X${_WORDFUNC_S}_error1 StrCpy $5 -1 StrCpy $6 0 StrCpy $7 '' StrLen $8 $0 StrLen $9 $1 WordFunc_WordFind2X${_WORDFUNC_S}_loop: IntOp $5 $5 + 1 WordFunc_WordFind2X${_WORDFUNC_S}_delim1: StrCpy $R1 $R0 $8 $5 StrCmp${_WORDFUNC_S} $R1$6 0 WordFunc_WordFind2X${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $R1 '' WordFunc_WordFind2X${_WORDFUNC_S}_minus StrCmp${_WORDFUNC_S} $R1 $0 +2 StrCmp${_WORDFUNC_S} $7 '' WordFunc_WordFind2X${_WORDFUNC_S}_loop WordFunc_WordFind2X${_WORDFUNC_S}_delim2 StrCmp${_WORDFUNC_S} $0 $1 0 +2 StrCmp${_WORDFUNC_S} $7 '' 0 WordFunc_WordFind2X${_WORDFUNC_S}_delim2 IntOp $7 $5 + $8 StrCpy $5 $7 goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1 WordFunc_WordFind2X${_WORDFUNC_S}_delim2: StrCpy $R1 $R0 $9 $5 StrCmp${_WORDFUNC_S} $R1 $1 0 WordFunc_WordFind2X${_WORDFUNC_S}_loop IntOp $6 $6 + 1 StrCmp${_WORDFUNC_S} $3$6 '+$2' WordFunc_WordFind2X${_WORDFUNC_S}_plus StrCmp${_WORDFUNC_S} $3 '/' 0 WordFunc_WordFind2X${_WORDFUNC_S}_nextword IntOp $R1 $5 - $7 StrCpy $R1 $R0 $R1 $7 StrCmp${_WORDFUNC_S} $R1 $2 0 +3 StrCpy $R1 $6 goto WordFunc_WordFind2X${_WORDFUNC_S}_end WordFunc_WordFind2X${_WORDFUNC_S}_nextword: IntOp $5 $5 + $9 StrCpy $7 '' goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1 WordFunc_WordFind2X${_WORDFUNC_S}_minus: StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordFind2X${_WORDFUNC_S}_sum StrCpy $3 + IntOp $2 $6 - $2 IntOp $2 $2 + 1 IntCmp $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_restart WordFunc_WordFind2X${_WORDFUNC_S}_sum: StrCmp${_WORDFUNC_S} $3 '#' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 StrCpy $R1 $6 goto WordFunc_WordFind2X${_WORDFUNC_S}_end WordFunc_WordFind2X${_WORDFUNC_S}_plus: StrCmp${_WORDFUNC_S} $4 '' 0 +4 IntOp $R1 $5 - $7 StrCpy $R1 $R0 $R1 $7 goto WordFunc_WordFind2X${_WORDFUNC_S}_end IntOp $5 $5 + $9 IntOp $7 $7 - $8 StrCmp${_WORDFUNC_S} $4 '{*' +2 StrCmp${_WORDFUNC_S} $4 '*{' 0 +3 StrCpy $R1 $R0 $5 goto WordFunc_WordFind2X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $4 '*}' +2 StrCmp${_WORDFUNC_S} $4 '}*' 0 +3 StrCpy $R1 $R0 '' $7 goto WordFunc_WordFind2X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $4 '}}' 0 +3 StrCpy $R1 $R0 '' $5 goto WordFunc_WordFind2X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $4 '{{' 0 +3 StrCpy $R1 $R0 $7 goto WordFunc_WordFind2X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $4 '{}' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error3 StrCpy $5 $R0 '' $5 StrCpy $7 $R0 $7 StrCpy $R1 '$7$5' goto WordFunc_WordFind2X${_WORDFUNC_S}_end WordFunc_WordFind2X${_WORDFUNC_S}_error3: StrCpy $R1 3 goto WordFunc_WordFind2X${_WORDFUNC_S}_error WordFunc_WordFind2X${_WORDFUNC_S}_error2: StrCpy $R1 2 goto WordFunc_WordFind2X${_WORDFUNC_S}_error WordFunc_WordFind2X${_WORDFUNC_S}_error1: StrCpy $R1 1 WordFunc_WordFind2X${_WORDFUNC_S}_error: StrCmp $R2 'E' 0 +3 SetErrors WordFunc_WordFind2X${_WORDFUNC_S}_end: StrCpy $R0 $R1 Pop $R2 Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define WordFind2X `!insertmacro WordFind2XCall` !define un.WordFind2X `!insertmacro WordFind2XCall` !macro WordFind2X !macroend !macro un.WordFind2X !macroend !macro WordFind2X_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordFind2XBody '' !verbose pop !macroend !define WordFind2XS `!insertmacro WordFind2XSCall` !define un.WordFind2XS `!insertmacro WordFind2XSCall` !macro WordFind2XS !macroend !macro un.WordFind2XS !macroend !macro WordFind2XS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordFind2XBody 'S' !verbose pop !macroend !macro WordFind3XBody _WORDFUNC_S Exch $3 Exch Exch $2 Exch Exch 2 Exch $1 Exch 2 Exch 3 Exch $0 Exch 3 Exch 4 Exch $R0 Exch 4 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 Push $R2 Push $R3 Push $R4 Push $R5 ClearErrors StrCpy $R5 '' StrCpy $4 $3 1 StrCpy $3 $3 '' 1 StrCmp $4 'E' 0 +3 StrCpy $R5 E goto -4 StrCmp${_WORDFUNC_S} $4 '+' +5 StrCmp${_WORDFUNC_S} $4 '-' +4 StrCmp${_WORDFUNC_S} $4 '#' WordFunc_WordFind3X${_WORDFUNC_S}_restart StrCmp${_WORDFUNC_S} $4 '/' WordFunc_WordFind3X${_WORDFUNC_S}_restart goto WordFunc_WordFind3X${_WORDFUNC_S}_error3 StrCpy $5 $3 2 -2 StrCmp${_WORDFUNC_S} $5 '{{' +9 StrCmp${_WORDFUNC_S} $5 '}}' +8 StrCmp${_WORDFUNC_S} $5 '{*' +7 StrCmp${_WORDFUNC_S} $5 '*{' +6 StrCmp${_WORDFUNC_S} $5 '*}' +5 StrCmp${_WORDFUNC_S} $5 '}*' +4 StrCmp${_WORDFUNC_S} $5 '{}' +3 StrCpy $5 '' goto +2 StrCpy $3 $3 -2 IntOp $3 $3 + 0 StrCmp${_WORDFUNC_S} $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_restart: StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind3X${_WORDFUNC_S}_error1 StrCpy $6 -1 StrCpy $7 0 StrCpy $8 '' StrCpy $9 '' StrLen $R1 $0 StrLen $R2 $1 StrLen $R3 $2 WordFunc_WordFind3X${_WORDFUNC_S}_loop: IntOp $6 $6 + 1 WordFunc_WordFind3X${_WORDFUNC_S}_delim1: StrCpy $R4 $R0 $R1 $6 StrCmp${_WORDFUNC_S} $R4$7 0 WordFunc_WordFind3X${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $R4 '' WordFunc_WordFind3X${_WORDFUNC_S}_minus StrCmp${_WORDFUNC_S} $R4 $0 +2 StrCmp${_WORDFUNC_S} $8 '' WordFunc_WordFind3X${_WORDFUNC_S}_loop WordFunc_WordFind3X${_WORDFUNC_S}_center StrCmp${_WORDFUNC_S} $0 $1 +2 StrCmp${_WORDFUNC_S} $0 $2 0 +2 StrCmp${_WORDFUNC_S} $8 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_center IntOp $8 $6 + $R1 StrCpy $6 $8 goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1 WordFunc_WordFind3X${_WORDFUNC_S}_center: StrCmp${_WORDFUNC_S} $9 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_delim2 StrCpy $R4 $R0 $R2 $6 StrCmp${_WORDFUNC_S} $R4 $1 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop IntOp $9 $6 + $R2 StrCpy $6 $9 goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1 WordFunc_WordFind3X${_WORDFUNC_S}_delim2: StrCpy $R4 $R0 $R3 $6 StrCmp${_WORDFUNC_S} $R4 $2 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop IntOp $7 $7 + 1 StrCmp${_WORDFUNC_S} $4$7 '+$3' WordFunc_WordFind3X${_WORDFUNC_S}_plus StrCmp${_WORDFUNC_S} $4 '/' 0 WordFunc_WordFind3X${_WORDFUNC_S}_nextword IntOp $R4 $6 - $8 StrCpy $R4 $R0 $R4 $8 StrCmp${_WORDFUNC_S} $R4 $3 0 +3 StrCpy $R4 $7 goto WordFunc_WordFind3X${_WORDFUNC_S}_end WordFunc_WordFind3X${_WORDFUNC_S}_nextword: IntOp $6 $6 + $R3 StrCpy $8 '' StrCpy $9 '' goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1 WordFunc_WordFind3X${_WORDFUNC_S}_minus: StrCmp${_WORDFUNC_S} $4 '-' 0 WordFunc_WordFind3X${_WORDFUNC_S}_sum StrCpy $4 + IntOp $3 $7 - $3 IntOp $3 $3 + 1 IntCmp $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_restart WordFunc_WordFind3X${_WORDFUNC_S}_sum: StrCmp${_WORDFUNC_S} $4 '#' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 StrCpy $R4 $7 goto WordFunc_WordFind3X${_WORDFUNC_S}_end WordFunc_WordFind3X${_WORDFUNC_S}_plus: StrCmp${_WORDFUNC_S} $5 '' 0 +4 IntOp $R4 $6 - $8 StrCpy $R4 $R0 $R4 $8 goto WordFunc_WordFind3X${_WORDFUNC_S}_end IntOp $6 $6 + $R3 IntOp $8 $8 - $R1 StrCmp${_WORDFUNC_S} $5 '{*' +2 StrCmp${_WORDFUNC_S} $5 '*{' 0 +3 StrCpy $R4 $R0 $6 goto WordFunc_WordFind3X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $5 '*}' +2 StrCmp${_WORDFUNC_S} $5 '}*' 0 +3 StrCpy $R4 $R0 '' $8 goto WordFunc_WordFind3X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $5 '}}' 0 +3 StrCpy $R4 $R0 '' $6 goto WordFunc_WordFind3X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $5 '{{' 0 +3 StrCpy $R4 $R0 $8 goto WordFunc_WordFind3X${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $5 '{}' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error3 StrCpy $6 $R0 '' $6 StrCpy $8 $R0 $8 StrCpy $R4 '$8$6' goto WordFunc_WordFind3X${_WORDFUNC_S}_end WordFunc_WordFind3X${_WORDFUNC_S}_error3: StrCpy $R4 3 goto WordFunc_WordFind3X${_WORDFUNC_S}_error WordFunc_WordFind3X${_WORDFUNC_S}_error2: StrCpy $R4 2 goto WordFunc_WordFind3X${_WORDFUNC_S}_error WordFunc_WordFind3X${_WORDFUNC_S}_error1: StrCpy $R4 1 WordFunc_WordFind3X${_WORDFUNC_S}_error: StrCmp $R5 'E' 0 +3 SetErrors WordFunc_WordFind3X${_WORDFUNC_S}_end: StrCpy $R0 $R4 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define WordFind3X `!insertmacro WordFind3XCall` !define un.WordFind3X `!insertmacro WordFind3XCall` !macro WordFind3X !macroend !macro un.WordFind3X !macroend !macro WordFind3X_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordFind3XBody '' !verbose pop !macroend !define WordFind3XS `!insertmacro WordFind3XSCall` !define un.WordFind3XS `!insertmacro WordFind3XSCall` !macro WordFind3XS !macroend !macro un.WordFind3XS !macroend !macro WordFind3XS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordFind3XBody 'S' !verbose pop !macroend !macro WordReplaceBody _WORDFUNC_S Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Exch 3 Exch $R0 Exch 3 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 ClearErrors StrCpy $R1 $R0 StrCpy $9 '' StrCpy $3 $2 1 StrCpy $2 $2 '' 1 StrCmp $3 'E' 0 +3 StrCpy $9 E goto -4 StrCpy $4 $2 1 -1 StrCpy $5 '' StrCpy $6 '' StrLen $7 $0 StrCmp${_WORDFUNC_S} $7 0 WordFunc_WordReplace${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordReplace${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordReplace${_WORDFUNC_S}_beginning StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordReplace${_WORDFUNC_S}_ending WordFunc_WordReplace${_WORDFUNC_S}_errorchk WordFunc_WordReplace${_WORDFUNC_S}_beginning: StrCpy $8 $R0 $7 StrCmp${_WORDFUNC_S} $8 $0 0 +4 StrCpy $R0 $R0 '' $7 StrCpy $5 '$5$1' goto -4 StrCpy $3 $2 1 StrCmp${_WORDFUNC_S} $3 '}' 0 WordFunc_WordReplace${_WORDFUNC_S}_merge WordFunc_WordReplace${_WORDFUNC_S}_ending: StrCpy $8 $R0 '' -$7 StrCmp${_WORDFUNC_S} $8 $0 0 +4 StrCpy $R0 $R0 -$7 StrCpy $6 '$6$1' goto -4 WordFunc_WordReplace${_WORDFUNC_S}_merge: StrCmp${_WORDFUNC_S} $4 '*' 0 +5 StrCmp${_WORDFUNC_S} $5 '' +2 StrCpy $5 $1 StrCmp${_WORDFUNC_S} $6 '' +2 StrCpy $6 $1 StrCpy $R0 '$5$R0$6' goto WordFunc_WordReplace${_WORDFUNC_S}_end WordFunc_WordReplace${_WORDFUNC_S}_errorchk: StrCmp${_WORDFUNC_S} $3 '+' +2 StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error3 StrCpy $5 $2 1 IntOp $2 $2 + 0 StrCmp${_WORDFUNC_S} $2 0 0 WordFunc_WordReplace${_WORDFUNC_S}_one StrCmp${_WORDFUNC_S} $5 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 StrCpy $3 '' WordFunc_WordReplace${_WORDFUNC_S}_all: StrCpy $5 0 StrCpy $2 $R0 $7 $5 StrCmp${_WORDFUNC_S} $2 '' +4 StrCmp${_WORDFUNC_S} $2 $0 +6 IntOp $5 $5 + 1 goto -4 StrCmp${_WORDFUNC_S} $R0 $R1 WordFunc_WordReplace${_WORDFUNC_S}_error1 StrCpy $R0 '$3$R0' goto WordFunc_WordReplace${_WORDFUNC_S}_end StrCpy $2 $R0 $5 IntOp $5 $5 + $7 StrCmp${_WORDFUNC_S} $4 '*' 0 +3 StrCpy $6 $R0 $7 $5 StrCmp${_WORDFUNC_S} $6 $0 -3 StrCpy $R0 $R0 '' $5 StrCpy $3 '$3$2$1' goto WordFunc_WordReplace${_WORDFUNC_S}_all WordFunc_WordReplace${_WORDFUNC_S}_one: StrCpy $5 0 StrCpy $8 0 goto WordFunc_WordReplace${_WORDFUNC_S}_loop WordFunc_WordReplace${_WORDFUNC_S}_preloop: IntOp $5 $5 + 1 WordFunc_WordReplace${_WORDFUNC_S}_loop: StrCpy $6 $R0 $7 $5 StrCmp${_WORDFUNC_S} $6$8 0 WordFunc_WordReplace${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $6 '' WordFunc_WordReplace${_WORDFUNC_S}_minus StrCmp${_WORDFUNC_S} $6 $0 0 WordFunc_WordReplace${_WORDFUNC_S}_preloop IntOp $8 $8 + 1 StrCmp${_WORDFUNC_S} $3$8 +$2 WordFunc_WordReplace${_WORDFUNC_S}_found IntOp $5 $5 + $7 goto WordFunc_WordReplace${_WORDFUNC_S}_loop WordFunc_WordReplace${_WORDFUNC_S}_minus: StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 StrCpy $3 + IntOp $2 $8 - $2 IntOp $2 $2 + 1 IntCmp $2 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_one WordFunc_WordReplace${_WORDFUNC_S}_found: StrCpy $3 $R0 $5 StrCmp${_WORDFUNC_S} $4 '*' 0 +5 StrCpy $6 $3 '' -$7 StrCmp${_WORDFUNC_S} $6 $0 0 +3 StrCpy $3 $3 -$7 goto -3 IntOp $5 $5 + $7 StrCmp${_WORDFUNC_S} $4 '*' 0 +3 StrCpy $6 $R0 $7 $5 StrCmp${_WORDFUNC_S} $6 $0 -3 StrCpy $R0 $R0 '' $5 StrCpy $R0 '$3$1$R0' goto WordFunc_WordReplace${_WORDFUNC_S}_end WordFunc_WordReplace${_WORDFUNC_S}_error3: StrCpy $R0 3 goto WordFunc_WordReplace${_WORDFUNC_S}_error WordFunc_WordReplace${_WORDFUNC_S}_error2: StrCpy $R0 2 goto WordFunc_WordReplace${_WORDFUNC_S}_error WordFunc_WordReplace${_WORDFUNC_S}_error1: StrCpy $R0 1 WordFunc_WordReplace${_WORDFUNC_S}_error: StrCmp $9 'E' +3 StrCpy $R0 $R1 goto +2 SetErrors WordFunc_WordReplace${_WORDFUNC_S}_end: Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define WordReplace `!insertmacro WordReplaceCall` !define un.WordReplace `!insertmacro WordReplaceCall` !macro WordReplace !macroend !macro un.WordReplace !macroend !macro WordReplace_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordReplaceBody '' !verbose pop !macroend !define WordReplaceS `!insertmacro WordReplaceSCall` !define un.WordReplaceS `!insertmacro WordReplaceSCall` !macro WordReplaceS !macroend !macro un.WordReplaceS !macroend !macro WordReplaceS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordReplaceBody 'S' !verbose pop !macroend !macro WordAddBody _WORDFUNC_S Exch $1 Exch Exch $0 Exch Exch 2 Exch $R0 Exch 2 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $R1 ClearErrors StrCpy $7 '' StrCpy $2 $1 1 StrCmp $2 'E' 0 +4 StrCpy $7 E StrCpy $1 $1 '' 1 goto -4 StrCpy $5 0 StrCpy $R1 $R0 StrCpy $2 $1 '' 1 StrCpy $1 $1 1 StrCmp${_WORDFUNC_S} $1 '+' +2 StrCmp${_WORDFUNC_S} $1 '-' 0 WordFunc_WordAdd${_WORDFUNC_S}_error3 StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordAdd${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $2 '' WordFunc_WordAdd${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $R0 '' 0 +5 StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $1 '+' 0 +3 StrCpy $R0 $2 goto WordFunc_WordAdd${_WORDFUNC_S}_end WordFunc_WordAdd${_WORDFUNC_S}_loop: IntOp $5 $5 + 1 !insertmacro WordFind${_WORDFUNC_S}Call 2 $2 $0 E+$5 $3 IfErrors 0 WordFunc_WordAdd${_WORDFUNC_S}_/word StrCmp${_WORDFUNC_S} $3 2 +4 StrCmp${_WORDFUNC_S} $3$5 11 0 +3 StrCpy $3 $2 goto WordFunc_WordAdd${_WORDFUNC_S}_/word StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end WordFunc_WordAdd${_WORDFUNC_S}_preend WordFunc_WordAdd${_WORDFUNC_S}_/word: !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E/$3 $4 IfErrors +2 StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_delete WordFunc_WordAdd${_WORDFUNC_S}_loop StrCmp${_WORDFUNC_S} $1$4 '-1' +2 StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_loop +4 StrCmp${_WORDFUNC_S} $R0 $3 0 WordFunc_WordAdd${_WORDFUNC_S}_loop StrCpy $R0 '' goto WordFunc_WordAdd${_WORDFUNC_S}_end StrCmp${_WORDFUNC_S} $1$4 '+1' 0 +2 StrCmp${_WORDFUNC_S} $R0 $3 WordFunc_WordAdd${_WORDFUNC_S}_loop StrCmp${_WORDFUNC_S} $R0 $R1 +3 StrCpy $R1 '$R1$0$3' goto WordFunc_WordAdd${_WORDFUNC_S}_loop StrLen $6 $0 StrCpy $6 $R0 '' -$6 StrCmp${_WORDFUNC_S} $6 $0 0 -4 StrCpy $R1 '$R1$3' goto WordFunc_WordAdd${_WORDFUNC_S}_loop WordFunc_WordAdd${_WORDFUNC_S}_delete: !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E+$4{} $R0 goto WordFunc_WordAdd${_WORDFUNC_S}_/word WordFunc_WordAdd${_WORDFUNC_S}_error3: StrCpy $R1 3 goto WordFunc_WordAdd${_WORDFUNC_S}_error WordFunc_WordAdd${_WORDFUNC_S}_error1: StrCpy $R1 1 WordFunc_WordAdd${_WORDFUNC_S}_error: StrCmp $7 'E' 0 WordFunc_WordAdd${_WORDFUNC_S}_end SetErrors WordFunc_WordAdd${_WORDFUNC_S}_preend: StrCpy $R0 $R1 WordFunc_WordAdd${_WORDFUNC_S}_end: Pop $R1 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define WordAdd `!insertmacro WordAddCall` !define un.WordAdd `!insertmacro WordAddCall` !macro WordAdd !macroend !macro un.WordAdd !macroend !macro WordAdd_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordAddBody '' !verbose pop !macroend !define WordAddS `!insertmacro WordAddSCall` !define un.WordAddS `!insertmacro WordAddSCall` !macro WordAddS !macroend !macro un.WordAddS !macroend !macro WordAddS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordAddBody 'S' !verbose pop !macroend !macro WordInsertBody _WORDFUNC_S Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Exch 3 Exch $R0 Exch 3 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 ClearErrors StrCpy $5 '' StrCpy $6 $0 StrCpy $7 } StrCpy $9 '' StrCpy $R1 $R0 StrCpy $3 $2 1 StrCpy $2 $2 '' 1 StrCmp $3 'E' 0 +3 StrCpy $9 'E' goto -4 StrCmp${_WORDFUNC_S} $3 '+' +2 StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordInsert${_WORDFUNC_S}_error3 IntOp $2 $2 + 0 StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordInsert${_WORDFUNC_S}_error2 StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordInsert${_WORDFUNC_S}_error1 StrCmp${_WORDFUNC_S} $2 1 0 WordFunc_WordInsert${_WORDFUNC_S}_two GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_oneback StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call StrCpy $7 { goto WordFunc_WordInsert${_WORDFUNC_S}_call WordFunc_WordInsert${_WORDFUNC_S}_oneback: IfErrors 0 +2 StrCpy $4 $R0 StrCmp${_WORDFUNC_S} $3 '+' 0 +3 StrCpy $R0 '$1$0$4' goto WordFunc_WordInsert${_WORDFUNC_S}_end StrCpy $R0 '$4$0$1' goto WordFunc_WordInsert${_WORDFUNC_S}_end WordFunc_WordInsert${_WORDFUNC_S}_two: IntOp $2 $2 - 1 GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_twoback StrCmp${_WORDFUNC_S} $3 '+' 0 WordFunc_WordInsert${_WORDFUNC_S}_call StrCpy $7 { goto WordFunc_WordInsert${_WORDFUNC_S}_call WordFunc_WordInsert${_WORDFUNC_S}_twoback: IfErrors 0 WordFunc_WordInsert${_WORDFUNC_S}_tree StrCmp${_WORDFUNC_S} $2$4 11 0 WordFunc_WordInsert${_WORDFUNC_S}_error2 StrCmp${_WORDFUNC_S} $3 '+' 0 +3 StrCpy $R0 '$R0$0$1' goto WordFunc_WordInsert${_WORDFUNC_S}_end StrCpy $R0 '$1$0$R0' goto WordFunc_WordInsert${_WORDFUNC_S}_end WordFunc_WordInsert${_WORDFUNC_S}_tree: StrCpy $7 } StrCpy $5 $4 IntOp $2 $2 + 1 GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_treeback StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call StrCpy $7 { goto WordFunc_WordInsert${_WORDFUNC_S}_call WordFunc_WordInsert${_WORDFUNC_S}_treeback: IfErrors 0 +3 StrCpy $4 '' StrCpy $6 '' StrCmp${_WORDFUNC_S} $3 '+' 0 +3 StrCpy $R0 '$5$0$1$6$4' goto WordFunc_WordInsert${_WORDFUNC_S}_end StrCpy $R0 '$4$6$1$0$5' goto WordFunc_WordInsert${_WORDFUNC_S}_end WordFunc_WordInsert${_WORDFUNC_S}_call: !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E$3$2*$7 $4 goto $8 WordFunc_WordInsert${_WORDFUNC_S}_error3: StrCpy $R0 3 goto WordFunc_WordInsert${_WORDFUNC_S}_error WordFunc_WordInsert${_WORDFUNC_S}_error2: StrCpy $R0 2 goto WordFunc_WordInsert${_WORDFUNC_S}_error WordFunc_WordInsert${_WORDFUNC_S}_error1: StrCpy $R0 1 WordFunc_WordInsert${_WORDFUNC_S}_error: StrCmp $9 'E' +3 StrCpy $R0 $R1 goto +2 SetErrors WordFunc_WordInsert${_WORDFUNC_S}_end: Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define WordInsert `!insertmacro WordInsertCall` !define un.WordInsert `!insertmacro WordInsertCall` !macro WordInsert !macroend !macro un.WordInsert !macroend !macro WordInsert_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordInsertBody '' !verbose pop !macroend !define WordInsertS `!insertmacro WordInsertSCall` !define un.WordInsertS `!insertmacro WordInsertSCall` !macro WordInsertS !macroend !macro un.WordInsertS !macroend !macro WordInsertS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro WordInsertBody 'S' !verbose pop !macroend !macro StrFilterBody _WORDFUNC_S Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Exch 3 Exch $R0 Exch 3 Push $3 Push $4 Push $5 Push $6 Push $7 Push $R1 Push $R2 Push $R3 Push $R4 Push $R5 Push $R6 Push $R7 Push $R8 ClearErrors StrCpy $R2 $0 '' -3 StrCmp $R2 "eng" WordFunc_StrFilter${_WORDFUNC_S}_eng StrCmp $R2 "rus" WordFunc_StrFilter${_WORDFUNC_S}_rus WordFunc_StrFilter${_WORDFUNC_S}_eng: StrCpy $4 65 StrCpy $5 90 StrCpy $6 97 StrCpy $7 122 goto WordFunc_StrFilter${_WORDFUNC_S}_langend WordFunc_StrFilter${_WORDFUNC_S}_rus: StrCpy $4 192 StrCpy $5 223 StrCpy $6 224 StrCpy $7 255 goto WordFunc_StrFilter${_WORDFUNC_S}_langend ;... WordFunc_StrFilter${_WORDFUNC_S}_langend: StrCpy $R7 '' StrCpy $R8 '' StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_begin WordFunc_StrFilter${_WORDFUNC_S}_restart1: StrCpy $2 '' StrCpy $3 $0 1 StrCmp${_WORDFUNC_S} $3 '+' +2 StrCmp${_WORDFUNC_S} $3 '-' 0 +3 StrCpy $0 $0 '' 1 goto +2 StrCpy $3 '' IntOp $0 $0 + 0 StrCmp${_WORDFUNC_S} $0 0 +5 StrCpy $R7 $0 1 0 StrCpy $R8 $0 1 1 StrCpy $R2 $0 1 2 StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_filter WordFunc_StrFilter${_WORDFUNC_S}_error WordFunc_StrFilter${_WORDFUNC_S}_restart2: StrCmp${_WORDFUNC_S} $3 '' WordFunc_StrFilter${_WORDFUNC_S}_end StrCpy $R7 '' StrCpy $R8 '+-' goto WordFunc_StrFilter${_WORDFUNC_S}_begin WordFunc_StrFilter${_WORDFUNC_S}_filter: StrCmp${_WORDFUNC_S} $R7 '1' +3 StrCmp${_WORDFUNC_S} $R7 '2' +2 StrCmp${_WORDFUNC_S} $R7 '3' 0 WordFunc_StrFilter${_WORDFUNC_S}_error StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_begin StrCmp${_WORDFUNC_S} $R7$R8 '23' +2 StrCmp${_WORDFUNC_S} $R7$R8 '32' 0 +3 StrCpy $R7 -1 goto WordFunc_StrFilter${_WORDFUNC_S}_begin StrCmp${_WORDFUNC_S} $R7$R8 '13' +2 StrCmp${_WORDFUNC_S} $R7$R8 '31' 0 +3 StrCpy $R7 -2 goto WordFunc_StrFilter${_WORDFUNC_S}_begin StrCmp${_WORDFUNC_S} $R7$R8 '12' +2 StrCmp${_WORDFUNC_S} $R7$R8 '21' 0 WordFunc_StrFilter${_WORDFUNC_S}_error StrCpy $R7 -3 WordFunc_StrFilter${_WORDFUNC_S}_begin: StrCpy $R6 0 StrCpy $R1 '' WordFunc_StrFilter${_WORDFUNC_S}_loop: StrCpy $R2 $R0 1 $R6 StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_restartchk StrCmp${_WORDFUNC_S} $2 '' +7 StrCpy $R4 0 StrCpy $R5 $2 1 $R4 StrCmp${_WORDFUNC_S} $R5 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol IntOp $R4 $R4 + 1 goto -4 StrCmp${_WORDFUNC_S} $1 '' +7 StrCpy $R4 0 StrCpy $R5 $1 1 $R4 StrCmp${_WORDFUNC_S} $R5 '' +4 StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol IntOp $R4 $R4 + 1 goto -4 StrCmp${_WORDFUNC_S} $R7 '1' +2 StrCmp${_WORDFUNC_S} $R7 '-1' 0 +4 StrCpy $R4 48 StrCpy $R5 57 goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 StrCmp${_WORDFUNC_S} $R8 '+-' 0 +2 StrCmp${_WORDFUNC_S} $3 '+' 0 +4 StrCpy $R4 $4 StrCpy $R5 $5 goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 StrCpy $R4 $6 StrCpy $R5 $7 WordFunc_StrFilter${_WORDFUNC_S}_loop2: IntFmt $R3 '%c' $R4 StrCmp $R2 $R3 WordFunc_StrFilter${_WORDFUNC_S}_found StrCmp $R4 $R5 WordFunc_StrFilter${_WORDFUNC_S}_notfound IntOp $R4 $R4 + 1 goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 WordFunc_StrFilter${_WORDFUNC_S}_found: StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_setcase StrCmp${_WORDFUNC_S} $R7 '3' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol StrCmp${_WORDFUNC_S} $R7 '-3' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol WordFunc_StrFilter${_WORDFUNC_S}_notfound: StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol StrCmp${_WORDFUNC_S} $R7 '3' 0 +2 StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol +3 StrCmp${_WORDFUNC_S} $R7 '-3' 0 +5 StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol StrCpy $R4 48 StrCpy $R5 57 goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol WordFunc_StrFilter${_WORDFUNC_S}_addsymbol WordFunc_StrFilter${_WORDFUNC_S}_setcase: StrCpy $R2 $R3 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol: StrCpy $R1 $R1$R2 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol: IntOp $R6 $R6 + 1 goto WordFunc_StrFilter${_WORDFUNC_S}_loop WordFunc_StrFilter${_WORDFUNC_S}_error: SetErrors StrCpy $R0 '' goto WordFunc_StrFilter${_WORDFUNC_S}_end WordFunc_StrFilter${_WORDFUNC_S}_restartchk: StrCpy $R0 $R1 StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart1 StrCmp${_WORDFUNC_S} $R8 '+-' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart2 WordFunc_StrFilter${_WORDFUNC_S}_end: Pop $R8 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 !macroend !define StrFilter `!insertmacro StrFilterCall` !define un.StrFilter `!insertmacro StrFilterCall` !macro StrFilter !macroend !macro un.StrFilter !macroend !macro StrFilter_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro StrFilterBody '' !verbose pop !macroend !define StrFilterS `!insertmacro StrFilterSCall` !define un.StrFilterS `!insertmacro StrFilterSCall` !macro StrFilterS !macroend !macro un.StrFilterS !macroend !macro StrFilterS_ !verbose push !verbose ${_WORDFUNC_VERBOSE} !insertmacro StrFilterBody 'S' !verbose pop !macroend !define VersionCompare `!insertmacro VersionCompareCall` !define un.VersionCompare `!insertmacro VersionCompareCall` !macro VersionCompare !macroend !macro un.VersionCompare !macroend !macro VersionCompare_ !verbose push !verbose ${_WORDFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 WordFunc_VersionCompare_begin: StrCpy $2 -1 IntOp $2 $2 + 1 StrCpy $3 $0 1 $2 StrCmp $3 '' +2 StrCmp $3 '.' 0 -3 StrCpy $4 $0 $2 IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 StrCpy $2 -1 IntOp $2 $2 + 1 StrCpy $3 $1 1 $2 StrCmp $3 '' +2 StrCmp $3 '.' 0 -3 StrCpy $5 $1 $2 IntOp $2 $2 + 1 StrCpy $1 $1 '' $2 StrCmp $4$5 '' WordFunc_VersionCompare_equal StrCpy $6 -1 IntOp $6 $6 + 1 StrCpy $3 $4 1 $6 StrCmp $3 '0' -2 StrCmp $3 '' 0 +2 StrCpy $4 0 StrCpy $7 -1 IntOp $7 $7 + 1 StrCpy $3 $5 1 $7 StrCmp $3 '0' -2 StrCmp $3 '' 0 +2 StrCpy $5 0 StrCmp $4 0 0 +2 StrCmp $5 0 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 StrCmp $5 0 WordFunc_VersionCompare_newer1 IntCmp $6 $7 0 WordFunc_VersionCompare_newer1 WordFunc_VersionCompare_newer2 StrCpy $4 '1$4' StrCpy $5 '1$5' IntCmp $4 $5 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 WordFunc_VersionCompare_newer1 WordFunc_VersionCompare_equal: StrCpy $0 0 goto WordFunc_VersionCompare_end WordFunc_VersionCompare_newer1: StrCpy $0 1 goto WordFunc_VersionCompare_end WordFunc_VersionCompare_newer2: StrCpy $0 2 WordFunc_VersionCompare_end: Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !define VersionConvert `!insertmacro VersionConvertCall` !define un.VersionConvert `!insertmacro VersionConvertCall` !macro VersionConvert !macroend !macro un.VersionConvert !macroend !macro VersionConvert_ !verbose push !verbose ${_WORDFUNC_VERBOSE} Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 StrCmp $1 '' 0 +2 StrCpy $1 'abcdefghijklmnopqrstuvwxyz' StrCpy $1 $1 99 StrCpy $2 0 StrCpy $7 'dot' goto WordFunc_VersionConvert_loop WordFunc_VersionConvert_preloop: IntOp $2 $2 + 1 WordFunc_VersionConvert_loop: StrCpy $3 $0 1 $2 StrCmp $3 '' WordFunc_VersionConvert_endcheck StrCmp $3 '.' WordFunc_VersionConvert_dot StrCmp $3 '0' WordFunc_VersionConvert_digit IntCmp $3 '0' WordFunc_VersionConvert_letter WordFunc_VersionConvert_letter WordFunc_VersionConvert_digit WordFunc_VersionConvert_dot: StrCmp $7 'dot' WordFunc_VersionConvert_replacespecial StrCpy $7 'dot' goto WordFunc_VersionConvert_preloop WordFunc_VersionConvert_digit: StrCmp $7 'letter' WordFunc_VersionConvert_insertdot StrCpy $7 'digit' goto WordFunc_VersionConvert_preloop WordFunc_VersionConvert_letter: StrCpy $5 0 StrCpy $4 $1 1 $5 IntOp $5 $5 + 1 StrCmp $4 '' WordFunc_VersionConvert_replacespecial StrCmp $4 $3 0 -3 IntCmp $5 9 0 0 +2 StrCpy $5 '0$5' StrCmp $7 'letter' +2 StrCmp $7 'dot' 0 +3 StrCpy $6 '' goto +2 StrCpy $6 '.' StrCpy $4 $0 $2 IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 StrCpy $0 '$4$6$5$0' StrLen $4 '$6$5' IntOp $2 $2 + $4 IntOp $2 $2 - 1 StrCpy $7 'letter' goto WordFunc_VersionConvert_loop WordFunc_VersionConvert_replacespecial: StrCmp $7 'dot' 0 +3 StrCpy $6 '' goto +2 StrCpy $6 '.' StrCpy $4 $0 $2 IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 StrCpy $0 '$4$6$0' StrLen $4 $6 IntOp $2 $2 + $4 IntOp $2 $2 - 1 StrCpy $7 'dot' goto WordFunc_VersionConvert_loop WordFunc_VersionConvert_insertdot: StrCpy $4 $0 $2 StrCpy $0 $0 '' $2 StrCpy $0 '$4.$0' StrCpy $7 'dot' goto WordFunc_VersionConvert_preloop WordFunc_VersionConvert_endcheck: StrCpy $4 $0 1 -1 StrCmp $4 '.' 0 WordFunc_VersionConvert_end StrCpy $0 $0 -1 goto -3 WordFunc_VersionConvert_end: Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !verbose pop !macroend !verbose pop !endif nsis-3.11/Include/x64.nsh000077500000000000000000000075721477201124000151440ustar00rootroot00000000000000; --------------------- ; x64.nsh ; --------------------- ; ; A few simple macros to handle installations on x64 machines. ; ; RunningX64 checks if the installer is running on a 64-bit OS. ; IsWow64 checks if the installer is a 32-bit application running on a 64-bit OS. ; ; ${If} ${RunningX64} ; MessageBox MB_OK "Running on 64-bit Windows" ; ${EndIf} ; ; IsNative* checks the OS native CPU architecture. ; ; ${If} ${IsNativeAMD64} ; ; Install AMD64 64-bit driver/library ; ${ElseIf} ${IsNativeARM64} ; ; Install ARM64 64-bit driver/library ; ${ElseIf} ${IsNativeIA32} ; ; Install i386 32-bit driver/library ; ${Else} ; Abort "Unsupported CPU architecture!" ; ${EndIf} ; ; ${If} ${IsNativeAMD64} ; File "amd64\myapp.exe" ; ${ElseIf} ${IsNativeIA32} ; ${OrIf} ${IsWow64} ; File "x86\myapp.exe" ; ${Else} ; Abort "Unsupported CPU architecture!" ; ${EndIf} ; ; DisableX64FSRedirection disables file system redirection. ; EnableX64FSRedirection enables file system redirection. ; ; SetOutPath $SYSDIR ; ${DisableX64FSRedirection} ; File something.bin # extracts to C:\Windows\System32 ; ${EnableX64FSRedirection} ; File something.bin # extracts to C:\Windows\SysWOW64 ; !ifndef ___X64__NSH___ !define ___X64__NSH___ !include LogicLib.nsh !define IsWow64 `"" IsWow64 ""` !macro _IsWow64 _a _b _t _f !insertmacro _LOGICLIB_TEMP System::Call kernel32::GetCurrentProcess()p.s System::Call kernel32::IsWow64Process2(ps,*i0s,*i) ; [Win10.1511+] 0 if not WOW64 Push | System::Call kernel32::IsWow64Process(p-1,*i0s) ; [WinXP+] FALSE for a 32-bit application on ARM64! System::Int64Op Pop $_LOGICLIB_TEMP !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` !macroend !define RunningX64 `"" RunningX64 ""` !macro _RunningX64 _a _b _t _f !if ${NSIS_PTR_SIZE} > 4 !insertmacro LogicLib_JumpToBranch `${_t}` `${_f}` !else !insertmacro _IsWow64 `${_a}` `${_b}` `${_t}` `${_f}` !endif !macroend !define GetNativeMachineArchitecture "!insertmacro GetNativeMachineArchitecture " !macro GetNativeMachineArchitecture outvar !define GetNativeMachineArchitecture_lbl lbl_GNMA_${__COUNTER__} System::Call kernel32::GetCurrentProcess()p.s System::Call kernel32::IsWow64Process2(ps,*i,*i0s) Pop ${outvar} IntCmp ${outvar} 0 "" ${GetNativeMachineArchitecture_lbl}_done ${GetNativeMachineArchitecture_lbl}_done !if "${NSIS_PTR_SIZE}" <= 4 !if "${NSIS_CHAR_SIZE}" <= 1 System::Call 'USER32::CharNextW(w"")p.s' Pop ${outvar} IntPtrCmpU ${outvar} 0 "" ${GetNativeMachineArchitecture_lbl}_oldnt ${GetNativeMachineArchitecture_lbl}_oldnt StrCpy ${outvar} 332 ; Always IMAGE_FILE_MACHINE_I386 on Win9x Goto ${GetNativeMachineArchitecture_lbl}_done ${GetNativeMachineArchitecture_lbl}_oldnt: !endif !endif System::Call '*0x7FFE002E(&i2.s)' Pop ${outvar} ${GetNativeMachineArchitecture_lbl}_done: !undef GetNativeMachineArchitecture_lbl !macroend !macro _IsNativeMachineArchitecture _ignore _arc _t _f !insertmacro _LOGICLIB_TEMP ${GetNativeMachineArchitecture} $_LOGICLIB_TEMP !insertmacro _= $_LOGICLIB_TEMP ${_arc} `${_t}` `${_f}` !macroend !define IsNativeMachineArchitecture `"" IsNativeMachineArchitecture ` !define IsNativeIA32 '${IsNativeMachineArchitecture} 332' ; Intel x86 !define IsNativeAMD64 '${IsNativeMachineArchitecture} 34404' ; x86-64/x64 !define IsNativeARM64 '${IsNativeMachineArchitecture} 43620' !define DisableX64FSRedirection "!insertmacro DisableX64FSRedirection" !macro DisableX64FSRedirection System::Call kernel32::Wow64EnableWow64FsRedirection(i0) !macroend !define EnableX64FSRedirection "!insertmacro EnableX64FSRedirection" !macro EnableX64FSRedirection System::Call kernel32::Wow64EnableWow64FsRedirection(i1) !macroend !endif # !___X64__NSH___ nsis-3.11/Menu/000077500000000000000000000000001477201124000133145ustar00rootroot00000000000000nsis-3.11/Menu/images/000077500000000000000000000000001477201124000145615ustar00rootroot00000000000000nsis-3.11/Menu/images/header-notext.gif000077500000000000000000000224461477201124000200320ustar00rootroot00000000000000GIF89aV-÷s[‰za‘„iœ…jžqZ‡mV‚€f˜pY†{b’oX„hS}|b“iS}x_nWƒ~d•t\ŠlViT~iS~v^gR|…i„i‡kŸu]Œ}c”r[ˆf™w^g™‡l gR{lU~d–e–u]‹w^ŽmW‚|c”pY…oX…hR|mWƒt\‹nW„ˆl x_Žv]Œ}c•rZˆrZ‡€e˜}d•†jŸpX…{a’gQ{f˜ƒhœs\ŠlV‚|c“ƒiœqY†y_ˆl¡w_Ž…js[ˆnX„kT‚h›€e—qY‡za’jT~‚g™s[Šu\‹ïE>¯ïkUya‚hšy`'»ód–ña]v^ŒzalU€kU|b’{b“•ÒÌ8.£,%yªOÈõVzô~|yiThS|v]~e–…ižèFAt]‹s\‰kT€ªéhR}qZ†gš‚g›jUg)v(630n2z@#s')A(L„hœy_oW„ 6†kžya‘{a‘ƒhšaNqcPvm"/8(\ -‘Í /e: $;!3tÆ92Ÿ.)%>w§X#,bdPv*RVz Ux¢Ýz`R·ãx! ÛFEu%'PÁîàxzì||I%e˜2"22/+!1`Nq* 2|b”mVƒi›pY‡ 5jT€-^%)x^Ž&(08!*(IO$1+RÞFDV(% 1Q°Ú&&80\LkTwƒgš€f™jU€9 /1'.U2+(4m)#>"z`‘*"X(0×uy/he&4"%cPudPwÒGGb&ða]34)""5 ¤àJ%9#. œÕ7 ,†k L&2(y`‘%<]Lk$$dQws(+-$*,+'';""4e—y`‚gš†jžkU€‡k †kŸƒh›jT!ù,V-ÿsä1p ˆ "\Èp¡Š‡#JŒ£€¢‚‹0` qãÆ CŠœ ¡¤I g$à[ɲ¥K–GŽH¡G³¦M›[Bä Á3D„Ÿ@öèQ ¨Ñ£&’*5±¢iSP£¶pТªU# ²jÕš¢«×7Pˆ‹â€Ù³fB@ ·páΘ;WƆ»xóØË·ï^Nxð€@¸0aˆ·!Á¸q†ÇaH–œ% …˘1wØÜ¡„çÏ/†¼=ºéÓ§«ª¯µë×­µp @»¶íK–àØïßÀ.ÜGñÈ“kXÎ<†óç5D@½úØEŒ¸re„÷ðÀÃÿO¾|’$4hXϾ½ïuèà@ŸƒûòçoÒDžÿÿþ' H qÏ&¨à=;4¸Ã? á„^ €…d¨¡vÈ!AÄ$–h"‰ó¤¨âŠ,¦hËöÄ£ 2Öhã6b#<Æ(@ ©PB éB%©]ÄQGE9’H'™ÄÄKXbyÄM\Þ==EàSPAEÔQF™P€RN=Õ›TQÕ‚-legV^¥VXa…ÖŸkÁV\„¾E× 2$š×E±_˜`ƒvXb,4æ u: idvYšqÖÙg%ˆ&Zi¨¡Dñ°ÿÛ¬ShqÛ­¹é¶p¼vAq>ëCr'0g¬ÐÕ ìtÖU—vj¨ñwåU;Þyé¥çÞ¶òq0_}øé·_–ë_ ¦«`+Rèî„j¸á~â‰ø–Øâ¾.Ú0È<4â(°Œ:lpÁ=Ú$Bi¤‘I&‰† L6©‘“Q~4S‚TeIø¨”e–1mÙåÉôìÄ“˜dF0š0¯Éf›nÂ)çUwn•gW`‘% *áV¡rªè¢w5i_“ f饘’ð„¦z CW‹Zª©¨¡êª/´Új€Ìjö„Øz«m»òêö¯¿,±Ç"‹¬sË6kݳÐNÿ+žµæÑO¶êm»ž|Ý‚k_¸ÈÓ¸¹R!º”¸ƒ Fø.¼ÊKo½Š˜¯‰)Ào‹/ ãÀ¬×ˆpÁ;öˆÃ9üðÃGTQ5¹”RrÜ1IU2!òÈ/,3¡ÌeO+·Ô™1ËœT›Ôü¦UVå¬óÎ(ôü3Ðh!4ф֕¨]‹*½ô^n4ýta‰=a¿¦ŒUý)¨ZS@*×›éØÄ66Y™í5j[Ûrã6^yáp+ް”S¬c%KYz£ß°Ói…pä9z´e¸Ã%\âÚäÊE…¨r º\ƒþ°ƒÍmÎsˆ>4:ÒŽE6p‘=ÿV×:ƒŒG²C¢í1;‚DHCºCr‘‰© wyRÆ>¢±˜„xVºò´T‡78ïyÐóɘZVêÁl)×{Ê l&œa%g;ãYøÈB¾´€r@_ÑÔw´¤1ê}L#L¥ ƒ©ÄàSU{Ìd,Ó¿QqUž«„”퀮™B­¨@]õ¦¿ñB ·a)Ç‚wóôÆ·îtð; , FX8ÃÁg>ßBa ·ÂÿÐAè‚a‚¡vÙ‡8{hºî+`E˜Ž–¨Änb ³[ÃÅÛQ1"h t±-v‘J³Ò“wæ5ïŒ)K£ôzàÿ27¾Ž4›#¹ïqå+{òY%(AŠ.ëÛû…HIÀióƒ¦Úp?ÇDrU%¹&@Òl’“«%lh›Üœ•ð‚¯"(,WÒÍXωA t:Kg]‡o~£V.áQŠÁ‘°„ëQ}†™ŸbFî…ÊŒájhÃÎ]š:äÐDGMk®ˆˆØ,"ÂrôÍn‚‰à4ˆAVNsVàœ±X—±‘HŒñœçKʈϚpAŸÒJ«g½8:…ŽPáÞœpÇ;å1¡|šZ54A Q…Ä‹û*:©Œj4jÔ_>Õ¿ÿ‘´k&% i:ù*‚r”,Å®`ê›.ÿÌ4n¬´)rꃻåM:ü)¥åÁæ[êé%· à-.U?üqêZx¨Âðr˜ƒPU+Mi®a!ÑèJgÍ™7`a뙨Dpº×½eý…$‹dôá¾øÍoŽñŽT¨à­¹»„,–$WŒ¸“cÂó"^«¤W—ÄD ÷ìk×8½¶(Ki S;PÅ6Ö±;ëYŸÊÒÇ´T}µKfU„ŠJª³mäƒ?OIr’¥=-ªL¶°‰íU €•Jã!ÊxÄ–6.m[oKÓ¹ÝÔ‚Êâip…›[„I0ªrKLa3ºN%P ­Õ©þA»U…fu("®â‹ÿ¼^=ozY÷º$2ñ¬ß¬‡ž÷Ìçzü¨ 95ÜŠ1úЇî$¬ÐˆCPñˆÆ:}·Å%žcÂð±éã£dôˆ0ʾ=–Io°Îð†µ·½«`åÃ:KBG<>ò1Ô¡E‹(ÒÕâ÷9á×N€À"‰©©…V“ifLkªSeRU'ýq\ûÚ)Y7º¡mT¹ÊÜk·¼`p7he\ÈEª ƒùÜ6aÒ=WTô ?üa»óœÖ\¯ù{¼Õôªê†˜Í¹n›f埾ç&ŽsHˆðE¡mhE[á⎤᠇ŠÉõÀéØ]ã)FO³ÄŒ}ÿÝÂÀX2½ÌŸhbÓª›Ø›½Ú{)5Ï [kÉšïÄ…2ÚŠóÒk_Ëo~ä(Õ"yã¬i­ÙÄ$´I£Ú Sû€Ö&åÚfK[t{‚O†òoÇý¬rÿm¨„3À–ÝsÂúÜÇÝñó¼”] ù™X•fˆ,@Í€ÿ0uþ’Ñœµ‰p…çù½}N¼ŸÕ Å…Oô¢/ŽqGGdãQЃ >Ž1woÁò4ùJˆ1QŸì¯¥¦0Pøyaë­`Õ¬n5Î ªó<‰…Ö ý9®S¬kÍî¥è‘jÚ°é÷YиÆÈ¦L%-õÏ ¡¡I­j[;äxh¡V×~©¶¿îäWâÔ·c§åÿ³ÔPîskù¨\f7ãÄE.鎙ÌÊœj»4wëêtتx»góüàì¥g†×pŠ×gò5_ žy’Gy˜qy™W`ít`ŸGrPr V1rø\€z+£zýsH¡j±—XÜcXQ'8÷]±G~²PJH»Ç{HÃbœE)ž•tÈ—|0@””c—TRT7}ÓV}S„pdÀJæ6¶Å}ßnÍqA=¥AT&fg~Ø¢ní¡~LÕ~N%9ÉU Â.ó—fñ"/YÅwßÅ#ƒ×:ÞTVX€ŠçDkÕ0€f°€…fqø€Ž&¸yr–fW#ÿ—i›Öizõ`Ràγrfjf‚'{)x3®kx’'{BkeAb>·{€(˜•ƒ:ˆH”‚Q–"cÆ–?L7ZÊWZþS„]}¥áccdB¦„NhJÚç6ܶJºUA¼•,SFnAå…¼´vññ-bènðV†r7w–!÷¶]j&M÷"}çwüBpÙ;ìu‡zØŽzöDl•€fˆ¨Ð “WˆxQЙçqœWi—†iV’&§–EH¥Y&|0†t åQ@8D¨cSŒÓwu´¢u[W\‡J2Õm ”aw…²4e[xGyvçFBÔhBJÕnûALNeÜØSEx熟Óo°o†"§•t(V±Ó^‡–zH– qfy–¼Às9—p€ Œÿ` ›0—u<“—X|Ù`oðÉ%*Sj…9†ùO‰=ˆU,x‘9k·wŠ%v®t!‰Y½GQˆänÀƒ*Y?KÇt”át29“˜”*«RuVW¦ùhƒš·…]Çdp£[u³X8nTf›„›ÖB8»YêçvÐfÅDÕÅ2TCÆùLö·!:´U}'pó`ƒP‡7âMhîH;‡Û9ê° ÞùáÉ_ðäég—Œ˜— Çš&z%3Ÿô9a$(X©Püi3Sq%еGЉŠ>GY•‰ƒD—™Á'‹³Xl$p|.¤µ|3él^£Iÿú*ÕGd"Z¹²šoA':,A™¢C™…ÎRvVf~ƒ3H…8bÈ8ðF†æ‚t œPI9—£]?ê.úV•Â!åèœs¨¤dõ•_é¤í؇AB$Ú9ó Ž ªp¥ý˜¥[º¥]ú`êyX<›öžc$hÚ%-7=ü„Ÿ‡¹&¯G3‹©XŒ…s:z">=45ˆ é£ —Ù>;(lÃW|+©t¸(ʶlê|£Yudó¡°}×–m0Õ>¹J«Ð}ÀŒ²ÉSœº…Øá7 z~3ú½¹~ñæ†p†hÈ v‡oA*¤Éi/Ìy"p6‡\™Dè«øz&³´S;Dÿ²Æa€¬WʬÍê¬åyžré1ñd¢÷if‰(óW XÝÚ¦nú‰ xsƒ|‘¶FYî:Hˆ"Qíóо¨OS?- IŸ™ýjI»@Šê56)6U0mÛ[¦T¢®¹Œ‹SC™AT±{\è¦-‹8Š3†îç±­Z9SE²mH/'[/$’²*ëU3¢«Lä•x–a)³1ëg1_Áú‡Åê:«³<>û³@[—Iiu5­$g­cTz)WŸÑãrù3S;‘pêŸêXuºs‘•{æ³§­¯¾× J¶P£5†¶†*ˆú¯Î·c#duk·Nø„½ÿqŒÀa©'ÊJ±é·ûŒÙ¡"-Hyn#´”Ö˜¸)4¨j.t £<š9«²ê†2¹äØCó€«?„ŽÒÙ^g³}öÌg|ˆ€Rj9›ºª« Ü ž®ëº– Fi§1F% w¶;2G Ÿ¹û´šÈ»¾‹˜âJs+H§£È31¨®ÚP]»Š«h™»æb’¡e»Q?ø’Ö«‹Ø›*Ñw„79ŒÕvmªÉ“ D…Þ‡¾:¥SÀEv4¸æW †;ªL¹~ãâ~Û¸é’9wWÝ5¤EjލãvXxeµÀ \|ÇvìÀ£ ¬ lÁª»æà„\Ȇì·0 ÿ˜žÀÓˆvUÂyÂ$ƒ»ø‚„yŸYX1ÜŸs2¼W»sꪵå#(ä®3ÐÃ꓃â§~!ÄZ?,p¶ÔÛtXš¢¹ÄLì* à¡ú½…@¢0õu¯‰¢š*±D)~ÄÅX¶KÙÆL™Œónñ¦ªfLo²†jMLDJÀGDv蕈ç¤2ûÀy|Çå<–ke;߀º€lÁ’À” ô\Ïö< Ï»a`uU´íù1œv2ÑW)“õ µ/'µoJ‘s‹õ‚ ,>f§å³ ‰b>¼k¬Ìñl=ËE\½A„¶ìl»¡œô*8©RSÀ ‘Z¿ŒâË+{ÿ[…}›SƬ¾Uö©C…\èÇvñ¡T_ÖTeXÍ1Ä ’Æï’wzg¹¤ãÆ@”¤é˜DÕIÎç<³èŒÇŒç‡˰`Öb½Þð ólÏõ< š Šè;!Œ—$O’èii2ø4˜úD‚=À ™¬&û)Ppjs.ˆGiŠ‘ùs;|Ê êŠ‡äbG÷ʱÌ-I¡8v½¼˜*J¬½§ÑZÝ;œ`mx;[3íÂl¾çÛ[[”k±0Z-"ôÓlW£¾Ù8À¹BùkÔË„Æø6«Vy•N"Pí"£:J:Vxø²ÖYÎX}ÎYýê¬~8•Ô]ÝÖ ¤  §pÖ÷¬ dÿ CK´"g´&|<žÆ[’­5¡»kŠŸ½‹é‰4gsYA§9w®z¤P H;ŒÊ¯›µ4n )žE?+™)ù*Òk»5—I£Ò)í¨C[±̨4…Êè°ÅœÓ=¸Ü=ÝÌò[£pç~ú‹ÛrÍT…w%+À|ׯÁÝ/‚GgG„ÜŸ»ÜåÜÜè<–£›¥ËŸ0ÝÖ]ÝØÍPÀÛÝÝdðÝÑj"‡¢ç—*ü–¼­ÓÓz®® 'F{™wz} ÕßBǼ$Y’¾öõ½,ÒM*1Éà͇Zš½Ù+uZðÒ0má䚯ùmþ·È\v¬›"ÿÎeÌ%ÔÃ$Ù˜£2w=Ú¿þ›o÷w²;ôÛ¼é§DþB#š»Ž ºÌ}Ç. ã°0QŠ|A>ä` Ý`äPpäI.j½ädð ‹\!7³®ò‘ ÿíŠ.ö ÞH±|¶UÙ¶\&틹ŒJdw»u”Ú@Ɉ[ {¾±„7Y\èT~ǵKè1⽉&²ÊÔ¿S Žk:Ý pýG㛫À¾Šêè|ê§~ÇB2NV­îêBNÝE^ëä”ëºÞ'Þã ‰IÛÅ~ìå~}=¦˜ ]'Ðÿ^§¡,Ê£¬§!ÙÃ2°ØH£æˆôØàp¾¯i0çþÚàštËs[}œ MÈRQ<Ú¿±·Ã,èá&eZ<~WÖÓé¦èAM¿)$]ùK;Іº ¹ÚŒqèÍêá¬#â‡Vêÿ.÷ ¥Erñ¯ñ¤@ë_ël  Á ëK.ò#ïäq]Âø0ìÉÃL+˜ôð´ÈžÉ…eXT+§^޵¦8æåSƒuæ+Öb~’m½ß.5ž™|FOçu®ÄáJ(JËÁl¢Ã!7XoÅθÛõ€óÚ…³›ð±±Ñ|¿©ª£(Nw™“f–žC.n?^Ϲ•qŒpx–ÜÿÿðzïÀ.ðD6»~ñ?øƒÏÈ ˆ¯ø‹x— áÏG›s}­+ñ`]å#øï 0QÐÄŠƒ+:`ذa ˆF & X±b ŒoÜ@ÑÑcÇ!EBR )U®œÑr† ˜07̤Y€M9uêtâ„A…eQ”E›6OH,%‘ÁéS§0¤ÂÈBÁêU ´níP¢k °/†¼ û¢ÁY´gƒ4(Þ[¸qßN™¢%À]¼yïÂÀï_Àºtñ²ÀðaÃ>N,f¬Áñc 1$ǨQ¹òÌ™1‹à,bÄ•¡GÀ#]Úté$Ih¬¦aÀõkØtp ]›ƒÿÜš4‘×Û÷oßT¨ºWÜøqäÆwüØ!ÀùsèÏ/LŸnÁúuëD´ÐÝû€yáÁ‡'_~ž ô6ì­gß¾= õäϧ_¿Þüùõ»øÀŸüü!‡A0°*P(lÐev±cB +´Ã™v2!cÃWððCqÄ'0ñD%PqE&$`c”qF|ލ)èÑqGyäb .B2„Š4²Èz(@ɚȂ Rh¨tÈ!ˆZ0"#,ò20úÈ£‘Ê<@ 4WR³%^zI&š6(BNœv²ÓŸ†Ò£X A)¦ zj*ªÒÀêP®¾ÿkˆ†‹¬´"m ˆ ªëÒ¹¦ÐkÓ%pð40P( ±ÃS¬1È"›Ì²jÐìÕÎDM´ÑF;íVÖZƒmWf³­¶Ür›ƒ7àŠ¥‰ä’Mn‡æ~ˆ:ꢵàì, ‚´ûn[óºµá<{Ôsï½õàƒÏ>téûà¾táÝÿúƒ÷] ¬Á„‚ E€Y €‹D 1EC2qa ‘D#ž`ÅÏ8ãE3†ñˆ#ð¡çCÖq ‡Œ€È#Svre( *ÈÊ+±Ì²Ë¾´(£6âˆL3EWPBM¢[Š Î8å´séž~jÏ>zÂÏ@Íÿ†«¥ÊÂPDÕ ,°Å*Ë,IÕ ÓKëÚ”ÓNûõ//º µÔS[,UU%³ÌUXˆ•35h½upxr]W×tPü×Û‚mbØb‹Eb8e+¿‡¹åž…V€h©¥»k³Ýö»yºë–¼oÕw\÷Ì­çÜtå[W?Ú|WÞyáÍ@Tðwä‘ Rùwà€¥ŒQNX……?|b‰%0‘bÏpQc9ÎQd‘唑drå']Nh¡˜È2¢ˆl¾çPعgŸVB¢×4:¦¤ÑiiwrƒOö4”>=PU³šÖu¯)jQ³¤Ê¶–J¡M.j[[^Úæÿ¶·yaTs[€Va·àÍ1«âß^å·ÎÌJp„#Mjr…¸ÄõÊW¶ nvC¬È‡ ÷@–å”ÓŠ$Q‰šsNçªS-kqgt¤;êÒ³:ÖaÀæ‚]ìd·.vÕÎ]¹ËzW/ßU xÃûñG°å•ySXô<4=êE {ÙcƸ7£Žáã ߟÆG¾”%é|èKŸ”¦Ô>÷½OKòÎ0R¿àÏgiê_J\ò&¤ÍdNE¨Ósâ´§é)Tc  ŵz l‹ª`ÈV¶IMƒp!!:ˆOóm~‘ 醪>&ªÚÛ 7ó·ÀÑ*44„GJ¡Öÿà°W²ùn¬ Gt(¢‹³ƒ{0ëX'›èÄÏUk SôN½.Ö•k‹[|íC»x‘ŒóÚ¼})‚x¿+Þñ’G9Î1v¼cæ'±í±EÌØ¤àQBrd[8$"¤ÈE6I}ëƒYÌ$É%JVR#;“&Ï„¦¡õÏ%G ¥(M¹“ð€D1J˜²«em*U‰eV¶2K°9jl·LËZª`©]Æ£.¾üepжa" nÅ$¡ê–ÌTMFo.ì[¬® CÑP³†ØÔâ·C:.œ¿¡†hNä0ËYî䜴žX-"¬AŠ£+=Q·,æ“ÿ‹þüâÛ…»¾KB —½”F5²‘¡ :„C•QÔŽ"Õ hE6etbåhG=öQ‘îH|&3é‘RꤕNé‘í›Ù$)I?L‚Ħ%BN;éIPöTi?Í žò4Ô¨)ð¨Mi TÒÀTD9•+³tÔ£,()Je5.œè*0;Ö±³„(TaÞXåLþMšð°5[“M»*¯ßt÷*À*g9™ì³àÏël'±ô4cÃ…ž|ês‹°‹?ñFy ”Œ›ÕtP]C¡£ehi±qZÔ¦¶é ([Œî‘µär«Û ñ¶|EbÅ’9G.¤¥ÿyŸ$Ò%›Y2g4EÁr™ëÜçîTe)M‰Êfw»Üu¥Ö ^¬D¼%¨ày#E)]f5véêÀ:Ì. @¾ó¥¯ ×ÊÖÆj"ˆf\i¨j3qV Ná”°Ìb°;/PØ'BŠôt,ê‘áqM–²µû2 /Îr–w÷B1-Êb© äÀÅl}k\ßA´°£o|ãMl¶ë£x#ïýØã²ùŽÜÈ— wÉLŽßq¥LeåâOB{n›¢»å8‘ò&Ôu‚uS©Ê>%e»IÕU˜ñ~ ªæusU3¨Þºhê—zoXź糦­Qëÿeœù7мu¿‡.ܵ©ƒmv“ÀèÍ£#G‡‡YÎipt¦ƒéÂ[Ïx: ê÷p±Ã±›ˆCœÙÍ’8æí¬mkä\ç;GrÞZ‡ùزݣŶw콤?æB…t²fÿ¸.“6$ÝI'W¦—ÔHª¬ÉŸ¡¤ÛŸ<—½<À<FÑîº]™µ, ¹kO%¯TË‚K bu—ún¯W?åïÎͬ}&xÁ1èÌĪÐ3d8€qñÅu³‡{$mÎ ÖÒ ÿ„µ3ÏÅr«±öT†3ì:Q³ §ÖlÌ]/šß _7ÇùÎm¯sÄ!­µèk‡ÿ®Ça«¨g@úÆjäQe7½¤åë’ž¥h+™¸‘ŒHÖ£<ÓäòÌL?3 'uú?™€»&g·SÓ  v¡¬rÌìž ,Ó,KòRRT•T[ÔË :ï›ßa`DxÄð@¡S&¯ċ!iš&j¢«º 0Æñ€‰Û Ê“˳¼Œ¬ŽÓœKë(Â’= 3½ÓC=/ú°û1xÁ,à¬lÁ×ÛÞÉ-›SÚ»=ÜS4¨± Ã#;ëÑ1áó#³‘Ê­’Y¾!K’# ®áš>ø‰)™Ò*³©Mò¾5ñ¶7á2Ÿ¢.ð  @?¢2Šõ+3By·x“·Ea”ÿ©º I¹ª¬š‚xè»ê¿À €¼»)@û¢ ÄK@δBã/¹B´âÈ°Üø¦& 8Ê;–cI0J£4ØÀͧT,Në´ðH”Ó¢ [¹#Ô,T{½ÍU›=Úc(´=4ؽÝëµÞ+Œ >ìaí)¾ãKÂÜbÂ&”º(¾õ±:†h²@ˆ)äÊ>,Ü6,óŸoKšQÜ*¨á3ö!®&ƒ2ù¡Ÿ°šZ® ,šÿÙñë2òÛ‰¦!Ãô3Ãb7¥Jƒ¨„·ÿDñЍj”GÁ¥IÉ%¬Ô àªRÇu•”zÂ$»Iœ¬¶ëã:lëÉžÙ¶nó$˜Í"¥Û ÃrÓM>ÑF`J¤êFïz7p$¯Z¢?³¡”åĺÐJN&<[ê$•€ÃµZ«³Œ!B³G¹*…¶|¼~”¼¬@yø« L§ƒDÈ„¤Žiù@méDÒ;ù¤ÏQ$Et!Lv¹SëϘ ;nsis-3.11/Menu/images/header.gif000077500000000000000000000302431477201124000165050ustar00rootroot00000000000000GIF87aV-‡ÿÿÿþþÿþýþýýþýýýüüýüûüûúüúúûúùûø÷ù÷õøõó÷ôòöóñõñîóðîòïìòîëñìèïô~|éåíèãìæâêåáéäàèâÝçßÙäÜÖâÙÒßÔÍÛÒÊØÐÈØÎÅÖÍÄÖËÂÓÊÀÒǽÏŹÏÀµÊ¼°Æ¸«Ä´§Á±£¾°¡½­Ÿºªœ·§—µ¥”´¡°›ˆ­š†¬š„®OÈõ–ƒ¨•€ª‘¢'»ó¯ï §å•Ò‘Í|ŸŽz¡‹wŠr ˆqˆl¡ˆl ‡q›‡l ‡k ‡kŸ†n›†k †kŸ†kž„m™w§†jŸ†jž…jž…j…iž…i„j›„i„iœƒj™ƒiœƒi›€i•ña]ƒhœƒh›ƒhšƒgš‚h›‚hš‚h˜‚g›‚gš‚g™h™gšg™g˜f™f˜€g•€f™€f˜f–€e˜€e—e˜e—e–e•d–}f“~d–~d•~d”}d•}d”{d}c•}c”|c”|c“|c’yc|b”|b“{b“|b’{b’{b‘xbŒ{a’{a‘za’za‘zaya‘yava‹z`y`‘y`y`y_y_x`Žx_x_Žx_w`Œw_Žx^Žw^Žw^v^v^Œv]v]Œt_‰u]Œu]‹u]Št]‹u\‹t\‹t\Št\‰s\Šs\‰q\…ïE>èFAÏ;2©.'€"v&-s[Šs[‰s[ˆs'r[ˆr[†rZˆrZ‡q[…qZ‡qZ†qY‡qY†oZ„pY‡pY†pY…pY„oYƒpX…oX…oX„oW„nYƒnX„nXƒmXƒnW„nWƒnW‚mWƒmW‚mV‚mVlV‚lVlV€lUlU€kUkU€kUjUkT€kTjT€jTjT~iTiT~VziS~iS}hS}hS|hR}hR|gR|gR{gQ{RKw2tc*E%5&+W%q=z“éÓ§/aºd©µë×­!QzD»¶íGŽ1ÚÍ(‘ïßÀ .\Pñ@È“ZÎüóç|ôD×C½ºž<ØóÔ¹s§Ž÷:tÀÓÿO¾¼9qâ¼YϾý6ïÙ°YCMûiòç7c¦Œÿÿþa„áÅ&¨ ]4ØEY\!á„Zq……Vd¨!vÈ¡TH!E$–h"‰P¤¨âŠ,¦øÄ‹KÄã2Öhã6"#<Æ(@!t=ûÔ`ä‘HÖ`OúÐ#QDDÚcQFyd%;DÒI&¡“Î9_¾$æJ1•ÎL7¥Ž7köÄOA• QGÕ™ÍR×0åTT|RuVXmÅ•3_EVYh%ZÌ¢q5W]¿Ø•×]»ô²‹_~å¢i.® fØa‰µÂJc¤BÙd¤”’Ùe¢ŒÂÙ«Ÿ…ÿò‰h¢q‚Ú­›d’ k°õj‰$’Ü&¬nºgl"ˆBܲ†"HrÊ1·Üsða­uÖe—]wß}WÞ·ä—ž{äÊ7_}øé·¶ûŸ Æ«àƒÖ[¯†fèa‡#ö{b‰PDÑâÀ.ÒH#Ž8ê(c<6ŒÄ<!1ÄOŒÍ£±BòäsËÇãÂÏ:”l²;èÓ<èCrÉö¼C%•VÖ¬%I[ž„Ž—cö\&šjÞäôäÍÐÄÉ vµTRN]ôY ”PU4Ï8¨ ^…VXc%ªè¢Å¸åè[tA*)^»Œ ˜f*ا,€A¨¢¦ÿ²X*6mêc“I¶êª¯vÖ™g³ÖZ®§é ›Œ›$k[n3Ý›oð›!‡(ˬ³< ­´Ò:gíµØR"lË­wàæzé©Gîzæž[ß}êÊ+¸û._H‚Ç@ÂÎC< ^¡½âkúî "ÿ–/0Á*¾x0Â5:ü°ÃO,ÿüôÓ¯1Æ iŒ>÷Ôâÿÿ¬>h‘'ð€NØÇ:Ö±™]¤f¼™:@Â%u C%=s2à’gB>p“ 4AšÑ”¡l£ 8^ ²Q„ãEIJ ŽwЦh0VÚÖÿõµ­4#+Í(Bd˜ ØQfÃÑ„1 µ½e‡€K ô)»ØÅȳ”Üèæ—à,ð§LèÂä  [8Á=ƉÂdTu8W%îxÀgV€ ÔÊ41<j2ñƒ%஡œå\ƒ9@{  iÈÐÇ“¾A"˜5pàx.Är’pü  @ªõ:=˜•×ÉÃìj—îÔáÇ»xr§X wo&‚О æB}Ô•†þ˜ P^Ä †ÁK™Ó“8»À½îaÈ{ûâùL°ó F3bß6ÏŠU¬~ó3‚ÄŒ ÿÏ~òóŸ5 Òyðb% =äA{pá¡…(.(@Ñ|,pñp`G Ø R°‚^²`ÏÄ Í&àØ O””¡4ÍiO‹šÕ b•­mMP`ÛØÄb6´ ÃX[\¶ˆ.¾ n—ª_b‹À|êS¡bŨJ58™Â2}LÜfb%+P„†4ËU®xå«×`Ns·ÑÍnŽõ›Ò‘²8…€–*—`€€Ît¦;mÝÎ[¹ ïÆõ»÷ÄGšéÒú£MÿpÓ ð’W‚º Yv{Üó^øÄ7¢uºóê[_ÂêÙ0|æSŸGh@‰ÀÚÖº–µ?ºŸ ZÐxÿ äIOºˆÌÈŽ~¤£!™`»„Ž‘¾¤ã0éIiò pÍM,uéKŸ¦§§Ì”*~Š5pšÓf€ÅPeë©¢ˆA^¡Ct‰Ô¤ò’T¥î%0ƒñÔSùF*ÆTµp†Ëjâb5«Pæq·ÊÄXÉZVIX­›ãÍçØš¬·uÈÄ\[ç:ZÆ®:Úªƒv¼5ÌÀ¢g°¾s|ä#Mý¤Ë ih¬cà †ÈJö@röÊy¡ i6T˜Bgÿ…>©OžóÜQÄL;1Õþóµ¬Bk‡Àä&3¹ ÙÇh[[ÜBä™R•Á,·$9+ÉÎŒKÒqc¹iz®Oऴ9½ôÿN1}Ê5®ë§›шaëÊNÃ+^µPQ¨rIoÙk)÷ö…Sš/ßZQßTTÕªWí£f8ÃUYý×Va0&ÊjVÌeÁ¸á [cºÓ5KufÝòª× SG[½ÜN·:ØÝ!³°#^ƒð†GÍ«Ø?d(C^¼ Eˆ^åÔìq¼cóõø@޶ŽFZ÷E Á˜”â±[ðãHKʸÇ-î&ŃH/Ó=ܑљù¶£^þh˜»ô¥0‘ù%Ç™Ñö„…qÚÆÒÞœC¨EmÎ6à€šÖ”ш8wóü]²• ŠfcT\ü ø‚mèý0Ô»^KµW©‚ÿI¹õæ ¾I•1À£Q*I·Š3[Á 8ñ™Oø·4˜p®2ÁéËš6¡[k"@ÙV7K®¬kN«] ëXÏ:°æñëSÓ ìR17‡Mìbc–Æ6^¶øÈ"Ï¢èÙK­<éYm÷ùîÙ6ÈÆâ1\äÀ¼-F¦2–þð-Ó‡;v[%Žl4Kð‰p‡+æ1ipá`I8œ ƒ™ˆ„61! ¿áoŸœ~8¤kjài§S~ĬmíÎZÁƒê½Û•d€¥˜À)Ä+Ŷ%.XdQGÞEBw£¡u |påp •Üà‡:Ê2×ô@ÿáFa¼àA3~Ü éBNहÄ7‘„ãÍ@WD$;­9ëŸ7ÀtKG4Ʋ,Bp<2avMЧ„|èj»„·ƒ5ð-;TI@Ån0.ÆãJì!$æuùa‚0R v_@và$Yà”=4vNø‚c!2n0ÏZÒ6m¥õ>÷tw§õO©ÅO3uP Õ?þ3@5… eQ t… ¤Qï\’‡3ÃuÅeyÔA´or|àA£×|§ð&o(|“€°F`F±EÀP15´×'»pƒ˜ÐÜÿå „`‡x¨‡601ÐJ€`W È ET’|èå‡p°Çó§@)ž`}™X°€‡C€„‘7 ª'0U©|Á‡!ve ŒØä™¡Uë7H…`‰´ [ÐJ  z®ÖG ‹À¢A¶¨ ‹@6Œ€5Á‡¾!€£´,MÐJ àDÈØÔÂJÐßøjcPíXŽð1ÐŒ PãQLÇä;ÊÄLìáL-€XõaBÑ=ð‚ÿ1‡ÂÖM‘5ƒñÒàtƒ‚N߃c:Öƒ=öPÿÀA(„S„¦edFÖZGfL¨? qù°PTÖP\0Qõ”PII©……%Dy^†÷F&fÂoáÎå&l'Úàf§25gVópq˜gÞeq—qj‘6€hÌWr&7}ºròe.×h†*ª‚Uˆ£Uüå_Žt&9E×ði v,ˆN‡jÑu®;T—6k´ö-†…Å)ˆX½ÆXb×be7Y !gw/i7“3©ƒÎölPð:mB6dw§ZDÀOÉdH¦dJv?{GeTfe!3Œ×x¾\(y µ•.12á•á*5–-äBLÿc'xrptVgnù–…"—<%^ka—wÉ6"——ëµ öé^š  U-‡Æèƒƒ_¦ÀG‡‰˜=÷U¶Â˜‘ƒV`gjjU™Æ2JùøVšÓB-va~µaW‡uã1„uš\§šŠvb÷š“Å È–l8¨/·é!"²N?¸›rw# SZDæOIÈZF`œIædB:¥w1eÌy[ÎùXáxUi•WÉ%ç€AØY&ÜYßù&JÃzoVžæ9SlùˆHDqì9—fS^€Ö6ôYŸ'W7ðu7Š*©ðŸ3G‘¦_°Òs´â8ae™°iù+‘ ™h¥t£æ™yj«ÿ£j¬FK|ÕW°&š :èA½båR¢Ã“XeàkbW*:/,Ú¢™“9¨ƒ3êY)òY7‰“?æ›s'díÃ0D)eGš¤ a[K õ@g3]Hy%,afY–ÐÅR7žug{r]cŠ{eªSìÙgïiEæÕ6ƒ6)÷É—ðõT…A_‚i*¦@s“‘Ué·U\µ˜*`ºÒ ¾âiªV‰JJÆ¡€©Ö:¬VKÒñ™H©á¢â¢š*boÐušXüñk+Y*Ú0ö ³é¢èD“Q"Ív"­úƒ¡u07:wÔVwñcO'»„ÛÆmß–$JBnLâ$P²$cíÿF3\¥SÊ%Zi¬Éu&^©¬+žBÁ gLQ]Ö%¦5E­x6b!—î¹(jº¦nCrp³oj7*7_ýÙ S_÷Us’¶®íª˜ÿõ®»2¨ð “)¡£–¯Ëâ,Ê™ÿ °ša5šà’© »©*øu»Mâb¯™±9cÉV›’NQ c[>ºi£ð$«´:d×f1Fx?F*eÝö1ù ö0º¤[ºö üÐ'£n¿¬¤%ÃU\"e¬â€\Ê4¥w4DÓ¥Îú¬ÔåÁF)Ð'>0'`]C¦„¢Sdáži UdE@à xiTë…Æ;}š"§½Èr_ÿ‹sc‹_zº?ð€Œƒ  Š+kû6&`V†ŠVŽt¿!€‡ ·Ë’:ªjSwa2&°-Z©ãAX‹š»FA@# Àƒûò Nñ¢ÁÒ!¦šY2ÉlQ¹óv胓L##›#¿9„Fh„KHP Ñ1 ãw72&“2+ƒx.ú¿º…;˳#¥AP p<% úöy%tB)D4+´»@ŒÁø‹M`00à¸8/ÀEÀ ©À6P “À`ôi̧à´X¬¿X¾— >àLðŒ ` XL0°`}Yÿô[”0 ˆ€L½ànüÅq¼{ñÇs‹p<#`yãÅÖcãkG`”°ÄÀÒ8i®‚fHÖØpàL´sg8 Á?` c€‹`¼€˜£LÔëË"PùK€ûKÍ¡Ä,ÁŒŒ°C  Ò"^|@9Á§Í€zȬÌ ß1ëˆðÉ€l‘Ȱ`W#´ €’|ññÀ½–#HÚ$þñL,™ =Nh“µ >:H>%̪º9#-¼0& ?1œZ?yœ»w“'x,=xôÒ´üà¤ÿñ¤6S4o'&bÈA-áA)@PzRLzTüoVü@ ˆ “`5>S“0g‡È'BqÏž8åL­„ð]QíÈ€¦Ÿ A…|¶¨E\Ô­Ÿ¼Ñ77J5¿` ðÉmô½Ù—¬°Ž+à}q€<Á10¯RíWH‡´ Ù¸ 6 Š €[09•cV”9œ× àL@hÍ(:£Ã,“ •Ýr¥ ˱Eà:3@Ù(ØRxÅwØÑùœ‘鱑ÍôL©Ékú!1€ØtåšÑóRƒ[!jGÂ4êª-›]«Bÿè“1ìO¨”G0P+‹E P@RX…¤@XĬ7óQ •=ë?D† —× 5Á ®Bá€G§ÐN–D±E P1Hk 5³·A|R×Ä'q·¼]ÁàbCà ÄG4ÃÐÖpAŠÂ@Têe"´‹pî‹ zº Ÿ®ÀFØÇ7„ž ŧŒáz@eûG¸ÜØVMŒ‹´ –PL àÀ·f¥{`¶~¸áUM¾ñå¾Qjsk… R>a;$KÄаÔ!密5°ÛÞC X‡‘¦™LÇÑëᑜ?êZGöZÚ¶œ¨®P Á”å”Q™üĽ%¬õ»VªëµëÄÜÿù ß¹R¼ë¥H­È¾–5õ Ëîázv¦ÐnÒ>íÆâמµÓ×TN%®q¶b[¾F~87Gi•6+—9v é~9 GÇö:jýë¿ÃÁ¯Ëqk(Ú™T—KvžÀXw° <ó1èoð MÝ4ª»ðæ”/1zé&,0Ú½Ýñdž¾£ã}dÄ ¤K¦dD`ÞHª«òЫï€e7Ë[B<`VAéùm\å@2Ñë7–FÃ¥Ñu´:¿ó}2·G¦Gd¦àuÖ΋6ñÉ­I¯ô†v7Üþô/õ抮•1îVϧîªõc5¨ë~tÐî‰Jæs[·üæp.©Ø!š¸ÿc°˜:¢[wX›ƒ+lÿbbl0™±1*"Íõ<‡þ<Ïtêyê\ÇNGûvîtä|þÍxòäÙœ_“^ýš4íÛ£Ic¦Ì|úõç‡ñ‚ßË~þýûw0 ¯ °@¯°"A­ ¢AŒbŠ(&¤°B(.Ä0C(žàp ?ñC$FDâODE#Œ8bE‰€1F‡ ±Fi¤'Gzæáqž|(H!"H!…Üyç!ˆš¨I‹ž¬ˆ£Ð)©Ê*Ëy)Ë—¼i&n¼Á)Lxòé§l„"ê¤Ö¤¦¥¢¡æ)9›’ª™ª’± +¯öD¬bÌ´,´ÒZ«­^ÿvy‹.EuÉGõâ«/À + Ã;Œ1S “,2Q&« 3ÍBáŒ3ÏB-KHC­UÕ^ƒÕYg£í¶Ûé­7AvN¸ã~UŽ¹æœ‹.ºê¬Ã.»îº/¼8ʃv<ôØX=÷Ü3C>û¶½O?ÿ¾õO‹.²8°\\0A*| )¤ ¢ByåÕ°Þ 9dbÃ÷åw $@ü×ÃÑÃyÜÑG ‡dx #„'b%!j‡b'ÛòI)ÕAG+?>Éœ•´Ô’&/à “Ì2B³¨¢Öts)¥æ”³Î¨ðÌs+>½ k¬@%´PC]t®Xu4R¥ÿb¥iJ ÃTÓMÿ;l”P/5³OLåU¯Gk5ìÕ`…•YmEûµså×^‡+î×å„%¶X=ŽîŽdë ƒïe·ûNg£-ïõ©O{äÀŸúð¢‘î¹{$©Œgœˆñ0‚<*µÑJä£K¾ñ.™ e×ãIöV&>~ÏmZJ4œ!Rš5cS¹“ž ±,’‘œý )IF! Rûäÿ(@Ä€R”¡B`9ÁµT6l®LÍ#Æ&KGÔÒ–¶É¥.ß`‡n|¦t†YLcnÇYÏzÖ2у8ka‹†õ±&6ÿS9rq3sÞl×ã5Ä ™CÚ>t:uŠèuM„§ã9Ø#L±žÉÇ-ø±ÏôÓŸÿÍ@2PèÀe\BÓ¨Ðu¬¡É8˜ш²$&2©Io‚=–‰{|ì¨cR‘Æi|å»ÙùÙ'b Ã¥d0à'ÓC킦6µä^rú4ž0”¢ePµFÔ~&GE*,#!ËÖÐÊ©D.Ù¶K^ö2XWa„™7®v<Ë„–3Ÿ™8ižU e€œZ÷ që äz«е ¸z.Bt­«]щľ2v%Šb` ›¢yRñvIì-ÛXÈvøŸõØÇ*[Ù‚b6³3Þ§Ä1Њä$ãPIiÃñ `&«ñ.Š=<êäµ}ŒA  àá‹ÿIkvÒBROXA_úÂR ß–…€^ÚHâÖϸö» ^ò—+c@¹~iÚ`RaPjn¨V€åhÍ” 4êu!˜ÝJp63°ñm=Û"QÝ` ¦jÞóKX-Þˆ™¬®j'‚S¦X嫞p`p€hP_ÆÙp?? nˆj`ο;0»$kÁåTpéôÚàÖùë‰Mœp°MDO _8ÃV¬ˆG¼lì@=Ї²I|PŠY c×ΘFTÌ1·x$ä GI–cÛ8e¬m­LÀÊX Pj$9É·erJ­¢•Ý"ãŠ\dÐÿÉ–€’ŒE,©2Ÿ™i„aóx*@RÀÙ€@ÍZMU]ë^Âã§FpIDb©²t­1h[‰w¼¬ªq@èè†" Î¤Qè7c~5¬„3ܦÓS‚! 1¨ðƒ³–A ùñ‚ €eUƒKêTß&¬ $àÍÅÕ]A¼µ]1´&ðµ¯>‘„…ì„YXaò8ö-p‘[ðCÚ•uvx°wD›Ä=èS%)¡$Ÿ%‰ `ƒI˜˜@ ¬Çp xÉ –›&9Ɖ4^ 8€-X„O€‚à!BGÛeÚà„ }î'¡ÿd9 ä7} áädB¤?€P°®´{ÄxÁà€&Ðei0`ƒ $@`)Ø‚‡ÜÓÞr™A PlÀ«¸i™Gt :]s›1µ…LÀíoM¸8ÊhÚ{͘³hh= @E H` P€ØÀK¨¾ò€6°Õˆx€X€ hEp –³ LD8´\Ùƒ ¬À L‚@𑫪 €ø8X ˜AH=€*H– 0 0€\4Ø€øP€¸Hƒ0€ Pf‚¡²j#À²hº/ƒÿ‹€ ºoaC7ø/­‹5™µÎ§q‚\3§t:»×1µ[»xb‘),Ú¡¢Ãʰ¹³…G|D»k¶gã»Jì;‚"£Às’ÁC@Ä Å¹I‰9€-P ËÃ<—Ð<Î Ï› г‰I2à ?Hž‚Xl),€" Å˘‘7z³·ñY„ZŒ ôCsb°³ó5`¶B4ÄAEl;FtDHdL[ȇ}ЇȔÌÉÔ‡}#j4Ú¬‹Ø¶äE‘0F’ÀJHÅË˼Íë<+7»‰¤ë€SÈž`8€uÃÅs€b€cŒ·y[FÿArÍIh2fð…€ˆ²=™½"ð-E"ÇëaÈ> ®ùñ!‹C‘Gšr”‚ }ÄL*,“ü€K˜BP2…OpÇ•PH‰ …9»€SâèÅÏH:hƒ É‘; 9`F`ÉÚ`ÁÌ• ÀEë v+€$0Ž$àÅhå€&°›<0Êê¨90NèŽ7@€)¤)´L‹ƒ¹ÜJò0N+õhk Úã€hº0 &þ˜Ëª— m«·ºCu¡µÏ;º;Ó1;uú+#ÌaÃl1L#H˜Ä ~À‡/Ó0ýÒ|à'0Ó3=Óÿ}X‡}ˆ‡‰©k#žlëLu‰ Í‘ø€^d Uß"êØ²ûKÕ‰¢)EÄ“MY# ‚õ]‘!6ð^˜…œ•Ùš½ÙúÕ_íÙŸõß}ÐD„J±…*¼:=ÚÝ$ ¥e‰ñ`‰E°9Ô ‡SàH/¡EH› Ý`ÈeÀÊ Ð €xlÈYhÕh‚¢ˆÔ5ó8™„Û¢ÝXh_XÛ«‚Ù ?ÀÆpn–2‹QÎìk P‹U`^DU¶€È°G]8?]PØx…\H…ØÚ ØG¿@P€& ÿ<˜IÄ‚2®HÈÕ„XVÊ%cÅÜü `A¸„AX[ÓP¼°ÒhJ€†4èâGhGÉ´H>ÚÈ%X608ÐO ð•œìFH‚åhŽP1Ð5ÐÏ (¡ì€°Ž$¸pÇíPƒP(ôWL{ƒãä­QýH‚ðʬSìµ$¨kËêý.R;ì!îuÛË?<']Y%,ô­R÷m߉‘©°„úÝ_™Í_ý¥çœÍÿýYÆÌMÚ9. ¤= ¥]‰iP 0œ„Vd p˜¸ÿ˜„/†D€Eð 8  (ø(€"è(HÝMðñƒP€€€ŸaÐhŽöh €²d(‚€P 0 bb`Ÿ²Õs€ @ AxXš-—~‹¸ö³?XP.ܘ€h5# MP 8€-@ŒŽöÓ(‚NÁ8Q Ö‰´\<Ë\H€ˆˆÀÔH‚P×Wy Ðjx„ˆmFèƒ`ë$¨ËÎlD`]ÞØƒ¿ìÁ¶ª:Ž€!8xÀl°c +t½ÈŽõ[€ÿ 8àe ø*`~a^Þ3pO#€à¸¯úÀ xV1ƒ/ðˆœkžX¼,°pâÃðßk°Á,D÷}ö5ïón_"€_·x®_­‡{à‚ù¦ïúæ\ €{ÎgÌÊÌM`)ùˆÏTæ9‡p ­ˆš(ÔÕB™ó±í ÙJŠr†JµT”Ò­•*†cº ¼¸™’$Jª¤HÉ)V ŠjŒŠO *¥¡:Öêº.¤]?ãÖï² Ê%òâ¥ãÈ>˜ôŠ´õšWJ«4Kó92¢/4 µm©&êÖ¯l Xã:KRxÁX&M0{éØò5_À"Yÿ¹RòNï4—‘YÙExÖYz°'ù¶ïû¦€;¿ó{Ög7Õ,Îê¬tøDo;‡“8‡p“±pPð“©spï¢-@ª7A"¤BÊé~ë—)H*.šÊŸ…Ã)¦IqšÇ3ª+ª<³ñÒˆ„íâ.ïR9´q¹ñzãPƒ TŽa´5¡Þe‘ƒ9pÑŸ‹jË4 õ¯2˜^ý¢±Ã­Ë渒&mÒo6_q–Ò)MÙt~‘57wõVD…Á˜Í9z s;ÇóyÏozÚ8-ž‹ àÂt“(pqÀ’ÒéI­‹²‰tc=òžH“I§tÿ©H©ä”2Þú­—‚Ÿÿ2„uK¤ÿ1õžZ Èý©è’®­¡.WõÒ ³©õ ¯¨Z´˜ šK/¼Ù›¾Ir°Ê´øjòõ€¦liºùî*߯*Rs+=|—mÿ^¿ï~!Á\;”Uçt>÷¡‘©0ÛqYyè¢Ü9~È|À…³Gû´Ç…{¸Ìàà¡]¨ÎüD£m1æ79Jt§Z„OøGï£¢ð‡·™ó‘x>!b?‹ê®¡1®Œ_”\P¸7qÀÀ¿ÿ¤Š‹\»&ùŒÓü¤qìÊ.H I¦rù§zID›yFk´`´­º+vfI¦7Pöøz¡söÿÄ™(·h6ú£'ì5¹C¯ãò½ÜØÑá5´ 6“w5_s!‚9˜¶“_±×0*ˆß7…SlS¨mûD€­“°{‡¼×{빞FWx—ù¨Ùª·{»ðáÌé¸å™bà­–j˜r$úˆ]»t,hPW®\°\-tåð¡«V[±j•ê"FT7¢2åÑT©Q"GŽeò¤¨P*U~Åéå&N›fÒ¬‰ “¥œ:wæ¤éРB9rÄÈQ"F‰–2]zè©¡¨R£ 2è*V@Z·úãõ>zÆ’-«'ÚDùó!Ò§Ï£G¯ú~üèÒ©;çÿ?€úWN9â„s ‚ *Ž7 :È „F¸Í6ÙXx¡…Ø`“†^óa5!Š8b5Ô˜HM4Ï8³"‹-6ób3ÌÈÈL25&ƒ Ž9êˆL1Å#ÌÂ9¤Àù ’Hö²ä’»ô2ÐAQ"ÔDµÑDiÉÑÿF™BI(¡´R(Ÿ|òL5Õ”I&<¹™“$?ý4”PE1¢TSy&r"SIU•!‚’WZ}VXf••VZk¹õÖ\‘Ö…×^•²ñ†}Xaf bŒ1&FQv*e˜]ÖgŸ‰öªi¤IA…ªÙŠZl±=áZm¹ùz[o» 7¬pÈË\sÉNGÄtÍ^7´Ûe·ÝwÕ’w­xïÄÃÞzïy_;ì„[;êØ—Ÿ:é ƒŽ€íHà‚ñè`ƒÜÔ+!„ÚTˆ!†vø!À$Žx¢‰ÑDÓ"ÂÎÀc3ÉÈhãŽ;ƒÌ0Ay±0F£ä/L6)”% •UZ™%ˆ+qÙQG•˜¢”4fJ,•y¦LjÒ”É&l^ò¦›DBgFÝ©'Sˆ$Ò§ŸTaEh¡‡†%–T›ÅhB©\rLJi¥zõåצƒfX¨¢.Fjd¡Šj^¨Êj«¯Žv·iRÌ:E­¶²†k®°Ñö+°HèÆÛoÄ*ŽÈ& ³ÍJ>D@;nsis-3.11/Menu/images/line.gif000077500000000000000000000000551477201124000162020ustar00rootroot00000000000000GIF89a€ÄÄÄøøø!ù,Œ;nsis-3.11/Menu/images/site.gif000077500000000000000000000016671477201124000162310ustar00rootroot00000000000000GIF89aȳùùùììíòóóÃÄÅØÙÙ¬­¯œ ¤¥¨ÊËÌßß໼¾´µ·ÑÒÓåææ“•˜ÿÿÿ!ù,ÈÿðÉI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,Hb#Q 3I5 „×âPa8Ÿ€Ãq pUÔp0,Æ$Ѐ‚ƒÊ64@  v= j*mo  d Yxkm~$ˆ(^r+Šh^ nY  •_“•±W S P • g¢Éh¢ÁÕ¨¢ÇÇ µ ´` rÉ `Ühj¬á¾ ”fêì‹ôÊ`¥xú(Ú8PÀÁ¸1c Äé@<L@T @\v ’àÁ€Fÿ˜4zçÀ!A Jn±ø   ~IùÀAyKTªjÙÈU/s:Æ ¤ +Ð1鯄x1PÀÕ§ñ BÃ%‘M(%g:’é‘rø”p‰Ó„Šf³xÉâÀ€5#½,ú¤÷î…œ\Ysì?\}ûëæÁ%Û«u°Ôº‚Í{ìñìƒI½äi“ç£З™¥ àã@ìÁ¾g¬ñƧ;nsis-3.11/Menu/index.html000077500000000000000000000056031477201124000153200ustar00rootroot00000000000000 NSIS Menu

      Compiler
      Compile NSI scripts
      Installer based on ZIP file



      Developer Center
      Many more examples, tutorials, plug-ins and NSIS-related software are available at the on-line Developer Center.

      Documentation
      NSIS Users Manual
      Example scripts
      Modern UI 2
      Multi-User Header File
      StrFunc Header File

      On-line help
      Forum
      FAQ
      Bug Tracker

      Plug-ins
      AdvSplash - splash with fade in/out
      Banner - banner with custom text
      BgImage - background image
      Dialer - internet connection
      Math - math operations
      nsDialogs - custom wizard pages
      nsExec - launch command line tools
      NSISdl - download files
      Splash - splash screen
      StartMenu - Start Menu folder selection
      System - Windows API calls
      VPatch - update existing files

      nsis-3.11/Menu/notinstalled.html000077500000000000000000000013061477201124000167050ustar00rootroot00000000000000 NSIS Menu

      Feature not installed

      The feature you selected is not installed.

      If you want to use this feature, run NSIS Setup again to install it.

      <- Back

      nsis-3.11/README.md000077500000000000000000000014011477201124000136660ustar00rootroot00000000000000# NSIS [![Build, Test and Publish](https://github.com/kichik/nsis/actions/workflows/build.yml/badge.svg)](https://github.com/kichik/nsis/actions/workflows/build.yml) [![Copy from SourceForge Subversion](https://github.com/kichik/nsis/actions/workflows/copy-svn.yml/badge.svg)](https://github.com/kichik/nsis/actions/workflows/copy-svn.yml) NSIS (Nullsoft Scriptable Install System) is a professional open source system to create Windows installers. It is designed to be as small and flexible as possible and is therefore very suitable for internet distribution. ## External Links * [Simple tutorial](https://nsis.sourceforge.io/Simple_tutorials) * [NSIS Homepage](https://nsis.sourceforge.io/) * [User Manual](https://nsis.sourceforge.io/Docs/) nsis-3.11/SCons/000077500000000000000000000000001477201124000134355ustar00rootroot00000000000000nsis-3.11/SCons/Config/000077500000000000000000000000001477201124000146425ustar00rootroot00000000000000nsis-3.11/SCons/Config/default000077500000000000000000000025461477201124000162230ustar00rootroot00000000000000print("Using default tools configuration") Import('defenv') ### flags defenv['ENTRY_FLAG'] = lambda x,u: '' defenv['MAP_FLAG'] = '' defenv['EXCEPTION_FLAG'] = '' defenv['NODEFLIBS_FLAG'] = '' defenv['C_FLAG'] = '' defenv['CPP_FLAG'] = '' defenv['CPP_REQUIRES_STDLIB'] = 0 defenv['SUBSYS_CON'] = '' defenv['SUBSYS_WIN'] = '' defenv['MSVCRT_FLAG'] = '' defenv['STDCALL'] = '' ### defines defenv.Append(CPPDEFINES = [('NSISCALL', '$STDCALL')]) ### unicode tdefenv = defenv.Clone() if tdefenv['UNICODE']: tdefenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### stub environment stub_env = defenv.Clone() stub_env.Append(CPPPATH = ['#$BUILD_CONFIG']) stub_uenv = stub_env.Clone() stub_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### makensis environment makensis_env = tdefenv.Clone() makensis_env.Append(CPPPATH = ['#$BUILD_CONFIG']) ### plugin environment plugin_env = defenv.Clone(no_import_lib = 1) plugin_uenv = plugin_env.Clone() plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### util environment util_env = tdefenv.Clone() ### cross-platform util environment cp_util_env = tdefenv.Clone() cp_util_env.Append(CPPPATH = ['#$BUILD_CONFIG']) ### test environment test_env = defenv.Clone() test_env.Append(CPPPATH = ['#$BUILD_CONFIG']) # return Return('stub_env makensis_env plugin_env util_env cp_util_env test_env stub_uenv plugin_uenv') nsis-3.11/SCons/Config/gnu000077500000000000000000000260101477201124000153600ustar00rootroot00000000000000print("Using GNU tools configuration") Import('defenv') ### imports Import('FlagsConfigure GetOptionOrEnv GetStdSysEnvVarList') ### HACKS! if GetOptionOrEnv('NSIS_SCONS_GNU_ENVPATHHACK'): import os defenv['ENV']['PATH'] = os.getenv('PATH') # Major hack! import_env = GetStdSysEnvVarList(path=True, temp=True) for var in import_env: if var in os.environ: defenv['ENV'][var] = os.environ.get(var, '') #print(defenv.Dump()) ### cross compiling def cross_env(env): if env['PLATFORM'] != 'win32': env.Tool('crossmingw', toolpath = [Dir('../Tools').rdir()]) ### flags code_failonmswin = """ #ifdef _WIN32 #error Not supported on Windows #endif """ def entry(x,u): if defenv['TARGET_ARCH'] == 'x86': if x == 'NSISWinMainNOCRT': x = '_' + x elif x == 'DllMain': x = '_DllMain@12' return '-Wl,-e%s' % x defenv['ENTRY_FLAG'] = entry defenv['MAP_FLAG'] = '-Wl,-Map,${TARGET.base}.map' defenv['EXCEPTION_FLAG'] = '' defenv['NODEFLIBS_FLAG'] = '-nostdlib -Wl,--exclude-libs,msvcrt.a' defenv['C_FLAG'] = '-xc' defenv['CPP_FLAG'] = '-xc++' defenv['ALIGN_FLAG'] = '-Wl,--file-alignment,512' defenv['CPP_REQUIRES_STDLIB'] = 1 defenv['SUBSYS_CON'] = '-Wl,--subsystem,console' defenv['SUBSYS_WIN'] = '-Wl,--subsystem,windows' defenv['MSVCRT_FLAG'] = '' defenv['STDCALL'] = '"__attribute__((__stdcall__))"' # Don't allow mingw to link with LIBGCC*.DLL and LIBSTDC++-*.DLL def configure_static_libs(env): env.Append(LINKFLAGS = ['-static-libgcc']) env.Append(LINKFLAGS = ['-static-libstdc++']) # MinGW GCC 4.5.2 warns about unrecognized option but it also actually needs it! if defenv['PLATFORM'] == 'win32': configure_static_libs(defenv) ### defines defenv.Append(CPPDEFINES = [('NSISCALL', '$STDCALL')]) ### helper functions # on Mac OS X, programs built with g++ 4.0, stl and -s error out: # dyld: lazy symbol binding failed: lazy pointer not found # dyld: lazy pointer not found # # to avoid this, this function checks if -s works def TestStrip(ctx): c = """ #include int main() { std::vector v; return 0; } """ ctx.CheckLinkFlag('-s', run = 1, extension = '.cpp', code = c) ### debug if defenv['DEBUG']: defenv.Append(CCFLAGS = '-g') ### unicode tdefenv = defenv.Clone() if tdefenv['UNICODE']: tdefenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### stub environment stub_env = defenv.Clone() cross_env(stub_env) stub_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if not defenv['DEBUG']: stub_env.Append(CCFLAGS = ['-Os']) # optimize for size stub_env.Append(CCFLAGS = ['-Wall']) # all warnings stub_env.Append(CCFLAGS = ['-xc']) # force compile as c stub_env.Append(CCFLAGS = ['-fno-strict-aliasing']) # not safe for strict aliasing if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_W32']: stub_env.Append(LINKFLAGS = ['-s']) # strip stub_env.Append(LINKFLAGS = ['-mwindows']) # build windows executables stub_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file conf = FlagsConfigure(stub_env) conf.CheckCompileFlag('-fno-tree-loop-distribute-patterns') # GCC 10: Don't generate msvcrt!memmove calls (bug #1248) conf.CheckLinkFlag('-Wl,--disable-reloc-section') # binutils 2.36, ld will include a .reloc section by default (bug #1283) conf.Finish() stub_env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no standard libraries stub_uenv = stub_env.Clone() stub_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### makensis environment makensis_env = tdefenv.Clone() makensis_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if not defenv['DEBUG']: makensis_env.Append(CCFLAGS = ['-O2']) # optimize makensis_env.Append(CFLAGS = ['-Wall']) # all warnings makensis_env.Append(CXXFLAGS = ['-Wno-non-virtual-dtor']) # ignore virtual dtor warnings makensis_env.Append(CXXFLAGS = ['-Wall']) # all warnings makensis_env['STDCALL'] = '' # avoid warnings conf = FlagsConfigure(makensis_env) conf.CheckLinkFlag('$MAP_FLAG') # generate map file if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_CP']: TestStrip(conf) # strip conf.Finish() ### plugin environment plugin_env = defenv.Clone() cross_env(plugin_env) if not defenv['DEBUG']: plugin_env.Append(CCFLAGS = ['-Os']) # optimize for size plugin_env.Append(CCFLAGS = ['-Wall']) # level 3 warnings plugin_env.Append(CCFLAGS = ['-fno-strict-aliasing']) # not safe for strict aliasing if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_W32']: plugin_env.Append(LINKFLAGS = ['-s']) # strip plugin_env.Append(LINKFLAGS = ['-mwindows']) # build windows executables plugin_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align plugin_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file configure_static_libs(plugin_env) # remove libgcc*.dll & libstdc++*.dll dependency plugin_uenv = plugin_env.Clone() plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### cross-platform util environment if defenv['PLATFORM'] == 'win32': cp_util_env = tdefenv.Clone() else: cp_util_env = defenv.Clone() cp_util_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if cp_util_env['PLATFORM'] == 'win32': cp_util_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align if not defenv['DEBUG']: cp_util_env.Append(CCFLAGS = ['-O2']) # optimize cp_util_env.Append(CCFLAGS = ['-Wall']) # all warnings cp_util_env.Append(CCFLAGS = ['-fno-strict-aliasing']) # not safe for strict aliasing conf = FlagsConfigure(cp_util_env) conf.CheckLinkFlag('$MAP_FLAG') # generate map file conf.Finish() ### util environment util_env = tdefenv.Clone() cross_env(util_env) util_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if not defenv['DEBUG']: util_env.Append(CCFLAGS = ['-O2']) # optimize util_env.Append(CCFLAGS = ['-Wall']) # all warnings util_env.Append(CCFLAGS = ['-fno-strict-aliasing']) # not safe for strict aliasing util_env.Append(LINKFLAGS = ['-mwindows']) # build windows executables util_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align conf = FlagsConfigure(util_env) if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_W32']: util_env.Append(LINKFLAGS = ['-s']) # strip conf.Finish() ### cross-platform util environment adjustments conf = FlagsConfigure(cp_util_env) if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_CP']: TestStrip(conf) # strip conf.Finish() ### test environment test_env = defenv.Clone() test_env['STDCALL'] = '' # avoid warnings test_env.Append(CPPPATH = ['#$BUILD_CONFIG']) conf = FlagsConfigure(test_env) conf.Finish() ### weird GCC requirements # # GCC puts new PE sections, added by code, between other sections. # This is not good for the .ndata section because makensis changes # its size dynamically. This is not good if RVAs to sections below # it are saved in other places. The RVAs will point to garbage. # # To fix this, a linker script is provided. The linker script makes # sure the sections will be written in the correct order. # petype = 'pei-i386' if defenv['TARGET_ARCH'] == 'amd64': petype = 'pei-x86-64' stub_env.Append(LINKFLAGS = ['-B', petype]) # --oformat petype also works in GCC 4.5.2 stub_uenv.Append(LINKFLAGS = ['-B', petype]) stub_env.Append(LINKFLAGS = ['-T', File('linker_script').rfile()]) stub_uenv.Append(LINKFLAGS = ['-T', File('linker_script').rfile()]) # # GCC requires some functions from the CRT to be present, if certain # operations are done. For example, if a small string is assigned to # a larger buffer, GCC 3.4+ uses memset to fill the remaining of the # buffer with zeros. # def check_requirement(ctx, func, trigger): ctx.Message('Checking for %s requirement... ' % func) flags = ctx.env['LINKFLAGS'] ctx.env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) codeprepend = """ #define CONFCHECK_CALLFUNC() check static int check() { %s } """ % trigger Import('GenerateTryLinkCode') code = GenerateTryLinkCode(codeprepend = codeprepend) result = not ctx.TryLink(code, '.c') ctx.Result(result) ctx.env['LINKFLAGS'] = flags return result def add_file_to_emitter(env, emitter_name, file): try: original_emitter = env[emitter_name] if type(original_emitter) == list: original_emitter = original_emitter[0] except KeyError: original_emitter = None def emitter(target, source, env): if original_emitter: target, source = original_emitter(target, source, env) if '$NODEFLIBS_FLAG' not in env['LINKFLAGS']: return target, source return target, source + [file] env[emitter_name] = emitter def add_file(file): file = File(file) add_file_to_emitter(stub_env, 'PROGEMITTER', file) add_file_to_emitter(util_env, 'PROGEMITTER', file) add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file) add_file_to_emitter(stub_uenv, 'PROGEMITTER', file) add_file_to_emitter(plugin_uenv, 'SHLIBEMITTER', file) cenv = defenv.Clone() cross_env(cenv) conf = cenv.Configure(custom_tests = { 'CheckRequirement' : check_requirement }) memcpy_test = """ struct s { char c[128]; } t = { "test" }; // gcc 3 char a[] = {'/', 'F', 'I' ,'L', 'L', 'S', 'C', 'R', 'E', 'E', 'N', 0}; // gcc 4 int i; for (i = 0; i < 100; i++) i += a[i % sizeof(a)] ^ t.c[i]; // avoid a and t being optimized out return i; """ memset_test = """ char c[128] = "test"; c[0] = '6'; // avoid c being optimized out return c[1]; // avoid c being optimized out """ if conf.CheckRequirement('memcpy', memcpy_test): add_file('memcpy.c') if conf.CheckRequirement('memset', memset_test): add_file('memset.c') conf.Finish() # # Some platforms, like FreeBSD, require -pthread flag to be passed # instead of -lpthread. # conf = FlagsConfigure(makensis_env) conf.CheckLinkFlag('-pthread', codeprepend = code_failonmswin) conf.Finish() # # GCC doesn't define __BIG_ENDIAN__ or __LITTLE_ENDIAN__, so manually check # for the endianness and define __BIG_ENDIAN__ if needed. # def check_big_endian(ctx): ctx.Message('Checking for __BIG_ENDIAN__... ') test = """ int main() { #ifdef __BIG_ENDIAN__ // already defined, no need to define again return 0; #else int i = 1; char *c = (char *) &i; return c[0] != 1; #endif } """ result = not ctx.TryRun(test, '.c')[0] ctx.Result(result) return result conf = defenv.Configure(custom_tests = { 'CheckBigEndian' : check_big_endian }) if conf.CheckBigEndian(): makensis_env.Append(CPPDEFINES = ['__BIG_ENDIAN__']) test_env.Append(CPPDEFINES = ['__BIG_ENDIAN__']) conf.Finish() if makensis_env['PLATFORM'] == 'hpux': makensis_env.Append(CPPDEFINES = ['NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS']) makensis_conf = makensis_env.Configure() makensis_conf.CheckLib("unalign") makensis_conf.CheckLib("hppa") makensis_conf.Finish() ### print version info stub_env.Execute('$CC --version') makensis_env.Execute('$CXX --version') ### return Return('stub_env makensis_env plugin_env util_env cp_util_env test_env stub_uenv plugin_uenv') nsis-3.11/SCons/Config/hpc++000077500000000000000000000061351477201124000154750ustar00rootroot00000000000000print("Using hpc++ tools configuration") Import('defenv') ### flags defenv['ENTRY_FLAG'] = lambda x,u: '' defenv['MAP_FLAG'] = '' defenv['EXCEPTION_FLAG'] = '' defenv['NODEFLIBS_FLAG'] = '' defenv['C_FLAG'] = '' defenv['CPP_FLAG'] = '' defenv['CPP_REQUIRES_STDLIB'] = 0 defenv['SUBSYS_CON'] = '' defenv['SUBSYS_WIN'] = '' defenv['MSVCRT_FLAG'] = '' defenv['STDCALL'] = '' ### defines defenv.Append(CPPDEFINES = [('NSISCALL', '$STDCALL')]) ### unicode tdefenv = defenv.Clone() if tdefenv['UNICODE']: tdefenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### stub environment stub_env = defenv.Clone() stub_env.Append(CPPPATH = ['#$BUILD_CONFIG']) stub_uenv = stub_env.Clone() stub_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### makensis environment makensis_env = tdefenv.Clone() makensis_env.Append(CPPPATH = ['#$BUILD_CONFIG']) ### use "$CXX -Ae" as the "$CC" compiler to build makensis makensis_env['CC'] = makensis_env['CXX'] makensis_env.Append(CFLAGS = ['-Ae']) ### required to build makensis makensis_env.Append(LINKFLAGS = ['-AA']) makensis_env.Append(LINKFLAGS = ['+DD32']) makensis_env.Append(LINKFLAGS = ['-mt']) makensis_env.Append(CXXFLAGS = ['-AA']) makensis_env.Append(CCFLAGS = ['+DD32']) makensis_env.Append(CCFLAGS = ['-mt']) ### debug for makensis if makensis_env['DEBUG']: makensis_env.Append(CCFLAGS = ['-g']) makensis_env.Append(LINKFLAGS = ['-g']) ### strip for makensis if not makensis_env['DEBUG'] and makensis_env['STRIP']: makensis_env.Append(LINKFLAGS = ['-s']) # # aCC defines _BIG_ENDIAN, but we use __BIG_ENDIAN__ so check and define as # needed (is there any HPUX that is NOT big endian?). # def check_big_endian(ctx): ctx.Message('Checking for if this is a big endian host... ') test = """ #define LITTLE_ENDIAN 0 #define BIG_ENDIAN 1 #define UNKNOWN 2 int main() { union { short s; char c[sizeof(short)]; } u; u.s = 0x0102; if (sizeof(short) == 2) { if (u.c[0] == 1 && u.c[1] == 2) return (BIG_ENDIAN); else if (u.c[0] == 2 && u.c[1] == 1) return (LITTLE_ENDIAN); else return(UNKNOWN); } else { return (sizeof(short)); } } """ result = not ctx.TryRun(test, '.c')[0] ctx.Result(result) return result makensis_conf = makensis_env.Configure(custom_tests = { 'CheckBigEndian' : check_big_endian }) if makensis_conf.CheckBigEndian(): makensis_env.Append(CPPDEFINES = ['__BIG_ENDIAN__']) if makensis_env['PLATFORM'] == 'hpux': makensis_env.Append(CPPDEFINES = ['NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS']) makensis_conf.CheckLib("unalign") makensis_conf.CheckLib("hppa") makensis_conf.Finish() ### plugin environment plugin_env = defenv.Clone(no_import_lib = 1) plugin_uenv = plugin_env.Clone() plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### util environment util_env = tdefenv.Clone() ### cross-platform util environment cp_util_env = tdefenv.Clone() cp_util_env.Append(CPPPATH = ['#$BUILD_CONFIG']) ### test environment test_env = defenv.Clone() test_env.Append(CPPPATH = ['#$BUILD_CONFIG']) # return Return('stub_env makensis_env plugin_env util_env cp_util_env test_env stub_uenv plugin_uenv') nsis-3.11/SCons/Config/linker_script000077500000000000000000000116131477201124000174420ustar00rootroot00000000000000/* OUTPUT_FORMAT(pei-i386 VS pei-x86-64) must be set somewhere else */ SECTIONS { .text __image_base__ + __section_alignment__ : { *(.init) *(.text) *(SORT(.text$*)) *(.glue_7t) *(.glue_7) ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; LONG (-1); *(EXCLUDE_FILE (*crtend.o) .ctors); *(.ctor); *(SORT(.ctors.*)); *crtend.o (.ctors); LONG (0); ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; LONG (-1); *(EXCLUDE_FILE (*crtend.o) .dtors); *(.dtor); *(SORT(.dtors.*)); *crtend.o (.dtors); LONG (0); *(.fini) /* ??? Why is .gcc_exc here? */ *(.gcc_exc) PROVIDE (etext = .); *(.gcc_except_table) } /* The Cygwin32 library uses a section to avoid copying certain data on fork. This used to be named ".data". The linker used to include this between __data_start__ and __data_end__, but that breaks building the cygwin32 dll. Instead, we name the section ".data_cygwin_nocopy" and explicitly include it after __data_end__. */ .data BLOCK(__section_alignment__) : { __data_start__ = . ; *(.data) *(.data2) *(SORT(.data$*)) __data_end__ = . ; *(.data_cygwin_nocopy) } .rdata BLOCK(__section_alignment__) : { *(.rdata) *(SORT(.rdata$*)) *(.eh_frame) ___RUNTIME_PSEUDO_RELOC_LIST__ = .; __RUNTIME_PSEUDO_RELOC_LIST__ = .; *(.rdata_runtime_pseudo_reloc) ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .; __RUNTIME_PSEUDO_RELOC_LIST_END__ = .; } .pdata BLOCK(__section_alignment__) : { *(.pdata) } .bss BLOCK(__section_alignment__) : { __bss_start__ = . ; *(.bss) *(COMMON) __bss_end__ = . ; } .edata BLOCK(__section_alignment__) : { *(.edata) } /DISCARD/ : { *(.debug$S) *(.debug$T) *(.debug$F) *(.drectve) } .idata BLOCK(__section_alignment__) : { /* This cannot currently be handled with grouped sections. See pe.em:sort_sections. */ SORT(*)(.idata$2) SORT(*)(.idata$3) /* These zeroes mark the end of the import list. */ LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); SORT(*)(.idata$4) SORT(*)(.idata$5) SORT(*)(.idata$6) SORT(*)(.idata$7) } .CRT BLOCK(__section_alignment__) : { ___crt_xc_start__ = . ; *(SORT(.CRT$XC*)) /* C initialization */ ___crt_xc_end__ = . ; ___crt_xi_start__ = . ; *(SORT(.CRT$XI*)) /* C++ initialization */ ___crt_xi_end__ = . ; ___crt_xl_start__ = . ; *(SORT(.CRT$XL*)) /* TLS callbacks */ /* ___crt_xl_end__ is defined in the TLS Directory support code */ ___crt_xp_start__ = . ; *(SORT(.CRT$XP*)) /* Pre-termination */ ___crt_xp_end__ = . ; ___crt_xt_start__ = . ; *(SORT(.CRT$XT*)) /* Termination */ ___crt_xt_end__ = . ; } .tls BLOCK(__section_alignment__) : { ___tls_start__ = . ; *(.tls) *(.tls$) *(SORT(.tls$*)) ___tls_end__ = . ; } .endjunk BLOCK(__section_alignment__) : { /* end is deprecated, don't use it */ PROVIDE (end = .); PROVIDE ( _end = .); __end__ = .; } .ndata BLOCK(__section_alignment__) : { *(.ndata) } .rsrc BLOCK(__section_alignment__) : { *(.rsrc) *(SORT(.rsrc$*)) } .reloc BLOCK(__section_alignment__) : { *(.reloc) } .stab BLOCK(__section_alignment__) (NOLOAD) : { *(.stab) } .stabstr BLOCK(__section_alignment__) (NOLOAD) : { *(.stabstr) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section. Unlike other targets that fake this by putting the section VMA at 0, the PE format will not allow it. */ /* DWARF 1.1 and DWARF 2. */ .debug_aranges BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_aranges) } .debug_pubnames BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_pubnames) } /* DWARF 2. */ .debug_info BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_info) *(.gnu.linkonce.wi.*) } .debug_abbrev BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_abbrev) } .debug_line BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_line) } .debug_frame BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_frame) } .debug_str BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_str) } .debug_loc BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_loc) } .debug_macinfo BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions. */ .debug_weaknames BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_weaknames) } .debug_funcnames BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_funcnames) } .debug_typenames BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_typenames) } .debug_varnames BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_varnames) } /* DWARF 3. */ .debug_ranges BLOCK(__section_alignment__) (NOLOAD) : { *(.debug_ranges) } } nsis-3.11/SCons/Config/memcpy.c000077500000000000000000000003151477201124000163020ustar00rootroot00000000000000#include // for size_t void *memcpy(void *out, const void *in, size_t len) { char *c_out=(char*)out; char *c_in=(char *)in; while (len-- > 0) { *c_out++=*c_in++; } return out; } nsis-3.11/SCons/Config/memset.c000077500000000000000000000007151477201124000163060ustar00rootroot00000000000000#include // for size_t void *memset(void *mem, int c, size_t len) { /* ** Prevent MSVC 14.00.40310.41-AMD64 from generating a recursive call to memset ** ** #pragma optimize("", off) + #pragma optimize("ty", on) can also ** be used but it generates a lot more code. */ #if defined(_MSC_VER) && _MSC_VER > 1200 && _MSC_FULL_VER <= 140040310 volatile #endif char *p=(char*)mem; while (len-- > 0) { *p++=c; } return mem; } nsis-3.11/SCons/Config/ms000077500000000000000000000242361477201124000152160ustar00rootroot00000000000000Import('defenv') print("Using Microsoft tools configuration (%s)" % defenv.get('MSVS_VERSION','')) ### flags import SCons if SCons.__version__ == '1.3.0': # workaround for http://scons.tigris.org/issues/show_bug.cgi?id=2614 # force inclusion of Platform SDK, sometimes ignored by SCons 1.3.0 due to environment contamination defenv.Tool('mssdk') def entry(x,u): if x == 'WinMain' and u: x = 'w' + x return '/entry:' + x defenv['ENTRY_FLAG'] = entry defenv['MAP_FLAG'] = '/map' defenv['NODEFLIBS_FLAG'] = '/NODEFAULTLIB' defenv['C_FLAG'] = '/TC' defenv['CPP_FLAG'] = '/TP' defenv['CPP_REQUIRES_STDLIB'] = 0 defenv['SUBSYS_CON'] = '/subsystem:console' defenv['SUBSYS_WIN'] = '/subsystem:windows' defenv['MSVCRT_FLAG'] = '/MD' defenv['MSVCRT_NEEDSMANIFEST'] = False defenv['STDCALL'] = '__stdcall' msvs_version = float(defenv['MSVS_VERSION'].replace('Exp','')) if msvs_version >= 8.0: defenv['EXCEPTION_FLAG'] = '/EHsc' defenv.Append(CCFLAGS = ['/GS-']) defenv.Append(CPPDEFINES = ['_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS', '_CRT_SECURE_NO_DEPRECATE', '_CRT_NON_CONFORMING_SWPRINTFS']) defenv['MSVCRT_FLAG'] = '/MT' # Avoid msvcr?0.dll dependency else: defenv['EXCEPTION_FLAG'] = '/GX' if msvs_version < 10.0: # not even /ALIGN:512 works for vc10... fails to load process defenv.Append(LINKFLAGS = ['/opt:nowin98']) if defenv['MSTOOLKIT'] and msvs_version < 8.0: defenv['MSVCRT_FLAG'] = '/ML' # TK2003 does not have all libs if msvs_version >= 11.0: defenv['SUBSYS_CON'] = '/subsystem:console,5.01' # support windows xp defenv['SUBSYS_WIN'] = '/subsystem:windows,5.01' # support windows xp def setoptimizeflags(env): if not env['DEBUG']: env.Append(CCFLAGS = ['/Gy']) env.Append(LINKFLAGS = ['/OPT:REF']) env.Append(LINKFLAGS = ['/OPT:ICF,9']) #if msvs_version >= 7.0: # env.Append(CCFLAGS = ['/GL']) # FIXME: Creates problems with memset in VS v8.0 (CL v14.00) # env.Append(LINKFLAGS = ['/LTCG']) return ### defines defenv.Append(CPPDEFINES = [('NSISCALL', '$STDCALL')]) ### asm if 'x86' in defenv.get('TARGET_ARCH','x86'): defenv.Append(ASFLAGS = ['/coff']) # ML64 does not support /coff ### debug if defenv['DEBUG']: defenv.Append(CCFLAGS = ['/Zi']) defenv.Append(CCFLAGS = ['/Fd${TARGET.dir}\\${TARGET.dir.file}.pdb']) defenv.Append(LINKFLAGS = ['/debug']) defenv['MSVCRT_FLAG'] = defenv['MSVCRT_FLAG'] + 'd' elif msvs_version >= 14.0 or defenv['TARGET_ARCH'] == 'arm64': defenv.Append(LINKFLAGS = ['/nocoffgrpinfo']) ### workarounds # Some Platform SDK version includes a bad version of libcp.lib. # if stl usage causes link failure, copy the good libcp.lib # from one of the other lib folders and use it instead. confenv = defenv.Clone() conf = confenv.Configure() # For VS 2005 and up, the single threaded version of C runtime # need not be explicitly linked. if float(defenv['MSVS_VERSION'].replace('Exp','')) < 8.0: libcptest = """ #include int main() { // %s std::ofstream header("test", std::ofstream::out); return 0; } """ conf.env.Prepend(LIBPATH = Dir('#/.sconf_temp').abspath) conf.env.Append(CCFLAGS = ['$EXCEPTION_FLAG']) if not conf.TryLink(libcptest % 'no change', '.cpp'): import os, shutil libdirs = (defenv['ENV']['LIB']).split(os.pathsep) + defenv['LIBPATH'] for libdir in libdirs: libdir = confenv.subst(libdir) try: libcp = r'%s\libcp.lib' % libdir shutil.copy(libcp, Dir('#/.sconf_temp').abspath) if conf.TryLink(libcptest % (r'using %s' % libcp), '.cpp'): defenv.PrependENVPath('LIB', Dir('#/.sconf_temp').abspath) break except IOError: continue else: print("*** Couldn't find a good version of libcp.lib") Exit(2) conf.Finish() # Linking to msvcr?0.dll (/MD) might require a manifest confenv = defenv.Clone() conf = confenv.Configure() if msvs_version >= 7.0: conf.env.Append(CCFLAGS = [defenv['MSVCRT_FLAG']]) code = """ #include int main() { return atoi("0"); } """ result = True # TryLink should not fail but default to True just in case so distribution will fail as well if conf.TryLink(code, '.cpp'): import os result = os.path.exists('%s.manifest' % conf.lastTarget) defenv['MSVCRT_NEEDSMANIFEST'] = result conf.Finish() # SCons 3.0.5 started including /nologo for rc.exe but it's not always supported confenv = defenv.Clone() conf = confenv.Configure() if not conf.TryAction('$RCCOM', '', '.rc')[0]: defenv['RCFLAGS'] = '' conf.Finish() ### unicode tdefenv = defenv.Clone() if tdefenv['UNICODE']: tdefenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### stub environment stub_env = defenv.Clone() setoptimizeflags(stub_env) stub_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if not defenv['DEBUG']: stub_env.Append(CCFLAGS = ['/O1']) # optimize for size stub_env.Append(CCFLAGS = ['/W3']) # level 3 warnings stub_env.Append(CCFLAGS = ['/FAcs']) # full listing files stub_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name stub_env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no default libraries stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file if msvs_version >= 10.0: if stub_env['TARGET_ARCH'] != 'arm64': # LNK1246: '/FIXED' not compatible with 'ARM64' target machine stub_env.Append(LINKFLAGS = ['/FIXED']) # no relocations that our resource editor ignores stub_uenv = stub_env.Clone() stub_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### makensis environment makensis_env = tdefenv.Clone() makensis_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if not defenv['DEBUG']: makensis_env.Append(CCFLAGS = ['/O2']) # optimize for speed makensis_env.Append(CCFLAGS = ['$EXCEPTION_FLAG']) # enable exceptions makensis_env.Append(CCFLAGS = ['/W3']) # level 3 warnings makensis_env.Append(CCFLAGS = ['/FAcs']) # full listing files makensis_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name makensis_env.Append(CCFLAGS = [defenv['MSVCRT_FLAG']]) makensis_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file makensis_env.Append(LINKFLAGS = ['$SUBSYS_CON']) # console executable if defenv['UNICODE']: makensis_env.Append(LINKFLAGS = ['/STACK:2097152']) # need 2 MB of stack in Unicode (default is 1 MB) ### plugin environment plugin_env = defenv.Clone(no_import_lib = 1) setoptimizeflags(plugin_env) if defenv['TARGET_ARCH'] == 'amd64': plugin_env.Append(LINKFLAGS = ['/MACHINE:AMD64']) # Contrib\System\Resource will not link without this if not defenv['DEBUG']: plugin_env.Append(CCFLAGS = ['/O1']) # optimize for size plugin_env.Append(CCFLAGS = ['/W3']) # level 3 warnings plugin_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file plugin_uenv = plugin_env.Clone() plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE']) ### util environment util_env = tdefenv.Clone() setoptimizeflags(util_env) if not defenv['DEBUG']: util_env.Append(CCFLAGS = ['/O1']) # optimize for speed util_env.Append(CCFLAGS = ['/W3']) # level 3 warnings util_env.Append(CCFLAGS = [defenv['MSVCRT_FLAG']]) util_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file ### cross-platform util environment cp_util_env = util_env.Clone() cp_util_env.Append(CPPPATH = ['#$BUILD_CONFIG']) ### test environment test_env = defenv.Clone() test_env.Append(CPPPATH = ['#$BUILD_CONFIG']) ### weird compiler requirements def check_requirement(ctx, func, trigger): ctx.Message('Checking for %s requirement... ' % func) flags = ctx.env['LINKFLAGS'] ctx.env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) ctx.env.Append(LINKFLAGS = ['/entry:main']) test = """ int main() { %s return 0; } """ % trigger result = not ctx.TryLink(test, '.c') ctx.Result(result) ctx.env['LINKFLAGS'] = flags return result def add_file_to_emitter(env, emitter_name, file, obj_name=None): if obj_name is None: obj_name = emitter_name try: original_emitter = env[emitter_name] if type(original_emitter) == list: original_emitter = original_emitter[0] except KeyError: original_emitter = None def emitter(target, source, env): if original_emitter: target, source = original_emitter(target, source, env) if '$NODEFLIBS_FLAG' not in env['LINKFLAGS']: return target, source return target, source + env.Object(obj_name, file) env[emitter_name] = emitter def add_file(file, obj_name=None): file = File(file) add_file_to_emitter(stub_env, 'PROGEMITTER', file, obj_name) add_file_to_emitter(stub_uenv, 'PROGEMITTER', file, obj_name) add_file_to_emitter(util_env, 'PROGEMITTER', file, obj_name) add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file, obj_name) add_file_to_emitter(plugin_uenv, 'SHLIBEMITTER', file, obj_name) # # MSVC 6 SP6 doesn't like direct shifting of 64-bit integers. # It generates a call to ___aullshr which requires libc, which # we don't like. However, it does agree to work properly with # a call to Int64ShrlMod32. # conf = stub_env.Configure() conf.env.Append(LINKFLAGS = ['/entry:WinMain']) int64test = """ #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow) { ULARGE_INTEGER *i = 0; return (int)(i->QuadPart >> 10); } """ if not conf.TryLink(int64test, '.c'): stub_env.Append(CPPDEFINES = ['_NSIS_NO_INT64_SHR']) stub_uenv.Append(CPPDEFINES = ['_NSIS_NO_INT64_SHR']) conf.Finish() # # MSVC 2005 requires the memset CRT function to be present # and the stubs might need memcpy (entry struct copy on x64) # BUGBUG: The tests are currently broken on x64 and designed to fail! # conf = defenv.Configure(custom_tests = { 'CheckRequirement' : check_requirement }) if conf.CheckRequirement('memset', 'char c[128] = "test";switch(sizeof(void*)){case 8:break;case sizeof(void*):return 1;}'): add_file('memset.c', 'memset') memcpy_test = """ switch(sizeof(void*)){case 8:break;case sizeof(void*):return 1;} """ if conf.CheckRequirement('memcpy', memcpy_test): add_file('memcpy.c', 'memcpy') stub_env.Append(CPPDEFINES = ['_NSIS_NODEFLIB_CRTMEMCPY']) stub_uenv.Append(CPPDEFINES = ['_NSIS_NODEFLIB_CRTMEMCPY']) conf.Finish() ### return Return('stub_env makensis_env plugin_env util_env cp_util_env test_env stub_uenv plugin_uenv') nsis-3.11/SCons/Tools/000077500000000000000000000000001477201124000145355ustar00rootroot00000000000000nsis-3.11/SCons/Tools/crossmingw.py000077500000000000000000000155561477201124000173210ustar00rootroot00000000000000"""SCons.Tool.gcc Tool-specific initialization for MinGW (http://www.mingw.org/) There normally shouldn't be any need to import this module directly. It will usually be imported through the generic SCons.Tool.Tool() selection method. """ # # Copyright (c) 2001, 2002, 2003, 2004 The SCons Foundation # # 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. # __revision__ = "/home/scons/scons/branch.0/branch.96/baseline/src/engine/SCons/Tool/mingw.py 0.96.90.D001 2005/02/15 20:11:37 knight" import os import os.path import string import SCons.Action import SCons.Builder import SCons.Tool import SCons.Util # This is what we search for to find mingw: prefixes32 = SCons.Util.Split(""" mingw32- mingw32msvc- i386-mingw32- i486-mingw32- i586-mingw32- i686-mingw32- i386-mingw32msvc- i486-mingw32msvc- i586-mingw32msvc- i686-mingw32msvc- i386-pc-mingw32- i486-pc-mingw32- i586-pc-mingw32- i686-pc-mingw32- i386-w64-mingw32- i486-w64-mingw32- i586-w64-mingw32- i686-w64-mingw32- """) prefixes64 = SCons.Util.Split(""" x86_64-w64-mingw32- """) def find(env): # Explicitly specified toolchain to build Windows executables # takes predominance. prefix = SCons.Script.ARGUMENTS.get('XGCC_W32_PREFIX', None) prefixes = prefixes32 if env['TARGET_ARCH'] == 'amd64': prefixes = prefixes64 if prefix: prefixes.insert(0, prefix) for prefix in prefixes: # First search in the SCons path and then the OS path: if env.WhereIs(prefix + 'gcc') or SCons.Util.WhereIs(prefix + 'gcc'): return prefix return '' def shlib_generator(target, source, env, for_signature): cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS']) dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') if dll: cmd.extend(['-o', dll]) cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS']) implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature)) def_target = env.FindIxes(target, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX') if def_target: cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature)) return [cmd] def shlib_emitter(target, source, env): dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') no_import_lib = env.get('no_import_lib', 0) if not dll: raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")) if not no_import_lib and \ not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'): # Append an import library to the list of targets. target.append(env.ReplaceIxes(dll, 'SHLIBPREFIX', 'SHLIBSUFFIX', 'LIBPREFIX', 'LIBSUFFIX')) # Append a def file target if there isn't already a def file target # or a def file source. There is no option to disable def file # target emitting, because I can't figure out why someone would ever # want to turn it off. def_source = env.FindIxes(source, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX') def_target = env.FindIxes(target, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX') if not def_source and not def_target: target.append(env.ReplaceIxes(dll, 'SHLIBPREFIX', 'SHLIBSUFFIX', 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')) return (target, source) shlib_action = SCons.Action.Action(shlib_generator, generator=1) res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') res_builder = SCons.Builder.Builder(action=res_action, suffix='.o', source_scanner=SCons.Tool.SourceFileScanner) SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan) def generate(env): mingw_prefix = find(env) if mingw_prefix: dir = os.path.dirname(env.WhereIs(mingw_prefix + 'gcc') or SCons.Util.WhereIs(mingw_prefix + 'gcc')) # The mingw bin directory must be added to the path: path = env['ENV'].get('PATH', []) if not path: path = [] if SCons.Util.is_String(path): path = str.split(path, os.pathsep) env['ENV']['PATH'] = str.join(os.pathsep, [dir] + path) # Most of mingw is the same as gcc and friends... gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas'] for tool in gnu_tools: SCons.Tool.Tool(tool)(env) #... but a few things differ: env['CC'] = mingw_prefix + 'gcc' env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') env['CXX'] = mingw_prefix + 'g++' env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') env['SHLINKCOM'] = shlib_action env.Append(SHLIBEMITTER = [shlib_emitter]) env['LINK'] = mingw_prefix + 'g++' env['AS'] = mingw_prefix + 'as' env['AR'] = mingw_prefix + 'ar' env['RANLIB'] = mingw_prefix + 'ranlib' env['WIN32DEFPREFIX'] = '' env['WIN32DEFSUFFIX'] = '.def' env['SHOBJSUFFIX'] = '.o' env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 env['RC'] = mingw_prefix + 'windres' env['RCFLAGS'] = SCons.Util.CLVar('') env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS ${INCPREFIX}${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET' env['BUILDERS']['RES'] = res_builder # Some setting from the platform also have to be overridden: env['OBJPREFIX'] = '' env['OBJSUFFIX'] = '.o' env['LIBPREFIX'] = 'lib' env['LIBSUFFIX'] = '.a' env['SHOBJPREFIX'] = '$OBJPREFIX' env['SHOBJSUFFIX'] = '$OBJSUFFIX' env['PROGPREFIX'] = '' env['PROGSUFFIX'] = '.exe' env['SHLIBPREFIX'] = '' env['SHLIBSUFFIX'] = '.dll' env['LIBPREFIXES'] = [ '$LIBPREFIX' ] env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ] def exists(env): return find(env) nsis-3.11/SCons/Tools/mstoolkit.py000077500000000000000000000324531477201124000171460ustar00rootroot00000000000000"""engine.SCons.Tool.mstoolkit.py Tool-specific initialization for Microsoft Visual C/C++ Toolkit Commandline There normally shouldn't be any need to import this module directly. It will usually be imported through the generic SCons.Tool.Tool() selection method. """ # Based on http://www.scons.org/cgi-bin/wiki/MicrosoftPlatform # # Copyright (c) 2004 John Connors # # 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 os.path import re import string import types import SCons.Action import SCons.Builder import SCons.Errors import SCons.Platform.win32 import SCons.Tool import SCons.Util import SCons.Warnings CSuffixes = ['.c', '.C'] CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++'] def get_msvctoolkit_paths(): """Return a 4-tuple of (INCLUDE, LIB, PATH, TOOLKIT) as the values of those three environment variables that should be set in order to execute the MSVC .NET tools properly, if the information wasn't available from the registry.""" MSToolkitDir = None paths = {} exe_path = '' lib_path = '' include_path = '' # First, we get the shell folder for this user: if not SCons.Util.can_read_reg: raise SCons.Errors.InternalError("No Windows registry module was found") # look for toolkit if 'VCToolkitInstallDir' in os.environ: MSToolkitDir = os.path.normpath(os.environ['VCToolkitInstallDir']) elif 'VCToolsInstallDir' in os.environ: MSToolkitDir = os.path.normpath(os.environ['VCToolsInstallDir']) else: raise SCons.Errors.InternalError("Microsoft Visual C++ Toolkit directory was not found in the `VCToolkitInstallDir` or `VCToolsInstallDir` environment variables.") # look for platform sdk if 'MSSdk' in os.environ: PlatformSDKDir = os.path.normpath(os.environ['MSSdk']) else: try: PlatformSDKDir = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\MicrosoftSDK\Directories\Install Dir')[0] PlatformSDKDir = str(PlatformSDKDir) except SCons.Util.RegError: try: PlatformSDKDir = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\MicrosoftSDK\InstalledSDKs\8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3\Install Dir')[0] PlatformSDKDir = str(PlatformSDKDir) except SCons.Util.RegError: raise SCons.Errors.InternalError("The Platform SDK directory was not found in the registry or in the `MSSdk` environment variable.") include_path = r'%s\include;%s\include' % (PlatformSDKDir, MSToolkitDir) lib_path = r'%s\lib;%s\lib' % (PlatformSDKDir, MSToolkitDir) exe_path = r'%s\bin;%s\bin\win95;%s\bin' % (MSToolkitDir, PlatformSDKDir, PlatformSDKDir) return (include_path, lib_path, exe_path, PlatformSDKDir) def validate_vars(env): """Validate the PDB, PCH, and PCHSTOP construction variables.""" if 'PCH' in env and env['PCH']: if not 'PCHSTOP' in env: raise SCons.Errors.UserError("The PCHSTOP construction must be defined if PCH is defined.") if not SCons.Util.is_String(env['PCHSTOP']): raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r" % env['PCHSTOP']) def pch_emitter(target, source, env): """Sets up the PDB dependencies for a pch file, and adds the object file target.""" validate_vars(env) pch = None obj = None for t in target: if SCons.Util.splitext(str(t))[1] == '.pch': pch = t if SCons.Util.splitext(str(t))[1] == '.obj': obj = t if not obj: obj = SCons.Util.splitext(str(pch))[0]+'.obj' target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work if 'PDB' in env and env['PDB']: env.SideEffect(env['PDB'], target) env.Precious(env['PDB']) return (target, source) def object_emitter(target, source, env, parent_emitter): """Sets up the PDB and PCH dependencies for an object file.""" validate_vars(env) parent_emitter(target, source, env) if 'PDB' in env and env['PDB']: env.SideEffect(env['PDB'], target) env.Precious(env['PDB']) if 'PCH' in env and env['PCH']: env.Depends(target, env['PCH']) return (target, source) def static_object_emitter(target, source, env): return object_emitter(target, source, env, SCons.Defaults.StaticObjectEmitter) def shared_object_emitter(target, source, env): return object_emitter(target, source, env, SCons.Defaults.SharedObjectEmitter) pch_builder = SCons.Builder.Builder(action='$PCHCOM', suffix='.pch', emitter=pch_emitter) res_builder = SCons.Builder.Builder(action='$RCCOM', suffix='.res') def pdbGenerator(env, target, source, for_signature): if target and 'PDB' in env and env['PDB']: return ['/PDB:%s'%target[0].File(env['PDB']).get_string(for_signature), '/DEBUG'] def win32ShlinkTargets(target, source, env, for_signature): listCmd = [] dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') if dll: listCmd.append("/out:%s"%dll.get_string(for_signature)) implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature)) return listCmd def win32ShlinkSources(target, source, env, for_signature): listCmd = [] deffile = env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX") for src in source: if deffile is not None and src == deffile: # Treat this source as a .def file. listCmd.append("/def:%s" % src.get_string(for_signature)) else: # Just treat it as a generic source file. listCmd.append(src) return listCmd def win32LibEmitter(target, source, env): # SCons.Tool.msvc.validate_vars(env) dll = env.FindIxes(target, "SHLIBPREFIX", "SHLIBSUFFIX") no_import_lib = env.get('no_import_lib', 0) if not dll: raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")) if env.get("WIN32_INSERT_DEF", 0) and \ not env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX"): # append a def file to the list of sources source.append(env.ReplaceIxes(dll, "SHLIBPREFIX", "SHLIBSUFFIX", "WIN32DEFPREFIX", "WIN32DEFSUFFIX")) if 'PDB' in env and env['PDB']: env.SideEffect(env['PDB'], target) env.Precious(env['PDB']) if not no_import_lib and \ not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"): # Append an import library to the list of targets. target.append(env.ReplaceIxes(dll, "SHLIBPREFIX", "SHLIBSUFFIX", "LIBPREFIX", "LIBSUFFIX")) # and .exp file is created if there are exports from a DLL target.append(env.ReplaceIxes(dll, "SHLIBPREFIX", "SHLIBSUFFIX", "WIN32EXPPREFIX", "WIN32EXPSUFFIX")) return (target, source) def prog_emitter(target, source, env): #SCons.Tool.msvc.validate_vars(env) if 'PDB' in env and env['PDB']: env.SideEffect(env['PDB'], target) env.Precious(env['PDB']) return (target,source) def RegServerFunc(target, source, env): if 'register' in env and env['register']: ret = regServerAction([target[0]], [source[0]], env) if ret: raise SCons.Errors.UserError("Unable to register %s" % target[0]) else: print("Registered %s successfully" % target[0]) return ret return 0 regServerAction = SCons.Action.Action("$REGSVRCOM") regServerCheck = SCons.Action.Action(RegServerFunc, None) shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $( $_LIBDIRFLAGS $) $_LIBFLAGS $_PDB $_SHLINK_SOURCES")}') compositeLinkAction = shlibLinkAction + regServerCheck def generate(env): """Add Builders and construction variables for MSVC++ to an Environment.""" static_obj, shared_obj = SCons.Tool.createObjBuilders(env) for suffix in CSuffixes: static_obj.add_action(suffix, SCons.Defaults.CAction) shared_obj.add_action(suffix, SCons.Defaults.ShCAction) for suffix in CXXSuffixes: static_obj.add_action(suffix, SCons.Defaults.CXXAction) shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) SCons.Tool.createStaticLibBuilder(env) SCons.Tool.createSharedLibBuilder(env) SCons.Tool.createProgBuilder(env) env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Zi /Fd%s"%File(PDB)) or ""}']) env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}']) env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET $CCPCHFLAGS $CCPDBFLAGS' env['CC'] = 'cl' env['CCFLAGS'] = SCons.Util.CLVar('/nologo') env['CCCOM'] = '$CC $CCFLAGS $CCCOMFLAGS' env['SHCC'] = '$CC' env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') env['SHCCCOM'] = '$SHCC $SHCCFLAGS $CCCOMFLAGS' env['CXX'] = '$CC' env['CXXFLAGS'] = SCons.Util.CLVar('$CCFLAGS $( /TP $)') env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS' env['SHCXX'] = '$CXX' env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS' env['CPPDEFPREFIX'] = '/D' env['CPPDEFSUFFIX'] = '' env['INCPREFIX'] = '/I' env['INCSUFFIX'] = '' env['OBJEMITTER'] = static_object_emitter env['SHOBJEMITTER'] = shared_object_emitter env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 env['RC'] = 'rc' env['RCFLAGS'] = SCons.Util.CLVar('') env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES' CScan = env.get_scanner('.c') if CScan: CScan.add_skey('.rc') env['BUILDERS']['RES'] = res_builder include_path, lib_path, exe_path, sdk_path = "", "", "", "" targ_arc = env.get('TARGET_ARCH', 'x86') if "None" == env.get('MSVC_USE_SCRIPT', '!'): for x in ['INCLUDE', 'LIB', 'PATH', 'CL', '_CL_', 'LINK', '_LINK_', 'ML']: env['ENV'][x] = "" if not env.WhereIs('cl', os.environ['PATH']): raise SCons.Errors.InternalError("CL not found in %s" % os.environ['PATH']) include_path = os.environ['INCLUDE'] lib_path = os.environ['LIB'] exe_path = os.environ['PATH'] sdk_path = env.WhereIs('windows.h', include_path, '.h') if not sdk_path: raise SCons.Errors.InternalError("windows.h not found in %s" % include_path) sdk_path = os.path.normpath(sdk_path + "\..\..") sdk_path_LINK = env.WhereIs('link', exe_path) sdk_path_AR = env.WhereIs('lib', exe_path) else: include_path, lib_path, exe_path, sdk_path = get_msvctoolkit_paths() if float(env['MSVS_VERSION']) < 7.0: # Override SConstruct default env['MSVS_VERSION'] = '7.1' sdk_path_LINK = env.WhereIs('link', exe_path) sdk_path_AR = sdk_path + '\\bin\\Win64\\lib.exe' env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) env.PrependENVPath('PATH', exe_path) # 'LIBPATH' = ? env['ENV']['CPU'] = (targ_arc.upper(), 'i386')['x86' in targ_arc.lower()] # AMD64/ARM64 or i386 env['ENV']['TARGETOS'] = 'BOTH' env['ENV']['APPVER'] = '4.0' env['ENV']['MSSDK'] = sdk_path env['ENV']['BkOffice'] = sdk_path env['ENV']['Basemake'] = sdk_path + "\\Include\\BKOffice.Mak" env['ENV']['INETSDK'] = sdk_path env['ENV']['MSSDK'] = sdk_path env['ENV']['MSTOOLS'] = sdk_path env['CFILESUFFIX'] = '.c' env['CXXFILESUFFIX'] = '.cc' env['PCHCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo${TARGETS[1]} /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS' env['BUILDERS']['PCH'] = pch_builder # VC 2003 Toolkit does not have lib.exe but we can use link.exe if not sdk_path_AR or not env.File(sdk_path_AR).exists(): env['AR'] = '"' + sdk_path_LINK + '"' env['ARFLAGS'] = '/LIB ' + env['ARFLAGS'] else: env['AR'] = '"' + sdk_path_AR + '"' env['ARFLAGS'] = SCons.Util.CLVar('/nologo') env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}" if 'AMD64' in targ_arc.upper(): env['AS'] = 'ml64' if 'ARM64' in targ_arc.upper(): env['AS'] = 'armasm64' env['SHLINK'] = '$LINK' env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll') env['_SHLINK_TARGETS'] = win32ShlinkTargets env['_SHLINK_SOURCES'] = win32ShlinkSources env['SHLINKCOM'] = compositeLinkAction env['SHLIBEMITTER']= win32LibEmitter env['LINK'] = '"' + sdk_path_LINK + '"' env['LINKFLAGS'] = SCons.Util.CLVar('/nologo') env['_PDB'] = pdbGenerator env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET $( $_LIBDIRFLAGS $) $_LIBFLAGS $_PDB $SOURCES")}' env['PROGEMITTER'] = prog_emitter env['LIBDIRPREFIX']='/LIBPATH:' env['LIBDIRSUFFIX']='' env['LIBLINKPREFIX']='' env['LIBLINKSUFFIX']='$LIBSUFFIX' env['WIN32DEFPREFIX'] = '' env['WIN32DEFSUFFIX'] = '.def' env['WIN32_INSERT_DEF'] = 0 env['WIN32EXPPREFIX'] = '' env['WIN32EXPSUFFIX'] = '.exp' env['REGSVRACTION'] = regServerCheck env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32') env['REGSVRFLAGS'] = '/s ' env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS $TARGET' def exists(env): return env.Detect('cl') nsis-3.11/SCons/config.py000077500000000000000000000260551477201124000152670ustar00rootroot00000000000000Import('defenv') ### Configuration options cfg = Variables() cfg.Add( ( 'NSIS_MAX_STRLEN', 'defines the maximum string length for internal variables and stack entries. 1024 should be plenty, but if you are doing crazy registry stuff, you might want to bump it up. Generally it adds about 16-32x the memory, so setting this to 4096 from 1024 will add around 64k of memory usage (not really a big deal, but not usually needed).', 1024 ) ) cfg.Add( ( 'NSIS_MAX_INST_TYPES', 'defines the maximum install types. Note that this should not exceed 32, ever.', 32 ) ) cfg.Add( ( 'NSIS_DEFAULT_LANG', 'defines the default language id NSIS will use if nothing else is defined in the script. Default value is 1033 which is English.', 1033 ) ) cfg.Add( ( 'NSIS_VARS_SECTION', 'defines the name of the PE section containing the runtime variables', '.ndata' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_UNINSTALL_SUPPORT', "enables the uninstaller support. Turn it off if your installers don't need uninstallers. Adds less than 1kb.", 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_LICENSEPAGE', 'enables support for the installer to present a license page.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_COMPONENTPAGE', 'enables support for the installer to present a page where you can select what sections are installed. with this disabled, all sections are installed by default', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE', 'enables an alternative components page behavior. Checkboxes will only be toggled when clicking on the checkbox itself and not on its label. .onMouseOverSection will only be called when the user selects the component and not when moving the mouse pointer over it.', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_SILENT_SUPPORT', 'enables support for making installers that are completely silent.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_VISIBLE_SUPPORT', 'enables support for making installers that are visible.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_ENHANCEDUI_SUPPORT', 'enables support for CreateFont, SetCtlColors (used by some UIs), SetBrandingImage, .onGUIInit, etc.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_COMPRESSION_SUPPORT', 'enables support for making installers that use compression (recommended).', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_COMPRESS_BZIP2_SMALLMODE', "if defined, bzip2's decompressor uses bzip2's alternative decompression method that uses less runtime memory, at the expense of speed (and executable size). not recommended.", 'no' ) ) cfg.Add( ( 'NSIS_COMPRESS_BZIP2_LEVEL', 'bzip2 compression window size. 1-9 is valid. 9 uses the most memory, but typically compresses best (recommended). 1 uses the least memory, but typically compresses the worst.', 9 ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_CRC_SUPPORT', 'enables support for installer verification. HIGHLY recommended.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_CRC_ANAL', 'makes the CRC verification extremely careful, meaning extra bytes on the end of file, or the first 512 bytes changing, will give error. Enable this if you are paranoid, otherwise leaving it off seems safe (and is less prone to reporting virii). If you will be digitally signing your installers, leave this off.', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_LOG', 'enables the logging facility. turning this on (by uncommenting it) adds about 4kb, but can be useful in debugging your installers.', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_LOG_ODS', 'makes the logging facility use OutputDebugString instead of a file.', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_LOG_STDOUT', 'makes the logging facility use stdout instead of a file.', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_LOG_TIMESTAMP', 'adds a timestamp to each log line.', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_BGBG', 'enables support for the blue (well, whatever color you want) gradient background window.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_CODECALLBACKS', 'enables support for installer code callbacks. recommended, as it uses a minimum of space and allows for neat functionality.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_MOVEONREBOOT', 'enables support for uninstallers that automatically delete themselves from the temp directory, as well as the reboot moving/deleting modes of Delete and Rename. Adds about 512 gay bytes..', 'yes' ) ) ### Instruction enabling configuration cfg.Add( BoolVariable( 'NSIS_SUPPORT_ACTIVEXREG', 'enables activeX plug-in registration and deregistration, as well as CallInstDLL', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_INTOPTS', 'enables support for IntCmp, IntCmpU, IntOp, and IntFmt.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_STROPTS', 'enables support for StrCmp, StrCpy, and StrLen, as well as Get*Local.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_STACK', 'enables support for the stack (Push, Pop, Exch)', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_FILEFUNCTIONS', 'enables support for FileOpen,FileClose, FileSeek, FileRead, and FileWrite.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_FINDFIRST', 'enables support for FindFirst, FindNext, and FindClose.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_CREATESHORTCUT', 'enables support for CreateShortcut.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_INIFILES', 'enables support for ReadINIStr and WriteINIStr.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_REGISTRYFUNCTIONS', 'enables support for ReadRegStr, ReadRegDWORD, WriteRegStr, etc etc etc.', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_COPYFILES', 'enables support for CopyFiles', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_REBOOT', 'enables support for Reboot, IfRebootFlag, SetRebootFlag', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_FNUTIL', 'enables support for GetFullPathName, GetTempFileName, and SearchPath', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_EXECUTE', 'enables support for Exec and ExecWait', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_SHELLEXECUTE', 'enables support for ExecShell', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_GETDLLVERSION', 'enables support for GetDLLVersion', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_GETFILETIME', 'enables support for GetFileTime', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_HWNDS', 'enables support for FindWindow, SendMessage, and IsWindow', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_ENVIRONMENT', 'enables support for ReadEnvStr and ExpandEnvStrings', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_RMDIR', 'enables support for RMDir', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_FILE', 'enables support for File (extracting files)', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_DELETE', 'enables support for Delete (delete files)', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_RENAME', 'enables support for Rename (rename files)', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_MESSAGEBOX', 'enables support for MessageBox', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_VERSION_INFO', 'enables support for version information in the installer', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_FIX_DEFINES_IN_STRINGS', 'fixes defines inside defines and handles chars $ perfectly', 'no' ) ) cfg.Add( BoolVariable( 'NSIS_SUPPORT_STANDARD_PREDEFINES', 'enables standard predefines - __FILE__, __LINE__, __DATE__, __TIME__ and __TIMESTAMP__', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_LOCKWINDOW_SUPPORT', 'enables the LockWindow command', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_PLUGIN_SUPPORT', 'enables installer plug-ins support', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_FIX_COMMENT_HANDLING', 'fixes comment handling', 'yes' ) ) cfg.Add( BoolVariable( 'NSIS_CONFIG_CONST_DATA_PATH', 'determines if plugins, includes, stubs etc. are located in a constant path set at build-time', defenv['PLATFORM'] != 'win32' ) ) ### Generate help Help(cfg.GenerateHelpText(defenv)) ### Apply configuration env = Environment() cfg.Update(env) def AddValuedDefine(define): defenv.Append(NSIS_CPPDEFINES = [(define, env[define])]) def AddBoolDefine(define): if env[define]: defenv.Append(NSIS_CPPDEFINES = [define]) def AddStringDefine(define): defenv.Append(NSIS_CPPDEFINES = [(define, '"%s"' % env[define])]) AddValuedDefine('NSIS_MAX_STRLEN') AddValuedDefine('NSIS_MAX_INST_TYPES') AddValuedDefine('NSIS_DEFAULT_LANG') AddBoolDefine('NSIS_CONFIG_UNINSTALL_SUPPORT') AddBoolDefine('NSIS_CONFIG_LICENSEPAGE') AddBoolDefine('NSIS_CONFIG_COMPONENTPAGE') AddBoolDefine('NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE') AddBoolDefine('NSIS_CONFIG_SILENT_SUPPORT') AddBoolDefine('NSIS_CONFIG_VISIBLE_SUPPORT') AddBoolDefine('NSIS_CONFIG_ENHANCEDUI_SUPPORT') AddBoolDefine('NSIS_CONFIG_COMPRESSION_SUPPORT') AddBoolDefine('NSIS_COMPRESS_BZIP2_SMALLMODE') AddValuedDefine('NSIS_COMPRESS_BZIP2_LEVEL') AddBoolDefine('NSIS_CONFIG_CRC_SUPPORT') AddBoolDefine('NSIS_CONFIG_CRC_ANAL') AddBoolDefine('NSIS_CONFIG_LOG') AddBoolDefine('NSIS_CONFIG_LOG_ODS') AddBoolDefine('NSIS_CONFIG_LOG_STDOUT') AddBoolDefine('NSIS_CONFIG_LOG_TIMESTAMP') AddBoolDefine('NSIS_SUPPORT_BGBG') AddBoolDefine('NSIS_SUPPORT_CODECALLBACKS') AddBoolDefine('NSIS_SUPPORT_MOVEONREBOOT') AddBoolDefine('NSIS_SUPPORT_ACTIVEXREG') AddBoolDefine('NSIS_SUPPORT_INTOPTS') AddBoolDefine('NSIS_SUPPORT_STROPTS') AddBoolDefine('NSIS_SUPPORT_STACK') AddBoolDefine('NSIS_SUPPORT_FILEFUNCTIONS') AddBoolDefine('NSIS_SUPPORT_FINDFIRST') AddBoolDefine('NSIS_SUPPORT_CREATESHORTCUT') AddBoolDefine('NSIS_SUPPORT_INIFILES') AddBoolDefine('NSIS_SUPPORT_REGISTRYFUNCTIONS') AddBoolDefine('NSIS_SUPPORT_COPYFILES') AddBoolDefine('NSIS_SUPPORT_REBOOT') AddBoolDefine('NSIS_SUPPORT_FNUTIL') AddBoolDefine('NSIS_SUPPORT_EXECUTE') AddBoolDefine('NSIS_SUPPORT_SHELLEXECUTE') AddBoolDefine('NSIS_SUPPORT_GETDLLVERSION') AddBoolDefine('NSIS_SUPPORT_GETFILETIME') AddBoolDefine('NSIS_SUPPORT_HWNDS') AddBoolDefine('NSIS_SUPPORT_ENVIRONMENT') AddBoolDefine('NSIS_SUPPORT_RMDIR') AddBoolDefine('NSIS_SUPPORT_FILE') AddBoolDefine('NSIS_SUPPORT_DELETE') AddBoolDefine('NSIS_SUPPORT_RENAME') AddBoolDefine('NSIS_SUPPORT_MESSAGEBOX') AddBoolDefine('NSIS_SUPPORT_VERSION_INFO') AddBoolDefine('NSIS_FIX_DEFINES_IN_STRINGS') AddBoolDefine('NSIS_SUPPORT_STANDARD_PREDEFINES') AddBoolDefine('NSIS_LOCKWINDOW_SUPPORT') AddBoolDefine('NSIS_CONFIG_PLUGIN_SUPPORT') AddBoolDefine('NSIS_FIX_COMMENT_HANDLING') AddBoolDefine('NSIS_CONFIG_CONST_DATA_PATH') AddStringDefine('NSIS_VARS_SECTION') nsis-3.11/SCons/utils.py000077500000000000000000000225241477201124000151570ustar00rootroot00000000000000def IsExecutingOnWindows(): import sys, os if sys.platform.startswith('win') or os.name == 'nt': return True return False def GetWindowsStdSysEnvVarList(path=False, temp=True, user=True, os=True, shell=True, cpu=True): ret = [] if os: ret += 'OS WINDIR SYSTEMDRIVE SYSTEMROOT ALLUSERSPROFILE Public ProgramData CommonProgramFiles CommonProgramFiles(x86) CommonProgramW6432 ProgramFiles ProgramFiles(x86) ProgramW6432'.split() if cpu: ret += 'NUMBER_OF_PROCESSORS PROCESSOR_ARCHITECTURE PROCESSOR_ARCHITEW6432 PROCESSOR_IDENTIFIER PROCESSOR_LEVEL PROCESSOR_REVISION'.split() if user: ret += 'COMPUTERNAME USERNAME USERPROFILE APPDATA LOCALAPPDATA HOMEDRIVE HOMESHARE HOMEPATH LOGONSERVER USERDNSDOMAIN USERDOMAIN USERDOMAIN_ROAMINGPROFILE ClientName SessionName'.split() if shell: ret += 'COMSPEC PATHEXT PSModulePath'.split() # PROMPT if temp: ret += 'TEMP TMP'.split() if path: ret += 'PATH'.split() return ret def GetPosixStdSysEnvVarList(path=False, temp=True, user=True, os=True, shell=True, cpu=True): ret = [] if os: ret += 'HOSTALIASES'.split() if user: ret += 'HOME USER LOGNAME DATEMSK UID'.split() # XDG_* TZ LANGUAGE LANG LC_* NLSPATH if shell: ret += 'SHELL TERM TERMCAP'.split() if temp: ret += 'TMPDIR'.split() if path: ret += 'PATH MANPATH'.split() return ret def GetStdSysEnvVarList(path=False, temp=True, user=True, os=True, shell=True, cpu=True): func = GetPosixStdSysEnvVarList if IsExecutingOnWindows(): func = GetWindowsStdSysEnvVarList return func(path=path, temp=temp, user=user, os=os, shell=shell, cpu=cpu) def AddAvailableLibs(env, libs): """ Scans through a list of libraries and adds available libraries to the environment. """ conf = env.Configure() for lib in libs: conf.CheckLib(lib) conf.Finish() def AddZLib(env, platform, alias='install-utils'): """ Checks for platform specific zlib and adds the appropriate compiler and linker options to the environment """ zlib = 'z' if platform == 'win32': if 'ZLIB_W32' in env: # Add include and library path of zlib for Win32 env.Append(CPPPATH = env['ZLIB_W32_INC']) env.Append(LIBPATH = env['ZLIB_W32_LIB']) zlib = ['zdll', 'z'] if 'ZLIB_W32_DLL' in env and env['ZLIB_W32_DLL']: env.DistributeW32Bin(env['ZLIB_W32_DLL'], alias=alias) if 'ZLIB_W32_NEW_DLL' in env and env['ZLIB_W32_NEW_DLL']: env.DistributeW32Bin(env['ZLIB_W32_NEW_DLL'], alias=alias) else: print('Please specify folder of zlib for Win32 via ZLIB_W32') Exit(1) # Avoid unnecessary configuring when cleaning targets # and a clash when scons is run in parallel operation. if not env.GetOption('clean'): conf = env.Configure() if not conf.CheckLibWithHeader(zlib, 'zlib.h', 'c'): print('zlib (%s) is missing!' % (platform)) Exit(1) env = conf.Finish() def GetAvailableLibs(env, libs): """ Scans through a list list of libraries and adds available libraries to the environment. """ conf = env.Configure() avail_libs = [] for lib in libs: if conf.CheckLib(lib): avail_libs.append(lib) conf.Finish() return avail_libs def GenerateTryLinkCode(codeprepend = ''): code = codeprepend + """ int main() { #ifdef CONFCHECK_CALLFUNC CONFCHECK_CALLFUNC(); #endif return 0; } int _main() { return main(); } // mingw GCC _WIN64 int __main() { return main(); } // mingw GCC -nostdlib: undefined reference to __main() """ return code def check_compile_flag(ctx, flag): """ Checks if a compiler flag is valid. """ ctx.Message('Checking for compiler flag %s... ' % flag) old_flags = ctx.env['CCFLAGS'] ctx.env.Append(CCFLAGS = [flag]) test = """ int main() { return 0; } """ result = ctx.TryCompile(test, '.c') ctx.Result(result) if not result: ctx.env.Replace(CCFLAGS = [old_flags]) return result def check_link_flag(ctx, flag, run = 0, extension = '.c', code = None, codeprepend = ''): """ Checks if a linker flag is valid. """ ctx.Message('Checking for linker flag %s... ' % flag) old_flags = ctx.env['LINKFLAGS'] ctx.env.Append(LINKFLAGS = [flag]) if code: test = code else: test = GenerateTryLinkCode(codeprepend = codeprepend) result = ctx.TryLink(test, extension) if run: result = result and ctx.TryRun(test, extension)[0] ctx.Result(result) if not result: ctx.env.Replace(LINKFLAGS = [old_flags]) return result def FlagsConfigure(env): """ Wrapper for env.Configure which adds two new tests: CheckCompileFlag - checks for a compiler flag CheckLinkFlag - checks for a linker flag """ return env.Configure(custom_tests = { 'CheckCompileFlag' : check_compile_flag, 'CheckLinkFlag': check_link_flag }) def GetOptionOrEnv(name, defval = None): """ Get option set on scons command line or in os.environ """ import os #if optenv and name in optenv: # return optenv[name] if name in ARGUMENTS: return ARGUMENTS[name] if name in os.environ: return os.environ[name] return defval import struct def FileUnpackRead(pack, size, f, fpos=None, defval=None): r = defval try: if not fpos is None: f.seek(fpos) r = struct.unpack(pack, f.read(size))[0] finally: return r def ReadU16LE(f, fpos=None, defval=None): return FileUnpackRead("= 2: mi = int(re.search(r'\d+', v[1]).group()) if mi < 1: mi = 1 # Make sure we can subtract 1 from the minor number so trunk stays below the next release defenv['VER_PACKED'] = '0x%0.2i%0.3i%0.2i%0.1i' % (int(re.search(r'\d+', v[0]).group()), mi - 1, 66, 6) if int(defenv['VER_PACKED'], 0) >= int('0x03000000', 0): found = v if not found: defenv['VER_PACKED'] = '0x%0.2i%0.3i%0.2i%0.1i' % (3, 3, 42, 0) # Default to a version number we never used print('WARNING: VER_PACKED not set, defaulting to %s!' % defenv['VER_PACKED']) if int(defenv['VER_PACKED'], 0) < int('0x03000000', 0) or int(defenv['VER_PACKED'], 0) >= int('0x04000000', 0): print('ERROR: Invalid VER_PACKED value!') Exit(1) f.write('#define NSIS_PACKEDVERSION _T("%s")\n' % defenv['VER_PACKED']) if defenv.get('VERSION','') == '' and 'VER_MAJOR' in defenv: defenv['VERSION'] = defenv['VER_MAJOR'] if 'VER_MINOR' in defenv: defenv['VERSION'] += '.' + defenv['VER_MINOR'] if 'VER_REVISION' in defenv: defenv['VERSION'] += '.' + defenv['VER_REVISION'] if defenv.get('VERSION','') == '' and int(defenv['VER_PACKED'], 0) > int('0x02000000', 0): defenv['VERSION'] = '%i.%i.%i' % (int(defenv['VER_PACKED'][2:][:2]), int(defenv['VER_PACKED'][4:][:3]), int(defenv['VER_PACKED'][7:][:2])) print('WARNING: VERSION not set, defaulting to %s!' % defenv['VERSION']) f.write('#define NSIS_VERSION _T("v%s")\n' % defenv['VERSION']) f.close() ###################################################################### ####### Common Functions ### ###################################################################### def GetArcCPU(env): if (not 'TARGET_ARCH' in env) or env['TARGET_ARCH'] == 'x86': return 'x86' return env['TARGET_ARCH'] def GetArcSuffix(env, unicode = None): if unicode is None: unicode = 'UNICODE' in env['CPPDEFINES'] suff = '-unicode' if not unicode: suff = '-ansi' return GetArcCPU(env) + suff def GetTargetMinOSVersion(env): if GetArcCPU(defenv) == 'arm64': return (6, 4) if not GetArcCPU(defenv) == 'x86': return (5, 1) return (4, 0) def SafeFile(f): from types import StringType if isinstance(f, StringType): return File(f) return f def MakeFileList(files): return Flatten(File(files)) def AddEnvStandardFlags(env, defines=None, flags=None, libs=None, entry=None, nodeflib=None): if defines: env.Append(CPPDEFINES = defines) if flags: env.Append(CCFLAGS = flags) if libs: env.Append(LIBS = libs) if entry: unicodestr = "None" if 'UNICODE' in env['CPPDEFINES']: unicodestr = "True" env.Append(LINKFLAGS = ['${ENTRY_FLAG("%s",%s)}' % (entry,unicodestr)]) if nodeflib: env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no default libraries def AppendRES(env, source, res, resources): if res: target = MakeFileList(res)[0].name.replace('.rc', '-rc') target_res = env.RES(target, res) if resources: env.Depends(target_res, resources) source.append(target_res) def CleanMap(env, target, target_name): env.Clean(target, File(target_name + '.map')) ###################################################################### ####### Functions ### ###################################################################### defenv['ZIPDISTDIR'] = defenv.Dir('#nsis-$VERSION') defenv['INSTDISTDIR'] = defenv.Dir('#.instdist') defenv['TESTDISTDIR'] = defenv.Dir('#.test') defenv['DISTSUFFIX'] = '' if GetArcCPU(defenv) != 'x86': defenv['DISTSUFFIX'] += GetArcCPU(defenv) if 'CODESIGNER' in defenv: defenv['DISTSUFFIX'] += '-signed' defenv.Execute(Delete('$ZIPDISTDIR')) defenv.Execute(Delete('$INSTDISTDIR')) defenv.Execute(Delete('$TESTDISTDIR')) def Distribute(files, names, component, path, subpath, alias, install_alias=None): files = MakeFileList(files) names = names or list(map(lambda x: x.name, files)) if isinstance(names, str): names = [names] for d in ('$ZIPDISTDIR', '$INSTDISTDIR', '$TESTDISTDIR'): paths = list(map(lambda file: os.path.join(d, path, subpath, file), names)) defenv.InstallAs(paths, files) if ('PREFIX' in defenv and defenv['PREFIX']) or ('PREFIX_DEST' in defenv and defenv['PREFIX_DEST']) : prefix = '${PREFIX_DEST}${PREFIX_%s}' % component.upper() paths = list(map(lambda file: os.path.join(prefix, path, subpath, file), names)) ins = defenv.InstallAs(paths, files) else: ins = [] if ins: defenv.Alias('install', ins) defenv.Alias('install-%s' % component, ins) if alias: defenv.Alias(alias, ins) if install_alias: defenv.Alias('install-%s' % install_alias, ins) return ins def DistributeBin(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'bin', '', path, alias) def DistributeConf(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'conf', '', path, alias) def DistributeW32Bin(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'data', 'Bin', path, alias, 'w32bin') def DistributeStubs(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'data', 'Stubs', path, alias, 'stubs') def DistributePlugin(files, names=[], arcsubpath='', alias=None): return defenv.Distribute(files, names, 'data', 'Plugins', arcsubpath, alias, 'plugins') def DistributeContrib(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'data', 'Contrib', path, alias, 'contrib') def DistributeMenu(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'data', 'Menu', path, alias, 'menu') def DistributeInclude(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'data', 'Include', path, alias, 'includes') def DistributeDoc(files, names=[], path='', alias=None, basepath='', install_alias='docs'): return defenv.Distribute(files, names, 'doc', path=basepath, subpath=path, alias=alias, install_alias=install_alias) def DistributeDocs(files, names=[], path='', alias=None, basepath='Docs', install_alias='docs'): return defenv.Distribute(files, names, 'doc', path=basepath, subpath=path, alias=alias, install_alias=install_alias) def DistributeExamples(files, names=[], path='', alias=None): return defenv.Distribute(files, names, 'doc', 'Examples', path, alias, 'examples') def FindMakeNSIS(env, path): exename = 'makensis_not_found' file = env.FindFile('makensis$PROGSUFFIX', [os.path.join(path, '.'), os.path.join(path, 'Bin')]) if file: exename = str(file) return exename def Sign(targets): if 'CODESIGNER' in defenv: for t in targets: a = defenv.Action('$CODESIGNER "%s"' % t.path) defenv.AddPostAction(t, a) Import('SilentActionEcho IsPEExecutable SetPESecurityFlagsWorker SetPEMinOS MakeReproducibleAction') def SetPESecurityFlagsAction(target, source, env): for t in target: SetPESecurityFlagsWorker(t.path) g_pesecflagsecho = {} def SetPESecurityFlagsActionEcho(target, source, env): for t in target: if t.name[-4:].lower() == '.dll' and IsPEExecutable(t.path) and not t.path in g_pesecflagsecho: g_pesecflagsecho[t.path] = 1 print('Setting PE flags on %s' % t.name) def SetPESecurityFlags(targets): for t in targets: a = defenv.Action(SetPESecurityFlagsAction, strfunction=SetPESecurityFlagsActionEcho) defenv.AddPostAction(t, a) def SetTargetPEMinOS(target, source=None, env=None): for t in target: if source is None: defenv.AddPostAction(t, defenv.Action(SetTargetPEMinOS, strfunction=SilentActionEcho)) else: ver = GetTargetMinOSVersion(env) SetPEMinOS(t.path, ver[0], ver[1], ver[0], ver[1]) def MakeReproducible(targets): for t in targets: defenv.AddPostAction(t, defenv.Action(MakeReproducibleAction, strfunction=SilentActionEcho)) def TestScript(scripts): defenv.Install('$TESTDISTDIR/Tests', scripts) defenv.Distribute = Distribute defenv.DistributeBin = DistributeBin defenv.DistributeConf = DistributeConf defenv.DistributeW32Bin = DistributeW32Bin defenv.DistributeStubs = DistributeStubs defenv.DistributePlugin = DistributePlugin defenv.DistributeContrib = DistributeContrib defenv.DistributeMenu = DistributeMenu defenv.DistributeInclude = DistributeInclude defenv.DistributeDoc = DistributeDoc defenv.DistributeDocs = DistributeDocs defenv.DistributeExamples = DistributeExamples defenv.Sign = Sign defenv.SetPESecurityFlags = SetPESecurityFlags defenv.SetTargetPEMinOS = SetTargetPEMinOS defenv.MakeReproducible = MakeReproducible defenv.TestScript = TestScript def DistributeExtras(env, target, examples, docs): if examples: env.DistributeExamples(examples, path=target) if docs: env.DistributeDocs(docs, path=target) ###################################################################### ####### Environments ### ###################################################################### if defenv['MSTOOLKIT']: if GetOptionOrEnv('MSVC_USE_SCRIPT', '!') != '!': defenv['MSVC_USE_SCRIPT'] = GetOptionOrEnv('MSVC_USE_SCRIPT') defenv.Tool('mstoolkit', toolpath = [Dir('SCons/Tools').rdir()]) defenv.Append(CCFLAGS = Split('$APPEND_CCFLAGS')) defenv.Append(LINKFLAGS = Split('$APPEND_LINKFLAGS')) defenv.Append(CPPPATH = Split('$APPEND_CPPPATH')) defenv.Append(LIBPATH = Split('$APPEND_LIBPATH')) defenv.Default('$BUILD_PREFIX') if 'ZLIB_W32' in defenv: defenv['ZLIB_W32_INC'] = os.path.dirname(str( defenv.FindFile('zlib.h', [ defenv['ZLIB_W32'], os.path.join(defenv['ZLIB_W32'], 'include') ] ) )) # Search for import library of zlib for mingw or VisualC for importlib in ['libzdll.a', 'libz.dll.a', 'zdll.lib']: defenv['ZLIB_W32_LIB'] = os.path.dirname(str( defenv.FindFile(importlib, [ defenv['ZLIB_W32'], os.path.join(defenv['ZLIB_W32'], 'lib') ] ) )) if defenv['ZLIB_W32_LIB']: break defenv['ZLIB_W32_DLL'] = defenv.FindFile('zlib1.dll', [defenv['ZLIB_W32'], defenv['ZLIB_W32_LIB']]) defenv['ZLIB_W32_NEW_DLL'] = defenv.FindFile('zlib.dll', [defenv['ZLIB_W32'], defenv['ZLIB_W32_LIB']]) tools = defenv['TOOLS'] envs = [] if 'msvc' in tools or 'mstoolkit' in tools: envs = SConscript('SCons/Config/ms') elif 'gcc' in tools: envs = SConscript('SCons/Config/gnu') elif 'hpc++' in tools: envs = SConscript('SCons/Config/hpc++') else: envs = SConscript('SCons/Config/default') stub_env = envs[0] makensis_env = envs[1] plugin_env = envs[2] util_env = envs[3] cp_util_env = envs[4] test_env = envs[5] stub_uenv = envs[6] plugin_uenv = envs[7] Export('plugin_env plugin_uenv') ###################################################################### ####### Distribution ### ###################################################################### if defenv['PLATFORM'] == 'win32': def build_nsis_menu_for_zip(target, source, env): cmdline = FindMakeNSIS(env, str(env['ZIPDISTDIR'])) if Execute(f'"{cmdline}" "{source[0].abspath}" /X"OutFile {target[0].abspath}"'): Exit(1) nsis_menu_target = defenv.Command( os.path.join('$ZIPDISTDIR', 'NSIS.exe'), os.path.join('$ZIPDISTDIR', 'Examples', 'NSISMenu.nsi'), build_nsis_menu_for_zip ) defenv.Depends(nsis_menu_target, r'$ZIPDISTDIR\makensis.exe') defenv.Depends(nsis_menu_target, r'$ZIPDISTDIR\Stubs') defenv.Depends(nsis_menu_target, r'$ZIPDISTDIR\Plugins') defenv.MakeReproducible(nsis_menu_target) defenv.Sign(nsis_menu_target) dist_zip = 'nsis-${VERSION}${DISTSUFFIX}.zip' zip_target = defenv.Zip(dist_zip, '$ZIPDISTDIR') defenv.Alias('dist-zip', zip_target) AlwaysBuild(defenv.AddPostAction(zip_target, Delete('$ZIPDISTDIR'))) if defenv['PLATFORM'] == 'win32': optchar = '/' else: optchar = '-' defenv['INSTVER'] = '%sDVERSION=$VERSION' % optchar if 'VER_MAJOR' in defenv and 'VER_MINOR' in defenv \ and 'VER_REVISION' in defenv and 'VER_BUILD' in defenv: defenv['INSTVER'] += ' %sDVER_MAJOR=$VER_MAJOR' % optchar defenv['INSTVER'] += ' %sDVER_MINOR=$VER_MINOR' % optchar defenv['INSTVER'] += ' %sDVER_REVISION=$VER_REVISION' % optchar defenv['INSTVER'] += ' %sDVER_BUILD=$VER_BUILD' % optchar inst_env = {} inst_env['NSISDIR'] = os.path.abspath(str(defenv['INSTDISTDIR'])) inst_env['NSISCONFDIR'] = os.path.abspath(str(defenv['INSTDISTDIR'])) def build_installer(target, source, env): cmdline = FindMakeNSIS(env, str(env['INSTDISTDIR'])) + ' %sDOUTFILE=%s %s' % (optchar, target[0].abspath, env['INSTVER']) if 'ZLIB_W32_NEW_DLL' in env and env['ZLIB_W32_NEW_DLL']: cmdline += ' %sDUSE_NEW_ZLIB' % optchar cmd = env.Command(None, source, cmdline + ' $SOURCE') AlwaysBuild(cmd) # Comment out the following if you want to see the installation directory # after the build is finished. #AlwaysBuild(env.AddPostAction(cmd, Delete('$INSTDISTDIR'))) env.Alias('dist-installer', cmd) installer_target = defenv.Command('nsis-${VERSION}-setup${DISTSUFFIX}.exe', os.path.join('$INSTDISTDIR', 'Examples', 'makensis.nsi'), build_installer, ENV = inst_env) defenv.Depends(installer_target, '$INSTDISTDIR') defenv.Sign(installer_target) defenv.Alias('dist-installer', installer_target) defenv.Alias('dist', ['dist-zip', 'dist-installer']) ###################################################################### ####### Distribute Basics ### ###################################################################### for d in doc: if d in defenv['SKIPDOC']: continue defenv.DistributeDoc(d) defenv.DistributeConf('nsisconf.nsh') ###################################################################### ####### Stubs ### ###################################################################### def BuildStub(compression, solid, unicode): suffix = '' if solid: suffix = '_solid' if unicode: env = stub_uenv.Clone() else: env = stub_env.Clone() suffix = suffix + '-' + GetArcSuffix(env, unicode) AddEnvStandardFlags(env, entry='NSISWinMainNOCRT') build_dir = '$BUILD_PREFIX/stub_%s%s' % (compression, suffix) exports = { 'env' : env, 'compression' : compression, 'solid_compression' : solid } target = defenv.SConscript(dirs = 'Source/exehead', variant_dir = build_dir, duplicate = False, exports = exports) env.SideEffect('%s/stub_%s.map' % (build_dir, stub), target) env.SetTargetPEMinOS(target) env.MakeReproducible(target) env.DistributeStubs(target, names=compression+suffix) defenv.Alias(compression, target) defenv.Alias('stubs', target) for stub in stubs: if stub in defenv['SKIPSTUBS']: continue if defenv['UNICODE']: BuildStub(stub, False, True) BuildStub(stub, True, True) if GetArcCPU(defenv)=='x86': BuildStub(stub, False, False) BuildStub(stub, True, False) # BUGBUG64: Should build x86 stubs on x64? defenv.DistributeStubs('Source/exehead/uninst.ico',names='uninst') ###################################################################### ####### makensis ### ###################################################################### build_dir = '$BUILD_PREFIX/makensis' exports = { 'env' : makensis_env } makensis = defenv.SConscript(dirs = 'Source', variant_dir = build_dir, duplicate = False, exports = exports) makensis_env.SideEffect('%s/makensis.map' % build_dir, makensis) defenv.MakeReproducible(makensis) defenv.Alias('makensis', makensis) if defenv['PLATFORM'] == 'win32': defenv.DistributeW32Bin(makensis, alias='install-compiler') else: defenv.DistributeBin(makensis, alias='install-compiler') ###################################################################### ####### Plug-ins ### ###################################################################### def PerformPluginExtrasDistOperationOnce(env, unicode): #SCons does not like it if you install the same file multiple times return GetArcCPU(defenv)==GetArcCPU(env) and (defenv['UNICODE']==unicode) def BuildPluginWorker(target, source, libs, examples = None, docs = None, entry = 'DllMain', res = None, resources = None, defines = None, flags = None, nodeflib = True, cppused = False, unicode = False): basename = target if unicode: env = plugin_uenv.Clone() else: env = plugin_env.Clone() if cppused and env['CPP_REQUIRES_STDLIB']: nodeflib = False AddEnvStandardFlags(env, defines, flags, libs, entry, nodeflib) AppendRES(env, source, res, resources) plugin = env.SharedLibrary(target, source) defenv.Alias(target, plugin) defenv.Alias('plugins', plugin) defenv.SetTargetPEMinOS(plugin) defenv.SetPESecurityFlags(plugin) defenv.MakeReproducible(plugin) defenv.Sign(plugin) CleanMap(env, plugin, target) for i in plugin: if str(i)[-4:].lower() == '.dll': plugin = i break env.DistributePlugin(plugin, arcsubpath = GetArcSuffix(env, unicode)) if PerformPluginExtrasDistOperationOnce(env, unicode): # only distribute extras once DistributeExtras(env, basename, examples, docs) def BuildPlugin(target, source, libs, examples = None, docs = None, entry = 'DllMain', res = None, resources = None, defines = None, flags = None, nodeflib = True, cppused = False): unicodetarget = 'UNICODE' in exports['env']['CPPDEFINES'] BuildPluginWorker(target, source, libs, examples, docs, entry, res, resources, defines, flags, nodeflib, cppused, unicodetarget) for plugin in plugin_libs + plugins: if plugin in defenv['SKIPPLUGINS']: continue srcpath = 'Contrib/' + plugin build_dir = '$BUILD_PREFIX/' + plugin pvariants = [] if GetArcCPU(defenv) == 'x86': pvariants += [{'e':plugin_env.Clone()}] if defenv['UNICODE']: pvariants += [{'e':plugin_uenv.Clone()}] for pvariant in pvariants: exports = { 'env' : pvariant['e'], 'BuildPlugin' : BuildPlugin, 'GetArcSuffix' : GetArcSuffix, 'PerformPluginExtrasDistOperationOnce' : PerformPluginExtrasDistOperationOnce } vdir = build_dir + '/' + GetArcSuffix(pvariant['e']) defenv.SConscript(dirs = srcpath, variant_dir = vdir, duplicate = False, exports = exports) ###################################################################### ####### Utilities ### ###################################################################### Import('AddZLib') def BuildUtilEnv(defines = None, flags = None, libs = None, entry = None, nodeflib = None, cross_platform = False, cli = False): if not cross_platform: env = util_env.Clone() platform = 'win32' else: env = cp_util_env.Clone() platform = env['PLATFORM'] if libs and 'z' in libs: libs.remove('z') AddZLib(env, platform) if platform == 'win32': if cli: env.Append(LINKFLAGS = env['SUBSYS_CON']) else: env.Append(LINKFLAGS = env['SUBSYS_WIN']) AddEnvStandardFlags(env, defines, flags, libs, entry, nodeflib) return env def BuildUtil(target, source, libs, entry = None, res = None, resources = None, defines = None, flags = None, nodeflib = False, file_name = '', path='', contrib = False, examples = None, docs = None, cross_platform = False, root_util = False, cli = False, noinstall = False): env = BuildUtilEnv(defines, flags, libs, entry, nodeflib, cross_platform, cli) AppendRES(env, source, res, resources) if file_name != '': target = "%s/%s" % (target, file_name) # make sure the environment suffix fits if env['PROGSUFFIX'] not in target: if '.' in target: env['PROGSUFFIX'] = target[target.rindex('.'):] util = env.Program(target, source) defenv.Alias(target, util) defenv.Alias('utils', util) if (str(target)[:7]).lower() == 'RegTool'.lower(): defenv.SetTargetPEMinOS(util) defenv.MakeReproducible(util) defenv.Sign(util) CleanMap(env, util, target) if not noinstall: if contrib: ins = env.DistributeContrib(util, path=path, alias='install-utils') elif cross_platform and not env['PLATFORM'] == 'win32' or root_util and env['PLATFORM'] == 'win32': ins = env.DistributeBin(util, path=path, alias='install-utils') else: ins = env.DistributeW32Bin(util, path=path, alias='install-utils') DistributeExtras(env, target, examples, docs) return util for util in utils: if util in defenv['SKIPUTILS']: continue path = 'Contrib/' + util build_dir = '$BUILD_PREFIX/' + util exports = {'BuildUtil' : BuildUtil, 'BuildUtilEnv' : BuildUtilEnv, 'env' : util_env, 'GetArcCPU' : GetArcCPU} defenv.SConscript(dirs = path, variant_dir = build_dir, duplicate = False, exports = exports) ###################################################################### ####### Documentation ### ###################################################################### halibut = defenv.SConscript( dirs = 'Docs/src/bin/halibut', variant_dir = '$BUILD_PREFIX/halibut', duplicate = False, exports = {'env' : defenv.Clone()} ) for doctype in defenv['DOCTYPES']: defenv.SConscript( dirs = 'Docs/src', variant_dir = '$BUILD_PREFIX/Docs/' + doctype, duplicate = False, exports = {'halibut' : halibut, 'env' : defenv.Clone(), 'build_doctype' : doctype} ) ###################################################################### ####### Examples ### ###################################################################### defenv.SConscript( dirs = 'Examples', exports = {'env': defenv.Clone()} ) ###################################################################### ####### Includes ### ###################################################################### defenv.SConscript( dirs = 'Include', exports = {'env': defenv.Clone()} ) ###################################################################### ####### Miscellaneous ### ###################################################################### for i in misc: if i in defenv['SKIPMISC']: continue defenv.SConscript(dirs = 'Contrib/%s' % i) ###################################################################### ####### Tests ### ###################################################################### # test code build_dir = '$BUILD_PREFIX/tests' exports = {'env' : test_env.Clone()} defenv.SConscript( dirs = 'Source/Tests', duplicate = False, exports = exports, variant_dir = build_dir ) defenv.Ignore('$BUILD_PREFIX', '$BUILD_PREFIX/tests') # test scripts test_scripts_env = defenv.Clone(ENV = os.environ) # env needed for some scripts test_scripts_env['ENV']['NSISDIR'] = os.path.abspath(str(defenv['TESTDISTDIR'])) test_scripts_env['ENV']['NSISCONFDIR'] = os.path.abspath(str(defenv['TESTDISTDIR'])) test_scripts_env.PrependENVPath('PATH', os.path.abspath(str(defenv['TESTDISTDIR']))) def test_scripts(target, source, env): from os import walk, sep instdir = source[0].path tdlen = len(env.subst('$TESTDISTDIR')) skipped_tests = env['SKIPTESTS'].split(',') ignored_tests = env['IGNORETESTS'].split(',') skipped_tests += ['Examples' + sep + 'AppGen.nsi'] # Never test this, not a real installer compiler = FindMakeNSIS(env, env.subst('$TESTDISTDIR')) for root, dirs, files in walk(instdir): for file in files: if file[-4:] == '.nsi': nsi = root + sep + file nsif = nsi[tdlen + 1:] if nsif in skipped_tests: continue if nsif in ignored_tests: cmd = env.Command(None, nsi, '-' + compiler + ' $SOURCE') else: cmd = env.Command(None, nsi, compiler + ' $SOURCE') AlwaysBuild(cmd) env.Alias('test-scripts', cmd) return None test = test_scripts_env.Command('test-scripts.log', '$TESTDISTDIR', test_scripts) test_scripts_env.Alias('test-scripts', test) # test all defenv.Alias('test', ['test-code', 'test-scripts']) nsis-3.11/Scripts/000077500000000000000000000000001477201124000140375ustar00rootroot00000000000000nsis-3.11/Scripts/RegRestore.nsi000077500000000000000000000011041477201124000166320ustar00rootroot00000000000000Name "Restore NSIS Registry" OutFile RegRestore.exe SilentInstall silent XPStyle on Section WriteRegStr HKLM SOFTWARE\NSIS "" $PROGRAMFILES\NSIS WriteRegStr HKCR NSIS.Header\DefaultIcon "" $PROGRAMFILES\NSIS\makensisw.exe,1 WriteRegStr HKCR NSIS.Script\DefaultIcon "" $PROGRAMFILES\NSIS\makensisw.exe,1 WriteRegStr HKCR NSIS.Script\shell\compile\command "" '"$PROGRAMFILES\NSIS\makensisw.exe" "%1"' WriteRegStr HKCR NSIS.Script\shell\compile-compressor\command "" '"$PROGRAMFILES\NSIS\makensisw.exe" /ChooseCompressor "%1"' MessageBox MB_OK Restored! SectionEnd nsis-3.11/Scripts/release.py000077500000000000000000000301511477201124000160340ustar00rootroot00000000000000""" requires Python Image Library - http://www.pythonware.com/products/pil/ requires grep and diff - http://www.mingw.org/msys.shtml requires command line svn - http://subversion.tigris.org/ requires pysvn - http://pysvn.tigris.org/ requires win32com - http://starship.python.net/~skippy/win32/Downloads.html requires requests - https://requests.readthedocs.io/en/latest/ example release.cfg: ========================= [auth] USER=kichik WIKI_PASSWORD=xxx [version] VERSION=2.10 VER_MAJOR=2 VER_MINOR=1 VER_REVISION=0 VER_BUILD=0 [svn] SVN="C:\svn-win32\bin\svn.exe" SVNROOT=https://svn.code.sf.net/p/nsis/code/NSIS [compression] TAR_BZ2=7zatarbz2.bat %s %s ZIP="C:\Program Files\7-zip\7za.exe" a -tzip %s -mx9 -mfb=255 -mpass=4 %s [rsh] RSH="C:\Program Files\PuTTY\plink.exe" -2 -l kichik nsis.sourceforge.net [sftp] SFTP="C:\Program Files\PuTTY\psftp.exe" -2 -l kichik,nsis -batch -b %s frs.sourceforge.net [wiki] PURGE_URL=https://nsis.sourceforge.io/%s?action=purge UPDATE_URL=https://nsis.sourceforge.io/Special:Simpleupdate?action=raw [svn2cl] SVN2CL_XSL=svn2cl.xsl [options] SKIP_CPPUNIT=no SCONS_ARGS="TOOLSET=msvc,mssdk,mslink,mslib,masm" ========================= 7zatarbz2.bat: ========================= @echo off "C:\Program Files\7-zip\7za.exe" a -ttar %2.tar -r %2 "C:\Program Files\7-zip\7za.exe" a -tbzip2 %1 -mx9 -mpass=7 %2.tar ========================= TODO ~~~~ * Create release on SourceForge automatically * Edit update.php * http://en.wikipedia.org/w/index.php?title=Nullsoft_Scriptable_Install_System&action=edit * Update Freshmeat * Update BetaNews """ import os import os.path import shutil import sys import time from PIL import Image, ImageFont, ImageDraw from configparser import RawConfigParser import time import pysvn import requests import urllib.parse ### read config if not os.path.isfile('release.cfg'): print('Unable to find release.cfg. Is this the right working directory?') sys.exit(1) cfg = RawConfigParser() cfg.read('release.cfg') USER = cfg.get('auth', 'USER') WIKI_PASSWORD = cfg.get('auth', 'WIKI_PASSWORD') VERSION = cfg.get('version', 'VERSION') VER_MAJOR = cfg.get('version', 'VER_MAJOR') VER_MINOR = cfg.get('version', 'VER_MINOR') VER_REVISION = cfg.get('version', 'VER_REVISION') VER_BUILD = cfg.get('version', 'VER_BUILD') PRE_RELEASE_VERSION = 'a' in VERSION or 'b' in VERSION SVN = cfg.get('svn', 'SVN') SVNROOT = cfg.get('svn', 'SVNROOT') TAR_BZ2 = cfg.get('compression', 'TAR_BZ2') ZIP = cfg.get('compression', 'ZIP') RSH = cfg.get('rsh', 'RSH') SFTP = cfg.get('sftp', 'SFTP') PURGE_URL = cfg.get('wiki', 'PURGE_URL') UPDATE_URL = cfg.get('wiki', 'UPDATE_URL') SVN2CL_XSL = cfg.get('svn2cl', 'SVN2CL_XSL') SKIP_CPPUINT = cfg.get('options', 'SKIP_CPPUNIT') SCONS_ARGS = cfg.get('options', 'SCONS_ARGS') ### config env SVN_TAG = 'v' + ''.join(VERSION.split('.')) SOURCE_DATE_EPOCH = str(int(time.time())) SCONS_REPRODUCIBLE_ARGS = 'SOURCE_DATE_EPOCH=%s' % (SOURCE_DATE_EPOCH) newverdir = 'nsis-%s-src' % VERSION scons_line = 'scons %s %s -C %s VERSION=%s VER_MAJOR=%s VER_MINOR=%s VER_REVISION=%s VER_BUILD=%s ' \ % (SCONS_ARGS, SCONS_REPRODUCIBLE_ARGS, newverdir, \ VERSION, VER_MAJOR, VER_MINOR, VER_REVISION, VER_BUILD) ### utility functions def log(msg, log_dir = '.'): open('%s\\release-%s.log' % (log_dir, VERSION), 'a').write(msg + '\n') def exit(log_dir = '.'): log('\nerror occurred, exiting', log_dir) sys.exit(3) LOG_ERRORS = 2 LOG_ALL = 1 LOG_NOTHING = 0 def run(command, log_level, err, wanted_ret = 0, log_dir = '.'): log('\nrunning %s\n' % command, log_dir) if log_level == LOG_ERRORS: cmd = '%s 2>> %s\\release-%s.log' % (command, log_dir, VERSION) elif log_level == LOG_ALL: cmd = '%s >> %s\\release-%s.log 2>&1' % (command, log_dir, VERSION) elif log_level == LOG_NOTHING: cmd = command else: raise ValueError ret = os.system('if 1==1 ' + cmd) # sleep because for some weird reason, running cvs.exe hugs # the release log for some time after os.system returns # still needed for svn? import time time.sleep(5) if ret != wanted_ret: print('*** ' + err) log('*** ' + err, log_dir) exit(log_dir) def confirm(question): print(question) if input() != 'y': sys.exit(2) ### process functions def Confirm(): confirm('are you sure you want to release version %s?' % VERSION) confirm('did you update history.but?') def StartLog(): open('release-%s.log' % VERSION, 'w').write('releasing version %s at %s\n\n' % (VERSION, time.ctime())) def DeleteOldFolders(): for d in ['strlen_8192', 'log', 'insttest', 'insttestscons']: if os.path.isdir(d): log('Deleting %s' % d) shutil.rmtree(d) def RunTests(): print('running tests...') run( 'scons %s -C .. %s' % (SCONS_ARGS, SKIP_CPPUINT == 'yes' and 'test-scripts' or 'test'), LOG_ALL, 'tests failed - see test.log for details' ) def TestSubversionEOL(): print('ensuring EOL...') from os import walk from os.path import join from os.path import splitext eoldict = { '.nsh' : 'native', '.nsi' : 'native', '.txt' : 'native', '.ini' : 'CRLF', '.dsp' : 'CRLF', '.dsw' : 'CRLF' } exceptions = ['newfile.txt', 'oldfile.txt'] svn = pysvn.Client() bad_eol = False for root, dirs, files in walk('..'): def versioned(f): try: s = svn.status(join(root, f))[0].text_status except pysvn.ClientError as e: if 'not a working copy' in e.args[0]: return False if 'was not found' in e.args[0]: return False raise return s != pysvn.wc_status_kind.unversioned svn_files = filter(versioned, files) svn_files = filter(lambda x: x not in exceptions, svn_files) for f in svn_files: ext = splitext(f)[1] if ext in eoldict.keys(): eol = eoldict[ext] path = join(root, f) s = list(svn.propget('svn:eol-style', path).values()) if not s or s[0] != eol: error = f'*** {path} has bad eol-style (expected "{eol}", got "{s}")' print(error) log(error) bad_eol = True if bad_eol: exit() def CreateMenuImage(): print('creating images...') ## create new header.gif for menu im = Image.new('RGB', (598, 45), '#000000') # copy background from header-notext.gif bim = Image.open(r'..\Menu\images\header-notext.gif') im.paste(bim) # draw new version number draw = ImageDraw.Draw(im) font = ImageFont.truetype('trebuc.ttf', 24) text = 'nullsoft scriptable install system %s' % VERSION draw.text((85, 7), text, font = font, fill = 'white') # save im = im.convert('P', palette = Image.ADAPTIVE) im.save(r'..\Menu\images\header.gif') def CommitMenuImage(): print('committing header.gif...') run( '%s commit -m %s ..\\Menu\\images\\header.gif' % (SVN, VERSION), LOG_ALL, 'failed committing header.gif' ) def TestInstaller(): print('testing installer...') os.mkdir('insttestscons') run( 'scons %s -C .. VERSION=test PREFIX=%s\\insttestscons install dist-installer' % (SCONS_ARGS, os.getcwd()), LOG_ALL, 'installer creation failed' ) run( '..\\nsis-test-setup.exe /S /D=%s\\insttest' % os.getcwd(), LOG_NOTHING, 'installer failed' ) run( 'diff -r insttest insttestscons | grep -v uninst-nsis.exe | grep -v NSIS.exe', LOG_ALL, 'scons and installer installations differ', 1 ) def Tag(): print('tagging...') run( '%s copy %s/trunk %s/tags/%s -m "Tagging for release %s"' % (SVN, SVNROOT, SVNROOT, SVN_TAG, VERSION), LOG_ALL, 'failed creating tag %s' % SVN_TAG ) def Export(): print('exporting a fresh copy...') run( '%s export %s/tags/%s %s' % (SVN, SVNROOT, SVN_TAG, newverdir), LOG_ALL, 'export failed' ) def CreateChangeLog(): import win32com.client import codecs if not os.path.isfile(SVN2CL_XSL): print('downloading svn2cl.xsl stylesheet...') r = requests.get('http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn2cl/svn2cl.xsl') r.raise_for_status() with open(SVN2CL_XSL, 'w') as f: f.write(r.text) print('generating ChangeLog...') changelog = os.path.join(newverdir, 'ChangeLog') # generate changelog xml run( '%s log --xml --verbose %s > %s' % (SVN, SVNROOT, changelog), LOG_ERRORS, 'changelog failed' ) # load changelog xml xmlo = win32com.client.Dispatch('Microsoft.XMLDOM') xmlo.loadXML(open(changelog).read()) xmlo.preserveWhiteSpace = True # load xsl xslo = win32com.client.Dispatch('Microsoft.XMLDOM') xslo.validateOnParse = False xslo.preserveWhiteSpace = True xslo.loadXML(open(SVN2CL_XSL).read()) # set strip-prefix to '' for a in xslo.selectNodes("/xsl:stylesheet/xsl:param[@name = 'strip-prefix']")[0].attributes: if a.name == 'select': a.value = "''" # transform transformed = xmlo.transformNode(xslo) codecs.open(changelog, 'w', 'utf-8').write(transformed) def CreateSourceTarball(): print('creating source tarball...') run( TAR_BZ2 % (newverdir + '.tar.bz2', newverdir), LOG_ALL, 'source tarball creation failed' ) def BuildRelease(): print('creating distribution files...') run( scons_line + 'dist', LOG_ALL, 'creation of distribution files failed' ) def CreateSpecialBuilds(): def create_special_build(name, option): print('creating %s special build...' % name) os.mkdir(name) run( scons_line + 'PREFIX=%s\\%s %s install-compiler install-stubs' % (os.getcwd(), name, option), LOG_ALL, 'creation of %s special build failed' % name ) os.chdir(name) run( ZIP % ('..\\nsis-%s-%s.zip' % (VERSION, name), '*'), LOG_ALL, 'compression of %s special build failed' % name, log_dir = '..' ) os.chdir('..') create_special_build('strlen_8192', 'NSIS_MAX_STRLEN=8192') create_special_build('log', 'NSIS_CONFIG_LOG=yes') def UploadFiles(): print('uploading files to SourceForge...') folder = 'NSIS 3/' + VERSION if PRE_RELEASE_VERSION: folder = 'NSIS 3 Pre-release/' + VERSION sftpcmds = open('sftp-commands', 'w') sftpcmds.write('mkdir "/home/frs/project/nsis/%s"\n' % folder) sftpcmds.write('cd "/home/frs/project/nsis/%s"\n' % folder) sftpcmds.write('put %s.tar.bz2\n' % newverdir) sftpcmds.write('put %s\\nsis-%s-setup.exe\n' % (newverdir, VERSION)) sftpcmds.write('put %s\\nsis-%s.zip\n' % (newverdir, VERSION)) sftpcmds.write('put nsis-%s-log.zip\n' % VERSION) sftpcmds.write('put nsis-%s-strlen_8192.zip\n' % VERSION) sftpcmds.write('put %s\\build\\urelease\\Docs\\chm\\SectionF.1.html RELEASE.html\n' % newverdir) sftpcmds.close() run( SFTP % 'sftp-commands', LOG_ERRORS, 'upload failed' ) os.unlink('sftp-commands') def ManualRelease(): print('go fix release notes...') print(' http://nsis.sf.net/rn/new') print() input() def UpdateWiki(): print('updating wiki...') def update_wiki_page(page, data, summary): print(' updating `%s` to `%s`' % (page, data)) import urllib post = 'su_user=' + urllib.parse.quote(USER) post += '&su_password=' + urllib.parse.quote(WIKI_PASSWORD) post += '&su_title=' + urllib.parse.quote(page) post += '&su_data=' + urllib.parse.quote(data) post += '&su_summary=' + urllib.parse.quote(summary) if requests.get(UPDATE_URL, post).text.strip() != 'success': log('*** failed updating `%s` wiki page' % page) print(' *** failed updating `%s` wiki page' % page) if not PRE_RELEASE_VERSION: update_wiki_page('Template:NSISVersion', VERSION, 'new version') update_wiki_page('Template:NSISReleaseDate', time.strftime('%B %d, %Y'), 'new version') update_wiki_page('Template:NSISIsPreRelease', 'no', 'new version') else: update_wiki_page('Template:NSISPreVersion', VERSION, 'new version') update_wiki_page('Template:NSISPreReleaseDate', time.strftime('%B %d, %Y'), 'new version') update_wiki_page('Template:NSISIsPreRelease', 'yes', 'new version') os.system('start ' + PURGE_URL % 'Download') def ToDo(): print('automatic phase done\n') print(""" * Make new release files the default download * Edit update.php * Post news item * http://en.wikipedia.org/w/index.php?title=Nullsoft_Scriptable_Install_System&action=edit * Update Freshmeat * Update BetaNews """) def CloseLog(): log('done') ### ok, let's go! Confirm() StartLog() DeleteOldFolders() RunTests() TestSubversionEOL() CreateMenuImage() CommitMenuImage() TestInstaller() Tag() Export() CreateChangeLog() CreateSourceTarball() BuildRelease() CreateSpecialBuilds() UploadFiles() ManualRelease() UpdateWiki() ToDo() CloseLog() nsis-3.11/Source/000077500000000000000000000000001477201124000136505ustar00rootroot00000000000000nsis-3.11/Source/7zip/000077500000000000000000000000001477201124000145415ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zGuids.cpp000077500000000000000000000014731477201124000166110ustar00rootroot00000000000000/* * 7zGuids.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/24/2007 */ // DLLExports.cpp // #include "StdAfx.h" #ifdef _WIN32 # include # include #endif #ifndef INITGUID # define INITGUID #endif #include "../Platform.h" #include "7zip/ICoder.h" #include "7zip/Compress/LZ/IMatchFinder.h" nsis-3.11/Source/7zip/7zip/000077500000000000000000000000001477201124000154325ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Common/000077500000000000000000000000001477201124000166625ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Common/InBuffer.cpp000077500000000000000000000037501477201124000210760ustar00rootroot00000000000000/* * InBuffer.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "InBuffer.h" #include "../../Common/Alloc.h" CInBuffer::CInBuffer(): _buffer(0), _bufferLimit(0), _bufferBase(0), _stream(0), _bufferSize(0) {} bool CInBuffer::Create(UInt32 bufferSize) { const UInt32 kMinBlockSize = 1; if (bufferSize < kMinBlockSize) bufferSize = kMinBlockSize; if (_bufferBase != 0 && _bufferSize == bufferSize) return true; Free(); _bufferSize = bufferSize; _bufferBase = (Byte *)::MidAlloc(bufferSize); return (_bufferBase != 0); } void CInBuffer::Free() { ::MidFree(_bufferBase); _bufferBase = 0; } void CInBuffer::SetStream(ISequentialInStream *stream) { _stream = stream; } void CInBuffer::Init() { _processedSize = 0; _buffer = _bufferBase; _bufferLimit = _buffer; _wasFinished = false; #ifdef _NO_EXCEPTIONS ErrorCode = S_OK; #endif } bool CInBuffer::ReadBlock() { #ifdef _NO_EXCEPTIONS if (ErrorCode != S_OK) return false; #endif if (_wasFinished) return false; _processedSize += (_buffer - _bufferBase); UInt32 numProcessedBytes; HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); #ifdef _NO_EXCEPTIONS ErrorCode = result; #else if (result != S_OK) throw CInBufferException(result); #endif _buffer = _bufferBase; _bufferLimit = _buffer + numProcessedBytes; _wasFinished = (numProcessedBytes == 0); return (!_wasFinished); } Byte CInBuffer::ReadBlock2() { if(!ReadBlock()) return 0xFF; return *_buffer++; } nsis-3.11/Source/7zip/7zip/Common/InBuffer.h000077500000000000000000000037621477201124000205460ustar00rootroot00000000000000/* * InBuffer.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __INBUFFER_H #define __INBUFFER_H #include "../IStream.h" #include "../../Common/MyCom.h" #ifndef _NO_EXCEPTIONS class CInBufferException { public: HRESULT ErrorCode; CInBufferException(HRESULT errorCode): ErrorCode(errorCode) {} }; #endif class CInBuffer { Byte *_buffer; Byte *_bufferLimit; Byte *_bufferBase; CMyComPtr _stream; UInt64 _processedSize; UInt32 _bufferSize; bool _wasFinished; bool ReadBlock(); Byte ReadBlock2(); public: #ifdef _NO_EXCEPTIONS HRESULT ErrorCode; #endif CInBuffer(); ~CInBuffer() { Free(); } bool Create(UInt32 bufferSize); void Free(); void SetStream(ISequentialInStream *stream); void Init(); void ReleaseStream() { _stream.Release(); } bool ReadByte(Byte &b) { if(_buffer >= _bufferLimit) if(!ReadBlock()) return false; b = *_buffer++; return true; } Byte ReadByte() { if(_buffer >= _bufferLimit) return ReadBlock2(); return *_buffer++; } void ReadBytes(void *data, UInt32 size, UInt32 &processedSize) { for(processedSize = 0; processedSize < size; processedSize++) if (!ReadByte(((Byte *)data)[processedSize])) return; } bool ReadBytes(void *data, UInt32 size) { UInt32 processedSize; ReadBytes(data, size, processedSize); return (processedSize == size); } UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); } bool WasFinished() const { return _wasFinished; } }; #endif nsis-3.11/Source/7zip/7zip/Common/OutBuffer.cpp000077500000000000000000000051621477201124000212760ustar00rootroot00000000000000/* * OutBuffer.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "OutBuffer.h" #include "../../Common/Alloc.h" bool COutBuffer::Create(UInt32 bufferSize) { const UInt32 kMinBlockSize = 1; if (bufferSize < kMinBlockSize) bufferSize = kMinBlockSize; if (_buffer != 0 && _bufferSize == bufferSize) return true; Free(); _bufferSize = bufferSize; _buffer = (Byte *)::MidAlloc(bufferSize); return (_buffer != 0); } void COutBuffer::Free() { ::MidFree(_buffer); _buffer = 0; } void COutBuffer::SetStream(ISequentialOutStream *stream) { _stream = stream; } void COutBuffer::Init() { _streamPos = 0; _limitPos = _bufferSize; _pos = 0; _processedSize = 0; _overDict = false; #ifdef _NO_EXCEPTIONS ErrorCode = S_OK; #endif } UInt64 COutBuffer::GetProcessedSize() const { UInt64 res = _processedSize + _pos - _streamPos; if (_streamPos > _pos) res += _bufferSize; return res; } HRESULT COutBuffer::FlushPart() { // _streamPos < _bufferSize UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos); HRESULT result = S_OK; #ifdef _NO_EXCEPTIONS result = ErrorCode; #endif if (_buffer2 != 0) { memmove(_buffer2, _buffer + _streamPos, size); _buffer2 += size; } if (_stream != 0 #ifdef _NO_EXCEPTIONS && (ErrorCode == S_OK) #endif ) { UInt32 processedSize = 0; result = _stream->Write(_buffer + _streamPos, size, &processedSize); size = processedSize; } _streamPos += size; if (_streamPos == _bufferSize) _streamPos = 0; if (_pos == _bufferSize) { _overDict = true; _pos = 0; } _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize; _processedSize += size; return result; } HRESULT COutBuffer::Flush() { #ifdef _NO_EXCEPTIONS if (ErrorCode != S_OK) return ErrorCode; #endif while(_streamPos != _pos) { HRESULT result = FlushPart(); if (result != S_OK) return result; } return S_OK; } void COutBuffer::FlushWithCheck() { HRESULT result = FlushPart(); #ifdef _NO_EXCEPTIONS ErrorCode = result; #else if (result != S_OK) throw COutBufferException(result); #endif } nsis-3.11/Source/7zip/7zip/Common/OutBuffer.h000077500000000000000000000033061477201124000207410ustar00rootroot00000000000000/* * OutBuffer.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __OUTBUFFER_H #define __OUTBUFFER_H #include "../IStream.h" #include "../../Common/MyCom.h" #ifndef _NO_EXCEPTIONS struct COutBufferException { HRESULT ErrorCode; COutBufferException(HRESULT errorCode): ErrorCode(errorCode) {} }; #endif class COutBuffer { protected: Byte *_buffer; UInt32 _pos; UInt32 _limitPos; UInt32 _streamPos; UInt32 _bufferSize; CMyComPtr _stream; UInt64 _processedSize; Byte *_buffer2; bool _overDict; HRESULT FlushPart(); void FlushWithCheck(); public: #ifdef _NO_EXCEPTIONS HRESULT ErrorCode; #endif COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {} ~COutBuffer() { Free(); } bool Create(UInt32 bufferSize); void Free(); void SetMemStream(Byte *buffer) { _buffer2 = buffer; } void SetStream(ISequentialOutStream *stream); void Init(); HRESULT Flush(); void ReleaseStream() { _stream.Release(); } void WriteByte(Byte b) { _buffer[_pos++] = b; if(_pos == _limitPos) FlushWithCheck(); } void WriteBytes(const void *data, size_t size) { for (size_t i = 0; i < size; i++) WriteByte(((const Byte *)data)[i]); } UInt64 GetProcessedSize() const; }; #endif nsis-3.11/Source/7zip/7zip/Common/StdAfx.h000077500000000000000000000001411477201124000202230ustar00rootroot00000000000000// StdAfx.h #ifndef __STDAFX_H #define __STDAFX_H #include "../../Common/MyWindows.h" #endif nsis-3.11/Source/7zip/7zip/Common/StreamUtils.cpp000077500000000000000000000031311477201124000216430ustar00rootroot00000000000000/* * StreamUtils.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "../../Common/MyCom.h" #include "StreamUtils.h" HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize) { if (processedSize != 0) *processedSize = 0; while(size != 0) { UInt32 processedSizeLoc; HRESULT res = stream->Read(data, size, &processedSizeLoc); if (processedSize != 0) *processedSize += processedSizeLoc; data = (Byte *)((Byte *)data + processedSizeLoc); size -= processedSizeLoc; RINOK(res); if (processedSizeLoc == 0) return S_OK; } return S_OK; } HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize) { if (processedSize != 0) *processedSize = 0; while(size != 0) { UInt32 processedSizeLoc; HRESULT res = stream->Write(data, size, &processedSizeLoc); if (processedSize != 0) *processedSize += processedSizeLoc; data = (const void *)((const Byte *)data + processedSizeLoc); size -= processedSizeLoc; RINOK(res); if (processedSizeLoc == 0) break; } return S_OK; } nsis-3.11/Source/7zip/7zip/Common/StreamUtils.h000077500000000000000000000014421477201124000213130ustar00rootroot00000000000000/* * StreamUtils.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __STREAMUTILS_H #define __STREAMUTILS_H #include "../IStream.h" HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize); HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize); #endif nsis-3.11/Source/7zip/7zip/Compress/000077500000000000000000000000001477201124000172255ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Compress/LZ/000077500000000000000000000000001477201124000175525ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/000077500000000000000000000000001477201124000211025ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree.h000077500000000000000000000035771477201124000226220ustar00rootroot00000000000000/* * BinTree.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "../LZInWindow.h" #include "../IMatchFinder.h" namespace BT_NAMESPACE { typedef UInt32 CIndex; const UInt32 kMaxValForNormalize = (UInt32(1) << 31) - 1; class CMatchFinder: public IMatchFinder, public CLZInWindow, public CMyUnknownImp, public IMatchFinderSetNumPasses { UInt32 _cyclicBufferPos; UInt32 _cyclicBufferSize; // it must be historySize + 1 UInt32 _matchMaxLen; CIndex *_hash; CIndex *_son; #ifdef HASH_ARRAY_2 UInt32 _hashMask; #endif UInt32 _cutValue; UInt32 _hashSizeSum; void Normalize(); void FreeThisClassMemory(); void FreeMemory(); MY_UNKNOWN_IMP STDMETHOD(SetStream)(ISequentialInStream *inStream); STDMETHOD_(void, ReleaseStream)(); STDMETHOD(Init)(); HRESULT MovePos(); STDMETHOD_(Byte, GetIndexByte)(Int32 index); STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 back, UInt32 limit); STDMETHOD_(UInt32, GetNumAvailableBytes)(); STDMETHOD_(const Byte *, GetPointerToCurrentPos)(); STDMETHOD_(Int32, NeedChangeBufferPos)(UInt32 numCheckBytes); STDMETHOD_(void, ChangeBufferPos)(); STDMETHOD(Create)(UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter); STDMETHOD(GetMatches)(UInt32 *distances); STDMETHOD(Skip)(UInt32 num); public: CMatchFinder(); virtual ~CMatchFinder(); virtual void SetNumPasses(UInt32 numPasses) { _cutValue = numPasses; } }; } nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree2.h000077500000000000000000000011771477201124000226760ustar00rootroot00000000000000/* * BinTree2.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __BINTREE2_H #define __BINTREE2_H #define BT_NAMESPACE NBT2 #include "BinTreeMain.h" #undef BT_NAMESPACE #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3.h000077500000000000000000000012521477201124000226710ustar00rootroot00000000000000/* * BinTree3.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __BINTREE3_H #define __BINTREE3_H #define BT_NAMESPACE NBT3 #define HASH_ARRAY_2 #include "BinTreeMain.h" #undef HASH_ARRAY_2 #undef BT_NAMESPACE #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3Z.h000077500000000000000000000012461477201124000230260ustar00rootroot00000000000000/* * BinTree3Z.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __BINTREE3Z_H #define __BINTREE3Z_H #define BT_NAMESPACE NBT3Z #define HASH_ZIP #include "BinTreeMain.h" #undef HASH_ZIP #undef BT_NAMESPACE #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree3ZMain.h000077500000000000000000000012641477201124000236330ustar00rootroot00000000000000/* * BinTree3ZMain.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __BINTREE3ZMAIN__H #define __BINTREE3ZMAIN__H #undef BT_NAMESPACE #define BT_NAMESPACE NBT3Z #define HASH_ZIP #include "BinTreeMain.h" #undef HASH_ZIP #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4.h000077500000000000000000000013231477201124000226710ustar00rootroot00000000000000/* * BinTree4.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __BINTREE4_H #define __BINTREE4_H #define BT_NAMESPACE NBT4 #define HASH_ARRAY_2 #define HASH_ARRAY_3 #include "BinTreeMain.h" #undef HASH_ARRAY_2 #undef HASH_ARRAY_3 #undef BT_NAMESPACE #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTree4b.h000077500000000000000000000015131477201124000230340ustar00rootroot00000000000000/* * BinTreeb.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __BINTREE4B__H #define __BINTREE4B__H #undef BT_CLSID #define BT_CLSID CLSID_CMatchFinderBT4b #undef BT_NAMESPACE #define BT_NAMESPACE NBT4B #define HASH_ARRAY_2 #define HASH_ARRAY_3 #define HASH_BIG #include "BinTreeMF.h" #include "BinTreeMFMain.h" #undef HASH_ARRAY_2 #undef HASH_ARRAY_3 #undef HASH_BIG #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMF.h000077500000000000000000000055751477201124000230450ustar00rootroot00000000000000/* * BinTreeMF.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ // #ifndef __BINTREEMF_H // #define __BINTREEMF_H #include "../../../ICoder.h" #include "BinTree.h" namespace BT_NAMESPACE { #undef kIDByte #undef kIDString #ifdef HASH_ARRAY_2 #ifdef HASH_ARRAY_3 #ifdef HASH_BIG #define kIDByte 0x4 #define kIDString TEXT("4b") #else #define kIDByte 0x3 #define kIDString TEXT("4") #endif #else #define kIDByte 0x2 #define kIDString TEXT("3") #endif #else #ifdef HASH_ZIP #define kIDByte 0x0 #define kIDString TEXT("3Z") #else #define kIDByte 0x1 #define kIDString TEXT("2") #endif #endif #undef kIDUse3BytesByte #undef kIDUse3BytesString #define kIDUse3BytesByte 0x00 #define kIDUse3BytesString TEXT("") // #undef kIDStringFull // #define kIDStringFull TEXT("Compress.MatchFinderBT") kIDString kIDUse3BytesString // {23170F69-40C1-278C-02XX-0000000000} DEFINE_GUID(BT_CLSID, 0x23170F69, 0x40C1, 0x278C, 0x02, kIDByte | kIDUse3BytesByte, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); class CInTree2: public CInTree { CMyComPtr _callback; virtual void BeforeMoveBlock(); virtual void AfterMoveBlock(); public: void SetCallback(IMatchFinderCallback *callback) { _callback = callback; } }; class CMatchFinderBinTree: public IMatchFinder, public IMatchFinderSetCallback, public CMyUnknownImp { MY_UNKNOWN_IMP1(IMatchFinderSetCallback) STDMETHOD(Init)(ISequentialInStream *stream); STDMETHOD_(void, ReleaseStream)(); STDMETHOD(MovePos)(); STDMETHOD_(Byte, GetIndexByte)(Int32 index); STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 back, UInt32 limit); STDMETHOD_(UInt32, GetNumAvailableBytes)(); STDMETHOD_(const Byte *, GetPointerToCurrentPos)(); STDMETHOD(Create)(UInt32 sizeHistory, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter); STDMETHOD_(UInt32, GetLongestMatch)(UInt32 *distances); STDMETHOD_(void, DummyLongestMatch)(); // IMatchFinderSetCallback STDMETHOD(SetCallback)(IMatchFinderCallback *callback); private: // UInt32 m_WindowReservSize; CInTree2 _matchFinder; public: // CMatchFinderBinTree(): m_WindowReservSize((1 << 19) + 256) {}; void SetCutValue(UInt32 cutValue) { _matchFinder.SetCutValue(cutValue); } /* void SetWindowReservSize(UInt32 reservWindowSize) { m_WindowReservSize = reservWindowSize; } */ virtual ~CMatchFinderBinTree() {} }; } // #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMFMain.h000077500000000000000000000050001477201124000236310ustar00rootroot00000000000000/* * BinTreeMFMain.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ // #include "StdAfx.h" // #include "BinTreeMF.h" #include "BinTreeMain.h" namespace BT_NAMESPACE { void CInTree2::BeforeMoveBlock() { if (_callback) _callback->BeforeChangingBufferPos(); CInTree::BeforeMoveBlock(); } void CInTree2::AfterMoveBlock() { CInTree::AfterMoveBlock(); if (_callback) _callback->AfterChangingBufferPos(); } STDMETHODIMP CMatchFinderBinTree::Init(ISequentialInStream *stream) { return _matchFinder.Init(stream); } STDMETHODIMP_(void) CMatchFinderBinTree::ReleaseStream() { // _matchFinder.ReleaseStream(); } STDMETHODIMP CMatchFinderBinTree::MovePos() { return _matchFinder.MovePos(); } STDMETHODIMP_(Byte) CMatchFinderBinTree::GetIndexByte(Int32 index) { return _matchFinder.GetIndexByte(index); } STDMETHODIMP_(UInt32) CMatchFinderBinTree::GetMatchLen(Int32 index, UInt32 back, UInt32 limit) { return _matchFinder.GetMatchLen(index, back, limit); } STDMETHODIMP_(UInt32) CMatchFinderBinTree::GetNumAvailableBytes() { return _matchFinder.GetNumAvailableBytes(); } STDMETHODIMP CMatchFinderBinTree::Create(UInt32 sizeHistory, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter) { UInt32 windowReservSize = (sizeHistory + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + 256; // try { return _matchFinder.Create(sizeHistory, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, windowReservSize); } /* catch(...) { return E_OUTOFMEMORY; } */ } STDMETHODIMP_(UInt32) CMatchFinderBinTree::GetLongestMatch(UInt32 *distances) { return _matchFinder.GetLongestMatch(distances); } STDMETHODIMP_(void) CMatchFinderBinTree::DummyLongestMatch() { _matchFinder.DummyLongestMatch(); } STDMETHODIMP_(const Byte *) CMatchFinderBinTree::GetPointerToCurrentPos() { return _matchFinder.GetPointerToCurrentPos(); } // IMatchFinderSetCallback STDMETHODIMP CMatchFinderBinTree::SetCallback(IMatchFinderCallback *callback) { _matchFinder.SetCallback(callback); return S_OK; } } nsis-3.11/Source/7zip/7zip/Compress/LZ/BinTree/BinTreeMain.h000077500000000000000000000305701477201124000234200ustar00rootroot00000000000000/* * BinTreeMain.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "../../../../Common/Defs.h" #include "../../../../Common/CRC.h" #include "../../../../Common/Alloc.h" #include "BinTree.h" // #include // It's for prefetch // But prefetch doesn't give big gain in K8. namespace BT_NAMESPACE { #ifdef HASH_ARRAY_2 static const UInt32 kHash2Size = 1 << 10; #define kNumHashDirectBytes 0 #ifdef HASH_ARRAY_3 static const UInt32 kNumHashBytes = 4; static const UInt32 kHash3Size = 1 << 16; #else static const UInt32 kNumHashBytes = 3; #endif static const UInt32 kHashSize = 0; static const UInt32 kMinMatchCheck = kNumHashBytes; static const UInt32 kStartMaxLen = 1; #else #ifdef HASH_ZIP #define kNumHashDirectBytes 0 static const UInt32 kNumHashBytes = 3; static const UInt32 kHashSize = 1 << 16; static const UInt32 kMinMatchCheck = kNumHashBytes; static const UInt32 kStartMaxLen = 1; #else #define kNumHashDirectBytes 2 static const UInt32 kNumHashBytes = 2; static const UInt32 kHashSize = 1 << (8 * kNumHashBytes); static const UInt32 kMinMatchCheck = kNumHashBytes + 1; static const UInt32 kStartMaxLen = 1; #endif #endif #ifdef HASH_ARRAY_2 #ifdef HASH_ARRAY_3 static const UInt32 kHash3Offset = kHash2Size; #endif #endif static const UInt32 kFixHashSize = 0 #ifdef HASH_ARRAY_2 + kHash2Size #ifdef HASH_ARRAY_3 + kHash3Size #endif #endif ; CMatchFinder::CMatchFinder(): _hash(0) { } void CMatchFinder::FreeThisClassMemory() { BigFree(_hash); _hash = 0; } void CMatchFinder::FreeMemory() { FreeThisClassMemory(); CLZInWindow::Free(); } CMatchFinder::~CMatchFinder() { FreeMemory(); } STDMETHODIMP CMatchFinder::Create(UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter) { if (historySize > kMaxValForNormalize - 256) { FreeMemory(); return E_INVALIDARG; } _cutValue = #ifdef _HASH_CHAIN 8 + (matchMaxLen >> 2); #else 16 + (matchMaxLen >> 1); #endif UInt32 sizeReserv = (historySize + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + 256; if (CLZInWindow::Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, sizeReserv)) { _matchMaxLen = matchMaxLen; UInt32 newCyclicBufferSize = historySize + 1; if (_hash != 0 && newCyclicBufferSize == _cyclicBufferSize) return S_OK; FreeThisClassMemory(); _cyclicBufferSize = newCyclicBufferSize; // don't change it UInt32 hs = kHashSize; #ifdef HASH_ARRAY_2 hs = historySize - 1; hs |= (hs >> 1); hs |= (hs >> 2); hs |= (hs >> 4); hs |= (hs >> 8); hs >>= 1; hs |= 0xFFFF; if (hs > (1 << 24)) { #ifdef HASH_ARRAY_3 hs >>= 1; #else hs = (1 << 24) - 1; #endif } _hashMask = hs; hs++; #endif _hashSizeSum = hs + kFixHashSize; UInt32 numItems = _hashSizeSum + _cyclicBufferSize #ifndef _HASH_CHAIN * 2 #endif ; size_t sizeInBytes = (size_t)numItems * sizeof(CIndex); if (sizeInBytes / sizeof(CIndex) != numItems) return E_OUTOFMEMORY; _hash = (CIndex *)BigAlloc(sizeInBytes); _son = _hash + _hashSizeSum; if (_hash != 0) return S_OK; } FreeMemory(); return E_OUTOFMEMORY; } static const UInt32 kEmptyHashValue = 0; STDMETHODIMP CMatchFinder::SetStream(ISequentialInStream *stream) { CLZInWindow::SetStream(stream); return S_OK; } STDMETHODIMP CMatchFinder::Init() { RINOK(CLZInWindow::Init()); for(UInt32 i = 0; i < _hashSizeSum; i++) _hash[i] = kEmptyHashValue; _cyclicBufferPos = 0; ReduceOffsets(-1); return S_OK; } STDMETHODIMP_(void) CMatchFinder::ReleaseStream() { // ReleaseStream(); } #ifdef HASH_ARRAY_2 #ifdef HASH_ARRAY_3 #define HASH_CALC { \ UInt32 temp = CCRC::Table[cur[0]] ^ cur[1]; \ hash2Value = temp & (kHash2Size - 1); \ hash3Value = (temp ^ (UInt32(cur[2]) << 8)) & (kHash3Size - 1); \ hashValue = (temp ^ (UInt32(cur[2]) << 8) ^ (CCRC::Table[cur[3]] << 5)) & _hashMask; } #else // no HASH_ARRAY_3 #define HASH_CALC { \ UInt32 temp = CCRC::Table[cur[0]] ^ cur[1]; \ hash2Value = temp & (kHash2Size - 1); \ hashValue = (temp ^ (UInt32(cur[2]) << 8)) & _hashMask; } #endif // HASH_ARRAY_3 #else // no HASH_ARRAY_2 #ifdef HASH_ZIP inline UInt32 Hash(const Byte *pointer) { return ((UInt32(pointer[0]) << 8) ^ CCRC::Table[pointer[1]] ^ pointer[2]) & (kHashSize - 1); } #else // no HASH_ZIP inline UInt32 Hash(const Byte *pointer) { return pointer[0] ^ (UInt32(pointer[1]) << 8); } #endif // HASH_ZIP #endif // HASH_ARRAY_2 STDMETHODIMP CMatchFinder::GetMatches(UInt32 *distances) { UInt32 lenLimit; if (_pos + _matchMaxLen <= _streamPos) lenLimit = _matchMaxLen; else { lenLimit = _streamPos - _pos; if(lenLimit < kMinMatchCheck) { distances[0] = 0; return MovePos(); } } int offset = 1; UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; const Byte *cur = _buffer + _pos; UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize; #ifdef HASH_ARRAY_2 UInt32 hash2Value; #ifdef HASH_ARRAY_3 UInt32 hash3Value; #endif UInt32 hashValue; HASH_CALC; #else UInt32 hashValue = Hash(cur); #endif UInt32 curMatch = _hash[kFixHashSize + hashValue]; #ifdef HASH_ARRAY_2 UInt32 curMatch2 = _hash[hash2Value]; #ifdef HASH_ARRAY_3 UInt32 curMatch3 = _hash[kHash3Offset + hash3Value]; #endif _hash[hash2Value] = _pos; if(curMatch2 > matchMinPos) if (_buffer[curMatch2] == cur[0]) { distances[offset++] = maxLen = 2; distances[offset++] = _pos - curMatch2 - 1; } #ifdef HASH_ARRAY_3 _hash[kHash3Offset + hash3Value] = _pos; if(curMatch3 > matchMinPos) if (_buffer[curMatch3] == cur[0]) { if (curMatch3 == curMatch2) offset -= 2; distances[offset++] = maxLen = 3; distances[offset++] = _pos - curMatch3 - 1; curMatch2 = curMatch3; } #endif if (offset != 1 && curMatch2 == curMatch) { offset -= 2; maxLen = kStartMaxLen; } #endif _hash[kFixHashSize + hashValue] = _pos; CIndex *son = _son; #ifdef _HASH_CHAIN son[_cyclicBufferPos] = curMatch; #else CIndex *ptr0 = son + (_cyclicBufferPos << 1) + 1; CIndex *ptr1 = son + (_cyclicBufferPos << 1); UInt32 len0, len1; len0 = len1 = kNumHashDirectBytes; #endif #if kNumHashDirectBytes != 0 if(curMatch > matchMinPos) { if (_buffer[curMatch + kNumHashDirectBytes] != cur[kNumHashDirectBytes]) { distances[offset++] = maxLen = kNumHashDirectBytes; distances[offset++] = _pos - curMatch - 1; } } #endif UInt32 count = _cutValue; while(true) { if(curMatch <= matchMinPos || count-- == 0) { #ifndef _HASH_CHAIN *ptr0 = *ptr1 = kEmptyHashValue; #endif break; } UInt32 delta = _pos - curMatch; UInt32 cyclicPos = (delta <= _cyclicBufferPos) ? (_cyclicBufferPos - delta): (_cyclicBufferPos - delta + _cyclicBufferSize); CIndex *pair = son + #ifdef _HASH_CHAIN cyclicPos; #else (cyclicPos << 1); #endif // _mm_prefetch((const char *)pair, _MM_HINT_T0); const Byte *pb = _buffer + curMatch; UInt32 len = #ifdef _HASH_CHAIN kNumHashDirectBytes; if (pb[maxLen] == cur[maxLen]) #else MyMin(len0, len1); #endif if (pb[len] == cur[len]) { while(++len != lenLimit) if (pb[len] != cur[len]) break; if (maxLen < len) { distances[offset++] = maxLen = len; distances[offset++] = delta - 1; if (len == lenLimit) { #ifndef _HASH_CHAIN *ptr1 = pair[0]; *ptr0 = pair[1]; #endif break; } } } #ifdef _HASH_CHAIN curMatch = *pair; #else if (pb[len] < cur[len]) { *ptr1 = curMatch; ptr1 = pair + 1; curMatch = *ptr1; len1 = len; } else { *ptr0 = curMatch; ptr0 = pair; curMatch = *ptr0; len0 = len; } #endif } distances[0] = offset - 1; if (++_cyclicBufferPos == _cyclicBufferSize) _cyclicBufferPos = 0; RINOK(CLZInWindow::MovePos()); if (_pos == kMaxValForNormalize) Normalize(); return S_OK; } STDMETHODIMP CMatchFinder::Skip(UInt32 num) { do { #ifdef _HASH_CHAIN if (_streamPos - _pos < kNumHashBytes) { RINOK(MovePos()); continue; } #else UInt32 lenLimit; if (_pos + _matchMaxLen <= _streamPos) lenLimit = _matchMaxLen; else { lenLimit = _streamPos - _pos; if(lenLimit < kMinMatchCheck) { RINOK(MovePos()); continue; } } UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; #endif const Byte *cur = _buffer + _pos; #ifdef HASH_ARRAY_2 UInt32 hash2Value; #ifdef HASH_ARRAY_3 UInt32 hash3Value; UInt32 hashValue; HASH_CALC; _hash[kHash3Offset + hash3Value] = _pos; #else UInt32 hashValue; HASH_CALC; #endif _hash[hash2Value] = _pos; #else UInt32 hashValue = Hash(cur); #endif UInt32 curMatch = _hash[kFixHashSize + hashValue]; _hash[kFixHashSize + hashValue] = _pos; #ifdef _HASH_CHAIN _son[_cyclicBufferPos] = curMatch; #else CIndex *son = _son; CIndex *ptr0 = son + (_cyclicBufferPos << 1) + 1; CIndex *ptr1 = son + (_cyclicBufferPos << 1); UInt32 len0, len1; len0 = len1 = kNumHashDirectBytes; UInt32 count = _cutValue; while(true) { if(curMatch <= matchMinPos || count-- == 0) { *ptr0 = *ptr1 = kEmptyHashValue; break; } UInt32 delta = _pos - curMatch; UInt32 cyclicPos = (delta <= _cyclicBufferPos) ? (_cyclicBufferPos - delta): (_cyclicBufferPos - delta + _cyclicBufferSize); CIndex *pair = son + (cyclicPos << 1); // _mm_prefetch((const char *)pair, _MM_HINT_T0); const Byte *pb = _buffer + curMatch; UInt32 len = MyMin(len0, len1); if (pb[len] == cur[len]) { while(++len != lenLimit) if (pb[len] != cur[len]) break; if (len == lenLimit) { *ptr1 = pair[0]; *ptr0 = pair[1]; break; } } if (pb[len] < cur[len]) { *ptr1 = curMatch; ptr1 = pair + 1; curMatch = *ptr1; len1 = len; } else { *ptr0 = curMatch; ptr0 = pair; curMatch = *ptr0; len0 = len; } } #endif if (++_cyclicBufferPos == _cyclicBufferSize) _cyclicBufferPos = 0; RINOK(CLZInWindow::MovePos()); if (_pos == kMaxValForNormalize) Normalize(); } while(--num != 0); return S_OK; } void CMatchFinder::Normalize() { UInt32 subValue = _pos - _cyclicBufferSize; CIndex *items = _hash; UInt32 numItems = (_hashSizeSum + _cyclicBufferSize #ifndef _HASH_CHAIN * 2 #endif ); for (UInt32 i = 0; i < numItems; i++) { UInt32 value = items[i]; if (value <= subValue) value = kEmptyHashValue; else value -= subValue; items[i] = value; } ReduceOffsets(subValue); } HRESULT CMatchFinder::MovePos() { if (++_cyclicBufferPos == _cyclicBufferSize) _cyclicBufferPos = 0; RINOK(CLZInWindow::MovePos()); if (_pos == kMaxValForNormalize) Normalize(); return S_OK; } STDMETHODIMP_(Byte) CMatchFinder::GetIndexByte(Int32 index) { return CLZInWindow::GetIndexByte(index); } STDMETHODIMP_(UInt32) CMatchFinder::GetMatchLen(Int32 index, UInt32 back, UInt32 limit) { return CLZInWindow::GetMatchLen(index, back, limit); } STDMETHODIMP_(UInt32) CMatchFinder::GetNumAvailableBytes() { return CLZInWindow::GetNumAvailableBytes(); } STDMETHODIMP_(const Byte *) CMatchFinder::GetPointerToCurrentPos() { return CLZInWindow::GetPointerToCurrentPos(); } STDMETHODIMP_(Int32) CMatchFinder::NeedChangeBufferPos(UInt32 numCheckBytes) { return CLZInWindow::NeedMove(numCheckBytes) ? 1: 0; } STDMETHODIMP_(void) CMatchFinder::ChangeBufferPos() { CLZInWindow::MoveBlock();} #undef HASH_CALC #undef kNumHashDirectBytes } nsis-3.11/Source/7zip/7zip/Compress/LZ/IMatchFinder.h000077500000000000000000000026701477201124000222300ustar00rootroot00000000000000/* * IMatchFinder.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __IMATCHFINDER_H #define __IMATCHFINDER_H struct IInWindowStream: public IUnknown { STDMETHOD(SetStream)(ISequentialInStream *inStream) PURE; STDMETHOD_(void, ReleaseStream)() PURE; STDMETHOD(Init)() PURE; STDMETHOD_(Byte, GetIndexByte)(Int32 index) PURE; STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 distance, UInt32 limit) PURE; STDMETHOD_(UInt32, GetNumAvailableBytes)() PURE; STDMETHOD_(const Byte *, GetPointerToCurrentPos)() PURE; STDMETHOD_(Int32, NeedChangeBufferPos)(UInt32 numCheckBytes) PURE; STDMETHOD_(void, ChangeBufferPos)() PURE; }; struct IMatchFinder: public IInWindowStream { STDMETHOD(Create)(UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter) PURE; STDMETHOD(GetMatches)(UInt32 *distances) PURE; STDMETHOD(Skip)(UInt32 num) PURE; }; struct IMatchFinderSetNumPasses { virtual void SetNumPasses(UInt32 numPasses) PURE; }; #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/LZInWindow.cpp000077500000000000000000000057321477201124000222740ustar00rootroot00000000000000/* * LZInWindow.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "LZInWindow.h" #include "../../../Common/MyCom.h" #include "../../../Common/Alloc.h" void CLZInWindow::Free() { ::BigFree(_bufferBase); _bufferBase = 0; } bool CLZInWindow::Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv) { _keepSizeBefore = keepSizeBefore; _keepSizeAfter = keepSizeAfter; UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; if (_bufferBase == 0 || _blockSize != blockSize) { Free(); _blockSize = blockSize; if (_blockSize != 0) _bufferBase = (Byte *)::BigAlloc(_blockSize); } _pointerToLastSafePosition = _bufferBase + _blockSize - keepSizeAfter; if (_blockSize == 0) return true; return (_bufferBase != 0); } void CLZInWindow::SetStream(ISequentialInStream *stream) { _stream = stream; } HRESULT CLZInWindow::Init() { _buffer = _bufferBase; _pos = 0; _streamPos = 0; _streamEndWasReached = false; return ReadBlock(); } /* void CLZInWindow::ReleaseStream() { _stream.Release(); } */ /////////////////////////////////////////// // ReadBlock // In State: // (_buffer + _streamPos) <= (_bufferBase + _blockSize) // Out State: // _posLimit <= _blockSize - _keepSizeAfter; // if(_streamEndWasReached == false): // _streamPos >= _pos + _keepSizeAfter // _posLimit = _streamPos - _keepSizeAfter; // else // HRESULT CLZInWindow::ReadBlock() { if(_streamEndWasReached) return S_OK; while(true) { UInt32 size = (UInt32)(_bufferBase - _buffer) + _blockSize - _streamPos; if(size == 0) return S_OK; UInt32 numReadBytes; RINOK(_stream->Read(_buffer + _streamPos, size, &numReadBytes)); if(numReadBytes == 0) { _posLimit = _streamPos; const Byte *pointerToPostion = _buffer + _posLimit; if(pointerToPostion > _pointerToLastSafePosition) _posLimit = (UInt32)(_pointerToLastSafePosition - _buffer); _streamEndWasReached = true; return S_OK; } _streamPos += numReadBytes; if(_streamPos >= _pos + _keepSizeAfter) { _posLimit = _streamPos - _keepSizeAfter; return S_OK; } } } void CLZInWindow::MoveBlock() { UInt32 offset = (UInt32)(_buffer - _bufferBase) + _pos - _keepSizeBefore; // we need one additional byte, since MovePos moves on 1 byte. if (offset > 0) offset--; UInt32 numBytes = (UInt32)(_buffer - _bufferBase) + _streamPos - offset; memmove(_bufferBase, _bufferBase + offset, numBytes); _buffer -= offset; } nsis-3.11/Source/7zip/7zip/Compress/LZ/LZInWindow.h000077500000000000000000000057071477201124000217430ustar00rootroot00000000000000/* * LZInWindow.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __LZ_IN_WINDOW_H #define __LZ_IN_WINDOW_H #include "../../IStream.h" class CLZInWindow { Byte *_bufferBase; // pointer to buffer with data ISequentialInStream *_stream; UInt32 _posLimit; // offset (from _buffer) when new block reading must be done bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream const Byte *_pointerToLastSafePosition; protected: Byte *_buffer; // Pointer to virtual Buffer begin UInt32 _blockSize; // Size of Allocated memory block UInt32 _pos; // offset (from _buffer) of curent byte UInt32 _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos UInt32 _keepSizeAfter; // how many BYTEs must be kept buffer after _pos UInt32 _streamPos; // offset (from _buffer) of first not read byte from Stream void MoveBlock(); HRESULT ReadBlock(); void Free(); public: CLZInWindow(): _bufferBase(0) {} virtual ~CLZInWindow() { Free(); } // keepSizeBefore + keepSizeAfter + keepSizeReserv < 4G) bool Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv = (1<<17)); void SetStream(ISequentialInStream *stream); HRESULT Init(); // void ReleaseStream(); Byte *GetBuffer() const { return _buffer; } const Byte *GetPointerToCurrentPos() const { return _buffer + _pos; } HRESULT MovePos() { _pos++; if (_pos > _posLimit) { const Byte *pointerToPostion = _buffer + _pos; if(pointerToPostion > _pointerToLastSafePosition) MoveBlock(); return ReadBlock(); } else return S_OK; } Byte GetIndexByte(Int32 index) const { return _buffer[(size_t)_pos + index]; } // index + limit have not to exceed _keepSizeAfter; // -2G <= index < 2G UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) const { if(_streamEndWasReached) if ((_pos + index) + limit > _streamPos) limit = _streamPos - (_pos + index); distance++; const Byte *pby = _buffer + (size_t)_pos + index; UInt32 i; for(i = 0; i < limit && pby[i] == pby[(size_t)i - distance]; i++); return i; } UInt32 GetNumAvailableBytes() const { return _streamPos - _pos; } void ReduceOffsets(Int32 subValue) { _buffer += subValue; _posLimit -= subValue; _pos -= subValue; _streamPos -= subValue; } bool NeedMove(size_t numCheckBytes) { size_t reserv = _pointerToLastSafePosition - (_buffer + _pos); return (reserv <= numCheckBytes); } }; #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/LZOutWindow.cpp000077500000000000000000000013361477201124000224710ustar00rootroot00000000000000/* * LZOutWindow.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "../../../Common/Alloc.h" #include "LZOutWindow.h" void CLZOutWindow::Init(bool solid) { if(!solid) COutBuffer::Init(); #ifdef _NO_EXCEPTIONS ErrorCode = S_OK; #endif } nsis-3.11/Source/7zip/7zip/Compress/LZ/LZOutWindow.h000077500000000000000000000030171477201124000221340ustar00rootroot00000000000000/* * LZOutWindow.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __LZ_OUT_WINDOW_H #define __LZ_OUT_WINDOW_H #include "../../IStream.h" #include "../../Common/OutBuffer.h" #ifndef _NO_EXCEPTIONS typedef COutBufferException CLZOutWindowException; #endif class CLZOutWindow: public COutBuffer { public: void Init(bool solid = false); // distance >= 0, len > 0, bool CopyBlock(UInt32 distance, UInt32 len) { UInt32 pos = _pos - distance - 1; if (distance >= _pos) { if (!_overDict || distance >= _bufferSize) return false; pos += _bufferSize; } do { if (pos == _bufferSize) pos = 0; _buffer[_pos++] = _buffer[pos++]; if (_pos == _limitPos) FlushWithCheck(); } while(--len != 0); return true; } void PutByte(Byte b) { _buffer[_pos++] = b; if (_pos == _limitPos) FlushWithCheck(); } Byte GetByte(UInt32 distance) const { UInt32 pos = _pos - distance - 1; if (pos >= _bufferSize) pos += _bufferSize; return _buffer[pos]; } }; #endif nsis-3.11/Source/7zip/7zip/Compress/LZ/StdAfx.h000077500000000000000000000000741477201124000211200ustar00rootroot00000000000000// StdAfx.h #ifndef __STDAFX_H #define __STDAFX_H #endif nsis-3.11/Source/7zip/7zip/Compress/LZMA/000077500000000000000000000000001477201124000177705ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Compress/LZMA/LZMA.h000077500000000000000000000053101477201124000207060ustar00rootroot00000000000000/* * LZMA.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __LZMA_H #define __LZMA_H namespace NCompress { namespace NLZMA { const UInt32 kNumRepDistances = 4; const int kNumStates = 12; const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; class CState { public: Byte Index; void Init() { Index = 0; } void UpdateChar() { Index = kLiteralNextStates[Index]; } void UpdateMatch() { Index = kMatchNextStates[Index]; } void UpdateRep() { Index = kRepNextStates[Index]; } void UpdateShortRep() { Index = kShortRepNextStates[Index]; } bool IsCharState() const { return Index < 7; } }; const int kNumPosSlotBits = 6; const int kDicLogSizeMin = 0; const int kDicLogSizeMax = 32; const int kDistTableSizeMax = kDicLogSizeMax * 2; const UInt32 kNumLenToPosStates = 4; inline UInt32 GetLenToPosState(UInt32 len) { len -= 2; if (len < kNumLenToPosStates) return len; return kNumLenToPosStates - 1; } namespace NLength { const int kNumPosStatesBitsMax = 4; const UInt32 kNumPosStatesMax = (1 << kNumPosStatesBitsMax); const int kNumPosStatesBitsEncodingMax = 4; const UInt32 kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); const int kNumLowBits = 3; const int kNumMidBits = 3; const int kNumHighBits = 8; const UInt32 kNumLowSymbols = 1 << kNumLowBits; const UInt32 kNumMidSymbols = 1 << kNumMidBits; const UInt32 kNumSymbolsTotal = kNumLowSymbols + kNumMidSymbols + (1 << kNumHighBits); } const UInt32 kMatchMinLen = 2; const UInt32 kMatchMaxLen = kMatchMinLen + NLength::kNumSymbolsTotal - 1; const int kNumAlignBits = 4; const UInt32 kAlignTableSize = 1 << kNumAlignBits; const UInt32 kAlignMask = (kAlignTableSize - 1); const UInt32 kStartPosModelIndex = 4; const UInt32 kEndPosModelIndex = 14; const UInt32 kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; const UInt32 kNumFullDistances = 1 << (kEndPosModelIndex / 2); const int kNumLitPosStatesBitsEncodingMax = 4; const int kNumLitContextBitsMax = 8; const int kNumMoveBits = 5; }} #endif nsis-3.11/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.cpp000077500000000000000000001306761477201124000225570ustar00rootroot00000000000000/* * LZMAEncoder.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "../../../Common/Defs.h" #include "../../Common/StreamUtils.h" #include "LZMAEncoder.h" // for minimal compressing code size define these: // #define COMPRESS_MF_BT // #define COMPRESS_MF_BT4 #if !defined(COMPRESS_MF_BT) && !defined(COMPRESS_MF_HC) #define COMPRESS_MF_BT #define COMPRESS_MF_HC #endif #ifdef COMPRESS_MF_BT #if !defined(COMPRESS_MF_BT2) && !defined(COMPRESS_MF_BT3) && !defined(COMPRESS_MF_BT4) #define COMPRESS_MF_BT2 #define COMPRESS_MF_BT3 #define COMPRESS_MF_BT4 #endif #ifdef COMPRESS_MF_BT2 #include "../LZ/BinTree/BinTree2.h" #endif #ifdef COMPRESS_MF_BT3 #include "../LZ/BinTree/BinTree3.h" #endif #ifdef COMPRESS_MF_BT4 #include "../LZ/BinTree/BinTree4.h" #endif #endif #ifdef COMPRESS_MF_HC #include "../LZ/HashChain/HC4.h" #endif #ifdef COMPRESS_MF_MT #include "../LZ/MT/MT.h" #endif namespace NCompress { namespace NLZMA { const int kDefaultDictionaryLogSize = 22; const UInt32 kNumFastBytesDefault = 0x20; enum { kBT2, kBT3, kBT4, kHC4 }; /*static const wchar_t *kMatchFinderIDs[] = { L"BT2", L"BT3", L"BT4", L"HC4" };*/ Byte g_FastPos[1 << 11]; class CFastPosInit { public: CFastPosInit() { Init(); } void Init() { const Byte kFastSlots = 22; int c = 2; g_FastPos[0] = 0; g_FastPos[1] = 1; for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++) { UInt32 k = (1 << ((slotFast >> 1) - 1)); for (UInt32 j = 0; j < k; j++, c++) g_FastPos[c] = slotFast; } } } g_FastPosInit; void CLiteralEncoder2::Encode(NRangeCoder::CEncoder *rangeEncoder, Byte symbol) { UInt32 context = 1; int i = 8; do { i--; UInt32 bit = (symbol >> i) & 1; _encoders[context].Encode(rangeEncoder, bit); context = (context << 1) | bit; } while(i != 0); } void CLiteralEncoder2::EncodeMatched(NRangeCoder::CEncoder *rangeEncoder, Byte matchByte, Byte symbol) { UInt32 context = 1; int i = 8; do { i--; UInt32 bit = (symbol >> i) & 1; UInt32 matchBit = (matchByte >> i) & 1; _encoders[0x100 + (matchBit << 8) + context].Encode(rangeEncoder, bit); context = (context << 1) | bit; if (matchBit != bit) { while(i != 0) { i--; UInt32 bit = (symbol >> i) & 1; _encoders[context].Encode(rangeEncoder, bit); context = (context << 1) | bit; } break; } } while(i != 0); } UInt32 CLiteralEncoder2::GetPrice(bool matchMode, Byte matchByte, Byte symbol) const { UInt32 price = 0; UInt32 context = 1; int i = 8; if (matchMode) { do { i--; UInt32 matchBit = (matchByte >> i) & 1; UInt32 bit = (symbol >> i) & 1; price += _encoders[0x100 + (matchBit << 8) + context].GetPrice(bit); context = (context << 1) | bit; if (matchBit != bit) break; } while (i != 0); } while(i != 0) { i--; UInt32 bit = (symbol >> i) & 1; price += _encoders[context].GetPrice(bit); context = (context << 1) | bit; } return price; }; namespace NLength { void CEncoder::Init(UInt32 numPosStates) { _choice.Init(); _choice2.Init(); for (UInt32 posState = 0; posState < numPosStates; posState++) { _lowCoder[posState].Init(); _midCoder[posState].Init(); } _highCoder.Init(); } void CEncoder::Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState) { if(symbol < kNumLowSymbols) { _choice.Encode(rangeEncoder, 0); _lowCoder[posState].Encode(rangeEncoder, symbol); } else { _choice.Encode(rangeEncoder, 1); if(symbol < kNumLowSymbols + kNumMidSymbols) { _choice2.Encode(rangeEncoder, 0); _midCoder[posState].Encode(rangeEncoder, symbol - kNumLowSymbols); } else { _choice2.Encode(rangeEncoder, 1); _highCoder.Encode(rangeEncoder, symbol - kNumLowSymbols - kNumMidSymbols); } } } void CEncoder::SetPrices(UInt32 posState, UInt32 numSymbols, UInt32 *prices) const { UInt32 a0 = _choice.GetPrice0(); UInt32 a1 = _choice.GetPrice1(); UInt32 b0 = a1 + _choice2.GetPrice0(); UInt32 b1 = a1 + _choice2.GetPrice1(); UInt32 i = 0; for (i = 0; i < kNumLowSymbols; i++) { if (i >= numSymbols) return; prices[i] = a0 + _lowCoder[posState].GetPrice(i); } for (; i < kNumLowSymbols + kNumMidSymbols; i++) { if (i >= numSymbols) return; prices[i] = b0 + _midCoder[posState].GetPrice(i - kNumLowSymbols); } for (; i < numSymbols; i++) prices[i] = b1 + _highCoder.GetPrice(i - kNumLowSymbols - kNumMidSymbols); } } CEncoder::CEncoder(): _numFastBytes(kNumFastBytesDefault), _distTableSize(kDefaultDictionaryLogSize * 2), _posStateBits(2), _posStateMask(4 - 1), _numLiteralPosStateBits(0), _numLiteralContextBits(3), _dictionarySize(1 << kDefaultDictionaryLogSize), _dictionarySizePrev(UInt32(-1)), _numFastBytesPrev(UInt32(-1)), _matchFinderCycles(0), _matchFinderIndex(kBT4), #ifdef COMPRESS_MF_MT _multiThread(false), #endif _writeEndMark(false), setMfPasses(0) { // _maxMode = false; _fastMode = false; } HRESULT CEncoder::Create() { if (!_rangeEncoder.Create(1 << 20)) return E_OUTOFMEMORY; if (!_matchFinder) { switch(_matchFinderIndex) { #ifdef COMPRESS_MF_BT #ifdef COMPRESS_MF_BT2 case kBT2: { NBT2::CMatchFinder *mfSpec = new NBT2::CMatchFinder; setMfPasses = mfSpec; _matchFinder = mfSpec; break; } #endif #ifdef COMPRESS_MF_BT3 case kBT3: { NBT3::CMatchFinder *mfSpec = new NBT3::CMatchFinder; setMfPasses = mfSpec; _matchFinder = mfSpec; break; } #endif #ifdef COMPRESS_MF_BT4 case kBT4: { NBT4::CMatchFinder *mfSpec = new NBT4::CMatchFinder; setMfPasses = mfSpec; _matchFinder = mfSpec; break; } #endif #endif #ifdef COMPRESS_MF_HC case kHC4: { NHC4::CMatchFinder *mfSpec = new NHC4::CMatchFinder; setMfPasses = mfSpec; _matchFinder = mfSpec; break; } #endif } if (_matchFinder == 0) return E_OUTOFMEMORY; #ifdef COMPRESS_MF_MT if (_multiThread && !(_fastMode && (_matchFinderIndex == kHC4))) { CMatchFinderMT *mfSpec = new CMatchFinderMT; if (mfSpec == 0) return E_OUTOFMEMORY; CMyComPtr mf = mfSpec; RINOK(mfSpec->SetMatchFinder(_matchFinder)); _matchFinder.Release(); _matchFinder = mf; } #endif } if (!_literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits)) return E_OUTOFMEMORY; if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) return S_OK; RINOK(_matchFinder->Create(_dictionarySize, kNumOpts, _numFastBytes, kMatchMaxLen + 1)); // actually it's + _numFastBytes - _numFastBytes if (_matchFinderCycles != 0 && setMfPasses != 0) setMfPasses->SetNumPasses(_matchFinderCycles); _dictionarySizePrev = _dictionarySize; _numFastBytesPrev = _numFastBytes; return S_OK; } /*static bool AreStringsEqual(const wchar_t *base, const wchar_t *testString) { while (true) { wchar_t c = *testString; if (c >= 'a' && c <= 'z') c -= 0x20; if (*base != c) return false; if (c == 0) return true; base++; testString++; } } static int FindMatchFinder(const wchar_t *s) { for (int m = 0; m < (int)(_countof(kMatchFinderIDs)); m++) if (AreStringsEqual(kMatchFinderIDs[m], s)) return m; return -1; }*/ STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties) { for (UInt32 i = 0; i < numProperties; i++) { const PROPVARIANT &prop = properties[i]; switch(propIDs[i]) { case NCoderPropID::kNumFastBytes: { if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 numFastBytes = prop.ulVal; if(numFastBytes < 5 || numFastBytes > kMatchMaxLen) return E_INVALIDARG; _numFastBytes = numFastBytes; break; } case NCoderPropID::kMatchFinderCycles: { if (prop.vt != VT_UI4) return E_INVALIDARG; _matchFinderCycles = prop.ulVal; break; } case NCoderPropID::kAlgorithm: { if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 maximize = prop.ulVal; _fastMode = (maximize == 0); // _maxMode = (maximize >= 2); break; } case NCoderPropID::kMatchFinder: { return E_NOTIMPL; /*if (prop.vt != VT_BSTR) return E_INVALIDARG; int matchFinderIndexPrev = _matchFinderIndex; int m = FindMatchFinder(prop.bstrVal); if (m < 0) return E_INVALIDARG; _matchFinderIndex = m; if (_matchFinder && matchFinderIndexPrev != _matchFinderIndex) { _dictionarySizePrev = (UInt32)-1; ReleaseMatchFinder(); } break;*/ } #ifdef COMPRESS_MF_MT case NCoderPropID::kMultiThread: { if (prop.vt != VT_BOOL) return E_INVALIDARG; bool newMultiThread = (prop.boolVal == VARIANT_TRUE); if (newMultiThread != _multiThread) { _dictionarySizePrev = (UInt32)-1; ReleaseMatchFinder(); _multiThread = newMultiThread; } break; } case NCoderPropID::kNumThreads: { if (prop.vt != VT_UI4) return E_INVALIDARG; bool newMultiThread = (prop.ulVal > 1); if (newMultiThread != _multiThread) { _dictionarySizePrev = (UInt32)-1; ReleaseMatchFinder(); _multiThread = newMultiThread; } break; } #endif case NCoderPropID::kDictionarySize: { const int kDicLogSizeMaxCompress = 30; if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 dictionarySize = prop.ulVal; if (dictionarySize < UInt32(1 << kDicLogSizeMin) || dictionarySize > UInt32(1 << kDicLogSizeMaxCompress)) return E_INVALIDARG; _dictionarySize = dictionarySize; UInt32 dicLogSize; for(dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++) if (dictionarySize <= (UInt32(1) << dicLogSize)) break; _distTableSize = dicLogSize * 2; break; } case NCoderPropID::kPosStateBits: { if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 value = prop.ulVal; if (value > (UInt32)NLength::kNumPosStatesBitsEncodingMax) return E_INVALIDARG; _posStateBits = value; _posStateMask = (1 << _posStateBits) - 1; break; } case NCoderPropID::kLitPosBits: { if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 value = prop.ulVal; if (value > (UInt32)kNumLitPosStatesBitsEncodingMax) return E_INVALIDARG; _numLiteralPosStateBits = value; break; } case NCoderPropID::kLitContextBits: { if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 value = prop.ulVal; if (value > (UInt32)kNumLitContextBitsMax) return E_INVALIDARG; _numLiteralContextBits = value; break; } case NCoderPropID::kEndMarker: { if (prop.vt != VT_BOOL) return E_INVALIDARG; SetWriteEndMarkerMode(prop.boolVal == VARIANT_TRUE); break; } default: return E_INVALIDARG; } } return S_OK; } STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) { const UInt32 kPropSize = 5; Byte properties[kPropSize]; properties[0] = (_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits; for (int i = 0; i < 4; i++) properties[1 + i] = Byte(_dictionarySize >> (8 * i)); return WriteStream(outStream, properties, kPropSize, NULL); } STDMETHODIMP CEncoder::SetOutStream(ISequentialOutStream *outStream) { _rangeEncoder.SetStream(outStream); return S_OK; } STDMETHODIMP CEncoder::ReleaseOutStream() { _rangeEncoder.ReleaseStream(); return S_OK; } HRESULT CEncoder::Init() { CBaseState::Init(); // RINOK(_matchFinder->Init(inStream)); _rangeEncoder.Init(); for(int i = 0; i < kNumStates; i++) { for (UInt32 j = 0; j <= _posStateMask; j++) { _isMatch[i][j].Init(); _isRep0Long[i][j].Init(); } _isRep[i].Init(); _isRepG0[i].Init(); _isRepG1[i].Init(); _isRepG2[i].Init(); } _literalEncoder.Init(); { for(UInt32 i = 0; i < kNumLenToPosStates; i++) _posSlotEncoder[i].Init(); } { for(UInt32 i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) _posEncoders[i].Init(); } _lenEncoder.Init(1 << _posStateBits); _repMatchLenEncoder.Init(1 << _posStateBits); _posAlignEncoder.Init(); _longestMatchWasFound = false; _optimumEndIndex = 0; _optimumCurrentIndex = 0; _additionalOffset = 0; return S_OK; } HRESULT CEncoder::MovePos(UInt32 num) { if (num == 0) return S_OK; _additionalOffset += num; return _matchFinder->Skip(num); } UInt32 CEncoder::Backward(UInt32 &backRes, UInt32 cur) { _optimumEndIndex = cur; UInt32 posMem = _optimum[cur].PosPrev; UInt32 backMem = _optimum[cur].BackPrev; do { if (_optimum[cur].Prev1IsChar) { _optimum[posMem].MakeAsChar(); _optimum[posMem].PosPrev = posMem - 1; if (_optimum[cur].Prev2) { _optimum[posMem - 1].Prev1IsChar = false; _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; } } UInt32 posPrev = posMem; UInt32 backCur = backMem; backMem = _optimum[posPrev].BackPrev; posMem = _optimum[posPrev].PosPrev; _optimum[posPrev].BackPrev = backCur; _optimum[posPrev].PosPrev = cur; cur = posPrev; } while(cur != 0); backRes = _optimum[0].BackPrev; _optimumCurrentIndex = _optimum[0].PosPrev; return _optimumCurrentIndex; } /* Out: (lenRes == 1) && (backRes == 0xFFFFFFFF) means Literal */ HRESULT CEncoder::GetOptimum(UInt32 position, UInt32 &backRes, UInt32 &lenRes) { if(_optimumEndIndex != _optimumCurrentIndex) { const COptimal &optimum = _optimum[_optimumCurrentIndex]; lenRes = optimum.PosPrev - _optimumCurrentIndex; backRes = optimum.BackPrev; _optimumCurrentIndex = optimum.PosPrev; return S_OK; } _optimumCurrentIndex = _optimumEndIndex = 0; UInt32 lenMain, numDistancePairs; if (!_longestMatchWasFound) { RINOK(ReadMatchDistances(lenMain, numDistancePairs)); } else { lenMain = _longestMatchLength; numDistancePairs = _numDistancePairs; _longestMatchWasFound = false; } const Byte *data = _matchFinder->GetPointerToCurrentPos() - 1; UInt32 numAvailableBytes = _matchFinder->GetNumAvailableBytes() + 1; if (numAvailableBytes < 2) { backRes = (UInt32)(-1); lenRes = 1; return S_OK; } if (numAvailableBytes > kMatchMaxLen) numAvailableBytes = kMatchMaxLen; UInt32 reps[kNumRepDistances]; UInt32 repLens[kNumRepDistances]; UInt32 repMaxIndex = 0; UInt32 i; for(i = 0; i < kNumRepDistances; i++) { reps[i] = _repDistances[i]; UInt32 backOffset = reps[i] + 1; if (data[0] != data[(size_t)0 - backOffset] || data[1] != data[(size_t)1 - backOffset]) { repLens[i] = 0; continue; } UInt32 lenTest; for (lenTest = 2; lenTest < numAvailableBytes && data[lenTest] == data[(size_t)lenTest - backOffset]; lenTest++); repLens[i] = lenTest; if (lenTest > repLens[repMaxIndex]) repMaxIndex = i; } if(repLens[repMaxIndex] >= _numFastBytes) { backRes = repMaxIndex; lenRes = repLens[repMaxIndex]; return MovePos(lenRes - 1); } UInt32 *matchDistances = _matchDistances + 1; if(lenMain >= _numFastBytes) { backRes = matchDistances[numDistancePairs - 1] + kNumRepDistances; lenRes = lenMain; return MovePos(lenMain - 1); } Byte currentByte = *data; Byte matchByte = data[(size_t)0 - reps[0] - 1]; if(lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) { backRes = (UInt32)-1; lenRes = 1; return S_OK; } _optimum[0].State = _state; UInt32 posState = (position & _posStateMask); _optimum[1].Price = _isMatch[_state.Index][posState].GetPrice0() + _literalEncoder.GetSubCoder(position, _previousByte)->GetPrice(!_state.IsCharState(), matchByte, currentByte); _optimum[1].MakeAsChar(); UInt32 matchPrice = _isMatch[_state.Index][posState].GetPrice1(); UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); if(matchByte == currentByte) { UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); if(shortRepPrice < _optimum[1].Price) { _optimum[1].Price = shortRepPrice; _optimum[1].MakeAsShortRep(); } } UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); if(lenEnd < 2) { backRes = _optimum[1].BackPrev; lenRes = 1; return S_OK; } _optimum[1].PosPrev = 0; for (i = 0; i < kNumRepDistances; i++) _optimum[0].Backs[i] = reps[i]; UInt32 len = lenEnd; do _optimum[len--].Price = kIfinityPrice; while (len >= 2); for(i = 0; i < kNumRepDistances; i++) { UInt32 repLen = repLens[i]; if (repLen < 2) continue; UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState); do { UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); COptimal &optimum = _optimum[repLen]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = 0; optimum.BackPrev = i; optimum.Prev1IsChar = false; } } while(--repLen >= 2); } UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); if (len <= lenMain) { UInt32 offs = 0; while (len > matchDistances[offs]) offs += 2; for(; ; len++) { UInt32 distance = matchDistances[offs + 1]; UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); COptimal &optimum = _optimum[len]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = 0; optimum.BackPrev = distance + kNumRepDistances; optimum.Prev1IsChar = false; } if (len == matchDistances[offs]) { offs += 2; if (offs == numDistancePairs) break; } } } UInt32 cur = 0; while(true) { cur++; if(cur == lenEnd) { lenRes = Backward(backRes, cur); return S_OK; } UInt32 newLen, numDistancePairs; RINOK(ReadMatchDistances(newLen, numDistancePairs)); if(newLen >= _numFastBytes) { _numDistancePairs = numDistancePairs; _longestMatchLength = newLen; _longestMatchWasFound = true; lenRes = Backward(backRes, cur); return S_OK; } position++; COptimal &curOptimum = _optimum[cur]; UInt32 posPrev = curOptimum.PosPrev; CState state; if (curOptimum.Prev1IsChar) { posPrev--; if (curOptimum.Prev2) { state = _optimum[curOptimum.PosPrev2].State; if (curOptimum.BackPrev2 < kNumRepDistances) state.UpdateRep(); else state.UpdateMatch(); } else state = _optimum[posPrev].State; state.UpdateChar(); } else state = _optimum[posPrev].State; if (posPrev == cur - 1) { if (curOptimum.IsShortRep()) state.UpdateShortRep(); else state.UpdateChar(); } else { UInt32 pos; if (curOptimum.Prev1IsChar && curOptimum.Prev2) { posPrev = curOptimum.PosPrev2; pos = curOptimum.BackPrev2; state.UpdateRep(); } else { pos = curOptimum.BackPrev; if (pos < kNumRepDistances) state.UpdateRep(); else state.UpdateMatch(); } const COptimal &prevOptimum = _optimum[posPrev]; if (pos < kNumRepDistances) { reps[0] = prevOptimum.Backs[pos]; UInt32 i; for(i = 1; i <= pos; i++) reps[i] = prevOptimum.Backs[i - 1]; for(; i < kNumRepDistances; i++) reps[i] = prevOptimum.Backs[i]; } else { reps[0] = (pos - kNumRepDistances); for(UInt32 i = 1; i < kNumRepDistances; i++) reps[i] = prevOptimum.Backs[i - 1]; } } curOptimum.State = state; for(UInt32 i = 0; i < kNumRepDistances; i++) curOptimum.Backs[i] = reps[i]; UInt32 curPrice = curOptimum.Price; const Byte *data = _matchFinder->GetPointerToCurrentPos() - 1; const Byte currentByte = *data; const Byte matchByte = data[(size_t)0 - reps[0] - 1]; UInt32 posState = (position & _posStateMask); UInt32 curAnd1Price = curPrice + _isMatch[state.Index][posState].GetPrice0() + _literalEncoder.GetSubCoder(position, data[(size_t)0 - 1])->GetPrice(!state.IsCharState(), matchByte, currentByte); COptimal &nextOptimum = _optimum[cur + 1]; bool nextIsChar = false; if (curAnd1Price < nextOptimum.Price) { nextOptimum.Price = curAnd1Price; nextOptimum.PosPrev = cur; nextOptimum.MakeAsChar(); nextIsChar = true; } UInt32 matchPrice = curPrice + _isMatch[state.Index][posState].GetPrice1(); UInt32 repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); if(matchByte == currentByte && !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) { UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); if(shortRepPrice <= nextOptimum.Price) { nextOptimum.Price = shortRepPrice; nextOptimum.PosPrev = cur; nextOptimum.MakeAsShortRep(); nextIsChar = true; } } /* if(newLen == 2 && matchDistances[2] >= kDistLimit2) // test it maybe set 2000 ? continue; */ UInt32 numAvailableBytesFull = _matchFinder->GetNumAvailableBytes() + 1; numAvailableBytesFull = MyMin(kNumOpts - 1 - cur, numAvailableBytesFull); UInt32 numAvailableBytes = numAvailableBytesFull; if (numAvailableBytes < 2) continue; if (numAvailableBytes > _numFastBytes) numAvailableBytes = _numFastBytes; if (!nextIsChar && matchByte != currentByte) // speed optimization { // try Literal + rep0 UInt32 backOffset = reps[0] + 1; UInt32 limit = MyMin(numAvailableBytesFull, _numFastBytes + 1); UInt32 temp; for (temp = 1; temp < limit && data[temp] == data[(size_t)temp - backOffset]; temp++); UInt32 lenTest2 = temp - 1; if (lenTest2 >= 2) { CState state2 = state; state2.UpdateChar(); UInt32 posStateNext = (position + 1) & _posStateMask; UInt32 nextRepMatchPrice = curAnd1Price + _isMatch[state2.Index][posStateNext].GetPrice1() + _isRep[state2.Index].GetPrice1(); // for (; lenTest2 >= 2; lenTest2--) { UInt32 offset = cur + 1 + lenTest2; while(lenEnd < offset) _optimum[++lenEnd].Price = kIfinityPrice; UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( 0, lenTest2, state2, posStateNext); COptimal &optimum = _optimum[offset]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = cur + 1; optimum.BackPrev = 0; optimum.Prev1IsChar = true; optimum.Prev2 = false; } } } } UInt32 startLen = 2; // speed optimization for(UInt32 repIndex = 0; repIndex < kNumRepDistances; repIndex++) { // UInt32 repLen = _matchFinder->GetMatchLen(0 - 1, reps[repIndex], newLen); // test it; UInt32 backOffset = reps[repIndex] + 1; if (data[0] != data[(size_t)0 - backOffset] || data[1] != data[(size_t)1 - backOffset]) continue; UInt32 lenTest; for (lenTest = 2; lenTest < numAvailableBytes && data[lenTest] == data[(size_t)lenTest - backOffset]; lenTest++); while(lenEnd < cur + lenTest) _optimum[++lenEnd].Price = kIfinityPrice; UInt32 lenTestTemp = lenTest; UInt32 price = repMatchPrice + GetPureRepPrice(repIndex, state, posState); do { UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(lenTest - 2, posState); COptimal &optimum = _optimum[cur + lenTest]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = cur; optimum.BackPrev = repIndex; optimum.Prev1IsChar = false; } } while(--lenTest >= 2); lenTest = lenTestTemp; if (repIndex == 0) startLen = lenTest + 1; // if (_maxMode) { UInt32 lenTest2 = lenTest + 1; UInt32 limit = MyMin(numAvailableBytesFull, lenTest2 + _numFastBytes); for (; lenTest2 < limit && data[lenTest2] == data[(size_t)lenTest2 - backOffset]; lenTest2++); lenTest2 -= lenTest + 1; if (lenTest2 >= 2) { CState state2 = state; state2.UpdateRep(); UInt32 posStateNext = (position + lenTest) & _posStateMask; UInt32 curAndLenCharPrice = price + _repMatchLenEncoder.GetPrice(lenTest - 2, posState) + _isMatch[state2.Index][posStateNext].GetPrice0() + _literalEncoder.GetSubCoder(position + lenTest, data[(size_t)lenTest - 1])->GetPrice( true, data[(size_t)lenTest - backOffset], data[lenTest]); state2.UpdateChar(); posStateNext = (position + lenTest + 1) & _posStateMask; UInt32 nextRepMatchPrice = curAndLenCharPrice + _isMatch[state2.Index][posStateNext].GetPrice1() + _isRep[state2.Index].GetPrice1(); // for(; lenTest2 >= 2; lenTest2--) { UInt32 offset = cur + lenTest + 1 + lenTest2; while(lenEnd < offset) _optimum[++lenEnd].Price = kIfinityPrice; UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( 0, lenTest2, state2, posStateNext); COptimal &optimum = _optimum[offset]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = cur + lenTest + 1; optimum.BackPrev = 0; optimum.Prev1IsChar = true; optimum.Prev2 = true; optimum.PosPrev2 = cur; optimum.BackPrev2 = repIndex; } } } } } // for(UInt32 lenTest = 2; lenTest <= newLen; lenTest++) if (newLen > numAvailableBytes) { newLen = numAvailableBytes; for (numDistancePairs = 0; newLen > matchDistances[numDistancePairs]; numDistancePairs += 2); matchDistances[numDistancePairs] = newLen; numDistancePairs += 2; } if (newLen >= startLen) { UInt32 normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); while(lenEnd < cur + newLen) _optimum[++lenEnd].Price = kIfinityPrice; UInt32 offs = 0; while(startLen > matchDistances[offs]) offs += 2; UInt32 curBack = matchDistances[offs + 1]; UInt32 posSlot = GetPosSlot2(curBack); for(UInt32 lenTest = /*2*/ startLen; ; lenTest++) { UInt32 curAndLenPrice = normalMatchPrice; UInt32 lenToPosState = GetLenToPosState(lenTest); if (curBack < kNumFullDistances) curAndLenPrice += _distancesPrices[lenToPosState][curBack]; else curAndLenPrice += _posSlotPrices[lenToPosState][posSlot] + _alignPrices[curBack & kAlignMask]; curAndLenPrice += _lenEncoder.GetPrice(lenTest - kMatchMinLen, posState); COptimal &optimum = _optimum[cur + lenTest]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = cur; optimum.BackPrev = curBack + kNumRepDistances; optimum.Prev1IsChar = false; } if (/*_maxMode && */lenTest == matchDistances[offs]) { // Try Match + Literal + Rep0 UInt32 backOffset = curBack + 1; UInt32 lenTest2 = lenTest + 1; UInt32 limit = MyMin(numAvailableBytesFull, lenTest2 + _numFastBytes); for (; lenTest2 < limit && data[lenTest2] == data[(size_t)lenTest2 - backOffset]; lenTest2++); lenTest2 -= lenTest + 1; if (lenTest2 >= 2) { CState state2 = state; state2.UpdateMatch(); UInt32 posStateNext = (position + lenTest) & _posStateMask; UInt32 curAndLenCharPrice = curAndLenPrice + _isMatch[state2.Index][posStateNext].GetPrice0() + _literalEncoder.GetSubCoder(position + lenTest, data[(size_t)lenTest - 1])->GetPrice( true, data[(size_t)lenTest - backOffset], data[lenTest]); state2.UpdateChar(); posStateNext = (posStateNext + 1) & _posStateMask; UInt32 nextRepMatchPrice = curAndLenCharPrice + _isMatch[state2.Index][posStateNext].GetPrice1() + _isRep[state2.Index].GetPrice1(); // for(; lenTest2 >= 2; lenTest2--) { UInt32 offset = cur + lenTest + 1 + lenTest2; while(lenEnd < offset) _optimum[++lenEnd].Price = kIfinityPrice; UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); COptimal &optimum = _optimum[offset]; if (curAndLenPrice < optimum.Price) { optimum.Price = curAndLenPrice; optimum.PosPrev = cur + lenTest + 1; optimum.BackPrev = 0; optimum.Prev1IsChar = true; optimum.Prev2 = true; optimum.PosPrev2 = cur; optimum.BackPrev2 = curBack + kNumRepDistances; } } } offs += 2; if (offs == numDistancePairs) break; curBack = matchDistances[offs + 1]; if (curBack >= kNumFullDistances) posSlot = GetPosSlot2(curBack); } } } } } static inline bool ChangePair(UInt32 smallDist, UInt32 bigDist) { return ((bigDist >> 7) > smallDist); } HRESULT CEncoder::ReadMatchDistances(UInt32 &lenRes, UInt32 &numDistancePairs) { lenRes = 0; RINOK(_matchFinder->GetMatches(_matchDistances)); numDistancePairs = _matchDistances[0]; if (numDistancePairs > 0) { lenRes = _matchDistances[1 + numDistancePairs - 2]; if (lenRes == _numFastBytes) lenRes += _matchFinder->GetMatchLen(lenRes - 1, _matchDistances[1 + numDistancePairs - 1], kMatchMaxLen - lenRes); } _additionalOffset++; return S_OK; } HRESULT CEncoder::GetOptimumFast(UInt32 position, UInt32 &backRes, UInt32 &lenRes) { UInt32 lenMain, numDistancePairs; if (!_longestMatchWasFound) { RINOK(ReadMatchDistances(lenMain, numDistancePairs)); } else { lenMain = _longestMatchLength; numDistancePairs = _numDistancePairs; _longestMatchWasFound = false; } const Byte *data = _matchFinder->GetPointerToCurrentPos() - 1; UInt32 numAvailableBytes = _matchFinder->GetNumAvailableBytes() + 1; if (numAvailableBytes > kMatchMaxLen) numAvailableBytes = kMatchMaxLen; if (numAvailableBytes < 2) { backRes = (UInt32)(-1); lenRes = 1; return S_OK; } UInt32 repLens[kNumRepDistances]; UInt32 repMaxIndex = 0; for(UInt32 i = 0; i < kNumRepDistances; i++) { UInt32 backOffset = _repDistances[i] + 1; if (data[0] != data[(size_t)0 - backOffset] || data[1] != data[(size_t)1 - backOffset]) { repLens[i] = 0; continue; } UInt32 len; for (len = 2; len < numAvailableBytes && data[len] == data[(size_t)len - backOffset]; len++); if(len >= _numFastBytes) { backRes = i; lenRes = len; return MovePos(lenRes - 1); } repLens[i] = len; if (len > repLens[repMaxIndex]) repMaxIndex = i; } UInt32 *matchDistances = _matchDistances + 1; if(lenMain >= _numFastBytes) { backRes = matchDistances[numDistancePairs - 1] + kNumRepDistances; lenRes = lenMain; return MovePos(lenMain - 1); } UInt32 backMain = 0; // for GCC if (lenMain >= 2) { backMain = matchDistances[numDistancePairs - 1]; while (numDistancePairs > 2 && lenMain == matchDistances[numDistancePairs - 4] + 1) { if (!ChangePair(matchDistances[numDistancePairs - 3], backMain)) break; numDistancePairs -= 2; lenMain = matchDistances[numDistancePairs - 2]; backMain = matchDistances[numDistancePairs - 1]; } if (lenMain == 2 && backMain >= 0x80) lenMain = 1; } if (repLens[repMaxIndex] >= 2) { if (repLens[repMaxIndex] + 1 >= lenMain || (repLens[repMaxIndex] + 2 >= lenMain && (backMain > (1 << 9))) || (repLens[repMaxIndex] + 3 >= lenMain && (backMain > (1 << 15))) ) { backRes = repMaxIndex; lenRes = repLens[repMaxIndex]; return MovePos(lenRes - 1); } } if (lenMain >= 2 && numAvailableBytes > 2) { RINOK(ReadMatchDistances(_longestMatchLength, _numDistancePairs)); if (_longestMatchLength >= 2) { UInt32 newDistance = matchDistances[_numDistancePairs - 1]; if ((_longestMatchLength >= lenMain && newDistance < backMain) || (_longestMatchLength == lenMain + 1 && !ChangePair(backMain, newDistance)) || (_longestMatchLength > lenMain + 1) || (_longestMatchLength + 1 >= lenMain && lenMain >= 3 && ChangePair(newDistance, backMain))) { _longestMatchWasFound = true; backRes = UInt32(-1); lenRes = 1; return S_OK; } } data++; numAvailableBytes--; for(UInt32 i = 0; i < kNumRepDistances; i++) { UInt32 backOffset = _repDistances[i] + 1; if (data[1] != data[(size_t)1 - backOffset] || data[2] != data[(size_t)2 - backOffset]) { repLens[i] = 0; continue; } UInt32 len; for (len = 2; len < numAvailableBytes && data[len] == data[(size_t)len - backOffset]; len++); if (len + 1 >= lenMain) { _longestMatchWasFound = true; backRes = UInt32(-1); lenRes = 1; return S_OK; } } backRes = backMain + kNumRepDistances; lenRes = lenMain; return MovePos(lenMain - 2); } backRes = UInt32(-1); lenRes = 1; return S_OK; } HRESULT CEncoder::Flush(UInt32 nowPos) { ReleaseMFStream(); WriteEndMarker(nowPos & _posStateMask); _rangeEncoder.FlushData(); return _rangeEncoder.FlushStream(); } void CEncoder::WriteEndMarker(UInt32 posState) { // This function for writing End Mark for stream version of LZMA. // In current version this feature is not used. if (!_writeEndMark) return; _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 1); _isRep[_state.Index].Encode(&_rangeEncoder, 0); _state.UpdateMatch(); UInt32 len = kMatchMinLen; // kMatchMaxLen; _lenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode); UInt32 posSlot = (1 << kNumPosSlotBits) - 1; UInt32 lenToPosState = GetLenToPosState(len); _posSlotEncoder[lenToPosState].Encode(&_rangeEncoder, posSlot); UInt32 footerBits = 30; UInt32 posReduced = (UInt32(1) << footerBits) - 1; _rangeEncoder.EncodeDirectBits(posReduced >> kNumAlignBits, footerBits - kNumAlignBits); _posAlignEncoder.ReverseEncode(&_rangeEncoder, posReduced & kAlignMask); } HRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) { _needReleaseMFStream = false; CCoderReleaser coderReleaser(this); RINOK(SetStreams(inStream, outStream, inSize, outSize)); while(true) { UInt64 processedInSize; UInt64 processedOutSize; Int32 finished; RINOK(CodeOneBlock(&processedInSize, &processedOutSize, &finished)); if (finished != 0) return S_OK; if (progress != 0) { RINOK(progress->SetRatioInfo(&processedInSize, &processedOutSize)); } } } HRESULT CEncoder::SetStreams(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize) { _inStream = inStream; _finished = false; RINOK(Create()); RINOK(SetOutStream(outStream)); RINOK(Init()); // CCoderReleaser releaser(this); /* if (_matchFinder->GetNumAvailableBytes() == 0) return Flush(); */ if (!_fastMode) { FillDistancesPrices(); FillAlignPrices(); } _lenEncoder.SetTableSize(_numFastBytes + 1 - kMatchMinLen); _lenEncoder.UpdateTables(1 << _posStateBits); _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - kMatchMinLen); _repMatchLenEncoder.UpdateTables(1 << _posStateBits); nowPos64 = 0; return S_OK; } HRESULT CEncoder::CodeOneBlock(UInt64 *inSize, UInt64 *outSize, Int32 *finished) { if (_inStream != 0) { RINOK(_matchFinder->SetStream(_inStream)); RINOK(_matchFinder->Init()); _needReleaseMFStream = true; _inStream = 0; } *finished = 1; if (_finished) return S_OK; _finished = true; if (nowPos64 == 0) { if (_matchFinder->GetNumAvailableBytes() == 0) return Flush(UInt32(nowPos64)); UInt32 len, numDistancePairs; RINOK(ReadMatchDistances(len, numDistancePairs)); UInt32 posState = UInt32(nowPos64) & _posStateMask; _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 0); _state.UpdateChar(); Byte curByte = _matchFinder->GetIndexByte(0 - _additionalOffset); _literalEncoder.GetSubCoder(UInt32(nowPos64), _previousByte)->Encode(&_rangeEncoder, curByte); _previousByte = curByte; _additionalOffset--; nowPos64++; } UInt32 nowPos32 = (UInt32)nowPos64; UInt32 progressPosValuePrev = nowPos32; if (_matchFinder->GetNumAvailableBytes() == 0) return Flush(nowPos32); while(true) { #ifdef _NO_EXCEPTIONS if (_rangeEncoder.Stream.ErrorCode != S_OK) return _rangeEncoder.Stream.ErrorCode; #endif UInt32 pos, len; HRESULT result; if (_fastMode) result = GetOptimumFast(nowPos32, pos, len); else result = GetOptimum(nowPos32, pos, len); RINOK(result); UInt32 posState = nowPos32 & _posStateMask; if(len == 1 && pos == 0xFFFFFFFF) { _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 0); Byte curByte = _matchFinder->GetIndexByte(0 - _additionalOffset); CLiteralEncoder2 *subCoder = _literalEncoder.GetSubCoder(nowPos32, _previousByte); if(_state.IsCharState()) subCoder->Encode(&_rangeEncoder, curByte); else { Byte matchByte = _matchFinder->GetIndexByte(0 - _repDistances[0] - 1 - _additionalOffset); subCoder->EncodeMatched(&_rangeEncoder, matchByte, curByte); } _state.UpdateChar(); _previousByte = curByte; } else { _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 1); if(pos < kNumRepDistances) { _isRep[_state.Index].Encode(&_rangeEncoder, 1); if(pos == 0) { _isRepG0[_state.Index].Encode(&_rangeEncoder, 0); _isRep0Long[_state.Index][posState].Encode(&_rangeEncoder, ((len == 1) ? 0 : 1)); } else { UInt32 distance = _repDistances[pos]; _isRepG0[_state.Index].Encode(&_rangeEncoder, 1); if (pos == 1) _isRepG1[_state.Index].Encode(&_rangeEncoder, 0); else { _isRepG1[_state.Index].Encode(&_rangeEncoder, 1); _isRepG2[_state.Index].Encode(&_rangeEncoder, pos - 2); if (pos == 3) _repDistances[3] = _repDistances[2]; _repDistances[2] = _repDistances[1]; } _repDistances[1] = _repDistances[0]; _repDistances[0] = distance; } if (len == 1) _state.UpdateShortRep(); else { _repMatchLenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode); _state.UpdateRep(); } } else { _isRep[_state.Index].Encode(&_rangeEncoder, 0); _state.UpdateMatch(); _lenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode); pos -= kNumRepDistances; UInt32 posSlot = GetPosSlot(pos); _posSlotEncoder[GetLenToPosState(len)].Encode(&_rangeEncoder, posSlot); if (posSlot >= kStartPosModelIndex) { UInt32 footerBits = ((posSlot >> 1) - 1); UInt32 base = ((2 | (posSlot & 1)) << footerBits); UInt32 posReduced = pos - base; if (posSlot < kEndPosModelIndex) NRangeCoder::ReverseBitTreeEncode(_posEncoders + base - posSlot - 1, &_rangeEncoder, footerBits, posReduced); else { _rangeEncoder.EncodeDirectBits(posReduced >> kNumAlignBits, footerBits - kNumAlignBits); _posAlignEncoder.ReverseEncode(&_rangeEncoder, posReduced & kAlignMask); _alignPriceCount++; } } _repDistances[3] = _repDistances[2]; _repDistances[2] = _repDistances[1]; _repDistances[1] = _repDistances[0]; _repDistances[0] = pos; _matchPriceCount++; } _previousByte = _matchFinder->GetIndexByte(len - 1 - _additionalOffset); } _additionalOffset -= len; nowPos32 += len; if (_additionalOffset == 0) { if (!_fastMode) { if (_matchPriceCount >= (1 << 7)) FillDistancesPrices(); if (_alignPriceCount >= kAlignTableSize) FillAlignPrices(); } if (_matchFinder->GetNumAvailableBytes() == 0) return Flush(nowPos32); if (nowPos32 - progressPosValuePrev >= (1 << 14)) { nowPos64 += nowPos32 - progressPosValuePrev; *inSize = nowPos64; *outSize = _rangeEncoder.GetProcessedSize(); _finished = false; *finished = 0; return S_OK; } } } } STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) { #ifndef _NO_EXCEPTIONS try { #endif return CodeReal(inStream, outStream, inSize, outSize, progress); #ifndef _NO_EXCEPTIONS } catch(const COutBufferException &e) { return e.ErrorCode; } catch(...) { return E_FAIL; } #endif } void CEncoder::FillDistancesPrices() { UInt32 tempPrices[kNumFullDistances]; for (UInt32 i = kStartPosModelIndex; i < kNumFullDistances; i++) { UInt32 posSlot = GetPosSlot(i); UInt32 footerBits = ((posSlot >> 1) - 1); UInt32 base = ((2 | (posSlot & 1)) << footerBits); tempPrices[i] = NRangeCoder::ReverseBitTreeGetPrice(_posEncoders + base - posSlot - 1, footerBits, i - base); } for (UInt32 lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) { UInt32 posSlot; NRangeCoder::CBitTreeEncoder &encoder = _posSlotEncoder[lenToPosState]; UInt32 *posSlotPrices = _posSlotPrices[lenToPosState]; for (posSlot = 0; posSlot < _distTableSize; posSlot++) posSlotPrices[posSlot] = encoder.GetPrice(posSlot); for (posSlot = kEndPosModelIndex; posSlot < _distTableSize; posSlot++) posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << NRangeCoder::kNumBitPriceShiftBits); UInt32 *distancesPrices = _distancesPrices[lenToPosState]; UInt32 i; for (i = 0; i < kStartPosModelIndex; i++) distancesPrices[i] = posSlotPrices[i]; for (; i < kNumFullDistances; i++) distancesPrices[i] = posSlotPrices[GetPosSlot(i)] + tempPrices[i]; } _matchPriceCount = 0; } void CEncoder::FillAlignPrices() { for (UInt32 i = 0; i < kAlignTableSize; i++) _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); _alignPriceCount = 0; } }} nsis-3.11/Source/7zip/7zip/Compress/LZMA/LZMAEncoder.h000077500000000000000000000257601477201124000222210ustar00rootroot00000000000000/* * LZMAEncoder.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __LZMA_ENCODER_H #define __LZMA_ENCODER_H #include "../../../Common/MyCom.h" #include "../../../Common/Alloc.h" #include "../../ICoder.h" #include "../LZ/IMatchFinder.h" #include "../RangeCoder/RangeCoderBitTree.h" #include "LZMA.h" namespace NCompress { namespace NLZMA { typedef NRangeCoder::CBitEncoder CMyBitEncoder; class CBaseState { protected: CState _state; Byte _previousByte; UInt32 _repDistances[kNumRepDistances]; void Init() { _state.Init(); _previousByte = 0; for(UInt32 i = 0 ; i < kNumRepDistances; i++) _repDistances[i] = 0; } }; struct COptimal { CState State; bool Prev1IsChar; bool Prev2; UInt32 PosPrev2; UInt32 BackPrev2; UInt32 Price; UInt32 PosPrev; // posNext; UInt32 BackPrev; UInt32 Backs[kNumRepDistances]; void MakeAsChar() { BackPrev = UInt32(-1); Prev1IsChar = false; } void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; } bool IsShortRep() { return (BackPrev == 0); } }; extern Byte g_FastPos[1 << 11]; inline UInt32 GetPosSlot(UInt32 pos) { if (pos < (1 << 11)) return g_FastPos[pos]; if (pos < (1 << 21)) return g_FastPos[pos >> 10] + 20; return g_FastPos[pos >> 20] + 40; } inline UInt32 GetPosSlot2(UInt32 pos) { if (pos < (1 << 17)) return g_FastPos[pos >> 6] + 12; if (pos < (1 << 27)) return g_FastPos[pos >> 16] + 32; return g_FastPos[pos >> 26] + 52; } const UInt32 kIfinityPrice = 0xFFFFFFF; const UInt32 kNumOpts = 1 << 12; class CLiteralEncoder2 { CMyBitEncoder _encoders[0x300]; public: void Init() { for (int i = 0; i < 0x300; i++) _encoders[i].Init(); } void Encode(NRangeCoder::CEncoder *rangeEncoder, Byte symbol); void EncodeMatched(NRangeCoder::CEncoder *rangeEncoder, Byte matchByte, Byte symbol); UInt32 GetPrice(bool matchMode, Byte matchByte, Byte symbol) const; }; class CLiteralEncoder { CLiteralEncoder2 *_coders; int _numPrevBits; int _numPosBits; UInt32 _posMask; public: CLiteralEncoder(): _coders(0) {} ~CLiteralEncoder() { Free(); } void Free() { MyFree(_coders); _coders = 0; } bool Create(int numPosBits, int numPrevBits) { if (_coders == 0 || (numPosBits + numPrevBits) != (_numPrevBits + _numPosBits)) { Free(); UInt32 numStates = 1 << (numPosBits + numPrevBits); _coders = (CLiteralEncoder2 *)MyAlloc(numStates * sizeof(CLiteralEncoder2)); } _numPosBits = numPosBits; _posMask = (1 << numPosBits) - 1; _numPrevBits = numPrevBits; return (_coders != 0); } void Init() { UInt32 numStates = 1 << (_numPrevBits + _numPosBits); for (UInt32 i = 0; i < numStates; i++) _coders[i].Init(); } CLiteralEncoder2 *GetSubCoder(UInt32 pos, Byte prevByte) { return &_coders[((pos & _posMask) << _numPrevBits) + (prevByte >> (8 - _numPrevBits))]; } }; namespace NLength { class CEncoder { CMyBitEncoder _choice; CMyBitEncoder _choice2; NRangeCoder::CBitTreeEncoder _lowCoder[kNumPosStatesEncodingMax]; NRangeCoder::CBitTreeEncoder _midCoder[kNumPosStatesEncodingMax]; NRangeCoder::CBitTreeEncoder _highCoder; public: void Init(UInt32 numPosStates); void Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState); void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32 *prices) const; }; const UInt32 kNumSpecSymbols = kNumLowSymbols + kNumMidSymbols; class CPriceTableEncoder: public CEncoder { UInt32 _prices[kNumPosStatesEncodingMax][kNumSymbolsTotal]; UInt32 _tableSize; UInt32 _counters[kNumPosStatesEncodingMax]; public: void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; } UInt32 GetPrice(UInt32 symbol, UInt32 posState) const { return _prices[posState][symbol]; } void UpdateTable(UInt32 posState) { SetPrices(posState, _tableSize, _prices[posState]); _counters[posState] = _tableSize; } void UpdateTables(UInt32 numPosStates) { for (UInt32 posState = 0; posState < numPosStates; posState++) UpdateTable(posState); } void Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState, bool updatePrice) { CEncoder::Encode(rangeEncoder, symbol, posState); if (updatePrice) if (--_counters[posState] == 0) UpdateTable(posState); } }; } class CEncoder : public ICompressCoder, public ICompressSetOutStream, public ICompressSetCoderProperties, public ICompressWriteCoderProperties, public CBaseState, public CMyUnknownImp { COptimal _optimum[kNumOpts]; CMyComPtr _matchFinder; // test it NRangeCoder::CEncoder _rangeEncoder; CMyBitEncoder _isMatch[kNumStates][NLength::kNumPosStatesEncodingMax]; CMyBitEncoder _isRep[kNumStates]; CMyBitEncoder _isRepG0[kNumStates]; CMyBitEncoder _isRepG1[kNumStates]; CMyBitEncoder _isRepG2[kNumStates]; CMyBitEncoder _isRep0Long[kNumStates][NLength::kNumPosStatesEncodingMax]; NRangeCoder::CBitTreeEncoder _posSlotEncoder[kNumLenToPosStates]; CMyBitEncoder _posEncoders[kNumFullDistances - kEndPosModelIndex]; NRangeCoder::CBitTreeEncoder _posAlignEncoder; NLength::CPriceTableEncoder _lenEncoder; NLength::CPriceTableEncoder _repMatchLenEncoder; CLiteralEncoder _literalEncoder; UInt32 _matchDistances[kMatchMaxLen * 2 + 2 + 1]; bool _fastMode; // bool _maxMode; UInt32 _numFastBytes; UInt32 _longestMatchLength; UInt32 _numDistancePairs; UInt32 _additionalOffset; UInt32 _optimumEndIndex; UInt32 _optimumCurrentIndex; bool _longestMatchWasFound; UInt32 _posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; UInt32 _distancesPrices[kNumLenToPosStates][kNumFullDistances]; UInt32 _alignPrices[kAlignTableSize]; UInt32 _alignPriceCount; UInt32 _distTableSize; UInt32 _posStateBits; UInt32 _posStateMask; UInt32 _numLiteralPosStateBits; UInt32 _numLiteralContextBits; UInt32 _dictionarySize; UInt32 _dictionarySizePrev; UInt32 _numFastBytesPrev; UInt32 _matchPriceCount; UInt64 nowPos64; bool _finished; ISequentialInStream *_inStream; UInt32 _matchFinderCycles; int _matchFinderIndex; #ifdef COMPRESS_MF_MT bool _multiThread; #endif bool _writeEndMark; bool _needReleaseMFStream; IMatchFinderSetNumPasses *setMfPasses; void ReleaseMatchFinder() { setMfPasses = 0; _matchFinder.Release(); } HRESULT ReadMatchDistances(UInt32 &len, UInt32 &numDistancePairs); HRESULT MovePos(UInt32 num); UInt32 GetRepLen1Price(CState state, UInt32 posState) const { return _isRepG0[state.Index].GetPrice0() + _isRep0Long[state.Index][posState].GetPrice0(); } UInt32 GetPureRepPrice(UInt32 repIndex, CState state, UInt32 posState) const { UInt32 price; if(repIndex == 0) { price = _isRepG0[state.Index].GetPrice0(); price += _isRep0Long[state.Index][posState].GetPrice1(); } else { price = _isRepG0[state.Index].GetPrice1(); if (repIndex == 1) price += _isRepG1[state.Index].GetPrice0(); else { price += _isRepG1[state.Index].GetPrice1(); price += _isRepG2[state.Index].GetPrice(repIndex - 2); } } return price; } UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, CState state, UInt32 posState) const { return _repMatchLenEncoder.GetPrice(len - kMatchMinLen, posState) + GetPureRepPrice(repIndex, state, posState); } /* UInt32 GetPosLen2Price(UInt32 pos, UInt32 posState) const { if (pos >= kNumFullDistances) return kIfinityPrice; return _distancesPrices[0][pos] + _lenEncoder.GetPrice(0, posState); } UInt32 GetPosLen3Price(UInt32 pos, UInt32 len, UInt32 posState) const { UInt32 price; UInt32 lenToPosState = GetLenToPosState(len); if (pos < kNumFullDistances) price = _distancesPrices[lenToPosState][pos]; else price = _posSlotPrices[lenToPosState][GetPosSlot2(pos)] + _alignPrices[pos & kAlignMask]; return price + _lenEncoder.GetPrice(len - kMatchMinLen, posState); } */ UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) const { UInt32 price; UInt32 lenToPosState = GetLenToPosState(len); if (pos < kNumFullDistances) price = _distancesPrices[lenToPosState][pos]; else price = _posSlotPrices[lenToPosState][GetPosSlot2(pos)] + _alignPrices[pos & kAlignMask]; return price + _lenEncoder.GetPrice(len - kMatchMinLen, posState); } UInt32 Backward(UInt32 &backRes, UInt32 cur); HRESULT GetOptimum(UInt32 position, UInt32 &backRes, UInt32 &lenRes); HRESULT GetOptimumFast(UInt32 position, UInt32 &backRes, UInt32 &lenRes); void FillDistancesPrices(); void FillAlignPrices(); void ReleaseMFStream() { if (_matchFinder && _needReleaseMFStream) { _matchFinder->ReleaseStream(); _needReleaseMFStream = false; } } void ReleaseStreams() { ReleaseMFStream(); ReleaseOutStream(); } HRESULT Flush(UInt32 nowPos); class CCoderReleaser { CEncoder *_coder; public: CCoderReleaser(CEncoder *coder): _coder(coder) {} ~CCoderReleaser() { _coder->ReleaseStreams(); } }; friend class CCoderReleaser; void WriteEndMarker(UInt32 posState); public: CEncoder(); void SetWriteEndMarkerMode(bool writeEndMarker) { _writeEndMark= writeEndMarker; } HRESULT Create(); MY_UNKNOWN_IMP3( ICompressSetOutStream, ICompressSetCoderProperties, ICompressWriteCoderProperties ) HRESULT Init(); // ICompressCoder interface HRESULT SetStreams(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize); HRESULT CodeOneBlock(UInt64 *inSize, UInt64 *outSize, Int32 *finished); HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); // ICompressCoder interface STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); // ICompressSetCoderProperties2 STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties); // ICompressWriteCoderProperties STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); STDMETHOD(ReleaseOutStream)(); virtual ~CEncoder() {} }; }} #endif nsis-3.11/Source/7zip/7zip/Compress/LZMA/StdAfx.h000077500000000000000000000001431477201124000213330ustar00rootroot00000000000000// StdAfx.h #ifndef __STDAFX_H #define __STDAFX_H #include "../../../Common/MyWindows.h" #endif nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/000077500000000000000000000000001477201124000212365ustar00rootroot00000000000000nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/RangeCoder.h000077500000000000000000000106131477201124000234240ustar00rootroot00000000000000/* * RangeCoder.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __COMPRESS_RANGECODER_H #define __COMPRESS_RANGECODER_H #include "../../Common/InBuffer.h" #include "../../Common/OutBuffer.h" namespace NCompress { namespace NRangeCoder { const int kNumTopBits = 24; const UInt32 kTopValue = (1 << kNumTopBits); class CEncoder { UInt32 _cacheSize; Byte _cache; public: UInt64 Low; UInt32 Range; COutBuffer Stream; bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); } void SetStream(ISequentialOutStream *stream) { Stream.SetStream(stream); } void Init() { Stream.Init(); Low = 0; Range = 0xFFFFFFFF; _cacheSize = 1; _cache = 0; } void FlushData() { // Low += 1; for(int i = 0; i < 5; i++) ShiftLow(); } HRESULT FlushStream() { return Stream.Flush(); } void ReleaseStream() { Stream.ReleaseStream(); } void Encode(UInt32 start, UInt32 size, UInt32 total) { Low += start * (Range /= total); Range *= size; while (Range < kTopValue) { Range <<= 8; ShiftLow(); } } void ShiftLow() { if ((UInt32)Low < (UInt32)0xFF000000 || (int)(Low >> 32) != 0) { Byte temp = _cache; do { Stream.WriteByte((Byte)(temp + (Byte)(Low >> 32))); temp = 0xFF; } while(--_cacheSize != 0); _cache = (Byte)((UInt32)Low >> 24); } _cacheSize++; Low = (UInt32)Low << 8; } void EncodeDirectBits(UInt32 value, int numTotalBits) { for (int i = numTotalBits - 1; i >= 0; i--) { Range >>= 1; if (((value >> i) & 1) == 1) Low += Range; if (Range < kTopValue) { Range <<= 8; ShiftLow(); } } } void EncodeBit(UInt32 size0, UInt32 numTotalBits, UInt32 symbol) { UInt32 newBound = (Range >> numTotalBits) * size0; if (symbol == 0) Range = newBound; else { Low += newBound; Range -= newBound; } while (Range < kTopValue) { Range <<= 8; ShiftLow(); } } UInt64 GetProcessedSize() { return Stream.GetProcessedSize() + _cacheSize + 4; } }; class CDecoder { public: CInBuffer Stream; UInt32 Range; UInt32 Code; bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); } void Normalize() { while (Range < kTopValue) { Code = (Code << 8) | Stream.ReadByte(); Range <<= 8; } } void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); } void Init() { Stream.Init(); Code = 0; Range = 0xFFFFFFFF; for(int i = 0; i < 5; i++) Code = (Code << 8) | Stream.ReadByte(); } void ReleaseStream() { Stream.ReleaseStream(); } UInt32 GetThreshold(UInt32 total) { return (Code) / ( Range /= total); } void Decode(UInt32 start, UInt32 size) { Code -= start * Range; Range *= size; Normalize(); } UInt32 DecodeDirectBits(int numTotalBits) { UInt32 range = Range; UInt32 code = Code; UInt32 result = 0; for (int i = numTotalBits; i != 0; i--) { range >>= 1; /* result <<= 1; if (code >= range) { code -= range; result |= 1; } */ UInt32 t = (code - range) >> 31; code -= range & (t - 1); result = (result << 1) | (1 - t); if (range < kTopValue) { code = (code << 8) | Stream.ReadByte(); range <<= 8; } } Range = range; Code = code; return result; } UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) { UInt32 newBound = (Range >> numTotalBits) * size0; UInt32 symbol; if (Code < newBound) { symbol = 0; Range = newBound; } else { symbol = 1; Code -= newBound; Range -= newBound; } Normalize(); return symbol; } UInt64 GetProcessedSize() {return Stream.GetProcessedSize(); } }; }} #endif nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp000077500000000000000000000047571477201124000244320ustar00rootroot00000000000000/* * RangeCoderBit.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "StdAfx.h" #include "RangeCoderBit.h" namespace NCompress { namespace NRangeCoder { UInt32 CPriceTables::ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; static CPriceTables g_PriceTables; CPriceTables::CPriceTables() { Init(); } void CPriceTables::Init() { const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); for(int i = kNumBits - 1; i >= 0; i--) { UInt32 start = 1 << (kNumBits - i - 1); UInt32 end = 1 << (kNumBits - i); for (UInt32 j = start; j < end; j++) ProbPrices[j] = (i << kNumBitPriceShiftBits) + (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); } /* // simplest: bad solution for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++) ProbPrices[i] = kBitPrice; */ /* const double kDummyMultMid = (1.0 / kBitPrice) / 2; const double kDummyMultMid = 0; // float solution double ln2 = log(double(2)); double lnAll = log(double(kBitModelTotal >> kNumMoveReducingBits)); for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++) ProbPrices[i] = UInt32((fabs(lnAll - log(double(i))) / ln2 + kDummyMultMid) * kBitPrice); */ /* // experimental, slow, solution: for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++) { const int kCyclesBits = 5; const UInt32 kCycles = (1 << kCyclesBits); UInt32 range = UInt32(-1); UInt32 bitCount = 0; for (UInt32 j = 0; j < kCycles; j++) { range >>= (kNumBitModelTotalBits - kNumMoveReducingBits); range *= i; while(range < (1 << 31)) { range <<= 1; bitCount++; } } bitCount <<= kNumBitPriceShiftBits; range -= (1 << 31); for (int k = kNumBitPriceShiftBits - 1; k >= 0; k--) { range <<= 1; if (range > (1 << 31)) { bitCount += (1 << k); range -= (1 << 31); } } ProbPrices[i] = (bitCount // + (1 << (kCyclesBits - 1)) ) >> kCyclesBits; } */ } }} nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBit.h000077500000000000000000000065671477201124000241000ustar00rootroot00000000000000/* * RangeCoderBit.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __COMPRESS_RANGECODER_BIT_H #define __COMPRESS_RANGECODER_BIT_H #include "RangeCoder.h" namespace NCompress { namespace NRangeCoder { const int kNumBitModelTotalBits = 11; const UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits); const int kNumMoveReducingBits = 2; const int kNumBitPriceShiftBits = 6; const UInt32 kBitPrice = 1 << kNumBitPriceShiftBits; class CPriceTables { public: static UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; static void Init(); CPriceTables(); }; template class CBitModel { public: UInt32 Prob; void UpdateModel(UInt32 symbol) { /* Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits; Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits); */ if (symbol == 0) Prob += (kBitModelTotal - Prob) >> numMoveBits; else Prob -= (Prob) >> numMoveBits; } public: void Init() { Prob = kBitModelTotal / 2; } }; template class CBitEncoder: public CBitModel { public: void Encode(CEncoder *encoder, UInt32 symbol) { /* encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol); this->UpdateModel(symbol); */ UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob; if (symbol == 0) { encoder->Range = newBound; this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits; } else { encoder->Low += newBound; encoder->Range -= newBound; this->Prob -= (this->Prob) >> numMoveBits; } if (encoder->Range < kTopValue) { encoder->Range <<= 8; encoder->ShiftLow(); } } UInt32 GetPrice(UInt32 symbol) const { return CPriceTables::ProbPrices[ (((this->Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; } UInt32 GetPrice0() const { return CPriceTables::ProbPrices[this->Prob >> kNumMoveReducingBits]; } UInt32 GetPrice1() const { return CPriceTables::ProbPrices[(kBitModelTotal - this->Prob) >> kNumMoveReducingBits]; } }; template class CBitDecoder: public CBitModel { public: UInt32 Decode(CDecoder *decoder) { UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob; if (decoder->Code < newBound) { decoder->Range = newBound; this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits; if (decoder->Range < kTopValue) { decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte(); decoder->Range <<= 8; } return 0; } else { decoder->Range -= newBound; decoder->Code -= newBound; this->Prob -= (this->Prob) >> numMoveBits; if (decoder->Range < kTopValue) { decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte(); decoder->Range <<= 8; } return 1; } } }; }} #endif nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/RangeCoderBitTree.h000077500000000000000000000106441477201124000247070ustar00rootroot00000000000000/* * RangeCoderBitTree.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __COMPRESS_RANGECODER_BIT_TREE_H #define __COMPRESS_RANGECODER_BIT_TREE_H #include "RangeCoderBit.h" #include "RangeCoderOpt.h" namespace NCompress { namespace NRangeCoder { template class CBitTreeEncoder { CBitEncoder Models[1 << NumBitLevels]; public: void Init() { for(UInt32 i = 1; i < (1 << NumBitLevels); i++) Models[i].Init(); } void Encode(CEncoder *rangeEncoder, UInt32 symbol) { UInt32 modelIndex = 1; for (int bitIndex = NumBitLevels; bitIndex != 0 ;) { bitIndex--; UInt32 bit = (symbol >> bitIndex) & 1; Models[modelIndex].Encode(rangeEncoder, bit); modelIndex = (modelIndex << 1) | bit; } }; void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol) { UInt32 modelIndex = 1; for (int i = 0; i < NumBitLevels; i++) { UInt32 bit = symbol & 1; Models[modelIndex].Encode(rangeEncoder, bit); modelIndex = (modelIndex << 1) | bit; symbol >>= 1; } } UInt32 GetPrice(UInt32 symbol) const { symbol |= (1 << NumBitLevels); UInt32 price = 0; while (symbol != 1) { price += Models[symbol >> 1].GetPrice(symbol & 1); symbol >>= 1; } return price; } UInt32 ReverseGetPrice(UInt32 symbol) const { UInt32 price = 0; UInt32 modelIndex = 1; for (int i = NumBitLevels; i != 0; i--) { UInt32 bit = symbol & 1; symbol >>= 1; price += Models[modelIndex].GetPrice(bit); modelIndex = (modelIndex << 1) | bit; } return price; } }; template class CBitTreeDecoder { CBitDecoder Models[1 << NumBitLevels]; public: void Init() { for(UInt32 i = 1; i < (1 << NumBitLevels); i++) Models[i].Init(); } UInt32 Decode(CDecoder *rangeDecoder) { UInt32 modelIndex = 1; RC_INIT_VAR for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--) { // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder); RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex) } RC_FLUSH_VAR return modelIndex - (1 << NumBitLevels); }; UInt32 ReverseDecode(CDecoder *rangeDecoder) { UInt32 modelIndex = 1; UInt32 symbol = 0; RC_INIT_VAR for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) { // UInt32 bit = Models[modelIndex].Decode(rangeDecoder); // modelIndex <<= 1; // modelIndex += bit; // symbol |= (bit << bitIndex); RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex)) } RC_FLUSH_VAR return symbol; } }; template void ReverseBitTreeEncode(CBitEncoder *Models, CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol) { UInt32 modelIndex = 1; for (int i = 0; i < NumBitLevels; i++) { UInt32 bit = symbol & 1; Models[modelIndex].Encode(rangeEncoder, bit); modelIndex = (modelIndex << 1) | bit; symbol >>= 1; } } template UInt32 ReverseBitTreeGetPrice(CBitEncoder *Models, UInt32 NumBitLevels, UInt32 symbol) { UInt32 price = 0; UInt32 modelIndex = 1; for (int i = NumBitLevels; i != 0; i--) { UInt32 bit = symbol & 1; symbol >>= 1; price += Models[modelIndex].GetPrice(bit); modelIndex = (modelIndex << 1) | bit; } return price; } template UInt32 ReverseBitTreeDecode(CBitDecoder *Models, CDecoder *rangeDecoder, int NumBitLevels) { UInt32 modelIndex = 1; UInt32 symbol = 0; RC_INIT_VAR for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) { // UInt32 bit = Models[modelIndex].Decode(rangeDecoder); // modelIndex <<= 1; // modelIndex += bit; // symbol |= (bit << bitIndex); RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex)) } RC_FLUSH_VAR return symbol; } }} #endif nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/RangeCoderOpt.h000077500000000000000000000026311477201124000241100ustar00rootroot00000000000000/* * RangeCoderOpt.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __COMPRESS_RANGECODER_OPT_H #define __COMPRESS_RANGECODER_OPT_H #define RC_INIT_VAR \ UInt32 range = rangeDecoder->Range; \ UInt32 code = rangeDecoder->Code; #define RC_FLUSH_VAR \ rangeDecoder->Range = range; \ rangeDecoder->Code = code; #define RC_NORMALIZE \ if (range < NCompress::NRangeCoder::kTopValue) \ { code = (code << 8) | rangeDecoder->Stream.ReadByte(); range <<= 8; } #define RC_GETBIT2(numMoveBits, prob, mi, A0, A1) \ { UInt32 bound = (range >> NCompress::NRangeCoder::kNumBitModelTotalBits) * prob; \ if (code < bound) \ { A0; range = bound; \ prob += (NCompress::NRangeCoder::kBitModelTotal - prob) >> numMoveBits; \ mi <<= 1; } \ else \ { A1; range -= bound; code -= bound; prob -= (prob) >> numMoveBits; \ mi = (mi + mi) + 1; }} \ RC_NORMALIZE #define RC_GETBIT(numMoveBits, prob, mi) RC_GETBIT2(numMoveBits, prob, mi, ; , ;) #endif nsis-3.11/Source/7zip/7zip/Compress/RangeCoder/StdAfx.h000077500000000000000000000000731477201124000226030ustar00rootroot00000000000000// StdAfx.h #ifndef __STDAFX_H #define __STDAFX_H #endif nsis-3.11/Source/7zip/7zip/ICoder.h000077500000000000000000000102131477201124000167500ustar00rootroot00000000000000/* * ICoder.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __ICODER_H #define __ICODER_H #include "IStream.h" // "23170F69-40C1-278A-0000-000400xx0000" #define CODER_INTERFACE(i, x) \ DEFINE_GUID(IID_ ## i, \ 0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x04, 0x00, x, 0x00, 0x00); \ struct i: public IUnknown CODER_INTERFACE(ICompressProgressInfo, 0x04) { STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE; }; CODER_INTERFACE(ICompressCoder, 0x05) { STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) PURE; }; CODER_INTERFACE(ICompressCoder2, 0x18) { STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams, ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams, ICompressProgressInfo *progress) PURE; }; namespace NCoderPropID { enum EEnum { kDictionarySize = 0x400, kUsedMemorySize, kOrder, kPosStateBits = 0x440, kLitContextBits, kLitPosBits, kNumFastBytes = 0x450, kMatchFinder, kMatchFinderCycles, kNumPasses = 0x460, kAlgorithm = 0x470, kMultiThread = 0x480, kNumThreads, kEndMarker = 0x490 }; } CODER_INTERFACE(ICompressSetCoderProperties, 0x20) { STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties) PURE; }; /* CODER_INTERFACE(ICompressSetCoderProperties, 0x21) { STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE; }; */ CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22) { STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE; }; CODER_INTERFACE(ICompressWriteCoderProperties, 0x23) { STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE; }; CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24) { STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE; }; CODER_INTERFACE(ICompressSetCoderMt, 0x25) { STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE; }; CODER_INTERFACE(ICompressGetSubStreamSize, 0x30) { STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE; }; CODER_INTERFACE(ICompressSetInStream, 0x31) { STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE; STDMETHOD(ReleaseInStream)() PURE; }; CODER_INTERFACE(ICompressSetOutStream, 0x32) { STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE; STDMETHOD(ReleaseOutStream)() PURE; }; CODER_INTERFACE(ICompressSetInStreamSize, 0x33) { STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE; }; CODER_INTERFACE(ICompressSetOutStreamSize, 0x34) { STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE; }; CODER_INTERFACE(ICompressFilter, 0x40) { STDMETHOD(Init)() PURE; STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE; // Filter return outSize (UInt32) // if (outSize <= size): Filter have converted outSize bytes // if (outSize > size): Filter have not converted anything. // and it needs at least outSize bytes to convert one block // (it's for crypto block algorithms). }; CODER_INTERFACE(ICryptoProperties, 0x80) { STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE; STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE; }; CODER_INTERFACE(ICryptoSetPassword, 0x90) { STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE; }; CODER_INTERFACE(ICryptoSetCRC, 0xA0) { STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE; }; ////////////////////// // It's for DLL file namespace NMethodPropID { enum EEnum { kID, kName, kDecoder, kEncoder, kInStreams, kOutStreams, kDescription }; } #endif nsis-3.11/Source/7zip/7zip/IStream.h000077500000000000000000000042411477201124000171530ustar00rootroot00000000000000/* * IStream.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __ISTREAM_H #define __ISTREAM_H #include "../Common/MyUnknown.h" #include "../Common/Types.h" // "23170F69-40C1-278A-0000-000300xx0000" #define STREAM_INTERFACE_SUB(i, b, x) \ DEFINE_GUID(IID_ ## i, \ 0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x03, 0x00, x, 0x00, 0x00); \ struct i: public b #define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x) STREAM_INTERFACE(ISequentialInStream, 0x01) { STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE; /* Out: if size != 0, return_value = S_OK and (*processedSize == 0), then there are no more bytes in stream. if (size > 0) && there are bytes in stream, this function must read at least 1 byte. This function is allowed to read less than number of remaining bytes in stream. You must call Read function in loop, if you need exact amount of data */ }; STREAM_INTERFACE(ISequentialOutStream, 0x02) { STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE; /* if (size > 0) this function must write at least 1 byte. This function is allowed to write less than "size". You must call Write function in loop, if you need to write exact amount of data */ }; STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03) { STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; }; STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04) { STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; STDMETHOD(SetSize)(Int64 newSize) PURE; }; STREAM_INTERFACE(IStreamGetSize, 0x06) { STDMETHOD(GetSize)(UInt64 *size) PURE; }; STREAM_INTERFACE(IOutStreamFlush, 0x07) { STDMETHOD(Flush)() PURE; }; #endif nsis-3.11/Source/7zip/Common/000077500000000000000000000000001477201124000157715ustar00rootroot00000000000000nsis-3.11/Source/7zip/Common/Alloc.cpp000077500000000000000000000060031477201124000175310ustar00rootroot00000000000000/* * Alloc.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/28/2007 */ #include "StdAfx.h" #ifdef _WIN32 #include "MyWindows.h" #else #include #include "../../tchar.h" #endif #include "Alloc.h" /* #define _SZ_ALLOC_DEBUG */ /* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ #ifdef _SZ_ALLOC_DEBUG #include int g_allocCount = 0; int g_allocCountMid = 0; int g_allocCountBig = 0; #endif void *MyAlloc(size_t size) throw() { if (size == 0) return 0; #ifdef _SZ_ALLOC_DEBUG _ftprintf(stderr, _T("\nAlloc %10d bytes; count = %10d"), size, g_allocCount++); #endif return ::malloc(size); } void MyFree(void *address) throw() { #ifdef _SZ_ALLOC_DEBUG if (address != 0) _ftprintf(stderr, _T("\nFree; count = %10d"), --g_allocCount); #endif ::free(address); } #ifdef _WIN32 void *MidAlloc(size_t size) throw() { if (size == 0) return 0; #ifdef _SZ_ALLOC_DEBUG _ftprintf(stderr, _T("\nAlloc_Mid %10d bytes; count = %10d"), size, g_allocCountMid++); #endif return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); } void MidFree(void *address) throw() { #ifdef _SZ_ALLOC_DEBUG if (address != 0) _ftprintf(stderr, _T("\nFree_Mid; count = %10d"), --g_allocCountMid); #endif if (address == 0) return; ::VirtualFree(address, 0, MEM_RELEASE); } static SIZE_T g_LargePageSize = #ifdef _WIN64 (1 << 21); #else (1 << 22); #endif typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); bool SetLargePageSize() { GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) ::GetProcAddress(::GetModuleHandle(_T("kernel32.dll")), "GetLargePageMinimum"); if (largePageMinimum == 0) return false; SIZE_T size = largePageMinimum(); if (size == 0 || (size & (size - 1)) != 0) return false; g_LargePageSize = size; return true; } void *BigAlloc(size_t size) throw() { if (size == 0) return 0; #ifdef _SZ_ALLOC_DEBUG _ftprintf(stderr, _T("\nAlloc_Big %10d bytes; count = %10d"), size, g_allocCountBig++); #endif if (size >= (1 << 18)) { void *res = ::VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); if (res != 0) return res; } return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); } void BigFree(void *address) throw() { #ifdef _SZ_ALLOC_DEBUG if (address != 0) _ftprintf(stderr, _T("\nFree_Big; count = %10d"), --g_allocCountBig); #endif if (address == 0) return; ::VirtualFree(address, 0, MEM_RELEASE); } #endif nsis-3.11/Source/7zip/Common/Alloc.h000077500000000000000000000020771477201124000172050ustar00rootroot00000000000000/* * Alloc.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/28/2007 */ #ifndef __COMMON_ALLOC_H #define __COMMON_ALLOC_H #include void *MyAlloc(size_t size) throw(); void MyFree(void *address) throw(); #ifdef _WIN32 bool SetLargePageSize(); void *MidAlloc(size_t size) throw(); void MidFree(void *address) throw(); void *BigAlloc(size_t size) throw(); void BigFree(void *address) throw(); #else #define MidAlloc(size) MyAlloc(size) #define MidFree(address) MyFree(address) #define BigAlloc(size) MyAlloc(size) #define BigFree(address) MyFree(address) #endif #endif nsis-3.11/Source/7zip/Common/CRC.cpp000077500000000000000000000030771477201124000171160ustar00rootroot00000000000000/* * CRC.cpp * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/28/2007 */ #include "StdAfx.h" #include "CRC.h" static const UInt32 kCRCPoly = 0xEDB88320; UInt32 CCRC::Table[256]; void CCRC::InitTable() { for (UInt32 i = 0; i < 256; i++) { UInt32 r = i; for (int j = 0; j < 8; j++) if (r & 1) r = (r >> 1) ^ kCRCPoly; else r >>= 1; CCRC::Table[i] = r; } } class CCRCTableInit { public: CCRCTableInit() { CCRC::InitTable(); } } g_CRCTableInit; void CCRC::UpdateByte(Byte b) { _value = Table[((Byte)(_value)) ^ b] ^ (_value >> 8); } void CCRC::UpdateUInt16(UInt16 v) { UpdateByte(Byte(v)); UpdateByte(Byte(v >> 8)); } void CCRC::UpdateUInt32(UInt32 v) { for (int i = 0; i < 4; i++) UpdateByte((Byte)(v >> (8 * i))); } void CCRC::UpdateUInt64(UInt64 v) { for (int i = 0; i < 8; i++) UpdateByte((Byte)(v >> (8 * i))); } void CCRC::Update(const void *data, size_t size) { UInt32 v = _value; const Byte *p = (const Byte *)data; for (; size > 0 ; size--, p++) v = Table[((Byte)(v)) ^ *p] ^ (v >> 8); _value = v; } nsis-3.11/Source/7zip/Common/CRC.h000077500000000000000000000024671477201124000165650ustar00rootroot00000000000000/* * CRC.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/28/2007 */ #ifndef __COMMON_CRC_H #define __COMMON_CRC_H #include #include "Types.h" class CCRC { UInt32 _value; public: static UInt32 Table[256]; static void InitTable(); CCRC(): _value(0xFFFFFFFF){}; void Init() { _value = 0xFFFFFFFF; } void UpdateByte(Byte v); void UpdateUInt16(UInt16 v); void UpdateUInt32(UInt32 v); void UpdateUInt64(UInt64 v); void Update(const void *data, size_t size); UInt32 GetDigest() const { return _value ^ 0xFFFFFFFF; } static UInt32 CalculateDigest(const void *data, size_t size) { CCRC crc; crc.Update(data, size); return crc.GetDigest(); } static bool VerifyDigest(UInt32 digest, const void *data, size_t size) { return (CalculateDigest(data, size) == digest); } }; #endif nsis-3.11/Source/7zip/Common/Defs.h000077500000000000000000000016461477201124000170350ustar00rootroot00000000000000/* * Defs.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __COMMON_DEFS_H #define __COMMON_DEFS_H template inline T MyMin(T a, T b) { return a < b ? a : b; } template inline T MyMax(T a, T b) { return a > b ? a : b; } template inline int MyCompare(T a, T b) { return a < b ? -1 : (a == b ? 0 : 1); } inline int BoolToInt(bool value) { return (value ? 1: 0); } inline bool IntToBool(int value) { return (value != 0); } #endif nsis-3.11/Source/7zip/Common/MyCom.h000077500000000000000000000126471477201124000172030ustar00rootroot00000000000000/* * MyCom.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __MYCOM_H #define __MYCOM_H #include "MyWindows.h" #define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; } template class CMyComPtr { T* _p; public: // typedef T _PtrClass; CMyComPtr() { _p = NULL;} CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); } CMyComPtr(const CMyComPtr& lp) { if ((_p = lp._p) != NULL) _p->AddRef(); } ~CMyComPtr() { if (_p) _p->Release(); } void Release() { if (_p) { _p->Release(); _p = NULL; } } operator T*() const { return (T*)_p; } // T& operator*() const { return *_p; } T** operator&() { return &_p; } T* operator->() const { return _p; } T* operator=(T* p) { if (p != 0) p->AddRef(); if (_p) _p->Release(); _p = p; return p; } T* operator=(const CMyComPtr& lp) { return (*this = lp._p); } bool operator!() const { return (_p == NULL); } // bool operator==(T* pT) const { return _p == pT; } // Compare two objects for equivalence void Attach(T* p2) { Release(); _p = p2; } T* Detach() { T* pt = _p; _p = NULL; return pt; } #ifdef _WIN32 HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) { return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p); } #endif /* HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) { CLSID clsid; HRESULT hr = CLSIDFromProgID(szProgID, &clsid); ATLASSERT(_p == NULL); if (SUCCEEDED(hr)) hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p); return hr; } */ template HRESULT QueryInterface(REFGUID iid, Q** pp) const { return _p->QueryInterface(iid, (void**)pp); } }; ////////////////////////////////////////////////////////// class CMyComBSTR { public: BSTR m_str; CMyComBSTR() { m_str = NULL; } CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); } // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); } // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); } CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); } /* CMyComBSTR(REFGUID src) { LPOLESTR szGuid; StringFromCLSID(src, &szGuid); m_str = ::SysAllocString(szGuid); CoTaskMemFree(szGuid); } */ ~CMyComBSTR() { ::SysFreeString(m_str); } CMyComBSTR& operator=(const CMyComBSTR& src) { if (m_str != src.m_str) { if (m_str) ::SysFreeString(m_str); m_str = src.MyCopy(); } return *this; } CMyComBSTR& operator=(LPCOLESTR pSrc) { ::SysFreeString(m_str); m_str = ::SysAllocString(pSrc); return *this; } unsigned int Length() const { return ::SysStringLen(m_str); } operator BSTR() const { return m_str; } BSTR* operator&() { return &m_str; } BSTR MyCopy() const { int byteLen = ::SysStringByteLen(m_str); BSTR res = ::SysAllocStringByteLen(NULL, byteLen); memmove(res, m_str, byteLen); return res; } void Attach(BSTR src) { m_str = src; } BSTR Detach() { BSTR s = m_str; m_str = NULL; return s; } void Empty() { ::SysFreeString(m_str); m_str = NULL; } bool operator!() const { return (m_str == NULL); } }; ////////////////////////////////////////////////////////// class CMyUnknownImp { public: ULONG __m_RefCount; CMyUnknownImp(): __m_RefCount(0) {} }; #define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \ (REFGUID iid, void **outObject) { #define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \ { *outObject = (void *)(i *)this; AddRef(); return S_OK; } #define MY_QUERYINTERFACE_END return E_NOINTERFACE; } #define MY_ADDREF_RELEASE \ STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \ STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) return __m_RefCount; \ delete this; return 0; } #define MY_UNKNOWN_IMP_SPEC(i) \ MY_QUERYINTERFACE_BEGIN \ i \ MY_QUERYINTERFACE_END \ MY_ADDREF_RELEASE #define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \ MY_QUERYINTERFACE_END \ MY_ADDREF_RELEASE #define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \ MY_QUERYINTERFACE_ENTRY(i) \ ) #define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \ MY_QUERYINTERFACE_ENTRY(i1) \ MY_QUERYINTERFACE_ENTRY(i2) \ ) #define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \ MY_QUERYINTERFACE_ENTRY(i1) \ MY_QUERYINTERFACE_ENTRY(i2) \ MY_QUERYINTERFACE_ENTRY(i3) \ ) #define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \ MY_QUERYINTERFACE_ENTRY(i1) \ MY_QUERYINTERFACE_ENTRY(i2) \ MY_QUERYINTERFACE_ENTRY(i3) \ MY_QUERYINTERFACE_ENTRY(i4) \ ) #define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \ MY_QUERYINTERFACE_ENTRY(i1) \ MY_QUERYINTERFACE_ENTRY(i2) \ MY_QUERYINTERFACE_ENTRY(i3) \ MY_QUERYINTERFACE_ENTRY(i4) \ MY_QUERYINTERFACE_ENTRY(i5) \ ) #endif nsis-3.11/Source/7zip/Common/MyGuidDef.h000077500000000000000000000030471477201124000177660ustar00rootroot00000000000000/* * MyGuidDef.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef GUID_DEFINED #define GUID_DEFINED #include "Types.h" typedef struct { UInt32 Data1; UInt16 Data2; UInt16 Data3; unsigned char Data4[8]; } GUID; #ifdef __cplusplus #define REFGUID const GUID & #else #define REFGUID const GUID * #endif #define REFCLSID REFGUID #define REFIID REFGUID #ifdef __cplusplus inline bool operator==(REFGUID g1, REFGUID g2) { for (int i = 0; i < (int)sizeof(g1); i++) if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i]) return false; return true; } inline bool operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); } #endif #endif // GUID_DEFINED #ifdef __cplusplus #define MY_EXTERN_C extern "C" #else #define MY_EXTERN_C extern #endif #ifdef DEFINE_GUID #undef DEFINE_GUID #endif #ifdef INITGUID #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #else #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ MY_EXTERN_C const GUID name #endif nsis-3.11/Source/7zip/Common/MyUnknown.h000077500000000000000000000014261477201124000201150ustar00rootroot00000000000000/* * MyUnknown.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __MYUNKNOWN_H #define __MYUNKNOWN_H #ifdef _WIN32 #ifdef _WIN32_WCE #if (_WIN32_WCE > 300) #include #else #define MIDL_INTERFACE(x) struct #endif #else #include #endif #include #else #include "MyWindows.h" #endif #endif nsis-3.11/Source/7zip/Common/MyWindows.h000077500000000000000000000112161477201124000201060ustar00rootroot00000000000000/* * MyWindows.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __MYWINDOWS_H #define __MYWINDOWS_H #include "../../Platform.h" #ifdef _WIN32 #include /* #define CHAR_PATH_SEPARATOR '\\' #define WCHAR_PATH_SEPARATOR L'\\' #define STRING_PATH_SEPARATOR "\\" #define WSTRING_PATH_SEPARATOR L"\\" */ #else /* #define CHAR_PATH_SEPARATOR '/' #define WCHAR_PATH_SEPARATOR L'/' #define STRING_PATH_SEPARATOR "/" #define WSTRING_PATH_SEPARATOR L"/" #include // for wchar_t #include */ #include "MyGuidDef.h" /* typedef char CHAR; typedef unsigned char UCHAR; #undef BYTE typedef unsigned char BYTE; typedef short SHORT; typedef unsigned short USHORT; #undef WORD typedef unsigned short WORD; typedef short VARIANT_BOOL; typedef int INT; typedef Int32 INT32; typedef unsigned int UINT; typedef UInt32 UINT32; typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit typedef UINT32 ULONG; #undef DWORD typedef UINT32 DWORD; typedef Int64 LONGLONG; typedef UInt64 ULONGLONG; typedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER; typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart;} ULARGE_INTEGER; typedef const CHAR *LPCSTR; typedef CHAR TCHAR; typedef const TCHAR *LPCTSTR; typedef wchar_t WCHAR; typedef WCHAR OLECHAR; typedef const WCHAR *LPCWSTR; typedef OLECHAR *BSTR; typedef const OLECHAR *LPCOLESTR; typedef OLECHAR *LPOLESTR; */ typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; }FILETIME; #define HRESULT LONG #define FAILED(Status) ((HRESULT)(Status)<0) typedef ULONG PROPID; typedef LONG SCODE; #define S_OK ((HRESULT)0x00000000L) #define S_FALSE ((HRESULT)0x00000001L) #define E_NOTIMPL ((HRESULT)0x80004001L) #define E_NOINTERFACE ((HRESULT)0x80004002L) #define E_ABORT ((HRESULT)0x80004004L) #define E_FAIL ((HRESULT)0x80004005L) #define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) #define E_OUTOFMEMORY ((HRESULT)0x8007000EL) #define E_INVALIDARG ((HRESULT)0x80070057L) #ifdef _MSC_VER #define STDMETHODCALLTYPE __stdcall #else #define STDMETHODCALLTYPE #endif #define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f #define STDMETHOD(f) STDMETHOD_(HRESULT, f) #define STDMETHODIMP_(type) type STDMETHODCALLTYPE #define STDMETHODIMP STDMETHODIMP_(HRESULT) #define PURE = 0 #define MIDL_INTERFACE(x) struct struct IUnknown { STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE; STDMETHOD_(ULONG, AddRef)() PURE; STDMETHOD_(ULONG, Release)() PURE; }; typedef IUnknown *LPUNKNOWN; #define VARIANT_TRUE ((VARIANT_BOOL)-1) #define VARIANT_FALSE ((VARIANT_BOOL)0) enum VARENUM { VT_EMPTY = 0, VT_NULL = 1, VT_I2 = 2, VT_I4 = 3, VT_R4 = 4, VT_R8 = 5, VT_CY = 6, VT_DATE = 7, VT_BSTR = 8, VT_DISPATCH = 9, VT_ERROR = 10, VT_BOOL = 11, VT_VARIANT = 12, VT_UNKNOWN = 13, VT_DECIMAL = 14, VT_I1 = 16, VT_UI1 = 17, VT_UI2 = 18, VT_UI4 = 19, VT_I8 = 20, VT_UI8 = 21, VT_INT = 22, VT_UINT = 23, VT_VOID = 24, VT_HRESULT = 25, VT_FILETIME = 64 }; typedef unsigned short VARTYPE; typedef WORD PROPVAR_PAD1; typedef WORD PROPVAR_PAD2; typedef WORD PROPVAR_PAD3; typedef struct tagPROPVARIANT { VARTYPE vt; PROPVAR_PAD1 wReserved1; PROPVAR_PAD2 wReserved2; PROPVAR_PAD3 wReserved3; union { CHAR cVal; UCHAR bVal; SHORT iVal; USHORT uiVal; LONG lVal; ULONG ulVal; INT intVal; UINT uintVal; LARGE_INTEGER hVal; ULARGE_INTEGER uhVal; VARIANT_BOOL boolVal; SCODE scode; FILETIME filetime; BSTR bstrVal; }; } PROPVARIANT; typedef PROPVARIANT tagVARIANT; typedef tagVARIANT VARIANT; typedef VARIANT VARIANTARG; MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len); MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz); MY_EXTERN_C void SysFreeString(BSTR bstr); MY_EXTERN_C UINT SysStringByteLen(BSTR bstr); MY_EXTERN_C UINT SysStringLen(BSTR bstr); MY_EXTERN_C DWORD GetLastError(); MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop); MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src); MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2); #define CP_ACP 0 #define CP_OEMCP 1 typedef enum tagSTREAM_SEEK { STREAM_SEEK_SET = 0, STREAM_SEEK_CUR = 1, STREAM_SEEK_END = 2 } STREAM_SEEK; #endif #endif nsis-3.11/Source/7zip/Common/StdAfx.h000077500000000000000000000011131477201124000173320ustar00rootroot00000000000000/* * StdAfx.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __STDAFX_H #define __STDAFX_H // #include "MyWindows.h" #endif nsis-3.11/Source/7zip/Common/Types.h000077500000000000000000000035411477201124000172540ustar00rootroot00000000000000/* * Types.h * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef __COMMON_TYPES_H #define __COMMON_TYPES_H #ifdef _WIN32 #include #ifndef _7ZIP_BYTE_DEFINED #define _7ZIP_BYTE_DEFINED typedef UINT8 Byte; #endif #ifndef _7ZIP_INT16_DEFINED #define _7ZIP_INT16_DEFINED typedef INT16 Int16; #endif #ifndef _7ZIP_UINT16_DEFINED #define _7ZIP_UINT16_DEFINED typedef UINT16 UInt16; #endif #ifndef _7ZIP_INT32_DEFINED #define _7ZIP_INT32_DEFINED typedef INT32 Int32; #endif #ifndef _7ZIP_UINT32_DEFINED #define _7ZIP_UINT32_DEFINED typedef UINT32 UInt32; #endif #ifndef _7ZIP_INT64_DEFINED #define _7ZIP_INT64_DEFINED typedef INT64 Int64; #endif #ifndef _7ZIP_UINT64_DEFINED #define _7ZIP_UINT64_DEFINED typedef UINT64 UInt64; #endif #else // !_WIN32 #include #ifndef _7ZIP_BYTE_DEFINED #define _7ZIP_BYTE_DEFINED typedef uint8_t Byte; #endif #ifndef _7ZIP_INT16_DEFINED #define _7ZIP_INT16_DEFINED typedef int16_t Int16; #endif #ifndef _7ZIP_UINT16_DEFINED #define _7ZIP_UINT16_DEFINED typedef uint16_t UInt16; #endif #ifndef _7ZIP_INT32_DEFINED #define _7ZIP_INT32_DEFINED typedef int32_t Int32; #endif #ifndef _7ZIP_UINT32_DEFINED #define _7ZIP_UINT32_DEFINED typedef uint32_t UInt32; #endif #ifndef _7ZIP_INT64_DEFINED #define _7ZIP_INT64_DEFINED typedef int64_t Int64; #endif #ifndef _7ZIP_UINT64_DEFINED #define _7ZIP_UINT64_DEFINED typedef uint64_t UInt64; #endif #endif #endif nsis-3.11/Source/7zip/LZMADecode.c000077500000000000000000000347521477201124000165720ustar00rootroot00000000000000/* * LZMADecode.c * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/24/2007 */ #include #include "LZMADecode.h" #define LEAVE { goto saveStateAndReturn; } #define NEED_BYTE(c) case c: if (!avail_in) { mode = c; LEAVE; } #define NEED_BYTE_ if (!avail_in) LEAVE; #define NEXT_BYTE (avail_in--, *next_in++) #define NEED_OUT(c) case c: if (!avail_out) { mode = c; LEAVE; } #define PUT_BYTE_(b) { *next_out = b; next_out++; avail_out--; } #define PUT_BYTE(b) { totalOut++; PUT_BYTE_(b) } #define DECODE_BIT(c, x) prob = x; last = c; goto _LZMA_C_RDBD; case c: #define DECODE_LEN(c, x) probs = x; last2 = c; goto _LZMA_C_LEND; case c: #define DECODE_BIT_TREE(c, x, y) probs = x; numLevels = y; last3 = c; goto _LZMA_C_BTD; case c: enum { /* 0 */ LZMA_C_INIT = 0, /* 1 */ LZMA_C_GETDICT, /* 2 */ LZMA_C_BLOCK, /* 3 */ LZMA_C_RDI, /* RangeDecoderInit */ /* 4 */ LZMA_C_RDBD, /* RangeDecoderBitDecode */ /* 5 */ LZMA_C_RDBD_IN, /* RangeDecoderBitDecode */ /* 6 */ LZMA_C_TYPE, /* 7 */ LZMA_C_ISREP, /* 8 */ LZMA_C_ISREPG0, /* 9 */ LZMA_C_ISREP0LONG, /* 10 */ LZMA_C_ISREPG1, /* 11 */ LZMA_C_ISREPG2, /* 12 */ LZMA_C_NORM, /* 13 */ LZMA_C_LITDM1, /* LzmaLiteralDecodeMatch */ /* 14 */ LZMA_C_LITDM2, /* LzmaLiteralDecodeMatch */ /* 15 */ LZMA_C_LITD, /* LzmaLiteralDecode */ /* 16 */ LZMA_C_RDRBTD, /* RangeDecoderReverseBitTreeDecode */ /* 17 */ LZMA_C_LEND, /* LzmaLenDecode */ /* 18 */ LZMA_C_LEND1, /* LzmaLenDecode */ /* 19 */ LZMA_C_LEND2, /* LzmaLenDecode */ /* 20 */ LZMA_C_LEND_RES, /* LzmaLenDecode */ /* 21 */ LZMA_C_LEND_C1, /* 22 */ LZMA_C_LEND_C2, /* 23 */ LZMA_C_BTD, /* RangeDecoderBitTreeDecode */ /* 24 */ LZMA_C_BTD_LOOP, /* 25 */ LZMA_C_BTD_C1, /* 26 */ LZMA_C_OUTPUT_1, /* 27 */ LZMA_C_OUTPUT_2, /* 28 */ LZMA_C_OUTPUT_3 }; #define kNumTopBits 24 #define kTopValue ((UInt32)1 << kNumTopBits) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) #define kNumMoveBits 5 #define RC_NORMALIZE(c) if (range < kTopValue) { NEED_BYTE(c); range <<= 8; code = (code << 8) | NEXT_BYTE; } #define RC_GET_BIT2(c, prob, mi, A0, A1) { \ UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \ if (code < bound) \ { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \ else \ { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \ RC_NORMALIZE(c) \ } #define RC_GET_BIT(c, prob, mi) RC_GET_BIT2(c, prob, mi, ; , ;) #define kNumPosBitsMax 4 #define kNumPosStatesMax (1 << kNumPosBitsMax) #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) #define kLenNumMidBits 3 #define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) #define LenChoice 0 #define LenChoice2 (LenChoice + 1) #define LenLow (LenChoice2 + 1) #define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) #define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) #define kNumLenProbs (LenHigh + kLenNumHighSymbols) #define kNumStates 12 #define kStartPosModelIndex 4 #define kEndPosModelIndex 14 #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) #define kNumPosSlotBits 6 #define kNumLenToPosStates 4 #define kNumAlignBits 4 #define kAlignTableSize (1 << kNumAlignBits) #define kMatchMinLen 2 #define IsMatch 0 #define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) #define IsRepG0 (IsRep + kNumStates) #define IsRepG1 (IsRepG0 + kNumStates) #define IsRepG2 (IsRepG1 + kNumStates) #define IsRep0Long (IsRepG2 + kNumStates) #define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) #define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) #define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) #define LenCoder (Align + kAlignTableSize) #define RepLenCoder (LenCoder + kNumLenProbs) #define Literal (RepLenCoder + kNumLenProbs) #define LZMA_BASE_SIZE 1846 #define LZMA_LIT_SIZE 768 #if Literal != LZMA_BASE_SIZE StopCompilingDueBUG #endif void LZMACALL lzmaInit(lzma_stream *s) { /* size of lzma_stream minus the size of the two allocated buffer pointers. we don't want to lose to pointer or else we won't be able to free them. */ size_t i = sizeof(lzma_stream) - (sizeof(unsigned char *) * 2); while (i--) ((Byte *)s)[i] = 0; s->rep0 = s->rep1 = s->rep2 = s->rep3 = 1; s->range = (0xFFFFFFFF); } int LZMACALL lzmaDecode(lzma_stream *s) { /* restore decoder state */ lzma_stream _s = *s; #define mode _s.mode #define last _s.last #define last2 _s.last2 #define last3 _s.last3 #define p (*(CProb **) &_s.dynamicData) #define dynamicDataSize _s.dynamicDataSize #define state _s.state #define isPreviousMatch _s.isPreviousMatch #define previousByte _s.previousByte #define rep0 _s.rep0 #define rep1 _s.rep1 #define rep2 _s.rep2 #define rep3 _s.rep3 #define lc _s.lc #define len _s.len #define totalOut _s.totalOut #define dictionary _s.dictionary #define dictionarySize _s.dictionarySize #define dictionaryPos _s.dictionaryPos #define posStateMask _s.posStateMask #define literalPosMask _s.literalPosMask #define avail_in _s.avail_in #define next_in _s.next_in #define avail_out _s.avail_out #define next_out _s.next_out #define range _s.range #define code _s.code #define probs _s.probs #define prob _s.prob #define symbol _s.temp2 #define bit _s.temp3 #define matchBit _s.temp1 #define i _s.temp1 #define result _s.temp2 #define numLevels _s.temp3 #define posSlot _s.temp2 #define newDictionarySize (*(UInt32*) &_s.temp3) #define matchByte _s.matchByte #define mi _s.mi #define posState _s.posState if (len == -1) return LZMA_STREAM_END; for (;;) switch (mode) { case LZMA_C_INIT: { Byte firstByte; UInt32 newDynamicDataSize; UInt32 numProbs; int lp; int pb; NEED_BYTE_; firstByte = NEXT_BYTE; if (firstByte > (9*5*5)) return LZMA_DATA_ERROR; pb = firstByte / (9*5); firstByte %= (9*5); lp = firstByte / 9; firstByte %= 9; lc = firstByte; posStateMask = (1 << (pb)) - 1; literalPosMask = (1 << (lp)) - 1; numProbs = Literal + (LZMA_LIT_SIZE << (lc + pb)); newDynamicDataSize = numProbs * sizeof(CProb); if (newDynamicDataSize != dynamicDataSize) { if (p) lzmafree(p); p = lzmaalloc(newDynamicDataSize); if (!p) return LZMA_NOT_ENOUGH_MEM; dynamicDataSize = newDynamicDataSize; } while (numProbs--) p[numProbs] = kBitModelTotal >> 1; for (i = 0, newDictionarySize = 0; i < 4; i++) { NEED_BYTE(LZMA_C_GETDICT); newDictionarySize |= NEXT_BYTE << (i * 8); } if (newDictionarySize != dictionarySize) { dictionarySize = newDictionarySize; if (dictionary) lzmafree(dictionary); dictionary = lzmaalloc(dictionarySize); if (!dictionary) return LZMA_NOT_ENOUGH_MEM; } dictionary[dictionarySize - 1] = 0; i = 5; while (i--) { NEED_BYTE(LZMA_C_RDI); code = (code << 8) | NEXT_BYTE; } } case LZMA_C_BLOCK: posState = (int)(totalOut & posStateMask); DECODE_BIT(LZMA_C_TYPE, p + IsMatch + (state << kNumPosBitsMax) + posState); if (bit == 0) { probs = p + Literal + (LZMA_LIT_SIZE * (((totalOut & literalPosMask) << lc) + (previousByte >> (8 - lc)))); if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; if (isPreviousMatch) { UInt32 pos = dictionaryPos - rep0; if (pos >= dictionarySize) pos += dictionarySize; matchByte = dictionary[pos]; { symbol = 1; do { matchBit = (matchByte >> 7) & 1; matchByte <<= 1; { prob = probs + ((1 + matchBit) << 8) + symbol; RC_GET_BIT2(LZMA_C_LITDM1, prob, symbol, bit = 0, bit = 1) } if (matchBit != bit) { while (symbol < 0x100) { prob = probs + symbol; RC_GET_BIT(LZMA_C_LITDM2, prob, symbol) } break; } } while (symbol < 0x100); previousByte = symbol; } isPreviousMatch = 0; } else { symbol = 1; do { prob = probs + symbol; RC_GET_BIT(LZMA_C_LITD, prob, symbol) } while (symbol < 0x100); previousByte = symbol; } NEED_OUT(LZMA_C_OUTPUT_1); PUT_BYTE(previousByte); dictionary[dictionaryPos] = previousByte; dictionaryPos = (dictionaryPos + 1) % dictionarySize; } /* bit == 1 */ else { isPreviousMatch = 1; DECODE_BIT(LZMA_C_ISREP, p + IsRep + state); if (bit == 1) { DECODE_BIT(LZMA_C_ISREPG0, p + IsRepG0 + state); if (bit == 0) { DECODE_BIT(LZMA_C_ISREP0LONG, p + IsRep0Long + (state << kNumPosBitsMax) + posState); if (bit == 0) { UInt32 pos; if (totalOut == 0) return LZMA_DATA_ERROR; state = state < 7 ? 9 : 11; NEED_OUT(LZMA_C_OUTPUT_2); pos = dictionaryPos - rep0; if (pos >= dictionarySize) pos += dictionarySize; previousByte = dictionary[pos]; dictionary[dictionaryPos] = previousByte; dictionaryPos = (dictionaryPos + 1) % dictionarySize; PUT_BYTE(previousByte); mode = LZMA_C_BLOCK; break; } } else { UInt32 distance; DECODE_BIT(LZMA_C_ISREPG1, p + IsRepG1 + state); if (bit == 0) { distance = rep1; } else { DECODE_BIT(LZMA_C_ISREPG2, p + IsRepG2 + state); if (bit == 0) distance = rep2; else { distance = rep3; rep3 = rep2; } rep2 = rep1; } rep1 = rep0; rep0 = distance; } DECODE_LEN(LZMA_C_LEND_C1, p + RepLenCoder); state = state < 7 ? 8 : 11; } else { rep3 = rep2; rep2 = rep1; rep1 = rep0; state = state < 7 ? 7 : 10; DECODE_LEN(LZMA_C_LEND_C2, p + LenCoder); DECODE_BIT_TREE( LZMA_C_BTD_C1, p + PosSlot + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits), kNumPosSlotBits ); if (posSlot >= kStartPosModelIndex) { int numDirectBits = ((posSlot >> 1) - 1); rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits); if (posSlot < kEndPosModelIndex) { probs = p + SpecPos + rep0 - posSlot - 1; numLevels = numDirectBits; } else { int numTotalBits = numDirectBits - kNumAlignBits; result = 0; for (i = numTotalBits; i > 0; i--) { /* UInt32 t; */ range >>= 1; result <<= 1; if (code >= range) { code -= range; result |= 1; } /* t = (code - range) >> 31; t &= 1; code -= range & (t - 1); result = (result + result) | (1 - t); */ RC_NORMALIZE(LZMA_C_NORM) } rep0 += result << kNumAlignBits; probs = p + Align; numLevels = kNumAlignBits; } mi = 1; symbol = 0; for(i = 0; i < numLevels; i++) { prob = probs + mi; RC_GET_BIT2(LZMA_C_RDRBTD, prob, mi, ; , symbol |= (1 << i)); } rep0 += symbol; } else rep0 = posSlot; rep0++; } if (rep0 == (UInt32)(0)) { len = -1; LEAVE; } if (rep0 > totalOut) { return LZMA_DATA_ERROR; } len += kMatchMinLen; totalOut += len; do { UInt32 pos; NEED_OUT(LZMA_C_OUTPUT_3); pos = dictionaryPos - rep0; if (pos >= dictionarySize) pos += dictionarySize; previousByte = dictionary[pos]; dictionary[dictionaryPos] = previousByte; dictionaryPos = (dictionaryPos + 1) % dictionarySize; PUT_BYTE_(previousByte); len--; } while(len > 0); } mode = LZMA_C_BLOCK; break; case LZMA_C_RDBD: _LZMA_C_RDBD: { UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; if (code < bound) { range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; bit = 0; } else { range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; bit = 1; } RC_NORMALIZE(LZMA_C_RDBD_IN); } mode = last; break; case LZMA_C_LEND: _LZMA_C_LEND: DECODE_BIT(LZMA_C_LEND1, probs + LenChoice); if (bit == 0) { len = 0; probs += LenLow + (posState << kLenNumLowBits); numLevels = kLenNumLowBits; } else { DECODE_BIT(LZMA_C_LEND2, probs + LenChoice2); if (bit == 0) { len = kLenNumLowSymbols; probs += + LenMid + (posState << kLenNumMidBits); numLevels = kLenNumMidBits; } else { len = kLenNumLowSymbols + kLenNumMidSymbols; probs += LenHigh; numLevels = kLenNumHighBits; } } last3 = LZMA_C_LEND_RES; case LZMA_C_BTD: _LZMA_C_BTD: mi = 1; for(i = numLevels; i > 0; i--) { prob = probs + mi; RC_GET_BIT(LZMA_C_BTD_LOOP, prob, mi) } result = mi - (1 << numLevels); mode = last3; break; case LZMA_C_LEND_RES: len += result; mode = last2; break; default: return LZMA_DATA_ERROR; } saveStateAndReturn: /* save decoder state */ *s = _s; return LZMA_OK; } nsis-3.11/Source/7zip/LZMADecode.h000077500000000000000000000052521477201124000165700ustar00rootroot00000000000000/* * LZMADecode.c * * This file is a part of LZMA compression module for NSIS. * * Original LZMA SDK Copyright (C) 1999-2006 Igor Pavlov * Modifications Copyright (C) 2003-2025 Amir Szekely * * Licensed under the Common Public License version 1.0 (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/24/2007 */ #ifndef __LZMADECODE_H #define __LZMADECODE_H /*********************** * Configuration * ***********************/ #include "../Platform.h" /* #define _LZMA_PROB32 */ /* It can increase speed on some 32-bit CPUs, but memory usage will be doubled in that case */ #ifdef _WIN32 # define lzmaalloc(bytes) GlobalAlloc(GPTR,bytes) # define lzmafree GlobalFree #endif /*********************** * Configuration End * ***********************/ #ifdef __cplusplus extern "C" { #endif #ifndef lzmaalloc #define lzmaalloc malloc #endif #ifndef lzmafree #define lzmafree free #endif #ifndef LZMACALL # define LZMACALL #endif #ifndef UInt32 #ifdef _LZMA_UINT32_IS_ULONG #define UInt32 unsigned long #else #define UInt32 unsigned int #endif #endif #ifdef _LZMA_PROB32 #define CProb UInt32 #else #define CProb unsigned short #endif typedef unsigned char Byte; #define LZMA_STREAM_END 1 #define LZMA_OK 0 #define LZMA_DATA_ERROR -1 /* we don't really care what the problem is... */ /* #define LZMA_RESULT_NOT_ENOUGH_MEM -2 */ #define LZMA_NOT_ENOUGH_MEM -1 typedef struct { /* mode control */ int mode; int last; int last2; int last3; /* properties */ UInt32 dynamicDataSize; UInt32 dictionarySize; /* io */ Byte *next_in; /* next input byte */ UInt32 avail_in; /* number of bytes available at next_in */ Byte *next_out; /* next output byte should be put there */ UInt32 avail_out; /* remaining free space at next_out */ UInt32 totalOut; /* total output - not always correct when lzmaDecode returns */ /* saved state */ Byte previousByte; Byte matchByte; CProb *probs; CProb *prob; int mi; int posState; int temp1; int temp2; int temp3; int lc; int state; int isPreviousMatch; int len; UInt32 rep0; UInt32 rep1; UInt32 rep2; UInt32 rep3; UInt32 posStateMask; UInt32 literalPosMask; UInt32 dictionaryPos; /* range coder */ UInt32 range; UInt32 code; /* allocated buffers */ Byte *dictionary; Byte *dynamicData; } lzma_stream; void LZMACALL lzmaInit(lzma_stream *); int LZMACALL lzmaDecode(lzma_stream *); #ifdef __cplusplus } #endif #endif nsis-3.11/Source/7zip/sdk.diff000077500000000000000000000107711477201124000161650ustar00rootroot00000000000000Only in 7zip: 7zGuids.cpp Only in 7zip-orig/7zip: Archive Only in 7zip/7zip: CVS Only in 7zip/7zip/Common: CVS Only in 7zip-orig/7zip/Common: FileStreams.cpp Only in 7zip-orig/7zip/Common: FileStreams.h diff -ru 7zip-orig/7zip/Common/StdAfx.h 7zip/7zip/Common/StdAfx.h --- 7zip-orig/7zip/Common/StdAfx.h Mon Jul 11 15:14:54 2005 +++ 7zip/7zip/Common/StdAfx.h Mon Oct 16 10:39:10 2006 @@ -4,6 +4,5 @@ #define __STDAFX_H #include "../../Common/MyWindows.h" -#include "../../Common/NewHandler.h" #endif Only in 7zip-orig/7zip/Compress: Branch Only in 7zip/7zip/Compress: CVS Only in 7zip/7zip/Compress/LZ/BinTree: BinTree3ZMain.h Only in 7zip/7zip/Compress/LZ/BinTree: BinTree4b.h Only in 7zip/7zip/Compress/LZ/BinTree: BinTreeMF.h Only in 7zip/7zip/Compress/LZ/BinTree: BinTreeMFMain.h Only in 7zip/7zip/Compress/LZ/BinTree: CVS Only in 7zip/7zip/Compress/LZ: CVS Only in 7zip-orig/7zip/Compress/LZ: HashChain Only in 7zip/7zip/Compress/LZMA: CVS Only in 7zip-orig/7zip/Compress/LZMA: LZMADecoder.cpp Only in 7zip-orig/7zip/Compress/LZMA: LZMADecoder.h diff -ru 7zip-orig/7zip/Compress/LZMA/LZMAEncoder.cpp 7zip/7zip/Compress/LZMA/LZMAEncoder.cpp --- 7zip-orig/7zip/Compress/LZMA/LZMAEncoder.cpp Sat May 20 08:23:48 2006 +++ 7zip/7zip/Compress/LZMA/LZMAEncoder.cpp Mon Oct 16 10:26:43 2006 @@ -55,13 +55,13 @@ kHC4 }; -static const wchar_t *kMatchFinderIDs[] = +/*static const wchar_t *kMatchFinderIDs[] = { L"BT2", L"BT3", L"BT4", L"HC4" -}; +};*/ Byte g_FastPos[1 << 11]; @@ -318,7 +318,7 @@ return S_OK; } -static bool AreStringsEqual(const wchar_t *base, const wchar_t *testString) +/*static bool AreStringsEqual(const wchar_t *base, const wchar_t *testString) { while (true) { @@ -340,7 +340,7 @@ if (AreStringsEqual(kMatchFinderIDs[m], s)) return m; return -1; -} +}*/ STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties) @@ -378,7 +378,8 @@ } case NCoderPropID::kMatchFinder: { - if (prop.vt != VT_BSTR) + return E_NOTIMPL; + /*if (prop.vt != VT_BSTR) return E_INVALIDARG; int matchFinderIndexPrev = _matchFinderIndex; int m = FindMatchFinder(prop.bstrVal); @@ -390,7 +391,7 @@ _dictionarySizePrev = (UInt32)-1; ReleaseMatchFinder(); } - break; + break;*/ } #ifdef COMPRESS_MF_MT case NCoderPropID::kMultiThread: Only in 7zip-orig/7zip/Compress: LZMA_Alone Only in 7zip-orig/7zip/Compress: LZMA_C Only in 7zip/7zip/Compress/RangeCoder: CVS Only in 7zip: CVS Only in 7zip/Common: CVS Only in 7zip-orig/Common: C_FileIO.cpp Only in 7zip-orig/Common: C_FileIO.h Only in 7zip-orig/Common: ComTry.h Only in 7zip-orig/Common: CommandLineParser.cpp Only in 7zip-orig/Common: CommandLineParser.h Only in 7zip-orig/Common: MyInitGuid.h diff -ru 7zip-orig/Common/MyWindows.h 7zip/Common/MyWindows.h --- 7zip-orig/Common/MyWindows.h Sun Apr 16 16:53:43 2006 +++ 7zip/Common/MyWindows.h Mon Oct 16 10:20:04 2006 @@ -3,17 +3,22 @@ #ifndef __MYWINDOWS_H #define __MYWINDOWS_H +#include "../../Platform.h" + #ifdef _WIN32 #include +/* #define CHAR_PATH_SEPARATOR '\\' #define WCHAR_PATH_SEPARATOR L'\\' #define STRING_PATH_SEPARATOR "\\" #define WSTRING_PATH_SEPARATOR L"\\" +*/ #else +/* #define CHAR_PATH_SEPARATOR '/' #define WCHAR_PATH_SEPARATOR L'/' #define STRING_PATH_SEPARATOR "/" @@ -21,9 +26,9 @@ #include // for wchar_t #include - +*/ #include "MyGuidDef.h" - +/* typedef char CHAR; typedef unsigned char UCHAR; @@ -62,7 +67,7 @@ typedef OLECHAR *BSTR; typedef const OLECHAR *LPCOLESTR; typedef OLECHAR *LPOLESTR; - +*/ typedef struct _FILETIME { DWORD dwLowDateTime; Only in 7zip-orig/Common: NewHandler.cpp Only in 7zip-orig/Common: NewHandler.h diff -ru 7zip-orig/Common/StdAfx.h 7zip/Common/StdAfx.h --- 7zip-orig/Common/StdAfx.h Mon Jul 11 15:16:00 2005 +++ 7zip/Common/StdAfx.h Mon Oct 16 10:39:16 2006 @@ -4,6 +4,5 @@ #define __STDAFX_H // #include "MyWindows.h" -#include "NewHandler.h" #endif Only in 7zip-orig/Common: String.cpp Only in 7zip-orig/Common: String.h Only in 7zip-orig/Common: StringConvert.cpp Only in 7zip-orig/Common: StringConvert.h Only in 7zip-orig/Common: StringToInt.cpp Only in 7zip-orig/Common: StringToInt.h Only in 7zip-orig/Common: Vector.cpp Only in 7zip-orig/Common: Vector.h Only in 7zip: LZMADecode.c Only in 7zip: LZMADecode.h Only in 7zip-orig: Windows Only in 7zip: copying.txt Only in 7zip: readme.txt nsis-3.11/Source/BinInterop.cpp000077500000000000000000000473501477201124000164410ustar00rootroot00000000000000/* * BinInterop.cpp * * This file is a part of NSIS. * * Copyright (C) 2017-2025 Anders Kjersem * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * */ #include "BinInterop.h" #include "ResourceEditor.h" #include "util.h" #include // strlen #include // _tcstoul #include #define MKPTR(cast, base, offset) ( (cast) ( ((char*)(base)) + (offset) ) ) #define LE2HE16 FIX_ENDIAN_INT16 // Little-endian 2 Host-endian #define LE2HE32 FIX_ENDIAN_INT32 #define HE2LE16 LE2HE16 #define HE2BE32 BE2HE32 const size_t invalid_res_id = ~(size_t)0; signed char GetExeType(const void*pData, size_t Size) // Returns 'P', 'N', 'L', -'E' or '\0' { char *filedata = (char*) pData, type = '\0'; PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER) filedata; if (Size > sizeof(*pIDH) && (pIDH->e_magic == 0x5A4D) | (pIDH->e_magic == 0x4D5A)) { type = -'E'; // Basic DOS EXE UINT32 nho = LE2HE32(pIDH->e_lfanew); if (Size > nho + 4 && MKPTR(BYTE*, pIDH, nho)[1] == 'E') { if (pIDH->e_magic == IMAGE_DOS_SIGNATURE && MKPTR(PIMAGE_NT_HEADERS, pIDH, nho)->Signature == IMAGE_NT_SIGNATURE) type = 'P'; else if (MKPTR(BYTE*, pIDH, nho)[0] == 'L' || MKPTR(BYTE*, pIDH, nho)[0] == 'N') type = MKPTR(BYTE*, pIDH, nho)[0]; } } return type; } signed char GetExeType(const TCHAR*filepath) { FILEVIEW map; char *filedata = create_file_view_readonly(filepath, map), type = '\0'; if (filedata) type = GetExeType(filedata, map.size), close_file_view(map); return type; } FILE* MSTLB_fopen(const TCHAR*filepath, size_t*pResId) { size_t resid = invalid_res_id; // MSDN:"By default, the type library is extracted from the first resource of type ITypeLib" FILE*f = FOPEN(filepath, ("rb")); if (!f) { // Retry with the "filename.exe\1234" syntax supported by LoadTypeLib tstring name = get_file_name(filepath), parent = get_dir_name(filepath); const TCHAR *pStart; TCHAR *pEnd; resid = _tcstoul(pStart = name.c_str(), &pEnd, 10); if (pEnd != pStart && !*pEnd && (f = FOPEN(parent.c_str(), ("rb")))) { USHORT mz, valid = false; valid = fread(&mz, 1, sizeof(mz), f) == 2 && (mz == 0x4d5a || mz == 0x5a4d); if (!valid) fclose(f), f = 0; // Only allow the special syntax on executable files } } if (pResId) *pResId = resid; return f; } #if !defined(_WIN32) || defined(NSIS_GETTLBVERSION_FORCEINTERNAL) #if 0 // midl /DOLDTLB=1 /oldtlb /tlb SLTG.tlb test.idl && midl /DNEWTLB=1 /newtlb /tlb MSFT.tlb test.idl #ifdef NEWTLB import "unknwn.idl"; [ object, uuid(42424242-1111-1111-0001-424242424242) ] interface IInTeRfAcE1 : IUnknown { HRESULT I1_MeThOd1(); }; [ object, uuid(42424242-1111-1111-0002-424242424242) ] interface IInTeRfAcE2 : IUnknown { [idempotent] HRESULT I2_MeThOd1(); }; #endif [ //msdn.microsoft.com/en-us/library/windows/desktop/aa367069 uuid(42424242-1234-1234-1234-424242424242), lcid(0x0809), version(666.1337), helpstring("HeLpStRiNg"), // ICreateTypeInfo::SetDocString? helpfile("HeLpFiLe"), helpcontext(0xBABEFACE), #ifdef NEWTLB helpstringdll("HeLpStRiNgDlL"), helpstringcontext(0xF00DBABE), #endif control, /* LIBFLAG_FCONTROL */ hidden, /* LIBFLAG_FHIDDEN */ restricted, /* LIBFLAG_FRESTRICTED */ ] library LiBnAmE { #ifdef NEWTLB //importlib("stdole2.tlb"); #else importlib("stdole32.tlb"); #endif [ uuid(42424242-0000-0000-0000-424242424242), helpstring("CoClAsSHeLpStRiNg") ] coclass CoClAsS { #ifdef NEWTLB [default] interface IInTeRfAcE1; interface IInTeRfAcE2; #else [default] interface IUnknown; #endif }; }; #endif //~ .IDL #pragma pack(1) typedef struct { UINT32 Sig; // 'MSFT' USHORT FmtVerMaj, FmtVerMin; // This is just a guess, always seems to be 2.1? UINT32 Unknown; UINT32 UnkLocale; // idl:library:lcid UINT32 Locale; // idl:library:lcid & ICreateTypeLib::SetLcid? This is the LCID returned in TLIBATTR. UINT32 FlagsAndSK; // 0x03=tagSYSKIND mask. 0x0010=idl:library:helpfile 0x0100=idl:library:helpstringdll USHORT VerMaj, VerMin; // ICreateTypeLib::SetVersion? USHORT LibFlags; // tagLIBFLAGS (TLIBATTR.wLibFlags) USHORT Unknown2; UINT32 Unknown3; // Count of? This changes when the number of interfaces in the .idl changes. UINT32 HelpString; UINT32 HelpStringContext; UINT32 HelpContext; // ...? } MSTLB_MSFT_MINIHEADER; typedef struct { UINT32 Sig; // 'SLTG' USHORT Count; // Count of stream descriptors USHORT CompObjFooterSize, CompObjHeaderSize; USHORT First; // Index of the first stream (Streams must be enumerated in the correct order!) char Guid[16]; // DEFINE_OLEGUID(CLSID_?, 0x000204ff, 0, 0) } MSTLB_SLTG_HEADER; typedef struct { BYTE Sig[1+7+1+3+1]; // "\001CompObj\0dir" (Is "dir" part of the signature or is it the offset in one of the stream descriptors?) } MSTLB_SLTG_COMPOBJ; typedef struct { UINT32 Size; // Size of stream USHORT Unknown; // Offset to something in the COMPOBJ header? USHORT Next; // Next stream index } MSTLB_SLTG_SD; typedef struct { USHORT Len; // 0xffff if there is no string. } MSTLB_SLTG_CSHDR; // Counted narrow string without \0 terminator. typedef struct { enum { SIG = 0x51cc, CSCOUNT = 3 }; USHORT Sig; // 'CC51' USHORT Unknown[2]; MSTLB_SLTG_CSHDR Strings[CSCOUNT]; // (Unknown, idl:library:helpstring and idl:library:helpfile) } MSTLB_SLTG_BLOCK_LIBATTR_HEADER; typedef struct { UINT32 HelpContext; // idl:library:helpcontext USHORT SysKind; // tagSYSKIND (All 16-bits returned in TLIBATTR.syskind) UINT32 Locale; USHORT BadLocale; // If this is non-zero the returned TLIBATTR LCID is 0. USHORT LibFlags; // tagLIBFLAGS (TLIBATTR.wLibFlags) USHORT VerMaj, VerMin; char LibGuid[16]; // idl:library:uuid //...? } MSTLB_SLTG_BLOCK_LIBATTR_FOOTER; #pragma pack() static bool MSTLB_GetVersion_MSFT(const void*pData, size_t cbData, DWORD &high, DWORD &low) { if (cbData >= sizeof(MSTLB_MSFT_MINIHEADER)) { const MSTLB_MSFT_MINIHEADER &h = *(MSTLB_MSFT_MINIHEADER*) pData; if (h.Sig == FIX_ENDIAN_INT32(0x5446534D)) { if (FIX_ENDIAN_INT16(h.FmtVerMaj) == 2 && FIX_ENDIAN_INT16(h.FmtVerMin) == 1) // Is this always 2.1? { // lcid = FIX_ENDIAN_INT32(h.Locale); // sysk = FIX_ENDIAN_INT32(h.FlagsAndSK) & 0x03; // libf = FIX_ENDIAN_INT16(h.LibFlags) | 0x08; // 0x08 for LIBFLAG_FHASDISKIMAGE high = FIX_ENDIAN_INT16(h.VerMaj), low = FIX_ENDIAN_INT16(h.VerMin); return true; } } } return false; } static USHORT GetLenLEToHE(const MSTLB_SLTG_CSHDR &s) { USHORT len = FIX_ENDIAN_INT16(s.Len); return len != 0xffff ? len : 0; } static bool MSTLB_IsSerializedOleGuid(const void*pData, UINT32 Bits1 = 0, UINT32 Mask1 = 0) { bool failed = false; failed |= (FIX_ENDIAN_INT32(*MKPTR(UINT32*, pData, 4*0)) & Mask1) != Bits1; failed |= (FIX_ENDIAN_INT32(*MKPTR(UINT32*, pData, 4*1))) != 0x00000000; failed |= (FIX_ENDIAN_INT32(*MKPTR(UINT32*, pData, 4*2))) != 0x000000C0; failed |= (FIX_ENDIAN_INT32(*MKPTR(UINT32*, pData, 4*3))) != 0x46000000; return !failed; // Does it look like a DEFINE_OLEGUID() GUID? } static bool MSTLB_GetVersion_SLTG(const void*pData, size_t cbData, DWORD &high, DWORD &low) { if (cbData >= sizeof(MSTLB_SLTG_HEADER)) { size_t eofPtr = MKPTR(size_t, pData, cbData); const MSTLB_SLTG_HEADER &h = *(MSTLB_SLTG_HEADER*) pData; if (h.Sig == FIX_ENDIAN_INT32(0x047544C53) && MSTLB_IsSerializedOleGuid(h.Guid, 0x00020400, 0xffffff00)) // 0x000204xx for IID_ITypeLib and friends { MSTLB_SLTG_SD *pSD = MKPTR(MSTLB_SLTG_SD*, &h, sizeof(MSTLB_SLTG_HEADER)); UINT32 streamCount = FIX_ENDIAN_INT16(h.Count); // Check the data in each stream until we find the LIBATTR block void *pFirstStreamData = MKPTR(void*, pSD, (sizeof(MSTLB_SLTG_SD) * streamCount) + FIX_ENDIAN_INT16(h.CompObjHeaderSize) + FIX_ENDIAN_INT16(h.CompObjFooterSize)); for (UINT32 tries = 0, i = FIX_ENDIAN_INT16(h.First), c = streamCount, o = 0; tries < c && i < c; ++tries) { MSTLB_SLTG_BLOCK_LIBATTR_HEADER *pBH = MKPTR(MSTLB_SLTG_BLOCK_LIBATTR_HEADER*, pFirstStreamData, o), *pD1 = pBH; if (eofPtr < MKPTR(size_t, pBH, sizeof(USHORT))) break; // The stream must at least have a signature if (FIX_ENDIAN_INT16(pBH->Sig) == pD1->SIG && eofPtr > MKPTR(size_t, pD1, sizeof(*pD1))) { unsigned long o2 = sizeof(USHORT) * 3; // Skip past the initial members for (UINT32 strIdx = 0; strIdx < pD1->CSCOUNT; ++strIdx) { MSTLB_SLTG_CSHDR *pS = MKPTR(MSTLB_SLTG_CSHDR*, pD1, o2); o2 += sizeof(MSTLB_SLTG_CSHDR) + GetLenLEToHE(*pS); // Skip past the embedded counted string } MSTLB_SLTG_BLOCK_LIBATTR_FOOTER *pD2 = MKPTR(MSTLB_SLTG_BLOCK_LIBATTR_FOOTER*, pD1, o2); if (eofPtr < MKPTR(size_t, pD2, sizeof(*pD2))) break; // lcid = FIX_ENDIAN_INT32(pD2->Locale); // sysk = FIX_ENDIAN_INT16(pD2->SysKind); // libf = FIX_ENDIAN_INT16(pD2->LibFlags); high = FIX_ENDIAN_INT16(pD2->VerMaj), low = FIX_ENDIAN_INT16(pD2->VerMin); return true; } o += FIX_ENDIAN_INT32(pSD[i].Size), i = FIX_ENDIAN_INT16(pSD[i].Next); } } } return false; } static bool MSTLB_GetVersion(const void*pData, size_t cbData, DWORD &high, DWORD &low) { bool rv = MSTLB_GetVersion_MSFT(pData, cbData, high, low); if (!rv) rv = MSTLB_GetVersion_SLTG(pData, cbData, high, low); return rv; } static BYTE* GetResource(CResourceEditor&RE, const TCHAR*RT, int RN, int RL, size_t&cbData) { BYTE *pResData = RE.GetResource(RT, RN, RL); if (pResData) cbData = RE.GetResourceSize(RT, RN, RL); return pResData; } static bool GetTLBVersionUsingRE(const void*pPEFile, size_t cbData, size_t resid, DWORD &high, DWORD &low) { bool result = false; try { const TCHAR* rt = _T("TYPELIB"); int rn = (int) resid, rl = CResourceEditor::ANYLANGID; CResourceEditor re((void*) pPEFile, (int) cbData); BYTE *pResData = resid == invalid_res_id ? re.GetFirstResource(rt, cbData) : GetResource(re, rt, rn, rl, cbData); if (pResData) { result = MSTLB_GetVersion(pResData, cbData, high, low); re.FreeResource(pResData); } } catch (std::exception&) { } return result; } static bool GetTLBVersionInterop(const TCHAR *filepath, DWORD &high, DWORD &low) { unsigned long size; size_t resid; FILE *f = MSTLB_fopen(filepath, &resid); bool result = false, resonly = invalid_res_id != resid; void *pFileData = alloc_and_read_file(f, size); if (f) fclose(f); if (pFileData) { if (!result && !resonly) result = MSTLB_GetVersion(pFileData, size, high, low); // A raw TLB file? if (!result) result = GetTLBVersionUsingRE(pFileData, size, resid, high, low); // A resource in a PE file? // TODO: if (!result) result = GetTLBVersion16(pFileData, size, resid, high, low); // A resource in a 16-bit executable? free(pFileData); } // Not supported: if (!result) result = GetTLBVersionFromMoniker(filepath, high, low); return result; } #else // !_WIN32 static bool GetTLBVersionUsingAPI(const TCHAR *filepath, DWORD &high, DWORD &low) { bool found = false; HRESULT hr; ITypeLib *pTL; TCHAR fullpath[1024], *p; if (!GetFullPathName(filepath, COUNTOF(fullpath), fullpath, &p)) return false; #ifdef _UNICODE hr = LoadTypeLib(fullpath, &pTL); #else WCHAR *olepath = (WCHAR*) WinWStrDupFromTChar(fullpath); if (!olepath) return false; hr = LoadTypeLib(olepath, &pTL); free(olepath); #endif //~ _UNICODE if (SUCCEEDED(hr)) { TLIBATTR *tlatt; hr = pTL->GetLibAttr(&tlatt); if (SUCCEEDED(hr)) { high = tlatt->wMajorVerNum, low = tlatt->wMinorVerNum; found = true; } pTL->Release(); } return found; } #endif //~ !_WIN32 bool GetTLBVersion(const TCHAR *filepath, DWORD &high, DWORD &low, bool NotUsed) { bool found = false; #if defined(_WIN32) && !defined(NSIS_GETTLBVERSION_FORCEINTERNAL) found = GetTLBVersionUsingAPI(filepath, high, low); #else //! _WIN32 found = GetTLBVersionInterop(filepath, high, low); #endif //~ _WIN32 return found; } static bool GetDLLVersionUsingRE(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product) { bool found = false; LANGID anylangid = CResourceEditor::ANYLANGID; unsigned long fileSize, fieldofs = Product ? 2 : 0; void*pFileData = alloc_and_read_file(filepath, fileSize); if (!pFileData) return false; try { CResourceEditor re(pFileData, fileSize); LPBYTE resdata = re.GetResource(VS_FILE_INFO, VS_VERSION_INFO, anylangid); if (resdata) { size_t ressize = re.GetResourceSize(VS_FILE_INFO, VS_VERSION_INFO, anylangid); size_t vsvhdrsize = sizeof(WORD) * 3; if (ressize > vsvhdrsize) { // Locate VS_FIXEDFILEINFO inside VS_VERSIONINFO WINWCHAR *szKey = (WINWCHAR*)(resdata + vsvhdrsize); size_t len = vsvhdrsize + (WinWStrLen(szKey) + 1) * sizeof(WINWCHAR); len = (len + 3) & ~3; // Align on DWORD boundary VS_FIXEDFILEINFO *verinfo = (VS_FIXEDFILEINFO*)(resdata + len); if (ressize >= len + sizeof(VS_FIXEDFILEINFO) && verinfo->dwSignature == FIX_ENDIAN_INT32(VS_FFI_SIGNATURE)) { high = FIX_ENDIAN_INT32((&verinfo->dwFileVersionMS)[fieldofs]), low = FIX_ENDIAN_INT32((&verinfo->dwFileVersionLS)[fieldofs]); found = true; } } re.FreeResource(resdata); } } catch (std::exception&) { } free(pFileData); return found; } static bool GetDLLVersionUsingAPI(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product) { bool found = false; #ifdef _WIN32 TCHAR path[1024], *name, fieldofs = Product ? 2 : 0; path[0] = 0; GetFullPathName(filepath, 1024, path, &name); DWORD ignore, verSize = GetFileVersionInfoSize(path, &ignore); if (verSize) { void *buf = malloc(verSize); if (buf) { UINT valSize; VS_FIXEDFILEINFO *pvsf; if (GetFileVersionInfo(path, 0, verSize, buf) && VerQueryValue(buf, _T("\\"), (void**) &pvsf, &valSize)) { high = (&pvsf->dwFileVersionMS)[fieldofs], low = (&pvsf->dwFileVersionLS)[fieldofs]; found = true; } free(buf); } } #endif return found; } #pragma pack(push, 1) typedef struct tagMINI_IMAGE_VXD_HEADER { WORD e32_magic, endian; BYTE data[180]; DWORD e32_winresoff, e32_winreslen; WORD e32_devid, e32_ddkver; } MINI_IMAGE_VXD_HEADER, *PMINI_IMAGE_VXD_HEADER; #pragma pack(pop) static bool GetDLLVersionFromVXD(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product) { bool found = false; UINT fieldofs = Product ? 2 : 0; FILEVIEW map; char *filedata = create_file_view_readonly(filepath, map); if (filedata) { PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER) filedata; if ((pDosHdr->e_magic == 0x5A4D) | (pDosHdr->e_magic == 0x4D5A)) { PMINI_IMAGE_VXD_HEADER pVxdHdr = MKPTR(PMINI_IMAGE_VXD_HEADER, pDosHdr, LE2HE32(pDosHdr->e_lfanew)); if (pVxdHdr->e32_magic == HE2LE16(0x454C) && pVxdHdr->endian == 0) // Is it a little-endian VXD? { UINT minvsvi16 = 2 + 2 + 16, minvsffi = 52, minressecsize = ((1 + 2) + (1 + 2) + 2 + 4) + minvsvi16 + minvsffi; PMINI_IMAGE_VXD_HEADER pLEHdr = pVxdHdr; UINT ressecsize = LE2HE32(pLEHdr->e32_winreslen); if (ressecsize >= minressecsize && pLEHdr->e32_winresoff != 0) { // MSKB201685 just assumes that the first item is the version and we do the same. char *pRes = MKPTR(char*, pDosHdr, LE2HE32(pLEHdr->e32_winresoff)); UINT ressize, ofs = 3, succ = *MKPTR(BYTE*, pRes, 0) == 0xff && *MKPTR(WORD*, pRes, 1) == HE2LE16(16); // RT_VERSION if (succ) succ = *MKPTR(BYTE*, pRes, ofs) == 0xff ? (ofs += (1 + 2) + 2) : (ofs += ((UINT)strlen(MKPTR(char*, pRes, ofs)) + !0) + 2); // Ordinal or string name if (succ) succ = ofs + 4 < ressecsize; if (succ) ressize = LE2HE32(*MKPTR(DWORD*, pRes, ofs)), ofs += 4; if (succ && ressize >= minvsvi16 + minvsffi && ressize < ressecsize) { WORD *pVSVI = MKPTR(WORD*, pRes, ofs); // VS_VERSIONINFO (16-bit/ASCII version) if (LE2HE16(pVSVI[0]) >= minvsvi16 + minvsffi && LE2HE16(pVSVI[1]) >= minvsffi && !memcmp(&pVSVI[2], "VS_VERSION_INFO", 16)) { VS_FIXEDFILEINFO *pFFI = MKPTR(VS_FIXEDFILEINFO*, pVSVI, 2 + 2 + 16); if (LE2HE32(pFFI->dwSignature) == 0xFEEF04BD) { high = LE2HE32((&pFFI->dwFileVersionMS)[fieldofs]), low = LE2HE32((&pFFI->dwFileVersionLS)[fieldofs]); found = true; } } } } } } close_file_view(map); } return found; } bool GetDLLVersion(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product) { bool result = GetDLLVersionUsingAPI(filepath, high, low, Product); if (!result) result = GetDLLVersionUsingRE(filepath, high, low, Product); if (!result) result = GetDLLVersionFromVXD(filepath, high, low, Product); return result; } DWORD GetDIBHeaderInfo(const void*pData, size_t DataSize, GENERICIMAGEINFO&Info) { DWORD *p32 = (DWORD*) pData; WORD *p16 = (WORD*) pData; if (DataSize >= 12) { DWORD size = LE2HE32(p32[0]); if (size == 12) // BITMAPCOREHEADER { Info.Width = LE2HE16(p16[2]), Info.RawHeight = (INT32) (SHORT) LE2HE16(p16[3]); Info.Height = Info.RawHeight; // BITMAPCOREHEADER bitmaps cannot be top-down bitmaps (docs.microsoft.com/en-us/windows/win32/gdi/bitmap-header-types) Info.Planes = LE2HE16(p16[4]), Info.BPP = LE2HE16(p16[5]); return size; } if (size >= 16) // OS22XBITMAPHEADER/BITMAPINFOHEADER/BITMAPV*HEADER { Info.Width = LE2HE32(p32[1]), Info.RawHeight = (INT32) LE2HE32(p32[2]); Info.Height = abs(Info.RawHeight); Info.Planes = LE2HE16(p16[6+0]), Info.BPP = LE2HE16(p16[6+1]); return size; } } return 0; } DWORD IsBMPFile(const void*pData, size_t DataSize, GENERICIMAGEINFO*pInfo) { BYTE *p8 = (BYTE*) pData; if (DataSize >= 14+12 && p8[0] == 'B' && p8[1] == 'M') { DWORD *p32 = (DWORD*) (&p8[2]), fsize = LE2HE32(p32[0]), bitsoffs = LE2HE32(p32[2]); if ((!fsize || fsize > 14+12) && (!bitsoffs || bitsoffs >= 14+12)) { GENERICIMAGEINFO info; return GetDIBHeaderInfo(p8 + 14, DataSize - 14, pInfo ? *pInfo : info); } } return 0; } bool LoadImageCanLoadFile(const void*pData, size_t DataSize) { bool valid = IsICOCURFile(pData, DataSize) != 0; if (!valid) { GENERICIMAGEINFO info; UINT headersize = GetBMPFileHeaderSize(pData, DataSize, &info); valid = headersize == 12 || headersize == 40; // Only supports BITMAPCOREHEADER and BITMAPINFOHEADER (Bug #681 & FR #559) valid = valid && !info.IsTopDownBitmap(); // TopDown bitmaps are only valid if they are loaded with LR_CREATEDIBSECTION, and if loaded from a resource, and if running on Vista+? and therefore we deny! } return valid; } bool LoadImageCanLoadFile(const TCHAR *filepath) { bool valid = false; unsigned char header[14+124]; FILE *f = my_fopen(filepath, "rb"); if (f) { valid = LoadImageCanLoadFile(header, fread(header, 1, sizeof(header), f)); fclose(f); } return valid; } nsis-3.11/Source/BinInterop.h000077500000000000000000000036331477201124000161020ustar00rootroot00000000000000/* * BinInterop.h * * This file is a part of NSIS. * * Copyright (C) 2017-2025 Anders Kjersem * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * */ #ifndef NSIS_BININTEROP_H #define NSIS_BININTEROP_H #include "Platform.h" #include "tchar.h" #include // FILE* signed char GetExeType(const void*pData, size_t Size); signed char GetExeType(const TCHAR*filepath); FILE* MSTLB_fopen(const TCHAR*filepath, size_t*pResId = 0); bool GetTLBVersion(const TCHAR *filepath, DWORD &high, DWORD &low, bool NotUsed = false); bool GetDLLVersion(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product = false); typedef struct GENERICIMAGEINFO { UINT32 Width, Height; INT32 RawHeight; WORD BPP, Planes; GENERICIMAGEINFO() : RawHeight(0) {} bool IsTopDownBitmap() const { return Height != (UINT32) RawHeight && RawHeight; } } GENERICIMAGEINFO; DWORD GetDIBHeaderInfo(const void*pData, size_t DataSize, GENERICIMAGEINFO&Info); DWORD IsBMPFile(const void*pData, size_t DataSize, GENERICIMAGEINFO*pInfo = 0); #define GetBMPFileHeaderSize IsBMPFile inline WORD IsICOCURFile(const void*pData) { WORD *p16 = (WORD*) pData, ico = 1, cur = 2, type, count; if (p16[0] == FIX_ENDIAN_INT16(0x0000)) if ((type = FIX_ENDIAN_INT16(p16[1])) == ico || type == cur) return count = FIX_ENDIAN_INT16(p16[2]); return 0; } inline WORD IsICOCURFile(const void*pData, size_t DataSize) { return DataSize > 6 ? IsICOCURFile(pData) : 0; } bool LoadImageCanLoadFile(const void*pData, size_t DataSize); bool LoadImageCanLoadFile(const TCHAR *filepath); #define LoadImageCanLoadFileFromResource LoadImageCanLoadFile #endif //~ NSIS_BININTEROP_H nsis-3.11/Source/DialogTemplate.cpp000077500000000000000000000512661477201124000172640ustar00rootroot00000000000000/* * DialogTemplate.cpp * * This file is a part of NSIS. * * Copyright (C) 2002-2025 Amir Szekely and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "DialogTemplate.h" #include "winchar.h" #include // for assert(3) #ifndef _WIN32 # include "util.h" // for Unicode conversion functions # include # include # include # include #endif using namespace std; ////////////////////////////////////////////////////////////////////// // Utilities ////////////////////////////////////////////////////////////////////// static inline DWORD ConvertEndianness(DWORD d) { return FIX_ENDIAN_INT32(d); } static inline WORD ConvertEndianness(WORD w) { return FIX_ENDIAN_INT16(w); } static inline short ConvertEndianness(short s) { return ConvertEndianness(WORD(s)); } #define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn // Reads a variant length array from seeker into readInto and advances seeker void ReadVarLenArr(LPBYTE &seeker, WINWCHAR* &readInto, unsigned int uCodePage) { WORD* arr = (WORD*)seeker; switch (ConvertEndianness(arr[0])) { case 0x0000: readInto = 0; seeker += sizeof(WORD); break; case 0xFFFF: readInto = MAKEINTRESOURCEWINW(ConvertEndianness(arr[1])); seeker += 2*sizeof(WORD); break; default: { readInto = WinWStrDupFromWinWStr((WINWCHAR*) arr); WINWCHAR *wseeker = (WINWCHAR*) seeker; while (*wseeker++); seeker = LPBYTE(wseeker); } break; } } // A macro that writes a given string (that can be a number too) into the buffer #define WriteStringOrId(x) \ if (x) \ if (IS_INTRESOURCE(x)) { \ *(WORD*)seeker = 0xFFFF; \ seeker += sizeof(WORD); \ *(WORD*)seeker = ConvertEndianness(WORD((ULONG_PTR)(x))); \ seeker += sizeof(WORD); \ } \ else { \ WinWStrCpy((WINWCHAR *) seeker, x); \ seeker += WinWStrLen((WINWCHAR *) seeker) * sizeof(WINWCHAR) + sizeof(WINWCHAR); \ } \ else \ seeker += sizeof(WORD); // A macro that adds the size of x (which can be a string a number, or nothing) to dwSize #define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (DWORD)((WinWStrLen(x) + 1) * sizeof(WINWCHAR))) : sizeof(WORD) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CDialogTemplate::CDialogTemplate(BYTE* pbData, bool build_unicode, unsigned int uCodePage) { m_uCodePage = uCodePage; m_build_unicode = build_unicode; m_dwHelpId = 0; m_szClass = 0; m_szFont = 0; m_sFontSize = 0; m_sFontWeight = 0; m_bItalic = 0; m_bCharset = 0; m_szMenu = 0; m_szTitle = 0; WORD wItems = 0; if (*(DWORD*)pbData == EXTENDED_DIALOG) { // Extended dialog template signature m_bExtended = true; DLGTEMPLATEEX* dTemplateEx = (DLGTEMPLATEEX*)pbData; m_dwHelpId = ConvertEndianness(dTemplateEx->helpID); m_dwStyle = ConvertEndianness(dTemplateEx->style); m_dwExtStyle = ConvertEndianness(dTemplateEx->exStyle); m_sX = ConvertEndianness(dTemplateEx->x); m_sY = ConvertEndianness(dTemplateEx->y); m_sWidth = ConvertEndianness(dTemplateEx->cx); m_sHeight = ConvertEndianness(dTemplateEx->cy); wItems = ConvertEndianness(dTemplateEx->cDlgItems); } else { m_bExtended = false; DLGTEMPLATE* dTemplate = (DLGTEMPLATE*)pbData; m_dwStyle = ConvertEndianness(dTemplate->style); m_dwExtStyle = ConvertEndianness(dTemplate->dwExtendedStyle); m_sX = ConvertEndianness(dTemplate->x); m_sY = ConvertEndianness(dTemplate->y); m_sWidth = ConvertEndianness(dTemplate->cx); m_sHeight = ConvertEndianness(dTemplate->cy); wItems = ConvertEndianness(dTemplate->cdit); } BYTE* seeker = pbData + (m_bExtended ? sizeof(DLGTEMPLATEEX) : sizeof(DLGTEMPLATE)); // Read menu variant length array ReadVarLenArr(seeker, m_szMenu, m_uCodePage); // Read class variant length array ReadVarLenArr(seeker, m_szClass, m_uCodePage); // Read title variant length array ReadVarLenArr(seeker, m_szTitle, m_uCodePage); // Read font size and variant length array (only if style DS_SETFONT is used!) if (m_dwStyle & DS_SETFONT) { m_sFontSize = ConvertEndianness(*(short*)seeker); seeker += sizeof(short); if (m_bExtended) { m_sFontWeight = ConvertEndianness(*(short*)seeker); seeker += sizeof(short); m_bItalic = *(BYTE*)seeker; seeker += sizeof(BYTE); m_bCharset = *(BYTE*)seeker; seeker += sizeof(BYTE); } ReadVarLenArr(seeker, m_szFont, m_uCodePage); } // Read items for (int i = 0; i < wItems; i++) { // DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundary if (DWORD(seeker - pbData) % sizeof(DWORD)) seeker += sizeof(WORD); DialogItemTemplate* item = new DialogItemTemplate; ZeroMemory(item, sizeof(DialogItemTemplate)); if (m_bExtended) { DLGITEMTEMPLATEEX* rawItem = (DLGITEMTEMPLATEEX*)seeker; item->dwHelpId = ConvertEndianness(rawItem->helpID); item->dwStyle = ConvertEndianness(rawItem->style); item->dwExtStyle = ConvertEndianness(rawItem->exStyle); item->sX = ConvertEndianness(rawItem->x); item->sY = ConvertEndianness(rawItem->y); item->sWidth = ConvertEndianness(rawItem->cx); item->sHeight = ConvertEndianness(rawItem->cy); item->wId = ConvertEndianness(rawItem->id); seeker += sizeof(DLGITEMTEMPLATEEX); } else { DLGITEMTEMPLATE* rawItem = (DLGITEMTEMPLATE*)seeker; item->dwHelpId = 0; item->dwStyle = ConvertEndianness(rawItem->style); item->dwExtStyle = ConvertEndianness(rawItem->dwExtendedStyle); item->sX = ConvertEndianness(rawItem->x); item->sY = ConvertEndianness(rawItem->y); item->sWidth = ConvertEndianness(rawItem->cx); item->sHeight = ConvertEndianness(rawItem->cy); item->wId = ConvertEndianness(rawItem->id); seeker += sizeof(DLGITEMTEMPLATE); } // Read class variant length array ReadVarLenArr(seeker, item->szClass, m_uCodePage); // Read title variant length array ReadVarLenArr(seeker, item->szTitle, m_uCodePage); // Read creation data variant length array // First read the size of the array (no null termination) item->wCreateDataSize = ConvertEndianness(*(WORD*)seeker); seeker += sizeof(WORD); // Then read the array it self (if size is not 0) if (item->wCreateDataSize) { item->wCreateDataSize -= sizeof(WORD); // Size includes size field itself... item->szCreationData = new char[item->wCreateDataSize]; CopyMemory(item->szCreationData, seeker, item->wCreateDataSize); seeker += item->wCreateDataSize; } // Add the item to the vector m_vItems.push_back(item); } } static void free_template_string(WINWCHAR*s) { if (!IS_INTRESOURCE(s)) free(s); } CDialogTemplate::~CDialogTemplate() { free_template_string(m_szMenu); free_template_string(m_szClass); free(m_szTitle); free(m_szFont); for (unsigned int i = 0; i < m_vItems.size(); i++) { free_template_string(m_vItems[i]->szClass); free_template_string(m_vItems[i]->szTitle); if (m_vItems[i]->szCreationData) delete [] m_vItems[i]->szCreationData; delete m_vItems[i]; } } ////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////// // Returns the width of the dialog short CDialogTemplate::GetWidth() { return m_sWidth; } // Returns the height of the dialog short CDialogTemplate::GetHeight() { return m_sHeight; } // Returns info about the item with the id wId DialogItemTemplate* CDialogTemplate::GetItem(WORD wId) { for (unsigned int i = 0; i < m_vItems.size(); i++) if (m_vItems[i]->wId == wId) return m_vItems[i]; return 0; } // Returns info about the item with the indexed i DialogItemTemplate* CDialogTemplate::GetItemByIdx(DWORD i) { if (i >= m_vItems.size()) return 0; return m_vItems[i]; } // Removes an item // Returns 1 if removed, 0 otherwise int CDialogTemplate::RemoveItem(WORD wId) { for (unsigned int i = 0; i < m_vItems.size(); i++) { if (m_vItems[i]->wId == wId) { m_vItems.erase(m_vItems.begin() + i); return 1; } } return 0; } // Sets the font of the dialog void CDialogTemplate::SetFont(TCHAR* szFaceName, WORD wFontSize) { m_dwStyle &= ~DS_SHELLFONT; if (!_tcscmp(szFaceName, _T("MS Shell Dlg"))) // TODO: "MS Shell Dlg 2"? m_dwStyle |= DS_SHELLFONT; m_dwStyle |= DS_SETFONT; m_bCharset = DEFAULT_CHARSET; free(m_szFont); m_szFont = WinWStrDupFromTChar(szFaceName, m_uCodePage); m_sFontSize = wFontSize; } // Adds an item to the dialog void CDialogTemplate::AddItem(DialogItemTemplate item) { DialogItemTemplate* newItem = new DialogItemTemplate; CopyMemory(newItem, &item, sizeof(DialogItemTemplate)); if (item.szClass && !IS_INTRESOURCE(item.szClass)) { newItem->szClass = WinWStrDupFromWinWStr(item.szClass); } if (item.szTitle && !IS_INTRESOURCE(item.szTitle)) { newItem->szTitle = WinWStrDupFromWinWStr(item.szTitle); } if (item.wCreateDataSize) { newItem->szCreationData = new char[item.wCreateDataSize]; memcpy(newItem->szCreationData, item.szCreationData, item.wCreateDataSize); } m_vItems.push_back(newItem); } // Moves all of the items in the dialog by (x,y) void CDialogTemplate::MoveAll(short x, short y) { for (unsigned int i = 0; i < m_vItems.size(); i++) { m_vItems[i]->sX += x; m_vItems[i]->sY += y; } } // Resizes the dialog by (x,y) void CDialogTemplate::Resize(short x, short y) { m_sWidth += x; m_sHeight += y; } #ifdef _WIN32 // Creates a dummy dialog that is used for converting units HWND CDialogTemplate::CreateDummyDialog() { DWORD dwTemp; BYTE* pbDlg = Save(dwTemp); HWND hDlg = CreateDialogIndirect(GetModuleHandle(0), (DLGTEMPLATE*)pbDlg, 0, 0); FreeSavedTemplate(pbDlg); if (!hDlg) throw runtime_error("Can't create dialog from template!"); return hDlg; } // Converts pixels to this dialog's units void CDialogTemplate::PixelsToDlgUnits(short& x, short& y) { HWND hDlg = CreateDummyDialog(); RECT r = {0, 0, 10000, 10000}; MapDialogRect(hDlg, &r); DestroyWindow(hDlg); x = short(float(x) / (float(r.right)/10000)); y = short(float(y) / (float(r.bottom)/10000)); } void CDialogTemplate::PixelsToDlgUnits(SIZE& siz) { short x = (short)siz.cx, y = (short)siz.cy; PixelsToDlgUnits(x, y); siz.cx = x, siz.cy = y; } // Converts pixels to this dialog's units void CDialogTemplate::DlgUnitsToPixels(short& x, short& y) { HWND hDlg = CreateDummyDialog(); RECT r = {0, 0, 10000, 10000}; MapDialogRect(hDlg, &r); DestroyWindow(hDlg); x = short(float(x) * (float(r.right)/10000)); y = short(float(y) * (float(r.bottom)/10000)); } // Returns the size of a string in the dialog (in dialog units) SIZE CDialogTemplate::GetStringSize(WORD id, TCHAR *str) { HWND hDlg = CreateDummyDialog(); LOGFONT f; GetObject((HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0), sizeof(LOGFONT), &f); HDC memDC = CreateCompatibleDC(GetDC(hDlg)); HFONT font = CreateFontIndirect(&f); SelectObject(memDC, font); SIZE size; GetTextExtentPoint32(memDC, str, (int) _tcslen(str), &size); DestroyWindow(hDlg); DeleteObject(font); DeleteDC(memDC); PixelsToDlgUnits(size); return size; } // Trims the right margins of a control to fit a given text string size. void CDialogTemplate::RTrimToString(WORD id, TCHAR *str, int margins) { DialogItemTemplate* item = GetItem(id); if (!item) return; SIZE size = GetStringSize(id, str); size.cx += margins; size.cy += 2; item->sWidth = short(size.cx); item->sHeight = short(size.cy); } // Trims the left margins of a control to fit a given text string size. void CDialogTemplate::LTrimToString(WORD id, TCHAR *str, int margins) { DialogItemTemplate* item = GetItem(id); if (!item) return; SIZE size = GetStringSize(id, str); size.cx += margins; size.cy += 2; item->sX += item->sWidth - short(size.cx); item->sWidth = short(size.cx); item->sHeight = short(size.cy); } // Trims the left and right margins of a control to fit a given text string size. void CDialogTemplate::CTrimToString(WORD id, TCHAR *str, int margins) { DialogItemTemplate* item = GetItem(id); if (!item) return; SIZE size = GetStringSize(id, str); size.cx += margins; size.cy += 2; item->sX += item->sWidth/2 - short(size.cx/2); item->sWidth = short(size.cx); item->sHeight = short(size.cy); } #else //! WIN32 void CDialogTemplate::PixelsToDlgUnits(short& x, short& y) { assert(0); } void CDialogTemplate::DlgUnitsToPixels(short& x, short& y) { assert(0); } #endif //~ WIN32 // Moves every item right and gives it the WS_EX_RIGHT extended style void CDialogTemplate::ConvertToRTL() { for (unsigned int i = 0; i < m_vItems.size(); i++) { bool addExStyle = false; bool addExLeftScrollbar = true; // Button if ((ULONG_PTR)(m_vItems[i]->szClass) == 0x80) { m_vItems[i]->dwStyle ^= BS_LEFTTEXT; m_vItems[i]->dwStyle ^= BS_RIGHT; m_vItems[i]->dwStyle ^= BS_LEFT; if ((m_vItems[i]->dwStyle & (BS_LEFT|BS_RIGHT)) == (BS_LEFT|BS_RIGHT)) { m_vItems[i]->dwStyle ^= BS_LEFT; m_vItems[i]->dwStyle ^= BS_RIGHT; if (m_vItems[i]->dwStyle & (BS_RADIOBUTTON|BS_CHECKBOX|BS_USERBUTTON)) { m_vItems[i]->dwStyle |= BS_RIGHT; } } } // Edit else if ((ULONG_PTR)(m_vItems[i]->szClass) == 0x81) { if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) { m_vItems[i]->dwStyle ^= ES_RIGHT; } } // Static else if ((ULONG_PTR)(m_vItems[i]->szClass) == 0x82) { if ((m_vItems[i]->dwStyle & SS_TYPEMASK) == SS_LEFT || (m_vItems[i]->dwStyle & SS_TYPEMASK) == SS_LEFTNOWORDWRAP) { m_vItems[i]->dwStyle &= ~SS_TYPEMASK; m_vItems[i]->dwStyle |= SS_RIGHT; } else if ((m_vItems[i]->dwStyle & SS_TYPEMASK) == SS_ICON) { m_vItems[i]->dwStyle |= SS_CENTERIMAGE; } } else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !WinWStrNICmpASCII(m_vItems[i]->szClass, "RichEdit20", 10)) { if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) { m_vItems[i]->dwStyle ^= ES_RIGHT; } } else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !WinWStrICmpASCII(m_vItems[i]->szClass, "SysTreeView32")) { // we can't have both TVS_RTLREADING and WS_EX_LAYOUTRTL because the text becomes non-LTR // we chose just WS_EX_LAYOUTRTL because just TVS_RTLREADING changes the text only and not the tree itself // https://github.com/qbittorrent/qBittorrent/pull/19929 //m_vItems[i]->dwStyle |= TVS_RTLREADING; m_vItems[i]->dwExtStyle |= WS_EX_LAYOUTRTL; addExStyle = true; addExLeftScrollbar = false; } else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !WinWStrICmpASCII(m_vItems[i]->szClass, "SysListView32")) { m_vItems[i]->dwExtStyle |= WS_EX_LAYOUTRTL; addExLeftScrollbar = false; } else addExStyle = true; if (addExStyle) m_vItems[i]->dwExtStyle |= WS_EX_RIGHT; if (addExLeftScrollbar) m_vItems[i]->dwExtStyle |= WS_EX_LEFTSCROLLBAR; m_vItems[i]->dwExtStyle |= WS_EX_RTLREADING; m_vItems[i]->sX = m_sWidth - m_vItems[i]->sWidth - m_vItems[i]->sX; } m_dwExtStyle |= WS_EX_RIGHT | WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR; } // Saves the dialog in the form of DLGTEMPLATE[EX] BYTE* CDialogTemplate::Save(DWORD& dwSize) { // We need the size first to know how much memory to allocate dwSize = GetSize(); BYTE* pbDlg = new BYTE[dwSize]; ZeroMemory(pbDlg, dwSize); BYTE* seeker = pbDlg; if (m_bExtended) { DLGTEMPLATEEX dh = { ConvertEndianness(WORD(0x0001)), ConvertEndianness(WORD(0xFFFF)), ConvertEndianness(m_dwHelpId), ConvertEndianness(m_dwExtStyle), ConvertEndianness(m_dwStyle), ConvertEndianness(WORD(m_vItems.size())), ConvertEndianness(m_sX), ConvertEndianness(m_sY), ConvertEndianness(m_sWidth), ConvertEndianness(m_sHeight) }; CopyMemory(seeker, &dh, sizeof(DLGTEMPLATEEX)); seeker += sizeof(DLGTEMPLATEEX); } else { DLGTEMPLATE dh = { ConvertEndianness(m_dwStyle), ConvertEndianness(m_dwExtStyle), ConvertEndianness(WORD(m_vItems.size())), ConvertEndianness(m_sX), ConvertEndianness(m_sY), ConvertEndianness(m_sWidth), ConvertEndianness(m_sHeight) }; CopyMemory(seeker, &dh, sizeof(DLGTEMPLATE)); seeker += sizeof(DLGTEMPLATE); } // Write menu variant length array WriteStringOrId(m_szMenu); // Write class variant length array WriteStringOrId(m_szClass); // Write title variant length array WriteStringOrId(m_szTitle); // Write font variant length array, size, and extended info (if needed) if (m_dwStyle & DS_SETFONT) { *(short*)seeker = ConvertEndianness(m_sFontSize); seeker += sizeof(short); if (m_bExtended) { *(short*)seeker = ConvertEndianness(m_sFontWeight); seeker += sizeof(short); *(BYTE*)seeker = m_bItalic; seeker += sizeof(BYTE); *(BYTE*)seeker = m_bCharset; seeker += sizeof(BYTE); } WriteStringOrId(m_szFont); } // Write all of the items for (unsigned int i = 0; i < m_vItems.size(); i++) { // DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundary if ((seeker - pbDlg) % sizeof(DWORD)) seeker += sizeof(WORD); if (m_bExtended) { DLGITEMTEMPLATEEX dih = { ConvertEndianness(m_vItems[i]->dwHelpId), ConvertEndianness(m_vItems[i]->dwExtStyle), ConvertEndianness(m_vItems[i]->dwStyle), ConvertEndianness(m_vItems[i]->sX), ConvertEndianness(m_vItems[i]->sY), ConvertEndianness(m_vItems[i]->sWidth), ConvertEndianness(m_vItems[i]->sHeight), ConvertEndianness(m_vItems[i]->wId) }; CopyMemory(seeker, &dih, sizeof(DLGITEMTEMPLATEEX)); seeker += sizeof(DLGITEMTEMPLATEEX); } else { DLGITEMTEMPLATE dih = { ConvertEndianness(m_vItems[i]->dwStyle), ConvertEndianness(m_vItems[i]->dwExtStyle), ConvertEndianness(m_vItems[i]->sX), ConvertEndianness(m_vItems[i]->sY), ConvertEndianness(m_vItems[i]->sWidth), ConvertEndianness(m_vItems[i]->sHeight), ConvertEndianness(m_vItems[i]->wId) }; CopyMemory(seeker, &dih, sizeof(DLGITEMTEMPLATE)); seeker += sizeof(DLGITEMTEMPLATE); } // Write class variant length array const WINWCHAR *szClass = m_vItems[i]->szClass; #ifdef _UNICODE static const WINWCHAR clsRE20W[] = {'R','i','c','h','E','d','i','t','2','0','W',0}; static const WINWCHAR clsRE20A[] = {'R','i','c','h','E','d','i','t','2','0','A',0}; if (!IS_INTRESOURCE(szClass)) { // transmute RichEdit20A/W control into RichEdit20T that matches the target if (m_build_unicode && !WinWStrICmpASCII(szClass, "RichEdit20A")) szClass = clsRE20W; if (!m_build_unicode && !WinWStrICmpASCII(szClass, "RichEdit20W")) szClass = clsRE20A; } #endif WriteStringOrId(szClass); // Write title variant length array WriteStringOrId(m_vItems[i]->szTitle); // Write creation data variant length array // First write its size WORD wCreateDataSize = m_vItems[i]->wCreateDataSize; if (m_vItems[i]->wCreateDataSize) wCreateDataSize += sizeof(WORD); *(WORD*)seeker = ConvertEndianness(wCreateDataSize); seeker += sizeof(WORD); // If size is nonzero write the data too if (m_vItems[i]->wCreateDataSize) { CopyMemory(seeker, m_vItems[i]->szCreationData, m_vItems[i]->wCreateDataSize); seeker += m_vItems[i]->wCreateDataSize; } } assert((DWORD)(seeker - pbDlg) == dwSize); // DONE! return pbDlg; } // Returns the size that the DLGTEMPLATE[EX] will take when saved DWORD CDialogTemplate::GetSize() { DWORD dwSize = m_bExtended ? sizeof(DLGTEMPLATEEX) : sizeof(DLGTEMPLATE); // Menu AddStringOrIdSize(m_szMenu); // Class AddStringOrIdSize(m_szClass); // Title AddStringOrIdSize(m_szTitle); // Font if (m_dwStyle & DS_SETFONT) { dwSize += sizeof(WORD) + (m_bExtended ? sizeof(short) + 2*sizeof(BYTE) : 0); AddStringOrIdSize(m_szFont); } for (unsigned int i = 0; i < m_vItems.size(); i++) { // DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundary ALIGN(dwSize, sizeof(DWORD)); dwSize += m_bExtended ? sizeof(DLGITEMTEMPLATEEX) : sizeof(DLGITEMTEMPLATE); // Class AddStringOrIdSize(m_vItems[i]->szClass); // Title AddStringOrIdSize(m_vItems[i]->szTitle); dwSize += sizeof(WORD) + m_vItems[i]->wCreateDataSize; } return dwSize; } nsis-3.11/Source/DialogTemplate.h000077500000000000000000000073241477201124000167250ustar00rootroot00000000000000/* * DialogTemplate.h * * This file is a part of NSIS. * * Copyright (C) 2002-2025 Amir Szekely and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/21/2007 */ #if !defined(AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_) #define AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "Platform.h" #include "winchar.h" #include #include #ifndef __BIG_ENDIAN__ # define EXTENDED_DIALOG ((DWORD) 0xFFFF0001) #else # define EXTENDED_DIALOG ((DWORD) 0x0100FFFF) #endif struct DialogItemTemplate { DWORD dwHelpId; // Extended only short sX; short sY; short sWidth; short sHeight; DWORD dwExtStyle; DWORD dwStyle; WORD wId; WINWCHAR *szClass; WINWCHAR *szTitle; char *szCreationData; WORD wCreateDataSize; }; #pragma pack(1) #ifndef _WIN32 typedef struct { DWORD style; DWORD dwExtendedStyle; WORD cdit; short x; short y; short cx; short cy; } DLGTEMPLATE; #endif typedef struct { WORD dlgVer; WORD signature; DWORD helpID; DWORD exStyle; DWORD style; WORD cDlgItems; short x; short y; short cx; short cy; } DLGTEMPLATEEX; #ifndef _WIN32 typedef struct { DWORD style; DWORD dwExtendedStyle; short x; short y; short cx; short cy; WORD id; } DLGITEMTEMPLATE; #endif typedef struct { DWORD helpID; DWORD exStyle; DWORD style; short x; short y; short cx; short cy; WORD id; WORD _microsoft_docs_are_wrong; } DLGITEMTEMPLATEEX; #pragma pack() class CDialogTemplate { public: CDialogTemplate(BYTE* pbData, bool build_unicode, unsigned int uCodePage=CP_ACP); virtual ~CDialogTemplate(); short GetWidth(); short GetHeight(); DialogItemTemplate* GetItem(WORD wId); DialogItemTemplate* GetItemByIdx(DWORD i); int RemoveItem(WORD wId); void SetFont(TCHAR* szFaceName, WORD wFontSize); void AddItem(DialogItemTemplate item); #ifdef _WIN32 HWND CreateDummyDialog(); #endif void MoveAll(short x, short y); void Resize(short x, short y); void PixelsToDlgUnits(short& x, short& y); void DlgUnitsToPixels(short& x, short& y); #ifdef _WIN32 static inline bool SupportsDialogUnitComputation() { return true; } void PixelsToDlgUnits(SIZE& siz); SIZE GetStringSize(WORD id, TCHAR *str); void RTrimToString(WORD id, TCHAR *str, int margins); void LTrimToString(WORD id, TCHAR *str, int margins); void CTrimToString(WORD id, TCHAR *str, int margins); #else static inline bool SupportsDialogUnitComputation() { return false; } #endif void ConvertToRTL(); BYTE* Save(DWORD& dwSize); static void FreeSavedTemplate(BYTE*pDT) { delete [] pDT; } DWORD GetSize(); private: bool m_bExtended; bool m_build_unicode; DWORD m_dwHelpId; // Extended only short m_sX; short m_sY; short m_sWidth; short m_sHeight; DWORD m_dwExtStyle; DWORD m_dwStyle; WINWCHAR *m_szMenu; WINWCHAR *m_szClass; WINWCHAR *m_szTitle; // Only if DS_FONT style is set short m_sFontSize; short m_sFontWeight; // Extended only BYTE m_bItalic; // Extended only BYTE m_bCharset; // Extended only WINWCHAR *m_szFont; // For (en/de)coding Unicode unsigned int m_uCodePage; // Items vector std::vector m_vItems; }; #endif // !defined(AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_) nsis-3.11/Source/Platform.h000077500000000000000000000663701477201124000156240ustar00rootroot00000000000000/* * Platform.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #ifndef ___PLATFORM__H___ #define ___PLATFORM__H___ // some definitions for non Win32 platforms were taken from MinGW's free Win32 library #if defined(__cplusplus) && defined(MAKENSIS) && (!defined(_MSC_VER) || _MSC_VER > 1200) template class NSISCHARTYPE{ T _c; public: NSISCHARTYPE(){} NSISCHARTYPE(T c):_c(c){} operator T()const{ return _c; } }; typedef NSISCHARTYPE WINWCHAR; // WINWCHAR is always UTF16LE and should not be passed to wcs* functions #else typedef unsigned short WINWCHAR; #endif // includes #include "tchar.h" #ifdef _WIN32 #include #include #include #include #include #else # include # ifndef EXEHEAD # include # include # endif // basic types typedef uint8_t BYTE, *PBYTE, *LPBYTE; typedef uint16_t WORD, *LPWORD; typedef uint32_t DWORD, *LPDWORD; typedef int16_t SHORT; typedef uint16_t USHORT; typedef uint32_t UINT; typedef uint32_t UINT32; typedef int32_t INT; typedef int32_t INT32; typedef int32_t LONG; typedef uint32_t ULONG; typedef int64_t INT64, LARGE_INTEGER; typedef uint64_t UINT64, ULARGE_INTEGER; typedef intptr_t INT_PTR; typedef uintptr_t UINT_PTR; typedef int BOOL, *LPBOOL; typedef short VARIANT_BOOL; typedef void VOID; typedef void *LPVOID; typedef char CHAR, *PCHAR, *LPCH, *PCH, *NPSTR, *LPSTR, *PSTR; typedef unsigned char UCHAR; typedef const char *LPCCH, *PCSTR, *LPCSTR; typedef unsigned short WCHAR, OLECHAR, *PWCHAR, *LPWCH, *PWCH, *NWPSTR, *LPWSTR, *PWSTR, *BSTR; typedef const unsigned short *LPCWCH, *PCWCH, *LPCWSTR, *PCWSTR, *LPCOLESTR; #ifndef _tctime #define _tctime _wctime #else #define _tctime ctime #endif // basic stuff typedef void * HANDLE; typedef HANDLE HWND; typedef HANDLE HMODULE; typedef unsigned long HKEY; // some gdi typedef DWORD COLORREF; typedef HANDLE HBRUSH; // bool # define FALSE 0 # define TRUE 1 // more typedef WORD LANGID; // ULONGLONG #ifdef __GNUC__ #define _HAVE_INT64 #define _INTEGRAL_MAX_BITS 64 #undef __int64 #define __int64 long long #elif defined(__WATCOMC__) && (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64 ) #define _HAVE_INT64 #endif /* __GNUC__/__WATCOMC */ #if defined(_HAVE_INT64) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64) typedef __int64 LONGLONG; typedef unsigned __int64 DWORDLONG; #else typedef double LONGLONG,DWORDLONG; #endif typedef LONGLONG *PLONGLONG; typedef DWORDLONG *PDWORDLONG; typedef DWORDLONG ULONGLONG,*PULONGLONG; // function mapping #define _strdup strdup #define _snprintf snprintf #define _vsnprintf vsnprintf #endif // ?WIN32 #ifndef INT_MAX #include #endif // mingw32 and w64-mingw32 do not define ULONG_PTR // but rather declare ULONG_PTR via typedef (see basetsd.h) #if !defined(__MINGW32__) && !defined(ULONG_PTR) # ifndef _WIN64 # define ULONG_PTR unsigned long # endif #endif #ifdef __cplusplus #include #if defined(_MSC_VER) && ( _MSC_VER <= 1200 || (defined(_MIN) && _MSC_FULL_VER >= 140000000 && _MSC_FULL_VER <= 140040310) ) #define STD_MIN std::_MIN #define STD_MAX std::_MAX #else #define STD_MIN (std::min) // This works even when windows.h defines min/max #define STD_MAX (std::max) #endif #endif #ifndef COUNTOF #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #endif #ifndef __BIG_ENDIAN__ # define FIX_ENDIAN_INT64(x) (x) # define FIX_ENDIAN_INT32_INPLACE(x) ((void)(x)) # define FIX_ENDIAN_INT32(x) (x) # define FIX_ENDIAN_INT16_INPLACE(x) ((void)(x)) # define FIX_ENDIAN_INT16(x) (x) # define BE2HE32(x) SWAP_ENDIAN_INT32(x) #else # define FIX_ENDIAN_INT64(x) SWAP_ENDIAN_INT64(x) # define FIX_ENDIAN_INT32_INPLACE(x) ((x) = SWAP_ENDIAN_INT32(x)) # define FIX_ENDIAN_INT32(x) SWAP_ENDIAN_INT32(x) # define FIX_ENDIAN_INT16_INPLACE(x) ((x) = SWAP_ENDIAN_INT16(x)) # define FIX_ENDIAN_INT16(x) SWAP_ENDIAN_INT16(x) # define BE2HE32(x) (x) #endif #define SWAP_ENDIAN_INT64(x) ( \ (((x)&0xFF00000000000000) >> 56) | \ (((x)&0x00FF000000000000) >> 40) | \ (((x)&0x0000FF0000000000) >> 24) | \ (((x)&0x000000FF00000000) >> 8) | \ (((x)&0x00000000FF000000) << 8) | \ (((x)&0x0000000000FF0000) << 24) | \ (((x)&0x000000000000FF00) << 40) | \ (((x)&0x00000000000000FF) << 56) ) #define SWAP_ENDIAN_INT32(x) ( \ (((x)&0xFF000000) >> 24) | \ (((x)&0x00FF0000) >> 8) | \ (((x)&0x0000FF00) << 8) | \ (((x)&0x000000FF) << 24) ) #define SWAP_ENDIAN_INT16(x) ( \ (((x)&0xFF00) >> 8) | \ (((x)&0x00FF) << 8) ) // script path separator # define PATH_SEPARATOR_STR _T("\\") # define PATH_SEPARATOR_C _T('\\') // system specific characters #ifdef _WIN32 # define PLATFORM_PATH_SEPARATOR_STR _T("\\") # define PLATFORM_PATH_SEPARATOR_C _T('\\') # define OPT_STR _T("/") # define OPT_C _T('/') # define IS_OPT(a) (a[0]==OPT_C||a[0]==_T('-')) #else # define PLATFORM_PATH_SEPARATOR_STR _T("/") # define PLATFORM_PATH_SEPARATOR_C _T('/') # define OPT_STR _T("-") # define OPT_C _T('-') # define IS_OPT(a) (a[0]==OPT_C) #endif // attributes #ifdef _MSC_VER # define FORCE_INLINE __forceinline #else # ifdef __GNUC__ # if __GNUC__ < 3 # define FORCE_INLINE inline # else # define FORCE_INLINE inline __attribute__ ((always_inline)) # endif # else # define FORCE_INLINE inline # endif #endif #if defined(__GNUC__) #define UNUSED __attribute__((unused)) #else #define UNUSED #endif // macros #ifndef _WIN32 # ifndef FIELD_OFFSET # define FIELD_OFFSET(t,f) ((UINT_PTR)&(((t*)0)->f)) # endif # ifndef MAKEINTRESOURCEA # define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(ULONG_PTR)(i)))) # endif # ifndef MAKEINTRESOURCEW # define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(ULONG_PTR)(i)))) # endif # ifndef MAKEINTRESOURCE # ifdef _UNICODE # define MAKEINTRESOURCE MAKEINTRESOURCEW # else # define MAKEINTRESOURCE MAKEINTRESOURCEA # endif # endif # ifndef IMAGE_FIRST_SECTION # define IMAGE_FIRST_SECTION(h) ( PIMAGE_SECTION_HEADER( (ULONG_PTR) h + \ FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) + \ FIX_ENDIAN_INT16(PIMAGE_NT_HEADERS(h)->FileHeader.SizeOfOptionalHeader) ) ) # endif # ifndef RGB # define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16))) # endif # ifndef LOBYTE # define LOBYTE(w) ((BYTE)(w)) # define HIBYTE(w) ((BYTE)(((WORD)(w)>>8)&0xFF)) # endif # ifndef MAKEWORD # define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8))) # endif # ifndef MAKELONG # define MAKELONG(a,b) ((DWORD)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16))) # endif #endif #ifndef IS_INTRESOURCE # define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0) #endif #ifndef IS_HIGH_SURROGATE # define IS_HIGH_SURROGATE(wch) (((wch) >= 0xd800) && ((wch) <= 0xdbff)) #endif // functions // Anders: MSVC's swprintf is non standard, use _snwprintf when you really mean swprintf #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_snwprintf) # define _snwprintf swprintf // (wchar_t*,size_t,const wchar_t*,...) #endif #ifndef _WIN32 # define _vsnwprintf vswprintf // (wchar_t*,size_t,const wchar_t*,va_list) #endif // Jim Park: These str functions will probably never be encountered with all my // Unicode changes. And if they were used, these would probably be wrong. #ifndef _WIN32 # define stricmp strcasecmp # define strcmpi strcasecmp # define strnicmp strncasecmp # define CopyMemory memcpy # define ZeroMemory(x, y) memset(x, 0, y) #endif #ifndef _WIN64 # ifndef GCLP_HICON # define GCLP_HICON GCL_HICON # define SetClassLongPtr SetClassLong # endif #endif // defines #ifndef MEM_LARGE_PAGES # define MEM_LARGE_PAGES 0x20000000 #endif #ifndef WC_NO_BEST_FIT_CHARS # define WC_NO_BEST_FIT_CHARS 0x400 #endif #ifndef IDC_HAND # define IDC_HAND MAKEINTRESOURCE(32649) #endif #ifndef BIF_NEWDIALOGSTYLE # define BIF_NEWDIALOGSTYLE 0x0040 #endif #ifndef TVITEM # define TVITEM TV_ITEM #endif #ifndef TVM_SETITEMHEIGHT # define TVM_SETITEMHEIGHT (TV_FIRST + 27) #endif #ifndef TVM_GETITEMHEIGHT # define TVM_GETITEMHEIGHT (TV_FIRST + 28) #endif #ifndef LVS_EX_LABELTIP # define LVS_EX_LABELTIP 0x00004000 #endif #ifndef EXEHEAD # ifndef SF_TEXT # define SF_TEXT 0x0001 # endif # ifndef SF_RTF # define SF_RTF 0x0002 # endif # ifndef SF_UNICODE # define SF_UNICODE 0x0010 # endif #endif #ifdef __GNUC__ # undef INVALID_FILE_ATTRIBUTES #endif #ifndef INVALID_FILE_ATTRIBUTES # define INVALID_FILE_ATTRIBUTES ((DWORD) -1) #endif // shell folders #ifdef _WIN32 # include #endif #ifndef CSIDL_FLAG_CREATE # define CSIDL_FLAG_CREATE 0x8000 #endif #ifndef CSIDL_PROGRAMS # define CSIDL_PROGRAMS 0x2 #endif #ifndef CSIDL_COMMON_PROGRAMS # define CSIDL_COMMON_PROGRAMS 0x17 #endif #ifndef CSIDL_PRINTERS # define CSIDL_PRINTERS 0x4 #endif #ifndef CSIDL_PERSONAL # define CSIDL_PERSONAL 0x5 #endif #ifndef CSIDL_COMMON_DOCUMENTS # define CSIDL_COMMON_DOCUMENTS 0x2E #endif #ifndef CSIDL_FAVORITES # define CSIDL_FAVORITES 0x6 #endif #ifndef CSIDL_COMMON_FAVORITES # define CSIDL_COMMON_FAVORITES 0x1F #endif #ifndef CSIDL_STARTUP # define CSIDL_STARTUP 0x7 #endif #ifndef CSIDL_COMMON_STARTUP # define CSIDL_COMMON_STARTUP 0x18 #endif #ifndef CSIDL_RECENT # define CSIDL_RECENT 0x8 #endif #ifndef CSIDL_SENDTO # define CSIDL_SENDTO 0x9 #endif #ifndef CSIDL_STARTMENU # define CSIDL_STARTMENU 0xB #endif #ifndef CSIDL_COMMON_STARTMENU # define CSIDL_COMMON_STARTMENU 0x16 #endif #ifndef CSIDL_DESKTOPDIRECTORY # define CSIDL_DESKTOPDIRECTORY 0x10 #endif #ifndef CSIDL_COMMON_DESKTOPDIRECTORY # define CSIDL_COMMON_DESKTOPDIRECTORY 0x19 #endif #ifndef CSIDL_NETHOOD # define CSIDL_NETHOOD 0x13 #endif #ifndef CSIDL_FONTS # define CSIDL_FONTS 0x14 #endif #ifndef CSIDL_TEMPLATES # define CSIDL_TEMPLATES 0x15 #endif #ifndef CSIDL_COMMON_TEMPLATES # define CSIDL_COMMON_TEMPLATES 0x2D #endif #ifndef CSIDL_APPDATA # define CSIDL_APPDATA 0x1A #endif #ifndef CSIDL_COMMON_APPDATA # define CSIDL_COMMON_APPDATA 0x23 #endif #ifndef CSIDL_LOCAL_APPDATA # define CSIDL_LOCAL_APPDATA 0x1C #endif #ifndef CSIDL_PRINTHOOD # define CSIDL_PRINTHOOD 0x1B #endif #ifndef CSIDL_ALTSTARTUP # define CSIDL_ALTSTARTUP 0x1D #endif #ifndef CSIDL_COMMON_ALTSTARTUP # define CSIDL_COMMON_ALTSTARTUP 0x1E #endif #ifndef CSIDL_INTERNET_CACHE # define CSIDL_INTERNET_CACHE 0x20 #endif #ifndef CSIDL_COOKIES # define CSIDL_COOKIES 0x21 #endif #ifndef CSIDL_HISTORY # define CSIDL_HISTORY 0x22 #endif #ifndef CSIDL_WINDOWS # define CSIDL_WINDOWS 0x24 #endif #ifndef CSIDL_SYSTEM # define CSIDL_SYSTEM 0x25 #endif #ifndef CSIDL_PROGRAM_FILES # define CSIDL_PROGRAM_FILES 0x26 #endif #ifndef CSIDL_PROGRAM_FILES_COMMON # define CSIDL_PROGRAM_FILES_COMMON 0x2B #endif #ifndef CSIDL_MYPICTURES # define CSIDL_MYPICTURES 0x27 #endif #ifndef CSIDL_COMMON_PICTURES # define CSIDL_COMMON_PICTURES 0x36 #endif #ifndef CSIDL_PROFILE # define CSIDL_PROFILE 0x28 #endif #ifndef CSIDL_ADMINTOOLS # define CSIDL_ADMINTOOLS 0x30 #endif #ifndef CSIDL_COMMON_ADMINTOOLS # define CSIDL_COMMON_ADMINTOOLS 0x2F #endif #ifndef CSIDL_MYMUSIC # define CSIDL_MYMUSIC 0xD #endif #ifndef CSIDL_COMMON_MUSIC # define CSIDL_COMMON_MUSIC 0x35 #endif #ifndef CSIDL_MYVIDEO # define CSIDL_MYVIDEO 0xE #endif #ifndef CSIDL_COMMON_VIDEO # define CSIDL_COMMON_VIDEO 0x37 #endif #ifndef CSIDL_RESOURCES # define CSIDL_RESOURCES 0x38 #endif #ifndef CSIDL_RESOURCES_LOCALIZED # define CSIDL_RESOURCES_LOCALIZED 0x39 #endif #ifndef CSIDL_CDBURN_AREA # define CSIDL_CDBURN_AREA 0x3B #endif #ifndef SHGFP_TYPE_CURRENT #define SHGFP_TYPE_CURRENT 0 #endif // other shell stuff #ifndef SHACF_FILESYSTEM # define SHACF_FILESYSTEM 1 #endif #ifndef SEE_MASK_NOCLOSEPROCESS #define SEE_MASK_NOCLOSEPROCESS 0x00000040 #define SEE_MASK_FLAG_NO_UI 0x00000400 #define SEE_MASK_FLAG_DDEWAIT 0x00000100 #endif // other stuff #ifndef CP_ACP # define CP_ACP 0 # define CP_OEMCP 1 #endif #ifndef CP_UTF8 # define CP_UTF8 65001 #endif #ifndef COLOR_BTNFACE # define COLOR_BTNFACE 15 #endif #ifndef COLOR_WINDOW # define COLOR_WINDOW 5 #endif #ifndef COLOR_HOTLIGHT # define COLOR_HOTLIGHT 26 #endif // resources #ifndef RT_CURSOR # define RT_CURSOR MAKEINTRESOURCE(1) # define RT_GROUP_CURSOR MAKEINTRESOURCE(1 + 11) #endif #ifndef RT_BITMAP # define RT_BITMAP MAKEINTRESOURCE(2) #endif #ifndef RT_ICON # define RT_ICON MAKEINTRESOURCE(3) #endif #ifndef RT_DIALOG # define RT_DIALOG MAKEINTRESOURCE(5) #endif #ifndef RT_GROUP_ICON # define RT_GROUP_ICON MAKEINTRESOURCE(3 + 11) #endif #ifndef RT_VERSION # define RT_VERSION MAKEINTRESOURCE(16) #endif // version #ifndef VS_FILE_INFO # define VS_FILE_INFO RT_VERSION #endif #ifndef VS_VERSION_INFO # define VS_VERSION_INFO 1 #endif #ifndef VS_FFI_SIGNATURE # define VS_FFI_SIGNATURE 0xFEEF04BD #endif // message box #ifndef MB_OK # define MB_OK 0 # define MB_OKCANCEL 1 # define MB_ABORTRETRYIGNORE 2 # define MB_YESNOCANCEL 3 # define MB_YESNO 4 # define MB_RETRYCANCEL 5 # define MB_DEFBUTTON1 0 # define MB_DEFBUTTON2 256 # define MB_DEFBUTTON3 512 # define MB_DEFBUTTON4 768 # define MB_ICONSTOP 16 # define MB_ICONQUESTION 32 # define MB_ICONEXCLAMATION 48 # define MB_ICONINFORMATION 64 # define MB_USERICON 128 # define MB_SETFOREGROUND 0x10000 # define MB_TOPMOST 0x40000 # define MB_RIGHT 0x80000 # define MB_RTLREADING 0x100000 #endif #ifndef IDOK # define IDOK 1 # define IDCANCEL 2 # define IDABORT 3 # define IDRETRY 4 # define IDIGNORE 5 # define IDYES 6 # define IDNO 7 #endif // window styles #ifndef _WIN32 # define WS_CHILD 0x40000000 # define WS_VISIBLE 0x10000000 # define BS_CHECKBOX 2 # define BS_LEFT 256 # define BS_LEFTTEXT 32 # define BS_RADIOBUTTON 4 # define BS_RIGHT 512 # define BS_USERBUTTON 8 # define ES_LEFT 0 # define ES_CENTER 1 # define ES_RIGHT 2 # define SS_BITMAP 14 # define SS_CENTER 1 # define SS_CENTERIMAGE 512 # define SS_ICON 3 # define SS_LEFT 0 # define SS_LEFTNOWORDWRAP 0xc # define SS_RIGHT 2 # define SS_RIGHTJUST 0x400 # define SS_USERITEM 10 # define SS_TYPEMASK 0x0000001FL # define DS_FIXEDSYS 8 # define DS_SETFONT 64 # define WS_EX_RIGHT 0x1000 # define WS_EX_RIGHTSCROLLBAR 0 # define WS_EX_RTLREADING 0x2000 # define WS_EX_LEFTSCROLLBAR 0x4000 # define WS_EX_LAYOUTRTL 0x00400000 # define TVS_RTLREADING 64 # define PBS_SMOOTH 1 #endif #ifndef SS_REALSIZECONTROL # define SS_REALSIZECONTROL 0x0040 #endif #ifndef DS_SHELLFONT # define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS) #endif // brush styles #ifndef BS_SOLID # define BS_SOLID 0 #endif #ifndef BS_NULL # define BS_NULL 1 #endif // reg #ifndef HKEY_CLASSES_ROOT # define HKEY_CLASSES_ROOT ((HKEY)0x80000000) # define HKEY_CURRENT_USER ((HKEY)0x80000001) # define HKEY_LOCAL_MACHINE ((HKEY)0x80000002) # define HKEY_USERS ((HKEY)0x80000003) # define HKEY_PERFORMANCE_DATA ((HKEY)0x80000004) # define HKEY_CURRENT_CONFIG ((HKEY)0x80000005) # define HKEY_DYN_DATA ((HKEY)0x80000006) #endif #ifndef KEY_WOW64_32KEY # define KEY_WOW64_32KEY 0x200 #endif #ifndef KEY_WOW64_64KEY # define KEY_WOW64_64KEY 0x100 #endif #ifndef REG_SZ # define REG_NONE 0 # define REG_SZ 1 # define REG_EXPAND_SZ 2 # define REG_BINARY 3 # define REG_DWORD 4 # define REG_MULTI_SZ 7 #endif // show modes #ifndef SW_SHOWNORMAL # define SW_HIDE 0 # define SW_SHOWNORMAL 1 # define SW_SHOWMINIMIZED 2 # define SW_SHOWMAXIMIZED 3 # define SW_SHOWNOACTIVATE 4 # define SW_SHOW 5 # define SW_SHOWMINNOACTIVE 7 # define SW_SHOWNA 8 # define SW_RESTORE 9 # define SW_SHOWDEFAULT 10 #endif // hotkeys #ifndef HOTKEYF_SHIFT # define HOTKEYF_SHIFT 1 # define HOTKEYF_CONTROL 2 # define HOTKEYF_ALT 4 # define HOTKEYF_EXT 8 #endif // vk #ifndef VK_F1 # define VK_F1 0x70 #endif // gdi #ifndef OPAQUE # define OPAQUE 2 #endif #ifndef TRANSPARENT # define TRANSPARENT 1 #endif #ifndef LF_FACESIZE # define LF_FACESIZE 32 #endif #ifndef FW_NORMAL # define FW_NORMAL 400 #endif #ifndef FW_BOLD # define FW_BOLD 700 #endif #ifndef DEFAULT_CHARSET # define DEFAULT_CHARSET 1 #endif #ifndef SHIFTJIS_CHARSET # define SHIFTJIS_CHARSET 128 #endif #ifndef OUT_DEFAULT_PRECIS # define OUT_DEFAULT_PRECIS 0 #endif #ifndef CLIP_DEFAULT_PRECIS # define CLIP_DEFAULT_PRECIS 0 #endif #ifndef DEFAULT_QUALITY # define DEFAULT_QUALITY 0 #endif #ifndef DEFAULT_PITCH # define DEFAULT_PITCH 0 #endif // file ops #ifndef FOF_SILENT # define FOF_SILENT 4 # define FOF_NOCONFIRMATION 16 # define FOF_FILESONLY 128 # define FOF_SIMPLEPROGRESS 256 # define FOF_NOCONFIRMMKDIR 512 #endif #ifndef FOF_NOERRORUI # define FOF_NOERRORUI 0x0400 #endif // file attribs #ifndef FILE_ATTRIBUTE_READONLY # define FILE_ATTRIBUTE_READONLY 0x00000001 # define FILE_ATTRIBUTE_HIDDEN 0x00000002 # define FILE_ATTRIBUTE_SYSTEM 0x00000004 # define FILE_ATTRIBUTE_ARCHIVE 0x00000020 # define FILE_ATTRIBUTE_NORMAL 0x00000080 # define FILE_ATTRIBUTE_TEMPORARY 0x00000100 # define FILE_ATTRIBUTE_OFFLINE 0x00001000 #endif #ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED # define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x002000 #endif // fopen #ifndef GENERIC_READ # define GENERIC_READ 0x80000000 # define GENERIC_WRITE 0x40000000 #endif #ifndef CREATE_NEW # define CREATE_NEW 1 # define CREATE_ALWAYS 2 # define OPEN_EXISTING 3 # define OPEN_ALWAYS 4 #endif // fseek #ifndef FILE_BEGIN # define FILE_BEGIN 0 # define FILE_CURRENT 1 # define FILE_END 2 #endif // PE #ifndef _WIN32 # define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 # ifndef __BIG_ENDIAN__ # define IMAGE_DOS_SIGNATURE 0x5A4D # define IMAGE_NT_SIGNATURE 0x00004550 # else # define IMAGE_DOS_SIGNATURE 0x4D5A # define IMAGE_NT_SIGNATURE 0x50450000 # endif # define IMAGE_FILE_DLL 8192 # define IMAGE_DIRECTORY_ENTRY_EXPORT 0 # define IMAGE_SIZEOF_SHORT_NAME 8 #endif #ifndef IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE #define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // ASLR #endif #ifndef IMAGE_DLLCHARACTERISTICS_NX_COMPAT #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // DEP #endif #ifndef IMAGE_DLLCHARACTERISTICS_NO_SEH #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 #endif #ifndef IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 #endif #ifndef IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA #define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020 // HEASLR #endif // structures #ifndef _WIN32 typedef struct _LOGFONT { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT; # pragma pack(2) typedef struct _IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp; WORD e_csum; WORD e_ip; WORD e_cs; WORD e_lfarlc; WORD e_ovno; WORD e_res[4]; WORD e_oemid; WORD e_oeminfo; WORD e_res2[10]; LONG e_lfanew; } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER; # pragma pack() # pragma pack(4) typedef struct _IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; typedef struct _IMAGE_OPTIONAL_HEADER32 { WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; DWORD BaseOfData; DWORD ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Reserved1; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; DWORD SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32; typedef struct _IMAGE_OPTIONAL_HEADER64 { WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; ULONGLONG ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; ULONGLONG SizeOfStackReserve; ULONGLONG SizeOfStackCommit; ULONGLONG SizeOfHeapReserve; ULONGLONG SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64; typedef struct _IMAGE_NT_HEADERS32 { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32; typedef struct _IMAGE_NT_HEADERS64 { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; } IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64; #ifdef _WIN64 typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER; typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER; typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER; typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER; typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif #ifndef __BIG_ENDIAN__ # define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b #else # define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x0b01 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x0b02 #endif typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; DWORD AddressOfNames; DWORD AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; typedef struct tagVS_FIXEDFILEINFO { DWORD dwSignature; DWORD dwStrucVersion; DWORD dwFileVersionMS; DWORD dwFileVersionLS; DWORD dwProductVersionMS; DWORD dwProductVersionLS; DWORD dwFileFlagsMask; DWORD dwFileFlags; DWORD dwFileOS; DWORD dwFileType; DWORD dwFileSubtype; DWORD dwFileDateMS; DWORD dwFileDateLS; } VS_FIXEDFILEINFO; # pragma pack() #endif // MinGW does not implement the unicode CRT startup functions #if (defined(_UNICODE) && defined(_WIN32)) && defined(__MINGW32__) # define NSIS_ENTRYPOINT_TMAIN \ int _tmain(int argc,WCHAR**argv); \ EXTERN_C int main(int ac,char**cav) { \ WCHAR**av=CommandLineToArgvW(GetCommandLineW(),&ac); \ if (!av) { \ _tprintf(_T("wmain: Error %u\n"),ac = GetLastError()); \ return ac; \ } \ ac = _tmain(ac,av); \ /*LEAK: LocalFree(av);*/ \ return ac; \ } # define NSIS_ENTRYPOINT_SIMPLEGUI \ int WINAPI _tWinMain(HINSTANCE hI,HINSTANCE hOld,LPTSTR cl,int sc); \ EXTERN_C int WINAPI WinMain(HINSTANCE hI,HINSTANCE hOld,char*cl,int sc) \ {return _tWinMain(hI,0,0,sc);} # ifdef __cplusplus # define NSIS_ENTRYPOINT_GUINOCRT \ EXTERN_C void NSISWinMainNOCRT(); \ int WINAPI WinMain(HINSTANCE hI,HINSTANCE hOld,char*cl,int sc) \ {NSISWinMainNOCRT();return 0;} # endif #endif #ifndef NSIS_ENTRYPOINT_TMAIN # define NSIS_ENTRYPOINT_TMAIN #endif #ifndef NSIS_ENTRYPOINT_SIMPLEGUI // _tWinMain with valid hInstance, calls ExitProcess # define NSIS_ENTRYPOINT_SIMPLEGUI #endif #ifndef NSIS_ENTRYPOINT_GUINOCRT # define NSIS_ENTRYPOINT_GUINOCRT #endif #if defined(__clang__) && defined(__cplusplus) && __cplusplus < 201103L # define NSIS_CXX_THROWSPEC(throwspec) throw(throwspec) // Use exception specifications to avoid operator new missing-exception-spec warning #else # define NSIS_CXX_THROWSPEC(ignoredthrowspec) // Ignore c++ exception specifications #endif #if defined(__cplusplus) && __cplusplus >= 201103L # define NSIS_CXX_NOEXCEPT() noexcept(true) #else # define NSIS_CXX_NOEXCEPT() throw() // Can't specialize __declspec(nothrow) because MSVC requires it before the function name #endif #if defined(_MSC_VER) && _MSC_VER <= 1200 # define NSIS_CXX_TYPENAME // VC6 can't handle typename in some places but GCC requires it #else # define NSIS_CXX_TYPENAME typename #endif #define BUGBUG64TRUNCATE(cast,xpr) ( (cast) (xpr) ) /* _tprintf on Windows/MSVCRT treats %s as TCHAR* and on POSIX %s is always char*! Always use our NPRI* (NsisPRInt*[Narrow|Wide]) defines in format strings when calling functions from tchar.h (Similar to the way works) Example: _tprintf(_T("%") NPRIs _T(" %") NPRIws _T("\n"), _T("Hello"), L"World"); */ #ifdef _WIN32 # define NPRIs _T("s") # define NPRIns _T("hs") # define NPRIws _T("ls") // ws also works, not sure which is most compatible # ifndef _WIN64 # define NPRIp _T(".8x") # define NPRIpN ".8x" # endif #else // !_WIN32 # define NPRIns _T("s") # define NPRIws _T("ls") # ifdef _UNICODE # define NPRIs _T("ls") # else // !_UNICODE # define NPRIs _T("s") # endif // ~_UNICODE #endif // ~_WIN32 #ifndef NPRIp # define NPRIp _T("p") # define NPRIpN "p" #endif // Disable deprecated warnings (Windows SDK for Windows 8.1) #ifdef _MSC_VER #if _MSC_VER >= 1500 FORCEINLINE DWORD NoDepr_GetVersion() { __pragma(warning(push))__pragma(warning(disable:4996)) DWORD r = GetVersion(); __pragma(warning(pop)) return r; } #define GetVersion NoDepr_GetVersion FORCEINLINE BOOL NoDepr_GetVersionExA(OSVERSIONINFOA*p) { __pragma(warning(push))__pragma(warning(disable:4996)) BOOL r = GetVersionExA(p); __pragma(warning(pop)) return r; } #define GetVersionExA NoDepr_GetVersionExA FORCEINLINE BOOL NoDepr_GetVersionExW(OSVERSIONINFOW*p) { __pragma(warning(push))__pragma(warning(disable:4996)) BOOL r = GetVersionExW(p); __pragma(warning(pop)) return r; } #define GetVersionExW NoDepr_GetVersionExW #endif //~ _MSC_VER >= 1500 #endif //~ _MSC_VER #ifdef __cplusplus namespace STL { template struct mapped_type { typedef typename M::value_type::second_type type; }; // VC6 uses referent_type and not mapped_type } #endif //~ __cplusplus #endif // EOF nsis-3.11/Source/Plugins.cpp000077500000000000000000000211041477201124000157760ustar00rootroot00000000000000/* * Plugins.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "exehead/config.h" #ifdef NSIS_CONFIG_PLUGIN_SUPPORT #include #include "tstring.h" #include #include "Plugins.h" #include "Platform.h" #include "util.h" #include "ResourceEditor.h" #include "dirreader.h" #ifdef _WIN32 # include #else # include #endif #include "boost/scoped_ptr.hpp" using namespace std; extern FILE *g_output; namespace { template bool contains(const C& cntnr, const K& key) { return cntnr.find(key) != cntnr.end(); } template const typename C::const_iterator get_iterator(const C& cntnr, const K& key) { const typename C::const_iterator it = cntnr.find(key); assert(cntnr.end() != it); return it; } template typename C::const_iterator::value_type get_value(const C& cntnr, const K& key) { return *get_iterator(cntnr,key); } template typename C::value_type::second_type get_paired_value(const C& cntnr, const K& key) { return get_iterator(cntnr,key)->second; } template V get_paired_value(const C& cntnr, const K& key, const V& defval) { typename C::const_iterator it = cntnr.find(key); return cntnr.end() == it ? defval : it->second; } } static tstring GetDllPath(const tstring&fullpath) { tstring::size_type platsep = fullpath.rfind(PLATFORM_PATH_SEPARATOR_STR); tstring::size_type unixsep = platsep; if (PLATFORM_PATH_SEPARATOR_C != _T('/')) unixsep = fullpath.rfind(_T("/")); // Ideally get_dir_name would do this for us tstring::size_type lastsep = platsep != string::npos && unixsep != string::npos ? STD_MAX(platsep, unixsep) : STD_MIN(platsep, unixsep); if (lastsep == string::npos) return _T(""); return fullpath.substr(0, lastsep); } static inline tstring GetDllName(const tstring&command) { return get_string_prefix(command, _T("::")); } static inline void PrintCommandSig(const tstring sig) { _ftprintf(g_output, _T(" + %") NPRIs _T("\n"), sig.c_str()); } void Plugins::AddPluginsDir(const tstring &path, bool pe64, bool displayInfo) { boost::scoped_ptr dr( new_dir_reader() ); dr->read(path); for (dir_reader::iterator files_itr = dr->files().begin(); files_itr != dr->files().end(); files_itr++) // note: files are listed alphabetically, so plugin.dll will be listed before pluginW.dll { if (!dir_reader::matches(*files_itr, _T("*.dll"))) continue; const tstring plugin = get_full_path(path + PLATFORM_PATH_SEPARATOR_C + *files_itr); GetExports(plugin, pe64, displayInfo); } } // VC6 cannot handle NSISException(const tstring& msg) : std::runtime_error(string(TtoCString(msg))) {} struct NSISExceptionInner : public std::runtime_error { NSISExceptionInner(const char* msg) : std::runtime_error(string(msg)) {} // Unicode NSISExceptionInner(const string&msg) : std::runtime_error(msg) {} // Ansi }; struct NSISException : public NSISExceptionInner { NSISException(const tstring& msg) : NSISExceptionInner(TtoCString(msg)) {} }; void Plugins::GetExports(const tstring &pathToDll, bool pe64, bool displayInfo) { PIMAGE_NT_HEADERS pNTHdrs; unsigned long dllsize; BYTE *dlldata = alloc_and_read_file(pathToDll.c_str(), dllsize); MANAGE_WITH(dlldata, free); try { if (!dllsize) return ; pNTHdrs = CResourceEditor::GetNTHeaders(&dlldata[0]); // This might throw } catch (std::runtime_error&) { return; } const WORD reqohm = pe64 ? IMAGE_NT_OPTIONAL_HDR64_MAGIC : IMAGE_NT_OPTIONAL_HDR32_MAGIC; if (*GetCommonMemberFromPEOptHdr(pNTHdrs->OptionalHeader, Magic) != reqohm) { // Ignore DLLs that don't match our target return; } tstring dllName = remove_file_extension(get_file_name(pathToDll)); if (DllHasDataHandle(dllName)) { m_dllname_conflicts.insert(dllName); } FIX_ENDIAN_INT16_INPLACE(pNTHdrs->FileHeader.Characteristics); if (pNTHdrs->FileHeader.Characteristics & IMAGE_FILE_DLL) { DWORD numrvaandsiz = *GetMemberFromPEOptHdr(pNTHdrs->OptionalHeader, NumberOfRvaAndSizes); FIX_ENDIAN_INT32_INPLACE(numrvaandsiz); if (numrvaandsiz <= IMAGE_DIRECTORY_ENTRY_EXPORT) return; const IMAGE_DATA_DIRECTORY *pExportDir; pExportDir = &(*GetMemberFromPEOptHdr(pNTHdrs->OptionalHeader, DataDirectory))[IMAGE_DIRECTORY_ENTRY_EXPORT]; const DWORD ExportDirVA = FIX_ENDIAN_INT32(pExportDir->VirtualAddress); const DWORD ExportDirSize = FIX_ENDIAN_INT32(pExportDir->Size); PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(pNTHdrs); const WORD num_sections = FIX_ENDIAN_INT16(pNTHdrs->FileHeader.NumberOfSections); for (DWORD i = 0; i < num_sections; i++) { DWORD va = FIX_ENDIAN_INT32(sections[i].VirtualAddress); if (va <= ExportDirVA && va + FIX_ENDIAN_INT32(sections[i].SizeOfRawData) >= ExportDirVA + ExportDirSize) { DWORD prd = FIX_ENDIAN_INT32(sections[i].PointerToRawData); PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(&dlldata[0] + prd + ExportDirVA - va); DWORD na = FIX_ENDIAN_INT32(exports->AddressOfNames); LPDWORD names = (LPDWORD)((ULONG_PTR)exports + na - ExportDirVA); for (DWORD j = 0; j < FIX_ENDIAN_INT32(exports->NumberOfNames); j++) { if (0 == j) m_dllname_to_path[dllName] = pathToDll; const string name = string((char*)exports + FIX_ENDIAN_INT32(names[j]) - ExportDirVA); const tstring canoniccmd = dllName + _T("::") + tstring(CtoTString(name)); if (displayInfo) { bool hadCmd = contains(m_commands, canoniccmd); if (!hadCmd) PrintCommandSig(canoniccmd); } m_commands.insert(canoniccmd); } break; } } } } int Plugins::GetDllDataHandle(bool uninst, const tstring& command) const { const tstring dllname = GetDllName(command); if (uninst) return get_paired_value(m_dllname_to_unst_datahandle, dllname, -1); else return get_paired_value(m_dllname_to_inst_datahandle, dllname, -1); } void Plugins::SetDllDataHandle(bool uninst, tstring&canoniccmd, int dataHandle) { const tstring dllname = GetDllName(canoniccmd); if (uninst) m_dllname_to_unst_datahandle[dllname] = dataHandle; else m_dllname_to_inst_datahandle[dllname] = dataHandle; } bool Plugins::DllHasDataHandle(const tstring& dllnamelowercase) const { int h = GetDllDataHandle(false, dllnamelowercase); if (-1 == h) h = GetDllDataHandle(true, dllnamelowercase); return -1 != h; } bool Plugins::Initialize(const TCHAR*arcsubdir, bool pe64, bool displayInfo) { if (m_initialized) return true; m_initialized = true; AddPluginsDir(tstring(arcsubdir), pe64, displayInfo); return true; } bool Plugins::FindDllPath(const tstring filename, tstring&dllPath) { tstring dllName = remove_file_extension(filename); if (!contains(m_dllname_to_path, dllName)) return false; dllPath = get_paired_value(m_dllname_to_path, dllName); return true; } bool Plugins::GetCommandInfo(const tstring&command, tstring&canoniccmd, tstring&dllPath) { const tstring dllname = GetDllName(command); dllPath = get_paired_value(m_dllname_to_path, dllname); canoniccmd = get_value(m_commands, command); return !contains(m_dllname_conflicts, dllname); } bool Plugins::IsPluginCommand(const tstring& token) const { return contains(m_commands, token); } bool Plugins::IsKnownPlugin(const tstring& token) const { const tstring dllname = GetDllName(token); return contains(m_dllname_to_path, dllname); } bool Plugins::IsPluginCallSyntax(const tstring& token) { const tstring dllname = GetDllName(token); return dllname.length() + 2 < token.length(); } struct PrintPluginDirsHelper { template static void print(const C&c, const char*indent = "") { std::/*unordered_*/set::type #ifdef _WIN32 , Plugins::strnocasecmp #endif > seen; for (NSIS_CXX_TYPENAME C::const_iterator it = c.begin(); it != c.end(); ++it) { const tstring path = GetDllPath(it->second); if (contains(seen, path)) continue; seen.insert(path); _ftprintf(g_output, _T("%") NPRIns _T("%") NPRIs _T("\n"), indent, path.c_str()); } } }; void Plugins::PrintPluginDirs() { _ftprintf(g_output, _T("Plugin directories:\n")); PrintPluginDirsHelper::print(m_dllname_to_path, " "); } #endif nsis-3.11/Source/Plugins.h000077500000000000000000000046401477201124000154510ustar00rootroot00000000000000/* * Plugins.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * */ #ifndef NSIS_EXEHEADPLUGINS_H #define NSIS_EXEHEADPLUGINS_H #include #include #include "tstring.h" namespace STL { template struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; template struct string_nocasecmpless : binary_function { struct cmp : public binary_function { bool operator() (const C&a, const C&b) const { return tolower(a) < tolower(b); } }; bool operator() (const S&a,const S&b) const { return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), cmp()); } }; } class Plugins { public: typedef STL::string_nocasecmpless strnocasecmp; Plugins() : m_initialized(false) {} bool Initialize(const TCHAR*arcsubdir, bool pe64, bool displayInfo); void AddPluginsDir(const tstring& path, bool pe64, bool displayInfo); bool FindDllPath(const tstring filename, tstring&dllPath); bool IsPluginCommand(const tstring& command) const; bool IsKnownPlugin(const tstring& token) const; bool GetCommandInfo(const tstring&command, tstring&canoniccmd, tstring&dllPath); int GetDllDataHandle(bool uninst, const tstring& command) const; void SetDllDataHandle(bool uninst, tstring&canoniccmd, int dataHandle); static bool IsPluginCallSyntax(const tstring& token); void PrintPluginDirs(); private: // methods void GetExports(const tstring &pathToDll, bool pe64, bool displayInfo); bool DllHasDataHandle(const tstring& dllnamelowercase) const; private: // data members std::set m_commands; std::map m_dllname_to_path; std::map m_dllname_to_inst_datahandle; std::map m_dllname_to_unst_datahandle; std::set m_dllname_conflicts; bool m_initialized; }; #endif nsis-3.11/Source/ResourceEditor.cpp000077500000000000000000001706461477201124000173330ustar00rootroot00000000000000/* * ResourceEditor.cpp * * This file is a part of NSIS. * * Copyright (C) 2002-2025 Amir Szekely * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/21/2007 */ #include "ResourceEditor.h" #include "util.h" #include "winchar.h" #include #include #include "tchar.h" #include "utf.h" #include "BinInterop.h" using namespace std; ////////////////////////////////////////////////////////////////////// // Utilities ////////////////////////////////////////////////////////////////////// #define FIRSTRESDIRSTRADDRESS ( (WINWCHAR*)(~(size_t)0) ) #define WCHARPTR2WINWCHARPTR(s) ( (WINWCHAR*) (s) ) // Only for WinSDK structs like IMAGE_RESOURCE_DIR_STRING_U where we cannot change the WCHAR type! #define RALIGN(dwToAlign, dwAlignOn) ((dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn) #define ALIGN(dwToAlign, dwAlignOn) dwToAlign = RALIGN((dwToAlign), (dwAlignOn)) static inline DWORD ConvertEndianness(DWORD d) { return FIX_ENDIAN_INT32(d); } static inline WORD ConvertEndianness(WORD w) { return FIX_ENDIAN_INT16(w); } #if !(defined(_WIN32) && defined(_UNICODE)) static void FreeUnicodeResString(WINWCHAR* s) { if (!IS_INTRESOURCE(s) && FIRSTRESDIRSTRADDRESS != (WINWCHAR*) s) free(s); } static WINWCHAR* ResStringToUnicode(const TCHAR *s) { if (IS_INTRESOURCE(s)) return MAKEINTRESOURCEWINW((ULONG_PTR)s); if (FIRSTRESDIRSTRADDRESS == (WINWCHAR*) s) return (WINWCHAR*) s; WINWCHAR *ws = WinWStrDupFromTChar(s); if (!ws) throw std::runtime_error("Unicode conversion failed"); return ws; } #endif //~ !(_WIN32 && _UNICODE) struct UTF16LEResString { WINWCHAR *m_s; operator WINWCHAR*() const { return m_s; } #if defined(_WIN32) && defined(_UNICODE) UTF16LEResString(const TCHAR*tstr) : m_s((WINWCHAR*) tstr) {} #else UTF16LEResString(const TCHAR*tstr) : m_s(ResStringToUnicode(tstr)) { } ~UTF16LEResString() { FreeUnicodeResString(m_s); } #endif }; PIMAGE_NT_HEADERS CResourceEditor::GetNTHeaders(BYTE* pbPE) { // Get dos header PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER) pbPE; if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) throw runtime_error("PE file contains invalid DOS header"); // Get NT headers PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(pbPE + ConvertEndianness((DWORD)dosHeader->e_lfanew)); if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) throw runtime_error("PE file missing NT signature"); // Make sure this is a supported PE format const WORD ohm = *GetCommonMemberFromPEOptHdr(ntHeaders->OptionalHeader, Magic); if (ohm != IMAGE_NT_OPTIONAL_HDR32_MAGIC && ohm != IMAGE_NT_OPTIONAL_HDR64_MAGIC) throw runtime_error("Unsupported PE format"); return ntHeaders; } PRESOURCE_DIRECTORY CResourceEditor::GetResourceDirectory( BYTE* pbPE, DWORD dwSize, PIMAGE_NT_HEADERS ntHeaders, DWORD *pdwResSecVA /*=NULL*/, DWORD *pdwSectionIndex /*=NULL*/ ) { PIMAGE_DATA_DIRECTORY dataDirectory = *GetMemberFromPEOptHdr(ntHeaders->OptionalHeader, DataDirectory); DWORD dwNumberOfRvaAndSizes = *GetMemberFromPEOptHdr(ntHeaders->OptionalHeader, NumberOfRvaAndSizes); if (ConvertEndianness(dwNumberOfRvaAndSizes) <= IMAGE_DIRECTORY_ENTRY_RESOURCE) throw runtime_error("No resource section found"); // Get resource section virtual address DWORD dwResSecVA = ConvertEndianness(dataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress); // Pointer to the sections headers array PIMAGE_SECTION_HEADER sectionHeadersArray = IMAGE_FIRST_SECTION(ntHeaders); DWORD dwSectionIndex = (DWORD) -1; // Find resource section index in the array for (int i = 0; i < ConvertEndianness(ntHeaders->FileHeader.NumberOfSections); i++) { if (dwResSecVA == ConvertEndianness(sectionHeadersArray[i].VirtualAddress)) { // Remember resource section index dwSectionIndex = i; // Check for invalid resource section pointer if (!sectionHeadersArray[i].PointerToRawData) throw runtime_error("Invalid resource section pointer"); break; } // Invalid section pointer (goes beyond the PE image) if (ConvertEndianness(sectionHeadersArray[i].PointerToRawData) > dwSize) throw runtime_error("Invalid section pointer"); } // No resource section... if (dwSectionIndex == (DWORD) -1) throw runtime_error("PE file doesn't contain any resource section"); // Return extra parameters if (pdwSectionIndex) *pdwSectionIndex = dwSectionIndex; if (pdwResSecVA) *pdwResSecVA = dwResSecVA; // Pointer to section data, the first resource directory DWORD dwResSecPtr = ConvertEndianness(sectionHeadersArray[dwSectionIndex].PointerToRawData); return PRESOURCE_DIRECTORY(pbPE + dwResSecPtr); } static int ParseSimpleInt(const TCHAR*parse, int*success) { int base = 0, num; TCHAR *end; if (parse[0] == _T('0') && (parse[1] >= _T('0') && parse[1] <= _T('9'))) base = 10; // Avoid evil octal num = (int)_tcstoul(parse, &end, base); if (success) *success = !(int)(*end); return num; } const TCHAR* CResourceEditor::ParseResourceTypeString(const TCHAR*Str) { if (Str[0] == _T('#')) // Special character used by KERNEL32!FindResource { ++Str; if (!_tcsicmp(Str, _T("Bitmap"))) return (TCHAR*) RT_BITMAP; if (!_tcsicmp(Str, _T("IconImage"))) return (TCHAR*) RT_ICON; if (!_tcsicmp(Str, _T("Icon"))) return (TCHAR*) RT_GROUP_ICON; if (!_tcsicmp(Str, _T("CursorImage"))) return (TCHAR*) RT_CURSOR; if (!_tcsicmp(Str, _T("Cursor"))) return (TCHAR*) RT_GROUP_CURSOR; if (!_tcsicmp(Str, _T("Dialog"))) return (TCHAR*) RT_DIALOG; if (!_tcsicmp(Str, _T("Menu"))) return (TCHAR*) MAKEINTRESOURCE(4); if (!_tcsicmp(Str, _T("Version"))) return (TCHAR*) RT_VERSION; if (!_tcsicmp(Str, _T("HTML"))) return (TCHAR*) MAKEINTRESOURCE(23); if (!_tcsicmp(Str, _T("Manifest"))) return (TCHAR*) MAKEINTRESOURCE(24); int succ, num = ParseSimpleInt(Str, &succ); return succ && IS_INTRESOURCE(num) ? (TCHAR*) MAKEINTRESOURCE(num) : NULL; } return *Str ? Str : NULL; } #include "exehead/resource.h" // IDI_ICON2 #include "exehead/config.h" // NSIS_DEFAULT_LANG const TCHAR* CResourceEditor::ParseResourceNameString(const TCHAR*Str, bool AllowFirst) { if (Str[0] == _T('#')) { ++Str; if (!_tcsicmp(Str, _T("Version"))) return (TCHAR*) MAKEINTRESOURCE(1); if (!_tcsicmp(Str, _T("Icon"))) return (TCHAR*) MAKEINTRESOURCE(IDI_ICON2); if (AllowFirst && Str[0] == '?' && !Str[1]) return (TCHAR*) FIRSTRESDIRSTRADDRESS; int succ, num = ParseSimpleInt(Str, &succ); return succ && IS_INTRESOURCE(num) ? (TCHAR*) MAKEINTRESOURCE(num) : NULL; } return EditorSupportsStringNames() && *Str ? Str : NULL; } LANGID CResourceEditor::ParseResourceLangString(const TCHAR*Str) { if (!_tcsicmp(Str, _T("Any"))) return ANYLANGID; if (!_tcsicmp(Str, _T("All"))) return ALLLANGID; if (!_tcsicmp(Str, _T("Neutral"))) return 0x0000; //MAKELANGID(0, 0); if (!_tcsicmp(Str, _T("Default"))) return NSIS_DEFAULT_LANG; int succ, num = ParseSimpleInt(Str, &succ); return succ ? num : INVALIDLANGID; } LANGID CResourceEditor::ParseResourceTypeNameLangString(const TCHAR**Type, const TCHAR**Name, const TCHAR*Lang, bool AllowFirst) { if (!(*Type = ParseResourceTypeString(*Type))) return INVALIDLANGID; if (!(*Name = ParseResourceNameString(*Name, AllowFirst))) return INVALIDLANGID; return ParseResourceLangString(Lang); } UINT CResourceEditor::IsResProtocol(const TCHAR*Url) { if ('r' == S7ChLwr(Url[0]) && 'e' == S7ChLwr(Url[1]) && 's' == S7ChLwr(Url[2])) if (':' == Url[3] && '/' == Url[4] && '/' == Url[5]) return 6; return 0; } static TCHAR* ParseResProtocolAlloc(const TCHAR*Url, const TCHAR*&Type, const TCHAR*&Name, LANGID&Lang) { //msdn.microsoft.com/library/aa767740#res Protocol TCHAR *path = 0, *buf = 0, *pD, ch; UINT prefix, mswin = Platform_IsWindows(), bad = false, pipe = 0, skip = 0; size_t typestart = 0, namestart = 0, i, cch; if (!(prefix = CResourceEditor::IsResProtocol(Url))) return path; for (Url += prefix, i = 0; Url[i]; ++i) if (Url[i] == '/') typestart = namestart, namestart = i; const TCHAR*pS = Url; if (namestart > 2 && (buf = (TCHAR*) malloc((cch = ++i) * sizeof(*Url)))) { if (pS[0] == '/') ++pS; ch = S7ChLwr(pS[0]); if (ch >= 'a' && ch <= 'z' && (pS[1] == ':' || pS[1] == '|') && IsAgnosticPathSeparator(pS[2])) { // IEBlog:"File URIs in Windows" says %3A is not a drive delimiter. if (Url[0] == '/') ++skip; // "res:///C:/.." => "res://C:/.." (Even on POSIX so that our FOPEN can do "c:/.." => "/c/..") pipe = (UINT)(size_t) ((pS + 1) - (Url + skip)); } typestart -= skip, namestart -= skip; const TCHAR *rt = buf + typestart + 1, *rn = buf + namestart + 1, *rl = _T("Any"); my_strncpy(buf, Url + skip, cch); buf[typestart] = buf[namestart] = '\0'; // Note: Type and Name are not decoded. if (pipe) buf[pipe] = ':'; // "res://C|/.." => "res://C:/.." (The | replacement is technically a file:// legacy feature but we support it for res:// as well) for (pD = buf, pS = pD;; ++pS, ++pD) { if ((ch = *pS) == '%') { // Deal with percent-encoding if (*++pS != '%') { TCHAR hex[3] = { pS[0], pS[0] ? pS[1] : _T('\0'), _T('\0') }; ch = ChIsHex(pS[0]) && ChIsHex(pS[1]) ? (TCHAR) _tcstol(hex, 0, 16) : 0; if (ch) ++pS; else ++bad; } } if (!(*pD = (mswin && ch == '/') ? '\\' : ch)) break; // Convert path if needed and stop at the end. } Lang = CResourceEditor::ParseResourceTypeNameLangString(&rt, &rn, rl, true); if (!bad && Lang != CResourceEditor::INVALIDLANGID) path = buf, Type = rt, Name = rn; } if (!path) free(buf); return path; } template static WORD GetDependentType(T Type) { if (!IS_INTRESOURCE((size_t) Type)) return 0; if (MAKEINTRESOURCE((size_t) Type) == RT_GROUP_ICON) return (WORD)(size_t) RT_ICON; if (MAKEINTRESOURCE((size_t) Type) == RT_GROUP_CURSOR) return (WORD)(size_t) RT_CURSOR; return 0; } template static WORD IsIcoCurSingleImageType(T Type) { WORD t = IS_INTRESOURCE((size_t) Type) ? (WORD)(size_t) Type : 0; return t == (WORD)(size_t) RT_ICON || t == (WORD)(size_t) RT_CURSOR; } template static WORD IsIcoCurGroupType(T Type) { return IsIcoCurSingleImageType(GetDependentType(Type)); } template static WORD IsIcoCurType(T Type) { return IsIcoCurSingleImageType(Type) || IsIcoCurGroupType(Type); } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // CResourceEditor ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CResourceEditor::CResourceEditor(void* pbPE, int iSize, bool bKeepData /*=true*/) { // Copy the data pointer m_pbPE = (BYTE*) pbPE; m_iSize = iSize; m_bKeepData = bKeepData; assert(!EditorSupportsStringNames()); assert(!EditorSupportsCursorPng()); // Get NT headers m_ntHeaders = GetNTHeaders(m_pbPE); // No check sum support yet... DWORD* pdwCheckSum = GetCommonMemberFromPEOptHdr(m_ntHeaders->OptionalHeader, CheckSum); if (*pdwCheckSum) { // clear checksum (should be [re]calculated after all changes done) pdwCheckSum = 0; //throw runtime_error("CResourceEditor doesn't yet support check sum"); } // Get resource section virtual address, resource section index and pointer to resource directory PRESOURCE_DIRECTORY rdRoot = GetResourceDirectory(m_pbPE, iSize, m_ntHeaders, &m_dwResourceSectionVA, &m_dwResourceSectionIndex); // Scan the resource directory m_cResDir = ScanDirectory(rdRoot, rdRoot); } CResourceEditor::~CResourceEditor() { delete m_cResDir; } ////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////// bool CResourceEditor::CanOpen(const void*Data, size_t Size) { return 'P' == GetExeType(Data, Size); // We only understand PE, not NE/LE } CResourceDataEntry* CResourceEditor::FindResourceW(const WINWCHAR*RT, const WINWCHAR*RN, LANGID RL, CResourceDirectoryEntry**ppTE, CResourceDirectoryEntry**ppNE, CResourceDirectoryEntry**ppLE) const { int i = m_cResDir->Find(RT); CResourceDirectoryEntry*pTDE = -1 != i ? m_cResDir->GetEntry(i) : 0, *pNDE, *pLDE; if (pTDE) { CResourceDirectory *pND = pTDE->GetSubDirectory(); i = FIRSTRESDIRSTRADDRESS == RN ? 0 : pND->Find(RN); if ((pNDE = (-1 != i) ? pND->GetEntry(i) : 0)) { CResourceDirectory *pLD = pNDE->GetSubDirectory(); i = ANYLANGID == RL ? 0 : pLD->Find(RL); if ((pLDE = (-1 != i) ? pLD->GetEntry(i) : 0)) { if (ppTE) *ppTE = pTDE; if (ppNE) *ppNE = pNDE; if (ppLE) *ppLE = pLDE; return pLDE->GetDataEntry(); } } } return 0; } CResourceDataEntry* CResourceEditor::FindResourceT(const TCHAR*RT, const TCHAR*RN, LANGID RL, CResourceDirectoryEntry**ppTE, CResourceDirectoryEntry**ppNE, CResourceDirectoryEntry**ppLE) const { return FindResourceW(UTF16LEResString(RT), UTF16LEResString(RN), RL, ppTE, ppNE, ppLE); } CResourceDirectoryEntry* CResourceEditor::FindResourceLanguageDirEntryW(const WINWCHAR* RT, const WINWCHAR* RN, LANGID RL) const { CResourceDirectoryEntry*pLDE = 0; FindResourceW(RT, RN, RL, 0, 0, &pLDE); return pLDE; } CResourceDataEntry* CResourceEditor::FindResource(const WINWCHAR* RT, const WINWCHAR* RN, LANGID RL) const { CResourceDirectoryEntry*pDE = FindResourceLanguageDirEntryW(RT, RN, RL); return pDE ? pDE->GetDataEntry() : 0; } template static void UpdateManipulationType(CResourceEditor::TYPEMANIPULATION &Manip, const T* szType, const void*Data, size_t Size) { WORD dependenttype = GetDependentType(szType); if (Manip == CResourceEditor::TM_AUTO) if (IsIcoCurSingleImageType(dependenttype) && IsICOCURFile(Data, Size)) Manip = CResourceEditor::TM_ICONFILE; } // Adds/Replaces/Removes a simple resource. // If lpData is 0 UpdateResource removes the resource. bool CResourceEditor::UpdateResourceW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize, TYPEMANIPULATION Manip) { CResourceDirectory* nameDir = 0; CResourceDirectory* langDir = 0; CResourceDataEntry* data = 0; IMAGE_RESOURCE_DIRECTORY rd = {0, /*time(0),*/}; int iTypeIdx = -1, iNameIdx = -1, iLangIdx = -1; iTypeIdx = m_cResDir->Find(szType); if (iTypeIdx > -1) { nameDir = m_cResDir->GetEntry(iTypeIdx)->GetSubDirectory(); iNameIdx = nameDir->Find(szName); if (iNameIdx > -1) { langDir = nameDir->GetEntry(iNameIdx)->GetSubDirectory(); iLangIdx = langDir->Find(wLanguage); if (iLangIdx > -1) { data = langDir->GetEntry(iLangIdx)->GetDataEntry(); } } } bool deleteoperation = !lpData, success = true, handlecomplexicon = false; UpdateManipulationType(Manip, szType, lpData, dwSize); WORD dependenttype = GetDependentType(szType); if (dependenttype && Manip != TM_RAW) { if (Manip == TM_AUTO && IsIcoCurSingleImageType(dependenttype)) Manip = TM_ICON; // A non-TM_ICONFILE operation that is probably going to fail if (Manip & TM_ICON) handlecomplexicon = true; // Group and images if (handlecomplexicon && !deleteoperation) if (Manip == TM_AUTO || (Manip & TM_ICONRSRC)) return false; // It is impossible to add a icon from a resource-based plain data buffer because it doesn't use offsets for the images if ((size_t) szType == (size_t) RT_GROUP_ICON && (size_t) szName == (size_t) IDI_ICON2) return false; // The main icon is special, don't allow high-level RT_GROUP_ICON updates to touch RT_ICON. } if (lpData && Manip == TM_AUTO && (size_t) szType == (size_t) RT_BITMAP) { if (IsBMPFile(lpData, dwSize)) { lpData += 14, dwSize -= 14; // Remove BITMAPFILEHEADER (blogs.msdn.microsoft.com/oldnewthing/20091211-00/?p=15693#) Manip = TM_RAW; } } if (!deleteoperation) { // Replace/Add the resource if (handlecomplexicon) { if (data) DeleteIconImagesW(szType, szName, wLanguage); // Delete the RT_ICONs that belong to the RT_GROUP_ICON we are replacing return AddExtraIconFromFile(szType, szName, wLanguage, lpData, dwSize); // Add RT_GROUP_ICON and RT_ICONs } if (data) { data->SetData(lpData, dwSize); return true; } if (!nameDir) { // Type doesn't yet exist nameDir = new CResourceDirectory(&rd); CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry(szType, nameDir); if (!m_cResDir->AddEntry(pRDE)) delete pRDE; } if (!langDir) { // Name doesn't yet exist langDir = new CResourceDirectory(&rd); CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry(szName, langDir); if (!nameDir->AddEntry(pRDE)) delete pRDE; } if (!data) { // Language doesn't yet exist, hence data neither data = new CResourceDataEntry(lpData, dwSize); CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry(MAKEINTRESOURCEWINW(wLanguage), data); if (!langDir->AddEntry(pRDE)) delete pRDE; } } else if (data) { if (handlecomplexicon) { success = DeleteIconImagesW(szType, szName, wLanguage); // Delete the RT_ICONs that belong to the RT_GROUP_ICON we are deleting } // Delete the resource delete data; langDir->RemoveEntry(iLangIdx); // Delete directories holding the resource if empty if (!langDir->CountEntries()) { delete langDir; nameDir->RemoveEntry(iNameIdx); if (!nameDir->CountEntries()) { delete nameDir; m_cResDir->RemoveEntry(iTypeIdx); } } } else success = false; return success; } CResourceDirectoryEntry* CResourceEditor::FindResourceLanguageDirEntryT(const TCHAR* RT, const TCHAR* RN, LANGID RL) const { assert(!EditorSupportsStringNames() && sizeof(RN)); #if defined(_WIN32) && defined(_UNICODE) return FindResourceLanguageDirEntryW((WINWCHAR*)RT, (WINWCHAR*)RN, RL); #else WINWCHAR* szwType = ResStringToUnicode(RT); CResourceDirectoryEntry* result = FindResourceLanguageDirEntryW(szwType, (WINWCHAR*)RN, RL); FreeUnicodeResString(szwType); return result; #endif } bool CResourceEditor::UpdateResourceT(const TCHAR* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize, TYPEMANIPULATION Manip) { assert(!EditorSupportsStringNames() && sizeof(szName)); #if defined(_WIN32) && defined(_UNICODE) return UpdateResourceW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage, lpData, dwSize, Manip); #else WINWCHAR* szwType = ResStringToUnicode(szType); bool result = UpdateResourceW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage, lpData, dwSize, Manip); FreeUnicodeResString(szwType); return result; #endif } bool CResourceEditor::UpdateResourceT(const TCHAR* szType, WORD szName, LANGID wLanguage, FILE*Data, TYPEMANIPULATION Manip) { assert(!EditorSupportsStringNames() && sizeof(szName)); bool result = false; unsigned long size; BYTE *data = alloc_and_read_file(Data, size); if (!data) return false; result = UpdateResourceT(szType, szName, wLanguage, data, size, Manip); free(data); return result; } bool CResourceEditor::DeleteResourceT(const TCHAR* szType, WORD szName, LANGID wLanguage, TYPEMANIPULATION Manip) { if (wLanguage != ALLLANGID) return UpdateResourceT(szType, szName, wLanguage, 0, 0, Manip); assert(!EditorSupportsStringNames() && sizeof(szName)); const TCHAR *name = (const TCHAR*) MAKEINTRESOURCE(szName); unsigned int deleted = 0; for (;; ++deleted) { CResourceDirectoryEntry*pDir = FindResourceLanguageDirEntryT(szType, name, ANYLANGID); if (!pDir || !UpdateResourceT(szType, szName, pDir->GetId(), 0, 0, Manip)) break; } return deleted != 0; } // Returns a copy of the requested resource // Returns 0 if the requested resource can't be found BYTE* CResourceEditor::GetResourceW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage) { CResourceDataEntry* data = FindResource(szType, szName, wLanguage); return DupData(data); } BYTE* CResourceEditor::GetResourceT(const TCHAR* szType, WORD szName, LANGID wLanguage) { assert(!EditorSupportsStringNames() && sizeof(szName)); #if defined(_WIN32) && defined(_UNICODE) return GetResourceW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage); #else WINWCHAR* szwType = ResStringToUnicode(szType); BYTE* result = GetResourceW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage); FreeUnicodeResString(szwType); return result; #endif } // Returns the size of the requested resource // Returns -1 if the requested resource can't be found int CResourceEditor::GetResourceSizeW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage) { CResourceDataEntry* data = FindResource(szType, szName, wLanguage); return data ? data->GetSize() : -1; } int CResourceEditor::GetResourceSizeT(const TCHAR* szType, WORD szName, LANGID wLanguage) { assert(!EditorSupportsStringNames()); #if defined(_WIN32) && defined(_UNICODE) return GetResourceSizeW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage); #else WINWCHAR* szwType = ResStringToUnicode(szType); int result = GetResourceSizeW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage); FreeUnicodeResString(szwType); return result; #endif } bool CResourceEditor::ResourceExistsT(const TCHAR* szType, WORD szName, LANGID wLanguage, LANGID*pFoundLanguage) { assert(!EditorSupportsStringNames() && sizeof(szName)); const TCHAR *name = (const TCHAR*) MAKEINTRESOURCE(szName); if (wLanguage == ALLLANGID) wLanguage = ANYLANGID; CResourceDirectoryEntry *pRDE = FindResourceLanguageDirEntryT(szType, name, wLanguage); if (pFoundLanguage) *pFoundLanguage = pRDE ? pRDE->GetId() : INVALIDLANGID; return pRDE != 0; } // Returns the offset of the requested resource in the original PE // Returns -1 if the requested resource can't be found DWORD CResourceEditor::GetResourceOffsetW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage) { CResourceDataEntry* data = FindResource(szType, szName, wLanguage); return data ? data->GetOffset() : DWORD(-1); } DWORD CResourceEditor::GetResourceOffsetT(const TCHAR* szType, WORD szName, LANGID wLanguage) { assert(!EditorSupportsStringNames() && sizeof(szName)); #if defined(_WIN32) && defined(_UNICODE) return GetResourceOffsetW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage); #else WINWCHAR* szwType = ResStringToUnicode(szType); DWORD result = GetResourceOffsetW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage); FreeUnicodeResString(szwType); return result; #endif } // Returns a copy of the resource data from the first resource of a specific type BYTE* CResourceEditor::GetFirstResourceW(const WINWCHAR* szType, size_t&cbData) { CResourceDataEntry *pDE = FindResource(szType, FIRSTRESDIRSTRADDRESS, ANYLANGID); if (pDE) { cbData = pDE->GetSize(); return DupData(pDE); } return NULL; } BYTE* CResourceEditor::GetFirstResourceT(const TCHAR* szType, size_t&cbData) { #if defined(_WIN32) && defined(_UNICODE) return GetFirstResourceW((WINWCHAR*)szType, cbData); #else WINWCHAR* szwType = ResStringToUnicode(szType); BYTE* result = GetFirstResourceW(szwType, cbData); FreeUnicodeResString(szwType); return result; #endif } BYTE* CResourceEditor::DupData(CResourceDataEntry*pDE) { if (!m_bKeepData) throw runtime_error("Can't get resource data when bKeepData is false"); if (pDE) { size_t cb = pDE->GetSize(); BYTE* p = new BYTE[cb]; // Free with FreeResource() if (p) CopyMemory(p, pDE->GetData(), cb); return p; } return NULL; } void CResourceEditor::FreeResource(BYTE* pbResource) { if (pbResource) delete [] pbResource; } // Saves the edited PE into a buffer and returns it. DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) { if (!m_bKeepData) throw runtime_error("Can't Save() when bKeepData is false"); unsigned int i; DWORD dwReqSize, temp32; temp32 = *GetCommonMemberFromPEOptHdr(m_ntHeaders->OptionalHeader, FileAlignment); const DWORD dwFileAlign = ConvertEndianness(temp32); temp32 = *GetCommonMemberFromPEOptHdr(m_ntHeaders->OptionalHeader, SectionAlignment); const DWORD dwSecAlign = ConvertEndianness(temp32); DWORD dwRsrcSize = m_cResDir->GetSize(); // Size of new resource section DWORD dwRsrcSizeAligned = RALIGN(dwRsrcSize, dwFileAlign); // Align it to FileAlignment // Calculate the total new PE size DWORD dwOldRsrcSize = ConvertEndianness(IMAGE_FIRST_SECTION(m_ntHeaders)[m_dwResourceSectionIndex].SizeOfRawData); dwReqSize = m_iSize - dwOldRsrcSize + dwRsrcSizeAligned; if (!pbBuf || dwSize < dwReqSize) return dwReqSize; // Use buffer BYTE* pbNewPE = pbBuf; dwSize = dwReqSize; // Fill buffer with zeros ZeroMemory(pbNewPE, dwSize); BYTE* seeker = pbNewPE; BYTE* oldSeeker = m_pbPE; PIMAGE_SECTION_HEADER old_sectionHeadersArray = IMAGE_FIRST_SECTION(m_ntHeaders); DWORD dwHeaderSize = ConvertEndianness(old_sectionHeadersArray[m_dwResourceSectionIndex].PointerToRawData); WORD wNumberOfSections = ConvertEndianness(m_ntHeaders->FileHeader.NumberOfSections); // Copy everything until the resource section (including headers and everything that might come after them) // We don't use SizeOfHeaders because sometimes (using VC6) it can extend beyond the first section // or (Borland) there could be some more information between the headers and the first section. CopyMemory(seeker, oldSeeker, dwHeaderSize); // Skip the headers and whatever comes after them seeker += dwHeaderSize; oldSeeker += dwHeaderSize; // Get new nt headers pointer PIMAGE_NT_HEADERS ntHeaders = GetNTHeaders(pbNewPE); // Get a pointer to the new section headers PIMAGE_SECTION_HEADER sectionHeadersArray = IMAGE_FIRST_SECTION(ntHeaders); // Skip the resource section in the old PE seeker. oldSeeker += dwOldRsrcSize; // Save the old virtual size of the resource section DWORD dwNewVirtualSize = RALIGN(dwRsrcSize, dwSecAlign); DWORD dwOldVirtualSize = ConvertEndianness(sectionHeadersArray[m_dwResourceSectionIndex].Misc.VirtualSize); ALIGN(dwOldVirtualSize, dwSecAlign); DWORD dwVAAdjustment = dwNewVirtualSize - dwOldVirtualSize; // Set the new size of the resource section (size aligned to FileAlignment) sectionHeadersArray[m_dwResourceSectionIndex].SizeOfRawData = ConvertEndianness(dwRsrcSizeAligned); // Set the virtual size as well (in memory) sectionHeadersArray[m_dwResourceSectionIndex].Misc.VirtualSize = ConvertEndianness(dwRsrcSize); (*GetMemberFromPEOptHdr(ntHeaders->OptionalHeader, DataDirectory))[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = ConvertEndianness(dwRsrcSize); // Set the new virtual size of the image DWORD* pdwSizeOfImage = GetCommonMemberFromPEOptHdr(ntHeaders->OptionalHeader, SizeOfImage); *pdwSizeOfImage = AlignVA(*GetCommonMemberFromPEOptHdr(ntHeaders->OptionalHeader, SizeOfHeaders)); for (i = 0; i < wNumberOfSections; i++) { DWORD dwSecSize = ConvertEndianness(sectionHeadersArray[i].Misc.VirtualSize); *pdwSizeOfImage = AlignVA(AdjustVA(*pdwSizeOfImage, dwSecSize)); } // Set the new AddressOfEntryPoint if needed DWORD* pdwAddressOfEntryPoint = GetCommonMemberFromPEOptHdr(ntHeaders->OptionalHeader, AddressOfEntryPoint); if (ConvertEndianness(*pdwAddressOfEntryPoint) > m_dwResourceSectionVA) *pdwAddressOfEntryPoint = AdjustVA(*pdwAddressOfEntryPoint, dwVAAdjustment); // Set the new BaseOfCode if needed DWORD* pdwBaseOfCode = GetCommonMemberFromPEOptHdr(ntHeaders->OptionalHeader, BaseOfCode); if (ConvertEndianness(*pdwBaseOfCode) > m_dwResourceSectionVA) *pdwBaseOfCode = AdjustVA(*pdwBaseOfCode, dwVAAdjustment); // Set the new BaseOfData if needed if (*GetCommonMemberFromPEOptHdr(ntHeaders->OptionalHeader, Magic) == IMAGE_NT_OPTIONAL_HDR32_MAGIC) { DWORD* pdwBaseOfData = &((PIMAGE_OPTIONAL_HEADER32)&ntHeaders->OptionalHeader)->BaseOfData; if (ConvertEndianness(*pdwBaseOfData) > m_dwResourceSectionVA) *pdwBaseOfData = AdjustVA(*pdwBaseOfData, dwVAAdjustment); } // Refresh the headers of the sections that come after the resource section, and the data directory DWORD dwNumberOfRvaAndSizes = *GetMemberFromPEOptHdr(ntHeaders->OptionalHeader, NumberOfRvaAndSizes); PIMAGE_DATA_DIRECTORY pDataDirectory = *GetMemberFromPEOptHdr(ntHeaders->OptionalHeader, DataDirectory); for (i = m_dwResourceSectionIndex + 1; i < wNumberOfSections; i++) { if (sectionHeadersArray[i].PointerToRawData) { AdjustVA(sectionHeadersArray[i].PointerToRawData, dwRsrcSizeAligned - dwOldRsrcSize); } // We must find the right data directory entry before we change the virtual address unsigned int uDataDirIdx = 0; for (unsigned int j = 0; j < ConvertEndianness(dwNumberOfRvaAndSizes); j++) if (pDataDirectory[j].VirtualAddress == sectionHeadersArray[i].VirtualAddress) uDataDirIdx = j; sectionHeadersArray[i].VirtualAddress = AdjustVA(sectionHeadersArray[i].VirtualAddress, dwVAAdjustment); // Change the virtual address in the data directory too if (uDataDirIdx) pDataDirectory[uDataDirIdx].VirtualAddress = sectionHeadersArray[i].VirtualAddress; } // Write the resource section WriteRsrcSec(seeker); // Advance the pointer seeker += dwRsrcSizeAligned; // Copy everything that comes after the resource section (other sections and tacked data) size_t cbLeft = m_iSize - (oldSeeker - m_pbPE); if (cbLeft) CopyMemory(seeker, oldSeeker, cbLeft); seeker += cbLeft; oldSeeker += cbLeft; /********************************************************** * To add checksum to the header use MapFileAndCheckSum **********************************************************/ // From now on, we are working on the new PE // Freeing the old PE memory is up to the user m_pbPE = pbNewPE; m_iSize = dwSize; m_ntHeaders = ntHeaders; // We just wrote the resource section according to m_cResDir, so we don't need to rescan // m_dwResourceSectionIndex and m_dwResourceSectionVA have also been left unchanged as // we didn't move the resources section return 0; } // This function scans exe sections and after find a match with given name // increments it's virtual size (auto fixes image size based on section alignment, etc) // Jim Park: The section name must be ASCII code. Do not TCHAR this stuff. bool CResourceEditor::SetPESectionVirtualSize(const char* pszSectionName, DWORD newsize) { PIMAGE_SECTION_HEADER sectionHeadersArray = IMAGE_FIRST_SECTION(m_ntHeaders); // Refresh the headers of the sections that come after the resource section, and the data directory for (int i = 0; i < ConvertEndianness(m_ntHeaders->FileHeader.NumberOfSections); i++) { if (!strcmp((LPCSTR)sectionHeadersArray[i].Name, pszSectionName)) { sectionHeadersArray[i].Misc.VirtualSize = AlignVA(ConvertEndianness(newsize)); sectionHeadersArray[i].Characteristics &= ConvertEndianness((DWORD) ~IMAGE_SCN_MEM_DISCARDABLE); // now fix any section after for (int k = i + 1; k < ConvertEndianness(m_ntHeaders->FileHeader.NumberOfSections); k++, i++) { DWORD dwLastSecVA = ConvertEndianness(sectionHeadersArray[i].VirtualAddress); DWORD dwLastSecSize = ConvertEndianness(sectionHeadersArray[i].Misc.VirtualSize); DWORD dwSecVA = AlignVA(ConvertEndianness(dwLastSecVA + dwLastSecSize)); sectionHeadersArray[k].VirtualAddress = dwSecVA; if (m_dwResourceSectionIndex == (DWORD) k) { // fix the resources virtual address if it changed PIMAGE_DATA_DIRECTORY pDataDirectory = *GetMemberFromPEOptHdr(m_ntHeaders->OptionalHeader, DataDirectory); pDataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = dwSecVA; m_dwResourceSectionVA = ConvertEndianness(dwSecVA); } } return true; } } return false; } static char* GetFirstICOCURGroupEntry(const void*headerdata, WORD*pImgType, WORD*pCount) { WORD *p16 = (WORD*) headerdata; if (IsICOCURFile(headerdata)) { // The first 6+ bytes of the resource format matches the file format if (pImgType) *pImgType = FIX_ENDIAN_INT16(p16[1]) == 2 ? (WORD)(size_t) RT_CURSOR : (WORD)(size_t) RT_ICON; if (pCount) *pCount = FIX_ENDIAN_INT16(p16[2]); return ((char*) headerdata) + 6; } return 0; } bool CResourceEditor::DeleteIconImages(const CResourceDirectoryEntry& LangDir) { WORD imgType, count, *pRGE = (WORD*) GetFirstICOCURGroupEntry(LangDir.GetDataEntry()->GetData(), &imgType, &count); if (!pRGE) return false; for (unsigned int i = 0, cbRGE = 14; i < count; ++i, pRGE += cbRGE / sizeof(*pRGE)) if (!DeleteResource(MAKEINTRESOURCE(imgType), FIX_ENDIAN_INT16(pRGE[6]), LangDir.GetId())) return false; return true; } bool CResourceEditor::DeleteIconImagesW(const WINWCHAR* OwnerType, WINWCHAR* Name, LANGID LangId) { CResourceDirectoryEntry*pLangDir = FindResourceLanguageDirEntryW(OwnerType, Name, LangId); return pLangDir ? DeleteIconImages(*pLangDir) : false; } static WORD FindFreeIconImageId(CResourceEditor& re, WORD ImgType) { for (unsigned int i = MAIN_ICON_LAST_IMAGE + 1; i <= 0xffff; ++i) if (!re.ResourceExists(MAKEINTRESOURCE(ImgType), (WORD) i, CResourceEditor::ANYLANGID)) return (WORD) i; return 0; } typedef struct { BYTE Width, Height, Palette, Reserved; WORD Planes, BPP; UINT32 Size, Offset; } FILEICOGROUPENTRY; typedef struct { BYTE Width, Height, Palette, Reserved; WORD Planes, BPP, SizeLo, SizeHi, Id; } RSRCICOGROUPENTRY; typedef struct { WORD Width, Height; WORD Planes, BPP, SizeLo, SizeHi, Id; } RSRCCURGROUPENTRY; //msdn.microsoft.com/en-us/library/windows/desktop/ms648011(v=vs.85).aspx bool CResourceEditor::AddExtraIconFromFile(const WINWCHAR* Type, WINWCHAR* Name, LANGID LangId, BYTE* Data, DWORD Size) { assert(sizeof(RSRCICOGROUPENTRY) == 12+2 && sizeof(FILEICOGROUPENTRY) == 12+4); assert(sizeof(RSRCICOGROUPENTRY) == sizeof(RSRCCURGROUPENTRY)); WORD failed = 0, count, imgType, imgId; FILEICOGROUPENTRY *pSrcFGE = (FILEICOGROUPENTRY*) GetFirstICOCURGroupEntry(Data, &imgType, &count); if (!pSrcFGE) return false; unsigned int cbDstGrp = 6 + (count * sizeof(RSRCICOGROUPENTRY)); BYTE *pDstGrp = new BYTE[cbDstGrp], isCursor = MAKEINTRESOURCE(imgType) == RT_CURSOR; memcpy(pDstGrp, Data, 6); RSRCICOGROUPENTRY *pDstRGE = (RSRCICOGROUPENTRY*) (((char*) pDstGrp) + 6); for (unsigned int i = 0; i < count; ++i) { if (!(imgId = FindFreeIconImageId(*this, imgType))) goto fail; memcpy(&pDstRGE[i], &pSrcFGE[i], sizeof(RSRCICOGROUPENTRY)); // Copy the image information pDstRGE[i].Id = FIX_ENDIAN_INT16(imgId); // and assign the new resource id UINT32 imgSize = FIX_ENDIAN_INT32(pSrcFGE[i].Size); BYTE *pImg = (BYTE*) (((char*) Data) + FIX_ENDIAN_INT32(pSrcFGE[i].Offset)), *pCursor = 0; if (isCursor) { // We must prepend the hotspot to the image data and change the group entry assert(!EditorSupportsCursorPng()); GENERICIMAGEINFO info; if (/*!IsPNGFile(pImg, imgSize, &info) &&*/ !GetDIBHeaderInfo(pImg, imgSize, info)) // Are PNG cursor images allowed? goto fail; //if (info.IsTopDownBitmap() && isDib) // goto fail; // Are TopDown DIBs allowed? Probably not but we play it safe. typedef struct { WORD x, y; } CURSORIMGHDR; //msdn.microsoft.com/en-us/library/windows/desktop/ms648017(v=vs.85).aspx pCursor = new BYTE[imgSize + 4]; CURSORIMGHDR *pLH = (CURSORIMGHDR*) pCursor; pLH->x = pSrcFGE[i].Planes, pLH->y = pSrcFGE[i].BPP; memcpy(pCursor + sizeof(CURSORIMGHDR), pImg, imgSize); pImg = pCursor, imgSize += 4; // Our new image data is ready RSRCCURGROUPENTRY *pCGE = (RSRCCURGROUPENTRY*) &pDstRGE[i]; pCGE->Width = FIX_ENDIAN_INT16(info.Width > 0xffff ? 0 : (WORD) info.Width); pCGE->Height = FIX_ENDIAN_INT16(info.Height > 0xffff ? 0 : (WORD) info.Height); pCGE->Planes = FIX_ENDIAN_INT16(info.Planes), pCGE->BPP = FIX_ENDIAN_INT16(info.BPP); ((FILEICOGROUPENTRY*)pCGE)->Size = FIX_ENDIAN_INT32(imgSize); // The size of the image data has changed } bool succ = UpdateResource(MAKEINTRESOURCE(imgType), imgId, LangId, pImg, imgSize); if (pCursor) delete [] pCursor; if (!succ) goto fail; } if (!UpdateResourceW(Type, Name, LangId, pDstGrp, cbDstGrp)) fail: ++failed; delete [] pDstGrp; return !failed; } template static bool Contains(C&Map, P*p) { return p && (size_t) Map.base <= (size_t) p && (size_t) Map.base + Map.size > (size_t) p; } void CResourceEditor::FreeExternal(EXTERNAL&X) { assert(sizeof(FILEVIEW) <= sizeof(X.Map)); if (X.Data) { FILEVIEW &map = *(FILEVIEW*) &X.Map; if (!Contains(map, X.Data)) free(X.Data); close_file_view(map); free(X.FreeThis); // ParseResProtocolAlloc } } // Maps a file into memory and locates a resource inside it, a manipulated from a resource inside it or the file itself. Free with FreeExternal. const TCHAR* CResourceEditor::MapExternal(const TCHAR*File, TYPEMANIPULATION Manip, EXTERNAL&X) { TCHAR *resproto = ParseResProtocolAlloc(File, X.RT, X.RN, X.RL); if (resproto) { File = resproto; } FILEVIEW &map = *(FILEVIEW*) &X.Map; size_t datasize = 0; char *filedata = create_file_view_readonly(File, map), *data = 0, *dataalloc = 0; if (filedata) { if (resproto) { signed char exetype = GetExeType(filedata, map.size); if (exetype == 'P') { CResourceEditor re(filedata, (int) map.size); DWORD ofs, siz = 0, firstname = X.RN == (TCHAR*) FIRSTRESDIRSTRADDRESS; CResourceDirectoryEntry*pNRDE, *pLRDE; CResourceDataEntry*pRE = re.FindResourceT(X.RT, X.RN, X.RL, 0, &pNRDE, &pLRDE); if (pRE) { const WINWCHAR *wrn = pNRDE->GetNameOrId(); if (firstname) X.RN = IS_INTRESOURCE(wrn) ? (TCHAR*)(size_t) wrn : _T(""); X.RL = pLRDE->GetId(); ofs = pRE->GetOffset(), siz = pRE->GetSize(); } if (siz && IsIcoCurGroupType(X.RT) && (Manip == TM_AUTO || (Manip & TM_ICON))) { // Must create a fake .ico file data = dataalloc = (char*) re.ExtractIcoCur(*pRE, X.RL, datasize), siz = 0; } if (siz && siz != DWORD(-1)) { data = filedata + ofs, datasize = siz; // Raw resource data } } } else { data = filedata, datasize = map.size; // Just a normal file } } X.Data = (BYTE*) data, X.cbData = datasize; X.FreeThis = resproto; if (data) return File; FreeExternal(X); return 0; } bool CResourceEditor::UpdateResourceFromExternalT(const TCHAR* Type, WORD Name, LANGID Lang, const TCHAR*File, TYPEMANIPULATION Manip) { EXTERNAL x; size_t &datasize = x.cbData; bool success = false; const TCHAR *parsedpath = MapExternal(File, Manip, x); if (parsedpath) { if ((DWORD) datasize == datasize) { success = this->UpdateResource(Type, Name, Lang, (BYTE*) x.Data, (DWORD) datasize, Manip); } FreeExternal(x); } return success; } CResourceDataEntry* CResourceEditor::FindIcoCurDataEntry(WORD Type, WORD Id, LANGID PrefLang) const { CResourceDataEntry*pRDE = FindResource(MAKEINTRESOURCEWINW(Type), MAKEINTRESOURCEWINW(Id), PrefLang); return pRDE ? pRDE : FindResource(MAKEINTRESOURCEWINW(Type), MAKEINTRESOURCEWINW(Id), ANYLANGID); } BYTE* CResourceEditor::ExtractIcoCurW(const WINWCHAR* szType, const WINWCHAR* szName, LANGID wLanguage, size_t&cbData) const { CResourceDirectoryEntry*pLangDir = FindResourceLanguageDirEntryW(szType, szName, wLanguage); if (!pLangDir) return 0; CResourceDataEntry*pRDE = pLangDir->GetDataEntry(); return ExtractIcoCur(*pRDE, pLangDir->GetId(), cbData); // Uses the "real" LANGID } BYTE* CResourceEditor::ExtractIcoCur(const CResourceDataEntry&rde, LANGID ChildLang, size_t&cbData) const { const CResourceDataEntry*pRDE = &rde; BYTE*pSH = pRDE->GetData(), cbRGE = 14, cbFGE = 16, *pResData; DWORD i, cbRes, failed = false; if (pRDE->GetSize() < 6) // Must at least have a ICO file header return 0; WORD imgResType, count, *pFirstRGE = (WORD*) GetFirstICOCURGroupEntry(pSH, &imgResType, &count), *pRGE; if (!pFirstRGE) return 0; WORD *pDH = 0, isCursor = imgResType == (size_t) RT_CURSOR; DWORD imgsOfs = 6 + (count * cbFGE), cbTot = imgsOfs, cbImages = 0, grpsOfs = 6; // Get the size of all images for (i = 0, pRGE = pFirstRGE; i < count; ++i, pRGE += cbRGE / sizeof(*pRGE)) { pRDE = FindIcoCurDataEntry(imgResType, ((RSRCICOGROUPENTRY*)pRGE)->Id, ChildLang); if (pRDE && pRDE->GetData()) cbImages += FIX_ENDIAN_INT32(((FILEICOGROUPENTRY*)pRGE)->Size); else count = 0; } // Build the .ICO file GENERICIMAGEINFO ii; if (count && (pDH = (WORD*) malloc(cbTot += cbImages))) { pDH[0] = 0x0000, pDH[1] = FIX_ENDIAN_INT16(isCursor ? 2 : 1), pDH[2] = FIX_ENDIAN_INT16(count); for (i = 0, pRGE = pFirstRGE; i < count; ++i, pRGE += cbRGE / sizeof(*pRGE)) { pRDE = FindIcoCurDataEntry(imgResType, ((RSRCICOGROUPENTRY*)pRGE)->Id, ChildLang); pResData = pRDE->GetData(), cbRes = pRDE->GetSize(); FILEICOGROUPENTRY*pFGE = (FILEICOGROUPENTRY*) ((char*)pDH + grpsOfs); memcpy(pFGE, pRGE, cbRGE), pFGE->Offset = FIX_ENDIAN_INT32(imgsOfs); // Initialize ICO group entry DWORD cbImgFromGrp = FIX_ENDIAN_INT32(pFGE->Size), cbImg = cbImgFromGrp; if (isCursor) { pFGE->Width = (BYTE) FIX_ENDIAN_INT16(pRGE[0]), pFGE->Height = (BYTE) FIX_ENDIAN_INT16(pRGE[1]); if (cbRes >= 4+12) { assert(!EditorSupportsCursorPng()); pFGE->Planes = ((WORD*)pResData)[0], pFGE->BPP = ((WORD*)pResData)[1], cbImg -= 4; // Hotspot DWORD cbBMH = GetDIBHeaderInfo(pResData += 4, cbRes - 4, ii), cd = ii.BPP * ii.Planes; pFGE->Palette = cbBMH && cd < 8 ? (BYTE)(1 << cd) : 0; // devblogs.microsoft.com/oldnewthing/20101018-00/?p=12513 says only for depths < 8! pFGE->Reserved = 0; } else ++failed; } if (cbImg <= cbRes) { memcpy((char*)pDH + imgsOfs, pResData, cbImg); pFGE->Size = FIX_ENDIAN_INT32(cbImg); imgsOfs += cbImg, grpsOfs += cbFGE; } else ++failed; } } cbData = cbTot; if (!count || failed) free(pDH), pDH = 0; return (BYTE*) pDH; } BYTE* CResourceEditor::ExtractIcoCurT(const TCHAR* szType, WORD szName, LANGID wLanguage, size_t&cbData) const { assert(!EditorSupportsStringNames() && sizeof(szName)); #if defined(_WIN32) && defined(_UNICODE) return ExtractIcoCurW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage, cbData); #else WINWCHAR* szwType = ResStringToUnicode(szType); BYTE* result = ExtractIcoCurW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage, cbData); FreeUnicodeResString(szwType); return result; #endif } ////////////////////////////////////////////////////////////////////// // Private Methods ////////////////////////////////////////////////////////////////////// // This function scans a given resource directory and returns a CResourceDirectory object // rdRoot must point to the root directory of the resource section CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan) { // Create CResourceDirectory from rdToScan CResourceDirectory* rdc = new CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY(rdToScan)); WINWCHAR* szName; PIMAGE_RESOURCE_DATA_ENTRY rde = NULL; // Go through all entries of this resource directory int entries = ConvertEndianness(rdToScan->Header.NumberOfNamedEntries); entries += ConvertEndianness(rdToScan->Header.NumberOfIdEntries); for (int i = 0; i < entries; i++) { MY_IMAGE_RESOURCE_DIRECTORY_ENTRY rd = rdToScan->Entries[i]; rd.UOffset.OffsetToData = ConvertEndianness(rd.UOffset.OffsetToData); rd.UName.Name = ConvertEndianness(rd.UName.Name); // If this entry points to data entry get a pointer to it if (!rd.UOffset.DirectoryOffset.DataIsDirectory) rde = PIMAGE_RESOURCE_DATA_ENTRY(rd.UOffset.OffsetToData + (BYTE*)rdRoot); // If this entry has a name, translate it from Unicode if (rd.UName.NameString.NameIsString) { PIMAGE_RESOURCE_DIR_STRING_U rds = PIMAGE_RESOURCE_DIR_STRING_U(rd.UName.NameString.NameOffset + (char*)rdRoot); size_t nameSize = ConvertEndianness(rds->Length); szName = new WINWCHAR[nameSize+1]; WinWStrNCpy(szName, WCHARPTR2WINWCHARPTR(rds->NameString), nameSize); szName[nameSize] = 0; } // Else, set the name to this entry's id else szName = MAKEINTRESOURCEWINW(ConvertEndianness(rdToScan->Entries[i].UName.Id)); if (rd.UOffset.DirectoryOffset.DataIsDirectory) { CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry( szName, ScanDirectory( rdRoot, PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (LPBYTE)rdRoot) ) ); if (!rdc->AddEntry(pRDE)) delete pRDE; } else { LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA; DWORD dwOffset = DWORD(pbData - m_pbPE); if (m_bKeepData) { if (dwOffset > DWORD(m_iSize)) { throw runtime_error("Invalid resource entry data pointer, possibly compressed resources"); } } else { pbData = m_pbPE; // dummy pointer to "nothing" } CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry( szName, new CResourceDataEntry( pbData, ConvertEndianness(rde->Size), ConvertEndianness(rde->CodePage), dwOffset ) ); if (!rdc->AddEntry(pRDE)) delete pRDE; } // Delete the dynamically allocated name if it is a name and not an id if (!IS_INTRESOURCE(szName)) delete [] szName; } return rdc; } // This function writes into a given place in memory (pbRsrcSec) the edited resource section void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { BYTE* seeker = pbRsrcSec; queue qDirs; // Used to scan the tree by level queue qDataEntries; // Used for writing the data entries queue qDataEntries2; // Used for writing raw resources data queue qStrings; // Used for writing resources' names qDirs.push(m_cResDir); while (!qDirs.empty()) { CResourceDirectory* crd = qDirs.front(); IMAGE_RESOURCE_DIRECTORY rdDir = crd->GetInfo(); rdDir.NumberOfNamedEntries = ConvertEndianness(rdDir.NumberOfNamedEntries); rdDir.NumberOfIdEntries = ConvertEndianness(rdDir.NumberOfIdEntries); CopyMemory(seeker, &rdDir, sizeof(IMAGE_RESOURCE_DIRECTORY)); crd->m_ulWrittenAt = (ULONG_PTR)(seeker); seeker += sizeof(IMAGE_RESOURCE_DIRECTORY); for (unsigned int i = 0; i < crd->CountEntries(); i++) { if (crd->GetEntry(i)->HasName()) qStrings.push(crd->GetEntry(i)); if (crd->GetEntry(i)->IsDataDirectory()) qDirs.push(crd->GetEntry(i)->GetSubDirectory()); else { qDataEntries.push(crd->GetEntry(i)->GetDataEntry()); qDataEntries2.push(crd->GetEntry(i)->GetDataEntry()); } MY_IMAGE_RESOURCE_DIRECTORY_ENTRY rDirE; ZeroMemory(&rDirE, sizeof(rDirE)); rDirE.UOffset.DirectoryOffset.DataIsDirectory = crd->GetEntry(i)->IsDataDirectory(); rDirE.UName.Id = crd->GetEntry(i)->HasName() ? 0 : crd->GetEntry(i)->GetId(); rDirE.UName.Id = ConvertEndianness(rDirE.UName.Id); rDirE.UName.NameString.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0; CopyMemory(seeker, &rDirE, sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY)); crd->GetEntry(i)->m_ulWrittenAt = (ULONG_PTR)(seeker); seeker += sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY); } qDirs.pop(); } /* * Write IMAGE_RESOURCE_DATA_ENTRYs. */ while (!qDataEntries.empty()) { CResourceDataEntry* cRDataE = qDataEntries.front(); IMAGE_RESOURCE_DATA_ENTRY rDataE = {0,}; rDataE.CodePage = ConvertEndianness(cRDataE->GetCodePage()); rDataE.Size = ConvertEndianness(cRDataE->GetSize()); CopyMemory(seeker, &rDataE, sizeof(IMAGE_RESOURCE_DATA_ENTRY)); cRDataE->m_ulWrittenAt = (ULONG_PTR)(seeker); seeker += sizeof(IMAGE_RESOURCE_DATA_ENTRY); qDataEntries.pop(); } /* * Write strings */ while (!qStrings.empty()) { CResourceDirectoryEntry* cRDirE = qStrings.front(); size_t resdirstr = (size_t)(seeker - pbRsrcSec); assert(RALIGN(resdirstr, 4) == resdirstr); // PE spec says these are ?machine? word aligned PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_ulWrittenAt)->UName.NameString.NameOffset = ConvertEndianness((DWORD) resdirstr); const WINWCHAR* szName = cRDirE->GetName(); WORD iLen = (WORD) (WinWStrLen(szName)); // No terminator *(WORD*)seeker = ConvertEndianness(iLen); CopyMemory(seeker + sizeof(WORD), szName, iLen * sizeof(WINWCHAR)); seeker += RALIGN(sizeof(WORD) + (iLen * sizeof(WINWCHAR)), 4); qStrings.pop(); } /* * Write raw resource data and set offsets in IMAGE_RESOURCE_DATA_ENTRYs. */ while (!qDataEntries2.empty()) { CResourceDataEntry* cRDataE = qDataEntries2.front(); CopyMemory(seeker, cRDataE->GetData(), cRDataE->GetSize()); PIMAGE_RESOURCE_DATA_ENTRY(cRDataE->m_ulWrittenAt)->OffsetToData = ConvertEndianness((DWORD)(seeker - pbRsrcSec) + m_dwResourceSectionVA); seeker += RALIGN(cRDataE->GetSize(), 8); qDataEntries2.pop(); } /* * Set all of the directory entries offsets. */ SetOffsets(m_cResDir, (ULONG_PTR)(pbRsrcSec)); } // Sets the offsets in directory entries void CResourceEditor::SetOffsets(CResourceDirectory* resDir, ULONG_PTR newResDirAt) { for (unsigned int i = 0; i < resDir->CountEntries(); i++) { PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY rde = PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_ulWrittenAt); if (resDir->GetEntry(i)->IsDataDirectory()) { rde->UOffset.DirectoryOffset.DataIsDirectory = 1; rde->UOffset.DirectoryOffset.OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_ulWrittenAt - newResDirAt; rde->UOffset.OffsetToData = ConvertEndianness(rde->UOffset.OffsetToData); SetOffsets(resDir->GetEntry(i)->GetSubDirectory(), newResDirAt); } else { rde->UOffset.OffsetToData = ConvertEndianness((DWORD)(resDir->GetEntry(i)->GetDataEntry()->m_ulWrittenAt - newResDirAt)); } } } // Adjusts a virtual address by a specific amount DWORD CResourceEditor::AdjustVA(DWORD dwVirtualAddress, DWORD dwAdjustment) { dwVirtualAddress = ConvertEndianness(dwVirtualAddress); dwVirtualAddress += dwAdjustment; dwVirtualAddress = ConvertEndianness(dwVirtualAddress); return dwVirtualAddress; } // Aligns a virtual address to the section alignment DWORD CResourceEditor::AlignVA(DWORD dwVirtualAddress) { DWORD temp32 = *GetCommonMemberFromPEOptHdr(m_ntHeaders->OptionalHeader, SectionAlignment); DWORD dwAlignment = ConvertEndianness(temp32); dwVirtualAddress = ConvertEndianness(dwVirtualAddress); dwVirtualAddress = RALIGN(dwVirtualAddress, dwAlignment); dwVirtualAddress = ConvertEndianness(dwVirtualAddress); return dwVirtualAddress; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // CResourceDirectory ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CResourceDirectory::CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY prd) { m_rdDir = *prd; m_rdDir.NumberOfIdEntries = 0; m_rdDir.NumberOfNamedEntries = 0; } CResourceDirectory::~CResourceDirectory() { Destroy(); } ////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////// IMAGE_RESOURCE_DIRECTORY CResourceDirectory::GetInfo() { return m_rdDir; } CResourceDirectoryEntry* CResourceDirectory::GetEntry(unsigned int i) { if (m_vEntries.size() < i) return 0; return m_vEntries[i]; } // This function inserts a new directory entry // It also keeps the directory entries sorted bool CResourceDirectory::AddEntry(CResourceDirectoryEntry* entry) { int i = 0; if (entry->HasName()) { const WINWCHAR* szEntName = entry->GetName(); for (i = 0; i < m_rdDir.NumberOfNamedEntries; i++) { const WINWCHAR* szName = m_vEntries[i]->GetName(); int cmp = WinWStrCmp(szName, szEntName); if (cmp == 0) return false; if (cmp > 0) break; } m_rdDir.NumberOfNamedEntries++; } else { for (i = m_rdDir.NumberOfNamedEntries; i < m_rdDir.NumberOfNamedEntries+m_rdDir.NumberOfIdEntries; i++) { if (m_vEntries[i]->GetId() == entry->GetId()) return false; if (m_vEntries[i]->GetId() > entry->GetId()) break; } m_rdDir.NumberOfIdEntries++; } m_vEntries.insert(m_vEntries.begin() + i, entry); return true; } void CResourceDirectory::RemoveEntry(int i) { if (m_vEntries[i]->HasName()) m_rdDir.NumberOfNamedEntries--; else m_rdDir.NumberOfIdEntries--; delete m_vEntries[i]; m_vEntries.erase(m_vEntries.begin() + i); } unsigned int CResourceDirectory::CountEntries() { return truncate_cast(unsigned int,m_vEntries.size()); } // Returns the index of a directory entry with the specified name // Name can be a string or an id // Returns -1 if can not be found int CResourceDirectory::Find(const WINWCHAR* szName) { if (IS_INTRESOURCE(szName)) return Find((WORD) (ULONG_PTR) szName); else if (szName[0] == L'#') return Find(WORD(WinWStrToInt(szName + 1))); for (unsigned int i = 0; i < m_vEntries.size(); i++) { if (!m_vEntries[i]->HasName()) continue; const WINWCHAR* szEntName = m_vEntries[i]->GetName(); int cmp = WinWStrCmp(szName, szEntName); if (!cmp) return i; } return -1; } // Returns the index of a directory entry with the specified id // Returns -1 if can not be found int CResourceDirectory::Find(WORD wId) { for (unsigned int i = 0; i < m_vEntries.size(); i++) { if (m_vEntries[i]->HasName()) continue; if (wId == m_vEntries[i]->GetId()) return i; } return -1; } // Get the size of this resource directory (including all of its children) DWORD CResourceDirectory::GetSize() { DWORD dwSize = sizeof(IMAGE_RESOURCE_DIRECTORY); for (unsigned int i = 0; i < m_vEntries.size(); i++) { dwSize += sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY); if (m_vEntries[i]->HasName()) dwSize += sizeof(IMAGE_RESOURCE_DIR_STRING_U) + (m_vEntries[i]->GetNameLength()+1)*sizeof(WINWCHAR); if (m_vEntries[i]->IsDataDirectory()) dwSize += m_vEntries[i]->GetSubDirectory()->GetSize(); else { DWORD dwAligned = m_vEntries[i]->GetDataEntry()->GetSize(); ALIGN(dwAligned, 8); dwSize += sizeof(IMAGE_RESOURCE_DATA_ENTRY) + dwAligned; } } return dwSize; } // Destroys this directory and all of its children void CResourceDirectory::Destroy() { for (unsigned int i = 0; i < m_vEntries.size(); i++) { if (m_vEntries[i]->IsDataDirectory()) { m_vEntries[i]->GetSubDirectory()->Destroy(); delete m_vEntries[i]->GetSubDirectory(); } else delete m_vEntries[i]->GetDataEntry(); delete m_vEntries[i]; } m_vEntries.clear(); } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // CResourceDirectoryEntry ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CResourceDirectoryEntry::CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDirectory* rdSubDir) { if (IS_INTRESOURCE(szName)) { m_bHasName = false; m_szName = 0; m_wId = (WORD) (ULONG_PTR) szName; } else { m_bHasName = true; m_szName = WinWStrDupFromWinWStr(szName); } m_bIsDataDirectory = true; m_rdSubDir = rdSubDir; } CResourceDirectoryEntry::CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDataEntry* rdeData) { if (IS_INTRESOURCE(szName)) { m_bHasName = false; m_szName = 0; m_wId = (WORD) (ULONG_PTR) szName; } else { m_bHasName = true; m_szName = WinWStrDupFromWinWStr(szName); } m_bIsDataDirectory = false; m_rdeData = rdeData; } CResourceDirectoryEntry::~CResourceDirectoryEntry() { if (m_bHasName) free(m_szName); } ////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////// bool CResourceDirectoryEntry::HasName() const { return m_bHasName; } // Don't forget to free the memory used by the string after usage! const WINWCHAR* CResourceDirectoryEntry::GetName() const { return m_bHasName ? m_szName : 0; } int CResourceDirectoryEntry::GetNameLength() const { return (int) WinWStrLen(m_szName); } WORD CResourceDirectoryEntry::GetId() const { return m_bHasName ? 0 : m_wId; } bool CResourceDirectoryEntry::IsDataDirectory() const { return m_bIsDataDirectory; } CResourceDirectory* CResourceDirectoryEntry::GetSubDirectory() const { if (!m_bIsDataDirectory) return NULL; return m_rdSubDir; } CResourceDataEntry* CResourceDirectoryEntry::GetDataEntry() const { if (m_bIsDataDirectory) return NULL; return m_rdeData; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // CResourceDataEntry ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CResourceDataEntry::CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage, DWORD dwOffset) { m_pbData = 0; SetData(pbData, dwSize, dwCodePage); m_dwOffset = dwOffset; } CResourceDataEntry::~CResourceDataEntry() { if (m_pbData) delete [] m_pbData; } ////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////// // To save memory this function doesn't give you a copy of the data // Don't mess with the data returned from this function! BYTE* CResourceDataEntry::GetData() const { return m_pbData; } void CResourceDataEntry::SetData(BYTE* pbData, DWORD dwSize) { SetData(pbData, dwSize, m_dwCodePage); } void CResourceDataEntry::SetData(BYTE* pbData, DWORD dwSize, DWORD dwCodePage) { if (m_pbData) delete [] m_pbData; m_pbData = new BYTE[dwSize]; CopyMemory(m_pbData, pbData, dwSize); m_dwSize = dwSize; m_dwCodePage = dwCodePage; m_dwOffset = DWORD(-1); // unset } DWORD CResourceDataEntry::GetSize() const { return m_dwSize; } DWORD CResourceDataEntry::GetCodePage() const { return m_dwCodePage; } DWORD CResourceDataEntry::GetOffset() const { return m_dwOffset; } nsis-3.11/Source/ResourceEditor.h000077500000000000000000000325361477201124000167730ustar00rootroot00000000000000/* * ResourceEditor.h * * This file is a part of NSIS. * * Copyright (C) 2002-2025 Amir Szekely * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/21/2007 */ #if !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_) #define AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "Platform.h" #include "winchar.h" #include #include #define MAIN_ICON_LAST_IMAGE 99 // Main icon is special, we must reserve space for installer/uninstaller images #ifdef _WIN32 #include #else // all definitions for non Win32 platforms were taken from MinGW's free Win32 library # define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 # define IMAGE_SCN_MEM_DISCARDABLE 0x2000000 # pragma pack(4) typedef struct _IMAGE_RESOURCE_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; WORD NumberOfNamedEntries; WORD NumberOfIdEntries; } IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY; typedef struct _IMAGE_RESOURCE_DATA_ENTRY { DWORD OffsetToData; DWORD Size; DWORD CodePage; DWORD Reserved; } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY; typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING { WORD Length; CHAR NameString[1]; } IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING; typedef struct _IMAGE_RESOURCE_DIR_STRING_U { WORD Length; WCHAR NameString[1]; } IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U; # pragma pack() #endif #pragma pack(4) typedef struct _MY_IMAGE_RESOURCE_DIRECTORY_ENTRY { union { struct { #ifndef __BIG_ENDIAN__ DWORD NameOffset:31; DWORD NameIsString:1; #else DWORD NameIsString:1; DWORD NameOffset:31; #endif } NameString; DWORD Name; WORD Id; } UName; union { DWORD OffsetToData; struct { #ifndef __BIG_ENDIAN__ DWORD OffsetToDirectory:31; DWORD DataIsDirectory:1; #else DWORD DataIsDirectory:1; DWORD OffsetToDirectory:31; #endif } DirectoryOffset; } UOffset; } MY_IMAGE_RESOURCE_DIRECTORY_ENTRY,*PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY; #pragma pack() #include // classes class CResourceDirectory; class CResourceDirectoryEntry; class CResourceDataEntry; // Resource directory with entries typedef struct RESOURCE_DIRECTORY { IMAGE_RESOURCE_DIRECTORY Header; MY_IMAGE_RESOURCE_DIRECTORY_ENTRY Entries[1]; } *PRESOURCE_DIRECTORY; #define GetCommonStructField(ref, s1, s2, fld) \ ( (&((ref).fld))[(1 / ( 0 + !!(FIELD_OFFSET(s1, fld) == FIELD_OFFSET(s2, fld) && sizeof(((s1*)0)->fld) == sizeof(((s2*)0)->fld)) )) - 1] ) // Try to fail at compile-time if the field is not at the same offset in both structs or does not have the same size #define GetCommonMemberFromPEOptHdr(OptHdr, Member) \ ( &GetCommonStructField(OptHdr, IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Member) ) #define GetMemberFromPEOptHdrEx(OptHdr, Member, Sixtyfour) \ ( (Sixtyfour) ? \ &((PIMAGE_OPTIONAL_HEADER64)&(OptHdr))->Member : \ &((PIMAGE_OPTIONAL_HEADER32)&(OptHdr))->Member \ ) #define GetMemberFromPEOptHdr(OptHdr, Member) \ ( GetMemberFromPEOptHdrEx(OptHdr, Member, ((OptHdr).Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)) ) class CResourceEditor { public: CResourceEditor(void* pbPE, int iSize, bool bKeepData = true); virtual ~CResourceEditor(); enum { ANYLANGID = 0xffff, INVALIDLANGID = 0xffff-1, ALLLANGID = 0xffff-2 }; typedef enum { TM_RAW = 0, TM_ICONFILE = 0x01, TM_ICONRSRC = 0x02, TM_ICON = (TM_ICONFILE|TM_ICONRSRC), TM_AUTO = 0x04 } TYPEMANIPULATION; // On POSIX+Unicode GetResource(RT_VERSION,..) is not TCHAR nor WINWCHAR, it is WCHAR/UINT16 (MAKEINTRESOURCEW). // If it passes IS_INTRESOURCE we must allow it. // Use TCHAR* for real strings. If you need to pass in a WINWCHAR*, make GetResourceW public... template bool UpdateResourceFromExternal(const T*Type, WORD Name, LANGID Lang, const TCHAR*File, TYPEMANIPULATION Manip = TM_AUTO) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return false; } return UpdateResourceFromExternalT((const TCHAR*) Type, Name, Lang, File, Manip); } template bool UpdateResource(const T*Type, WORD Name, LANGID Lang, BYTE*Data, DWORD Size, TYPEMANIPULATION Manip = TM_RAW) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return false; } return UpdateResourceT((const TCHAR*) Type, Name, Lang, Data, Size, Manip); } template bool UpdateResource(const T*Type, WORD Name, LANGID Lang, FILE*Data, TYPEMANIPULATION Manip = TM_AUTO) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return false; } return UpdateResourceT((const TCHAR*) Type, Name, Lang, Data, Manip); } template bool DeleteResource(const T*Type, WORD Name, LANGID Lang, TYPEMANIPULATION Manip = TM_RAW) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return false; } return DeleteResourceT((const TCHAR*) Type, Name, Lang, Manip); } template BYTE* GetResource(const T*Type, WORD Name, LANGID Lang) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return NULL; } return GetResourceT((const TCHAR*) Type, Name, Lang); } template int GetResourceSize(const T*Type, WORD Name, LANGID Lang) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return -1; } return GetResourceSizeT((const TCHAR*) Type, Name, Lang); } template DWORD GetResourceOffset(const T*Type, WORD Name, LANGID Lang) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return -1; } return GetResourceOffsetT((const TCHAR*) Type, Name, Lang); } template bool ResourceExists(const T*Type, WORD Name, LANGID Lang, LANGID*pFoundLanguage = 0) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return false; } return ResourceExistsT((const TCHAR*) Type, Name, Lang, pFoundLanguage); } template BYTE* GetFirstResource(const T*Type, size_t&cbData) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return NULL; } return GetFirstResourceT((const TCHAR*) Type, cbData); } template BYTE* ExtractIcoCur(const T*Type, WORD Name, LANGID Lang, size_t&cbData) { if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) { assert(IS_INTRESOURCE(Type)); return NULL; } return ExtractIcoCurT((const TCHAR*) Type, Name, Lang, cbData); } CResourceDataEntry* FindResourceT(const TCHAR*RT, const TCHAR*RN, LANGID RL, CResourceDirectoryEntry**pTE, CResourceDirectoryEntry**pNE, CResourceDirectoryEntry**pLE) const; bool UpdateResourceFromExternalT(const TCHAR* Type, WORD Name, LANGID Lang, const TCHAR*File, TYPEMANIPULATION Manip = TM_AUTO); bool UpdateResourceT (const TCHAR* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize, TYPEMANIPULATION Manip = TM_RAW); bool UpdateResourceT (const TCHAR* szType, WORD szName, LANGID wLanguage, FILE*Data, TYPEMANIPULATION Manip = TM_AUTO); bool DeleteResourceT (const TCHAR* szType, WORD szName, LANGID wLanguage, TYPEMANIPULATION Manip = TM_RAW); BYTE* GetResourceT (const TCHAR* szType, WORD szName, LANGID wLanguage); int GetResourceSizeT (const TCHAR* szType, WORD szName, LANGID wLanguage); DWORD GetResourceOffsetT(const TCHAR* szType, WORD szName, LANGID wLanguage); bool ResourceExistsT (const TCHAR* szType, WORD szName, LANGID wLanguage, LANGID*pFoundLanguage = 0); BYTE* GetFirstResourceT (const TCHAR* szType, size_t&cbData); BYTE* ExtractIcoCurT (const TCHAR* szType, WORD szName, LANGID wLanguage, size_t&cbData) const; BYTE* ExtractIcoCur(const CResourceDataEntry&rde, LANGID ChildLang, size_t&cbData) const; void FreeResource(BYTE* pbResource); // The section name must be in ASCII. bool SetPESectionVirtualSize(const char* pszSectionName, DWORD newsize); DWORD Save(BYTE* pbBuf, DWORD &dwSize); // utility functions static PIMAGE_NT_HEADERS GetNTHeaders(BYTE* pbPE); static PRESOURCE_DIRECTORY GetResourceDirectory( BYTE* pbPE, DWORD dwSize, PIMAGE_NT_HEADERS ntHeaders, DWORD *pdwResSecVA = NULL, DWORD *pdwSectionIndex = NULL ); static const TCHAR* ParseResourceTypeString(const TCHAR*String); static const TCHAR* ParseResourceNameString(const TCHAR*String, bool AllowFirst = false); static LANGID ParseResourceLangString(const TCHAR*String); static LANGID ParseResourceTypeNameLangString(const TCHAR**Type, const TCHAR**Name, const TCHAR*Lang, bool AllowFirst = false); static bool CanOpen(const void*Data, size_t Size); static UINT IsResProtocol(const TCHAR*Url); typedef struct { BYTE*Data; size_t cbData, Map[2]; void*FreeThis; const TCHAR*RT, *RN; LANGID RL; } EXTERNAL; static void FreeExternal(EXTERNAL&External); static const TCHAR* MapExternal(const TCHAR*File, TYPEMANIPULATION Manip, EXTERNAL&External); static bool EditorSupportsStringNames() { return false; } // UpdateResource/GetResource do not support string names (yet) static bool EditorSupportsCursorPng() { return false; } private: bool UpdateResourceW (const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize, TYPEMANIPULATION Manip = TM_RAW); BYTE* GetResourceW (const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage); int GetResourceSizeW (const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage); DWORD GetResourceOffsetW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage); BYTE* GetFirstResourceW (const WINWCHAR* szType, size_t&cbData); BYTE* ExtractIcoCurW (const WINWCHAR* szType, const WINWCHAR* szName, LANGID wLanguage, size_t&cbData) const; CResourceDataEntry* FindResource(const WINWCHAR*RT, const WINWCHAR*RN, LANGID RL) const; CResourceDataEntry* FindResourceW(const WINWCHAR*RT, const WINWCHAR*RN, LANGID RL, CResourceDirectoryEntry**ppTE, CResourceDirectoryEntry**ppNE, CResourceDirectoryEntry**ppLE) const; CResourceDirectoryEntry* FindResourceLanguageDirEntryW(const WINWCHAR* RT, const WINWCHAR* RN, LANGID RL) const; CResourceDirectoryEntry* FindResourceLanguageDirEntryT(const TCHAR* RT, const TCHAR* RN, LANGID RL) const; bool DeleteIconImages(const CResourceDirectoryEntry& LangDir); bool DeleteIconImagesW(const WINWCHAR* OwnerType, WINWCHAR* Name, LANGID LangId); bool AddExtraIconFromFile(const WINWCHAR* Type, WINWCHAR* Name, LANGID LangId, BYTE* Data, DWORD Size); CResourceDataEntry* FindIcoCurDataEntry(WORD Type, WORD Id, LANGID PrefLang) const; BYTE* DupData(CResourceDataEntry*pDE); // Free with FreeResource CResourceDirectory* ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan); void WriteRsrcSec(BYTE* pbRsrcSec); void SetOffsets(CResourceDirectory* resDir, ULONG_PTR newResDirAt); DWORD AdjustVA(DWORD dwVirtualAddress, DWORD dwAdjustment); DWORD AlignVA(DWORD dwVirtualAddress); private: BYTE* m_pbPE; int m_iSize; bool m_bKeepData; PIMAGE_NT_HEADERS m_ntHeaders; DWORD m_dwResourceSectionIndex; DWORD m_dwResourceSectionVA; CResourceDirectory* m_cResDir; }; class CResourceDirectory { public: CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY prd); virtual ~CResourceDirectory(); IMAGE_RESOURCE_DIRECTORY GetInfo(); CResourceDirectoryEntry* GetEntry(unsigned int i); bool AddEntry(CResourceDirectoryEntry* entry); void RemoveEntry(int i); unsigned int CountEntries(); int Find(const WINWCHAR* szName); int Find(WORD wId); DWORD GetSize(); void Destroy(); ULONG_PTR m_ulWrittenAt; private: IMAGE_RESOURCE_DIRECTORY m_rdDir; std::vector m_vEntries; }; class CResourceDirectoryEntry { public: CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDirectory* rdSubDir); CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDataEntry* rdeData); virtual ~CResourceDirectoryEntry(); const WINWCHAR* GetNameOrId() const { return HasName() ? GetName() : (WINWCHAR*)(size_t) GetId(); } bool HasName() const; const WINWCHAR* GetName() const; int GetNameLength() const; WORD GetId() const; bool IsDataDirectory() const; CResourceDirectory* GetSubDirectory() const; CResourceDataEntry* GetDataEntry() const; ULONG_PTR m_ulWrittenAt; private: bool m_bHasName; WINWCHAR* m_szName; WORD m_wId; bool m_bIsDataDirectory; union { CResourceDirectory* m_rdSubDir; CResourceDataEntry* m_rdeData; }; }; class CResourceDataEntry { public: CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage = 0, DWORD dwOffset = DWORD(-1)); ~CResourceDataEntry(); BYTE* GetData() const; void SetData(BYTE* pbData, DWORD dwSize); void SetData(BYTE* pbData, DWORD dwSize, DWORD dwCodePage); DWORD GetSize() const; DWORD GetCodePage() const; DWORD GetOffset() const; ULONG_PTR m_ulWrittenAt; private: BYTE* m_pbData; DWORD m_dwSize; DWORD m_dwCodePage; DWORD m_dwOffset; }; #endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_) nsis-3.11/Source/ResourceVersionInfo.cpp000077500000000000000000000215201477201124000203300ustar00rootroot00000000000000/* * ResourceVersionInfo.cpp: implementation of the CResourceVersionInfo class. * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Modified for Unicode support by Jim Park -- 08/21/2007 */ #include "ResourceVersionInfo.h" #include "Platform.h" #include "util.h" #include "winchar.h" #include "utf.h" #ifdef NSIS_SUPPORT_VERSION_INFO #ifndef VOS__WINDOWS32 # define VOS__WINDOWS32 4 #endif #ifndef VFT_APP # define VFT_APP 1 #endif #ifndef _WIN32 # include #endif struct version_string_list { int codepage; LANGID lang_id; int name; DefineList *pChildStrings; }; CVersionStrigList::~CVersionStrigList() { struct version_string_list *itr = (struct version_string_list *) m_gr.get(); int i = m_gr.getlen() / sizeof(struct version_string_list); while (i--) { delete itr[i].pChildStrings; } } int CVersionStrigList::add(LANGID langid, int codepage) { TCHAR Buff[10]; _stprintf(Buff, _T("%04x"), langid); int pos = SortedStringListND::add(Buff); if (pos == -1) return false; version_string_list *data = ((version_string_list *)m_gr.get())+ pos; data->pChildStrings = new DefineList; data->codepage = codepage; data->lang_id = langid; return pos; } LANGID CVersionStrigList::get_lang(int idx) { version_string_list *data=(version_string_list *)m_gr.get(); return data[idx].lang_id; } int CVersionStrigList::get_codepage(int idx) { version_string_list *data=(version_string_list *)m_gr.get(); return data[idx].codepage; } DefineList* CVersionStrigList::get_strings(int idx) { version_string_list *data=(version_string_list *)m_gr.get(); return data[idx].pChildStrings; } int CVersionStrigList::find(LANGID lang_id, int codepage) { TCHAR Buff[10]; _stprintf(Buff, _T("%04x"), lang_id); return SortedStringListND::find(Buff); } int CVersionStrigList::getnum() { return m_gr.getlen()/sizeof(struct version_string_list); } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CResourceVersionInfo::CResourceVersionInfo() { memset(&m_FixedInfo, 0, sizeof(VS_FIXEDFILEINFO)); m_FixedInfo.dwSignature = 0xFEEF04BD; m_FixedInfo.dwFileOS = VOS__WINDOWS32; m_FixedInfo.dwFileType = VFT_APP; } CResourceVersionInfo::~CResourceVersionInfo() { } void CResourceVersionInfo::SetFileVersion(int HighPart, int LowPart) { m_FixedInfo.dwFileVersionLS = LowPart; m_FixedInfo.dwFileVersionMS = HighPart; } void CResourceVersionInfo::SetProductVersion(int HighPart, int LowPart) { m_FixedInfo.dwProductVersionLS = LowPart; m_FixedInfo.dwProductVersionMS = HighPart; } // Jim Park: Not sure where this is used. int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType) { WINWCHAR *szKey; char *baseP = p; wLength = *(WORD*)p; p += sizeof(WORD); wValueLength = *(WORD*)p; p += sizeof(WORD); wType = *(WORD*)p; p += sizeof(WORD); szKey = (WINWCHAR*)p; p += (WinWStrLen(szKey) + 1) * sizeof (WINWCHAR); while ( ((ULONG_PTR)p % 4) != 0 ) p++; return (int)(p - baseP); } DWORD ZEROS = 0; void PadStream (GrowBuf &strm) { if ( (strm.getlen() % 4) != 0 ) strm.add (&ZEROS, 4 - (strm.getlen() % 4)); } // Helper function only used by CResourceVersionInfo::ExportToStream // Cannot handle anything longer than 65K objects. // // @param wLength Size in bytes of the entire object we are storing. // @param wValueLength The value length in bytes. // @param wType If type is 1, it's a wchar_t string, so save value length appropriately. // @param key The string key // @param value The value mapped to string key. static void SaveVersionHeaderUTF16LE(GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wType, const unsigned short *key, void *value) { WORD valueLen; WORD keyLen; strm.add (&wLength, sizeof(wLength)); strm.add (&wValueLength, sizeof(wValueLength)); strm.add (&wType, sizeof (wType)); keyLen = WORD((StrLenUTF16(key) + 1) * sizeof(WINWCHAR)); strm.add ((void*)key, keyLen); PadStream(strm); if ( wValueLength > 0 ) { valueLen = wValueLength; if ( wType == 1 ) valueLen = valueLen * WORD(sizeof(WINWCHAR)); strm.add (value, valueLen); } } static void SaveVersionHeader(GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wType, const wchar_t *key, void *value) { WCToUTF16LEHlpr cnv; if (!cnv.Create(key)) throw std::runtime_error("Unicode conversion failed"); SaveVersionHeaderUTF16LE(strm, wLength, wValueLength, wType, cnv.Get(), value); cnv.Destroy(); } void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index) { DWORD v; WORD wSize; int p, p1; strm.resize(0); SaveVersionHeader(strm, 0, sizeof (VS_FIXEDFILEINFO), 0, L"VS_VERSION_INFO", &m_FixedInfo); DefineList *pChildStrings = m_ChildStringLists.get_strings(Index); if ( pChildStrings->getnum() > 0 ) { GrowBuf stringInfoStream; int codepage = m_ChildStringLists.get_codepage(Index); LANGID langid = m_ChildStringLists.get_lang(Index); wchar_t Buff[16]; _snwprintf(Buff, COUNTOF(Buff), L"%04x%04x", langid, codepage); SaveVersionHeader(stringInfoStream, 0, 0, 0, Buff, &ZEROS); for ( int i = 0; i < pChildStrings->getnum(); i++ ) { PadStream (stringInfoStream); WCToUTF16LEHlpr cnvName, cnvValue; if (!cnvName.Create(pChildStrings->getname(i), codepage)) throw std::runtime_error("Unicode conversion failed"); if (!cnvValue.Create(pChildStrings->getvalue(i), codepage)) throw std::runtime_error("Unicode conversion failed"); p = stringInfoStream.getlen(); SaveVersionHeaderUTF16LE(stringInfoStream, 0, WORD(StrLenUTF16(cnvValue.Get()) + 1), 1, cnvName.Get(), (void*)cnvValue.Get()); cnvName.Destroy(), cnvValue.Destroy(); wSize = WORD(stringInfoStream.getlen() - p); *(WORD*)((PBYTE)stringInfoStream.get()+p)=wSize; } wSize = WORD(stringInfoStream.getlen()); *(WORD*)((PBYTE)stringInfoStream.get())=wSize; PadStream (strm); p = strm.getlen(); SaveVersionHeader(strm, 0, 0, 0, L"StringFileInfo", &ZEROS); strm.add (stringInfoStream.get(), stringInfoStream.getlen()); wSize = WORD(strm.getlen() - p); *(WORD*)((PBYTE)strm.get()+p)=wSize; } // Show all languages available using Var-Translations if ( m_ChildStringLists.getnum() > 0 ) { PadStream (strm); p = strm.getlen(); SaveVersionHeader(strm, 0, 0, 0, L"VarFileInfo", &ZEROS); PadStream (strm); p1 = strm.getlen(); SaveVersionHeader(strm, 0, 0, 0, L"Translation", &ZEROS); // First add selected code language translation v = MAKELONG(m_ChildStringLists.get_lang(Index), m_ChildStringLists.get_codepage(Index)); strm.add (&v, sizeof (v)); for ( int k =0; k < m_ChildStringLists.getnum(); k++ ) { if ( k != Index ) { v = MAKELONG(m_ChildStringLists.get_lang(k), m_ChildStringLists.get_codepage(k)); strm.add (&v, sizeof (v)); } } wSize = WORD(strm.getlen() - p1); *(WORD*)((PBYTE)strm.get()+p1)=wSize; wSize = WORD(sizeof (int) * m_ChildStringLists.getnum()); p1+=sizeof(WORD); *(WORD*)((PBYTE)strm.get()+p1)=wSize; wSize = WORD(strm.getlen() - p); *(WORD*)((PBYTE)strm.get()+p)=wSize; } wSize = WORD(strm.getlen()); *(WORD*)((PBYTE)strm.get())=wSize; } // Returns 0 if success, 1 if already defined int CResourceVersionInfo::SetKeyValue(LANGID lang_id, int codepage, TCHAR* AKeyName, TCHAR* AValue) { int pos = m_ChildStringLists.find(lang_id, codepage); if ( pos == -1 ) { pos = m_ChildStringLists.add(lang_id, codepage); } DefineList *pStrings = m_ChildStringLists.get_strings(pos); return pStrings->add(AKeyName, AValue); } int CResourceVersionInfo::GetStringTablesCount() { return m_ChildStringLists.getnum(); } LANGID CResourceVersionInfo::GetLangID(int Index) { return m_ChildStringLists.get_lang(Index); } int CResourceVersionInfo::GetCodePage(int Index) { return m_ChildStringLists.get_codepage(Index); } TCHAR *CResourceVersionInfo::FindKey(LANGID LangID, int codepage, const TCHAR *pKeyName) { int pos = m_ChildStringLists.find(LangID, codepage); if ( pos == -1 ) { return NULL; } DefineList *pStrings = m_ChildStringLists.get_strings(pos); return pStrings->find(pKeyName); } #endif nsis-3.11/Source/ResourceVersionInfo.h000077500000000000000000000067571477201124000200140ustar00rootroot00000000000000/* * ResourceVersionInfo.h: interface for the CResourceVersionInfo class. * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support and Doxygen comments by Jim Park -- 07/26/2007 */ #if !defined(AFX_RESOURCEVERSIONINFO_H__80439ADA_49DA_4623_8DA9_1663FF356E76__INCLUDED_) #define AFX_RESOURCEVERSIONINFO_H__80439ADA_49DA_4623_8DA9_1663FF356E76__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "exehead/config.h" #ifdef NSIS_SUPPORT_VERSION_INFO #include "Platform.h" #include "strlist.h" struct version_string_list; class CVersionStrigList : public SortedStringListND { public: ~CVersionStrigList(); /** * Add a version_string_list struct referred to by langid. Then add the * codepage value to the structure. * * @param langid The language ID (LANGID) * @param codepage The code page value to set. * @return The position to the inserted structure, false (0) if failed. */ int add(LANGID langid, int codepage); /** * Get the language ID given the positional index idx. */ LANGID get_lang(int idx); /** * Get the codepage value given the positional index idx. */ int get_codepage(int idx); /** * Get the string pair mappings given the positional index idx. */ DefineList* get_strings(int idx); /** * Given a language ID return the positional index that holds the * version_string_list struct. Actually, the codepage value is ignored. */ int find(LANGID lang_id, int codepage); /** * Get the number of version_string_list objects stored in this list. */ int getnum(); }; ///////////////////////////////////////////////////////////////////////////////////////////// class CResourceVersionInfo { VS_FIXEDFILEINFO m_FixedInfo; CVersionStrigList m_ChildStringLists; public: CResourceVersionInfo(); virtual ~CResourceVersionInfo(); int SetKeyValue(LANGID lang_id, int codepage, TCHAR* AKeyName, TCHAR* AValue); /** * Set the file version. */ void SetFileVersion(int HighPart, int LowPart); /** * Set the product version. */ void SetProductVersion(int HighPart, int LowPart); /** * Write the data out to the flat buffer 'strm'. Not sure where and how * it gets read back in though. */ void ExportToStream(GrowBuf &strm, int Index); /** * How many string tables are we storing in the m_ChildStringLists? */ int GetStringTablesCount(); /** * Given a positional index, get the Language ID associated with it. */ LANGID GetLangID(int Index); /** * Given a positional index, get the CodePage associated with it. */ int GetCodePage(int Index); /** * Given the language ID, codepage, and the 'keyname', return the * TCHAR* pointer to the value portion of the key-value pair. * * @param LangID The language ID. * @param codepage The codepage. (Not used.) * @param pKeyName The key name in the key-value pair of strings. * @return The value string associated with the key string. NULL * if not found. */ TCHAR *FindKey(LANGID LangID, int codepage, const TCHAR *pKeyName); }; #endif #endif // !defined(AFX_RESOURCEVERSIONINFO_H__80439ADA_49DA_4623_8DA9_1663FF356E76__INCLUDED_) nsis-3.11/Source/SConscript000077500000000000000000000032441477201124000156700ustar00rootroot00000000000000target = 'makensis' pch = 'Platform.h' makensis_files = Split(""" build.cpp clzma.cpp crc32.c DialogTemplate.cpp dirreader.cpp fileform.cpp growbuf.cpp icon.cpp lang.cpp lineparse.cpp makenssi.cpp manifest.cpp mmap.cpp Plugins.cpp ResourceEditor.cpp ResourceVersionInfo.cpp BinInterop.cpp script.cpp scriptpp.cpp ShConstants.cpp strlist.cpp tokens.cpp tstring.cpp utf.cpp util.cpp winchar.cpp writer.cpp """) bzip2_files = Split(""" bzip2/blocksort.c bzip2/bzlib.c bzip2/compress.c bzip2/huffman.c """) lzma_files = Split(""" 7zip/7zGuids.cpp 7zip/7zip/Common/OutBuffer.cpp 7zip/7zip/Common/StreamUtils.cpp 7zip/7zip/Compress/LZ/LZInWindow.cpp 7zip/7zip/Compress/LZMA/LZMAEncoder.cpp 7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp 7zip/Common/Alloc.cpp 7zip/Common/CRC.cpp """) libs = Split(""" gdi32 user32 pthread iconv shlwapi oleaut32 version shell32 """) Import('env AddAvailableLibs AddZLib') ##### Use available libraries if env['PLATFORM'] == 'win32': # XXX will cause problems if makensis is cross compiled # on freebsd, libversion.a exists and gives trouble if linked libs += ['version'] AddAvailableLibs(env, libs) AddZLib(env, env['PLATFORM'], 'install-compiler') ##### Defines env.Append(CPPDEFINES = ['MAKENSIS']) env.Append(CPPDEFINES = ['_WIN32_IE=0x0500']) ##### Set PCH # XXX doesn't work #env['PCH'] = env.PCH(pch)[0] #env['PCHSTOP'] = pch ##### LZMA specific defines lzma_env = env.Clone() lzma_env.Append(CPPDEFINES = ['COMPRESS_MF_BT']) lzma_files = lzma_env.Object(lzma_files) ##### Compile makensis files = makensis_files + bzip2_files + lzma_files makensis = env.Program(target, files) Return('makensis') nsis-3.11/Source/ShConstants.cpp000077500000000000000000000045221477201124000166310ustar00rootroot00000000000000/* * ShConstants.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #include "ShConstants.h" ConstantsStringList::ConstantsStringList() { m_index = 0; } int ConstantsStringList::add(const TCHAR *name, int value1, int value2) { int pos=SortedStringListND::add(name); if (pos == -1) return -1; constantstring *ptr = ((constantstring*) m_gr.get()) + pos; ptr->index = m_index; ptr->pos = pos; ptr->value1 = value1; ptr->value2 = value2; int temp = m_index; m_index++; return temp; } int ConstantsStringList::get(const TCHAR *name, int n_chars /*= -1*/) { int v=SortedStringListND::find(name, n_chars); if (v==-1) return -1; return (((struct constantstring*) m_gr.get())[v].index); } int ConstantsStringList::getnum() { return m_index; } int ConstantsStringList::get_value1(int idx) { int pos=get_internal_idx(idx); if (pos==-1) return -1; return (((struct constantstring*) m_gr.get())[pos].value1); } int ConstantsStringList::get_value2(int idx) { int pos=get_internal_idx(idx); if (pos==-1) return -1; return (((struct constantstring*) m_gr.get())[pos].value2); } TCHAR* ConstantsStringList::idx2name(int idx) { int pos=get_internal_idx(idx); if (pos==-1) return NULL; struct constantstring *data=(struct constantstring *) m_gr.get(); return ((TCHAR*) m_strings.get() + data[pos].name); } int ConstantsStringList::get_internal_idx(int idx) { struct constantstring *data=(struct constantstring *) m_gr.get(); // We do a linear search because the strings are sorted. for (int i = 0; i < m_index; i++) { if (data[i].index == idx) { return i; } } return -1; } bool ConstantsStringList::set_values(const TCHAR *name, int val1, int val2) { int v = SortedStringListND::find(name, -1); if (-1 == v) return false; struct constantstring & cs = ((struct constantstring*) m_gr.get())[v]; cs.value1 = val1; cs.value2 = val2; return true; } nsis-3.11/Source/ShConstants.h000077500000000000000000000021131477201124000162700ustar00rootroot00000000000000/* * ShConstants.h * * This file is a part of NSIS. * * Copyright (C) 2003 Ramon * Copyright (C) 2003-2025 NSIS Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #ifndef ___CONSTANTS___H_____ #define ___CONSTANTS___H_____ #include "strlist.h" struct constantstring { int name; int index; int pos; int value1; int value2; }; class ConstantsStringList : public SortedStringListND { public: ConstantsStringList(); int add(const TCHAR *name, int value1, int value2); int get(const TCHAR *name, int n_chars = -1); int getnum(); int get_value1(int idx); int get_value2(int idx); TCHAR *idx2name(int idx); bool set_values(const TCHAR *name, int val1, int val2); private: int m_index; int get_internal_idx(int idx); }; #endif nsis-3.11/Source/Tests/000077500000000000000000000000001477201124000147525ustar00rootroot00000000000000nsis-3.11/Source/Tests/DialogTemplate.cpp000077500000000000000000000027551477201124000203650ustar00rootroot00000000000000#include #include "../DialogTemplate.h" #include class CDialogTemplateTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( CDialogTemplateTest ); CPPUNIT_TEST( testCorrectness ); CPPUNIT_TEST_SUITE_END(); public: void testCorrectness() { const bool unicode_classes = false; unsigned char original_dialog[184] = { 1, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 72, 4, 0, 64, 3, 0, 0, 0, 0, 0, 10, 1, 130, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 1, 77, 0, 83, 0, 32, 0, 83, 0, 104, 0, 101, 0, 108, 0, 108, 0, 32, 0, 68, 0, 108, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 80, 0, 0, 0, 0, 22, 0, 20, 0, 7, 4, 0, 0, 255, 255, 130, 0, 255, 255, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 25, 0, 0, 0, 241, 0, 23, 0, 238, 3, 0, 0, 255, 255, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 161, 80, 0, 0, 24, 0, 10, 1, 105, 0, 232, 3, 0, 0, 82, 0, 105, 0, 99, 0, 104, 0, 69, 0, 100, 0, 105, 0, 116, 0, 50, 0, 48, 0, 65, 0, 0, 0, 0, 0, 0, 0 }; CDialogTemplate dt(original_dialog, unicode_classes, 1252); DWORD dwSize; unsigned char *saved_dialog = dt.Save(dwSize); CPPUNIT_ASSERT_EQUAL( (DWORD) sizeof(original_dialog), dwSize ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(saved_dialog, original_dialog, dwSize) ); dt.FreeSavedTemplate(saved_dialog); } }; CPPUNIT_TEST_SUITE_REGISTRATION( CDialogTemplateTest ); nsis-3.11/Source/Tests/Platform.cpp000077500000000000000000000027651477201124000172570ustar00rootroot00000000000000#include #include "../Platform.h" #include "../tchar.h" #include "../util.h" class PlatformTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( PlatformTest ); CPPUNIT_TEST( testCore ); CPPUNIT_TEST( testCoreString ); CPPUNIT_TEST( testCoreMath ); CPPUNIT_TEST_SUITE_END(); public: void testCore() { CPPUNIT_ASSERT(sizeof(WINWCHAR) == 2); CPPUNIT_ASSERT(sizeof(wchar_t) >= sizeof(WINWCHAR)); } void testCoreString() { TCHAR tbuf[42]; CPPUNIT_ASSERT(3 == my_strncpy(tbuf, _T("abc"), 4) && tbuf[2] == _T('c') && tbuf[3] == _T('\0')); CPPUNIT_ASSERT(2 == my_strncpy(tbuf, _T("abc"), 3) && tbuf[1] == _T('b') && tbuf[2] == _T('\0')); CPPUNIT_ASSERT(ChIsHex('f')); CPPUNIT_ASSERT(ChIsHex('F')); CPPUNIT_ASSERT(ChIsHex(L'f')); CPPUNIT_ASSERT(ChIsHex(L'F')); } void testCoreMath() { unsigned int ut; CPPUNIT_ASSERT(ui_add(ut, 0, 0) != false); CPPUNIT_ASSERT(ui_add(ut, UINT_MAX, 0) != false && ut == UINT_MAX); CPPUNIT_ASSERT(ui_add(ut, UINT_MAX, 1) == false); int st; CPPUNIT_ASSERT(si_add(st, 0, 0) != false); CPPUNIT_ASSERT(si_add(st, INT_MAX, 0) != false && st == INT_MAX); CPPUNIT_ASSERT(si_add(st, INT_MAX, 1) == false); CPPUNIT_ASSERT(si_add(st, INT_MAX, -1) != false); CPPUNIT_ASSERT(si_add(st, INT_MIN, 0) != false); CPPUNIT_ASSERT(si_add(st, INT_MIN, 1) != false); CPPUNIT_ASSERT(si_add(st, INT_MIN, -1) == false); } }; CPPUNIT_TEST_SUITE_REGISTRATION( PlatformTest ); nsis-3.11/Source/Tests/ResourceEditor.cpp000077500000000000000000001071051477201124000204230ustar00rootroot00000000000000#include #include "../ResourceEditor.h" #include extern unsigned char original_pe[8704]; class CResourceEditorTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( CResourceEditorTest ); CPPUNIT_TEST( testCorrectness ); CPPUNIT_TEST( testBMP ); CPPUNIT_TEST_SUITE_END(); public: enum { defnameid = 1337, deflangid = 1033 }; void testCorrectness() { unsigned char not_pe[] = { 'M', 'Z', 0 }; CPPUNIT_ASSERT( !CResourceEditor::CanOpen(not_pe, sizeof(not_pe)) ); CPPUNIT_ASSERT( CResourceEditor::IsResProtocol(_T("res:")) == 0 ); CPPUNIT_ASSERT( CResourceEditor::IsResProtocol(_T("res://")) == 6 ); CPPUNIT_ASSERT( CResourceEditor::IsResProtocol(_T("RES://")) == 6 ); CPPUNIT_ASSERT( CResourceEditor::IsResProtocol(_T("res://abc")) == 6 ); CPPUNIT_ASSERT( CResourceEditor::IsResProtocol(_T("rez://abc")) == 0 ); CResourceEditor re(original_pe, sizeof(original_pe)); DWORD size; // get size size = re.Save(NULL, size); unsigned char *saved_pe = new unsigned char[size]; // save int rc = re.Save(saved_pe, size); CPPUNIT_ASSERT_EQUAL( rc, 0 ); // compare CPPUNIT_ASSERT_EQUAL( (DWORD) sizeof(original_pe), size ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(saved_pe, original_pe, size) ); delete [] saved_pe; } void testBMP() { CResourceEditor re(original_pe, sizeof(original_pe)); static const BYTE file_12_4bpp [] = { // BMP with the old header 66,77,134,0,0,0,0,0,0,0,74,0,0,0,12,0,0,0,19,0,5,0,1,0,4,0,222,24,0,74,74,74,0,255,0,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,2,34,2,0,2,32,0,32,0,32,0,0,2,32,2,34,32,34,2,34, 34,0,0,0,2,2,2,32,2,34,2,34,0,32,0,0,0,34,2,2,34,34,2,32,34,32,0,0,2,34,2,32,0,32,0,34,0,0,0,0 }; bool succ; int ressize, bmpfilehdrsize = 14; BYTE *resdata; CPPUNIT_ASSERT( (succ = re.UpdateResource(RT_BITMAP, defnameid, deflangid, (BYTE*) file_12_4bpp, sizeof(file_12_4bpp), CResourceEditor::TM_AUTO)) ); if (succ) { ressize = re.GetResourceSize(RT_BITMAP, defnameid, deflangid); CPPUNIT_ASSERT( ressize == sizeof(file_12_4bpp) - bmpfilehdrsize ); if ((resdata = re.GetResource(RT_BITMAP, defnameid, deflangid))) { CPPUNIT_ASSERT_EQUAL( 0, memcmp(resdata, file_12_4bpp + bmpfilehdrsize, ressize) ); re.FreeResource(resdata); } } } }; CPPUNIT_TEST_SUITE_REGISTRATION( CResourceEditorTest ); unsigned char original_pe[8704] = { 77, 90, 144, 0, 3, 0, 0, 0, 4, 0, 0, 0, 255, 255, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 64, 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, 200, 0, 0, 0, 14, 31, 186, 14, 0, 180, 9, 205, 33, 184, 1, 76, 205, 33, 84, 104, 105, 115, 32, 112, 114, 111, 103, 114, 97, 109, 32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 32, 114, 117, 110, 32, 105, 110, 32, 68, 79, 83, 32, 109, 111, 100, 101, 46, 13, 13, 10, 36, 0, 0, 0, 0, 0, 0, 0, 252, 249, 48, 199, 184, 152, 94, 148, 184, 152, 94, 148, 184, 152, 94, 148, 184, 152, 95, 148, 168, 152, 94, 148, 59, 144, 3, 148, 189, 152, 94, 148, 236, 187, 111, 148, 185, 152, 94, 148, 127, 158, 88, 148, 185, 152, 94, 148, 82, 105, 99, 104, 184, 152, 94, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 69, 0, 0, 76, 1, 4, 0, 86, 34, 23, 68, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 15, 1, 11, 1, 6, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 126, 18, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 0, 64, 0, 0, 16, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 32, 0, 0, 60, 0, 0, 0, 0, 80, 0, 0, 168, 3, 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, 32, 0, 0, 72, 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, 46, 116, 101, 120, 116, 0, 0, 0, 160, 2, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 96, 46, 114, 100, 97, 116, 97, 0, 0, 240, 1, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 46, 100, 97, 116, 97, 0, 0, 0, 100, 18, 0, 0, 0, 48, 0, 0, 0, 20, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 192, 46, 114, 115, 114, 99, 0, 0, 0, 168, 3, 0, 0, 0, 80, 0, 0, 0, 4, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 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, 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, 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, 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, 139, 68, 36, 8, 129, 236, 12, 2, 0, 0, 45, 16, 1, 0, 0, 83, 85, 86, 87, 15, 132, 234, 1, 0, 0, 72, 15, 133, 79, 2, 0, 0, 139, 132, 36, 40, 2, 0, 0, 102, 61, 2, 0, 117, 28, 51, 219, 83, 255, 180, 36, 36, 2, 0, 0, 255, 21, 60, 32, 64, 0, 83, 255, 21, 56, 32, 64, 0, 233, 38, 2, 0, 0, 139, 200, 193, 233, 16, 102, 131, 249, 1, 15, 133, 178, 0, 0, 0, 51, 219, 190, 71, 1, 0, 0, 83, 83, 189, 234, 3, 0, 0, 86, 85, 255, 180, 36, 48, 2, 0, 0, 255, 21, 52, 32, 64, 0, 131, 248, 255, 15, 132, 241, 1, 0, 0, 83, 83, 191, 233, 3, 0, 0, 86, 87, 255, 180, 36, 48, 2, 0, 0, 255, 21, 52, 32, 64, 0, 131, 248, 255, 15, 132, 210, 1, 0, 0, 83, 83, 86, 87, 255, 180, 36, 48, 2, 0, 0, 139, 61, 52, 32, 64, 0, 255, 215, 15, 183, 4, 197, 104, 50, 64, 0, 83, 83, 86, 85, 255, 180, 36, 48, 2, 0, 0, 193, 224, 10, 137, 68, 36, 36, 255, 215, 15, 183, 4, 197, 0, 48, 64, 0, 139, 76, 36, 16, 11, 200, 141, 68, 36, 28, 81, 104, 84, 66, 64, 0, 80, 255, 21, 48, 32, 64, 0, 131, 196, 12, 141, 68, 36, 28, 80, 104, 235, 3, 0, 0, 255, 180, 36, 40, 2, 0, 0, 255, 21, 44, 32, 64, 0, 233, 101, 1, 0, 0, 102, 61, 1, 0, 15, 133, 91, 1, 0, 0, 51, 219, 190, 71, 1, 0, 0, 83, 83, 189, 234, 3, 0, 0, 86, 85, 255, 180, 36, 48, 2, 0, 0, 255, 21, 52, 32, 64, 0, 131, 248, 255, 15, 132, 53, 1, 0, 0, 83, 83, 191, 233, 3, 0, 0, 86, 87, 255, 180, 36, 48, 2, 0, 0, 255, 21, 52, 32, 64, 0, 131, 248, 255, 15, 132, 22, 1, 0, 0, 106, 16, 106, 2, 255, 21, 4, 32, 64, 0, 59, 195, 137, 68, 36, 16, 15, 132, 0, 1, 0, 0, 80, 255, 21, 0, 32, 64, 0, 83, 83, 86, 87, 255, 180, 36, 48, 2, 0, 0, 139, 61, 52, 32, 64, 0, 137, 68, 36, 44, 255, 215, 15, 183, 4, 197, 104, 50, 64, 0, 83, 83, 86, 85, 255, 180, 36, 48, 2, 0, 0, 193, 224, 10, 137, 68, 36, 40, 255, 215, 15, 183, 4, 197, 0, 48, 64, 0, 139, 76, 36, 20, 11, 200, 81, 104, 80, 66, 64, 0, 255, 116, 36, 32, 255, 21, 48, 32, 64, 0, 131, 196, 12, 255, 116, 36, 16, 255, 21, 16, 32, 64, 0, 255, 180, 36, 32, 2, 0, 0, 255, 21, 40, 32, 64, 0, 133, 192, 15, 132, 134, 0, 0, 0, 255, 21, 36, 32, 64, 0, 255, 116, 36, 16, 106, 1, 255, 21, 32, 32, 64, 0, 255, 21, 28, 32, 64, 0, 235, 108, 51, 219, 83, 83, 104, 128, 0, 0, 0, 255, 180, 36, 44, 2, 0, 0, 255, 21, 24, 32, 64, 0, 139, 53, 52, 32, 64, 0, 51, 255, 189, 234, 3, 0, 0, 255, 183, 4, 48, 64, 0, 83, 104, 67, 1, 0, 0, 85, 255, 180, 36, 48, 2, 0, 0, 255, 214, 131, 199, 8, 129, 255, 104, 2, 0, 0, 114, 223, 51, 237, 191, 233, 3, 0, 0, 255, 181, 108, 50, 64, 0, 83, 104, 67, 1, 0, 0, 87, 255, 180, 36, 48, 2, 0, 0, 255, 214, 131, 197, 8, 129, 253, 224, 2, 0, 0, 114, 223, 95, 94, 93, 51, 192, 91, 129, 196, 12, 2, 0, 0, 194, 16, 0, 106, 0, 104, 0, 16, 64, 0, 106, 0, 106, 101, 106, 0, 255, 21, 12, 32, 64, 0, 80, 255, 21, 64, 32, 64, 0, 106, 0, 255, 21, 8, 32, 64, 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, 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, 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, 220, 32, 0, 0, 234, 32, 0, 0, 248, 32, 0, 0, 6, 33, 0, 0, 204, 32, 0, 0, 0, 0, 0, 0, 40, 33, 0, 0, 56, 33, 0, 0, 74, 33, 0, 0, 94, 33, 0, 0, 112, 33, 0, 0, 128, 33, 0, 0, 146, 33, 0, 0, 158, 33, 0, 0, 180, 33, 0, 0, 198, 33, 0, 0, 210, 33, 0, 0, 0, 0, 0, 0, 132, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 33, 0, 0, 0, 32, 0, 0, 156, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 33, 0, 0, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 32, 0, 0, 234, 32, 0, 0, 248, 32, 0, 0, 6, 33, 0, 0, 204, 32, 0, 0, 0, 0, 0, 0, 40, 33, 0, 0, 56, 33, 0, 0, 74, 33, 0, 0, 94, 33, 0, 0, 112, 33, 0, 0, 128, 33, 0, 0, 146, 33, 0, 0, 158, 33, 0, 0, 180, 33, 0, 0, 198, 33, 0, 0, 210, 33, 0, 0, 0, 0, 0, 0, 0, 2, 71, 108, 111, 98, 97, 108, 85, 110, 108, 111, 99, 107, 0, 0, 249, 1, 71, 108, 111, 98, 97, 108, 76, 111, 99, 107, 0, 0, 238, 1, 71, 108, 111, 98, 97, 108, 65, 108, 108, 111, 99, 0, 175, 0, 69, 120, 105, 116, 80, 114, 111, 99, 101, 115, 115, 0, 119, 1, 71, 101, 116, 77, 111, 100, 117, 108, 101, 72, 97, 110, 100, 108, 101, 65, 0, 0, 75, 69, 82, 78, 69, 76, 51, 50, 46, 100, 108, 108, 0, 0, 58, 2, 83, 101, 110, 100, 77, 101, 115, 115, 97, 103, 101, 65, 0, 0, 66, 0, 67, 108, 111, 115, 101, 67, 108, 105, 112, 98, 111, 97, 114, 100, 0, 0, 73, 2, 83, 101, 116, 67, 108, 105, 112, 98, 111, 97, 114, 100, 68, 97, 116, 97, 0, 0, 193, 0, 69, 109, 112, 116, 121, 67, 108, 105, 112, 98, 111, 97, 114, 100, 0, 0, 245, 1, 79, 112, 101, 110, 67, 108, 105, 112, 98, 111, 97, 114, 100, 0, 82, 2, 83, 101, 116, 68, 108, 103, 73, 116, 101, 109, 84, 101, 120, 116, 65, 0, 213, 2, 119, 115, 112, 114, 105, 110, 116, 102, 65, 0, 53, 2, 83, 101, 110, 100, 68, 108, 103, 73, 116, 101, 109, 77, 101, 115, 115, 97, 103, 101, 65, 0, 3, 2, 80, 111, 115, 116, 81, 117, 105, 116, 77, 101, 115, 115, 97, 103, 101, 0, 198, 0, 69, 110, 100, 68, 105, 97, 108, 111, 103, 0, 158, 0, 68, 105, 97, 108, 111, 103, 66, 111, 120, 80, 97, 114, 97, 109, 65, 0, 85, 83, 69, 82, 51, 50, 46, 100, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 66, 64, 0, 127, 0, 0, 0, 48, 66, 64, 0, 54, 0, 0, 0, 32, 66, 64, 0, 28, 0, 0, 0, 16, 66, 64, 0, 1, 0, 0, 0, 4, 66, 64, 0, 43, 0, 0, 0, 244, 65, 64, 0, 77, 0, 0, 0, 228, 65, 64, 0, 44, 0, 0, 0, 216, 65, 64, 0, 45, 0, 0, 0, 204, 65, 64, 0, 35, 0, 0, 0, 188, 65, 64, 0, 69, 0, 0, 0, 172, 65, 64, 0, 2, 0, 0, 0, 156, 65, 64, 0, 3, 0, 0, 0, 140, 65, 64, 0, 4, 0, 0, 0, 124, 65, 64, 0, 26, 0, 0, 0, 108, 65, 64, 0, 5, 0, 0, 0, 96, 65, 64, 0, 6, 0, 0, 0, 84, 65, 64, 0, 101, 0, 0, 0, 72, 65, 64, 0, 19, 0, 0, 0, 60, 65, 64, 0, 9, 0, 0, 0, 44, 65, 64, 0, 37, 0, 0, 0, 28, 65, 64, 0, 56, 0, 0, 0, 12, 65, 64, 0, 41, 0, 0, 0, 0, 65, 64, 0, 11, 0, 0, 0, 240, 64, 64, 0, 12, 0, 0, 0, 228, 64, 64, 0, 86, 0, 0, 0, 212, 64, 64, 0, 55, 0, 0, 0, 196, 64, 64, 0, 7, 0, 0, 0, 184, 64, 64, 0, 8, 0, 0, 0, 172, 64, 64, 0, 71, 0, 0, 0, 156, 64, 64, 0, 13, 0, 0, 0, 144, 64, 64, 0, 57, 0, 0, 0, 132, 64, 64, 0, 14, 0, 0, 0, 116, 64, 64, 0, 15, 0, 0, 0, 100, 64, 64, 0, 33, 0, 0, 0, 84, 64, 64, 0, 16, 0, 0, 0, 68, 64, 64, 0, 17, 0, 0, 0, 52, 64, 64, 0, 75, 0, 0, 0, 36, 64, 64, 0, 96, 0, 0, 0, 20, 64, 64, 0, 63, 0, 0, 0, 8, 64, 64, 0, 87, 0, 0, 0, 248, 63, 64, 0, 18, 0, 0, 0, 236, 63, 64, 0, 64, 0, 0, 0, 224, 63, 64, 0, 38, 0, 0, 0, 208, 63, 64, 0, 39, 0, 0, 0, 192, 63, 64, 0, 47, 0, 0, 0, 176, 63, 64, 0, 62, 0, 0, 0, 164, 63, 64, 0, 76, 0, 0, 0, 148, 63, 64, 0, 88, 0, 0, 0, 132, 63, 64, 0, 78, 0, 0, 0, 116, 63, 64, 0, 80, 0, 0, 0, 100, 63, 64, 0, 97, 0, 0, 0, 88, 63, 64, 0, 20, 0, 0, 0, 72, 63, 64, 0, 72, 0, 0, 0, 60, 63, 64, 0, 21, 0, 0, 0, 48, 63, 64, 0, 22, 0, 0, 0, 32, 63, 64, 0, 70, 0, 0, 0, 16, 63, 64, 0, 24, 0, 0, 0, 0, 63, 64, 0, 25, 0, 0, 0, 240, 62, 64, 0, 79, 0, 0, 0, 224, 62, 64, 0, 26, 0, 0, 0, 208, 62, 64, 0, 89, 0, 0, 0, 196, 62, 64, 0, 27, 0, 0, 0, 184, 62, 64, 0, 36, 0, 0, 0, 168, 62, 64, 0, 10, 0, 0, 0, 152, 62, 64, 0, 65, 0, 0, 0, 136, 62, 64, 0, 29, 0, 0, 0, 120, 62, 64, 0, 90, 0, 0, 0, 108, 62, 64, 0, 73, 0, 0, 0, 96, 62, 64, 0, 68, 0, 0, 0, 84, 62, 64, 0, 74, 0, 0, 0, 72, 62, 64, 0, 30, 0, 0, 0, 60, 62, 64, 0, 31, 0, 0, 0, 44, 62, 64, 0, 34, 0, 0, 0, 28, 62, 64, 0, 32, 0, 0, 0, 16, 62, 64, 0, 67, 0, 0, 0, 4, 62, 64, 0, 42, 0, 0, 0, 244, 61, 64, 0, 0, 0, 0, 0, 228, 61, 64, 0, 1, 0, 0, 0, 212, 61, 64, 0, 2, 0, 0, 0, 192, 61, 64, 0, 1, 0, 0, 0, 164, 61, 64, 0, 2, 0, 0, 0, 144, 61, 64, 0, 3, 0, 0, 0, 120, 61, 64, 0, 4, 0, 0, 0, 96, 61, 64, 0, 5, 0, 0, 0, 72, 61, 64, 0, 6, 0, 0, 0, 48, 61, 64, 0, 7, 0, 0, 0, 24, 61, 64, 0, 8, 0, 0, 0, 4, 61, 64, 0, 9, 0, 0, 0, 236, 60, 64, 0, 10, 0, 0, 0, 212, 60, 64, 0, 11, 0, 0, 0, 188, 60, 64, 0, 12, 0, 0, 0, 164, 60, 64, 0, 13, 0, 0, 0, 140, 60, 64, 0, 14, 0, 0, 0, 120, 60, 64, 0, 15, 0, 0, 0, 96, 60, 64, 0, 16, 0, 0, 0, 72, 60, 64, 0, 1, 0, 0, 0, 52, 60, 64, 0, 2, 0, 0, 0, 28, 60, 64, 0, 1, 0, 0, 0, 0, 60, 64, 0, 2, 0, 0, 0, 228, 59, 64, 0, 3, 0, 0, 0, 200, 59, 64, 0, 4, 0, 0, 0, 172, 59, 64, 0, 5, 0, 0, 0, 148, 59, 64, 0, 1, 0, 0, 0, 132, 59, 64, 0, 2, 0, 0, 0, 108, 59, 64, 0, 1, 0, 0, 0, 88, 59, 64, 0, 2, 0, 0, 0, 68, 59, 64, 0, 3, 0, 0, 0, 48, 59, 64, 0, 4, 0, 0, 0, 28, 59, 64, 0, 5, 0, 0, 0, 8, 59, 64, 0, 6, 0, 0, 0, 240, 58, 64, 0, 7, 0, 0, 0, 208, 58, 64, 0, 8, 0, 0, 0, 184, 58, 64, 0, 9, 0, 0, 0, 156, 58, 64, 0, 10, 0, 0, 0, 132, 58, 64, 0, 11, 0, 0, 0, 104, 58, 64, 0, 12, 0, 0, 0, 76, 58, 64, 0, 13, 0, 0, 0, 48, 58, 64, 0, 1, 0, 0, 0, 32, 58, 64, 0, 2, 0, 0, 0, 8, 58, 64, 0, 3, 0, 0, 0, 240, 57, 64, 0, 4, 0, 0, 0, 216, 57, 64, 0, 5, 0, 0, 0, 188, 57, 64, 0, 6, 0, 0, 0, 164, 57, 64, 0, 1, 0, 0, 0, 148, 57, 64, 0, 2, 0, 0, 0, 124, 57, 64, 0, 3, 0, 0, 0, 100, 57, 64, 0, 4, 0, 0, 0, 72, 57, 64, 0, 5, 0, 0, 0, 40, 57, 64, 0, 1, 0, 0, 0, 24, 57, 64, 0, 2, 0, 0, 0, 0, 57, 64, 0, 2, 0, 0, 0, 232, 56, 64, 0, 1, 0, 0, 0, 216, 56, 64, 0, 1, 0, 0, 0, 196, 56, 64, 0, 1, 0, 0, 0, 172, 56, 64, 0, 2, 0, 0, 0, 140, 56, 64, 0, 2, 0, 0, 0, 116, 56, 64, 0, 1, 0, 0, 0, 88, 56, 64, 0, 2, 0, 0, 0, 60, 56, 64, 0, 2, 0, 0, 0, 40, 56, 64, 0, 1, 0, 0, 0, 8, 56, 64, 0, 2, 0, 0, 0, 240, 55, 64, 0, 3, 0, 0, 0, 212, 55, 64, 0, 1, 0, 0, 0, 196, 55, 64, 0, 2, 0, 0, 0, 172, 55, 64, 0, 3, 0, 0, 0, 148, 55, 64, 0, 4, 0, 0, 0, 120, 55, 64, 0, 5, 0, 0, 0, 92, 55, 64, 0, 6, 0, 0, 0, 68, 55, 64, 0, 7, 0, 0, 0, 32, 55, 64, 0, 8, 0, 0, 0, 4, 55, 64, 0, 9, 0, 0, 0, 232, 54, 64, 0, 10, 0, 0, 0, 208, 54, 64, 0, 11, 0, 0, 0, 180, 54, 64, 0, 12, 0, 0, 0, 156, 54, 64, 0, 13, 0, 0, 0, 132, 54, 64, 0, 14, 0, 0, 0, 108, 54, 64, 0, 15, 0, 0, 0, 80, 54, 64, 0, 16, 0, 0, 0, 56, 54, 64, 0, 17, 0, 0, 0, 28, 54, 64, 0, 18, 0, 0, 0, 0, 54, 64, 0, 19, 0, 0, 0, 228, 53, 64, 0, 20, 0, 0, 0, 200, 53, 64, 0, 1, 0, 0, 0, 184, 53, 64, 0, 2, 0, 0, 0, 160, 53, 64, 0, 1, 0, 0, 0, 136, 53, 64, 0, 2, 0, 0, 0, 116, 53, 64, 0, 1, 0, 0, 0, 96, 53, 64, 0, 2, 0, 0, 0, 72, 53, 64, 0, 83, 85, 66, 76, 65, 78, 71, 95, 85, 90, 66, 69, 75, 95, 67, 89, 82, 73, 76, 76, 73, 67, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 85, 90, 66, 69, 75, 95, 76, 65, 84, 73, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 85, 82, 68, 85, 95, 73, 78, 68, 73, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 85, 82, 68, 85, 95, 80, 65, 75, 73, 83, 84, 65, 78, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 87, 69, 68, 73, 83, 72, 95, 70, 73, 78, 76, 65, 78, 68, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 87, 69, 68, 73, 83, 72, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 80, 85, 69, 82, 84, 79, 95, 82, 73, 67, 79, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 78, 73, 67, 65, 82, 65, 71, 85, 65, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 72, 79, 78, 68, 85, 82, 65, 83, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 69, 76, 95, 83, 65, 76, 86, 65, 68, 79, 82, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 66, 79, 76, 73, 86, 73, 65, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 80, 65, 82, 65, 71, 85, 65, 89, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 85, 82, 85, 71, 85, 65, 89, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 67, 72, 73, 76, 69, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 69, 67, 85, 65, 68, 79, 82, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 65, 82, 71, 69, 78, 84, 73, 78, 65, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 80, 69, 82, 85, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 67, 79, 76, 79, 77, 66, 73, 65, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 86, 69, 78, 69, 90, 85, 69, 76, 65, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 68, 79, 77, 73, 78, 73, 67, 65, 78, 95, 82, 69, 80, 85, 66, 76, 73, 67, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 80, 65, 78, 65, 77, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 67, 79, 83, 84, 65, 95, 82, 73, 67, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 71, 85, 65, 84, 69, 77, 65, 76, 65, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 77, 79, 68, 69, 82, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 95, 77, 69, 88, 73, 67, 65, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 69, 82, 66, 73, 65, 78, 95, 67, 89, 82, 73, 76, 76, 73, 67, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 69, 82, 66, 73, 65, 78, 95, 76, 65, 84, 73, 78, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 80, 79, 82, 84, 85, 71, 85, 69, 83, 69, 95, 66, 82, 65, 90, 73, 76, 73, 65, 78, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 80, 79, 82, 84, 85, 71, 85, 69, 83, 69, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 78, 79, 82, 87, 69, 71, 73, 65, 78, 95, 78, 89, 78, 79, 82, 83, 75, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 78, 79, 82, 87, 69, 71, 73, 65, 78, 95, 66, 79, 75, 77, 65, 76, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 78, 69, 80, 65, 76, 73, 95, 73, 78, 68, 73, 65, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 77, 65, 76, 65, 89, 95, 66, 82, 85, 78, 69, 73, 95, 68, 65, 82, 85, 83, 83, 65, 76, 65, 77, 0, 83, 85, 66, 76, 65, 78, 71, 95, 77, 65, 76, 65, 89, 95, 77, 65, 76, 65, 89, 83, 73, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 76, 73, 84, 72, 85, 65, 78, 73, 65, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 75, 79, 82, 69, 65, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 75, 65, 83, 72, 77, 73, 82, 73, 95, 73, 78, 68, 73, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 73, 84, 65, 76, 73, 65, 78, 95, 83, 87, 73, 83, 83, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 73, 84, 65, 76, 73, 65, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 71, 69, 82, 77, 65, 78, 95, 76, 73, 69, 67, 72, 84, 69, 78, 83, 84, 69, 73, 78, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 71, 69, 82, 77, 65, 78, 95, 76, 85, 88, 69, 77, 66, 79, 85, 82, 71, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 71, 69, 82, 77, 65, 78, 95, 65, 85, 83, 84, 82, 73, 65, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 71, 69, 82, 77, 65, 78, 95, 83, 87, 73, 83, 83, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 71, 69, 82, 77, 65, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 95, 77, 79, 78, 65, 67, 79, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 95, 76, 85, 88, 69, 77, 66, 79, 85, 82, 71, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 95, 83, 87, 73, 83, 83, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 95, 67, 65, 78, 65, 68, 73, 65, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 95, 66, 69, 76, 71, 73, 65, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 80, 72, 73, 76, 73, 80, 80, 73, 78, 69, 83, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 90, 73, 77, 66, 65, 66, 87, 69, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 84, 82, 73, 78, 73, 68, 65, 68, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 66, 69, 76, 73, 90, 69, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 67, 65, 82, 73, 66, 66, 69, 65, 78, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 74, 65, 77, 65, 73, 67, 65, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 83, 79, 85, 84, 72, 95, 65, 70, 82, 73, 67, 65, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 69, 73, 82, 69, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 78, 90, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 67, 65, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 65, 85, 83, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 85, 75, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 95, 85, 83, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 68, 85, 84, 67, 72, 95, 66, 69, 76, 71, 73, 65, 78, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 68, 85, 84, 67, 72, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 67, 72, 73, 78, 69, 83, 69, 95, 77, 65, 67, 65, 85, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 67, 72, 73, 78, 69, 83, 69, 95, 83, 73, 78, 71, 65, 80, 79, 82, 69, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 67, 72, 73, 78, 69, 83, 69, 95, 72, 79, 78, 71, 75, 79, 78, 71, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 67, 72, 73, 78, 69, 83, 69, 95, 83, 73, 77, 80, 76, 73, 70, 73, 69, 68, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 67, 72, 73, 78, 69, 83, 69, 95, 84, 82, 65, 68, 73, 84, 73, 79, 78, 65, 76, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 90, 69, 82, 73, 95, 67, 89, 82, 73, 76, 76, 73, 67, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 90, 69, 82, 73, 95, 76, 65, 84, 73, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 81, 65, 84, 65, 82, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 66, 65, 72, 82, 65, 73, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 85, 65, 69, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 75, 85, 87, 65, 73, 84, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 76, 69, 66, 65, 78, 79, 78, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 74, 79, 82, 68, 65, 78, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 83, 89, 82, 73, 65, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 89, 69, 77, 69, 78, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 79, 77, 65, 78, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 84, 85, 78, 73, 83, 73, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 77, 79, 82, 79, 67, 67, 79, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 65, 76, 71, 69, 82, 73, 65, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 76, 73, 66, 89, 65, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 69, 71, 89, 80, 84, 0, 0, 0, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 73, 82, 65, 81, 0, 83, 85, 66, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 95, 83, 65, 85, 68, 73, 95, 65, 82, 65, 66, 73, 65, 0, 83, 85, 66, 76, 65, 78, 71, 95, 83, 89, 83, 95, 68, 69, 70, 65, 85, 76, 84, 0, 83, 85, 66, 76, 65, 78, 71, 95, 68, 69, 70, 65, 85, 76, 84, 0, 83, 85, 66, 76, 65, 78, 71, 95, 78, 69, 85, 84, 82, 65, 76, 0, 76, 65, 78, 71, 95, 86, 73, 69, 84, 78, 65, 77, 69, 83, 69, 0, 76, 65, 78, 71, 95, 85, 90, 66, 69, 75, 0, 0, 76, 65, 78, 71, 95, 85, 82, 68, 85, 0, 0, 0, 76, 65, 78, 71, 95, 85, 75, 82, 65, 73, 78, 73, 65, 78, 0, 0, 76, 65, 78, 71, 95, 84, 85, 82, 75, 73, 83, 72, 0, 0, 0, 0, 76, 65, 78, 71, 95, 84, 72, 65, 73, 0, 0, 0, 76, 65, 78, 71, 95, 84, 69, 76, 85, 71, 85, 0, 76, 65, 78, 71, 95, 84, 65, 84, 65, 82, 0, 0, 76, 65, 78, 71, 95, 84, 65, 77, 73, 76, 0, 0, 76, 65, 78, 71, 95, 83, 89, 82, 73, 65, 67, 0, 76, 65, 78, 71, 95, 83, 87, 69, 68, 73, 83, 72, 0, 0, 0, 0, 76, 65, 78, 71, 95, 83, 87, 65, 72, 73, 76, 73, 0, 0, 0, 0, 76, 65, 78, 71, 95, 83, 80, 65, 78, 73, 83, 72, 0, 0, 0, 0, 76, 65, 78, 71, 95, 83, 76, 79, 86, 69, 78, 73, 65, 78, 0, 0, 76, 65, 78, 71, 95, 83, 76, 79, 86, 65, 75, 0, 76, 65, 78, 71, 95, 83, 73, 78, 68, 72, 73, 0, 76, 65, 78, 71, 95, 83, 69, 82, 66, 73, 65, 78, 0, 0, 0, 0, 76, 65, 78, 71, 95, 83, 65, 78, 83, 75, 82, 73, 84, 0, 0, 0, 76, 65, 78, 71, 95, 82, 85, 83, 83, 73, 65, 78, 0, 0, 0, 0, 76, 65, 78, 71, 95, 82, 79, 77, 65, 78, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 80, 85, 78, 74, 65, 66, 73, 0, 0, 0, 0, 76, 65, 78, 71, 95, 80, 79, 82, 84, 85, 71, 85, 69, 83, 69, 0, 76, 65, 78, 71, 95, 80, 79, 76, 73, 83, 72, 0, 76, 65, 78, 71, 95, 79, 82, 73, 89, 65, 0, 0, 76, 65, 78, 71, 95, 78, 79, 82, 87, 69, 71, 73, 65, 78, 0, 0, 76, 65, 78, 71, 95, 78, 69, 80, 65, 76, 73, 0, 76, 65, 78, 71, 95, 77, 79, 78, 71, 79, 76, 73, 65, 78, 0, 0, 76, 65, 78, 71, 95, 77, 65, 82, 65, 84, 72, 73, 0, 0, 0, 0, 76, 65, 78, 71, 95, 77, 65, 78, 73, 80, 85, 82, 73, 0, 0, 0, 76, 65, 78, 71, 95, 77, 65, 76, 65, 89, 65, 76, 65, 77, 0, 0, 76, 65, 78, 71, 95, 77, 65, 76, 65, 89, 0, 0, 76, 65, 78, 71, 95, 77, 65, 67, 69, 68, 79, 78, 73, 65, 78, 0, 76, 65, 78, 71, 95, 76, 73, 84, 72, 85, 65, 78, 73, 65, 78, 0, 76, 65, 78, 71, 95, 76, 65, 84, 86, 73, 65, 78, 0, 0, 0, 0, 76, 65, 78, 71, 95, 75, 89, 82, 71, 89, 90, 0, 76, 65, 78, 71, 95, 75, 79, 82, 69, 65, 78, 0, 76, 65, 78, 71, 95, 75, 79, 78, 75, 65, 78, 73, 0, 0, 0, 0, 76, 65, 78, 71, 95, 75, 65, 90, 65, 75, 0, 0, 76, 65, 78, 71, 95, 75, 65, 83, 72, 77, 73, 82, 73, 0, 0, 0, 76, 65, 78, 71, 95, 75, 65, 78, 78, 65, 68, 65, 0, 0, 0, 0, 76, 65, 78, 71, 95, 74, 65, 80, 65, 78, 69, 83, 69, 0, 0, 0, 76, 65, 78, 71, 95, 73, 84, 65, 76, 73, 65, 78, 0, 0, 0, 0, 76, 65, 78, 71, 95, 73, 78, 68, 79, 78, 69, 83, 73, 65, 78, 0, 76, 65, 78, 71, 95, 73, 67, 69, 76, 65, 78, 68, 73, 67, 0, 0, 76, 65, 78, 71, 95, 72, 85, 78, 71, 65, 82, 73, 65, 78, 0, 0, 76, 65, 78, 71, 95, 72, 73, 78, 68, 73, 0, 0, 76, 65, 78, 71, 95, 72, 69, 66, 82, 69, 87, 0, 76, 65, 78, 71, 95, 71, 85, 74, 65, 82, 65, 84, 73, 0, 0, 0, 76, 65, 78, 71, 95, 71, 82, 69, 69, 75, 0, 0, 76, 65, 78, 71, 95, 71, 69, 82, 77, 65, 78, 0, 76, 65, 78, 71, 95, 71, 69, 79, 82, 71, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 71, 65, 76, 73, 67, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 70, 82, 69, 78, 67, 72, 0, 76, 65, 78, 71, 95, 70, 73, 78, 78, 73, 83, 72, 0, 0, 0, 0, 76, 65, 78, 71, 95, 70, 65, 82, 83, 73, 0, 0, 76, 65, 78, 71, 95, 70, 65, 69, 82, 79, 69, 83, 69, 0, 0, 0, 76, 65, 78, 71, 95, 69, 83, 84, 79, 78, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 69, 78, 71, 76, 73, 83, 72, 0, 0, 0, 0, 76, 65, 78, 71, 95, 68, 85, 84, 67, 72, 0, 0, 76, 65, 78, 71, 95, 68, 73, 86, 69, 72, 73, 0, 76, 65, 78, 71, 95, 68, 65, 78, 73, 83, 72, 0, 76, 65, 78, 71, 95, 67, 90, 69, 67, 72, 0, 0, 76, 65, 78, 71, 95, 67, 82, 79, 65, 84, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 67, 72, 73, 78, 69, 83, 69, 0, 0, 0, 0, 76, 65, 78, 71, 95, 67, 65, 84, 65, 76, 65, 78, 0, 0, 0, 0, 76, 65, 78, 71, 95, 66, 85, 76, 71, 65, 82, 73, 65, 78, 0, 0, 76, 65, 78, 71, 95, 66, 69, 78, 71, 65, 76, 73, 0, 0, 0, 0, 76, 65, 78, 71, 95, 66, 69, 76, 65, 82, 85, 83, 73, 65, 78, 0, 76, 65, 78, 71, 95, 66, 65, 83, 81, 85, 69, 0, 76, 65, 78, 71, 95, 65, 90, 69, 82, 73, 0, 0, 76, 65, 78, 71, 95, 65, 83, 83, 65, 77, 69, 83, 69, 0, 0, 0, 76, 65, 78, 71, 95, 65, 82, 77, 69, 78, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 65, 82, 65, 66, 73, 67, 0, 76, 65, 78, 71, 95, 65, 76, 66, 65, 78, 73, 65, 78, 0, 0, 0, 76, 65, 78, 71, 95, 65, 70, 82, 73, 75, 65, 65, 78, 83, 0, 0, 76, 65, 78, 71, 95, 73, 78, 86, 65, 82, 73, 65, 78, 84, 0, 0, 76, 65, 78, 71, 95, 78, 69, 85, 84, 82, 65, 76, 0, 0, 0, 0, 37, 117, 0, 0, 76, 97, 110, 103, 117, 97, 103, 101, 32, 73, 68, 58, 32, 37, 100, 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, 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, 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, 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, 2, 0, 5, 0, 0, 0, 32, 0, 0, 128, 24, 0, 0, 0, 56, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 101, 0, 0, 0, 80, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 104, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 4, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 4, 0, 0, 144, 0, 0, 0, 160, 80, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 81, 0, 0, 25, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 8, 200, 128, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 135, 0, 75, 0, 0, 0, 0, 0, 77, 0, 97, 0, 107, 0, 101, 0, 76, 0, 97, 0, 110, 0, 103, 0, 73, 0, 68, 0, 0, 0, 8, 0, 77, 0, 83, 0, 32, 0, 83, 0, 97, 0, 110, 0, 115, 0, 32, 0, 83, 0, 101, 0, 114, 0, 105, 0, 102, 0, 0, 0, 0, 0, 3, 0, 33, 80, 0, 0, 0, 0, 7, 0, 7, 0, 121, 0, 100, 0, 234, 3, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 3, 0, 33, 80, 0, 0, 0, 0, 7, 0, 24, 0, 121, 0, 100, 0, 233, 3, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 80, 0, 0, 0, 0, 78, 0, 54, 0, 50, 0, 14, 0, 1, 0, 255, 255, 128, 0, 67, 0, 111, 0, 112, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 0, 7, 0, 54, 0, 50, 0, 14, 0, 2, 0, 255, 255, 128, 0, 69, 0, 120, 0, 105, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 0, 0, 0, 0, 7, 0, 41, 0, 121, 0, 8, 0, 235, 3, 255, 255, 130, 0, 0, 0, 0, 0, 0, 0, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 32, 115, 116, 97, 110, 100, 97, 108, 111, 110, 101, 61, 34, 121, 101, 115, 34, 63, 62, 13, 10, 60, 97, 115, 115, 101, 109, 98, 108, 121, 32, 120, 109, 108, 110, 115, 61, 34, 117, 114, 110, 58, 115, 99, 104, 101, 109, 97, 115, 45, 109, 105, 99, 114, 111, 115, 111, 102, 116, 45, 99, 111, 109, 58, 97, 115, 109, 46, 118, 49, 34, 32, 109, 97, 110, 105, 102, 101, 115, 116, 86, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 62, 13, 10, 60, 97, 115, 115, 101, 109, 98, 108, 121, 73, 100, 101, 110, 116, 105, 116, 121, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 46, 48, 46, 48, 34, 32, 112, 114, 111, 99, 101, 115, 115, 111, 114, 65, 114, 99, 104, 105, 116, 101, 99, 116, 117, 114, 101, 61, 34, 88, 56, 54, 34, 32, 110, 97, 109, 101, 61, 34, 78, 117, 108, 108, 115, 111, 102, 116, 46, 78, 83, 73, 83, 46, 77, 97, 107, 101, 76, 97, 110, 103, 73, 100, 34, 32, 116, 121, 112, 101, 61, 34, 119, 105, 110, 51, 50, 34, 47, 62, 13, 10, 60, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 77, 97, 107, 101, 76, 97, 110, 103, 73, 100, 60, 47, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 13, 10, 60, 100, 101, 112, 101, 110, 100, 101, 110, 99, 121, 62, 13, 10, 60, 100, 101, 112, 101, 110, 100, 101, 110, 116, 65, 115, 115, 101, 109, 98, 108, 121, 62, 13, 10, 60, 97, 115, 115, 101, 109, 98, 108, 121, 73, 100, 101, 110, 116, 105, 116, 121, 32, 116, 121, 112, 101, 61, 34, 119, 105, 110, 51, 50, 34, 32, 110, 97, 109, 101, 61, 34, 77, 105, 99, 114, 111, 115, 111, 102, 116, 46, 87, 105, 110, 100, 111, 119, 115, 46, 67, 111, 109, 109, 111, 110, 45, 67, 111, 110, 116, 114, 111, 108, 115, 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 54, 46, 48, 46, 48, 46, 48, 34, 32, 112, 114, 111, 99, 101, 115, 115, 111, 114, 65, 114, 99, 104, 105, 116, 101, 99, 116, 117, 114, 101, 61, 34, 88, 56, 54, 34, 32, 112, 117, 98, 108, 105, 99, 75, 101, 121, 84, 111, 107, 101, 110, 61, 34, 54, 53, 57, 53, 98, 54, 52, 49, 52, 52, 99, 99, 102, 49, 100, 102, 34, 32, 108, 97, 110, 103, 117, 97, 103, 101, 61, 34, 42, 34, 32, 47, 62, 13, 10, 60, 47, 100, 101, 112, 101, 110, 100, 101, 110, 116, 65, 115, 115, 101, 109, 98, 108, 121, 62, 13, 10, 60, 47, 100, 101, 112, 101, 110, 100, 101, 110, 99, 121, 62, 13, 10, 60, 47, 97, 115, 115, 101, 109, 98, 108, 121, 62, 13, 10, 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 }; nsis-3.11/Source/Tests/SConscript000077500000000000000000000062021477201124000167670ustar00rootroot00000000000000target = 'test' tests = Split(""" compression.cpp decompress.cpp DialogTemplate.cpp endian.cpp mmap.cpp Platform.cpp ResourceEditor.cpp specmatch.cpp textrunner.cpp winchar.cpp """) required = Split(""" DialogTemplate.cpp dirreader.cpp growbuf.cpp mmap.cpp BinInterop.cpp ResourceEditor.cpp util.cpp winchar.cpp """) required_exehead = Split(""" Tests/memcpy.c """) lzma_files = Split(""" clzma.cpp 7zip/7zGuids.cpp 7zip/7zip/Common/OutBuffer.cpp 7zip/7zip/Common/StreamUtils.cpp 7zip/7zip/Compress/LZ/LZInWindow.cpp 7zip/7zip/Compress/LZMA/LZMAEncoder.cpp 7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp 7zip/Common/Alloc.cpp 7zip/Common/CRC.cpp 7zip/LZMADecode.c """) required += lzma_files bzip2_files = Split(""" bzip2/blocksort.c bzip2/bzlib.c bzip2/compress.c bzip2/huffman.c """) bzip2_exehead_files = Split(""" bzip2/bzlib.c bzip2/decompress.c """) required += bzip2_files required_exehead += bzip2_exehead_files zlib_exehead_files = Split(""" zlib/INFBLOCK.C """) required_exehead += zlib_exehead_files cppunitlibs = Split(""" cppunit """) extralibs = Split(""" dl gdi32 iconv pthread user32 oleaut32 """) scripts = Split(""" icon1.nsi icon2.nsi preprocessor.nsi winver.nsi """) Import('env AddAvailableLibs AddZLib') # Test scripts env.TestScript(scripts) # Use available libraries if env['PLATFORM'] == 'win32': # XXX will cause problems if tests are cross compiled # on freebsd, libversion.a exists and gives trouble if linked extralibs += ['version'] AddAvailableLibs(env, extralibs) AddZLib(env, env['PLATFORM']) # compile using msvcrt (that's how cppunit.lib is built) if 'msvc' in env['TOOLS'] or 'mstoolkit' in env['TOOLS']: env.Append(CCFLAGS = ['/MD']) # uses exceptions env.Append(CCFLAGS = ['$EXCEPTION_FLAG']) # for lzma env.Append(CPPDEFINES = ['COMPRESS_MF_BT']) # test for CppUnit conf = env.Configure() cppunit = conf.CheckLibWithHeader(cppunitlibs, 'cppunit/extensions/HelperMacros.h', 'C++') conf.Finish() if cppunit: # compile files from parent directory required_obj = [] for i in required: b = 'required/%s' % i.split('.')[0] s = '#Source/%s' % i o = env.Object(b, s) required_obj.append(o) # exehead files special treatment exehead_env = env.Clone() exehead_env.Append(CCFLAGS = ['$C_FLAG']) exehead_env.Append( CPPDEFINES = [ 'EXEHEAD', 'NSIS_COMPRESS_USE_ZLIB' # just so config.h won't complain ] ) for i in required_exehead: b = 'required/exehead/%s' % i.split('.')[0] s = '#Source/%s' % i o = exehead_env.Object(b, s) required_obj.append(o) # build test program tests = env.Program(target, tests + required_obj) if env['PLATFORM'] == 'win32' and 'ZLIB_W32_DLL' in env: import os.path env.Depends(tests, env.InstallAs( os.path.basename(str(env['ZLIB_W32_DLL'])), env['ZLIB_W32_DLL'])) # alias running the test to 'test' test = env.Alias('test-code', [tests], tests[0].abspath) # always test when asked to AlwaysBuild(test) else: # no CppUnit def err(target, source, env): print('*** error: CppUnit must be installed for testing!') return 1 cmd = env.Command(target, [tests], Action(err, '')) env.Alias('test-code', cmd) nsis-3.11/Source/Tests/compression.cpp000077500000000000000000000077701477201124000200350ustar00rootroot00000000000000#include #include "../Platform.h" #include "../growbuf.h" #include #include #include "decompress.h" #include "../cbzip2.h" #include "../clzma.h" #include "../czlib.h" class CompressionTest : public CppUnit::TestFixture { public: void randData(IGrowBuf &buf, int kb) { srand(time(0)); #define IsBug1156(r) ( ((r) & 0x80) == 0x80 ) for (int i = 0; i < kb; i++) { int r; do r = rand(); while (IsBug1156(r)); // Temporary workaround for https://sf.net/p/nsis/bugs/1156/#zlibCompressionTest loops endlessly for (size_t j = 0; j < 1024/sizeof(int); j++) { buf.add(&r, sizeof(int)); } } } // compressor must be initialized! void compress(ICompressor &compressor, IGrowBuf& in, IGrowBuf& out) { compressor.SetNextIn((char *) in.get(), in.getlen()); int ret; do { char outbuf[1024]; compressor.SetNextOut(outbuf, sizeof(outbuf)); ret = compressor.Compress(C_FINISH); CPPUNIT_ASSERT_MESSAGE( compressor.GetErrStr(ret) , ret >= 0 ); out.add(outbuf, sizeof(outbuf) - compressor.GetAvailOut()); } while (ret == 0); } typedef void (*decompressInitPtr)(void *); typedef int (*decompressWorkPtr)(void *); void decompress(IDecompressor& decompressor, IGrowBuf& in, IGrowBuf& out) { decompressor.init(); decompressor.setNextIn(in.get(), in.getlen()); int ret; do { char outbuf[1024]; decompressor.setNextOut(outbuf, sizeof(outbuf)); ret = decompressor.decompress(); CPPUNIT_ASSERT( ret >= 0 ); out.add(outbuf, sizeof(outbuf) - decompressor.getAvailOut()); } while (ret == 0); } // compressor must be initialized! void testCompressDecompress(int size_kb, ICompressor &compressor, IDecompressor& decompressor) { GrowBuf data; GrowBuf compressed; GrowBuf decompressed; randData(data, size_kb); compress(compressor, data, compressed); decompress(decompressor, compressed, decompressed); CPPUNIT_ASSERT_MESSAGE( "decompressed data is smaller", data.getlen() <= decompressed.getlen() ); CPPUNIT_ASSERT_MESSAGE( "decompressed data is larger", data.getlen() >= decompressed.getlen() ); CPPUNIT_ASSERT_EQUAL_MESSAGE( "decompressed data is different", 0, memcmp(data.get(), decompressed.get(), data.getlen()) ); } void testCompressDecompress(ICompressor &compressor, IDecompressor& decompressor) { CPPUNIT_ASSERT_EQUAL( C_OK, compressor.Init(9, 1 << 23) ); testCompressDecompress(1, compressor, decompressor); CPPUNIT_ASSERT_EQUAL( C_OK, compressor.Init(9, 1 << 23) ); testCompressDecompress(1024, compressor, decompressor); #ifndef NSIS_TESTS_FASTCOMPRESSIONONLY CPPUNIT_ASSERT_EQUAL( C_OK, compressor.Init(9, 1 << 23) ); testCompressDecompress(8*1024, compressor, decompressor); CPPUNIT_ASSERT_EQUAL( C_OK, compressor.Init(9, 1 << 23) ); testCompressDecompress(32*1024, compressor, decompressor); #endif } }; class bzip2CompressionTest : public CompressionTest { CPPUNIT_TEST_SUITE( bzip2CompressionTest ); CPPUNIT_TEST( test ); CPPUNIT_TEST_SUITE_END(); public: void test() { CBzip2 compressor; bzip2Decompressor decompressor; testCompressDecompress(compressor, decompressor); } }; class lzmaCompressionTest : public CompressionTest { CPPUNIT_TEST_SUITE( lzmaCompressionTest ); CPPUNIT_TEST( test ); CPPUNIT_TEST_SUITE_END(); public: void test() { CLZMA compressor; lzmaDecompressor decompressor; testCompressDecompress(compressor, decompressor); } }; class zlibCompressionTest : public CompressionTest { CPPUNIT_TEST_SUITE( zlibCompressionTest ); CPPUNIT_TEST( test ); CPPUNIT_TEST_SUITE_END(); public: void test() { CZlib compressor; zlibDecompressor decompressor; testCompressDecompress(compressor, decompressor); } }; CPPUNIT_TEST_SUITE_REGISTRATION( bzip2CompressionTest ); CPPUNIT_TEST_SUITE_REGISTRATION( lzmaCompressionTest ); CPPUNIT_TEST_SUITE_REGISTRATION( zlibCompressionTest ); nsis-3.11/Source/Tests/decompress.cpp000077500000000000000000000052501477201124000176270ustar00rootroot00000000000000#include "decompress.h" #include // for memset #if _MSC_VER > 1200 // Hack to avoid extern "C" causing trouble with templates #include #include #include #include #endif #define EXEHEAD #define NSIS_CONFIG_COMPRESSION_SUPPORT #include "../Platform.h" extern "C" { #define NSIS_COMPRESS_USE_BZIP2 #include "../bzip2/bzlib.h" #undef NSIS_COMPRESS_USE_BZIP2 #define NSIS_COMPRESS_USE_LZMA #include "../7zip/LZMADecode.h" #undef NSIS_COMPRESS_USE_LZMA #define NSIS_COMPRESS_USE_ZLIB #include "../zlib/ZLIB.H" #undef NSIS_COMPRESS_USE_ZLIB } #define DECOMPRESSOR(name, type, initf, dec, u) \ name::name() { \ vs = new type; \ memset(vs, 0, sizeof(type)); \ } \ \ name::~name() { \ delete (type *) vs; \ vs = 0; \ } \ \ void name::setNextIn(void *buffer, int size) { \ type *s = (type *) vs; \ s->next_in = (u *) buffer; \ s->avail_in = size; \ } \ \ void name::setNextOut(void *buffer, int size) { \ type *s = (type *) vs; \ s->next_out = (u *) buffer; \ s->avail_out = size; \ } \ \ int name::getAvailOut() { \ type *s = (type *) vs; \ return s->avail_out; \ } \ \ void name::init() { \ type *s = (type *) vs; \ initf(s); \ } \ \ int name::decompress() { \ type *s = (type *) vs; \ return dec(s); \ } DECOMPRESSOR(lzmaDecompressor, lzma_stream, lzmaInit, lzmaDecode, unsigned char); DECOMPRESSOR(bzip2Decompressor, DState, BZ2_bzDecompressInit, BZ2_bzDecompress, unsigned char); DECOMPRESSOR(zlibDecompressor, z_stream, inflateReset, inflate, unsigned char); nsis-3.11/Source/Tests/decompress.h000077500000000000000000000023171477201124000172750ustar00rootroot00000000000000class IDecompressor { public: virtual ~IDecompressor() {}; virtual void init() = 0; virtual void setNextIn(void *buffer, int size) = 0; virtual void setNextOut(void *buffer, int size) = 0; virtual int getAvailOut() = 0; virtual int decompress() = 0; }; class lzmaDecompressor : public IDecompressor { public: lzmaDecompressor(); virtual ~lzmaDecompressor(); virtual void init(); virtual void setNextIn(void *buffer, int size); virtual void setNextOut(void *buffer, int size); virtual int getAvailOut(); virtual int decompress(); private: void *vs; }; class bzip2Decompressor : public IDecompressor { public: bzip2Decompressor(); virtual ~bzip2Decompressor(); virtual void init(); virtual void setNextIn(void *buffer, int size); virtual void setNextOut(void *buffer, int size); virtual int getAvailOut(); virtual int decompress(); private: void *vs; }; class zlibDecompressor : public IDecompressor { public: zlibDecompressor(); virtual ~zlibDecompressor(); virtual void init(); virtual void setNextIn(void *buffer, int size); virtual void setNextOut(void *buffer, int size); virtual int getAvailOut(); virtual int decompress(); private: void *vs; }; nsis-3.11/Source/Tests/endian.cpp000077500000000000000000000026641477201124000167270ustar00rootroot00000000000000#include #include "../Platform.h" class EndianTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( EndianTest ); CPPUNIT_TEST( testSwapEndian ); CPPUNIT_TEST( testFixEndian16 ); CPPUNIT_TEST( testFixEndian32 ); CPPUNIT_TEST_SUITE_END(); public: void testSwapEndian() { CPPUNIT_ASSERT_EQUAL( (int)0x78563412, (int)SWAP_ENDIAN_INT32(0x12345678) ); CPPUNIT_ASSERT_EQUAL( (int)0xFFFFFFFF, (int)SWAP_ENDIAN_INT32(0xFFFFFFFF) ); CPPUNIT_ASSERT_EQUAL( (int)0, (int)SWAP_ENDIAN_INT32(0) ); CPPUNIT_ASSERT_EQUAL( (int)0x3412, (int)SWAP_ENDIAN_INT16(0x1234) ); CPPUNIT_ASSERT_EQUAL( (int)0xFFFF, (int)SWAP_ENDIAN_INT16(0xFFFF) ); CPPUNIT_ASSERT_EQUAL( (int)0, (int)SWAP_ENDIAN_INT16(0) ); } void testFixEndian32() { int i=1; int actual = 0x12345678; FIX_ENDIAN_INT32_INPLACE(actual); int expected; if (((char*)&i)[0] == 1) { // little endian expected = 0x12345678; } else { // big endian expected = 0x78563412; } CPPUNIT_ASSERT_EQUAL(expected, actual); } void testFixEndian16() { int i=1; int actual = 0x1234; FIX_ENDIAN_INT16_INPLACE(actual); int expected; if (((char*)&i)[0] == 1) { // little endian expected = 0x1234; } else { // big endian expected = 0x3412; } CPPUNIT_ASSERT_EQUAL(expected, actual); } }; CPPUNIT_TEST_SUITE_REGISTRATION( EndianTest ); nsis-3.11/Source/Tests/icon1.nsi000077500000000000000000000004051477201124000165000ustar00rootroot00000000000000OutFile icon1.exe Name icon1 Icon "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico" Section Return WriteUninstaller $TEMP\uninst.exe SectionEnd Section uninstall SectionEnd nsis-3.11/Source/Tests/icon2.nsi000077500000000000000000000004051477201124000165010ustar00rootroot00000000000000OutFile icon2.exe Name icon2 Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico" UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" Section Return WriteUninstaller $TEMP\uninst.exe SectionEnd Section uninstall SectionEnd nsis-3.11/Source/Tests/icons.py000077500000000000000000000012001477201124000164330ustar00rootroot00000000000000SCRIPT = """ Name icon OutFile "%(icon)s X %(unicon)s.exe" SilentInstall silent SilentUninstall silent Icon "%(icon)s" UninstallIcon "%(unicon)s" Section WriteUninstaller "$EXEDIR\%(unicon)s X %(icon)s X uninst.exe" SectionEnd Section uninstall SectionEnd """ def build(icon, unicon): from os import popen2 pw, pr = popen2(r'C:\Progra~1\NSIS\makensis.exe -') pw.write(SCRIPT % locals()) pw.close() print(pr.read()) from glob import glob from os import system icons = glob('*.ico') for i in icons: for j in icons: build(i, j) system('"%s X %s.exe"' % (i, j)) nsis-3.11/Source/Tests/memcpy.c000077500000000000000000000003741477201124000164170ustar00rootroot00000000000000// Reviewed for Unicode support by Jim Park -- 08/24/2007 #include "../Platform.h" void NSISCALL mini_memcpy(void *out, const void *in, int len) { char *c_out=(char*)out; char *c_in=(char *)in; while (len-- > 0) { *c_out++=*c_in++; } } nsis-3.11/Source/Tests/mmap.cpp000077500000000000000000000041701477201124000164150ustar00rootroot00000000000000// Unicode support by Jim Park -- 08/13/2007 // #include #include "../mmap.h" #include #include #include using namespace std; // for std::min void quit() { extern FILE *g_errout; _ftprintf(g_errout, _T("MMap quit\n")); } class MMapTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( MMapTest ); CPPUNIT_TEST( testMMapFile ); CPPUNIT_TEST( testMMapBuf ); CPPUNIT_TEST_SUITE_END(); public: void testMMapFile() { size_t i; const int BUF_SIZE = 50000; // 50MB // resize MMapFile mmap; mmap.resize(BUF_SIZE); CPPUNIT_ASSERT_EQUAL( BUF_SIZE, mmap.getsize() ); // set content char *buf = (char *) mmap.get(0, BUF_SIZE); for (i = 0; i < BUF_SIZE; i++) { buf[i] = i % 256; } mmap.release(); // test content and get(), getmore() srand(time(NULL)); for (i = 0; i < 100; i++) { int offset1 = rand() % BUF_SIZE; int size1 = rand() % (BUF_SIZE - offset1); char *p1 = (char *) mmap.get(offset1, size1); int offset2 = rand() % BUF_SIZE; int size2 = rand() % (BUF_SIZE - offset2); char *p2 = (char *) mmap.getmore(offset2, size2); int j; for (j = 0; j < size1; j++) { CPPUNIT_ASSERT_EQUAL( p1[j], char((offset1 + j) % 256) ); } for (j = 0; j < size2; j++) { CPPUNIT_ASSERT_EQUAL( p2[j], char((offset2 + j) % 256) ); } mmap.release(); mmap.release(p2, size2); } } void testMMapBuf() { struct Internal : public MMapBuf { static int threshold() { return getmodethreshold(); } }; int threshold = Internal::threshold(), tmpint; MMapBuf mmap; // GrowBuf -> MMapFile -> Unspecified mmap.resize(tmpint = threshold - 1); CPPUNIT_ASSERT_EQUAL( tmpint, mmap.getsize() ); mmap.resize(tmpint = threshold + 1); CPPUNIT_ASSERT_EQUAL( tmpint, mmap.getsize() ); mmap.resize(tmpint = threshold - 1); CPPUNIT_ASSERT_EQUAL( tmpint, mmap.getsize() ); // We don't care if it does not go back to GrowBuf but the size still has to be correct } }; CPPUNIT_TEST_SUITE_REGISTRATION( MMapTest ); nsis-3.11/Source/Tests/preprocessor.nsi000077500000000000000000000176701477201124000202310ustar00rootroot00000000000000### Preprocessor Tests ### !ifndef file_is_included !define file_is_included Name preprocessor OutFile preprocessor.exe # Line comment 1 ; Line comment 2 !ifdef some_define_that_doesnt_exist this should not be executed, so no error should be raised /* code inside comments should not be executed !ifdef */ # invalid preprocessor should be ignored !hello !error valid_preprocessor_syntax_must_be_ignored !define /foo /bar /baz and the same with invalid parameters !endif !ifdef d1 !error "d1 is not defined!" !else ifdef d2 !error "d2 is not defined!" !else # this should be compiled !endif !define d1 !ifdef d1 # this should be compiled !else ifdef d2 !error "d2 is not defined!" !else !error "d1 is defined!" !endif !undef d1 !define d2 !ifdef d1 !error "d1 is not defined!" !else ifdef d2 # this should be compiled !else !error "d2 is defined!" !endif !ifdef some_define_that_doesnt_exist the next !endif should be part of this line\ !endif !\ e\ n\ d\ i\ f !if 0 /* this shouldn't be compiled !endif */ !endif # tests for !if statement !if 'test' == 'test' !if 1 <= 2 !if ! 100 < 99.99 !if 2.2 > 1.12 !if ! 23 >= 37 !if 1 && 1 !if ! 0 || 0 # this should be compiled !else !error "!if ! 0 || 0 is true!" !endif !else !error "!if 1 && 1 is true!" !endif !else !error "!if ! 23 >= 37 is true!" !endif !else !error "!if 2.2 > 1.12 is true!" !endif !else !error "!if ! 100 < 99.99 is true!" !endif !else !error "!if 1 <= 2 is true!" !endif !else !error "!if 'test' == 'test' is true!" !endif ; !assert !assert 1 "" ; No message !assert 0 < 1 "Must be tiny" ; Custom message ; Built-in defines that should always exist !assert ${__LINE__} "" !assert "${__FILE__}" != "" "" !assert ${NSIS_CHAR_SIZE} "" !assert ${NSIS_PTR_SIZE} >= 4 "" !define ASSERT `!insertmacro ASSERT "${U+24}{__FILE__}" ${U+24}{__LINE__} ` !macro ASSERT __file __line __xpr !if ${__xpr} !else !error `ASSERT: ${__xpr} (${__file}:${__line})` !endif !macroend ; test macros !macro TM_0 !macroend !macro TM_1 !error "Wrong TM_1" !macroend !macro TM_2 !error "Wrong TM_2" !macroend !macroundef TM_2 ; Undefine the last macro !macro TM_2 !if 0 !endif !macroend !ifmacrodef TM_1 !macroundef TM_1 ; Undefine "in the middle" macro !endif !macro TM_1 !macroend !insertmacro TM_1 !insertmacro TM_2 !macro TM_Recursion def !if '${${def}}' < 42 !define /redef /math ${def} '${${def}}' + 1 !insertmacro ${__MACRO__} ${def} !endif !macroend !define /redef OUT1 0 !insertmacro TM_Recursion OUT1 ${ASSERT} '${OUT1} = 42' ; testing of two math functions and a macro hack :) !define increase "!insertmacro increase" !macro increase DEFINE !define /math ${DEFINE}_MACROTEMP ${${DEFINE}} + 1 !undef ${DEFINE} !define ${DEFINE} ${${DEFINE}_MACROTEMP} !undef ${DEFINE}_MACROTEMP !macroend !define number1 1 # 1 !define /math number2 2 + 3 !define /math number3 ${number2} - ${number1} ${increase} number3 !define /math number4 2 * ${number3} !define /math number5 ${number4} % 3 !if ${number1} != 1 !error "number1 != 1" !endif !if ${number2} != 5 !error "number2 != 5" !endif !if ${number3} != 5 !error "number3 != 5" !endif !if ${number4} != 10 !error "number4 != 10" !endif !if ${number5} != 1 !error "number5 != 1" !endif !define /redef /math OUT1 0xffffffff >> 31 ${ASSERT} '${OUT1} = -1' !define /redef /math OUT1 0xffffffff >>> 31 ${ASSERT} '${OUT1} = 1' !define /redef /math OUT1 1 << 31 ${ASSERT} '${OUT1} = 0x80000000' !define /redef /math OUT1 0x80000000 ^ 0x40000000 ${ASSERT} '${OUT1} = 0xC0000000' !define /redef /intfmt OUT1 "0x%.3X" 42 ${ASSERT} '${OUT1} = 0x02A' !pragma internal x OUT "0x10 | 0x40" ; NSD requires this when using LoadAndSetImage !if "${OUT}" <> 80 !error "math expression failed" !endif ; end math functions # this should just give a warning, not an error !include /NONFATAL file_that_doesnt_exist.nsh # this should include this file just one time. !include preprocessor.nsi # test scopes Section Return WriteUninstaller uninst.exe # avoid warning SectionEnd !macro TEST_SCOPE scope def should_exist !if ${should_exist} == y !ifndef ${def} !error "${def} not defined in ${scope} scope" !endif !else !ifdef ${def} !error "${def} defined in ${scope} scope" !endif !endif !macroend !macro TEST_SCOPES scope global section function pageex uninstall !insertmacro TEST_SCOPE "${scope}" __GLOBAL__ ${global} !insertmacro TEST_SCOPE "${scope}" __SECTION__ ${section} !insertmacro TEST_SCOPE "${scope}" __FUNCTION__ ${function} !insertmacro TEST_SCOPE "${scope}" __PAGEEX__ ${pageex} !insertmacro TEST_SCOPE "${scope}" __UNINSTALL__ ${uninstall} !macroend !insertmacro TEST_SCOPE "macro" __MACRO__ y !insertmacro TEST_SCOPES "global" y n n n n Section test !insertmacro TEST_SCOPES "section" n y n n n !if ${__SECTION__} != test !error "invalid __SECTION__ value" !endif SectionEnd Section un.test !insertmacro TEST_SCOPES "uninstall section" n y n n y !if ${__SECTION__} != test !error "invalid __SECTION__ value" !endif SectionEnd Function test Call test # avoid warning !insertmacro TEST_SCOPES "function" n n y n n !if ${__FUNCTION__} != test !error "invalid __FUNCTION__ value" !endif FunctionEnd Function un.test Call un.test # avoid warning !insertmacro TEST_SCOPES "uninstall function" n n y n y !if ${__FUNCTION__} != test !error "invalid __FUNCTION__ value" !endif FunctionEnd PageEx instfiles !insertmacro TEST_SCOPES "pageex" n n n y n !if ${__PAGEEX__} != instfiles !error "invalid __PAGEEX__ value" !endif PageExEnd PageEx un.instfiles !insertmacro TEST_SCOPES "uninstall pageex" n n n y y !if ${__PAGEEX__} != instfiles !error "invalid __PAGEEX__ value" !endif PageExEnd !insertmacro TEST_SCOPES "global" y n n n n # test !pragma !pragma warning push !pragma warning disable 7000 !include /NONFATAL doesnt_exist_nor_can_you_see_me.nsh !pragma warning pop !pragma warning push !pragma warning disable all !include /NONFATAL doesnt_exist_nor_can_you_see_me.nsh !pragma warning push !pragma warning error all !pragma warning pop !warning "You can't see me" ; "disable all" is still in effect !pragma warning pop !if ! 1 <> 0 !error "1 is not 0" !endif !pragma warning push !pragma warning disable 7070 ; Invalid number !if Hello <> 0 !error "Hello is not a number" !endif !pragma warning pop # test !searchparse !searchparse "AbcDef" "Abc" OUT1 ${ASSERT} '${OUT1} S== "Def"' !define /redef OUT1 FAILED !searchparse /noerrors "AbcDef" "FailThis" OUT1 ${ASSERT} '${OUT1} S== "FAILED"' !searchparse /ignorecase "AbcDef" "ABC" OUT1 ${ASSERT} '${OUT1} S== "Def"' !searchparse "AbcDef" "Ab" OUT1 "D" OUT2 ${ASSERT} '"${OUT1}${OUT2}" S== "cef"' !searchparse /ignorecase /file "${__FILE__}" "### " OUT1 " Tests" ${ASSERT} '${OUT1} == "Preprocessor"' !searchparse "AbcDef" "" OUT1 "Def" ; Empty first search string and chopping off the end without defining OUTPUTSYMBOL2 ${ASSERT} '${OUT1} S== "Abc"' # test !searchreplace !searchreplace OUT1 "FooBar" "Bar" "Baz" ${ASSERT} '${OUT1} S== "FooBaz"' !searchreplace OUT1 "FooBarBar" "Bar" "Baz" ; "replacing all instances" ${ASSERT} '${OUT1} S== "FooBazBaz"' !searchreplace OUT1 "FooBar" "BAR" "Baz" ${ASSERT} '${OUT1} S== "FooBar"' !searchreplace /ignorecase OUT1 "FooBar" "BAR" "Baz" ${ASSERT} '${OUT1} S== "FooBaz"' !searchreplace OUT1 "FooBar" "FailThis" "Baz" ; "allows you to redefine symbol_out without warning or error" ${ASSERT} '${OUT1} S== "FooBar"' !verbose 4 !echo "Completed tests" !verbose 2 !pragma whip 0 # EOF !else # this should just give a warning, not an error !include /NONFATAL another_file_that_doesnt_exist.nsh !endif nsis-3.11/Source/Tests/root.txt000077500000000000000000000004421477201124000165010ustar00rootroot00000000000000this is a list of bugs related to root directories, which can not yet be tested automatically * bug #1331292 - browsing for root network directory disables next button * root with space after it, without AllowRootDirInstall http://forums.winamp.com/showthread.php?threadid=222727 nsis-3.11/Source/Tests/specmatch.cpp000077500000000000000000000030631477201124000174320ustar00rootroot00000000000000#include #include "../dirreader.h" #include "../tstring.h" #ifndef TEXT #define TEXT _T #endif using namespace std; class SpecTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( SpecTest ); CPPUNIT_TEST( testMatches ); CPPUNIT_TEST_SUITE_END(); public: void testMatches() { testMatch(TEXT("test.exe"), TEXT("test.exe"), true); testMatch(TEXT("test"), TEXT("test"), true); testMatch(TEXT("test.exe"), TEXT("test.*"), true); testMatch(TEXT("test"), TEXT("test.*"), true); testMatch(TEXT("test"), TEXT("????"), true); testMatch(TEXT("test"), TEXT("???"), false); testMatch(TEXT("test"), TEXT("*.exe"), false); testMatch(TEXT("test.exe.bat"), TEXT("*.exe"), false); testMatch(TEXT("test.exe.bat"), TEXT("*.bat"), true); testMatch(TEXT("test.exe.bat"), TEXT("*t"), true); testMatch(TEXT("test.exe.bat"), TEXT("*"), true); testMatch(TEXT("test.exe.bat"), TEXT("*x*"), true); testMatch(TEXT("test.exe.exe"), TEXT("*.*"), true); testMatch(TEXT("test.exe.bat"), TEXT("*.b*"), true); testMatch(TEXT("test.exe.bat"), TEXT("tes?.*.bat"), true); testMatch(TEXT("test.exe.bat"), TEXT("tes?.*bat"), true); testMatch(TEXT("test.exe.bat"), TEXT("tes?.*bat***."), true); testMatch(TEXT("test.exe"), TEXT("????.*"), true); testMatch(TEXT("testing.exe"), TEXT("????.*"), false); } private: void testMatch(tstring name, tstring spec, bool result) { CPPUNIT_ASSERT_EQUAL( dir_reader::matches(name, spec), result ); } }; CPPUNIT_TEST_SUITE_REGISTRATION( SpecTest ); nsis-3.11/Source/Tests/textrunner.cpp000077500000000000000000000015431477201124000177020ustar00rootroot00000000000000#include #include #include #include "../util.h" // for NSISRT_* NSISRT_DEFINEGLOBALS(); int main(int argc, char* argv[]) { if (!NSISRT_Initialize()) return 1; // Get the top level suite from the registry CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); // Adds the test to the list of test to run CppUnit::TextUi::TestRunner runner; runner.addTest( suite ); // Change the default outputter to a compiler error format outputter runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), std::cerr ) ); // Run the tests. bool wasSuccessful = runner.run(); // Return error code 1 if the one of test failed. return wasSuccessful ? 0 : 1; } nsis-3.11/Source/Tests/winchar.cpp000077500000000000000000000062241477201124000171200ustar00rootroot00000000000000// Reviewed for Unicode support by Jim Park -- 08/13/2007 #include #include "../util.h" #include "../winchar.h" #include #include // macro for fixing endianness #define _x(x) FIX_ENDIAN_INT16(WCHAR(x)) // BUGBUG: These tests currently run as Ansi, it would be better if it respected defenv['UNICODE'] // BUGBUG: WinWStrDupFromWC is unable to test WCToUTF16LEHlpr because it is behind #ifdef MAKENSIS // TODO write equal() for WINWCHAR -- http://subcommanderblog.wordpress.com/2009/01/10/cppunit_assert_equal-and-custom-data-types/ class WinCharTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( WinCharTest ); CPPUNIT_TEST( testFromTchar ); CPPUNIT_TEST( testStrCpy ); CPPUNIT_TEST( testStrNCpy ); CPPUNIT_TEST( testStrLen ); CPPUNIT_TEST( testStrCmp ); CPPUNIT_TEST( testStrDup ); CPPUNIT_TEST_SUITE_END(); public: void setUp() { } void testFromTchar() { WINWCHAR test[] = { _x('t'), _x('e'), _x('s'), _x('t'), 0 }; WINWCHAR *dyn = WinWStrDupFromTChar(_T("test")); CPPUNIT_ASSERT_EQUAL( 0, memcmp(test, dyn, sizeof(test)) ); free(dyn); dyn = WinWStrDupFromChar("test"); CPPUNIT_ASSERT_EQUAL( 0, memcmp(test, dyn, sizeof(test)) ); free(dyn); dyn = WinWStrDupFromWC(L"test"); CPPUNIT_ASSERT_EQUAL( 0, memcmp(test, dyn, sizeof(test)) ); free(dyn); } void testStrCpy() { WINWCHAR a[] = { _x('t'), _x('e'), _x('s'), _x('t'), 0 }; WINWCHAR b[5]; CPPUNIT_ASSERT( !WinWStrCmp(b, WinWStrCpy(b, a)) ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(a, b, 5 * sizeof(WINWCHAR)) ); } void testStrNCpy() { WINWCHAR a1[] = { _x('t'), _x('e'), _x('s'), _x('t'), 0 }; WINWCHAR b[5]; CPPUNIT_ASSERT( !WinWStrCmp(b, WinWStrNCpy(b, a1, 5)) ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(a1, b, 5 * sizeof(WINWCHAR)) ); WINWCHAR a2[] = { _x('t'), _x('e'), 0, 0, 0 }; CPPUNIT_ASSERT( !WinWStrCmp(b, WinWStrNCpy(b, a2, 5)) ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(a2, b, 5 * sizeof(WINWCHAR)) ); CPPUNIT_ASSERT( !WinWStrCmp(b, WinWStrNCpy(b, a1, 2)) ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(a2, b, 5 * sizeof(WINWCHAR)) ); } void testStrLen() { WINWCHAR test[] = { _x('t'), _x('e'), _x('s'), _x('t'), 0 }; CPPUNIT_ASSERT_EQUAL( (size_t) 4, WinWStrLen(test) ); } static int simplifyNumber(int n) { if (n < 0) return -1; if (n > 0) return 1; return 0; } void testStrCmp() { char a[] = "a"; WINWCHAR wa[] = { _x('a'), 0 }; char b[] = "b"; WINWCHAR wb[] = { _x('b'), 0 }; char empty[] = ""; WINWCHAR wempty[] = { 0 }; #define TEST_STR_CMP(x, y) \ CPPUNIT_ASSERT_EQUAL(\ simplifyNumber(strcmp(x, y)), \ simplifyNumber(WinWStrCmp(w##x, w##y)) \ ) TEST_STR_CMP(a, b); TEST_STR_CMP(b, a); TEST_STR_CMP(a, a); TEST_STR_CMP(b, b); TEST_STR_CMP(a, empty); TEST_STR_CMP(empty, b); TEST_STR_CMP(empty, empty); } void testStrDup() { WINWCHAR a[] = { _x('a'), _x('b'), _x('c'), 0 }; WINWCHAR *b = WinWStrDupFromWinWStr(a); CPPUNIT_ASSERT_EQUAL( 0, WinWStrCmp(a, b) ); free(b); } }; CPPUNIT_TEST_SUITE_REGISTRATION( WinCharTest ); nsis-3.11/Source/Tests/winver.nsi000077500000000000000000001152241477201124000170070ustar00rootroot00000000000000#### # # This massive script tests WinVer's version, SP, platform and server detection. # It also tests comparison of version and SP with every other available version. # # To make this work on one computer, a script storing the result of GetVersionEx # was executed on a number of different Windows versions. Using a hack in WinVer # this script replaces this computer's results with the ones from the script and # runs the tests for every stored result. # # To add a test for another version, use the following script. # # !include LogicLib.nsh # # OutFile WinVer.exe # ShowInstDetails show # # Function PrintSysVersion # # System::Alloc 156 # Pop $0 # System::Call *$0(ir1) # System::Call kernel32::GetVersionEx(pr0)i.R0 # # DetailPrint 'StrCpy $2_RES $R0' # # System::Call '*$0(i.R0,i.R1,i.R2,i.R3,i.R4,&t128.R5,&i2.R6,&i2.R7,&i2.R8,&i1.R9,&i1)' # DetailPrint 'StrCpy $2_CSD "$R5"' # DetailPrint 'StrCpy $2_INIT "i $R0, i $R1, i $R2, i $R3, i $R4, &t128 s, &i2 $R6, &i2 $R7, &i2 $R8, &i1 $R9, &i1 0"' # # StrCpy $R0 $0 # IntOp $R1 $R0 + $1 # IntOp $R1 $R1 - 1 # StrCpy $R3 '# ' # # ${For} $R2 $R0 $R1 # # System::Call *$R2(&i1.R4) # IntFmt $R4 %02x $R4 # StrCpy $R3 $R3$R4 # # ${Next} # # DetailPrint $R3 # # System::Free $0 # # FunctionEnd # # Section # # DetailPrint "# OSVERSIONINFOEX" # # StrCpy $1 156 # StrCpy $2 "$$OSVERSIONINFOEX" # Call PrintSysVersion # # DetailPrint "" # # DetailPrint "# OSVERSIONINFO" # # StrCpy $1 148 # StrCpy $2 "$$OSVERSIONINFO" # Call PrintSysVersion # # SectionEnd # # # EXPECTED RESULTS # # SUCCESS Windows 95 OSR B # SUCCESS Windows 98 # SUCCESS Windows ME # SUCCESS Windows NT4 SP1 # SUCCESS Windows NT4 SP6 # SUCCESS Windows 2000 # SUCCESS Windows 2000 SP4 # SUCCESS Windows XP SP2 # SUCCESS Windows XP SP3 # SUCCESS Windows XP x64 SP1 # SUCCESS Windows Vista # SUCCESS Windows Server 2008 # Completed # #### Name winver OutFile winver.exe RequestExecutionLevel User Unicode False XPStyle on ShowInstDetails show Var OSVERSIONINFO_RES Var OSVERSIONINFO_CSD Var OSVERSIONINFO_INIT Var OSVERSIONINFOEX_RES Var OSVERSIONINFOEX_CSD Var OSVERSIONINFOEX_INIT Var WVSTATS_TESTS Var WVSTATS_FAILS !define __WinVer_GWV '!insertmacro __WinVerTest_GWV ' !include Util.nsh !macro __WinVerTest_GWV_Imp ; This macro simulates the GetWinVer instruction System::Store S System::Call '*(&i999)p.r0' Push $OSVERSIONINFO_CSD System::Call '*$0($OSVERSIONINFO_INIT)' ${If} $OSVERSIONINFOEX_RES <> 0 Push $OSVERSIONINFOEX_CSD System::Call '*$0($OSVERSIONINFOEX_INIT)' ${EndIf} Pop $8 ${If} $8 == Product System::Call '*$0(i,i,i,i,i.r1,&t128,&i2,&i2,&i2,&i1.r2)' StrCpy $9 0 ; W9x ${If} $1 U>= 2 StrCpy $9 $2 ${IfThen} $9 = 0 ${|} StrCpy $9 4 ${|} ${EndIf} ${ElseIf} $8 == NTDDIMajMin System::Call '*$0(i,i.r1,i.r2)' IntOp $9 $1 << 8 IntOp $9 $9 | $2 ${ElseIf} $8 == Build System::Call '*$0(i,i,i,i.r9)' ${ElseIf} $8 == ServicePack System::Call '*$0(i,i,i,i,i,&t128.r1,&i2.r9,&i2,&i2,&i1)' StrCpy $2 $1 1 ${If} $9 = 0 ${AndIf} $2 != "" StrCpy $9 $1 "" 13 ${If} $2 != "S" StrCpy $2 $1 1 1 StrCmp $2 "" +3 IntFmt $2 "%#x" 0x$2 IntOp $9 $2 - 9 ; W9x ${EndIf} ${EndIf} ${Else} MessageBox mb_iconstop "Unknown: $8" Quit ${EndIf} System::Free $0 Push $9 System::Store L !macroend !macro __WinVerTest_GWV outvar field Push "${field}" ${CallArtificialFunction} __WinVerTest_GWV_Imp Pop ${outvar} !macroend !macro __WinVer_Call_GetVersionEx STRUCT_SIZE !if ${STRUCT_SIZE} == ${OSVERSIONINFO_SIZE} StrCpy $3 $OSVERSIONINFO_RES Push $OSVERSIONINFO_CSD System::Call '*$0($OSVERSIONINFO_INIT)' !endif !if ${STRUCT_SIZE} == ${OSVERSIONINFOEX_SIZE} StrCpy $3 $OSVERSIONINFOEX_RES Push $OSVERSIONINFOEX_CSD System::Call '*$0($OSVERSIONINFOEX_INIT)' !endif !macroend !include WinVer.nsh !insertmacro __WinVer_DeclareVars !macro TestWinVerDiff NAME VER V_ !if ${VER} != ${V_} ${If} ${IsWin${V_}} DetailPrint "Version detection failed for ${NAME}" DetailPrint " Expected: ${VER}" DetailPrint " Got: ${V_}" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 !endif !macroend !define ORDER_95 0 !define ORDER_NT4 0 !define ORDER_98 1 !define ORDER_ME 2 !define ORDER_2000 3 !define ORDER_XP 4 !define ORDER_2003 5 !define ORDER_Vista 6 !define ORDER_2008 7 !define ORDER_7 8 !define ORDER_2008R2 9 !macro TestWinVerOrder NAME VER V_ !if ${ORDER_${VER}} >= ${ORDER_${V_}} ${IfNot} ${AtLeastWin${V_}} DetailPrint "Version comparison failed for ${NAME}" DetailPrint " Expected: ${VER} >= ${V_}" DetailPrint " Got: ${VER} < ${V_}" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 !endif !if ${ORDER_${VER}} <= ${ORDER_${V_}} ${IfNot} ${AtMostWin${V_}} DetailPrint "Version comparison failed for ${NAME}" DetailPrint " Expected: ${VER} <= ${V_}" DetailPrint " Got: ${VER} > ${V_}" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 !endif !macroend !macro TestWinVer NAME VER SP SERVER PLATFORM StrCpy $R0 "SUCCESS" StrCpy $__WINVERV "" StrCpy $__WINVERSP "" # test version equality ${IfNot} ${IsWin${VER}} ${OrIfNot} ${AtLeastWin${VER}} ${OrIfNot} ${AtMostWin${VER}} DetailPrint "Version detection failed for ${NAME}" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 !insertmacro TestWinVerDiff "${NAME}" ${VER} 95 !insertmacro TestWinVerDiff "${NAME}" ${VER} 98 !insertmacro TestWinVerDiff "${NAME}" ${VER} ME !insertmacro TestWinVerDiff "${NAME}" ${VER} NT4 !insertmacro TestWinVerDiff "${NAME}" ${VER} 2000 !insertmacro TestWinVerDiff "${NAME}" ${VER} XP !insertmacro TestWinVerDiff "${NAME}" ${VER} 2003 !insertmacro TestWinVerDiff "${NAME}" ${VER} Vista !insertmacro TestWinVerDiff "${NAME}" ${VER} 2008 !insertmacro TestWinVerDiff "${NAME}" ${VER} 7 !insertmacro TestWinVerDiff "${NAME}" ${VER} 2008R2 # test version comparison !insertmacro TestWinVerOrder "${NAME}" ${VER} 95 !insertmacro TestWinVerOrder "${NAME}" ${VER} 98 !insertmacro TestWinVerOrder "${NAME}" ${VER} ME !insertmacro TestWinVerOrder "${NAME}" ${VER} NT4 !insertmacro TestWinVerOrder "${NAME}" ${VER} 2000 !insertmacro TestWinVerOrder "${NAME}" ${VER} XP !insertmacro TestWinVerOrder "${NAME}" ${VER} 2003 !insertmacro TestWinVerOrder "${NAME}" ${VER} Vista !insertmacro TestWinVerOrder "${NAME}" ${VER} 2008 !insertmacro TestWinVerOrder "${NAME}" ${VER} 7 !insertmacro TestWinVerOrder "${NAME}" ${VER} 2008R2 # test service pack equality IntOp $0 ${SP} - 1 IntOp $1 ${SP} + 1 ${IfNot} ${IsServicePack} ${SP} ${OrIf} ${IsServicePack} $0 ${OrIf} ${IsServicePack} $1 ${WinVerGetServicePackLevel} $2 DetailPrint "Service pack detection failed for ${NAME}" DetailPrint " Expected: ${SP}" DetailPrint " Got: $2" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 # test service pack comparison ${IfNot} ${AtLeastServicePack} ${SP} ${OrIfNot} ${AtLeastServicePack} $0 ${OrIfNot} ${AtMostServicePack} ${SP} ${OrIfNot} ${AtMostServicePack} $1 DetailPrint "Service pack comparison failed for ${NAME}" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 # test server detection StrCpy $0 "client" ${If} ${IsServerOS} StrCpy $0 "server" ${EndIf} ${If} ${SERVER} != $0 DetailPrint "Server detection failed for ${NAME}" DetailPrint " Expected: ${SERVER}" DetailPrint " Got: $0" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 # test platform StrCpy $0 "9x" ${If} ${IsNT} StrCpy $0 "nt" ${EndIf} ${If} ${PLATFORM} != $0 DetailPrint "Platform detection failed for ${NAME}" DetailPrint " Expected: ${PLATFORM}" DetailPrint " Got: $0" StrCpy $R0 "FAILURE" IntOp $WVSTATS_FAILS $WVSTATS_FAILS + 1 ${EndIf} IntOp $WVSTATS_TESTS $WVSTATS_TESTS + 1 DetailPrint "$R0 ${NAME}" !macroend ############################################################### ############################################################### ############################################################### Section #### WINDOWS 95 OSR B [4.00.950 B] # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 0 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 0, i 0, i 0, i 0, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD " B" StrCpy $OSVERSIONINFO_INIT "i 148, i 4, i 0, i 67109975, i 1, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 94000000040000000000000057040004010000002042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 95 OSR B" 95 2 client 9x #### WINDOWS 98 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 0 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 0, i 0, i 0, i 0, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD " " StrCpy $OSVERSIONINFO_INIT "i 148, i 4, i 10, i 67766222, i 1, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 94000000040000000a000000ce070a04010000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 98" 98 0 client 9x #### WINDOWS 98 SE # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD " A " StrCpy $OSVERSIONINFOEX_INIT "i 156, i 4, i 10, i 67766446, i 1, &t128 s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 9c000000040000000a000000ae080a040100000020412000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD " A " StrCpy $OSVERSIONINFO_INIT "i 148, i 4, i 10, i 67766446, i 1, &t128 s, &i2 64, &i2 40960, &i2 8544, &i1 68, &i1 0" # 94000000040000000a000000ae080a04010000002041200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 98 SE" 98 1 client 9x #### WINDOWS ME # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD " " StrCpy $OSVERSIONINFOEX_INIT "i 156, i 4, i 90, i 73010104, i 1, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 9c000000040000005a000000b80b5a040100000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD " " StrCpy $OSVERSIONINFO_INIT "i 148, i 4, i 90, i 73010104, i 1, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 94000000040000005a000000b80b5a04010000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows ME" ME 0 client 9x #### WINDOWS NT4 SP1 (Client/Server unspecified) # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 0 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 0, i 0, i 0, i 0, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 4, i 0, i 1381, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000400000000000000650500000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows NT4 SP1" NT4 1 client nt ; Server can only be detected by reading the registry, cannot be performed in test environment. DetailPrint "NOTE: NT4 SP1 client/server test is inaccurate" #### WINDOWS NT4 SP6 Server # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 6" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 4, i 0, i 1381, i 2, &t128s, &i2 6, &i2 0, &i2 0, &i1 3, &i1 0" # 9c0000000400000000000000650500000200000053657276696365205061636b20360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000300 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 6" StrCpy $OSVERSIONINFO_INIT "i 148, i 4, i 0, i 1381, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000400000000000000650500000200000053657276696365205061636b2036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows NT4 SP6" NT4 6 server nt #### WINDOWS 2000 SP0 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 0, i 2195, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 1, &i1 0" # 9c0000000500000000000000930800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 0, i 2195, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 94000000050000000000000093080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 2000 SP0" 2000 0 client nt #### WINDOWS 2000 SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 0, i 2195, i 2, &t128 s, &i2 1, &i2 0, &i2 0, &i1 1, &i1 0" # 9c0000000500000000000000930800000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 0, i 2195, i 2, &t128 s, &i2 0, &i2 0, &i2 7, &i1 20, &i1 0" # 940000000500000000000000930800000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 2000 SP1" 2000 1 client nt #### WINDOWS 2000 SP2 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 2" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 0, i 2195, i 2, &t128 s, &i2 2, &i2 0, &i2 0, &i1 1, &i1 0" # 9c0000000500000000000000930800000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 2" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 0, i 2195, i 2, &t128 s, &i2 0, &i2 0, &i2 5, &i1 20, &i1 0" # 940000000500000000000000930800000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 2000 SP2" 2000 2 client nt #### WINDOWS 2000 SP3 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 3" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 0, i 2195, i 2, &t128 s, &i2 3, &i2 0, &i2 0, &i1 1, &i1 0" # 9c0000000500000000000000930800000200000053657276696365205061636b2033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 3" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 0, i 2195, i 2, &t128 s, &i2 0, &i2 0, &i2 7, &i1 20, &i1 0" # 940000000500000000000000930800000200000053657276696365205061636b2033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 2000 SP3" 2000 3 client nt #### WINDOWS 2000 SP4 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 4" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 0, i 2195, i 2, &t128s, &i2 4, &i2 0, &i2 0, &i1 1, &i1 0" # 9c0000000500000000000000930800000200000053657276696365205061636b20340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 4" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 0, i 2195, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000500000000000000930800000200000053657276696365205061636b2034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 2000 SP4" 2000 4 client nt #### WINDOWS XP PRO SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 1, i 2600, i 2, &t128 s, &i2 1, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000500000001000000280a00000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000001011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 1, i 2600, i 2, &t128 s, &i2 93, &i2 0, &i2 26, &i1 20, &i1 0" # 940000000500000001000000280a00000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows XP Pro SP1" XP 1 client nt #### WINDOWS XP PRO SP2 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 2" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 1, i 2600, i 2, &t128s, &i2 2, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000500000001000000280a00000200000053657276696365205061636b20320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000010100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 2" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 1, i 2600, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000500000001000000280a00000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows XP Pro SP2" XP 2 client nt #### WINDOWS XP PRO SP3 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 3" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 1, i 2600, i 2, &t128s, &i2 3, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000500000001000000280a00000200000053657276696365205061636b20330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000010100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 3" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 1, i 2600, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000500000001000000280a00000200000053657276696365205061636b2033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows XP Pro SP3" XP 3 client nt #### WINDOWS XP x64 SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 2, i 3790, i 2, &t128s, &i2 1, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000500000002000000ce0e00000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000001011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 2, i 3790, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000500000002000000ce0e00000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows XP x64 SP1" XP 1 client nt #### WINDOWS SERVER 2003 STANDARD EDITION SP0 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 2, i 3790, i 2, &t128 s, &i2 0, &i2 0, &i2 272, &i1 3, &i1 0" # 9c0000000500000002000000ce0e00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010300 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 2, i 3790, i 2, &t128 s, &i2 0, &i2 0, &i2 7, &i1 20, &i1 0" # 940000000500000002000000ce0e0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Server 2003 SP0" 2003 0 server nt #### WINDOWS SERVER 2003 STANDARD EDITION SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 2, i 3790, i 2, &t128 s, &i2 1, &i2 0, &i2 272, &i1 3, &i1 0" # 9c0000000500000002000000ce0e00000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000001001031e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 2, i 3790, i 2, &t128 s, &i2 0, &i2 0, &i2 44, &i1 20, &i1 0" # 940000000500000002000000ce0e00000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Server 2003 SP1" 2003 1 server nt #### WINDOWS SERVER 2003 STANDARD EDITION SP2 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 2" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 2, i 3790, i 2, &t128 s, &i2 2, &i2 0, &i2 272, &i1 3, &i1 0" # 9c0000000500000002000000ce0e00000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000001001031e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 2" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 2, i 3790, i 2, &t128 s, &i2 93, &i2 0, &i2 20, &i1 20, &i1 0" # 940000000500000002000000ce0e00000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Server 2003 SP2" 2003 2 server nt #### WINDOWS SERVER 2003 R2 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 2" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 5, i 2, i 3790, i 2, &t128 s, &i2 2, &i2 0, &i2 274, &i1 3, &i1 0" # 9c0000000500000002000000ce0e00000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000001201031e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 2" StrCpy $OSVERSIONINFO_INIT "i 148, i 5, i 2, i 3790, i 2, &t128 s, &i2 0, &i2 0, &i2 44, &i1 20, &i1 0" # 940000000500000002000000ce0e00000200000053657276696365205061636b2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Server 2003 x64 R2" 2003 2 server nt #### WINDOWS VISTA ULTIMATE SP0 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 0, i 6000, i 2, &t128s, &i2 0, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000600000000000000701700000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 0, i 6000, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 94000000060000000000000070170000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Vista SP0" Vista 0 client nt #### WINDOWS VISTA ULTIMATE SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 0, i 6001, i 2, &t128 s, &i2 1, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000600000000000000711700000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000001011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 0, i 6001, i 2, &t128 s, &i2 114, &i2 118, &i2 43684, &i1 202, &i1 0" # 940000000600000000000000711700000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Vista SP1" Vista 1 client nt #### WINDOWS VISTA x64 SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 0, i 6001, i 2, &t128 s, &i2 1, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000600000000000000711700000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000001011e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 0, i 6001, i 2, &t128 s, &i2 10402, &i2 0, &i2 5938, &i1 49, &i1 0" # 940000000600000000000000711700000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Vista x64 SP1" Vista 1 client nt #### WINDOWS 2008 SERVER SP1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "Service Pack 1" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 0, i 6001, i 2, &t128s, &i2 1, &i2 0, &i2 272, &i1 3, &i1 0" # 9c0000000600000000000000711700000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000001001031e # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "Service Pack 1" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 0, i 6001, i 2, &t128s, &i2 0, &i2 0, &i2 0, &i1 0, &i1 0" # 940000000600000000000000711700000200000053657276696365205061636b2031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows Server 2008" 2008 1 server nt #### WINDOWS 7 RC1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 1, i 7100, i 2, &t128 s, &i2 0, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000600000001000000bc1b00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 1, i 7100, i 2, &t128 s, &i2 28503, &i2 0, &i2 953, &i1 255, &i1 0" # 940000000600000001000000bc1b0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 7" 7 0 client nt #### WINDOWS 7 x64 RC1 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 1, i 7100, i 2, &t128 s, &i2 0, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000600000001000000bc1b00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 1, i 7100, i 2, &t128 s, &i2 22455, &i2 0, &i2 31205, &i1 95, &i1 0" # 940000000600000001000000bc1b0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 7 x64" 7 0 client nt #### WINDOWS 7 Enterprise x64 RTM # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 1, i 7600, i 2, &t128 s, &i2 0, &i2 0, &i2 256, &i1 1, &i1 0" # 9c0000000600000001000000b01d00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 1, i 7600, i 2, &t128 s, &i2 0, &i2 0, &i2 19720, &i1 113, &i1 0" # 940000000600000001000000b01d0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 7 Enterprise x64" 7 0 client nt #### WINDOWS 2008 R2 x64 # OSVERSIONINFOEX StrCpy $OSVERSIONINFOEX_RES 1 StrCpy $OSVERSIONINFOEX_CSD "" StrCpy $OSVERSIONINFOEX_INIT "i 156, i 6, i 1, i 7100, i 2, &t128 s, &i2 0, &i2 0, &i2 272, &i1 3, &i1 0" # 9c0000000600000001000000bc1b00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010300 # OSVERSIONINFO StrCpy $OSVERSIONINFO_RES 1 StrCpy $OSVERSIONINFO_CSD "" StrCpy $OSVERSIONINFO_INIT "i 148, i 6, i 1, i 7100, i 2, &t128 s, &i2 37797, &i2 0, &i2 9341, &i1 83, &i1 0" # 940000000600000001000000bc1b0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !insertmacro TestWinVer "Windows 2008 R2 x64" 2008R2 0 server nt SectionEnd Section "-Results" IntOp $0 $WVSTATS_TESTS - $WVSTATS_FAILS StrCpy $1 "Passed $0 of $WVSTATS_TESTS tests" ${If} $0 <> $WVSTATS_TESTS Abort $1 ${Else} DetailPrint $1 ${EndIf} SectionEnd nsis-3.11/Source/afxres.h000077500000000000000000000007121477201124000153140ustar00rootroot00000000000000/* * afxres.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #ifndef IDC_STATIC #define IDC_STATIC -1 #endif nsis-3.11/Source/boost/000077500000000000000000000000001477201124000147765ustar00rootroot00000000000000nsis-3.11/Source/boost/checked_delete.hpp000077500000000000000000000033351477201124000204260ustar00rootroot00000000000000#ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED #define BOOST_CHECKED_DELETE_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/checked_delete.hpp // // Copyright (c) 1999, 2000, 2001, 2002 boost.org // Copyright (c) 2002, 2003 Peter Dimov // Copyright (c) 2003 Daniel Frey // Copyright (c) 2003 Howard Hinnant // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // See http://www.boost.org/libs/utility/checked_delete.html for documentation. // namespace boost { // verify that types are complete for increased safety template inline void checked_delete(T * x) { // intentionally complex - simplification causes regressions typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete x; } template inline void checked_array_delete(T * x) { typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete [] x; } template struct checked_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * x) const { // boost:: disables ADL boost::checked_delete(x); } }; template struct checked_array_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * x) const { boost::checked_array_delete(x); } }; } // namespace boost #endif // #ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED nsis-3.11/Source/boost/detail/000077500000000000000000000000001477201124000162405ustar00rootroot00000000000000nsis-3.11/Source/boost/detail/workaround.hpp000077500000000000000000000054061477201124000211540ustar00rootroot00000000000000// Copyright David Abrahams 2002. Permission to copy, use, // modify, sell and distribute this software is granted provided this // copyright notice appears in all copies. This software is provided // "as is" without express or implied warranty, and with no claim as // to its suitability for any purpose. #ifndef WORKAROUND_DWA2002126_HPP # define WORKAROUND_DWA2002126_HPP // Compiler/library version workaround macro // // Usage: // // #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) // ... // workaround code here // #endif // // When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the // first argument must be undefined or expand to a numeric // value. The above expands to: // // (BOOST_MSVC) != 0 && (BOOST_MSVC) <= 1200 // // When used for workarounds that apply to the latest known version // and all earlier versions of a compiler, the following convention // should be observed: // // #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301)) // // The version number in this case corresponds to the last version in // which the workaround was known to have been required. When // BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro // BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates // the workaround for any version of the compiler. When // BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or // error will be issued if the compiler version exceeds the argument // to BOOST_TESTED_AT(). This can be used to locate workarounds which // may be obsoleted by newer versions. # ifndef BOOST_STRICT_CONFIG # define BOOST_WORKAROUND(symbol, test) \ ((symbol != 0) && (1 % (( (symbol test) ) + 1))) // ^ ^ ^ ^ // The extra level of parenthesis nesting above, along with the // BOOST_OPEN_PAREN indirection below, is required to satisfy the // broken preprocessor in MWCW 8.3 and earlier. // // The basic mechanism works as follows: // (symbol test) + 1 => if (symbol test) then 2 else 1 // 1 % ((symbol test) + 1) => if (symbol test) then 1 else 0 // // The complication with % is for cooperation with BOOST_TESTED_AT(). // When "test" is BOOST_TESTED_AT(x) and // BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined, // // symbol test => if (symbol <= x) then 1 else -1 // (symbol test) + 1 => if (symbol <= x) then 2 else 0 // 1 % ((symbol test) + 1) => if (symbol <= x) then 1 else divide-by-zero // # ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS # define BOOST_OPEN_PAREN ( # define BOOST_TESTED_AT(value) > value) ?(-1): BOOST_OPEN_PAREN 1 # else # define BOOST_TESTED_AT(value) != ((value)-(value)) # endif # else # define BOOST_WORKAROUND(symbol, test) 0 # endif #endif // WORKAROUND_DWA2002126_HPP nsis-3.11/Source/boost/scoped_array.hpp000077500000000000000000000054101477201124000201650ustar00rootroot00000000000000#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED #define BOOST_SCOPED_ARRAY_HPP_INCLUDED // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // http://www.boost.org/libs/smart_ptr/scoped_array.htm // // From Boost 1.31.0, http://www.boost.org // Modified by Ori Peleg for use in NSIS, to reduce the required Boost includes #include "checked_delete.hpp" #include "detail/workaround.hpp" #include // for std::ptrdiff_t namespace boost { // scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to // is guaranteed, either on destruction of the scoped_array or via an explicit // reset(). Use shared_array or std::vector if your needs are more complex. template class scoped_array // noncopyable { private: T * ptr; scoped_array(scoped_array const &); scoped_array & operator=(scoped_array const &); typedef scoped_array this_type; public: typedef T element_type; explicit scoped_array(T * p = 0) : ptr(p) // never throws { } ~scoped_array() // never throws { boost::checked_array_delete(ptr); } void reset(T * p = 0) // never throws { assert(p == 0 || p != ptr); // catch self-reset errors this_type(p).swap(*this); } T & operator[](std::ptrdiff_t i) const // never throws { assert(ptr != 0); assert(i >= 0); return ptr[i]; } T * get() const // never throws { return ptr; } // implicit conversion to "bool" #if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530) operator bool () const { return ptr != 0; } #elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) typedef T * (this_type::*unspecified_bool_type)() const; operator unspecified_bool_type() const // never throws { return ptr == 0? 0: &this_type::get; } #else typedef T * this_type::*unspecified_bool_type; operator unspecified_bool_type() const // never throws { return ptr == 0? 0: &this_type::ptr; } #endif bool operator! () const // never throws { return ptr == 0; } void swap(scoped_array & b) // never throws { T * tmp = b.ptr; b.ptr = ptr; ptr = tmp; } }; template inline void swap(scoped_array & a, scoped_array & b) // never throws { a.swap(b); } } // namespace boost #endif // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED nsis-3.11/Source/boost/scoped_ptr.hpp000077500000000000000000000066451477201124000176670ustar00rootroot00000000000000#ifndef BOOST_SCOPED_PTR_HPP_INCLUDED #define BOOST_SCOPED_PTR_HPP_INCLUDED // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // http://www.boost.org/libs/smart_ptr/scoped_ptr.htm // // From Boost 1.31.0, http://www.boost.org // Modified by Ori Peleg for use in NSIS, to reduce the required Boost includes #include #include "checked_delete.hpp" #include "detail/workaround.hpp" #include // for std::auto_ptr or std::unique_ptr // std::auto_ptr was deprecated in C++11 and removed in C++17 namespace NSIS { namespace CXX { #if __cplusplus >= 201103L template struct stdsmartptr { typedef std::unique_ptr type; }; #else template struct stdsmartptr { typedef std::auto_ptr type; }; #endif }} //~ NSIS::CXX namespace boost { // scoped_ptr mimics a built-in pointer except that it guarantees deletion // of the object pointed to, either on destruction of the scoped_ptr or via // an explicit reset(). scoped_ptr is a simple solution for simple needs; // use shared_ptr or std::auto_ptr if your needs are more complex. template class scoped_ptr // noncopyable { private: T * ptr; scoped_ptr(scoped_ptr const &); scoped_ptr & operator=(scoped_ptr const &); typedef scoped_ptr this_type; public: typedef T element_type; explicit scoped_ptr(T * p = 0): ptr(p) // never throws { } explicit scoped_ptr(typename NSIS::CXX::stdsmartptr::type p): ptr(p.release()) // never throws { } ~scoped_ptr() // never throws { boost::checked_delete(ptr); } void reset(T * p = 0) // never throws { assert(p == 0 || p != ptr); // catch self-reset errors this_type(p).swap(*this); } T & operator*() const // never throws { assert(ptr != 0); return *ptr; } T * operator->() const // never throws { assert(ptr != 0); return ptr; } T * get() const // never throws { return ptr; } // implicit conversion to "bool" #if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530) operator bool () const { return ptr != 0; } #elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) typedef T * (this_type::*unspecified_bool_type)() const; operator unspecified_bool_type() const // never throws { return ptr == 0? 0: &this_type::get; } #else typedef T * this_type::*unspecified_bool_type; operator unspecified_bool_type() const // never throws { return ptr == 0? 0: &this_type::ptr; } #endif bool operator! () const // never throws { return ptr == 0; } void swap(scoped_ptr & b) // never throws { T * tmp = b.ptr; b.ptr = ptr; ptr = tmp; } }; template inline void swap(scoped_ptr & a, scoped_ptr & b) // never throws { a.swap(b); } // get_pointer(p) is a generic way to say p.get() template inline T * get_pointer(scoped_ptr const & p) { return p.get(); } } // namespace boost #endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED nsis-3.11/Source/build.cpp000077500000000000000000004111161477201124000154620ustar00rootroot00000000000000/* * build.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support added by Jim Park -- 08/07/2007 */ #include "tchar.h" #include "Platform.h" #include #include "exehead/config.h" #include #include "build.h" #include "util.h" #include "fileform.h" #include "writer.h" #include "crc32.h" #include "manifest.h" #include "icon.h" #include "utf.h" // For NStream #include "BinInterop.h" #include "exehead/api.h" #include "exehead/resource.h" #include #include "ResourceEditor.h" #include "DialogTemplate.h" #include "ResourceVersionInfo.h" #include "tstring.h" #include #include #ifndef _WIN32 # include # include # include # include #endif #include // for assert #define RET_UNLESS_OK( function_rc ) do { \ int rc = (function_rc); \ if ( rc != PS_OK) \ return rc; \ } while (false) using namespace std; namespace { // begin anonymous namespace bool isSimpleChar(TCHAR ch) { return (ch == _T('.') ) || (ch == _T('_') ) || (ch >= _T('0') && ch <= _T('9')) || (ch >= _T('A') && ch <= _T('Z')) || (ch >= _T('a') && ch <= _T('z')); } } // end of anonymous namespace namespace MakensisAPI { #ifdef _WIN64 const TCHAR* SigintEventNameFmt = _T("makensis win32 sigint event %Iu"); // %u is the notify HWND, this is to make sure we abort the correct instance #else const TCHAR* SigintEventNameFmt = _T("makensis win32 sigint event %u"); #endif const TCHAR* SigintEventNameLegacy = _T("makensis win32 signint event"); // "sigNint" typo is part of the API now and cannot be changed } const WORD DefaultPEDllCharacteristics = IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE|IMAGE_DLLCHARACTERISTICS_NO_SEH|IMAGE_DLLCHARACTERISTICS_NX_COMPAT|IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE; //forums.winamp.com/showthread.php?t=344755 void CEXEBuild::define(const TCHAR *p, const TCHAR *v) { definedlist.add(p,v); } CEXEBuild::~CEXEBuild() { free_loaded_icon(installer_icon); free_loaded_icon(uninstaller_icon); delete [] m_exehead; int nlt = lang_tables.getlen() / sizeof(LanguageTable); LanguageTable *nla = (LanguageTable*)lang_tables.get(); for (int i = 0; i < nlt; i++) DeleteLangTable(nla+i); if (postbuild_cmds) postbuild_cmds->delete_all(); if (postubuild_cmds) postubuild_cmds->delete_all(); } CEXEBuild::CEXEBuild(signed char pponly, bool warnaserror) : preprocessonly(pponly), m_exehead(0), m_exehead_size(0) { set_verbosity(3); if (warnaserror) diagstate.set_warning_as_error(); curlinereader=0; curfilename=0, linecnt=0; cur_ifblock=NULL; last_line_had_slash=0; inside_comment=false; multiple_entries_instruction=0; build_include_depth=0; has_called_write_output=false; ns_func.add(_T(""),0); // make sure offset 0 is special on these (i.e. never used by a label) ns_label.add(_T(""),0); definedlist.add(_T("NSIS_VERSION"), NSIS_VERSION); definedlist.add(_T("NSIS_PACKEDVERSION"), NSIS_PACKEDVERSION); m_target_type=TARGET_X86UNICODE; #ifdef _WIN32 if (sizeof(void*) > 4) m_target_type = TARGET_AMD64; // BUGBUG: scons 'TARGET_ARCH' should specify the default #endif #ifdef _M_ARM64 m_target_type = TARGET_ARM64; // BUGBUG: scons 'TARGET_ARCH' should specify the default #endif build_unicode=TARGET_X86ANSI != m_target_type; build_lockedunicodetarget=false; // automatically generated header file containing all defines #include // no longer optional definedlist.add(_T("NSIS_SUPPORT_STANDARD_PREDEFINES")); definedlist.add(_T("NSIS_SUPPORT_NAMED_USERVARS")); definedlist.add(_T("NSIS_SUPPORT_LANG_IN_STRINGS")); #ifdef _WIN32 definedlist.add(_T("NSIS_WIN32_MAKENSIS")); #endif #ifdef _UNICODE definedlist.add(_T("NSIS_UNICODE_MAKENSIS")); // This define might go away once makensis.exe is always unicode #endif if (sizeof(void*) > 4) definedlist.add(_T("NSIS_MAKENSIS64")); db_opt_save=db_opt_save_u=db_full_size=db_full_size_u=0; db_comp_save=db_comp_save_u=0; // Added by Amir Szekely 31st July 2002 #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT compressor = &zlib_compressor; #endif build_compressor_set = false; build_compressor_final = false; build_compress_whole = false; build_compress=1; build_compress_level=9; build_compress_dict_size=1<<23; cur_entries=&build_entries; cur_instruction_entry_map=&build_instruction_entry_map; cur_datablock=&build_datablock; cur_datablock_cache=&build_datablock_cache; cur_functions=&build_functions; cur_labels=&build_labels; cur_sections=&build_sections; cur_header=&build_header; cur_strlist=&build_strlist; cur_langtables=&build_langtables; cur_ctlcolors=&build_ctlcolors; cur_pages=&build_pages; cur_page=0; cur_page_type=-1; build_filebuflen=32<<20; // 32mb sectiongroup_open_cnt=0; build_cursection_isfunc=0; build_cursection=NULL; // init public data. build_packname[0]=build_packcmd[0]=build_output_filename[0]=0; postbuild_cmds=postubuild_cmds=NULL; // Added by ramon 23 May 2003 build_allowskipfiles=1; // Added by ramon 6 jun 2003 #ifdef NSIS_SUPPORT_VERSION_INFO version_fixedflags=0; #endif build_overwrite=build_last_overwrite=0; build_crcchk=1; build_datesave=1; build_optimize_datablock=1; memset(&build_header,-1,sizeof(build_header)); build_header.install_reg_rootkey=0; build_header.flags=CH_FLAGS_NO_ROOT_DIR; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT build_header.lb_bg=RGB(0,0,0); build_header.lb_fg=RGB(0,255,0); #endif #ifdef NSIS_CONFIG_LICENSEPAGE build_header.license_bg=-COLOR_BTNFACE; #endif build_header.install_directory_ptr=0; build_header.install_directory_auto_append=0; build_header.install_reg_key_ptr=0; build_header.install_reg_value_ptr=0; #ifdef NSIS_CONFIG_COMPONENTPAGE memset(build_header.install_types,0,sizeof(build_header.install_types)); #endif memset(&build_header.blocks,0,sizeof(build_header.blocks)); uninstall_mode=0; uninstall_size_full=0; uninstall_size=UINT_MAX; memset(&build_uninst,-1,sizeof(build_uninst)); build_header.install_reg_rootkey=0; build_uninst.flags=0; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT build_uninst.lb_bg=RGB(0,0,0); build_uninst.lb_fg=RGB(0,255,0); #endif #ifdef NSIS_CONFIG_LICENSEPAGE build_uninst.license_bg=-COLOR_BTNFACE; #endif build_uninst.install_directory_ptr=0; build_uninst.install_directory_auto_append=0; build_uninst.install_reg_key_ptr=0; build_uninst.install_reg_value_ptr=0; #ifdef NSIS_CONFIG_COMPONENTPAGE memset(build_uninst.install_types,0,sizeof(build_uninst.install_types)); #endif memset(&build_uninst.blocks,0,sizeof(build_uninst.blocks)); uninstaller_writes_used=0; build_strlist.addemptystring(); ubuild_strlist.addemptystring(); build_langstring_num=0; ubuild_langstring_num=0; build_font[0]=0; build_font_size=0; m_unicon_size=0; branding_image_found=false; no_space_texts=false; m_currentmacroname=NULL; #ifdef NSIS_CONFIG_PLUGIN_SUPPORT build_plugin_unload=0; m_pPlugins=0; #endif last_used_lang=NSIS_DEFAULT_LANG; res_editor=0; PEDllCharacteristics = DefaultPEDllCharacteristics; PESubsysVerMaj = PESubsysVerMin = (WORD) -1; manifest_flags = manifest::flags_default; manifest_comctl = manifest::comctl_old; manifest_exec_level = manifest::exec_level_admin; manifest_dpiaware = manifest::dpiaware_notset; manifest_lpaware = manifest::lpaware_notset; manifest_sosl.setdefault(); enable_last_page_cancel=0; uenable_last_page_cancel=0; license_res_id=IDD_LICENSE; disable_window_icon=0; notify_hwnd=0; #ifdef NSIS_SUPPORT_BGBG bg_default_font.lfHeight=40; bg_default_font.lfWidth=0; bg_default_font.lfEscapement=0; bg_default_font.lfOrientation=0; bg_default_font.lfWeight=FW_BOLD; bg_default_font.lfItalic=TRUE; bg_default_font.lfUnderline=FALSE; bg_default_font.lfStrikeOut=FALSE; bg_default_font.lfCharSet=DEFAULT_CHARSET; bg_default_font.lfOutPrecision=OUT_DEFAULT_PRECIS; bg_default_font.lfClipPrecision=CLIP_DEFAULT_PRECIS; bg_default_font.lfQuality=DEFAULT_QUALITY; bg_default_font.lfPitchAndFamily=DEFAULT_PITCH; my_strncpy(bg_default_font.lfFaceName,_T("Times New Roman"),LF_FACESIZE); memcpy(&bg_font,&bg_default_font,sizeof(LOGFONT)); #endif defcodepage_set=false; uDefCodePage=CP_ACP; InitLangTables(); // Register static user variables $0, $1 and so on // with ONE of reference count, to avoid warning on these vars TCHAR Aux[3]; int i; for (i = 0; i < 10; i++) // 0 - 9 { wsprintf(Aux, _T("%d"), i); m_UserVarNames.add(Aux,1); } for (i = 0; i < 10; i++) // 10 - 19 { wsprintf(Aux, _T("R%d"), i); m_UserVarNames.add(Aux,1); } m_UserVarNames.add(_T("CMDLINE"),1); // 20 everything before here doesn't have trailing slash removal m_UserVarNames.add(_T("INSTDIR"),1); // 21 m_UserVarNames.add(_T("OUTDIR"),1); // 22 m_UserVarNames.add(_T("EXEDIR"),1); // 23 m_UserVarNames.add(_T("LANGUAGE"),1); // 24 m_UserVarNames.add(_T("TEMP"),-1); // 25 m_UserVarNames.add(_T("PLUGINSDIR"),-1); // 26 m_UserVarNames.add(_T("EXEPATH"),-1); // 27 m_UserVarNames.add(_T("EXEFILE"),-1); // 28 m_UserVarNames.add(_T("HWNDPARENT"),-1); // 29 m_UserVarNames.add(_T("_CLICK"),-1); // 30 m_UserVarNames.add(_T("_OUTDIR"),1); // 31 Note: nsDialogs also uses this m_iBaseVarsNum = m_UserVarNames.getnum(); m_ShellConstants.add(_T("WINDIR"),CSIDL_WINDOWS,CSIDL_WINDOWS); m_ShellConstants.add(_T("SYSDIR"),CSIDL_SYSTEM,CSIDL_SYSTEM); m_ShellConstants.add(_T("SMPROGRAMS"),CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS); m_ShellConstants.add(_T("SMSTARTUP"),CSIDL_STARTUP, CSIDL_COMMON_STARTUP); m_ShellConstants.add(_T("DESKTOP"),CSIDL_DESKTOPDIRECTORY, CSIDL_COMMON_DESKTOPDIRECTORY); m_ShellConstants.add(_T("STARTMENU"),CSIDL_STARTMENU, CSIDL_COMMON_STARTMENU); m_ShellConstants.add(_T("QUICKLAUNCH"), CSIDL_APPDATA, CSIDL_APPDATA); m_ShellConstants.add(_T("DOCUMENTS"),CSIDL_PERSONAL, CSIDL_COMMON_DOCUMENTS); m_ShellConstants.add(_T("SENDTO"),CSIDL_SENDTO, CSIDL_SENDTO); m_ShellConstants.add(_T("RECENT"),CSIDL_RECENT, CSIDL_RECENT); m_ShellConstants.add(_T("FAVORITES"),CSIDL_FAVORITES, CSIDL_COMMON_FAVORITES); m_ShellConstants.add(_T("MUSIC"),CSIDL_MYMUSIC, CSIDL_COMMON_MUSIC); m_ShellConstants.add(_T("PICTURES"),CSIDL_MYPICTURES, CSIDL_COMMON_PICTURES); m_ShellConstants.add(_T("VIDEOS"),CSIDL_MYVIDEO, CSIDL_COMMON_VIDEO); m_ShellConstants.add(_T("NETHOOD"), CSIDL_NETHOOD, CSIDL_NETHOOD); m_ShellConstants.add(_T("FONTS"), CSIDL_FONTS, CSIDL_FONTS); m_ShellConstants.add(_T("TEMPLATES"), CSIDL_TEMPLATES, CSIDL_COMMON_TEMPLATES); m_ShellConstants.add(_T("APPDATA"), CSIDL_APPDATA, CSIDL_COMMON_APPDATA); // Note: There is no all-users roaming appdata folder. m_ShellConstants.add(_T("LOCALAPPDATA"), CSIDL_LOCAL_APPDATA, CSIDL_COMMON_APPDATA); m_ShellConstants.add(_T("PRINTHOOD"), CSIDL_PRINTHOOD, CSIDL_PRINTHOOD); //m_ShellConstants.add(_T("ALTSTARTUP"), CSIDL_ALTSTARTUP, CSIDL_COMMON_ALTSTARTUP); m_ShellConstants.add(_T("INTERNET_CACHE"), CSIDL_INTERNET_CACHE, CSIDL_INTERNET_CACHE); m_ShellConstants.add(_T("COOKIES"), CSIDL_COOKIES, CSIDL_COOKIES); m_ShellConstants.add(_T("HISTORY"), CSIDL_HISTORY, CSIDL_HISTORY); m_ShellConstants.add(_T("PROFILE"), CSIDL_PROFILE, CSIDL_PROFILE); m_ShellConstants.add(_T("ADMINTOOLS"), CSIDL_ADMINTOOLS, CSIDL_COMMON_ADMINTOOLS); m_ShellConstants.add(_T("RESOURCES"), CSIDL_RESOURCES, CSIDL_RESOURCES); m_ShellConstants.add(_T("RESOURCES_LOCALIZED"), CSIDL_RESOURCES_LOCALIZED, CSIDL_RESOURCES_LOCALIZED); m_ShellConstants.add(_T("CDBURN_AREA"), CSIDL_CDBURN_AREA, CSIDL_CDBURN_AREA); // Constants that are not affected by SetShellVarContext m_ShellConstants.add(_T("USERAPPDATA"), CSIDL_APPDATA, CSIDL_APPDATA|0x40); // 0x40 to differentiate it from $QUICKLAUNCH m_ShellConstants.add(_T("USERLOCALAPPDATA"), CSIDL_LOCAL_APPDATA, CSIDL_LOCAL_APPDATA); m_ShellConstants.add(_T("USERTEMPLATES"), CSIDL_TEMPLATES, CSIDL_TEMPLATES); m_ShellConstants.add(_T("USERSTARTMENU"), CSIDL_STARTMENU, CSIDL_STARTMENU); m_ShellConstants.add(_T("USERSMPROGRAMS"), CSIDL_PROGRAMS, CSIDL_PROGRAMS); m_ShellConstants.add(_T("USERDESKTOP"), CSIDL_DESKTOPDIRECTORY, CSIDL_DESKTOPDIRECTORY); m_ShellConstants.add(_T("COMMONLOCALAPPDATA"), CSIDL_COMMON_APPDATA, CSIDL_COMMON_APPDATA); m_ShellConstants.add(_T("COMMONPROGRAMDATA"), CSIDL_COMMON_APPDATA, CSIDL_COMMON_APPDATA); // a.k.a. %ProgramData% m_ShellConstants.add(_T("COMMONTEMPLATES"), CSIDL_COMMON_TEMPLATES, CSIDL_COMMON_TEMPLATES); m_ShellConstants.add(_T("COMMONSTARTMENU"), CSIDL_COMMON_STARTMENU, CSIDL_COMMON_STARTMENU); m_ShellConstants.add(_T("COMMONSMPROGRAMS"), CSIDL_COMMON_PROGRAMS, CSIDL_COMMON_PROGRAMS); m_ShellConstants.add(_T("COMMONDESKTOP"), CSIDL_COMMON_DESKTOPDIRECTORY, CSIDL_COMMON_DESKTOPDIRECTORY); // PROGRAMFILES&COMMONFILES does a registry lookup and the required string offsets are filled in later. // We do this later because the unicode mode has to be locked when we call add_string... m_ShellConstants.add(_T("PROGRAMFILES"), 0, 0); m_ShellConstants.add(_T("PROGRAMFILES32"), 0, 0); m_ShellConstants.add(_T("PROGRAMFILES64"), 0, 0); m_ShellConstants.add(_T("COMMONFILES"), 0, 0); m_ShellConstants.add(_T("COMMONFILES32"), 0, 0); m_ShellConstants.add(_T("COMMONFILES64"), 0, 0); set_uninstall_mode(0); set_code_type_predefines(); } void CEXEBuild::initialize(const TCHAR *makensis_path) { tstring nsis_dir; const TCHAR *dir = _tgetenv(_T("NSISDIR")); if (dir) nsis_dir = dir; else { #ifndef NSIS_CONFIG_CONST_DATA_PATH nsis_dir = get_dir_name(get_executable_dir(makensis_path)); #else nsis_dir = _T(PREFIX_DATA); #endif } definedlist.add(_T("NSISDIR"), nsis_dir.c_str()); tstring includes_dir = nsis_dir; includes_dir += PLATFORM_PATH_SEPARATOR_STR _T("Include"); include_dirs.add(includes_dir.c_str(),0); stubs_dir = nsis_dir; stubs_dir += PLATFORM_PATH_SEPARATOR_STR _T("Stubs"); if (set_compressor(_T("zlib"), false) != PS_OK || set_target_architecture_data() != PS_OK) { throw runtime_error("error setting default stub"); } tstring uninst = stubs_dir + PLATFORM_PATH_SEPARATOR_STR + _T("uninst"); uninstaller_icon = load_icon_file(uninst.c_str()); changed_target = false; } int CEXEBuild::getcurdbsize() { return cur_datablock->getlen(); } void CEXEBuild::init_shellconstantvalues() { static bool done = false; if (done) return ; else done = true; const int orgunmode = uninstall_mode, t64 = is_target_64bit(), reg = 0x80, r32 = t64 ? 0xC0 : reg, r64 = r32 ^ 0x40; set_uninstall_mode(0); // Note: The order matters because some of the strings are preprocessed and cf must be <= 0x40 unsigned int pf = add_asciistring(_T("ProgramFilesDir"), 0); unsigned int cf = add_asciistring(_T("CommonFilesDir"), 0); unsigned int pf_def = add_asciistring(_T("C:\\Program Files")); // Ultimate fallback // TODO: 64-bit targets could use CSIDL_PROGRAM_FILES+CSIDL_PROGRAM_FILESX86? m_ShellConstants.set_values(_T("PROGRAMFILES"), reg | pf, pf_def); unsigned int pf_var = add_asciistring(_T("$PROGRAMFILES")); // Fallback for the 32/64 specific constants if the WOW registry view fails m_ShellConstants.set_values(_T("PROGRAMFILES32"), r32 | pf, reg != r32 ? pf_var : pf_def); m_ShellConstants.set_values(_T("PROGRAMFILES64"), r64 | pf, reg != r64 ? pf_var : pf_def); unsigned int cf_def = add_asciistring(_T("$PROGRAMFILES\\Common Files")); m_ShellConstants.set_values(_T("COMMONFILES"), reg | cf, cf_def); unsigned int cf_var = add_asciistring(_T("$COMMONFILES")); m_ShellConstants.set_values(_T("COMMONFILES32"), r32 | cf, reg != r32 ? cf_var : cf_def); m_ShellConstants.set_values(_T("COMMONFILES64"), r64 | cf, reg != r64 ? cf_var : cf_def); if ( (pf >= 0x40 || pf_def >= 0xFF || pf_var > 0xFF) // BUGBUG: pf_def should be ">"? || (cf > 0x40 || cf_def > 0xFF || cf_var > 0xFF) ) { // see Source\exehead\util.c for implementation details // basically, it knows it needs to get folders from the registry when the 0x80 is on const char* msg = "Internal compiler error: too many strings added to strings block before adding shell constants!"; ERROR_MSG(_T("%") NPRIns, msg); throw out_of_range(msg); } set_uninstall_mode(1); unsigned int unpf = add_asciistring(_T("ProgramFilesDir"), 0); unsigned int uncf = add_asciistring(_T("CommonFilesDir"), 0); unsigned int unpf_def = add_asciistring(_T("C:\\Program Files")); unsigned int unpf_var = add_asciistring(_T("$PROGRAMFILES")); unsigned int uncf_def = add_asciistring(_T("$PROGRAMFILES\\Common Files")); unsigned int uncf_var = add_asciistring(_T("$COMMONFILES")); set_uninstall_mode(orgunmode); if ( unpf != pf || unpf_def != pf_def || unpf_var != pf_var || uncf != cf || uncf_def != cf_def || uncf_var != cf_var ) { const char* msg = "Internal compiler error: installer's shell constants are different than uninstallers!"; ERROR_MSG(_T("%") NPRIns, msg); throw out_of_range(msg); } } // returns offset in stringblock int CEXEBuild::add_string(const TCHAR *string, int process/*=1*/, UINT codepage/*=-2*/) { if (!string || !*string) return 0; build_lockedunicodetarget = true; init_shellconstantvalues(); if ((UINT)-2 == codepage) { codepage = curlinereader ? curlinereader->StreamEncoding().GetCodepage() : CP_UTF8; // If the current source file is Unicode we have to pick a real codepage for ANSI! // It might not be the correct codepage but it's the best we can do. // Not using CP_ACP to avoid heisenbugs when compiled on a different system. if (NStreamEncoding::IsUnicodeCodepage(codepage)) codepage = 1252; } if (*string == _T('$') && *(string+1) == _T('(')) { int idx = 0; TCHAR *cp = _tcsdup(string+2); TCHAR *p = _tcschr(cp, _T(')')); if (p && p[1] == _T('\0') ) { // if string is only a language str identifier *p = 0; idx = DefineLangString(cp, process); } free(cp); if (idx < 0) return idx; } int i; if (process) { ExpandoString buf; // NOTE: It is impossible to know how much preprocessing will increase the size, we have to guess buf.Reserve(_tcsclen(string) * 2); preprocess_string(buf, string, codepage); // BUGBUG: This could overflow buf i = cur_strlist->add(buf, (WORD)codepage, true); } else i = cur_strlist->add(string, (WORD)codepage, false); return i; } int CEXEBuild::add_asciistring(const TCHAR *string, int process/*=1*/) { return add_string(string, process, 1252); } int CEXEBuild::add_intstring(const int i) // returns offset in stringblock { TCHAR buf[32]; wsprintf(buf, _T("%d"), i); return add_asciistring(buf, false); } #ifdef _UNICODE char* convert_processed_string_to_ansi(char *out, const TCHAR *in, WORD codepage) { const TCHAR *p=in; for (;;) { _TUCHAR i = (_TUCHAR)*p++; if (NS_IS_CODE(i)) // Note: this includes '\0' { // convert all character up to, and including this code int c = (int)(p-in), cb = WideCharToMultiByte(codepage, 0, in, c, out, c*2, NULL, NULL); if (!cb && i) return 0; out += cb; if (i == _T('\0')) break; else if (i == NS_SKIP_CODE) // BUGBUG: Shouldn't the escaped code be converted from wchar_t to codepage as well? *out++ = (char) *in++; // simply copy escaped code (01..04) else { WORD w = *p++; // special NSIS code is following by a WORD we need to output unchanged *out++ = LOBYTE(w); *out++ = HIBYTE(w); } in = p; } } return out; } #endif // based on Dave Laundon's code int CEXEBuild::preprocess_string(TCHAR *out, const TCHAR *in, WORD codepage/*=CP_ACP*/) { const TCHAR *p=in; while (*p) { const TCHAR *np; #ifdef _UNICODE np = CharNext(p); #else np = CharNextExA(codepage, p, 0); #endif if (np - p > 1) // multibyte TCHAR { size_t len = np - p; while (len--) { _TUCHAR i = (_TUCHAR)*p++; if (NS_IS_CODE(i)) { *out++ = (TCHAR)NS_SKIP_CODE; } *out++=(TCHAR)i; } continue; } _TUCHAR i = (_TUCHAR)*p; p=np; // increment p. // Test for characters extending into the variable codes if (NS_IS_CODE(i)) { *out++ = (TCHAR)NS_SKIP_CODE; // out does get the NS_CODE as well because of // "*out++=(TCHAR)i" at the end. } else if (i == _T('$')) { if (*p == _T('$')) p++; // Can simply convert $$ to $ now else { // starts with a $ but not $$. bool bProceced=false; if (*p) { const TCHAR *pUserVarName = p; while (isSimpleChar(*pUserVarName)) pUserVarName++; while (pUserVarName > p) { if (m_ShellConstants.get(p, truncate_cast(int, (size_t)(pUserVarName - p))) >= 0) break; // Woops it's a shell constant int idxUserVar = m_UserVarNames.get(p, truncate_cast(int, (size_t)(pUserVarName - p))); if (idxUserVar >= 0) { // Well, using variables inside string formatting doesn't mean // using the variable, because it will be always an empty string // which is also memory wasting // So the line below must be commented !?? //m_UserVarNames.inc_reference(idxUserVar); *out++ = (TCHAR) NS_VAR_CODE; // Named user variable; WORD w = FIX_ENDIAN_INT16(CODE_SHORT(idxUserVar)); unsigned int w4 = sizeof(TCHAR) > 2 ? FIX_ENDIAN_INT32(CODE_SHORT(idxUserVar)) : w; // Maybe this is too much endian fixing? if (sizeof(TCHAR) < 2) *((WORD*)out) = w, out += 2; else *out = (TCHAR) w4, out++; p += pUserVarName-p; // zip past the user var string. bProceced = true; break; } pUserVarName--; } }// if ( *p ) if (!bProceced && *p) { const TCHAR *pShellConstName = p; while (isSimpleChar(*pShellConstName)) pShellConstName++; while (pShellConstName > p) { // Look for the identifier in the shell constants list of strings. int idxConst = m_ShellConstants.get((TCHAR*)p, truncate_cast(int, (size_t)(pShellConstName - p))); // If found... if (idxConst >= 0) { init_shellconstantvalues(); int CSIDL_Value_current = m_ShellConstants.get_value1(idxConst); int CSIDL_Value_all = m_ShellConstants.get_value2(idxConst); *out++=(TCHAR)NS_SHELL_CODE; // Constant code identifier #ifdef _UNICODE *out++=MAKEWORD(CSIDL_Value_current, CSIDL_Value_all); #else *out++=(TCHAR)CSIDL_Value_current; *out++=(TCHAR)CSIDL_Value_all; #endif p = pShellConstName; // zip past the shell constant string. bProceced = true; break; } // We are looking from the longest identifier first and work // smaller. pShellConstName--; } } if ( !bProceced && *p == _T('(') ) { int idx = -1; TCHAR *cp = _tcsdup(p+1); // JP: Bad... should avoid memory alloc. TCHAR *pos = _tcschr(cp, _T(')')); if (pos) { *pos = 0; idx = DefineLangString(cp); if (idx < 0) { *out++ = (TCHAR)NS_LANG_CODE; // Next word is lang-string Identifier WORD w = FIX_ENDIAN_INT16(CODE_SHORT(-idx-1)); unsigned int w4 = sizeof(TCHAR) > 2 ? FIX_ENDIAN_INT32(CODE_SHORT(-idx-1)) : w; // Maybe this is too much endian fixing? if (sizeof(TCHAR) < 2) *((WORD*)out) = w, out += 2; else *out = (TCHAR) w4, out++; p += _tcslen(cp) + 2; bProceced = true; } } free(cp); } if ( bProceced ) continue; // outermost while else { TCHAR tbuf[64], cBracket = _T('\0'); bool bDoWarning = true; if ( *p == _T('[') ) cBracket = _T(']'); else if ( *p == _T('(') ) cBracket = _T(')'); else if ( *p == _T('{') ) cBracket = _T('}'); my_strncpy(tbuf,p,COUNTOF(tbuf)); if ( cBracket != 0 ) { if (_tcschr(tbuf,cBracket)) (_tcschr(tbuf,cBracket)+1)[0]=0; if ( tbuf[0] == _T('{') && tbuf[_tcslen(tbuf)-1] == _T('}') ) { TCHAR *tstIfDefine = _tcsdup(tbuf+1); tstIfDefine[_tcslen(tstIfDefine)-1] = _T('\0'); bDoWarning = definedlist.find(tstIfDefine) == NULL; // If it's a defined identifier, then don't warn. } } else { if (_tcsstr(tbuf,_T(" "))) _tcsstr(tbuf,_T(" "))[0]=0; } if ( bDoWarning ) warning_fl(DW_VAR_IGNORED_UNKNOWN, _T("unknown variable/constant \"%") NPRIs _T("\" detected, ignoring"),tbuf); i = _T('$'); // redundant since i is already '$' and has not changed. } } // else } // else if (i == _T('$')) *out++=(TCHAR)i; } // outside while *out=0; return 0; } // what it does is, when you pass it the offset of the last item added, it will determine if // that data is already present in the datablock, and if so, reference it instead (and shorten // the datablock as necessary). Reduces overhead if you want to add files to a couple places. // Woo, an optimizing installer generator, now we're styling. int CEXEBuild::datablock_optimize(int start_offset, int first_int) { int this_len = cur_datablock->getlen() - start_offset; cached_db_size this_size = {first_int, start_offset}; this->cur_datablock_cache->add(&this_size, sizeof(cached_db_size)); if (!this->build_optimize_datablock || this_len < (int) sizeof(int)) return start_offset; #ifdef DEBUG assert(dynamic_cast(cur_datablock)); #endif MMapBuf *db = static_cast(cur_datablock); db->setro(TRUE); cached_db_size *db_sizes = (cached_db_size *) this->cur_datablock_cache->get(); int db_sizes_num = this->cur_datablock_cache->getlen() / sizeof(cached_db_size); db_sizes_num--; // don't compare with the one we just added for (int i = 0; i < db_sizes_num; i++) { if (db_sizes[i].first_int == first_int) { int pos = db_sizes[i].start_offset; int left = this_len; while (left > 0) { int l = min(left, build_filebuflen); void *newstuff = db->get(start_offset + this_len - left, l); void *oldstuff = db->getmore(pos + this_len - left, l); int res = memcmp(newstuff, oldstuff, l); db->release(oldstuff, l); db->release(); if (res) break; left -= l; } if (!left) { db_opt_save += this_len; db->resize(max(start_offset, pos + this_len)); db->setro(FALSE); this->cur_datablock_cache->resize(cur_datablock_cache->getlen() - sizeof(cached_db_size)); return pos; } } } db->setro(FALSE); return start_offset; } bool CEXEBuild::datablock_finddata(IMMap&mmap, int mmstart, int size, int*ofs) { const int first_int = size; size &= ~ 0x80000000; #ifdef DEBUG assert(dynamic_cast(cur_datablock)); #endif MMapBuf *db = static_cast(cur_datablock); cached_db_size *db_sizes = (cached_db_size *) this->cur_datablock_cache->get(); int db_sizes_num = this->cur_datablock_cache->getlen() / sizeof(cached_db_size); for (int i = 0; i < db_sizes_num; i++) { if (db_sizes[i].first_int != first_int) continue; int left = size, oldpos = db_sizes[i].start_offset; while (left > 0) { int cbCmp = min(left, build_filebuflen); void *newstuff = mmap.get(mmstart + size - left, cbCmp); void *oldstuff = db->get(sizeof(int) + oldpos + size - left, cbCmp); int res = memcmp(newstuff, oldstuff, cbCmp); mmap.release(), db->release(); if (res) break; left -= cbCmp; } if (!left) { if (ofs) *ofs = oldpos; return true; } } return false; } int CEXEBuild::add_db_data(IMMap *mmap) // returns offset { build_compressor_set = true; int done = 0; if (!mmap) { ERROR_MSG(_T("Error: add_db_data() called with invalid mapped file\n")); return -1; } int length = mmap->getsize(); if (length < 0) { ERROR_MSG(_T("Error: add_db_data() called with length=%d\n"), length); return -1; } // Jim Park: This kind of stuff looks scary and it is. cur_datablock is // most likely to point to a MMapBuf type right now so it works. MMapBuf *db = (MMapBuf *) this->cur_datablock; int st = db->getlen(); #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (length && !build_compress_whole && build_compress) { // grow datablock so that there is room to compress into int bufferlen, of = false, tmp = 0; of |= !si_add(tmp, length, 1024); of |= !si_add(tmp, tmp, length / 4); // give a nice 25% extra space if (!of) { bufferlen = tmp; of |= !si_add(tmp, st, bufferlen); of |= !si_add(tmp, tmp, sizeof(int)); } if (of) // we've hit a signed integer overflow (file is over 1.6 GB) bufferlen = INT_MAX - st - sizeof(int); // so maximize compressor room and hope the file compresses well db->resize(st + bufferlen + sizeof(int)); int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); extern void quit(); quit(); } int avail_in = length; int avail_out = bufferlen; int ret; while (avail_in > 0) { int in_len = min(this->build_filebuflen, avail_in); int out_len = min(this->build_filebuflen, avail_out); compressor->SetNextIn((char*) mmap->get(length - avail_in, in_len), in_len); compressor->SetNextOut((char*) db->get(st + sizeof(int) + bufferlen - avail_out, out_len), out_len); if ((ret = compressor->Compress(0)) < 0) { ERROR_MSG(_T("Error: add_db_data() - compress() failed(%") NPRIs _T(" [%d])\n"), compressor->GetErrStr(ret), ret); return -1; } mmap->release(); db->flush(out_len); db->release(); avail_in -= in_len - compressor->GetAvailIn(); avail_out -= out_len - compressor->GetAvailOut(); if (!avail_out) // not enough space in the output buffer - no compression is better break; } // if not enough space in the output buffer - no compression is better if (avail_out) { char *out; char a; compressor->SetNextIn(&a,0); do { int out_len = min(build_filebuflen, avail_out); out = (char *) db->get(st + sizeof(int) + bufferlen - avail_out, out_len); compressor->SetNextOut(out, out_len); if ((ret = compressor->Compress(C_FINISH)) < 0) { ERROR_MSG(_T("Error: add_db_data() - compress() failed(%") NPRIs _T(" [%d])\n"), compressor->GetErrStr(ret), ret); return -1; } db->flush(out_len); db->release(); avail_out -= out_len - compressor->GetAvailOut(); } while (compressor->GetNextOut() - out > 0 && avail_out > 0); compressor->End(); int used = bufferlen - avail_out; // never store compressed if output buffer is full (compression increased the size...) if (avail_out && (build_compress == 2 || used < length)) { done=1; db->resize(st + used + sizeof(int)); *(int*)db->get(st, sizeof(int)) = FIX_ENDIAN_INT32(used | 0x80000000); db->release(); int nst = datablock_optimize(st, used | 0x80000000); if (nst == st) db_comp_save += length - used; else st = nst; } } else compressor->End(); } #endif // NSIS_CONFIG_COMPRESSION_SUPPORT if (!done) { // Adding the same file twice can push cur_datablock over the limit // because datablock_optimize() happens too late. Let's try to find a dupe early. if (this->build_optimize_datablock && st + length < 0) { int oldst; if (datablock_finddata(*mmap, 0, length, &oldst)) return (db_full_size += length, db_opt_save += length, oldst); } db->resize(st + sizeof(int) + length); int *plen = (int *) db->get(st, sizeof(int)); *plen = FIX_ENDIAN_INT32(length); db->release(); int left = length; while (left > 0) { int l = min(build_filebuflen, left); int *p = (int *) db->get(st + sizeof(int) + length - left, l); memcpy(p, mmap->get(length - left, l), l); db->flush(l); db->release(); mmap->release(); left -= l; } st = datablock_optimize(st, length); } db_full_size += length + sizeof(int); return st; } int CEXEBuild::add_db_data(const char *data, int length) // returns offset { MMapFake fakemap; fakemap.set(data, length); return add_db_data(&fakemap); } int CEXEBuild::add_data(const char *data, int length, IGrowBuf *dblock) // returns offset { build_compressor_set=true; int done=0; if (length < 0) { ERROR_MSG(_T("Error: add_data() called with length=%d\n"),length); return -1; } int st=dblock->getlen(); #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (!build_compress_whole && build_compress) { // grow datablock so that there is room to compress into int bufferlen=length+1024+length/4; // give a nice 25% extra space dblock->resize(st+bufferlen+sizeof(int)); int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); extern void quit(); quit(); } compressor->SetNextIn((char*)data, length); compressor->SetNextOut((char*)dblock->get() + st + sizeof(int), bufferlen); compressor->Compress(C_FINISH); int used=bufferlen-compressor->GetAvailOut(); // never store compressed if output buffer is full if (compressor->GetAvailOut() && (build_compress == 2 || used < length)) { done=1; dblock->resize(st+used+sizeof(int)); *((int*)((char *)dblock->get()+st)) = FIX_ENDIAN_INT32(used|0x80000000); } compressor->End(); } #endif // NSIS_CONFIG_COMPRESSION_SUPPORT if (!done) { dblock->resize(st); int rl = FIX_ENDIAN_INT32(length); dblock->add(&rl,sizeof(int)); dblock->add(data,length); } return st; } int CEXEBuild::add_label(const TCHAR *name) { if (!build_cursection) { ERROR_MSG(_T("Error: Label declaration not valid outside of function/section\n")); return PS_ERROR; } if ((name[0] >= _T('0') && name[0] <= _T('9')) || name[0] == _T('-') || name[0] == _T(' ') || name[0] == _T(':')) { ERROR_MSG(_T("Error: labels must not begin with 0-9, -, :, or a space.\n")); return PS_ERROR; } int cs=build_cursection->code; int ce=cs+build_cursection->code_size; TCHAR *p=_tcsdup(name); if (p[_tcslen(p)-1] == _T(':')) p[_tcslen(p)-1]=0; int offs=ns_label.add(p,0); free(p); int n=cur_labels->getlen()/sizeof(section); // Check to see if the label already exists. if (n) { section *t=(section*)cur_labels->get(); while (n--) { // Labels beginning with '.' are global and can be jumped to from any function or section. if ((*name == _T('.') || (t->code >= cs && t->code <= ce)) && t->name_ptr==offs) { if (*name == _T('.')) ERROR_MSG(_T("Error: global label \"%") NPRIs _T("\" already declared\n"),name); else { const TCHAR *szType = _T("section"); if (build_cursection_isfunc) szType = _T("function"); ERROR_MSG(_T("Error: label \"%") NPRIs _T("\" already declared in %") NPRIs _T("\n"),name,szType); } return PS_ERROR; } t++; } } section s={0}; s.name_ptr = offs; s.code = ce; cur_labels->add(&s,sizeof(s)); return PS_OK; } int CEXEBuild::add_function(const TCHAR *funname) { if (build_cursection_isfunc) { ERROR_MSG(_T("Error: Function open when creating function (use FunctionEnd first)\n")); return PS_ERROR; } if (build_cursection) { ERROR_MSG(_T("Error: Section open when creating function (use SectionEnd first)\n")); return PS_ERROR; } if (cur_page) { ERROR_MSG(_T("Error: PageEx open when creating function (use PageExEnd first)\n")); return PS_ERROR; } if (!funname[0]) { ERROR_MSG(_T("Error: Function must have a name\n")); return PS_ERROR; } set_uninstall_mode(!_tcsnicmp(funname,_T("un."),3)); // ns_func contains all the function names defined. int addr=ns_func.add(funname,0); int n=cur_functions->getlen()/sizeof(section), x; section *tmp=(section*)cur_functions->get(); for (x = 0; x < n; x ++) { if (tmp[x].name_ptr == addr) { ERROR_MSG(_T("Error: Function named \"%") NPRIs _T("\" already exists.\n"),funname); return PS_ERROR; } } cur_functions->resize((n+1)*sizeof(section)); build_cursection=((section*)cur_functions->get())+n; build_cursection_isfunc=1; build_cursection->name_ptr=addr; build_cursection->code=cur_entries->getlen()/sizeof(entry); build_cursection->code_size=0; build_cursection->install_types=0; build_cursection->flags=0; build_cursection->size_kb=0; memset(build_cursection->name,0,sizeof(build_cursection->name)); if (uninstall_mode) set_code_type_predefines(funname+3); else set_code_type_predefines(funname); return PS_OK; } int CEXEBuild::function_end() { if (!build_cursection_isfunc) { ERROR_MSG(_T("Error: No function open, FunctionEnd called\n")); return PS_ERROR; } // add ret. add_entry_direct(EW_RET); build_cursection_isfunc=0; build_cursection=NULL; set_uninstall_mode(0); set_code_type_predefines(); return PS_OK; } int CEXEBuild::section_add_flags(int flags) { if (!build_cursection || build_cursection_isfunc) { ERROR_MSG(_T("Error: can't modify flags when no section is open\n")); return PS_ERROR; } build_cursection->flags |= flags; return PS_OK; } int CEXEBuild::section_add_install_type(int inst_type) { if (!build_cursection || build_cursection_isfunc) { ERROR_MSG(_T("Error: can't modify flags when no section is open\n")); return PS_ERROR; } if (build_cursection->install_types == ~0) build_cursection->install_types = 0; build_cursection->install_types |= inst_type; return PS_OK; } void CEXEBuild::section_add_size_kb(int kb) { if (build_cursection) { build_cursection->size_kb+=kb; } } int CEXEBuild::section_end() { if (build_cursection_isfunc) { ERROR_MSG(_T("Error: SectionEnd specified in function (not section)\n")); return PS_ERROR; } if (!build_cursection) { ERROR_MSG(_T("Error: SectionEnd specified and no sections open\n")); return PS_ERROR; } add_entry_direct(EW_RET); build_cursection->code_size--; build_cursection=NULL; if (!sectiongroup_open_cnt) set_uninstall_mode(0); set_code_type_predefines(); return PS_OK; } int CEXEBuild::add_section(const TCHAR *secname, const TCHAR *defname, int expand/*=0*/) { if (build_cursection_isfunc) { ERROR_MSG(_T("Error: Section can't create section (already in function, use FunctionEnd first)\n")); return PS_ERROR; } if (cur_page) { ERROR_MSG(_T("Error: PageEx already open, call PageExEnd first\n")); return PS_ERROR; } if (build_cursection) { ERROR_MSG(_T("Error: Section already open, call SectionEnd first\n")); return PS_ERROR; } section new_section; new_section.flags = SF_SELECTED; new_section.flags |= expand ? SF_EXPAND : 0; new_section.code_size = 0; new_section.size_kb = 0; TCHAR *name = (TCHAR*)secname; if (name[0] == _T('\x1F')) // SectionGroup/SectionGroupEnd { if (name[1]) { new_section.flags |= SF_SECGRP; name++; } else new_section.flags |= SF_SECGRPEND; } int hidden = (name[0] == _T('-')); if (hidden) name++; if (name[0] == _T('!')) { name++; new_section.flags |= SF_BOLD; } int old_uninstall_mode = uninstall_mode; set_uninstall_mode(0); if (!_tcsnicmp(name, _T("un."), 3)) { set_uninstall_mode(1); name += 3; } if (!_tcsicmp(name, _T("uninstall"))) { set_uninstall_mode(1); } if ((new_section.flags & SF_SECGRPEND) && sectiongroup_open_cnt && old_uninstall_mode) { set_uninstall_mode(1); } if (sectiongroup_open_cnt) { if (uninstall_mode != old_uninstall_mode) { ERROR_MSG(_T("Error: Can't create %") NPRIs _T(" section in %") NPRIs _T(" section group (use SectionGroupEnd first)\n"), uninstall_mode ? _T("uninstaller") : _T("installer"), old_uninstall_mode ? _T("uninstaller") : _T("installer")); return PS_ERROR; } } new_section.code = cur_entries->getlen() / sizeof(entry); new_section.install_types = (!hidden && *name) ? 0 : ~0; new_section.name_ptr = hidden ? 0 : add_string(name); memset(&new_section.name,0,sizeof(new_section.name)); cur_sections->add(&new_section, sizeof(section)); build_cursection = (section *) cur_sections->get() + cur_header->blocks[NB_SECTIONS].num; if (defname[0]) { TCHAR buf[1024]; wsprintf(buf, _T("%d"), cur_header->blocks[NB_SECTIONS].num); if (definedlist.add(defname, buf)) { ERROR_MSG(_T("Error: \"%") NPRIs _T("\" already defined, can't assign section index!\n"), defname); return PS_ERROR; } } cur_header->blocks[NB_SECTIONS].num++; if (new_section.flags & (SF_SECGRP | SF_SECGRPEND)) { add_entry_direct(EW_RET); build_cursection->code_size = 0; build_cursection = 0; if (new_section.flags & SF_SECGRPEND) { sectiongroup_open_cnt--; if (sectiongroup_open_cnt < 0) { ERROR_MSG(_T("SectionGroupEnd: no SectionGroups are open\n")); return PS_ERROR; } if (!sectiongroup_open_cnt) { set_uninstall_mode(0); } } else sectiongroup_open_cnt++; } set_code_type_predefines(name); return PS_OK; } int CEXEBuild::add_entry(const entry *ent) { if (!build_cursection && !uninstall_mode) { ERROR_MSG(_T("Error: Can't add entry, no section or function is open!\n")); return PS_ERROR; } cur_entries->add(ent,sizeof(entry)); cur_instruction_entry_map->add(&multiple_entries_instruction,sizeof(int)); build_cursection->code_size++; cur_header->blocks[NB_ENTRIES].num++; multiple_entries_instruction=1; return PS_OK; } int CEXEBuild::add_entry_direct(int which, int o0, int o1, int o2, int o3, int o4, int o5 /*o#=0*/) { entry ent; ent.which = which; ent.offsets[0] = o0; ent.offsets[1] = o1; ent.offsets[2] = o2; ent.offsets[3] = o3; ent.offsets[4] = o4; ent.offsets[5] = o5; return add_entry(&ent); } int CEXEBuild::resolve_jump_int(const TCHAR *fn, int *a, int offs, int start, int end) { if (*a > 0) { TCHAR *lname=(TCHAR*)ns_label.get()+*a; if (lname[0] == _T('-') || lname[0]==_T('+')) { int jump = _ttoi(lname); int *skip_map = (int *) cur_instruction_entry_map->get(); int maxoffs = cur_instruction_entry_map->getlen() / (int) sizeof(int); int direction = 1; if (jump < 0) direction = -1; for (; jump != 0; jump -= direction) { offs += direction; if (offs >= 0 && offs < maxoffs) { while (skip_map[offs]) { offs += direction; } } } *a = offs + 1; } else { section *s = (section*)cur_labels->get(); int n=cur_labels->getlen()/sizeof(section); while (n-->0) { if ((*lname == _T('.') || (s->code >= start && s->code <= end)) && s->name_ptr == *a) { *a = s->code+1; // jumps are to the absolute position, +1 (to differentiate between no jump, and jumping to offset 0) s->flags++; if (*lname == _T('.')) { // bug #2593369 - mark functions with used global labels as used // XXX this puts another hole in function reference counting // a recursive function, for example, will never be optimized int nf=cur_functions->getlen()/sizeof(section); section *func=(section *)cur_functions->get(); while (nf-- > 0) { int fstart = func->code; int fend = func->code + func->code_size; if (s->code >= fstart && s->code <= fend) { func->flags++; break; } func++; } } return 0; } s++; } ERROR_MSG(_T("Error: could not resolve label \"%") NPRIs _T("\" in %") NPRIs _T("\n"),lname,fn); return 1; } } else if (*a < 0) // to jump to a user variable target, -variable_index-1 is already stored. { } // otherwise, *a is 0, which means no jump and we also leave it intact return 0; } int CEXEBuild::resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs) { if (fptr < 0) return 0; int nf=cur_functions->getlen()/sizeof(section); section *sec=(section *)cur_functions->get(); while (nf-- > 0) { if (sec->name_ptr>0 && sec->name_ptr == fptr) { ofs[0]=sec->code; sec->flags++; return 0; } sec++; } ERROR_MSG(_T("Error: resolving %") NPRIs _T(" function \"%") NPRIs _T("\" in %") NPRIs _T("\n"),str,(TCHAR*)ns_func.get()+fptr,fn); ERROR_MSG(_T("Note: uninstall functions must begin with \"un.\", and install functions must not\n")); return 1; } int CEXEBuild::resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end) { if (w->which == EW_NOP) { if (resolve_jump_int(fn,&w->offsets[0],offs,start,end)) return 1; } #ifdef NSIS_SUPPORT_MESSAGEBOX else if (w->which == EW_MESSAGEBOX) { if (resolve_jump_int(fn,&w->offsets[3],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[5],offs,start,end)) return 1; } #endif else if (w->which == EW_IFFILEEXISTS) { if (resolve_jump_int(fn,&w->offsets[1],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[2],offs,start,end)) return 1; } else if (w->which == EW_IFFLAG) { if (resolve_jump_int(fn,&w->offsets[0],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[1],offs,start,end)) return 1; } #ifdef NSIS_SUPPORT_STROPTS else if (w->which == EW_STRCMP) { if (resolve_jump_int(fn,&w->offsets[2],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[3],offs,start,end)) return 1; } #endif #ifdef NSIS_SUPPORT_INTOPTS else if (w->which == EW_INTCMP) { if (resolve_jump_int(fn,&w->offsets[2],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[3],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[4],offs,start,end)) return 1; } #endif #ifdef NSIS_SUPPORT_HWNDS else if (w->which == EW_ISWINDOW) { if (resolve_jump_int(fn,&w->offsets[1],offs,start,end)) return 1; if (resolve_jump_int(fn,&w->offsets[2],offs,start,end)) return 1; } #endif else if (w->which == EW_CALL) { if (w->offsets[0] >= 0 && w->offsets[1]) // get as jump { if (resolve_jump_int(fn,&w->offsets[0],offs,start,end)) return 1; } else { if (w->offsets[0] >= 0 && resolve_call_int(fn,str,w->offsets[0],w->offsets)) return 1; // if w->offsets[0] >= 0, EW_CALL requires that it 1-based. // otherwise, if < 0, it needs an increment anyway (since it // was encoded with a -2 base, to prevent it looking like an // empty string "") w->offsets[0]++; } } #ifdef NSIS_SUPPORT_STROPTS else if (w->which == EW_GETFUNCTIONADDR) { if (w->offsets[1] < 0) { ERROR_MSG(_T("Error: GetFunctionAddress requires a real function to get address of.\n")); return 1; } if (resolve_call_int(fn,str,w->offsets[1],&w->offsets[1])) return 1; w->which=EW_ASSIGNVAR; w->offsets[1]=add_intstring(w->offsets[1]+1); // +1 here to make 1-based. } else if (w->which == EW_GETLABELADDR) { if (resolve_jump_int(fn,&w->offsets[1],offs,start,end)) return 1; w->which=EW_ASSIGNVAR; w->offsets[1]=add_intstring(w->offsets[1]); } #endif return 0; } int CEXEBuild::resolve_coderefs(const TCHAR *str) { // resolve jumps&calls { section *sec=(section *)cur_functions->get(); int l=cur_functions->getlen()/sizeof(section); entry *w=(entry *)cur_entries->get(); while (l-- > 0) { int x; for (x = sec->code; x < sec->code+sec->code_size; x ++) { TCHAR fname[1024]; wsprintf(fname,_T("function \"%") NPRIs _T("\""),ns_func.get()+sec->name_ptr); if (resolve_instruction(fname,str,w+x,x,sec->code,sec->code+sec->code_size)) return 1; } sec++; } int cnt=0; sec=(section *)cur_sections->get(); l=cur_sections->getlen()/sizeof(section); while (l-- > 0) { int x=sec->name_ptr; TCHAR fname[1024]; tstring section_name; if (x < 0) { // lang string section_name = _T("$(lang string)"); } else { // normal string cur_strlist->get(x,section_name); } if (x) wsprintf(fname,_T("%") NPRIs _T(" section \"%") NPRIs _T("\" (%d)"),str,section_name.c_str(),cnt); else wsprintf(fname,_T("unnamed %") NPRIs _T(" section (%d)"),str,cnt); for (x = sec->code; x < sec->code+sec->code_size; x ++) { if (resolve_instruction(fname,str,w+x,x,sec->code,sec->code+sec->code_size)) return 1; } sec++; cnt++; } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_SUPPORT_CODECALLBACKS if (cur_pages->getlen()) { page *p=(page *)cur_pages->get(); int i = 0; while (i < cur_header->blocks[NB_PAGES].num) { TCHAR pagestr[1024]; wsprintf(pagestr, _T("%") NPRIs _T(" pages"), str); if (resolve_call_int(pagestr,p->dlg_id?_T("pre-page"):_T("create-page"),p->prefunc,&p->prefunc)) return 1; if (resolve_call_int(pagestr,_T("show-page"),p->showfunc,&p->showfunc)) return 1; if (resolve_call_int(pagestr,_T("leave-page"),p->leavefunc,&p->leavefunc)) return 1; p++; i++; } } #endif #endif } #ifdef NSIS_SUPPORT_CODECALLBACKS // resolve callbacks { struct { const TCHAR *name; int *p; } callbacks[] = { {_T("%") NPRIs _T(".onInit"), &cur_header->code_onInit}, {_T("%") NPRIs _T(".on%") NPRIs _T("InstSuccess"), &cur_header->code_onInstSuccess}, {_T("%") NPRIs _T(".on%") NPRIs _T("InstFailed"), &cur_header->code_onInstFailed}, {_T("%") NPRIs _T(".onUserAbort"), &cur_header->code_onUserAbort}, {_T("%") NPRIs _T(".onVerifyInstDir"), &cur_header->code_onVerifyInstDir}, #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT {_T("%") NPRIs _T(".onGUIInit"), &cur_header->code_onGUIInit}, {_T("%") NPRIs _T(".onGUIEnd"), &cur_header->code_onGUIEnd}, {_T("%") NPRIs _T(".onMouseOverSection"), &cur_header->code_onMouseOverSection}, #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT #ifdef NSIS_CONFIG_COMPONENTPAGE {_T("%") NPRIs _T(".onSelChange"), &cur_header->code_onSelChange}, #endif//NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_SUPPORT_REBOOT {_T("%") NPRIs _T(".onRebootFailed"), &cur_header->code_onRebootFailed}, #endif//NSIS_SUPPORT_REBOOT {0, 0} }; for (int i = 0; callbacks[i].name; i++) { const TCHAR *un = uninstall_mode ? _T("un") : _T(""); TCHAR fname[1024]; wsprintf(fname, callbacks[i].name, un, un); TCHAR cbstr[1024]; wsprintf(cbstr, _T("%") NPRIs _T(" callback"), str); TCHAR cbstr2[1024]; wsprintf(cbstr2, _T("%") NPRIs _T(".callbacks"), un); if (resolve_call_int(cbstr,cbstr2,ns_func.find(fname,0),callbacks[i].p)) return PS_ERROR; } } #endif//NSIS_SUPPORT_CODECALLBACKS // optimize unused functions { section *sec=(section *)cur_functions->get(); int l=cur_functions->getlen()/sizeof(section); entry *w=(entry*)cur_entries->get(); while (l-- > 0) { if (sec->name_ptr) { if (!sec->flags) { if (sec->code_size>0) { warning(DW_UNUSED_FUNCTION, _T("%") NPRIs _T(" function \"%") NPRIs _T("\" not referenced - zeroing code (%d-%d) out\n"),str, ns_func.get()+sec->name_ptr, sec->code,sec->code+sec->code_size); memset(w+sec->code,0,sec->code_size*sizeof(entry)); } } } sec++; } } // give warnings on unused labels { section *t=(section*)cur_labels->get(); int n=cur_labels->getlen()/sizeof(section); while (n-->0) { if (!t->flags) { TCHAR *n=(TCHAR*)ns_label.get()+t->name_ptr; if (*n == _T('.')) warning(DW_UNUSED_GLOBALLABEL, _T("global label \"%") NPRIs _T("\" not used"),n); else warning(DW_UNUSED_LABEL, _T("label \"%") NPRIs _T("\" not used"),n); } t++; } } return 0; } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT int CEXEBuild::add_page(int type) { page pg = { 0, 0, #ifdef NSIS_SUPPORT_CODECALLBACKS -1, -1, -1, #endif 0, }; #ifndef NSIS_CONFIG_LICENSEPAGE if (type == PAGE_LICENSE) { ERROR_MSG(_T("Error: can't add %") NPRIns _T(" page, %") NPRIns _T(" not defined.\n"), "license", "NSIS_CONFIG_LICENSEPAGE"); return PS_ERROR; } #endif #ifndef NSIS_CONFIG_COMPONENTPAGE if (type == PAGE_COMPONENTS) { ERROR_MSG(_T("Error: can't add %") NPRIns _T(" page, %") NPRIns _T(" not defined.\n"), "components", "NSIS_CONFIG_COMPONENTPAGE"); return PS_ERROR; } #endif #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT if (type == PAGE_COMPONENTS) { ERROR_MSG(_T("Error: can't add %") NPRIns _T(" page, %") NPRIns _T(" not defined.\n"), "uninstConfirm", "NSIS_CONFIG_UNINSTALL_SUPPORT"); return PS_ERROR; } #endif struct { int wndproc_id; int dlg_id; const TCHAR *name; } ids[] = { {PWP_CUSTOM, 0, _T("custom")}, // custom #ifdef NSIS_CONFIG_LICENSEPAGE {PWP_LICENSE, IDD_LICENSE, _T("license")}, // license #else {0, IDD_LICENSE, _T("license")}, // license #endif #ifdef NSIS_CONFIG_COMPONENTPAGE {PWP_SELCOM, IDD_SELCOM, _T("components")}, // components #else {0, IDD_SELCOM, _T("components")}, // components #endif {PWP_DIR, IDD_DIR, _T("directory")}, // directory {PWP_INSTFILES, IDD_INSTFILES, _T("instfiles")}, // instfiles #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT {PWP_UNINST, IDD_UNINST, _T("uninstConfirm")}, // uninstConfirm #else {0, IDD_UNINST, _T("uninstConfirm")}, // uninstConfirm #endif {PWP_COMPLETED, -1, NULL} // completed }; pg.wndproc_id = ids[type].wndproc_id; pg.dlg_id = ids[type].dlg_id; cur_pages->add(&pg,sizeof(page)); cur_page = (page *)cur_pages->get() + cur_header->blocks[NB_PAGES].num++; cur_page_type = type; set_code_type_predefines(ids[type].name); return PS_OK; } int CEXEBuild::page_end() { cur_page = 0; set_code_type_predefines(); return PS_OK; } #endif #ifdef NSIS_SUPPORT_VERSION_INFO int CEXEBuild::AddVersionInfo() { GrowBuf VerInfoStream; // Should probably check for (4 & version_fixedflags) here, but VIProductVersion without VIAddVersionKey // fails silently, so VIFileVersion does the same... if ( rVersionInfo.GetStringTablesCount() > 0 ) { if ( !(1 & version_fixedflags) ) { ERROR_MSG(_T("Error: VIProductVersion is required when other version information functions are used.\n")); return PS_ERROR; } else { if ( !(2 & version_fixedflags) ) { // This error string should match the one used by the TOK_VI_SETFILEVERSION handler ERROR_MSG(_T("Error: invalid %") NPRIs _T(" format, should be X.X.X.X\n"),_T("VIProductVersion")); return PS_ERROR; } try { init_res_editor(); for ( int i = 0; i < rVersionInfo.GetStringTablesCount(); i++ ) { LANGID lang_id = rVersionInfo.GetLangID(i); int code_page = rVersionInfo.GetCodePage(i); const TCHAR *lang_name = GetLangNameAndCPForVersionResource(lang_id, NULL, false); const TCHAR *recverkeys = _T("FileVersion\0") _T("FileDescription\0") _T("LegalCopyright\0"); for(;;) { if ( !*recverkeys ) break; if ( !rVersionInfo.FindKey(lang_id, code_page, recverkeys) ) warning(DW_VI_MISSINGSTDKEY, _T("Generating version information for language \"%04d-%") NPRIs _T("\" without standard key \"%") NPRIs _T("\""), lang_id, lang_name, recverkeys); recverkeys += _tcsclen(recverkeys) + 1; } rVersionInfo.ExportToStream(VerInfoStream, i); res_editor->UpdateResource(RT_VERSION, 1, lang_id, (BYTE*)VerInfoStream.get(), VerInfoStream.getlen()); } } catch (exception& err) { ERROR_MSG(_T("Error adding version information: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } } } return PS_OK; } #endif // NSIS_SUPPORT_VERSION_INFO #ifdef NSIS_CONFIG_VISIBLE_SUPPORT int CEXEBuild::ProcessPages() { SCRIPT_MSG(_T("Processing pages... ")); int license_normal=0; int license_fsrb=0; int license_fscb=0; int selcom=0; int dir=0; int uninstconfirm=0; int instlog=0, instlog_used; int main=0; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT again: #endif instlog_used = 0; #ifdef NSIS_CONFIG_SILENT_SUPPORT if ((cur_header->flags & (CH_FLAGS_SILENT|CH_FLAGS_SILENT_LOG)) == 0) #endif { main++; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT #define LS(inst, uninst) (uninstall_mode ? uninst : inst) #else #define LS(inst, uninst) inst #endif DefineInnerLangString(NLF_BRANDING); if (!cur_pages->getlen()) { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (uninstall_mode) { if (HasUserDefined(NLF_UNINST_TEXT)) { add_page(PAGE_UNINSTCONFIRM); page_end(); } add_page(PAGE_INSTFILES); page_end(); add_page(PAGE_COMPLETED); page_end(); } else #endif { #ifdef NSIS_CONFIG_LICENSEPAGE if (HasUserDefined(NLF_LICENSE_TEXT) && HasUserDefined(NLF_LICENSE_DATA)) { add_page(PAGE_LICENSE); page_end(); } #endif #ifdef NSIS_CONFIG_COMPONENTPAGE if (HasUserDefined(NLF_COMP_TEXT)) { add_page(PAGE_COMPONENTS); page_end(); } #endif if (HasUserDefined(NLF_DIR_TEXT)) { add_page(PAGE_DIRECTORY); page_end(); } add_page(PAGE_INSTFILES); page_end(); add_page(PAGE_COMPLETED); page_end(); } } // start processing the pages { int i = 0; page *p = (page *) cur_pages->get(); for (i = 0; i < cur_header->blocks[NB_PAGES].num; i++, p++) { page *pp = 0; if (i) { pp = p - 1; // set back button p->flags |= PF_BACK_SHOW; if (pp->wndproc_id != PWP_COMPLETED && p->wndproc_id != PWP_COMPLETED && p->wndproc_id != PWP_INSTFILES) p->flags |= PF_BACK_ENABLE; if (!p->back) p->back = DefineInnerLangString(NLF_BTN_BACK); // set previous page's next button if (!pp->next) { int str = 0; #ifdef NSIS_CONFIG_LICENSEPAGE if (pp->wndproc_id == PWP_LICENSE && (!(pp->flags & PF_LICENSE_FORCE_SELECTION) || HasUserDefined(NLF_BTN_LICENSE))) str = NLF_BTN_LICENSE; else #endif if (p->wndproc_id == PWP_INSTFILES) str = LS(NLF_BTN_INSTALL, NLF_BTN_UNINSTALL); else str = NLF_BTN_NEXT; pp->next = DefineInnerLangString(str); } // set previous page's click next text if (!pp->clicknext) { int str = 0; if (p->wndproc_id == PWP_INSTFILES) str = LS(NLF_CLICK_INSTALL, NLF_CLICK_UNINSTALL); else str = NLF_CLICK_NEXT; pp->clicknext = DefineInnerLangString(str); } } // enable next button if (p->wndproc_id != PWP_INSTFILES) p->flags |= PF_NEXT_ENABLE; // set cancel button if (!p->cancel) p->cancel = DefineInnerLangString(NLF_BTN_CANCEL); if (p->wndproc_id != PWP_INSTFILES && p->wndproc_id != PWP_COMPLETED) p->flags |= PF_CANCEL_ENABLE; // set caption struct { int caption; int ucaption; } captions[] = { #ifdef NSIS_CONFIG_LICENSEPAGE {NLF_SUBCAPTION_LICENSE, NLF_SUBCAPTION_LICENSE}, #endif #ifdef NSIS_CONFIG_COMPONENTPAGE {NLF_SUBCAPTION_OPTIONS, NLF_SUBCAPTION_OPTIONS}, #endif {NLF_SUBCAPTION_DIR, NLF_SUBCAPTION_DIR}, {NLF_SUBCAPTION_INSTFILES, NLF_USUBCAPTION_INSTFILES}, #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT {NLF_USUBCAPTION_CONFIRM, NLF_USUBCAPTION_CONFIRM}, #endif {NLF_SUBCAPTION_COMPLETED, NLF_USUBCAPTION_COMPLETED} }; if (!p->caption && p->wndproc_id != PWP_CUSTOM) { p->caption = DefineInnerLangString(LS(captions[p->wndproc_id].caption, captions[p->wndproc_id].ucaption)); } // set texts switch (p->dlg_id) { #ifdef NSIS_CONFIG_LICENSEPAGE case IDD_LICENSE: case IDD_LICENSE_FSRB: case IDD_LICENSE_FSCB: { if (!(p->flags & PF_PAGE_EX)) p->dlg_id = license_res_id; if (!(p->flags & (PF_LICENSE_FORCE_SELECTION | PF_LICENSE_NO_FORCE_SELECTION))) p->dlg_id = license_res_id; p->flags |= PF_NO_NEXT_FOCUS; if (!p->parms[1]) p->parms[1] = DefineInnerLangString(NLF_LICENSE_DATA, 0); if (p->dlg_id == IDD_LICENSE) { if (!p->parms[0]) p->parms[0] = DefineInnerLangString(LS(NLF_LICENSE_TEXT, NLF_ULICENSE_TEXT)); license_normal++; } else if (p->dlg_id == IDD_LICENSE_FSCB) { p->flags |= PF_LICENSE_FORCE_SELECTION; if (!p->parms[0]) p->parms[0] = DefineInnerLangString(LS(NLF_LICENSE_TEXT_FSCB, NLF_ULICENSE_TEXT_FSCB)); if (!p->parms[2]) p->parms[2] = DefineInnerLangString(NLF_BTN_LICENSE_AGREE); license_fscb++; } else if (p->dlg_id == IDD_LICENSE_FSRB) { p->flags |= PF_LICENSE_FORCE_SELECTION; if (!p->parms[0]) p->parms[0] = DefineInnerLangString(LS(NLF_LICENSE_TEXT_FSRB, NLF_ULICENSE_TEXT_FSRB)); if (!p->parms[2]) p->parms[2] = DefineInnerLangString(NLF_BTN_LICENSE_AGREE); if (!p->parms[3]) p->parms[3] = DefineInnerLangString(NLF_BTN_LICENSE_DISAGREE); license_fsrb++; } break; } #endif #ifdef NSIS_CONFIG_COMPONENTPAGE case IDD_SELCOM: { if (!p->parms[0]) p->parms[0] = DefineInnerLangString(LS(NLF_COMP_TEXT, NLF_UCOMP_TEXT)); if (!p->parms[1]) p->parms[1] = DefineInnerLangString(LS(NLF_COMP_SUBTEXT1, NLF_UCOMP_SUBTEXT1)); if (!p->parms[2]) p->parms[2] = DefineInnerLangString(LS(NLF_COMP_SUBTEXT2, NLF_UCOMP_SUBTEXT2)); if (!p->parms[3] && !uninstall_mode && HasUserDefined(NLF_COMP_SUBTEXT1)) p->parms[3] = p->parms[1]; if (!p->parms[4] && !uninstall_mode && HasUserDefined(NLF_COMP_SUBTEXT2)) p->parms[4] = p->parms[2]; else if (!p->parms[4]) p->parms[4] = DefineInnerLangString(LS(NLF_COMP_SUBTEXT1_NO_INST_TYPES, NLF_UCOMP_SUBTEXT1_NO_INST_TYPES)); DefineInnerLangString(NLF_SPACE_REQ); DefineInnerLangString(NLF_BYTE); DefineInnerLangString(NLF_KILO); DefineInnerLangString(NLF_MEGA); DefineInnerLangString(NLF_GIGA); selcom++; break; } #endif case IDD_DIR: { if (!p->parms[0]) p->parms[0] = DefineInnerLangString(LS(NLF_DIR_TEXT, NLF_UDIR_TEXT)); if (!p->parms[1]) p->parms[1] = DefineInnerLangString(LS(NLF_DIR_SUBTEXT, NLF_UDIR_SUBTEXT)); if (!p->parms[2]) p->parms[2] = DefineInnerLangString(NLF_BTN_BROWSE); if (!p->parms[3]) p->parms[3] = DefineInnerLangString(LS(NLF_DIR_BROWSETEXT, NLF_UDIR_BROWSETEXT)); if (!p->parms[4]) p->parms[4] = m_UserVarNames.get(_T("INSTDIR")); else p->parms[4]--; DefineInnerLangString(NLF_SPACE_AVAIL); DefineInnerLangString(NLF_SPACE_REQ); DefineInnerLangString(NLF_BYTE); DefineInnerLangString(NLF_KILO); DefineInnerLangString(NLF_MEGA); DefineInnerLangString(NLF_GIGA); #ifdef NSIS_CONFIG_LOG DefineInnerLangString(NLF_LOG_INSTALL_PROCESS); #endif dir++; break; } case IDD_INSTFILES: { if (!p->parms[1]) p->parms[1] = DefineInnerLangString(NLF_BTN_DETAILS); if (!p->parms[2]) p->parms[2] = DefineInnerLangString(NLF_COMPLETED); DefineInnerLangString(NLF_COPY_DETAILS); instlog++; instlog_used++; break; } case IDD_UNINST: { if (!p->parms[0]) p->parms[0] = DefineInnerLangString(NLF_UNINST_TEXT); if (!p->parms[1]) p->parms[1] = DefineInnerLangString(NLF_UNINST_SUBTEXT); if (!p->parms[4]) p->parms[4] = m_UserVarNames.get(_T("INSTDIR")); else p->parms[4]--; uninstconfirm++; break; } } p->flags &= ~PF_PAGE_EX; } p--; if (!p->next) p->next = DefineInnerLangString(NLF_BTN_CLOSE); if (p->wndproc_id == PWP_COMPLETED) (p-1)->next = DefineInnerLangString(NLF_BTN_CLOSE); #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (uninstall_mode) { if (!uenable_last_page_cancel && instlog_used) p->flags &= ~PF_CANCEL_ENABLE; } else #endif { if (!enable_last_page_cancel && instlog_used) p->flags &= ~PF_CANCEL_ENABLE; } if (!instlog_used) { warning(DW_INSTFILESPAGE_NOT_USED, _T("%") NPRIs _T("age instfiles not used, no sections will be executed!"), uninstall_mode ? _T("Uninstall p") : _T("P")); } } } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (!uninstall_mode) { set_uninstall_mode(1); goto again; } else set_uninstall_mode(0); #endif//NSIS_CONFIG_UNINSTALL_SUPPORT SCRIPT_MSG(_T("Done!\n")); #define REMOVE_ICON(id) if (disable_window_icon) { \ BYTE* dlg = res_editor->GetResource(RT_DIALOG, id, NSIS_DEFAULT_LANG); \ if (dlg) { \ CDialogTemplate dt(dlg,build_unicode,uDefCodePage); \ res_editor->FreeResource(dlg); \ if (dt.RemoveItem(IDC_ULICON)) { \ DialogItemTemplate* text = dt.GetItem(IDC_INTROTEXT); \ DialogItemTemplate* prog = dt.GetItem(IDC_PROGRESS); \ if (text) { \ text->sWidth += text->sX; \ text->sX = 0; \ } \ if (prog) { \ prog->sWidth += prog->sX; \ prog->sX = 0; \ } \ \ DWORD dwSize; \ dlg = dt.Save(dwSize); \ res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \ dt.FreeSavedTemplate(dlg); \ } \ } \ } try { SCRIPT_MSG(_T("Removing unused resources... ")); init_res_editor(); #ifdef NSIS_CONFIG_LICENSEPAGE if (!license_normal) { res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_LICENSE); if (!license_fsrb) { res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE_FSRB, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_LICENSE_FSRB); if (!license_fscb) { res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE_FSCB, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_LICENSE_FSCB); #endif // NSIS_CONFIG_LICENSEPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE if (!selcom) { res_editor->UpdateResource(RT_DIALOG, IDD_SELCOM, NSIS_DEFAULT_LANG, 0, 0); res_editor->UpdateResource(RT_BITMAP, IDB_BITMAP1, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_SELCOM); #endif // NSIS_CONFIG_COMPONENTPAGE if (!dir) { res_editor->UpdateResource(RT_DIALOG, IDD_DIR, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_DIR); #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (!uninstconfirm) { res_editor->UpdateResource(RT_DIALOG, IDD_UNINST, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_UNINST); #endif // NSIS_CONFIG_UNINSTALL_SUPPORT if (!instlog) { res_editor->UpdateResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG, 0, 0); } else REMOVE_ICON(IDD_INSTFILES); if (!main) { res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, 0, 0); if (!build_compress_whole && !build_crcchk) res_editor->UpdateResource(RT_DIALOG, IDD_VERIFY, NSIS_DEFAULT_LANG, 0, 0); } SCRIPT_MSG(_T("Done!\n")); } catch (exception& err) { ERROR_MSG(_T("\nError: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; } #endif // NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_COMPONENTPAGE void CEXEBuild::PrepareInstTypes() { if (!(cur_header->flags & CH_FLAGS_NO_CUSTOM)) cur_header->install_types[NSIS_MAX_INST_TYPES] = DefineInnerLangString(NLF_COMP_CUSTOM); // set insttype list for RO sections that didn't use SectionIn int i = cur_header->blocks[NB_SECTIONS].num; section *sections = (section *) cur_sections->get(); while (i--) { if (sections[i].flags & SF_RO && !sections[i].install_types) sections[i].install_types = ~0; } // set selection to first insttype if (cur_header->install_types[0]) { int i = cur_header->blocks[NB_SECTIONS].num; section *sections = (section *) cur_sections->get(); // if /o was used abort since the user did his manual choice while (i--) if ((sections[i].flags & SF_SELECTED) == 0) return; i = cur_header->blocks[NB_SECTIONS].num; while (i--) if ((sections[i].install_types & 1) == 0) sections[i].flags &= ~SF_SELECTED; } } #endif void CEXEBuild::AddStandardStrings() { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (uninstall_mode) { cur_header->str_uninstchild = add_asciistring(_T("$TEMP\\Un.exe")); cur_header->str_uninstcmd = add_asciistring(_T("\"$TEMP\\Un.exe\" $0 _?=$INSTDIR\\")); } #endif//NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_SUPPORT_MOVEONREBOOT cur_header->str_wininit = is_target_64bit() ? 0 : add_asciistring(_T("$WINDIR\\wininit.ini")); #endif//NSIS_SUPPORT_MOVEONREBOOT } writer_target_info CEXEBuild::mk_writer_target_info() { return writer_target_info(build_unicode, is_target_64bit()); } void CEXEBuild::PrepareHeaders(IGrowBuf *hdrbuf) { const writer_target_info ti = mk_writer_target_info(); const unsigned int cbHdr = get_header_size(); GrowBuf blocks_buf; growbuf_writer_sink sink(&blocks_buf, ti); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT cur_header->blocks[NB_PAGES].offset = cbHdr + blocks_buf.getlen(); page_writer::write_block(cur_pages, &sink); #endif cur_header->blocks[NB_SECTIONS].offset = cbHdr + blocks_buf.getlen(); section_writer::write_block(cur_sections, &sink); cur_header->blocks[NB_ENTRIES].offset = cbHdr + blocks_buf.getlen(); entry_writer::write_block(cur_entries, &sink); cur_header->blocks[NB_STRINGS].offset = cbHdr + blocks_buf.getlen(); blocks_buf.add(cur_strlist->getstorageptr(), cur_strlist->gettotalsize()); cur_header->blocks[NB_LANGTABLES].offset = cbHdr + blocks_buf.getlen(); lang_table_writer::write_block(cur_langtables, &sink, cur_header->langtable_size); cur_header->blocks[NB_CTLCOLORS].offset = cbHdr + blocks_buf.getlen(); ctlcolors_writer::write_block(cur_ctlcolors, &sink); #ifdef NSIS_SUPPORT_BGBG if (cur_header->bg_color1 != -1) { bg_font.lfFaceName[LF_FACESIZE-1] = 0; cur_header->blocks[NB_BGFONT].offset = cbHdr + blocks_buf.getlen(); LOGFONT_writer w(&sink); w.write(&bg_font); } #endif growbuf_writer_sink sink2(hdrbuf, ti); header_writer header(&sink2); header.write(cur_header, ti); sink2.write_growbuf(&blocks_buf); } int CEXEBuild::SetVarsSection() { try { init_res_editor(); VerifyDeclaredUserVarRefs(&m_UserVarNames); int MaxUserVars = m_UserVarNames.getnum(); int stringSize = NSIS_MAX_STRLEN * (build_unicode?2:1); if (!res_editor->SetPESectionVirtualSize(NSIS_VARS_SECTION, MaxUserVars * stringSize)) { ERROR_MSG(_T("Internal compiler error #12346: invalid exehead cannot find section \"%") NPRIs _T("\"!\n"), _T(NSIS_VARS_SECTION)); return PS_ERROR; } } catch (exception& err) { ERROR_MSG(_T("\nError: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; } int CEXEBuild::SetManifest() { try { init_res_editor(); manifest::SPECIFICATION spec = { (manifest::flags) manifest_flags, manifest_dpiaware, manifest_dpiawareness.c_str(), manifest_lpaware, &manifest_sosl, manifest_maxversiontested.c_str() }; string manifest = manifest::generate(manifest_comctl, manifest_exec_level, spec); if (manifest == "") return PS_OK; if (!build_unicode && manifest_lpaware >= manifest::lpaware_true) throw std::runtime_error("Incompatible option"); // TODO: Ideally we should allow this but we must be sure that the manifest is custom and not a manifest from the stub //if (res_editor->ResourceExists(MAKEINTRESOURCE(24), 1, CResourceEditor::ANYLANGID)) // return PS_OK; // Allow user to completely override the manifest with PEAddResource // Saved directly as binary into the exe. res_editor->UpdateResource(MAKEINTRESOURCE(24), 1, NSIS_DEFAULT_LANG, (LPBYTE) const_cast(manifest.c_str()), (DWORD) manifest.length()); } catch (exception& err) { ERROR_MSG(_T("Error setting manifest: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; } int CEXEBuild::UpdatePEHeader() { try { PIMAGE_NT_HEADERS headers = CResourceEditor::GetNTHeaders(m_exehead); // workaround for bug #2697027, #2725883, #2803097 *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, MajorImageVersion) = FIX_ENDIAN_INT16(6); *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, MinorImageVersion) = FIX_ENDIAN_INT16(0); // Override SubsystemVersion? if (PESubsysVerMaj != (WORD) -1) { *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, MajorSubsystemVersion) = FIX_ENDIAN_INT16(PESubsysVerMaj); *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, MinorSubsystemVersion) = FIX_ENDIAN_INT16(PESubsysVerMin); } // DllCharacteristics *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, DllCharacteristics) = FIX_ENDIAN_INT16(PEDllCharacteristics); } catch (std::runtime_error& err) { ERROR_MSG(_T("Error updating PE headers: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; } void CEXEBuild::set_default_output_filename(const tstring& filename) { if (build_output_filename[0] == 0) my_strncpy(build_output_filename,filename.c_str(),COUNTOF(build_output_filename)); } int CEXEBuild::check_write_output_errors() const { if (has_called_write_output) { ERROR_MSG(_T("Error (write_output): write_output already called, can't continue\n")); return PS_ERROR; } if (!build_output_filename[0]) { ERROR_MSG(_T("Error: invalid script: never had OutFile command\n")); return PS_ERROR; } if (!build_sections.getlen()) { ERROR_MSG(_T("Error: invalid script: no sections specified\n")); return PS_ERROR; } if (!build_entries.getlen()) { ERROR_MSG(_T("Error: invalid script: no entries specified\n")); return PS_ERROR; } if (build_cursection) { ERROR_MSG(_T("Error: Section left open at EOF\n")); return PS_ERROR; } if (sectiongroup_open_cnt) { ERROR_MSG(_T("Error: SectionGroup left open at EOF\n")); return PS_ERROR; } if (cur_page) { ERROR_MSG(_T("Error: PageEx left open at EOF\n")); return PS_ERROR; } // deal with functions, for both install and uninstall modes. if (build_cursection_isfunc) { ERROR_MSG(_T("Error: Function left open at EOF\n")); return PS_ERROR; } return PS_OK; } int CEXEBuild::prepare_uninstaller() { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (ubuild_entries.getlen()) { if (!uninstaller_writes_used) { warning(DW_UNCODE_WITHOUT_UNEXE, _T("Uninstaller script code found but WriteUninstaller never used - no uninstaller will be created.")); return PS_OK; } build_uninst.flags|=build_header.flags&(CH_FLAGS_PROGRESS_COLORED|CH_FLAGS_NO_ROOT_DIR); set_uninstall_mode(1); DefineInnerLangString(NLF_UCAPTION); if (resolve_coderefs(_T("uninstall"))) return PS_ERROR; #ifdef NSIS_CONFIG_COMPONENTPAGE // set sections to the first insttype PrepareInstTypes(); #endif // Add standard strings to string table AddStandardStrings(); set_uninstall_mode(0); } else if (uninstaller_writes_used) { ERROR_MSG(_T("Error: no Uninstall section specified, but WriteUninstaller used %d time(s)\n"),uninstaller_writes_used); return PS_ERROR; } #endif//NSIS_CONFIG_UNINSTALL_SUPPORT return PS_OK; } int CEXEBuild::pack_exe_header() { if (!(build_packname[0] && build_packcmd[0])) { // header not asked to be packed return PS_OK; } // write out exe header, pack, read back in, and // update the header info if (m_exehead_size != write_octets_to_file(build_packname, m_exehead, m_exehead_size)) { ERROR_MSG(_T("Error: writing temporary file \"%") NPRIs _T("\" for pack\n"),build_packname); return PS_ERROR; } int ec = sane_system(build_packcmd); if (ec == -1) { _tremove(build_packname); ERROR_MSG(_T("Error: calling packer on \"%") NPRIs _T("\"\n"),build_packname); return PS_ERROR; } if (ec != 0) warning(DW_PACKHDR_RETNONZERO, _T("Packer returned %d, \"%") NPRIs _T("\" might still be unpacked\n"),ec,build_packname); int result = update_exehead(build_packname); _tremove(build_packname); if (result != PS_OK) { ERROR_MSG(_T("Error: reading temporary file \"%") NPRIs _T("\" after pack\n"),build_packname); return result; } return PS_OK; } int CEXEBuild::write_output(void) { #ifndef NSIS_CONFIG_CRC_SUPPORT build_crcchk=0; #endif RET_UNLESS_OK( check_write_output_errors() ); has_called_write_output=true; if (!changed_target && !build_unicode) warning(DW_GENERIC_DEPRECATED, _T("ANSI targets are deprecated")); #ifdef NSIS_CONFIG_PLUGIN_SUPPORT RET_UNLESS_OK( add_plugins_dir_initializer() ); #endif //NSIS_CONFIG_PLUGIN_SUPPORT #ifdef NSIS_SUPPORT_VERSION_INFO RET_UNLESS_OK( AddVersionInfo() ); #endif //NSIS_SUPPORT_VERSION_INFO RET_UNLESS_OK( prepare_uninstaller() ); DefineInnerLangString(NLF_CAPTION); if (resolve_coderefs(_T("install"))) return PS_ERROR; #ifdef NSIS_CONFIG_COMPONENTPAGE // set sections to the first insttype PrepareInstTypes(); #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT RET_UNLESS_OK( ProcessPages() ); #endif //NSIS_CONFIG_VISIBLE_SUPPORT // Generate language tables RET_UNLESS_OK( GenerateLangTables() ); // Setup user variables PE section RET_UNLESS_OK( SetVarsSection() ); // Set XML manifest RET_UNLESS_OK( SetManifest() ); // Add standard strings to string table AddStandardStrings(); try { // Load icon from exe, if needed if (installer_icon.empty()) { init_res_editor(); installer_icon = load_icon_res(res_editor, IDI_ICON2); } // Set icon set_main_icon(res_editor, IDI_ICON2, installer_icon, uninstaller_icon); // Save all changes to the exe header close_res_editor(); } catch (exception& err) { ERROR_MSG(_T("\nError: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } // Final PE touch-ups RET_UNLESS_OK( UpdatePEHeader() ); RET_UNLESS_OK( pack_exe_header() ); build_optimize_datablock=0; UINT data_block_size_before_uninst = build_datablock.getlen(); RET_UNLESS_OK( uninstall_generate() ); unsigned char limit = 0; // Limit the number of retries in case the host has some kind of bug retry_output: { tstring full_path = get_full_path(build_output_filename), fnamebuf = get_file_name(build_output_filename); notify(MakensisAPI::NOTIFY_OUTPUT, full_path.c_str()); INFO_MSG(_T("\nOutput: \"%") NPRIs _T("\"\n"), full_path.c_str()); const TCHAR *fname = fnamebuf.c_str(); // Warn when special compatibility names are used. See also: http://github.com/wixtoolset/wix4/commit/3f4341b8ac4d13dffb1d6ba773d48ccc0ab07cf8 if (!_tcsicmp(fname, _T("setup.exe"))) { const bool orgdispwarn = display_warnings; display_warnings = false; // Don't display warning inline in the middle of our statistics output. warning(DW_INSECURE_OUTFILENAME, _T("Insecure filename \"%") NPRIs _T("\", Windows will unsafely load compatibility shims into the process."), fname); display_warnings = orgdispwarn; } } FILE *fp = FOPEN(build_output_filename,("w+b")); if (!fp) { ERROR_MSG(_T("Can't open output file\n")); if (++limit && prompt_for_output_path(build_output_filename, COUNTOF(CEXEBuild::build_output_filename))) goto retry_output; return PS_ERROR; } if (fwrite(m_exehead,1,m_exehead_size,fp) != m_exehead_size) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"),m_exehead_size); fclose(fp); return PS_ERROR; } crc32_t crc=0; #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_CRC_ANAL crc=CRC32(crc,m_exehead,(DWORD)m_exehead_size); #else crc=CRC32(crc,m_exehead+512,(DWORD)m_exehead_size-512); #endif #endif firstheader fh={0,}; fh.nsinst[0]=FH_INT1; fh.nsinst[1]=FH_INT2; fh.nsinst[2]=FH_INT3; #ifdef NSIS_CONFIG_CRC_SUPPORT fh.flags=(build_crcchk?(build_crcchk==2?FH_FLAGS_FORCE_CRC:0):FH_FLAGS_NO_CRC); #else fh.flags=0; #endif #ifdef NSIS_CONFIG_SILENT_SUPPORT if (build_header.flags&(CH_FLAGS_SILENT|CH_FLAGS_SILENT_LOG)) fh.flags |= FH_FLAGS_SILENT; #endif fh.siginfo=FH_SIG; int installinfo_compressed; int fd_start = 0; #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (build_compress_whole) { int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); return PS_ERROR; } } #endif { GrowBuf ihd; { GrowBuf hdrcomp; PrepareHeaders(&hdrcomp); if (add_data((char*)hdrcomp.get(),hdrcomp.getlen(),&ihd) < 0) return PS_ERROR; fh.length_of_header=hdrcomp.getlen(); installinfo_compressed=ihd.getlen(); } if (!build_compress_whole) fh.length_of_all_following_data=ihd.getlen()+build_datablock.getlen()+(int)sizeof(firstheader)+(build_crcchk?sizeof(crc32_t):0); else fd_start=ftell(fp); try { file_writer_sink sink(fp, mk_writer_target_info()); firstheader_writer w(&sink); w.write(&fh); } catch (...) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"),sizeof(fh)); fclose(fp); return PS_ERROR; } #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (build_compress_whole) { if (deflateToFile(fp,(char*)ihd.get(),ihd.getlen())) { fclose(fp); return PS_ERROR; } } else #endif { if (fwrite(ihd.get(),1,ihd.getlen(),fp) != (unsigned int)ihd.getlen()) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"),ihd.getlen()); fclose(fp); return PS_ERROR; } #ifdef NSIS_CONFIG_CRC_SUPPORT crc_writer_sink crc_sink((crc32_t *) &crc); firstheader_writer w(&crc_sink); w.write(&fh); crc=CRC32(crc,(unsigned char*)ihd.get(),ihd.getlen()); #endif } } INFO_MSG(_T("Install: ")); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT int np=build_header.blocks[NB_PAGES].num; if (PAGE_COMPLETED != PAGE_INSTFILES && np) --np; // Special page not part of count INFO_MSG(_T("%d page%") NPRIs _T(" (%d bytes), "),np,np==1?_T(""):_T("s"),np*sizeof(page)); #endif #define IsRequiredSection(s) ( (!(s).name_ptr && ((s).flags & SF_SELECTED)) || (((s).flags & (SF_RO|SF_SELECTED)) == (SF_RO|SF_SELECTED))) { int ns=build_sections.getlen()/sizeof(section), x; section *s=(section*)build_sections.get(); unsigned int req=0; for (x = 0; x < ns; x ++) if (IsRequiredSection(s[x])) ++req; INFO_MSG(_T("%d section%") NPRIs,ns,ns==1?_T(""):_T("s")); if (req) INFO_MSG(_T(" (%u required)"),req); INFO_MSG(_T(" (%d bytes), "), build_sections.getlen()); } int ne=build_header.blocks[NB_ENTRIES].num; INFO_MSG(_T("%d instruction%") NPRIs _T(" (%d bytes), "),ne,ne==1?_T(""):_T("s"),ne*sizeof(entry)); int ns=build_strlist.getnum(); INFO_MSG(_T("%d string%") NPRIs _T(" (%d bytes), "),ns,ns==1?_T(""):_T("s"),build_strlist.gettotalsize()); int nlt=build_header.blocks[NB_LANGTABLES].num; INFO_MSG(_T("%d language table%") NPRIs _T(" (%d bytes).\n"),nlt,nlt==1?_T(""):_T("s"),build_langtables.getlen()); if (ubuild_entries.getlen()) { INFO_MSG(_T("Uninstall: ")); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT np=build_uninst.blocks[NB_PAGES].num; if (PAGE_COMPLETED != PAGE_INSTFILES && np) --np; // Special page not part of count INFO_MSG(_T("%d page%") NPRIs _T(" (%d bytes), "),np,np==1?_T(""):_T("s"),ubuild_pages.getlen()); #endif { int ns=ubuild_sections.getlen()/sizeof(section), x; section *s=(section*)ubuild_sections.get(); unsigned int req=0; for (x = 0; x < ns; x ++) if (IsRequiredSection(s[x])) ++req; INFO_MSG(_T("%d section%") NPRIs,ns,ns==1?_T(""):_T("s")); if (req) INFO_MSG(_T(" (%u required)"),req); INFO_MSG(_T(" (%d bytes), "), ubuild_sections.getlen()); } ne=build_uninst.blocks[NB_ENTRIES].num; INFO_MSG(_T("%d instruction%") NPRIs _T(" (%d bytes), "),ne,ne==1?_T(""):_T("s"),ubuild_entries.getlen()); ns=ubuild_strlist.getnum(); INFO_MSG(_T("%d string%") NPRIs _T(" (%d bytes), "),ns,ns==1?_T(""):_T("s"),ubuild_strlist.gettotalsize()); nlt=build_uninst.blocks[NB_LANGTABLES].num; INFO_MSG(_T("%d language table%") NPRIs _T(" (%d bytes).\n"),nlt,nlt==1?_T(""):_T("s"),ubuild_langtables.getlen()); } if (db_opt_save) { size_t total_out_size_estimate= m_exehead_size+sizeof(fh)+build_datablock.getlen()+(build_crcchk?sizeof(crc32_t):0); int pc=(int)((db_opt_save*1000)/(db_opt_save+total_out_size_estimate)); FriendlySize fs(db_opt_save); INFO_MSG(_T("Datablock optimizer saved %u%") NPRIs _T(" (~%d.%d%%).\n"), fs.UInt(),fs.Scale(),pc/10,pc%10); } #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT INFO_MSG(_T("\nUsing %") NPRIs _T("%") NPRIs _T(" compression.\n\n"), compressor->GetName(), build_compress_whole?_T(" (compress whole)"):_T("")); #endif unsigned int total_usize=(unsigned int) m_exehead_original_size; INFO_MSG(_T("EXE header size: %10u / %u bytes\n"),m_exehead_size,m_exehead_original_size); if (build_compress_whole) { INFO_MSG(_T("Install code: (%d bytes)\n"), sizeof(fh)+fh.length_of_header); } else { INFO_MSG(_T("Install code: %10d / %d bytes\n"), sizeof(fh)+installinfo_compressed, sizeof(fh)+fh.length_of_header); } total_usize+=sizeof(fh)+fh.length_of_header; { unsigned int dbsize; UINT64 dbsizeu; dbsize = build_datablock.getlen(); if (uninstall_size > 0 && uninstall_size < UINT_MAX) dbsize -= uninstall_size; if (build_compress_whole) { dbsizeu = dbsize; INFO_MSG(_T("Install data: (%u bytes)\n"),dbsize); // dbsize==dbsizeu and is easy to print } else { dbsizeu = db_full_size - uninstall_size_full; FriendlySize us(dbsizeu, GFSF_BYTESIFPOSSIBLE); // uncompressed installer size FriendlySize cs(dbsize, GFSF_BYTESIFPOSSIBLE | (us.UInt()==dbsizeu ? GFSF_HIDEBYTESCALE : 0)); // compressed installer size INFO_MSG(_T("Install data: %10u%") NPRIs _T(" / %u%") NPRIs _T("\n"), cs.UInt(),cs.Scale(),us.UInt(),us.Scale()); // "123 / 456 bytes" or "123 KiB / 456 MiB" } UINT future = (build_crcchk ? sizeof(int) : 0) + (uninstall_size > 0 && uninstall_size < UINT_MAX ? uninstall_size_full : 0); UINT maxsize = (~(UINT)0) - (total_usize + future), totsizadd = dbsizeu < maxsize ? (UINT)dbsizeu : maxsize; total_usize += totsizadd; // Might not be accurate, it is more important to not overflow the additions coming up } if (uninstall_size < UINT_MAX) { if (build_compress_whole) INFO_MSG(_T("Uninstall code+data: (%u bytes)\n"),uninstall_size_full); else INFO_MSG(_T("Uninstall code+data: %10u / %u bytes\n"),uninstall_size,uninstall_size_full); total_usize += uninstall_size_full; } if (build_compress_whole) { INFO_MSG(_T("Compressed data: ")); } if (build_datablock.getlen()) { build_datablock.setro(TRUE); int dbl = build_datablock.getlen(); int left = dbl; while (left > 0) { int l = min(build_filebuflen, left); char *dbptr = (char *) build_datablock.get(dbl - left, l); #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (build_compress_whole) { if (deflateToFile(fp,dbptr,l)) { fclose(fp); return PS_ERROR; } } else #endif { #ifdef NSIS_CONFIG_CRC_SUPPORT crc=CRC32(crc,(unsigned char *)dbptr,l); #endif if ((int)fwrite(dbptr,1,l,fp) != l) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"),l); fclose(fp); return PS_ERROR; } fflush(fp); } build_datablock.release(); left -= l; } build_datablock.setro(FALSE); build_datablock.clear(); } #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (build_compress_whole) { if (deflateToFile(fp,NULL,0)) { fclose(fp); return PS_ERROR; } compressor->End(); unsigned fend = ftell(fp); fh.length_of_all_following_data=ftell(fp)-fd_start+(build_crcchk?sizeof(crc32_t):0); INFO_MSG( _T("%10d / %d bytes\n"), ftell(fp) - fd_start, data_block_size_before_uninst + fh.length_of_header + sizeof(firstheader) + uninstall_size_full ); fseek(fp,fd_start,SEEK_SET); try { file_writer_sink sink(fp, mk_writer_target_info()); firstheader_writer w(&sink); w.write(&fh); } catch (...) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"),sizeof(fh)); fclose(fp); return PS_ERROR; } #ifdef NSIS_CONFIG_CRC_SUPPORT if (build_crcchk) { // check rest of CRC fseek(fp,fd_start,SEEK_SET); for (;;) { char buf[32768]; unsigned int l=(unsigned int)fread(buf,1,sizeof(buf),fp); if (!l) break; crc=CRC32(crc,(unsigned char *)buf,l); } } #endif fseek(fp,fend,SEEK_SET); // reset eof flag } #endif if (build_crcchk) { total_usize+=sizeof(int); int rcrc = FIX_ENDIAN_INT32(crc); if (fwrite(&rcrc,1,sizeof(crc32_t),fp) != sizeof(crc32_t)) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"),sizeof(crc32_t)); fclose(fp); return PS_ERROR; } INFO_MSG(_T("CRC (0x%08X): 4 / 4 bytes\n"),crc); } INFO_MSG(_T("\n")); { long fileend = ftell(fp); UINT pc=(UINT)(((UINT64)fileend*1000)/(total_usize)); INFO_MSG(_T("Total size: %10u / %u bytes (%u.%u%%)\n"), fileend,total_usize,pc/10,pc%10); } fclose(fp); RET_UNLESS_OK(run_postbuild_cmds(postbuild_cmds, build_output_filename, _T("Finalize"))); print_warnings(); return PS_OK; } #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT int CEXEBuild::deflateToFile(FILE *fp, char *buf, int len) // len==0 to flush { build_compressor_set=true; char obuf[65536]; bool flush=false; compressor->SetNextIn(buf,len); if (!buf||!len) { char a; compressor->SetNextIn(&a,0); flush=C_FINISH; } for (;;) { compressor->SetNextOut(obuf,sizeof(obuf)); int ret=compressor->Compress(flush); if (ret<0 && (ret!=-1 || !flush)) { ERROR_MSG(_T("Error: deflateToFile: deflate() failed(%") NPRIs _T(" [%d])\n"), compressor->GetErrStr(ret), ret); return 1; } size_t l=compressor->GetNextOut()-obuf; if (l) { if (fwrite(obuf,1,l,fp) != l) { ERROR_MSG(_T("Error: deflateToFile fwrite(%lu) failed\n"),(unsigned long)l); return 1; } fflush(fp); } if (!compressor->GetAvailIn() && (!flush || !l)) break; } return 0; } #endif int CEXEBuild::uninstall_generate() { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (ubuild_entries.getlen() && uninstaller_writes_used) { SCRIPT_MSG(_T("Generating uninstaller... ")); const int start_offset = postubuild_cmds ? truncate_cast(int, m_exehead_size) : 0; entry *ent = (entry *) build_entries.get(); if (!ent) return PS_ERROR; // Check this early MMapBuf udata; firstheader fh={0,}; GrowBuf uhd; { GrowBuf udata_exehead; set_uninstall_mode(1); PrepareHeaders(&udata_exehead); fh.length_of_header=udata_exehead.getlen(); int err=add_data((char*)udata_exehead.get(),udata_exehead.getlen(),&uhd); set_uninstall_mode(0); if (err < 0) return PS_ERROR; } crc32_t crc=0; #ifdef NSIS_CONFIG_CRC_SUPPORT bool calc_crc = true; #else bool calc_crc = false; #endif // Get offsets of icons to replace for uninstall // Also makes sure that the icons are there and in the right size. LPBYTE unicon_data = generate_uninstall_icon_data(installer_icon, uninstaller_icon, m_unicon_size); if (generate_unicons_offsets(m_exehead, m_exehead_size, unicon_data, IDI_ICON2) == 0) { delete [] unicon_data; return PS_ERROR; } int uns = uninstaller_writes_used; int uninstdata_offset = build_datablock.getlen(); for (int ents = build_header.blocks[NB_ENTRIES].num; ents--; ent++) { if (ent->which == EW_WRITEUNINSTALLER) { ent->offsets[1] = uninstdata_offset; ent->offsets[2] = start_offset ? 0 : (int) m_unicon_size; if (!--uns) break; } } if (!start_offset && add_db_data((char *)unicon_data,m_unicon_size) < 0) { delete [] unicon_data; return PS_ERROR; } if (start_offset || calc_crc) { // create the uninstaller LPBYTE uninst_header = (LPBYTE) malloc(m_exehead_size); if (!uninst_header) { delete [] unicon_data; return PS_ERROR; } memcpy(uninst_header, m_exehead, m_exehead_size); // patch the icons LPBYTE seeker = unicon_data; while (*seeker) { DWORD dwSize = FIX_ENDIAN_INT32(*(LPDWORD) seeker); seeker += sizeof(DWORD); DWORD dwOffset = FIX_ENDIAN_INT32(*(LPDWORD) seeker); seeker += sizeof(DWORD); memcpy(uninst_header + dwOffset, seeker, dwSize); seeker += dwSize; } if (calc_crc) { #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_CRC_ANAL crc=CRC32(crc, uninst_header, (DWORD)m_exehead_size); #else crc=CRC32(crc, uninst_header + 512, (DWORD)m_exehead_size - 512); #endif #endif } // write the exehead if (start_offset) udata.add((char *)uninst_header, truncate_cast(int, m_exehead_size)); free(uninst_header); } delete [] unicon_data; fh.nsinst[0]=FH_INT1; fh.nsinst[1]=FH_INT2; fh.nsinst[2]=FH_INT3; fh.flags=FH_FLAGS_UNINSTALL; #ifdef NSIS_CONFIG_CRC_SUPPORT fh.flags|=(build_crcchk?(build_crcchk==2?FH_FLAGS_FORCE_CRC:0):FH_FLAGS_NO_CRC); #endif #ifdef NSIS_CONFIG_SILENT_SUPPORT if (build_uninst.flags&(CH_FLAGS_SILENT|CH_FLAGS_SILENT_LOG)) fh.flags |= FH_FLAGS_SILENT; #endif fh.siginfo=FH_SIG; fh.length_of_all_following_data= uhd.getlen()+ubuild_datablock.getlen()+(int)sizeof(firstheader)+(build_crcchk?sizeof(crc32_t):0); { growbuf_writer_sink sink(&udata, mk_writer_target_info()); firstheader_writer w(&sink); w.write(&fh); } ubuild_datablock.setro(TRUE); #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (build_compress_whole) { // compress uninstaller too { char obuf[65536]; int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); extern void quit(); quit(); } compressor->SetNextIn((char*)uhd.get(), uhd.getlen()); while (compressor->GetAvailIn()) { compressor->SetNextOut(obuf, sizeof(obuf)); compressor->Compress(0); if (compressor->GetNextOut() - obuf > 0) { udata.add(obuf, truncate_cast(int, (size_t)(compressor->GetNextOut() - obuf))); } } int avail_in = ubuild_datablock.getlen(); int in_pos = 0; while (avail_in > 0) { int l = min(avail_in, build_filebuflen); char *p = (char*)ubuild_datablock.get(in_pos, l); compressor->SetNextIn(p, l); while (compressor->GetAvailIn()) { compressor->SetNextOut(obuf, sizeof(obuf)); compressor->Compress(0); if (compressor->GetNextOut() - obuf > 0) udata.add(obuf, truncate_cast(int, (size_t)(compressor->GetNextOut() - obuf))); } ubuild_datablock.release(); avail_in -= l; in_pos += l; } for (;;) { compressor->SetNextOut(obuf, sizeof(obuf)); compressor->Compress(C_FINISH); if (compressor->GetNextOut() - obuf > 0) udata.add(obuf, truncate_cast(int, (size_t)(compressor->GetNextOut() - obuf))); else break; } compressor->End(); } firstheader *ufh=(firstheader *)udata.get(start_offset, sizeof(firstheader)); ufh->length_of_all_following_data=FIX_ENDIAN_INT32((udata.getlen()-start_offset)+(build_crcchk?sizeof(crc32_t):0)); udata.release(); } else #endif//NSIS_CONFIG_COMPRESSION_SUPPORT { udata.add(uhd.get(), uhd.getlen()); int st = udata.getlen(); int length = ubuild_datablock.getlen(); int left = length; udata.resize(st + left); while (left > 0) { int l = min(build_filebuflen, left); void *p = ubuild_datablock.get(length - left, l); memcpy(udata.get(st + length - left, l), p, l); udata.flush(l); udata.release(); ubuild_datablock.release(); left -= l; } } ubuild_datablock.clear(); udata.setro(TRUE); #ifdef NSIS_CONFIG_CRC_SUPPORT if (build_crcchk) { int pos = 0; int left = udata.getlen() - start_offset; while (left > 0) { int l = min(build_filebuflen, left); crc = CRC32(crc, (unsigned char *) udata.get(pos + start_offset, l), l); udata.release(); pos += l; left -= l; } udata.setro(FALSE); FIX_ENDIAN_INT32_INPLACE(crc); udata.add(&crc, sizeof(crc)); udata.setro(TRUE); } #endif if (start_offset) { TCHAR* fpath; if (!(fpath = create_tempfile_path())) { ERROR_MSG(_T("Error: can't get temporary path\n")); return PS_ERROR; } MANAGE_WITH(fpath, free); FILE *hfile = FOPEN(fpath, ("wb")); if (!hfile) { ERROR_MSG(_T("Error: failed opening file \"%") NPRIs _T("\"\n"), fpath); return PS_ERROR; } int succ = udata.write_to_external_file(hfile); fclose(hfile); if (!succ) { ERROR_MSG(_T("Error: can't write %d bytes to output\n"), udata.getlen()); return PS_ERROR; } udata.clear(); if (PS_OK != run_postbuild_cmds(postubuild_cmds, fpath, _T("UninstFinalize"))) { return PS_ERROR; } MMapFile udata_in; UINT64 udata_size; if (!(udata_size = udata_in.setfile(fpath))) { ERROR_MSG(_T("Error: failed creating mmap of \"%") NPRIs _T("\"\n"), fpath); return PS_ERROR; } if (udata_size > NSIS_MAX_EXEFILESIZE || add_db_data(&udata_in) < 0) return PS_ERROR; assert(NSIS_MAX_EXEFILESIZE <= ~(UINT32)0); uninstall_size_full = (UINT32) udata_size; udata_in.clear(); _tremove(fpath); } else { if (add_db_data(&udata) < 0) return PS_ERROR; //uninstall_size_full=fh.length_of_all_following_data + sizeof(int) + unicondata_size - 32 + sizeof(int); uninstall_size_full = fh.length_of_all_following_data+(int)m_unicon_size; } // compressed size uninstall_size=build_datablock.getlen()-uninstdata_offset; SCRIPT_MSG(_T("Done!\n")); } #endif return PS_OK; } #define SWAP(x,y,i) { i _ii; _ii=x; x=y; y=_ii; } void CEXEBuild::set_uninstall_mode(int un) { if (un != uninstall_mode) { uninstall_mode=un; if (un) { cur_datablock=&ubuild_datablock; cur_datablock_cache=&ubuild_datablock_cache; cur_entries=&ubuild_entries; cur_instruction_entry_map=&ubuild_instruction_entry_map; cur_functions=&ubuild_functions; cur_labels=&ubuild_labels; cur_pages=&ubuild_pages; cur_sections=&ubuild_sections; cur_header=&build_uninst; cur_strlist=&ubuild_strlist; cur_langtables=&ubuild_langtables; cur_ctlcolors=&ubuild_ctlcolors; definedlist.add(_T("__UNINSTALL__")); } else { cur_datablock=&build_datablock; cur_datablock_cache=&build_datablock_cache; cur_entries=&build_entries; cur_instruction_entry_map=&build_instruction_entry_map; cur_functions=&build_functions; cur_labels=&build_labels; cur_pages=&build_pages; cur_sections=&build_sections; cur_header=&build_header; cur_strlist=&build_strlist; cur_langtables=&build_langtables; cur_ctlcolors=&build_ctlcolors; definedlist.del(_T("__UNINSTALL__")); } SWAP(db_opt_save_u,db_opt_save,UINT64); SWAP(db_comp_save_u,db_comp_save,int); SWAP(db_full_size_u,db_full_size,UINT64); } } extern FILE *g_output; /* Useful for debugging. bool IsStringASCII(const TCHAR* s) { while (*s) { if (!_istascii(*s++)) return false; } return true; } */ int CEXEBuild::get_verbosity() const { int v = 0; if (display_errors) { v++; if (display_warnings) { v++; if (display_info) { v++; if (display_script) { v++; } } } } return v; } void CEXEBuild::set_verbosity(int lvl) { if (preprocessonly) lvl = STD_MIN(lvl, 1); display_errors = lvl > 0; display_warnings = lvl > 1; display_info = lvl > 2; display_script = lvl > 3; extern int g_display_errors; g_display_errors = display_errors; } int CEXEBuild::parse_pragma(LineParser &line) { const int rvSucc = PS_OK, rvWarn = PS_WARNING, rvErr = PS_WARNING; // rvErr is not PS_ERROR because we want !pragma parsing to be very forgiving. const TCHAR badParamMsg[] = _T("Unknown pragma"); if (line.gettoken_enum(1, _T("internal\0")) == 0) { if (line.gettoken_enum(2, _T("x\0")) == 0) { const TCHAR *name = line.gettoken_str(3); int succ, num = line.gettoken_intx(4, &succ);SCRIPT_MSG(_T("%#x %d\n"),num,succ); return ((succ ? definedlist.set_si32(name, num) : definedlist.set(name, _T(""))), rvSucc); } if (line.gettoken_enum(2, _T("dump\0")) == 0) { if (line.gettoken_enum(3, _T("defines\0")) == 0) { for (UINT i = 0, c = definedlist.getnum(); i < c; ++i) SCRIPT_MSG(_T("%") NPRIs _T("=%") NPRIs _T("\n"), definedlist.getname(i), definedlist.getvalue(i)); } else if (line.gettoken_enum(3, _T("macros\0")) == 0) { const TCHAR *mnam; for (size_t i = 0; (mnam = GetMacro(i)) != 0; ++i) SCRIPT_MSG(_T("%") NPRIs _T("\n"), mnam); } else { SCRIPT_MSG(_T("V=%d\n"), get_verbosity()); } } return rvErr; } if (line.gettoken_enum(1, _T("verifyloadimage\0")) == 0) { bool valid = LoadImageCanLoadFile(line.gettoken_str(2)); return valid ? rvSucc : (warning_fl(DW_BADFORMAT_EXTERNAL_FILE, _T("Unsupported format %") NPRIs, line.gettoken_str(2)), rvWarn); } // 2.47 shipped with a corrupted CHM file (bug #1129). This minimal verification command exists because the !searchparse hack we added does not work with codepage 936! if (line.gettoken_enum(1, _T("verifychm\0")) == 0) { struct { UINT32 Sig, Ver, cbH; } chm; NIStream f; bool valid = f.OpenFileForReading(line.gettoken_str(2), NStreamEncoding::BINARY); valid = valid && 12 == f.ReadOctets(&chm, 12); valid = valid && FIX_ENDIAN_INT32(chm.Sig) == 0x46535449 && (FIX_ENDIAN_INT32(chm.Ver)|1) == 3; // 'ITSF' v2..3 return valid ? rvSucc : (ERROR_MSG(_T("Error: Invalid format\n")), PS_ERROR); } if (line.gettoken_enum(1, _T("w\150i\160\0")) == 0) { int succ, ec = line.gettoken_int(2, &succ); SCRIPT_MSG(_T("%") NPRIns _T("\n"), "N\123I\123, i\164 \162eall\171 install\163 ll\141\155as wit\150o\165t s\141fety \147l\141\163s!"); exit(succ ? ec : 1); } if (line.gettoken_enum(1, _T("warning\0")) == -1) return (warning_fl(DW_PP_PRAGMA_UNKNOWN, _T("Unknown pragma")), rvErr); enum { woperr = 0, wopwar, wopdis, wopena, wopdef, woppus, woppop, invalidwop }; int warnOp = line.gettoken_enum(2, _T("error\0warning\0disable\0enable\0default\0push\0pop\0")), ret = rvSucc; if (warnOp < 0) ret = rvErr, warning_fl(DW_PP_PRAGMA_UNKNOWN, badParamMsg); // Unknown warning pragma action else if (warnOp == woppus) // warning: push diagstate.push(); else if (warnOp == woppop) // warning: pop { if (!diagstate.pop()) ret = rvWarn, warning_fl(DW_PP_PRAGMA_INVALID, _T("Unexpected")); } else // warning: error/warning/disable/enable/default <%code%|all> [..] { for (int ti = 3; ti < line.getnumtokens(); ++ti) { DIAGCODE code = static_cast(line.gettoken_int(ti)); bool all = line.gettoken_enum(ti, _T("all\0")) == 0, isCode = diagstate.is_valid_code(code); switch((isCode||all) ? warnOp : invalidwop) { case woperr: all ? diagstate.set_all(DiagState::werror) : diagstate.error(code); break; case wopwar: all ? diagstate.set_all(DiagState::wwarning) : diagstate.warning(code); break; case wopdis: all ? diagstate.set_all(DiagState::wdisabled) : diagstate.disable(code); break; case wopena: all ? diagstate.set_all(DiagState::wenabled) : diagstate.enable(code); break; case wopdef: all ? diagstate.set_all(DiagState::get_default_state()) : diagstate.def(code); break; default: ret = rvWarn, warning_fl(DW_PP_PRAGMA_INVALID, _T("Invalid number: \"%") NPRIs _T("\""), line.gettoken_str(ti)); } } } return ret; } void DiagState::push() { DiagState *p = new DiagState(); *p = *this; // Copy the current state p->m_pStack = m_pStack, m_pStack = p; // ...and push it on the stack } bool DiagState::pop() { if (!m_pStack) return false; DiagState *pPop = m_pStack; // Get the item on the top of the stack *this = *pPop; // ...and assign it as the current state pPop->m_pStack = 0; // The pop'ed item no longer owns the next item on the stack delete pPop; return true; } void CEXEBuild::warninghelper(DIAGCODE dc, bool fl, const TCHAR *fmt, va_list args) { bool showcode = dc != DIAGCODE_INTERNAL_HIDEDIAGCODE; if (diagstate.is_disabled(dc)) return ; bool aserror = diagstate.is_error(dc); TCHAR codbuf[11+2+!0]; _stprintf(codbuf, showcode ? _T("%u: ") : _T(""), static_cast(dc)); ExpandoString msgbuf; ExpandoString fmtbuf; fmtbuf.StrFmt(_T("%") NPRIs _T("%") NPRIs, codbuf, fmt); size_t cchMsg = msgbuf.StrVFmt(fmtbuf.GetPtr(), args); if (fl) { msgbuf.Reserve(cchMsg+2+_tcslen(curfilename)+1+11+1+!0); _stprintf(&msgbuf[cchMsg], _T(" (%") NPRIs _T(":%u)"), curfilename, linecnt); } const TCHAR *msg = msgbuf.GetPtr(); m_warnings.add(msg,0); // Add to list of warnings to display at the end MakensisAPI::datatransfer_e hostevent = MakensisAPI::NOTIFY_WARNING; if (aserror) hostevent = MakensisAPI::NOTIFY_ERROR, display_warnings = display_errors; notify(hostevent, msg); // Notify the host if (display_warnings) // Print "warning %msgwithcodeprefix%" or "warning: %msg%" PrintColorFmtMsg_WARN(_T("warning%") NPRIs _T("%") NPRIs _T("\n"), showcode ? _T(" ") : _T(": "), msg); if (aserror) { ERROR_MSG(_T("Error: warning treated as error\n")); extern int g_display_errors; if (!has_called_write_output) g_display_errors = false; // This is a hack to avoid the "stale file in %temp%" warning. extern void quit(); quit(); } } void CEXEBuild::warning(DIAGCODE dc, const TCHAR *s, ...) { va_list val; va_start(val, s); warninghelper(dc, false, s, val); va_end(val); } void CEXEBuild::warning_fl(DIAGCODE dc, const TCHAR *s, ...) { va_list val; va_start(val, s); warninghelper(dc, true, s, val); va_end(val); } void CEXEBuild::ERROR_MSG(const TCHAR *s, ...) const { if (display_errors || notify_hwnd) { ExpandoString buf; va_list val; va_start(val,s); buf.StrVFmt(s,val); va_end(val); notify(MakensisAPI::NOTIFY_ERROR, buf.GetPtr()); if (display_errors) { PrintColorFmtMsg_ERR(_T("%") NPRIs, buf.GetPtr()); } } } void CEXEBuild::SCRIPT_MSG(const TCHAR *s, ...) const { if (display_script) { va_list val; va_start(val,s); _vftprintf(g_output,s,val); va_end(val); fflush(g_output); } } void CEXEBuild::INFO_MSG(const TCHAR *s, ...) const { if (display_info) { va_list val; va_start(val,s); _vftprintf(g_output,s,val); va_end(val); fflush(g_output); } } void CEXEBuild::print_warnings() { int nw=0,x=m_warnings.getcount(); if (!x || !display_warnings) return; TCHAR *p=m_warnings.get(); while (x>0) if (!p[--x]) nw++; SetPrintColorWARN(); _ftprintf(g_output,_T("\n%d warning%") NPRIs _T(":\n"),nw,nw==1?_T(""):_T("s")); for (x = 0; x < nw; x ++) { _ftprintf(g_output,_T(" %") NPRIs _T("\n"),p); p+=_tcslen(p)+1; } FlushOutputAndResetPrintColor(); } void CEXEBuild::notify(MakensisAPI::datatransfer_e code, const TCHAR *data) const { #ifdef _WIN32 if (notify_hwnd) { DWORD cb = (DWORD) (_tcslen(data)+1) * sizeof(TCHAR); #ifdef _UNICODE extern NStreamEncoding g_outputenc; extern void quit(); CharEncConv cec; if (!g_outputenc.IsUTF16LE()) { size_t cbConv; if (!cec.Initialize(g_outputenc.GetCodepage(), -1) || !(data = (const TCHAR*) cec.Convert(data, cb, &cbConv))) PrintColorFmtMsg_ERR(_T("conversion failed!\n")), quit(); // Cannot use ERROR_MSG() here! cb = (DWORD) (cbConv + NStreamEncoding::GetCodeUnitSize(g_outputenc.GetCodepage())); // cbConv does not include the \0. } #endif COPYDATASTRUCT cds = {(DWORD) code, cb, (void*) data}; SendMessage(notify_hwnd, WM_COPYDATA, 0, (LPARAM)&cds); } #endif } bool CEXEBuild::hostapi_request_data(MakensisAPI::datatransfer_e operation, UINT minver, HOSTAPIREQUESTDATAPROC proc, void*cookie, const void* input, size_t inputsize) const { using namespace MakensisAPI; #ifdef _WIN32 struct helper { static INT_PTR CALLBACK Proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { size_t *data = (size_t*) GetWindowLongPtr(hWnd, DWLP_USER); if (Msg == WM_CLOSE) { if (lParam) SendMessage((HWND) wParam, WM_COPYDATA, (SIZE_T) hWnd, lParam); return DestroyWindow(hWnd) | PostMessage(NULL, WM_QUIT, 0, 0); } return data && ((CEXEBuild::HOSTAPIREQUESTDATAPROC)data[0])((void*) data[1], hWnd, Msg, wParam, lParam); // We don't set DWLP_MSGRESULT nor care about the return value } }; if (!notify_hwnd || (minver && (UINT) SendMessage(notify_hwnd, QUERYHOST, QH_SUPPORTEDVERSION, 0) < minver)) return false; size_t data[] = { (size_t) proc, (size_t) cookie }; COPYDATASTRUCT cds = { (DWORD) operation, (DWORD) inputsize, (void*) input }; HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, WC_DIALOG, NULL, WS_POPUP|WS_DISABLED, 0, 0, 0, 0, NULL, NULL, NULL, NULL); SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR) data); SetWindowLongPtr(hWnd, DWLP_DLGPROC, (LONG_PTR) helper::Proc); SendMessage(hWnd, WM_CLOSE, (SIZE_T) notify_hwnd, (SIZE_T) &cds); if (hWnd) for (MSG msg; (int) GetMessage(&msg, NULL, 0, 0) > 0;) DispatchMessage(&msg); return !!hWnd; #else return false; #endif } bool CEXEBuild::prompt_for_output_path(TCHAR*path, UINT pathcap) const { using namespace MakensisAPI; #ifdef _WIN32 struct handler { static bool CALLBACK proc(void*cookie, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { size_t *io = (size_t*) cookie; COPYDATASTRUCT*pCDS = (COPYDATASTRUCT*) lParam; if (Msg == WM_COPYDATA && pCDS->cbData > sizeof(TCHAR) && pCDS->cbData <= io[2] * sizeof(TCHAR)) { _tcscpy((TCHAR*) io[1], (TCHAR*) ((COPYDATASTRUCT*)lParam)->lpData); return (io[0] = (pCDS->dwData == MakensisAPI::PROMPT_FILEPATH)); } return false; } }; size_t io[] = { false, (size_t) path, pathcap }, cb; TinyGrowBuf inputbuf((IGrowBuf::size_type) (cb = FIELD_OFFSET(PROMPT_FILEPATH_DATA, Path[pathcap]))); PROMPT_FILEPATH_DATA *p = (PROMPT_FILEPATH_DATA*) inputbuf.get(); p->Platform = (sizeof(void*) * 8) | sizeof(TCHAR), p->Reserved = 0; _tcscpy(p->Path, path); return hostapi_request_data(PROMPT_FILEPATH, 0x03006000, handler::proc, io, p, cb) && io[0]; #else return false; #endif } #ifdef NSIS_CONFIG_PLUGIN_SUPPORT int CEXEBuild::initialize_default_plugins(bool newtargetarc) { if (!m_pPlugins) { plugin_used = uninst_plugin_used = false; newtargetarc = true; } if (!newtargetarc) return PS_OK; m_pPlugins = &m_plugins[m_target_type]; tstring searchPath = definedlist.find(_T("NSISDIR")); searchPath += PLATFORM_PATH_SEPARATOR_STR _T("Plugins") PLATFORM_PATH_SEPARATOR_STR; searchPath += get_target_suffix(); SCRIPT_MSG(_T("Processing default plugins: \"%") NPRIs PLATFORM_PATH_SEPARATOR_STR _T("*.dll\"\n"), searchPath.c_str()); if (!m_pPlugins->Initialize(searchPath.c_str(), is_target_64bit(), !!display_script)) { ERROR_MSG(_T("Error initializing default plugins!\n")); return PS_ERROR; } SCRIPT_MSG(_T("\n")); return PS_OK; } int CEXEBuild::add_plugins_dir_initializer(void) { if (!plugin_used && !uninst_plugin_used) return PS_OK; SCRIPT_MSG(_T("Adding plug-ins initializing function... ")); bool uninstall = !plugin_used; int ret; int var_r0=m_UserVarNames.get(_T("0")), r0_offset; int var_r1=m_UserVarNames.get(_T("1")), r1_offset; again: // Function [un.]Initialize_____Plugins ret=add_function(uninstall?_T("un.Initialize_____Plugins"):_T("Initialize_____Plugins")); if (ret != PS_OK) return ret; // don't move this, depends on [un.] r0_offset=add_asciistring(_T("$0")); r1_offset=add_asciistring(_T("$1")); // SetDetailsPrint none (special) ret=add_entry_direct(EW_SETFLAG, FLAG_OFFSET(status_update), add_intstring(6), -1); if (ret != PS_OK) return ret; // StrCmp $PLUGINSDIR "" ret=add_entry_direct(EW_STRCMP, add_asciistring(_T("$PLUGINSDIR")), 0, 0, ns_label.add(_T("Initialize_____Plugins_done"),0)); if (ret != PS_OK) return ret; // Push $0 ret=add_entry_direct(EW_PUSHPOP, r0_offset); if (ret != PS_OK) return ret; // Push $1 ret=add_entry_direct(EW_PUSHPOP, r1_offset); if (ret != PS_OK) return ret; // Copy "" to $1 ret=add_entry_direct(EW_ASSIGNVAR, var_r1, r0_offset, 0, -1); if (ret != PS_OK) return ret; // retry: if (add_label(_T("Initialize_____Plugins_retry"))) return PS_ERROR; // ClearErrors ret=add_entry_direct(EW_SETFLAG, FLAG_OFFSET(exec_error)); if (ret != PS_OK) return ret; // GetTempFileName $0 ret=add_entry_direct(EW_GETTEMPFILENAME, var_r0, add_asciistring(_T("$TEMP"))); if (ret != PS_OK) return ret; // Delete $0 [simple, nothing that could clash with special temp permissions] ret=add_entry_direct(EW_DELETEFILE, r0_offset, DEL_SIMPLE); if (ret != PS_OK) return ret; // CreateDirectory $0 - a dir instead of that temp file ret=add_entry_direct(EW_CREATEDIR, r0_offset, 0, 1); if (ret != PS_OK) return ret; // IfErrors Initialize_____Plugins_error - detect errors ret=add_entry_direct(EW_IFFLAG, ns_label.add(_T("Initialize_____Plugins_error"),0), 0, FLAG_OFFSET(exec_error)); if (ret != PS_OK) return ret; // Copy $0 to $PLUGINSDIR ret=add_entry_direct(EW_ASSIGNVAR, m_UserVarNames.get(_T("PLUGINSDIR")), r0_offset); if (ret != PS_OK) return ret; // Pop $1 ret=add_entry_direct(EW_PUSHPOP, var_r1, 1); if (ret != PS_OK) return ret; // Pop $0 ret=add_entry_direct(EW_PUSHPOP, var_r0, 1); if (ret != PS_OK) return ret; // done: if (add_label(_T("Initialize_____Plugins_done"))) return PS_ERROR; // Return ret=add_entry_direct(EW_RET); if (ret != PS_OK) return ret; // error: if (add_label(_T("Initialize_____Plugins_error"))) return PS_ERROR; // IntOp $1 $1 + 1 ret=add_entry_direct(EW_INTOP, var_r1, r1_offset, add_asciistring(_T("1")), 0); if (ret != PS_OK) return ret; // StrCmp $1 "9" ret=add_entry_direct(EW_STRCMP, r1_offset, add_asciistring(_T("9")), 0, ns_label.add(_T("Initialize_____Plugins_retry"),0)); if (ret != PS_OK) return ret; // error message box ret=add_entry_direct(EW_MESSAGEBOX, MB_OK|MB_ICONSTOP|(IDOK<<21), add_asciistring(_T("Error! Can't initialize plug-ins directory. Please try again later."))); if (ret != PS_OK) return ret; // Quit ret=add_entry_direct(EW_QUIT); if (ret != PS_OK) return ret; // FunctionEnd ret=function_end(); if (ret != PS_OK) return ret; if (uninst_plugin_used && !uninstall) { uninstall = true; goto again; } SCRIPT_MSG(_T("Done!\n")); return PS_OK; } #endif // NSIS_CONFIG_PLUGIN_SUPPORT void CEXEBuild::init_res_editor() { build_compressor_set = true; if (!res_editor) res_editor = new CResourceEditor(m_exehead, (DWORD)m_exehead_size); } void CEXEBuild::close_res_editor() { if (!res_editor) return; DWORD newsize; // get size newsize = res_editor->Save(NULL, newsize); unsigned char *new_header = new unsigned char[newsize]; // save int rc = res_editor->Save(new_header, newsize); assert(rc == 0); update_exehead(new_header, newsize); // TODO: resource-controlling class delete [] new_header; delete res_editor; res_editor=0; } int CEXEBuild::DeclaredUserVar(const TCHAR *szVarName) { if (m_ShellConstants.get((TCHAR*)szVarName) >= 0) { ERROR_MSG(_T("Error: name \"%") NPRIs _T("\" in use by constant\n"), szVarName); return PS_ERROR; } int idxUserVar = m_UserVarNames.get((TCHAR*)szVarName); if (idxUserVar >= 0) { ERROR_MSG(_T("Error: variable \"%") NPRIs _T("\" already declared\n"), szVarName); return PS_ERROR; } const TCHAR *pVarName = szVarName; size_t iVarLen = _tcslen(szVarName); if (iVarLen > 60) { ERROR_MSG(_T("Error: variable name too long!\n")); return PS_ERROR; } else if (!iVarLen) { ERROR_MSG(_T("Error: variable with empty name!\n")); return PS_ERROR; } else { while (*pVarName) { if (!isSimpleChar(*pVarName)) { ERROR_MSG(_T("Error: invalid characters in variable name \"%") NPRIs _T("\", use only characters [a-z][A-Z][0-9], '.' and '_'\n"), szVarName); return PS_ERROR; } pVarName++; } } m_UserVarNames.add(szVarName); if (m_UserVarNames.getnum() > MAX_CODED) { ERROR_MSG(_T("Error: too many user variables declared. Maximum allowed is %u.\n"), MAX_CODED - m_iBaseVarsNum); return PS_ERROR; } return PS_OK; } int CEXEBuild::GetUnsafeUserVarIndex(LineParser &line, int token) { TCHAR *p = line.gettoken_str(token); int idx = IsVarPrefix(p) ? m_UserVarNames.get(++p) : -1; if (idx >= 0 && m_UserVarNames.get_reference(idx) >= 0) m_UserVarNames.inc_reference(idx); return idx; } int CEXEBuild::GetUserVarIndex(LineParser &line, int token) { TCHAR *p = line.gettoken_str(token); if (IsVarPrefix(p)) { int idxUserVar = m_UserVarNames.get(p+1); if (idxUserVar >= 0 && m_UserVarNames.get_reference(idxUserVar) >= 0) { m_UserVarNames.inc_reference(idxUserVar); return idxUserVar; } else { int idxConst = m_ShellConstants.get(p+1); if (idxConst >= 0) { ERROR_MSG(_T("Error: cannot change constants : %") NPRIs _T("\n"), p); } } } return -1; } void CEXEBuild::VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList) { for (int i = m_iBaseVarsNum; i < pVarsStringList->getnum(); i++) { if (!pVarsStringList->get_reference(i)) { warning(DW_VAR_NOREF, _T("Variable \"%") NPRIs _T("\" not referenced or never set, wasting memory!"), pVarsStringList->idx2name(i)); } } } bool CEXEBuild::IsIntOrUserVar(const LineParser &line, int token) const { const TCHAR *p = line.gettoken_str(token); if (IsVarPrefix(p)) { int idxUserVar = m_UserVarNames.get(p+1); return (idxUserVar >= 0 && m_UserVarNames.get_reference(idxUserVar) >= 0); } int succ; line.gettoken_int(token, &succ); return succ != false; } int CEXEBuild::set_target_architecture_data() { build_strlist.setunicode(build_unicode), ubuild_strlist.setunicode(build_unicode); size_t t64 = is_target_64bit(), i; WORD dc = DefaultPEDllCharacteristics; if ((dc & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) && t64) dc |= IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA; if (m_target_type == TARGET_ARM64) dc &= ~IMAGE_DLLCHARACTERISTICS_NO_SEH; // ARM64 forces exception directory? PEDllCharacteristics = dc; if (build_unicode) { definedlist.set(_T("NSIS_UNICODE")); definedlist.set(_T("NSIS_CHAR_SIZE"), _T("2")); } else { definedlist.del(_T("NSIS_UNICODE")); definedlist.set(_T("NSIS_CHAR_SIZE"), _T("1")); } definedlist.set(_T("NSIS_PTR_SIZE"), t64 ? _T("8") : _T("4")); const TCHAR* tsuff = get_target_suffix(m_target_type, _T("")); if (!*tsuff) return PS_ERROR; tstring cpu = get_string_prefix(tsuff, _T("-")); definedlist.set(_T("NSIS_CPU"), cpu.c_str()); // Used by Library.nsh to pick the correct RegTool struct { TARGETTYPE tt; const TCHAR *def; const TCHAR *val; } static const tdef[] = { { TARGET_X86ANSI, _T("NSIS_IX86"), _T("300") }, { TARGET_X86UNICODE, _T("NSIS_IX86"), _T("400") }, { TARGET_AMD64, _T("NSIS_AMD64"), _T("1") }, { TARGET_ARM64, _T("NSIS_ARM64"), _T("1") } }; for (i = 0; i < COUNTOF(tdef); ++i) definedlist.del(tdef[i].def); unsigned int success = false; for (i = 0; i < COUNTOF(tdef); ++i) if (tdef[i].tt == m_target_type) definedlist.set(tdef[i].def, tdef[i].val), ++success; return success ? PS_OK : PS_ERROR; } const TCHAR* CEXEBuild::get_target_suffix(CEXEBuild::TARGETTYPE tt, const TCHAR*defval) const { switch(tt) { case TARGET_X86ANSI : return _T("x86-ansi"); case TARGET_X86UNICODE: return _T("x86-unicode"); case TARGET_AMD64 : return _T("amd64-unicode"); case TARGET_ARM64 : return _T("arm64-unicode"); default: return defval; } } int CEXEBuild::change_target_architecture(TARGETTYPE tt) { const bool wide = TARGET_X86ANSI != tt; if (build_compressor_set || (build_unicode != wide && build_lockedunicodetarget)) { ERROR_MSG(_T("Error: Can't change target %") NPRIs _T(" after data already got compressed or header already changed!\n"), _T("architecture")); return PS_ERROR; } if (TARGET_X86ANSI == m_target_type || TARGET_X86UNICODE == m_target_type) m_previous_x86_unicode = build_unicode; m_target_type = tt; build_unicode = wide; int ec = set_target_architecture_data(); if (PS_OK == ec) ec = load_stub(); #ifdef NSIS_CONFIG_PLUGIN_SUPPORT if (PS_OK == ec) ec = initialize_default_plugins(true); #endif changed_target = true; return ec; } int CEXEBuild::set_compressor(const tstring& compressor, const bool solid) { stub_filename = stubs_dir + PLATFORM_PATH_SEPARATOR_STR + compressor; if (solid) stub_filename += _T("_solid"); return load_stub(); } CEXEBuild::TARGETTYPE CEXEBuild::get_target_type(const TCHAR*s) const { for(int i = CEXEBuild::TARGETFIRST; i < CEXEBuild::TARGETCOUNT; ++i) { CEXEBuild::TARGETTYPE tt = (CEXEBuild::TARGETTYPE) i; if (!_tcsicmp(get_target_suffix(tt, _T("")),s) && *s) return tt; } return TARGET_UNKNOWN; } void CEXEBuild::print_bad_targettype_parameter(const TCHAR*cmdname, const TCHAR*prefix) const { tstring errstr = cmdname; errstr += _T(": Target parameter must be one of: "), errstr += prefix; for(int comma = 0, i = CEXEBuild::TARGETFIRST; i < CEXEBuild::TARGETCOUNT; ++i) { const TCHAR *ts = get_target_suffix((CEXEBuild::TARGETTYPE) i, 0); if (!ts) continue; if (comma++) errstr += _T(", "), errstr += prefix; errstr += ts; } ERROR_MSG(_T("Error: %") NPRIs _T("\n"), errstr.c_str()); } int CEXEBuild::load_stub() { return update_exehead(stub_filename+_T("-")+get_target_suffix(), &m_exehead_original_size); } int CEXEBuild::update_exehead(const tstring& file, size_t *size/*=NULL*/) { unsigned long exehead_size; unsigned char *exehead = alloc_and_read_file(file.c_str(), exehead_size); if (!exehead) { ERROR_MSG(_T("Error: reading stub \"%") NPRIs _T("\"\n"), file.c_str()); return PS_ERROR; } update_exehead(exehead, exehead_size); if (size) *size = exehead_size; free(exehead); return PS_OK; } void CEXEBuild::update_exehead(const unsigned char *new_exehead, size_t new_size) { assert(m_exehead != new_exehead); // align exehead to 512 m_exehead_size = align_to_512(new_size); delete [] m_exehead; m_exehead = new unsigned char[m_exehead_size]; // copy exehead memcpy(m_exehead, new_exehead, new_size); // zero rest of exehead memset(m_exehead + new_size, 0, m_exehead_size - new_size); } void CEXEBuild::set_code_type_predefines(const TCHAR *value) { definedlist.del(_T("__SECTION__")); definedlist.del(_T("__FUNCTION__")); definedlist.del(_T("__PAGEEX__")); definedlist.del(_T("__GLOBAL__")); switch (GetCurrentTokenPlace()) { case TP_SEC: definedlist.add(_T("__SECTION__"), value==NULL?_T(""):value); break; case TP_FUNC: definedlist.add(_T("__FUNCTION__"), value==NULL?_T(""):value); break; case TP_PAGEEX: definedlist.add(_T("__PAGEEX__"), value==NULL?_T(""):value); break; default: definedlist.add(_T("__GLOBAL__")); } } void CEXEBuild::postbuild_cmd::delete_all() { for (struct postbuild_cmd *p = this, *tmp; p;) { tmp = p, p = p->next; delete [] tmp; } } CEXEBuild::postbuild_cmd* CEXEBuild::postbuild_cmd::make(const TCHAR *cmdstr, int cmpop, int cmpval) { postbuild_cmd *p = (postbuild_cmd*) (new BYTE[FIELD_OFFSET(postbuild_cmd, cmd[_tcsclen(cmdstr)+!0])]); p->next = NULL, _tcscpy(p->cmd, cmdstr); p->cmpop = cmpop, p->cmpval = cmpval; return p; } int CEXEBuild::run_postbuild_cmds(const postbuild_cmd *cmds, const TCHAR *templatearg_pc1, const TCHAR* commandname) { for (const postbuild_cmd *cmd = cmds; cmd; cmd = cmd->next) { const TCHAR *cmdstr = cmd->cmd, *searchstart = cmdstr; TCHAR *arg, *cmdstrbuf = NULL, *tmpbuf; for (; (arg = _tcsstr(const_cast(searchstart), _T("%1")));) // While found, replace %1 with templatearg_pc1 { const size_t cchtpc1 = _tcslen(templatearg_pc1); tmpbuf = (TCHAR*) malloc((_tcslen(cmdstr) + cchtpc1 + !0) * sizeof(TCHAR)); if (!tmpbuf) { ERROR_MSG(_T("Error: Can't allocate memory for %") NPRIs _T(" command\n"), commandname); return PS_ERROR; } arg -= ((UINT_PTR)cmdstr)/sizeof(TCHAR), arg += ((UINT_PTR)tmpbuf)/sizeof(TCHAR); _tcscpy(tmpbuf, cmdstr); free(cmdstrbuf); memmove(arg + cchtpc1, arg + 2, (_tcslen(arg + 2) + !0) * sizeof(TCHAR)); memmove(arg, templatearg_pc1, cchtpc1 * sizeof(TCHAR)); // BUGBUG: Should we call PathConvertWinToPosix on templatearg_pc1? cmdstr = cmdstrbuf = tmpbuf, searchstart = arg + cchtpc1; } SCRIPT_MSG(_T("\n%") NPRIs _T(" command: %") NPRIs _T("\n"), commandname, cmdstr); int ret = sane_system(cmdstr); if (!check_external_exitcode(ret, cmd->cmpop, cmd->cmpval)) { ERROR_MSG(_T("%") NPRIs _T(" command returned %d, aborting\n"), commandname, ret); return PS_ERROR; } if (ret != 0) INFO_MSG(_T("%") NPRIs _T(" command returned %d\n"), commandname, ret); free(cmdstrbuf); } return PS_OK; } int CEXEBuild::check_external_exitcode(int exitcode, int op, int val) { switch(op) { case 0: return exitcode < val; case 1: return exitcode > val; case 2: return exitcode != val; case 3: return exitcode == val; case 4: return -1; // ignore } return 0; } nsis-3.11/Source/build.h000077500000000000000000000704331477201124000151320ustar00rootroot00000000000000/* * build.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/10/2007 */ #ifndef _BUILD_H_ #define _BUILD_H_ #include "strlist.h" #include "lineparse.h" #include "lang.h" #include "ResourceEditor.h" #include "ResourceVersionInfo.h" #include "uservars.h" #include "ShConstants.h" #include "mmap.h" #include "manifest.h" #include "icon.h" #include #include "utf.h" #include "exehead/fileform.h" #include "exehead/config.h" #include "tstring.h" #include #include #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES // Added by Sunil Kamath 11 June 2003 # include # include #endif #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT // Changed by Amir Szekely 31st July 2002 #include "compressor.h" #include "czlib.h" #include "cbzip2.h" #include "clzma.h" #endif //~ NSIS_CONFIG_COMPRESSION_SUPPORT #ifdef NSIS_CONFIG_PLUGIN_SUPPORT # include "Plugins.h" #endif //~ NSIS_CONFIG_PLUGIN_SUPPORT // 1000..4999 Errors // 5000..5999 Important generic warnings // 6000..6999 Script warnings // 7000..7499 Recovered from bad input etc. warnings // 7500..7999 Discouraged usage warnings (allocated high to low to reserve as much space as possible for more bad input codes) // 8000..8999 Generic warnings // 9000..9999 Breaking our and/or MS guidelines warnings typedef enum { //DE_OOM = 1000?, // Generic out of memory //DE_MMAP = 1001?, //DE_STUB_SECTION = 1100?, //DE_PP_VERBOSE_BAD_LEVEL = 4000?, //DW_STALE_TEMP = 5020?, TODO: There is currently no way to disable this DW_PACKHDR_RETNONZERO = 5021, DW_BADFORMAT_EXTERNAL_FILE = 5040, DW_UNSUPP_STORE_FILE_ATT = 5050, //DW_CMDLINE_UNSUPP = 5200?, //DW_CMDLINE_UNSUPP_WIN = 5201?, DW_CMDLINE_UNSUPP_NIX = 5202, DW_CMDLINE_BAD_INPUTENC = 5210, // reserved ..5229 DW_VAR_IGNORED_UNKNOWN = 6000, // reserved ..6009 DW_VAR_NOREF = 6001, DW_UNUSED_FUNCTION = 6010, // reserved ..6019 DW_UNUSED_GLOBALLABEL = 6011, DW_UNUSED_LABEL = 6012, DW_UNCODE_WITHOUT_UNEXE = 6020, DW_INNERSTRING_MULTISETWASTE = 6029, DW_STRING_MULTISETWASTE = DW_INNERSTRING_MULTISETWASTE, DW_LANGSTRING_MULTISETWASTE = 6030, // reserved ..6049 DW_LANGSTRING_NOTSETINLANG = 6040, DW_LANGSTRING_SILENTLICENSE = 6049, DW_COMMENT_NEWLINE = 6050, // reserved ..6079 DW_PLUGIN_NOUNLOAD_PLACEMENT = 6080, // reserved ..6099 DW_PP_PRAGMA_UNKNOWN = 6100, // reserved ..6199 DW_PP_PRAGMA_INVALID = 6101, DW_PP_DELFILE_DELERROR = 6149, DW_PP_DELFILE_NOMATCH = DW_PP_DELFILE_DELERROR, DW_PP_VERBOSE_POP_EMPTY_STACK = 6150, //DW_PP_VERBOSE_BAD_LEVEL = 6151?, // 2.x failed to issue a warning. 3.x currently aborts with hard error. DW_PP_UNDEF_UNDEFINED = 6155, DW_INCLUDE_NONFATAL_NOT_FOUND = 7000, // reserved ..7009 DW_FILE_NONFATAL_NOT_FOUND = 7010, // reserved ..7019 DW_LANGSTRING_OVERLONGLENGTH = 7020, // reserved ..7024 DW_BAD_LANGID = 7025, // reserved ..7029 DW_NLF_OLDVERSION = 7030, // reserved ..7049 DW_NLF_SYSCP = 7031, DW_NLF_UNSUPPORTED_CP = 7032, DW_NLF_NOT_PREFERRED_ENC = 7033, DW_LICENSE_EMPTY = 7050, DW_ATTRIBUTE_OVERLONGSTRING = 7060, DW_PARSE_BADNUMBER = 7070, DW_PARSE_NUMBEROUTOFSPEC = 7071, DW_PARSE_LNK_HK = 7075, DW_GENERIC_DEPRECATED = 7998, DW_PARSE_REGPATHPREFIX = 7999, DW_INSTFILESPAGE_NOT_USED = 8000, // reserved ..8019 DW_COMP_FINAL = 8020, // reserved ..8059 DW_COMP_WHOLE_IGNORE_OFF = 8021, DW_COMP_LEVEL_IGNORE = 8025, DW_COMP_DICT_IGNORE = 8026, DW_COMP_DICTWHOLE = 8030, DW_CMDLINE_HIGHPRIORITY = 8499, DW_INSECURE_OUTFILENAME = 9000, DW_VI_MISSINGSTDKEY = 9100, DIAGCODE_INTERNAL_HIDEDIAGCODE = 9999, DIAGCODE_INTERNAL_FIRST = 1000, DIAGCODE_INTERNAL_LAST = 9999 } DIAGCODE; #define PS_OK 0 #define PS_EOF 1 #define PS_ERROR 50 #define PS_WARNING 100 // token placement #define TP_SEC 1 #define TP_FUNC 2 #define TP_CODE (TP_SEC | TP_FUNC) #define TP_GLOBAL 4 #define TP_PAGEEX 8 #define TP_PG (TP_GLOBAL | TP_PAGEEX) #define TP_ALL (TP_CODE | TP_PG) namespace MakensisAPI { extern const TCHAR* SigintEventNameFmt; extern const TCHAR* SigintEventNameLegacy; enum datatransfer_e { NOTIFY_SCRIPT, // Compiler -> Host: main nsi file(s) NOTIFY_WARNING, NOTIFY_ERROR, NOTIFY_OUTPUT, // Compiler -> Host: Generated .exe file PROMPT_FILEPATH // [0x03006000] Compiler -> Host -> Compiler }; #ifdef _WIN32 enum sndmsg_e { QUERYHOST = WM_APP // [0x03000000] QUERYHOST_e in wParam. MUST return 0 for unknown QUERYHOST_e values! }; #endif enum QUERYHOST_e { QH_OUTPUTCHARSET = 1, // [0x03000000] return (wincodepage+1) or 0 for default (This encoding is used by stdout, stderr and the notify messages) QH_ENABLESTDERR, // [0x03001000] return 1 to output error messages to stderr or 0 to output error messages to stdout QH_SUPPORTEDVERSION, // [0x03006000] The host must return new highest makensis compiler version it supports }; typedef struct { unsigned char Platform; // Bitness OR'ed with sizeof(TCHAR) of the compiler unsigned char Reserved; TCHAR Path[1]; } PROMPT_FILEPATH_DATA; } #define PAGE_CUSTOM 0 #define PAGE_LICENSE 1 #define PAGE_COMPONENTS 2 #define PAGE_DIRECTORY 3 #define PAGE_INSTFILES 4 #define PAGE_UNINSTCONFIRM 5 #define PAGE_COMPLETED 6 #define FLAG_OFFSET(flag) (FIELD_OFFSET(exec_flags_t, flag)/sizeof(int)) class DiagState { template void insert_or_assign(C&c, const K&k, V val) { typename C::value_type item(k, val); std::pair ret = c.insert(item); if (!ret.second) ret.first->second = val; } template typename STL::mapped_type::type get_paired_value(const C&c, const K&k, typename STL::mapped_type::type defval) const { typename C::const_iterator it = c.find(k); return c.end() == it ? defval : it->second; } template int get_code_state(T t, int def) const { return get_paired_value(m_Warnings, static_cast(t), def); } public: typedef enum { wunspecified = -1, wdisabled = 0, wwarning, wenabled, werror } WARNSTATE; DiagState() : m_pStack(0), m_FallbackState(get_default_state()) { assert(DIAGCODE_INTERNAL_LAST <= 0xffff); } ~DiagState() { delete m_pStack; } static WARNSTATE get_default_state(DIAGCODE n = (DIAGCODE) 0) { return wenabled; } // All warnings currently default to enabled void def(DIAGCODE n) { insert_or_assign(m_Warnings, static_cast(n), get_default_state(n)); } void enable(DIAGCODE n) { insert_or_assign(m_Warnings, static_cast(n), wenabled); } void disable(DIAGCODE n) { insert_or_assign(m_Warnings, static_cast(n), wdisabled); } void warning(DIAGCODE n) { insert_or_assign(m_Warnings, static_cast(n), wwarning); } // Always !warning void error(DIAGCODE n) { insert_or_assign(m_Warnings, static_cast(n), werror); } // Always !error bool is_disabled(DIAGCODE n) const { return get_code_state(n, m_FallbackState) == wdisabled; } bool is_error(DIAGCODE n) const { int s = get_code_state(n, m_FallbackState); return s == werror; } void push(); bool pop(); void set_all(WARNSTATE wm) { m_Warnings.clear(); m_FallbackState = wm; } void set_warning_as_error() { set_all(werror); } static bool is_valid_code(unsigned int n) { return n >= DIAGCODE_INTERNAL_FIRST && n <= DIAGCODE_INTERNAL_LAST; } protected: DiagState *m_pStack; signed char m_FallbackState; // A fallback state so we don't have to fill the m_Warnings map with values for codes that are not explicitly set by the user std::map m_Warnings; }; class CEXEBuild { public: CEXEBuild(signed char pponly, bool warnaserror); void initialize(const TCHAR *makensis_path); ~CEXEBuild(); enum { MAX_LINELENGTH = 16384, // NSI/NSH line limit, in TCHARs (including \0) MAX_MACRORECURSION = 50 }; static const TCHAR* get_commandlinecode_filename() { return _T(""); } static const TCHAR* get_memorycode_filename() { return _T(""); } void warning(DIAGCODE dc, const TCHAR *s, ...); // to add a warning to the compiler's warning list. void warning_fl(DIAGCODE dc, const TCHAR *s, ...); // warning with file name and line number void ERROR_MSG(const TCHAR *s, ...) const; void SCRIPT_MSG(const TCHAR *s, ...) const; void INFO_MSG(const TCHAR *s, ...) const; typedef enum { TARGETFIRST, TARGET_X86ANSI = TARGETFIRST, TARGET_X86UNICODE, TARGET_AMD64, // Always Unicode TARGET_ARM64, // Always Unicode TARGET_UNKNOWN, TARGETCOUNT = (TARGET_UNKNOWN-TARGETFIRST) } TARGETTYPE; TARGETTYPE m_target_type; TARGETTYPE get_target_type(const TCHAR*s) const; bool m_previous_x86_unicode; const TCHAR* get_target_suffix(CEXEBuild::TARGETTYPE tt, const TCHAR*defval = _T("?")) const; const TCHAR* get_target_suffix() const { return get_target_suffix(m_target_type); } static bool is_targettype_64bit(TARGETTYPE tt) { return TARGET_AMD64 == tt || TARGET_ARM64 == tt; } bool is_target_64bit() const { return is_targettype_64bit(m_target_type); } void print_bad_targettype_parameter(const TCHAR*cmdname, const TCHAR*prefix = _T("")) const; unsigned int get_header_size() const { return (unsigned int)sizeof(header) + (is_target_64bit() ? (4 * BLOCKS_NUM) : 0); } void set_default_output_filename(const tstring& filename); const TCHAR* get_output_filename() const { return build_output_filename; } // process a script (you can process as many scripts as you want, // it is as if they are concatenated) int process_script(NIStream&Strm, const TCHAR *filename); enum PROCESSLINEFLAGS { PLF_MACRO = 0x01, PLF_VIRTUALFILE = 0x02 }; int process_oneline(const TCHAR *line, const TCHAR *curfilename, int lineptr, unsigned int plflags); // you only get to call write_output once, so use it wisely. int write_output(void); void print_help(const TCHAR *commandname=NULL); bool print_cmdhelp(const TCHAR *commandname, bool cmdhelp=false); DefineList definedlist; // List of identifiers marked as "defined" like // C++ macro definitions such as _UNICODE. void define(const TCHAR *p, const TCHAR *v=_T("")); // to add a defined thing. signed char preprocessonly; // > 0 = safe, < 0 = unsafe int get_verbosity() const; void set_verbosity(int lvl); bool display_errors; bool display_script; bool display_warnings; bool display_info; int linecnt; const TCHAR *curfilename; NStreamLineReader* curlinereader; HWND notify_hwnd; void notify(MakensisAPI::datatransfer_e code, const TCHAR *data) const; #ifdef _WIN32 typedef bool (CALLBACK*HOSTAPIREQUESTDATAPROC)(void*cookie, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); #else typedef bool (*HOSTAPIREQUESTDATAPROC)(void*cookie); #endif bool hostapi_request_data(MakensisAPI::datatransfer_e operation, UINT minver, HOSTAPIREQUESTDATAPROC proc, void*cookie, const void* input, size_t inputsize) const; bool prompt_for_output_path(TCHAR*path, UINT pathcap) const; private: int check_write_output_errors() const; int prepare_uninstaller(); int pack_exe_header(); int set_compressor(const tstring& compressor, const bool solid); int load_stub(); int update_exehead(const tstring& file, size_t *size=NULL); void update_exehead(const unsigned char *new_exehead, size_t new_size); // tokens.cpp bool is_ppbranch_token(const TCHAR *s); bool is_pp_token(int tkid); bool is_unsafe_pp_token(int tkid); int get_commandtoken(const TCHAR *s, int *np, int *op, int *pos); const TCHAR* get_commandtoken_name(int tok); /** * Returns the current "state" by looking at whether it is in a * section/function/pagex or global. * @return TP_FUNC, TP_SEC, TP_PAGEEX, TP_GLOBAL. */ int GetCurrentTokenPlace(); int IsTokenPlacedRight(int pos, const TCHAR *tok); // script.cpp #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES // Added by Sunil Kamath 11 June 2003 TCHAR* set_file_predefine(const TCHAR *); void restore_file_predefine(TCHAR *); TCHAR* set_timestamp_predefine(const TCHAR *); void restore_timestamp_predefine(TCHAR *); TCHAR* set_line_predefine(int, BOOL); void restore_line_predefine(TCHAR *); void set_date_time_predefines(); void del_date_time_predefines(); #endif int parseScript(); int includeScript(const TCHAR *f, NStreamEncoding&enc); int includeScriptLines(const TCHAR *start, const TCHAR *end, const TCHAR *name); TCHAR* GetMacro(const TCHAR *macroname, TCHAR**macroend = 0); TCHAR* GetMacro(size_t idx); bool MacroExists(const TCHAR *macroname) { return !!GetMacro(macroname); } LANGID ParseLangIdParameter(const LineParser&line, int token); int LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cmdname, WORD AnsiCP); #ifdef NSIS_FIX_DEFINES_IN_STRINGS void ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hist, bool bIgnoreDefines = false); #else void ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hist); #endif int doParse(int verbosity, const TCHAR *fmt, ...); int doParse(const TCHAR *str); int doCommand(int which_token, LineParser &line); TCHAR m_templinebuf[MAX_LINELENGTH]; // Buffer used by parseScript() & doCommand(), not recursion safe! int add_flag_instruction_entry(int which_token, int opcode, LineParser &line, int offset, int data = 0); int do_add_file(const TCHAR *lgss, int attrib, int recurse, int *total_files, const TCHAR *name_override=0, int generatecode=1, int *data_handle=0, const std::set& excluded=std::set(), const tstring& basedir=tstring(_T("")), bool dir_created=false); int add_file(const tstring& dir, const tstring& file, int attrib, const TCHAR *name_override, int generatecode, int *data_handle); int do_add_file_create_dir(const tstring& local_dir, const tstring& dir, int attrib=0); GrowBuf m_linebuild; // used for concatenating lines // used by doParse to do preprocessing struct ifblock { int hasexeced; int elseused; int ignore; int inherited_ignore; } *cur_ifblock; TinyGrowBuf build_preprocessor_data; void start_ifblock(); void end_ifblock(); int num_ifblock(); int last_line_had_slash; bool inside_comment; int multiple_entries_instruction; // 1 (true) or 0 (false) int pp_boolifyexpression(LineParser&line, int &result, bool allow_logicneg = true, int ignore_last_tokens = 0); int pp_assert(LineParser&line); int pp_macro(LineParser&line); int pp_macroundef(LineParser&line); int pp_insertmacro(LineParser&line); int pp_tempfile(LineParser&line); int pp_delfile(LineParser&line); int pp_appendfile(LineParser&line); int pp_appendmemfile(LineParser&line); int pp_getversionhelper(const TCHAR *cmdname, const TCHAR *path, const TCHAR *basesymname, DWORD high, DWORD low, DWORD flags); int pp_getversion(int which_token, LineParser&line); int pp_searchreplacestring(LineParser&line); int pp_searchparsestring(LineParser&line); DefineList *searchParseString(const TCHAR *source_string, LineParser&line, int parmOffs, bool ignCase, bool noErrors, UINT*failParam = 0); int pp_verbose(LineParser&line); int pp_define(LineParser&line); int pp_undef(LineParser&line); int pp_packhdr(LineParser&line); int pp_finalize(int which_token, LineParser&line); int pp_execute(int which_token, LineParser&line); int pp_addincludedir(LineParser&line); int pp_include(LineParser&line); int pp_cd(LineParser&line); int pp_pragma(LineParser&line); // build.cpp functions used mostly by script.cpp int set_target_architecture_data(); int change_target_architecture(TARGETTYPE tt); void set_code_type_predefines(const TCHAR *value = NULL); int getcurdbsize(); int add_section(const TCHAR *secname, const TCHAR *defname, int expand=0); int section_end(); int add_function(const TCHAR *funname); int function_end(); void section_add_size_kb(int kb); int section_add_flags(int flags); int section_add_install_type(int inst_type); int add_page(int type); int page_end(); int add_label(const TCHAR *name); int add_entry(const entry *ent); int add_entry_direct(int which, int o0=0, int o1=0, int o2=0, int o3=0, int o4=0, int o5=0); int add_db_data(IMMap *map); // returns offset int add_db_data(const char *data, int length); // returns offset int add_db_data(const char *data, size_t length) { assert(length <= 0x7FFFFFFF); return add_db_data(data, (int)length); } int add_data(const char *data, int length, IGrowBuf *dblock); // returns offset int add_string(const TCHAR *string, int process=1, UINT codepage=-2); // returns offset (in string table) int add_asciistring(const TCHAR *string, int process=1); // For hardcoded 7bit/ASCII strings int add_intstring(const int i); // returns offset in stringblock int preprocess_string(TCHAR *out, const TCHAR *in, WORD codepage=CP_ACP); void init_shellconstantvalues(); int parse_pragma(LineParser &line); #ifdef NSIS_CONFIG_PLUGIN_SUPPORT int add_plugins_dir_initializer(void); int initialize_default_plugins(bool newtargetarc = false); Plugins m_plugins[TARGETCOUNT], *m_pPlugins; bool plugin_used; bool uninst_plugin_used; int build_plugin_unload; // TOK_SETPLUGINUNLOAD #endif //NSIS_CONFIG_PLUGIN_SUPPORT // build.cpp functions used mostly within build.cpp int datablock_optimize(int start_offset, int first_int); bool datablock_finddata(IMMap&mmap, int mmstart, int size, int*ofs); void printline(int l); int process_jump(LineParser &line, int wt, int *offs); int AddVersionInfo(); int ProcessPages(); void PrepareInstTypes(); void AddStandardStrings(); void PrepareHeaders(IGrowBuf *hdrbuf); int SetVarsSection(); int SetManifest(); int UpdatePEHeader(); int resolve_jump_int(const TCHAR *fn, int *a, int offs, int start, int end); int resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int *ofs); int resolve_instruction(const TCHAR *fn, const TCHAR *str, entry *w, int offs, int start, int end); int resolve_coderefs(const TCHAR *str); int uninstall_generate(); void print_warnings(); void warninghelper(DIAGCODE dc, bool fl, const TCHAR *fmt, va_list args); DiagState diagstate; bool changed_target; /** Are we defining an uninstall version of the code? * @param un Use like a boolean to define whether in uninstall mode. */ void set_uninstall_mode(int un); // lang.cpp functions and variables void InitLangTables(); /** * This function gets a LanguageTable structure for the specified language * via LANGID. If create == true, it will create a new LanguageTable if * the appropriate one cannot be found. If lang is LANG_NEUTRAL (0), then * it will get the LanguageTable of the last used language or more * correctly, the last Language ID that generated a valid return value * (not NULL). * * @param lang [in/out] Language ID reference. If LANG_NEUTRAL, it gets * set to thelast used language ID. * @param create Create a new LanguageTable? Default = true. * @return Appropriate LanguagTable* if exists, otherwise NULL. */ LanguageTable *GetLangTable(LANGID &lang, bool create = true); /** * Get the language name as a TCHAR* and the code page value via an * out parameter. It will look for a LanguageTable to get the values. * If not found, then it will set the codepage to English for ANSI * or Unicode for Unicode version of NSIS. The language name is looked * up via the LanguageTable if it exists, otherwise, it returns "???" except * a hardcoded check for 1033 (english). It really should fall back to * calling GetLocaleInfo() with the LANGID to get the string. * * This function is not thread-safe! For a thread-safe version, the * parameter must include the buffer to write to. * * @param lang The language ID * @param codepage [out] The code page referred to by the language ID. * @return The language string in English. */ const TCHAR *GetLangNameAndCP(LANGID lang, unsigned int *codepage = NULL); const TCHAR *GetLangNameAndCPForVersionResource(LANGID &lang, unsigned int *codepage = NULL, bool deflangfallback = true); int DefineLangString(const TCHAR *name, int process=-1); int DefineInnerLangString(int id, int process=-1); /** * A LangString is a string variable that varies in value depending on what * language is being used. This function sets the string value for the * variable 'name' for a given language ID. * * @return If the language id, the variable name or string is invalid, it will * return a PS_ERROR. If this function call is overwriting a set user string, * this will return a PS_WARNING. */ int SetLangString(const TCHAR *name, LANGID lang, const TCHAR *str, BOOL LicenseData); int SetLangString(const TCHAR *name, LANGID lang, const TCHAR *str); /** * Sets the user string to the specific NLF_STRINGS id. * * @return If the id is invalid or the string is not valid, it will return * a PS_ERROR. If this function call is overwriting a set user string, * this will return a PS_WARNING. */ int SetInnerString(int id, const TCHAR *str); int GenerateLangTable(LanguageTable *lt, int num_lang_tables); int GenerateLangTables(); void FillLanguageTable(LanguageTable *table); int HasUserDefined(int id) { const TCHAR *us = UserInnerStrings.get(id); return us && *us; }; LanguageTable *LoadLangFile(TCHAR *filename); void DeleteLangTable(LanguageTable *table); NLFRef NLFRefs[NLF_STRINGS]; bool keep_ref; StringsArray UserInnerStrings; bool defcodepage_set; GrowBuf lang_tables; LANGID last_used_lang; LangStringList build_langstrings; int build_langstring_num, ubuild_langstring_num; TCHAR build_font[1024]; int build_font_size; unsigned int uDefCodePage; // pages stuff int license_res_id; page *cur_page; // Current page we are defining, NULL if not. int cur_page_type; int enable_last_page_cancel, uenable_last_page_cancel; int disable_window_icon; // User variables stuff int GetUnsafeUserVarIndex(LineParser &line, int token); int GetUserVarIndex(LineParser &line, int token); // Added by ramon 3 jun 2003 UserVarsStringList m_UserVarNames; int m_iBaseVarsNum; int DeclaredUserVar(const TCHAR *VarName); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); bool IsIntOrUserVar(const LineParser &line, int token) const; static bool IsVarPrefix(const TCHAR*s) { return *s++ == _T('$') && *s > ' '; } ConstantsStringList m_ShellConstants; // a whole bunch O data. tstring stubs_dir; tstring stub_filename; #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT ICompressor *compressor; CZlib zlib_compressor; CBzip2 bzip2_compressor; CLZMA lzma_compressor; #endif bool build_compressor_set; bool build_compressor_final; bool build_compress_whole; int build_compress; int build_compress_level; int build_compress_dict_size; bool no_space_texts; bool build_unicode;// generate installer with unicode exehead? bool build_lockedunicodetarget; class writer_target_info mk_writer_target_info(); bool has_called_write_output; struct postbuild_cmd { struct postbuild_cmd*next; int cmpop, cmpval; TCHAR cmd[1]; void delete_all(); static postbuild_cmd* make(const TCHAR *cmdstr, int cmpop, int cmpval); } *postbuild_cmds, *postubuild_cmds; int run_postbuild_cmds(const postbuild_cmd *cmds, const TCHAR *templatearg_pc1, const TCHAR* commandname); int check_external_exitcode(int exitcode, int op, int val); TCHAR build_packname[1024], build_packcmd[1024]; int build_overwrite, build_last_overwrite, build_crcchk, build_datesave, build_optimize_datablock, build_allowskipfiles; // Added by ramon 23 May 2003 header build_header, build_uninst, *cur_header; int uninstall_mode; // Are we in uninstall mode? Acts like a bool. UINT32 uninstall_size,uninstall_size_full; int uninstaller_writes_used; TCHAR build_output_filename[1024]; int build_include_depth; // Added by ramon 6 jun 2003 #ifdef NSIS_SUPPORT_VERSION_INFO CResourceVersionInfo rVersionInfo; unsigned int version_fixedflags; #endif int sectiongroup_open_cnt; FastStringList m_warnings; const TCHAR* m_currentmacroname; GrowBuf m_macros; UINT64 db_opt_save, db_opt_save_u, db_full_size, db_full_size_u; int db_comp_save, db_comp_save_u; FastStringList include_dirs; StringList ns_func; // function namespace StringList ns_label; // label namespace int build_cursection_isfunc; // Are we in the middle of func definition? section *build_cursection; // The section we are defining, NULL if not in section. // This could be a function or a section. // The ubuild prefixed objects / variables are for the uninstall versions // of the code. The cur prefix objects are what the current objects that // need to be referenced should be. What is pointed to by the cur* objects // are determined by whether or not we are in uninstall mode or not. TinyGrowBuf build_sections, ubuild_sections, *cur_sections; GrowBuf build_entries,ubuild_entries, *cur_entries; GrowBuf build_instruction_entry_map,ubuild_instruction_entry_map, *cur_instruction_entry_map; TinyGrowBuf build_functions, ubuild_functions, *cur_functions; TinyGrowBuf build_labels, ubuild_labels, *cur_labels; ExeHeadStringList build_strlist, ubuild_strlist, *cur_strlist; GrowBuf build_langtables, ubuild_langtables, *cur_langtables; TinyGrowBuf build_pages, ubuild_pages, *cur_pages; TinyGrowBuf build_ctlcolors, ubuild_ctlcolors, *cur_ctlcolors; // don't forget to update the cache after updating the datablock // see datablock_optimize for an example MMapBuf build_datablock, ubuild_datablock; TinyGrowBuf build_datablock_cache, ubuild_datablock_cache; IGrowBuf *cur_datablock, *cur_datablock_cache; struct cached_db_size { int first_int; // size | (compressed ? 0x80000000 : 0) int start_offset; }; int build_filebuflen; TinyGrowBuf verbose_stack; unsigned char *m_exehead; size_t m_exehead_size; size_t m_exehead_original_size; bool branding_image_found; WORD branding_image_id; IconGroup installer_icon; IconGroup uninstaller_icon; size_t m_unicon_size; #ifdef NSIS_SUPPORT_BGBG LOGFONT bg_font; LOGFONT bg_default_font; #endif #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT int deflateToFile(FILE *fp, char *buf, int len); // len==0 to flush #endif WORD PEDllCharacteristics, PESubsysVerMaj, PESubsysVerMin; unsigned int manifest_flags; manifest::comctl manifest_comctl; manifest::exec_level manifest_exec_level; manifest::dpiaware manifest_dpiaware; tstring manifest_dpiawareness; manifest::longpathaware manifest_lpaware; manifest::SupportedOSList manifest_sosl; tstring manifest_maxversiontested; CResourceEditor *res_editor; void init_res_editor(); void close_res_editor(); }; #endif //_BUILD_H_ nsis-3.11/Source/bzip2/000077500000000000000000000000001477201124000146765ustar00rootroot00000000000000nsis-3.11/Source/bzip2/blocksort.c000077500000000000000000000752231477201124000170600ustar00rootroot00000000000000/* * This file is a part of the bzip2 compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.bzip.org/ * * This modification is not compatible with the original bzip2. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 */ #include "bzlib.h" /*-------------------------------------------------------------*/ /*--- Block sorting machinery ---*/ /*--- blocksort.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. To get some idea how the block sorting algorithms in this file work, read my paper On the Performance of BWT Sorting Algorithms in Proceedings of the IEEE Data Compression Conference 2000, Snowbird, Utah, USA, 27-30 March 2000. The main sort in this file implements the algorithm called cache in the paper. --*/ /*---------------------------------------------*/ /*--- Fallback O(N log(N)^2) sorting ---*/ /*--- algorithm, for repetitive blocks ---*/ /*---------------------------------------------*/ /*---------------------------------------------*/ static void fallbackSimpleSort ( UInt32* fmap, UInt32* eclass, Int32 lo, Int32 hi ) { Int32 i, j, tmp; UInt32 ec_tmp; if (lo == hi) return; if (hi - lo > 3) { for ( i = hi-4; i >= lo; i-- ) { tmp = fmap[i]; ec_tmp = eclass[tmp]; for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) fmap[j-4] = fmap[j]; fmap[j-4] = tmp; } } for ( i = hi-1; i >= lo; i-- ) { tmp = fmap[i]; ec_tmp = eclass[tmp]; for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) fmap[j-1] = fmap[j]; fmap[j-1] = tmp; } } /*---------------------------------------------*/ #define fswap(zz1, zz2) \ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } #define fvswap(zzp1, zzp2, zzn) \ { \ Int32 yyp1 = (zzp1); \ Int32 yyp2 = (zzp2); \ Int32 yyn = (zzn); \ while (yyn > 0) { \ fswap(fmap[yyp1], fmap[yyp2]); \ yyp1++; yyp2++; yyn--; \ } \ } #define fmin(a,b) ((a) < (b)) ? (a) : (b) #define fpush(lz,hz) { stackLo[sp] = lz; \ stackHi[sp] = hz; \ sp++; } #define fpop(lz,hz) { sp--; \ lz = stackLo[sp]; \ hz = stackHi[sp]; } #define FALLBACK_QSORT_SMALL_THRESH 10 #define FALLBACK_QSORT_STACK_SIZE 100 static void fallbackQSort3 ( UInt32* fmap, UInt32* eclass, Int32 loSt, Int32 hiSt ) { Int32 unLo, unHi, ltLo, gtHi, n, m; Int32 sp, lo, hi; UInt32 med, r, r3; Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; r = 0; sp = 0; fpush ( loSt, hiSt ); while (sp > 0) { AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 ); fpop ( lo, hi ); if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { fallbackSimpleSort ( fmap, eclass, lo, hi ); continue; } /* Random partitioning. Median of 3 sometimes fails to avoid bad cases. Median of 9 seems to help but looks rather expensive. This too seems to work but is cheaper. Guidance for the magic constants 7621 and 32768 is taken from Sedgewick's algorithms book, chapter 35. */ r = ((r * 7621) + 1) % 32768; r3 = r % 3; if (r3 == 0) med = eclass[fmap[lo]]; else if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else med = eclass[fmap[hi]]; unLo = ltLo = lo; unHi = gtHi = hi; while (1) { while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unLo]] - (Int32)med; if (n == 0) { fswap(fmap[unLo], fmap[ltLo]); ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; } while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unHi]] - (Int32)med; if (n == 0) { fswap(fmap[unHi], fmap[gtHi]); gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; } if (unLo > unHi) break; fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; } AssertD ( unHi == unLo-1, _T("fallbackQSort3(2)") ); if (gtHi < ltLo) continue; n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); n = lo + unLo - ltLo - 1; m = hi - (gtHi - unHi) + 1; if (n - lo > hi - m) { fpush ( lo, n ); fpush ( m, hi ); } else { fpush ( m, hi ); fpush ( lo, n ); } } } #undef fmin #undef fpush #undef fpop #undef fswap #undef fvswap #undef FALLBACK_QSORT_SMALL_THRESH #undef FALLBACK_QSORT_STACK_SIZE /*---------------------------------------------*/ /* Pre: nblock > 0 eclass exists for [0 .. nblock-1] ((UChar*)eclass) [0 .. nblock-1] holds block ptr exists for [0 .. nblock-1] Post: ((UChar*)eclass) [0 .. nblock-1] holds block All other areas of eclass destroyed fmap [0 .. nblock-1] holds sorted order bhtab [ 0 .. 2+(nblock/32) ] destroyed */ #define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) #define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) #define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) #define WORD_BH(zz) bhtab[(zz) >> 5] #define UNALIGNED_BH(zz) ((zz) & 0x01f) static void fallbackSort ( UInt32* fmap, UInt32* eclass, UInt32* bhtab, Int32 nblock) { Int32 ftab[257]; Int32 ftabCopy[256]; Int32 H, i, j, k, l, r, cc, cc1; Int32 nNotDone; Int32 nBhtab; UChar* eclass8 = (UChar*)eclass; /*-- Initial 1-char radix sort to generate initial fmap and initial BH bits. --*/ for (i = 0; i < 257; i++) ftab[i] = 0; for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; for (i = 0; i < nblock; i++) { j = eclass8[i]; k = ftab[j] - 1; ftab[j] = k; fmap[k] = i; } nBhtab = 2 + (nblock / 32); for (i = 0; i < nBhtab; i++) bhtab[i] = 0; for (i = 0; i < 256; i++) SET_BH(ftab[i]); /*-- Inductively refine the buckets. Kind-of an "exponential radix sort" (!), inspired by the Manber-Myers suffix array construction algorithm. --*/ /*-- set sentinel bits for block-end detection --*/ for (i = 0; i < 32; i++) { SET_BH(nblock + 2*i); CLEAR_BH(nblock + 2*i + 1); } /*-- the log(N) loop --*/ H = 1; while (1) { j = 0; for (i = 0; i < nblock; i++) { if (ISSET_BH(i)) j = i; k = fmap[i] - H; if (k < 0) k += nblock; eclass[k] = j; } nNotDone = 0; r = -1; while (1) { /*-- find the next non-singleton bucket --*/ k = r + 1; while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; if (ISSET_BH(k)) { while (WORD_BH(k) == 0xffffffff) k += 32; while (ISSET_BH(k)) k++; } l = k - 1; if (l >= nblock) break; while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; if (!ISSET_BH(k)) { while (WORD_BH(k) == 0x00000000) k += 32; while (!ISSET_BH(k)) k++; } r = k - 1; if (r >= nblock) break; /*-- now [l, r] bracket current bucket --*/ if (r > l) { nNotDone += (r - l + 1); fallbackQSort3 ( fmap, eclass, l, r ); /*-- scan bucket and generate header bits-- */ cc = -1; for (i = l; i <= r; i++) { cc1 = eclass[fmap[i]]; if (cc != cc1) { SET_BH(i); cc = cc1; }; } } } H *= 2; if (H > nblock || nNotDone == 0) break; } /*-- Reconstruct the original block in eclass8 [0 .. nblock-1], since the previous phase destroyed it. --*/ j = 0; for (i = 0; i < nblock; i++) { while (ftabCopy[j] == 0) j++; ftabCopy[j]--; eclass8[fmap[i]] = (UChar)j; } AssertH ( j < 256, 1005 ); } #undef SET_BH #undef CLEAR_BH #undef ISSET_BH #undef WORD_BH #undef UNALIGNED_BH /*---------------------------------------------*/ /*--- The main, O(N^2 log(N)) sorting ---*/ /*--- algorithm. Faster for "normal" ---*/ /*--- non-repetitive blocks. ---*/ /*---------------------------------------------*/ /*---------------------------------------------*/ static Bool mainGtU ( UInt32 i1, UInt32 i2, UChar* block, UInt16* quadrant, UInt32 nblock, Int32* budget ) { Int32 k; UChar c1, c2; UInt16 s1, s2; AssertD ( i1 != i2, _T("mainGtU") ); /* 1 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 2 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 3 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 4 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 5 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 6 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 7 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 8 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 9 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 10 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 11 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 12 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; k = nblock + 8; do { /* 1 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 2 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 3 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 4 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 5 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 6 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 7 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 8 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; if (i1 >= nblock) i1 -= nblock; if (i2 >= nblock) i2 -= nblock; k -= 8; (*budget)--; } while (k >= 0); return False; } /*---------------------------------------------*/ /*-- Knuth's increments seem to work better than Incerpi-Sedgewick here. Possibly because the number of elems to sort is usually small, typically <= 20. --*/ static Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484 }; static void mainSimpleSort ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, Int32 lo, Int32 hi, Int32 d, Int32* budget ) { Int32 i, j, h, bigN, hp; UInt32 v; bigN = hi - lo + 1; if (bigN < 2) return; hp = 0; while (incs[hp] < bigN) hp++; hp--; for (; hp >= 0; hp--) { h = incs[hp]; i = lo + h; while (True) { /*-- copy 1 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; /*-- copy 2 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; /*-- copy 3 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; if (*budget < 0) return; } } } /*---------------------------------------------*/ /*-- The following is an implementation of an elegant 3-way quicksort for strings, described in a paper "Fast Algorithms for Sorting and Searching Strings", by Robert Sedgewick and Jon L. Bentley. --*/ #define mswap(zz1, zz2) \ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } #define mvswap(zzp1, zzp2, zzn) \ { \ Int32 yyp1 = (zzp1); \ Int32 yyp2 = (zzp2); \ Int32 yyn = (zzn); \ while (yyn > 0) { \ mswap(ptr[yyp1], ptr[yyp2]); \ yyp1++; yyp2++; yyn--; \ } \ } static UChar mmed3 ( UChar a, UChar b, UChar c ) { UChar t; if (a > b) { t = a; a = b; b = t; }; if (b > c) { b = c; if (a > b) b = a; } return b; } #define mmin(a,b) ((a) < (b)) ? (a) : (b) #define mpush(lz,hz,dz) { stackLo[sp] = lz; \ stackHi[sp] = hz; \ stackD [sp] = dz; \ sp++; } #define mpop(lz,hz,dz) { sp--; \ lz = stackLo[sp]; \ hz = stackHi[sp]; \ dz = stackD [sp]; } #define mnextsize(az) (nextHi[az]-nextLo[az]) #define mnextswap(az,bz) \ { Int32 tz; \ tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } #define MAIN_QSORT_SMALL_THRESH 20 #define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) #define MAIN_QSORT_STACK_SIZE 100 static void mainQSort3 ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, Int32 loSt, Int32 hiSt, Int32 dSt, Int32* budget ) { Int32 unLo, unHi, ltLo, gtHi, n, m, med; Int32 sp, lo, hi, d; Int32 stackLo[MAIN_QSORT_STACK_SIZE]; Int32 stackHi[MAIN_QSORT_STACK_SIZE]; Int32 stackD [MAIN_QSORT_STACK_SIZE]; Int32 nextLo[3]; Int32 nextHi[3]; Int32 nextD [3]; sp = 0; mpush ( loSt, hiSt, dSt ); while (sp > 0) { AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 ); mpop ( lo, hi, d ); if (hi - lo < MAIN_QSORT_SMALL_THRESH || d > MAIN_QSORT_DEPTH_THRESH) { mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); if (*budget < 0) return; continue; } med = (Int32) mmed3 ( block[ptr[ lo ]+d], block[ptr[ hi ]+d], block[ptr[ (lo+hi)>>1 ]+d] ); unLo = ltLo = lo; unHi = gtHi = hi; while (True) { while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unLo]+d]) - med; if (n == 0) { mswap(ptr[unLo], ptr[ltLo]); ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; } while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unHi]+d]) - med; if (n == 0) { mswap(ptr[unHi], ptr[gtHi]); gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; } if (unLo > unHi) break; mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; } AssertD ( unHi == unLo-1, _T("mainQSort3(2)") ); if (gtHi < ltLo) { mpush(lo, hi, d+1 ); continue; } n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); n = lo + unLo - ltLo - 1; m = hi - (gtHi - unHi) + 1; nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); AssertD (mnextsize(0) >= mnextsize(1), _T("mainQSort3(8)") ); AssertD (mnextsize(1) >= mnextsize(2), _T("mainQSort3(9)") ); mpush (nextLo[0], nextHi[0], nextD[0]); mpush (nextLo[1], nextHi[1], nextD[1]); mpush (nextLo[2], nextHi[2], nextD[2]); } } #undef mswap #undef mvswap #undef mpush #undef mpop #undef mmin #undef mnextsize #undef mnextswap #undef MAIN_QSORT_SMALL_THRESH #undef MAIN_QSORT_DEPTH_THRESH #undef MAIN_QSORT_STACK_SIZE /*---------------------------------------------*/ /* Pre: nblock > N_OVERSHOOT block32 exists for [0 .. nblock-1 +N_OVERSHOOT] ((UChar*)block32) [0 .. nblock-1] holds block ptr exists for [0 .. nblock-1] Post: ((UChar*)block32) [0 .. nblock-1] holds block All other areas of block32 destroyed ftab [0 .. 65536 ] destroyed ptr [0 .. nblock-1] holds sorted order if (*budget < 0), sorting was abandoned */ #define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) #define SETMASK (1 << 21) #define CLEARMASK (~(SETMASK)) static void mainSort ( UInt32* ptr, UChar* block, UInt16* quadrant, UInt32* ftab, Int32 nblock, Int32* budget ) { Int32 i, j, k, ss, sb; Int32 runningOrder[256]; Bool bigDone[256]; Int32 copyStart[256]; Int32 copyEnd [256]; UChar c1; Int32 numQSorted; UInt16 s; /*-- set up the 2-byte frequency table --*/ for (i = 65536; i >= 0; i--) ftab[i] = 0; j = block[0] << 8; i = nblock-1; for (; i >= 3; i -= 4) { quadrant[i] = 0; j = (j >> 8) | ( ((UInt16)block[i]) << 8); ftab[j]++; quadrant[i-1] = 0; j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); ftab[j]++; quadrant[i-2] = 0; j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); ftab[j]++; quadrant[i-3] = 0; j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); ftab[j]++; } for (; i >= 0; i--) { quadrant[i] = 0; j = (j >> 8) | ( ((UInt16)block[i]) << 8); ftab[j]++; } /*-- (emphasises close relationship of block & quadrant) --*/ for (i = 0; i < BZ_N_OVERSHOOT; i++) { block [nblock+i] = block[i]; quadrant[nblock+i] = 0; } /*-- Complete the initial radix sort --*/ for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; s = block[0] << 8; i = nblock-1; for (; i >= 3; i -= 4) { s = (s >> 8) | (block[i] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i; s = (s >> 8) | (block[i-1] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-1; s = (s >> 8) | (block[i-2] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-2; s = (s >> 8) | (block[i-3] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-3; } for (; i >= 0; i--) { s = (s >> 8) | (block[i] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i; } /*-- Now ftab contains the first loc of every small bucket. Calculate the running order, from smallest to largest big bucket. --*/ for (i = 0; i <= 255; i++) { bigDone [i] = False; runningOrder[i] = i; } { Int32 vv; Int32 h = 1; do h = 3 * h + 1; while (h <= 256); do { h = h / 3; for (i = h; i <= 255; i++) { vv = runningOrder[i]; j = i; while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { runningOrder[j] = runningOrder[j-h]; j = j - h; if (j <= (h - 1)) goto zero; } zero: runningOrder[j] = vv; } } while (h != 1); } /*-- The main sorting loop. --*/ numQSorted = 0; for (i = 0; i <= 255; i++) { /*-- Process big buckets, starting with the least full. Basically this is a 3-step process in which we call mainQSort3 to sort the small buckets [ss, j], but also make a big effort to avoid the calls if we can. --*/ ss = runningOrder[i]; /*-- Step 1: Complete the big bucket [ss] by quicksorting any unsorted small buckets [ss, j], for j != ss. Hopefully previous pointer-scanning phases have already completed many of the small buckets [ss, j], so we don't have to sort them at all. --*/ for (j = 0; j <= 255; j++) { if (j != ss) { sb = (ss << 8) + j; if ( ! (ftab[sb] & SETMASK) ) { Int32 lo = ftab[sb] & CLEARMASK; Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; if (hi > lo) { mainQSort3 ( ptr, block, quadrant, nblock, lo, hi, BZ_N_RADIX, budget ); numQSorted += (hi - lo + 1); if (*budget < 0) return; } } ftab[sb] |= SETMASK; } } AssertH ( !bigDone[ss], 1006 ); /*-- Step 2: Now scan this big bucket [ss] so as to synthesise the sorted order for small buckets [t, ss] for all t, including, magically, the bucket [ss,ss] too. This will avoid doing Real Work in subsequent Step 1's. --*/ { for (j = 0; j <= 255; j++) { copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; } for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; if (!bigDone[c1]) ptr[ copyStart[c1]++ ] = k; } for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; if (!bigDone[c1]) ptr[ copyEnd[c1]-- ] = k; } } AssertH ( copyStart[ss]-1 == copyEnd[ss], 1007 ); for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; /*-- Step 3: The [ss] big bucket is now done. Record this fact, and update the quadrant descriptors. Remember to update quadrants in the overshoot area too, if necessary. The "if (i < 255)" test merely skips this updating for the last bucket processed, since updating for the last bucket is pointless. The quadrant array provides a way to incrementally cache sort orderings, as they appear, so as to make subsequent comparisons in fullGtU() complete faster. For repetitive blocks this makes a big difference (but not big enough to be able to avoid the fallback sorting mechanism, exponential radix sort). The precise meaning is: at all times: for 0 <= i < nblock and 0 <= j <= nblock if block[i] != block[j], then the relative values of quadrant[i] and quadrant[j] are meaningless. else { if quadrant[i] < quadrant[j] then the string starting at i lexicographically precedes the string starting at j else if quadrant[i] > quadrant[j] then the string starting at j lexicographically precedes the string starting at i else the relative ordering of the strings starting at i and j has not yet been determined. } --*/ bigDone[ss] = True; if (i < 255) { Int32 bbStart = ftab[ss << 8] & CLEARMASK; Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; Int32 shifts = 0; while ((bbSize >> shifts) > 65534) shifts++; for (j = bbSize-1; j >= 0; j--) { Int32 a2update = ptr[bbStart + j]; UInt16 qVal = (UInt16)(j >> shifts); quadrant[a2update] = qVal; if (a2update < BZ_N_OVERSHOOT) quadrant[a2update + nblock] = qVal; } AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); } } } #undef BIGFREQ #undef SETMASK #undef CLEARMASK /*---------------------------------------------*/ /* Pre: nblock > 0 arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] ((UChar*)arr2) [0 .. nblock-1] holds block arr1 exists for [0 .. nblock-1] Post: ((UChar*)arr2) [0 .. nblock-1] holds block All other areas of block destroyed ftab [ 0 .. 65536 ] destroyed arr1 [0 .. nblock-1] holds sorted order */ void BZ2_blockSort ( EState* s ) { UInt32* ptr = s->ptr; UChar* block = s->block; UInt32* ftab = s->ftab; Int32 nblock = s->nblock; Int32 wfact = s->workFactor; UInt16* quadrant; Int32 budget; Int32 budgetInit; Int32 i; if (nblock < 10000) { fallbackSort ( s->arr1, s->arr2, ftab, nblock ); } else { /* Calculate the location for quadrant, remembering to get the alignment right. Assumes that &(block[0]) is at least 2-byte aligned -- this should be ok since block is really the first section of arr2. */ i = nblock+BZ_N_OVERSHOOT; if (i & 1) i++; quadrant = (UInt16*)(&(block[i])); /* (wfact-1) / 3 puts the default-factor-30 transition point at very roughly the same place as with v0.1 and v0.9.0. Not that it particularly matters any more, since the resulting compressed stream is now the same regardless of whether or not we use the main sort or fallback sort. */ if (wfact < 1 ) wfact = 1; if (wfact > 100) wfact = 100; budgetInit = nblock * ((wfact-1) / 3); budget = budgetInit; mainSort ( ptr, block, quadrant, ftab, nblock, &budget ); if (budget < 0) { fallbackSort ( s->arr1, s->arr2, ftab, nblock ); } } s->origPtr = -1; for (i = 0; i < s->nblock; i++) if (ptr[i] == 0) { s->origPtr = i; break; }; AssertH( s->origPtr != -1, 1003 ); } /*-------------------------------------------------------------*/ /*--- end blocksort.c ---*/ /*-------------------------------------------------------------*/ nsis-3.11/Source/bzip2/bzlib.c000077500000000000000000000435601477201124000161570ustar00rootroot00000000000000/* * This file is a part of the bzip2 compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.bzip.org/ * * This modification is not compatible with the original bzip2. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/23/2007 */ #include "bzlib.h" /*-------------------------------------------------------------*/ /*--- Library top-level functions. ---*/ /*--- bzlib.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ /*-- CHANGES ~~~~~~~ 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. 0.9.0c * made zero-length BZ_FLUSH work correctly in bzCompress(). * fixed bzWrite/bzRead to ignore zero-length requests. * fixed bzread to correctly handle read requests after EOF. * wrong parameter order in call to bzDecompressInit in bzBuffToBuffDecompress. Fixed. --*/ #include "bzlib.h" /*---------------------------------------------------*/ /*--- Compression stuff ---*/ /*---------------------------------------------------*/ #ifndef EXEHEAD /*---------------------------------------------------*/ static void prepare_new_block ( EState* s ) { Int32 i; s->nblock = 0; s->numZ = 0; s->state_out_pos = 0; for (i = 0; i < 256; i++) s->inUse[i] = False; s->blockNo++; } /*---------------------------------------------------*/ static void init_RL ( EState* s ) { s->state_in_ch = 256; s->state_in_len = 0; } static Bool isempty_RL ( EState* s ) { if (s->state_in_ch < 256 && s->state_in_len > 0) return False; else return True; } /*---------------------------------------------------*/ int BZ2_bzCompressInit( bz_stream* strm, int blockSize100k, int verbosity, int workFactor ) { Int32 n; EState* s; if (strm == NULL || workFactor < 0 || workFactor > 250) return BZ_PARAM_ERROR; if (workFactor == 0) workFactor = 30; s = BZALLOC( sizeof(EState) ); if (s == NULL) return BZ_MEM_ERROR; s->strm = strm; s->arr1 = NULL; s->arr2 = NULL; s->ftab = NULL; n = NSIS_COMPRESS_BZIP2_LEVEL*100000; s->arr1 = BZALLOC( n * sizeof(UInt32) ); s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { BZFREE(s->arr1); BZFREE(s->arr2); BZFREE(s->ftab); BZFREE(s); return BZ_MEM_ERROR; } s->blockNo = 0; s->state = BZ_S_INPUT; s->mode = BZ_M_RUNNING; s->nblockMAX = 100000 * NSIS_COMPRESS_BZIP2_LEVEL - 19; s->workFactor = workFactor; s->block = (UChar*)s->arr2; s->mtfv = (UInt16*)s->arr1; s->zbits = NULL; s->ptr = (UInt32*)s->arr1; strm->state = s; init_RL ( s ); prepare_new_block ( s ); return BZ_OK; } /*---------------------------------------------------*/ static void add_pair_to_block ( EState* s ) { UChar ch = (UChar)(s->state_in_ch); s->inUse[s->state_in_ch] = True; switch (s->state_in_len) { case 1: s->block[s->nblock] = (UChar)ch; s->nblock++; break; case 2: s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; break; case 3: s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; break; default: s->inUse[s->state_in_len-4] = True; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = ((UChar)(s->state_in_len-4)); s->nblock++; break; } } /*---------------------------------------------------*/ static void flush_RL ( EState* s ) { if (s->state_in_ch < 256) add_pair_to_block ( s ); init_RL ( s ); } /*---------------------------------------------------*/ #define ADD_CHAR_TO_BLOCK(zs,zchh0) \ { \ UInt32 zchh = (UInt32)(zchh0); \ /*-- fast track the common case --*/ \ if (zchh != zs->state_in_ch && \ zs->state_in_len == 1) { \ UChar ch = (UChar)(zs->state_in_ch); \ zs->inUse[zs->state_in_ch] = True; \ zs->block[zs->nblock] = (UChar)ch; \ zs->nblock++; \ zs->state_in_ch = zchh; \ } \ else \ /*-- general, uncommon cases --*/ \ if (zchh != zs->state_in_ch || \ zs->state_in_len == 255) { \ if (zs->state_in_ch < 256) \ add_pair_to_block ( zs ); \ zs->state_in_ch = zchh; \ zs->state_in_len = 1; \ } else { \ zs->state_in_len++; \ } \ } /*---------------------------------------------------*/ static Bool copy_input_until_stop ( EState* s ) { Bool progress_in = False; if (s->mode == BZ_M_RUNNING) { /*-- fast track the common case --*/ while (True) { /*-- block full? --*/ if (s->nblock >= s->nblockMAX) break; /*-- no input? --*/ if (s->strm->avail_in == 0) break; progress_in = True; ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); s->strm->next_in++; s->strm->avail_in--; // s->strm->total_in_lo32++; // if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; } } else { /*-- general, uncommon case --*/ while (True) { /*-- block full? --*/ if (s->nblock >= s->nblockMAX) break; /*-- no input? --*/ if (s->strm->avail_in == 0) break; /*-- flush/finish end? --*/ if (s->avail_in_expect == 0) break; progress_in = True; ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); s->strm->next_in++; s->strm->avail_in--; // s->strm->total_in_lo32++; // if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; s->avail_in_expect--; } } return progress_in; } /*---------------------------------------------------*/ static Bool copy_output_until_stop ( EState* s ) { Bool progress_out = False; while (True) { /*-- no output space? --*/ if (s->strm->avail_out == 0) break; /*-- block done? --*/ if (s->state_out_pos >= s->numZ) break; progress_out = True; *(s->strm->next_out) = s->zbits[s->state_out_pos]; s->state_out_pos++; s->strm->avail_out--; s->strm->next_out++; // s->strm->total_out_lo32++; // if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } return progress_out; } /*---------------------------------------------------*/ static Bool handle_compress ( bz_stream* strm ) { Bool progress_in = False; Bool progress_out = False; EState* s = strm->state; while (True) { if (s->state == BZ_S_OUTPUT) { progress_out |= copy_output_until_stop ( s ); if (s->state_out_pos < s->numZ) break; if (s->mode == BZ_M_FINISHING && s->avail_in_expect == 0 && isempty_RL(s)) break; prepare_new_block ( s ); s->state = BZ_S_INPUT; if (s->mode == BZ_M_FLUSHING && s->avail_in_expect == 0 && isempty_RL(s)) break; } if (s->state == BZ_S_INPUT) { progress_in |= copy_input_until_stop ( s ); if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { flush_RL ( s ); BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); s->state = BZ_S_OUTPUT; } else if (s->nblock >= s->nblockMAX) { BZ2_compressBlock ( s, False ); s->state = BZ_S_OUTPUT; } else if (s->strm->avail_in == 0) { break; } } } return progress_in || progress_out; } /*---------------------------------------------------*/ int BZ2_bzCompress( bz_stream *strm, int action ) { Bool progress; EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; preswitch: switch (s->mode) { case BZ_M_IDLE: return BZ_SEQUENCE_ERROR; case BZ_M_RUNNING: if (action == BZ_RUN) { progress = handle_compress ( strm ); return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; } else if (action == BZ_FLUSH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FLUSHING; goto preswitch; } else if (action == BZ_FINISH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FINISHING; goto preswitch; } else return BZ_PARAM_ERROR; case BZ_M_FLUSHING: if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FLUSH_OK; s->mode = BZ_M_RUNNING; return BZ_RUN_OK; case BZ_M_FINISHING: if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (!progress) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FINISH_OK; s->mode = BZ_M_IDLE; return BZ_STREAM_END; } return BZ_OK; /*--not reached--*/ } /*---------------------------------------------------*/ int BZ2_bzCompressEnd( bz_stream *strm ) { EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; BZFREE(s->arr1); BZFREE(s->arr2); BZFREE(s->ftab); BZFREE(strm->state); strm->state = NULL; return BZ_OK; } #else // EXEHEAD #ifdef NSIS_COMPRESS_BZIP2_SMALLMODE /*---------------------------------------------------*/ Int32 NSISCALL BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) { Int32 nb, na, mid; nb = 0; na = 256; do { mid = (nb + na) >> 1; if (indx >= cftab[mid]) nb = mid; else na = mid; } while (na - nb != 1); return nb; } static void NSISCALL unRLE_obuf_to_output_SMALL ( DState* s ) { UChar k1; while (True) { /* try to finish existing run */ while (True) { if (s->avail_out == 0) return; if (s->state_out_len == 0) break; *( (UChar*)(s->next_out) ) = s->state_out_ch; s->state_out_len--; s->next_out++; s->avail_out--; } /* can a new run be started? */ if (s->nblock_used == s->save.nblock+1) return; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save.nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save.nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save.nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_SMALL(k1); s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_SMALL(s->k0); s->nblock_used++; } } #else//!small, fast static void NSISCALL unRLE_obuf_to_output_FAST ( DState* s ) { UChar k1; /* restore */ UChar c_state_out_ch = s->state_out_ch; Int32 c_state_out_len = s->state_out_len; Int32 c_nblock_used = s->nblock_used; Int32 c_k0 = s->k0; UInt32 c_tPos = s->tPos; char* cs_next_out = (char*) s->next_out; unsigned int cs_avail_out = s->avail_out; /* end restore */ UInt32* c_tt = s->tt; Int32 s_save_nblockPP = s->save.nblock+1; // unsigned int total_out_lo32_old; while (True) { /* try to finish existing run */ if (c_state_out_len > 0) { while (True) { if (cs_avail_out == 0) goto return_notr; if (c_state_out_len == 1) break; *( (UChar*)(cs_next_out) ) = c_state_out_ch; c_state_out_len--; cs_next_out++; cs_avail_out--; } s_state_out_len_eq_one: { if (cs_avail_out == 0) { c_state_out_len = 1; goto return_notr; }; *( (UChar*)(cs_next_out) ) = c_state_out_ch; cs_next_out++; cs_avail_out--; } } /* can a new run be started? */ if (c_nblock_used == s_save_nblockPP) { c_state_out_len = 0; goto return_notr; }; c_state_out_ch = c_k0; BZ_GET_FAST_C(k1); c_nblock_used++; if (k1 != c_k0) { c_k0 = k1; goto s_state_out_len_eq_one; }; if (c_nblock_used == s_save_nblockPP) goto s_state_out_len_eq_one; c_state_out_len = 2; BZ_GET_FAST_C(k1); c_nblock_used++; if (c_nblock_used == s_save_nblockPP) continue; if (k1 != c_k0) { c_k0 = k1; continue; }; c_state_out_len = 3; BZ_GET_FAST_C(k1); c_nblock_used++; if (c_nblock_used == s_save_nblockPP) continue; if (k1 != c_k0) { c_k0 = k1; continue; }; BZ_GET_FAST_C(k1); c_nblock_used++; c_state_out_len = ((Int32)k1) + 4; BZ_GET_FAST_C(c_k0); c_nblock_used++; } return_notr: s->state_out_ch = c_state_out_ch; s->state_out_len = c_state_out_len; s->nblock_used = c_nblock_used; s->k0 = c_k0; s->tPos = c_tPos; s->next_out = (unsigned char*) cs_next_out; s->avail_out = cs_avail_out; /* end save */ } #endif /*---------------------------------------------------*/ int NSISCALL BZ2_bzDecompress( DState *s ) { while (True) { if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; if (s->state == BZ_X_OUTPUT) { #ifdef NSIS_COMPRESS_BZIP2_SMALLMODE unRLE_obuf_to_output_SMALL ( s ); #else unRLE_obuf_to_output_FAST ( s ); #endif if (s->nblock_used == s->save.nblock+1 && s->state_out_len == 0) { s->state = BZ_X_BLKHDR_1; } else { return BZ_OK; } } if (s->state >= BZ_X_BLKHDR_1) { Int32 r = BZ2_decompress ( s ); if (r == BZ_STREAM_END) { return r; } if (s->state != BZ_X_OUTPUT) return r; } } } #endif nsis-3.11/Source/bzip2/bzlib.h000077500000000000000000000272561477201124000161700ustar00rootroot00000000000000/* * This file is a part of the bzip2 compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.bzip.org/ * * This modification is not compatible with the original bzip2. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 */ /*-------------------------------------------------------------*/ /*--- Public header file for the library. ---*/ /*--- bzlib.h ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef _BZLIB_H #define _BZLIB_H #ifdef __cplusplus extern "C" { #endif #include "../exehead/config.h" #include "../Platform.h" #define BZ_RUN 0 #define BZ_FLUSH 1 #define BZ_FINISH 2 #define BZ_OK 0 #define BZ_RUN_OK 1 #define BZ_FLUSH_OK 2 #define BZ_FINISH_OK 3 #define BZ_STREAM_END 4 #define BZ_SEQUENCE_ERROR (-1) #define BZ_PARAM_ERROR (-2) #define BZ_MEM_ERROR (-3) #define BZ_DATA_ERROR (-4) #define BZ_DATA_ERROR_MAGIC (-5) #define BZ_IO_ERROR (-6) #define BZ_UNEXPECTED_EOF (-7) #define BZ_OUTBUFF_FULL (-8) #define BZ_CONFIG_ERROR (-9) /*-- Constants for the back end. --*/ #define BZ_MAX_ALPHA_SIZE 258 #define BZ_MAX_CODE_LEN 23 #define BZ_RUNA 0 #define BZ_RUNB 1 #define BZ_N_GROUPS 6 #define BZ_G_SIZE 50 #define BZ_N_ITERS 4 #define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) typedef char Char; typedef unsigned char Bool; typedef unsigned char UChar; typedef int Int32; typedef unsigned int UInt32; typedef short Int16; typedef unsigned short UInt16; #define True ((Bool)1) #define False ((Bool)0) #define AssertD(cond,msg) /* */ #define AssertH(cond,errcode) /* */ #define AssertD(cond,msg) /* */ #define VPrintf0(zf) /* */ #define VPrintf1(zf,za1) /* */ #define VPrintf2(zf,za1,za2) /* */ #define VPrintf3(zf,za1,za2,za3) /* */ #define VPrintf4(zf,za1,za2,za3,za4) /* */ #define VPrintf5(zf,za1,za2,za3,za4,za5) /* */ #ifndef EXEHEAD #include #define BZALLOC(items) malloc(items) #define BZFREE(addr) { if (addr) free(addr); } #define mini_memcpy memcpy typedef struct { unsigned char *next_in; unsigned int avail_in; unsigned char *next_out; unsigned int avail_out; void *state; } bz_stream; /*-- Core (low-level) library functions --*/ extern int BZ2_bzCompressInit( bz_stream* strm, int blockSize100k, int verbosity, int workFactor ); extern int BZ2_bzCompress( bz_stream* strm, int action ); extern int BZ2_bzCompressEnd(bz_stream* strm ); /*-- States and modes for compression. --*/ #define BZ_M_IDLE 1 #define BZ_M_RUNNING 2 #define BZ_M_FLUSHING 3 #define BZ_M_FINISHING 4 #define BZ_S_OUTPUT 1 #define BZ_S_INPUT 2 #define BZ_N_RADIX 2 #define BZ_N_QSORT 12 #define BZ_N_SHELL 18 #define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) /*-- Structure holding all the compression-side stuff. --*/ typedef struct { /* pointer back to the struct bz_stream */ bz_stream *strm; /* mode this stream is in, and whether inputting */ /* or outputting data */ Int32 mode; Int32 state; /* remembers avail_in when flush/finish requested */ UInt32 avail_in_expect; /* for doing the block sorting */ UInt32* arr1; UInt32* arr2; UInt32* ftab; Int32 origPtr; /* aliases for arr1 and arr2 */ UInt32* ptr; UChar* block; UInt16* mtfv; UChar* zbits; /* for deciding when to use the fallback sorting algorithm */ Int32 workFactor; /* run-length-encoding of the input */ UInt32 state_in_ch; Int32 state_in_len; /* input and output limits and current posns */ Int32 nblock; Int32 nblockMAX; Int32 numZ; Int32 state_out_pos; /* map of bytes used in block */ Int32 nInUse; Bool inUse[256]; UChar unseqToSeq[256]; /* the buffer for bit stream creation */ UInt32 bsBuff; Int32 bsLive; /* misc administratium */ Int32 blockNo; /* stuff for coding the MTF values */ Int32 nMTF; Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; UChar selector [BZ_MAX_SELECTORS]; UChar selectorMtf[BZ_MAX_SELECTORS]; UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; /* second dimension: only 3 needed; 4 makes index calculations faster */ UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; } EState; /*-- externs for compression. --*/ extern void BZ2_blockSort ( EState* ); extern void BZ2_compressBlock ( EState*, Bool ); extern void BZ2_bsInitWrite ( EState* ); extern void BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); extern void BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); #else//EXEHEAD /*-- states for decompression. --*/ #define BZ_X_IDLE 1 #define BZ_X_OUTPUT 2 #define BZ_X_BLKHDR_1 11 #define BZ_X_RANDBIT 12 #define BZ_X_ORIGPTR_1 13 #define BZ_X_ORIGPTR_2 14 #define BZ_X_ORIGPTR_3 15 #define BZ_X_MAPPING_1 16 #define BZ_X_MAPPING_2 17 #define BZ_X_SELECTOR_1 18 #define BZ_X_SELECTOR_2 19 #define BZ_X_SELECTOR_3 20 #define BZ_X_CODING_1 21 #define BZ_X_CODING_2 22 #define BZ_X_CODING_3 23 #define BZ_X_MTF_1 24 #define BZ_X_MTF_2 25 #define BZ_X_MTF_3 26 #define BZ_X_MTF_4 27 #define BZ_X_MTF_5 28 #define BZ_X_MTF_6 29 /*-- Constants for the fast MTF decoder. --*/ #define MTFA_SIZE 4096 #define MTFL_SIZE 16 /* save area for scalars in the main decompress code */ typedef struct { Int32 i; Int32 j; Int32 t; Int32 alphaSize; Int32 nGroups; Int32 nSelectors; Int32 EOB; Int32 groupNo; Int32 groupPos; Int32 nextSym; Int32 nblockMAX; Int32 nblock; Int32 es; Int32 N; Int32 curr; Int32 zt; Int32 zn; Int32 zvec; Int32 zj; Int32 gSel; Int32 gMinlen; Int32* gLimit; Int32* gBase; Int32* gPerm; } DState_save; /*-- Structure holding all the decompression-side stuff. --*/ typedef struct { /* pointer back to the struct bz_stream */ unsigned char *next_in; unsigned int avail_in; unsigned char *next_out; unsigned int avail_out; /* state indicator for this stream */ char state; UChar state_out_ch; Int32 state_out_len; Int32 nblock_used; Int32 k0; UInt32 tPos; /* the buffer for bit stream reading */ UInt32 bsBuff; Int32 bsLive; /* for undoing the Burrows-Wheeler transform */ Int32 origPtr; Int32 unzftab[256]; Int32 cftab[257]; Int32 cftabCopy[257]; #ifndef NSIS_COMPRESS_BZIP2_SMALLMODE /* for undoing the Burrows-Wheeler transform (FAST) */ UInt32 tt[ NSIS_COMPRESS_BZIP2_LEVEL * 100000 ]; #else /* for undoing the Burrows-Wheeler transform (SMALL) */ UInt16 ll16 [ NSIS_COMPRESS_BZIP2_LEVEL*100000 ]; UChar ll4 [((1 + NSIS_COMPRESS_BZIP2_LEVEL*100000) >> 1) ]; #endif /* map of bytes used in block */ Int32 nInUse; Bool inUse[256]; Bool inUse16[16]; UChar seqToUnseq[256]; /* for decoding the MTF values */ UChar mtfa [MTFA_SIZE]; Int32 mtfbase[256 / MTFL_SIZE]; UChar selector [BZ_MAX_SELECTORS]; UChar selectorMtf[BZ_MAX_SELECTORS]; UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 minLens[BZ_N_GROUPS]; /* save area for scalars in the main decompress code */ DState_save save; } DState; #ifndef NSIS_COMPRESS_BZIP2_SMALLMODE /*-- Macros for decompression. --*/ #define BZ_GET_FAST(cccc) \ s->tPos = s->tt[s->tPos]; \ cccc = (UChar)(s->tPos & 0xff); \ s->tPos >>= 8; #define BZ_GET_FAST_C(cccc) \ c_tPos = c_tt[c_tPos]; \ cccc = (UChar)(c_tPos & 0xff); \ c_tPos >>= 8; #else//NSIS_COMPRESS_BZIP2_SMALLMODE #define SET_LL4(i,n) \ { if (((i) & 0x1) == 0) \ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ } #define GET_LL4(i) \ ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) #define SET_LL(i,n) \ { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ SET_LL4(i, n >> 16); \ } #define GET_LL(i) \ (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) #define BZ_GET_SMALL(cccc) \ cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ s->tPos = GET_LL(s->tPos); extern Int32 BZ2_indexIntoF( Int32, Int32* ); #endif//smallmode /*-- externs for decompression. --*/ extern Int32 NSISCALL BZ2_decompress ( DState* ); extern void NSISCALL BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, Int32, Int32, Int32 ); #define BZ2_bzDecompressInit(s) { (s)->state = BZ_X_BLKHDR_1; (s)->bsLive = 0; } int NSISCALL BZ2_bzDecompress(DState *s); #endif//EXEHEAD #ifdef __cplusplus } #endif #endif /*-------------------------------------------------------------*/ /*--- end bzlib.h ---*/ /*-------------------------------------------------------------*/ nsis-3.11/Source/bzip2/compress.c000077500000000000000000000470601477201124000167070ustar00rootroot00000000000000/* * This file is a part of the bzip2 compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.bzip.org/ * * This modification is not compatible with the original bzip2. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 */ /*-------------------------------------------------------------*/ /*--- Compression machinery (not incl block sorting) ---*/ /*--- compress.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ /*-- CHANGES ~~~~~~~ 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. 0.9.0c * changed setting of nGroups in sendMTFValues() so as to do a bit better on small files --*/ #include "bzlib.h" /*---------------------------------------------------*/ /*--- Bit stream I/O ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ void BZ2_bsInitWrite ( EState* s ) { s->bsLive = 0; s->bsBuff = 0; } /*---------------------------------------------------*/ static void bsFinishWrite ( EState* s ) { while (s->bsLive > 0) { s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); s->numZ++; s->bsBuff <<= 8; s->bsLive -= 8; } } /*---------------------------------------------------*/ #define bsNEEDW(nz) \ { \ while (s->bsLive >= 8) { \ s->zbits[s->numZ] \ = (UChar)(s->bsBuff >> 24); \ s->numZ++; \ s->bsBuff <<= 8; \ s->bsLive -= 8; \ } \ } /*---------------------------------------------------*/ static void bsW ( EState* s, Int32 n, UInt32 v ) { bsNEEDW ( n ); s->bsBuff |= (v << (32 - s->bsLive - n)); s->bsLive += n; } /*---------------------------------------------------*/ /*static void bsPutUInt32 ( EState* s, UInt32 u ) { bsW ( s, 8, (u >> 24) & 0xffL ); bsW ( s, 8, (u >> 16) & 0xffL ); bsW ( s, 8, (u >> 8) & 0xffL ); bsW ( s, 8, u & 0xffL ); }*/ /*---------------------------------------------------*/ static void bsPutUChar ( EState* s, UChar c ) { bsW( s, 8, (UInt32)c ); } /*---------------------------------------------------*/ /*--- The back end proper ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ static void makeMaps_e ( EState* s ) { Int32 i; s->nInUse = 0; for (i = 0; i < 256; i++) if (s->inUse[i]) { s->unseqToSeq[i] = s->nInUse; s->nInUse++; } } /*---------------------------------------------------*/ static void generateMTFValues ( EState* s ) { UChar yy[256]; Int32 i, j; Int32 zPend; Int32 wr; Int32 EOB; /* After sorting (eg, here), s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, and ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] holds the original block data. The first thing to do is generate the MTF values, and put them in ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. Because there are strictly fewer or equal MTF values than block values, ptr values in this area are overwritten with MTF values only when they are no longer needed. The final compressed bitstream is generated into the area starting at (UChar*) (&((UChar*)s->arr2)[s->nblock]) These storage aliases are set up in bzCompressInit(), except for the last one, which is arranged in compressBlock(). */ UInt32* ptr = s->ptr; UChar* block = s->block; UInt16* mtfv = s->mtfv; makeMaps_e ( s ); EOB = s->nInUse+1; for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; wr = 0; zPend = 0; for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; for (i = 0; i < s->nblock; i++) { UChar ll_i; AssertD ( wr <= i, _T("generateMTFValues(1)") ); j = ptr[i]-1; if (j < 0) j += s->nblock; ll_i = s->unseqToSeq[block[j]]; AssertD ( ll_i < s->nInUse, _T("generateMTFValues(2a)") ); if (yy[0] == ll_i) { zPend++; } else { if (zPend > 0) { zPend--; while (True) { if (zPend & 1) { mtfv[wr] = BZ_RUNB; wr++; s->mtfFreq[BZ_RUNB]++; } else { mtfv[wr] = BZ_RUNA; wr++; s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; }; zPend = 0; } { register UChar rtmp; register UChar* ryy_j; register UChar rll_i; rtmp = yy[1]; yy[1] = yy[0]; ryy_j = &(yy[1]); rll_i = ll_i; while ( rll_i != rtmp ) { register UChar rtmp2; ryy_j++; rtmp2 = rtmp; rtmp = *ryy_j; *ryy_j = rtmp2; }; yy[0] = rtmp; j = BUGBUG64TRUNCATE(Int32, ryy_j - &(yy[0])); mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; } } } if (zPend > 0) { zPend--; while (True) { if (zPend & 1) { mtfv[wr] = BZ_RUNB; wr++; s->mtfFreq[BZ_RUNB]++; } else { mtfv[wr] = BZ_RUNA; wr++; s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; }; zPend = 0; } mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; s->nMTF = wr; } /*---------------------------------------------------*/ #define BZ_LESSER_ICOST 0 #define BZ_GREATER_ICOST 15 static void sendMTFValues ( EState* s ) { Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; Int32 nGroups; /*-- UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; is a global since the decoder also needs it. Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; are also globals only used in this proc. Made global to keep stack frame size small. --*/ UInt16 cost[BZ_N_GROUPS]; Int32 fave[BZ_N_GROUPS]; UInt16* mtfv = s->mtfv; alphaSize = s->nInUse+2; for (t = 0; t < BZ_N_GROUPS; t++) for (v = 0; v < alphaSize; v++) s->len[t][v] = BZ_GREATER_ICOST; /*--- Decide how many coding tables to use ---*/ AssertH ( s->nMTF > 0, 3001 ); if (s->nMTF < 200) nGroups = 2; else if (s->nMTF < 600) nGroups = 3; else if (s->nMTF < 1200) nGroups = 4; else if (s->nMTF < 2400) nGroups = 5; else nGroups = 6; /*--- Generate an initial set of coding tables ---*/ { Int32 nPart, remF, tFreq, aFreq; nPart = nGroups; remF = s->nMTF; gs = 0; while (nPart > 0) { tFreq = remF / nPart; ge = gs-1; aFreq = 0; while (aFreq < tFreq && ge < alphaSize-1) { ge++; aFreq += s->mtfFreq[ge]; } if (ge > gs && nPart != nGroups && nPart != 1 && ((nGroups-nPart) % 2 == 1)) { aFreq -= s->mtfFreq[ge]; ge--; } for (v = 0; v < alphaSize; v++) if (v >= gs && v <= ge) s->len[nPart-1][v] = BZ_LESSER_ICOST; else s->len[nPart-1][v] = BZ_GREATER_ICOST; nPart--; gs = ge+1; remF -= aFreq; } } /*--- Iterate up to BZ_N_ITERS times to improve the tables. ---*/ for (iter = 0; iter < BZ_N_ITERS; iter++) { for (t = 0; t < nGroups; t++) fave[t] = 0; for (t = 0; t < nGroups; t++) for (v = 0; v < alphaSize; v++) s->rfreq[t][v] = 0; /*--- Set up an auxiliary length table which is used to fast-track the common case (nGroups == 6). ---*/ if (nGroups == 6) { for (v = 0; v < alphaSize; v++) { s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; } } nSelectors = 0; totc = 0; gs = 0; while (True) { /*--- Set group start & end marks. --*/ if (gs >= s->nMTF) break; ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; /*-- Calculate the cost of this group as coded by each of the coding tables. --*/ for (t = 0; t < nGroups; t++) cost[t] = 0; if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ register UInt32 cost01, cost23, cost45; register UInt16 icv; cost01 = cost23 = cost45 = 0; # define BZ_ITER(nn) \ icv = mtfv[gs+(nn)]; \ cost01 += s->len_pack[icv][0]; \ cost23 += s->len_pack[icv][1]; \ cost45 += s->len_pack[icv][2]; \ BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); # undef BZ_ITER cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { UInt16 icv = mtfv[i]; for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; } } /*-- Find the coding table which is best for this group, and record its identity in the selector table. --*/ bc = 999999999; bt = -1; for (t = 0; t < nGroups; t++) if (cost[t] < bc) { bc = cost[t]; bt = t; }; totc += bc; fave[bt]++; s->selector[nSelectors] = bt; nSelectors++; /*-- Increment the symbol frequencies for the selected table. --*/ if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ # define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); # undef BZ_ITUR } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) s->rfreq[bt][ mtfv[i] ]++; } gs = ge+1; } /*-- Recompute the tables based on the accumulated frequencies. --*/ for (t = 0; t < nGroups; t++) BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), alphaSize, 20 ); } AssertH( nGroups < 8, 3002 ); AssertH( nSelectors < 32768 && nSelectors <= (2 + (NSIS_COMPRESS_BZIP2_LEVEL * 100000 / BZ_G_SIZE)), 3003 ); /*--- Compute MTF values for the selectors. ---*/ { UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; for (i = 0; i < nGroups; i++) pos[i] = i; for (i = 0; i < nSelectors; i++) { ll_i = s->selector[i]; j = 0; tmp = pos[j]; while ( ll_i != tmp ) { j++; tmp2 = tmp; tmp = pos[j]; pos[j] = tmp2; }; pos[0] = tmp; s->selectorMtf[i] = j; } }; /*--- Assign actual codes for the tables. --*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } AssertH ( !(maxLen > 20), 3004 ); AssertH ( !(minLen < 1), 3005 ); BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); } /*--- Transmit the mapping table. ---*/ { Bool inUse16[16]; for (i = 0; i < 16; i++) { inUse16[i] = False; for (j = 0; j < 16; j++) if (s->inUse[i * 16 + j]) inUse16[i] = True; } for (i = 0; i < 16; i++) if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); for (i = 0; i < 16; i++) if (inUse16[i]) for (j = 0; j < 16; j++) { if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); } } /*--- Now the selectors. ---*/ bsW ( s, 3, nGroups ); bsW ( s, 15, nSelectors ); for (i = 0; i < nSelectors; i++) { for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); bsW(s,1,0); } /*--- Now the coding tables. ---*/ for (t = 0; t < nGroups; t++) { Int32 curr = s->len[t][0]; bsW ( s, 5, curr ); for (i = 0; i < alphaSize; i++) { while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; bsW ( s, 1, 0 ); } } /*--- And finally, the block data proper ---*/ selCtr = 0; gs = 0; while (True) { if (gs >= s->nMTF) break; ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; AssertH ( s->selector[selCtr] < nGroups, 3006 ); if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ UInt16 mtfv_i; UChar* s_len_sel_selCtr = &(s->len[s->selector[selCtr]][0]); Int32* s_code_sel_selCtr = &(s->code[s->selector[selCtr]][0]); # define BZ_ITAH(nn) \ mtfv_i = mtfv[gs+(nn)]; \ bsW ( s, \ s_len_sel_selCtr[mtfv_i], \ s_code_sel_selCtr[mtfv_i] ) BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); # undef BZ_ITAH } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { bsW ( s, s->len [s->selector[selCtr]] [mtfv[i]], s->code [s->selector[selCtr]] [mtfv[i]] ); } } gs = ge+1; selCtr++; } AssertH( selCtr == nSelectors, 3007 ); } /*---------------------------------------------------*/ void BZ2_compressBlock ( EState* s, Bool is_last_block ) { if (s->nblock > 0) { if (s->blockNo > 1) s->numZ = 0; BZ2_blockSort ( s ); } s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); /*-- If this is the first block, create the stream header. --*/ if (s->blockNo == 1) { BZ2_bsInitWrite ( s ); } if (s->nblock > 0) { bsPutUChar ( s, 0x31 ); bsW ( s, 24, s->origPtr ); generateMTFValues ( s ); sendMTFValues ( s ); } /*-- If this is the last block, add the stream trailer. --*/ if (is_last_block) { bsPutUChar ( s, 0x17 ); bsFinishWrite ( s ); } } /*-------------------------------------------------------------*/ /*--- end compress.c ---*/ /*-------------------------------------------------------------*/ nsis-3.11/Source/bzip2/decompress.c000077500000000000000000000373641477201124000172260ustar00rootroot00000000000000/* * This file is a part of the bzip2 compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.bzip.org/ * * This modification is not compatible with the original bzip2. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 */ #include "bzlib.h" /*-------------------------------------------------------------*/ /*--- Decompression machinery ---*/ /*--- decompress.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ /*---------------------------------------------------*/ #define RETURN(rrr) \ { retVal = rrr; goto save_state_and_return; }; static int NSISCALL __mygetbits(int *vtmp, int nnn, DState* s) { for (;;) { if (s->bsLive >= nnn) { UInt32 v; v = (s->bsBuff >> (s->bsLive-nnn)) & ((1 << nnn)-1); s->bsLive -= nnn; *vtmp = v; return 0; } if (s->avail_in == 0) return 1; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->next_in)))); s->bsLive += 8; s->next_in++; s->avail_in--; } } #define GET_BITS(lll,vvv,nnn) \ case lll: s->state = lll; \ if (__mygetbits(&vvv,nnn,s)) RETURN(BZ_OK) #define GET_UCHAR(lll,uuu) \ GET_BITS(lll,uuu,8) #define GET_BIT(lll,uuu) \ GET_BITS(lll,uuu,1) static int NSISCALL getmtf1(DState_save *sv,DState* s) { if (sv->groupPos == 0) { sv->groupNo++; if (sv->groupNo >= sv->nSelectors) return 1; sv->groupPos = BZ_G_SIZE; sv->gSel = s->selector[sv->groupNo]; sv->gMinlen = s->minLens[sv->gSel]; sv->gLimit = &(s->limit[sv->gSel][0]); sv->gPerm = &(s->perm[sv->gSel][0]); sv->gBase = &(s->base[sv->gSel][0]); } sv->groupPos--; sv->zn = sv->gMinlen; return 0; } /*---------------------------------------------------*/ #define GET_MTF_VAL(label1,label2,lval) \ { \ if (getmtf1(&sv,s)) RETURN(BZ_DATA_ERROR); \ GET_BITS(label1, zvec, zn); \ for (;;) { \ if (zn > 20 /* the longest code */) RETURN(BZ_DATA_ERROR); \ if (zvec <= gLimit[zn]) break; \ zn++; \ GET_BIT(label2, zj); \ zvec = (zvec << 1) | zj; \ }; \ if (zvec - gBase[zn] < 0 \ || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ RETURN(BZ_DATA_ERROR); \ lval = gPerm[zvec - gBase[zn]]; \ } /*---------------------------------------------------*/ Int32 NSISCALL BZ2_decompress ( DState* s ) { Int32 uc; Int32 retVal; Int32 minLen, maxLen; /* stuff that needs to be saved/restored */ DState_save sv; /*restore from the save area*/ sv=s->save;//mini_memcpy(&sv, &(s->save), sizeof(sv)); #define i (sv.i) #define j (sv.j) #define t (sv.t) #define alphaSize (sv.alphaSize) #define nGroups (sv.nGroups) #define nSelectors (sv.nSelectors) #define EOB (sv.EOB) #define groupNo (sv.groupNo) #define groupPos (sv.groupPos) #define nextSym (sv.nextSym) #define nblockMAX (sv.nblockMAX) #define nblock (sv.nblock) #define es (sv.es) #define N (sv.N) #define curr (sv.curr) #define zt (sv.zt) #define zn (sv.zn) #define zvec (sv.zvec) #define zj (sv.zj) #define gSel (sv.gSel) #define gMinlen (sv.gMinlen) #define gLimit (sv.gLimit) #define gBase (sv.gBase) #define gPerm (sv.gPerm) retVal = BZ_OK; switch (s->state) { GET_UCHAR(BZ_X_BLKHDR_1, uc); if (uc == 0x17) { s->state = BZ_X_IDLE; RETURN(BZ_STREAM_END); } if (uc != 0x31) RETURN(BZ_DATA_ERROR); s->origPtr = 0; GET_UCHAR(BZ_X_ORIGPTR_1, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); GET_UCHAR(BZ_X_ORIGPTR_2, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); GET_UCHAR(BZ_X_ORIGPTR_3, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); if (s->origPtr < 0) RETURN(BZ_DATA_ERROR); if (s->origPtr > 10 + NSIS_COMPRESS_BZIP2_LEVEL*100000) RETURN(BZ_DATA_ERROR); /*--- Receive the mapping table ---*/ for (i = 0; i < 16; i++) { GET_BIT(BZ_X_MAPPING_1, uc); if (uc == 1) s->inUse16[i] = True; else s->inUse16[i] = False; } for (i = 0; i < 256; i++) s->inUse[i] = False; for (i = 0; i < 16; i++) if (s->inUse16[i]) for (j = 0; j < 16; j++) { GET_BIT(BZ_X_MAPPING_2, uc); if (uc == 1) s->inUse[i * 16 + j] = True; } { Int32 qi; s->nInUse = 0; for (qi = 0; qi < 256; qi++) if (s->inUse[qi]) s->seqToUnseq[s->nInUse++] = qi; } if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); alphaSize = s->nInUse+2; /*--- Now the selectors ---*/ GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); if (nSelectors < 1) RETURN(BZ_DATA_ERROR); for (i = 0; i < nSelectors; i++) { j = 0; while (True) { GET_BIT(BZ_X_SELECTOR_3, uc); if (uc == 0) break; j++; if (j >= nGroups) RETURN(BZ_DATA_ERROR); } s->selectorMtf[i] = j; } /*--- Undo the MTF values for the selectors. ---*/ { UChar pos[BZ_N_GROUPS], tmp, v; for (v = 0; v < nGroups; v++) pos[v] = v; for (i = 0; i < nSelectors; i++) { v = s->selectorMtf[i]; tmp = pos[v]; while (v > 0) { pos[v] = pos[v-1]; v--; } pos[0] = tmp; s->selector[i] = tmp; } } /*--- Now the coding tables ---*/ for (t = 0; t < nGroups; t++) { GET_BITS(BZ_X_CODING_1, curr, 5); for (i = 0; i < alphaSize; i++) { while (True) { if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); GET_BIT(BZ_X_CODING_2, uc); if (uc == 0) break; GET_BIT(BZ_X_CODING_3, uc); if (uc == 0) curr++; else curr--; } s->len[t][i] = curr; } } /*--- Create the Huffman decoding tables ---*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } BZ2_hbCreateDecodeTables ( &(s->limit[t][0]), &(s->base[t][0]), &(s->perm[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); s->minLens[t] = minLen; } /*--- Now the MTF values ---*/ EOB = s->nInUse+1; nblockMAX = NSIS_COMPRESS_BZIP2_LEVEL*100000; groupNo = -1; groupPos = 0; for (i = 0; i <= 255; i++) s->unzftab[i] = 0; /*-- MTF init --*/ { Int32 ii, jj, kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); kk--; } s->mtfbase[ii] = kk + 1; } } /*-- end MTF init --*/ nblock = 0; GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); while (True) { if (nextSym == EOB) break; if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { es = -1; N = 1; while (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { if (nextSym == BZ_RUNA) es += N; N = N << 1; if (nextSym == BZ_RUNB) es += N; GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); } es++; uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; s->unzftab[uc] += es; #ifdef NSIS_COMPRESS_BZIP2_SMALLMODE while (es > 0) { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); s->ll16[nblock] = (UInt16)uc; nblock++; es--; } #else while (es > 0) { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); s->tt[nblock] = (UInt32)uc; nblock++; es--; } #endif continue; } else { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); /*-- uc = MTF ( nextSym-1 ) --*/ { Int32 ii, jj, kk, pp, lno, off; UInt32 nn; nn = (UInt32)(nextSym - 1); if (nn < MTFL_SIZE) { /* avoid general-case expense */ pp = s->mtfbase[0]; uc = s->mtfa[pp+nn]; /*while (nn > 3) { Int32 z = pp+nn; s->mtfa[(z) ] = s->mtfa[(z)-1]; s->mtfa[(z)-1] = s->mtfa[(z)-2]; s->mtfa[(z)-2] = s->mtfa[(z)-3]; s->mtfa[(z)-3] = s->mtfa[(z)-4]; nn -= 4; } */ while (nn > 0) { s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; }; s->mtfa[pp] = uc; } else { /* general case */ lno = nn / MTFL_SIZE; off = nn % MTFL_SIZE; pp = s->mtfbase[lno] + off; uc = s->mtfa[pp]; while (pp > s->mtfbase[lno]) { s->mtfa[pp] = s->mtfa[pp-1]; pp--; }; s->mtfbase[lno]++; while (lno > 0) { s->mtfbase[lno]--; s->mtfa[s->mtfbase[lno]] = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; lno--; } s->mtfbase[0]--; s->mtfa[s->mtfbase[0]] = uc; if (s->mtfbase[0] == 0) { kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; kk--; } s->mtfbase[ii] = kk + 1; } } } } /*-- end uc = MTF ( nextSym-1 ) --*/ s->unzftab[s->seqToUnseq[uc]]++; #ifdef NSIS_COMPRESS_BZIP2_SMALLMODE s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); #else s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); #endif nblock++; GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); continue; } } /* Now we know what nblock is, we can do a better sanity check on s->origPtr. */ if (s->origPtr < 0 || s->origPtr >= nblock) RETURN(BZ_DATA_ERROR); s->state_out_len = 0; s->state_out_ch = 0; s->state = BZ_X_OUTPUT; /*-- Set up cftab to facilitate generation of T^(-1) --*/ s->cftab[0] = 0; for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]+s->cftab[i-1]; // for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; #ifdef NSIS_COMPRESS_BZIP2_SMALLMODE { /*-- Make a copy of cftab, used in generation of T --*/ for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; /*-- compute the T vector --*/ for (i = 0; i < nblock; i++) { uc = (UChar)(s->ll16[i]); SET_LL(i, s->cftabCopy[uc]); s->cftabCopy[uc]++; } /*-- Compute T^(-1) by pointer reversal on T --*/ i = s->origPtr; j = GET_LL(i); do { Int32 tmp = GET_LL(j); SET_LL(j, i); i = j; j = tmp; } while (i != s->origPtr); s->tPos = s->origPtr; s->nblock_used = 0; BZ_GET_SMALL(s->k0); s->nblock_used++; } #else//!small /*-- compute the T^(-1) vector --*/ for (i = 0; i < nblock; i++) { uc = (UChar)(s->tt[i] & 0xff); s->tt[s->cftab[uc]] |= (i << 8); s->cftab[uc]++; } s->tPos = s->tt[s->origPtr] >> 8; s->nblock_used = 0; BZ_GET_FAST(s->k0); s->nblock_used++; #endif RETURN(BZ_OK); default: AssertH ( False, 4001 ); } AssertH ( False, 4002 ); save_state_and_return: s->save=sv; //mini_memcpy(&(s->save), &sv, sizeof(sv)); #undef i #undef j #undef t #undef alphaSize #undef nGroups #undef nSelectors #undef EOB #undef groupNo #undef groupPos #undef nextSym #undef nblockMAX #undef nblock #undef es #undef N #undef curr #undef zt #undef zn #undef zvec #undef zj #undef gSel #undef gMinlen #undef gLimit #undef gBase #undef gPerm return retVal; } /*-------------------------------------------------------------*/ /*--- end decompress.c ---*/ /*-------------------------------------------------------------*/ nsis-3.11/Source/bzip2/huffman.c000077500000000000000000000176521477201124000165040ustar00rootroot00000000000000/* * This file is a part of the bzip2 compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.bzip.org/ * * This modification is not compatible with the original bzip2. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 */ #include "bzlib.h" /*-------------------------------------------------------------*/ /*--- Huffman coding low-level stuff ---*/ /*--- huffman.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2000 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef EXEHEAD /*---------------------------------------------------*/ #define WEIGHTOF(zz0) ((zz0) & 0xffffff00) #define DEPTHOF(zz1) ((zz1) & 0x000000ff) #define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) #define ADDWEIGHTS(zw1,zw2) \ (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) #define UPHEAP(z) \ { \ Int32 zz, tmp; \ zz = z; tmp = heap[zz]; \ while (weight[tmp] < weight[heap[zz >> 1]]) { \ heap[zz] = heap[zz >> 1]; \ zz >>= 1; \ } \ heap[zz] = tmp; \ } #define DOWNHEAP(z) \ { \ Int32 zz, yy, tmp; \ zz = z; tmp = heap[zz]; \ while (True) { \ yy = zz << 1; \ if (yy > nHeap) break; \ if (yy < nHeap && \ weight[heap[yy+1]] < weight[heap[yy]]) \ yy++; \ if (weight[tmp] < weight[heap[yy]]) break; \ heap[zz] = heap[yy]; \ zz = yy; \ } \ heap[zz] = tmp; \ } /*---------------------------------------------------*/ void BZ2_hbMakeCodeLengths ( UChar *len, Int32 *freq, Int32 alphaSize, Int32 maxLen ) { /*-- Nodes and heap entries run from 1. Entry 0 for both the heap and nodes is a sentinel. --*/ Int32 nNodes, nHeap, n1, n2, i, j, k; Bool tooLong; static Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; static Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; static Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; for (i = 0; i < alphaSize; i++) weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; while (True) { nNodes = alphaSize; nHeap = 0; heap[0] = 0; weight[0] = 0; parent[0] = -2; for (i = 1; i <= alphaSize; i++) { parent[i] = -1; nHeap++; heap[nHeap] = i; UPHEAP(nHeap); } AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); while (nHeap > 1) { n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); nNodes++; parent[n1] = parent[n2] = nNodes; weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); parent[nNodes] = -1; nHeap++; heap[nHeap] = nNodes; UPHEAP(nHeap); } AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); tooLong = False; for (i = 1; i <= alphaSize; i++) { j = 0; k = i; while (parent[k] >= 0) { k = parent[k]; j++; } len[i-1] = j; if (j > maxLen) tooLong = True; } if (! tooLong) break; for (i = 1; i < alphaSize; i++) { j = weight[i] >> 8; j = 1 + (j / 2); weight[i] = j << 8; } } } /*---------------------------------------------------*/ void BZ2_hbAssignCodes ( Int32 *code, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize ) { Int32 n, vec, i; vec = 0; for (n = minLen; n <= maxLen; n++) { for (i = 0; i < alphaSize; i++) if (length[i] == n) { code[i] = vec; vec++; }; vec <<= 1; } } #endif /*---------------------------------------------------*/ void NSISCALL BZ2_hbCreateDecodeTables ( Int32 *limit, Int32 *base, Int32 *perm, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize ) { Int32 pp, i, j, vec; pp = 0; for (i = minLen; i <= maxLen; i++) for (j = 0; j < alphaSize; j++) if (length[j] == i) { perm[pp] = j; pp++; }; for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; for (i = 0; i < alphaSize; i++) base[length[i]+1]++; for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; vec = 0; for (i = minLen; i <= maxLen; i++) { vec += (base[i+1] - base[i]); limit[i] = vec-1; vec <<= 1; } for (i = minLen + 1; i <= maxLen; i++) base[i] = ((limit[i-1] + 1) << 1) - base[i]; } /*-------------------------------------------------------------*/ /*--- end huffman.c ---*/ /*-------------------------------------------------------------*/ nsis-3.11/Source/cbzip2.h000077500000000000000000000044271477201124000152240ustar00rootroot00000000000000/* * cbzip2.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #ifndef __CBZIP2_H__ #define __CBZIP2_H__ #include "compressor.h" #include "bzip2/bzlib.h" class CBzip2 : public ICompressor { public: virtual ~CBzip2() {} virtual int Init(int level, unsigned int dict_size) { last_ret = !BZ_STREAM_END; stream = new bz_stream; if (!stream) return BZ_MEM_ERROR; return BZ2_bzCompressInit(stream, level, 0, 30); } virtual int End() { int ret = BZ2_bzCompressEnd(stream); delete stream; return ret; } virtual int Compress(bool finish) { // act like zlib when it comes to stream ending if (last_ret == BZ_STREAM_END && finish) return C_FINISHED; last_ret = BZ2_bzCompress(stream, finish?BZ_FINISH:0); if (last_ret < 0) return last_ret; return C_OK; } virtual void SetNextIn(char *in, unsigned int size) { stream->next_in = (unsigned char*) in; stream->avail_in = size; } virtual void SetNextOut(char *out, unsigned int size) { stream->next_out = (unsigned char*) out; stream->avail_out = size; } virtual char* GetNextOut() { return (char*) stream->next_out; } virtual unsigned int GetAvailIn() { return stream->avail_in; } virtual unsigned int GetAvailOut() { return stream->avail_out; } virtual const TCHAR* GetName() { return _T("bzip2"); } virtual const TCHAR* GetErrStr(int err) { switch (err) { case BZ_SEQUENCE_ERROR: return _T("sequence error - bad call"); case BZ_PARAM_ERROR: return _T("parameter error - bad call"); case BZ_MEM_ERROR: return _T("not enough memory"); case BZ_CONFIG_ERROR: return _T("config error"); default: return _T("unknown error"); } } private: bz_stream *stream; int last_ret; }; #endif nsis-3.11/Source/clzma.cpp000077500000000000000000000216721477201124000154750ustar00rootroot00000000000000/* * clzma.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #include // for std::min #include "clzma.h" using namespace std; #ifndef _WIN32 struct evnet_t { pthread_cond_t cond; pthread_mutex_t mutex; bool signaled; }; HANDLE CreateEvent(void *, BOOL, BOOL, TCHAR *) { evnet_t *event = (evnet_t *) malloc(sizeof(evnet_t)); if (!event) return 0; if (pthread_cond_init(&event->cond, NULL)) { free(event); return 0; } if (pthread_mutex_init(&event->mutex, NULL)) { pthread_cond_destroy(&event->cond); free(event); return 0; } event->signaled = false; return (HANDLE) event; } BOOL SetEvent(HANDLE _event) { evnet_t *event = (evnet_t *) _event; if (pthread_mutex_lock(&event->mutex)) return FALSE; event->signaled = true; pthread_cond_signal(&event->cond); if (pthread_mutex_unlock(&event->mutex)) return FALSE; return TRUE; } BOOL ResetEvent(HANDLE _event) { evnet_t *event = (evnet_t *) _event; if (pthread_mutex_lock(&event->mutex)) return FALSE; event->signaled = false; if (pthread_mutex_unlock(&event->mutex)) return FALSE; return TRUE; } BOOL CloseHandle(HANDLE _event) { BOOL ret = TRUE; evnet_t *event = (evnet_t *) _event; if (!event) return FALSE; if (pthread_cond_destroy(&event->cond)) ret = FALSE; if (pthread_mutex_destroy(&event->mutex)) ret = FALSE; free(event); return ret; } #define WAIT_OBJECT_0 0 #define INFINITE 0 DWORD WaitForSingleObject(HANDLE _event, DWORD) { DWORD ret = WAIT_OBJECT_0; evnet_t *event = (evnet_t *) _event; if (pthread_mutex_lock(&event->mutex)) return !WAIT_OBJECT_0; if (!event->signaled) { if (pthread_cond_wait(&event->cond, &event->mutex)) { ret = !WAIT_OBJECT_0; } } event->signaled = false; pthread_mutex_unlock(&event->mutex); return ret; } #define WaitForMultipleObjects(x, list, y, t) WaitForSingleObject(list[0], t) #endif #ifdef _WIN32 DWORD CLZMA::lzmaCompressThread(LPVOID lpParameter) #else void* CLZMA::lzmaCompressThread(void *lpParameter) #endif { CLZMA *Compressor = (CLZMA *) lpParameter; if (!Compressor) return 0; Compressor->CompressReal(); return 0; } int CLZMA::ConvertError(HRESULT result) { if (result != S_OK) { if (result == E_OUTOFMEMORY) return LZMA_MEM_ERROR; else return LZMA_IO_ERROR; } return C_OK; } CLZMA::CLZMA(): _encoder(NULL) { _encoder = new NCompress::NLZMA::CEncoder(); _encoder->SetWriteEndMarkerMode(true); #ifdef _WIN32 hCompressionThread = NULL; #else hCompressionThread = 0; #endif hNeedIOEvent = CreateEvent(NULL, FALSE, FALSE, NULL); hIOReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL); finish = FALSE; compressor_finished = TRUE; hCompressionThread = 0; SetNextOut(NULL, 0); SetNextIn(NULL, 0); AddRef(); // will be manually deleted, not released } CLZMA::~CLZMA() { End(); if (hNeedIOEvent) { CloseHandle(hNeedIOEvent); hNeedIOEvent = NULL; } if (hIOReadyEvent) { CloseHandle(hIOReadyEvent); hIOReadyEvent = NULL; } if (_encoder) { delete _encoder; _encoder = NULL; } } int CLZMA::Init(int level, unsigned int dicSize) { End(); compressor_finished = FALSE; finish = FALSE; res = C_OK; if (!hNeedIOEvent || !hIOReadyEvent) { return LZMA_INIT_ERROR; } ResetEvent(hNeedIOEvent); ResetEvent(hIOReadyEvent); res = C_OK; PROPID propdIDs [] = { NCoderPropID::kAlgorithm, NCoderPropID::kDictionarySize, NCoderPropID::kNumFastBytes }; const int kNumProps = COUNTOF(propdIDs); PROPVARIANT props[kNumProps]; // NCoderPropID::kAlgorithm props[0].vt = VT_UI4; props[0].ulVal = 2; // NCoderPropID::kDictionarySize props[1].vt = VT_UI4; props[1].ulVal = dicSize; // NCoderPropID::kNumFastBytes props[2].vt = VT_UI4; props[2].ulVal = 64; if (_encoder->SetCoderProperties(propdIDs, props, kNumProps) != 0) return LZMA_INIT_ERROR; return _encoder->SetStreams(this, this, 0, 0) == S_OK ? C_OK : LZMA_INIT_ERROR; } int CLZMA::End() { // has compressor not finished? if (hCompressionThread && !compressor_finished) { // kill compression thread avail_in = 0; avail_out = 0; compressor_finished = TRUE; SetEvent(hIOReadyEvent); #ifdef _WIN32 WaitForSingleObject(hCompressionThread, INFINITE); #else pthread_join(hCompressionThread, NULL); #endif } if (hCompressionThread) { #ifdef _WIN32 CloseHandle(hCompressionThread); hCompressionThread = NULL; #else pthread_detach(hCompressionThread); hCompressionThread = 0; #endif } SetNextOut(NULL, 0); SetNextIn(NULL, 0); return C_OK; } int CLZMA::CompressReal() { try { HRESULT hResult = _encoder->WriteCoderProperties(this); if (hResult == S_OK) { while (true) { UINT64 inSize, outSize; INT32 finished; hResult = _encoder->CodeOneBlock(&inSize, &outSize, &finished); if (hResult != S_OK && res == C_OK) res = ConvertError(hResult); if (res != C_OK) break; if (finished) { res = C_FINISHED; break; } } } else { if (res == C_OK) res = ConvertError(hResult); } } catch (...) { if (res == C_OK) res = LZMA_IO_ERROR; } compressor_finished = TRUE; SetEvent(hNeedIOEvent); return C_OK; } int CLZMA::Compress(bool flush) { if (compressor_finished) { // act like zlib when it comes to stream ending if (flush) return C_OK; else return LZMA_BAD_CALL; } finish = flush; if (!hCompressionThread) { #ifdef _WIN32 DWORD dwThreadId; hCompressionThread = CreateThread(0, 0, lzmaCompressThread, (LPVOID) this, 0, &dwThreadId); if (!hCompressionThread) #else if (pthread_create(&hCompressionThread, NULL, lzmaCompressThread, (LPVOID) this)) #endif return LZMA_INIT_ERROR; } else { SetEvent(hIOReadyEvent); } HANDLE waitList[2] = {hNeedIOEvent, (HANDLE) hCompressionThread}; if (WaitForMultipleObjects(2, waitList, FALSE, INFINITE) != WAIT_OBJECT_0) { // thread ended or WaitForMultipleObjects failed compressor_finished = TRUE; SetEvent(hIOReadyEvent); return LZMA_THREAD_ERROR; } if (compressor_finished) { return res; } return C_OK; } void CLZMA::GetMoreIO() { SetEvent(hNeedIOEvent); if (WaitForSingleObject(hIOReadyEvent, INFINITE) != WAIT_OBJECT_0) { compressor_finished = TRUE; res = LZMA_THREAD_ERROR; } } HRESULT CLZMA::Read(void *data, UINT32 size, UINT32 *processedSize) { return ReadPart(data, size, processedSize); } HRESULT CLZMA::ReadPart(void *data, UINT32 size, UINT32 *processedSize) { if (processedSize) *processedSize = 0; while (size) { if (!avail_in) { if (finish) { return S_OK; } GetMoreIO(); if (!avail_in) { if (finish) { return S_OK; } return E_ABORT; } if (compressor_finished) return E_ABORT; } UINT32 l = min(size, avail_in); memcpy(data, next_in, l); avail_in -= l; size -= l; next_in += l; data = LPBYTE(data) + l; if (processedSize) *processedSize += l; } return S_OK; } HRESULT CLZMA::Write(const void *data, UINT32 size, UINT32 *processedSize) { return WritePart(data, size, processedSize); } HRESULT CLZMA::WritePart(const void *data, UINT32 size, UINT32 *processedSize) { if (processedSize) *processedSize = 0; while (size) { if (!avail_out) { GetMoreIO(); if (!avail_out) return E_ABORT; } UINT32 l = min(size, avail_out); memcpy(next_out, data, l); avail_out -= l; size -= l; next_out += l; data = LPBYTE(data) + l; if (processedSize) *processedSize += l; } return S_OK; } void CLZMA::SetNextIn(char *in, unsigned int size) { next_in = (LPBYTE) in; avail_in = size; } void CLZMA::SetNextOut(char *out, unsigned int size) { next_out = (LPBYTE) out; avail_out = size; } char* CLZMA::GetNextOut() { return (char *) next_out; } unsigned int CLZMA::GetAvailIn() { return avail_in; } unsigned int CLZMA::GetAvailOut() { return avail_out; } const TCHAR* CLZMA::GetName() { return _T("lzma"); } const TCHAR* CLZMA::GetErrStr(int err) { switch (err) { case LZMA_BAD_CALL: return _T("bad call"); case LZMA_INIT_ERROR: return _T("initialization failed"); case LZMA_THREAD_ERROR: return _T("thread synchronization error"); case LZMA_IO_ERROR: return _T("input/output error"); case LZMA_MEM_ERROR: return _T("not enough memory"); default: return _T("unknown error"); } } nsis-3.11/Source/clzma.h000077500000000000000000000045571477201124000151450ustar00rootroot00000000000000/* * clzma.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #ifndef __CLZMA_H__ #define __CLZMA_H__ #include "Platform.h" #ifndef _WIN32 # include #endif #include "compressor.h" #include "7zip/7zip/IStream.h" #include "7zip/7zip/Compress/LZMA/LZMAEncoder.h" #include "7zip/Common/MyCom.h" #include "7zip/Common/Defs.h" #define LZMA_BAD_CALL -1 #define LZMA_INIT_ERROR -2 #define LZMA_THREAD_ERROR -3 #define LZMA_IO_ERROR -4 #define LZMA_MEM_ERROR -5 class CLZMA: public ICompressor, public ISequentialInStream, public ISequentialOutStream, public CMyUnknownImp { private: NCompress::NLZMA::CEncoder *_encoder; #ifdef _WIN32 HANDLE hCompressionThread; #else pthread_t hCompressionThread; #endif HANDLE hNeedIOEvent; HANDLE hIOReadyEvent; BYTE *next_in; /* next input byte */ UINT avail_in; /* number of bytes available at next_in */ BYTE *next_out; /* next output byte should be put there */ UINT avail_out; /* remaining free space at next_out */ int res; BOOL finish; BOOL compressor_finished; int ConvertError(HRESULT result); void GetMoreIO(); int CompressReal(); #ifdef _WIN32 static DWORD WINAPI lzmaCompressThread(LPVOID lpParameter); #else static void* lzmaCompressThread(void *lpParameter); #endif public: MY_UNKNOWN_IMP CLZMA(); virtual ~CLZMA(); virtual int Init(int level, unsigned int dicSize); virtual int End(); virtual int Compress(bool flush); STDMETHOD(Read)(void *data, UINT32 size, UINT32 *processedSize); STDMETHOD(ReadPart)(void *data, UINT32 size, UINT32 *processedSize); STDMETHOD(Write)(const void *data, UINT32 size, UINT32 *processedSize); STDMETHOD(WritePart)(const void *data, UINT32 size, UINT32 *processedSize); virtual void SetNextIn(char *in, unsigned int size); virtual void SetNextOut(char *out, unsigned int size); virtual char *GetNextOut(); virtual unsigned int GetAvailIn(); virtual unsigned int GetAvailOut(); virtual const TCHAR *GetName(); virtual const TCHAR* GetErrStr(int err); }; #endif nsis-3.11/Source/compressor.h000077500000000000000000000021321477201124000162160ustar00rootroot00000000000000/* * compressor.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #ifndef __COMPRESSOR_H__ #define __COMPRESSOR_H__ #include "tchar.h" #define C_OK 0 #define C_FINISHED 1 #define C_FINISH true class ICompressor { public: virtual ~ICompressor() {} virtual int Init(int level, unsigned int dict_size) = 0; virtual int End() = 0; virtual int Compress(bool finish) = 0; virtual void SetNextIn(char *in, unsigned int size) = 0; virtual void SetNextOut(char *out, unsigned int size) = 0; virtual char* GetNextOut() = 0; virtual unsigned int GetAvailIn() = 0; virtual unsigned int GetAvailOut() = 0; virtual const TCHAR* GetName() = 0; virtual const TCHAR* GetErrStr(int err) = 0; }; #endif nsis-3.11/Source/crc32.c000077500000000000000000000021371477201124000147360ustar00rootroot00000000000000/* * crc32.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #include "Platform.h" #include "crc32.h" #include "exehead/config.h" #ifdef NSIS_CONFIG_CRC_SUPPORT // this is based on the (slow,small) CRC32 implementation from zlib. crc32_t NSISCALL CRC32(crc32_t crc, const unsigned char *buf, size_t len) { static crc32_t crc_table[256]; if (!crc_table[1]) { crc32_t c; int n, k; for (n = 0; n < 256; n++) { c = (crc32_t)n; for (k = 0; k < 8; k++) c = (c >> 1) ^ (c & 1 ? 0xedb88320L : 0); crc_table[n] = c; } } crc = crc ^ 0xffffffffL; while (len-- > 0) { crc = crc_table[(crc ^ (*buf++)) & 0xff] ^ (crc >> 8); } return crc ^ 0xffffffffL; } #endif nsis-3.11/Source/crc32.h000077500000000000000000000013051477201124000147370ustar00rootroot00000000000000/* * crc32.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/24/2007 */ #ifndef ___CRC32__H___ #define ___CRC32__H___ #include "Platform.h" #include // size_t typedef UINT32 crc32_t; #ifdef __cplusplus extern "C" #endif crc32_t NSISCALL CRC32(crc32_t crc, const unsigned char *buf, size_t len); #endif//!___CRC32__H___ nsis-3.11/Source/czlib.h000077500000000000000000000043241477201124000151320ustar00rootroot00000000000000/* * czlib.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/24/2007 */ #ifndef __CZLIB_H__ #define __CZLIB_H__ #include "compressor.h" #include class CZlib : public ICompressor { public: virtual ~CZlib() {} virtual int Init(int level, unsigned int dict_size) { stream = new z_stream; if (!stream) return Z_MEM_ERROR; stream->zalloc = (alloc_func)Z_NULL; stream->zfree = (free_func)Z_NULL; stream->opaque = (voidpf)Z_NULL; return deflateInit2(stream, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); } virtual int End() { int ret = deflateEnd(stream); delete stream; return ret; } virtual int Compress(bool finish) { return deflate(stream, finish?Z_FINISH:0); } virtual void SetNextIn(char *in, unsigned int size) { stream->next_in = (unsigned char*)in; stream->avail_in = size; } virtual void SetNextOut(char *out, unsigned int size) { stream->next_out = (unsigned char*)out; stream->avail_out = size; } virtual char* GetNextOut() { return (char*)stream->next_out; } virtual unsigned int GetAvailIn() { return stream->avail_in; } virtual unsigned int GetAvailOut() { return stream->avail_out; } virtual const TCHAR* GetName() { return _T("zlib"); } virtual const TCHAR* GetErrStr(int err) { switch (err) { case Z_STREAM_ERROR: return _T("invalid stream - bad call"); case Z_DATA_ERROR: return _T("data error"); case Z_MEM_ERROR: return _T("not enough memory"); case Z_BUF_ERROR: return _T("buffer error - bad call"); case Z_VERSION_ERROR: return _T("version error"); default: return _T("unknown error"); } } private: z_stream *stream; }; #endif nsis-3.11/Source/dirreader.cpp000077500000000000000000000126661477201124000163330ustar00rootroot00000000000000/* * dirreader.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #include "dirreader.h" #include "tstring.h" #include "util.h" #include #include // for stricmp() #include // for tolower() #ifdef _UNICODE # include // towlower() #endif using namespace std; dir_reader::dir_reader() { exclude(_T(".")); exclude(_T("..")); } const set& dir_reader::files() { return m_files; } const set& dir_reader::dirs() { return m_dirs; } void dir_reader::exclude(const tstring& spec) { if (spec.find_first_of(_T("?*")) != tstring::npos) { m_wildcard_excluded.insert(spec); } else { m_excluded.insert(spec); } } void dir_reader::exclude(const set& specs) { iterator i = specs.begin(); iterator e = specs.end(); for (; i != e; i++) { exclude(*i); } } bool dir_reader::matches(const tstring& name, const tstring& spec) { tstring::const_iterator name_itr = name.begin(); tstring::const_iterator name_end = name.end(); tstring::const_iterator spec_itr = spec.begin(); tstring::const_iterator spec_end = spec.end(); tstring::const_iterator last_good_spec = spec_end; tstring::const_iterator last_good_name = name_end; while (name_itr != name_end && spec_itr != spec_end) { switch (*spec_itr) { case _T('?'): // question mark matches one char name_itr++; spec_itr++; break; case _T('*'): // double asterisk is the same as a single asterisk while (*spec_itr == _T('*')) { spec_itr++; // asterisk at the end of the spec matches the end of the name if (spec_itr == spec_end) return true; } // remember last good name and spec for prematurely stopped asterisk last_good_spec = spec_itr; last_good_name = name_itr; break; default: // Jim Park: This should work since tolower is templated with Chartype. if (::tolower(*name_itr) != ::tolower(*spec_itr)) { if (last_good_spec != spec_end) { // matched wrong part of the name, try again spec_itr = last_good_spec; name_itr = ++last_good_name; } else { // no match and no asterisk to use return false; } } else { // remember last good name for prematurely stopped asterisk last_good_name = name_itr; spec_itr++; name_itr++; if (spec_itr == spec_end && name_itr != name_end && last_good_spec != spec_end) { // asterisk hasn't matched enough, keep matching spec_itr = last_good_spec; } } break; } } // skip any redundant asterisks and periods at the end of the name while (spec_itr != spec_end) { if (*spec_itr != _T('.') && *spec_itr != _T('*')) { break; } spec_itr++; } // return true only if managed to match everything return name_itr == name_end && spec_itr == spec_end; } void dir_reader::add_file(const tstring& file) { if (!is_excluded(file)) { m_files.insert(file); } } void dir_reader::add_dir(const tstring& dir) { if (!is_excluded(dir)) { m_dirs.insert(dir); } } bool dir_reader::is_excluded(const tstring& name) const { iterator i = m_excluded.begin(); iterator e = m_excluded.end(); for (; i != e; i++) { if (!::_tcsicmp(name.c_str(), i->c_str())) { return true; } } i = m_wildcard_excluded.begin(); e = m_wildcard_excluded.end(); for (; i != e; i++) { if (matches(name, *i)) { return true; } } return false; } #ifdef _WIN32 class win32_dir_reader : public dir_reader { public: virtual void read(const tstring& dir) { WIN32_FIND_DATA fd; tstring spec = dir + PLATFORM_PATH_SEPARATOR_STR + _T("*.*"); HANDLE h = ::FindFirstFile(spec.c_str(), &fd); if (h != INVALID_HANDLE_VALUE) { do { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) dir_reader::add_dir(fd.cFileName); else dir_reader::add_file(fd.cFileName); } while (::FindNextFile(h, &fd)); ::FindClose(h); } } }; #else #include #include #include class posix_dir_reader : public dir_reader { public: virtual void read(const tstring& dir) { static const char platformpathsep[2] = {(char)PLATFORM_PATH_SEPARATOR_C, '\0'}; char *nativedir = NSISRT_ttombpath(dir.c_str()); if (!nativedir) return ; DIR *dip = ::opendir(nativedir); if (dip) { dirent *dit; while ((dit = ::readdir(dip))) { struct stat st; string file = nativedir; file += platformpathsep, file += dit->d_name; if (!stat(file.c_str(), &st)) { tstring name; name = PosixBug_CtoTString(dit->d_name); if (S_ISDIR(st.st_mode)) dir_reader::add_dir(name); else dir_reader::add_file(name); } } ::closedir(dip); } NSISRT_free(nativedir); } }; #endif dir_reader* new_dir_reader() { #ifdef _WIN32 return new win32_dir_reader(); #else return new posix_dir_reader(); #endif } nsis-3.11/Source/dirreader.h000077500000000000000000000026601477201124000157710ustar00rootroot00000000000000/* * dirreader.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/23/2007 */ #include "Platform.h" #include "tstring.h" #include class dir_reader { public: typedef std::set::const_iterator iterator; dir_reader(); virtual ~dir_reader() {} virtual void read(const tstring& dir) = 0; virtual const std::set& files(); virtual const std::set& dirs(); // dir_reader always excludes . and .. AND the exclude list is private, // use this backdoor if you need to match "." virtual std::set& hack_simpleexcluded() {return m_excluded;} virtual void exclude(const tstring& spec); virtual void exclude(const std::set& specs); static bool matches(const tstring& name, const tstring& spec); protected: virtual void add_file(const tstring& file); virtual void add_dir(const tstring& dir); virtual bool is_excluded(const tstring& name) const; private: std::set m_excluded; std::set m_wildcard_excluded; std::set m_files; std::set m_dirs; }; dir_reader* new_dir_reader(); nsis-3.11/Source/exehead/000077500000000000000000000000001477201124000152535ustar00rootroot00000000000000nsis-3.11/Source/exehead/Main.c000077500000000000000000000405221477201124000163110ustar00rootroot00000000000000/* * main.c: executable header main code * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "../Platform.h" #include #include "resource.h" #include "util.h" #include "fileform.h" #include "state.h" #include "ui.h" #include "lang.h" #include "exec.h" #include "plugin.h" #ifndef LOAD_LIBRARY_SEARCH_USER_DIRS #define LOAD_LIBRARY_SEARCH_USER_DIRS 0x00000400 #define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 #endif #ifndef SHTDN_REASON_FLAG_PLANNED #define SHTDN_REASON_FLAG_PLANNED 0x80000000 #endif #ifndef SHTDN_REASON_MAJOR_APPLICATION #define SHTDN_REASON_MAJOR_APPLICATION 0x00040000 #endif #ifndef SHTDN_REASON_MINOR_INSTALLATION #define SHTDN_REASON_MINOR_INSTALLATION 0x0002 #endif #ifndef SHUTDOWN_RESTART #define SHUTDOWN_RESTART 0x00000004 #endif #ifndef SHUTDOWN_FORCE_OTHERS #define SHUTDOWN_FORCE_OTHERS 0x00000001 #endif #ifndef SHUTDOWN_GRACE_OVERRIDE #define SHUTDOWN_GRACE_OVERRIDE 0x00000020 #endif #if defined(_MSC_VER) && _MSC_VER >= 1200 EXTERN_C IMAGE_DOS_HEADER __ImageBase; #define HINST_THISCOMPONENT ( (HINSTANCE) &__ImageBase ) #define HINST_APPLICATION HINST_THISCOMPONENT #else #define HINST_APPLICATION ( (HINSTANCE) GetModuleHandle(NULL) ) #endif #if !defined(NSIS_CONFIG_VISIBLE_SUPPORT) && !defined(NSIS_CONFIG_SILENT_SUPPORT) #error One of NSIS_CONFIG_SILENT_SUPPORT or NSIS_CONFIG_VISIBLE_SUPPORT must be defined. #endif #ifdef NSIS_COMPRESS_WHOLE extern HANDLE dbd_hFile; #endif TCHAR g_caption[NSIS_MAX_STRLEN*2]; // Why does this have to be NSIS_MAX_STRLEN*2? #ifdef NSIS_CONFIG_VISIBLE_SUPPORT HWND g_hwnd; HANDLE g_hInstance; #endif void *g_SHGetFolderPath; DWORD g_WinVer; void NSISCALL CleanUp(); TCHAR *ValidateTempDir() { validate_filename(state_temp_dir); if (!validpathspec(state_temp_dir)) return NULL; addtrailingslash(state_temp_dir); CreateNormalDirectory(state_temp_dir); // state_language is used as a temp var here return my_GetTempFileName(state_language, state_temp_dir); } NSIS_ENTRYPOINT_GUINOCRT EXTERN_C void NSISWinMainNOCRT() { int ret = 0; const TCHAR *m_Err = _LANG_ERRORWRITINGTEMP; int cl_flags = 0; TCHAR *realcmds; TCHAR seekchar=_T(' '); TCHAR *cmdline; OSVERSIONINFOEX ovi; SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS); // Get the version as reported by Windows if (sizeof(void*) < 8) { *((UINT32*)&ovi.szCSDVersion[0]) = 0; // Zero out SP *((UINT64*)&ovi.wServicePackMajor) = 0; // wServicePackMajor, wSuiteMask and wProductType } ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((OSVERSIONINFO*) &ovi) && sizeof(void*) < 8) { ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*) &ovi); if (sizeof(TCHAR) == 2 || ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) { ovi.wProductType = 4; // TODO: For < NT4SP6, look it up in the registry. 4 means not W9x and not VER_NT_* ovi.wServicePackMajor = ovi.szCSDVersion[0] == 'S' ? ovi.szCSDVersion[13] - '0' : 0; } } if (sizeof(TCHAR) == 1 && ovi.dwPlatformId < VER_PLATFORM_WIN32_NT) { ovi.wProductType = 0; ovi.wServicePackMajor = ovi.szCSDVersion[1] >= 'A' ? ovi.szCSDVersion[1] - ('A'-1) : 0; // A, B or C } if (sizeof(void*) < 8 && ovi.dwMajorVersion < 10) // Ideally (sizeof(TCHAR) == 1 && ovi.dwMajorVersion < 5) but the compatibility tab emulates this bug { ovi.dwBuildNumber &= 0xffff; // Remove W9x garbage } // Save the packed version information { UINT32 *p = &g_osinfo.WVBuild; p[0] = ovi.dwBuildNumber; p[1] = MAKELONG(MAKEWORD(ovi.wProductType, ovi.wServicePackMajor), MAKEWORD(ovi.dwMinorVersion, ovi.dwMajorVersion)); } { // bug #1125: Don't load modules from the application nor current directory. // SetDefaultDllDirectories() allows us to restrict implicitly loaded and // dynamically loaded modules to just %windir%\System32 and directories // added with AddDllDirectory(). This prevents DLL search order attacks (CAPEC-471). // CoCreateInstance(CLSID_ShellLink, ...) fails on Vista if SetDefaultDllDirectories is called BOOL avoidwinbug = IsWinVista(); if (!avoidwinbug) { FARPROC fp = myGetProcAddress(MGA_SetDefaultDllDirectories); if (fp) ((BOOL(WINAPI*)(DWORD))fp)(LOAD_LIBRARY_SEARCH_SYSTEM32|LOAD_LIBRARY_SEARCH_USER_DIRS); } // SetDefaultDllDirectories might not be available so we try to preload various libraries as // best we can before Windows gets a chance to mess things up by loading from the wrong directory. { static const char preload[] = "UXTHEME\0" // Vista: OleInitialize calls NtUserCreateWindowEx and that pulls in UXTheme.dll "USERENV\0" // Vista: SHGetFileInfo ends up in SHELL32.kfapi::GetUserProfileDir and that pulls in UserEnv.dll "SETUPAPI\0" // XP: SHGetFileInfo ends up in CMountPoint::_InitLocalDriveHelper and that pulls in SetupAPI.dll "APPHELP\0" // Vista: SHGetFileInfo ... SHELL32.SHILAliasTranslate ... SHELL32.ApphelpCheckShellObject "PROPSYS\0" // Vista: SHGetFileInfo ... SHELL32.SHILAliasTranslate ... SHLWAPI.#187 ... SHLWAPI.#505/SHPropertyBag_ReadGUID "DWMAPI\0" // Win7 without KB2533623: UXTheme pulls in DWMAPI.dll "CRYPTBASE\0" // Win7 without KB2533623: OleInitialize ... RPCRT4.UuidCreate ... RPCRT4.GenerateRandomNumber "OLEACC\0" // Vista: SHFileOperation ... SHELL32.CProgressDialogUI::_Setup ... SHELL32.GetRoleTextW "CLBCATQ\0" // XP.SP2&SP3: SHAutoComplete ... OLE32!InitializeCatalogIfNecessary ... OLE32!CComCatalog::TryToLoadCLB "NTMARTA\0" // Win7 without KB2533623 (Bug #1204): SHGetFileInfo ... SetEntriesInAcl ... ADVAPI32!AccProvpLoadMartaFunctions #ifndef NSIS_SUPPORT_GETDLLVERSION "VERSION\0" #endif ; const char *dll; for (dll = preload; dll[0]; dll += lstrlenA(dll) + 1) LoadSystemLibrary(dll); } } // Because myGetProcAddress now loads dlls with a full path // under GetSystemDirectory() the previous issues in <= v3.0b2 with // 'SetOutPath' and/or 'File "shfolder.dll"' no longer apply. // All MGA dlls still need to be loaded early here because installers // running under WoW64 might disable WoW64 FS redirection in .onInit and // because GetSystemDirectory() can return the native system32 path we need // the redirection to be turned off so LoadLibrary uses the correct folder. // Note: We also import directly from KERNEL32, ADVAPI32 and SHELL32 so they // are exempt from this requirement and SHELL32 imports from SHLWAPI on // WoW64 systems and it is also on the KnownDLLs list so // SHLWAPI also gets a pass and that just leaves #ifdef NSIS_SUPPORT_GETDLLVERSION myGetProcAddress(MGA_GetFileVersionInfo); // VERSION #endif g_SHGetFolderPath = myGetProcAddress(MGA_SHGetFolderPath); // and SHFOLDER #ifndef _WIN64 { // KEY_WOW64_xxKEY flags causes registry functions to fail on WinNT4 & Win2000. // We don't filter them out because all registry instructions are supposed to fail when // accessing a unsupported view and RegKey* takes care of that by looking at the WOW64 flag. FARPROC fp = myGetProcAddress(MGA_IsOS); enum { os_wow6432 = 30 }; if (fp && ((BOOL(WINAPI*)(UINT))fp)(os_wow6432)) g_osinfo.WVProd |= NSIS_OSINFO_PROD_WOW64FLAG; } #endif InitCommonControls(); #if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT) { extern HRESULT g_hres; g_hres=OleInitialize(NULL); } #endif { // workaround for bug #1008632 // http://sourceforge.net/tracker/index.php?func=detail&aid=1008632&group_id=22049&atid=373085 // // without this, SHGetSpecialFolderLocation doesn't always recognize // some special folders, like the desktop folder for all users, on // Windows 9x. unlike SHGetSpecialFolderPath, which is not available // on all versions of Windows, SHGetSpecialFolderLocation doesn't try // too hard to make sure the caller gets what he asked for. so we give // it a little push in the right direction by doing part of the work // for it. // // part of what SHGetFileInfo does, is to convert a path into an idl. // to do this conversion, it first needs to initialize the list of // special idls, which are exactly the idls we use to get the paths // of special folders (CSIDL_*). SHFILEINFO shfi; SHGetFileInfo(_T(""), 0, &shfi, sizeof(SHFILEINFO), 0); } mystrcpy(g_caption,_LANG_GENERIC_ERROR); mystrcpy(state_command_line, GetCommandLine()); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT g_hInstance = HINST_APPLICATION; #endif//NSIS_CONFIG_VISIBLE_SUPPORT cmdline = state_command_line; if (*cmdline == _T('\"')) seekchar = *cmdline++; cmdline=findchar(cmdline, seekchar); cmdline=CharNext(cmdline); realcmds=cmdline; while (*cmdline) { // skip over any spaces while (*cmdline == _T(' ')) cmdline++; // get char we should look for to get the next parm seekchar = _T(' '); if (cmdline[0] == _T('\"')) { cmdline++; seekchar = _T('\"'); } // is it a switch? if (cmdline[0] == _T('/')) { cmdline++; #define END_OF_ARG(c) (c == _T(' ') || c == _T('\0')) #if defined(NSIS_CONFIG_VISIBLE_SUPPORT) && defined(NSIS_CONFIG_SILENT_SUPPORT) if (cmdline[0] == _T('S') && END_OF_ARG(cmdline[1])) g_exec_flags.silent = 1; // bug #1076 - just set the silent flag. the user really wants it silent. // loadHeaders() will not reset this as it uses |= to apply the script flags. // there is also no option to force non-silent like `CRCCheck force` #endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT if (CMP4CHAR(cmdline, _T("NCRC")) && END_OF_ARG(cmdline[4])) cl_flags |= FH_FLAGS_NO_CRC; #endif//NSIS_CONFIG_CRC_SUPPORT if (CMP4CHAR(cmdline-2, _T(" /D="))) { *(cmdline-2)=_T('\0'); // keep this from being passed to uninstaller if necessary mystrcpy(state_install_directory,cmdline+2); break; // /D= must always be last } } // skip over our parm cmdline = findchar(cmdline, seekchar); // skip the quote if (*cmdline == _T('\"')) cmdline++; } GetTempPath(NSIS_MAX_STRLEN, state_temp_dir); if (!ValidateTempDir()) { GetWindowsDirectory(state_temp_dir, NSIS_MAX_STRLEN - 5); // leave space for \Temp mystrcat(state_temp_dir, _T("\\Temp")); if (!ValidateTempDir()) { // Bug #2909242: // When running at <= Low IL we cannot write to %Temp% but we can try the temp folder used by IE. // There does not seem to be a API to get the low temp dir directly, so we build the path on our own GetTempPath(NSIS_MAX_STRLEN - 4, state_temp_dir); // leave space for \Low mystrcat(state_temp_dir, _T("Low")); // If we don't call SetEnvironmentVariable // child processes will use %temp% and not %temp%\Low // and some apps probably can't handle a read only %temp% // Do it before ValidateTempDir() because it appends a backslash. // TODO: Should this be moved to ValidateTempDir() so it also updates for %windir%\Temp? SetEnvironmentVariable(_T("TEMP"), state_temp_dir); SetEnvironmentVariable(_T("TMP"), state_temp_dir); if (!ValidateTempDir()) { goto end; } } } DeleteFile(state_language); m_Err = loadHeaders(cl_flags); if (m_Err) goto end; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (g_is_uninstaller) { TCHAR *p = findchar(state_command_line, 0); // state_command_line has state_install_directory right after it in memory, so reading // a bit over state_command_line won't do any harm while (p >= state_command_line && !CMP4CHAR(p, _T(" _?="))) p--; m_Err = _LANG_UNINSTINITERROR; if (p >= state_command_line) { *p=0; // terminate before "_?=" p+=4; // skip over " _?=" if (is_valid_instpath(p)) { mystrcpy(state_install_directory, p); mystrcpy(state_output_directory, p); m_Err = 0; } else { goto end; } } else { int admin = UserIsAdminGrpMember(); WORD tries; // 0xfffe attempts or bust size_t cchtmpslash = mystrlen(state_temp_dir); LPTSTR unexe = g_usrvars[5], unexecmd = g_usrvars[6]; mystrcpy(g_usrvars[0], realcmds); if (!(*state_install_directory)) { mystrcpy(state_install_directory, state_exe_directory); } for (tries = 0; ++tries != 0;) { DWORD retry = 0, ec; retry_un_dir: wsprintf(state_temp_dir + cchtmpslash, _T("~nsu%X.tmp"), tries); GetNSISString(unexe, g_header->str_uninstchild); // '$TEMP\Un.exe' if (admin) { ec = CreateRestrictedDirectory(state_temp_dir); } else { ec = CreateNormalDirectory(state_temp_dir); } if (ec) { // Delete previous uninstaller (if it is safe to do so) (Bug #1296) if (!(GetFileAttributes(unexe) & FILE_ATTRIBUTE_REPARSE_POINT) && DeleteFile(unexe)) { myDelete(state_temp_dir, DEL_DIR); if (!retry++) goto retry_un_dir; } } else { HANDLE hProc; SetCurrentDirectory(state_temp_dir); #ifdef NSIS_SUPPORT_MOVEONREBOOT MoveFileOnReboot(state_temp_dir, NULL); #endif if (CopyFile(state_exe_path, unexe, TRUE)) { #ifdef NSIS_SUPPORT_MOVEONREBOOT MoveFileOnReboot(unexe, NULL); #endif GetNSISString(unexecmd, g_header->str_uninstcmd); // '"$TEMP\Un.exe" $0 _?=$INSTDIR\' hProc = myCreateProcess(unexecmd); if (hProc) { CloseHandle(hProc); m_Err = 0; // Success } else if (!retry++ && !file_exists(unexe)) { // Another instance deleted us between CopyFile and CreateProcess goto retry_un_dir; } } break; // We called CreateProcess; success or failure, we are done. } } goto end; } } #endif//NSIS_CONFIG_UNINSTALL_SUPPORT g_exec_flags.errlvl = -1; ret = ui_doinstall(); #ifdef NSIS_CONFIG_LOG #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) log_write(1); #endif//!NSIS_CONFIG_LOG_ODS && !NSIS_CONFIG_LOG_STDOUT #endif//NSIS_CONFIG_LOG end: CleanUp(); #if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT) OleUninitialize(); #endif if (m_Err) { my_MessageBox(m_Err, MB_OK | MB_ICONSTOP | (IDOK << 21)); ExitProcess(2); } #ifdef NSIS_SUPPORT_REBOOT if (g_exec_flags.reboot_called) { const DWORD reason = SHTDN_REASON_FLAG_PLANNED | SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_INSTALLATION; BOOL (WINAPI *IS)(LPTSTR,LPTSTR,DWORD,DWORD,DWORD); HANDLE hToken; TOKEN_PRIVILEGES tkp; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); } IS=myGetProcAddress(MGA_InitiateShutdown); if ( (IS && !IS(NULL, NULL, 0, SHUTDOWN_RESTART | SHUTDOWN_FORCE_OTHERS | SHUTDOWN_GRACE_OVERRIDE, reason)) || (!ExitWindowsEx(EWX_REBOOT, reason)) ) ExecuteCallbackFunction(CB_ONREBOOTFAILED); } #endif//NSIS_SUPPORT_REBOOT if (g_exec_flags.errlvl != -1) ret = g_exec_flags.errlvl; ExitProcess(ret); } void NSISCALL CleanUp() { if (g_db_hFile != INVALID_HANDLE_VALUE) { CloseHandle(g_db_hFile); g_db_hFile = INVALID_HANDLE_VALUE; } #ifdef NSIS_COMPRESS_WHOLE if (dbd_hFile != INVALID_HANDLE_VALUE) { CloseHandle(dbd_hFile); dbd_hFile = INVALID_HANDLE_VALUE; } #endif #ifdef NSIS_CONFIG_PLUGIN_SUPPORT // Notify plugins that we are about to unload Plugins_UnloadAll(); // Clean up after plug-ins myDelete(state_plugins_dir, DEL_DIR | DEL_RECURSE | DEL_REBOOT); #endif // NSIS_CONFIG_PLUGIN_SUPPORT #ifdef DEBUG // GlobalFree(g_header); ? #endif } nsis-3.11/Source/exehead/SConscript000077500000000000000000000034631477201124000172760ustar00rootroot00000000000000files = Split(""" bgbg.c components.c exec.c fileform.c Main.c plugin.c Ui.c util.c #Source/crc32.c """) resources = Split(""" resource.rc """) resource_files = Split(""" nsis.ico uninst.ico bitmap1.bmp """) bzip2_files = Split(""" #Source/bzip2/bzlib.c #Source/bzip2/decompress.c #Source/bzip2/huffman.c """) lzma_files = Split(""" #Source/7zip/LZMADecode.c """) zlib_files = Split(""" #Source/zlib/INFBLOCK.C """) libs = Split(""" advapi32 shell32 ole32 comdlg32 comctl32 user32 gdi32 kernel32 uuid """) Import('env compression solid_compression') ### Defines env.Append(CPPDEFINES = ['EXEHEAD']) env.Append(CPPDEFINES = ['WIN32_LEAN_AND_MEAN']) env.Append(CPPDEFINES = ['_WIN32_IE=0x0500']) ### Some other settings if 'NSIS_CONFIG_LOG_STDOUT' in env['NSIS_CPPDEFINES']: env.Append(LINKFLAGS = env['SUBSYS_CON']) else: env.Append(LINKFLAGS = env['SUBSYS_WIN']) ### Compression specific configuration if compression == 'bzip2': env.Append(CPPDEFINES = ['NSIS_COMPRESS_USE_BZIP2']) files += bzip2_files elif compression == 'lzma': env.Append(CPPDEFINES = ['NSIS_COMPRESS_USE_LZMA']) env.Append(CPPDEFINES = ['LZMACALL=__fastcall']) files += lzma_files elif compression == 'zlib': env.Append(CPPDEFINES = ['NSIS_COMPRESS_USE_ZLIB']) env.Append(CPPDEFINES = ['ZEXPORT=__stdcall']) files += zlib_files if solid_compression: env.Append(CPPDEFINES = ['NSIS_COMPRESS_WHOLE']) ### Build with no sub-build-directories objs = [] def basename(file): return file.split('/')[-1].split('.')[0] for file in files: objs.append(env.Object(target = basename(file), source = file)) ### Resources res = env.RES(resources) env.Depends(res, resource_files) objs = objs + res ### Build stub stub = env.Program(target = 'stub_' + compression, source = objs, LIBS = libs) ### Return stub Return('stub') nsis-3.11/Source/exehead/Ui.c000077500000000000000000001454531477201124000160130ustar00rootroot00000000000000/* * Ui.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft, Jeff Doozan and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/10/2007 */ #include "../Platform.h" #include #include #include #include #include "resource.h" #include "fileform.h" #include "state.h" #include "util.h" #include "ui.h" #include "exec.h" #include "plugin.h" #include "lang.h" #include "components.h" #include "api.h" #ifdef NSIS_CONFIG_VISIBLE_SUPPORT HICON g_hIcon; #endif int dlg_offset; int ui_dlg_visible=0; // At start main window is not visible int g_quit_flag; // set when Quit has been called (meaning bail out ASAP) #if NSIS_MAX_INST_TYPES > 32 || NSIS_MAX_INST_TYPES < 1 #error invalid value for NSIS_MAX_INST_TYPES #endif int progress_bar_pos, progress_bar_len; #if NSIS_MAX_STRLEN < 1024 static TCHAR g_tmp[4096]; #else static TCHAR g_tmp[NSIS_MAX_STRLEN * 4]; #endif static int m_page=-1,m_retcode,m_delta; static page *g_this_page; static void NSISCALL outernotify(int delta) { if (delta==NOTIFY_BYE_BYE) g_quit_flag++; SendMessage(g_hwnd,WM_NOTIFY_OUTER_NEXT,(WPARAM)delta,0); } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static int CALLBACK WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); #ifdef NSIS_CONFIG_LICENSEPAGE static INT_PTR CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif static INT_PTR CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK UninstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif//NSIS_CONFIG_VISIBLE_SUPPORT static DWORD WINAPI install_thread(LPVOID p); void NSISCALL CleanUp(); HWND insthwnd, insthwnd2, insthwndbutton; HWND m_curwnd; static HWND m_bgwnd, m_hwndOK, m_hwndCancel; static BOOL NSISCALL SetDlgItemTextFromLang_(HWND dlg, int id, int lid) { return my_SetDialogItemText(dlg,id+1000,GetNSISStringTT(lid)); } static void NSISCALL SetNextDef() { SendMessage(g_exec_flags.abort ? m_hwndCancel : m_hwndOK, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE); } static void NSISCALL EnableNext(BOOL e) { EnableWindow(m_hwndOK, e); } static void NSISCALL SetActiveCtl(HWND hCtl) { SendMessage(g_hwnd, WM_NEXTDLGCTL, (WPARAM) hCtl, TRUE); } static BOOL NSISCALL LaunchURL(HWND hOwner, LPCTSTR URL, int ShowMode) { SHELLEXECUTEINFO sei; sei.fMask = SEE_MASK_FLAG_NO_UI|SEE_MASK_FLAG_DDEWAIT; sei.hwnd = hOwner, sei.nShow = SW_SHOWNORMAL; sei.lpVerb = _T("open"), sei.lpFile = URL, sei.lpParameters=NULL, sei.lpDirectory = NULL; return myShellExecuteEx(&sei); } static void NSISCALL NotifyCurWnd(UINT uNotifyCode) { if (m_curwnd) SendMessage(m_curwnd, uNotifyCode, 0, 0); } #define SetDlgItemTextFromLang(dlg,id,lid) SetDlgItemTextFromLang_(dlg,(id)-1000,lid) #define SetUITextFromLang(it,la) SetDlgItemTextFromLang_(hwndDlg,(it)-1000,la) #define SetUITextNT(it,text) my_SetDialogItemText(hwndDlg,it,text) #define GetUIText(it,s) my_GetDialogItemText(it,s) #define GetUIItem(it) GetDlgItem(hwndDlg,it) #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT // "Link Window"/"SysLink" stores a pointer in GWLP_USERDATA on 2000/XP/2003 and it crashes if we clobber it (forums.winamp.com/showthread.php?t=333379). // Checking for ROLE_SYSTEM_LINK is probably more reliable but requires more code. #define IsNSISCtlColor(p) ( ( ((p)->lbStyle) <= 1 ) /* BS_SOLID||BS_HOLLOW */ \ && ( (UINT)((p)->bkmode) <= 2 ) /* TRANSPARENT||OPAQUE */ \ && ( ((p)->flags >> CC_FLAGSSHIFTFORZERO) == 0 ) /* CC_* flags */ \ ) #define HandleStaticBkColor() _HandleStaticBkColor(uMsg, wParam, lParam) static INT_PTR NSISCALL _HandleStaticBkColor(UINT uMsg, WPARAM wParam, LPARAM lParam) { if ((uMsg - WM_CTLCOLOREDIT) <= (WM_CTLCOLORSTATIC - WM_CTLCOLOREDIT)) { ctlcolors *c = (ctlcolors *)GetWindowLongPtr((HWND)lParam, GWLP_USERDATA); if (c && IsNSISCtlColor(c)) { COLORREF text; LOGBRUSH lh; text = c->text; if (c->flags & CC_TEXT_SYS) text = GetSysColor(text); if (c->flags & CC_TEXT) SetTextColor((HDC)wParam, text); SetBkMode((HDC)wParam, c->bkmode); lh.lbColor = c->bkc; if (c->flags & CC_BK_SYS) lh.lbColor = GetSysColor(lh.lbColor); if (c->flags & CC_BK) SetBkColor((HDC)wParam, lh.lbColor); if (c->flags & CC_BKB) { lh.lbStyle = c->lbStyle; if (c->bkb) DeleteObject(c->bkb); c->bkb = CreateBrushIndirect(&lh); // LOGBRUSH::lbHatch is ignored by BS_SOLID and BS_HOLLOW } return (INT_PTR)c->bkb; } } return 0; } #else #define HandleStaticBkColor() 0 #endif//~ NSIS_CONFIG_ENHANCEDUI_SUPPORT #ifdef NSIS_CONFIG_LOG #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) void NSISCALL build_g_logfile() { mystrcat(addtrailingslash(mystrcpy(g_log_file,state_install_directory)),_T("install.log")); } #endif #endif int *cur_langtable; static TCHAR* update_caption() { TCHAR *gcap = g_caption; GetNSISString(gcap, LANG_CAPTION); #ifdef NSIS_SUPPORT_BGBG my_SetWindowText(m_bgwnd, gcap); #endif return gcap; } static void NSISCALL set_language() { LANGID lang_mask=(LANGID)~0; LANGID lang=myatoi(state_language); char *language_table=0; int lang_num; int *selected_langtable=0; // Jim Park: We are doing byte offsets to get to various data structures so // no TCHARs here. lang_again: lang_num=g_blocks[NB_LANGTABLES].num; while (lang_num--) { language_table=((char*)g_blocks[NB_LANGTABLES].offset)+lang_num*g_header->langtable_size; if (!((lang ^ *(LANGID*)language_table) & lang_mask)) { dlg_offset=*(int*)(language_table+sizeof(LANGID)); g_exec_flags.rtl=*(int*)(language_table+sizeof(LANGID)+sizeof(int)); selected_langtable=(int*)(language_table+sizeof(LANGID)+2*sizeof(int)); break; } } if (!selected_langtable) { if (lang_mask == (LANGID)~0) lang_mask=0x3ff; // primary lang else // we already tried once and we still don't have a language table lang_mask=0; // first lang goto lang_again; } cur_langtable = selected_langtable; myitoa(state_language, *(LANGID*)language_table); update_caption(); // reload section names { section *sec = g_sections; int x = num_sections; while (x--) { if (sec->name_ptr) { GetNSISString(sec->name, sec->name_ptr); } sec++; } } } FORCE_INLINE int NSISCALL ui_doinstall(void) { header *header = g_header; static WNDCLASS wc; // richedit subclassing and bgbg creation // detect default language // more information at: // https://web.archive.org/web/20060618155426/http://msdn.microsoft.com/library/en-us/intl/nls_0xrn.asp LANGID (WINAPI *GUDUIL)(); #ifdef _WIN64 GUDUIL = GetUserDefaultUILanguage; #else GUDUIL = myGetProcAddress(MGA_GetUserDefaultUILanguage); if (GUDUIL) #endif { // Windows ME/2000+ myitoa(state_language, GUDUIL()); } #ifndef _WIN64 else { static const TCHAR reg_9x_locale[] = _T("Control Panel\\Desktop\\ResourceLocale"); static const TCHAR reg_nt_locale_key[] = _T(".DEFAULT\\Control Panel\\International"); const TCHAR *reg_nt_locale_val = ®_9x_locale[30]; // = _T("Locale") with opt state_language[0] = _T('0'); state_language[1] = _T('x'); state_language[2] = 0; { // Windows 9x myRegGetStr(HKEY_CURRENT_USER, reg_9x_locale, NULL, g_tmp, 0); } if (!g_tmp[0]) { // Windows NT // This key exists on 9x as well, so it's only read if ResourceLocale wasn't found myRegGetStr(HKEY_USERS, reg_nt_locale_key, reg_nt_locale_val, g_tmp, 0); } mystrcat(state_language, g_tmp); } #endif // set default language set_language(); // initialize auto close flag g_exec_flags.autoclose=g_flags&CH_FLAGS_AUTO_CLOSE; #ifdef NSIS_CONFIG_PLUGIN_SUPPORT // initialize plugin api g_exec_flags.plugin_api_version=NSISPIAPIVER_CURR; #endif // read install directory from registry if (!is_valid_instpath(state_install_directory)) { if (header->install_reg_key_ptr) { myRegGetStr( (HKEY)(UINT_PTR)header->install_reg_rootkey, GetNSISStringNP(header->install_reg_key_ptr), GetNSISStringNP(header->install_reg_value_ptr), ps_tmpbuf, 0 ); if (ps_tmpbuf[0]) { TCHAR *p=ps_tmpbuf; TCHAR *e; if (p[0]==_T('\"')) { TCHAR *p2; p++; p2 = findchar(p, _T('"')); *p2 = 0; } // p is the path now, check for .exe extension e=p+mystrlen(p)-4; if (e > p) { // if filename ends in .exe, and is not a directory, remove the filename if (!lstrcmpi(e, _T(".exe"))) // check extension { DWORD d; d=GetFileAttributes(p); if (d == INVALID_FILE_ATTRIBUTES || !(d&FILE_ATTRIBUTE_DIRECTORY)) { // if there is no back-slash, the string will become empty, but that's ok because // it would make an invalid instdir anyway trimslashtoend(p); } } } mystrcpy(state_install_directory,addtrailingslash(p)); } } } if (!is_valid_instpath(state_install_directory)) { GetNSISString(state_install_directory,header->install_directory_ptr); } #ifdef NSIS_CONFIG_LOG if (g_flags & CH_FLAGS_SILENT_LOG && !g_is_uninstaller) { #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) build_g_logfile(); #endif log_dolog=1; } #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT g_hIcon=LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_ICON2),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_SHARED); #ifdef NSIS_SUPPORT_BGBG if (header->bg_color1 != -1) { LPCTSTR cn = _T("_Nb"); RECT vp; extern LRESULT CALLBACK BG_WndProc(HWND, UINT, WPARAM, LPARAM); wc.lpfnWndProc = BG_WndProc; wc.hInstance = g_hInstance; wc.hIcon = g_hIcon; //wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.lpszClassName = cn; if (!RegisterClass(&wc)) return 0; SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0); m_bgwnd = CreateWindowEx(WS_EX_TOOLWINDOW,cn,0,WS_POPUP, vp.left,vp.top,vp.right-vp.left,vp.bottom-vp.top,0,NULL,g_hInstance,NULL); } #endif//NSIS_SUPPORT_BGBG #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_SUPPORT_CODECALLBACKS // Select language if (ExecuteCallbackFunction(CB_ONINIT)) return 2; set_language(); #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT if (!g_exec_flags.silent) #endif//NSIS_CONFIG_SILENT_SUPPORT { #ifdef NSIS_SUPPORT_BGBG ShowWindow(m_bgwnd, SW_SHOW); #endif//NSIS_SUPPORT_BGBG #ifdef NSIS_CONFIG_LICENSEPAGE { // load richedit DLL static const CHAR riched20[]=("RichEd20"); // v2..3 DLL static const CHAR riched32[]=("RichEd32"); // v1 DLL #ifdef UNICODE static const TCHAR richedit20t[]=_T("RichEdit20W"); #else static const TCHAR richedit20t[]=_T("RichEdit20A"); #endif static const TCHAR richedit[]=_T("RichEdit"); // v1 class if (!LoadSystemLibrary(riched20)) { LoadSystemLibrary(riched32); // Win95 only ships with v1.0, NT4 has v2.0: web.archive.org/web/20030607222419/http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/aboutricheditcontrols.asp } // Register RichEdit20A/W as a RICHEDIT clone (for Win95) if (!GetClassInfo(NULL,richedit20t,&wc)) { GetClassInfo(NULL,richedit,&wc); wc.lpszClassName = richedit20t; RegisterClass(&wc); } } #endif { int ret=(int) DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST+dlg_offset),0,DialogProc); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) ExecuteCallbackFunction(CB_ONGUIEND); #endif #ifdef NSIS_CONFIG_PLUGIN_SUPPORT Plugins_SendMsgToAllPlugins(NSPIM_GUIUNLOAD); #endif return ret; } } #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT else #endif//NSIS_CONFIG_VISIBLE_SUPPORT { if (install_thread(NULL)) { #ifdef NSIS_SUPPORT_CODECALLBACKS if (!g_quit_flag) ExecuteCallbackFunction(CB_ONINSTFAILED); #endif//NSIS_SUPPORT_CODECALLBACKS return 2; } #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCallbackFunction(CB_ONINSTSUCCESS); #endif//NSIS_SUPPORT_CODECALLBACKS return 0; } #endif//NSIS_CONFIG_SILENT_SUPPORT } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT static int CALLBACK WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { // lpData has the TCHAR* to 'dir'. if (uMsg==BFFM_INITIALIZED) { my_GetDialogItemText(IDC_DIR,(TCHAR*)lpData); SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)1,lpData); } if (uMsg==BFFM_SELCHANGED) { SendMessage( hwnd, BFFM_ENABLEOK, 0, SHGetPathFromIDList((LPITEMIDLIST)lParam,(TCHAR*)lpData) #ifdef NSIS_SUPPORT_CODECALLBACKS && !ExecuteCallbackFunction(CB_ONVERIFYINSTDIR) #endif ); } return 0; } INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_INITDIALOG || uMsg == WM_NOTIFY_OUTER_NEXT) { page *this_page; static DLGPROC winprocs[]= { #ifdef NSIS_CONFIG_LICENSEPAGE LicenseProc, #endif #ifdef NSIS_CONFIG_COMPONENTPAGE SelProc, #endif DirProc, InstProc, #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT UninstProc #endif }; m_delta = (int) wParam; if (uMsg == WM_INITDIALOG) { g_hwnd=hwndDlg; m_hwndOK=GetDlgItem(hwndDlg,IDOK); m_hwndCancel=GetDlgItem(hwndDlg,IDCANCEL); SetDlgItemTextFromLang(hwndDlg,IDC_VERSTR,LANG_BRANDING); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)g_hIcon); // use the following line instead of the above, if .rdata needs shirking //SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(LPARAM)g_hIcon); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) g_quit_flag = ExecuteCallbackFunction(CB_ONGUIINIT); #endif //ShowWindow(hwndDlg, SW_SHOW); m_delta = 1; } this_page=g_pages+m_page; if (m_page>=0) { #ifdef NSIS_SUPPORT_CODECALLBACKS // Call leave function. If Abort used don't move to the next page. // But if quit called we must exit now if (m_delta==1) if (ExecuteCodeSegment(this_page->leavefunc,NULL)) { SendMessage(m_curwnd, WM_IN_UPDATEMSG, 0, 1); return !g_quit_flag; } #endif // if the last page was a custom page, wait for it to finish by itself. // if it doesn't, it's a BAD plugin. // plugins should react to WM_NOTIFY_OUTER_NEXT. if (!this_page->dlg_id) return 0; } NotifyCurWnd(WM_NOTIFY_INIGO_MONTOYA); nextPage: m_page+=m_delta; this_page+=m_delta; #ifdef NSIS_SUPPORT_CODECALLBACKS if (m_page==g_blocks[NB_PAGES].num) ExecuteCallbackFunction(CB_ONINSTSUCCESS); #endif//NSIS_SUPPORT_CODECALLBACKS if (g_quit_flag || (unsigned int)m_page >= (unsigned int)g_blocks[NB_PAGES].num) { DestroyWindow(m_curwnd); g_hwnd = 0; EndDialog(hwndDlg,m_retcode); } else { HWND hwndtmp; int pflags = this_page->flags; GetNSISString(state_click_next, this_page->clicknext); SetDlgItemTextFromLang(hwndDlg, IDOK, this_page->next); SetDlgItemTextFromLang(hwndDlg, IDC_BACK, this_page->back); SetDlgItemTextFromLang(hwndDlg, IDCANCEL, this_page->cancel); hwndtmp = GetDlgItem(hwndDlg, IDC_BACK); if (g_exec_flags.abort) { pflags &= ~(PF_BACK_ENABLE | PF_NEXT_ENABLE); pflags |= PF_CANCEL_ENABLE; } ShowWindow(hwndtmp, pflags & PF_BACK_SHOW);// SW_HIDE = 0, PF_BACK_SHOW = SW_SHOWNA = 8 EnableWindow(hwndtmp, pflags & PF_BACK_ENABLE); EnableNext(pflags & PF_NEXT_ENABLE); EnableWindow(m_hwndCancel, pflags & PF_CANCEL_ENABLE); if (pflags & PF_CANCEL_ENABLE) EnableMenuItem(GetSystemMenu(hwndDlg, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_ENABLED); else EnableMenuItem(GetSystemMenu(hwndDlg, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); SendMessage(hwndtmp, BM_SETSTYLE, BS_PUSHBUTTON, TRUE); if (g_exec_flags.abort) { SendMessage(hwndDlg, DM_SETDEFID, IDCANCEL, 0); SetActiveCtl(m_hwndCancel); } else { SetActiveCtl(m_hwndOK); } mystrcpy(g_tmp,update_caption()); GetNSISString(g_tmp+mystrlen(g_tmp),this_page->caption); my_SetWindowText(hwndDlg,g_tmp); #ifdef NSIS_SUPPORT_CODECALLBACKS // custom page or user used abort in prefunc if (ExecuteCodeSegment(this_page->prefunc, NULL) || !this_page->dlg_id) { goto nextPage; } #endif //NSIS_SUPPORT_CODECALLBACKS if (this_page->wndproc_id != PWP_COMPLETED) { DestroyWindow(m_curwnd); } else { if (!g_exec_flags.abort && g_exec_flags.autoclose) goto nextPage; // no need to go to skipPage because PWP_COMPLETED always follows PWP_INSTFILES return FALSE; } // update g_this_page for the dialog proc g_this_page=this_page; if (this_page->dlg_id > 0) // NSIS page { m_curwnd=CreateDialogParam( g_hInstance, MAKEINTRESOURCE(this_page->dlg_id+dlg_offset), hwndDlg,winprocs[this_page->wndproc_id],(LPARAM)this_page ); if (m_curwnd) { RECT r; SetDlgItemTextFromLang(m_curwnd,IDC_INTROTEXT,this_page->parms[0]); GetWindowRect(GetDlgItem(hwndDlg,IDC_CHILDRECT),&r); ScreenToClient(hwndDlg,(LPPOINT)&r); SetWindowPos(m_curwnd,0,r.left,r.top,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCodeSegment(this_page->showfunc,NULL); if (g_quit_flag) return FALSE; #endif //NSIS_SUPPORT_CODECALLBACKS ShowWindow(m_curwnd,SW_SHOWNA); NotifyCurWnd(WM_NOTIFY_START); } } } skipPage: if (!ui_dlg_visible && m_curwnd) { ShowWindow(hwndDlg, SW_SHOWDEFAULT); ui_dlg_visible = 1; } return FALSE; } #ifdef NSIS_SUPPORT_BGBG if (uMsg == WM_WINDOWPOSCHANGED) { SetWindowPos(m_bgwnd, hwndDlg, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); } if (uMsg == WM_SIZE) { ShowWindow(m_bgwnd, wParam == SIZE_MINIMIZED ? SW_HIDE : SW_SHOW); #else //! NSIS_SUPPORT_BGBG if (uMsg == WM_SIZE) { #endif //~ NSIS_SUPPORT_BGBG if (wParam == SIZE_MAXIMIZED) { DWORD style = (DWORD) GetWindowLongPtr(hwndDlg, GWL_STYLE), mask = WS_MAXIMIZEBOX|WS_MAXIMIZE|WS_MINIMIZE; if ((style & mask) == WS_MAXIMIZE) ShowWindow(hwndDlg, SW_SHOWNOACTIVATE); // Disallow STARTF_USESHOWWINDOW+SW_MAXIMIZE unless someone does ${NSD_AddStyle} $hWndParent ${WS_MAXIMIZEBOX} } } if (uMsg == WM_NOTIFY_CUSTOM_READY) { DestroyWindow(m_curwnd); m_curwnd = (HWND)wParam; goto skipPage; } if (uMsg == WM_QUERYENDSESSION) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, FALSE); return TRUE; } if (uMsg == WM_COMMAND) { int id = LOWORD(wParam); HWND hCtl = GetDlgItem(hwndDlg, id); // lParam might be NULL if (hCtl) { SendMessage(hCtl, BM_SETSTATE, FALSE, 0); if (!IsWindowEnabled(hCtl)) return 0; } if (id == IDOK) { outernotify(1); } else if (id == IDC_BACK && m_page>0) { outernotify(-1); } else if (id == IDCANCEL) { if (g_exec_flags.abort) { #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCallbackFunction(CB_ONINSTFAILED); #endif//NSIS_SUPPORT_CODECALLBACKS m_retcode=2; outernotify(NOTIFY_BYE_BYE); } else { #ifdef NSIS_SUPPORT_CODECALLBACKS if (!ExecuteCallbackFunction(CB_ONUSERABORT)) #endif//NSIS_SUPPORT_CODECALLBACKS { m_retcode=1; outernotify(NOTIFY_BYE_BYE); } } } else { // Forward WM_COMMANDs to inner dialogs, can be custom ones. // Without this, enter on buttons in inner dialogs won't work. SendMessage(m_curwnd, WM_COMMAND, wParam, lParam); } } return HandleStaticBkColor(); } #define this_page ((page*)lParam) #ifdef NSIS_CONFIG_LICENSEPAGE #define _RICHEDIT_VER 0x0200 #include #undef _RICHEDIT_VER static DWORD g_cbLicRead; DWORD CALLBACK StreamLicense(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { lstrcpyn((LPTSTR)pbBuff,(LPTSTR)(dwCookie+g_cbLicRead),cb/sizeof(TCHAR)); *pcb=lstrlen((LPTSTR)pbBuff)*sizeof(TCHAR); g_cbLicRead+=*pcb; return 0; } #ifdef _UNICODE // on-the-fly conversion of Unicode to ANSI (because Windows doesn't recognize Unicode RTF data) DWORD CALLBACK StreamLicenseRTF(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { size_t len = lstrlen(((LPWSTR) dwCookie)+g_cbLicRead); len = min(len, cb/sizeof(WCHAR)); *pcb=WideCharToMultiByte(CP_ACP,0,((LPWSTR) dwCookie)+g_cbLicRead,(int)len,(char*)pbBuff,cb,NULL,NULL); // RTF uses only ASCII characters, so we can assume "number of output bytes" = "number of source WChar consumed" g_cbLicRead+=*pcb; return 0; } #endif static INT_PTR CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { page *m_this_page=g_this_page; HWND hwLicense; #define LicIgnoreWMCommand g_cbLicRead // g_cbLicRead is only used in WM_INITDIALOG during EM_STREAMIN if (uMsg == WM_INITDIALOG) { TCHAR *l = (TCHAR *)GetNSISStringNP(GetNSISTab(this_page->parms[1])); int lt = *l; EDITSTREAM es = { (DWORD_PTR)(++l), 0, #ifdef _UNICODE lt==SF_RTF?StreamLicenseRTF:StreamLicense #else StreamLicense #endif }; int selected = (this_page->flags & PF_LICENSE_SELECTED) | !(this_page->flags & PF_LICENSE_FORCE_SELECTION); SetUITextFromLang(IDC_LICENSEAGREE,this_page->parms[2]); SetUITextFromLang(IDC_LICENSEDISAGREE,this_page->parms[3]); CheckDlgButton(hwndDlg,IDC_LICENSEAGREE+!selected,BST_CHECKED); EnableNext(selected); hwLicense=GetUIItem(IDC_EDIT1); SetActiveCtl(hwLicense); SendMessage(hwLicense,EM_AUTOURLDETECT,TRUE,0); #define lbg g_header->license_bg SendMessage(hwLicense,EM_SETBKGNDCOLOR,0,lbg>=0?lbg:GetSysColor(-lbg)); #undef lbg SendMessage(hwLicense,EM_SETEVENTMASK,0,ENM_LINK|ENM_KEYEVENTS); //XGE 8th September 2002 Or'd in ENM_KEYEVENTS SendMessage(hwLicense,EM_EXLIMITTEXT,0,mystrlen(l)); g_cbLicRead = 0; SendMessage(hwLicense,EM_STREAMIN,lt,(LPARAM)&es); LicIgnoreWMCommand = 0; return FALSE; } if (uMsg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && !LicIgnoreWMCommand) { if (m_this_page->flags & PF_LICENSE_FORCE_SELECTION) { int is = (int) (SendMessage(GetUIItem(IDC_LICENSEAGREE), BM_GETCHECK, 0, 0) & BST_CHECKED); m_this_page->flags &= ~PF_LICENSE_SELECTED; m_this_page->flags |= is; EnableNext(is); SetNextDef(); } } if (uMsg == WM_NOTIFY) { hwLicense=GetUIItem(IDC_EDIT1); #define nmhdr ((NMHDR *)lParam) #define enlink ((ENLINK *)lParam) #define msgfilter ((MSGFILTER *)lParam) if (nmhdr->code==EN_LINK) { if (enlink->msg==WM_LBUTTONDOWN) { TEXTRANGE tr = { { enlink->chrg.cpMin, enlink->chrg.cpMax, }, ps_tmpbuf }; if (tr.chrg.cpMax-tr.chrg.cpMin < COUNTOF(ps_tmpbuf)) { SendMessage(hwLicense,EM_GETTEXTRANGE,0,(LPARAM)&tr); SetCursor(LoadCursor(0, IDC_WAIT)); LaunchURL(hwndDlg,tr.lpstrText,SW_SHOWNORMAL); SetCursor(LoadCursor(0, IDC_ARROW)); } } } //Ximon Eighteen 8th September 2002 Capture return key presses in the rich //edit control now that the control gets the focus rather than the default //push button. When the user presses return ask the outer dialog to move //the installer onto the next page. MSDN docs say return non-zero if the //rich edit control should NOT process this message, hence the return 1. // //This is required because the RichEdit control is eating all the key hits. //It does try to release some and convert VK_ESCAPE to WM_CLOSE, VK_ENTER //to a push on the default button and VM_TAB to WM_NEXTDLGCTL. But sadly it //it sends all of these messages to its parent instead of just letting the //dialog manager handle them. Instead of properly handling WM_GETDLGCODE, //it mimics the dialog manager. if (nmhdr->code==EN_MSGFILTER) { if (msgfilter->msg==WM_KEYDOWN) { if (msgfilter->wParam==VK_RETURN) { SendMessage(g_hwnd, WM_COMMAND, IDOK, 0); } if (msgfilter->wParam==VK_ESCAPE) { SendMessage(g_hwnd, WM_CLOSE, 0, 0); } return 1; } } #undef nmhdr #undef enlink #undef msgfilter } if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { LicIgnoreWMCommand++; } return HandleStaticBkColor(); } #endif #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT static INT_PTR CALLBACK UninstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_INITDIALOG) { SetUITextFromLang(IDC_UNINSTFROM,this_page->parms[1]); SetUITextNT(IDC_EDIT1,g_usrvars[this_page->parms[4]]); } return HandleStaticBkColor(); } #endif #ifndef _NSIS_NO_INT64_SHR #define NRT_U64Shr32(v,s) ( (v) >> (s) ) #else #define NRT_U64Shr32 Int64ShrlMod32 #endif static void NSISCALL SetSizeText64(int dlgItem, int prefix, ULARGE_INTEGER kb64) { TCHAR scalestr[32], byte[32]; int scale = LANG_GIGA; UINT intgr, fract; if (kb64.HighPart) // >= 4 TiB ? { kb64.QuadPart = NRT_U64Shr32(kb64.QuadPart, 20); // Convert from KiB to GiB // wsprintf only supports the I64 size specifier on WinXP+. // Older versions would crash because %s will use a bad pointer if we use "%I64u%s%s". // Consequently we will only use the bottom 32-bits of the size (in GiB), // this means we will display the wrong number if you have more than 4194303 TiB of free space. intgr = kb64.LowPart; fract = 0; // We don't even attempt to calculate this } else { unsigned sh = 20, kb = kb64.LowPart; if (kb < 1024 * 1024) sh = 10, scale = LANG_MEGA; if (kb < 1024) sh = 0, scale = LANG_KILO; if (kb < (0xFFFFFFFF - ((1 << 20) / 20))) // check for overflow kb += (1 << sh) / 20; // round numbers for better display (e.g. 1.59 => 1.6) intgr = kb >> sh; // 0x00FFFFFF mask is used to prevent overflow that causes bad results fract = (((kb & 0x00FFFFFF) * 10) >> sh) % 10; } #if _MSC_VER == 1200 // patch #1982084 wsprintf( GetNSISString(g_tmp, prefix) + mystrlen(g_tmp), #else GetNSISString(g_tmp, prefix); wsprintf( g_tmp + mystrlen(g_tmp), #endif _T("%u.%u%s%s"), intgr, fract, GetNSISString(scalestr, scale), GetNSISString(byte, LANG_BYTE) ); my_SetDialogItemText(m_curwnd,dlgItem,g_tmp); } static void NSISCALL SetSizeText(int dlgItem, int prefix, unsigned kb) { ULARGE_INTEGER kb64; kb64.QuadPart = kb; SetSizeText64(dlgItem, prefix, kb64); } static int NSISCALL _sumsecsfield(int idx) { int total = 0; int x = num_sections; section *s = g_sections; while (x--) { #ifdef NSIS_CONFIG_COMPONENTPAGE if (s->flags & SF_SELECTED) #endif total += ((int *)s)[idx]; s++; } return total; } #define sumsecsfield(x) _sumsecsfield(SECTION_OFFSET(x)) static INT_PTR CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int dontsetdefstyle; page *thispage = g_this_page; TCHAR *dir = g_usrvars[thispage->parms[4]]; int browse_text = thispage->parms[3]; if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { GetUIText(IDC_DIR,dir); validate_filename(dir); #ifdef NSIS_CONFIG_LOG #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) build_g_logfile(); #endif if (GetUIItem(IDC_CHECK1) != NULL) log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1); #endif } if (uMsg == WM_INITDIALOG) { HWND hDir = GetUIItem(IDC_DIR); #ifdef NSIS_CONFIG_LOG if (GetAsyncKeyState(VK_SHIFT)&0x8000) { HWND h=GetUIItem(IDC_CHECK1); SetUITextFromLang(IDC_CHECK1,LANG_LOG_INSTALL_PROCESS); ShowWindow(h,SW_SHOWNA); } #endif if (validpathspec(dir) && !skip_root(dir)) addtrailingslash(dir); // workaround for bug #1209843 // // m_curwnd is only updated once WM_INITDIALOG returns. // my_SetWindowText triggers an EN_CHANGE message that // triggers a WM_IN_UPDATEMSG message that uses m_curwnd // to get the selected directory (GetUIText). // because m_curwnd is still outdated, dir variable is // filled with an empty string. by default, dir points // to $INSTDIR. // // to solve this, m_curwnd is manually set to the correct // window handle. m_curwnd=hwndDlg; my_SetWindowText(hDir,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); SetActiveCtl(hDir); { typedef HRESULT (WINAPI *SHAutoCompletePtr)(HWND, DWORD); SHAutoCompletePtr fSHAutoComplete; fSHAutoComplete = (SHAutoCompletePtr) myGetProcAddress(MGA_SHAutoComplete); if (fSHAutoComplete) { fSHAutoComplete(hDir, SHACF_FILESYSTEM); } } } if (uMsg == WM_COMMAND) { int id=LOWORD(wParam); if (id == IDC_DIR && HIWORD(wParam) == EN_CHANGE) { uMsg = WM_IN_UPDATEMSG; } if (id == IDC_BROWSE) { static TCHAR bt[NSIS_MAX_STRLEN]; BROWSEINFO bi = {0,}; LPITEMIDLIST idlist; bi.hwndOwner = hwndDlg; bi.pszDisplayName = g_tmp; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)dir; bi.lpszTitle = GetNSISString(bt, browse_text); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; idlist = SHBrowseForFolder(&bi); if (idlist) { // free idlist CoTaskMemFree(idlist); addtrailingslash(dir); if (g_header->install_directory_auto_append && dir == state_install_directory) // only append to $INSTDIR (bug #1174184) { const TCHAR *post_str = ps_tmpbuf; GetNSISStringTT(g_header->install_directory_auto_append); // display name gives just the folder name if (lstrcmpi(post_str, g_tmp)) { mystrcat(dir, post_str); } } dontsetdefstyle++; SetUITextNT(IDC_DIR,dir); } else { uMsg = WM_IN_UPDATEMSG; } } } if (uMsg == WM_IN_UPDATEMSG || uMsg == WM_NOTIFY_START) { static TCHAR s[NSIS_MAX_STRLEN]; int error = 0; UINT total, available_set = FALSE; ULARGE_INTEGER available; GetUIText(IDC_DIR,dir); if (!is_valid_instpath(dir)) error = NSIS_INSTDIR_INVALID; /** * This part is tricky. We need to make sure a few things: * * 1. GetDiskFreeSpaceEx is always called at least once for large HD. * Even if skip_root() returned NULL (e.g. "C:"). * Note that trimslashtoend() will nullify "C:". * 2. GetDiskFreeSpaceEx is called with the deepest valid directory. * e.g. C:\drive when the user types C:\drive\folder1\folder2. * This makes sure NTFS mount points are treated properly (#1946112). * 3. `s' stays valid after the loop for GetDiskFreeSpace. * This means there is no cutting beyond what skip_root() returns. * Or `s' could be recreated when GetDiskFreeSpace is called. * 4. If GetDiskFreeSpaceEx doesn't exist, GetDiskFreeSpace is used. * 5. Both functions require a trailing backslash * 6. `dir' is never modified. * */ mystrcpy(s,dir); // Test for and use the GetDiskFreeSpaceEx API { BOOL (WINAPI *GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = #ifdef _WIN64 GetDiskFreeSpaceEx; #else myGetProcAddress(MGA_GetDiskFreeSpaceEx); if (GDFSE) #endif { ULARGE_INTEGER a, b; TCHAR *p, *pw = NULL; while (pw != s) // trimslashtoend() cut the entire string { if (GDFSE(s, &available, &a, &b)) { available.QuadPart = NRT_U64Shr32(available.QuadPart, 10); available_set++; break; } if (pw) // if pw was set, remove the backslash so trimslashtoend() will cut a new one *pw = 0; p = trimslashtoend(s); // trim last backslash // bring it back, but make the next char null pw = p; *pw = 0; --pw; *pw = _T('\\'); } } } #ifndef _WIN64 if (!available_set) { DWORD spc, bps, fc, tc; TCHAR *root; // GetDiskFreeSpaceEx accepts any path, but GetDiskFreeSpace accepts only the root mystrcpy(s,dir); root=skip_root(s); if (root) *root=0; // GetDiskFreeSpaceEx is not available if (GetDiskFreeSpace(s, &spc, &bps, &fc, &tc)) { available.QuadPart = (int)MulDiv(bps * spc, fc, 1 << 10); available_set++; } } #endif total = (UINT) sumsecsfield(size_kb); if (available_set) if (available.QuadPart < total) error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; if (LANG_STR_TAB(LANG_SPACE_REQ)) { SetSizeText(IDC_SPACEREQUIRED,LANG_SPACE_REQ,total); if (available_set) SetSizeText64(IDC_SPACEAVAILABLE,LANG_SPACE_AVAIL,available); else SetUITextNT(IDC_SPACEAVAILABLE,_T("")); } g_exec_flags.instdir_error = error; #ifdef NSIS_SUPPORT_CODECALLBACKS if (!error) error = ExecuteCallbackFunction(CB_ONVERIFYINSTDIR); #endif if (thispage->flags & PF_DIR_NO_BTN_DISABLE) error = 0; EnableNext(!error); if (!error && !dontsetdefstyle) SetNextDef(); dontsetdefstyle = 0; } return HandleStaticBkColor(); } #ifdef NSIS_CONFIG_COMPONENTPAGE static void FORCE_INLINE NSISCALL RefreshComponents(HWND hwTree, HTREEITEM *items) { TVITEM item; int i, flags, state; section *sec; item.stateMask = TVIS_STATEIMAGEMASK | TVIS_EXPANDED | TVIS_BOLD; for (i = 0, sec = g_sections; i < num_sections; i++, sec++) { if (!items[i]) { continue; } flags = sec->flags; item.hItem = items[i]; item.mask = TVIF_STATE; if (flags & SF_NAMECHG) { item.mask |= TVIF_TEXT; item.pszText = sec->name; sec->flags &= ~SF_NAMECHG; } if (flags & SF_PSELECTED) { state = 3; } else { state = 1 + (flags & SF_SELECTED); // SF_SELECTED == 1 if (flags & SF_RO) state += 3; } item.state = (flags & SF_BOLD) << 1; // (SF_BOLD << 1) == 16 == TVIS_BOLD item.state |= flags & SF_EXPAND; // TVIS_EXPANDED == SF_EXPAND item.state |= INDEXTOSTATEIMAGEMASK(state); // TVE_COLLAPSE = 1, TVE_EXPAND = 2 TreeView_Expand(hwTree, item.hItem, TVE_COLLAPSE + ((flags & SF_EXPAND) / SF_EXPAND)); TreeView_SetItem(hwTree, &item); } // workaround for bug #1397031 A.K.A #434 // // Windows 95 & NT4 doesn't erase the background of the state image // before it draws a new one. Because of this parts of the old // state image will show where the new state image is masked. // // To solve this, the following line forces the background to // be erased. sadly, this redraws the entire control. It might // be a good idea to figure out where the state images are and // redraw only those. if (IsWin95NT4()) // Checking for < IE4 is probably better but more work InvalidateRect(hwTree, NULL, TRUE); } int NSISCALL TreeGetSelectedSection(HWND tree, BOOL mouse) { HTREEITEM hItem = TreeView_GetSelection(tree); TVITEM item; if (mouse) { TVHITTESTINFO ht; DWORD dwpos = GetMessagePos(); ht.pt.x = GET_X_LPARAM(dwpos); ht.pt.y = GET_Y_LPARAM(dwpos); ScreenToClient(tree, &ht.pt); { const HTREEITEM UNUSED hDummy1 = TreeView_HitTest(tree, &ht); } #ifdef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE if (!(ht.flags & TVHT_ONITEMSTATEICON)) #else if (!(ht.flags & (TVHT_ONITEMSTATEICON|TVHT_ONITEMLABEL|TVHT_ONITEMRIGHT|TVHT_ONITEM))) #endif return -1; hItem = ht.hItem; } item.mask = TVIF_PARAM; item.hItem = hItem; TreeView_GetItem(tree, &item); return (int) item.lParam; } void NSISCALL ExecuteCallbackFunctionWithr0Int(int num,int r0) { mystrcpy(g_tmp, g_usrvars[0]); myitoa(g_usrvars[0], r0); ExecuteCallbackFunction(num); mystrcpy(g_usrvars[0], g_tmp); } static WNDPROC oldTreeWndProc; static LPARAM last_selected_tree_item; static LRESULT CALLBACK newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_CHAR && wParam == VK_SPACE) { NotifyCurWnd(WM_TREEVIEW_KEYHACK); return 0; } #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) #ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE if (uMsg == WM_MOUSEMOVE) { if (IsWindowVisible(hwnd)) { lParam = TreeGetSelectedSection(hwnd, TRUE); uMsg = WM_NOTIFY_SELCHANGE; } } #endif if (uMsg == WM_NOTIFY_SELCHANGE) { if (last_selected_tree_item != lParam) { last_selected_tree_item = lParam; ExecuteCallbackFunctionWithr0Int(CB_ONMOUSEOVERSECTION,(int)lParam); } } #endif//NSIS_SUPPORT_CODECALLBACKS && NSIS_CONFIG_ENHANCEDUI_SUPPORT return CallWindowProc(oldTreeWndProc,hwnd,uMsg,wParam,lParam); } static INT_PTR CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { const int wParamSelChangeNotifyInstTypeChanged = -1; static HTREEITEM *hTreeItems; static HIMAGELIST hImageList; HWND hwndCombo1 = GetUIItem(IDC_COMBO1); HWND hwndTree1 = GetUIItem(IDC_TREE1); extern HWND g_SectionHack;// TODO: Can we remove this? section *sections=g_sections; int *install_types=g_header->install_types; if (uMsg == WM_INITDIALOG) { int doLines=0; HTREEITEM Par; HBITMAP hBMcheck1; int x, i, noCombo=2; g_SectionHack=hwndDlg; hTreeItems=(HTREEITEM*)GlobalAlloc(GPTR,sizeof(HTREEITEM)*num_sections); hBMcheck1=LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); // LR_CREATEDIBSECTION required to load TopDown bitmaps but that breaks modern.bmp last_selected_tree_item=-1; oldTreeWndProc=(WNDPROC)SetWindowLongPtr(hwndTree1,GWLP_WNDPROC,(LONG_PTR)newTreeWndProc); hImageList = ImageList_Create(16,16, ILC_COLOR32|ILC_MASK, 6, 0); ImageList_AddMasked(hImageList,hBMcheck1,RGB(255,0,255)); { const HIMAGELIST UNUSED hDummy1 = TreeView_SetImageList(hwndTree1, hImageList, TVSIL_STATE); } if (TreeView_GetItemHeight(hwndTree1) < 16) TreeView_SetItemHeight(hwndTree1, 16); DeleteObject(hBMcheck1); for (i = 0; i < NSIS_MAX_INST_TYPES+1; i++) { if (install_types[i]) { LRESULT j; if (i != NSIS_MAX_INST_TYPES) noCombo = 0; j=SendMessage(hwndCombo1,CB_ADDSTRING,0,(LPARAM)GetNSISStringTT(install_types[i])); SendMessage(hwndCombo1,CB_SETITEMDATA,j,i); } } SetUITextFromLang(IDC_TEXT1,this_page->parms[1+noCombo]); SetUITextFromLang(IDC_TEXT2,this_page->parms[2+noCombo]); Par=NULL; for (x = 0; x < num_sections; x ++) { section *sec=sections+x; if (sec->name[0]) { TVINSERTSTRUCT tv; tv.hParent = Par; tv.hInsertAfter = TVI_LAST; tv.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_STATE; tv.item.stateMask = TVIS_EXPANDED; tv.item.lParam = x; tv.item.pszText = sec->name; tv.item.state = sec->flags & SF_EXPAND; // TVIS_EXPANDED == SF_EXPAND if (sec->flags & SF_SECGRP) { tv.item.mask |= TVIF_CHILDREN; tv.item.cChildren = 1; Par = hTreeItems[x] = TreeView_InsertItem(hwndTree1, &tv); doLines = 1; } else if (sec->flags & SF_SECGRPEND) { Par = TreeView_GetParent(hwndTree1, Par); } else { hTreeItems[x] = TreeView_InsertItem(hwndTree1, &tv); } } } if (!doLines) { SetWindowLongPtr(hwndTree1,GWL_STYLE,GetWindowLongPtr(hwndTree1,GWL_STYLE)&~(TVS_LINESATROOT)); } if (!noCombo) { ShowWindow(hwndCombo1, SW_SHOW); SetActiveCtl(hwndCombo1); } else SetActiveCtl(hwndTree1); } if (uMsg == WM_NOTIFY_START) { wParam = 0; lParam = 1; uMsg = WM_IN_UPDATEMSG; } if (uMsg == WM_NOTIFY || uMsg == WM_TREEVIEW_KEYHACK) { LPNMHDR lpnmh = (LPNMHDR) lParam; if (uMsg == WM_TREEVIEW_KEYHACK || lpnmh->idFrom == IDC_TREE1) { if (!(g_flags&CH_FLAGS_NO_CUSTOM) && (uMsg == WM_TREEVIEW_KEYHACK || lpnmh->code == NM_CLICK)) { int secid = TreeGetSelectedSection(hwndTree1, uMsg != WM_TREEVIEW_KEYHACK); if (secid >= 0) { int flags = sections[secid].flags; if ((flags & SF_RO) == 0) { if ((flags & SF_PSELECTED)) { flags ^= SF_TOGGLED; if (flags & SF_TOGGLED) { flags |= SF_SELECTED; } else { flags &= ~SF_SELECTED; } } else { flags ^= SF_SELECTED; } sections[secid].flags = flags; SectionFlagsChanged(secid); wParam = secid + 1; lParam = !(g_flags & CH_FLAGS_COMP_ONLY_ON_CUSTOM); uMsg = WM_IN_UPDATEMSG; } } // was valid click } // was click or hack #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) if (lpnmh) { if (lpnmh->code == TVN_SELCHANGED) { SendMessage(hwndTree1, WM_NOTIFY_SELCHANGE, 0, ((LPNMTREEVIEW)lpnmh)->itemNew.lParam); } if (lpnmh->code == TVN_ITEMEXPANDED) { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW) lpnmh; if (pnmtv->action == TVE_EXPAND) sections[pnmtv->itemNew.lParam].flags |= SF_EXPAND; else sections[pnmtv->itemNew.lParam].flags &= ~SF_EXPAND; } } #endif//NSIS_SUPPORT_CODECALLBACKS && NSIS_CONFIG_ENHANCEDUI_SUPPORT } } if (uMsg == WM_COMMAND && LOWORD(wParam) == IDC_COMBO1 && HIWORD(wParam) == CBN_SELCHANGE) { LRESULT t = SendMessage(hwndCombo1,CB_GETCURSEL,0,0); if (t != CB_ERR) { int whichcfg = (int) SendMessage(hwndCombo1, CB_GETITEMDATA, t, 0); if (whichcfg == CB_ERR || !install_types[whichcfg]) whichcfg = NSIS_MAX_INST_TYPES; SetInstType(whichcfg); SendMessage(hwndDlg, WM_NOTIFY_INSTTYPE_CHANGED, 0, whichcfg); wParam = wParamSelChangeNotifyInstTypeChanged; lParam = 0; uMsg = WM_IN_UPDATEMSG; } } if (uMsg == WM_MOUSEMOVE) { SendMessage(hwndTree1, WM_MOUSEMOVE, 0, 0); } if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { if (hImageList) ImageList_Destroy(hImageList); if (hTreeItems) GlobalFree(hTreeItems); hImageList = NULL; hTreeItems = NULL; g_SectionHack = NULL; } if (uMsg == WM_IN_UPDATEMSG) { RefreshSectionGroups(); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_COMPONENTPAGE) if (wParam != 0) { int secid = (int) wParam; if (wParamSelChangeNotifyInstTypeChanged != secid) --secid; ExecuteCallbackFunctionWithr0Int(CB_ONSELCHANGE,secid); } #endif//NSIS_SUPPORT_CODECALLBACKS && NSIS_CONFIG_COMPONENTPAGE if (lParam) { int i, cbi; int inst_type = GetInstType(hTreeItems); SetInstType(inst_type); for (i = 0, cbi = 0; i < inst_type; i++) { if (install_types[i]) { cbi++; } } SendMessage(hwndCombo1, CB_SETCURSEL, cbi, 0); lParam = inst_type; uMsg = WM_NOTIFY_INSTTYPE_CHANGED; } RefreshSectionGroups(); RefreshComponents(hwndTree1, hTreeItems); if (LANG_STR_TAB(LANG_SPACE_REQ)) { SetSizeText(IDC_SPACEREQUIRED,LANG_SPACE_REQ,sumsecsfield(size_kb)); } } if (uMsg == WM_NOTIFY_INSTTYPE_CHANGED) { if (g_flags & CH_FLAGS_COMP_ONLY_ON_CUSTOM) { int c = (lParam == NSIS_MAX_INST_TYPES ? 1 : 0) << 3;// SW_SHOWNA=8, SW_HIDE=0 ShowWindow(hwndTree1, c); ShowWindow(GetUIItem(IDC_TEXT2), c); } } return HandleStaticBkColor(); } #endif//NSIS_CONFIG_COMPONENTPAGE #endif//NSIS_CONFIG_VISIBLE_SUPPORT void NSISCALL update_status_text(int strtab, const TCHAR *text) { static TCHAR tmp[NSIS_MAX_STRLEN*2]; LVITEM new_item; HWND linsthwnd = insthwnd; if (linsthwnd) { int updateflag = g_exec_flags.status_update; int tmplen; if (!(updateflag & 1)) GetNSISString(tmp, strtab); tmplen = mystrlen(tmp); if (text) { if (tmplen + mystrlen(text) >= sizeof(tmp)) return; mystrcat(tmp, text); } if ((updateflag & 4) == 0) my_SetWindowText(insthwnd2, tmp); if ((updateflag & 2) == 0) { new_item.mask = LVIF_TEXT; new_item.pszText = tmp; new_item.iItem = ListView_GetItemCount(linsthwnd) - (updateflag & 1); new_item.iSubItem = 0; // LVM_INSERTITEM - LVM_SETITEM = 1 SendMessage(linsthwnd, LVM_INSERTITEM - (updateflag & 1), 0, (LPARAM) &new_item); ListView_EnsureVisible(linsthwnd, new_item.iItem, 0); } if (updateflag & 1) tmp[tmplen] = 0; } } static DWORD WINAPI install_thread(LPVOID p) { int m_inst_sec=num_sections; HWND progresswnd = (HWND)p; section *s = g_sections; #if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT) { extern HRESULT g_hres; g_hres|=OleInitialize(NULL); } #endif // workaround for bug #1400995 // // for an unexplained reason, MessageBox with MB_TOPMOST // will fail, if no other messages were sent from this // thread to the GUI thread before it. // // the source of the problem couldn't be found, so a // WM_NULL is sent to work around it. NotifyCurWnd(WM_NULL); while (m_inst_sec--) { #ifdef NSIS_CONFIG_COMPONENTPAGE if (s->flags&SF_SELECTED) #endif { log_printf2(_T("Section: \"%s\""),s->name); if (ExecuteCodeSegment(s->code,progresswnd)) { g_exec_flags.abort++; break; } } #ifdef NSIS_CONFIG_COMPONENTPAGE else { log_printf2(_T("Skipping section: \"%s\""),s->name); } #endif s++; } NotifyCurWnd(WM_NOTIFY_INSTPROC_DONE); #if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT) OleUninitialize(); #endif return g_exec_flags.abort; } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT static INT_PTR CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND linsthwnd=insthwnd; if (uMsg == WM_INITDIALOG) { RECT r; LVCOLUMN lvc = {LVCF_WIDTH, 0, -1, 0, 0, -1}; int lb_bg=g_header->lb_bg,lb_fg=g_header->lb_fg; insthwndbutton=GetUIItem(IDC_SHOWDETAILS); insthwnd2=GetUIItem(IDC_INTROTEXT); linsthwnd=insthwnd=GetUIItem(IDC_LIST1); SetActiveCtl(insthwndbutton); progress_bar_len=sumsecsfield(code_size); progress_bar_pos=0; log_printf3(_T("New install of \"%s\" to \"%s\""),GetNSISStringTT(LANG_NAME),state_install_directory); GetClientRect(linsthwnd, &r); lvc.cx = r.right - GetSystemMetrics(SM_CXVSCROLL); ListView_InsertColumn(linsthwnd, 0, &lvc); ListView_SetExtendedListViewStyleEx(linsthwnd, LVS_EX_LABELTIP, LVS_EX_LABELTIP); if (lb_bg >= 0) { ListView_SetBkColor(linsthwnd, lb_bg); ListView_SetTextBkColor(linsthwnd, lb_bg); } if (lb_fg >= 0) { ListView_SetTextColor(linsthwnd, lb_fg); } SetUITextFromLang(IDC_SHOWDETAILS,this_page->parms[1]); if (g_flags&(CH_FLAGS_DETAILS_SHOWDETAILS|CH_FLAGS_DETAILS_NEVERSHOW)) { ShowWindow(insthwndbutton,SW_HIDE); if (!(g_flags&CH_FLAGS_DETAILS_NEVERSHOW)) ShowWindow(linsthwnd,SW_SHOWNA); else insthwndbutton=NULL; SetActiveCtl(insthwnd2); } { HWND progresswnd=GetUIItem(IDC_PROGRESS); SendMessage(progresswnd,PBM_SETRANGE,0,MAKELPARAM(0,30000)); if (g_flags&CH_FLAGS_PROGRESS_COLORED) { SendMessage(progresswnd,PBM_SETBARCOLOR,0,lb_fg); SendMessage(progresswnd,PBM_SETBKCOLOR,0,lb_bg); } } return FALSE; } if (uMsg == WM_NOTIFY_START) { DWORD id; CloseHandle(CreateThread(NULL,0,install_thread,GetUIItem(IDC_PROGRESS),0,&id)); } if (uMsg == WM_COMMAND && LOWORD(wParam) == IDC_SHOWDETAILS) { ShowWindow(insthwndbutton,SW_HIDE); ShowWindow(linsthwnd,SW_SHOWNA); SetActiveCtl(linsthwnd); } if (uMsg == WM_NOTIFY_INSTPROC_DONE) { if (g_quit_flag) { m_retcode=2; outernotify(NOTIFY_BYE_BYE); } else { ShowWindow(g_hwnd,SW_SHOWNA); if (!g_exec_flags.abort) update_status_text(g_this_page->parms[2],0); outernotify(1); } } //>>>Ximon Eighteen aka Sunjammer 30th August 2002 //+++Popup "Copy Details To Clipboard" menu when RMB clicked in DetailView if (uMsg == WM_CONTEXTMENU && wParam == (WPARAM) linsthwnd) { int count = ListView_GetItemCount(linsthwnd); if (count > 0) { HMENU menu = CreatePopupMenu(); POINT pt; AppendMenu(menu,MF_STRING,1,GetNSISStringTT(LANG_COPYDETAILS)); pt.x = GET_X_LPARAM(lParam), pt.y = GET_Y_LPARAM(lParam); if (lParam == (LPARAM)((INT_PTR)-1)) { RECT r; GetWindowRect(linsthwnd,&r); pt.x = r.left, pt.y = r.top; } if (1==TrackPopupMenu(menu,TPM_NONOTIFY|TPM_RETURNCMD,pt.x,pt.y,0,hwndDlg,0)) { int i,total = 1; // 1 for the null char LVITEM item; HGLOBAL memory; LPTSTR ptr;//,endPtr; // 1st pass - determine clipboard memory required. item.iSubItem = 0; item.pszText = g_tmp; item.cchTextMax = COUNTOF(g_tmp); i = count; while (i--) // Add 2 for the CR/LF combination that must follow every line. total += 2+(int)SendMessage(linsthwnd,LVM_GETITEMTEXT,i,(LPARAM)&item); // 2nd pass - store detail view strings on the clipboard // Clipboard MSDN docs say mem must be GMEM_MOVEABLE OpenClipboard(0); EmptyClipboard(); memory = GlobalAlloc(GHND,total*sizeof(TCHAR)); ptr = GlobalLock(memory); //endPtr = ptr+total-2; // -2 to allow for CR/LF i = 0; do { item.pszText = ptr; ptr += SendMessage(linsthwnd,LVM_GETITEMTEXT,i,(LPARAM)&item); *ptr++ = _T('\r'); *ptr++ = _T('\n'); } while (++i < count); // memory is auto zeroed when allocated with GHND - *ptr = 0; GlobalUnlock(memory); #ifdef _UNICODE SetClipboardData(CF_UNICODETEXT,memory); #else SetClipboardData(CF_TEXT,memory); #endif CloseClipboard(); } } return FALSE; } //<<< return HandleStaticBkColor(); } #endif//NSIS_CONFIG_VISIBLE_SUPPORT nsis-3.11/Source/exehead/afxres.h000077500000000000000000000007151477201124000167220ustar00rootroot00000000000000/* * afxres.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "../Platform.h" #ifndef IDC_STATIC #define IDC_STATIC -1 #endif nsis-3.11/Source/exehead/api.h000077500000000000000000000064021477201124000162020ustar00rootroot00000000000000/* * apih * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef _NSIS_EXEHEAD_API_H_ #define _NSIS_EXEHEAD_API_H_ // Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version // The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) // When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} #define NSISPIAPIVER_1_0 0x00010000 #define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 // NSIS Plug-In Callback Messages enum NSPIM { NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup NSPIM_GUIUNLOAD, // Called after .onGUIEnd }; // Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() // Return NULL for unknown messages // Should always be __cdecl for future expansion possibilities typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); // extra_parameters data structure containing other interesting stuff // besides the stack, variables and HWND passed on to plug-ins. typedef struct { int autoclose; // SetAutoClose int all_user_var; // SetShellVarContext: User context = 0, Machine context = 1 int exec_error; // IfErrors/ClearErrors/SetErrors int abort; // IfAbort int exec_reboot; // IfRebootFlag/SetRebootFlag (NSIS_SUPPORT_REBOOT) int reboot_called; // NSIS_SUPPORT_REBOOT int XXX_cur_insttype; // Deprecated int plugin_api_version; // Plug-in ABI. See NSISPIAPIVER_CURR (Note: used to be XXX_insttype_changed) int silent; // IfSilent/SetSilent (NSIS_CONFIG_SILENT_SUPPORT) int instdir_error; // GetInstDirError int rtl; // IfRtlLanguage: 1 if $LANGUAGE is a RTL language int errlvl; // SetErrorLevel int alter_reg_view; // SetRegView: Default View = 0, Alternative View = (sizeof(void*) > 4 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY) int status_update; // SetDetailsPrint } exec_flags_t; #ifndef NSISCALL # define NSISCALL __stdcall #endif #if !defined(_WIN32) && !defined(LPTSTR) # define LPTSTR TCHAR* #endif typedef struct { exec_flags_t *exec_flags; int (NSISCALL *ExecuteCodeSegment)(int, HWND); void (NSISCALL *validate_filename)(LPTSTR); int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors } extra_parameters; // Definitions for page showing plug-ins // See Ui.c to understand better how they're used // sent to the outer window to tell it to go to the next inner window #define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) // custom pages should send this message to let NSIS know they're ready #define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) // sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning #define NOTIFY_BYE_BYE 'x' #endif /* _NSIS_EXEHEAD_API_H_ */ nsis-3.11/Source/exehead/bgbg.c000077500000000000000000000053101477201124000163220ustar00rootroot00000000000000/* * bgbg.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/22/2007 */ #include "../Platform.h" #include "resource.h" #include "config.h" #include "fileform.h" #include "state.h" #include "ui.h" #include "util.h" #ifdef NSIS_SUPPORT_BGBG #define c1 header->bg_color1 #define c2 header->bg_color2 LRESULT CALLBACK BG_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_WINDOWPOSCHANGING: { LPWINDOWPOS wp = (LPWINDOWPOS) lParam; wp->flags |= SWP_NOACTIVATE; wp->hwndInsertAfter = g_hwnd; break; } case WM_PAINT: { header *header = g_header; PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd,&ps); RECT r; LOGBRUSH lh; int ry; lh.lbStyle = BS_SOLID; GetClientRect(hwnd,&r); // this portion by Drew Davidson, drewdavidson@mindspring.com ry=r.bottom; r.bottom=0; // JF: made slower, reduced to 4 pixels high, because I like how it looks better/ while (r.top < ry) { int rv,gv,bv; HBRUSH brush; rv = (GetRValue(c2) * r.top + GetRValue(c1) * (ry-r.top)) / ry; gv = (GetGValue(c2) * r.top + GetGValue(c1) * (ry-r.top)) / ry; bv = (GetBValue(c2) * r.top + GetBValue(c1) * (ry-r.top)) / ry; lh.lbColor = RGB(rv,gv,bv); brush = CreateBrushIndirect(&lh); // note that we don't need to do "SelectObject(hdc, brush)" // because FillRect lets us specify the brush as a parameter. r.bottom+=4; FillRect(hdc, &r, brush); DeleteObject(brush); r.top+=4; } if (header->bg_textcolor != -1) { HFONT newFont = CreateFontIndirect((LOGFONT*) header->blocks[NB_BGFONT].offset); if (newFont) { HFONT oldFont; r.left=16; r.top=8; SetBkMode(hdc,TRANSPARENT); SetTextColor(hdc,header->bg_textcolor); oldFont = SelectObject(hdc,newFont); DrawText(hdc,g_caption,-1,&r,DT_TOP|DT_LEFT|DT_SINGLELINE|DT_NOPREFIX); SelectObject(hdc,oldFont); DeleteObject(newFont); } } EndPaint(hwnd,&ps); } return 0; } return DefWindowProc(hwnd,uMsg,wParam,lParam); } #endif //NSIS_SUPPORT_BGBG nsis-3.11/Source/exehead/bitmap1.bmp000077500000000000000000000015661477201124000173230ustar00rootroot00000000000000BMvv(`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÝÝÝØØÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ×wwwwww}×wwwwww}×wwwwww}×wwwwww}×wwwwww}ÝÝÝÝÝÝÝØØ}Ø}Ø}Ø}Ø}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Øwwwwp}Øwwwwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø Ý ÝÝÐ}Ø Ý}ÝÝÐ}Øwwwwp}Øw‡wwp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÐÝÝÐ}Ø ×wÝÝÐ}Øwwwwp}Øxˆwwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÐ}Ø ww}ÝÐ}Øwwwwp}؈ˆ‡wp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÐÝÐ}Ø w×wÝÐ}Øwwwwp}؈xˆwp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø Ý Ð}Ø wÝw}Ð}Øwwwwp}؈wˆ‡p}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÐÐ}Ø ÝÝ×wÐ}Øwwwwp}Øwwxˆp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÝÐ}Ø ÝÝÝwÐ}Øwwwwp}Øwwwˆp}ÝÝÝÝÝÝÝØ ÝÝÝÝÐ}Ø ÝÝÝÐÐ}Ø ÝÝÝ×Ð}Øwwwwp}Øwwwxp}ÝÝÝÝÝÝÝØØ ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Ø ÝÝÝÝÐ}Øwwwwp}Øwwwwp}ÝÝÝÝÝÝÝØ}Ø}Ø}Ø}Ø}ÝÝÝÝÝÝÝØØˆˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}؈ˆˆˆˆˆ}ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝnsis-3.11/Source/exehead/components.c000077500000000000000000000064471477201124000176220ustar00rootroot00000000000000/* * components.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/22/2007 */ #include "../Platform.h" #include "config.h" #include "ui.h" #include "fileform.h" void NSISCALL SectionFlagsChanged(unsigned int index) { section *sections = g_sections; int flags = sections[index].flags; if (flags & SF_SECGRP) { unsigned int i = index + 1; unsigned int level = 0; for (; i < (unsigned int) num_sections; i++) { if (sections[i].flags & SF_SECGRP) { level++; continue; } if (sections[i].flags & SF_SECGRPEND) { if (level-- == 0) { break; } continue; } if ((sections[i].flags & SF_RO) == 0) { sections[i].flags &= ~SF_SELECTED; sections[i].flags |= (flags & SF_SELECTED); } } } } unsigned int NSISCALL _RefreshSectionGroups(unsigned int i, int not_first_call) { unsigned int selected = 0; unsigned int not_selected = 0; section *sections = g_sections; section *sec = §ions[i]; if (sec->flags & SF_SECGRP) { if (not_first_call) { sec->flags &= ~(SF_SELECTED | SF_PSELECTED); i++; } } while (i < (unsigned int) num_sections) { int flags = sections[i].flags; int ni = i + 1; if (flags & SF_SECGRP) { ni = _RefreshSectionGroups(i, 1); flags = sections[i].flags; } if (flags & SF_SECGRPEND) { if (selected) { if (not_selected) { sec->flags |= SF_PSELECTED; } else { sec->flags |= SF_SELECTED; sec->flags &= ~SF_TOGGLED; } } return ni; } if (flags & SF_PSELECTED) { selected++; } if (flags & SF_SELECTED) { selected++; } else { not_selected++; } i = ni; } return 0; } #ifdef NSIS_CONFIG_COMPONENTPAGE void NSISCALL SetInstType(int inst_type) { unsigned int i = 0; section *sections = g_sections; if ((unsigned int) inst_type >= NSIS_MAX_INST_TYPES) { return; } for (; i < (unsigned int) num_sections; i++) { if (sections[i].flags & (SF_SECGRP | SF_SECGRPEND)) { continue; } if (sections[i].install_types & (1 << inst_type)) { sections[i].flags |= SF_SELECTED; } else { sections[i].flags &= ~SF_SELECTED; } } } unsigned int NSISCALL GetInstType(HTREEITEM *items) { unsigned int i, j; section *sections = g_sections; for (i = 0; i < NSIS_MAX_INST_TYPES; i++) { if (!g_header->install_types[i]) { continue; } for (j = 0; j < (unsigned int) num_sections; j++) { if (sections[j].flags & (SF_SECGRP | SF_SECGRPEND)) { continue; } if (items && !items[j]) { continue; } if ((sections[j].install_types & (1 << i)) == ((sections[j].flags & SF_SELECTED) << i)) { continue; } else { break; } } if (j == (unsigned int) num_sections) { break; } } return i; } #endif//NSIS_CONFIG_COMPONENTPAGE nsis-3.11/Source/exehead/components.h000077500000000000000000000016001477201124000176110ustar00rootroot00000000000000/* * components.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * * Reviewed for Unicode support by Jim Park -- 08/22/2007 */ #ifndef ___COMPONENTS_H___ #define ___COMPONENTS_H___ void NSISCALL SectionFlagsChanged(unsigned int index); #define RefreshSectionGroups() _RefreshSectionGroups(0, 0) unsigned int NSISCALL _RefreshSectionGroups(unsigned int i, int not_first_call); #ifdef NSIS_CONFIG_COMPONENTPAGE void NSISCALL SetInstType(int inst_type); unsigned int NSISCALL GetInstType(HTREEITEM *items); #endif//NSIS_CONFIG_COMPONENTPAGE #endif//!___COMPONENTS_H___ nsis-3.11/Source/exehead/config.h000077500000000000000000000106701477201124000167000ustar00rootroot00000000000000/* * config.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/22/2007 */ #ifndef NSIS_CONFIG_H #define NSIS_CONFIG_H #ifndef APSTUDIO_INVOKED // keep msdev's resource editor from mangling the .rc file #include #ifndef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_LICENSEPAGE #undef NSIS_CONFIG_LICENSEPAGE #endif #ifdef NSIS_CONFIG_COMPONENTPAGE #undef NSIS_CONFIG_COMPONENTPAGE #endif #ifdef NSIS_SUPPORT_BGBG #undef NSIS_SUPPORT_BGBG #endif #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT #undef NSIS_CONFIG_ENHANCEDUI_SUPPORT #endif #endif #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT #ifndef NSIS_SUPPORT_HWNDS #define NSIS_SUPPORT_HWNDS #endif #endif #ifdef NSIS_CONFIG_LOG_ODS #ifndef NSIS_CONFIG_LOG #error NSIS_CONFIG_LOG_ODS relies on NSIS_CONFIG_LOG, but NSIS_CONFIG_LOG is not defined #endif #endif #ifdef NSIS_CONFIG_LOG_STDOUT #ifndef NSIS_CONFIG_LOG #error NSIS_CONFIG_LOG_STDOUT relies on NSIS_CONFIG_LOG, but NSIS_CONFIG_LOG is not defined #endif #endif #ifdef NSIS_CONFIG_LOG_TIMESTAMP #ifndef NSIS_CONFIG_LOG #error NSIS_CONFIG_LOG_TIMESTAMP relies on NSIS_CONFIG_LOG, but NSIS_CONFIG_LOG is not defined #endif #endif #if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) #define _NSIS_CONFIG_VERIFYDIALOG #endif #if defined(NSIS_CONFIG_UNINSTALL_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) #define _NSIS_CONFIG_UNINSTDLG #endif #if defined(NSIS_CONFIG_UNINSTALL_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) #define _NSIS_CONFIG_UNINSTDLG #endif #ifdef EXEHEAD #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT #ifndef NSIS_COMPRESS_USE_ZLIB #ifndef NSIS_COMPRESS_USE_BZIP2 #ifndef NSIS_COMPRESS_USE_LZMA #error compression is enabled but zlib, bzip2 and lzma are disabled. #endif #endif #endif #endif #ifdef NSIS_COMPRESS_USE_ZLIB #ifdef NSIS_COMPRESS_USE_BZIP2 #error both zlib and bzip2 are enabled. #endif #ifdef NSIS_COMPRESS_USE_LZMA #error both zlib and lzma are enabled. #endif #endif #ifdef NSIS_COMPRESS_USE_BZIP2 #ifdef NSIS_COMPRESS_USE_LZMA #error both bzip2 and lzma are enabled. #endif #endif #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT #ifdef NSIS_COMPRESS_WHOLE #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifndef _NSIS_CONFIG_VERIFYDIALOG #define _NSIS_CONFIG_VERIFYDIALOG #endif #endif #endif #endif #endif // EXEHEAD #ifdef NSIS_COMPRESS_WHOLE #ifndef NSIS_CONFIG_COMPRESSION_SUPPORT #error NSIS_COMPRESS_WHOLE defined, NSIS_CONFIG_COMPRESSION_SUPPORT not #endif #endif #ifdef NSIS_CONFIG_CRC_ANAL #ifndef NSIS_CONFIG_CRC_SUPPORT #error NSIS_CONFIG_CRC_ANAL defined but NSIS_CONFIG_CRC_SUPPORT not #endif #endif #ifndef NSIS_COMPRESS_BZIP2_LEVEL #define NSIS_COMPRESS_BZIP2_LEVEL 9 #endif #ifdef NSIS_CONFIG_PLUGIN_SUPPORT #ifndef NSIS_SUPPORT_RMDIR #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_RMDIR, but NSIS_SUPPORT_RMDIR is not defined #endif #ifndef NSIS_SUPPORT_FILE #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_FILE, but NSIS_SUPPORT_FILE is not defined #endif #ifndef NSIS_SUPPORT_ACTIVEXREG #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_ACTIVEXREG, but NSIS_SUPPORT_ACTIVEXREG is not defined #endif #ifndef NSIS_SUPPORT_STACK #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_STACK, but NSIS_SUPPORT_STACK is not defined #endif #ifndef NSIS_SUPPORT_FNUTIL #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_FNUTIL, but NSIS_SUPPORT_FNUTIL is not defined #endif #ifndef NSIS_SUPPORT_DELETE #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_DELETE, but NSIS_SUPPORT_DELETE is not defined #endif #ifndef NSIS_SUPPORT_MESSAGEBOX #error NSIS_CONFIG_PLUGIN_SUPPORT relies on NSIS_SUPPORT_MESSAGEBOX, but NSIS_SUPPORT_MESSAGEBOX is not defined #endif #endif #if NSIS_MAX_INST_TYPES > 32 #error NSIS_MAX_INST_TYPES > 32 #endif #ifndef NSIS_DEFAULT_LANG #define NSIS_DEFAULT_LANG 1033 #endif #endif//!APSTUDIO_INVOKED #endif // NSIS_CONFIG_H nsis-3.11/Source/exehead/exec.c000077500000000000000000001517311477201124000163560ustar00rootroot00000000000000/* * exec.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #include "../Platform.h" #include #include "fileform.h" #include "util.h" #include "state.h" #include "ui.h" #include "components.h" #include "exec.h" #include "plugin.h" #include "lang.h" #include "resource.h" #include "api.h" #include "../tchar.h" #define EXEC_ERROR 0x7FFFFFFF #ifdef NSIS_CONFIG_COMPONENTPAGE HWND g_SectionHack; #endif #ifdef NSIS_SUPPORT_STACK typedef struct _stack_t { struct _stack_t *next; TCHAR text[NSIS_MAX_STRLEN]; } stack_t; static stack_t *g_st; #endif exec_flags_t g_exec_flags_last_used; execflags_and_osinfo g_execflags_and_osinfo; extra_parameters plugin_extra_parameters = { &g_exec_flags, &ExecuteCodeSegment, &validate_filename, &RegisterPluginCallback }; #if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT) HRESULT g_hres; #endif static int NSISCALL ExecuteEntry(entry *entry_); /** * If v is negative, then the address to resolve is actually * stored in the global user variables. Convert the value * to integer and return. */ int NSISCALL resolveaddr(int v) { if (v < 0) { return myatoi(g_usrvars[-(v+1)]); } return v; } int NSISCALL ExecuteCodeSegment(int pos, HWND hwndProgress) { while (pos >= 0) { int rv; if (g_entries[pos].which == EW_RET) return 0; rv=ExecuteEntry(g_entries + pos); if (rv == EXEC_ERROR) return EXEC_ERROR; rv=resolveaddr(rv); if (!rv) { rv++; pos++; } else { int t=pos; rv--; // rv is decremented here by 1, since it was +1 on the other end. pos=rv; // set new position rv-=t; // set rv to delta for progress adjustment } if (hwndProgress) { extern int progress_bar_pos, progress_bar_len; progress_bar_pos+=rv; SendMessage(hwndProgress,PBM_SETPOS,MulDiv(progress_bar_pos,30000,progress_bar_len),0); } } return 0; } #ifdef NSIS_SUPPORT_CODECALLBACKS int NSISCALL ExecuteCallbackFunction(int num) { return ExecuteCodeSegment(*(&g_header->code_onInit + num), NULL); } #endif static TCHAR g_bufs[5][NSIS_MAX_STRLEN]; static int *g_parms; void NSISCALL update_status_text_buf1(int strtab) { update_status_text(strtab, g_bufs[1]); } #ifdef _WIN64 static INT_PTR NSISCALL GetIntPtrFromParm(int id) { return strtoiptr(GetNSISStringTT(g_parms[id])); } #else #define GetIntPtrFromParm(id_) ( (INT32)(GetIntFromParmEx(id_).LowPart) ) #endif #define GetHwndFromParm(id_) ( (HWND)GetIntPtrFromParm(id_) ) #define GetIntFromParm(id_) ( (INT32)(UINT32)GetIntPtrFromParm(id_) ) static LARGE_INTEGER GetIntFromParmEx(int id) { LARGE_INTEGER v; const TCHAR *p = GetNSISStringTT(g_parms[id]); v.LowPart = myatoi(p), v.HighPart = *p; return v; // HighPart is non-zero if the string is not empty } // NB - USE CAUTION when rearranging code to make use of the new return value of // this function - be sure the parm being accessed is not modified before the call. // Use a negative number to get the string validated as a file name // Note: Calling GetNSISString has the side effect that the buffer holding // the string to expand gets modified. // When calling this function with numbers like 0x13, it means create the string // from the string ID found in entry.offset[3] and put it into g_bufs[1]. static TCHAR * NSISCALL GetStringFromParm(int id_) { int id = id_ < 0 ? -id_ : id_; TCHAR *result = GetNSISString(g_bufs[id >> 4], g_parms[id & 0xF]); if (id_ < 0) validate_filename(result); return result; } #ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS static HKEY NSISCALL GetRegRootKey(int RootKey) { if (RootKey < 0) return (HKEY) (UINT_PTR) RootKey; return (HKEY) ((UINT_PTR) HKEY_CURRENT_USER + RootKey + g_exec_flags.all_user_var); // SHCTX[32|64|ANY]: HKEY_CURRENT_USER + 1 == HKEY_LOCAL_MACHINE } static HKEY NSISCALL RegOpenScriptKey(REGSAM RS) { HKEY hKey; return RegKeyOpen(GetRegRootKey(g_parms[1]), GetStringFromParm(0x22), RS|KEY_FROMSCRIPT, &hKey) ? NULL : hKey; } static HKEY NSISCALL RegCreateScriptKey(int RootKey, LPCTSTR SubKey, REGSAM RS) { HKEY hKey; return RegKeyCreate(GetRegRootKey(RootKey), SubKey, RS|KEY_FROMSCRIPT, &hKey) ? NULL : hKey; } // RegDeleteKey on Win9x will delete a tree of keys, WinNT will only delete a key without subkeys. // RegDeleteKeyEx on 32-bit Windows accepts but ignores the KEY_WOW64_xxKEY flags and always uses the // one and only native key. Our RegKeyOpen will intentionally fail if a incompatible WoW64 flag is used. #define DRTF_ONLYIFNOSUBKEYS DELREGKEY_ONLYIFNOSUBKEYS #define DRTF_ONLYIFNOVALUES DELREGKEY_ONLYIFNOVALUES static LONG NSISCALL DeleteRegTree(HKEY hThisKey, LPCTSTR SubKey, REGSAM SamviewAndFlags) { HKEY hKey; UINT onlyifnosubkeys = SamviewAndFlags & DRTF_ONLYIFNOSUBKEYS; UINT onlyifnovalues = SamviewAndFlags & DRTF_ONLYIFNOVALUES, valuesexistcheckinsubkeys = TRUE; REGSAM samview = SamviewAndFlags & (KEY_WOW64_32KEY|KEY_WOW64_64KEY); LONG retval = RegKeyOpen(hThisKey, SubKey, KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE|samview, &hKey); if (retval == ERROR_SUCCESS) { TCHAR child[MAX_PATH+1]; // NB - don't change this to static (recursive function) if (onlyifnovalues) { DWORD cchName = 0; retval = RegEnumValue(hKey, 0, child, &cchName, NULL, NULL, NULL, NULL); if (retval != ERROR_NO_MORE_ITEMS) goto notempty; if (!valuesexistcheckinsubkeys) SamviewAndFlags &= ~DRTF_ONLYIFNOVALUES; } while (RegEnumKey(hKey, 0, child, COUNTOF(child)) == ERROR_SUCCESS) { if (onlyifnosubkeys) notempty: return (RegCloseKey(hKey), ERROR_CAN_NOT_COMPLETE); if ((retval = DeleteRegTree(hKey, child, SamviewAndFlags)) != ERROR_SUCCESS) break; } RegCloseKey(hKey); { typedef LONG (WINAPI * RegDeleteKeyExType)(HKEY, LPCTSTR, REGSAM, DWORD); RegDeleteKeyExType RDKE = (RegDeleteKeyExType) #if !defined(_WIN64) || defined(_M_IA64) myGetProcAddress(MGA_RegDeleteKeyEx); if (!RDKE) retval = RegDeleteKey(hThisKey, SubKey); else #else RegDeleteKeyEx; #endif retval = RDKE(hThisKey, SubKey, samview, 0); } } return retval; } static LONG NSISCALL RegDeleteScriptKey(int RootKey, LPCTSTR SubKey, REGSAM SamviewAndFlags) { HKEY hKey; if (!SubKey[0]) return ERROR_CAN_NOT_COMPLETE; // Don't allow scripts to delete a HKEY root SamviewAndFlags |= KEY_FROMSCRIPT; hKey = GetRegKeyAndSAM(GetRegRootKey(RootKey), &SamviewAndFlags); return hKey ? DeleteRegTree(hKey, SubKey, SamviewAndFlags) : ERROR_INVALID_HANDLE; // ERROR_CANTOPEN? } #endif//NSIS_SUPPORT_REGISTRYFUNCTIONS // returns EXEC_ERROR on error // returns 0, advance position by 1 // otherwise, returns new_position+1 static int NSISCALL ExecuteEntry(entry *entry_) { TCHAR *buf0 = g_bufs[0]; TCHAR *buf1 = g_bufs[1]; TCHAR *buf2 = g_bufs[2]; TCHAR *buf3 = g_bufs[3]; //char *buf4 = g_bufs[4]; TCHAR *var0; TCHAR *var1; //char *var2; //char *var3; //char *var4; //char *var5; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT // Saves 8 bytes HWND mainHwnd = g_hwnd; #define g_hwnd mainHwnd #endif int exec_error = 0; entry lent = *entry_; #define which (lent.which) #define parm0 (lent.offsets[0]) #define parm1 (lent.offsets[1]) #define parm2 (lent.offsets[2]) #define parm3 (lent.offsets[3]) #define parm4 (lent.offsets[4]) #define parm5 (lent.offsets[5]) var0 = g_usrvars[parm0]; var1 = g_usrvars[parm1]; // not used yet //var2 = g_usrvars[parm2]; //var3 = g_usrvars[parm3]; //var4 = g_usrvars[parm4]; //var5 = g_usrvars[parm5]; #if __GNUC__ >= 12 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-pointer" #endif g_parms = lent.offsets; #if __GNUC__ >= 12 #pragma GCC diagnostic pop #endif switch (which) { case EW_NOP: log_printf2(_T("Jump: %d"),parm0); return parm0; case EW_ABORT: { log_printf2(_T("Aborting: \"%s\""),GetStringFromParm(0x00)); update_status_text(parm0,0); } return EXEC_ERROR; case EW_QUIT: g_quit_flag++; if (g_hwnd) PostQuitMessage(0); // make sure we bail out fast. return EXEC_ERROR; case EW_CALL: { int v=resolveaddr(parm0)-1; // address is -1, since we encode it as +1 log_printf2(_T("Call: %d"),v); return ExecuteCodeSegment(v,NULL); } case EW_UPDATETEXT: log_printf2(_T("DetailPrint: %s"),GetStringFromParm(0x00)); update_status_text(parm0,0); break; case EW_SLEEP: { int x=GetIntFromParm(0); log_printf2(_T("Sleep(%d)"),x); Sleep(max(x,1)); } break; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT case EW_BRINGTOFRONT: log_printf(_T("BringToFront")); SetForegroundWindow(g_hwnd); break; #endif//NSIS_CONFIG_VISIBLE_SUPPORT case EW_SETFLAG: { // TODO push/pop flags instead -- https://sourceforge.net/p/nsis/patches/222/ static int g_statusuphack = 0; if (parm2 <= 0) { if (parm2 < 0) g_statusuphack=FIELDN(g_exec_flags,parm0); else FIELDN(g_exec_flags_last_used,parm0)=FIELDN(g_exec_flags,parm0); FIELDN(g_exec_flags,parm0)=GetIntFromParm(1); log_printf3(_T("SetFlag: %d=%d"),parm0,FIELDN(g_exec_flags,parm0)); } else { FIELDN(g_exec_flags,parm0)=FIELDN(g_exec_flags_last_used,parm0); if (parm3 < 0) FIELDN(g_exec_flags,parm0)=g_statusuphack; } } break; case EW_IFFLAG: { int f=lent.offsets[!FIELDN(g_exec_flags,parm2)]; FIELDN(g_exec_flags,parm2)&=parm3; return f; } case EW_GETFLAG: myitoa(var0,FIELDN(g_exec_flags,parm1)); break; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT case EW_CHDETAILSVIEW: if (insthwndbutton) ShowWindow(insthwndbutton,parm1); if (insthwnd) ShowWindow(insthwnd,parm0); break; #endif//NSIS_CONFIG_VISIBLE_SUPPORT case EW_SETFILEATTRIBUTES: { TCHAR *buf1=GetStringFromParm(-0x10); log_printf3(_T("SetFileAttributes: \"%s\":%08X"),buf1,parm1); if (!SetFileAttributes(buf1,parm1)) { exec_error++; log_printf(_T("SetFileAttributes failed.")); } } break; case EW_CREATEDIR: { TCHAR *buf1=GetStringFromParm(-0x10); log_printf3(_T("CreateDirectory: \"%s\" (%d)"),buf1,parm1); { TCHAR *p = skip_root(buf1), c = _T('c'); if (p) { while (c) { DWORD ec; p = findchar(p, _T('\\')); c = *p, *p = 0; if (!c && parm2 && UserIsAdminGrpMember()) // Lock down the final directory? { ec = CreateRestrictedDirectory(buf1); if (ec) exec_error++; // Report error to add_plugins_dir_initializer } else ec = CreateNormalDirectory(buf1); if (ec) { if (ec != ERROR_ALREADY_EXISTS) { log_printf3(_T("CreateDirectory: can't create \"%s\" (err=%d)"),buf1,ec); exec_error++; } else if ((GetFileAttributes(buf1) & FILE_ATTRIBUTE_DIRECTORY) == 0) { log_printf2(_T("CreateDirectory: can't create \"%s\" - a file already exists"),buf1); exec_error++; } } else { log_printf2(_T("CreateDirectory: \"%s\" created"),buf1); } *p++ = c; } } } if (parm1) { update_status_text_buf1(LANG_OUTPUTDIR); mystrcpy(state_output_directory,buf1); if (!SetCurrentDirectory(buf1)) { log_printf3(_T("SetCurrentDirectory(%s) failed (%d)"),buf1,GetLastError()); exec_error++; } } else update_status_text_buf1(LANG_CREATEDIR); } break; case EW_IFFILEEXISTS: { TCHAR *buf0=GetStringFromParm(0x00); if (file_exists(buf0)) { log_printf3(_T("IfFileExists: file \"%s\" exists, jumping %d"),buf0,parm1); return parm1; } log_printf3(_T("IfFileExists: file \"%s\" does not exist, jumping %d"),buf0,parm2); } return parm2; #ifdef NSIS_SUPPORT_RENAME case EW_RENAME: { TCHAR *buf3=GetStringFromParm(-0x30); TCHAR *buf2=GetStringFromParm(-0x21); #ifdef NSIS_CONFIG_LOG TCHAR *buf1= #endif GetStringFromParm(0x13); // For update_status_text_buf1 and log_printf log_printf2(_T("Rename: %s"),buf1); if (MoveFile(buf3,buf2)) { update_status_text_buf1(LANG_RENAME); } else { #ifdef NSIS_SUPPORT_MOVEONREBOOT if (parm2 && file_exists(buf3)) { MoveFileOnReboot(buf3,buf2); update_status_text_buf1(LANG_RENAMEONREBOOT); log_printf2(_T("Rename on reboot: %s"),buf1); } else #endif { exec_error++; log_printf2(_T("Rename failed: %s"),buf1); } } } break; #endif//NSIS_SUPPORT_RENAME #ifdef NSIS_SUPPORT_FNUTIL case EW_GETFULLPATHNAME: { TCHAR *fp; TCHAR *p=var1; TCHAR *buf0=GetStringFromParm(0x00); if (!GetFullPathName(buf0,NSIS_MAX_STRLEN,p,&fp)) { exec_error++; *p=0; } else if (fp>buf0 && *fp) { WIN32_FIND_DATA *fd=file_exists(buf0); if (fd) { mystrcpy(fp,fd->cFileName); } else { exec_error++; *p=0; } } if (!parm2) GetShortPathName(p,p,NSIS_MAX_STRLEN); } break; case EW_SEARCHPATH: { TCHAR *fp; TCHAR *p=var0; TCHAR *buf0=GetStringFromParm(-0x01); if (!SearchPath(NULL,buf0,NULL,NSIS_MAX_STRLEN,p,&fp)) { exec_error++; p[0]=0; } } break; case EW_GETTEMPFILENAME: { TCHAR *textout=var0; if (!my_GetTempFileName(textout, GetStringFromParm(-0x11))) exec_error++; } break; #endif #ifdef NSIS_SUPPORT_FILE case EW_EXTRACTFILE: { HANDLE hOut; int ret; TCHAR *buf3 = GetStringFromParm(0x31); int overwriteflag = parm0 & 7; log_printf4(_T("File: overwriteflag=%d, allowskipfilesflag=%d, name=\"%s\""),overwriteflag,(parm0>>3)&MB_ABORTRETRYIGNORE,buf3); if (validpathspec(buf3)) { mystrcpy(buf0,buf3); } else mystrcat(addtrailingslash(mystrcpy(buf0,state_output_directory)),buf3); validate_filename(buf0); _tryagain: if (overwriteflag >= 3) // check date and time { WIN32_FIND_DATA *ffd=file_exists(buf0); // if it doesn't exist, overwrite flag will be off (though it doesn't really matter) int cmp=0; if (ffd) { cmp=CompareFileTime(&ffd->ftLastWriteTime, (FILETIME*)(lent.offsets + 3)); } overwriteflag=!(cmp & (0x80000000 | (overwriteflag - 3))); } // remove read only flag if overwrite mode is on if (!overwriteflag) { remove_ro_attr(buf0); } hOut=myOpenFile(buf0,GENERIC_WRITE,(overwriteflag==1)?CREATE_NEW:CREATE_ALWAYS); if (hOut == INVALID_HANDLE_VALUE) { if (overwriteflag) { update_status_text(LANG_SKIPPED,buf3); if (overwriteflag==2) exec_error++; log_printf3(_T("File: skipped: \"%s\" (overwriteflag=%d)"),buf0,overwriteflag); break; } log_printf2(_T("File: error creating \"%s\""),buf0); mystrcpy(buf2,g_usrvars[0]); // save $0 mystrcpy(g_usrvars[0],buf0); // copy file name to $0 GetNSISString(buf1,parm5); // use $0 mystrcpy(g_usrvars[0],buf2); // restore $0 // Modified by ramon 23 May 2003 switch (my_MessageBox(buf1, parm0>>3)) { case IDRETRY: log_printf(_T("File: error, user retry")); goto _tryagain; case IDIGNORE: log_printf(_T("File: error, user cancel")); g_exec_flags.exec_error++; return 0; default: log_printf(_T("File: error, user abort")); update_status_text(LANG_CANTWRITE,buf0); return EXEC_ERROR; } } update_status_text(LANG_EXTRACT,buf3); { g_exec_flags.status_update++; ret=GetCompressedDataFromDataBlock(parm2,hOut); g_exec_flags.status_update--; } log_printf3(_T("File: wrote %d to \"%s\""),ret,buf0); if (parm3 != 0xffffffff || parm4 != 0xffffffff) SetFileTime(hOut,(FILETIME*)(lent.offsets+3),NULL,(FILETIME*)(lent.offsets+3)); CloseHandle(hOut); if (ret < 0) { if (ret == -2) { GetNSISString(buf0,LANG_ERRORWRITING); mystrcat(buf0,buf3); } else { GetNSISString(buf0,LANG_ERRORDECOMPRESSING); } log_printf2(_T("%s"),buf0); my_MessageBox(buf0,MB_OK|MB_ICONSTOP|(IDOK<<21)); return EXEC_ERROR; } } break; #endif//NSIS_SUPPORT_FILE #ifdef NSIS_SUPPORT_DELETE case EW_DELETEFILE: { TCHAR *buf0=GetStringFromParm(0x00); log_printf2(_T("Delete: \"%s\""),buf0); myDelete(buf0,parm1); } break; #endif//NSIS_SUPPORT_DELETE #ifdef NSIS_SUPPORT_MESSAGEBOX case EW_MESSAGEBOX: // MessageBox { int v; TCHAR *buf3=GetStringFromParm(0x31); log_printf3(_T("MessageBox: %d,\"%s\""),parm0,buf3); v=my_MessageBox(buf3,parm0); if (v) { if (v==parm2) { return parm3; } if (v==parm4) { return parm5; } } else exec_error++; } break; #endif//NSIS_SUPPORT_MESSAGEBOX #ifdef NSIS_SUPPORT_RMDIR case EW_RMDIR: { TCHAR *buf1=GetStringFromParm(-0x10); log_printf2(_T("RMDir: \"%s\""),buf1); myDelete(buf1,parm1); } break; #endif//NSIS_SUPPORT_RMDIR #ifdef NSIS_SUPPORT_STROPTS case EW_STRLEN: { TCHAR *buf0=GetStringFromParm(0x01); myitoa(var0,mystrlen(buf0)); } break; case EW_ASSIGNVAR: { LARGE_INTEGER newlenex=GetIntFromParmEx(2); int start=GetIntFromParm(3), newlen=newlenex.LowPart; TCHAR *p=var0, *buf0=GetStringFromParm(0x01); int srclen=mystrlen(buf0); *p=0; if (!newlenex.HighPart) newlen=srclen; // "StrCpy $1 $2 $3" where $3="" if (newlen) { if (start<0) start=srclen+start; if (start>=0) { if (start>srclen) start=srclen; mystrcpy(p,buf0+start); if (newlen) { if (newlen<0) newlen=mystrlen(p)+newlen; if (newlen<0) newlen=0; if (newlen < NSIS_MAX_STRLEN) p[newlen]=0; } } } } break; case EW_STRCMP: { TCHAR *buf2=GetStringFromParm(0x20); TCHAR *buf3=GetStringFromParm(0x31); if (!parm4) { // case insensitive if (!lstrcmpi(buf2,buf3)) return parm2; } else { // case sensitive if (!lstrcmp(buf2,buf3)) return parm2; } } return parm3; #endif//NSIS_SUPPORT_STROPTS #ifdef NSIS_SUPPORT_ENVIRONMENT case EW_READENVSTR: { TCHAR *p=var0; TCHAR *buf0=GetStringFromParm(0x01); if (!ExpandEnvironmentStrings(buf0,p,NSIS_MAX_STRLEN) || (parm2 && !lstrcmp(buf0, p))) { exec_error++; *p=0; } p[NSIS_MAX_STRLEN-1]=0; } break; #endif//NSIS_SUPPORT_ENVIRONMENT #ifdef NSIS_SUPPORT_INTOPTS case EW_INTCMP: { UINT supp64=sizeof(void*) > 4, opu=supp64 ? (BYTE) parm5 : parm5, op64=supp64 ? (SHORT) parm5 < 0 : FALSE; INT_PTR v=GetIntPtrFromParm(0), v2=GetIntPtrFromParm(1); // Note: This needs to be INT64 if supp64 is ever set to true for 32-bit builds! if (!opu) { // signed: if (op64) { if ((INT64)v < (INT64)v2) return parm3; if ((INT64)v > (INT64)v2) return parm4; } else { if ((signed int)v < (signed int)v2) return parm3; if ((signed int)v > (signed int)v2) return parm4; } } else { // unsigned: if (op64) { if ((UINT64)v < (UINT64)v2) return parm3; if ((UINT64)v > (UINT64)v2) return parm4; } else { if ((unsigned int)v < (unsigned int)v2) return parm3; if ((unsigned int)v > (unsigned int)v2) return parm4; } } } return parm2; case EW_INTOP: { int v,v2; TCHAR *p=var0; v=GetIntFromParm(1); v2=GetIntFromParm(2); switch (parm3) { case 0: v+=v2; break; case 1: v-=v2; break; case 2: v*=v2; break; case 3: if (v2) v/=v2; else { v=0; exec_error++; } break; case 4: v|=v2; break; case 5: v&=v2; break; case 6: v^=v2; break; case 7: v=!v; break; case 8: v=v||v2; break; case 9: v=v&&v2; break; case 10: if (v2) v%=v2; else { v=0; exec_error++; } break; case 11: v=v<>v2; break; case 13: v=(unsigned int)v>>(unsigned int)v2; break; } myitoa(p,v); } break; case EW_INTFMT: { TCHAR *buf0=GetStringFromParm(0x01); INT_PTR val=GetIntPtrFromParm(2), op64=sizeof(void*) > 4 && parm3; wsprintf(var0,buf0,op64 ? val : (UINT)val); } break; #endif//NSIS_SUPPORT_INTOPTS #ifdef NSIS_SUPPORT_STACK case EW_PUSHPOP: { stack_t *s=g_st; int cnt=parm2; if (cnt) //Exch contributed by Fritz Elfert { while (cnt--&&s) s=s->next; if (!s) { log_printf2(_T("Exch: stack < %d elements"),parm2); my_MessageBox(GetNSISStringTT(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP|(IDOK<<21)); return EXEC_ERROR; } mystrcpy(buf0,s->text); mystrcpy(s->text,g_st->text); mystrcpy(g_st->text,buf0); } else if (parm1) { if (!s) { log_printf(_T("Pop: stack empty")); exec_error++; break; } mystrcpy(var0,s->text); g_st=s->next; GlobalFree((HGLOBAL)s); } else { s=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)); GetNSISString(s->text,parm0); s->next=g_st; g_st=s; } } break; #endif//NSIS_SUPPORT_STACK #ifdef NSIS_SUPPORT_HWNDS case EW_FINDWINDOW: case EW_SENDMESSAGE: { LRESULT v; INT_PTR b3=GetIntPtrFromParm(3); INT_PTR b4=GetIntPtrFromParm(4); if (parm5&1) b3=(INT_PTR)GetStringFromParm(0x33); if (parm5&2) b4=(INT_PTR)GetStringFromParm(0x44); if (which == EW_SENDMESSAGE) { HWND hwnd=GetHwndFromParm(1); int msg=GetIntFromParm(2); if (parm5>>2) exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(PDWORD_PTR)&v); // Jim Park: This sends script messages. Some messages require // settings for Unicode. This means the user's script may need // to change for Unicode NSIS. else v=SendMessage(hwnd,msg,b3,b4); } else { TCHAR *buf0=GetStringFromParm(0x01); TCHAR *buf1=GetStringFromParm(0x12); v=(LRESULT)FindWindowEx((HWND)b3,(HWND)b4,buf0[0]?buf0:NULL,buf1[0]?buf1:NULL); } if (parm0>=0) iptrtostr(var0,v); } break; case EW_ISWINDOW: if (IsWindow(GetHwndFromParm(0))) return parm1; return parm2; #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT case EW_GETDLGITEM: iptrtostr( var0, (INT_PTR)GetDlgItem( GetHwndFromParm(1), GetIntFromParm(2) ) ); break; case EW_SETCTLCOLORS: { ctlcolors *c = (ctlcolors *)(g_blocks[NB_CTLCOLORS].offset + parm1); SetWindowLongPtr(GetHwndFromParm(0), GWLP_USERDATA, (LONG_PTR) c); } break; case EW_LOADANDSETIMAGE: { RECT r; HANDLE hNewImage, hPrevImage; HWND hCtl=(parm3 & LASIF_HWND) ? GetHwndFromParm(2) : GetDlgItem(g_hwnd, parm2); UINT it=parm3 & LASIM_IMAGE, exeres=parm3 & LASIF_EXERES, fitw=(UINT)parm3 >> LASIS_FITCTLW, fith=(parm3 & LASIF_FITCTLH) != 0; LPCTSTR imgid = (parm3 & LASIF_STRID) ? GetStringFromParm(0x11) : MAKEINTRESOURCE(parm1); GetClientRect(hCtl, &r); hNewImage=LoadImage(exeres ? g_hInstance : NULL, imgid, it, fitw*r.right, fith*r.bottom, parm3 & LASIM_LR); hPrevImage=(HANDLE)SendMessage(hCtl, STM_SETIMAGE, it, (LPARAM)hNewImage); if (hPrevImage && IMAGE_BITMAP == it) DeleteObject(hPrevImage); // Delete the old bitmap if (parm0 >= 0) iptrtostr(var0, (INT_PTR)hNewImage); // Optional output handle } break; case EW_CREATEFONT: { static LOGFONT f; const HDC hdc=GetDC(g_hwnd); f.lfHeight=-MulDiv(GetIntFromParm(2),GetDeviceCaps(hdc,LOGPIXELSY),72); ReleaseDC(g_hwnd,hdc); f.lfWeight=GetIntFromParm(3); f.lfItalic=parm4&1; f.lfUnderline=parm4&2; f.lfStrikeOut=parm4&4; f.lfCharSet=DEFAULT_CHARSET; GetNSISString(f.lfFaceName,parm1); iptrtostr(var0,(INT_PTR)CreateFontIndirect(&f)); } break; case EW_SHOWWINDOW: { HWND hw=GetHwndFromParm(0); int a=GetIntFromParm(1); if (parm2) log_printf(_T("HideWindow")); if (!parm3) ShowWindow(hw,a); else EnableWindow(hw,a); } break; #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT #endif//NSIS_SUPPORT_HWNDS #ifdef NSIS_SUPPORT_SHELLEXECUTE case EW_SHELLEXEC: // this uses improvements of Andras Varga { SHELLEXECUTEINFO sei; TCHAR *buf0=GetStringFromParm(0x00); // Verb TCHAR *buf3=GetStringFromParm(0x31); // File TCHAR *buf2=GetStringFromParm(0x22); // Parameters GetStringFromParm(0x15); // For update_status_text_buf1 update_status_text_buf1(LANG_EXECSHELL); sei.fMask=parm4; sei.hwnd=g_hwnd, sei.nShow=parm3; sei.lpVerb=buf0[0]?buf0:NULL, sei.lpFile=buf3, sei.lpParameters=buf2[0]?buf2:NULL, sei.lpDirectory=state_output_directory; if (!myShellExecuteEx(&sei)) { log_printf5(_T("ExecShell: warning: error (\"%s\": file:\"%s\" params:\"%s\")=%d"),buf0,buf3,buf2,GetLastError()); exec_error++; } else { if (SEE_MASK_NOCLOSEPROCESS & sei.fMask) { WaitForProcess(sei.hProcess); CloseHandle(sei.hProcess); } log_printf4(_T("ExecShell: success (\"%s\": file:\"%s\" params:\"%s\")"),buf0,buf3,buf2); } } break; #endif//NSIS_SUPPORT_SHELLEXECUTE #ifdef NSIS_SUPPORT_EXECUTE case EW_EXECUTE: { HANDLE hProc; TCHAR *buf0=GetStringFromParm(0x00); log_printf2(_T("Exec: command=\"%s\""),buf0); update_status_text(LANG_EXECUTE,buf0); hProc=myCreateProcess(buf0); if (hProc) { log_printf2(_T("Exec: success (\"%s\")"),buf0); if (parm2) { DWORD lExitCode=WaitForProcess(hProc); if (parm1>=0) myitoa(var1,lExitCode); else if (lExitCode) exec_error++; } CloseHandle(hProc); } else { exec_error++; log_printf2(_T("Exec: failed createprocess (\"%s\")"),buf0); } } break; #endif//NSIS_SUPPORT_EXECUTE #ifdef NSIS_SUPPORT_GETFILETIME case EW_GETFILETIME: // this new implementation based on one by Dave Bau // used FindFirstFile instead of GetFileTime to better handle files that are locked. // also allows GetFileTime to be passed a wildcard. { WIN32_FIND_DATA *ffd; TCHAR *highout=var0; TCHAR *lowout=var1; TCHAR *buf0=GetStringFromParm(0x02); ffd=file_exists(buf0); if (ffd) { myitoa(lowout,ffd->ftLastWriteTime.dwLowDateTime); myitoa(highout,ffd->ftLastWriteTime.dwHighDateTime); } else { *lowout=*highout=0; exec_error++; } } break; #endif//NSIS_SUPPORT_GETFILETIME #ifdef NSIS_SUPPORT_GETDLLVERSION case EW_GETDLLVERSION: { TCHAR *highout=var0, *lowout=var1; DWORD s1, d; VS_FIXEDFILEINFO *pvsf1; TCHAR *buf1=GetStringFromParm(-0x12); s1=((DWORD(WINAPI*)(LPCTSTR,DWORD*))myGetProcAddress(MGA_GetFileVersionInfoSize))(buf1,&d); *lowout=*highout=0; exec_error++; if (s1) { void *b1; b1=GlobalAlloc(GPTR,s1); if (b1) { FARPROC gfvi = myGetProcAddress(MGA_GetFileVersionInfo), vqv = myGetProcAddress(MGA_VerQueryValue); UINT uLen; if ( ((BOOL(WINAPI*)(LPCTSTR,DWORD,DWORD,LPVOID))gfvi)(buf1,0,s1,b1) && ((BOOL(WINAPI*)(LPCVOID,LPCTSTR,LPVOID*,UINT*))vqv)(b1,_T("\\"),(void*)&pvsf1,&uLen) ) { myitoa(highout,(&pvsf1->dwFileVersionMS)[parm3]); myitoa(lowout,(&pvsf1->dwFileVersionLS)[parm3]); exec_error--; } GlobalFree(b1); } } } break; #endif//NSIS_SUPPORT_GETDLLVERSION #ifdef NSIS_SUPPORT_ACTIVEXREG case EW_REGISTERDLL: { exec_error++; if (SUCCEEDED(g_hres)) { HANDLE h=NULL; TCHAR *buf1=GetStringFromParm(-0x10); TCHAR *buf0=GetStringFromParm(0x01); if (parm4) h=GetModuleHandle(buf1); if (!h) h=LoadLibraryEx(buf1, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (h) { // Jim Park: Need to use our special NSISGetProcAddress to convert // buf0 to char before calling GetProcAddress() which only takes // chars. FARPROC funke = NSISGetProcAddress(h,buf0); if (funke) { exec_error--; if (parm2) { update_status_text_buf1(parm2); if (funke()) exec_error++; } else { void (*func)(HWND,int,TCHAR*,void*,void*); func=(void*)funke; func( g_hwnd, NSIS_MAX_STRLEN, (TCHAR*)g_usrvars, #ifdef NSIS_SUPPORT_STACK (void*)&g_st, #else NULL, #endif//NSIS_SUPPORT_STACK &plugin_extra_parameters ); } } else { update_status_text(LANG_CANNOTFINDSYMBOL,buf0); log_printf3(_T("Error registering DLL: %s not found in %s"),buf0,buf1); } if (!parm3 && Plugins_CanUnload(h)) FreeLibrary(h); } else { update_status_text_buf1(LANG_COULDNOTLOAD); log_printf2(_T("Error registering DLL: Could not load %s"),buf1); } } else { update_status_text_buf1(LANG_NOOLE); log_printf(_T("Error registering DLL: Could not initialize OLE")); } } break; #endif #ifdef NSIS_SUPPORT_CREATESHORTCUT case EW_CREATESHORTCUT: { TCHAR *buf1=GetStringFromParm(-0x10); TCHAR *buf2=GetStringFromParm(-0x21); TCHAR *buf0=GetStringFromParm(0x02); TCHAR *buf3=GetStringFromParm(-0x33); TCHAR *buf4=GetStringFromParm(0x45); const int icoi = (parm4>>CS_II_SHIFT)&(CS_II_MASK>>CS_II_SHIFT), nwd = parm4&CS_NWD, sc = (parm4>>CS_SC_SHIFT)&(CS_SC_MASK>>CS_SC_SHIFT), hk = (parm4>>CS_HK_SHIFT)&(CS_HK_MASK>>CS_HK_SHIFT); HRESULT hres; IShellLink* psl; if (!validpathspec(buf2)) GetStringFromParm(0x21); log_printf8(_T("CreateShortcut: out: \"%s\", in: \"%s %s\", icon: %s,%d, sw=%d, hk=%d"), buf1,buf2,buf0,buf3,icoi,sc,hk); hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (void **) &psl); if (SUCCEEDED(hres)) { IPersistFile* ppf; hres = psl->lpVtbl->QueryInterface(psl,&IID_IPersistFile, (void **) &ppf); if (SUCCEEDED(hres)) { hres = psl->lpVtbl->SetPath(psl,buf2); if (!nwd) psl->lpVtbl->SetWorkingDirectory(psl,state_output_directory); if (sc) psl->lpVtbl->SetShowCmd(psl,sc); psl->lpVtbl->SetHotkey(psl,(unsigned short) hk); if (buf3[0]) psl->lpVtbl->SetIconLocation(psl,buf3,icoi); psl->lpVtbl->SetArguments(psl,buf0); psl->lpVtbl->SetDescription(psl,buf4); if (SUCCEEDED(hres)) { #ifdef _UNICODE hres = ppf->lpVtbl->Save(ppf,buf1,TRUE); #else WCHAR *wsz = (LPWSTR) buf2; // buf2 + buf3 = WCHAR wsz[NSIS_MAX_STRLEN] hres = E_FAIL; if (MultiByteToWideChar(CP_ACP,0,buf1,-1,wsz,NSIS_MAX_STRLEN)) hres = ppf->lpVtbl->Save(ppf,wsz,TRUE); #endif } ppf->lpVtbl->Release(ppf); } psl->lpVtbl->Release(psl); } if (FAILED(hres)) { exec_error++; update_status_text_buf1(LANG_ERRORCREATINGSHORTCUT); } else { update_status_text_buf1(LANG_CREATESHORTCUT); } } break; #endif//NSIS_SUPPORT_CREATESHORTCUT #ifdef NSIS_SUPPORT_COPYFILES case EW_COPYFILES: // CopyFile (added by NOP) { int res; SHFILEOPSTRUCT op; TCHAR *buf0=GetStringFromParm(0x00); TCHAR *buf1=GetStringFromParm(0x11); TCHAR *buf2=GetStringFromParm(0x23); // LANG_COPYTO + buf1 log_printf3(_T("CopyFiles \"%s\"->\"%s\""),buf0,buf1); if (!file_exists(buf0)) { // workaround for bug #774966 // // on nt4, SHFileOperation silently fails if the source // file doesn't exist. do a manual check instead. update_status_text(LANG_COPYFAILED,0); exec_error++; break; } op.hwnd=g_hwnd; op.wFunc=FO_COPY; buf0[mystrlen(buf0)+1]=0; buf1[mystrlen(buf1)+1]=0; op.pFrom=buf0; op.pTo=buf1; op.lpszProgressTitle=buf2; op.fFlags=parm2; update_status_text(0,buf2); res=SHFileOperation(&op); if (res) { // some of these changes were from Edgewise (wiked_edge@yahoo.com) update_status_text(LANG_COPYFAILED,0); exec_error++; } } break; #endif//NSIS_SUPPORT_COPYFILES #ifdef NSIS_SUPPORT_REBOOT case EW_REBOOT: if (parm0!=0xbadf00d) { my_MessageBox(GetNSISStringTT(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP|(IDOK<<21)); return EXEC_ERROR; } g_exec_flags.reboot_called++; // a following EW_QUIT will make sure the installer quits right away break; #endif//NSIS_SUPPORT_REBOOT #ifdef NSIS_SUPPORT_INIFILES case EW_WRITEINI: { TCHAR *sec=0, *key=0, *str=0; #ifdef NSIS_CONFIG_LOG mystrcpy(buf1,_T("")); mystrcpy(buf2,buf1); #endif if (parm0) sec=GetStringFromParm(0x00); if (parm1) key=GetStringFromParm(0x11); if (parm4) str=GetStringFromParm(0x22); buf3=GetStringFromParm(-0x33); log_printf5(_T("WriteINIStr: wrote [%s] %s=%s in %s"),buf0,buf1,buf2,buf3); if (!WritePrivateProfileString(sec,key,str,buf3)) exec_error++; } break; case EW_READINISTR: { // GetPrivateProfileString can't read CR & LF characters inside values from INI files // so we use "\n" as a detection system to see if we did successfully read a value const TCHAR errstr[] = _T("\n"); TCHAR *p=var0; TCHAR *buf0=GetStringFromParm(0x01); TCHAR *buf1=GetStringFromParm(0x12); TCHAR *buf2=GetStringFromParm(-0x23); GetPrivateProfileString(buf0,buf1,errstr,p,NSIS_MAX_STRLEN-1,buf2); if (p[0] == _T('\n')) // we got the default string "\n" instead of a real value { exec_error++; p[0]=0; } } break; #endif//NSIS_SUPPORT_INIFILES #ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS case EW_DELREG: { long res=!ERROR_SUCCESS, rootkey=parm1; const TCHAR *rkn UNUSED=RegKeyHandleToName((HKEY)rootkey); if (!parm4) // TOK_DELETEREGVALUE { HKEY hKey=RegOpenScriptKey(KEY_SET_VALUE); if (hKey) { TCHAR *buf3=GetStringFromParm(0x33); res = RegDeleteValue(hKey,buf3); log_printf4(_T("DeleteRegValue: \"%s\\%s\" \"%s\""),rkn,buf2,buf3); RegCloseKey(hKey); } } else // TOK_DELETEREGKEY { TCHAR *buf2=GetStringFromParm(0x22); log_printf3(_T("DeleteRegKey: \"%s\\%s\""),rkn,buf2); res = RegDeleteScriptKey(rootkey,buf2,parm4 >> DELREGKEYFLAGSSHIFT); // SHR is 1 byte smaller than AND } if (res != ERROR_SUCCESS) exec_error++; } break; case EW_WRITEREG: // write registry value { HKEY hKey; int rootkey=parm0, type=parm4, rtype=parm5; TCHAR *buf0=GetStringFromParm(0x02); TCHAR *buf1=GetStringFromParm(0x11); const TCHAR *rkn UNUSED=RegKeyHandleToName((HKEY)rootkey); exec_error++; if ((hKey = RegCreateScriptKey(rootkey, buf1, KEY_SET_VALUE))) { LPBYTE data = (LPBYTE) buf2; DWORD size = 0; if (type == REG_SZ) { GetStringFromParm(0x23); size = (mystrlen((TCHAR *) data) + 1)*sizeof(TCHAR); if (rtype == REG_SZ) { log_printf5(_T("WriteRegStr: \"%s\\%s\" \"%s\"=\"%s\""),rkn,buf1,buf0,data); } else { log_printf5(_T("WriteRegExpandStr: \"%s\\%s\" \"%s\"=\"%s\""),rkn,buf1,buf0,data); } } if (type == REG_DWORD) { *(LPDWORD) data = GetIntFromParm(3); size = sizeof(DWORD); log_printf5(_T("WriteRegDWORD: \"%s\\%s\" \"%s\"=\"0x%08x\""),rkn,buf1,buf0,*(LPDWORD) data); } if (type == REG_BINARY) { #ifdef NSIS_CONFIG_LOG TCHAR binbuf[128]; LPCTSTR logf = rtype==REG_NONE?_T("WriteRegNone"):rtype==REG_MULTI_SZ?_T("WriteRegMultiStr"):_T("WriteRegBin"); #endif // use buf2, buf3 and buf4 size = GetCompressedDataFromDataBlockToMemory(parm3, data, (3 * NSIS_MAX_STRLEN)*sizeof(TCHAR)); LogData2Hex(binbuf, COUNTOF(binbuf), data, size); log_printf6(_T("%s: \"%s\\%s\" \"%s\"=\"%s\""),logf,rkn,buf1,buf0,binbuf); } if (size >= 0 && RegSetValueEx(hKey,buf0,0,rtype,data,size) == ERROR_SUCCESS) { exec_error--; } else { log_printf4(_T("WriteReg: error writing into \"%s\\%s\" \"%s\""),rkn,buf1,buf0); } RegCloseKey(hKey); } else { log_printf3(_T("WriteReg: error creating key \"%s\\%s\""),rkn,buf1); } } break; case EW_READREGSTR: // read registry string { HKEY hKey=RegOpenScriptKey(KEY_READ); TCHAR *p=var0; TCHAR *buf3=GetStringFromParm(0x33); // buf3 == key name p[0]=0; if (hKey) { DWORD l = NSIS_MAX_STRLEN*sizeof(TCHAR), t; // Jim Park: If plain text in p or binary data in p, // user must be careful in accessing p correctly. if (RegQueryValueEx(hKey,buf3,NULL,&t,(LPBYTE)p,&l) != ERROR_SUCCESS || (t != REG_DWORD && t != REG_SZ && t != REG_EXPAND_SZ)) { p[0]=0; exec_error++; } else { if (t==REG_DWORD) { exec_error += !parm4; myitoa(p,*((DWORD*)p)); } else { exec_error += parm4; p[NSIS_MAX_STRLEN-1]=0; // RegQueryValueEx adds a null terminator, UNLESS the value is NSIS_MAX_STRLEN long } } RegCloseKey(hKey); } else exec_error++; } break; case EW_REGENUM: { HKEY hKey=RegOpenScriptKey(KEY_READ); TCHAR *p=var0; int b=GetIntFromParm(3); p[0]=0; // "" on error. This assumes that RegEnumKey and RegEnumValue do not party on our buffer! if (hKey) { DWORD d=NSIS_MAX_STRLEN-1; // -1 is not required here? if (parm4) RegEnumKey(hKey,b,p,d); else if (RegEnumValue(hKey,b,p,&d,NULL,NULL,NULL,NULL) != ERROR_SUCCESS) exec_error++; p[NSIS_MAX_STRLEN-1]=0; // Not required? RegCloseKey(hKey); } else exec_error++; } break; #endif//NSIS_SUPPORT_REGISTRYFUNCTIONS #ifdef NSIS_SUPPORT_FILEFUNCTIONS case EW_FCLOSE: { HANDLE handle = (HANDLE) strtoiptr(var0); if (handle) CloseHandle(handle); } break; case EW_FOPEN: { HANDLE h; TCHAR *handleout=var0; TCHAR *buf1=GetStringFromParm(-0x13); h=myOpenFile(buf1,parm1,parm2); if (h == INVALID_HANDLE_VALUE) { *handleout=0; exec_error++; } else { iptrtostr(handleout,(INT_PTR)h); } } break; case EW_FPUTS: #ifdef _UNICODE case EW_FPUTWS: // Jim Park/Wizou: in Unicode version of NSIS, EW_FPUTS still deals with ANSI files (conversion is done). We add EW_FPUTWS to deal with Unicode files. #endif { int l; // number of bytes to write TCHAR *t=var0; const int writeCodPt = parm2, ansi = EW_FPUTS == which; if (writeCodPt) // FileWriteByte or FileWriteWord { // Note: In Unicode version, we put a WORD in buf1[0] and will write 1 or 2 bytes, depending on FileWriteByte/Word. ((_TUCHAR *)buf1)[0]=(_TUCHAR) GetIntFromParm(1); l=(ansi)?1:sizeof(TCHAR); } #ifdef _UNICODE else if (which==EW_FPUTS) { GetStringFromParm(0x21); // load string in buf2, convert it to ANSI in buf1 StrWideToACP(buf2, (LPSTR) buf1, NSIS_MAX_STRLEN); l=lstrlenA((LPCSTR)buf1); } #endif else { l=mystrlen(GetStringFromParm(0x11))*sizeof(TCHAR); } if (*t) { const HANDLE hFile = (HANDLE) strtoiptr(t); #ifdef _UNICODE if ((ansi | writeCodPt) || !parm3 || SUCCEEDED(UTF16LEBOM(hFile,(INT_PTR)hFile))) #endif if (myWriteFile(hFile,buf1,l)) break; // Success } exec_error++; } break; case EW_FGETS: #ifdef _UNICODE case EW_FGETWS: // Jim Park/Wizou: in Unicode version of NSIS, EW_FGETS still deals with ANSI files (conversion is done). We add EW_FGETWS to deal with Unicode files. #endif { TCHAR *textout=var1; int rpos=0, ungetseek=sizeof(TCHAR); TCHAR *hptr=var0; int maxlen=GetIntFromParm(2); if (maxlen<1) break; if (maxlen > NSIS_MAX_STRLEN-1) maxlen=NSIS_MAX_STRLEN-1; if (*hptr) { TCHAR lc=0; HANDLE h=(HANDLE)strtoiptr(hptr); while (rpos 4GB support on _WIN64 DWORD v=SetFilePointer((HANDLE)strtoiptr(t),GetIntFromParm(2),NULL,parm3); if (parm1>=0) { myitoa(var1,v); } } } break; #endif//NSIS_SUPPORT_FILEFUNCTIONS #ifdef NSIS_SUPPORT_FINDFIRST case EW_FINDCLOSE: { HANDLE hFind = (HANDLE) strtoiptr(var0); if (hFind) FindClose(hFind); } break; case EW_FINDNEXT: { TCHAR *textout=var0; HANDLE hFind = (HANDLE) strtoiptr(var1); WIN32_FIND_DATA fd; if (hFind && FindNextFile(hFind,&fd)) { mystrcpy(textout,fd.cFileName); } else { exec_error++; *textout=0; } } break; case EW_FINDFIRST: { TCHAR *textout=var0; TCHAR *handleout=var1; HANDLE h; WIN32_FIND_DATA fd; TCHAR *buf0=GetStringFromParm(0x02); h=FindFirstFile(buf0,&fd); if (h == INVALID_HANDLE_VALUE) { *handleout=0; *textout=0; exec_error++; } else { iptrtostr(handleout,(INT_PTR)h); mystrcpy(textout,fd.cFileName); } } break; #endif//NSIS_SUPPORT_FINDFIRST #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT case EW_WRITEUNINSTALLER: { int ret=-666; HANDLE hFile; TCHAR *buf1=GetStringFromParm(-0x10); if (!validpathspec(buf1)) GetStringFromParm(-0x13); remove_ro_attr(buf1); hFile=myOpenFile(buf1,GENERIC_WRITE,CREATE_ALWAYS); if (hFile != INVALID_HANDLE_VALUE) { int dboffset = parm1; if (parm2) { unsigned char *filebuf; int filehdrsize = g_filehdrsize; filebuf=(unsigned char *)GlobalAlloc(GPTR,filehdrsize); if (filebuf) { SetSelfFilePointer(0); ReadSelfFile((char*)filebuf,filehdrsize); { // parm1 = uninstdata_offset // parm2 = m_unicon_size unsigned char* seeker; unsigned char* unicon_data = seeker = (unsigned char*)GlobalAlloc(GPTR,parm2); if (unicon_data) { GetCompressedDataFromDataBlockToMemory(parm1,unicon_data,parm2); while (*seeker) { struct icondata { DWORD dwSize; DWORD dwOffset; } id = *(struct icondata *) seeker; seeker += sizeof(struct icondata); mini_memcpy(filebuf+id.dwOffset, seeker, id.dwSize); seeker += id.dwSize; } GlobalFree(unicon_data); } } myWriteFile(hFile,(char*)filebuf,filehdrsize); GlobalFree(filebuf); dboffset = -1; } } ret=GetCompressedDataFromDataBlock(dboffset, hFile); CloseHandle(hFile); } log_printf3(_T("created uninstaller: %d, \"%s\""),ret,buf1); { int str = LANG_CREATEDUNINST; if (ret < 0) { str = LANG_ERRORCREATING; DeleteFile(buf1); exec_error++; } update_status_text_buf1(str); } } break; #endif//NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_CONFIG_LOG case EW_LOG: if (parm0) { log_printf2(_T("settings logging to %d"),parm1); log_dolog=parm1; log_printf2(_T("logging set to %d"),parm1); #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) if (parm1) build_g_logfile(); else log_write(1); #endif } else { TCHAR *buf0=GetStringFromParm(0x01); log_printf2(_T("%s"),buf0); } break; #endif//NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_COMPONENTPAGE case EW_SECTIONSET: { int x=GetIntFromParm(0); if ((unsigned int)x < (unsigned int)num_sections) { section *sec=g_sections+x; if (parm2>=0) // get something { int res=((int*)sec)[parm2]; if (!parm2) { // getting text mystrcpy(var1,sec->name); } else { // getting number myitoa(var1,res); } } else // set something { parm2=-parm2-1; if (parm2) { // not setting text, get int parm1=GetIntFromParm(1); } else { // setting text GetNSISString(sec->name,parm4); sec->flags|=SF_NAMECHG; // parm1 is zero so name_ptr will be set to zero // if name_ptr is zero, it won't be used after .onInit } ((int*)sec)[parm2]=parm1; if (parm3) // update flags { SectionFlagsChanged(x); } } } else exec_error++; } break; case EW_INSTTYPESET: { int x = GetIntFromParm(0); if ((unsigned int)x < (unsigned int)NSIS_MAX_INST_TYPES) { if (parm3) // current install type { if (parm2) // set install type { SetInstType(x); RefreshSectionGroups(); } else // get install type { myitoa(var1, GetInstType(0)); } } else // install type text { if (parm2) // set text { g_header->install_types[x] = parm1; } else // get text { GetNSISString(var1,g_header->install_types[x]); } } } else exec_error++; } break; #endif//NSIS_CONFIG_COMPONENTPAGE case EW_GETOSINFO: { switch(parm3) { #ifdef NSIS_SUPPORT_FNUTIL case GETOSINFO_KNOWNFOLDER: { TCHAR *outstr = var1; IID kfid; HRESULT(WINAPI*SHGKFP)(REFIID,DWORD,HANDLE,PWSTR*) = (HRESULT(WINAPI*)(REFIID,DWORD,HANDLE,PWSTR*)) myGetProcAddress(MGA_SHGetKnownFolderPath); TCHAR *buf2 = GetStringFromParm(0x22), succ = FALSE; if (SHGKFP && SUCCEEDED(ComIIDFromString(buf2, &kfid))) { PWSTR path; HRESULT hr = SHGKFP(&kfid, parm3, NULL, &path); if (SUCCEEDED(hr)) strcpyWideToT(outstr, path), CoTaskMemFree(path), ++succ; } if (!succ) exec_error++, *outstr = _T('\0'); } break; #endif case GETOSINFO_READMEMORY: { TCHAR *outstr = var1; SIZE_T addr = GetIntPtrFromParm(2), spec = GetIntPtrFromParm(4), value = 0; UINT cb = LOBYTE(spec), offset = (UINT)(spec) >> 24; if (addr == ABI_OSINFOADDRESS) addr = (SIZE_T) (&g_execflags_and_osinfo); mini_memcpy(&value, ((char*) addr) + offset, cb); iptrtostr(outstr, value); } break; } } break; #ifdef NSIS_LOCKWINDOW_SUPPORT case EW_LOCKWINDOW: { // ui_dlg_visible is 1 or 0, so is parm0. It is used because WM_SETREDRAW will toggle WS_VISIBLE! // BUGBUG: This has unfortunate consequences when used in // combination with BringToFront on the first page. // See http://forums.winamp.com/showthread.php?t=397781 for details. SendMessage(g_hwnd, WM_SETREDRAW, parm0 & ui_dlg_visible, 0); if (parm0) InvalidateRect(g_hwnd, NULL, FALSE); break; } #endif //NSIS_LOCKWINDOW_SUPPORT } g_exec_flags.exec_error += exec_error; return 0; } nsis-3.11/Source/exehead/exec.h000077500000000000000000000012411477201124000163510ustar00rootroot00000000000000/* * exec.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/22/2007 */ #ifndef _EXEC_H_ #define _EXEC_H_ #include "api.h" int NSISCALL ExecuteCodeSegment(int pos, HWND hwndProgress); // returns 0 on success int NSISCALL ExecuteCallbackFunction(int num); // returns 0 on success #endif//_EXEC_H_ nsis-3.11/Source/exehead/fileform.c000077500000000000000000000360031477201124000172270ustar00rootroot00000000000000/* * fileform.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #include "../Platform.h" #include "fileform.h" #include "util.h" #include "state.h" #include "resource.h" #include "lang.h" #include "ui.h" #include "exec.h" #include "../crc32.h" #include "../tchar.h" #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT #ifdef NSIS_COMPRESS_USE_ZLIB #include "../zlib/ZLIB.H" #endif #ifdef NSIS_COMPRESS_USE_LZMA #include "../7zip/LZMADecode.h" #define z_stream lzma_stream #define inflateInit(x) lzmaInit(x) #define inflateReset(x) lzmaInit(x) #define inflate(x) lzmaDecode(x) #define Z_OK LZMA_OK #define Z_STREAM_END LZMA_STREAM_END #endif #ifdef NSIS_COMPRESS_USE_BZIP2 #include "../bzip2/bzlib.h" #define z_stream DState #define inflateInit(x) BZ2_bzDecompressInit(x) #define inflateReset(x) BZ2_bzDecompressInit(x) #define inflate(x) BZ2_bzDecompress(x) #define Z_OK BZ_OK #define Z_STREAM_END BZ_STREAM_END #endif//NSIS_COMPRESS_USE_BZIP2 #endif//NSIS_CONFIG_COMPRESSION_SUPPORT struct block_header g_blocks[BLOCKS_NUM]; header *g_header; int g_flags; UINT g_filehdrsize; int g_is_uninstaller; HANDLE g_db_hFile=INVALID_HANDLE_VALUE; #if defined(NSIS_CONFIG_COMPRESSION_SUPPORT) && defined(NSIS_COMPRESS_WHOLE) HANDLE dbd_hFile=INVALID_HANDLE_VALUE; static int dbd_size, dbd_pos, dbd_srcpos, dbd_fulllen; #endif//NSIS_COMPRESS_WHOLE static MAXSIZETYPE m_length; static UINT m_pos; #define _calc_percent() (MulDiv(min(m_pos,m_length),100,m_length)) #ifdef NSIS_COMPRESS_WHOLE static int NSISCALL calc_percent() { return _calc_percent(); } #else #define calc_percent() _calc_percent() #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #if defined(NSIS_CONFIG_CRC_SUPPORT) || defined(NSIS_COMPRESS_WHOLE) INT_PTR CALLBACK verProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_INITDIALOG) { SetTimer(hwndDlg,1,250,NULL); uMsg = WM_TIMER; } if (uMsg == WM_TIMER) { TCHAR bt[64]; int percent=calc_percent(); #ifdef NSIS_COMPRESS_WHOLE TCHAR *msg=g_header?_LANG_UNPACKING:_LANG_VERIFYINGINST; #else TCHAR *msg=_LANG_VERIFYINGINST; #endif wsprintf(bt,msg,percent); my_SetWindowText(hwndDlg,bt); my_SetDialogItemText(hwndDlg,IDC_STR,bt); } return FALSE; } DWORD verify_time; void handle_ver_dlg(BOOL kill) { static HWND hwnd; if (kill) { if (hwnd) DestroyWindow(hwnd); hwnd = NULL; return; } if (hwnd) { MessageLoop(0); } else if (GetTickCount() > verify_time) { #ifdef NSIS_COMPRESS_WHOLE if (g_hwnd) { if (g_exec_flags.status_update & 1) { TCHAR bt[64]; wsprintf(bt, _T("... %d%%"), calc_percent()); update_status_text(0, bt); } } else #endif { hwnd = CreateDialog( g_hInstance, MAKEINTRESOURCE(IDD_VERIFY), 0, verProc ); ShowWindow(hwnd, SW_SHOW); } } } #endif//NSIS_CONFIG_CRC_SUPPORT || NSIS_COMPRESS_WHOLE #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT static z_stream g_inflate_stream; #endif const TCHAR * NSISCALL loadHeaders(int cl_flags) { MAXSIZETYPE left; #ifdef NSIS_CONFIG_CRC_SUPPORT crc32_t crc = 0; int do_crc = 0; #endif//NSIS_CONFIG_CRC_SUPPORT void *data; firstheader h; header *header; HANDLE db_hFile; enum { opentotalwait = 1500, opentrywait = 250, maxopentries = opentotalwait / opentrywait }; UINT opentries = 0; #ifdef C_ASSERT {C_ASSERT(sizeof(firstheader) == sizeof(int) * 7);} {C_ASSERT(sizeof(struct block_header) == sizeof(UINT_PTR) + sizeof(int));} {C_ASSERT(LASIF_FITCTLW >> LASIS_FITCTLW == 1);} {C_ASSERT(LASIF_LR_LOADFROMFILE == LR_LOADFROMFILE);} {C_ASSERT(opentotalwait == opentrywait * maxopentries);} #endif #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT verify_time = GetTickCount() + 1000; #endif #endif//NSIS_CONFIG_CRC_SUPPORT GetModuleFileName(NULL, state_exe_path, NSIS_MAX_STRLEN); retry: g_db_hFile = db_hFile = myOpenFile(state_exe_path, GENERIC_READ, OPEN_EXISTING); if (db_hFile == INVALID_HANDLE_VALUE) { UINT error = GetLastError(); if (error == ERROR_SHARING_VIOLATION && ++opentries <= maxopentries) { Sleep(opentrywait); goto retry; } return _LANG_CANTOPENSELF; } mystrcpy(state_exe_directory, state_exe_path); mystrcpy(state_exe_file, trimslashtoend(state_exe_directory)); left = m_length = GetFileSize(db_hFile,NULL); while (left > 0) { static char temp[32768]; DWORD l = min(left, (g_filehdrsize ? 32768UL : 512UL)); if (!ReadSelfFile(temp, l)) { #if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) handle_ver_dlg(TRUE); #endif//NSIS_CONFIG_CRC_SUPPORT return _LANG_INVALIDCRC; } if (!g_filehdrsize) { mini_memcpy(&h, temp, sizeof(firstheader)); if ( (h.flags & (~FH_FLAGS_MASK)) == 0 && h.siginfo == FH_SIG && h.nsinst[2] == FH_INT3 && h.nsinst[1] == FH_INT2 && h.nsinst[0] == FH_INT1 ) { g_filehdrsize = m_pos; #if defined(NSIS_CONFIG_CRC_SUPPORT) || defined(NSIS_CONFIG_SILENT_SUPPORT) cl_flags |= h.flags; #endif #ifdef NSIS_CONFIG_SILENT_SUPPORT g_exec_flags.silent |= cl_flags & FH_FLAGS_SILENT; #endif if ((MAXEXEDATASIZETYPE) h.length_of_all_following_data > left) return _LANG_INVALIDCRC; #ifdef NSIS_CONFIG_CRC_SUPPORT if ((cl_flags & FH_FLAGS_FORCE_CRC) == 0) { if (cl_flags & FH_FLAGS_NO_CRC) break; } do_crc++; #ifndef NSIS_CONFIG_CRC_ANAL left = h.length_of_all_following_data - 4; // end crc checking at crc :) this means you can tack stuff on the end and it'll still work. #else //!NSIS_CONFIG_CRC_ANAL left -= 4; #endif//NSIS_CONFIG_CRC_ANAL // this is in case the end part is < 512 bytes. if (l > (DWORD)left) l=(DWORD)left; #else//!NSIS_CONFIG_CRC_SUPPORT // no crc support, no need to keep on reading break; #endif//!NSIS_CONFIG_CRC_SUPPORT } } #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT else if ((cl_flags & FH_FLAGS_SILENT) == 0) #endif//NSIS_CONFIG_SILENT_SUPPORT { handle_ver_dlg(FALSE); } #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifndef NSIS_CONFIG_CRC_ANAL if (left < m_length) #endif//NSIS_CONFIG_CRC_ANAL crc = CRC32(crc, (unsigned char*)temp, l); #endif//NSIS_CONFIG_CRC_SUPPORT m_pos += l; left -= l; } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT handle_ver_dlg(TRUE); #endif//NSIS_CONFIG_CRC_SUPPORT #endif//NSIS_CONFIG_VISIBLE_SUPPORT if (!g_filehdrsize) return _LANG_INVALIDCRC; #ifdef NSIS_CONFIG_CRC_SUPPORT if (do_crc) { crc32_t fcrc; SetSelfFilePointer(m_pos); if (!ReadSelfFile(&fcrc, sizeof(crc32_t)) || crc != fcrc) return _LANG_INVALIDCRC; } #endif//NSIS_CONFIG_CRC_SUPPORT data = (void *)GlobalAlloc(GPTR,h.length_of_header); #ifdef NSIS_COMPRESS_WHOLE inflateReset(&g_inflate_stream); { TCHAR fno[MAX_PATH]; my_GetTempFileName(fno, state_temp_dir); dbd_hFile=CreateFile(fno,GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,NULL); if (dbd_hFile == INVALID_HANDLE_VALUE) return _LANG_ERRORWRITINGTEMP; } dbd_srcpos = SetSelfFilePointer(g_filehdrsize + sizeof(firstheader)); #ifdef NSIS_CONFIG_CRC_SUPPORT dbd_fulllen = dbd_srcpos - sizeof(h) + h.length_of_all_following_data - ((h.flags & FH_FLAGS_NO_CRC) ? 0 : sizeof(crc32_t)); #else dbd_fulllen = dbd_srcpos - sizeof(h) + h.length_of_all_following_data; #endif//NSIS_CONFIG_CRC_SUPPORT #else SetSelfFilePointer(g_filehdrsize + sizeof(firstheader)); #endif//NSIS_COMPRESS_WHOLE if (GetCompressedDataFromDataBlockToMemory(-1, data, h.length_of_header) != h.length_of_header) { return _LANG_INVALIDCRC; } header = g_header = data; g_flags = header->flags; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (h.flags & FH_FLAGS_UNINSTALL) g_is_uninstaller++; #endif // set offsets to real memory offsets rather than installer's header offset left = BLOCKS_NUM; while (left--) { #ifdef DEBUG if ((UINT_PTR) h.length_of_header < header->blocks[left].offset) return _LANG_GENERIC_ERROR; // Should never happen #endif header->blocks[left].offset += (UINT_PTR) data; } #ifdef NSIS_COMPRESS_WHOLE header->blocks[NB_DATA].offset = dbd_pos; #else header->blocks[NB_DATA].offset = SetFilePointer(db_hFile,0,NULL,FILE_CURRENT); #endif mini_memcpy(&g_blocks, &header->blocks, sizeof(g_blocks)); return 0; } #define IBUFSIZE 16384 #define OBUFSIZE 32768 // returns -3 if compression error/eof/etc #if !defined(NSIS_COMPRESS_WHOLE) || !defined(NSIS_CONFIG_COMPRESSION_SUPPORT) // Decompress data. int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int outbuflen) { static char inbuffer[IBUFSIZE+OBUFSIZE]; char *outbuffer; int outbuffer_len=outbuf?outbuflen:OBUFSIZE; int retval=0; int input_len; outbuffer = outbuf?(char*)outbuf:(inbuffer+IBUFSIZE); if (offset>=0) { UINT_PTR datofs=g_blocks[NB_DATA].offset+offset; #if (NSIS_MAX_EXEDATASIZE+0) > 0x7fffffffUL #error "SetFilePointer is documented to only support signed 32-bit offsets in lDistanceToMove" #endif const int pos=(int)datofs; SetSelfFilePointer(pos); } if (!ReadSelfFile((LPVOID)&input_len,sizeof(int))) return -3; #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT if (input_len & 0x80000000) // compressed { TCHAR progress[64]; int input_len_total; DWORD ltc = GetTickCount(), tc; inflateReset(&g_inflate_stream); input_len_total = input_len &= 0x7fffffff; // take off top bit. while (input_len > 0) { int l=min(input_len,IBUFSIZE); int err; if (!ReadSelfFile((LPVOID)inbuffer,l)) return -3; g_inflate_stream.next_in = (unsigned char*) inbuffer; g_inflate_stream.avail_in = l; input_len-=l; for (;;) { int u; g_inflate_stream.next_out = (unsigned char*) outbuffer; g_inflate_stream.avail_out = (unsigned int)outbuffer_len; err=inflate(&g_inflate_stream); if (err<0) return -4; u=BUGBUG64TRUNCATE(int, (size_t)((char*)g_inflate_stream.next_out - outbuffer)); tc=GetTickCount(); if (g_exec_flags.status_update & 1 && (tc - ltc > 200 || !input_len)) { wsprintf(progress, _T("... %d%%"), MulDiv(input_len_total - input_len, 100, input_len_total)); update_status_text(0, progress); ltc=tc; } // if there's no output, more input is needed if (!u) break; if (!outbuf) { if (!myWriteFile(hFileOut,outbuffer,u)) return -2; retval+=u; } else { retval+=u; outbuffer_len-=u; outbuffer=(char*)g_inflate_stream.next_out; } if (err==Z_STREAM_END) return retval; } } } else #endif//NSIS_CONFIG_COMPRESSION_SUPPORT { if (!outbuf) { while (input_len > 0) { DWORD l=min(input_len,outbuffer_len); if (!ReadSelfFile((LPVOID)inbuffer,l)) return -3; if (!myWriteFile(hFileOut,inbuffer,l)) return -2; retval+=l; input_len-=l; } } else { int l=min(input_len,outbuflen); if (!ReadSelfFile((LPVOID)outbuf,l)) return -3; retval=l; } } return retval; } #else//NSIS_COMPRESS_WHOLE static char _inbuffer[IBUFSIZE]; static char _outbuffer[OBUFSIZE]; extern MAXSIZETYPE m_length; extern UINT m_pos; extern INT_PTR CALLBACK verProc(HWND, UINT, WPARAM, LPARAM); extern INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); static int NSISCALL __ensuredata(int amount) { int needed=amount-(dbd_size-dbd_pos); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT verify_time=GetTickCount()+500; #endif if (needed>0) { SetSelfFilePointer(dbd_srcpos); SetFilePointer(dbd_hFile,dbd_size,NULL,FILE_BEGIN); m_length=needed; m_pos=0; for (;;) { int err; int l=min(IBUFSIZE,dbd_fulllen-dbd_srcpos); if (!ReadSelfFile((LPVOID)_inbuffer,l)) return -1; dbd_srcpos+=l; g_inflate_stream.next_in=(unsigned char*)_inbuffer; g_inflate_stream.avail_in=l; do { DWORD r; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT if (g_header) #ifdef NSIS_CONFIG_SILENT_SUPPORT if (!g_exec_flags.silent) #endif { m_pos=m_length-(amount-(dbd_size-dbd_pos)); handle_ver_dlg(FALSE); } #endif//NSIS_CONFIG_VISIBLE_SUPPORT g_inflate_stream.next_out=(unsigned char*)_outbuffer; g_inflate_stream.avail_out=OBUFSIZE; err=inflate(&g_inflate_stream); if (err<0) { return -3; } r=BUGBUG64TRUNCATE(DWORD,(UINT_PTR)g_inflate_stream.next_out)-BUGBUG64TRUNCATE(DWORD,(UINT_PTR)_outbuffer); if (r) { if (!myWriteFile(dbd_hFile,_outbuffer,r)) { return -2; } dbd_size+=r; } else if (g_inflate_stream.avail_in || !l) return -3; else break; } while (g_inflate_stream.avail_in); if (amount-(dbd_size-dbd_pos) <= 0) break; } SetFilePointer(dbd_hFile,dbd_pos,NULL,FILE_BEGIN); } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT handle_ver_dlg(TRUE); #endif//NSIS_CONFIG_VISIBLE_SUPPORT return 0; } int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int outbuflen) { DWORD r; int input_len; int retval; if (offset>=0) { UINT_PTR datofs=g_blocks[NB_DATA].offset+offset; #if (NSIS_MAX_EXEDATASIZE+0) > 0x7fffffffUL #error "SetFilePointer is documented to only support signed 32-bit offsets in lDistanceToMove" #endif dbd_pos=(int)datofs; SetFilePointer(dbd_hFile,dbd_pos,NULL,FILE_BEGIN); } retval=__ensuredata(sizeof(int)); if (retval<0) return retval; if (!myReadFile(dbd_hFile,(LPVOID)&input_len,sizeof(int))) return -3; dbd_pos+=sizeof(int); retval=__ensuredata(input_len); if (retval < 0) return retval; if (!outbuf) { while (input_len > 0) { DWORD l=min(input_len,IBUFSIZE); if (!myReadFile(dbd_hFile,(LPVOID)_inbuffer,r=l)) return -3; if (!myWriteFile(hFileOut,_inbuffer,r)) return -2; retval+=r; input_len-=r; dbd_pos+=r; } } else { if (!ReadFile(dbd_hFile,(LPVOID)outbuf,min(input_len,outbuflen),&r,NULL)) return -3; retval=r; dbd_pos+=r; } return retval; } #endif//NSIS_COMPRESS_WHOLE BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead) { return myReadFile(g_db_hFile,lpBuffer,nNumberOfBytesToRead); } DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove) { return SetFilePointer(g_db_hFile,lDistanceToMove,NULL,FILE_BEGIN); } nsis-3.11/Source/exehead/fileform.h000077500000000000000000000532561477201124000172450ustar00rootroot00000000000000/* * fileform.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #include "config.h" #include "../Platform.h" #ifndef _FILEFORM_H_ #define _FILEFORM_H_ // * the installer is composed of the following parts: // exehead (~34kb) // firstheader (struct firstheader) // * headers (compressed together): // header (struct header - contains pointers to all blocks) // * nsis blocks (described in header->blocks) // pages (struct page) // section headers (struct section) // entries/instructions (struct entry) // strings (null separated) // language tables (language id, dialog offset, language strings) // colors (struct color) // data block (compressed files and uninstaller data) // CRC (optional - 4 bytes) // // headers + datablock is at least 512 bytes if CRC enabled #define MAX_ENTRY_OFFSETS 6 // if you want people to not be able to decompile your installers as easily, // reorder the lines following EW_INVALID_OPCODE randomly. enum { EW_INVALID_OPCODE, // zero is invalid. useful for catching errors. (otherwise an all zeroes instruction // does nothing, which is easily ignored but means something is wrong) EW_RET, // return from function call EW_NOP, // Nop/Jump, do nothing: 1, [?new address+1:advance one] EW_ABORT, // Abort: 1 [status] EW_QUIT, // Quit: 0 EW_CALL, // Call: 1 [new address+1] EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this] EW_SLEEP, // Sleep: 1 [sleep time in milliseconds] EW_BRINGTOFRONT, // BringToFront: 0 EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction] EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes] EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR, ?restrictAcl] EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists] EW_SETFLAG, // Sets a flag: 2 [id, data] EW_IFFLAG, // If a flag: 4 [on, off, id, new value mask] EW_GETFLAG, // Gets a flag: 2 [output, id] #ifdef NSIS_SUPPORT_RENAME EW_RENAME, // Rename: 3 [old, new, rebootok] #endif #ifdef NSIS_SUPPORT_FNUTIL EW_GETFULLPATHNAME, // GetFullPathName: 2 [output, input, ?lfn:sfn] EW_SEARCHPATH, // SearchPath: 2 [output, filename] EW_GETTEMPFILENAME, // GetTempFileName: 2 [output, base_dir] #endif #ifdef NSIS_SUPPORT_FILE EW_EXTRACTFILE, // File to extract: 6 [overwriteflag, output filename, compressed filedata, filedatetimelow, filedatetimehigh, allow ignore] // overwriteflag: 0x1 = no. 0x0=force, 0x2=try, 0x3=if date is newer #endif #ifdef NSIS_SUPPORT_DELETE EW_DELETEFILE, // Delete File: 2, [filename, rebootok] #endif #ifdef NSIS_SUPPORT_MESSAGEBOX EW_MESSAGEBOX, // MessageBox: 5,[MB_flags,text,retv1:retv2,moveonretv1:moveonretv2] #endif #ifdef NSIS_SUPPORT_RMDIR EW_RMDIR, // RMDir: 2 [path, recursiveflag] #endif #ifdef NSIS_SUPPORT_STROPTS EW_STRLEN, // StrLen: 2 [output, input] EW_ASSIGNVAR, // Assign: 4 [variable (0-9) to assign, string to assign, maxlen, startpos] EW_STRCMP, // StrCmp: 5 [str1, str2, jump_if_equal, jump_if_not_equal, case-sensitive?] #endif #ifdef NSIS_SUPPORT_ENVIRONMENT EW_READENVSTR, // ReadEnvStr/ExpandEnvStrings: 3 [output, string_with_env_variables, IsRead] #endif #ifdef NSIS_SUPPORT_INTOPTS EW_INTCMP, // IntCmp: 6 [val1, val2, equal, val1val2, flags] where flags: bit 0x01 is set for unsigned operations and bit 0x8000 is set for 64-bit operations EW_INTOP, // IntOp: 4 [output, input1, input2, op] where op: 0=add, 1=sub, 2=mul, 3=div, 4=bor, 5=band, 6=bxor, 7=bnot input1, 8=lor, 9=land 10=mod, 11=shl, 12=sar, 13=shr (bneg is implemented with bxor in compiler) EW_INTFMT, // IntFmt: 4 [output, format, input, 64-bit] #endif #ifdef NSIS_SUPPORT_STACK EW_PUSHPOP, // Push/Pop/Exchange: 3 [variable/string, ?pop:push, ?exch] #endif #ifdef NSIS_SUPPORT_HWNDS EW_FINDWINDOW, // FindWindow: 5, [outputvar, window class,window name, window_parent, window_after] EW_SENDMESSAGE, // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2] EW_ISWINDOW, // IsWindow: 3 [hwnd, jump_if_window, jump_if_notwindow] #endif #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT EW_GETDLGITEM, // GetDlgItem: 3: [outputvar, dialog, item_id] EW_SETCTLCOLORS, // SerCtlColors: 3: [hwnd, pointer to struct colors] EW_LOADANDSETIMAGE, // SetBrandingImage/LoadAndSetImage: 5: [ctrl imagetype lrflags imageid [output]] EW_CREATEFONT, // CreateFont: 5: [handle output, face name, height, weight, flags] EW_SHOWWINDOW, // ShowWindow: 2: [hwnd, show state] #endif #ifdef NSIS_SUPPORT_SHELLEXECUTE EW_SHELLEXEC, // ShellExecute program: 5, [SEE_MASK_FLAG_*, verb, file, parameters, showwindow] (Will wait if SEE_MASK_NOCLOSEPROCESS is set) #endif #ifdef NSIS_SUPPORT_EXECUTE EW_EXECUTE, // Execute program: 3,[complete command line,waitflag,>=0?output errorcode] #endif #ifdef NSIS_SUPPORT_GETFILETIME EW_GETFILETIME, // GetFileTime; 3 [file highout lowout] #endif #ifdef NSIS_SUPPORT_GETDLLVERSION EW_GETDLLVERSION, // GetDLLVersion: 4 [file highout lowout fixedoffset] #endif #ifdef NSIS_SUPPORT_ACTIVEXREG EW_REGISTERDLL, // Register DLL: 3,[DLL file name, string ptr of function to call, text to put in display (<0 if none/pass parms), 1 - no unload, 0 - unload] #endif #ifdef NSIS_SUPPORT_CREATESHORTCUT EW_CREATESHORTCUT, // Make Shortcut: 5, [link file, target file, parameters, icon file, packed CS_*] #endif #ifdef NSIS_SUPPORT_COPYFILES EW_COPYFILES, // CopyFiles: 3 [source mask, destination location, flags] #endif #ifdef NSIS_SUPPORT_REBOOT EW_REBOOT, // Reboot: 0 #endif #ifdef NSIS_SUPPORT_INIFILES EW_WRITEINI, // Write INI String: 4, [Section, Name, Value, INI File] EW_READINISTR, // ReadINIStr: 4 [output, section, name, ini_file] #endif #ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS EW_DELREG, // DeleteRegValue/DeleteRegKey: 4, [root key(int), KeyName, ValueName, ActionAndFlags(DELREG*)] EW_WRITEREG, // Write Registry value: 5, [RootKey(int),KeyName,ItemName,ItemData,typelen] // typelen=1 for str, 2 for dword, 3 for binary, 0 for expanded str EW_READREGSTR, // ReadRegStr: 5 [output, rootkey(int), keyname, itemname, ==1?int::str] EW_REGENUM, // RegEnum: 5 [output, rootkey, keyname, index, ?key:value] #endif #ifdef NSIS_SUPPORT_FILEFUNCTIONS EW_FCLOSE, // FileClose: 1 [handle] EW_FOPEN, // FileOpen: 4 [name, openmode, createmode, outputhandle] EW_FPUTS, // FileWrite: 3 [handle, string, ?int:string] EW_FGETS, // FileRead: 4 [handle, output, maxlen, ?getchar:gets] EW_FSEEK, // FileSeek: 4 [handle, offset, mode, >=0?positionoutput] #endif//NSIS_SUPPORT_FILEFUNCTIONS #ifdef NSIS_SUPPORT_FINDFIRST EW_FINDCLOSE, // FindClose: 1 [handle] EW_FINDNEXT, // FindNext: 2 [output, handle] EW_FINDFIRST, // FindFirst: 2 [filespec, output, handleoutput] #endif #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT EW_WRITEUNINSTALLER, // WriteUninstaller: 3 [name, offset, icon_size] #endif #ifdef NSIS_CONFIG_LOG EW_LOG, // LogText: 2 [0, text] / LogSet: [1, logstate] #endif #ifdef NSIS_CONFIG_COMPONENTPAGE EW_SECTIONSET, // SectionSetText: 3: [idx, 0, text] // SectionGetText: 3: [idx, 1, output] // SectionSetFlags: 3: [idx, 2, flags] // SectionGetFlags: 3: [idx, 3, output] EW_INSTTYPESET, // InstTypeSetFlags: 3: [idx, 0, flags] // InstTypeGetFlags: 3: [idx, 1, output] #endif EW_GETOSINFO, // 1+ [operation, ...] EW_RESERVEDOPCODE, // Free slot, feel free to use it for something #ifdef NSIS_LOCKWINDOW_SUPPORT EW_LOCKWINDOW, #endif #ifdef _UNICODE // opcodes available only in Unicode installers must be at the end of the enumeration #ifdef NSIS_SUPPORT_FILEFUNCTIONS EW_FPUTWS, // FileWriteUTF16LE: 4 [handle, string, ?int:string, TryWriteBOM] EW_FGETWS, // FileReadUTF16LE: 4 [handle, output, maxlen, ?getchar:gets] #endif//NSIS_SUPPORT_FILEFUNCTIONS #endif // Opcodes listed here are not actually used in exehead. No exehead opcodes should be present after these! EW_GETLABELADDR, // --> EW_ASSIGNVAR EW_GETFUNCTIONADDR, // --> EW_ASSIGNVAR }; #pragma pack(push, 1) // fileform.cpp assumes no padding/alignment #define FH_FLAGS_MASK 15 #define FH_FLAGS_UNINSTALL 1 #ifdef NSIS_CONFIG_SILENT_SUPPORT # define FH_FLAGS_SILENT 2 #endif #ifdef NSIS_CONFIG_CRC_SUPPORT # define FH_FLAGS_NO_CRC 4 # define FH_FLAGS_FORCE_CRC 8 #endif #define FH_SIG 0xDEADBEEF // neato surprise signature that goes in firstheader. :) #define FH_INT1 0x6C6C754E #define FH_INT2 0x74666F73 #define FH_INT3 0x74736E49 typedef struct { int flags; // FH_FLAGS_* int siginfo; // FH_SIG int nsinst[3]; // FH_INT1,FH_INT2,FH_INT3 // these point to the header+sections+entries+stringtable in the datablock int length_of_header; // this specifies the length of all the data (including the firstheader and CRC) int length_of_all_following_data; } firstheader; // Flags for common_header.flags #define CH_FLAGS_DETAILS_SHOWDETAILS 1 #define CH_FLAGS_DETAILS_NEVERSHOW 2 #define CH_FLAGS_PROGRESS_COLORED 4 #ifdef NSIS_CONFIG_SILENT_SUPPORT #define CH_FLAGS_SILENT 8 #define CH_FLAGS_SILENT_LOG 16 #endif #define CH_FLAGS_AUTO_CLOSE 32 #define CH_FLAGS_DIR_NO_SHOW 64 #define CH_FLAGS_NO_ROOT_DIR 128 #ifdef NSIS_CONFIG_COMPONENTPAGE #define CH_FLAGS_COMP_ONLY_ON_CUSTOM 256 #define CH_FLAGS_NO_CUSTOM 512 #endif // nsis blocks struct block_header { #ifdef MAKENSIS int offset; #else UINT_PTR offset; // exehead stores a memory location here so it needs to be pointer sized #endif int num; }; enum { #ifdef NSIS_CONFIG_VISIBLE_SUPPORT NB_PAGES, #endif NB_SECTIONS, NB_ENTRIES, NB_STRINGS, NB_LANGTABLES, NB_CTLCOLORS, #ifdef NSIS_SUPPORT_BGBG NB_BGFONT, #endif NB_DATA, BLOCKS_NUM }; // nsis strings typedef TCHAR NSIS_STRING[NSIS_MAX_STRLEN]; // Settings common to both installers and uninstallers typedef struct { int flags; // CH_FLAGS_* struct block_header blocks[BLOCKS_NUM]; // CEXEBuild::get_header_size needs to adjust the size of this based on the targets pointer size // InstallDirRegKey stuff int install_reg_rootkey; // these two are not processed! int install_reg_key_ptr, install_reg_value_ptr; #ifdef NSIS_SUPPORT_BGBG int bg_color1, bg_color2, bg_textcolor; #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT // installation log window colors int lb_bg, lb_fg; #endif // langtable size int langtable_size; #ifdef NSIS_CONFIG_LICENSEPAGE // license background color int license_bg; #endif//NSIS_CONFIG_LICENSEPAGE #ifdef NSIS_SUPPORT_CODECALLBACKS // .on* calls int code_onInit; int code_onInstSuccess; int code_onInstFailed; int code_onUserAbort; #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT int code_onGUIInit; int code_onGUIEnd; int code_onMouseOverSection; #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT int code_onVerifyInstDir; #ifdef NSIS_CONFIG_COMPONENTPAGE int code_onSelChange; #endif//NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_SUPPORT_REBOOT int code_onRebootFailed; #endif//NSIS_SUPPORT_REBOOT #endif//NSIS_SUPPORT_CODECALLBACKS #ifdef NSIS_CONFIG_COMPONENTPAGE int install_types[NSIS_MAX_INST_TYPES+1]; #endif int install_directory_ptr; // default install dir. int install_directory_auto_append; // auto append part #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT int str_uninstchild; int str_uninstcmd; #endif//NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_SUPPORT_MOVEONREBOOT int str_wininit; // Points to the path of wininit.ini #endif//NSIS_SUPPORT_MOVEONREBOOT } header; #ifdef NSIS_SUPPORT_CODECALLBACKS // callback indices enum { CB_ONINIT, CB_ONINSTSUCCESS, CB_ONINSTFAILED, CB_ONUSERABORT, #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT CB_ONGUIINIT, CB_ONGUIEND, CB_ONMOUSEOVERSECTION, #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT CB_ONVERIFYINSTDIR, #ifdef NSIS_CONFIG_COMPONENTPAGE CB_ONSELCHANGE, #endif//NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_SUPPORT_REBOOT CB_ONREBOOTFAILED #endif//NSIS_SUPPORT_REBOOT }; #endif//NSIS_SUPPORT_CODECALLBACKS // used for section->flags #define SF_SELECTED 1 #define SF_SECGRP 2 #define SF_SECGRPEND 4 #define SF_BOLD 8 #define SF_RO 16 #define SF_EXPAND 32 #define SF_PSELECTED 64 #define SF_TOGGLED 128 #define SF_NAMECHG 256 typedef struct { int name_ptr; // initial name pointer int install_types; // bits set for each of the different install_types, if any. int flags; // SF_* - defined above // for labels, it looks like it's only used to track how often it is used. int code; // The "address" of the start of the code in count of struct entries. int code_size; // The size of the code in num of entries? int size_kb; TCHAR name[NSIS_MAX_STRLEN]; // '' for invisible sections } section; #define SECTION_OFFSET(field) (FIELD_OFFSET(section, field)/sizeof(int)) typedef struct { int which; // EW_* enum. Look at the enum values to see what offsets mean. int offsets[MAX_ENTRY_OFFSETS]; // count and meaning of offsets depend on 'which' // sometimes they are just straight int values or bool // values and sometimes they are indices into string // tables. } entry; // page window proc enum { #ifdef NSIS_CONFIG_LICENSEPAGE PWP_LICENSE, #endif #ifdef NSIS_CONFIG_COMPONENTPAGE PWP_SELCOM, #endif PWP_DIR, PWP_INSTFILES, #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT PWP_UNINST, #endif PWP_COMPLETED, PWP_CUSTOM }; // page flags #define PF_BACK_ENABLE 256 #define PF_NEXT_ENABLE 2 #define PF_CANCEL_ENABLE 4 #define PF_BACK_SHOW 8 // must be SW_SHOWNA, don't change #define PF_LICENSE_STREAM 16 #define PF_LICENSE_FORCE_SELECTION 32 #define PF_LICENSE_NO_FORCE_SELECTION 64 #define PF_LICENSE_SELECTED 1 // must be 1 #define PF_NO_NEXT_FOCUS 128 #define PF_PAGE_EX 512 #define PF_DIR_NO_BTN_DISABLE 1024 typedef struct { int dlg_id; // dialog resource id int wndproc_id; #ifdef NSIS_SUPPORT_CODECALLBACKS // called before the page is created, or if custom to show the page // use Abort to skip the page int prefunc; // called right before page is shown int showfunc; // called when the user leaves to the next page // use Abort to force the user to stay on this page int leavefunc; #endif //NSIS_SUPPORT_CODECALLBACKS int flags; int caption; int back; int next; int clicknext; int cancel; int parms[5]; } page; // EW_LOADANDSETIMAGE flags, masks and shifts #define LASIS_FITCTLW 31 // Top bit because it MUST shift to a value of 0 or 1 #define LASIF_FITCTLW ( (unsigned int)1 << LASIS_FITCTLW ) #define LASIF_FITCTLH ( (unsigned int)1 << 30 ) #define LASIM_IMAGE 0x00000003 // IMAGE_* #define LASIF_EXERES 0x00000004 // GetModuleHandle(NULL). #define LASIF_HWND 0x00000100 // Don't call GetDlgItem. #define LASIF_STRID 0x00010000 #define LASIM_LR ( 0x0000fff0 & ~(LASIM_IMAGE|LASIF_EXERES|LASIF_HWND|LASIF_STRID) ) #define LASIF_LR_LOADFROMFILE 0x00000010 // ctlcolors text/bg color flags #define CC_TEXT 1 #define CC_TEXT_SYS 2 #define CC_BK 4 #define CC_BK_SYS 8 #define CC_BKB 16 #define CC_FLAGSMASK 0x1f #define CC_FLAGSSHIFTFORZERO 5 typedef struct { COLORREF text; COLORREF bkc; UINT lbStyle; #ifndef MAKENSIS HBRUSH bkb; #else INT32 bkb; #endif int bkmode; int flags; } ctlcolors32; typedef struct { COLORREF text; COLORREF bkc; #ifndef MAKENSIS HBRUSH bkb; // NOTE: Placed above lbStyle for better alignment #else INT64 bkb; #endif UINT lbStyle; int bkmode; int flags; } ctlcolors64; #if defined(_WIN64) && !defined(MAKENSIS) # define ctlcolors ctlcolors64 #else # define ctlcolors ctlcolors32 #endif // constants for myDelete (util.c) #define DEL_DIR 1 #define DEL_RECURSE 2 #define DEL_REBOOT 4 #define DEL_SIMPLE 8 #define REGROOTVIEW32 0x40000000 #define REGROOTVIEW64 0x20000000 #define REGROOTVIEWTOSAMVIEW(rv) ( (UINT)(((UINT_PTR)(rv)&(REGROOTVIEW32|REGROOTVIEW64)) >> 21) ) // REGROOTVIEWxx to KEY_WOW64_xxKEY #define IsRegRootkeyForcedView(hKey) ( ((UINT_PTR) (hKey) & (REGROOTVIEW32|REGROOTVIEW64)) ) #define MAKEREGROOTVIEW(r, fv) ( (HKEY) ((UINT_PTR)(r) | (fv)) ) #define HKSHCTX ( (HKEY) 0 ) // Converted to HKCU or HKLM by GetRegRootKey #define HKSHCTX32 MAKEREGROOTVIEW(HKSHCTX, REGROOTVIEW32) #define HKSHCTX64 MAKEREGROOTVIEW(HKSHCTX, REGROOTVIEW64) #define HKCR32 MAKEREGROOTVIEW(HKEY_CLASSES_ROOT, REGROOTVIEW32) #define HKCR64 MAKEREGROOTVIEW(HKEY_CLASSES_ROOT, REGROOTVIEW64) #define HKCU32 MAKEREGROOTVIEW(HKEY_CURRENT_USER, REGROOTVIEW32) #define HKCU64 MAKEREGROOTVIEW(HKEY_CURRENT_USER, REGROOTVIEW64) #define HKLM32 MAKEREGROOTVIEW(HKEY_LOCAL_MACHINE, REGROOTVIEW32) #define HKLM64 MAKEREGROOTVIEW(HKEY_LOCAL_MACHINE, REGROOTVIEW64) #define HKSHCTXANY MAKEREGROOTVIEW(HKSHCTX, REGROOTVIEW32|REGROOTVIEW64) #define HKCRANY MAKEREGROOTVIEW(HKEY_CLASSES_ROOT, REGROOTVIEW32|REGROOTVIEW64) #define HKCUANY MAKEREGROOTVIEW(HKEY_CURRENT_USER, REGROOTVIEW32|REGROOTVIEW64) #define HKLMANY MAKEREGROOTVIEW(HKEY_LOCAL_MACHINE, REGROOTVIEW32|REGROOTVIEW64) #define DELREG_VALUE 0 // TOK_DELETEREGVALUE #define DELREG_KEY 1 // TOK_DELETEREGKEY #define DELREGKEY_ONLYIFNOSUBKEYS 0x01 // Note: Shifted (stored as 2 in the binary) for compatibility with <= v3.1 #define DELREGKEY_ONLYIFNOVALUES 0x02 // DELREGKEY_SAMVIEWMASK REGROOTVIEWTOSAMVIEW(REGROOTVIEW32|REGROOTVIEW64) // Reserved for KEY_WOW64_xxKEY, cannot be used as flags! #define DELREGKEYFLAGSSHIFT 1 // exehead removes the DELREG_KEY bit in parm4 by shifting. After shifting the bits are DELREGKEY_*. #ifdef NSIS_SUPPORT_CREATESHORTCUT #define CS_HK_MASK 0xffff0000 // HotKey #define CS_HK_SHIFT 16 #define CS_NWD 0x00008000 // NoWorkingDirectory flag #define CS_SC_MASK 0x00007000 // ShowCmd #define CS_SC_SHIFT 12 #define CS_II_MASK 0x00000fff // IconIndex #define CS_II_SHIFT 0 #define CS_II_MAX (CS_II_MASK >> CS_II_SHIFT) #endif #define GETOSINFO_KNOWNFOLDER 0 #define GETOSINFO_READMEMORY 1 typedef struct { UINT32 WVBuild; BYTE WVProd; // W9x: 0, WNT:AnyServer: & 2, WNT:DC: & 7 == 3 BYTE WVSP; BYTE WVMin; BYTE WVMaj; } osinfo; #define ABI_OSINFOOFFSET ( sizeof(exec_flags_t) ) #define ABI_OSINFOADDRESS ( 0 ) // special escape characters used in strings: (we use control codes in order to minimize conflicts with normal characters) #define NS_LANG_CODE _T('\x01') // for a langstring #define NS_SHELL_CODE _T('\x02') // for a shell folder path #define NS_VAR_CODE _T('\x03') // for a variable #define NS_SKIP_CODE _T('\x04') // to consider next character as a normal character #define NS_IS_CODE(x) ((x) <= NS_SKIP_CODE) // NS_SKIP_CODE must always be the higher code // We are doing this to store an integer value into a char string and we // don't want false end of string values #define CODE_SHORT(x) (WORD)((((WORD)(x) & 0x7F) | (((WORD)(x) & 0x3F80) << 1) | 0x8080)) #define MAX_CODED 0x3FFF // This macro takes a pointer to CHAR #define DECODE_SHORT(c) (((((char*)c)[1] & 0x7F) << 7) | (((char*)c)[0] & 0x7F)) #define NSIS_INSTDIR_INVALID 1 #define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2 #define FIELDN(x, y) (((int *)&x)[y]) #pragma pack(pop) #define NSIS_MAX_EXEDATASIZE 0x7fffffffUL // Maximum size of .exe including compressed installer data. #ifndef NSIS_CONFIG_CRC_ANAL #define NSIS_MAX_EXEFILESIZE 0xffffffffUL // Maximum size of .exe including compressed installer data AND 3rd-party appended data. (Windows refuses to run .EXE files larger than 4 GiB) #else #define NSIS_MAX_EXEFILESIZE NSIS_MAX_EXEDATASIZE #endif #ifdef EXEHEAD // the following are only used/implemented in exehead, not makensis. #if NSIS_MAX_EXEDATASIZE <= 0xffffffffUL #define MAXEXEDATASIZETYPE UINT // Maximum size of .exe including compressed installer data. (Unsigned allows size including 3rd-party appended data to be 4 GiB instead of 2 GiB) #endif #define MAXSIZETYPE UINT int NSISCALL isheader(firstheader *h); // returns 0 on not header, length_of_datablock on success // returns nonzero on error // returns 0 on success // on success, m_header will be set to a pointer that should eventually be GlobalFree()'d. // (or m_uninstheader) const TCHAR * NSISCALL loadHeaders(int cl_flags); int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int outbuflen); #define GetCompressedDataFromDataBlock(offset, hFileOut) _dodecomp(offset,hFileOut,NULL,0) #define GetCompressedDataFromDataBlockToMemory(offset, out, out_len) _dodecomp(offset,NULL,out,out_len) extern HANDLE g_db_hFile; extern int g_quit_flag; BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead); DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove); extern struct block_header g_blocks[BLOCKS_NUM]; extern header *g_header; extern int g_flags; extern UINT g_filehdrsize; extern int g_is_uninstaller; #define g_pages ( (page*) g_blocks[NB_PAGES].offset ) #define g_sections ( (section*) g_blocks[NB_SECTIONS].offset ) #define num_sections ( g_blocks[NB_SECTIONS].num ) #define g_entries ( (entry*) g_blocks[NB_ENTRIES].offset ) #endif #endif //_FILEFORM_H_ nsis-3.11/Source/exehead/lang.h000077500000000000000000000056571477201124000163650ustar00rootroot00000000000000/* * lang.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #ifndef _NSIS_LANG_H_ #define _NSIS_LANG_H_ // generic startup strings (these will never be overridable) #define _LANG_INVALIDCRC _T("Installer integrity check has failed. Common causes include\n") \ _T("incomplete download and damaged media. Contact the\n") \ _T("installer's author to obtain a new copy.\n\n") \ _T("More information at:\n") \ _T("http://nsis.sf.net/NSIS_Error") #define _LANG_ERRORWRITINGTEMP _T("Error writing temporary file. Make sure your temp folder is valid.") #define _LANG_UNINSTINITERROR _T("Error launching installer") #define _LANG_VERIFYINGINST _T("verifying installer: %d%%") #define _LANG_UNPACKING _T("unpacking data: %d%%") #define _LANG_CANTOPENSELF _T("Error launching installer") // same as uninstiniterror for size #define _LANG_GENERIC_ERROR _T("NSIS Error") // We store index to the current language table as a negative // index value - 1. So this macro, undoes that into a valid // index. #define LANG_STR_TAB(x) cur_langtable[-((int)x+1)] #define LANG_BRANDING -1 #define LANG_CAPTION -2 #define LANG_NAME -3 #define LANG_SPACE_AVAIL -4 #define LANG_SPACE_REQ -5 #define LANG_CANTWRITE -6 #define LANG_COPYFAILED -7 #define LANG_COPYTO -8 #define LANG_CANNOTFINDSYMBOL -9 #define LANG_COULDNOTLOAD -10 #define LANG_CREATEDIR -11 #define LANG_CREATESHORTCUT -12 #define LANG_CREATEDUNINST -13 #define LANG_DELETEFILE -14 #define LANG_DELETEONREBOOT -15 #define LANG_ERRORCREATINGSHORTCUT -16 #define LANG_ERRORCREATING -17 #define LANG_ERRORDECOMPRESSING -18 #define LANG_DLLREGERROR -19 #define LANG_EXECSHELL -20 #define LANG_EXECUTE -21 #define LANG_EXTRACT -22 #define LANG_ERRORWRITING -23 #define LANG_INSTCORRUPTED -24 #define LANG_NOOLE -25 #define LANG_OUTPUTDIR -26 #define LANG_REMOVEDIR -27 #define LANG_RENAMEONREBOOT -28 #define LANG_RENAME -29 #define LANG_SKIPPED -30 #define LANG_COPYDETAILS -31 #define LANG_LOG_INSTALL_PROCESS -32 #define LANG_BYTE -33 #define LANG_KILO -34 #define LANG_MEGA -35 #define LANG_GIGA -36 #endif//_NSIS_LANG_H_ nsis-3.11/Source/exehead/nsis.ico000077500000000000000000000013761477201124000167350ustar00rootroot00000000000000 è( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwxÝxøðˆÝ™€p‡øýÙ™ˆxøð‡xˆÙ˜ˆ€xw‡‡øÙˆ‹°xøð‡xxxp ‹»°€xw‡‡»¸€xøð‡xˆ»xxp€xx»‰°‡‡€ÿð‡{¸›½ÿxxpÿðxw‰»½ø÷‡ÿð‡‡›»Ýxˆˆÿðˆˆ{½Ýˆøðˆpÿðˆˆ}݈€wwˆpÿðˆˆ÷wwÿÿÿÿpwwpˆˆwwwwwwwxpwwpˆˆ€ÿÿ÷ˆˆˆˆˆˆˆˆ‡wwwwpˆÿÿÿÿÿÿÿ‡wwð‡wwpð‡ÿÿðð‡wwpðð‡ðÿÿð‡ðÿÿð‡ðÿð‡ðÿ‡ð‡ð‡ÿÿÿÿÿÿÿ‡wwwwwwwwÿþÿÀøÿÀpÿÀ ÀÀ?À?À`?À`?À?À?ÀÀÀÀÀÀÀ€øüþÿÿøÿøÿøÿøÿøÿøÿøÿünsis-3.11/Source/exehead/plugin.c000077500000000000000000000033661477201124000167300ustar00rootroot00000000000000/* * plugin.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "plugin.h" #ifdef NSIS_CONFIG_PLUGIN_SUPPORT typedef struct _loaded_plugin { struct _loaded_plugin* next; NSISPLUGINCALLBACK proc; HMODULE dll; } loaded_plugin; static loaded_plugin* g_plugins = 0; // not thread safe! void NSISCALL Plugins_SendMsgToAllPlugins(int msg) { loaded_plugin* p; for (p = g_plugins; p; p = p->next) { p->proc(msg); } } void NSISCALL Plugins_UnloadAll() { loaded_plugin* p = g_plugins; Plugins_SendMsgToAllPlugins(NSPIM_UNLOAD); while (p) { loaded_plugin* oldp = p; p = oldp->next; FreeLibrary(oldp->dll); GlobalFree(oldp); } g_plugins = NULL; } BOOL NSISCALL Plugins_CanUnload(HANDLE pluginHandle) { loaded_plugin* p; for (p = g_plugins; p; p = p->next) { if (p->dll == pluginHandle) { return FALSE; } } return TRUE; } int NSISCALL RegisterPluginCallback(HMODULE pluginHandle, NSISPLUGINCALLBACK proc) { loaded_plugin* p; if (!Plugins_CanUnload(pluginHandle)) { // already registered return 1; } p = (loaded_plugin*) GlobalAlloc(GPTR, sizeof(loaded_plugin)); if (p) { p->proc = proc; p->dll = pluginHandle; p->next = g_plugins; g_plugins = p; return 0; } return -1; } #endif /* #ifdef NSIS_CONFIG_PLUGIN_SUPPORT */ nsis-3.11/Source/exehead/plugin.h000077500000000000000000000015671477201124000167360ustar00rootroot00000000000000/* * plugin.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef _PLUGIN_H_ #define _PLUGIN_H_ #include "../Platform.h" #include "fileform.h" #include "api.h" #ifdef NSIS_CONFIG_PLUGIN_SUPPORT extern int NSISCALL RegisterPluginCallback(HMODULE pluginHandle, NSISPLUGINCALLBACK proc); extern void NSISCALL Plugins_SendMsgToAllPlugins(int msg); extern void NSISCALL Plugins_UnloadAll(); extern BOOL NSISCALL Plugins_CanUnload(HANDLE pluginHandle); #endif /* #ifdef NSIS_CONFIG_PLUGIN_SUPPORT */ #endif /* _PLUGIN_H_ */ nsis-3.11/Source/exehead/resource.h000077500000000000000000000037741477201124000172710ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by resource.rc // #ifndef DS_SHELLFONT #define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS) #endif #define IDC_BACK 3 #define IDD_LICENSE 102 #define IDD_LICENSE_FSRB 108 #define IDD_LICENSE_FSCB 109 #define IDI_ICON2 103 #define IDD_DIR 103 #define IDD_SELCOM 104 #define IDD_INST 105 #define IDD_INSTFILES 106 #define IDD_UNINST 107 #define IDD_VERIFY 111 #define IDB_BITMAP1 110 #define IDC_EDIT1 1000 #define IDC_BROWSE 1001 #define IDC_PROGRESS 1004 #define IDC_INTROTEXT 1006 #define IDC_CHECK1 1008 #define IDC_LIST1 1016 #define IDC_COMBO1 1017 #define IDC_CHILDRECT 1018 #define IDC_DIR 1019 #define IDC_SELDIRTEXT 1020 #define IDC_TEXT1 1021 #define IDC_TEXT2 1022 #define IDC_SPACEREQUIRED 1023 #define IDC_SPACEAVAILABLE 1024 #define IDC_SHOWDETAILS 1027 #define IDC_VERSTR 1028 #define IDC_UNINSTFROM 1029 #define IDC_STR 1030 #define IDC_ULICON 1031 #define IDC_TREE1 1032 #define IDC_BRANDIMAGE 1033 #define IDC_LICENSEAGREE 1034 #define IDC_LICENSEDISAGREE 1035 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 112 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1036 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif nsis-3.11/Source/exehead/resource.rc000077500000000000000000000215341477201124000174400ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" #include "config.h" #undef RICHEDIT_CLASS #ifdef UNICODE #define RICHEDIT_CLASS "RichEdit20W" #else #define RICHEDIT_CLASS "RichEdit20A" #endif ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_LICENSEPAGE) #if defined(APSTUDIO_INVOKED) IDD_LICENSE$(NSIS_CONFIG_LICENSEPAGE) DIALOGEX 0, 0, 266, 130 #else IDD_LICENSE DIALOGEX 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDI_ICON2,IDC_ULICON,0,0,22,20 LTEXT "",IDC_INTROTEXT,25,0,241,23 CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,105 END #endif #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_LICENSEPAGE) #if defined(APSTUDIO_INVOKED) IDD_LICENSE_FSRB$(NSIS_CONFIG_LICENSEPAGE) DIALOG DISCARDABLE 0, 0, 266, 130 #else IDD_LICENSE_FSRB DIALOG DISCARDABLE 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON2,1031,0,0,22,20 LTEXT "",IDC_INTROTEXT,25,0,241,23 CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,85 CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,110,266,9 CONTROL "",IDC_LICENSEDISAGREE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,0,120,266,9 END #endif #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_LICENSEPAGE) #if defined(APSTUDIO_INVOKED) IDD_LICENSE_FSCB$(NSIS_CONFIG_LICENSEPAGE) DIALOG DISCARDABLE 0, 0, 266, 130 #else IDD_LICENSE_FSCB DIALOG DISCARDABLE 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON2,1031,0,0,22,20 LTEXT "",IDC_INTROTEXT,25,0,241,23 CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x804,0,24,266,95 CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,120,266,9 END #endif #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_VISIBLE_SUPPORT) #if defined(APSTUDIO_INVOKED) IDD_DIR$(NSIS_CONFIG_VISIBLE_SUPPORT) DIALOGEX 0, 0, 266, 130 #else IDD_DIR DIALOGEX 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN EDITTEXT IDC_DIR,8,49,187,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BROWSE,202,48,55,14 ICON IDI_ICON2,IDC_ULICON,0,0,22,20 CONTROL "",IDC_SPACEAVAILABLE,"Static",SS_LEFTNOWORDWRAP,0,122, 265,8 CONTROL "",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,8,71,118,10 CONTROL "",IDC_SPACEREQUIRED,"Static",SS_LEFTNOWORDWRAP,0,111, 265,8 LTEXT "",IDC_INTROTEXT,25,0,241,34 GROUPBOX "",IDC_SELDIRTEXT,1,38,264,30 END #endif #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_COMPONENTPAGE) #if defined(APSTUDIO_INVOKED) IDD_SELCOM$(NSIS_CONFIG_COMPONENTPAGE) DIALOGEX 0, 0, 266, 130 #else IDD_SELCOM DIALOGEX 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN COMBOBOX IDC_COMBO1,114,25,152,102,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP ICON IDI_ICON2,IDC_ULICON,0,0,22,20 LTEXT "",IDC_TEXT2,0,40,108,65 CONTROL "",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP,0,27,108,8 LTEXT "",IDC_SPACEREQUIRED,0,111,111,18,NOT WS_GROUP LTEXT "",IDC_INTROTEXT,25,0,241,25 CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | WS_BORDER | WS_TABSTOP,114,39,151,90 END #endif #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_VISIBLE_SUPPORT) #if defined(APSTUDIO_INVOKED) IDD_INST$(NSIS_CONFIG_VISIBLE_SUPPORT) DIALOGEX 0, 0, 280, 162 #else IDD_INST DIALOGEX 0, 0, 280, 162 #endif STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN PUSHBUTTON "",IDC_BACK,171,142,50,14,NOT WS_VISIBLE | WS_GROUP PUSHBUTTON "",IDOK,223,142,50,14 PUSHBUTTON "",IDCANCEL,7,142,50,14 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ | WS_GROUP,7,138, 267,1 CONTROL "",IDC_CHILDRECT,"Static",SS_BLACKRECT | NOT WS_VISIBLE | WS_GROUP,7,6,266,130 CTEXT "",IDC_VERSTR,59,145,108,8,WS_DISABLED END #endif #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_VISIBLE_SUPPORT) #if defined(APSTUDIO_INVOKED) IDD_INSTFILES$(NSIS_CONFIG_VISIBLE_SUPPORT) DIALOGEX 0, 0, 266, 130 #else IDD_INSTFILES DIALOGEX 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,24,10,241, 11 CONTROL "",IDC_INTROTEXT,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX,24,0,241,8 CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | NOT WS_VISIBLE | WS_BORDER | WS_TABSTOP,0,25,265,104 ICON IDI_ICON2,IDC_ULICON,0,0,22,20 PUSHBUTTON "",IDC_SHOWDETAILS,0,28,60,14,NOT WS_TABSTOP END #endif #if defined(APSTUDIO_INVOKED) || defined(_NSIS_CONFIG_UNINSTDLG) #if defined(APSTUDIO_INVOKED) IDD_UNINST$(_NSIS_CONFIG_UNINSTDLG) DIALOGEX 0, 0, 266, 130 #else IDD_UNINST DIALOGEX 0, 0, 266, 130 #endif STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDI_ICON2,IDC_ULICON,0,1,22,20 LTEXT "",IDC_UNINSTFROM,0,45,55,8 EDITTEXT IDC_EDIT1,56,43,209,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "",IDC_INTROTEXT,25,0,241,34 END #endif #if defined(APSTUDIO_INVOKED) || defined(_NSIS_CONFIG_VERIFYDIALOG) #if defined(APSTUDIO_INVOKED) IDD_VERIFY$(_NSIS_CONFIG_VERIFYDIALOG) DIALOGEX 0, 0, 162, 22 #else IDD_VERIFY DIALOGEX 0, 0, 162, 22 #endif STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CTEXT "",IDC_STR,7,7,148,8 END #endif ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN "IDD_INST$(NSIS_CONFIG_VISIBLE_SUPPORT)", DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 273 TOPMARGIN, 6 BOTTOMMARGIN, 156 END "IDD_INSTFILES$(NSIS_CONFIG_VISIBLE_SUPPORT)", DIALOG BEGIN RIGHTMARGIN, 246 BOTTOMMARGIN, 125 END "IDD_VERIFY$(_NSIS_CONFIG_VERIFYDIALOG)", DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 155 TOPMARGIN, 7 BOTTOMMARGIN, 15 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "#include ""config.h""\r\n" "#undef RICHEDIT_CLASS\r\n" "#ifdef UNICODE\r\n" "#define RICHEDIT_CLASS ""RichEdit20W""\r\n" "#else\r\n" "#define RICHEDIT_CLASS ""RichEdit20A""\r\n" "#endif\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON2 ICON DISCARDABLE "nsis.ico" ///////////////////////////////////////////////////////////////////////////// // // Bitmap // #if defined(APSTUDIO_INVOKED) || defined(NSIS_CONFIG_COMPONENTPAGE) #if defined(APSTUDIO_INVOKED) IDB_BITMAP1$(NSIS_CONFIG_COMPONENTPAGE) BITMAP DISCARDABLE "bitmap1.bmp" #else IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" #endif #endif #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// nsis-3.11/Source/exehead/state.h000077500000000000000000000041561477201124000165550ustar00rootroot00000000000000/* * state.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/22/2007 */ #ifndef NSIS_EXEHEAD_STATE_H #define NSIS_EXEHEAD_STATE_H #include "fileform.h" #include "api.h" #ifdef __GNUC__ // GCC warns about array bounds when accessing g_usrvarssection[2] because it is only [1] at compile time, // the other part of this hack is in util.c where g_usrvarsstart is initialized. extern const NSIS_STRING*const g_usrvarsstart; #define g_usrvars ( (NSIS_STRING*) (g_usrvarsstart) ) #else extern NSIS_STRING g_usrvarssection[1]; #define g_usrvars g_usrvarssection #endif #define state_command_line (((NSIS_STRING *) g_usrvars)[20]) #define state_install_directory (((NSIS_STRING *) g_usrvars)[21]) #define state_output_directory (((NSIS_STRING *) g_usrvars)[22]) #define state_exe_directory (((NSIS_STRING *) g_usrvars)[23]) #define state_language (((NSIS_STRING *) g_usrvars)[24]) #define state_temp_dir (((NSIS_STRING *) g_usrvars)[25]) #ifdef NSIS_CONFIG_PLUGIN_SUPPORT # define state_plugins_dir (((NSIS_STRING *) g_usrvars)[26]) #endif #define state_exe_path (((NSIS_STRING *) g_usrvars)[27]) #define state_exe_file (((NSIS_STRING *) g_usrvars)[28]) #define state_click_next (((NSIS_STRING *) g_usrvars)[30]) extern TCHAR g_caption[NSIS_MAX_STRLEN*2]; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT extern HWND g_hwnd; extern HANDLE g_hInstance; extern HWND insthwnd,insthwndbutton; #else #define g_hwnd 0 #define g_hInstance 0 #endif//NSIS_CONFIG_VISIBLE_SUPPORT typedef struct { exec_flags_t exec_flags; osinfo osi; } execflags_and_osinfo; extern execflags_and_osinfo g_execflags_and_osinfo; #define g_exec_flags (g_execflags_and_osinfo.exec_flags) #define g_osinfo (g_execflags_and_osinfo.osi) #endif //~ Include guard nsis-3.11/Source/exehead/ui.h000077500000000000000000000026771477201124000160600ustar00rootroot00000000000000/* * ui.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #ifndef _UI_H_ #define _UI_H_ extern int *cur_langtable; extern int NSISCALL ui_doinstall(void); void NSISCALL update_status_text(int strtab, const TCHAR *text2); extern int ui_dlg_visible; extern HWND m_curwnd; #ifdef NSIS_CONFIG_LOG void NSISCALL build_g_logfile(void); #endif // sent to the last child window to tell it that the install thread is done #define WM_NOTIFY_INSTPROC_DONE (WM_USER+0x4) // sent to every child window to tell it it can start executing NSIS code #define WM_NOTIFY_START (WM_USER+0x5) // sent to every child window to tell it it is closing soon #define WM_NOTIFY_INIGO_MONTOYA (WM_USER+0xb) // update message used by DirProc and SelProc for space display #define WM_IN_UPDATEMSG (WM_USER+0xf) // simulates clicking on the tree #define WM_TREEVIEW_KEYHACK (WM_USER+0x13) // notifies a component selection change (.onMouseOverSection) #define WM_NOTIFY_SELCHANGE (WM_USER+0x19) // Notifies the installation type has changed by the user #define WM_NOTIFY_INSTTYPE_CHANGED (WM_USER+0x20) #endif//_UI_H_ nsis-3.11/Source/exehead/uninst.ico000077500000000000000000000013761477201124000173010ustar00rootroot00000000000000 è( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿxwxˆwwxˆˆwwwxˆˆwwwwxˆˆwwwwwxˆˆwwwÿwxˆˆ€wwwðwxˆˆ€wwðwxˆˆ€wððwxˆˆ€wððwxˆˆ€‡xÿwxˆˆˆ‡xÿðwxˆˆˆ‡xðwxˆˆˆ‡xð‡wxˆˆˆ‡€ðˆwwxˆˆˆw€ˆwwÿˆˆˆ€w€ˆwwøˆÿˆˆ€w€ˆwwø‡wˆÿˆ€wˆwwøˆwwwˆÿ€wwwøˆ‡wwwwˆÿ‡wwøˆˆ‡wwwww‡wø€ˆˆwwwwwð‡øˆ€ˆˆwwwwðøˆˆ€ˆ‡wwwðøˆˆˆ€ˆ‡wwðÿˆˆˆ€ˆwwðÿˆˆ€ˆwðÿˆ€‡ðÿ‡ðÿÿãÿÿÿ€ÿÿþ?ÿøÿàÿ€þøøøøøðððððàààààÀÀÀÀ€€ÿÀÿðÿüÿÿÿÿnsis-3.11/Source/exehead/util.c000077500000000000000000001136011477201124000164010ustar00rootroot00000000000000/* * util.c * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/11/2007 */ #include "../Platform.h" #include #include "util.h" #include "state.h" #include "config.h" #include "lang.h" #include "fileform.h" #include "exec.h" #include "ui.h" #include "resource.h" #include "../tchar.h" #ifdef NSIS_CONFIG_LOG #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) TCHAR g_log_file[1024]; #endif #endif // *** DO NOT DECLARE MORE VARIABLES INSIDE THESE PRAGMAS *** // This will produce a special section called ".ndata" (stands for nsis data) // this way makensis during build time, can search for this section by name // and change the virtual size of this section // which results in extra memory for extra variables without code to do allocation :) // nsis then removes the "DISCARDABLE" style from section (for safe) #ifdef _MSC_VER # pragma bss_seg(NSIS_VARS_SECTION) NSIS_STRING g_usrvarssection[1]; # pragma bss_seg() # pragma comment(linker, "/section:" NSIS_VARS_SECTION ",rwd") #else # ifdef __GNUC__ // GCC does not treat g_usrvarssection as a bss section so we keep the size as small as possible. // NSIS_STRING g_usrvarssection[31] is required to remove this hack but that really bloats the exehead. TCHAR g_usrvarssection[1] __attribute__((section (NSIS_VARS_SECTION))); const NSIS_STRING*const g_usrvarsstart = (const NSIS_STRING*const) g_usrvarssection; # else # error Unknown compiler. You must implement the separate PE section yourself. # endif #endif const UINT32 g_restrictedacl[] = { 0x00340002, 0x00000002, // ACL (ACL_REVISION2, 2 ACEs) 0x00180300, // ACCESS_ALLOWED_ACE:ACE_HEADER (ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE) 0x10000000, // ACCESS_ALLOWED_ACE:ACCESS_MASK: GENERIC_ALL 0x00000201, 0x05000000, 0x00000020, 0x00000220, // ACCESS_ALLOWED_ACE:SID (BUILTIN\Administrators) NOTE: GetAdminGrpSid() relies on this being the first SID in the ACL 0x00140300, // ACCESS_ALLOWED_ACE:ACE_HEADER (ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE) 0x001200c1, // ACCESS_ALLOWED_ACE:ACCESS_MASK: SYNCHRONIZE|READ_CONTROL|FILE_LIST_DIRECTORY|FILE_DELETE_CHILD|FILE_READ_ATTRIBUTES 0x00000101, 0x01000000, 0x00000000 // ACCESS_ALLOWED_ACE:SID (WORLD\Everyone) }; DWORD NSISCALL CreateRestrictedDirectory(LPCTSTR path) { PSID admingrpsid = GetAdminGrpSid(); SECURITY_DESCRIPTOR sd = { 1, 0, SE_DACL_PRESENT, admingrpsid, admingrpsid, NULL, GetAdminGrpAcl() }; SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), &sd, FALSE }; return CreateDirectory(path, &sa) ? ERROR_SUCCESS : GetLastError(); } DWORD NSISCALL CreateNormalDirectory(LPCTSTR path) { return CreateDirectory(path, NULL) ? ERROR_SUCCESS : GetLastError(); } BOOL NSISCALL UserIsAdminGrpMember() { FARPROC iuaa = myGetProcAddress(MGA_IsUserAnAdmin); return iuaa && ((BOOL(WINAPI*)())iuaa)(); } HANDLE NSISCALL myCreateProcess(TCHAR *cmd) { PROCESS_INFORMATION ProcInfo; static STARTUPINFO StartUp; StartUp.cb=sizeof(StartUp); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &StartUp, &ProcInfo)) return NULL; CloseHandle(ProcInfo.hThread); return ProcInfo.hProcess; } BOOL NSISCALL myShellExecuteEx(SHELLEXECUTEINFO*pSEI) { pSEI->cbSize = sizeof(SHELLEXECUTEINFO); pSEI->lpIDList = NULL; // Must set this because SEE_MASK_INVOKEIDLIST might be set by ExecShell[Wait] return ShellExecuteEx(pSEI); } /*BOOL NSISCALL my_SetWindowText(HWND hWnd, const TCHAR *val) { return SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)val); }*/ BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const TCHAR *val) { return SetDlgItemText(dlg,idx,val); // return my_SetWindowText(GetDlgItem(dlg, idx), val); } int NSISCALL my_GetDialogItemText(UINT idx, TCHAR *val) { extern HWND m_curwnd; return GetDlgItemText(m_curwnd, idx, val, NSIS_MAX_STRLEN); // return my_GetWindowText(GetDlgItem(m_curwnd, idx), val, NSIS_MAX_STRLEN); } int NSISCALL my_MessageBox(const TCHAR *text, UINT type) { int _type = type & 0x001FFFFF; static MSGBOXPARAMS mbp = { sizeof(MSGBOXPARAMS), 0, 0, 0, 0, 0, MAKEINTRESOURCE(IDI_ICON2), 0, 0, 0 }; #ifdef NSIS_CONFIG_SILENT_SUPPORT // default for silent installers if (g_exec_flags.silent && type >> 21) return type >> 21; #endif // no silent or no default, just show if (g_exec_flags.rtl) _type ^= MB_RIGHT | MB_RTLREADING; mbp.hwndOwner = g_hwnd; mbp.hInstance = g_hInstance; mbp.lpszText = text; mbp.lpszCaption = g_caption; // Should call update_caption() here? mbp.dwStyle = _type; return MessageBoxIndirect(&mbp); } BOOL NSISCALL delete_with_ro_attr_handling(LPCTSTR fileordir,int flags) { const DWORD attr=remove_ro_attr(fileordir); if (attr != INVALID_FILE_ATTRIBUTES) { if (flags & DEL_DIR) { if (RemoveDirectory(fileordir)) return TRUE; } else { if (DeleteFile(fileordir)) return TRUE; } // Not sure if wininit.ini and MoveFileEx handle RO attr in the same // way so we just play it safe if (!(flags & DEL_REBOOT)) SetFileAttributes(fileordir,attr); } return FALSE; } void NSISCALL myDelete(TCHAR *buf, int flags) { static TCHAR lbuf[NSIS_MAX_STRLEN]; const int rebootflag=(flags & DEL_REBOOT); HANDLE h; WIN32_FIND_DATA fd; TCHAR *fn; int valid_dir=is_valid_instpath(buf); if ((flags & DEL_SIMPLE)) { g_exec_flags.exec_error += !DeleteFile(buf); return; } #ifdef NSIS_SUPPORT_RMDIR if (!(flags & DEL_DIR) || (valid_dir && (flags & DEL_RECURSE))) #endif//NSIS_SUPPORT_RMDIR { mystrcpy(lbuf,buf); #ifdef NSIS_SUPPORT_RMDIR if (flags & DEL_DIR) mystrcat(lbuf,_T("\\*.*")); else #endif//NSIS_SUPPORT_RMDIR trimslashtoend(buf); // only append backslash if the path isn't relative to the working directory [bug #1851273] if (*buf || *lbuf == _T('\\')) mystrcat(buf,_T("\\")); fn=buf+mystrlen(buf); h = FindFirstFile(lbuf,&fd); if (h != INVALID_HANDLE_VALUE) { do { TCHAR *fdfn = fd.cFileName; #ifndef _UNICODE if (*findchar(fdfn, _T('?')) && *fd.cAlternateFileName) // name contains unicode, use short name fdfn = fd.cAlternateFileName; #endif #ifdef NSIS_SUPPORT_RMDIR if (fdfn[0] == _T('.') && !fdfn[1]) continue; if (fdfn[0] == _T('.') && fdfn[1] == _T('.') && !fdfn[2]) continue; #endif//NSIS_SUPPORT_RMDIR { mystrcpy(fn,fdfn); if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { #ifdef NSIS_SUPPORT_RMDIR if ((flags & (DEL_DIR | DEL_RECURSE)) == (DEL_DIR | DEL_RECURSE)) { myDelete(buf,flags); } #endif//NSIS_SUPPORT_RMDIR } else { log_printf2(_T("Delete: DeleteFile(\"%s\")"),buf); if (!delete_with_ro_attr_handling(buf,rebootflag)) { #ifdef NSIS_SUPPORT_MOVEONREBOOT if (rebootflag) { log_printf2(_T("Delete: DeleteFile on Reboot(\"%s\")"),buf); update_status_text(LANG_DELETEONREBOOT,buf); MoveFileOnReboot(buf,NULL); } else #endif//NSIS_SUPPORT_MOVEONREBOOT { log_printf2(_T("Delete: DeleteFile failed(\"%s\")"),buf); g_exec_flags.exec_error++; } } else update_status_text(LANG_DELETEFILE,buf); } } } while (FindNextFile(h,&fd)); FindClose(h); } #ifdef NSIS_SUPPORT_RMDIR if (flags & DEL_DIR) fn[-1]=0; #endif//NSIS_SUPPORT_RMDIR } #ifdef NSIS_SUPPORT_RMDIR if ((flags & DEL_DIR)) { if (!valid_dir) { log_printf2(_T("RMDir: RemoveDirectory invalid input(\"%s\")"),buf); g_exec_flags.exec_error++; } else if (file_exists(buf)) { addtrailingslash(buf); log_printf2(_T("RMDir: RemoveDirectory(\"%s\")"),buf); if (!delete_with_ro_attr_handling(buf,DEL_DIR|rebootflag)) { #ifdef NSIS_SUPPORT_MOVEONREBOOT if (rebootflag) { log_printf2(_T("RMDir: RemoveDirectory on Reboot(\"%s\")"),buf); update_status_text(LANG_DELETEONREBOOT,buf); MoveFileOnReboot(buf,NULL); } else #endif//NSIS_SUPPORT_MOVEONREBOOT { log_printf2(_T("RMDir: RemoveDirectory failed(\"%s\")"),buf); g_exec_flags.exec_error++; } } else { update_status_text(LANG_REMOVEDIR,buf); } } } #endif//NSIS_SUPPORT_RMDIR } TCHAR *NSISCALL addtrailingslash(TCHAR *str) { if (lastchar(str)!=_T('\\')) mystrcat(str,_T("\\")); return str; } /*char NSISCALL lastchar(const char *str) { return *CharPrev(str,str+mystrlen(str)); }*/ TCHAR * NSISCALL findchar(TCHAR *str, TCHAR c) { while (*str && *str != c) { str = CharNext(str); } return str; } // Separates a full path to the directory portion and file name portion // and returns the pointer to the filename portion. TCHAR * NSISCALL trimslashtoend(TCHAR *buf) { TCHAR *p = buf + mystrlen(buf); do { if (*p == _T('\\')) break; p = CharPrev(buf, p); } while (p > buf); *p = 0; return p + 1; } int NSISCALL validpathspec(TCHAR *ubuf) { TCHAR dl = ubuf[0] | 0x20; // convert alleged drive letter to lower case return ((ubuf[0] == _T('\\') && ubuf[1] == _T('\\')) || (dl >= _T('a') && dl <= _T('z') && ubuf[1] == _T(':'))); } TCHAR * NSISCALL skip_root(TCHAR *path) { TCHAR *p = CharNext(path); TCHAR *p2 = CharNext(p); if (*path && p[0] == _T(':') && p[1] == _T('\\')) { return CharNext(p2); } else if (path[0] == _T('\\') && path[1] == _T('\\')) { // skip host and share name int x = 2; while (x--) { p2 = findchar(p2, _T('\\')); if (!*p2) return NULL; p2++; // skip backslash } return p2; } else return NULL; } int NSISCALL is_valid_instpath(TCHAR *s) { static TCHAR tmp[NSIS_MAX_STRLEN]; TCHAR *root; mystrcpy(tmp, s); root = skip_root(tmp); if (!root) return 0; // must be called after skip_root or AllowRootDirInstall won't work. // validate_filename removes trailing backslashes and so converts // "C:\" to "C:" which is not a valid directory. skip_root returns // NULL for "C:" so the above test returns 0. // validate_filename is called so directories such as "C:\ " will // not pass as a valid non-root directory. validate_filename(root); if ((g_flags & CH_FLAGS_NO_ROOT_DIR) && (!*root || *root == _T('\\'))) return 0; while (mystrlen(tmp) > root - tmp) { WIN32_FIND_DATA *fd = file_exists(tmp); // if the directory bit not set then it's a file, which is not a valid inst dir... // GetFileAttributes is not used because it doesn't work with certain files (error 32) // as for concerns of the user using * or ?, that's invalid anyway... if (fd && !(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) return 0; trimslashtoend(tmp); } // if the root drive exists addtrailingslash(tmp); // don't check the current directory, check the root directory if (GetFileAttributes(tmp) == INVALID_FILE_ATTRIBUTES) return 0; return 1; } // Used strictly for the wininit.ini file which is an ASCII file. char * NSISCALL mystrstriA(char *a, const char *b) { int l = lstrlenA(b); while (lstrlenA(a) >= l) { char c = a[l]; a[l] = 0; if (!lstrcmpiA(a, b)) { a[l] = c; return a; } a[l] = c; a = CharNextA(a); } return NULL; } #ifndef _NSIS_NODEFLIB_CRTMEMCPY // mini_memcpy takes the number of bytes to copy. void NSISCALL mini_memcpy(void *out, const void *in, UINT_PTR cb) { char *dst = (char*) out, *src = (char*) in; while (cb-- > 0) *dst++ = *src++; } #endif DWORD NSISCALL remove_ro_attr(LPCTSTR file) { const DWORD attr = GetFileAttributes(file); if (attr != INVALID_FILE_ATTRIBUTES) SetFileAttributes(file,attr&(~FILE_ATTRIBUTE_READONLY)); return attr; } HANDLE NSISCALL myOpenFile(const TCHAR *fn, DWORD da, DWORD cd) { int attr = GetFileAttributes(fn); return CreateFile( fn, da, FILE_SHARE_READ, NULL, cd, attr == INVALID_FILE_ATTRIBUTES ? 0 : attr, NULL ); } TCHAR * NSISCALL my_GetTempFileName(TCHAR *buf, const TCHAR *dir) { int n = 100; while (n--) { TCHAR prefix[4] = _T("nsa"); prefix[2] += (TCHAR)(GetTickCount() % 26); if (GetTempFileName(dir, prefix, 0, buf)) return buf; } *buf = 0; return 0; } BOOL NSISCALL myReadFile(HANDLE h, LPVOID buf, DWORD cb) { DWORD cbio; return ReadFile(h, buf, cb, &cbio, NULL) && cb == cbio; } BOOL NSISCALL myWriteFile(HANDLE h, const void*buf, DWORD cb) { DWORD cbio; return WriteFile(h, buf, cb, &cbio, NULL) && cb == cbio; } // Reading skips the BOM if present, writing writes it to a empty file HRESULT NSISCALL UTF16LEBOM(HANDLE h, INT_PTR ForWrite) { DWORD orgpos = SetFilePointer(h, 0, NULL, FILE_CURRENT); if (0 == orgpos) { BYTE bom[2]; if (myReadFile(h, bom, 2) && (0xfeff == *(USHORT*) &bom[0])) { return S_OK; } else if (ForWrite) { if (0 == SetFilePointer(h, 0, NULL, FILE_CURRENT)) // Is the file empty? { static const BYTE bom16le[] = { 0xff, 0xfe }; return myWriteFile(h, bom16le, 2) ? S_OK : E_FAIL; } } SetFilePointer(h, 0, NULL, FILE_BEGIN); // The file may have started with something that was not a BOM, undo the read } return S_FALSE; } #ifdef NSIS_SUPPORT_MOVEONREBOOT #ifndef _WIN64 /** Modifies the wininit.ini file to rename / delete a file. * * @param prevName The previous / current name of the file. * @param newName The new name to move the file to. If NULL, the current file * will be deleted. */ void RenameViaWininit(const TCHAR* prevName, const TCHAR* newName) { static char szRenameLine[1024]; static TCHAR wininit[1024]; static TCHAR tmpbuf[1024]; int cchRenameLine; LPCSTR szRenameSec = "[Rename]\r\n"; // rename section marker HANDLE hfile; DWORD dwFileSize, dwRenameLinePos; char *pszWinInit; // Contains the file contents of wininit.ini int spn; // length of the short path name in TCHARs. // Optimized mystrcpy(tmpbuf, _T("NUL")): if (sizeof(TCHAR) == 1) *(UINT32*)tmpbuf = ((UINT32)'N' << 0) | ((UINT32)'U' << 8) | ((UINT32)'L' << 16) | ((UINT32)'\0' << 24); else *(UINT64*)tmpbuf = ((UINT64)'N' << 0) | ((UINT64)'U' << 16) | ((UINT64)'L' << 32) | ((UINT64)'\0' << 48); if (newName) { // create the file if it's not already there to prevent GetShortPathName from failing CloseHandle(myOpenFile(newName,0,CREATE_NEW)); spn = GetShortPathName(newName,tmpbuf,1024); if (!spn || spn > 1024) return; } // wininit is used as a temporary here spn = GetShortPathName(prevName,wininit,1024); if (!spn || spn > 1024) return; #ifdef _UNICODE cchRenameLine = wsprintfA(szRenameLine, "%ls=%ls\r\n", tmpbuf, wininit); #else cchRenameLine = wsprintfA(szRenameLine, "%s=%s\r\n", tmpbuf, wininit); #endif // Get the path to the wininit.ini file. GetNSISString(wininit, g_header->str_wininit); hfile = myOpenFile(wininit, GENERIC_READ | GENERIC_WRITE, OPEN_ALWAYS); if (hfile != INVALID_HANDLE_VALUE) { // We are now working on the Windows wininit file dwFileSize = GetFileSize(hfile, NULL); pszWinInit = (char*) GlobalAlloc(GPTR, dwFileSize + cchRenameLine + 10); if (pszWinInit != NULL) { if (myReadFile(hfile, pszWinInit, dwFileSize)) { // Look for the rename section in the current file. LPSTR pszRenameSecInFile = mystrstriA(pszWinInit, szRenameSec); if (pszRenameSecInFile == NULL) { // No rename section. So we add it to the end of file. lstrcpyA(pszWinInit+dwFileSize, szRenameSec); dwFileSize += 10; dwRenameLinePos = dwFileSize; } else { // There is a rename section, but is there another section after it? char *pszFirstRenameLine = pszRenameSecInFile+10; char *pszNextSec = mystrstriA(pszFirstRenameLine,"\n["); if (pszNextSec) { char *p = pszWinInit + dwFileSize; char *pEnd = pszWinInit + dwFileSize + cchRenameLine; while (p > pszNextSec) { *pEnd-- = *p--; } dwRenameLinePos = BUGBUG64TRUNCATE(DWORD, pszNextSec - pszWinInit) + 1; // +1 for the \n } // rename section is last, stick item at end of file else dwRenameLinePos = dwFileSize; } mini_memcpy(&pszWinInit[dwRenameLinePos], szRenameLine, cchRenameLine); dwFileSize += cchRenameLine; SetFilePointer(hfile, 0, NULL, FILE_BEGIN); myWriteFile(hfile, pszWinInit, dwFileSize); GlobalFree(pszWinInit); } } CloseHandle(hfile); } } #endif /** * MoveFileOnReboot tries to move a file by the name of pszExisting to the * name pszNew. * * @param pszExisting The old name of the file. * @param pszNew The new name of the file. */ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew) { #ifndef _WIN64 // Shut up GCC unused warning BOOL fOk = #endif MoveFileEx(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING); #ifndef _WIN64 if (!fOk) { RenameViaWininit(pszExisting, pszNew); } #endif #ifdef NSIS_SUPPORT_REBOOT g_exec_flags.exec_reboot++; #endif } #endif #define GetAltViewREGSAM() ( sizeof(void*) > 4 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY ) HKEY NSISCALL GetRegKeyAndSAM(HKEY hKey, REGSAM*pRS) { const REGSAM samviewmask = (KEY_WOW64_32KEY|KEY_WOW64_64KEY); const REGSAM incompatsamview = SystemSupportsAltRegView() ? 0 : GetAltViewREGSAM(); REGSAM sam = *pRS, incompatsam = incompatsamview; #ifdef C_ASSERT {C_ASSERT(REGROOTVIEWTOSAMVIEW(REGROOTVIEW32|REGROOTVIEW64) == (KEY_WOW64_32KEY|KEY_WOW64_64KEY));} #endif if ((sam & KEY_FORCEVIEW) && IsRegRootkeyForcedView(hKey)) { REGSAM keysamview = REGROOTVIEWTOSAMVIEW(hKey); if (keysamview == samviewmask) keysamview = (g_exec_flags.alter_reg_view & ~incompatsamview); // HKxxANY tries to honor SetRegView sam &= ~samviewmask, sam |= (keysamview & ~(sizeof(void*) > 4 ? 0 : KEY_WOW64_32KEY)); // HKxx32 has the *_32KEY bit set but WinNT4&2000 cannot handle any KEY_WOW64_xxKEY flags. hKey = (HKEY) ( (UINT_PTR) hKey & ~(REGROOTVIEW32|REGROOTVIEW64) ); } else if (sam & KEY_ALTERVIEW) { sam |= g_exec_flags.alter_reg_view; // We don't mask away the incompatsamview bits because the operation is supposed to fail if the view is not supported. } *pRS = sam & ~(NSIS_REGSAM_PRIVATEMASK); // Filter away internal flags return (incompatsam & sam) ? NULL : hKey; // Fail if the requested view is not supported } LONG NSISCALL RegKeyOpen(HKEY hBase, LPCTSTR SubKey, REGSAM RS, HKEY*phKey) { if (!(hBase = GetRegKeyAndSAM(hBase, &RS))) return ERROR_INVALID_HANDLE; // ERROR_CANTOPEN? return RegOpenKeyEx(hBase, SubKey, 0, RS, phKey); } LONG NSISCALL RegKeyCreate(HKEY hBase, LPCTSTR SubKey, REGSAM RS, HKEY*phKey) { if (!(hBase = GetRegKeyAndSAM(hBase, &RS))) return ERROR_INVALID_HANDLE; // ERROR_CANTOPEN? return RegCreateKeyEx(hBase, SubKey, 0, 0, 0, RS, 0, phKey, 0); } void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR *out, UINT altview) { HKEY hKey; DWORD cb = NSIS_MAX_STRLEN*sizeof(TCHAR), rt, ec; REGSAM samview = altview ? GetAltViewREGSAM() : 0; if ((ec = RegKeyOpen(root, sub, KEY_READ|samview, &hKey)) == ERROR_SUCCESS) { ec = RegQueryValueEx(hKey, name, NULL, &rt, (LPBYTE)out, &cb); RegCloseKey(hKey); out[NSIS_MAX_STRLEN-1] = 0; // Make sure the string is terminated. This could potentially truncate a long string by 1 character! } if (ec != ERROR_SUCCESS || (rt != REG_SZ && rt != REG_EXPAND_SZ)) *out = 0; // Empty string on failure } void NSISCALL iptrtostr(TCHAR *s, INT_PTR d) { #ifdef _WIN64 static const TCHAR c[] = _T("%Id"); #else static const TCHAR c[] = _T("%d"); #endif wsprintf(s,c,d); } INT_PTR NSISCALL strtoiptr(const TCHAR *s) { UINT_PTR v=0; INT_PTR sign=1; // sign of positive TCHAR m=10; // base of 10 TCHAR t=_T('9'); // cap top of numbers at 9 if (*s == _T('-')) { s++; //skip over - sign=-1; // sign flip } if (*s == _T('0')) { s++; // skip over 0 if (s[0] >= _T('0') && s[0] <= _T('7')) { m=8; // base of 8 t=_T('7'); // cap top at 7 } if ((s[0] & ~0x20) == _T('X')) { m=16; // base of 16 s++; // advance over 'x' } } for (;;) { int c=*s++; if (c >= _T('0') && c <= t) c-=_T('0'); // clever little trick to do both upper and lowercase A-F. else if (m==16 && (c & ~0x20) >= _T('A') && (c & ~0x20) <= _T('F')) c = (c & 7) + 9; else break; v*=m; v+=c; } return ((INT_PTR)v)*sign; } // Straight copies of selected shell functions. Calling local functions // requires less code than DLL functions. For the savings to outweigh the cost // of a new function there should be about a couple of dozen or so calls. TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in) { return lstrcpyn(out, in, NSIS_MAX_STRLEN); } int NSISCALL mystrlen(const TCHAR *in) { return lstrlen(in); } TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat) { return lstrcat(out, concat); } int StrWideToACP(LPCWSTR Src, char* Dst, int DstCap) { return WideCharToMultiByte(CP_ACP, 0, Src, -1, Dst, DstCap, NULL, NULL); } #ifndef UNICODE void strcpyWideToT(TCHAR *out, LPCWSTR in) { StrWideToACP(in, out, NSIS_MAX_STRLEN); } #endif #if !defined(_WIN64) && !defined(UNICODE) HRESULT ComIIDFromString(LPCTSTR str, IID*out) { WCHAR buf[130]; signed char i; for (i = 0; i >= 0; ++i) if (!(buf[i] = str[i])) return IIDFromString(buf, out); return E_FAIL; } #endif TCHAR ps_tmpbuf[NSIS_MAX_STRLEN*2]; const TCHAR SYSREGKEY[] = _T("Software\\Microsoft\\Windows\\CurrentVersion"); const TCHAR QUICKLAUNCH[] = _T("\\Microsoft\\Internet Explorer\\Quick Launch"); typedef HRESULT (WINAPI* PFNSHGETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPTSTR); extern void *g_SHGetFolderPath; typedef LPITEMIDLIST (WINAPI* PFNSHCLONESPECIALIDLIST)(HWND, int, BOOL); // Based on Dave Laundon's simplified process_string // The string actually has a lot of different data encoded into it. This // function extracts the special data out and puts it into outbuf. TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab) { // This looks at the g_block (copied from header->blocks) and // indexes into the language TCHAR *in = (TCHAR*)GetNSISStringNP(GetNSISTab(strtab)); TCHAR *out = ps_tmpbuf; // Still working within ps_tmpbuf, so set out to the // current position that is passed in. if (outbuf >= ps_tmpbuf && (size_t) (outbuf - ps_tmpbuf) < COUNTOF(ps_tmpbuf)) { out = outbuf; outbuf = 0; } while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN) { _TUCHAR nVarIdx = (_TUCHAR)*in++; int nData; int fldrs[4]; if (nVarIdx < NS_SKIP_CODE) { // The next 2 BYTEs in the string might be coding either a value 0..MAX_CODED (nData), or 2 CSIDL of Special folders (for NS_SHELL_CODE) nData = DECODE_SHORT(in); // There are 2 CSIDL parameters for each context and query must be used before create // because of bug #820 (CSIDL_FLAG_CREATE failures on root paths are cached in Vista). #ifdef _UNICODE fldrs[1] = LOBYTE(*in); // current user fldrs[0] = fldrs[1] | CSIDL_FLAG_CREATE; fldrs[3] = HIBYTE(*in); // all users fldrs[2] = fldrs[3] | CSIDL_FLAG_CREATE; #else fldrs[0] = in[0] | CSIDL_FLAG_CREATE; // current user fldrs[1] = in[0]; fldrs[2] = in[1] | CSIDL_FLAG_CREATE; // all users fldrs[3] = in[1]; #endif in += sizeof(SHORT)/sizeof(TCHAR); if (nVarIdx == NS_SHELL_CODE) { LPITEMIDLIST idl; int x = 2; BOOL isWin9598 = IsWin9598(); /* SHGetFolderPath as provided by shfolder.dll is used to get special folders unless the installer is running on Windows 95/98. For 95/98 shfolder.dll is only used for the Application Data and Documents folder (if the DLL exists). Otherwise, the old SHGetSpecialFolderLocation API is called. The reason for not using shfolder.dll for all folders on 95/98 is that some unsupported folders (such as the Start Menu folder for all users) are simulated instead of returning an error so we can fall back on the current user folder. SHGetFolderPath in shell32.dll could be called directly for Windows versions later than 95/98 but there is no need to do so, because shfolder.dll is still provided and calls shell32.dll. */ BOOL use_shfolder = // Use shfolder if not on 95/98 !isWin9598 || // Unless the Application Data or Documents folder is requested ( (fldrs[3] == CSIDL_COMMON_APPDATA) || (fldrs[3] == CSIDL_COMMON_DOCUMENTS) ); /* Carry on... shfolder stuff is over. */ if (g_exec_flags.all_user_var) { x = 4; // Get common folder > Create common folder > Get user folder > Create user folder } if (fldrs[1] & 0x80) { myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, GetNSISStringNP(fldrs[1] & 0x3F), out, fldrs[1] & 0x40); if (!*out) GetNSISString(out, fldrs[3]); x = 0; } else if (fldrs[1] == CSIDL_SYSTEM) // Does not work on 95, 98 nor NT4. Works on ME and 2000+. { GetSystemDirectory(out, NSIS_MAX_STRLEN); x = 0; } else if (fldrs[1] == CSIDL_WINDOWS) // Does not work on 95, 98 nor NT4. Works on ME and 2000+. { GetWindowsDirectory(out, NSIS_MAX_STRLEN); x = 0; } while (x--) { PFNSHCLONESPECIALIDLIST SHCSILFunc; int idandflags = fldrs[x] & ~0x40, create = idandflags & CSIDL_FLAG_CREATE; if (g_SHGetFolderPath && use_shfolder) { PFNSHGETFOLDERPATH SHGetFolderPathFunc = (PFNSHGETFOLDERPATH) g_SHGetFolderPath; if (!SHGetFolderPathFunc(g_hwnd, idandflags, NULL, SHGFP_TYPE_CURRENT, out)) { break; } } // This function exists in 95 & NT4 but was undocumented back then so we have to import it by ordinal. SHCSILFunc = (PFNSHCLONESPECIALIDLIST) myGetProcAddress(MGA_SHCloneSpecialIDList); idl = SHCSILFunc(g_hwnd, LOBYTE(idandflags), create); if (idl) { BOOL res = SHGetPathFromIDList(idl, out); CoTaskMemFree(idl); if (res) break; } *out=0; } if (*out) { // all users' version is CSIDL_APPDATA only for $QUICKLAUNCH // for normal $APPDATA, it'd be CSIDL_APPDATA_COMMON if (fldrs[3] == CSIDL_APPDATA) { mystrcat(out, QUICKLAUNCH); // append suffix path for $QUICKLAUNCH } } validate_filename(out); } else if (nVarIdx == NS_VAR_CODE) { if (nData == 29) // $HWNDPARENT iptrtostr(out, (INT_PTR) g_hwnd); else mystrcpy(out, g_usrvars[nData]); // validate the directory name if ((unsigned int)(nData - 21) < 7) { // validate paths for $INSTDIR, $OUTDIR, $EXEDIR, $LANGUAGE, $TEMP, $PLUGINSDIR and $EXEPATH // $LANGUAGE is just a number anyway... validate_filename(out); } } // == VAR_CODES_START else if (nVarIdx == NS_LANG_CODE) { GetNSISString(out, -nData-1); } out += mystrlen(out); } else if (nVarIdx == NS_SKIP_CODE) { *out++ = *in++; } else // Normal char { *out++ = nVarIdx; } } // while *out = 0; if (outbuf) return mystrcpy(outbuf, ps_tmpbuf); return ps_tmpbuf; } void NSISCALL validate_filename(TCHAR *in) { TCHAR *nono = _T("*?|<>/\":"); TCHAR *out; TCHAR *out_save; // ignoring spaces is wrong, _T(" C:\blah") is invalid //while (*in == _T(' ')) in = CharNext(in); if (in[0] == _T('\\') && in[1] == _T('\\') && in[2] == _T('?') && in[3] == _T('\\')) { // at least four bytes in += 4; } if (*in) { // at least two bytes if (validpathspec(in)) in += 2; } out = out_save = in; while (*in) { if ((_TUCHAR)*in > 31 && !*findchar(nono, *in)) { mini_memcpy(out, in, CharNext(in) - in); out = CharNext(out); } in = CharNext(in); } *out = 0; // now trim rightmost backslashes & spaces do { out = CharPrev(out_save, out); if (*out == _T(' ') || *out == _T('\\')) *out = 0; else break; } while (out_save < out); } #ifdef NSIS_CONFIG_LOG int log_dolog; TCHAR log_text[2048]; // 1024 for each wsprintf #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) void NSISCALL log_write(int close) { static HANDLE fp=INVALID_HANDLE_VALUE; if (close) { if (fp!=INVALID_HANDLE_VALUE) { CloseHandle(fp); } fp=INVALID_HANDLE_VALUE; return; } if (log_dolog) { if (g_log_file[0] && fp==INVALID_HANDLE_VALUE) { fp = myOpenFile(g_log_file,GENERIC_WRITE,OPEN_ALWAYS); if (fp!=INVALID_HANDLE_VALUE) SetFilePointer(fp,0,NULL,FILE_END); } if (fp!=INVALID_HANDLE_VALUE) { mystrcat(log_text,_T("\r\n")); myWriteFile(fp,log_text,mystrlen(log_text)*sizeof(TCHAR)); } } } #endif//!NSIS_CONFIG_LOG_ODS && !NSIS_CONFIG_LOG_STDOUT const TCHAR * _RegKeyHandleToName(HKEY hKey) { if (hKey == HKEY_CLASSES_ROOT) return _T("HKEY_CLASSES_ROOT"); if (hKey == HKEY_CURRENT_USER) return _T("HKEY_CURRENT_USER"); if (hKey == HKEY_LOCAL_MACHINE) return _T("HKEY_LOCAL_MACHINE"); if (hKey == HKEY_USERS) return _T("HKEY_USERS"); if (hKey == HKEY_PERFORMANCE_DATA) return _T("HKEY_PERFORMANCE_DATA"); if (hKey == HKEY_CURRENT_CONFIG) return _T("HKEY_CURRENT_CONFIG"); if (hKey == HKEY_DYN_DATA) return _T("HKEY_DYN_DATA"); if (hKey == HKSHCTX) return _T("HKSHCTX"); if (hKey == HKSHCTX32) return _T("HKSHCTX32"); if (hKey == HKSHCTX64) return _T("HKSHCTX64"); if (hKey == HKCR32) return _T("HKCR32"); if (hKey == HKCR64) return _T("HKCR64"); if (hKey == HKCU32) return _T("HKCU32"); if (hKey == HKCU64) return _T("HKCU64"); if (hKey == HKLM32) return _T("HKLM32"); if (hKey == HKLM64) return _T("HKLM64"); if (hKey == HKSHCTXANY) return _T("HKSHCTXANY"); if (hKey == HKCRANY) return _T("HKCRANY"); if (hKey == HKCUANY) return _T("HKCUANY"); if (hKey == HKLMANY) return _T("HKLMANY"); return _T("HK??"); } void _LogData2Hex(TCHAR *buf, size_t cchbuf, BYTE *data, size_t cbdata) { TCHAR *p = buf; int dots = 0; size_t i, bufbytes = cchbuf / 3; // 2 hex digits, one space/null if (cbdata > bufbytes) bufbytes--, dots++; else bufbytes = cbdata; for (i = 0; i < bufbytes; i++) { wsprintf(p, _T("%02x%c"), data[i], (i == bufbytes - 1) ? _T('\0') : _T(' ')); p += 3; } if (dots) mystrcat(buf, _T("...")); } #ifdef NSIS_CONFIG_LOG_TIMESTAMP void log_timestamp(TCHAR *buf) { SYSTEMTIME st; GetLocalTime(&st); wsprintf(buf,_T("[%04hu/%02hu/%02hu %02hu:%02hu:%02hu] "), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); } #else # define log_timestamp(x) #endif//NSIS_CONFIG_LOG_TIMESTAMP void log_printf(TCHAR *format, ...) { #if defined(NSIS_CONFIG_LOG_STDOUT) HANDLE hStdOut; #endif va_list val; va_start(val,format); log_text[0] = _T('\0'); log_timestamp(log_text); wvsprintf(log_text+mystrlen(log_text),format,val); va_end(val); #if defined(NSIS_CONFIG_LOG_ODS) if (log_dolog) OutputDebugString(log_text); #elif defined(NSIS_CONFIG_LOG_STDOUT) if (log_dolog && (hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) { const DWORD cch = lstrlen(log_text), cb = cch * sizeof(TCHAR); #ifdef UNICODE DWORD conmode, cchio; if (GetConsoleMode(hStdOut, &conmode)) { WriteConsoleW(hStdOut, log_text, cch, &cchio, 0); myWriteFile(hStdOut, "\n", 1); } else #endif //~ UNICODE { myWriteFile(hStdOut, log_text, cb); myWriteFile(hStdOut, _T("\n"), 1 * sizeof(TCHAR)); } } #else log_write(0); #endif } #endif//NSIS_CONFIG_LOG // Jim Park: This function is non-reentrant because of the static. WIN32_FIND_DATA * NSISCALL file_exists(TCHAR *buf) { HANDLE h; static WIN32_FIND_DATA fd; h = FindFirstFile(buf,&fd); if (h != INVALID_HANDLE_VALUE) { FindClose(h); return &fd; } return NULL; } // Jim Park: Keep these as chars since there's only ANSI version of // GetProcAddress. struct MGA_FUNC { const char *dll; const char *func; }; struct MGA_FUNC MGA_FUNCS[] = { #ifdef _UNICODE {"KERNEL32", "SetDefaultDllDirectories"}, #ifndef _WIN64 {"KERNEL32", "GetDiskFreeSpaceExW"}, {"KERNEL32", "GetUserDefaultUILanguage"}, #endif #if !defined(_WIN64) || defined(_M_IA64) {"ADVAPI32", "RegDeleteKeyExW"}, #endif {"ADVAPI32", "InitiateShutdownW"}, {"SHELL32", "SHGetKnownFolderPath"}, {"SHELL32", (CHAR*) 680}, // IsUserAnAdmin {"SHELL32", (CHAR*) 89}, // SHCloneSpecialIDList #ifndef _WIN64 {"SHLWAPI", (CHAR*) 437}, // IsOS #endif {"SHLWAPI", "SHAutoComplete"}, {"SHFOLDER", "SHGetFolderPathW"}, #ifdef NSIS_SUPPORT_GETDLLVERSION {"VERSION", "GetFileVersionInfoSizeW"}, {"VERSION", "GetFileVersionInfoW"}, {"VERSION", "VerQueryValueW"} #endif }; #else {"KERNEL32", "SetDefaultDllDirectories"}, {"KERNEL32", "GetDiskFreeSpaceExA"}, {"KERNEL32", "GetUserDefaultUILanguage"}, {"ADVAPI32", "RegDeleteKeyExA"}, {"ADVAPI32", "InitiateShutdownA"}, {"SHELL32", "SHGetKnownFolderPath"}, {"SHELL32", (CHAR*) 680}, // IsUserAnAdmin {"SHELL32", (CHAR*) 89}, // SHCloneSpecialIDList #ifndef _WIN64 {"SHLWAPI", (CHAR*) 437}, // IsOS #endif {"SHLWAPI", "SHAutoComplete"}, {"SHFOLDER", "SHGetFolderPathA"}, #ifdef NSIS_SUPPORT_GETDLLVERSION {"VERSION", "GetFileVersionInfoSizeA"}, {"VERSION", "GetFileVersionInfoA"}, {"VERSION", "VerQueryValueA"} #endif }; #endif HMODULE NSISCALL LoadSystemLibrary(LPCSTR name) { LPCTSTR fmt = sizeof(*fmt) > 1 ? TEXT("%s%S.dll") : TEXT("%s%s.dll"); // The module name is always ANSI BYTE bytebuf[(MAX_PATH+1+20+1+3+!0) * sizeof(*fmt)]; // 20+4 is more than enough for LPTSTR path = (LPTSTR) bytebuf; // the dllnames we are using. UINT cch = GetSystemDirectory(path, MAX_PATH); if (cch > MAX_PATH) // MAX_PATH was somehow not large enough and we don't support cch = 0; // \\?\ paths so we have to settle for just the name. wsprintf(path + cch, fmt, TEXT("\\") + (!cch || path[cch-1] == '\\'), name); return LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); } /** * Given a function enum, it will load the appropriate DLL and get the * process address of the function and return the pointer. It's up to * the caller to know how to call that function, however. * * @param func Enum value that indexes the MGA_FUNCS array. * @return Pointer to the function identified by the enum value. */ void* NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func) { const char *dllname = MGA_FUNCS[func].dll; HMODULE hModule; hModule = GetModuleHandleA(dllname); // Avoid LoadLibrary if possible because if (!hModule) // it can crash on 64-bit dlls if hModule = LoadSystemLibrary(dllname); // WoW64 FS redirection is off. return hModule ? GetProcAddress(hModule, MGA_FUNCS[func].func) : (FARPROC) hModule; // Optimized "return NULL;" } void NSISCALL MessageLoop(UINT uCheckedMsg) { MSG msg; while (PeekMessage(&msg, NULL, uCheckedMsg, uCheckedMsg, PM_REMOVE)) DispatchMessage(&msg); } /** * This function is useful for Unicode support. Since the Windows * GetProcAddress function always takes a char*, this function wraps * the windows call and does the appropriate translation when * appropriate. * * @param dllHandle Handle to the DLL loaded by LoadLibrary[Ex]. * @param funcName The name of the function to get the address of. * @return The pointer to the function. Null if failure. */ void * NSISCALL NSISGetProcAddress(HANDLE dllHandle, TCHAR* funcName) { #ifdef _UNICODE char ansiName[256]; if (StrWideToACP(funcName, ansiName, 256) != 0) return GetProcAddress(dllHandle, ansiName); return NULL; #else return GetProcAddress(dllHandle, funcName); #endif } DWORD NSISCALL WaitForProcess(HANDLE hProcess) { DWORD excod; while (WaitForSingleObject(hProcess, 100) == WAIT_TIMEOUT) MessageLoop(WM_PAINT); GetExitCodeProcess(hProcess, &excod); return excod; } nsis-3.11/Source/exehead/util.h000077500000000000000000000232201477201124000164030ustar00rootroot00000000000000/* * util.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 07/23/2007 */ #ifndef ___NSIS_UTIL_H___ #define ___NSIS_UTIL_H___ #include "../Platform.h" #include "config.h" #include extern TCHAR ps_tmpbuf[NSIS_MAX_STRLEN*2]; TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab); #define GetNSISStringTT(strtab) GetNSISString(0, (strtab)) #define GetNSISStringNP(strtab) ((const TCHAR *)g_blocks[NB_STRINGS].offset+(strtab)) // A negative string table index means it's a language string table, so we // use the LANG_STR_TAB() macro to decode it. #define GetNSISTab(strtab) (strtab < 0 ? LANG_STR_TAB(strtab) : strtab) #define myatoi(s) ( (int)strtoiptr(s) ) INT_PTR NSISCALL strtoiptr(const TCHAR *s); #define myitoa iptrtostr void NSISCALL iptrtostr(TCHAR *s, INT_PTR d); TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in); int NSISCALL mystrlen(const TCHAR *in); TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat); TCHAR * NSISCALL mystrstr(TCHAR *a, TCHAR *b); int StrWideToACP(LPCWSTR Src, char* Dst, int DstCap); #ifdef UNICODE #define strcpyWideToT mystrcpy #else void strcpyWideToT(TCHAR *out, LPCWSTR in); #endif #ifdef _WIN64 #define ComIIDFromString(s,out) SHCLSIDFromString((s),(CLSID*)(out)) #elif defined(UNICODE) #define ComIIDFromString(s,out) IIDFromString((s), (IID*)(out)) #else HRESULT ComIIDFromString(LPCTSTR str, IID*out); #endif #ifndef KEY_CREATE_LINK #define KEY_CREATE_LINK 0x0020 #endif #define KEY_FORCEVIEW KEY_CREATE_LINK // Our private flag used by RegKey* to indicate that we want it to handle HKLM[32|64] style root keys. Cannot be set if the HKEY is a real handle! #define KEY_ALTERVIEW SYNCHRONIZE // Our private flag used by RegKey* to indicate that we want it to apply g_exec_flags.alter_reg_view. (MSDN:"Registry keys do not support the SYNCHRONIZE standard access right") #define KEY_FROMSCRIPT (KEY_FORCEVIEW|KEY_ALTERVIEW) // Use this flag for registry operations from a .nsi script #define NSIS_REGSAM_PRIVATEMASK (KEY_FROMSCRIPT|KEY_FORCEVIEW|KEY_ALTERVIEW) HKEY NSISCALL GetRegKeyAndSAM(HKEY hKey, REGSAM*pRS); LONG NSISCALL RegKeyOpen(HKEY hBase, LPCTSTR SubKey, REGSAM RS, HKEY*phKey); LONG NSISCALL RegKeyCreate(HKEY hBase, LPCTSTR SubKey, REGSAM RS, HKEY*phKey); void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR *out, UINT altview); #define GetWinVerNTDDIMajMin() ( *(USHORT*)(&g_osinfo.WVMin) ) #define IsWin95NT4() ( sizeof(void*) == 4 && GetWinVerNTDDIMajMin() == 0x0400 ) #define IsWin9598ME() ( sizeof(TCHAR) == 1 && g_osinfo.WVProd == 0 ) #define IsWin9598() ( IsWin9598ME() && GetWinVerNTDDIMajMin() < MAKEWORD(90, 4) ) #define IsWinVista() ( GetWinVerNTDDIMajMin() == 0x0600 ) #define NSIS_OSINFO_PROD_WOW64FLAG ( sizeof(void*) > 4 ? ( 0 ) : ( 0x80 ) ) #define IsWow64() ( sizeof(void*) > 4 ? ( FALSE ) : ( (signed char) g_osinfo.WVProd < 0 ) ) // NSIS_OSINFO_PROD_WOW64FLAG #define SystemSupportsAltRegView() ( sizeof(void*) > 4 ? ( TRUE ) : ( IsWow64() ) ) WIN32_FIND_DATA * NSISCALL file_exists(TCHAR *buf); TCHAR * NSISCALL my_GetTempFileName(TCHAR *buf, const TCHAR *dir); BOOL NSISCALL myReadFile(HANDLE h, LPVOID buf, DWORD cb); BOOL NSISCALL myWriteFile(HANDLE h, const void*buf, DWORD cb); HRESULT NSISCALL UTF16LEBOM(HANDLE h, INT_PTR ForWrite); //BOOL NSISCALL my_SetWindowText(HWND hWnd, const TCHAR *val); #define my_SetWindowText SetWindowText BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const TCHAR *val); //#define my_SetDialogItemText SetDlgItemText //int NSISCALL my_GetWindowText(HWND hWnd, TCHAR *val, int size); #define my_GetWindowText GetWindowText int NSISCALL my_GetDialogItemText(UINT idx, TCHAR *val); //#define my_GetDialogItemText GetDlgItemText #ifdef NSIS_CONFIG_LOG extern TCHAR log_text[2048]; // BUGBUG: Should this be 2*NSIS_MAX_STRLEN? ...and a little larger when NSIS_CONFIG_LOG_TIMESTAMP is defined! void NSISCALL log_write(int close); const TCHAR * _RegKeyHandleToName(HKEY hKey); void _LogData2Hex(TCHAR *buf, size_t cchbuf, BYTE *data, size_t cbdata); void log_printf(TCHAR *format, ...); #define log_printf2(x1,x2) log_printf(x1,x2); #define log_printf3(x1,x2,x3) log_printf(x1,x2,x3); #define log_printf4(x1,x2,x3,x4) log_printf(x1,x2,x3,x4); #define log_printf5(x1,x2,x3,x4,x5) log_printf(x1,x2,x3,x4,x5); #define log_printf6(x1,x2,x3,x4,x5,x6) log_printf(x1,x2,x3,x4,x5,x6); #define log_printf7(x1,x2,x3,x4,x5,x6,x7) log_printf(x1,x2,x3,x4,x5,x6,x7); #define log_printf8(x1,x2,x3,x4,x5,x6,x7,x8) log_printf(x1,x2,x3,x4,x5,x6,x7,x8); #define RegKeyHandleToName(x1) _RegKeyHandleToName(x1); #define LogData2Hex(x1,x2,x3,x4) _LogData2Hex(x1,x2,x3,x4); extern int log_dolog; extern TCHAR g_log_file[1024]; #else #define log_printf(x1) #define log_printf2(x1,x2) #define log_printf3(x1,x2,x3) #define log_printf4(x1,x2,x3,x4) #define log_printf5(x1,x2,x3,x4,x5) #define log_printf6(x1,x2,x3,x4,x5,x6) #define log_printf7(x1,x2,x3,x4,x5,x6,x7) #define log_printf8(x1,x2,x3,x4,x5,x6,x7,x8) #define RegKeyHandleToName(x1) NULL #define LogData2Hex(x1,x2,x3,x4) #endif extern const UINT32 g_restrictedacl[]; #define GetAdminGrpAcl() ( (PACL) g_restrictedacl ) #define GetAdminGrpSid() ( (PSID) &g_restrictedacl[4] ) BOOL NSISCALL UserIsAdminGrpMember(); // Does not check integrity level, returns true if the process has a non-deny administrators group ACE in the token DWORD NSISCALL CreateRestrictedDirectory(LPCTSTR path); DWORD NSISCALL CreateNormalDirectory(LPCTSTR path); HANDLE NSISCALL myCreateProcess(TCHAR *cmd); BOOL NSISCALL myShellExecuteEx(SHELLEXECUTEINFO*pSEI); int NSISCALL my_MessageBox(const TCHAR *text, UINT type); void NSISCALL myDelete(TCHAR *buf, int flags); HANDLE NSISCALL myOpenFile(const TCHAR *fn, DWORD da, DWORD cd); int NSISCALL validpathspec(TCHAR *ubuf); TCHAR * NSISCALL addtrailingslash(TCHAR *str); //TCHAR NSISCALL lastchar(const TCHAR *str); #define lastchar(str) *CharPrev(str,str+mystrlen(str)) TCHAR * NSISCALL findchar(TCHAR *str, TCHAR c); TCHAR * NSISCALL trimslashtoend(TCHAR *buf); TCHAR * NSISCALL skip_root(TCHAR *path); int NSISCALL is_valid_instpath(TCHAR *s); void NSISCALL validate_filename(TCHAR *fn); /** * MoveFileOnReboot tries to move a file by the name of pszExisting to the * name pszNew. * * @param pszExisting The old name of the file. * @param pszNew The new name of the file. */ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew); DWORD NSISCALL remove_ro_attr(LPCTSTR file); #ifdef _NSIS_NODEFLIB_CRTMEMCPY #define mini_memcpy memcpy #else void NSISCALL mini_memcpy(void *out, const void *in, UINT_PTR cb); #endif enum myGetProcAddressFunctions { MGA_SetDefaultDllDirectories, // Win8+ but also exists on Vista/2008/7/2008R2 if KB2533623 is installed #ifndef _WIN64 MGA_GetDiskFreeSpaceEx, MGA_GetUserDefaultUILanguage, #endif #if !defined(_WIN64) || defined(_M_IA64) MGA_RegDeleteKeyEx, #endif MGA_InitiateShutdown, MGA_SHGetKnownFolderPath, MGA_IsUserAnAdmin, MGA_SHCloneSpecialIDList, #ifndef _WIN64 MGA_IsOS, #endif MGA_SHAutoComplete, // x64 can link to shlwapi directly but as long as MGA_SHGetFolderPath is used we can stick with myGetProcAddress MGA_SHGetFolderPath, // TODO: This can probably call something else directly on x64 #ifdef NSIS_SUPPORT_GETDLLVERSION MGA_GetFileVersionInfoSize, // Version.dll exists in all Windows versions, it is delay loaded to avoid DLL hijacking [bug #1125] MGA_GetFileVersionInfo, MGA_VerQueryValue #endif }; HMODULE NSISCALL LoadSystemLibrary(LPCSTR name); void*NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func); void NSISCALL MessageLoop(UINT uCheckedMsg); /** * This function is useful for Unicode support. Since the Windows * GetProcAddress function always takes a char*, this function wraps * the windows call and does the appropriate translation when * appropriate. * * @param dllHandle Handle to the DLL loaded by LoadLibrary[Ex]. * @param funcName The name of the function to get the address of. * @return The pointer to the function. Null if failure. */ void* NSISCALL NSISGetProcAddress(HANDLE dllHandle, TCHAR* funcName); DWORD NSISCALL WaitForProcess(HANDLE hProcess); // Turn a pair of chars into a word // Turn four chars into a dword #ifdef __BIG_ENDIAN__ // Not very likely, but, still... #ifdef _UNICODE #ifdef _NSIS_NO_INT64_SHR #define CMP4CHAR(mem, const4) ((((LPDWORD)(mem))[0] == (const4[3]|const4[2]<<16)) && (((LPDWORD)(mem))[1] == (const4[1]|const4[0]<<16))) #else #define CMP4CHAR(mem, const4) (*(PDWORD64)(mem) == (const4[3]|const4[2]<<16|(DWORD64)const4[1]<<32|(DWORD64)const4[0]<<48)) #endif #define SET2CHAR(mem, const2) (*(LPDWORD)(mem) = (const2[1]|const2[0]<<16)) #else #define CMP4CHAR(mem, const4) (*(LPDWORD)(mem) == (const4[3]|const4[2]<<8|const4[1]<<16|const4[0]<<24)) #define SET2CHAR(mem, const2) (*(LPWORD)(mem) = (const2[1]|const2[0]<<8)) #endif #else #ifdef _UNICODE #ifdef _NSIS_NO_INT64_SHR #define CMP4CHAR(mem, const4) ((((LPDWORD)(mem))[0] == (DWORD)(const4[0]|const4[1]<<16)) && (((LPDWORD)(mem))[1] == (DWORD)(const4[2]|const4[3]<<16))) #else #define CMP4CHAR(mem, const4) (*(PDWORD64)(mem) == (DWORD64)(const4[0]|const4[1]<<16|(DWORD64)const4[2]<<32|(DWORD64)const4[3]<<48)) #endif #define SET2CHAR(mem, const2) (*(LPDWORD)(mem) = (const2[0]|const2[1]<<16)) #else #define CMP4CHAR(mem, const4) (*(LPDWORD)(mem) == (DWORD)(const4[0]|const4[1]<<8|const4[2]<<16|const4[3]<<24)) #define SET2CHAR(mem, const2) (*(LPWORD)(mem) = (const2[0]|const2[1]<<8)) #endif #endif #endif//!___NSIS_UTIL_H___ nsis-3.11/Source/fileform.cpp000077500000000000000000000141231477201124000161630ustar00rootroot00000000000000/* * fileform.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "fileform.h" #include "exehead/config.h" #include "Platform.h" #include // These functions MUST be synchronized with the structures in Source/exehead/fileform.h ! // Data must be written in the same order it's defined in Source/exehead/fileform.h // In the future, I hope to get one of the two automatically generated from the other void firstheader_writer::write(const firstheader *data) { m_sink->write_int(data->flags); m_sink->write_int(data->siginfo); m_sink->write_int_array(data->nsinst, 3); m_sink->write_int(data->length_of_header); m_sink->write_int(data->length_of_all_following_data); } void block_header_writer::write(const block_header *data, const writer_target_info&ti) { if (ti.is_64bit()) m_sink->write_int64(data->offset); else m_sink->write_int(data->offset); m_sink->write_int(data->num); } void header_writer::write(const header *data, const writer_target_info&ti) { m_sink->write_int(data->flags); block_header_writer bw(writer::m_sink); for (int i = 0; i < BLOCKS_NUM; i++) { bw.write(&data->blocks[i], ti); } m_sink->write_int(data->install_reg_rootkey); m_sink->write_int(data->install_reg_key_ptr); m_sink->write_int(data->install_reg_value_ptr); #ifdef NSIS_SUPPORT_BGBG m_sink->write_int(data->bg_color1); m_sink->write_int(data->bg_color2); m_sink->write_int(data->bg_textcolor); #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT m_sink->write_int(data->lb_bg); m_sink->write_int(data->lb_fg); #endif m_sink->write_int(data->langtable_size); #ifdef NSIS_CONFIG_LICENSEPAGE m_sink->write_int(data->license_bg); #endif//NSIS_CONFIG_LICENSEPAGE #ifdef NSIS_SUPPORT_CODECALLBACKS m_sink->write_int(data->code_onInit); m_sink->write_int(data->code_onInstSuccess); m_sink->write_int(data->code_onInstFailed); m_sink->write_int(data->code_onUserAbort); #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT m_sink->write_int(data->code_onGUIInit); m_sink->write_int(data->code_onGUIEnd); m_sink->write_int(data->code_onMouseOverSection); #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT m_sink->write_int(data->code_onVerifyInstDir); #ifdef NSIS_CONFIG_COMPONENTPAGE m_sink->write_int(data->code_onSelChange); #endif//NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_SUPPORT_REBOOT m_sink->write_int(data->code_onRebootFailed); #endif//NSIS_SUPPORT_REBOOT #endif//NSIS_SUPPORT_CODECALLBACKS #ifdef NSIS_CONFIG_COMPONENTPAGE m_sink->write_int_array(data->install_types, NSIS_MAX_INST_TYPES + 1); #endif m_sink->write_int(data->install_directory_ptr); m_sink->write_int(data->install_directory_auto_append); #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT m_sink->write_int(data->str_uninstchild); m_sink->write_int(data->str_uninstcmd); #endif//NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_SUPPORT_MOVEONREBOOT m_sink->write_int(data->str_wininit); #endif//NSIS_SUPPORT_MOVEONREBOOT } void section_writer::write(const section *data) { m_sink->write_int(data->name_ptr); m_sink->write_int(data->install_types); m_sink->write_int(data->flags); m_sink->write_int(data->code); m_sink->write_int(data->code_size); m_sink->write_int(data->size_kb); m_sink->write_string(data->name, NSIS_MAX_STRLEN); } void entry_writer::write(const entry *data) { m_sink->write_int(data->which); m_sink->write_int_array(data->offsets, MAX_ENTRY_OFFSETS); } void page_writer::write(const page *data) { m_sink->write_int(data->dlg_id); m_sink->write_int(data->wndproc_id); #ifdef NSIS_SUPPORT_CODECALLBACKS m_sink->write_int(data->prefunc); m_sink->write_int(data->showfunc); m_sink->write_int(data->leavefunc); #endif //NSIS_SUPPORT_CODECALLBACKS m_sink->write_int(data->flags); m_sink->write_int(data->caption); m_sink->write_int(data->back); m_sink->write_int(data->next); m_sink->write_int(data->clicknext); m_sink->write_int(data->cancel); m_sink->write_int_array(data->parms, 5); } void ctlcolors_writer::write(const ctlcolors *data, const writer_target_info&ti) { assert(CC_FLAGSMASK >> CC_FLAGSSHIFTFORZERO == 0); assert(sizeof(int) == 4 && sizeof(ctlcolors64) > sizeof(ctlcolors32)); const ctlcolors *p = data; m_sink->write_int(p->text); m_sink->write_int(p->bkc); if (ti.is_64bit()) { assert(!p->bkb); m_sink->write_int64(p->bkb); m_sink->write_int(p->lbStyle); } else { m_sink->write_int(p->lbStyle); m_sink->write_int(p->bkb); } m_sink->write_int(p->bkmode); m_sink->write_int(p->flags); } void LOGFONT_writer::write(const LOGFONT *data) { m_sink->write_int(data->lfHeight); m_sink->write_int(data->lfWidth); m_sink->write_int(data->lfEscapement); m_sink->write_int(data->lfOrientation); m_sink->write_int(data->lfWeight); m_sink->write_byte(data->lfItalic); m_sink->write_byte(data->lfUnderline); m_sink->write_byte(data->lfStrikeOut); m_sink->write_byte(data->lfCharSet); m_sink->write_byte(data->lfOutPrecision); m_sink->write_byte(data->lfClipPrecision); m_sink->write_byte(data->lfQuality); m_sink->write_byte(data->lfPitchAndFamily); m_sink->write_string(data->lfFaceName, LF_FACESIZE); } void lang_table_writer::write(const unsigned char *data) { assert(sizeof(LANGID) == sizeof(short)); m_sink->write_short(* (short *) data); data += sizeof(short); m_sink->write_int_array((int *) data, m_lang_strings + 2); } void lang_table_writer::write_block(IGrowBuf *buf, writer_sink *sink, const size_t table_size) { unsigned char *tables = (unsigned char *) buf->get(); // langtable has LANGID(WORD) + dlgoffset(int) + right-to-left(int) + string pointers. size_t lang_strings = ( table_size - 2 * sizeof(int) - sizeof(LANGID) ) / sizeof(int); size_t l = buf->getlen() / table_size; lang_table_writer writer(sink, lang_strings); for (size_t i = 0; i < l; i++) { writer.write(tables + i * table_size); } } nsis-3.11/Source/fileform.h000077500000000000000000000042771477201124000156410ustar00rootroot00000000000000/* * fileform.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #ifndef ___MAKENSIS_FILEFORM_H___ #define ___MAKENSIS_FILEFORM_H___ #include "exehead/fileform.h" #include "writer.h" #define DECLARE_WRITER(x) \ class x##_writer : public writer \ { \ public: \ x##_writer(writer_sink *sink) : writer(sink) {} \ void write(const x *data); \ static void write_block(IGrowBuf *buf, writer_sink *sink) \ { \ x *arr = (x *) buf->get(); \ size_t l = buf->getlen() / sizeof(x); \ x##_writer writer(sink); \ for (size_t i = 0; i < l; i++) \ { \ writer.write(&arr[i]); \ } \ } \ } #define DECLARE_PLATFORMITEMWRITER(x) class x##_writer : public writer \ { public: \ x##_writer(writer_sink *sink) : writer(sink) {} \ void write(const x *data, const writer_target_info&ti); \ static void write_block(IGrowBuf *pGB, writer_sink *pS, const writer_target_info *pTI = 0) \ { \ x##_writer writer(pS); \ if (!pTI) pTI = &pS->get_target_info(); /* Defaults to TI from sink */ \ for (size_t l = pGB->getlen() / sizeof(x), i = 0; i < l; i++) \ writer.write(&(((x*)pGB->get())[i]), *pTI); \ } \ } DECLARE_WRITER(firstheader); DECLARE_PLATFORMITEMWRITER(block_header); DECLARE_PLATFORMITEMWRITER(header); // Platform specific because it writes block_headers DECLARE_WRITER(section); DECLARE_WRITER(entry); DECLARE_WRITER(page); DECLARE_PLATFORMITEMWRITER(ctlcolors); DECLARE_WRITER(LOGFONT); class lang_table_writer : public writer { public: lang_table_writer(writer_sink *sink, const size_t lang_strings) : writer(sink), m_lang_strings(lang_strings) {} void write(const unsigned char *data); static void write_block(IGrowBuf *buf, writer_sink *sink, const size_t table_size); private: size_t m_lang_strings; }; #endif//!___MAKENSIS_FILEFORM_H___ nsis-3.11/Source/growbuf.cpp000077500000000000000000000056041477201124000160370ustar00rootroot00000000000000/* * growbuf.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support and Doxygen comments by Jim Park -- 07/31/2007 */ #include "Platform.h" #include "growbuf.h" #include // for malloc/free #include // for memcpy #include // for f* #include // for std::min #include #include "tchar.h" #include "util.h" using namespace std; // Default constructor GrowBuf::GrowBuf() { m_alloc=m_used=0, m_zero=false, m_s=NULL, m_bs=32768; } // Destructor GrowBuf::~GrowBuf() { free(m_s); } void GrowBuf::set_zeroing(bool zero) { m_zero=zero; } GrowBuf::size_type GrowBuf::add(const void *data, GrowBuf::size_type len) { if (len<=0) return 0; // BUGBUG: Why is this returning 0? It should return m_used? resize(m_used+len); memcpy((BYTE*)m_s+m_used-len,data,len); return m_used-len; } void GrowBuf::resize(GrowBuf::size_type newlen) { const size_type orgalloc=m_alloc; const size_type orgused=m_used; m_used=newlen; if (newlen > m_alloc) { void *newstor; // Jim Park: Not sure why we don't just add m_bs. Multiplying by 2 // makes m_bs meaningless after a few resizes. So TinyGrowBuf // isn't very tiny. m_alloc = newlen*2 + m_bs; newstor = realloc(m_s, m_alloc); if (!newstor) { extern int g_display_errors; #ifdef _DEBUG if (g_display_errors) { PrintColorFmtMsg_WARN(_T("\nwarning: realloc(%d) failed, trying malloc(%d)!\n"),m_alloc,newlen); }; #endif m_alloc=newlen; // try to malloc the minimum needed newstor=malloc(m_alloc); if (!newstor) { extern void quit(); if (g_display_errors) { assert(sizeof(size_type) == sizeof(int)); PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%d) failed.\n"),m_alloc); } quit(); } memcpy(newstor,m_s,min(newlen,orgalloc)); free(m_s); } m_s=newstor; } // Zero out the new buffer area if (m_zero && m_used > orgused) memset((BYTE*)m_s + orgused, 0, m_used - orgused); if (!m_used && m_alloc > 2*m_bs) // only free if you resize to 0 and we're > 64k or // 2K in the case of TinyGrowBuf { m_alloc=0; free(m_s); m_s=NULL; } } GrowBuf::size_type GrowBuf::getlen() const { return m_used; } void *GrowBuf::get() const { return m_s; } void GrowBuf::swap(GrowBuf&other) { std::swap(m_s, other.m_s); std::swap(m_alloc, other.m_alloc); std::swap(m_used, other.m_used); std::swap(m_zero, other.m_zero); std::swap(m_bs, other.m_bs); } nsis-3.11/Source/growbuf.h000077500000000000000000000062261477201124000155050ustar00rootroot00000000000000/* * growbuf.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/22/2007 */ #ifndef __GROWBUF_H_ #define __GROWBUF_H_ /** * IGrowBuf is the interface to a buffer that grows as you * add to the buffer. */ class IGrowBuf { public: typedef int size_type; // Hopefully we can change this at some point virtual ~IGrowBuf() {} /** * Add data to the buffer. * @param data Pointer to the data to be stored. * @param len Size of the data in bytes. * @return the previous logical size in bytes before the addition. */ virtual size_type add(const void *data, size_type len)=0; /** * Resizes the buffer to hold the number of bytes specified. * @param newlen the desired logical size of the buffer. */ virtual void resize(size_type newlen)=0; /** * Get the length of the logical buffer in bytes. * @return the length in bytes */ virtual size_type getlen() const=0; /** * Get the buffer itself. * @return Void pointer to the buffer. */ virtual void *get() const=0; }; /** * GrowBuf implements IGrowBuf and grows in 32K chunks. */ class GrowBuf : public IGrowBuf { private: // don't copy instances GrowBuf(const GrowBuf&); void operator=(const GrowBuf&); public: GrowBuf(); virtual ~GrowBuf(); /** * Set whether to zero out buffer * @param zero A boolean value. */ void set_zeroing(bool zero); /** * Add data to the buffer. * @param data Pointer to the data to be stored. * @param len Size of the data in bytes. * @return the previous logical size in bytes before the addition. */ size_type add(const void *data, size_type len); /** * Resizes the buffer to hold the number of bytes specified. * Setting the newlen to 0 will cause the buffer to be at most * 2*m_bs bytes long. (It will free the buffer if > 2*m_bs.) * @param newlen the desired logical size of the buffer. */ void resize(size_type newlen); /** * Get the length of the logical buffer in bytes. * @return the length in bytes */ size_type getlen() const; /** * Get the buffer itself. * @return Void pointer to the buffer. */ void *get() const; void swap(GrowBuf&other); private: void *m_s; /* the storage buffer */ size_type m_alloc; /* allocated bytes */ size_type m_used; /* how many bytes of the buffer is used? */ bool m_zero; /* should storage be zeroed out? */ protected: unsigned short m_bs; // byte-size to grow by }; /** * TinyGrowBuf is a derived class that grows the buffer * in tiny increments. */ class TinyGrowBuf : public GrowBuf { public: TinyGrowBuf() : GrowBuf() { m_bs=1024; } TinyGrowBuf(size_type cb) : GrowBuf() { m_bs=1024; resize(cb); } }; #endif nsis-3.11/Source/icon.cpp000077500000000000000000000307521477201124000153160ustar00rootroot00000000000000/* * icon.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #include "icon.h" #include "util.h" #include "lang.h" #include #include #include #include using namespace std; extern int g_display_errors; extern FILE *g_output; #define SIZEOF_RSRC_ICON_GROUP_ENTRY 14 enum { ICO_TYPE_ICON = 1, ICO_TYPE_CURSOR = 2 }; static bool is_valid_header(const void*headerdata) { assert(sizeof(IconGroupHeader) == 6); IconGroupHeader*pGH = (IconGroupHeader*) headerdata; if (pGH->wReserved != FIX_ENDIAN_INT16(0x0000)) return false; WORD type = FIX_ENDIAN_INT16(pGH->wType); if (type != ICO_TYPE_ICON && type != ICO_TYPE_CURSOR) return false; return FIX_ENDIAN_INT16(pGH->wCount) != 0; } template static WORD read_icon_header(S*f, IconGroupHeader& igh) { if (!freadall(&igh, sizeof(IconGroupHeader), f)) { fclose(f); throw runtime_error("unable to read header from file"); } if (!is_valid_header(&igh)) { igh.wType = igh.wCount = 0; fclose(f); throw runtime_error("invalid icon file"); } FIX_ENDIAN_INT16_INPLACE(igh.wReserved); FIX_ENDIAN_INT16_INPLACE(igh.wType); FIX_ENDIAN_INT16_INPLACE(igh.wCount); return igh.wCount; } void free_loaded_icon(IconGroup&icon) { for (IconGroup::size_type i = 0; i < icon.size(); i++) delete [] icon[i].data; icon.clear(); } IconGroup load_icon_res(CResourceEditor* re, LPWSTR RT, WORD RN, LANGID RL) { IconGroupHeader* header; IconGroup result; LPBYTE group = re->GetResource(RT, RN, RL); if (!group) throw runtime_error("can't find icon group"); header = (IconGroupHeader*) group; // Note: To handle cursors, use CResourceEditor::ExtractIcoCur if (MAKEINTRESOURCE((size_t) RT) != RT_GROUP_ICON) throw runtime_error("unsupported type"); for (WORD i = 0; i < FIX_ENDIAN_INT16(header->wCount); i++) { Icon icon; icon.index = i; RsrcIconGroupEntry* entry = (RsrcIconGroupEntry*) (group + sizeof(IconGroupHeader) + SIZEOF_RSRC_ICON_GROUP_ENTRY * i); memcpy(&icon.meta, &entry->header, sizeof(IconGroupEntry)); WORD rsrc_id = FIX_ENDIAN_INT16(entry->wRsrcId); icon.data = re->GetResource(RT_ICON, rsrc_id, RL); if (!icon.data) { free_loaded_icon(result); throw runtime_error("can't find icon"); } result.push_back(icon); } re->FreeResource(group); return result; } IconGroup load_icon_res(CResourceEditor* re, WORD id) { return load_icon_res(re, RT_GROUP_ICON, id, NSIS_DEFAULT_LANG); } template static IconGroup load_iconimages_from_stream(const IconGroupHeader&iconHeader, S&file) { IconGroup result; for (WORD i = 0; i < iconHeader.wCount; i++) { Icon icon; icon.index = i; icon.data = NULL; if (!freadall(&icon.meta, sizeof(IconGroupEntry), file)) { free_loaded_icon(result); throw runtime_error("unable to read entry from file"); } DWORD size = FIX_ENDIAN_INT32(icon.meta.dwRawSize); if (size > 1048576) // magic numbers are great { free_loaded_icon(result); throw runtime_error("invalid icon file size"); } DWORD iconOffset; if (!freadall(&iconOffset, sizeof(DWORD), file)) { free_loaded_icon(result); throw runtime_error("unable to read offset from file"); } FIX_ENDIAN_INT32_INPLACE(iconOffset); fpos_t pos; fgetpos(file, &pos); if (fseek(file, iconOffset, SEEK_SET)) { free_loaded_icon(result); throw runtime_error("corrupted icon file, too small"); } icon.data = new BYTE[size]; if (!freadall(icon.data, size, file)) die: { free_loaded_icon(result); throw runtime_error("unable to read icon from file"); } if (fsetpos(file, &pos)) goto die; result.push_back(icon); } return result; } template static IconGroup load_icon_from_stream(S*file) { IconGroupHeader iconHeader; read_icon_header(file, iconHeader); return load_iconimages_from_stream(iconHeader, file); } IconGroup load_icon_file(const TCHAR* filename) { FILE* f = FOPEN(filename, ("rb")); if (!f) throw runtime_error("can't open file"); MANAGE_WITH(f, fclose); return load_icon_from_stream(f); } IconGroup load_icon(const TCHAR* filename) { if (CResourceEditor::IsResProtocol(filename)) // Try opening embedded resource { CResourceEditor::EXTERNAL x; if (CResourceEditor::MapExternal(filename, CResourceEditor::TM_ICON, x)) { CStdFileStreamOnMemory stream(x.Data, x.cbData); IconGroup icon = load_icon_from_stream(&stream); CResourceEditor::FreeExternal(x); return icon; } } return load_icon_file(filename); } typedef struct { unsigned index1; unsigned index2; DWORD size; unsigned size_index; } IconPair; typedef vector IconPairs; static bool compare_icon(Icon a, Icon b) { return FIX_ENDIAN_INT32(a.meta.dwRawSize) > FIX_ENDIAN_INT32(b.meta.dwRawSize); } static IconGroup sort_icon(IconGroup icon) { IconGroup sorted = icon; sort(sorted.begin(), sorted.end(), compare_icon); return sorted; } static bool compare_pairs_index1(IconPair a, IconPair b) { return a.index1 < b.index1; } static bool compare_pairs_index2(IconPair a, IconPair b) { return a.index2 < b.index2; } static IconPairs sort_pairs(IconPairs pairs, bool first) { IconPairs sorted = pairs; sort(sorted.begin(), sorted.end(), first ? compare_pairs_index1 : compare_pairs_index2); return sorted; } static IconPairs get_icon_order(IconGroup icon1, IconGroup icon2) { IconGroup sorted_icons1 = sort_icon(icon1); IconGroup sorted_icons2 = sort_icon(icon2); IconGroup::size_type shared_count = min(sorted_icons1.size(), sorted_icons2.size()); IconGroup::size_type total_count = max(sorted_icons1.size(), sorted_icons2.size()); IconPairs result; IconGroup::size_type i; for (i = 0; i < shared_count; i++) { IconPair pair; pair.index1 = sorted_icons1[i].index; pair.index2 = sorted_icons2[i].index; pair.size = max( FIX_ENDIAN_INT32(sorted_icons1[i].meta.dwRawSize), FIX_ENDIAN_INT32(sorted_icons2[i].meta.dwRawSize) ); pair.size_index = truncate_cast(unsigned int,i); result.push_back(pair); } for (; i < total_count; i++) { IconPair pair; if (i < sorted_icons1.size()) { pair.index1 = sorted_icons1[i].index; pair.index2 = 0xffff; pair.size = FIX_ENDIAN_INT32(sorted_icons1[i].meta.dwRawSize); pair.size_index = truncate_cast(unsigned int,i); } if (i < sorted_icons2.size()) { pair.index2 = sorted_icons2[i].index; pair.index1 = 0xffff; pair.size = FIX_ENDIAN_INT32(sorted_icons2[i].meta.dwRawSize); pair.size_index = truncate_cast(unsigned int,i); } result.push_back(pair); } return result; } #define destroy_icon_group(p) ( delete [] (p) ) static LPBYTE generate_icon_group(IconGroup icon, IconPairs order, bool first) { size_t groupsize = sizeof(IconGroupHeader) // header + order.size() * SIZEOF_RSRC_ICON_GROUP_ENTRY; // entries LPBYTE group = new BYTE[groupsize]; memset(group, 0, groupsize); // Reproducible builds (bug #1230) IconGroupHeader* header = (IconGroupHeader*) group; header->wReserved = 0; header->wType = FIX_ENDIAN_INT16(ICO_TYPE_ICON); header->wCount = FIX_ENDIAN_INT16((WORD)icon.size()); order = sort_pairs(order, first); for (IconGroup::size_type i = 0; i < icon.size(); i++) { RsrcIconGroupEntry* entry = (RsrcIconGroupEntry*) &group[sizeof(IconGroupHeader) + SIZEOF_RSRC_ICON_GROUP_ENTRY * i]; unsigned index = first ? order[i].index1 : order[i].index2; memcpy(&entry->header, &icon[index].meta, sizeof(IconGroupEntry)); entry->wRsrcId = FIX_ENDIAN_INT16(order[i].size_index + 1); } return group; } // set_icon, must get an initialized resource editor void set_main_icon(CResourceEditor* re, WORD wIconId, IconGroup icon1, IconGroup icon2) { IconPairs order = get_icon_order(icon1, icon2); // generate group LPBYTE group1 = generate_icon_group(icon1, order, true); // set group size_t group_size = sizeof(IconGroupHeader) // header + order.size() * SIZEOF_RSRC_ICON_GROUP_ENTRY; // entries re->UpdateResource(RT_GROUP_ICON, wIconId, NSIS_DEFAULT_LANG, group1, (DWORD)group_size, CResourceEditor::TM_RAW); // Update the group entries but not the images destroy_icon_group(group1); // delete old icons unsigned i = 1; while (i <= MAIN_ICON_LAST_IMAGE && re->UpdateResource(RT_ICON, i++, NSIS_DEFAULT_LANG, 0, 0)); // set new icons IconGroup::size_type order_index; for (order_index = 0; order_index < order.size(); order_index++) { WORD size_index = order[order_index].size_index; DWORD size = order[order_index].size; LPBYTE data = new BYTE[size]; memset(data, 0, size); if (order_index < icon1.size()) { Icon* icon = &icon1[order[order_index].index1]; memcpy(data, icon->data, FIX_ENDIAN_INT32(icon->meta.dwRawSize)); } re->UpdateResource(RT_ICON, size_index + 1, NSIS_DEFAULT_LANG, data, size); delete [] data; } } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT // returns the data of the uninstaller icon that should replace the installer icon data unsigned char* generate_uninstall_icon_data(IconGroup icon1, IconGroup icon2, size_t &data_size) { IconGroup::size_type i; IconPairs order = get_icon_order(icon1, icon2); // generate group LPBYTE group = generate_icon_group(icon2, order, false); // calculate size size_t group_size = sizeof(IconGroupHeader) // header + order.size() * SIZEOF_RSRC_ICON_GROUP_ENTRY; // entries data_size = group_size // group header + sizeof(DWORD) * 2 // offset and size of group header + (sizeof(DWORD) * 2) * icon2.size() // offset and size per entry + sizeof(DWORD); // terminator for (i = 0; i < icon2.size(); i++) { // add icon sizes data_size += FIX_ENDIAN_INT32(icon2[i].meta.dwRawSize); } // allocate memory LPBYTE uninst_data = new BYTE[data_size]; LPBYTE seeker = uninst_data; // fill group header *(LPDWORD) seeker = FIX_ENDIAN_INT32((UINT32)group_size); seeker += sizeof(DWORD); *(LPDWORD) seeker = 0; seeker += sizeof(DWORD); memcpy(seeker, group, group_size); seeker += group_size; // fill entries for (i = 0; i < icon2.size(); i++) { Icon* icon = &icon2[order[i].index2]; DWORD size = icon->meta.dwRawSize; memcpy(seeker, &size, sizeof(size)); seeker += sizeof(size); memset(seeker, 0, sizeof(DWORD)); seeker += sizeof(DWORD); memcpy(seeker, icon->data, size); seeker += FIX_ENDIAN_INT32(size); } // add terminator memset(seeker, 0, sizeof(DWORD)); // done destroy_icon_group(group); return uninst_data; } // Fill the array of icons for uninstall with their offsets // Returns zero on failure int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE uninstIconData, WORD wIconId) { try { DWORD offset; DWORD size; CResourceEditor re(exeHeader, (DWORD)exeHeaderSize, false); LPBYTE seeker = uninstIconData; offset = re.GetResourceOffset(RT_GROUP_ICON, wIconId, NSIS_DEFAULT_LANG); size = FIX_ENDIAN_INT32(*(LPDWORD)seeker); seeker += sizeof(DWORD); *(LPDWORD) seeker = FIX_ENDIAN_INT32(offset); seeker += sizeof(DWORD); seeker += size; WORD icon_index = 1; while (*(LPDWORD)seeker) { offset = re.GetResourceOffset(RT_ICON, icon_index, NSIS_DEFAULT_LANG); if (offset > exeHeaderSize) { throw runtime_error("invalid icon offset (possibly compressed icon)"); } DWORD real_size = re.GetResourceSize(RT_ICON, icon_index, NSIS_DEFAULT_LANG); size = FIX_ENDIAN_INT32(*(LPDWORD)seeker); seeker += sizeof(DWORD); if (real_size < size) // uninst icon could be smaller, in case we don't have perfect matches { throw runtime_error("invalid icon size (possibly compressed icon)"); } *(LPDWORD) seeker = FIX_ENDIAN_INT32(offset); seeker += sizeof(DWORD); seeker += size; icon_index++; } } catch (const exception& e) { if (g_display_errors) PrintColorFmtMsg_ERR(_T("\nError generating uninstaller icon: %") NPRIs _T(" -- failing!\n"), CtoTStrParam(e.what())); return 0; } return 1; } #endif // NSIS_CONFIG_UNINSTALL_SUPPORT nsis-3.11/Source/icon.h000077500000000000000000000033711477201124000147600ustar00rootroot00000000000000/* * icon.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ /* Unicode support by Jim Park -- 11/16/2007 */ #ifndef _ICON_H_ #define _ICON_H_ #include "ResourceEditor.h" #include typedef struct { WORD wReserved; WORD wType; WORD wCount; } IconGroupHeader; typedef struct { BYTE bWidth; BYTE bHeight; BYTE bPaletteEntries; BYTE bReserved; WORD wPlanes; WORD wBitsPerPixel; DWORD dwRawSize; } IconGroupEntry; typedef struct { IconGroupEntry header; DWORD dwImageOffset; } FileIconGroupEntry; typedef struct { IconGroupEntry header; WORD wRsrcId; } RsrcIconGroupEntry; typedef struct { unsigned index; IconGroupEntry meta; LPBYTE data; } Icon; typedef std::vector IconGroup; IconGroup load_icon(const TCHAR* filename); IconGroup load_icon_file(const TCHAR* filename); IconGroup load_icon_res(CResourceEditor* re, WORD id); void free_loaded_icon(IconGroup&icon); void set_main_icon(CResourceEditor* re, WORD wIconId, IconGroup icon1, IconGroup icon2); #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT // returns the data of the uninstaller icon (inside filename) that should replace the installer icon data LPBYTE generate_uninstall_icon_data(IconGroup icon1, IconGroup icon2, size_t &size); // Fill the array of icons for uninstall with their offsets int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE uninstIconData, WORD wIconId); #endif//NSIS_CONFIG_UNINSTALL_SUPPORT #endif//_ICON_H_ nsis-3.11/Source/lang.cpp000077500000000000000000001150121477201124000153000ustar00rootroot00000000000000/* * lang.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support and Doxygen comments by Jim Park -- 07/25/2007 */ #include "Platform.h" #include #include #include "tchar.h" #include "build.h" #include "util.h" #include "DialogTemplate.h" #include "exehead/resource.h" #include #include "tstring.h" #include "utf.h" using namespace std; // Default English strings. Should match NSIS_DEFAULT_LANG // Do not change the first string in every item, it's the LangString // name for usage in scripts. typedef enum { NONE_STATIC = 0, INSTALL_STATIC = 1, UNINSTALL_STATIC = 2, BOTH_STATIC = 3 } STATICID; struct NLFString { const TCHAR *szLangStringName; const TCHAR *szDefault; STATICID eStaticID; }; NLFString NLFStrings[NLF_STRINGS] = { {_T("^Branding"), _T("Nullsoft Install System %s"), BOTH_STATIC}, {_T("^SetupCaption"), _T("$(^Name) Setup"), INSTALL_STATIC}, {_T("^UninstallCaption"), _T("$(^Name) Uninstall"), UNINSTALL_STATIC}, {_T("^LicenseSubCaption"), _T(": License Agreement"), NONE_STATIC}, {_T("^ComponentsSubCaption"), _T(": Installation Options"), NONE_STATIC}, {_T("^DirSubCaption"), _T(": Installation Folder"), NONE_STATIC}, {_T("^InstallingSubCaption"), _T(": Installing"), NONE_STATIC}, {_T("^CompletedSubCaption"), _T(": Completed"), NONE_STATIC}, {_T("^UnComponentsSubCaption"), _T(": Uninstallation Options"), NONE_STATIC}, {_T("^UnDirSubCaption"), _T(": Uninstallation Folder"), NONE_STATIC}, {_T("^ConfirmSubCaption"), _T(": Confirmation"), NONE_STATIC}, {_T("^UninstallingSubCaption"), _T(": Uninstalling"), NONE_STATIC}, {_T("^UnCompletedSubCaption"), _T(": Completed"), NONE_STATIC}, {_T("^BackBtn"), _T("< &Back"), NONE_STATIC}, {_T("^NextBtn"), _T("&Next >"), NONE_STATIC}, {_T("^AgreeBtn"), _T("I &Agree"), NONE_STATIC}, {_T("^AcceptBtn"), _T("I &accept the terms of the License Agreement"), NONE_STATIC}, {_T("^DontAcceptBtn"), _T("I &do not accept the terms of the License Agreement"), NONE_STATIC}, {_T("^InstallBtn"), _T("&Install"), NONE_STATIC}, {_T("^UninstallBtn"), _T("&Uninstall"), NONE_STATIC}, {_T("^CancelBtn"), _T("Cancel"), NONE_STATIC}, {_T("^CloseBtn"), _T("&Close"), NONE_STATIC}, {_T("^BrowseBtn"), _T("B&rowse..."), NONE_STATIC}, {_T("^ShowDetailsBtn"), _T("Show &details"), NONE_STATIC}, {_T("^ClickNext"), _T("Click Next to continue."), NONE_STATIC}, {_T("^ClickInstall"), _T("Click Install to start the installation."), NONE_STATIC}, {_T("^ClickUninstall"), _T("Click Uninstall to start the uninstallation."), NONE_STATIC}, {_T("^Name"), _T("Name"), BOTH_STATIC}, {_T("^NameDA"), 0, NONE_STATIC}, // virtual {_T("^Completed"), _T("Completed"), NONE_STATIC}, {_T("^LicenseText"), _T("Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click I Agree."), NONE_STATIC}, {_T("^LicenseTextCB"), _T("Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK"), NONE_STATIC}, {_T("^LicenseTextRB"), _T("Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK"), NONE_STATIC}, {_T("^UnLicenseText"), _T("Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click I Agree."), NONE_STATIC}, {_T("^UnLicenseTextCB"), _T("Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK"), NONE_STATIC}, {_T("^UnLicenseTextRB"), _T("Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK"), NONE_STATIC}, {_T("^LicenseData"), 0, NONE_STATIC}, // virtual - not processed {_T("^Custom"), _T("Custom"), NONE_STATIC}, {_T("^ComponentsText"), _T("Check the components you want to install and uncheck the components you don't want to install. $_CLICK"), NONE_STATIC}, {_T("^ComponentsSubText1"), _T("Select the type of install:"), NONE_STATIC}, {_T("^ComponentsSubText2_NoInstTypes"), _T("Select components to install:"), NONE_STATIC}, {_T("^ComponentsSubText2"), _T("Or, select the optional components you wish to install:"), NONE_STATIC}, {_T("^UnComponentsText"), _T("Check the components you want to uninstall and uncheck the components you don't want to uninstall. $_CLICK"), NONE_STATIC}, {_T("^UnComponentsSubText1"), _T("Select the type of uninstall:"), NONE_STATIC}, {_T("^UnComponentsSubText2_NoInstTypes"), _T("Select components to uninstall:"), NONE_STATIC}, {_T("^UnComponentsSubText2"), _T("Or, select the optional components you wish to uninstall:"), NONE_STATIC}, {_T("^DirText"), _T("Setup will install $(^NameDA) in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK"), NONE_STATIC}, {_T("^DirSubText"), _T("Destination Folder"), NONE_STATIC}, {_T("^DirBrowseText"), _T("Select the folder to install $(^NameDA) in:"), NONE_STATIC}, {_T("^UnDirText"), _T("Setup will uninstall $(^NameDA) from the following folder. To uninstall from a different folder, click Browse and select another folder. $_CLICK"), NONE_STATIC}, {_T("^UnDirSubText"), _T(""), NONE_STATIC}, {_T("^UnDirBrowseText"), _T("Select the folder to uninstall $(^NameDA) from:"), NONE_STATIC}, {_T("^SpaceAvailable"), _T("Space available: "), BOTH_STATIC}, {_T("^SpaceRequired"), _T("Space required: "), BOTH_STATIC}, {_T("^UninstallingText"), _T("This wizard will uninstall $(^NameDA) from your computer. $_CLICK"), NONE_STATIC}, {_T("^UninstallingSubText"), _T("Uninstalling from:"), NONE_STATIC}, {_T("^FileError"), _T("Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Abort to stop the installation,\r\nRetry to try again, or\r\nIgnore to skip this file."), NONE_STATIC}, {_T("^FileError_NoIgnore"), _T("Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Retry to try again, or\r\nCancel to stop the installation."), NONE_STATIC}, {_T("^CantWrite"), _T("Can't write: "), BOTH_STATIC}, {_T("^CopyFailed"), _T("Copy failed"), BOTH_STATIC}, {_T("^CopyTo"), _T("Copy to "), BOTH_STATIC}, {_T("^Registering"), _T("Registering: "), NONE_STATIC}, {_T("^Unregistering"), _T("Unregistering: "), NONE_STATIC}, {_T("^SymbolNotFound"), _T("Could not find symbol: "), BOTH_STATIC}, {_T("^CouldNotLoad"), _T("Could not load: "), BOTH_STATIC}, {_T("^CreateFolder"), _T("Create folder: "), BOTH_STATIC}, {_T("^CreateShortcut"), _T("Create shortcut: "), BOTH_STATIC}, {_T("^CreatedUninstaller"), _T("Created uninstaller: "), BOTH_STATIC}, {_T("^Delete"), _T("Delete file: "), BOTH_STATIC}, {_T("^DeleteOnReboot"), _T("Delete on reboot: "), BOTH_STATIC}, {_T("^ErrorCreatingShortcut"), _T("Error creating shortcut: "), BOTH_STATIC}, {_T("^ErrorCreating"), _T("Error creating: "), BOTH_STATIC}, {_T("^ErrorDecompressing"), _T("Error decompressing data! Corrupted installer?"), BOTH_STATIC}, {_T("^ErrorRegistering"), _T("Error registering DLL"), BOTH_STATIC}, {_T("^ExecShell"), _T("ExecShell: "), BOTH_STATIC}, {_T("^Exec"), _T("Execute: "), BOTH_STATIC}, {_T("^Extract"), _T("Extract: "), BOTH_STATIC}, {_T("^ErrorWriting"), _T("Extract: error writing to file "), BOTH_STATIC}, {_T("^InvalidOpcode"), _T("Installer corrupted: invalid opcode"), BOTH_STATIC}, {_T("^NoOLE"), _T("No OLE for: "), BOTH_STATIC}, {_T("^OutputFolder"), _T("Output folder: "), BOTH_STATIC}, {_T("^RemoveFolder"), _T("Remove folder: "), BOTH_STATIC}, {_T("^RenameOnReboot"), _T("Rename on reboot: "), BOTH_STATIC}, {_T("^Rename"), _T("Rename: "), BOTH_STATIC}, {_T("^Skipped"), _T("Skipped: "), BOTH_STATIC}, {_T("^CopyDetails"), _T("Copy Details To Clipboard"), BOTH_STATIC}, {_T("^LogInstall"), _T("Log install process"), BOTH_STATIC}, {_T("^Byte"), _T("B"), BOTH_STATIC}, {_T("^Kilo"), _T(" K"), BOTH_STATIC}, {_T("^Mega"), _T(" M"), BOTH_STATIC}, {_T("^Giga"), _T(" G"), BOTH_STATIC}, {_T("^Font"), _T("MS Shell Dlg"), NONE_STATIC}, {_T("^FontSize"), _T("8"), NONE_STATIC}, {_T("^RTL"), _T("0"), NONE_STATIC}, {_T("^Language"), _T("English"), NONE_STATIC} }; // ============== // LangStringList // ============== int LangStringList::add(const TCHAR *name, int *sn/*=0*/) { int pos = SortedStringListND::add(name); if (pos == -1) return -1; langstring* lstrPtr = (langstring*)(m_gr.get()) + pos; lstrPtr->sn = m_count; if (sn) *sn = m_count; m_count++; lstrPtr->index = -1; lstrPtr->uindex = -1; lstrPtr->process = 1; return pos; } int LangStringList::get(const TCHAR *name, int *sn/*=0*/, int *index/*=0*/, int *uindex/*=0*/, int *process/*=0*/) { if (index) *index = -1; if (uindex) *uindex = -1; if (sn) *sn = -1; int v=find(name); if (v==-1) return -1; langstring* lstrPtr = (langstring*)(m_gr.get()) + v; if (index) *index = lstrPtr->index; if (uindex) *uindex = lstrPtr->uindex; if (sn) *sn = lstrPtr->sn; if (process) *process = lstrPtr->process; return v; } void LangStringList::set(int pos, int index/*=-1*/, int uindex/*=-1*/, int process/*=-1*/) { if ((unsigned int)pos > (m_gr.getlen() / sizeof(struct langstring))) return; struct langstring *data=((struct langstring *) m_gr.get()) + pos; if (index >= 0) data->index = index; if (uindex >= 0) data->uindex = uindex; if (process >= 0) data->process = process; } void LangStringList::set(const TCHAR *name, int index, int uindex/*=-1*/, int process/*=-1*/) { set(find(name), index, uindex, process); } const TCHAR* LangStringList::pos2name(int pos) { struct langstring *data=(struct langstring *) m_gr.get(); if (pos < 0 || (unsigned int)pos > (m_gr.getlen() / sizeof(struct langstring))) return 0; return ((const TCHAR*) m_strings.get() + data[pos].name); } const TCHAR* LangStringList::offset2name(int name) { if (name < 0 || (unsigned int)name > m_strings.getlen()/sizeof(TCHAR)) return 0; return (const TCHAR*) m_strings.get() + name; } int LangStringList::getnum() { return m_gr.getlen() / sizeof(struct langstring); } int LangStringList::compare_index(const void *item1, const void *item2) { struct langstring *ls1 = (struct langstring *)item1; struct langstring *ls2 = (struct langstring *)item2; return ls1->index - ls2->index; } langstring* LangStringList::sort_index(int *num) { if (!num) return 0; m_sortbuf.resize(0); m_sortbuf.add(m_gr.get(), m_gr.getlen()); *num = m_sortbuf.getlen() / sizeof(struct langstring); qsort(m_sortbuf.get(), *num, sizeof(struct langstring), compare_index); return (struct langstring*) m_sortbuf.get(); } int LangStringList::compare_uindex(const void *item1, const void *item2) { struct langstring *ls1 = (struct langstring *)item1; struct langstring *ls2 = (struct langstring *)item2; return ls1->uindex - ls2->uindex; } langstring* LangStringList::sort_uindex(int *num) { if (!num) return 0; m_sortbuf.resize(0); m_sortbuf.add(m_gr.get(), m_gr.getlen()); *num = m_sortbuf.getlen() / sizeof(struct langstring); qsort(m_sortbuf.get(), *num, sizeof(struct langstring), compare_uindex); return (struct langstring*) m_sortbuf.get(); } // ============ // StringsArray // ============ StringsArray::StringsArray() { // We make zero an invalid index. Using 0 will get back an empty string. m_offsets.set_zeroing(1); m_strings.add(_T(""), sizeof(_T(""))); } void StringsArray::resize(int num) { m_offsets.resize(num * sizeof(int)); } int StringsArray::set(int idx, const TCHAR *str) { if (idx < 0) return 0; if (idx >= (int)(m_offsets.getlen() / sizeof(int))) resize(idx+1); int old = ((int*) m_offsets.get())[idx]; // Need to store the TCHAR index so we divide the return value of add by sizeof(TCHAR). ((int*)m_offsets.get())[idx] = m_strings.add(str, (DWORD)(_tcslen(str)+1)*sizeof(TCHAR))/sizeof(TCHAR); return old; } const TCHAR* StringsArray::get(int idx) { if (idx < 0 || (unsigned int)idx >= (m_offsets.getlen() / sizeof(int))) return 0; return (const TCHAR *) m_strings.get() + ((int*) m_offsets.get())[idx]; } // ========= // CEXEBuild // ========= void CEXEBuild::InitLangTables() { keep_ref = false; for (int i = 0; i < NLF_STRINGS; i++) { NLFRefs[i].iRef = 0; NLFRefs[i].iUnRef = 0; #ifdef NSIS_CONFIG_LOG if (i == NLF_NAME) { NLFRefs[i].iRef++; NLFRefs[i].iUnRef++; } #endif if (NLFStrings[i].eStaticID & INSTALL_STATIC) { set_uninstall_mode(0); DefineLangString(NLFStrings[i].szLangStringName); } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (NLFStrings[i].eStaticID & UNINSTALL_STATIC) { set_uninstall_mode(1); DefineLangString(NLFStrings[i].szLangStringName); } #endif } set_uninstall_mode(0); keep_ref = true; } ////////////////////////////////////////////////////////////////////////////// // class CEXEBuild // // Note: The functions below refer to the methods related to Languages. ////////////////////////////////////////////////////////////////////////////// LanguageTable* CEXEBuild::GetLangTable(LANGID &lang, bool create/*=true*/) { int nlt = lang_tables.getlen() / sizeof(LanguageTable); LanguageTable *nla = (LanguageTable*)lang_tables.get(); lang = lang ? lang : last_used_lang; LanguageTable *table = NULL; for (int i = 0; i < nlt; i++) { if (lang == nla[i].lang_id) { table = &nla[i]; break; } } if (!table && create) { LanguageTable newtable; newtable.lang_id = lang; newtable.dlg_offset = 0; memset(&newtable.nlf, 0, sizeof(NLF)); newtable.lang_strings = new StringsArray; lang_tables.add(&newtable, sizeof(LanguageTable)); table = (LanguageTable*)lang_tables.get() + nlt; } if (table) // update last used language if a table was loaded last_used_lang = lang; return table; } const TCHAR *CEXEBuild::GetLangNameAndCP(LANGID lang, unsigned int *codepage/*=NULL*/) { LanguageTable *table = GetLangTable(lang, false); if (table && table->nlf.m_bLoaded) { if (codepage) *codepage = table->nlf.m_uCodePage; return table->nlf.m_szName; } else { // If the language table does not exist, then we default to Unicode or ANSI // depending on the target installer type if (codepage) *codepage = build_unicode ? 1200 : 1252; // Unicode or CP1252 if (lang == 1033) return _T("English"); else return _T("???"); } } const TCHAR *CEXEBuild::GetLangNameAndCPForVersionResource(LANGID &lang, unsigned int *codepage/*=NULL*/, bool deflangfallback/*=true*/) { const TCHAR *langname = GetLangNameAndCP(lang, codepage); if (0 == lang) { if (deflangfallback) lang = last_used_lang; else langname = _T("Neutral"); } return langname; } int CEXEBuild::DefineLangString(const TCHAR *name, int process/*=-1*/) { int index, uindex, pos, ret, sn; /* If not exist, index and uindex will get -1. */ pos = build_langstrings.get(name, &sn, &index, &uindex); if (pos < 0) { pos = build_langstrings.add(name); } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (!this->uninstall_mode) { #endif if (index < 0) { // Did not exist. Increment. index = this->build_langstring_num++; } ret = -index - 1; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT } else { if (uindex < 0) { // Did not exist. Increment. uindex = this->ubuild_langstring_num++; } ret = -uindex - 1; } #endif // Now set the new index and uindex values with the // passed in process value. build_langstrings.set(pos, index, uindex, process); // set reference count for NLF strings if (this->keep_ref && name[0] == _T('^')) { for (int i = 0; i < NLF_STRINGS; i++) { if (!_tcscmp(name, NLFStrings[i].szLangStringName)) { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (this->uninstall_mode) this->NLFRefs[i].iUnRef++; else #endif this->NLFRefs[i].iRef++; break; } } } return ret; } int CEXEBuild::DefineInnerLangString(int id, int process/*=-1*/) { bool old_keep_ref = keep_ref; // set reference count for NLF strings if (keep_ref) { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (uninstall_mode) NLFRefs[id].iUnRef++; else #endif NLFRefs[id].iRef++; keep_ref = false; } int ret = DefineLangString(NLFStrings[id].szLangStringName, process); keep_ref = old_keep_ref; return ret; } // A LangString is a string variable that varies in value depending on what // language is being used. This function sets the string value for the // variable 'name' for a given language ID. // // @return If the language id, the variable name or string is invalid, it will // return a PS_ERROR. If this function call is overwriting a set user string, // this will return a PS_WARNING. int CEXEBuild::SetLangString(const TCHAR *name, LANGID lang, const TCHAR *str, BOOL LicenseData) { if (!str || !name) return PS_ERROR; LanguageTable *table = GetLangTable(lang); if (!table) return PS_ERROR; int sn; if (!LicenseData && _tcsclen(str) > NSIS_MAX_STRLEN-1) warning_fl(DW_LANGSTRING_OVERLONGLENGTH, _T("LangString \"%") NPRIs _T("\" longer than NSIS_MAX_STRLEN!"), name); int pos = build_langstrings.get(name, &sn); if (pos < 0) pos = build_langstrings.add(name, &sn); if (table->lang_strings->set(sn, str)) return PS_WARNING; return PS_OK; } int CEXEBuild::SetLangString(const TCHAR *name, LANGID lang, const TCHAR *str) { return SetLangString(name, lang, str, false); } // Sets the user string to the specific NLF_STRINGS id. // // @return If the id is invalid or the string is not valid, it will return a // PS_ERROR. If this function call is overwriting a set user string, this // will return a PS_WARNING. int CEXEBuild::SetInnerString(int id, const TCHAR *str) { if ((unsigned int)id >= NLF_STRINGS || !str) return PS_ERROR; int ret = PS_OK; const TCHAR *ps = UserInnerStrings.get(id); if (ps && *ps) ret = PS_WARNING; UserInnerStrings.set(id, str); return ret; } int CEXEBuild::GenerateLangTable(LanguageTable *lt, int num_lang_tables) { // Add all installer language strings int i, j, l, tabsset; struct langstring* lang_strings = NULL; TinyGrowBuf *string_ptrs = new TinyGrowBuf[num_lang_tables]; tabsset = 1; while (tabsset) { tabsset = 0; for (i = num_lang_tables; i--; ) { // Fill in default values for all used language strings that we can FillLanguageTable(<[i]); // Make sure the string lists are large enough string_ptrs[i].set_zeroing(1); if (!uninstall_mode) string_ptrs[i].resize(build_langstring_num * sizeof(int)); else string_ptrs[i].resize(ubuild_langstring_num * sizeof(int)); } // For all current language strings if (!uninstall_mode) lang_strings = build_langstrings.sort_index(&l); else lang_strings = build_langstrings.sort_uindex(&l); for (j = 0; j < l; j++) { int lang_string_index; if (!uninstall_mode) lang_string_index = lang_strings[j].index; else lang_string_index = lang_strings[j].uindex; // Is this language string used (in the installer)? if (lang_string_index >= 0) { // For each language for (i = num_lang_tables; i--; ) { // Get the current string pointer int *ptr = (int *)string_ptrs[i].get() + lang_string_index; // Not already set? if (!*ptr) { // Get the language string and its name const TCHAR *str = lt[i].lang_strings->get(lang_strings[j].sn); const TCHAR *lsn = build_langstrings.offset2name(lang_strings[j].name); // lsn = variable name, str = value if (!str || !*str) { // No string is defined; give a warning (for user strings only) if (lsn[0] != _T('^')) { if (lt[i].nlf.m_bLoaded) warning(DW_LANGSTRING_NOTSETINLANG, _T("LangString \"%") NPRIs _T("\" is not set in language table of language %") NPRIs, lsn, lt[i].nlf.m_szName); else warning(DW_LANGSTRING_NOTSETINLANG, _T("LangString \"%") NPRIs _T("\" is not set in language table of language %d"), lsn, lt[i].lang_id); } } else { // Add the language string to the string data block TCHAR fn[1024]; _stprintf(fn, _T("LangString %") NPRIs, lsn); curfilename = fn; linecnt = lt[i].lang_id; *ptr = add_string(str, lang_strings[j].process, (WORD) lt[i].nlf.m_uCodePage); curfilename = 0; // Indicate that we should check again for any newly referenced language strings tabsset++; } } } } } } // Optimize langstrings and check for recursion for (i = num_lang_tables; i--; ) { TinyGrowBuf rec; int *lst = (int *)string_ptrs[i].get(); int langstring_num = uninstall_mode ? ubuild_langstring_num : build_langstring_num; for (j = 0; j < langstring_num; j++) { // Does this string reference another language string directly? while (lst[j] < 0) { // Search through list of language string references for (l = 0; (unsigned int)l < rec.getlen() / sizeof(int); l++) { if (((int*)rec.get())[l] == lst[j]) { // We have the index of a recursive language string; now find the name const TCHAR *name = _T("(unnamed)"); for (l = 0; l < langstring_num; l++) { int recidx = uninstall_mode ? lang_strings[l].uindex : lang_strings[l].index; if (recidx == j) { name = build_langstrings.offset2name(lang_strings[l].name); } } ERROR_MSG(_T("Error: LangString %") NPRIs _T(" in language %u is recursive!\n"), name, lt->lang_id); delete [] string_ptrs; return PS_ERROR; } } // Add this reference to the list rec.add(&lst[j], sizeof(int)); // and dereference it lst[j] = lst[-lst[j] - 1]; } rec.resize(0); } } // Add language tables into their datablock for (i = num_lang_tables; i--; ) { cur_langtables->add(<[i].lang_id, sizeof(LANGID)); cur_langtables->add(<[i].dlg_offset, sizeof(int)); int rtl = lt[i].nlf.m_bRTL ? 1 : 0; cur_langtables->add(&rtl, sizeof(int)); cur_langtables->add(string_ptrs[i].get(), string_ptrs[i].getlen()); string_ptrs[i].resize(0); } cur_header->blocks[NB_LANGTABLES].num = num_lang_tables; cur_header->langtable_size = cur_langtables->getlen() / num_lang_tables; delete [] string_ptrs; return PS_OK; } int CEXEBuild::GenerateLangTables() { int i; LanguageTable *lt = (LanguageTable*)lang_tables.get(); SCRIPT_MSG(_T("Generating language tables... ")); if ( #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT ubuild_langstring_num > MAX_CODED || #endif build_langstring_num > MAX_CODED ) { ERROR_MSG(_T("\nError: too many LangStrings. Maximum allowed is %u.\n"), MAX_CODED); return PS_ERROR; } // If we have no tables (user didn't set any string and didn't load any NLF) create the default one if (!lang_tables.getlen()) { LANGID lang = NSIS_DEFAULT_LANG; LanguageTable *table = GetLangTable(lang); if (!table) return PS_ERROR; lt = (LanguageTable*)lang_tables.get(); } // Apply default font if (*build_font) { try { init_res_editor(); #define ADD_FONT(id) { \ BYTE* dlg = res_editor->GetResource(RT_DIALOG, id, NSIS_DEFAULT_LANG); \ if (dlg) { \ CDialogTemplate td(dlg,build_unicode); \ res_editor->FreeResource(dlg); \ td.SetFont(build_font, (WORD) build_font_size); \ DWORD dwSize; \ dlg = td.Save(dwSize); \ res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \ td.FreeSavedTemplate(dlg); \ } \ } #ifdef NSIS_CONFIG_LICENSEPAGE ADD_FONT(IDD_LICENSE); ADD_FONT(IDD_LICENSE_FSRB); ADD_FONT(IDD_LICENSE_FSCB); #endif ADD_FONT(IDD_DIR); #ifdef NSIS_CONFIG_COMPONENTPAGE ADD_FONT(IDD_SELCOM); #endif ADD_FONT(IDD_INST); ADD_FONT(IDD_INSTFILES); #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT ADD_FONT(IDD_UNINST); #endif #ifdef NSIS_CONFIG_CRC_SUPPORT ADD_FONT(IDD_VERIFY); #endif #undef ADD_FONT } catch (exception& err) { ERROR_MSG(_T("\nError while applying font: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } } // Fill tables with defaults (if needed) and with instruction strings // Create language specific resources (currently only dialogs with different fonts) int num_lang_tables = lang_tables.getlen() / sizeof(LanguageTable); // if there is one string table then there is no need for two sets of dialogs int cur_offset = num_lang_tables == 1 ? 0 : 100; for (i = 0; i < num_lang_tables; i++) { // A Unicode-only language is never displayed correctly by ANSI exehead if (!build_unicode && 1200 == lt[i].nlf.m_uCodePage) { ERROR_MSG(_T("\nError: Unicode-only language %") NPRIs _T(" cannot be used in ANSI installer!\n"), lt[i].nlf.m_szName); return PS_ERROR; } if ((lt[i].nlf.m_szFont && !*build_font) || lt[i].nlf.m_bRTL) { lt[i].dlg_offset = cur_offset; TCHAR *font = lt[i].nlf.m_szFont; if (*build_font) font = 0; try { init_res_editor(); #define ADD_FONT(id) { \ BYTE* dlg = res_editor->GetResource(RT_DIALOG, id, NSIS_DEFAULT_LANG); \ if (dlg) { \ CDialogTemplate td(dlg,build_unicode,lt[i].nlf.m_uCodePage); \ res_editor->FreeResource(dlg); \ if (font) td.SetFont(font, (WORD) lt[i].nlf.m_iFontSize); \ if (lt[i].nlf.m_bRTL) { \ td.ConvertToRTL(); \ DialogItemTemplate* dir = td.GetItem(IDC_DIR); \ if (id == IDD_DIR && dir) { \ if ((dir->dwStyle & ES_CENTER) == 0) dir->dwStyle ^= ES_RIGHT; \ dir->dwExtStyle &= ~(WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR); \ } \ } \ DWORD dwSize; \ dlg = td.Save(dwSize); \ res_editor->UpdateResource(RT_DIALOG, id+cur_offset, NSIS_DEFAULT_LANG, dlg, dwSize); \ td.FreeSavedTemplate(dlg); \ } \ } #ifdef NSIS_CONFIG_LICENSEPAGE ADD_FONT(IDD_LICENSE); ADD_FONT(IDD_LICENSE_FSRB); ADD_FONT(IDD_LICENSE_FSCB); #endif ADD_FONT(IDD_DIR); #ifdef NSIS_CONFIG_COMPONENTPAGE ADD_FONT(IDD_SELCOM); #endif ADD_FONT(IDD_INST); ADD_FONT(IDD_INSTFILES); #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT ADD_FONT(IDD_UNINST); #endif #ifdef NSIS_CONFIG_CRC_SUPPORT ADD_FONT(IDD_VERIFY); #endif #undef ADD_FONT } catch (exception& err) { ERROR_MSG(_T("\nError while applying NLF font/RTL: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } cur_offset += 100; } } const int orig_uninstall_mode = uninstall_mode; set_uninstall_mode(0); if (GenerateLangTable(lt, num_lang_tables) != PS_OK) return PS_ERROR; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT set_uninstall_mode(1); if (GenerateLangTable(lt, num_lang_tables) != PS_OK) return PS_ERROR; #endif set_uninstall_mode(orig_uninstall_mode); SCRIPT_MSG(_T("Done!\n")); return PS_OK; } static void CreatePlatformStrfmt(const TCHAR *templ, TCHAR *out) { // NOTE: Only supports plain %s with no options for ( ;; out++ ) { *out = *templ++; if (!*out) break; if (*out == L'%' && *templ == L's') { out++, templ++; size_t cch = my_strncpy(out, NPRIs, -1); out += --cch; // --cch because for loop does out++ } } } void CEXEBuild::FillLanguageTable(LanguageTable *table) { for (int i = 0; i < NLF_STRINGS; i++) { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (!NLFRefs[i].iUnRef && !NLFRefs[i].iRef) continue; #else if (!NLFRefs[i].iRef) continue; #endif else if (i == NLF_SPACE_REQ || i == NLF_SPACE_AVAIL) { if (no_space_texts) { continue; } } int sn, index; int pos = build_langstrings.get(NLFStrings[i].szLangStringName, &sn, &index); if (pos >= 0) { const TCHAR *str = table->lang_strings->get(sn); if (!str || !*str) { const TCHAR *us = UserInnerStrings.get(i); if (i == NLF_NAME_DA && (!us || !*us)) { // if the user didn't set NLF_NAME_DA we set it to $(^Name) table->lang_strings->set(sn, _T("$(^Name)")); } if (us && *us) { table->lang_strings->set(sn, (TCHAR *) us); } else { const TCHAR *dstr = table->nlf.m_szStrings[i] ? table->nlf.m_szStrings[i] : NLFStrings[i].szDefault; if (!dstr) continue; if (i == NLF_BRANDING) { TCHAR temp[NSIS_MAX_STRLEN + sizeof(NSIS_VERSION)], temp2[COUNTOF(temp)]; CreatePlatformStrfmt(dstr, temp2); // Change %s to %ls if required _stprintf(temp, temp2, NSIS_VERSION); table->lang_strings->set(sn, temp); continue; } else if (i == NLF_FONT) { TCHAR *font = *build_font ? build_font : table->nlf.m_szFont; if (font) table->lang_strings->set(sn, font); else table->lang_strings->set(sn, dstr); continue; } else if (i == NLF_FONTSIZE) { WORD font_size = *build_font ? (WORD) build_font_size : (WORD) table->nlf.m_iFontSize; if (font_size) { TCHAR temp[64]; _stprintf(temp, _T("%d"), font_size); table->lang_strings->set(sn, temp); } else table->lang_strings->set(sn, dstr); continue; } table->lang_strings->set(sn, dstr); } } } } } void TrimTrailingNewlines(TCHAR *s) { size_t cch = _tcslen(s); while (s[cch-1] == _T('\n') || s[cch-1] == _T('\r')) s[cch-1] = 0, --cch; } static UINT GetNextNLFLine(NStreamLineReader&lr, TCHAR*Buf, UINT cchBuf) { for (;;) { UINT err = lr.ReadLine(Buf, cchBuf); if (NStream::OK != err) { if (lr.IsEOF()) err = NStream::OK; return err; } if (NStream::IsNewline(*Buf, false)) continue; if (_T('#') != *Buf && _T(';') != *Buf) return err; } } static inline bool GetNextNLFLine(NStreamLineReader&lr, TCHAR*Buf, UINT cchBuf, UINT&errlr) { errlr = GetNextNLFLine(lr, Buf, cchBuf); return NStream::OK == errlr; } // NSIS Language File parser LanguageTable * CEXEBuild::LoadLangFile(TCHAR *filename) { NIStream strm; strm.StreamEncoding().SetCodepage(NStreamEncoding::ACP); if (!strm.OpenFileForReading(filename)) { ERROR_MSG(_T("Error: Can't open language file - \"%") NPRIs _T("\"!\n"),filename); return 0; } NStreamLineReader lr(strm); UINT errlr; // Check header TCHAR buf[NSIS_MAX_STRLEN]; if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) { l_readerr: ERROR_MSG(lr.GetErrorMessage(errlr).c_str()); return 0; } if (_tcsncmp(buf, _T("NLF v"), 5)) { ERROR_MSG(_T("Error: Invalid language file.\n")); return 0; } int nlf_version = _ttoi(buf+5); if (nlf_version != NLF_VERSION) { if (nlf_version != 2 && nlf_version != 3 && nlf_version != 4 && nlf_version != 5) { ERROR_MSG(_T("Error: Language file version doesn't match NSIS version.\n")); return 0; } } // Get language ID if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) goto l_readerr; LANGID lang_id = _ttoi(buf); // Get appropriate table LanguageTable *table = GetLangTable(lang_id); if (!table) return 0; NLF *nlf = &table->nlf; if (nlf->m_bLoaded) { ERROR_MSG(_T("Error: can't load same language file twice.\n")); return 0; } // Generate language name TCHAR *p, *p2, *p3, t = 0; p = _tcsrchr(filename, _T('.')); if (p) { t = *p; *p = 0; } p2 = _tcsrchr(filename, _T('\\')), p3 = _tcsrchr(filename, _T('/')); if (p3 > p2) p2 = p3; if (p2) { p2++; nlf->m_szName = (TCHAR*)malloc((_tcslen(p2)+1)*sizeof(TCHAR)); _tcscpy(nlf->m_szName, p2); } else { nlf->m_szName = (TCHAR*)malloc((_tcslen(filename)+1)*sizeof(TCHAR)); _tcscpy(nlf->m_szName, filename); } if (p) *p = t; if (nlf_version != NLF_VERSION) { warning_fl(DW_NLF_OLDVERSION, _T("%") NPRIs _T(" language file version doesn't match. Using default English texts for missing strings."), nlf->m_szName); } // set ^Language nlf->m_szStrings[NLF_LANGUAGE] = _tcsdup(nlf->m_szName); size_t temp; // Get font if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) goto l_readerr; if (!nlf->m_szFont) { TrimTrailingNewlines(buf); if (buf[0] != _T('-') || buf[1] != 0) { nlf->m_szFont = (TCHAR*)malloc((_tcslen(buf)+1)*sizeof(TCHAR)); _tcscpy(nlf->m_szFont, buf); } } if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) goto l_readerr; if (!nlf->m_iFontSize) { if (buf[0] != _T('-') || buf[1] != 0) { nlf->m_iFontSize = _ttoi(buf); } } // Get code page bool isnlfdataucp = false; // Unicode-only language? nlf->m_uCodePage = NSISRT_GetASCIICodepage(); if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) goto l_readerr; TrimTrailingNewlines(buf); if (buf[0] != _T('-') || buf[1] != 0) { nlf->m_uCodePage = _ttoi(buf); isnlfdataucp = NStreamEncoding::IsUnicodeCodepage(nlf->m_uCodePage); if (isnlfdataucp && 1200 != nlf->m_uCodePage) { ERROR_MSG(_T("Error: Unicode-only language files must use codepage 1200!\n")); return 0; } if ((unsigned)nlf->m_uCodePage <= 1 && !lr.IsUnicode()) // Warn if someone uses a system specific codepage { warning_fl(DW_NLF_SYSCP, _T("%") NPRIs _T(" language file uses the system default codepage!"), nlf->m_szName); } if (CP_ACP != nlf->m_uCodePage && !isnlfdataucp && !IsValidCodePage(nlf->m_uCodePage)) { warning_fl(DW_NLF_UNSUPPORTED_CP, _T("%") NPRIs _T(" language file uses a codepage (%d) that is not supported on this system, using ACP!"), nlf->m_szName, nlf->m_uCodePage); nlf->m_uCodePage = CP_ACP; } } // SVN is not a big fan of UTF16 so we should always use UTF8SIG if (isnlfdataucp && !lr.StreamEncoding().IsUTF8()) { warning_fl(DW_NLF_NOT_PREFERRED_ENC, _T("%") NPRIs _T(" Unicode language file is not UTF8SIG."), nlf->m_szName); } #ifdef _UNICODE if (!lr.IsUnicode()) { if (nlf->m_szFont) { // Convert font name now that we know the codepage TCHAR* oldfont = nlf->m_szFont; nlf->m_szFont = _tcsdup(CtoTString2(TtoCString(oldfont), nlf->m_uCodePage)); // BUGBUG: Depends on lossless ACP -> TCHAR -> NLF CP -> TCHAR conversion! free(oldfont); } lr.StreamEncoding().SetCodepage(nlf->m_uCodePage); // Read the rest of this NLF file with the correct MBCS > TCHAR conversion } #endif // Get RTL setting if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) goto l_readerr; nlf->m_szStrings[NLF_RTL] = (TCHAR*) malloc(2*sizeof(TCHAR)); nlf->m_bRTL = false; if (buf[0] == _T('R') && buf[1] == _T('T') && buf[2] == _T('L') && (!buf[3] || buf[3] == _T('\r') || buf[3] == _T('\n'))) { nlf->m_bRTL = true; } _tcscpy(nlf->m_szStrings[NLF_RTL], nlf->m_bRTL ? _T("1") : _T("0")); // Read strings for (int i = 0; i < NLF_STRINGS_NO_SPECIAL; i++) { // skip virtual strings if (!NLFStrings[i].szDefault) continue; // Fill in for missing strings // 0 will mean default will be used from NLFStrings switch (i) { case NLF_BTN_LICENSE_AGREE: case NLF_BTN_LICENSE_DISAGREE: if (nlf_version >= 3) break; case NLF_LOG_INSTALL_PROCESS: case NLF_BYTE: case NLF_KILO: case NLF_MEGA: case NLF_GIGA: case NLF_REGISTERING: case NLF_UNREGISTERING: if (nlf_version >= 4) break; case NLF_FILE_ERROR_NOIGNORE: if (nlf_version >= 5) break; case NLF_USUBCAPTION_OPTIONS: case NLF_USUBCAPTION_DIR: case NLF_CLICK_NEXT: case NLF_CLICK_INSTALL: case NLF_CLICK_UNINSTALL: case NLF_LICENSE_TEXT: case NLF_LICENSE_TEXT_FSCB: case NLF_LICENSE_TEXT_FSRB: case NLF_ULICENSE_TEXT: case NLF_ULICENSE_TEXT_FSCB: case NLF_ULICENSE_TEXT_FSRB: case NLF_COMP_TEXT: case NLF_UCOMP_TEXT: case NLF_UCOMP_SUBTEXT1: case NLF_UCOMP_SUBTEXT1_NO_INST_TYPES: case NLF_UCOMP_SUBTEXT2: case NLF_DIR_TEXT: case NLF_DIR_BROWSETEXT: case NLF_UDIR_TEXT: case NLF_UDIR_SUBTEXT: case NLF_UDIR_BROWSETEXT: case NLF_UNINST_TEXT: if (nlf_version >= 6) break; nlf->m_szStrings[i] = 0; continue; // This applies to the for loop and not this switch! } errlr = GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN); if (_tcslen(buf) == NSIS_MAX_STRLEN-1) { ERROR_MSG(_T("Error: String too long (string #%d - \"%") NPRIs _T("\")\n"), i, NLFStrings[i].szLangStringName); return 0; } if (NStream::OK != errlr) goto l_readerr; temp=_tcslen(buf); // Not using TrimTrailingNewlines because we need temp to be correct for the quote trimming while (buf[temp-1] == _T('\n') || buf[temp-1] == _T('\r')) { buf[--temp] = 0; } TCHAR *in = buf; // trim quotes if (buf[0] == _T('"') && buf[temp-1] == _T('"')) { in++; buf[--temp] = 0; } nlf->m_szStrings[i] = (TCHAR*)malloc((temp+1)*sizeof(TCHAR)); TCHAR *out; for (out = nlf->m_szStrings[i]; *in; in++, out++) { if (*in == _T('\\')) { in++; switch (*in) { case _T('n'): *out = _T('\n'); break; case _T('r'): *out = _T('\r'); break; case _T('t'): *out = _T('\t'); break; default: *out++ = _T('\\'); *out = *in; } } else *out = *in; } *out = 0; } nlf->m_bLoaded = true; return table; } void CEXEBuild::DeleteLangTable(LanguageTable *table) { if (table->nlf.m_szName) free(table->nlf.m_szName); if (table->nlf.m_szFont) free(table->nlf.m_szFont); delete table->lang_strings; for (int i = 0; i < NLF_STRINGS; i++) { if (table->nlf.m_szStrings[i]) free(table->nlf.m_szStrings[i]); } } nsis-3.11/Source/lang.h000077500000000000000000000217201477201124000147470ustar00rootroot00000000000000/* * lang.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support and Doxygen comments by Jim Park -- 07/30/2007 */ #ifndef ___NLF___H_____ #define ___NLF___H_____ #include "strlist.h" #include "growbuf.h" #include "exehead/fileform.h" struct NLFRef { int iRef; int iUnRef; }; struct langstring { int name; int sn; int index; int uindex; int process; }; class LangStringList : public SortedStringListND { public: /* Default constructor */ LangStringList() : m_count(0) {} /** * Adds a langstring struct with the string name of 'name' into this * structure. * * @param name The string to use as key. * @param sn [out] The string number. * @return Returns the position where T was stored. */ int add(const TCHAR *name, int *sn=0); /** * Gets the values in the langstring struct that is mapped to the string * 'name'. Sets sn, index, and uindex to -1 before looking for the * 'name'. If not found, -1 is returned. If found, then the values * associated with 'name' are set to the sn, index, uindex, process * variables. * * TODO: Need better documentation here. * @param sn [out] Set to string ID number. * @param index [out] Set to index value in langstring. * @param uindex [out] Set to uindex value in langstring. * @param process [out] Set to process value in langstring. * @return The index into langstring array. -1 if not found. */ int get(const TCHAR *name, int *sn=0, int *index=0, int *uindex=0, int *process=0); /** * Sets the values in the langstring struct that is in the position 'pos'. * * @param pos The langstring index into m_gr. * @param index Value to set langstring[pos].index. * @param uindex Value to set langstring[pos].uindex. * @param process Value to set langstring[pos].process. */ void set(int pos, int index=-1, int uindex=-1, int process=-1); /** * Sets the values in the langstring struct that is mapped to the string * 'name'. * * @param name The string key to lookup langstring. * @param index Value to set langstring[pos].index. * @param uindex Value to set langstring[pos].uindex. * @param process Value to set langstring[pos].process. */ void set(const TCHAR *name, int index, int uindex=-1, int process=-1); /** * From the position index, get the pointer to the key string. * Basically, get the string referenced by langstring[pos].name. * * @param pos The position index. * @return The TCHAR* to the string referenced by pos. */ const TCHAR *pos2name(int pos); /** * From the index into the strings, get the pointer to the * key string. Note: the positional index into the storage of * key strings probably should not be exposed to the outside. * * @param name Index into the m_strings array. * @return The TCHAR* to the string referenced by name. */ const TCHAR *offset2name(int name); /** * Get the number of entries. * * @return The number of langstring entries. */ int getnum(); /** * Compare two langstring structs pointed by item1 and item2 by looking at * their .index values via their difference (item1->index - item2->index). * * @return 0 if equal, negative value if item1 is smaller, positive value * if item1 is bigger. */ static int compare_index(const void *item1, const void *item2); /** * Sorts the langstrings by their index. Then return the sorted array * via m_sortbuf. Warning: This function is not thread-safe! * * @param num [out] Set to the size of langstring items in the array. * @return The sorted langstring array via m_sortbuf. */ langstring *sort_index(int *num); /** * Compare two langstring structs pointed by item1 and item2 by looking at * their .uindex values via their difference (item1->uindex - item2->uindex). * * @return 0 if equal, negative value if item1 is smaller, positive value * if item1 is bigger. */ static int compare_uindex(const void *item1, const void *item2); /** * Sorts the langstrings by their index. Then return the sorted array * via m_sortbuf. Warning: This function is not thread-safe! * * @param num [out] Set to the size of langstring items in the array. * @return The sorted langstring array via m_sortbuf. */ langstring *sort_uindex(int *num); private: int m_count; // Used to set string number (sn) TinyGrowBuf m_sortbuf; // Used only to sort. }; /** * This class implements an array of C-style strings in a flat buffer. * * Implementation: Resetting the string at a particular index does not delete * the old string. Instead a new string is added to the end of m_strings and * the old string can no longer be looked up. */ class StringsArray { public: StringsArray(); /** * Resizes the m_offsets so that the index num is valid. * * @param num New size. */ void resize(int num); /** * Set the string 'str' at index idx. This class cannot really delete * strings. It can "overwrite" them in the sense that the string is no * longer referenceable via the index but they are never gone. * * @param idx The index position to set the string to. * @param str The string value to set. * @return If overwriting, the position in m_strings of the old string. */ int set(int idx, const TCHAR *str); /** * Get the string at index 'idx'. * * @param idx The logical index to the string. * @return Returns the TCHAR* to the string. */ const TCHAR *get(int idx); private: TinyGrowBuf m_offsets; /* Positional offsets of the stored string. */ GrowBuf m_strings; /* Storage of the actual strings. */ }; #define NLF_VERSION 6 enum { NLF_BRANDING, NLF_CAPTION, NLF_UCAPTION, NLF_SUBCAPTION_LICENSE, NLF_SUBCAPTION_OPTIONS, NLF_SUBCAPTION_DIR, NLF_SUBCAPTION_INSTFILES, NLF_SUBCAPTION_COMPLETED, NLF_USUBCAPTION_OPTIONS, NLF_USUBCAPTION_DIR, NLF_USUBCAPTION_CONFIRM, NLF_USUBCAPTION_INSTFILES, NLF_USUBCAPTION_COMPLETED, NLF_BTN_BACK, NLF_BTN_NEXT, NLF_BTN_LICENSE, NLF_BTN_LICENSE_AGREE, NLF_BTN_LICENSE_DISAGREE, NLF_BTN_INSTALL, NLF_BTN_UNINSTALL, NLF_BTN_CANCEL, NLF_BTN_CLOSE, NLF_BTN_BROWSE, NLF_BTN_DETAILS, NLF_CLICK_NEXT, NLF_CLICK_INSTALL, NLF_CLICK_UNINSTALL, NLF_NAME, NLF_NAME_DA, // name with doubled ampersands - virtual NLF_COMPLETED, NLF_LICENSE_TEXT, NLF_LICENSE_TEXT_FSCB, NLF_LICENSE_TEXT_FSRB, NLF_ULICENSE_TEXT, NLF_ULICENSE_TEXT_FSCB, NLF_ULICENSE_TEXT_FSRB, NLF_LICENSE_DATA, // virtual NLF_COMP_CUSTOM, NLF_COMP_TEXT, NLF_COMP_SUBTEXT1, NLF_COMP_SUBTEXT1_NO_INST_TYPES, NLF_COMP_SUBTEXT2, NLF_UCOMP_TEXT, NLF_UCOMP_SUBTEXT1, NLF_UCOMP_SUBTEXT1_NO_INST_TYPES, NLF_UCOMP_SUBTEXT2, NLF_DIR_TEXT, NLF_DIR_SUBTEXT, NLF_DIR_BROWSETEXT, NLF_UDIR_TEXT, NLF_UDIR_SUBTEXT, NLF_UDIR_BROWSETEXT, NLF_SPACE_AVAIL, NLF_SPACE_REQ, NLF_UNINST_TEXT, NLF_UNINST_SUBTEXT, NLF_FILE_ERROR, NLF_FILE_ERROR_NOIGNORE, NLF_CANT_WRITE, NLF_COPY_FAILED, NLF_COPY_TO, NLF_REGISTERING, NLF_UNREGISTERING, NLF_SYMBOL_NOT_FOUND, NLF_COULD_NOT_LOAD, NLF_CREATE_DIR, NLF_CREATE_SHORTCUT, NLF_CREATED_UNINST, NLF_DEL_FILE, NLF_DEL_ON_REBOOT, NLF_ERR_CREATING_SHORTCUT, NLF_ERR_CREATING, NLF_ERR_DECOMPRESSING, NLF_ERR_REG_DLL, NLF_EXEC_SHELL, NLF_EXEC, NLF_EXTRACT, NLF_ERR_WRITING, NLF_INST_CORRUPTED, NLF_NO_OLE, NLF_OUTPUT_DIR, NLF_REMOVE_DIR, NLF_RENAME_ON_REBOOT, NLF_RENAME, NLF_SKIPPED, NLF_COPY_DETAILS, NLF_LOG_INSTALL_PROCESS, NLF_BYTE, NLF_KILO, NLF_MEGA, NLF_GIGA, NLF_STRINGS_NO_SPECIAL, NLF_FONT = NLF_STRINGS_NO_SPECIAL, NLF_FONTSIZE, NLF_RTL, NLF_LANGUAGE, NLF_STRINGS }; struct NLF { bool m_bLoaded; /* Is the table loaded? */ TCHAR *m_szName; /* The language name */ TCHAR *m_szFont; int m_iFontSize; unsigned int m_uCodePage; /* Code page associated with language. When * using Unicode, this value will be 1200. */ bool m_bRTL; /* Is this a right-to-left language like Hebrew? */ TCHAR *m_szStrings[NLF_STRINGS]; }; /** * LanguageTable stores within the lang_strings, all the user strings and * variables for that specific language. */ struct LanguageTable { LANGID lang_id; /* Windows Language ID identifier */ int dlg_offset; StringsArray *lang_strings; NLF nlf; }; #endif nsis-3.11/Source/lineparse.cpp000077500000000000000000000252471477201124000163530ustar00rootroot00000000000000/* * lineparse.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "lineparse.h" #include "Platform.h" #include "tchar.h" #include #include #include "tstring.h" #include "util.h" #ifndef _istspace #define _istspace my_istspace template static int my_istspace(T c) { return c == 0x20 || (c >= 0x09 && c <= 0x0D); } #endif template static T skipspace(T s) { while(*s && _istspace(*s)) ++s; return s; } LineParser::LineParser(bool bCommentBlock) { m_incommentblock=bCommentBlock; m_incomment=false; m_nt=m_eat=0; m_tokens=0; } LineParser::~LineParser() { freetokens(); } bool LineParser::inComment() { return m_incomment; } bool LineParser::inCommentBlock() { return m_incommentblock; } int LineParser::parse(const TCHAR *line, int ignore_escaping/*=0*/, NStreamEncoding*pEncChange) // returns -1 on error { freetokens(); bool bPrevCB=m_incommentblock; int n=doline(line, ignore_escaping, pEncChange); if (n) return n; if (m_nt) { m_incommentblock=bPrevCB; m_tokens=(TCHAR**)malloc(sizeof(TCHAR*)*m_nt); n=doline(line, ignore_escaping); if (n) { freetokens(); return -1; } } return 0; } int LineParser::getnumtokens() { return m_nt-m_eat; } void LineParser::eattoken() { m_eat++; } inline int LineParser::validate_token_index(int token, int *success/*=0*/) const { token += m_eat; if (token < 0 || token >= m_nt || !m_tokens[token][0]) { if (success) *success = 0; return -1; } return token; } static unsigned int get_base_from_prefix(const TCHAR *str) { unsigned int hasbase = 0; if (_T('-') == *str || _T('+') == *str) ++str; if (_T('0') == str[0]) { if (_T('x') == (str[1]|32)) hasbase = 16; // Special support for 0n, 0y and 0t MASM style and 0b and 0o Python style radix prefix: if (_T('n') == (str[1]|32)) hasbase = 10; if (_T('b') == (str[1]|32) || _T('y') == (str[1]|32)) hasbase = 2; if (_T('o') == (str[1]|32) || _T('t') == (str[1]|32)) hasbase = 8; } return hasbase; } static unsigned int number_has_base_prefix(const TCHAR *str) { return get_base_from_prefix(str); } static int parse_int_expression(const TCHAR *str, bool expressions, int *success=0) { enum { XOP_NONE = 0, XOP_BITAND, XOP_BITXOR, XOP_BITOR, XOP_LOGAND, XOP_LOGOR }; int tot=0, xop=XOP_NONE, hasfailed=0; nextnum: const TCHAR *p=str, *parse=p, *xoperandpfixstart, *xoperandpfixend; TCHAR *end; int neg=0, base=0, num; #ifndef _MSC_VER xoperandpfixstart=xoperandpfixend=0; // Avoid GCC maybe-uninitialized warning #endif if (expressions) { xoperandpfixstart=p=skipspace(p); while (*p == '~' || *p == '!') p=skipspace(++p); xoperandpfixend=parse=p; } if (_T('+') == *p) ++p; else if (_T('-') == *p) ++p, ++neg; if (_T('0') == p[0]) { if ((base=get_base_from_prefix(p))) parse=&p[2]; } if (neg) { num=(int)(long)_tcstol(parse,&end,base); if (base) num*=-1; // Input was "-0n012" but we have only parsed "012" and need to fix the sign } else { num=(int)(long)_tcstoul(parse,&end,base); } const bool parseddigits=end > parse; if (!parseddigits) ++hasfailed; // "0x", "1 | ~" etc. if (expressions) { for (p=xoperandpfixstart; p < xoperandpfixend; p=skipspace(++p)) switch(*p) { case '~': num=~num; break; case '!': num=!num; break; default: assert(!"op"); } // Simple left-to-right parsing, no operator precedence switch(xop) { case XOP_NONE: tot=num; break; case XOP_BITAND: tot&=num; break; case XOP_BITXOR: tot^=num; break; case XOP_BITOR: tot|=num; break; case XOP_LOGAND: tot=tot && num; break; case XOP_LOGOR: tot=tot || num; break; default: assert(!"op"); } str=end=skipspace(end); switch(*str) { case '&': xop=XOP_BITAND; if (*++str == '&') xop=XOP_LOGAND, ++str; goto nextnum; case '^': xop=XOP_BITXOR, ++str; goto nextnum; case '|': xop=XOP_BITOR; if (*++str == '|') xop=XOP_LOGOR, ++str; goto nextnum; default: xop=XOP_NONE; // Done } } else { tot=num; } if (success) *success=!(int)(*end) && !hasfailed; return tot; } int LineParser::parse_int(const TCHAR *str, int *success/*=0*/) { return parse_int_expression(str, false, success); } int LineParser::parse_intx(const TCHAR *str, int *success/*=0*/) { return parse_int_expression(str, true, success); } int LineParser::gettoken_int(int token, int *success/*=0*/) const { if ((token = validate_token_index(token,success)) < 0) return 0; return parse_int(m_tokens[token],success); } int LineParser::gettoken_intx(int token, int *success/*=0*/) const { if ((token = validate_token_index(token,success)) < 0) return 0; return parse_intx(m_tokens[token],success); } double LineParser::parse_float(const TCHAR *str, int *success/*=0*/) { if (success) { const TCHAR *t=str; if (_T('-') == *t || _T('+') == *t) ++t; *success=*t ? 1 : 0; unsigned int dotcount = 0; while (*t) { if (_T('.') == *t && ++dotcount > 1) *success=0; if ((*t < _T('0') || *t > _T('9')) && *t != _T('.')) *success=0; t++; } } return _tstof(str); } double LineParser::gettoken_float(int token, int *success/*=0*/) const { if ((token = validate_token_index(token,success)) < 0) return 0.0; return parse_float(m_tokens[token],success); } double LineParser::parse_number(const TCHAR *str, int *success/*=0*/) { const unsigned int forceint=number_has_base_prefix(str); return forceint ? parse_int(str,success) : parse_float(str,success); } double LineParser::gettoken_number(int token, int *success/*=0*/) const { if ((token = validate_token_index(token,success)) < 0) return 0.0; return parse_number(m_tokens[token],success); } int LineParser::gettoken_binstrdata(int token, char*buffer, int bufcap) const { const TCHAR*p=gettoken_str(token); int a,b,c,d=0; while (*p) { a=*p; if (a >= _T('0') && a <= _T('9')) a-=_T('0'); else if (a >= _T('a') && a <= _T('f')) a-=_T('a')-10; else if (a >= _T('A') && a <= _T('F')) a-=_T('A')-10; else if (a == _T(',')) { ++p; continue; } // Allow comma separator (for Regedit5 .reg format) else break; b=*++p; if (b >= _T('0') && b <= _T('9')) b-=_T('0'); else if (b >= _T('a') && b <= _T('f')) b-=_T('a')-10; else if (b >= _T('A') && b <= _T('F')) b-=_T('A')-10; else break; c=(a<<4)|b, p++; if (d >= bufcap) return -1; // Buffer too small buffer[d++]=c; } if (*p) return -2; // Did not parse the entire buffer return d; } TCHAR* LineParser::gettoken_str(int token) const { token+=m_eat; if (token < 0 || token >= m_nt) return const_cast(_T("")); return m_tokens[token]; } int LineParser::gettoken_enum(int token, const TCHAR *strlist) // null separated list { int x=0; TCHAR *tt=gettoken_str(token); if (tt && *tt) while (*strlist) { if (!_tcsicmp(tt,strlist)) return x; strlist+=_tcslen(strlist)+1; x++; } return -1; } void LineParser::freetokens() { if (m_tokens) { int x; for (x = 0; x < m_nt; x ++) free(m_tokens[x]); free(m_tokens); } m_tokens=0; m_nt=0; } static bool IsPEP263EncodingCharacter(TCHAR c) { TCHAR low = S7ChLwr(c); return ('a' <= low && low <= 'z') || ('0' <= c && c <= '9') || c == '.' || c == '-' || c == '_'; } int LineParser::doline(const TCHAR *line, int ignore_escaping/*=0*/, NStreamEncoding*pEncChange) { m_nt=0; m_incomment = false; while (*line == _T(' ') || *line == _T('\t')) line++; while (*line) { if ( m_incommentblock ) { while ( *line ) { if ( *line == _T('*') && *(line+1) == _T('/') ) { m_incommentblock=false; // Found end of comment block line+=2; while (*line == _T(' ') || *line == _T('\t')) line++; break; } else line++; } } else { int lstate=0; // 1=", 2=`, 4=' if (*line == _T(';') || *line == _T('#')) { m_incomment = true; TCHAR *p = const_cast(line); if (pEncChange && *++p) // Check for Python PEP 263 magic encoding comment { p = _tcsstr(p, L"coding"); if (p) p += sizeof("coding") - 1; else break; if (*p == ':' || *p == '=') ++p; else break; while (*p == _T(' ') || *p == _T('\t')) ++p; TCHAR buf[200]; if (strtrycpy(buf, p, COUNTOF(buf))) { for (p = buf; IsPEP263EncodingCharacter(*p);) ++p; *p = '\0'; pEncChange->SetCodepage(GetEncodingFromString(buf)); } } break; } if (*line == _T('/') && *(line+1) == _T('*')) { m_incommentblock = true; line+=2; } else { if (*line == _T('\"')) lstate=1; else if (*line == _T('\'')) lstate=2; else if (*line == _T('`')) lstate=4; if (lstate) line++; int nc=0; const TCHAR *p = line; while (*line) { if (line[0] == _T('$') && line[1] == _T('\\')) { switch (line[2]) { case _T('"'): case _T('\''): case _T('`'): nc += ignore_escaping ? 3 : 1; line += 3; continue; } } if (lstate==1 && *line ==_T('\"')) break; if (lstate==2 && *line ==_T('\'')) break; if (lstate==4 && *line ==_T('`')) break; if (!lstate && (*line == _T(' ') || *line == _T('\t'))) break; #ifdef NSIS_FIX_COMMENT_HANDLING if (!lstate && (*line == _T(';') || *line == _T('#') || (*line == _T('/') && *(line+1) == _T('*')))) break; #endif line++; nc++; } if (m_tokens) { int i; m_tokens[m_nt]=(TCHAR*)malloc((nc+1)*sizeof(TCHAR)); for (i = 0; p < line; i++, p++) { if (!ignore_escaping && p[0] == _T('$') && p[1] == _T('\\')) { switch (p[2]) { case _T('"'): case _T('\''): case _T('`'): p += 2; } } m_tokens[m_nt][i] = *p; } m_tokens[m_nt][nc]=0; } m_nt++; if (lstate) { if (*line) line++; else return -2; } while (*line == _T(' ') || *line == _T('\t')) line++; } } } return 0; } nsis-3.11/Source/lineparse.h000077500000000000000000000035021477201124000160060ustar00rootroot00000000000000/* * lineparse.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/09/2007 */ #ifndef _LINEPARSE_H_ #define _LINEPARSE_H_ #include "tchar.h" #include "utf.h" class LineParser { public: LineParser(bool bCommentBlock); virtual ~LineParser(); bool inComment(); bool inCommentBlock(); int parse(const TCHAR *line, int ignore_escaping=0, NStreamEncoding*pEncChange=NULL); // returns -1 on error int getnumtokens(); void eattoken(); int gettoken_int(int token, int *success=0) const; int gettoken_intx(int token, int *success=0) const; // basic operator expressions parser double gettoken_float(int token, int *success=0) const; double gettoken_number(int token, int *success=0) const; int gettoken_binstrdata(int token, char*buffer, int bufcap) const; TCHAR *gettoken_str(int token) const; int gettoken_enum(int token, const TCHAR *strlist); // null separated list static int parse_int(const TCHAR *str, int *success=0); static int parse_intx(const TCHAR *str, int *success=0); static double parse_float(const TCHAR *str, int *success=0); static double parse_number(const TCHAR *str, int *success=0); private: void freetokens(); int doline(const TCHAR *line, int ignore_escaping=0, NStreamEncoding*pEncChange=NULL); inline int validate_token_index(int token, int *success=0) const; int m_eat; int m_nt; bool m_incommentblock; bool m_incomment; TCHAR **m_tokens; }; #endif//_LINEPARSE_H_ nsis-3.11/Source/makenssi.cpp000077500000000000000000000602171477201124000161770ustar00rootroot00000000000000/* * makenssi.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/09/2007 */ #include "Platform.h" #include #include #ifdef _WIN32 # include #else # include #endif #include "tstring.h" #include "build.h" #include "util.h" #include "utf.h" #include "winchar.h" // assert(sizeof(WINWCHAR)...) #include #define NSIS_COPYYEARS _T("1999-2025") using namespace std; NSISRT_DEFINEGLOBALS(); bool g_dopause=false; NStreamEncoding g_outputenc; #ifdef _WIN32 UINT g_wincon_orgoutcp; #ifdef _UNICODE WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr; #endif #endif const TCHAR *g_argv0=0; static void dopause(void) { if (!g_dopause) return; if (g_display_errors) _ftprintf(g_output,_T("MakeNSIS done - hit enter to close...")); fflush(stdout); int a; while ((a=_gettchar()) != _T('\r') && a != _T('\n') && a != 27/*esc*/); } void quit() { if (g_display_errors) { PrintColorFmtMsg_WARN(_T("\nNote: you may have one or two (large) stale temporary file(s) ") _T("left in your temporary directory (Generally this only happens on Windows 9x).\n")); } exit(1); } static void myatexit() { dopause(); ResetPrintColor(); bool oneoutputstream = g_output == g_errout; if (g_output != stdout && g_output ) fclose(g_output); if (g_errout != stderr && g_errout && !oneoutputstream) fclose(g_errout); g_output = g_errout = 0; #ifdef _WIN32 SetConsoleOutputCP(g_wincon_orgoutcp); #endif } static void sigint(int sig) { if (g_display_errors) { PrintColorFmtMsg_WARN(_T("\n\nAborting on Ctrl+C...\n")); } quit(); } #ifdef _WIN32 static DWORD WINAPI sigint_event_msg_handler(LPVOID ThreadParam) { using namespace MakensisAPI; HANDLE hEvent = 0; if (ThreadParam) { TCHAR eventnamebuf[100]; wsprintf(eventnamebuf, SigintEventNameFmt, (HWND)ThreadParam); hEvent = OpenEvent(SYNCHRONIZE, FALSE, eventnamebuf); } if (!hEvent) hEvent = OpenEvent(SYNCHRONIZE, FALSE, SigintEventNameLegacy); if (hEvent) { if (WaitForSingleObject(hEvent, INFINITE) == WAIT_OBJECT_0) raise(SIGINT); CloseHandle(hEvent); } return 0; } static UINT_PTR QueryHost(HWND hHost, UINT_PTR wp, UINT_PTR lp=0, UINT_PTR def=0) { return hHost ? SendMessage(hHost, MakensisAPI::QUERYHOST, wp, lp) : def; } #else //! _WIN32 static inline UINT_PTR QueryHost(HWND hHost, UINT_PTR wp, UINT_PTR lp=0, UINT_PTR def=0) { return def; } #endif //~ _WIN32 static void init_signals(HWND notify_hwnd) { atexit(myatexit); signal(SIGINT,sigint); #ifdef _WIN32 DWORD id; HANDLE hThread = CreateThread(NULL, 0, sigint_event_msg_handler, (LPVOID)notify_hwnd, 0, &id); if (hThread) { SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); CloseHandle(hThread); } #endif } static void print_logo() { _ftprintf(g_output,_T("MakeNSIS %") NPRIs _T(" - Copyright ") NSIS_COPYYEARS _T(" Contributors\n") _T("See the file COPYING for license details.\n") _T("Credits can be found in the Users Manual.\n\n"), NSIS_VERSION); fflush(g_output); } static void print_license() { _ftprintf(g_output,_T("Copyright (C) ") NSIS_COPYYEARS _T(" Nullsoft and Contributors\n\n") _T("This license applies to everything in the NSIS package, except where otherwise\n") _T("noted.\n\n") _T("This software is provided 'as-is', without any express or implied warranty.\n") _T("In no event will the authors be held liable for any damages arising from the\n") _T("use of this software.\n\n") _T("Permission is granted to anyone to use this software for any purpose, including\n") _T("commercial applications, and to alter it and redistribute it freely, subject to\n") _T("the following restrictions:\n") _T(" 1. The origin of this software must not be misrepresented; you must not claim\n") _T(" that you wrote the original software. If you use this software in a\n") _T(" product, an acknowledgment in the product documentation would be\n") _T(" appreciated but is not required.\n") _T(" 2. Altered source versions must be plainly marked as such, and must not be\n") _T(" misrepresented as being the original software.\n") _T(" 3. This notice may not be removed or altered from any source distribution.\n\n") _T("In addition to this license, different licenses apply to the included\n") _T("compression modules. See the file COPYING for details.\n")); fflush(g_output); } static void print_usage() { _ftprintf(g_output,_T("Usage:\n") _T(" ") _T("makensis [ option | script.nsi | - ] [...]\n") _T("\n") _T("Options:\n") _T(" ") OPT_STR _T("CMDHELP [item] prints out help for 'item', or lists all commands\n") _T(" ") OPT_STR _T("HDRINFO prints information about what options makensis was compiled with\n") _T(" ") OPT_STR _T("LICENSE prints the makensis software license\n") _T(" ") OPT_STR _T("VERSION prints the makensis version and exits\n") //_T(" ") OPT_STR _T("HELP this usage info\n") #ifdef _WIN32 _T(" ") OPT_STR _T("Px sets the compiler process priority, where x is 5=realtime,4=high,\n") _T(" ") _T(" 3=above normal,2=normal,1=below normal,0=idle\n") #endif _T(" ") OPT_STR _T("Vx verbosity where x is 4=all,3=no script,2=no info,1=no warnings,0=none\n") _T(" ") OPT_STR _T("WX treat warnings as errors\n") _T(" ") OPT_STR _T("Ofile specifies a text file to log compiler output (default is stdout)\n") _T(" ") OPT_STR _T("LAUNCH executes the generated installer\n") _T(" ") OPT_STR _T("PAUSE pauses after execution\n") _T(" ") OPT_STR _T("NOCONFIG disables inclusion of ") PLATFORM_PATH_SEPARATOR_STR _T("nsisconf.nsh\n") _T(" ") OPT_STR _T("NOCD disables the current directory change to that of the .nsi file\n") _T(" ") OPT_STR _T("INPUTCHARSET <") TSTR_INPUTCHARSET _T(">\n") #ifdef _WIN32 _T(" ") OPT_STR _T("OUTPUTCHARSET <") TSTR_OUTPUTCHARSET _T(">\n") #endif _T(" ") OPT_STR _T("[SAFE]PPO preprocess to stdout/file\n") _T(" ") OPT_STR _T("Ddefine[=value] defines the symbol \"define\" for the script [to value]\n") _T(" ") OPT_STR _T("Xscriptcmd executes scriptcmd in script (i.e. \"") OPT_STR _T("XOutFile inst.exe\")\n") _T(" ") _T(" parameters are processed by order (") OPT_STR _T("Ddef ins.nsi != ins.nsi ") OPT_STR _T("Ddef)\n") _T("\n") _T("For script file name, you can use - to read from the standard input\n") #ifdef _WIN32 _T("You can also use - as an option character: -PAUSE as well as /PAUSE\n") #endif _T("You can use a double-dash to end options processing: makensis -- -ins.nsi\n")); fflush(g_output); } static void print_stub_info(CEXEBuild& build) { if (build.display_info) { _ftprintf(g_output,_T("Size of first header is %lu bytes.\n"),(unsigned long)sizeof(firstheader)); _ftprintf(g_output,_T("Size of main header is %lu bytes.\n"),(unsigned long)build.get_header_size()); _ftprintf(g_output,_T("Size of each section is %lu bytes.\n"),(unsigned long)sizeof(section)); _ftprintf(g_output,_T("Size of each page is %lu bytes.\n"),(unsigned long)sizeof(page)); _ftprintf(g_output,_T("Size of each instruction is %lu bytes.\n"),(unsigned long)sizeof(entry)); int x=build.definedlist.getnum(); _ftprintf(g_output,_T("\nDefined symbols: ")); for (int i=0; i=argc || !*argv[argi]) { if (!silent) PrintColorFmtMsg_ERR(_T("Error: Missing required parameter!\n")); return false; } return true; } #ifdef NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS extern "C" void allow_unaligned_data_access(); #endif static inline int makensismain(int argc, TCHAR **argv) { #ifdef NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS allow_unaligned_data_access(); #endif assert(sizeof(UINT_PTR) == sizeof(void*)); assert('a' + 25 == 'z' && '0' < 'A' && 'A' < 'a'); // ASCII, do you speak it? assert(sizeof(wchar_t) > 1 && sizeof(wchar_t) <= 4); assert(sizeof(WINWCHAR) == 2 && sizeof(WORD) == 2); assert(sizeof(WINWCHAR) == sizeof(WCHAR)); // Not really required but if WCHAR changes we need to know g_argv0=argv[0]; if (!NSISRT_Initialize()) { _ftprintf(stderr,_T("NSISRT_Initialize failed!\n")); return 1; } HWND hostnotifyhandle=0; const TCHAR*stdoutredirname=0; NStreamEncoding inputenc, &outputenc = g_outputenc; int argpos=0; unsigned char do_cd=true, noconfig=false, do_exec=false; bool no_logo=true, warnaserror=false; bool initialparsefail=false, in_files=false; bool oneoutputstream=false; signed char pponly=0; #ifdef _WIN32 signed char outputbom=1; #ifdef DEBUG assert(CP_ACP == outputenc.GetCodepage()); // Required by CEXEBuild::notify() char* legacy handling. #endif #endif //~ _WIN32 // Some parameters have to be parsed early so we can initialize stdout and the "host API". while (++argpos < argc && !initialparsefail) { if (!IS_OPT(argv[argpos])) break; // must be a filename, stop parsing if (!_tcscmp(argv[argpos], _T("--"))) break; // stop parsing if (_T('-') == argv[argpos][0] && !argv[argpos][1]) continue; // stdin const TCHAR *swname = &argv[argpos][1]; if (!_tcsicmp(swname,_T("INPUTCHARSET")) || !_tcsicmp(swname,_T("ICS"))) ++argpos; // Skip else if (!_tcsicmp(swname,_T("VERSION"))) argc=0; else if (!_tcsicmp(swname,_T("NOTIFYHWND"))) { initialparsefail=!HasReqParam(argv,++argpos,argc,true); if (initialparsefail) break; hostnotifyhandle=(HWND)(INT_PTR) _ttol(argv[argpos]); // MSDN says we should sign extend HWNDs: msdn.microsoft.com/en-us/library/aa384203 #ifdef _WIN32 if (!IsWindow(hostnotifyhandle)) hostnotifyhandle=0; #endif } else if (!_tcsicmp(swname,_T("OUTPUTCHARSET")) || !_tcsicmp(swname,_T("OCS"))) { initialparsefail=!HasReqParam(argv,++argpos,argc,true); if (initialparsefail) break; #ifdef _WIN32 bool bom; WORD cp=GetEncodingFromString(argv[argpos],bom); if (NStreamEncoding::UNKNOWN == cp) { ++initialparsefail; } else { outputbom=bom ? 1 : -1; outputenc.SetCodepage(cp); } #else outputenc.SetCodepage(NStreamEncoding::UNKNOWN); #endif } #ifdef _WIN32 else if (!_tcsicmp(swname,_T("RAW"))) { // Emulate the scratchpaper.com fork and its /RAW switch. // NOTE: Unlike the fork, we print \r\n and not just \n. outputbom=0; outputenc.SetCodepage(NStreamEncoding::UTF16LE); } #endif else if (!_tcsicmp(swname,_T("PPO")) || !_tcsicmp(swname,_T("SafePPO"))) { pponly = S7IsChEqualI('s',swname[0]) ? 1 : -1; } else if (S7IsChEqualI('v',swname[0]) && swname[1] && !swname[2]) { no_logo=swname[1] >= _T('0') && swname[1] <= _T('2'); } else if (!_tcsicmp(swname,_T("WX"))) { warnaserror = true; } // This must be parsed last because it will eat other switches else if (S7IsChEqualI('o',swname[0]) && swname[1]) stdoutredirname=swname+1; } #ifdef _WIN32 g_wincon_orgoutcp = GetConsoleOutputCP(); #endif init_signals(hostnotifyhandle); FILE*stdoutredir=stdout; if (stdoutredirname) stdoutredir=my_fopen(stdoutredirname,"w"); g_output=stdoutredir; if (!g_output) g_output=stdout; // We could not open stdoutredirname, fall back to stdout else if (stdoutredirname) oneoutputstream=true; // -O used, put all output in the same file if (oneoutputstream || !(1 & QueryHost(hostnotifyhandle,MakensisAPI::QH_ENABLESTDERR,0,1))) g_errout=g_output; #if defined(_WIN32) && defined(_UNICODE) if (hostnotifyhandle) { // The host can override the output format if they want to LPARAM lp=MAKELONG(outputenc.GetCodepage(),outputbom); LRESULT mr=QueryHost(hostnotifyhandle,MakensisAPI::QH_OUTPUTCHARSET,lp); if (mr) outputenc.SetCodepage((WORD)(--mr)), outputbom = -1; } if (( !WinStdIO_OStreamInit(g_osdata_stdout,g_output,outputenc.GetCodepage(),outputbom)) || (g_errout != g_output && !WinStdIO_OStreamInit(g_osdata_stderr,g_errout,outputenc.GetCodepage(),outputbom))) { assert(!"StdIO init failed"); return 1; } #endif // g_output is now initialized and Print*/_[f]tprintf can be used if (!stdoutredir) PrintColorFmtMsg_WARN(_T("Error opening output log for writing! Using stdout.\n")); unsigned int nousage=0, performed=0; unsigned int files_processed=0; unsigned int cmds_processed=0; CEXEBuild build(pponly, warnaserror); try { build.initialize(argv[0]); } catch (exception& err) { PrintColorFmtMsg_ERR(_T("Error initializing CEXEBuild: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return 1; } #ifdef _WIN32 build.notify_hwnd=hostnotifyhandle; #else const TCHAR*const badnonwinswitchfmt=OPT_STR _T("%") NPRIs _T(" is disabled for non Win32 platforms."); if (hostnotifyhandle) build.warning(DW_CMDLINE_UNSUPP_NIX,badnonwinswitchfmt,_T("NOTIFYHWND")); if (NStreamEncoding::UNKNOWN==outputenc.GetCodepage()) build.warning(DW_CMDLINE_UNSUPP_NIX,badnonwinswitchfmt,_T("OUTPUTCHARSET")); #endif // ~_WIN32 if (!argc) { _ftprintf(g_output,NSIS_VERSION); fflush(g_output); return 0; } if (!no_logo && !pponly) print_logo(); argpos=initialparsefail ? argc : 1; while (argpos < argc) { if (!_tcscmp(argv[argpos], _T("--"))) in_files=1; else if (IS_OPT(argv[argpos]) && _tcscmp(argv[argpos], _T("-")) && !in_files) { const TCHAR* const swname = &argv[argpos][1]; if (!_tcsicmp(swname,_T("PPO")) || !_tcsicmp(swname,_T("SafePPO"))) {} // Already parsed else if (!_tcsicmp(swname,_T("WX"))) {} // Already parsed else if (!_tcsicmp(swname,_T("NOCD"))) do_cd=false; else if (!_tcsicmp(swname,_T("NOCONFIG"))) noconfig++; else if (!_tcsicmp(swname,_T("PAUSE"))) g_dopause=true; else if (!_tcsicmp(swname,_T("LAUNCH"))) do_exec++; else if (!_tcsicmp(swname,_T("HELP"))) { print_usage(); performed |= ++nousage; } else if (!_tcsicmp(swname,_T("LICENSE"))) { if (build.display_info) print_license(); performed |= ++nousage; } else if (!_tcsicmp(swname,_T("CMDHELP"))) { if (build.print_cmdhelp(argpos < argc-1 ? argv[++argpos] : NULL, true)) performed |= ++nousage; } else if (!_tcsicmp(swname,_T("HDRINFO"))) { print_stub_info(build); performed |= ++nousage; } else if (!_tcsicmp(swname,_T("INPUTCHARSET")) || !_tcsicmp(swname,_T("ICS"))) { if (!HasReqParam(argv, ++argpos, argc)) break; WORD cp = GetEncodingFromString(argv[argpos]); if (NStreamEncoding::UNKNOWN == cp) { if (_tcsicmp(argv[argpos], _T("AUTO"))) build.warning(DW_CMDLINE_BAD_INPUTENC, OPT_STR _T("INPUTCHARSET: Ignoring invalid charset %") NPRIs , argv[argpos]); cp = NStreamEncoding::AUTO; } inputenc.SafeSetCodepage(cp); } else if (S7IsChEqualI('v',*swname) && argv[argpos][2] >= _T('0') && argv[argpos][2] <= _T('4') && !argv[argpos][3]) { int v=argv[argpos][2]-_T('0'); build.set_verbosity(v); } else if (S7IsChEqualI('p',*swname) && argv[argpos][2] >= _T('0') && argv[argpos][2] <= _T('5') && !argv[argpos][3]) { #ifdef _WIN32 // priority setting added 01-2007 by Comm@nder21 int p=argv[argpos][2]-_T('0'); HANDLE hProc = GetCurrentProcess(); struct { DWORD priority, fallback; } static const classes[] = { {IDLE_PRIORITY_CLASS, IDLE_PRIORITY_CLASS}, {BELOW_NORMAL_PRIORITY_CLASS, IDLE_PRIORITY_CLASS}, {NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS}, {ABOVE_NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS}, {HIGH_PRIORITY_CLASS, HIGH_PRIORITY_CLASS}, {REALTIME_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS} }; if (!SetPriorityClass(hProc, classes[p].priority)) SetPriorityClass(hProc, classes[p].fallback); if (p == 5) build.warning(DW_CMDLINE_HIGHPRIORITY,_T("makensis is running in REALTIME priority mode!")); #else build.warning(DW_CMDLINE_UNSUPP_NIX,badnonwinswitchfmt,_T("Px")); #endif } // Already parsed these (must adjust argpos) else if (!_tcsicmp(swname,_T("NOTIFYHWND"))) ++argpos; else if (!_tcsicmp(swname,_T("OUTPUTCHARSET")) || !_tcsicmp(swname,_T("OCS"))) ++argpos; // These must be parsed last because they will eat other switches else if (S7IsChEqualI('d',swname[0]) && swname[1]) { TCHAR *p=argv[argpos]+2; TCHAR *s=_tcsdup(p),*v; build.INFO_MSG(_T("Command line defined: \"%") NPRIs _T("\"\n"),p); v=_tcsstr(s,_T("=")); if (v) *v++=0; build.define(s,v?v:_T("")); free(s); } else if (S7IsChEqualI('x',swname[0]) && swname[1]) { if (build.process_oneline(swname+1,build.get_commandlinecode_filename(),argpos+1,build.PLF_VIRTUALFILE) != PS_OK) { return 1; } cmds_processed++; } // Already parsed these ("VERSION" never gets this far) #ifdef _WIN32 else if (!_tcsicmp(swname,_T("RAW"))) {} #endif else if (S7IsChEqualI('o',swname[0]) && swname[1]) {} else break; } else { files_processed++; if (!_tcscmp(argv[argpos],_T("-")) && !in_files) g_dopause=false; if (!noconfig) { noconfig=true; tstring main_conf; TCHAR* env_var = _tgetenv(_T("NSISCONFDIR")); if (env_var == NULL) #ifndef NSIS_CONFIG_CONST_DATA_PATH main_conf = get_dir_name(get_executable_dir(argv[0])); #else main_conf = _T(PREFIX_CONF); #endif else main_conf = env_var; main_conf += PLATFORM_PATH_SEPARATOR_STR; main_conf += _T("nsisconf.nsh"); if (process_config(build, main_conf)) return 1; tstring home_conf = get_home(); if (home_conf != _T("")) { home_conf += PLATFORM_PATH_SEPARATOR_STR; #ifdef _WIN32 home_conf += _T("nsisconf.nsh"); #else home_conf += _T(".nsisconf.nsh"); #endif if (process_config(build, home_conf)) return 1; } } { tstring nsifile; NIStream strm; if (!_tcscmp(argv[argpos],_T("-")) && !in_files) { strm.OpenStdIn(inputenc); nsifile = _T(""); } else { nsifile = argv[argpos]; if (!strm.OpenFileForReading(nsifile.c_str(),inputenc)) { nsifile += _T(".nsi"); if (!strm.OpenFileForReading(nsifile.c_str(),inputenc)) { nsifile = argv[argpos]; build.ERROR_MSG(_T("Can't open script \"%") NPRIs _T("\"\n"),nsifile.c_str()); return 1; } } build.set_default_output_filename(remove_file_extension(get_full_path(nsifile))+_T(".exe")); if (do_cd) { if (change_to_script_dir(build, nsifile)) return 1; } } build.notify(MakensisAPI::NOTIFY_SCRIPT,nsifile.c_str()); TCHAR bufcpdisp[20]; strm.StreamEncoding().GetCPDisplayName(bufcpdisp); build.INFO_MSG(_T("Processing script file: \"%") NPRIs _T("\" (%") NPRIs _T(")\n"),nsifile.c_str(),bufcpdisp); int ret=build.process_script(strm,nsifile.c_str()); if (ret != PS_EOF && ret != PS_OK) { build.ERROR_MSG(_T("Error in script \"%") NPRIs _T("\" on line %d -- aborting creation process\n"),nsifile.c_str(),build.linecnt); return 1; } } } argpos++; } bool parsed_all_params = argpos >= argc, processed_any = files_processed || cmds_processed; if (!parsed_all_params || !processed_any) { if (build.display_errors && !nousage) { print_usage(); } return performed && parsed_all_params ? 0 : 1; } if (build.preprocessonly) return 0; if (build.display_info) { _ftprintf(g_output,_T("\nProcessed ")); if (files_processed) _ftprintf(g_output,_T("%d file%") NPRIs _T(", "),files_processed,files_processed==1?_T(""):_T("s")); if (cmds_processed) _ftprintf(g_output,_T("%d command line command%") NPRIs _T(", "),cmds_processed,cmds_processed==1?_T(""):_T("s")); _ftprintf(g_output,_T("writing output (%") NPRIs _T("):\n"),build.get_target_suffix()); fflush(g_output); } if (build.write_output()) { build.ERROR_MSG(_T("Error - aborting creation process\n")); return 1; } if (do_exec) { const TCHAR *app = build.get_output_filename(); #ifdef _WIN32 ShellExecute(0, 0, app, 0, 0, SW_SHOW); #else const TCHAR *cmd = _tgetenv(_T("NSISLAUNCHCOMMAND")); sane_system(replace_all(cmd ? cmd : _T("wine start '%1'"), _T("%1"), app).c_str()); #endif } return 0; } #ifndef NDEBUG # ifdef _MSC_VER # include # endif #endif NSIS_ENTRYPOINT_TMAIN int _tmain(int argc, TCHAR **argv) { #ifndef NDEBUG #ifdef _MSC_VER const int dbgchkthorough = true, checkeveryallocfree = dbgchkthorough ? _CRTDBG_CHECK_ALWAYS_DF : 0; _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF | checkeveryallocfree | _CRTDBG_LEAK_CHECK_DF); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE), _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE), _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT); //_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE), _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT); #endif #endif int retval = makensismain(argc,argv); #ifndef NDEBUG #ifdef _MSC_VER assert(_CrtCheckMemory()); #endif #endif return retval; } #if !defined(_WIN32) && defined(_UNICODE) #include int main(int argc, char **argv) { errno = ENOMEM; int wargc = 0; wchar_t term[1], *p, **wargv = (wchar_t **) malloc((argc+1) * sizeof(void*)); if (wargv) { for ( ; wargc < argc; ++wargc ) if ((p = NSISRT_mbtowc(argv[wargc]))) wargv[wargc] = p; else break; } if (wargc == argc) *term = L'\0', wargv[wargc] = term, errno = _tmain(wargc,wargv); else wprintf(L"FATAL: main argv conversion failed!\n"); #ifndef NDEBUG // Normally we just leak if (wargv) for ( int i = 0; i < wargc; ++i ) NSISRT_free(wargv[i]); free(wargv); #endif return errno; } #endif nsis-3.11/Source/manifest.cpp000077500000000000000000000176031477201124000161740ustar00rootroot00000000000000/* * manifest.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/22/2007 */ #include "Platform.h" #include "manifest.h" #include #include "tstring.h" #include "util.h" // RawTStrToASCII #include // Jim Park: The manifest must stay UTF-8. Do not convert. namespace manifest { using namespace std; static bool isstrhexchars(const TCHAR*s,UINT cch) { while(cch-- && *s) { const TCHAR c = *s++, clw = ((TCHAR)c) | 32; if (!(c >= '0' && c <= '9') && !(clw >= 'a' && clw <= 'f')) return false; } return true; } static const struct { const TCHAR *name, *guidstr; } g_soslmap[] = { { _T("WinVista"), _T("{e2011457-1546-43c5-a5fe-008deee3d3f0}") }, //msdn.microsoft.com/en-us/library/aa374191 { _T("Win7"), _T("{35138b9a-5d96-4fbd-8e2d-a2440225f93a}") }, //msdn.microsoft.com/en-us/library/dd371711 { _T("Win8"), _T("{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}") }, //msdn.microsoft.com/en-us/library/hh848036 { _T("Win8.1"), _T("{1f676c76-80e1-4239-95bb-83d0f6d0da78}") }, //msdn.microsoft.com/en-us/library/windows/desktop/dn481241 { _T("Win10"), _T("{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}") } //blogs.msdn.com/b/chuckw/archive/2013/09/10/manifest-madness.aspx }; bool SupportedOSList::addall() { m_isdefaultlist = false; for (UINT i = 0; i < COUNTOF(g_soslmap); ++i) if (!append(g_soslmap[i].name)) return false; return true; } bool SupportedOSList::append(const TCHAR* osid) { const TCHAR *guid = 0; if ('{' == *osid) { if (38 == _tcsclen(osid) && '}' == osid[37] && '-' == osid[9] && '-' == osid[14] && '-' == osid[19] && '-' == osid[24] && isstrhexchars(osid+1,8) && isstrhexchars(osid+10,4) && isstrhexchars(osid+15,4) && isstrhexchars(osid+20,4) && isstrhexchars(osid+25,12) ) { guid = osid; } } else { for (UINT i = 0; i < COUNTOF(g_soslmap); ++i) if (!_tcsicmp(osid, g_soslmap[i].name)) { guid = g_soslmap[i].guidstr; break; } } if (guid) { m_list.add(guid,0); m_isdefaultlist = false; return true; } return false; } static const TCHAR*g_appendpaths[] = { // Basic simulated XPath support _T("/"), _T("/assembly"), _T("/assembly/dependency"), _T("/assembly/dependency/dependentAssembly"), _T("/assembly/compatibility/application"), _T("/assembly/application/windowsSettings") }; std::vector g_appendstrings[COUNTOF(g_appendpaths)]; static int isvalidappendpath(const TCHAR*path) { for (int i = 0; i < (int) COUNTOF(g_appendpaths); ++i) if (!_tcsicmp(path, g_appendpaths[i])) return i; return -1; } bool addappendstring(const TCHAR*path, const TCHAR*data) { int i = isvalidappendpath(path); if (i >= 0) { string str = ""; str += TtoCString(data); g_appendstrings[i].push_back(str); return true; } return false; } static bool append(string& xml, const TCHAR*path, const char*prefix = 0, const char*suffix = 0) { bool any = false; int i = isvalidappendpath(path); if (i >= 0) for (size_t j = 0; j < g_appendstrings[i].size(); ++j) { if (!any && prefix) xml += prefix, any = true; xml += g_appendstrings[i][j]; } if (any && suffix) xml += suffix; return any; } string generate(comctl comctl_selection, exec_level exec_level_selection, const SPECIFICATION&spec) { flags featureflags = spec.Flags; dpiaware dpia = spec.DPIA; const TCHAR *dpia2 = spec.DPIA2; longpathaware lpa = spec.lpaware; SupportedOSList& sosl = *spec.pSOSL; const TCHAR *mvt = spec.MaxVersionTested; bool default_or_empty_sosl = sosl.isdefaultlist() || !sosl.getcount(), any; if (comctl_selection == comctl_old && exec_level_selection == exec_level_none && default_or_empty_sosl && dpiaware_notset == dpia) return ""; string xmltmp; string xml = "Nullsoft Install System "; xml += TtoCString(NSIS_VERSION); xml += ""; if (comctl_selection == comctl_xp) { addappendstring(_T("/assembly/dependency/dependentAssembly"), _T("")); } xmltmp = ""; any = append(xmltmp, _T("/assembly/dependency")); any |= append(xmltmp, _T("/assembly/dependency/dependentAssembly"), "", ""); if (any) { xmltmp += ""; xml += xmltmp; } if (exec_level_selection != exec_level_none) { string level = ""; switch (exec_level_selection) { case exec_level_none: break; case exec_level_user: level = "asInvoker"; break; case exec_level_highest: level = "highestAvailable"; break; case exec_level_admin: level = "requireAdministrator"; break; } xml += ""; } else if (sosl.isdefaultlist()) { // Don't add supportedOS list for exec_level_none to remain compatible with v2.46 sosl.deleteall(); } xmltmp = "", append(xmltmp, _T("/assembly/compatibility/application")); int soslcount = sosl.getcount(); if (!xmltmp.empty() || soslcount || *mvt) { char buf[38+1]; xml += ""; while(soslcount--) { xml += ""; } if (*mvt) { xml += ""; } xml += xmltmp; xml += ""; } string xml_aws = ""; // if (featureflags & disablewindowfiltering) { xml_aws += ""; xml_aws += "true"; xml_aws += ""; } if (featureflags & gdiscaling) { xml_aws += ""; xml_aws += "true"; xml_aws += ""; } if (dpiaware_notset != dpia) { xml_aws += ""; xml_aws += dpia == dpiaware_explorer ? "Explorer" : dpia >= dpiaware_permonitor ? "True/PM" : dpiaware_false != dpia ? "true" : "false"; xml_aws += ""; } if (*dpia2) { xml_aws += ""; xml_aws += TtoCString(dpia2); xml_aws += ""; } if (lpaware_notset != lpa) { xml_aws += ""; xml_aws += lpaware_false != lpa ? "true" : "false"; xml_aws += ""; } append(xml_aws, _T("/assembly/application/windowsSettings")); if (!xml_aws.empty()) { xml += ""; xml += xml_aws; xml += ""; } append(xml, _T("/assembly")); xml += ""; append(xml, _T("/")); return xml; } }; nsis-3.11/Source/manifest.h000077500000000000000000000052651477201124000156420ustar00rootroot00000000000000/* * manifest.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/22/2007 */ #ifndef ___MANIFEST_H___ #define ___MANIFEST_H___ #include "tstring.h" #include "strlist.h" namespace manifest { enum flags { disablewindowfiltering = 0x01, // Win8+ (Allow EnumWindows() to return Windows 8 immersive apps) gdiscaling = 0x02, // Win10FU1703+ blogs.windows.com/windowsdeveloper/2017/05/19/improving-high-dpi-experience-gdi-based-desktop-apps/ flags_default = 0 }; enum comctl // WinXP+ { comctl_old, comctl_xp }; enum exec_level // WinVista+ { exec_level_none, exec_level_user, exec_level_highest, exec_level_admin }; enum dpiaware // WinVista+ { dpiaware_notset, dpiaware_false, dpiaware_true, // System DPI on Vista+ dpiaware_permonitor, // System DPI on Vista/7/8, PerMonitor on 8.1+ (Undocumented because we don't handle WM_DPICHANGED) dpiaware_explorer // Win8.1+? Undocumented? }; enum longpathaware { lpaware_notset, lpaware_false, lpaware_true // Win10.0.14352+ }; class SupportedOSList // Win7+ { StringList m_list; bool m_isdefaultlist; public: SupportedOSList() : m_isdefaultlist(false) {} bool append(const TCHAR* osid); int getcount() const { return m_list.getnum(); } bool isdefaultlist() const { return m_isdefaultlist; } const TCHAR* get(int idx) { int pos = m_list.idx2pos(idx); if (-1 == pos) return 0; return m_list.get() + pos; } bool addall(); void deleteall() { m_list.deleteall(); m_isdefaultlist = false; } void setdefault() { m_list.deleteall(); append(_T("Win7")); append(_T("Win8")); append(_T("Win8.1")); // In the default list because GetVersion[Ex] lies if this is not set in the manifest append(_T("Win10")); m_isdefaultlist = true; } }; typedef struct { flags Flags; dpiaware DPIA; const TCHAR *DPIA2; // Win10FU1607+ longpathaware lpaware; SupportedOSList*pSOSL; const TCHAR *MaxVersionTested; // Win10FU1903+ github.com/microsoft/AppConsult-WinAppsModernizationWorkshop/tree/master/Exercise2 } SPECIFICATION; std::string generate(comctl, exec_level, const SPECIFICATION&); bool addappendstring(const TCHAR*path, const TCHAR*data); }; #endif//!___MANIFEST_H___ nsis-3.11/Source/mmap.cpp000077500000000000000000000271321477201124000153160ustar00rootroot00000000000000/* * mmap.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "mmap.h" #include // for f* #include // for assert #include "tchar.h" #include #ifndef _WIN32 # include // for freebsd # include # include # include # include #endif #include "util.h" // ===== // IMMap // ===== bool IMMap::write_to_external_file(FILE*file, UINT64 size) { if (~(size&0) == size) size = getsize(); if (getmaxoffset() < size) return false; UINT64 left = size, written = 0; int offset = 0; // TODO: this will be removed after converting the mapping code to 64bit. while (left > 0 && offset >= 0) { size_t chunksize = (size_t) STD_MIN(left, (UINT64) 1 << 20); void *view = getmore(offset, chunksize); written += fwrite(view, 1, chunksize, file); release(view, chunksize); left -= chunksize; offset += (int)chunksize; } return written == size; } // ======== // MMapFile // ======== int MMapFile::m_iAllocationGranularity = 0; MMapFile::maxfilesizetype MMapFile::getmaxfilesize() { assert((~(maxfilesizetype)0) > 0); return (maxfilesizetype) STD_MIN((UINT64) (~(maxfilesizetype)0), (UINT64) Platform_GetMaxFileSize()); } MMapFile::MMapFile() { #ifdef _WIN32 m_hFile = INVALID_HANDLE_VALUE; m_hFileMap = NULL; #else m_hFile = NULL; m_hFileDesc = -1; #endif m_pView = NULL; m_iSize = 0; m_bReadOnly = FALSE; m_bTempHandle = FALSE; if (!m_iAllocationGranularity) { #ifdef _WIN32 SYSTEM_INFO si; GetSystemInfo(&si); m_iAllocationGranularity = (int) si.dwAllocationGranularity; #else m_iAllocationGranularity = getpagesize(); #endif } } MMapFile::~MMapFile() { clear(); } void MMapFile::clear() { release(); #ifdef _WIN32 if (m_hFileMap) CloseHandle(m_hFileMap); if (m_bTempHandle && m_hFile != INVALID_HANDLE_VALUE) CloseHandle(m_hFile); m_hFile = INVALID_HANDLE_VALUE; m_hFileMap = 0; #else if (m_bTempHandle && m_hFile) fclose(m_hFile); m_hFile = NULL; #endif } void MMapFile::setro(BOOL bRO) { m_bReadOnly = bRO; } // TODO: Convert to UINT64. Right now the mapping is still limited to 31 bits. #ifdef _WIN32 int MMapFile::internalsetfile(HANDLE hFile, DWORD dwSize) #else int MMapFile::internalsetfile(int hFile, DWORD dwSize) #endif { clear(); #ifdef _WIN32 m_hFile = hFile; #else m_hFileDesc = hFile; #endif m_bTempHandle = FALSE; #ifdef _WIN32 if (m_hFile == INVALID_HANDLE_VALUE) #else if (m_hFileDesc == -1) #endif return 0; m_iSize = (int) dwSize; if (m_iSize <= 0) return 0; #ifdef _WIN32 m_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READONLY, 0, m_iSize, NULL); if (!m_hFileMap) return 0; #endif m_bReadOnly = TRUE; return 1; } void MMapFile::resize(int newsize) { release(); if (newsize > m_iSize) { #ifdef _WIN32 if (m_hFileMap) CloseHandle(m_hFileMap); m_hFileMap = 0; #endif m_iSize = newsize; #ifdef _WIN32 if (m_hFile == INVALID_HANDLE_VALUE) { TCHAR buf[MAX_PATH], buf2[MAX_PATH]; GetTempPath(MAX_PATH, buf); GetTempFileName(buf, _T("nsd"), 0, buf2); m_hFile = CreateFile( buf2, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); m_bTempHandle = TRUE; } if (m_hFile != INVALID_HANDLE_VALUE) { m_hFileMap = CreateFileMapping( m_hFile, NULL, m_bReadOnly ? PAGE_READONLY : PAGE_READWRITE, 0, m_iSize, NULL ); } #else if (m_hFile == NULL) { m_hFile = tmpfile(); if (m_hFile != NULL) { m_hFileDesc = fileno(m_hFile); m_bTempHandle = TRUE; } } // resize if (m_hFileDesc != -1) { unsigned char c = 0; if (lseek(m_hFileDesc, m_iSize, SEEK_SET) != (off_t)-1) { if (read(m_hFileDesc, &c, 1) != -1) { if (lseek(m_hFileDesc, m_iSize, SEEK_SET) != (off_t)-1) { if (write(m_hFileDesc, &c, 1) != -1) { return; // no errors } } } } } m_hFileDesc = -1; // some error occurred, bail #endif #ifdef _WIN32 if (!m_hFileMap) #else if (m_hFileDesc == -1) #endif { extern void quit(); extern int g_display_errors; if (g_display_errors) { PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error creating mmap the size of %d.\n"), m_iSize); } quit(); } } } #ifdef _WIN32 bool MMapFile::setfile(HANDLE hFile, UINT64 size) { maxfilesizetype maxsize = getmaxfilesize(); return size <= maxsize && internalsetfile(hFile, (maxfilesizetype) size); } HANDLE MMapFile::openfilehelper(const TCHAR*fpath, UINT64 &size) { HANDLE hFile = CreateFile(fpath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hFile != INVALID_HANDLE_VALUE) { ULARGE_INTEGER size64; if (GetFileSize64(hFile, size64)) size = size64.QuadPart; else CloseHandle(hFile), hFile = INVALID_HANDLE_VALUE; } return hFile; } #else bool MMapFile::setfile(FILE*hFile, UINT64 size) { maxfilesizetype maxsize = getmaxfilesize(); return size <= maxsize && internalsetfile(fileno(hFile), (maxfilesizetype) size); } FILE* MMapFile::openfilehelper(const TCHAR*fpath, UINT64 &size) { FILE *hFile = FOPEN(fpath, ("rb")); if (hFile) { UINT64 size64 = get_file_size64(hFile); if (size64 != invalid_file_size64) size = size64; else fclose(hFile), hFile = 0; } return hFile; } #endif UINT64 MMapFile::setfile(const TCHAR*fpath) { UINT64 size = 0; #ifdef _WIN32 HANDLE hFile = openfilehelper(fpath, size); if (hFile != INVALID_HANDLE_VALUE) { if (!setfile(hFile, size)) size = 0; CloseHandle(hFile); } #else FILE *hFile = openfilehelper(fpath, size); if (hFile) { if (!setfile(hFile, size)) size = 0; // NOTE: mmap() requires the file descriptor to stay open for get(), // otherwise get() will fail with errno code EBADFD (bad file descriptor). m_hFile = hFile, m_bTempHandle = TRUE; } #endif return size; } int MMapFile::getsize() const { return m_iSize; } void *MMapFile::get(int offset, size_t size) const { return get(offset, &size); } void *MMapFile::get(int offset, size_t *sizep) const { if (!sizep) return NULL; assert(!m_pView); size_t size = *sizep; if (!m_iSize || offset + (int)size > m_iSize) // TODO: once m_iSize and offset is converted to unsigned 64bit, this typecast will disappear { extern void quit(); extern int g_display_errors; if (g_display_errors) { PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error mmapping file (%d, %d) is out of range.\n"), offset, size); } quit(); } // fix offset int alignedoffset = offset - (offset % m_iAllocationGranularity); size += offset - alignedoffset; #ifdef _WIN32 m_pView = MapViewOfFile(m_hFileMap, m_bReadOnly ? FILE_MAP_READ : FILE_MAP_WRITE, 0, alignedoffset, size); #else m_pView = mmap(0, size, m_bReadOnly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, m_hFileDesc, alignedoffset); m_iMappedSize = *sizep = size; #endif #ifdef _WIN32 if (!m_pView) #else if (m_pView == MAP_FAILED) #endif { extern void quit(); extern int g_display_errors; if (g_display_errors) { PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error mmapping datablock to %d.\n"), size); } quit(); } return (void *)((char *)m_pView + offset - alignedoffset); } void *MMapFile::getmore(int offset, size_t size) const { void *pView; void *pViewBackup = m_pView; #ifndef _WIN32 int iMappedSizeBackup = m_iMappedSize; #endif m_pView = 0; pView = get(offset, size); m_pView = pViewBackup; #ifndef _WIN32 m_iMappedSize = iMappedSizeBackup; #endif return pView; } void MMapFile::release() { if (!m_pView) return; #ifdef _WIN32 UnmapViewOfFile(m_pView); #else munmap((char *)m_pView, m_iMappedSize); #endif m_pView = NULL; } void MMapFile::release(void *pView, size_t size) { if (!pView) return; unsigned int alignment = ((ULONG_PTR)pView) % m_iAllocationGranularity; pView = (char *)pView - alignment; size += alignment; #ifdef _WIN32 UnmapViewOfFile(pView); #else munmap((char *)pView, size); #endif } void MMapFile::flush(size_t num) { if (m_pView) #ifdef _WIN32 {} // improving performance by commenting: FlushViewOfFile(m_pView, num); #else msync((char *)m_pView, num, MS_SYNC); #endif } // ======== // MMapFake // ======== MMapFake::MMapFake() { m_pMem = NULL; m_iSize = 0; } void MMapFake::set(const char *pMem, int iSize) { m_pMem = pMem; m_iSize = iSize; } int MMapFake::getsize() const { return m_iSize; } void *MMapFake::get(int offset, size_t size) const { return get(offset, &size); } void *MMapFake::get(int offset, size_t *size) const { if (!size || (offset + (int)*size > m_iSize)) // TODO: once m_iSize and offset is converted to unsigned 64bit, this typecast will disappear return NULL; return (void *)(m_pMem + offset); } void *MMapFake::getmore(int offset, size_t size) const { return get(offset, size); } void MMapFake::resize(int n) {} void MMapFake::release() {} void MMapFake::release(void *p, size_t size) {} void MMapFake::clear() {} void MMapFake::setro(BOOL b) {} void MMapFake::flush(size_t b) {} // ======= // MMapBuf // ======= MMapBuf::MMapBuf() { m_gb_u=0; m_alloc=m_used=0; } MMapBuf::~MMapBuf() { m_fm.release(); } int MMapBuf::add(const void *data, int len) { if (len <= 0) return 0; resize(getlen() + len); memcpy((char*)get(getlen() - len, len), data, len); release(); return getlen() - len; } void MMapBuf::setro(BOOL bRO) { m_fm.setro(bRO); } void MMapBuf::resize(int newlen) { if (!m_gb_u && newlen < getmodethreshold()) // still in db mode { m_gb.resize(newlen); return; } // not in db mode m_gb_u = 1; m_used = newlen; if (newlen > m_alloc) { if (!si_add(m_alloc, newlen, (16 << 20))) // add 16mb to top of mapping m_alloc = INT_MAX; // we've hit a signed integer overflow m_fm.resize(m_alloc); if (m_gb.getlen()) { memcpy(m_fm.get(0, m_gb.getlen()), m_gb.get(), m_gb.getlen()); m_fm.flush(m_gb.getlen()); m_fm.release(); m_gb.resize(0); } } } int MMapBuf::getsize() const { return getlen(); } int MMapBuf::getlen() const { if (m_gb_u) return m_used; return m_gb.getlen(); } void *MMapBuf::get() const { return get(0, m_alloc); } void *MMapBuf::get(int offset, size_t *sizep) const { if (!sizep) return NULL; size_t size = *sizep; return get(offset, size); } void *MMapBuf::get(int offset, size_t size) const { if (m_gb_u) return m_fm.get(offset, size); return (void *) ((char *) m_gb.get() + offset); } void *MMapBuf::getmore(int offset, size_t size) const { if (m_gb_u) return m_fm.getmore(offset, size); return (void *) ((char *) m_gb.get() + offset); } void MMapBuf::release() { if (m_gb_u) m_fm.release(); } void MMapBuf::release(void *pView, size_t size) { if (m_gb_u) m_fm.release(pView, size); } void MMapBuf::clear() { if (m_gb_u) m_fm.clear(); } void MMapBuf::flush(size_t num) { if (m_gb_u) m_fm.flush(num); } nsis-3.11/Source/mmap.h000077500000000000000000000166231477201124000147660ustar00rootroot00000000000000/* * mmap.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #ifndef __MMAP_H_ #define __MMAP_H_ #include "Platform.h" #include "growbuf.h" #include "tchar.h" #ifndef _WIN32 #include // for FILE* #include // (some systems have FILE* in here) #endif class IMMap { public: typedef DWORD maxfilesizetype; // TODO: Change to UINT64 static inline UINT64 getmaxoffset() { return INT_MAX; } // NSIS offset limit is 31 bits right now virtual void resize(int newlen)=0; virtual int getsize() const=0; virtual void *get(int offset, size_t size) const=0; virtual void *get(int offset, size_t *size) const=0; virtual void *getmore(int offset, size_t size) const=0; virtual void release()=0; virtual void release(void *view, size_t size)=0; virtual void clear()=0; virtual void setro(BOOL bRO)=0; virtual void flush(size_t num)=0; virtual ~IMMap() {} virtual bool write_to_external_file(FILE*file, UINT64 size = ~(UINT64)0); }; class MMapFile : public IMMap { private: // don't copy instances MMapFile(const MMapFile&); void operator=(const MMapFile&); public: static DWORD getmaxfilesize(); MMapFile(); virtual ~MMapFile(); /** * Closes the memory map and the file handle. */ void clear(); /** * Set read-only. * @param bRO Boolean value to set read-only. */ void setro(BOOL bRO); /** * Creates the memory mapping object of the file with a mapping size. * * @param hFile The handle to the opened file. * @param size The size of the memory mapped object. You cannot set * this value to zero like with CreateFileMapping() because it will * immediately return. Most likely, you want to set it to the size * of the file unless you want to only map a part of the file on * purpose. * @return Returns 1 on success, 0 on failure. */ #ifdef _WIN32 bool setfile(HANDLE hFile, UINT64 size); private: int internalsetfile(HANDLE hFile, DWORD dwSize); #else bool setfile(FILE*hFile, UINT64 size); private: int internalsetfile(int hFile, DWORD dwSize); #endif public: UINT64 setfile(const TCHAR*fpath); #ifdef _WIN32 static HANDLE openfilehelper(const TCHAR*fpath, UINT64 &size); #else static FILE* openfilehelper(const TCHAR*fpath, UINT64 &size); #endif /** * Resize the memory mapping of the file. Used when the filesize has * changed. When setfile has not been called previously, then it will * create a temporary file and use it to create a memory map. This is * what's used by MMapBuf to create a Memory Mapped Buffer. * * @param newsize The new size of the file. Limited to 32-bits. */ void resize(int newsize); /** * Size of the memory map object. */ int getsize() const; /** * Set the memory map to a particular offset in the file and return the * memory mapped pointer to it. Internally it may have to align to a * certain page size. * * @param offset The offset from the beginning of the file. * @param size The size of the memory map window. */ void *get(int offset, size_t size) const; /** * Set the memory map to a particular offset in the file and return the * memory mapped pointer to it. Internally it may have to align to a * certain page size. * * @param offset The offset from the beginning of the file. * @param sizep [in/out] The size of the memory map window. (In non-Win32 * systems, the new size is written back out.) */ void *get(int offset, size_t *sizep) const; /** * This function sets memory map and just hands you the pointer and * it expects you to manage it. So you need to call release(pView, size) * yourself or you will leak memory. * * Warning: This breaks encapsulation. The user should probably just * create a new map. * * @param offset The offset from the beginning of the file. * @param size The size of the memory map window. */ void *getmore(int offset, size_t size) const; /** * Releases the memory map currently being used. Calls UnMapViewOfFile(). */ void release(); /** * Releases the memory map pointed to by pView. In Win32 systems * eventually calls UnmapViewOfFile(). Interestingly, the function * tries to align the pointer value back to the beginning of the * paged memory which is necessary because of the way get() works. * * This looks like it should only be used in conjunction with * getmore(). Otherwise, just call release(). * * @param pView The pointer to somewhere in a MemMapped object. * @param size The size of the object. Used only in non-Win32 systems. */ void release(void *pView, size_t size); /** * Flushes the contents of the current memory map to disk. Set size to 0 * if you want to flush everything. * * @param num The number of bytes to flush. 0 for everything. */ void flush(size_t num); private: #ifdef _WIN32 HANDLE m_hFile, m_hFileMap; #else FILE *m_hFile; int m_hFileDesc; mutable int m_iMappedSize; #endif mutable void *m_pView; mutable int m_iSize; BOOL m_bReadOnly; BOOL m_bTempHandle; static int m_iAllocationGranularity; }; class MMapFake : public IMMap { private: // don't copy instances MMapFake(const MMapFake&); void operator=(const MMapFake&); public: MMapFake(); void set(const char *pMem, int iSize); int getsize() const; void *get(int offset, size_t size) const; void *get(int offset, size_t *size) const; void *getmore(int offset, size_t size) const; void resize(int n); void release(); void release(void *p, size_t size); void clear(); void setro(BOOL b); void flush(size_t b); private: const char *m_pMem; int m_iSize; }; /** * A data structure that can be used to create a scratch file to do * work in. When it's smaller than 16mb, it's all in memory using the * GrowBuf class. But when it gets larger than 16mb, then it uses * the MMapFile class to create a memory map to a temporary file and * then uses it. This reduces memory overhead of the installer. * * This is sort of our virtual memory manager. */ class MMapBuf : public IGrowBuf, public IMMap { private: // don't copy instances MMapBuf(const MMapBuf&); void operator=(const MMapBuf&); public: MMapBuf(); virtual ~MMapBuf(); int add(const void *data, int len); void setro(BOOL bRO); void resize(int newlen); int getsize() const; int getlen() const; void *get() const; void *get(int offset, size_t *sizep) const; void *get(int offset, size_t size) const; void *getmore(int offset, size_t size) const; void release(); void release(void *pView, size_t size); void clear(); void flush(size_t num); protected: static inline int getmodethreshold() { return 16 << 20; } private: GrowBuf m_gb; MMapFile m_fm; int m_gb_u; int m_alloc, m_used; }; #endif//__MMAP_H_ nsis-3.11/Source/script.cpp000077500000000000000000006547101477201124000157000ustar00rootroot00000000000000/* * script.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #include #include #include "tokens.h" #include "build.h" #include "util.h" #include "winchar.h" #include "ResourceEditor.h" #include "DialogTemplate.h" #include "BinInterop.h" #include "lang.h" #include "dirreader.h" #include #include "icon.h" #include "exehead/api.h" #include "exehead/resource.h" #include // for assert(3) #include #include "tstring.h" #include "utf.h" #include #include "boost/scoped_ptr.hpp" using namespace std; #ifndef _WIN32 # include // for stat and umask # include // for mode_t # include // for O_RDONLY # include # include // for mkstemp #endif #define REGROOTKEYTOINT(hk) ( (INT) (((INT_PTR)(hk)) & 0xffffffff) ) // Masking off non-existing top bits to make GCC happy #define REGROOTKEYTOINTEX(hk, removeviewbits) ( REGROOTKEYTOINT(hk) & ~(removeviewbits ? (REGROOTVIEW32|REGROOTVIEW64) : 0) ) #ifdef NSIS_CONFIG_VISIBLE_SUPPORT typedef enum { LU_INVALID = -1, LU_PIXEL = 0, LU_DIALOG } LAYOUTUNIT; static int ParseLayoutUnit(const TCHAR*Str, LAYOUTUNIT&LU) { TCHAR buf[200]; int succ, val = LineParser::parse_int(Str, &succ); if (succ) return (LU = LU_PIXEL, val); size_t cch = my_strncpy(buf, Str, COUNTOF(buf)); if (cch > 1 && S7IsChEqualI('u', buf[cch-1])) // Something with a 'u' suffix? { buf[cch-1] = _T('\0'); val = LineParser::parse_int(buf, &succ); if (succ) return (LU = LU_DIALOG, val); } return (LU = LU_INVALID, -1); } #endif #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT static bool LookupWinSysColorId(const TCHAR*Str, UINT&Clr) { static const struct { const TCHAR*Name; UINT Id; } map[] = { // Note: This list is incomplete. { _T("WINDOW"), 5 }, { _T("WINDOWTEXT"), 8 }, { _T("3DFACE"), 15 }, { _T("BTNTEXT"), 18 }, // "Three-dimensional display elements and dialog box" { _T("HIGHLIGHT"), 13 }, { _T("HIGHLIGHTTEXT"), 14 }, // "Item(s) selected in a control" { _T("GRAYTEXT"), 17 }, // "Grayed (disabled) text" { _T("HOTLIGHT"), 26 }, // "Color for a hyperlink or hot-tracked item" (Win98+) }; for (UINT i = 0; i < COUNTOF(map); ++i) if (!_tcsicmp(map[i].Name, Str)) return (Clr = map[i].Id, true); return false; } static UINT ParseCtlColor(const TCHAR*Str, int&CCFlags, int CCFlagmask) { UINT clr, v; TCHAR buf[7+!0], *pEnd; my_strncpy(buf, Str, 7+!0), buf[7] = '\0'; if (!_tcscmp(_T("SYSCLR:"), buf)) { CCFlags |= ((CC_TEXT_SYS|CC_BK_SYS) & CCFlagmask); // ExeHead must call GetSysColor if (!LookupWinSysColorId(Str+7, clr)) clr = _tcstoul(Str+7, &pEnd, 0); } else v = _tcstoul(Str, &pEnd, 16), clr = ((v&0xff)<<16)|(v&0xff00)|((v&0xff0000)>>16); return clr; } #endif //~ NSIS_CONFIG_ENHANCEDUI_SUPPORT static LANGID ParseLangId(const TCHAR*Str) { const TCHAR *p = Str; if (_T('+') == *p || _T('-') == *p) ++p; return _T('0') == p[0] && _T('x') == (p[1]|32) ? LineParser::parse_int(Str) : _ttoi(Str); } LANGID CEXEBuild::ParseLangIdParameter(const LineParser&line, int token) { int succ, lid = line.gettoken_int(token, &succ); if (!lid) lid = last_used_lang; if (!succ) warning_fl(DW_BAD_LANGID, _T("\"%") NPRIs _T("\" is not a valid language id, using language id %u!"), line.gettoken_str(token), lid); return lid; } int CEXEBuild::process_script(NIStream&Strm, const TCHAR *filename) { NStreamLineReader linereader(Strm); curlinereader = &linereader; curfilename = filename; linecnt = 0; if (has_called_write_output) { ERROR_MSG(_T("Error (process_script): write_output already called, can't continue\n")); return PS_ERROR; } #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES set_date_time_predefines(); TCHAR *oldfilename = set_file_predefine(curfilename); TCHAR *oldtimestamp = set_timestamp_predefine(curfilename); #endif int ret=parseScript(); #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES restore_file_predefine(oldfilename); restore_timestamp_predefine(oldtimestamp); del_date_time_predefines(); #endif curlinereader = 0; curfilename = 0; if (m_linebuild.getlen()) { ERROR_MSG(_T("Error: invalid script: last line ended with \\\n")); return PS_ERROR; } if (ret == PS_EOF && num_ifblock()) { ERROR_MSG(_T("!if[macro][n]def: open at EOF - need !endif\n")); return PS_ERROR; } return ret; } #define PRINTHELPEX(cmdname) { print_help((cmdname)); return PS_ERROR; } #define PRINTHELP() PRINTHELPEX(line.gettoken_str(0)) void CEXEBuild::start_ifblock() { ifblock ib = {0, }; if (cur_ifblock) ib.inherited_ignore = cur_ifblock->ignore || cur_ifblock->inherited_ignore; int num = build_preprocessor_data.getlen() / sizeof(ifblock); build_preprocessor_data.add(&ib, sizeof(ifblock)); cur_ifblock = (ifblock *) build_preprocessor_data.get() + num; } void CEXEBuild::end_ifblock() { if (build_preprocessor_data.getlen()) { cur_ifblock--; build_preprocessor_data.resize(build_preprocessor_data.getlen() - sizeof(ifblock)); if (!build_preprocessor_data.getlen()) cur_ifblock = 0; } } int CEXEBuild::num_ifblock() { return build_preprocessor_data.getlen() / sizeof(ifblock); } int CEXEBuild::doParse(int verbosity, const TCHAR *fmt, ...) { ExpandoString buf; int orgv = get_verbosity(), res; va_list val; va_start(val, fmt); buf.StrVFmt(fmt, val); va_end(val); if (verbosity >= 0) set_verbosity(verbosity); res = doParse(buf.GetPtr()); set_verbosity(orgv); return res; } int CEXEBuild::doParse(const TCHAR *str) { LineParser line(inside_comment); int res; while (*str == _T(' ') || *str == _T('\t')) str++; // remove trailing slash and null, if there's a previous line if (m_linebuild.getlen()>1) m_linebuild.resize(m_linebuild.getlen()-(2*sizeof(TCHAR))); // warn of comment with line-continuation if (m_linebuild.getlen()) { LineParser prevline(inside_comment); prevline.parse((TCHAR*)m_linebuild.get()); LineParser thisline(inside_comment); thisline.parse(str); if (prevline.inComment() && !thisline.inComment()) { warning_fl(DW_COMMENT_NEWLINE, _T("comment contains line-continuation character, following line will be ignored")); } } // add new line to line buffer const unsigned int cchstr = (unsigned int) _tcslen(str); m_linebuild.add(str,(cchstr+1)*sizeof(TCHAR)); // keep waiting for more lines if this line ends with a backslash if (str[0] && CharPrev(str,str+cchstr)[0] == _T('\\')) { return PS_OK; } // parse before checking if the line should be ignored, so block comments won't be missed // escaped quotes should be ignored for compile time commands that set defines // because defines can be inserted in commands at a later stage bool ignore_escaping = (!_tcsnicmp((TCHAR*)m_linebuild.get(),_T("!define"),7) || !_tcsncicmp((TCHAR*)m_linebuild.get(),_T("!insertmacro"),12)); NStreamEncoding enc(NStreamEncoding::UNKNOWN); res=line.parse((TCHAR*)m_linebuild.get(), ignore_escaping, linecnt < 3 ? &enc : NULL); if (enc.GetCodepage() != NStreamEncoding::UNKNOWN && curlinereader) curlinereader->StreamEncoding().SafeSetCodepage(enc.GetCodepage()); inside_comment = line.inCommentBlock(); // if ignoring, ignore all lines that don't begin with an exclamation mark { bool ignore_line = cur_ifblock && (cur_ifblock->ignore || cur_ifblock->inherited_ignore); if (ignore_line) { TCHAR *rawline = (TCHAR*) m_linebuild.get(), first_char = *rawline, buf[30], *first_token = buf; if (!res) first_token = line.gettoken_str(0); else // LineParser::parse() failed so we cannot call gettoken_str but we still might need to ignore this line for (size_t i = 0; i < COUNTOF(buf); ++i) if ((buf[i] = rawline[i]) <= ' ') { buf[i] = _T('\0'); break; } if (first_char!=_T('!') || !is_ppbranch_token(first_token)) { m_linebuild.resize(0); return PS_OK; } } } GrowBuf ppoline; if (preprocessonly) m_linebuild.swap(ppoline); // LineParser strips quotes and we need to display them m_linebuild.resize(0); if (res) { if (res==-2) ERROR_MSG(_T("Error: unterminated string parsing line at %") NPRIs _T(":%d\n"),curfilename,linecnt); else ERROR_MSG(_T("Error: error parsing line (%") NPRIs _T(":%d)\n"),curfilename,linecnt); return PS_ERROR; } parse_again: if (line.getnumtokens() < 1) return PS_OK; const TCHAR* const tokstr0 = line.gettoken_str(0); int np,op,pos; int tkid=get_commandtoken(tokstr0,&np,&op,&pos); if (tkid == -1) { const TCHAR *p=tokstr0; if (p[0] && p[_tcslen(p)-1]==_T(':')) { if (p[0] == _T('!') || (p[0] >= _T('0') && p[0] <= _T('9')) || p[0] == _T('$') || p[0] == _T('-') || p[0] == _T('+')) { ERROR_MSG(_T("Invalid label: %") NPRIs _T(" (labels cannot begin with !, $, -, +, or 0-9)\n"),tokstr0); return PS_ERROR; } extern FILE *g_output; if (preprocessonly) _ftprintf(g_output,_T("%") NPRIs _T("\n"),tokstr0); else if (add_label(tokstr0)) return PS_ERROR; line.eattoken(); goto parse_again; } #ifdef NSIS_CONFIG_PLUGIN_SUPPORT // We didn't recognise this command, could it be the name of a function exported from a dll? // Plugins cannot be called in global scope so there is no need to initialize the list first if (m_pPlugins && m_pPlugins->IsPluginCommand(tokstr0)) { np = 0; // parameters are optional op = -1; // unlimited number of optional parameters pos = -1; // placement will tested later tkid = TOK__PLUGINCOMMAND; } else #endif { #ifdef NSIS_CONFIG_PLUGIN_SUPPORT if (Plugins::IsPluginCallSyntax(tokstr0)) { if (m_pPlugins && display_warnings) m_pPlugins->PrintPluginDirs(); ERROR_MSG(_T("Plugin%") NPRIs _T(" not found, cannot call %") NPRIs _T("\n"),m_pPlugins && m_pPlugins->IsKnownPlugin(tokstr0) ? _T(" function") : _T(""),tokstr0); } else #endif ERROR_MSG(_T("Invalid command: \"%") NPRIs _T("\"\n"),tokstr0); return PS_ERROR; } } if (IsTokenPlacedRight(pos, tokstr0) != PS_OK) return PS_ERROR; int v=line.getnumtokens()-(np+1); if (v < 0 || (op >= 0 && v > op)) // opt_parms is -1 for unlimited { ERROR_MSG(_T("%") NPRIs _T(" expects %d"),tokstr0,np); if (op < 0) ERROR_MSG(_T("+")); if (op > 0) ERROR_MSG(_T("-%d"),op+np); ERROR_MSG(_T(" parameters, got %d.\n"),line.getnumtokens()-1); PRINTHELP() } int if_from_else = 0; if (tkid == TOK_P_ELSE) { if (cur_ifblock && cur_ifblock->inherited_ignore) return PS_OK; if (!num_ifblock()) { ERROR_MSG(_T("!else: no if block open (!if[macro][n][def])\n")); return PS_ERROR; } if (cur_ifblock->elseused) { ERROR_MSG(_T("!else: else already used in current if block\n")); return PS_ERROR; } if (cur_ifblock->hasexeced) { cur_ifblock->ignore++; return PS_OK; } if (line.getnumtokens() == 1) { cur_ifblock->ignore = !cur_ifblock->ignore; // if not executed up until now, it will now cur_ifblock->hasexeced++; cur_ifblock->elseused++; return PS_OK; } line.eattoken(); int v=line.gettoken_enum(0,_T("if\0ifdef\0ifndef\0ifmacrodef\0ifmacrondef\0")); if (v < 0) PRINTHELP() if (line.getnumtokens() == 1) PRINTHELP() const int cmds[] = {TOK_P_IF, TOK_P_IFDEF, TOK_P_IFNDEF, TOK_P_IFMACRODEF, TOK_P_IFMACRONDEF}; tkid = cmds[v]; if_from_else++; } if (tkid == TOK_P_IFNDEF || tkid == TOK_P_IFDEF || tkid == TOK_P_IFMACRODEF || tkid == TOK_P_IFMACRONDEF || tkid == TOK_P_IF) { if (!if_from_else) start_ifblock(); if (cur_ifblock && cur_ifblock->inherited_ignore) { return PS_OK; } int istrue=0, mod=0; if (tkid == TOK_P_IF) { res = pp_boolifyexpression(line, istrue, true); if (res != PS_OK) return res; } else { // pure left to right precedence. Not too powerful, but useful. for (int p = 1; p < line.getnumtokens(); p++) { if (p & 1) { bool new_s; if (tkid == TOK_P_IFNDEF || tkid == TOK_P_IFDEF) new_s=!!definedlist.find(line.gettoken_str(p)); else new_s=MacroExists(line.gettoken_str(p)); if (tkid == TOK_P_IFNDEF || tkid == TOK_P_IFMACRONDEF) new_s=!new_s; if (mod == 0) istrue = istrue || new_s; else istrue = istrue && new_s; } else { mod=line.gettoken_enum(p,_T("|\0&\0||\0&&\0")); if (mod == -1) PRINTHELP() mod &= 1; } } } if (istrue) { cur_ifblock->hasexeced++; cur_ifblock->ignore = 0; } else cur_ifblock->ignore++; return PS_OK; } if (tkid == TOK_P_ENDIF) { if (!num_ifblock()) { ERROR_MSG(_T("!endif: no if block open (!if[macro][n][def])\n")); return PS_ERROR; } end_ifblock(); return PS_OK; } if (!cur_ifblock || (!cur_ifblock->ignore && !cur_ifblock->inherited_ignore)) { if (preprocessonly) { extern FILE *g_output; bool pptok = is_pp_token(tkid), docmd = pptok; bool both = TOK_P_VERBOSE == tkid || TOK_P_WARNING == tkid || TOK_P_ECHO == tkid; if (TOK_P_FINALIZE == tkid || TOK_P_UNINSTFINALIZE == tkid || TOK_P_PACKEXEHEADER == tkid) docmd = false; if (docmd && is_unsafe_pp_token(tkid) && preprocessonly > 0) docmd = false; if (!docmd || both) _ftprintf(g_output,(_T("%") NPRIs _T("\n")),ppoline.get()); if (!docmd && !both) return PS_OK; } return doCommand(tkid,line); } return PS_OK; } #ifdef NSIS_FIX_DEFINES_IN_STRINGS void CEXEBuild::ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hist, bool bIgnoreDefines /*= false*/) #else void CEXEBuild::ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hist) #endif { // convert $\r, $\n to their literals // preprocessor replace ${VAR} and $%VAR% with whatever value // note that if VAR does not exist, ${VAR} or $%VAR% will go through unmodified const TCHAR *in=str; while (*in) { int add=1; TCHAR c=*in, *t=CharNext(in); if (t-in > 1) // handle multibyte chars (no escape) { linedata.add((void*)in,truncate_cast(int, (size_t)((t-in)*sizeof(TCHAR)))); in=t; continue; } in=t; if (c == _T('$')) { if (in[0] == _T('\\')) { if (in[1] == _T('r')) in+=2, c=_T('\r'); else if (in[1] == _T('n')) in+=2, c=_T('\n'); else if (in[1] == _T('t')) in+=2, c=_T('\t'); } else if (in[0] == _T('{')) { TCHAR *s=_tcsdup(in+1), *t=s; MANAGE_WITH(s, free); unsigned int bn = 0; while (*t) { if (*t == _T('{')) bn++; if (*t == _T('}') && bn-- == 0) break; t=CharNext(t); } if (*t && t!=s #ifdef NSIS_FIX_DEFINES_IN_STRINGS && !bIgnoreDefines #endif ) { *t=0; // check for defines inside the define name - ${bla${blo}} GrowBuf defname; ps_addtoline(s,defname,hist); defname.add(_T(""),sizeof(_T(""))); t=definedlist.find((TCHAR*)defname.get()); TCHAR dyndefbuf[10+1]; if (!t) { if (_T('_')==s[0] && _T('_')==s[1]) { if (!_tcscmp(s,_T("__COUNTER__"))) { static unsigned long cntr=0; _stprintf(dyndefbuf,_T("%lu"),cntr++); t=dyndefbuf; } } if (_T('U')==s[0] && _T('+')==s[1]) { TCHAR *n=s+2; UINT32 utf32=_tcstoul(n,&t,16); // We only want to accept "${U+HEXDIGITS}" and not "${U+ -HEXDIGITS }" if (*t || _T('-')==*n || _T('+')==*n) t=0; if (_T(' ')==*n || _T('\t')==*n) t=0; // TODO: _istspace()? if (!utf32) t=0; // Don't allow "${U+0}" if (t) { UINT32 codpts[]={utf32,UNICODE_REPLACEMENT_CHARACTER,'?'}; for(size_t i=0, cch; i < COUNTOF(codpts); ++i) { cch = WCFromCodePoint(dyndefbuf,COUNTOF(dyndefbuf),codpts[i]); if (cch) { dyndefbuf[cch] = _T('\0'); break; } } t=dyndefbuf; } } } if (t && hist.find((TCHAR*)defname.get(),0)<0) { in+=_tcslen(s)+2; add=0; hist.add((TCHAR*)defname.get(),0); #ifdef NSIS_FIX_DEFINES_IN_STRINGS ps_addtoline(t,linedata,hist,true); #else ps_addtoline(t,linedata,hist); #endif hist.delbypos(hist.find((TCHAR*)defname.get(),0)); } } } else if (in[0] == _T('%')) { TCHAR *s=_tcsdup(in+1); MANAGE_WITH(s, free); TCHAR *t=s; while (*t) { if (*t == _T('%')) break; t=CharNext(t); } if (*t && t!=s) { *t=0; // check for defines inside the define name - ${bla${blo}} GrowBuf defname; ps_addtoline(s,defname,hist); defname.add(_T(""),sizeof(_T(""))); t=_tgetenv((TCHAR*)defname.get()); if (t && hist.find((TCHAR*)defname.get(),0)<0) { in+=_tcslen(s)+2; add=0; hist.add((TCHAR*)defname.get(),0); #ifdef NSIS_FIX_DEFINES_IN_STRINGS ps_addtoline(t,linedata,hist,true); #else ps_addtoline(t,linedata,hist); #endif hist.delbypos(hist.find((TCHAR*)defname.get(),0)); } } } #ifdef NSIS_FIX_DEFINES_IN_STRINGS else if (in[0] == _T('$')) { if (in[1] == _T('{')) // Found $$ before - Don't replace this define { TCHAR *s=_tcsdup(in+2); MANAGE_WITH(s, free); TCHAR *t=s; unsigned int bn = 0; while (*t) { if (*t == _T('{')) bn++; if (*t == _T('}') && bn-- == 0) break; t=CharNext(t); } if (*t && t!=s) { *t=0; // add text unchanged GrowBuf defname; ps_addtoline(s,defname,hist); in++; } } else { linedata.add((void*)&c,1*sizeof(TCHAR)); in++; } } #endif } if (add) linedata.add((void*)&c,1*sizeof(TCHAR)); } } int CEXEBuild::parseScript() { assert(curlinereader); TCHAR *str = m_templinebuf; NStreamLineReader &linereader = *curlinereader; for (;;) { UINT lrres = linereader.ReadLine(str,MAX_LINELENGTH); linecnt++; if (NStream::OK != lrres) { if (linereader.IsEOF()) { if (!str[0]) break; } else { ERROR_MSG(linereader.GetErrorMessage(lrres,curfilename,linecnt).c_str()); return PS_ERROR; } } // remove trailing whitespace TCHAR *p = str; while (*p) p++; if (p > str) p--; while (p >= str && (*p == _T('\r') || *p == _T('\n') || *p == _T(' ') || *p == _T('\t'))) p--; *++p=0; StringList hist; GrowBuf linedata; #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES TCHAR *oldline = set_line_predefine(linecnt, FALSE); #endif ps_addtoline(str,linedata,hist); linedata.add(_T(""),sizeof(_T(""))); int ret=doParse((TCHAR*)linedata.get()); #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES restore_line_predefine(oldline); #endif if (ret != PS_OK) return ret; } return PS_EOF; } int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cmdname, WORD AnsiCP) // caller must free *pdata, even on error result { NIStream strm; if (!strm.OpenFileForReading(file)) { ERROR_MSG(_T("%") NPRIs _T(": open failed \"%") NPRIs _T("\"\n"),cmdname,file); print_help(cmdname); return PS_ERROR; } FILE *f=strm.GetHandle(); UINT cbBOMOffset=ftell(f); // We might be positioned after a BOM UINT32 cbFileSize=get_file_size32(f); UINT cbFileData=(invalid_file_size32 == cbFileSize) ? 0 : cbFileSize - cbBOMOffset; if (!cbFileData) { warning_fl(DW_LICENSE_EMPTY, _T("%") NPRIs _T(": empty license file \"%") NPRIs _T("\"\n"),cmdname,file); } else build_lockedunicodetarget=true; fseek(f,cbBOMOffset,SEEK_SET); UINT cbTotalData=sizeof(TCHAR)+cbFileData+sizeof(TCHAR); // SF_*+file+\0 TCHAR*data=(TCHAR*)malloc(cbTotalData); *pdata=data; // memory will be released by caller if (!data) { ERROR_MSG(_T("Internal compiler error #12345: %") NPRIs _T(" malloc(%d) failed.\n"),cmdname,cbTotalData); return PS_ERROR; } *((TCHAR*)((char*)data+cbTotalData-sizeof(TCHAR)))=_T('\0'); TCHAR*ldata=data+1; if (!strm.ReadOctets(ldata,&cbFileData)) { ERROR_MSG(_T("%") NPRIs _T(": can't read file.\n"),cmdname); return PS_ERROR; } // We have to convert the content of the license file to wchar_t const WORD srccp=strm.StreamEncoding().IsUnicode() ? strm.StreamEncoding().GetCodepage() : AnsiCP; const UINT cbcu=NStreamEncoding::GetCodeUnitSize(srccp); if (sizeof(TCHAR) < cbcu) { l_errwcconv: ERROR_MSG(_T("%") NPRIs _T(": wchar_t conversion failed!\n"),cmdname); return PS_ERROR; } // Create a fake character in the "header" part of the buffer (For DupWCFromBytes) char*lichdr=((char*)ldata) - cbcu; *((char*)lichdr)='X'; if (cbcu > 1) *((WORD*)lichdr)='X'; //BUGBUG: No room, cannot support UTF-32: if (cbcu > 2) *((UINT32*)lichdr)='X'; const bool canOptRet = (char*)data == lichdr; wchar_t*wcdata=DupWCFromBytes(lichdr,cbcu+cbFileData,srccp|(canOptRet?DWCFBF_ALLOWOPTIMIZEDRETURN:0)); if (!wcdata) goto l_errwcconv; if (wcdata != data) free(data); *pdata=data=wcdata, ldata=data+1; const bool isRTF=!memcmp(ldata,_T("{\\rtf"),5*sizeof(TCHAR)); if (isRTF) *data=SF_RTF; else *data=build_unicode ? (SF_TEXT|SF_UNICODE) : (SF_TEXT); return PS_OK; } int CEXEBuild::process_oneline(const TCHAR *line, const TCHAR *filename, int linenum, unsigned int plflags) { const TCHAR *last_filename = curfilename; int last_linecnt = linecnt; curfilename = filename, linecnt = linenum; StringList hist; GrowBuf linedata; #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES TCHAR *oldfilename = NULL, *oldtimestamp = NULL, *oldline = NULL; bool realfile = !(plflags & PLF_VIRTUALFILE); bool is_macro = (plflags & PLF_MACRO); bool setline = linenum != 0; if (setline) { if (!is_macro) { oldfilename = set_file_predefine(curfilename); if (realfile) oldtimestamp = set_timestamp_predefine(curfilename); } oldline = set_line_predefine(linecnt, is_macro); } #endif ps_addtoline(line,linedata,hist); linedata.add(_T(""),sizeof(_T(""))); int ret = doParse((TCHAR*)linedata.get()); #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES if (setline) { if (!is_macro) { restore_file_predefine(oldfilename); if (realfile) restore_timestamp_predefine(oldtimestamp); } restore_line_predefine(oldline); } #endif curfilename = last_filename, linecnt = last_linecnt; return ret; } int CEXEBuild::process_jump(LineParser &line, int wt, int *offs) { const TCHAR *s=line.gettoken_str(wt); int v; if (!_tcsicmp(s,_T("0")) || !_tcsicmp(s,_T(""))) *offs=0; else if ((v=GetUserVarIndex(line, wt))>=0) { *offs=-v-1; // to jump to a user variable target, -variable_index-1 is stored. } else { if ((s[0] == _T('-') || s[0] == _T('+')) && !_ttoi(s+1)) { ERROR_MSG(_T("Error: Goto targets beginning with '+' or '-' must be followed by nonzero integer (relative jump)\n")); return 1; } if ((s[0] >= _T('0') && s[0] <= _T('9')) || s[0] == _T('$') || s[0] == _T('!')) { ERROR_MSG(_T("Error: Goto targets cannot begin with 0-9, $, !\n")); return 1; } *offs=ns_label.add(s,0); } return 0; } #define SECTION_FIELD_GET(field) (FIELD_OFFSET(section, field)/sizeof(int)) #define SECTION_FIELD_SET(field) (-1 - (int)(FIELD_OFFSET(section, field)/sizeof(int))) #define INVALIDREGROOT ( (HKEY) (UINT_PTR) 0x8000baad ) static HKEY ParseRegRootKey(LineParser &line, int tok) { static const TCHAR *rootkeys[2] = { _T("HKCR\0HKLM\0HKCU\0HKU\0HKCC\0HKDD\0HKPD\0SHCTX\0HKCR32\0HKCR64\0HKCU32\0HKCU64\0HKLM32\0HKLM64\0HKCRANY\0HKCUANY\0HKLMANY\0SHCTX32\0SHCTX64\0SHCTXANY\0"), _T("HKEY_CLASSES_ROOT\0HKEY_LOCAL_MACHINE\0HKEY_CURRENT_USER\0HKEY_USERS\0HKEY_CURRENT_CONFIG\0HKEY_DYN_DATA\0HKEY_PERFORMANCE_DATA\0SHELL_CONTEXT\0") }; static const HKEY rootkey_tab[] = { HKEY_CLASSES_ROOT,HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER,HKEY_USERS,HKEY_CURRENT_CONFIG,HKEY_DYN_DATA,HKEY_PERFORMANCE_DATA,HKSHCTX,HKCR32,HKCR64,HKCU32,HKCU64,HKLM32,HKLM64,HKCRANY,HKCUANY,HKLMANY,HKSHCTX32,HKSHCTX64,HKSHCTXANY }; int k = line.gettoken_enum(tok, rootkeys[0]); if (k == -1) k = line.gettoken_enum(tok, rootkeys[1]); return k == -1 ? INVALIDREGROOT : rootkey_tab[k]; } #define AFIE_LASTUSED ( -1 ) int CEXEBuild::add_flag_instruction_entry(int which_token, int opcode, LineParser &line, int offset, int data) { entry ent = { opcode, }; switch(opcode) { case EW_SETFLAG: ent.offsets[0] = offset; if (data != AFIE_LASTUSED) ent.offsets[1] = data; else ent.offsets[2] = 1; if (display_script) SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1)); return add_entry(&ent); case EW_IFFLAG: if (process_jump(line, 1, &ent.offsets[0]) || process_jump(line, 2, &ent.offsets[1])) PRINTHELP() ent.offsets[2]=offset; ent.offsets[3]=data; if (display_script) SCRIPT_MSG(_T("%") NPRIs _T(" ?%") NPRIs _T(":%") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1), line.gettoken_str(2)); return add_entry(&ent); case EW_GETFLAG: if ((ent.offsets[0] = GetUserVarIndex(line, 1)) < 0) PRINTHELP(); ent.offsets[1] = offset; if (display_script) SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1)); return add_entry(&ent); } return PS_ERROR; } int CEXEBuild::doCommand(int which_token, LineParser &line) { #ifdef NSIS_CONFIG_PLUGIN_SUPPORT if (PS_OK != initialize_default_plugins()) return PS_ERROR; #endif multiple_entries_instruction=0; entry ent={0,}; switch (which_token) { // macro stuff /////////////////////////////////////////////////////////////////////////////// case TOK_P_MACRO: return pp_macro(line); case TOK_P_MACROEND: return (ERROR_MSG(_T("!macroend: no macro currently open.\n")), PS_ERROR); case TOK_P_MACROUNDEF: return pp_macroundef(line); case TOK_P_INSERTMACRO: return pp_insertmacro(line); // preprocessor files fun /////////////////////////////////////////////////////////////////////////////// case TOK_P_TEMPFILE: return pp_tempfile(line); case TOK_P_DELFILE: return pp_delfile(line); case TOK_P_APPENDFILE: return pp_appendfile(line); case TOK_P_APPENDMEMFILE: return pp_appendmemfile(line); case TOK_P_GETDLLVERSION: case TOK_P_GETTLBVERSION: return pp_getversion(which_token, line); // page ordering stuff /////////////////////////////////////////////////////////////////////////////// #ifdef NSIS_CONFIG_VISIBLE_SUPPORT case TOK_UNINSTPAGE: set_uninstall_mode(1); case TOK_PAGE: { if (!uninstall_mode) { enable_last_page_cancel = 0; if (!_tcsicmp(line.gettoken_str(line.getnumtokens()-1),_T("/ENABLECANCEL"))) enable_last_page_cancel = 1; } else { uenable_last_page_cancel = 0; if (!_tcsicmp(line.gettoken_str(line.getnumtokens()-1),_T("/ENABLECANCEL"))) uenable_last_page_cancel = 1; } int k = line.gettoken_enum(1,_T("custom\0license\0components\0directory\0instfiles\0uninstConfirm\0")); if (k < 0) PRINTHELP(); if (add_page(k) != PS_OK) return PS_ERROR; #ifndef NSIS_SUPPORT_CODECALLBACKS if (!k) { ERROR_MSG(_T("Error: custom page specified, NSIS_SUPPORT_CODECALLBACKS not defined.\n")); return PS_ERROR; } #endif //~ NSIS_SUPPORT_CODECALLBACKS if (k) { // not custom #ifdef NSIS_SUPPORT_CODECALLBACKS switch (line.getnumtokens() - enable_last_page_cancel) { case 6: PRINTHELP(); case 5: if (*line.gettoken_str(4)) cur_page->leavefunc = ns_func.add(line.gettoken_str(4),0); case 4: if (*line.gettoken_str(3)) cur_page->showfunc = ns_func.add(line.gettoken_str(3),0); case 3: if (*line.gettoken_str(2)) cur_page->prefunc = ns_func.add(line.gettoken_str(2),0); } #endif //~ NSIS_SUPPORT_CODECALLBACKS } #ifdef NSIS_SUPPORT_CODECALLBACKS else { // a custom page switch (line.getnumtokens() - enable_last_page_cancel) { case 6: PRINTHELP(); case 5: cur_page->caption = add_string(line.gettoken_str(4)); case 4: if (*line.gettoken_str(3)) cur_page->leavefunc = ns_func.add(line.gettoken_str(3),0); case 3: if (*line.gettoken_str(2)) cur_page->prefunc = ns_func.add(line.gettoken_str(2),0); break; case 2: ERROR_MSG(_T("Error: custom page must have a creator function!\n")); PRINTHELP(); } } #endif //~ NSIS_SUPPORT_CODECALLBACKS SCRIPT_MSG(_T("%") NPRIs _T("Page: %") NPRIs, uninstall_mode?_T("Uninst"):_T(""), line.gettoken_str(1)); #ifdef NSIS_SUPPORT_CODECALLBACKS if (cur_page->prefunc>=0) SCRIPT_MSG(_T(" (%") NPRIs _T(":%") NPRIs _T(")"), k?_T("pre"):_T("creator"), line.gettoken_str(2)); if (cur_page->showfunc>=0 && k) SCRIPT_MSG(_T(" (show:%") NPRIs _T(")"), line.gettoken_str(3)); if (cur_page->leavefunc>=0) SCRIPT_MSG(_T(" (leave:%") NPRIs _T(")"), line.gettoken_str(4-!k)); else if (cur_page->caption && !k) SCRIPT_MSG(_T(" (caption:%") NPRIs _T(")"), line.gettoken_str(3)); #endif SCRIPT_MSG(_T("\n")); page_end(); if (k == PAGE_INSTFILES) { add_page(PAGE_COMPLETED); page_end(); } set_uninstall_mode(0); } return PS_OK; case TOK_PAGEEX: // extended page setting { int k = line.gettoken_enum(1,_T("custom\0license\0components\0directory\0instfiles\0uninstConfirm\0")); if (k < 0) { k = line.gettoken_enum(1,_T("un.custom\0un.license\0un.components\0un.directory\0un.instfiles\0un.uninstConfirm\0")); if (k < 0) PRINTHELP(); set_uninstall_mode(1); } SCRIPT_MSG(_T("PageEx: %") NPRIs _T("\n"), line.gettoken_str(1)); if (add_page(k) != PS_OK) return PS_ERROR; cur_page->flags |= PF_PAGE_EX; } return PS_OK; case TOK_PAGEEXEND: { SCRIPT_MSG(_T("PageExEnd\n")); #ifdef NSIS_SUPPORT_CODECALLBACKS if (cur_page_type == PAGE_CUSTOM && !cur_page->prefunc) { ERROR_MSG(_T("Error: custom pages must have a creator function.\n")); return PS_ERROR; } #endif page_end(); if (cur_page_type == PAGE_INSTFILES) { add_page(PAGE_COMPLETED); page_end(); } set_uninstall_mode(0); } return PS_OK; case TOK_PAGECALLBACKS: #ifdef NSIS_SUPPORT_CODECALLBACKS { SCRIPT_MSG(_T("PageCallbacks:")); if (cur_page_type == PAGE_CUSTOM) { switch (line.getnumtokens()) { case 4: PRINTHELP(); case 3: { if (*line.gettoken_str(2)) { if (_tcsnicmp(line.gettoken_str(2), _T("un."), 3)) { if (uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } else { if (!uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } cur_page->leavefunc = ns_func.add(line.gettoken_str(2),0); } } case 2: { if (*line.gettoken_str(1)) { if (_tcsnicmp(line.gettoken_str(1), _T("un."), 3)) { if (uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } else { if (!uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } cur_page->prefunc = ns_func.add(line.gettoken_str(1),0); } } } } else { switch (line.getnumtokens()) { case 4: { if (*line.gettoken_str(3)) { if (_tcsnicmp(line.gettoken_str(3), _T("un."), 3)) { if (uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } else { if (!uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } cur_page->leavefunc = ns_func.add(line.gettoken_str(3),0); } } case 3: { if (*line.gettoken_str(2)) { if (_tcsnicmp(line.gettoken_str(2), _T("un."), 3)) { if (uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } else { if (!uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } cur_page->showfunc = ns_func.add(line.gettoken_str(2),0); } } case 2: { if (*line.gettoken_str(1)) { if (_tcsnicmp(line.gettoken_str(1), _T("un."), 3)) { if (uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } else { if (!uninstall_mode) { ERROR_MSG(_T("\nError: function names must start with \"un.\" in an uninstall page.\n")); return PS_ERROR; } } cur_page->prefunc = ns_func.add(line.gettoken_str(1),0); } } } } int custom = cur_page_type == PAGE_CUSTOM ? 1 : 0; if (cur_page->prefunc>=0) SCRIPT_MSG(_T(" %") NPRIs _T(":%") NPRIs, !custom?_T("pre"):_T("creator"), line.gettoken_str(1)); if (cur_page->showfunc>=0 && !custom) SCRIPT_MSG(_T(" show:%") NPRIs, line.gettoken_str(2)); if (cur_page->leavefunc>=0) SCRIPT_MSG(_T(" leave:%") NPRIs, line.gettoken_str(3-custom)); SCRIPT_MSG(_T("\n")); } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_CODECALLBACKS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_CODECALLBACKS #else case TOK_PAGE: case TOK_UNINSTPAGE: case TOK_PAGEEX: case TOK_PAGEEXEND: case TOK_PAGECALLBACKS: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_VISIBLE_SUPPORT // header flags /////////////////////////////////////////////////////////////////////////////// case TOK_LANGSTRING: { TCHAR *name = line.gettoken_str(1); LANGID lang = ParseLangIdParameter(line, 2); TCHAR *str = line.gettoken_str(3); const int ret = SetLangString(name, lang, str); if (ret == PS_WARNING) warning_fl(DW_LANGSTRING_MULTISETWASTE, _T("LangString \"%") NPRIs _T("\" set multiple times for %d, wasting space"), name, lang); else if (ret == PS_ERROR) { ERROR_MSG(_T("Error: can't set LangString \"%") NPRIs _T("\"!\n"), name); return PS_ERROR; } SCRIPT_MSG(_T("LangString: \"%") NPRIs _T("\" %d \"%") NPRIs _T("\"\n"), name, lang, str); } return PS_OK; case TOK_LANGSTRINGUP: SCRIPT_MSG(_T("Error: LangStringUP is obsolete, there are no more unprocessed strings. Use LangString.\n")); return PS_ERROR; case TOK_LICENSELANGSTRING: { const TCHAR *cmdnam = get_commandtoken_name(which_token); #ifdef NSIS_CONFIG_SILENT_SUPPORT if (build_header.flags&(CH_FLAGS_SILENT|CH_FLAGS_SILENT_LOG)) warning_fl(DW_LANGSTRING_SILENTLICENSE, _T("%") NPRIs _T(": SilentInstall enabled, wasting space"), cmdnam); #endif TCHAR *name = line.gettoken_str(1); LANGID lang = ParseLangIdParameter(line, 2); TCHAR *file = line.gettoken_str(3), *data = NULL; MANAGE_WITH(data, free); LanguageTable *pLT = GetLangTable(lang); WORD acp = pLT ? pLT->nlf.m_uCodePage : CP_ACP; int ret = LoadLicenseFile(file, &data, cmdnam, acp); if (ret != PS_OK) return ret; ret = SetLangString(name, lang, data, true); if (ret == PS_WARNING) warning_fl(DW_LANGSTRING_MULTISETWASTE, _T("%") NPRIs _T(" \"%") NPRIs _T("\" set multiple times for %d, wasting space"), cmdnam, name, lang); else if (ret == PS_ERROR) { ERROR_MSG(_T("Error: can't set %") NPRIs _T(" \"%") NPRIs _T("\"!\n"), cmdnam, name); return PS_ERROR; } SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" %d \"%") NPRIs _T("\"\n"), cmdnam, name, lang, file); return PS_OK; } return PS_OK; case TOK_NAME: { if (SetInnerString(NLF_NAME,line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); tstring da; const TCHAR *normstr = line.gettoken_str(1), *dastr = line.gettoken_str(2); if (!*dastr && _tcschr(normstr,_T('&'))) dastr = (da = replace_all(normstr,_T("&"),_T("&&"))).c_str(); SetInnerString(NLF_NAME_DA,dastr); SCRIPT_MSG(_T("Name: \"%") NPRIs _T("\""),line.gettoken_str(1)); if (*line.gettoken_str(2)) SCRIPT_MSG(_T(" \"%") NPRIs _T("\""),line.gettoken_str(2)); SCRIPT_MSG(_T("\n")); } return PS_OK; case TOK_CAPTION: { if (!cur_page) { if (SetInnerString(NLF_CAPTION,line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } else { cur_page->caption = add_string(line.gettoken_str(1)); } SCRIPT_MSG(_T("Caption: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_ICON: SCRIPT_MSG(_T("Icon: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); try { free_loaded_icon(installer_icon); installer_icon = load_icon(line.gettoken_str(1)); } catch (exception& err) { ERROR_MSG(_T("Error while loading icon from \"%") NPRIs _T("\": %") NPRIs _T("\n"), line.gettoken_str(1), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; #ifdef NSIS_CONFIG_COMPONENTPAGE case TOK_CHECKBITMAP: SCRIPT_MSG(_T("CheckBitmap: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); try { init_res_editor(); int err = update_bitmap(res_editor, IDB_BITMAP1, line.gettoken_str(1), 96, 16, 8); if (err) { switch (err) { case -1: ERROR_MSG(_T("Error: can't find bitmap\n")); break; case -2: ERROR_MSG(_T("Error: invalid bitmap file - corrupted or not a bitmap\n")); break; case -3: ERROR_MSG(_T("Error: bitmap isn't 96x16 in size\n")); break; case -4: ERROR_MSG(_T("Error: bitmap has more than 8bpp\n")); break; } return PS_ERROR; } } catch (exception& err) { ERROR_MSG(_T("Error while replacing bitmap: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; #else case TOK_CHECKBITMAP: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPONENTPAGE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_COMPONENTPAGE case TOK_DIRTEXT: #ifdef NSIS_CONFIG_VISIBLE_SUPPORT { if (!cur_page) { if (SetInnerString(NLF_DIR_TEXT, line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); if (line.getnumtokens() > 2) SetInnerString(NLF_DIR_SUBTEXT, line.gettoken_str(2)); if (line.getnumtokens() > 3) SetInnerString(NLF_BTN_BROWSE, line.gettoken_str(3)); if (line.getnumtokens() > 4) SetInnerString(NLF_DIR_BROWSETEXT, line.gettoken_str(4)); } else { if (cur_page_type != PAGE_DIRECTORY) { ERROR_MSG(_T("Error: DirText can only be used inside PageEx directory.\n")); return PS_ERROR; } cur_page->parms[0] = add_string(line.gettoken_str(1)); if (line.getnumtokens() > 2) cur_page->parms[1] = add_string(line.gettoken_str(2)); if (line.getnumtokens() > 3) cur_page->parms[2] = add_string(line.gettoken_str(3)); if (line.getnumtokens() > 4) cur_page->parms[3] = add_string(line.gettoken_str(4)); } SCRIPT_MSG(_T("DirText: \"%") NPRIs _T("\" \"%") NPRIs _T("\" \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_VISIBLE_SUPPORT case TOK_DIRVAR: { if (cur_page_type != PAGE_DIRECTORY && cur_page_type != PAGE_UNINSTCONFIRM) { ERROR_MSG(_T("Error: can't use DirVar outside of PageEx directory|uninstConfirm.\n")); return PS_ERROR; } cur_page->parms[4] = GetUserVarIndex(line, 1) + 1; if (cur_page->parms[4] <= 0) PRINTHELP(); SCRIPT_MSG(_T("DirVar: %") NPRIs _T("\n"), line.gettoken_str(1)); } return PS_OK; case TOK_DIRVERIFY: { if (cur_page_type != PAGE_DIRECTORY) { ERROR_MSG(_T("Error: can't use DirVerify outside of PageEx directory.\n")); return PS_ERROR; } cur_page->flags &= ~PF_DIR_NO_BTN_DISABLE; int k = line.gettoken_enum(1,_T("auto\0leave\0")); if (k == -1) PRINTHELP(); if (k) cur_page->flags |= PF_DIR_NO_BTN_DISABLE; SCRIPT_MSG(_T("DirVerify: %") NPRIs _T("\n"), line.gettoken_str(1)); } return PS_OK; case TOK_GETINSTDIRERROR: return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(instdir_error)); #ifdef NSIS_CONFIG_COMPONENTPAGE case TOK_COMPTEXT: { if (!cur_page) { if (SetInnerString(NLF_COMP_TEXT, line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); if (line.getnumtokens() > 2) SetInnerString(NLF_COMP_SUBTEXT1, line.gettoken_str(2)); if (line.getnumtokens() > 3) SetInnerString(NLF_COMP_SUBTEXT2, line.gettoken_str(3)); } else { if (cur_page_type != PAGE_COMPONENTS) { ERROR_MSG(_T("Error: ComponentText can only be used inside PageEx components.\n")); return PS_ERROR; } cur_page->parms[0] = add_string(line.gettoken_str(1)); cur_page->parms[1] = add_string(line.gettoken_str(2)); cur_page->parms[2] = add_string(line.gettoken_str(3)); cur_page->parms[3] = cur_page->parms[1]; cur_page->parms[4] = cur_page->parms[2]; } SCRIPT_MSG(_T("ComponentText: \"%") NPRIs _T("\" \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); } return PS_OK; case TOK_INSTTYPE: { int x; if (!_tcsicmp(line.gettoken_str(1),_T("/NOCUSTOM"))) { build_header.flags|=CH_FLAGS_NO_CUSTOM; SCRIPT_MSG(_T("InstType: disabling custom %") NPRIs _T("install type\n"), _T("")); } else if (!_tcsicmp(line.gettoken_str(1),_T("/UNINSTNOCUSTOM"))) { build_uninst.flags|=CH_FLAGS_NO_CUSTOM; SCRIPT_MSG(_T("InstType: disabling custom %") NPRIs _T("install type\n"), _T("un")); } else if (!_tcsicmp(line.gettoken_str(1),_T("/COMPONENTSONLYONCUSTOM"))) { build_header.flags|=CH_FLAGS_COMP_ONLY_ON_CUSTOM; SCRIPT_MSG(_T("InstType: making components viewable only on custom %") NPRIs _T("install type\n"), _T("")); } else if (!_tcsicmp(line.gettoken_str(1),_T("/UNINSTCOMPONENTSONLYONCUSTOM"))) { build_uninst.flags|=CH_FLAGS_COMP_ONLY_ON_CUSTOM; SCRIPT_MSG(_T("InstType: making components viewable only on custom %") NPRIs _T("install type\n"), _T("un")); } else if (!_tcsnicmp(line.gettoken_str(1),_T("/CUSTOMSTRING="),14)) { SCRIPT_MSG(_T("InstType: setting custom text to: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)+14); if (SetInnerString(NLF_COMP_CUSTOM,line.gettoken_str(1)+14) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),_T("InstType /CUSTOMSTRING")); } else if (line.gettoken_str(1)[0]==_T('/')) { PRINTHELP() } else { const TCHAR *itname = line.gettoken_str(1), *defname = line.gettoken_str(2), setdef = *defname, *eqstr = setdef ? _T("=") : _T(""); if (!_tcsnicmp(itname, _T("un."), 3)) set_uninstall_mode(1), itname += 3; for (x = 0; x < NSIS_MAX_INST_TYPES && cur_header->install_types[x]; x++); if (x == NSIS_MAX_INST_TYPES) { ERROR_MSG(_T("InstType: no more than %d install types allowed. %d specified\n"), NSIS_MAX_INST_TYPES, NSIS_MAX_INST_TYPES + 1); return PS_ERROR; } else { cur_header->install_types[x] = add_string(itname); if (setdef) definedlist.set_si32(defname, x); SCRIPT_MSG(_T("InstType: %") NPRIs _T("\"%") NPRIs _T("\" (%") NPRIs _T("%") NPRIs _T("%d)\n"), uninstall_mode ? _T("(uninstall) ") : _T(""), itname, defname, eqstr, x); } set_uninstall_mode(0); } } return PS_OK; #else case TOK_COMPTEXT: case TOK_INSTTYPE: ERROR_MSG(_T("Error: %") NPRIs _T(" specified but NSIS_CONFIG_COMPONENTPAGE not defined\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_LICENSEPAGE case TOK_LICENSETEXT: { if (!cur_page) { if (SetInnerString(NLF_LICENSE_TEXT, line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); SetInnerString(NLF_LICENSE_TEXT_FSRB, line.gettoken_str(1)); SetInnerString(NLF_LICENSE_TEXT_FSCB, line.gettoken_str(1)); if (line.getnumtokens() > 2) SetInnerString(NLF_BTN_LICENSE, line.gettoken_str(2)); } else { if (cur_page_type != PAGE_LICENSE) { ERROR_MSG(_T("Error: LicenseText can only be used inside PageEx license.\n")); return PS_ERROR; } cur_page->parms[0] = add_string(line.gettoken_str(1)); cur_page->next = add_string(line.gettoken_str(2)); } SCRIPT_MSG(_T("LicenseText: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } return PS_OK; case TOK_LICENSEDATA: { const TCHAR *cmdnam = get_commandtoken_name(which_token); int idx = 0; TCHAR *file = line.gettoken_str(1), *data = NULL, *filedata = NULL; MANAGE_WITH(filedata, free); WORD wincp = CP_ACP; if (file[0] == _T('$') && file[1] == _T('(')) { TCHAR *cp = _tcsdup(file+2); MANAGE_WITH(cp, free); TCHAR *p = _tcschr(cp, _T(')')); if (p && p[1] == 0) { // if string is only a language str identifier *p = 0; idx = DefineLangString(cp, 0); } data = file; } if (!idx) { int ret = LoadLicenseFile(file, &filedata, cmdnam, wincp); if (ret != PS_OK) return ret; data = filedata; } if (!cur_page) { if (SetInnerString(NLF_LICENSE_DATA,data) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),cmdnam); } else { if (cur_page_type != PAGE_LICENSE) { ERROR_MSG(_T("Error: LicenseData can only be used inside PageEx license.\n")); return PS_ERROR; } cur_page->parms[1] = add_string(data, false, wincp); } SCRIPT_MSG(_T("LicenseData: \"%") NPRIs _T("\"\n"),file); } return PS_OK; case TOK_LICENSEFORCESELECTION: { int k=line.gettoken_enum(1,_T("off\0checkbox\0radiobuttons\0")); if (k == -1) PRINTHELP() if (k < line.getnumtokens() - 2) PRINTHELP() if (!cur_page) { switch (line.getnumtokens()) { case 4: SetInnerString(NLF_BTN_LICENSE_DISAGREE, line.gettoken_str(3)); case 3: SetInnerString(NLF_BTN_LICENSE_AGREE, line.gettoken_str(2)); break; } switch (k) { case 0: license_res_id = IDD_LICENSE; break; case 1: license_res_id = IDD_LICENSE_FSCB; break; case 2: license_res_id = IDD_LICENSE_FSRB; break; } } else { if (cur_page_type != PAGE_LICENSE) { ERROR_MSG(_T("Error: LicenseForceSelection can only be used inside PageEx license.\n")); return PS_ERROR; } switch (line.getnumtokens()) { case 4: cur_page->parms[3] = add_string(line.gettoken_str(3)); case 3: cur_page->parms[2] = add_string(line.gettoken_str(2)); break; } cur_page->flags &= ~(PF_LICENSE_FORCE_SELECTION | PF_LICENSE_NO_FORCE_SELECTION); switch (k) { case 0: cur_page->dlg_id = IDD_LICENSE; cur_page->flags |= PF_LICENSE_NO_FORCE_SELECTION; break; case 1: cur_page->dlg_id = IDD_LICENSE_FSCB; cur_page->flags |= PF_LICENSE_FORCE_SELECTION; break; case 2: cur_page->dlg_id = IDD_LICENSE_FSRB; cur_page->flags |= PF_LICENSE_FORCE_SELECTION; break; } } SCRIPT_MSG(_T("LicenseForceSelection: %") NPRIs _T(" \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"), line.gettoken_str(1), line.gettoken_str(2), line.gettoken_str(3)); } return PS_OK; case TOK_LICENSEBKCOLOR: { const TCHAR *cmdname = _T("LicenseBkColor"), *paramname; TCHAR *p = line.gettoken_str(1), *p2; if (!_tcsicmp(p,paramname = _T("/windows")) || !_tcsicmp(p,_T("/window"))) { build_header.license_bg=-COLOR_WINDOW; SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"),cmdname,paramname); } else if (!_tcsicmp(p,paramname = _T("/grey")) || !_tcsicmp(p,_T("/gray"))) { build_header.license_bg=-COLOR_BTNFACE; /* Note: This might not actually be gray */ SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"),cmdname,paramname); } else { const int v=_tcstoul(p,&p2,16); if (p2 == p) return PS_ERROR; build_header.license_bg=((v&0xff)<<16)|(v&0xff00)|((v&0xff0000)>>16); SCRIPT_MSG(_T("%") NPRIs _T(": %06X\n"),cmdname,v); } build_uninst.license_bg=build_header.license_bg; } return PS_OK; #else case TOK_LICENSETEXT: case TOK_LICENSEDATA: case TOK_LICENSEBKCOLOR: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_LICENSEPAGE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_LICENSEPAGE #ifdef NSIS_CONFIG_SILENT_SUPPORT case TOK_SILENTINST: { int k=line.gettoken_enum(1,_T("normal\0silent\0silentlog\0")); if (k<0) PRINTHELP() #ifndef NSIS_CONFIG_LOG if (k == 2) { ERROR_MSG(_T("SilentInstall: silentlog specified, no log support compiled in (use NSIS_CONFIG_LOG)\n")); return PS_ERROR; } #endif //~ NSIS_CONFIG_LOG SCRIPT_MSG(_T("SilentInstall: %") NPRIs _T("\n"),line.gettoken_str(1)); #ifdef NSIS_CONFIG_LICENSEPAGE if (k && HasUserDefined(NLF_LICENSE_DATA)) { warning_fl(DW_LANGSTRING_SILENTLICENSE, _T("SilentInstall: LicenseData already specified. wasting space")); } if (k) { build_header.flags|=CH_FLAGS_SILENT; if (k == 2) build_header.flags|=CH_FLAGS_SILENT_LOG; } else { build_header.flags&=~CH_FLAGS_SILENT; build_header.flags&=~CH_FLAGS_SILENT_LOG; } #endif //~ NSIS_CONFIG_LICENSEPAGE } return PS_OK; case TOK_SILENTUNINST: #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT { int k=line.gettoken_enum(1,_T("normal\0silent\0")); if (k<0) PRINTHELP() if (k) build_uninst.flags|=CH_FLAGS_SILENT; else build_uninst.flags&=~CH_FLAGS_SILENT; SCRIPT_MSG(_T("SilentUnInstall: %") NPRIs _T("\n"),line.gettoken_str(1)); } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif case TOK_IFSILENT: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(silent), ~0); //new value mask - keep flag case TOK_SETSILENT: ent.offsets[1] = line.gettoken_enum(1,_T("normal\0silent\0")); if (ent.offsets[1] < 0 ) PRINTHELP() return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(silent), add_intstring(ent.offsets[1])); #else case TOK_SILENTINST: case TOK_SILENTUNINST: case TOK_IFSILENT: case TOK_SETSILENT: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_SILENT_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_SILENT_SUPPORT case TOK_IFRTLLANG: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(rtl), ~0); //new value mask - keep flag case TOK_OUTFILE: my_strncpy(build_output_filename,line.gettoken_str(1),COUNTOF(build_output_filename)); SCRIPT_MSG(_T("OutFile: \"%") NPRIs _T("\"\n"),build_output_filename); return PS_OK; case TOK_INSTDIR: { TCHAR *p = line.gettoken_str(1); if (build_header.install_directory_ptr) { warning_fl(DW_STRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times. wasting space"),line.gettoken_str(0)); } build_header.install_directory_ptr = add_string(p); build_header.install_directory_auto_append = 0; TCHAR *p2 = p + _tcslen(p); if (*p && *CharPrev(p, p2) != _T('\\')) { // we risk hitting $\r or something like $(bla\ad) or ${bla\ad} here, but it's better // than hitting backslashes in processed strings while (p2 > p && *p2 != _T('\\')) p2 = CharPrev(p, p2); if (*p2 == _T('\\')) { build_header.install_directory_auto_append = add_string(p2 + 1); } } SCRIPT_MSG(_T("InstallDir: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_INSTALLDIRREGKEY: // InstallDirRegKey { if (build_header.install_reg_key_ptr) warning_fl(DW_STRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); HKEY hRK = ParseRegRootKey(line,1); if (INVALIDREGROOT == hRK) PRINTHELP() if (HKSHCTX == hRK) PRINTHELP() // SHCTX is invalid here if (IsRegRootkeyForcedView(hRK)) PRINTHELP() // 32|64 views are also invalid build_header.install_reg_rootkey=REGROOTKEYTOINT(hRK); build_header.install_reg_key_ptr = add_string(line.gettoken_str(2),0); if (line.gettoken_str(2)[0] == _T('\\')) warning_fl(DW_PARSE_REGPATHPREFIX, _T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); build_header.install_reg_value_ptr = add_string(line.gettoken_str(3),0); SCRIPT_MSG(_T("InstallRegKey: \"%") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); } return PS_OK; case TOK_CRCCHECK: build_crcchk=line.gettoken_enum(1,_T("off\0on\0force\0")); if (build_crcchk==-1) PRINTHELP() SCRIPT_MSG(_T("CRCCheck: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_INSTPROGRESSFLAGS: { int smooth=0; build_header.flags&=~CH_FLAGS_PROGRESS_COLORED; for (int x = 1; x < line.getnumtokens(); x++) { if (!_tcsicmp(line.gettoken_str(x),_T("smooth"))) smooth=1; else if (!_tcsicmp(line.gettoken_str(x),_T("colored"))) build_header.flags|=CH_FLAGS_PROGRESS_COLORED; else PRINTHELP() } try { init_res_editor(); BYTE* dlg = res_editor->GetResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG); if (!dlg) throw runtime_error("IDD_INSTFILES doesn't exist!"); CDialogTemplate dt(dlg,build_unicode,uDefCodePage); res_editor->FreeResource(dlg); DialogItemTemplate* progress = dt.GetItem(IDC_PROGRESS); if (!progress) throw runtime_error("IDC_PROGRESS doesn't exist!"); if (smooth) progress->dwStyle |= PBS_SMOOTH; else progress->dwStyle &= ~PBS_SMOOTH; DWORD dwSize; dlg = dt.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG, dlg, dwSize); dt.FreeSavedTemplate(dlg); } catch (exception& err) { ERROR_MSG(_T("Error setting smooth progress bar: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } SCRIPT_MSG(_T("InstProgressFlags: smooth=%d, colored=%d\n"),smooth, !!(build_header.flags&CH_FLAGS_PROGRESS_COLORED)); } return PS_OK; case TOK_AUTOCLOSE: { int k=line.gettoken_enum(1,_T("false\0true\0")); if (k == -1) PRINTHELP(); if (k) build_header.flags|=CH_FLAGS_AUTO_CLOSE; else build_header.flags&=~CH_FLAGS_AUTO_CLOSE; SCRIPT_MSG(_T("AutoCloseWindow: %") NPRIs _T("\n"),k?_T("true"):_T("false")); } return PS_OK; case TOK_WINDOWICON: #ifdef NSIS_CONFIG_VISIBLE_SUPPORT disable_window_icon=line.gettoken_enum(1,_T("on\0off\0")); if (disable_window_icon == -1) PRINTHELP(); SCRIPT_MSG(_T("WindowIcon: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_VISIBLE_SUPPORT case TOK_SHOWDETAILSUNINST: #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT ERROR_MSG(_T("Error: ShowUninstDetails specified but NSIS_CONFIG_UNINSTALL_SUPPORT not defined\n")); return PS_ERROR; #endif case TOK_SHOWDETAILS: { int k=line.gettoken_enum(1,_T("hide\0show\0nevershow\0")); if (k == -1) PRINTHELP() #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (which_token == TOK_SHOWDETAILSUNINST) { build_uninst.flags&=~(CH_FLAGS_DETAILS_NEVERSHOW|CH_FLAGS_DETAILS_SHOWDETAILS); if (k==1) build_uninst.flags|=CH_FLAGS_DETAILS_SHOWDETAILS; else if (k==2) build_uninst.flags|=CH_FLAGS_DETAILS_NEVERSHOW; } else #endif { build_header.flags&=~(CH_FLAGS_DETAILS_NEVERSHOW|CH_FLAGS_DETAILS_SHOWDETAILS); if (k==1) build_header.flags|=CH_FLAGS_DETAILS_SHOWDETAILS; else if (k==2) build_header.flags|=CH_FLAGS_DETAILS_NEVERSHOW; } SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"),line.gettoken_str(0),line.gettoken_str(1)); } return PS_OK; case TOK_DIRSHOW: /*{ int k=line.gettoken_enum(1,_T("show\0hide\0")); if (k < 0) PRINTHELP(); if (k) build_header.flags|=CH_FLAGS_DIR_NO_SHOW; else build_header.flags&=~CH_FLAGS_DIR_NO_SHOW; SCRIPT_MSG(_T("DirShow: %") NPRIs _T("\n"),k?_T("hide"):_T("show")); }*/ ERROR_MSG(_T("Error: DirShow doesn't currently work\n")); return PS_ERROR; case TOK_ROOTDIRINST: { int k=line.gettoken_enum(1,_T("true\0false\0")); if (k == -1) PRINTHELP(); if (k) build_header.flags|=CH_FLAGS_NO_ROOT_DIR; else build_header.flags&=~CH_FLAGS_NO_ROOT_DIR; SCRIPT_MSG(_T("AllowRootDirInstall: %") NPRIs _T("\n"),k?_T("false"):_T("true")); } return PS_OK; case TOK_BGFONT: #ifndef NSIS_SUPPORT_BGBG ERROR_MSG(_T("Error: BGFont specified but NSIS_SUPPORT_BGBG not defined\n")); return PS_ERROR; #else // NSIS_SUPPORT_BGBG if (line.getnumtokens()==1) { memcpy(&bg_font,&bg_default_font,sizeof(LOGFONT)); SCRIPT_MSG(_T("BGFont: default font\n")); return PS_OK; } LOGFONT newfont; newfont.lfHeight=40; newfont.lfWidth=0; newfont.lfEscapement=0, newfont.lfOrientation=0; newfont.lfWeight=FW_NORMAL; newfont.lfItalic=newfont.lfUnderline=newfont.lfStrikeOut=FALSE; newfont.lfCharSet=DEFAULT_CHARSET; newfont.lfOutPrecision=OUT_DEFAULT_PRECIS; newfont.lfClipPrecision=CLIP_DEFAULT_PRECIS; newfont.lfQuality=DEFAULT_QUALITY; newfont.lfPitchAndFamily=DEFAULT_PITCH; my_strncpy(newfont.lfFaceName,line.gettoken_str(1),LF_FACESIZE); SCRIPT_MSG(_T("BGFont: \"%") NPRIs _T("\""),line.gettoken_str(1)); { bool height=false, weight=false; for (int i = 2; i < line.getnumtokens(); i++) { TCHAR *tok=line.gettoken_str(i); if (tok[0]==_T('/')) { if (!_tcsicmp(tok,_T("/ITALIC"))) { SCRIPT_MSG(_T(" /ITALIC")); newfont.lfItalic=TRUE; } else if (!_tcsicmp(tok,_T("/UNDERLINE"))) { SCRIPT_MSG(_T(" /UNDERLINE")); newfont.lfUnderline=TRUE; } else if (!_tcsicmp(tok,_T("/STRIKE"))) { SCRIPT_MSG(_T(" /STRIKE")); newfont.lfStrikeOut=TRUE; } else { SCRIPT_MSG(_T("\n")); PRINTHELP(); } } else { if (!height) { SCRIPT_MSG(_T(" height=%") NPRIs,tok); newfont.lfHeight=line.gettoken_int(i); height=true; } else if (!weight) { SCRIPT_MSG(_T(" weight=%") NPRIs,tok); newfont.lfWeight=line.gettoken_int(i); weight=true; } else { SCRIPT_MSG(_T("\n")); PRINTHELP(); } } } } SCRIPT_MSG(_T("\n")); memcpy(&bg_font, &newfont, sizeof(LOGFONT)); return PS_OK; #endif //~ NSIS_SUPPORT_BGBG case TOK_BGGRADIENT: #ifndef NSIS_SUPPORT_BGBG ERROR_MSG(_T("Error: BGGradient specified but NSIS_SUPPORT_BGBG not defined\n")); return PS_ERROR; #else // NSIS_SUPPORT_BGBG if (line.getnumtokens()==1) { SCRIPT_MSG(_T("BGGradient: default colors\n")); build_header.bg_color1=0; build_header.bg_color2=RGB(0,0,255); } else if (!_tcsicmp(line.gettoken_str(1),_T("off"))) { build_header.bg_color1=build_header.bg_color2=build_header.bg_textcolor=-1; SCRIPT_MSG(_T("BGGradient: off\n")); if (line.getnumtokens()>2) PRINTHELP() } else { TCHAR *p = line.gettoken_str(1); int v1,v2,v3=-1; v1=_tcstoul(p,&p,16); build_header.bg_color1=((v1&0xff)<<16)|(v1&0xff00)|((v1&0xff0000)>>16); p=line.gettoken_str(2); v2=_tcstoul(p,&p,16); build_header.bg_color2=((v2&0xff)<<16)|(v2&0xff00)|((v2&0xff0000)>>16); p=line.gettoken_str(3); if (*p) { if (!_tcsicmp(p,_T("notext"))) build_header.bg_textcolor=-1; else { v3=_tcstoul(p,&p,16); build_header.bg_textcolor=((v3&0xff)<<16)|(v3&0xff00)|((v3&0xff0000)>>16); } } SCRIPT_MSG(_T("BGGradient: 0x%06X->0x%06X (text=0x%06X)\n"),v1,v2,v3); } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT build_uninst.bg_color1=build_header.bg_color1; build_uninst.bg_color2=build_header.bg_color2; build_uninst.bg_textcolor=build_header.bg_textcolor; #endif //~ NSIS_CONFIG_UNINSTALL_SUPPORT #endif //~ NSIS_SUPPORT_BGBG return PS_OK; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT case TOK_INSTCOLORS: { TCHAR *p = line.gettoken_str(1); if (p[0]==_T('/')) { if (_tcsicmp(p,_T("/windows")) || line.getnumtokens()!=2) PRINTHELP() build_header.lb_fg=build_header.lb_bg=-1; SCRIPT_MSG(_T("InstallColors: windows default colors\n")); } else { if (line.getnumtokens()!=3) PRINTHELP() int v1=_tcstoul(p,&p,16); build_header.lb_fg=((v1&0xff)<<16)|(v1&0xff00)|((v1&0xff0000)>>16); p=line.gettoken_str(2); int v2=_tcstoul(p,&p,16); build_header.lb_bg=((v2&0xff)<<16)|(v2&0xff00)|((v2&0xff0000)>>16); SCRIPT_MSG(_T("InstallColors: fg=%06X bg=%06X\n"),v1,v2); } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT build_uninst.lb_fg=build_header.lb_fg; build_uninst.lb_bg=build_header.lb_bg; #endif } return PS_OK; case TOK_XPSTYLE: { int k=line.gettoken_enum(1,_T("on\0off\0")); if (k == -1) PRINTHELP() SCRIPT_MSG(_T("XPStyle: %") NPRIs _T("\n"), line.gettoken_str(1)); manifest_comctl = !k ? manifest::comctl_xp : manifest::comctl_old; } return PS_OK; case TOK_CHANGEUI: try { DWORD dwSize; int k=line.gettoken_enum(1, _T("all\0IDD_LICENSE\0IDD_DIR\0IDD_SELCOM\0IDD_INST\0IDD_INSTFILES\0IDD_UNINST\0IDD_VERIFY\0IDD_LICENSE_FSRB\0IDD_LICENSE_FSCB\0")); if (k<0) PRINTHELP(); unsigned long uifilesize; BYTE *uifiledata = alloc_and_read_file(line.gettoken_str(2), uifilesize); if (!uifiledata) { ERROR_MSG(_T("Error: Can't read \"%") NPRIs _T("\"!\n"), line.gettoken_str(2)); return PS_ERROR; } MANAGE_WITH(uifiledata, free); CResourceEditor *uire = new CResourceEditor(uifiledata, uifilesize); init_res_editor(); // Search for required items #define CUISEARCHERR(n,v) ERROR_MSG(_T("Error: Can't find %") NPRIs _T(" (%u) in the custom UI!\n"), n, v); #define GET(x) if (!(dlg = uire->GetResource(RT_DIALOG, x, uire->ANYLANGID))) { CUISEARCHERR(_T(#x), x); return PS_ERROR; } CDialogTemplate UIDlg(dlg, build_unicode, uDefCodePage); #define SEARCH(x) if (!UIDlg.GetItem(x)) { CUISEARCHERR(_T(#x), x); uire->FreeResource(dlg); delete uire; return PS_ERROR; } #define SAVE(x) uire->FreeResource(dlg); dlg = UIDlg.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, x, NSIS_DEFAULT_LANG, dlg, dwSize); UIDlg.FreeSavedTemplate(dlg); LPBYTE dlg = NULL; if (k == 0 || k == 1) { GET(IDD_LICENSE); SEARCH(IDC_EDIT1); SAVE(IDD_LICENSE); } if (k == 0 || k == 2) { GET(IDD_DIR); SEARCH(IDC_DIR); SEARCH(IDC_BROWSE); #ifdef NSIS_CONFIG_LOG SEARCH(IDC_CHECK1); #endif SAVE(IDD_DIR); } if (k == 0 || k == 3) { GET(IDD_SELCOM); SEARCH(IDC_TREE1); SEARCH(IDC_COMBO1); SAVE(IDD_SELCOM); } if (k == 0 || k == 4) { GET(IDD_INST); SEARCH(IDC_BACK); SEARCH(IDC_CHILDRECT); SEARCH(IDC_VERSTR); SEARCH(IDOK); SEARCH(IDCANCEL); // Search for bitmap holder (default for SetBrandingImage) branding_image_found = false; DialogItemTemplate* dlgItem = 0; for (int i = 0; (dlgItem = UIDlg.GetItemByIdx(i)); i++) { bool check = false; if (IS_INTRESOURCE(dlgItem->szClass)) { if (dlgItem->szClass == MAKEINTRESOURCEWINW(0x0082)) { check = true; } } else check = WinWStrICmpASCII(dlgItem->szClass, "Static") == 0; if (check) { if ((dlgItem->dwStyle & SS_BITMAP) == SS_BITMAP) { branding_image_found = true; branding_image_id = dlgItem->wId; break; } } } SAVE(IDD_INST); } if (k == 0 || k == 5) { GET(IDD_INSTFILES); SEARCH(IDC_LIST1); SEARCH(IDC_PROGRESS); SEARCH(IDC_SHOWDETAILS); SAVE(IDD_INSTFILES); } if (k == 0 || k == 6) { GET(IDD_UNINST); SEARCH(IDC_EDIT1); SAVE(IDD_UNINST); } if (k == 0 || k == 7) { GET(IDD_VERIFY); SEARCH(IDC_STR); SAVE(IDD_VERIFY); } if (k == 0 || k == 8) { GET(IDD_LICENSE_FSRB); SEARCH(IDC_EDIT1); SEARCH(IDC_LICENSEAGREE); SEARCH(IDC_LICENSEDISAGREE); SAVE(IDD_LICENSE_FSRB); } if (k == 0 || k == 9) { GET(IDD_LICENSE_FSCB); SEARCH(IDC_EDIT1); SEARCH(IDC_LICENSEAGREE); SAVE(IDD_LICENSE_FSCB); } delete uire; SCRIPT_MSG(_T("ChangeUI: %") NPRIs _T(" %") NPRIs _T("%") NPRIs _T("\n"), line.gettoken_str(1), line.gettoken_str(2), branding_image_found?_T(" (branding image holder found)"):_T("")); } catch (exception& err) { ERROR_MSG(_T("Error while changing UI: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; case TOK_ADDBRANDINGIMAGE: try { LAYOUTUNIT whtype, padtype; int k = line.gettoken_enum(1,_T("top\0left\0bottom\0right\0")), defpadding = 2; int wh = ParseLayoutUnit(line.gettoken_str(2), whtype); if (k == -1) PRINTHELP(); int padding = (line.getnumtokens() >= 4) ? ParseLayoutUnit(line.gettoken_str(3), padtype) : (padtype = whtype, defpadding); if (whtype == LU_INVALID || whtype != padtype) throw runtime_error("Invalid number!"); init_res_editor(); BYTE* dlg = res_editor->GetResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG); CDialogTemplate dt(dlg, build_unicode, uDefCodePage); res_editor->FreeResource(dlg); if (whtype != LU_DIALOG && !CDialogTemplate::SupportsDialogUnitComputation()) throw runtime_error("Must use dialog units on non-Win32 platforms!"); DialogItemTemplate brandingCtl = {0,}; brandingCtl.dwStyle = SS_BITMAP | WS_CHILD | WS_VISIBLE; brandingCtl.sX = brandingCtl.sY = padding; brandingCtl.szClass = MAKEINTRESOURCEWINW(0x0082); brandingCtl.szTitle = NULL; brandingCtl.wId = IDC_BRANDIMAGE; brandingCtl.sHeight = brandingCtl.sWidth = wh; if (whtype == LU_PIXEL) dt.PixelsToDlgUnits(brandingCtl.sWidth, brandingCtl.sHeight); if (k%2) { // left (1) / right (3) if (k & 2) // right brandingCtl.sX += dt.GetWidth(); else // left dt.MoveAll(brandingCtl.sWidth + (padding * 2), 0); dt.Resize(brandingCtl.sWidth + (padding * 2), 0); brandingCtl.sHeight = dt.GetHeight() - (padding * 2); } else { // top (0) / bottom (2) if (k & 2) // bottom brandingCtl.sY += dt.GetHeight(); else // top dt.MoveAll(0, brandingCtl.sHeight + (padding * 2)); dt.Resize(0, brandingCtl.sHeight + (padding * 2)); brandingCtl.sWidth = dt.GetWidth() - (padding * 2); } dt.AddItem(brandingCtl); DWORD dwDlgSize; dlg = dt.Save(dwDlgSize); res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwDlgSize); dt.FreeSavedTemplate(dlg); if (whtype == LU_PIXEL) dt.DlgUnitsToPixels(brandingCtl.sWidth, brandingCtl.sHeight); const char* unitstr = whtype == LU_PIXEL ? "pixels" : "dialog units"; SCRIPT_MSG(_T("AddBrandingImage: %") NPRIs _T(" %ux%u %") NPRIns _T("\n"), line.gettoken_str(1), brandingCtl.sWidth, brandingCtl.sHeight, unitstr); branding_image_found = true; branding_image_id = IDC_BRANDIMAGE; } catch (exception& err) { ERROR_MSG(_T("Error while adding image branding support: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; case TOK_SETFONT: { unsigned char failed = 0; if (!_tcsnicmp(line.gettoken_str(1), _T("/LANG="), 6)) { LANGID lang_id = ParseLangId(line.gettoken_str(1) + 6); LanguageTable *table = GetLangTable(lang_id); const TCHAR*facename = line.gettoken_str(2); table->nlf.m_szFont = _tcsdup(facename); table->nlf.m_iFontSize = line.gettoken_int(3); if (table->nlf.m_szFont) SCRIPT_MSG(_T("SetFont: lang=%d \"%") NPRIs _T("\" %") NPRIs _T("\n"), lang_id, facename, line.gettoken_str(3)); else ++failed; } else { const TCHAR*facename = line.gettoken_str(1); my_strncpy(build_font, facename, COUNTOF(build_font)); build_font_size = line.gettoken_int(2); if (!failed) SCRIPT_MSG(_T("SetFont: \"%") NPRIs _T("\" %") NPRIs _T("\n"), facename, line.gettoken_str(2)); } if (failed) { ERROR_MSG(_T("Error: Unable to convert font name\n")); return PS_ERROR; } } return PS_OK; #else case TOK_INSTCOLORS: case TOK_XPSTYLE: case TOK_CHANGEUI: case TOK_ADDBRANDINGIMAGE: case TOK_SETFONT: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_VISIBLE_SUPPORT case TOK_PEADDRESOURCE: { init_res_editor(); int tokidx = 1, ovr = 0, rep = 0, result = PS_ERROR; if (!_tcsicmp(line.gettoken_str(tokidx), _T("/OVERWRITE"))) // Update the resource even if it exists ++ovr, ++tokidx; else if (!_tcsicmp(line.gettoken_str(tokidx), _T("/REPLACE"))) // Only update existing resource ++rep, ++tokidx; const TCHAR *rt = line.gettoken_str(tokidx+1), *rnraw = line.gettoken_str(tokidx+2), *rlraw = line.gettoken_str(tokidx+3); if (!*rlraw) rlraw = _T("Default"); // Language parameter is optional LANGID rl = res_editor->ParseResourceTypeNameLangString(&rt, &rnraw, rlraw), foundrl; if (rl == CResourceEditor::INVALIDLANGID || rl == CResourceEditor::ALLLANGID) PRINTHELP(); WORD rn = (WORD)(size_t) rnraw; assert(!CResourceEditor::EditorSupportsStringNames()); bool exists = res_editor->ResourceExists(rt, rn, rl, &foundrl); if (rl == CResourceEditor::ANYLANGID) rl = exists ? foundrl : NSIS_DEFAULT_LANG; if ((rep && !exists) || (!ovr && exists)) { ERROR_MSG(_T("Error: Resource %") NPRIns _T("\n"), rep ? ("does not exist") : ("already exists")); return PS_ERROR; } if (res_editor->UpdateResourceFromExternal(rt, rn, rl, line.gettoken_str(tokidx+0), CResourceEditor::TM_AUTO)) { SCRIPT_MSG(_T("PEAddResource: %") NPRIs _T("=%") NPRIs _T("\n"), make_friendly_resource_path(rt, rnraw, rl).c_str(), line.gettoken_str(tokidx+0)); result = PS_OK; } return result; } return PS_OK; case TOK_PEREMOVERESOURCE: { init_res_editor(); int tokidx = 1, noerr = 0; if (!_tcsicmp(line.gettoken_str(tokidx), _T("/NOERRORS"))) ++noerr, ++tokidx; const TCHAR *rt = line.gettoken_str(tokidx+0), *rnraw = line.gettoken_str(tokidx+1), *rlraw = line.gettoken_str(tokidx+2); LANGID rl = res_editor->ParseResourceTypeNameLangString(&rt, &rnraw, rlraw); if (rl == CResourceEditor::INVALIDLANGID || rl == CResourceEditor::ANYLANGID) PRINTHELP(); WORD rn = (WORD)(size_t) rnraw; assert(!CResourceEditor::EditorSupportsStringNames()); if (!noerr && !res_editor->ResourceExists(rt, rn, rl)) { ERROR_MSG(_T("Error: Resource %") NPRIns _T("\n"), ("does not exist")); return PS_ERROR; } if (res_editor->DeleteResource(rt, rn, rl, CResourceEditor::TM_AUTO)) SCRIPT_MSG(_T("PERemoveResource: %") NPRIs _T("\n"), make_friendly_resource_path(rt, rnraw, rl).c_str()); else if (!noerr) return PS_ERROR; } return PS_OK; case TOK_PEDLLCHARACTERISTICS: { int s1, s2; WORD add = (WORD)line.gettoken_int(1, &s1), del = (WORD)line.gettoken_int(2, &s2), org = PEDllCharacteristics; if (!s1 || !s2) PRINTHELP(); PEDllCharacteristics &= ~del, PEDllCharacteristics |= add; SCRIPT_MSG(_T("PEDllCharacteristics: 0x%.4x -> 0x%.4x\n"), org, PEDllCharacteristics); } return PS_OK; case TOK_PESUBSYSVER: { unsigned int mj, mi; if (2 == _stscanf(line.gettoken_str(1), _T("%u.%u"), &mj, &mi)) if (mj <= 0xffff && mi <= 0xffff) return (PESubsysVerMaj = (WORD) mj, PESubsysVerMin = (WORD) mi, PS_OK); } PRINTHELP(); return PS_ERROR; case TOK_REQEXECLEVEL: switch (line.gettoken_enum(1,_T("none\0user\0highest\0admin\0"))) { case 0: manifest_exec_level = manifest::exec_level_none; break; case 1: manifest_exec_level = manifest::exec_level_user; break; case 2: manifest_exec_level = manifest::exec_level_highest; break; case 3: manifest_exec_level = manifest::exec_level_admin; break; default: PRINTHELP(); } return PS_OK; case TOK_MANIFEST_APPENDCUSTOMSTRING: if (!manifest::addappendstring(line.gettoken_str(1), line.gettoken_str(2))) PRINTHELP(); return PS_OK; case TOK_MANIFEST_DPIAWARE: switch(line.gettoken_enum(1,_T("none\0notset\0false\0true\0system\0permonitor\0explorer\0"))) { case 0: // A lot of attributes use "none" so we support that along with the documented value case 1: manifest_dpiaware = manifest::dpiaware_notset; break; case 2: manifest_dpiaware = manifest::dpiaware_false; break; case 3: // "True" == "System DPI" case 4: manifest_dpiaware = manifest::dpiaware_true; break; case 5: manifest_dpiaware = manifest::dpiaware_permonitor; break; case 6: manifest_dpiaware = manifest::dpiaware_explorer; break; default: PRINTHELP(); } return PS_OK; case TOK_MANIFEST_DPIAWARENESS: manifest_dpiawareness = line.gettoken_str(1); return PS_OK; case TOK_MANIFEST_LPAWARE: switch(line.gettoken_enum(1,_T("none\0notset\0true\0false\0"))) { case 0: // A lot of attributes use "none" so we support that along with the documented value case 1: manifest_lpaware = manifest::lpaware_notset; break; case 2: manifest_lpaware = manifest::lpaware_true; break; case 3: manifest_lpaware = manifest::lpaware_false; break; default: PRINTHELP(); } return PS_OK; case TOK_MANIFEST_SUPPORTEDOS: { manifest_sosl.deleteall(); if (2 == line.getnumtokens()) switch(line.gettoken_enum(1,_T("none\0all\0"))) { case 0: return PS_OK; case 1: return manifest_sosl.addall() ? PS_OK : PS_ERROR; } for(int argi = 1; argi < line.getnumtokens(); ++argi) if (!manifest_sosl.append(line.gettoken_str(argi))) PRINTHELP(); } return PS_OK; case TOK_MANIFEST_MAXVERSIONTESTED: manifest_maxversiontested = line.gettoken_enum(1, _T("none\0notset\0")) == -1 ? line.gettoken_str(1) : _T(""); return PS_OK; case TOK_MANIFEST_DISABLEWINDOWFILTERING: switch(line.gettoken_enum(1,_T("notset\0false\0true"))) { case 0: case 1: manifest_flags &= ~manifest::disablewindowfiltering; break; case 2: manifest_flags |= manifest::disablewindowfiltering; break; default: PRINTHELP(); } return PS_OK; case TOK_MANIFEST_GDISCALING: switch(line.gettoken_enum(1,_T("notset\0false\0true"))) { case 0: case 1: manifest_flags &= ~manifest::gdiscaling; break; case 2: manifest_flags |= manifest::gdiscaling; break; default: PRINTHELP(); } return PS_OK; #ifdef _UNICODE case TOK_TARGET: { const TCHAR *cmdnam = get_commandtoken_name(which_token); CEXEBuild::TARGETTYPE tt = get_target_type(line.gettoken_str(1)); if (CEXEBuild::TARGET_UNKNOWN == tt) { print_bad_targettype_parameter(cmdnam); return PS_ERROR; } if (m_target_type != tt && PS_OK != change_target_architecture(tt)) { ERROR_MSG(_T("Error: Unable to set target %") NPRIs _T(" (adequate stub not found?)\n"), _T("architecture")); return PS_ERROR; } SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), cmdnam, get_target_suffix(tt)); } return PS_OK; case TOK_TARGETCPU: { int k = line.gettoken_enum(1, _T("x86\0amd64\0x64\0")); if (-1 == k) PRINTHELP(); CEXEBuild::TARGETTYPE tt = TARGET_AMD64; if (0 == k) tt = m_previous_x86_unicode ? TARGET_X86UNICODE : TARGET_X86ANSI; if (m_target_type != tt && PS_OK != change_target_architecture(tt)) { ERROR_MSG(_T("Error: Unable to set target %") NPRIs _T(" (adequate stub not found?)\n"), _T("architecture")); return PS_ERROR; } SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1)); } return PS_OK; case TOK_TARGETUNICODE: { int k = line.gettoken_enum(1, _T("false\0true\0")); if (-1 == k) PRINTHELP(); CEXEBuild::TARGETTYPE tt = k ? (TARGET_X86ANSI == m_target_type ? TARGET_X86UNICODE : m_target_type) : TARGET_X86ANSI; if (tt != m_target_type && (build_compressor_set | build_lockedunicodetarget)) { ERROR_MSG(_T("Error: Can't change target %") NPRIs _T(" after data already got compressed or header already changed!\n"), _T("charset")); return PS_ERROR; } SCRIPT_MSG(_T("Unicode: %") NPRIs _T("\n"), k ? _T("true") : _T("false")); if (is_targettype_64bit(tt) != is_targettype_64bit(m_target_type) || PS_OK != change_target_architecture(tt)) { ERROR_MSG(_T("Error: Unable to set target %") NPRIs _T(" (adequate stub not found?)\n"), _T("charset")); return PS_ERROR; } } return PS_OK; #endif //~ _UNICODE // Ability to change compression methods from within the script case TOK_SETCOMPRESSOR: #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT { if (build_compressor_set) { ERROR_MSG(_T("Error: can't change compressor after data already got compressed or header already changed!\n")); return PS_ERROR; } if (build_compressor_final) { warning_fl(DW_COMP_FINAL, _T("SetCompressor ignored due to previous call with the /FINAL switch")); return PS_OK; } build_compress_whole = false; int a = 1; while (line.gettoken_str(a)[0] == _T('/')) { if (!_tcsicmp(line.gettoken_str(a),_T("/FINAL"))) build_compressor_final = true, a++; else if (!_tcsicmp(line.gettoken_str(a),_T("/SOLID"))) build_compress_whole = true, a++; else PRINTHELP(); } if (a != line.getnumtokens() - 1) { ERROR_MSG(_T("%") NPRIs _T(" expects %d parameters, got %d.\n"), line.gettoken_str(0), a + 1, line.getnumtokens()); PRINTHELP(); } int k=line.gettoken_enum(a, _T("zlib\0bzip2\0lzma\0")); switch (k) { case 0: compressor = &zlib_compressor; break; case 1: compressor = &bzip2_compressor; break; case 2: compressor = &lzma_compressor; break; default: PRINTHELP(); } tstring compressor_name = line.gettoken_str(a); compressor_name = lowercase(compressor_name); if (set_compressor(compressor_name, build_compress_whole) != PS_OK) { SCRIPT_MSG(_T("SetCompressor: error loading stub for \"%") NPRIs _T("\" compressor.\n"), compressor_name.c_str()); return PS_ERROR; } SCRIPT_MSG(_T("SetCompressor: %") NPRIs _T("%") NPRIs _T("%") NPRIs _T("\n"), build_compressor_final ? _T("/FINAL ") : _T(""), build_compress_whole ? _T("/SOLID ") : _T(""), line.gettoken_str(a)); } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPRESSION_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_COMPRESSION_SUPPORT case TOK_LOADNLF: { SCRIPT_MSG(_T("LoadLanguageFile: %") NPRIs _T("\n"), line.gettoken_str(1)); LanguageTable *table = LoadLangFile(line.gettoken_str(1)); if (!table) return PS_ERROR; if (!defcodepage_set) { uDefCodePage = table->nlf.m_uCodePage; defcodepage_set = true; } last_used_lang = table->lang_id; // define LANG_LangName as "####" (lang id), for example ${LANG_ENGLISH} = 1033 TCHAR lang_id[16], lang_cp[16], lang_def[1024]; wsprintf(lang_def, _T("LANG_%") NPRIs, table->nlf.m_szName); wsprintf(lang_id, _T("%u"), table->lang_id); definedlist.add(lang_def, lang_id); wsprintf(lang_def, _T("LANG_%") NPRIs _T("_CP"), table->nlf.m_szName); wsprintf(lang_cp, _T("%u"), table->nlf.m_uCodePage); definedlist.add(lang_def, lang_cp); } return PS_OK; // preprocessor-ish (ifdef/ifndef/else/endif are handled one step out from here) /////////////////////////////////////////////////////////////////////////////// case TOK_P_DEFINE: return pp_define(line); case TOK_P_UNDEF: return pp_undef(line); case TOK_P_PACKEXEHEADER: return pp_packhdr(line); case TOK_P_FINALIZE: case TOK_P_UNINSTFINALIZE: return pp_finalize(which_token, line); case TOK_P_SYSTEMEXEC: case TOK_P_EXECUTE: case TOK_P_MAKENSIS: return pp_execute(which_token, line); case TOK_P_ADDINCLUDEDIR: return pp_addincludedir(line); case TOK_P_INCLUDE: return pp_include(line); case TOK_P_CD: return pp_cd(line); case TOK_P_PRAGMA: return parse_pragma(line) == PS_ERROR ? PS_ERROR : PS_OK; case TOK_P_ERROR: ERROR_MSG(_T("!error: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_ERROR; case TOK_P_WARNING: warning_fl(DIAGCODE_INTERNAL_HIDEDIAGCODE, _T("!warning: %") NPRIs,line.gettoken_str(1)); return PS_OK; case TOK_P_ECHO: SCRIPT_MSG(_T("%") NPRIs _T(" (%") NPRIs _T(":%d)\n"), line.gettoken_str(1),curfilename,linecnt); return PS_OK; case TOK_P_ASSERT: return pp_assert(line); case TOK_P_SEARCHPARSESTRING: return pp_searchparsestring(line); case TOK_P_SEARCHREPLACESTRING: return pp_searchreplacestring(line); case TOK_P_VERBOSE: return pp_verbose(line); case TOK_UNINSTALLEXENAME: PRINTHELP() #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT case TOK_UNINSTCAPTION: { if (SetInnerString(NLF_UCAPTION,line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); SCRIPT_MSG(_T("UninstCaption: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_UNINSTICON: SCRIPT_MSG(_T("UninstallIcon: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); try { free_loaded_icon(uninstaller_icon); uninstaller_icon = load_icon(line.gettoken_str(1)); } catch (exception& err) { ERROR_MSG(_T("Error while loading icon from \"%") NPRIs _T("\": %") NPRIs _T("\n"), line.gettoken_str(1), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; case TOK_UNINSTTEXT: { if (!cur_page) { if (SetInnerString(NLF_UNINST_TEXT, line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); SetInnerString(NLF_UNINST_SUBTEXT, line.gettoken_str(2)); } else { if (cur_page_type != PAGE_UNINSTCONFIRM) { ERROR_MSG(_T("Error: UninstallText can only be used inside PageEx uninstConfirm.\n")); return PS_ERROR; } cur_page->parms[0] = add_string(line.gettoken_str(1)); cur_page->parms[1] = add_string(line.gettoken_str(2)); } SCRIPT_MSG(_T("UninstallText: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } return PS_OK; case TOK_UNINSTSUBCAPTION: { int succ, w=line.gettoken_int(1,&succ); if (!succ || w < 0 || w > 2) PRINTHELP() SetInnerString(NLF_USUBCAPTION_CONFIRM+w,line.gettoken_str(2)); SCRIPT_MSG(_T("UninstSubCaption: page:%d, text=%") NPRIs _T("\n"),w,line.gettoken_str(2)); } return PS_OK; case TOK_WRITEUNINSTALLER: { if (uninstall_mode) { ERROR_MSG(_T("WriteUninstaller only valid from install, not from uninstall.\n")); PRINTHELP() } uninstaller_writes_used++; ent.which=EW_WRITEUNINSTALLER; ent.offsets[0]=add_string(line.gettoken_str(1)); tstring full = tstring(_T("$INSTDIR\\")) + tstring(line.gettoken_str(1)); ent.offsets[3]=add_string(full.c_str()); // ent.offsets[1] and ent.offsets[2] are set in CEXEBuild::uninstall_generate() if (!ent.offsets[0]) PRINTHELP() SCRIPT_MSG(_T("WriteUninstaller: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); DefineInnerLangString(NLF_ERR_CREATING); DefineInnerLangString(NLF_CREATED_UNINST); } return add_entry(&ent); #else //! NSIS_CONFIG_UNINSTALL_SUPPORT case TOK_WRITEUNINSTALLER: case TOK_UNINSTCAPTION: case TOK_UNINSTICON: case TOK_UNINSTTEXT: case TOK_UNINSTSUBCAPTION: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif // section/function stuff /////////////////////////////////////////////////////////////////////////////// case TOK_SECTION: { int a = 1, unselected = 0; if (!_tcsicmp(line.gettoken_str(1),_T("/o"))) unselected++, a++; else if (line.getnumtokens() > 3) PRINTHELP(); SCRIPT_MSG(_T("Section: \"%") NPRIs _T("\""),line.gettoken_str(a)); if (line.gettoken_str(a+1)[0]) SCRIPT_MSG(_T(" ->(%") NPRIs _T(")"),line.gettoken_str(a+1)); SCRIPT_MSG(_T("\n")); #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT if (!_tcsicmp(line.gettoken_str(a),_T("uninstall"))) { ERROR_MSG(_T("Error: Uninstall section declared, no NSIS_CONFIG_UNINSTALL_SUPPORT\n")); return PS_ERROR; } #endif int ret = add_section(line.gettoken_str(a),line.gettoken_str(a+1)); if (PS_OK == ret && unselected) build_cursection->flags &= ~SF_SELECTED; return ret; } case TOK_SECTIONEND: SCRIPT_MSG(_T("SectionEnd\n")); return section_end(); case TOK_SECTIONINSTTYPE: // 0 based case TOK_SECTIONIN: // Legacy 1 based instruction { int zerobased = which_token == TOK_SECTIONINSTTYPE, itid, succ; const TCHAR *cmdname = get_commandtoken_name(which_token); SCRIPT_MSG(_T("%") NPRIs _T(": "), cmdname); for (int ti = 0; ++ti < line.getnumtokens();) { const TCHAR *p = line.gettoken_str(ti); if (!_tcsicmp(p, _T("RO"))) { if (section_add_flags(SF_RO) != PS_OK) return PS_ERROR; SCRIPT_MSG(_T("[RO] ")); } else { itid = line.gettoken_int(ti, &succ) - (zerobased ? 0 : 1); if (succ && itid >= 0 && itid < NSIS_MAX_INST_TYPES) { if (section_add_install_type(1<(%") NPRIs _T(")"),line.gettoken_str(a+1)); SCRIPT_MSG(_T("\n")); return add_section(buf,line.gettoken_str(a+1),ex); } case TOK_FUNCTION: if (!line.gettoken_str(1)[0]) PRINTHELP() if (line.gettoken_str(1)[0]==_T(':') || line.gettoken_str(1)[0]==_T('/')) { ERROR_MSG(_T("Function: function name cannot begin with : or /.\n")); PRINTHELP() } SCRIPT_MSG(_T("Function: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT if (!_tcsnicmp(line.gettoken_str(1),_T("un."),3)) { ERROR_MSG(_T("Error: Uninstall function declared, no NSIS_CONFIG_UNINSTALL_SUPPORT\n")); return PS_ERROR; } #endif return add_function(line.gettoken_str(1)); case TOK_FUNCTIONEND: SCRIPT_MSG(_T("FunctionEnd\n")); return function_end(); // flag setters /////////////////////////////////////////////////////////////////////////////// case TOK_ALLOWSKIPFILES: build_allowskipfiles=line.gettoken_enum(1,_T("off\0on\0")); if (build_allowskipfiles==-1) PRINTHELP() SCRIPT_MSG(_T("AllowSkipFiles: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_SETDATESAVE: build_datesave=line.gettoken_enum(1,_T("off\0on\0")); if (build_datesave==-1) PRINTHELP() SCRIPT_MSG(_T("SetDateSave: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_SETOVERWRITE: { int k=line.gettoken_enum(1,_T("on\0off\0try\0ifnewer\0ifdiff\0lastused\0")); if (k==-1) PRINTHELP() if (k==5) k=build_overwrite, build_overwrite=build_last_overwrite, build_last_overwrite=k; else build_last_overwrite=build_overwrite, build_overwrite=k; SCRIPT_MSG(_T("SetOverwrite: %") NPRIs _T("\n"),line.gettoken_str(1)); } return PS_OK; #ifdef NSIS_CONFIG_PLUGIN_SUPPORT case TOK_SETPLUGINUNLOAD: build_plugin_unload=line.gettoken_enum(1,_T("manual\0alwaysoff\0")); if (build_plugin_unload==-1) PRINTHELP() SCRIPT_MSG(_T("SetPluginUnload: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; #endif //~ NSIS_CONFIG_PLUGIN_SUPPORT case TOK_SETCOMPRESS: build_compress=line.gettoken_enum(1,_T("off\0auto\0force\0")); if (build_compress==-1) PRINTHELP() if (build_compress==0 && build_compress_whole) warning_fl(DW_COMP_WHOLE_IGNORE_OFF, _T("'SetCompress off' encountered, and in whole compression mode. Effectively ignored.")); SCRIPT_MSG(_T("SetCompress: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_DBOPTIMIZE: build_optimize_datablock=line.gettoken_enum(1,_T("off\0on\0")); if (build_optimize_datablock==-1) PRINTHELP() SCRIPT_MSG(_T("SetDatablockOptimize: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_FILEBUFSIZE: build_filebuflen=line.gettoken_int(1); build_filebuflen<<=20; if (build_filebuflen<=0) { ERROR_MSG(_T("Error: FileBufSize: invalid buffer size -- %d\n"),build_filebuflen); return PS_ERROR; } SCRIPT_MSG(_T("FileBufSize: %") NPRIs _T("mb (%d bytes)\n"),line.gettoken_str(1),build_filebuflen); return PS_OK; #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT case TOK_SETCOMPRESSIONLEVEL: { if (compressor == &lzma_compressor) warning_fl(DW_COMP_LEVEL_IGNORE, _T("SetCompressionLevel: compressor is set to LZMA. Effectively ignored.")); if (build_compressor_set && build_compress_whole) warning_fl(DW_COMP_LEVEL_IGNORE, _T("SetCompressionLevel: data already compressed in compress whole mode. Effectively ignored.")); int s; build_compress_level=line.gettoken_int(1,&s); if (!s || build_compress_level < 0 || build_compress_level > 9) PRINTHELP(); SCRIPT_MSG(_T("SetCompressionLevel: %u\n"), build_compress_level); } return PS_OK; case TOK_SETCOMPRESSORDICTSIZE: { if (compressor != &lzma_compressor) warning_fl(DW_COMP_DICT_IGNORE, _T("SetCompressorDictSize: compressor is not set to LZMA. Effectively ignored.")); if (build_compressor_set && build_compress_whole) warning_fl(DW_COMP_DICT_IGNORE, _T("SetCompressorDictSize: data already compressed in compress whole mode. Effectively ignored.")); int s; build_compress_dict_size=line.gettoken_int(1,&s); if (!s) PRINTHELP(); SCRIPT_MSG(_T("SetCompressorDictSize: %u mb\n"), build_compress_dict_size); build_compress_dict_size <<= 20; } return PS_OK; #else case TOK_SETCOMPRESSIONLEVEL: case TOK_SETCOMPRESSORDICTSIZE: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPRESSION_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_COMPRESSION_SUPPORT case TOK_ADDSIZE: { int succ, size_kb=line.gettoken_int(1,&succ); if (!succ) PRINTHELP() SCRIPT_MSG(_T("AddSize: %d kb\n"),size_kb); section_add_size_kb(size_kb); } return PS_OK; case TOK_SUBCAPTION: { int succ, w=line.gettoken_int(1,&succ); if (!succ || w < 0 || w > 4) PRINTHELP() SetInnerString(NLF_SUBCAPTION_LICENSE+w,line.gettoken_str(2)); SCRIPT_MSG(_T("SubCaption: page:%d, text=%") NPRIs _T("\n"),w,line.gettoken_str(2)); } return PS_OK; case TOK_FILEERRORTEXT: #ifdef NSIS_SUPPORT_FILE { SetInnerString(NLF_FILE_ERROR,line.gettoken_str(1)); SetInnerString(NLF_FILE_ERROR_NOIGNORE,line.gettoken_str(2)); SCRIPT_MSG(_T("FileErrorText: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FILE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif case TOK_BRANDINGTEXT: { int a = 1, trim = 0; while (line.gettoken_str(a)[0] == _T('/')) { if (!_tcsnicmp(line.gettoken_str(a),_T("/TRIM"),5)) { if (!_tcsicmp(line.gettoken_str(a)+5,_T("LEFT"))) trim = 1; else if (!_tcsicmp(line.gettoken_str(a)+5,_T("RIGHT"))) trim = 2; else if (!_tcsicmp(line.gettoken_str(a)+5,_T("CENTER"))) trim = 3; else PRINTHELP(); a++; } else break; } if (line.getnumtokens()!=a+1 && !trim) PRINTHELP(); if (line.getnumtokens()==a+1) SetInnerString(NLF_BRANDING,line.gettoken_str(a)); #ifdef _WIN32 if (trim) try { init_res_editor(); BYTE* dlg = res_editor->GetResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG); CDialogTemplate td(dlg,build_unicode,uDefCodePage); res_editor->FreeResource(dlg); if (trim) { TCHAR str[512]; if (line.getnumtokens()==a+1 && line.gettoken_str(a)[0]) _tcscpy(str, line.gettoken_str(a)); else wsprintf(str, _T("Nullsoft Install System %") NPRIs, NSIS_VERSION); short old_width = td.GetItem(IDC_VERSTR)->sWidth; switch (trim) { case 1: td.LTrimToString(IDC_VERSTR, str, 4); break; case 2: td.RTrimToString(IDC_VERSTR, str, 4); break; case 3: td.CTrimToString(IDC_VERSTR, str, 4); break; } if (td.GetItem(IDC_VERSTR)->sWidth > old_width) warning_fl(DW_ATTRIBUTE_OVERLONGSTRING, _T("BrandingText: \"%") NPRIs _T("\" is too long, trimming has expanded the label"), str); } DWORD dwSize; dlg = td.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwSize); td.FreeSavedTemplate(dlg); } catch (exception& err) { ERROR_MSG(_T("Error while trimming branding text control: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } #else if (trim) { ERROR_MSG(_T("Error: BrandingText /TRIM* is disabled for non Win32 platforms.\n")); return PS_ERROR; } #endif SCRIPT_MSG(_T("BrandingText: \"%") NPRIs _T("\"\n"),line.gettoken_str(a)); } return PS_OK; case TOK_MISCBUTTONTEXT: { SetInnerString(NLF_BTN_BACK,line.gettoken_str(1)); SetInnerString(NLF_BTN_NEXT,line.gettoken_str(2)); SetInnerString(NLF_BTN_CANCEL,line.gettoken_str(3)); SetInnerString(NLF_BTN_CLOSE,line.gettoken_str(4)); SCRIPT_MSG(_T("MiscButtonText: back=\"%") NPRIs _T("\" next=\"%") NPRIs _T("\" cancel=\"%") NPRIs _T("\" close=\"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return PS_OK; case TOK_SPACETEXTS: { if (!_tcsicmp(line.gettoken_str(1), _T("none"))) { no_space_texts=true; SCRIPT_MSG(_T("SpaceTexts: none\n")); } else { no_space_texts=false; SetInnerString(NLF_SPACE_REQ,line.gettoken_str(1)); SetInnerString(NLF_SPACE_AVAIL,line.gettoken_str(2)); SCRIPT_MSG(_T("SpaceTexts: required=\"%") NPRIs _T("\" available=\"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } } return PS_OK; case TOK_INSTBUTTONTEXT: { SetInnerString(NLF_BTN_INSTALL,line.gettoken_str(1)); SCRIPT_MSG(_T("InstallButtonText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_DETAILSBUTTONTEXT: { if (!cur_page) { if (SetInnerString(NLF_BTN_DETAILS,line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } else { if (cur_page_type != PAGE_INSTFILES) { ERROR_MSG(_T("Error: DetailsButtonText can only be used inside PageEx instfiles.\n")); return PS_ERROR; } cur_page->parms[1] = add_string(line.gettoken_str(1)); } SCRIPT_MSG(_T("DetailsButtonText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_COMPLETEDTEXT: { if (!cur_page) { if (SetInnerString(NLF_COMPLETED,line.gettoken_str(1)) == PS_WARNING) warning_fl(DW_INNERSTRING_MULTISETWASTE, _T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } else { if (cur_page_type != PAGE_INSTFILES) { ERROR_MSG(_T("Error: CompletedText can only be used inside PageEx instfiles.\n")); return PS_ERROR; } cur_page->parms[2] = add_string(line.gettoken_str(1)); } SCRIPT_MSG(_T("CompletedText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_UNINSTBUTTONTEXT: #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT { SetInnerString(NLF_BTN_UNINSTALL,line.gettoken_str(1)); SCRIPT_MSG(_T("UninstButtonText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif // instructions /////////////////////////////////////////////////////////////////////////////// case TOK_NOP: SCRIPT_MSG(_T("Nop\n")); ent.which=EW_NOP; return add_entry(&ent); case TOK_GOTO: ent.which=EW_NOP; if (process_jump(line,1,&ent.offsets[0])) PRINTHELP() SCRIPT_MSG(_T("Goto: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_GETREGVIEW: return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(alter_reg_view)); case TOK_SETREGVIEW: { ent.which=EW_SETFLAG; ent.offsets[0]=FLAG_OFFSET(alter_reg_view); int k=line.gettoken_enum(1,_T("32\0") _T("64\0default\0lastused\0")); if (k == 0) ent.offsets[1]=add_intstring(is_target_64bit() ? KEY_WOW64_32KEY : 0); // 32 else if (k == 1) ent.offsets[1]=add_intstring(is_target_64bit() ? 0 : KEY_WOW64_64KEY); // 64 else if (k == 2) ent.offsets[1]=add_intstring(0); // default else if (k == 3) ent.offsets[2]=1; // last used else PRINTHELP() SCRIPT_MSG(_T("SetRegView: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_IFALTREGVIEW: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(alter_reg_view), ~0); //new value mask - keep flag case TOK_GETSHELLVARCONTEXT: return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(all_user_var)); case TOK_SETSHELLVARCONTEXT: ent.offsets[1] = line.gettoken_enum(1,_T("current\0all\0lastused\0")); if (ent.offsets[1] < 0 ) PRINTHELP() return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(all_user_var), ent.offsets[1] != 2 ? add_intstring(ent.offsets[1]) : AFIE_LASTUSED); case TOK_IFSHELLVARCONTEXTALL: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(all_user_var), ~0); //new value mask - keep flag case TOK_RET: SCRIPT_MSG(_T("Return\n")); ent.which=EW_RET; return add_entry(&ent); case TOK_CALL: if (!line.gettoken_str(1)[0] || (line.gettoken_str(1)[0]==_T(':') && !line.gettoken_str(1)[1] )) PRINTHELP() #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (uninstall_mode && _tcsnicmp(line.gettoken_str(1),_T("un."),3) && (GetUserVarIndex(line,1) < 0) && line.gettoken_str(1)[0]!=_T(':')) { ERROR_MSG(_T("Call must be used with function names starting with \"un.\" in the uninstall section.\n")); PRINTHELP() } if (!uninstall_mode && !_tcsnicmp(line.gettoken_str(1),_T("un."),3)) { ERROR_MSG(_T("Call must not be used with functions starting with \"un.\" in the non-uninstall sections.\n")); PRINTHELP() } #endif ent.which=EW_CALL; ent.offsets[1]=0; { int v; if ((v=GetUserVarIndex(line, 1))>=0) { ent.offsets[0]=-v-2; } else { if (line.gettoken_str(1)[0] == _T(':')) { ent.offsets[1]=1; ent.offsets[0]=ns_label.add(line.gettoken_str(1)+1,0); } else ent.offsets[0]=ns_func.add(line.gettoken_str(1),0); } } SCRIPT_MSG(_T("Call \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_SETOUTPATH: { const TCHAR *op=line.gettoken_str(1), *cmdname=_T("SetOutPath"); if (!_tcscmp(op,_T("-"))) op=_T("$INSTDIR"); SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\"\n"),cmdname,op); ent.which=EW_CREATEDIR; ent.offsets[0]=add_string(op); ent.offsets[1]=1; DefineInnerLangString(NLF_OUTPUT_DIR); } return add_entry(&ent); case TOK_CREATEDIR: { const TCHAR *cmdname=_T("CreateDirectory"); TCHAR out_path[NSIS_MAX_STRLEN], *p=line.gettoken_str(1); bool badpath=IsWindowsPathRelative(p) && _T('$') != *p; // ExeHead will have to deal with expanded $variables... if (badpath) ERROR_MSG(_T("%") NPRIs _T(": Relative paths not supported\n"),cmdname); else { my_strncpy(out_path,p,COUNTOF(out_path)); p=CharPrev(out_path,out_path+_tcslen(out_path)); if (IsAgnosticPathSeparator(*p)) *p=0; // remove trailing slash } if (badpath || !*out_path) PRINTHELP() SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\"\n"),cmdname,out_path); ent.which=EW_CREATEDIR; ent.offsets[0]=add_string(out_path); DefineInnerLangString(NLF_CREATE_DIR); } return add_entry(&ent); case TOK_EXEC: case TOK_EXECWAIT: #ifdef NSIS_SUPPORT_EXECUTE ent.which=EW_EXECUTE; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[2]=0; if (which_token == TOK_EXECWAIT) { ent.offsets[2]=1; ent.offsets[1]=GetUserVarIndex(line, 2); if (line.gettoken_str(2)[0] && ent.offsets[1]<0) PRINTHELP() } SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" (->%") NPRIs _T(")\n"),ent.offsets[2]?_T("ExecWait"):_T("Exec"),line.gettoken_str(1),line.gettoken_str(2)); DefineInnerLangString(NLF_EXEC); return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_EXECUTE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_EXECUTE case TOK_EXECSHELL: case TOK_EXECSHELLWAIT: #ifdef NSIS_SUPPORT_SHELLEXECUTE { UINT to=0, xflags=0; static const TCHAR*fn=_T("/INVOKEIDLIST\0/CONNECTNETDRV\0/DOENVSUBST\0/NOIDLIST\0/NOCONSOLE\0/NOZONECHECKS\0/WAITFORINPUTIDLE\0/LOGUSAGE\0/ASYNCOK\0/ALLOWERRORUI\0"); static const UINT fv[]={ 0x0000000C, 0x00000080, 0x00000200, 0x00001000,0x00008000, 0x00800000, 0x02000000, 0x04000000,0x100000, 0x0100 }; for (int k;;) if ((k = line.gettoken_enum(to+1,fn)) < 0) { if (line.gettoken_str(to+1)[0]=='/') PRINTHELP(); break; } else xflags|=fv[k], to++; const TCHAR *verb=line.gettoken_str(to+1), *file=line.gettoken_str(to+2), *params=line.gettoken_str(to+3), *cnam=get_commandtoken_name(which_token); ent.which=EW_SHELLEXEC; ent.offsets[0]=add_string(verb), ent.offsets[1]=add_string(file); ent.offsets[2]=add_string(params), ent.offsets[3]=SW_SHOWNORMAL; ent.offsets[4]=SEE_MASK_FLAG_DDEWAIT|((xflags&0x0100)?0:SEE_MASK_FLAG_NO_UI)|xflags|(which_token==TOK_EXECSHELLWAIT ? SEE_MASK_NOCLOSEPROCESS : 0); if (line.getnumtokens()-to > 4) { int tab[8]={SW_SHOWDEFAULT,SW_SHOWNORMAL,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED,SW_HIDE,SW_SHOW,SW_SHOWNA,SW_SHOWMINNOACTIVE}; int a=line.gettoken_enum(to+4,_T("SW_SHOWDEFAULT\0SW_SHOWNORMAL\0SW_SHOWMAXIMIZED\0SW_SHOWMINIMIZED\0SW_HIDE\0SW_SHOW\0SW_SHOWNA\0SW_SHOWMINNOACTIVE\0")); if (a >= 0) ent.offsets[3]=tab[a]; else PRINTHELP() } tstring detail=tstring(verb) + (*verb ? _T(" ") : _T("")) + tstring(file); ent.offsets[5]=add_string(detail.c_str()); SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T(": \"%") NPRIs _T("\" \"%") NPRIs _T("\" %") NPRIs _T("\n"),cnam,verb,file,params,line.gettoken_str(to+4)); DefineInnerLangString(NLF_EXEC_SHELL); } return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_SHELLEXECUTE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_SHELLEXECUTE case TOK_CALLINSTDLL: case TOK_REGDLL: case TOK_UNREGDLL: #ifndef NSIS_SUPPORT_ACTIVEXREG ERROR_MSG(_T("%") NPRIs _T(": support not compiled in (NSIS_SUPPORT_ACTIVEXREG)\n"),line.gettoken_str(0)); return PS_ERROR; #else // NSIS_SUPPORT_ACTIVEXREG ent.which=EW_REGISTERDLL; ent.offsets[0]=add_string(line.gettoken_str(1)); if (which_token == TOK_UNREGDLL) { ent.offsets[1]=add_asciistring(_T("DllUnregisterServer")); ent.offsets[2]=DefineInnerLangString(NLF_UNREGISTERING); } else if (which_token == TOK_CALLINSTDLL) { int a = 2; if (!_tcsicmp(line.gettoken_str(a), _T("/NOUNLOAD"))) { ent.offsets[3]=1; a++; } if (a+1 != line.getnumtokens()) PRINTHELP(); ent.offsets[1]=add_string(line.gettoken_str(a)); if (!ent.offsets[1]) PRINTHELP() ent.offsets[2]=0; } else // Register DLL { ent.offsets[1] = add_string(line.gettoken_str(2)); if (!ent.offsets[1]) ent.offsets[1]=add_asciistring(_T("DllRegisterServer")); ent.offsets[2]=DefineInnerLangString(NLF_REGISTERING); } SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" %") NPRIs _T("\n"),line.gettoken_str(0),line.gettoken_str(1), line.gettoken_str(ent.offsets[3]?3:2)); DefineInnerLangString(NLF_SYMBOL_NOT_FOUND); DefineInnerLangString(NLF_COULD_NOT_LOAD); DefineInnerLangString(NLF_NO_OLE); // not used anywhere - DefineInnerLangString(NLF_ERR_REG_DLL); return add_entry(&ent); #endif //~ NSIS_SUPPORT_ACTIVEXREG case TOK_RENAME: #ifdef NSIS_SUPPORT_RENAME { int a=1; ent.which=EW_RENAME; if (!_tcsicmp(line.gettoken_str(1),_T("/REBOOTOK"))) { ent.offsets[2]=1; a++; #ifndef NSIS_SUPPORT_MOVEONREBOOT ERROR_MSG(_T("Error: /REBOOTOK specified, NSIS_SUPPORT_MOVEONREBOOT not defined\n")); PRINTHELP() #endif } else if (line.gettoken_str(1)[0]==_T('/')) { a=line.getnumtokens(); // cause usage to go here: } if (line.getnumtokens()!=a+2) PRINTHELP() ent.offsets[0]=add_string(line.gettoken_str(a)); ent.offsets[1]=add_string(line.gettoken_str(a+1)); tstring print = tstring(line.gettoken_str(a)) + _T("->") + tstring(line.gettoken_str(a+1)); ent.offsets[3]=add_string(print.c_str()); SCRIPT_MSG(_T("Rename: %") NPRIs _T("%") NPRIs _T("->%") NPRIs _T("\n"),ent.offsets[2]?_T("/REBOOTOK "):_T(""),line.gettoken_str(a),line.gettoken_str(a+1)); DefineInnerLangString(NLF_RENAME); #ifdef NSIS_SUPPORT_MOVEONREBOOT DefineInnerLangString(NLF_RENAME_ON_REBOOT); #endif } return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_RENAME not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_RENAME case TOK_MESSAGEBOX: #ifdef NSIS_SUPPORT_MESSAGEBOX { #define MBD(x) {x,_T(#x)}, struct { int id; const TCHAR *str; } list[] = { MBD(MB_ABORTRETRYIGNORE) MBD(MB_OK) MBD(MB_OKCANCEL) MBD(MB_RETRYCANCEL) MBD(MB_YESNO) MBD(MB_YESNOCANCEL) MBD(MB_ICONEXCLAMATION) MBD(MB_ICONINFORMATION) MBD(MB_ICONQUESTION) MBD(MB_ICONSTOP) MBD(MB_USERICON) MBD(MB_TOPMOST) MBD(MB_SETFOREGROUND) MBD(MB_RIGHT) MBD(MB_RTLREADING) MBD(MB_DEFBUTTON1) MBD(MB_DEFBUTTON2) MBD(MB_DEFBUTTON3) MBD(MB_DEFBUTTON4) }; #undef MBD int r=0, x; TCHAR *p=line.gettoken_str(1); while (*p) { TCHAR *np=p; while (*np && *np != _T('|')) np++; if (*np) *np++=0; for (x = 0 ; (size_t) x < COUNTOF(list) && _tcsicmp(list[x].str, p); x++); if ((size_t) x < COUNTOF(list)) r |= list[x].id; else PRINTHELP() p=np; } ent.which=EW_MESSAGEBOX; ent.offsets[0]=r; ent.offsets[1]=add_string(line.gettoken_str(2)); static const int rettab[] = { 0,IDABORT,IDCANCEL,IDIGNORE,IDNO,IDOK,IDRETRY,IDYES }; const TCHAR *retstr=_T("0\0IDABORT\0IDCANCEL\0IDIGNORE\0IDNO\0IDOK\0IDRETRY\0IDYES\0"); int a=3; if (line.getnumtokens() > 3) { if (!_tcsicmp(line.gettoken_str(3),_T("/SD"))) { int k=line.gettoken_enum(4,retstr); if (k <= 0) PRINTHELP(); ent.offsets[0] |= rettab[k]<<21; a=5; } else if (line.getnumtokens() > 7) PRINTHELP(); if (line.getnumtokens() > a) { ent.offsets[2]=line.gettoken_enum(a,retstr); if (ent.offsets[2] < 0) PRINTHELP(); ent.offsets[2] = rettab[ent.offsets[2]]; if (process_jump(line,a+1,&ent.offsets[3])) PRINTHELP(); if (line.getnumtokens() > a+2) { int v=line.gettoken_enum(a+2,retstr); if (v < 0) PRINTHELP(); ent.offsets[4] = rettab[v]; if (process_jump(line,a+3,&ent.offsets[5])) PRINTHELP(); } } } SCRIPT_MSG(_T("MessageBox: %d: \"%") NPRIs _T("\""),r,line.gettoken_str(2)); if (line.getnumtokens()>a+1) SCRIPT_MSG(_T(" (on %") NPRIs _T(" goto %") NPRIs _T(")"),line.gettoken_str(a),line.gettoken_str(a+1)); SCRIPT_MSG(_T("\n")); } return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_MESSAGEBOX not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_MESSAGEBOX case TOK_CREATESHORTCUT: #ifdef NSIS_SUPPORT_CREATESHORTCUT { const TCHAR *cmdnam = line.gettoken_str(0); ent.which=EW_CREATESHORTCUT; int noLnkWorkDir=0, s; if (!_tcsicmp(line.gettoken_str(1),_T("/NoWorkingDir"))) line.eattoken(), noLnkWorkDir++; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[5]=add_string(line.gettoken_str(8)); ent.offsets[4]=(line.gettoken_int(5,&s) << CS_II_SHIFT) & CS_II_MASK; if (!s || ent.offsets[4] < 0 || ent.offsets[4] > CS_II_MAX) { if (line.getnumtokens() > 5 && *line.gettoken_str(5)) { ERROR_MSG(_T("CreateShortcut: cannot interpret icon index\n")); PRINTHELPEX(cmdnam) } } if (noLnkWorkDir) ent.offsets[4] |= CS_NWD; if (line.getnumtokens() > 6 && *line.gettoken_str(6)) { const int tab[3]={SW_SHOWNORMAL,SW_SHOWMAXIMIZED,SW_SHOWMINNOACTIVE/*SW_SHOWMINIMIZED doesn't work*/}; int a=line.gettoken_enum(6,_T("SW_SHOWNORMAL\0SW_SHOWMAXIMIZED\0SW_SHOWMINIMIZED\0")); if (a < 0 || (tab[a] << CS_SC_SHIFT) & ~CS_SC_MASK) { ERROR_MSG(_T("CreateShortcut: unknown show mode \"%") NPRIs _T("\"\n"),line.gettoken_str(6)); PRINTHELPEX(cmdnam) } ent.offsets[4] |= tab[a] << CS_SC_SHIFT; } if (line.getnumtokens() > 7) { TCHAR *s=line.gettoken_str(7), b[255]; for (unsigned int spos=0; (spos <= _tcslen(s)) && (spos <= 255); spos++) b[spos]=_totupper(*(s+spos)); _tcscpy(s,b); if (*s) { int c=0; if (_tcsstr(s,_T("ALT|"))) ent.offsets[4] |= HOTKEYF_ALT << (CS_HK_SHIFT+8); if (_tcsstr(s,_T("CONTROL|"))) ent.offsets[4] |= HOTKEYF_CONTROL << (CS_HK_SHIFT+8); if (_tcsstr(s,_T("EXT|"))) ent.offsets[4] |= HOTKEYF_EXT << (CS_HK_SHIFT+8); if (_tcsstr(s,_T("SHIFT|"))) ent.offsets[4] |= HOTKEYF_SHIFT << (CS_HK_SHIFT+8); while (_tcsstr(s,_T("|"))) s=_tcsstr(s,_T("|"))+1; if ((s[0] == _T('F')) && (s[1] >= _T('1') && s[1] <= _T('9'))) { c=VK_F1-1+_ttoi(s+1); if (_ttoi(s+1) < 1 || _ttoi(s+1) > 24) warning_fl(DW_PARSE_LNK_HK, _T("CreateShortcut: F-key \"%") NPRIs _T("\" out of range"),s); } else if (((s[0] >= _T('A') && s[0] <= _T('Z')) || (s[0] >= _T('0') && s[0] <= _T('9'))) && !s[1]) c=s[0]; else { c=s[0]; warning_fl(DW_PARSE_LNK_HK, _T("CreateShortcut: unrecognized hotkey \"%") NPRIs _T("\""),s); } ent.offsets[4] |= ((c) << CS_HK_SHIFT) & CS_HK_MASK; } } SCRIPT_MSG(_T("CreateShortcut: \"%") NPRIs _T("\"->\"%") NPRIs _T("\" %") NPRIs _T(" icon:%") NPRIs _T(",%d, nwd=%d, showmode=0x%X, hotkey=0x%X, comment=%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4),(ent.offsets[4]>>CS_II_SHIFT)&(CS_II_MASK>>CS_II_SHIFT),!!(ent.offsets[4]&CS_NWD), (ent.offsets[4]>>CS_SC_SHIFT)&(CS_SC_MASK>>CS_SC_SHIFT),(ent.offsets[4]>>CS_HK_SHIFT)&(CS_HK_MASK>>CS_HK_SHIFT),line.gettoken_str(8)); DefineInnerLangString(NLF_CREATE_SHORTCUT); DefineInnerLangString(NLF_ERR_CREATING_SHORTCUT); } return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_CREATESHORTCUT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_CREATESHORTCUT #ifdef NSIS_SUPPORT_HWNDS case TOK_FINDWINDOW: ent.which=EW_FINDWINDOW; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=add_string(line.gettoken_str(5)); SCRIPT_MSG(_T("FindWindow: output=%") NPRIs _T(", class=\"%") NPRIs _T("\", text=\"%") NPRIs _T("\" hwndparent=\"%") NPRIs _T("\" hwndafter=\"%") NPRIs _T("\"\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(5)); return add_entry(&ent); case TOK_SENDMESSAGE: { ent.which=EW_SENDMESSAGE; if (line.gettoken_str(1)[0] == _T('/') || line.gettoken_str(2)[0] == _T('/') || line.gettoken_str(3)[0] == _T('/') || line.gettoken_str(4)[0] == _T('/')) PRINTHELP() SCRIPT_MSG(_T("SendMessage:")); int a=5; ent.offsets[0]=GetUserVarIndex(line,a); if (ent.offsets[0]>=0) SCRIPT_MSG(_T("(->%") NPRIs _T(")"),line.gettoken_str(a++)); if (!_tcsncicmp(line.gettoken_str(a),_T("/TIMEOUT="),9)) { ent.offsets[5]|=_ttoi(line.gettoken_str(a++)+9)<<2; SCRIPT_MSG(_T(" (timeout=%d)"),ent.offsets[5]>>2); } if (line.getnumtokens()>a) PRINTHELP() if (!_tcsncmp(line.gettoken_str(3),_T("STR:"),4)) { ent.offsets[5]|=1; ent.offsets[3]=add_string(line.gettoken_str(3)+4); } else ent.offsets[3]=add_string(line.gettoken_str(3)); if (!_tcsncmp(line.gettoken_str(4),_T("STR:"),4)) { ent.offsets[5]|=2; ent.offsets[4]=add_string(line.gettoken_str(4)+4); } else ent.offsets[4]=add_string(line.gettoken_str(4)); ent.offsets[1]=add_string(line.gettoken_str(1)); ent.offsets[2]=add_string(line.gettoken_str(2)); SCRIPT_MSG(_T("(%") NPRIs _T(",%") NPRIs _T(",%") NPRIs _T(",%") NPRIs _T(")\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return add_entry(&ent); case TOK_ISWINDOW: ent.which=EW_ISWINDOW; ent.offsets[0]=add_string(line.gettoken_str(1)); if (process_jump(line,2,&ent.offsets[1])|| process_jump(line,3,&ent.offsets[2])) PRINTHELP() SCRIPT_MSG(_T("IsWindow(%") NPRIs _T("): %") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT case TOK_GETDLGITEM: ent.which=EW_GETDLGITEM; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0]<0) PRINTHELP(); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=add_string(line.gettoken_str(3)); SCRIPT_MSG(_T("GetDlgItem: output=%") NPRIs _T(" dialog=%") NPRIs _T(" item=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_SETCTLCOLORS: { ent.which=EW_SETCTLCOLORS; ent.offsets[0]=add_string(line.gettoken_str(1)); ctlcolors c={0, }; TCHAR *p; int a = 2, ctok = line.getnumtokens(); if (!_tcsicmp(line.gettoken_str(2),_T("/BRANDING"))) a+=1; if (!_tcsicmp(line.gettoken_str(2),_T("/RESET"))) { if (ctok != 3) return PS_ERROR; else a+=2; } if (a == 2 && ctok == 5) { ERROR_MSG(_T("Error: SetCtlColors expected 3 parameters, got 4\n")); return PS_ERROR; } if (!_tcsicmp(line.gettoken_str(a+1),_T("transparent"))) { c.flags|=CC_BKB, c.lbStyle=BS_NULL, c.bkmode=TRANSPARENT; } else { // Parse background color c.lbStyle=BS_SOLID, c.bkmode=OPAQUE; if (*(p=line.gettoken_str(a+1))) c.flags|=CC_BK|CC_BKB, c.bkc=ParseCtlColor(p, c.flags, CC_BK_SYS); } if (*(p=line.gettoken_str(a))) // Set text color? c.flags|=CC_TEXT, c.text=ParseCtlColor(p, c.flags, CC_TEXT_SYS); if (a == 3) { // Handle /BRANDING c.flags|=CC_BK|CC_BKB; c.lbStyle=BS_NULL; if (!*line.gettoken_str(a+1)) c.bkc=COLOR_BTNFACE, c.flags|=CC_BK_SYS; c.flags|=CC_TEXT; if (!*line.gettoken_str(a)) c.text=COLOR_BTNFACE, c.flags|=CC_TEXT_SYS; c.bkmode=OPAQUE; } if (a == 4) c.bkmode=OPAQUE, c.flags=0, c.bkb = 0; // Experimental and undocumented /RESET, a formal way of doing SetCtlColors $hCtl "" "" assert(sizeof(ctlcolors64) > sizeof(ctlcolors)); int i, l=cur_ctlcolors->getlen()/sizeof(ctlcolors), pad=is_target_64bit()?sizeof(ctlcolors64)-sizeof(ctlcolors):0; for (i=0; iget()+i,&c,sizeof(ctlcolors))) { ent.offsets[1]=i*(sizeof(ctlcolors)+pad); break; } if (i>=l) ent.offsets[1]=cur_ctlcolors->add(&c,sizeof(ctlcolors))+(l*pad); SCRIPT_MSG(_T("SetCtlColors: hwnd=%") NPRIs _T(" %") NPRIs _T("text=%") NPRIs _T(" background=%") NPRIs _T("\n"),line.gettoken_str(1),a==2?_T(""):_T("/BRANDING "),line.gettoken_str(a),line.gettoken_str(a+1)); } return add_entry(&ent); case TOK_CREATEFONT: { ent.which=EW_CREATEFONT; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); SCRIPT_MSG(_T("CreateFont: output=%") NPRIs _T(" \"%") NPRIs _T("\""),line.gettoken_str(1),line.gettoken_str(2)); int height=0, weight=0, flags=0; for (int i = 3; i < line.getnumtokens(); i++) { TCHAR *tok=line.gettoken_str(i); if (tok[0]=='/') { if (!_tcsicmp(tok,_T("/ITALIC"))) { SCRIPT_MSG(_T(" /ITALIC")); flags|=1; } else if (!_tcsicmp(tok,_T("/UNDERLINE"))) { SCRIPT_MSG(_T(" /UNDERLINE")); flags|=2; } else if (!_tcsicmp(tok,_T("/STRIKE"))) { SCRIPT_MSG(_T(" /STRIKE")); flags|=4; } else { SCRIPT_MSG(_T("\n")); PRINTHELP(); } } else { if (!height) { SCRIPT_MSG(_T(" height=%") NPRIs,tok); height=add_string(tok); } else if (!weight) { SCRIPT_MSG(_T(" weight=%") NPRIs,tok); weight=add_string(tok); } else { SCRIPT_MSG(_T("\n")); PRINTHELP(); } } ent.offsets[2]=height; ent.offsets[3]=weight; ent.offsets[4]=flags; } SCRIPT_MSG(_T("\n")); } return add_entry(&ent); case TOK_ENABLEWINDOW: ent.which=EW_SHOWWINDOW; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[3]=1; SCRIPT_MSG(_T("EnableWindow: handle=%") NPRIs _T(" enable=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SHOWWINDOW: ent.which=EW_SHOWWINDOW; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); SCRIPT_MSG(_T("ShowWindow: handle=%") NPRIs _T(" show state=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_HIDEWINDOW: ent.which=EW_SHOWWINDOW; ent.offsets[0]=add_asciistring(_T("$HWNDPARENT")); ent.offsets[1]=add_asciistring(_T("0")/*SW_HIDE*/); ent.offsets[2]=1; SCRIPT_MSG(_T("HideWindow\n")); return add_entry(&ent); case TOK_BRINGTOFRONT: { int ret; ent.which=EW_SHOWWINDOW; ent.offsets[0]=add_asciistring(_T("$HWNDPARENT")); ent.offsets[1]=add_asciistring(_T("5")/*SW_SHOW*/); if ((ret = add_entry(&ent)) != PS_OK) return ret; ent.which=EW_BRINGTOFRONT; ent.offsets[0]=0; ent.offsets[1]=0; SCRIPT_MSG(_T("BringToFront\n")); } return add_entry(&ent); #else case TOK_GETDLGITEM: case TOK_SETCTLCOLORS: case TOK_SHOWWINDOW: case TOK_BRINGTOFRONT: case TOK_CREATEFONT: case TOK_HIDEWINDOW: case TOK_ENABLEWINDOW: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_ENHANCEDUI_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_ENHANCEDUI_SUPPORT #else //! NSIS_SUPPORT_HWNDS case TOK_ISWINDOW: case TOK_SENDMESSAGE: case TOK_FINDWINDOW: case TOK_GETDLGITEM: case TOK_SETCTLCOLORS: case TOK_SHOWWINDOW: case TOK_ENABLEWINDOW: case TOK_CREATEFONT: case TOK_HIDEWINDOW: case TOK_BRINGTOFRONT: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_HWNDS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_HWNDS case TOK_DELETE: #ifdef NSIS_SUPPORT_DELETE { int a=1; ent.which=EW_DELETEFILE; if (!_tcsicmp(line.gettoken_str(a),_T("/REBOOTOK"))) { a++; ent.offsets[1]=DEL_REBOOT; #ifndef NSIS_SUPPORT_MOVEONREBOOT ERROR_MSG(_T("Error: /REBOOTOK specified, NSIS_SUPPORT_MOVEONREBOOT not defined\n")); PRINTHELP() #endif } else if (line.gettoken_str(1)[0]==_T('/')) { a=line.getnumtokens(); } if (line.getnumtokens() != a+1) PRINTHELP() ent.offsets[0]=add_string(line.gettoken_str(a)); SCRIPT_MSG(_T("Delete: %") NPRIs _T("\"%") NPRIs _T("\"\n"),ent.offsets[1]?_T("/REBOOTOK "):_T(""),line.gettoken_str(a)); DefineInnerLangString(NLF_DEL_FILE); #ifdef NSIS_SUPPORT_MOVEONREBOOT DefineInnerLangString(NLF_DEL_ON_REBOOT); #endif } return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_DELETE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_DELETE case TOK_RMDIR: #ifdef NSIS_SUPPORT_RMDIR { int a=1; ent.which=EW_RMDIR; ent.offsets[1]=DEL_DIR; while (line.gettoken_str(a)[0]==_T('/')) { if (!_tcsicmp(line.gettoken_str(a),_T("/r"))) { if (a == 3) PRINTHELP(); a++; ent.offsets[1]|=DEL_RECURSE; } else if (!_tcsicmp(line.gettoken_str(a),_T("/REBOOTOK"))) { if (a == 3) PRINTHELP(); a++; ent.offsets[1]|=DEL_REBOOT; } else PRINTHELP(); } if (a < line.getnumtokens() - 1) PRINTHELP(); ent.offsets[0]=add_string(line.gettoken_str(a)); SCRIPT_MSG(_T("RMDir: ")); if (a>1) SCRIPT_MSG(_T("%") NPRIs _T(" "),line.gettoken_str(1)); if (a>2) SCRIPT_MSG(_T("%") NPRIs _T(" "),line.gettoken_str(2)); SCRIPT_MSG(_T("\"%") NPRIs _T("\"\n"),line.gettoken_str(a)); DefineInnerLangString(NLF_REMOVE_DIR); DefineInnerLangString(NLF_DEL_FILE); #ifdef NSIS_SUPPORT_MOVEONREBOOT DefineInnerLangString(NLF_DEL_ON_REBOOT); #endif } return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_RMDIR not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_RMDIR case TOK_RESERVEFILE: case TOK_FILE: #ifdef NSIS_SUPPORT_FILE { set excluded; int a=1,attrib=0; bool fatal=true,rec=false,reserveplugin=false; if (!_tcsicmp(line.gettoken_str(a),_T("/nonfatal"))) fatal=false, a++; if (which_token == TOK_RESERVEFILE && !_tcsicmp(line.gettoken_str(a),_T("/plugin"))) reserveplugin=true, a++; if (which_token == TOK_FILE && !_tcsicmp(line.gettoken_str(a),_T("/a"))) { #ifdef _WIN32 attrib=1; #else warning_fl(DW_UNSUPP_STORE_FILE_ATT, _T("%") NPRIs _T("File /a is disabled for non Win32 platforms."),(which_token == TOK_FILE)?_T(""):_T("Reserve")); #endif a++; } if (!reserveplugin && !_tcsicmp(line.gettoken_str(a),_T("/r"))) { rec=true, a++; } else if (which_token == TOK_FILE && !_tcsnicmp(line.gettoken_str(a),_T("/oname="),7)) { TCHAR *on=line.gettoken_str(a)+7; a++; if (!*on||line.getnumtokens()!=a+1||_tcsstr(on,_T("*")) || _tcsstr(on,_T("?"))) PRINTHELP() if (on[0]==_T('"')) { ERROR_MSG(_T("%") NPRIs _T("File: output name must not begin with a quote, use \"/oname=name with spaces\".\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); PRINTHELP(); } int tf=0; TCHAR *fn = line.gettoken_str(a); PATH_CONVERT(fn); int v=do_add_file(fn, attrib, 0, &tf, on); if (v != PS_OK) return v; if (tf > 1) PRINTHELP() if (!tf) { if (fatal) { ERROR_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found.\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); PRINTHELP() } else { warning_fl(DW_FILE_NONFATAL_NOT_FOUND, _T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); // workaround for bug #1299100: add a nop opcode so relative jumps will work as expected add_entry_direct(EW_NOP); } } return PS_OK; } if (!_tcsnicmp(line.gettoken_str(a),_T("/x"),2)) { while (!_tcsnicmp(line.gettoken_str(a),_T("/x"),2)) { a++; if (line.getnumtokens() < a+1) PRINTHELP() excluded.insert(line.gettoken_str(a)); a++; } } #ifdef _WIN32 if (line.gettoken_str(a)[0] == _T('/')) PRINTHELP() #endif if (line.getnumtokens()FindDllPath(t, pluginfullpath)) { pluginfullpath = definedlist.find(_T("NSISDIR")); pluginfullpath += tstring(PLATFORM_PATH_SEPARATOR_STR) + _T("Plugins"); pluginfullpath += tstring(PLATFORM_PATH_SEPARATOR_STR) + get_target_suffix(); pluginfullpath += tstring(PLATFORM_PATH_SEPARATOR_STR) + t; } t = (TCHAR*) pluginfullpath.c_str(); } int tf=0; TCHAR *fn = my_convert(t); int v=do_add_file(fn, attrib, rec, &tf, NULL, which_token == TOK_FILE, NULL, excluded); my_convert_free(fn); if (v != PS_OK) return v; if (!tf) { if (fatal) { ERROR_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found.\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),t); PRINTHELP(); } else { warning_fl(DW_FILE_NONFATAL_NOT_FOUND, _T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found."),(which_token == TOK_FILE)?_T(""):_T("Reserve"),t); } } } } return PS_OK; #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FILE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_FILE #ifdef NSIS_SUPPORT_COPYFILES case TOK_COPYFILES: { ent.which=EW_COPYFILES; ent.offsets[2]=FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI|FOF_SIMPLEPROGRESS; int a=1; for (int x = 0; x < 2; x++) { if (!_tcsicmp(line.gettoken_str(a),_T("/SILENT"))) { a++; ent.offsets[2]&=~FOF_SIMPLEPROGRESS; ent.offsets[2]|=FOF_SILENT; } else if (!_tcsicmp(line.gettoken_str(a),_T("/FILESONLY"))) { a++; ent.offsets[2]|=FOF_FILESONLY; } else if (line.gettoken_str(a)[0]==_T('/')) PRINTHELP() else break; } if (line.getnumtokens() < a+2) PRINTHELP() ent.offsets[0]=add_string(line.gettoken_str(a)); ent.offsets[1]=add_string(line.gettoken_str(a+1)); tstring copy_to = tstring(_T("$(^CopyTo)")) + line.gettoken_str(a+1); ent.offsets[3]=add_string(copy_to.c_str()); int succ, size_kb=line.gettoken_int(a+2,&succ); if (!succ && line.gettoken_str(a+2)[0]) PRINTHELP() section_add_size_kb(size_kb); SCRIPT_MSG(_T("CopyFiles: %") NPRIs _T("\"%") NPRIs _T("\" -> \"%") NPRIs _T("\", size=%iKB\n"),ent.offsets[2]&FOF_SILENT?_T("(silent) "):_T(""), line.gettoken_str(a),line.gettoken_str(a+1),size_kb); DefineInnerLangString(NLF_COPY_FAILED); DefineInnerLangString(NLF_COPY_TO); } return add_entry(&ent); #else case TOK_COPYFILES: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_COPYFILES not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_COPYFILES case TOK_SETFILEATTRIBUTES: { #define MBD(x) {x,_T(#x)}, struct { int id; const TCHAR *str; } list[] = { MBD(FILE_ATTRIBUTE_NORMAL) {FILE_ATTRIBUTE_NORMAL,_T("NORMAL")}, // Short alias MBD(FILE_ATTRIBUTE_ARCHIVE) {FILE_ATTRIBUTE_ARCHIVE,_T("ARCHIVE")}, MBD(FILE_ATTRIBUTE_HIDDEN) {FILE_ATTRIBUTE_HIDDEN,_T("HIDDEN")}, MBD(FILE_ATTRIBUTE_OFFLINE) {FILE_ATTRIBUTE_OFFLINE,_T("OFFLINE")}, MBD(FILE_ATTRIBUTE_READONLY) {FILE_ATTRIBUTE_READONLY,_T("READONLY")}, MBD(FILE_ATTRIBUTE_SYSTEM) {FILE_ATTRIBUTE_SYSTEM,_T("SYSTEM")}, MBD(FILE_ATTRIBUTE_TEMPORARY) {FILE_ATTRIBUTE_TEMPORARY,_T("TEMPORARY")}, MBD(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) {FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,_T("NOTINDEXED")}, {FILE_ATTRIBUTE_NORMAL,_T("0")}, }; #undef MBD int r=0, x; TCHAR *p=line.gettoken_str(2); while (*p) { TCHAR *np=p; while (*np && *np != _T('|')) np++; if (*np) *np++=0; for (x = 0 ; (unsigned) x < COUNTOF(list) && _tcsicmp(list[x].str,p); x++); if ((unsigned) x < COUNTOF(list)) r |= list[x].id; else PRINTHELP() p=np; } ent.which=EW_SETFILEATTRIBUTES; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=r; } return add_entry(&ent); case TOK_SLEEP: { ent.which=EW_SLEEP; ent.offsets[0]=add_string(line.gettoken_str(1)); SCRIPT_MSG(_T("Sleep: %") NPRIs _T(" ms\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_IFFILEEXISTS: ent.which=EW_IFFILEEXISTS; ent.offsets[0] = add_string(line.gettoken_str(1)); if (process_jump(line,2,&ent.offsets[1]) || process_jump(line,3,&ent.offsets[2])) PRINTHELP() SCRIPT_MSG(_T("IfFileExists: \"%") NPRIs _T("\" ? %") NPRIs _T(" : %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_QUIT: ent.which=EW_QUIT; SCRIPT_MSG(_T("Quit\n")); return add_entry(&ent); case TOK_ABORT: ent.which=EW_ABORT; ent.offsets[0] = add_string(line.gettoken_str(1)); SCRIPT_MSG(_T("Abort: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_SETDETAILSVIEW: { int v=line.gettoken_enum(1,_T("hide\0show\0")); if (v < 0) PRINTHELP() ent.which=EW_CHDETAILSVIEW; ent.offsets[0] = v?SW_SHOWNA:SW_HIDE; ent.offsets[1] = v?SW_HIDE:SW_SHOWNA; SCRIPT_MSG(_T("SetDetailsView: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_SETDETAILSPRINT: { ent.which=EW_SETFLAG; ent.offsets[0]=FLAG_OFFSET(status_update); int k=line.gettoken_enum(1,_T("both\0textonly\0listonly\0none\0lastused\0")); if (k < 0) PRINTHELP() if (k == 4) ent.offsets[2]=1; // lastused else ent.offsets[1]=add_intstring(k*2); // both=0, textonly=2, listonly=4, none=6 SCRIPT_MSG(_T("SetDetailsPrint: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_SETAUTOCLOSE: { ent.which=EW_SETFLAG; ent.offsets[0]=FLAG_OFFSET(autoclose); int k=line.gettoken_enum(1,_T("false\0true\0")); if (k < 0) PRINTHELP() ent.offsets[1]=add_intstring(k); SCRIPT_MSG(_T("SetAutoClose: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_IFERRORS: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(exec_error), 0); //new value mask - clean error case TOK_IFABORT: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(abort), ~0); //new value mask - keep flag case TOK_CLEARERRORS: return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(exec_error), add_intstring(0)); case TOK_SETERRORS: return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(exec_error), add_intstring(1)); case TOK_SETERRORLEVEL: return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(errlvl), add_string(line.gettoken_str(1))); case TOK_GETERRORLEVEL: return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(errlvl)); #ifdef NSIS_SUPPORT_STROPTS case TOK_STRLEN: ent.which=EW_STRLEN; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=add_string(line.gettoken_str(2)); if (ent.offsets[0] < 0) PRINTHELP() SCRIPT_MSG(_T("StrLen %") NPRIs _T(" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_STRCPY: case TOK_UNSAFESTRCPY: { ent.which = EW_ASSIGNVAR; const TCHAR* msgprefix = _T(""); int idx = -1; if (TOK_STRCPY == which_token) idx = GetUserVarIndex(line, 1); else idx = GetUnsafeUserVarIndex(line, 1), msgprefix = _T("Unsafe"); if (idx < 0) PRINTHELP() ent.offsets[0]=idx; // Destination variable ent.offsets[1]=add_string(line.gettoken_str(2)); // Source string ent.offsets[2]=add_string(line.gettoken_str(3)); // Optional MaxLen ent.offsets[3]=add_string(line.gettoken_str(4)); // Optional StartOffset SCRIPT_MSG(_T("%") NPRIs _T("StrCpy %") NPRIs _T(" \"%") NPRIs _T("\" (%") NPRIs _T(") (%") NPRIs _T(")\n"), msgprefix,line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); } case TOK_GETFUNCTIONADDR: ent.which=EW_GETFUNCTIONADDR; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=ns_func.add(line.gettoken_str(2),0); ent.offsets[2]=0; ent.offsets[3]=0; if (ent.offsets[0] < 0) PRINTHELP() SCRIPT_MSG(_T("GetFunctionAddress: %") NPRIs _T(" %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_GETLABELADDR: ent.which=EW_GETLABELADDR; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0 || process_jump(line,2,&ent.offsets[1])) PRINTHELP() ent.offsets[2]=0; ent.offsets[3]=0; SCRIPT_MSG(_T("GetLabelAddress: %") NPRIs _T(" %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_GETCURRENTADDR: ent.which=EW_ASSIGNVAR; if ((ent.offsets[0]=GetUserVarIndex(line, 1)) < 0) PRINTHELP() ent.offsets[1]=add_intstring(1+(cur_header->blocks[NB_ENTRIES].num)); ent.offsets[2]=ent.offsets[3]=0; SCRIPT_MSG(_T("GetCurrentAddress: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_STRCMP: case TOK_STRCMPS: ent.which=EW_STRCMP; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[4]=which_token == TOK_STRCMPS; if (process_jump(line,3,&ent.offsets[2]) || process_jump(line,4,&ent.offsets[3])) PRINTHELP() SCRIPT_MSG(_T("%") NPRIs _T(" \"%") NPRIs _T("\" \"%") NPRIs _T("\" equal=%") NPRIs _T(", nonequal=%") NPRIs _T("\n"),line.gettoken_str(0),line.gettoken_str(1),line.gettoken_str(2), line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); case TOK_GETDLLVERSIONLOCAL: { const TCHAR*cmdname=_T("GetDLLVersionLocal"); DWORD low, high, prod = line.gettoken_enum(1, _T("/ProductVersion\0")) == 0 ? 2 : 0; if (prod) line.eattoken(); if (!GetDLLVersion(line.gettoken_str(1),high,low,!!prod)) { ERROR_MSG(_T("%") NPRIs _T(": error reading version info from \"%") NPRIs _T("\"\n"),cmdname,line.gettoken_str(1)); return PS_ERROR; } ent.which=EW_ASSIGNVAR; if ((ent.offsets[0]=GetUserVarIndex(line, 2)) < 0) PRINTHELP() ent.offsets[1]=add_intstring(high); ent.offsets[2]=ent.offsets[3]=0; if (PS_OK != add_entry(&ent)) return PS_ERROR; if ((ent.offsets[0]=GetUserVarIndex(line, 3)) < 0) PRINTHELP() ent.offsets[1]=add_intstring(low); ent.offsets[2]=ent.offsets[3]=0; SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T(" (%u,%u)->(%") NPRIs _T(",%") NPRIs _T(")\n"), cmdname,line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3)); } return add_entry(&ent); case TOK_GETFILETIMELOCAL: { TCHAR buf[129]; DWORD high=0,low=0; #ifdef _WIN32 int flag=0; HANDLE hFile=CreateFile(line.gettoken_str(1),0,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile != INVALID_HANDLE_VALUE) { FILETIME ft; if (GetFileTime(hFile,NULL,NULL,&ft)) flag=1, high=ft.dwHighDateTime, low=ft.dwLowDateTime; CloseHandle(hFile); } if (!flag) { ERROR_MSG(_T("GetFileTimeLocal: error reading date from \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return PS_ERROR; } #else struct stat st; if (_tstat(line.gettoken_str(1), &st)) { ERROR_MSG(_T("GetFileTimeLocal: error reading date from \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return PS_ERROR; } unsigned long long ll = (st.st_mtime * 10000000LL) + 116444736000000000LL; high = (DWORD) (ll >> 32), low = (DWORD) ll; #endif ent.which=EW_ASSIGNVAR; if ((ent.offsets[0]=GetUserVarIndex(line, 2)) < 0) PRINTHELP() wsprintf(buf,_T("%u"),high); ent.offsets[1]=add_string(buf); ent.offsets[2]=ent.offsets[3]=0; if (PS_OK != add_entry(&ent)) return PS_ERROR; if ((ent.offsets[0]=GetUserVarIndex(line, 3)) < 0) PRINTHELP() wsprintf(buf,_T("%u"),low); ent.offsets[1]=add_string(buf); ent.offsets[2]=ent.offsets[3]=0; SCRIPT_MSG(_T("GetFileTimeLocal: %") NPRIs _T(" (%u,%u)->(%") NPRIs _T(",%") NPRIs _T(")\n"), line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3)); } return add_entry(&ent); #else case TOK_GETDLLVERSIONLOCAL: case TOK_GETFILETIMELOCAL: case TOK_GETFUNCTIONADDR: case TOK_GETLABELADDR: case TOK_GETCURRENTADDR: case TOK_STRLEN: case TOK_STRCPY: case TOK_STRCMP: case TOK_STRCMPS: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_STROPTS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_STROPTS #ifdef NSIS_SUPPORT_INIFILES case TOK_DELETEINISEC: case TOK_DELETEINISTR: { const TCHAR *vname=_T(""), *space=_T(""); ent.which=EW_WRITEINI; ent.offsets[0]=add_string(line.gettoken_str(2)); // section name if (line.getnumtokens() > 3) { vname=line.gettoken_str(3); ent.offsets[1]=add_string(vname); // value name space=_T(" "); } else ent.offsets[1]=0; ent.offsets[2]=0; ent.offsets[3]=add_string(line.gettoken_str(1)); SCRIPT_MSG(_T("DeleteINI%") NPRIs _T(": [%") NPRIs _T("] %") NPRIs _T("%") NPRIs _T("in %") NPRIs _T("\n"),*vname?_T("Str"):_T("Sec"), line.gettoken_str(2),vname,space,line.gettoken_str(1)); } return add_entry(&ent); case TOK_FLUSHINI: ent.which=EW_WRITEINI; ent.offsets[3]=add_string(line.gettoken_str(1)); SCRIPT_MSG(_T("FlushINI: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_WRITEINISTR: ent.which=EW_WRITEINI; ent.offsets[0]=add_string(line.gettoken_str(2)); ent.offsets[1]=add_string(line.gettoken_str(3)); ent.offsets[2]=add_string(line.gettoken_str(4)); ent.offsets[3]=add_string(line.gettoken_str(1)); ent.offsets[4]=1; // write SCRIPT_MSG(_T("WriteINIStr: [%") NPRIs _T("] %") NPRIs _T("=%") NPRIs _T(" in %") NPRIs _T("\n"), line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(1)); return add_entry(&ent); case TOK_READINISTR: ent.which=EW_READINISTR; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(3)); ent.offsets[2]=add_string(line.gettoken_str(4)); ent.offsets[3]=add_string(line.gettoken_str(2)); SCRIPT_MSG(_T("ReadINIStr %") NPRIs _T(" [%") NPRIs _T("]:%") NPRIs _T(" from %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(2)); return add_entry(&ent); #else case TOK_DELETEINISEC: case TOK_DELETEINISTR: case TOK_FLUSHINI: case TOK_WRITEINISTR: case TOK_READINISTR: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_INIFILES not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_INIFILES case TOK_DETAILPRINT: ent.which=EW_UPDATETEXT; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; SCRIPT_MSG(_T("DetailPrint: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); #ifdef NSIS_SUPPORT_FNUTIL case TOK_GETTEMPFILENAME: ent.which=EW_GETTEMPFILENAME; ent.offsets[0]=GetUserVarIndex(line, 1); if (line.getnumtokens() == 3) ent.offsets[1]=add_string(line.gettoken_str(2)); else ent.offsets[1]=add_asciistring(_T("$TEMP")); if (ent.offsets[0]<0) PRINTHELP() SCRIPT_MSG(_T("GetTempFileName -> %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_GETFULLPATHNAME: { int a=0; ent.which=EW_GETFULLPATHNAME; if (line.getnumtokens()==4 && !_tcsicmp(line.gettoken_str(1),_T("/SHORT"))) a++; else if (line.getnumtokens()==4 || *line.gettoken_str(1)==_T('/')) PRINTHELP() ent.offsets[0]=add_string(line.gettoken_str(2+a)); ent.offsets[1]=GetUserVarIndex(line, 1+a); ent.offsets[2]=!a; if (ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("GetFullPathName: %") NPRIs _T("->%") NPRIs _T(" (%d)\n"), line.gettoken_str(2+a),line.gettoken_str(1+a),a?_T("sfn"):_T("lfn")); } return add_entry(&ent); case TOK_GETKNOWNFOLDERPATH: ent.which=EW_GETOSINFO; ent.offsets[1]=GetUserVarIndex(line, 1); ent.offsets[2]=add_string(line.gettoken_str(2)); ent.offsets[3]=GETOSINFO_KNOWNFOLDER; SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("->%") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(2), line.gettoken_str(1)); return add_entry(&ent); case TOK_GETWINVER: { int k = line.gettoken_enum(2, _T("major\0minor\0build\0servicepack\0product\0ntddimajmin\0")), cb = 0, ofs = 0; switch(k) { case 0: cb = 1, ofs = ABI_OSINFOOFFSET + FIELD_OFFSET(osinfo, WVMaj); break; case 1: cb = 1, ofs = ABI_OSINFOOFFSET + FIELD_OFFSET(osinfo, WVMin); break; case 2: cb = 4, ofs = ABI_OSINFOOFFSET + FIELD_OFFSET(osinfo, WVBuild); break; case 3: cb = 1, ofs = ABI_OSINFOOFFSET + FIELD_OFFSET(osinfo, WVSP); break; case 4: cb = 1, ofs = ABI_OSINFOOFFSET + FIELD_OFFSET(osinfo, WVProd); break; case 5: cb = 2, ofs = ABI_OSINFOOFFSET + FIELD_OFFSET(osinfo, WVMin); break; default: PRINTHELP(); } ent.which=EW_GETOSINFO; ent.offsets[1]=GetUserVarIndex(line, 1); ent.offsets[2]=add_intstring(ABI_OSINFOADDRESS); ent.offsets[3]=GETOSINFO_READMEMORY; ent.offsets[4]=add_intstring((cb << 0) | (ofs << 24)); SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("=%") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1), line.gettoken_str(2)); } return add_entry(&ent); case TOK_READMEMORY: ent.which=EW_GETOSINFO; ent.offsets[1]=GetUserVarIndex(line, 1); ent.offsets[2]=add_string(line.gettoken_str(2)); ent.offsets[3]=GETOSINFO_READMEMORY; ent.offsets[4]=add_string(line.gettoken_str(3)); SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("=*%") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1), line.gettoken_str(2)); return add_entry(&ent); case TOK_SEARCHPATH: ent.which=EW_SEARCHPATH; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); SCRIPT_MSG(_T("SearchPath %") NPRIs _T(" %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); #else case TOK_SEARCHPATH: case TOK_GETTEMPFILENAME: case TOK_GETFULLPATHNAME: case TOK_GETKNOWNFOLDERPATH: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FNUTIL not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_FNUTIL case TOK_GETDLLVERSION: #ifdef NSIS_SUPPORT_GETDLLVERSION ent.which=EW_GETDLLVERSION; if ((ent.offsets[3]=line.gettoken_enum(1, _T("/ProductVersion\0")) == 0 ? 2 : 0)) line.eattoken(); ent.offsets[0]=GetUserVarIndex(line, 2); ent.offsets[1]=GetUserVarIndex(line, 3); ent.offsets[2]=add_string(line.gettoken_str(1)); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("GetDLLVersion: %") NPRIs _T("->%") NPRIs _T(",%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_GETDLLVERSION not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_GETDLLVERSION case TOK_GETFILETIME: #ifdef NSIS_SUPPORT_GETFILETIME ent.which=EW_GETFILETIME; ent.offsets[0]=GetUserVarIndex(line, 2); ent.offsets[1]=GetUserVarIndex(line, 3); ent.offsets[2]=add_string(line.gettoken_str(1)); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("GetFileTime: %") NPRIs _T("->%") NPRIs _T(",%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_GETFILETIME not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_GETFILETIME #ifdef NSIS_SUPPORT_INTOPTS case TOK_INTOP: case TOK_INTPTROP: { const TCHAR *val1=line.gettoken_str(2), *opstr=0, *val2=0, *cmdname=get_commandtoken_name(which_token); int t64 = is_target_64bit(), res; ent.which=EW_INTOP; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[3]=line.gettoken_enum(3,_T("+\0-\0*\0/\0|\0&\0^\0!\0||\0&&\0%\0<<\0>>\0>>>\0~\0")); if (ent.offsets[0] < 0 || ent.offsets[3] < 0 || ((ent.offsets[3] == 7 || ent.offsets[3] == 14) && line.getnumtokens() > 4)) PRINTHELP() if (ent.offsets[3] != 7 && ent.offsets[3] != 14) val2=line.gettoken_str(4); if (ent.offsets[3] == 14) val2=t64?_T("0xFFFFFFFFFFFFFFFF"):_T("0xFFFFFFFF"), ent.offsets[3]=6, opstr = _T("^"); // ~ using ^ if (TOK_INTPTROP == which_token && t64) { res = doParse(2, _T("System::Int64Op %") NPRIs _T(" %") NPRIs _T(" %") NPRIs _T("\n"), val1, opstr ? opstr : line.gettoken_str(3), val2 ? val2 : _T("")); if (res != PS_OK) return res; ent.which=EW_PUSHPOP, ent.offsets[1]=1, ent.offsets[3]=0; // Pop $result } else { ent.offsets[1]=add_string(val1); if (val2) ent.offsets[2]=add_string(val2); } SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("=%") NPRIs _T("%") NPRIs _T("%") NPRIs _T("\n"),cmdname,line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return add_entry(&ent); case TOK_INTFMT: case TOK_INT64FMT: ent.which=EW_INTFMT; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0]<0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=which_token == TOK_INT64FMT; if (ent.offsets[3] && !is_target_64bit()) return (ERROR_MSG(_T("%") NPRIns _T("\n"), "Instruction only supported by 64-bit targets!"), PS_ERROR); SCRIPT_MSG(_T("IntFmt: %") NPRIs _T("->%") NPRIs _T(" (fmt:%") NPRIs _T(")\n"),line.gettoken_str(3),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_INTCMP: case TOK_INTCMPU: case TOK_INT64CMP: case TOK_INT64CMPU: case TOK_INTPTRCMP: case TOK_INTPTRCMPU: { int t64 = is_target_64bit(), o32 = TOK_INTCMP == which_token || TOK_INTCMPU == which_token, o64 = TOK_INT64CMP == which_token || TOK_INT64CMPU == which_token; if (!t64 && o64) return (ERROR_MSG(_T("%") NPRIns _T("\n"), "Instruction only supported by 64-bit targets!"), PS_ERROR); ent.which=EW_INTCMP; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[5]=(which_token == TOK_INTCMPU || which_token == TOK_INT64CMPU || which_token == TOK_INTPTRCMPU) | (t64 && !o32 ? 0x8000 : 0); if (process_jump(line,3,&ent.offsets[2]) | process_jump(line,4,&ent.offsets[3]) | process_jump(line,5,&ent.offsets[4])) PRINTHELP() SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs _T(":%") NPRIs _T(" equal=%") NPRIs _T(", < %") NPRIs _T(", > %") NPRIs _T("\n"),line.gettoken_str(0), line.gettoken_str(1),line.gettoken_str(2), line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(5)); return add_entry(&ent); } #else case TOK_INTOP: case TOK_INTPTROP: case TOK_INTFMT: case TOK_INT64FMT: case TOK_INTCMP: case TOK_INTCMPU: case TOK_INT64CMP: case TOK_INT64CMPU: case TOK_INTPTRCMP: case TOK_INTPTRCMPU: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_INTOPTS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_INTOPTS #ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS case TOK_READREGSTR: case TOK_READREGDWORD: { ent.which=EW_READREGSTR; ent.offsets[0]=GetUserVarIndex(line, 1); HKEY hRK = ParseRegRootKey(line,2); if (ent.offsets[0] == -1 || INVALIDREGROOT == hRK) PRINTHELP() ent.offsets[1]=REGROOTKEYTOINT(hRK); ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); if (which_token == TOK_READREGDWORD) ent.offsets[4]=1; else ent.offsets[4]=0; if (line.gettoken_str(3)[0] == _T('\\')) warning_fl(DW_PARSE_REGPATHPREFIX, _T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs _T(" %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\n"),line.gettoken_str(0), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return add_entry(&ent); case TOK_DELETEREGVALUE: case TOK_DELETEREGKEY: { int a=1, iskeyop; if ((iskeyop = which_token == TOK_DELETEREGKEY)) { for (;; ++a) { switch(line.gettoken_enum(a,_T("/ifempty\0/ifnosubkeys\0/ifnovalues\0"))) { case 0: ent.offsets[4]|=((DELREGKEY_ONLYIFNOSUBKEYS|DELREGKEY_ONLYIFNOVALUES)<(&data[data_len-4]))) PRINTHELPEX(cmdname); // Must end with 4 zero bytes SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("=%") NPRIs _T("\n"), cmdname,line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); if (multisz && !build_unicode) for (int p1=0, p2=p1; p1 < data_len; data_len--) data[p1++]=data[p2], p2+=2; // BUGBUG: Should convert each string from UTF-16 to DBCS but only exehead knows the codepage, limited to ASCII for now. ent.offsets[3]=add_db_data(data,data_len); if (ent.offsets[3] < 0) return PS_ERROR; ent.offsets[4]=REG_BINARY, ent.offsets[5]=none?REG_NONE:multisz?REG_MULTI_SZ:REG_BINARY; } if (which_token == TOK_WRITEREGDWORD) { ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=ent.offsets[5]=REG_DWORD; SCRIPT_MSG(_T("WriteRegDWORD: %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("=%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } } return add_entry(&ent); case TOK_ENUMREGKEY: case TOK_ENUMREGVAL: { ent.which=EW_REGENUM; ent.offsets[0]=GetUserVarIndex(line, 1); HKEY hRK=ParseRegRootKey(line,2); if (ent.offsets[0] == -1 || INVALIDREGROOT == hRK) PRINTHELP() ent.offsets[1]=REGROOTKEYTOINT(hRK); ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=which_token == TOK_ENUMREGKEY; if (line.gettoken_str(3)[0] == _T('\\')) warning_fl(DW_PARSE_REGPATHPREFIX, _T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs _T(" %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\n"),which_token == TOK_ENUMREGKEY ? _T("EnumRegKey") : _T("EnumRegValue"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return add_entry(&ent); #else case TOK_READREGSTR: case TOK_READREGDWORD: case TOK_DELETEREGVALUE: case TOK_DELETEREGKEY: case TOK_WRITEREGSTR: case TOK_WRITEREGEXPANDSTR: case TOK_WRITEREGBIN: case TOK_WRITEREGMULTISZ: case TOK_WRITEREGDWORD: case TOK_ENUMREGKEY: case TOK_ENUMREGVAL: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_REGISTRYFUNCTIONS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_REGISTRYFUNCTIONS #ifdef NSIS_SUPPORT_STACK case TOK_EXCH: { int swapitem=1; int save=GetUserVarIndex(line, 1); ent.which=EW_PUSHPOP; if (line.gettoken_str(1)[0] && save<0) { int succ=0; swapitem=line.gettoken_int(1,&succ); if (!succ || swapitem <= 0) PRINTHELP() } if (save>=0) { SCRIPT_MSG(_T("Exch(%") NPRIs _T(",0)\n"),line.gettoken_str(1)); ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; ent.offsets[2]=0; add_entry(&ent); } else SCRIPT_MSG(_T("Exch(st(%d),0)\n"),swapitem); ent.offsets[0]=0; ent.offsets[1]=0; ent.offsets[2]=swapitem; if (save>=0) { add_entry(&ent); ent.offsets[0]=save; ent.offsets[1]=1; ent.offsets[2]=0; } DefineInnerLangString(NLF_INST_CORRUPTED); } return add_entry(&ent); case TOK_PUSH: ent.which=EW_PUSHPOP; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; SCRIPT_MSG(_T("Push: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_POP: ent.which=EW_PUSHPOP; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=1; if (ent.offsets[0] < 0) PRINTHELP() SCRIPT_MSG(_T("Pop: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #else case TOK_POP: case TOK_PUSH: case TOK_EXCH: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_STACK not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_STACK #ifdef NSIS_SUPPORT_ENVIRONMENT case TOK_READENVSTR: ent.which=EW_READENVSTR; ent.offsets[0]=GetUserVarIndex(line, 1); { TCHAR str[NSIS_MAX_STRLEN]; _tcscpy(str, _T("%")); _tcscat(str, line.gettoken_str(2)); _tcscat(str, _T("%")); ent.offsets[1]=add_string(str); if (ent.offsets[0] < 0 || _tcslen(line.gettoken_str(2))<1) PRINTHELP() } ent.offsets[2]=1; SCRIPT_MSG(_T("ReadEnvStr: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); case TOK_EXPANDENVSTRS: ent.which=EW_READENVSTR; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=0; if (ent.offsets[0] < 0) PRINTHELP() SCRIPT_MSG(_T("ExpandEnvStrings: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); #else case TOK_EXPANDENVSTRS: case TOK_READENVSTR: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_ENVIRONMENT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_ENVIRONMENT #ifdef NSIS_SUPPORT_FINDFIRST case TOK_FINDFIRST: ent.which=EW_FINDFIRST; ent.offsets[0]=GetUserVarIndex(line, 2); // out ent.offsets[1]=GetUserVarIndex(line, 1); // handleout ent.offsets[2]=add_string(line.gettoken_str(3)); // filespec if (ent.offsets[0] < 0 || ent.offsets[1] < 0) PRINTHELP() SCRIPT_MSG(_T("FindFirst: spec=\"%") NPRIs _T("\" handle=%") NPRIs _T(" output=%") NPRIs _T("\n"),line.gettoken_str(3),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FINDNEXT: ent.which=EW_FINDNEXT; ent.offsets[0]=GetUserVarIndex(line, 2); ent.offsets[1]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0 || ent.offsets[1] < 0) PRINTHELP() SCRIPT_MSG(_T("FindNext: handle=%") NPRIs _T(" output=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FINDCLOSE: ent.which=EW_FINDCLOSE; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() SCRIPT_MSG(_T("FindClose: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #else case TOK_FINDCLOSE: case TOK_FINDNEXT: case TOK_FINDFIRST: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FINDFIRST not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_FINDFIRST #ifdef NSIS_SUPPORT_FILEFUNCTIONS case TOK_FILEOPEN: { ent.which=EW_FOPEN; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[3]=add_string(line.gettoken_str(2)); ent.offsets[1]=0; //openmode if (!_tcsicmp(line.gettoken_str(3),_T("r"))) { ent.offsets[1]=GENERIC_READ; ent.offsets[2]=OPEN_EXISTING; } else if (!_tcsicmp(line.gettoken_str(3),_T("w"))) { ent.offsets[1]=GENERIC_WRITE; ent.offsets[2]=CREATE_ALWAYS; } else if (!_tcsicmp(line.gettoken_str(3),_T("a"))) { ent.offsets[1]=GENERIC_WRITE|GENERIC_READ; ent.offsets[2]=OPEN_ALWAYS; } if (ent.offsets[0] < 0 || !ent.offsets[1]) PRINTHELP() } SCRIPT_MSG(_T("FileOpen: %") NPRIs _T(" as %") NPRIs _T(" -> %") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILECLOSE: ent.which=EW_FCLOSE; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle if (ent.offsets[0] < 0) PRINTHELP() SCRIPT_MSG(_T("FileClose: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILEREAD: ent.which=EW_FGETS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=GetUserVarIndex(line, 2); // output string if (line.gettoken_str(3)[0]) ent.offsets[2]=add_string(line.gettoken_str(3)); else ent.offsets[2]=add_intstring(NSIS_MAX_STRLEN-1); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("FileRead: %") NPRIs _T("->%") NPRIs _T(" (max:%") NPRIs _T(")\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_FILEWRITE: ent.which=EW_FPUTS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=add_string(line.gettoken_str(2)); if (ent.offsets[0]<0) PRINTHELP() SCRIPT_MSG(_T("FileWrite: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILEREADBYTE: ent.which=EW_FGETS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=GetUserVarIndex(line, 2); // output string ent.offsets[2]=add_asciistring(_T("1")); ent.offsets[3]=1; if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("FileReadByte: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FILEWRITEBYTE: ent.which=EW_FPUTS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=1; if (ent.offsets[0]<0) PRINTHELP() SCRIPT_MSG(_T("FileWriteByte: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); #ifdef _UNICODE case TOK_FILEREADUTF16LE: if (!build_unicode) { ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } ent.which=EW_FGETWS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=GetUserVarIndex(line, 2); // output string if (line.gettoken_str(3)[0]) ent.offsets[2]=add_string(line.gettoken_str(3)); else ent.offsets[2]=add_intstring(NSIS_MAX_STRLEN-1); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("FileReadUTF16LE: %") NPRIs _T("->%") NPRIs _T(" (max:%") NPRIs _T(")\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_FILEWRITEUTF16LE: if (!build_unicode) { ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } { UINT bom=0, swofs=0; if (!_tcsicmp(_T("/BOM"),line.gettoken_str(swofs+1))) ++bom, ++swofs; if (!_tcsicmp(_T("/NoBOM"),line.gettoken_str(swofs+1))) bom = 0, ++swofs; // Undocumented switch ent.which=EW_FPUTWS; ent.offsets[0]=GetUserVarIndex(line, swofs+1); // file handle ent.offsets[1]=add_string(line.gettoken_str(swofs+2)); ent.offsets[3]=bom; if (ent.offsets[0]<0 || line.getnumtokens()-swofs != 3) PRINTHELP() SCRIPT_MSG(_T("FileWriteUTF16LE: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(swofs+2),line.gettoken_str(swofs+1)); } return add_entry(&ent); case TOK_FILEREADWORD: if (!build_unicode) { ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } ent.which=EW_FGETWS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=GetUserVarIndex(line, 2); // output string ent.offsets[2]=add_asciistring(_T("1")); ent.offsets[3]=1; if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("FileReadWord: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FILEWRITEWORD: if (!build_unicode) { ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } ent.which=EW_FPUTWS; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=1; if (ent.offsets[0]<0) PRINTHELP() SCRIPT_MSG(_T("FileWriteWord: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); #endif //~ _UNICODE case TOK_FILESEEK: { const TCHAR *modestr; int tab[3]={FILE_BEGIN,FILE_CURRENT,FILE_END}; int mode=line.gettoken_enum(3,_T("SET\0CUR\0END\0")); ent.which=EW_FSEEK; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=GetUserVarIndex(line, 4); ent.offsets[2]=add_string(line.gettoken_str(2)); if (mode<0 && !line.gettoken_str(3)[0]) { mode=0; modestr=_T("SET"); } else modestr=line.gettoken_str(3); if (mode<0 || ent.offsets[0] < 0 || (ent.offsets[1]<0 && line.gettoken_str(4)[0])) PRINTHELP() ent.offsets[3]=tab[mode]; SCRIPT_MSG(_T("FileSeek: fp=%") NPRIs _T(", ofs=%") NPRIs _T(", mode=%") NPRIs _T(", output=%") NPRIs _T("\n"), line.gettoken_str(1), line.gettoken_str(2), modestr, line.gettoken_str(4)); } return add_entry(&ent); #else case TOK_FILEOPEN: case TOK_FILECLOSE: case TOK_FILESEEK: case TOK_FILEREAD: case TOK_FILEWRITE: case TOK_FILEREADBYTE: case TOK_FILEWRITEBYTE: #ifdef _UNICODE case TOK_FILEREADUTF16LE: case TOK_FILEWRITEUTF16LE: case TOK_FILEREADWORD: case TOK_FILEWRITEWORD: #endif ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FILEFUNCTIONS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_FILEFUNCTIONS #ifdef NSIS_SUPPORT_REBOOT case TOK_REBOOT: { int ret = add_entry_direct(EW_REBOOT, 0xbadf00d); if (ret != PS_OK) return ret; ret = add_entry_direct(EW_QUIT); if (ret != PS_OK) return ret; SCRIPT_MSG(_T("Reboot!\n")); DefineInnerLangString(NLF_INST_CORRUPTED); } return PS_OK; case TOK_IFREBOOTFLAG: return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(exec_reboot), ~0); //new value mask - keep flag case TOK_SETREBOOTFLAG: ent.offsets[1] = line.gettoken_enum(1,_T("false\0true\0")); if (ent.offsets[1] < 0) PRINTHELP() return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(exec_reboot), add_intstring(ent.offsets[1])); #else case TOK_REBOOT: case TOK_IFREBOOTFLAG: case TOK_SETREBOOTFLAG: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_REBOOT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_REBOOT #ifdef NSIS_CONFIG_LOG case TOK_LOGSET: ent.which=EW_LOG; ent.offsets[0]=1; ent.offsets[1]=line.gettoken_enum(1,_T("off\0on\0")); if (ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("LogSet: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_LOGTEXT: ent.which=EW_LOG; ent.offsets[0]=0; ent.offsets[1]=add_string(line.gettoken_str(1)); SCRIPT_MSG(_T("LogText \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); #else case TOK_LOGSET: case TOK_LOGTEXT: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_LOG not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_COMPONENTPAGE case TOK_SECTIONSETTEXT: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[2]=SECTION_FIELD_SET(name_ptr); ent.offsets[4]=add_string(line.gettoken_str(2)); if (!IsIntOrUserVar(line,1)) PRINTHELP() SCRIPT_MSG(_T("SectionSetText: %") NPRIs _T("=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONGETTEXT: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(name_ptr); if (!IsIntOrUserVar(line,1) || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("SectionGetText: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONSETFLAGS: { int num, conv; ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=(num=line.gettoken_intx(2,&conv), conv) ? add_intstring(num) : add_string(line.gettoken_str(2)); ent.offsets[2]=SECTION_FIELD_SET(flags); ent.offsets[3]=1; if (!IsIntOrUserVar(line,1) || (!conv && !IsIntOrUserVar(line,2))) PRINTHELP() SCRIPT_MSG(_T("SectionSetFlags: %") NPRIs _T("=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); } case TOK_SECTIONGETFLAGS: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(flags); if (!IsIntOrUserVar(line,1) || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("SectionGetFlags: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_INSTTYPESETTEXT: ent.which=EW_INSTTYPESET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=1; SCRIPT_MSG(_T("InstTypeSetText: %") NPRIs _T("=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_INSTTYPEGETTEXT: ent.which=EW_INSTTYPESET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=0; if (!IsIntOrUserVar(line,1) || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("InstTypeGetText: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONSETINSTTYPES: { int num, conv; ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=(num=line.gettoken_intx(2,&conv), conv) ? add_intstring(num) : add_string(line.gettoken_str(2)); ent.offsets[2]=SECTION_FIELD_SET(install_types); if (!IsIntOrUserVar(line,1) || (!conv && !IsIntOrUserVar(line,2))) PRINTHELP() SCRIPT_MSG(_T("SectionSetInstTypes: %") NPRIs _T("=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); } case TOK_SECTIONGETINSTTYPES: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(install_types); if (!IsIntOrUserVar(line,1) || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("SectionGetInstTypes: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONSETSIZE: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=SECTION_FIELD_SET(size_kb); SCRIPT_MSG(_T("SectionSetSize: %") NPRIs _T("=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONGETSIZE: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(size_kb); if (!IsIntOrUserVar(line,1) || ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("SectionGetSize: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SETCURINSTTYPE: ent.which=EW_INSTTYPESET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; ent.offsets[2]=1; ent.offsets[3]=1; SCRIPT_MSG(_T("SetCurInstType: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_GETCURINSTTYPE: ent.which=EW_INSTTYPESET; ent.offsets[0]=0; ent.offsets[1]=GetUserVarIndex(line,1); ent.offsets[2]=0; ent.offsets[3]=1; if (ent.offsets[1]<0) PRINTHELP() SCRIPT_MSG(_T("GetCurInstType: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #else case TOK_SECTIONSETTEXT: case TOK_SECTIONGETTEXT: case TOK_SECTIONSETFLAGS: case TOK_SECTIONGETFLAGS: case TOK_SECTIONSETSIZE: case TOK_SECTIONGETSIZE: case TOK_SECTIONSETINSTTYPES: case TOK_SECTIONGETINSTTYPES: case TOK_SETCURINSTTYPE: case TOK_GETCURINSTTYPE: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPONENTPAGE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT case TOK_SETBRANDINGIMAGE: { SCRIPT_MSG(_T("SetBrandingImage: ")); ent.which=EW_LOADANDSETIMAGE; for (int i = 1; i < line.getnumtokens(); i++) if (!_tcsnicmp(line.gettoken_str(i),_T("/IMGID="),7)) { ent.offsets[2]=_ttoi(line.gettoken_str(i)+7); SCRIPT_MSG(_T("/IMGID=%d "),ent.offsets[2]); } else if (!_tcsicmp(line.gettoken_str(i),_T("/RESIZETOFIT"))) { ent.offsets[3]=LASIF_FITCTLW|LASIF_FITCTLH; SCRIPT_MSG(_T("/RESIZETOFIT ")); } else if (!ent.offsets[1]) { ent.offsets[1]=add_string(line.gettoken_str(i)); SCRIPT_MSG(_T("\"%") NPRIs _T("\" "), line.gettoken_str(i)); } else { SCRIPT_MSG(_T("\n")); PRINTHELP(); } SCRIPT_MSG(_T("\n")); if (!ent.offsets[2]) { ent.offsets[2]=branding_image_id; if (!branding_image_found) { ERROR_MSG(_T("\nError: no branding image found in chosen UI!\n")); return PS_ERROR; } } ent.offsets[0]=-1; // Outvar ent.offsets[3]|=LASIF_LR_LOADFROMFILE|LASIF_STRID; } return add_entry(&ent); case TOK_LOADANDSETIMAGE: { ent.which=EW_LOADANDSETIMAGE; int tidx = 1, conv = 1, fail = 0; unsigned int flags = LASIF_HWND, lrflagsin; for (; tidx < line.getnumtokens(); tidx++) { if (!_tcsicmp(line.gettoken_str(tidx),_T("/EXERESOURCE"))) flags |= LASIF_EXERES; else if (!_tcsicmp(line.gettoken_str(tidx),_T("/STRINGID"))) flags |= LASIF_STRID; else if (!_tcsicmp(line.gettoken_str(tidx),_T("/RESIZETOFIT"))) flags |= LASIF_FITCTLW|LASIF_FITCTLH; else if (!_tcsicmp(line.gettoken_str(tidx),_T("/RESIZETOFITWIDTH"))) flags |= LASIF_FITCTLW; else if (!_tcsicmp(line.gettoken_str(tidx),_T("/RESIZETOFITHEIGHT"))) flags |= LASIF_FITCTLH; else if (!_tcsicmp(line.gettoken_str(tidx),_T("/GETDLGITEM"))) flags &= ~LASIF_HWND; // Reuses TOK_SETBRANDINGIMAGE functionality else { if (line.gettoken_str(tidx)[0] == '/') ++fail; break; } } ent.offsets[2] = (flags & LASIF_HWND) ? add_string(line.gettoken_str(tidx+0)) : line.gettoken_int(tidx+0, &conv); fail |= !conv; // HWND/CtrlId flags |= (line.gettoken_int(tidx+1, &conv) & LASIM_IMAGE); fail |= !conv; // IMAGE_* flags |= ((lrflagsin = line.gettoken_intx(tidx+2, &conv)) & LASIM_LR); fail |= !conv; // LR_* ent.offsets[1] = (flags & LASIF_STRID) ? add_string(line.gettoken_str(tidx+3)) : line.gettoken_int(tidx+3, &conv); fail |= !conv; // Image path/resid ent.offsets[3] = flags; // Packed flags, IMAGE_* and LR_* ent.offsets[0] = GetUserVarIndex(line, tidx+4); // Outvar SCRIPT_MSG(_T("LoadAndSetImage %") NPRIs _T(" %#x \"%") NPRIs _T("\""), line.gettoken_str(tidx+0), flags, line.gettoken_str(tidx+3)); if (ent.offsets[0] >= 0) SCRIPT_MSG(_T(" ->%") NPRIs _T(""), line.gettoken_str(tidx+4)); SCRIPT_MSG(_T("\n")); if ((lrflagsin & LASIM_LR) != lrflagsin) warning_fl(DW_PARSE_NUMBEROUTOFSPEC, _T("Out of spec: \"%") NPRIs _T("\""), line.gettoken_str(tidx+2)); if (fail) PRINTHELP(); } return add_entry(&ent); #else case TOK_SETBRANDINGIMAGE: case TOK_LOADANDSETIMAGE: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_ENHANCEDUI_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_ENHANCEDUI_SUPPORT case TOK_DEFVAR: { int a=1; if (!_tcsicmp(line.gettoken_str(1),_T("/GLOBAL"))) a++; else if (line.getnumtokens() == 3) PRINTHELP(); if (build_cursection) { if (a==1) { ERROR_MSG(_T("Var: currently, only global variables can be defined.\n")); PRINTHELP(); } } SCRIPT_MSG(_T("Var: \"%") NPRIs _T("\"\n"),line.gettoken_str(a)); return DeclaredUserVar(line.gettoken_str(a)); } return PS_OK; #ifdef NSIS_SUPPORT_VERSION_INFO case TOK_VI_ADDKEY: { LANGID LangID=0; int a = 1; // Allow people to force Neutral (if /LANG=* is not present it uses the default) const bool forceneutrallang = !_tcsicmp(line.gettoken_str(a),_T("/LANG=0")); if (!_tcsnicmp(line.gettoken_str(a),_T("/LANG="),6)) LangID=ParseLangId(line.gettoken_str(a++)+6); if (line.getnumtokens()!=a+2) PRINTHELP(); TCHAR *pKey = line.gettoken_str(a); TCHAR *pValue = line.gettoken_str(a+1); if ( !(*pKey) ) { ERROR_MSG(_T("Error: empty name for version info key!\n")); return PS_ERROR; } else { SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"), line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1)); const bool allowdeflangfallback = a <= 1 && !forceneutrallang; if ( a > 1 && 0 == LangID && !forceneutrallang) { ERROR_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" is not a valid language code!\n"),line.gettoken_str(0), line.gettoken_str(1)); return PS_ERROR; } unsigned int codepage; // We rely on GetLangNameAndCPForVersionResource to update LangID if required const TCHAR *lang_name = GetLangNameAndCPForVersionResource(LangID, &codepage, allowdeflangfallback); if ( rVersionInfo.SetKeyValue(LangID, codepage, pKey, pValue) ) { ERROR_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" \"%04d-%") NPRIs _T("\" already defined!\n"),line.gettoken_str(0), line.gettoken_str(2), LangID, lang_name); return PS_ERROR; } return PS_OK; } } case TOK_VI_SETPRODUCTVERSION: case TOK_VI_SETFILEVERSION: // Probably not required, but this code retains the <= 2.46 behaviour and // does not fail on bad product version number here, it "validates" in CEXEBuild::AddVersionInfo() // // It is ok for us to use rVersionInfo as storage since VIProductVersion is required by VIAddVersionKey { const bool settingFileVer = TOK_VI_SETFILEVERSION == which_token; const unsigned int reuseFlag = settingFileVer ? 4 : 1; if (reuseFlag & version_fixedflags) { ERROR_MSG(_T("Error: %") NPRIs _T(" already defined!\n"), line.gettoken_str(0)); return PS_ERROR; } version_fixedflags |= reuseFlag; int imm, iml, ilm, ill; const bool validInput = _stscanf(line.gettoken_str(1), _T("%d.%d.%d.%d"), &imm, &iml, &ilm, &ill) == 4; if (settingFileVer) { if (!validInput) { ERROR_MSG(_T("Error: invalid %") NPRIs _T(" format, should be X.X.X.X\n"),line.gettoken_str(0)); return PS_ERROR; } rVersionInfo.SetFileVersion(MAKELONG(iml, imm),MAKELONG(ill, ilm)); } else { if (validInput) { version_fixedflags |= 2; rVersionInfo.SetProductVersion(MAKELONG(iml, imm),MAKELONG(ill, ilm)); // FileVersion defaults to ProductVersion if (!(4 & version_fixedflags)) rVersionInfo.SetFileVersion(MAKELONG(iml, imm),MAKELONG(ill, ilm)); } } } return PS_OK; #else case TOK_VI_ADDKEY: case TOK_VI_SETPRODUCTVERSION: case TOK_VI_SETFILEVERSION: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_VERSION_INFO not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_SUPPORT_VERSION_INFO case TOK_LOCKWINDOW: #ifdef NSIS_LOCKWINDOW_SUPPORT SCRIPT_MSG(_T("LockWindow: lock state=%d\n"),line.gettoken_str(1)); ent.which=EW_LOCKWINDOW; ent.offsets[0]=line.gettoken_enum(1,_T("on\0off\0")); if (ent.offsets[0] == -1) PRINTHELP(); return add_entry(&ent); #else ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_LOCKWINDOW_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_LOCKWINDOW_SUPPORT // end of instructions /////////////////////////////////////////////////////////////////////////////// #ifdef NSIS_CONFIG_PLUGIN_SUPPORT case TOK_PLUGINDIR: { CEXEBuild::TARGETTYPE tt = m_target_type; int numtok = line.getnumtokens() - 1; TCHAR *path = line.gettoken_str(numtok); const TCHAR *cmdnam = get_commandtoken_name(which_token), *arcstr = 0; if (2 == numtok) { arcstr = line.gettoken_str(--numtok); if (_T('/') != *arcstr || CEXEBuild::TARGET_UNKNOWN == (tt = get_target_type(++arcstr))) { print_bad_targettype_parameter(cmdnam, _T("/")); return PS_ERROR; } } if (1 == numtok && *path) { const TCHAR *fmtstr = _T("%") NPRIs _T(": \"%") NPRIs _T("\"%") NPRIs _T("%") NPRIs _T("%") NPRIs _T("\n"); SCRIPT_MSG(fmtstr, cmdnam, path, arcstr ? _T(" (") : _T(""), arcstr ? arcstr : _T(""), arcstr ? _T(")") : _T("")); PATH_CONVERT(path); m_plugins[tt].AddPluginsDir(path, is_targettype_64bit(tt), !!display_script); return PS_OK; } } PRINTHELP(); case TOK__PLUGINCOMMAND: { tstring command, dllPath; if (!m_pPlugins->GetCommandInfo(line.gettoken_str(0), command, dllPath)) { ERROR_MSG(_T("Plugin command %") NPRIs _T(" conflicts with a plugin in another directory!\n"),command.c_str()); return PS_ERROR; } tstring dllName = get_file_name(dllPath); int data_handle = m_pPlugins->GetDllDataHandle(!!uninstall_mode, command), ret; if (uninstall_mode) uninst_plugin_used = true; else plugin_used = true; // Initialize $PLUGINSDIR ent.which=EW_CALL; ent.offsets[0]=ns_func.add(uninstall_mode?_T("un.Initialize_____Plugins"):_T("Initialize_____Plugins"),0); if ((ret=add_entry(&ent)) != PS_OK) return ret; TCHAR tempDLL[NSIS_MAX_STRLEN]; wsprintf(tempDLL, _T("$PLUGINSDIR\\%") NPRIs, dllName.c_str()); // DLL name on the end-users machine // Add the DLL to the installer if (data_handle == -1) { int files_added=0; const int old_build_allowskipfiles=build_allowskipfiles; build_allowskipfiles=1; // on const int old_build_overwrite=build_overwrite; build_overwrite=1; // off const int old_build_datesave=build_datesave; build_datesave=0; // off // Jim Park: While the code looks as if the same DLL is added multiple // times for each command in the DLL, this is actually not the case // because of CEXEBuild::datablock_optimize() that tries to discover // duplicates and reuse them. ret=do_add_file(dllPath.c_str(),0,0,&files_added,tempDLL,2,&data_handle); // 2 means no size add if (ret != PS_OK || files_added == 0) { return files_added ? ret : PS_ERROR; } m_pPlugins->SetDllDataHandle(!!uninstall_mode, command, data_handle); build_overwrite=old_build_overwrite; build_datesave=old_build_datesave; build_allowskipfiles=old_build_allowskipfiles; } else { ent.which=EW_EXTRACTFILE; DefineInnerLangString(NLF_SKIPPED); DefineInnerLangString(NLF_ERR_DECOMPRESSING); DefineInnerLangString(NLF_ERR_WRITING); DefineInnerLangString(NLF_EXTRACT); DefineInnerLangString(NLF_CANT_WRITE); ent.offsets[0]=1; // overwrite off ent.offsets[0]|=(MB_RETRYCANCEL|MB_ICONSTOP|(IDCANCEL<<21))<<3; ent.offsets[1]=add_string(tempDLL); ent.offsets[2]=data_handle; ent.offsets[3]=0xffffffff; ent.offsets[4]=0xffffffff; ent.offsets[5]=DefineInnerLangString(NLF_FILE_ERROR); if ((ret=add_entry(&ent)) != PS_OK) return ret; } // SetDetailsPrint lastused (special) ret=add_entry_direct(EW_SETFLAG, FLAG_OFFSET(status_update), 0, 1, -1); if (ret != PS_OK) return ret; // Call the DLL tstring funcname = get_string_suffix(command, _T("::")); SCRIPT_MSG(_T("Plugin command: %") NPRIs,funcname.c_str()); int i = 1; int nounload = 0; if (!_tcsicmp(line.gettoken_str(i), _T("/NOUNLOAD"))) { i++, nounload++; } // First push dll args int parmst=i; // we push 'em in reverse order int nounloadmisused=0; for (; i < line.getnumtokens(); i++) { int w=parmst + (line.getnumtokens()-i - 1); ent.which=EW_PUSHPOP; ent.offsets[0]=add_string(line.gettoken_str(w)); if (!_tcsicmp(line.gettoken_str(w), _T("/NOUNLOAD"))) nounloadmisused=1; ent.offsets[1]=0; ent.offsets[2]=0; if ((ret=add_entry(&ent)) != PS_OK) return ret; SCRIPT_MSG(_T(" %") NPRIs,line.gettoken_str(i)); } SCRIPT_MSG(_T("\n")); if (nounloadmisused) warning_fl(DW_PLUGIN_NOUNLOAD_PLACEMENT, _T("/NOUNLOAD must come first before any plugin parameter. Unless the plugin you are trying to use has a parameter /NOUNLOAD, you are doing something wrong")); // next, call it ent.which=EW_REGISTERDLL; ent.offsets[0]=add_string(tempDLL); ent.offsets[1]=add_string(funcname.c_str()); ent.offsets[2]=0; ent.offsets[3]=nounload|build_plugin_unload; ent.offsets[4]=1; if ((ret=add_entry(&ent)) != PS_OK) return ret; DefineInnerLangString(NLF_SYMBOL_NOT_FOUND); DefineInnerLangString(NLF_COULD_NOT_LOAD); DefineInnerLangString(NLF_NO_OLE); // not used anywhere: DefineInnerLangString(NLF_ERR_REG_DLL); return PS_OK; } case TOK_INITPLUGINSDIR: { int ret; SCRIPT_MSG(_T("%") NPRIs _T("\n"),line.gettoken_str(0)); if (uninstall_mode) uninst_plugin_used = true; else plugin_used = true; // Call [un.]Initialize_____Plugins ent.which=EW_CALL; ent.offsets[0]=ns_func.add(uninstall_mode?_T("un.Initialize_____Plugins"):_T("Initialize_____Plugins"),0); if ((ret=add_entry(&ent)) != PS_OK) return ret; // SetDetailsPrint lastused ret=add_entry_direct(EW_SETFLAG, FLAG_OFFSET(status_update), 0, 1); if (ret != PS_OK) return ret; } return PS_OK; #else case TOK_PLUGINDIR: case TOK__PLUGINCOMMAND: case TOK_INITPLUGINSDIR: ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_PLUGIN_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif //~ NSIS_CONFIG_PLUGIN_SUPPORT default: break; } ERROR_MSG(_T("Invalid command \"%") NPRIs _T("\"\n"),line.gettoken_str(0)); return PS_ERROR; } #ifdef NSIS_SUPPORT_FILE int CEXEBuild::do_add_file(const TCHAR *lgss, int attrib, int recurse, int *total_files, const TCHAR *name_override, int generatecode, int *data_handle, const set& excluded, const tstring& basedir, bool dir_created) { assert(!name_override || !recurse); tstring dir = get_dir_name(lgss), spec; if (dir == lgss) dir = _T("."), spec = lgss; else spec = tstring(lgss).substr(dir.length() + 1, tstring::npos); if (spec == _T("")) spec = _T("*"); if (basedir == _T("")) { dir_created = true; if (recurse) { // save $OUTDIR into $_OUTDIR [StrCpy $_OUTDIR $OUTDIR] if (add_entry_direct(EW_ASSIGNVAR, m_UserVarNames.get(_T("_OUTDIR")), add_asciistring(_T("$OUTDIR"))) != PS_OK) { return PS_ERROR; } } } boost::scoped_ptr dr( new_dir_reader() ); dr->exclude(excluded); dr->read(dir); // add files in the current directory for (dir_reader::iterator files_itr = dr->files().begin(); files_itr != dr->files().end(); files_itr++) { if (!dir_reader::matches(*files_itr, spec)) continue; if (!dir_created && generatecode) { SCRIPT_MSG(_T("%") NPRIs _T("File: Descending to: \"%") NPRIs _T("\"\n"), generatecode ? _T("") : _T("Reserve"), dir.c_str()); if (do_add_file_create_dir(dir, basedir, attrib) != PS_OK) { return PS_ERROR; } dir_created = true; } if (add_file(dir, *files_itr, attrib, name_override, generatecode, data_handle) != PS_OK) { return PS_ERROR; } (*total_files)++; } if (!recurse) return PS_OK; // recurse into directories for (dir_reader::iterator dirs_itr = dr->dirs().begin(); dirs_itr != dr->dirs().end(); dirs_itr++) { tstring new_dir; bool created = false; if (basedir == _T("")) new_dir = *dirs_itr; else new_dir = basedir + _T('\\') + *dirs_itr; tstring new_spec = dir + PLATFORM_PATH_SEPARATOR_STR + *dirs_itr + PLATFORM_PATH_SEPARATOR_STR; if (!dir_reader::matches(*dirs_itr, spec)) { new_spec += spec; } else if (generatecode) { // always create directories that match SCRIPT_MSG(_T("%") NPRIs _T("File: Descending to: \"%") NPRIs _T("\"\n"), generatecode ? _T("") : _T("Reserve"), new_spec.c_str()); if (do_add_file_create_dir(dir + _T('\\') + *dirs_itr, new_dir, attrib) != PS_OK) { return PS_ERROR; } created = true; } const TCHAR *new_spec_c = new_spec.c_str(); int res = do_add_file(new_spec_c, attrib, 1, total_files, NULL, generatecode, NULL, excluded, new_dir, created); if (res != PS_OK) { return PS_ERROR; } } if (basedir == _T("")) { SCRIPT_MSG(_T("%") NPRIs _T("File: Returning to: \"%") NPRIs _T("\"\n"), generatecode ? _T("") : _T("Reserve"), dir.c_str()); // restore $OUTDIR from $_OUTDIR [SetOutPath $_OUTDIR] if (add_entry_direct(EW_CREATEDIR, add_asciistring(_T("$_OUTDIR")), 1) != PS_OK) { return PS_ERROR; } } return PS_OK; } int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, const TCHAR *name_override, int generatecode, int *data_handle) { tstring newfn_s = dir + PLATFORM_PATH_SEPARATOR_C + file; const TCHAR *newfn = newfn_s.c_str(); const TCHAR *filename = file.c_str(); MMapFile mmap; UINT64 filesize; #ifdef _WIN32 HANDLE hFile = mmap.openfilehelper(newfn, filesize); if (hFile == INVALID_HANDLE_VALUE) { ERROR_MSG(_T("%") NPRIs _T("File: failed opening file \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } MANAGE_WITH(hFile, CloseHandle); #else FILE *hFile = mmap.openfilehelper(newfn, filesize); if (!hFile) { ERROR_MSG(_T("%") NPRIs _T("File: failed opening file \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } MANAGE_WITH(hFile, fclose); const int fd = fileno(hFile); #endif if (!mmap.setfile(hFile, filesize) && filesize) { ERROR_MSG(_T("%") NPRIs _T("File: failed creating mmap of \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } DWORD len = (DWORD) filesize; if (len != filesize) len = 0xffffffffUL - 1024; // truncate_cast but as large as possible if (generatecode&1) section_add_size_kb((len+1023)/1024); if (name_override) SCRIPT_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\"->\"%") NPRIs _T("\""),generatecode?_T(""):_T("Reserve"),filename,name_override); else SCRIPT_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\""),generatecode?_T(""):_T("Reserve"),filename); if (!build_compress_whole) if (build_compress) SCRIPT_MSG(_T(" [compress]")); fflush(stdout); TCHAR buf[1024]; int last_build_datablock_used=getcurdbsize(); entry ent={0,}; if (generatecode) { ent.which=EW_EXTRACTFILE; DefineInnerLangString(NLF_SKIPPED); DefineInnerLangString(NLF_ERR_DECOMPRESSING); DefineInnerLangString(NLF_ERR_WRITING); DefineInnerLangString(NLF_EXTRACT); DefineInnerLangString(NLF_CANT_WRITE); ent.offsets[0]=build_overwrite; if (name_override) { ent.offsets[1]=add_string(name_override); } else { const TCHAR *i=filename; TCHAR *o=buf; while (*i) { const TCHAR c=*i++; *o++=c; if (c == _T('$')) *o++=_T('$'); // BUGBUG: We could overflow buf here } *o=0; ent.offsets[1]=add_string(buf); } } ent.offsets[2]=add_db_data(&mmap); mmap.clear(); if (ent.offsets[2] < 0) return PS_ERROR; if (data_handle) *data_handle=ent.offsets[2]; { DWORD s=getcurdbsize()-last_build_datablock_used; if (s) s-=4; if (s != len) SCRIPT_MSG(_T(" %u/%u bytes\n"),s,len); else SCRIPT_MSG(_T(" %u bytes\n"),len); } if (generatecode) { if (build_datesave || build_overwrite>=0x3 /*ifnewer or ifdiff*/) { #ifdef _WIN32 FILETIME ft; if (GetFileTime(hFile,NULL,NULL,&ft)) { PULONGLONG fti = (PULONGLONG) &ft; *fti -= *fti % 20000000; // FAT write time has a resolution of 2 seconds ent.offsets[3]=ft.dwLowDateTime, ent.offsets[4]=ft.dwHighDateTime; } #else struct stat st; if (!fstat(fd, &st)) { unsigned long long ll = (st.st_mtime * 10000000LL) + 116444736000000000LL; ll -= ll % 20000000; // FAT write time has a resolution of 2 seconds ent.offsets[3] = (int) ll, ent.offsets[4] = (int) (ll >> 32); } #endif else { ERROR_MSG(_T("%") NPRIs _T("File: failed getting file date from \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } } else { ent.offsets[3]=0xffffffff, ent.offsets[4]=0xffffffff; } // overwrite flag can be 0, 1, 2 or 3. in all cases, 2 bits int mb = 0; if (build_allowskipfiles) { mb = MB_ABORTRETRYIGNORE | MB_ICONSTOP; mb |= IDIGNORE << 21; // default for silent installers } else { mb = MB_RETRYCANCEL | MB_ICONSTOP; mb |= IDCANCEL << 21; // default for silent installers } ent.offsets[0] |= mb << 3; ent.offsets[5] = DefineInnerLangString(build_allowskipfiles ? NLF_FILE_ERROR : NLF_FILE_ERROR_NOIGNORE); } if (generatecode) { int a=add_entry(&ent); if (a != PS_OK) return a; if (attrib) { #ifdef _WIN32 ent.which=EW_SETFILEATTRIBUTES; // $OUTDIR is the working directory ent.offsets[0]=add_string(name_override?name_override:buf); ent.offsets[1]=GetFileAttributes(newfn); ent.offsets[2]=0; ent.offsets[3]=0; ent.offsets[4]=0; ent.offsets[5]=0; if (INVALID_FILE_ATTRIBUTES != (DWORD)ent.offsets[1]) { a=add_entry(&ent); if (a != PS_OK) return a; } #endif } } return PS_OK; } int CEXEBuild::do_add_file_create_dir(const tstring& local_dir, const tstring& dir, int attrib) { tstring outdir_s = _T("$_OUTDIR\\") + dir; tstring::size_type pos = 1; pos = outdir_s.find(_T('$'), pos); while (pos != tstring::npos) { outdir_s = outdir_s.insert(pos, _T("$")); pos = outdir_s.find(_T('$'), pos + 2); } int outdir = add_string(outdir_s.c_str()); if (add_entry_direct(EW_CREATEDIR, outdir, 1) != PS_OK) { return PS_ERROR; } #ifdef _WIN32 if (attrib) { int ndc = add_asciistring(_T(".")); DWORD attr = GetFileAttributes(local_dir.c_str()); if (attr != INVALID_FILE_ATTRIBUTES) { if (add_entry_direct(EW_SETFILEATTRIBUTES, ndc, attr) != PS_OK) { return PS_ERROR; } } } #endif return PS_OK; } #endif nsis-3.11/Source/scriptpp.cpp000077500000000000000000001367151477201124000162400ustar00rootroot00000000000000/* * scriptpp.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #include #include #include "tstring.h" #include "lineparse.h" #include #include "tokens.h" #include "build.h" #include "utf.h" #include "util.h" #include "BinInterop.h" #include "dirreader.h" #include // for assert(3) #include #include #include "boost/scoped_ptr.hpp" using namespace std; #ifdef _WIN32 # include // for chdir #else # include // for stat and umask # include // for mode_t # include // for O_RDONLY # include # include // for mkstemp #endif #define MAX_INCLUDEDEPTH 10 #define PRINTHELPEX(cmdname) { print_help((cmdname)); return PS_ERROR; } #define PRINTHELP() PRINTHELPEX(line.gettoken_str(0)) static void PREPROCESSONLY_BEGINCOMMENT() { extern FILE *g_output; _ftprintf(g_output, _T("!if 0 /*\n")); } static void PREPROCESSONLY_ENDCOMMENT() { extern FILE *g_output; _ftprintf(g_output, _T("*/\n!endif\n")); } static UINT read_line_helper(NStreamLineReader&lr, TCHAR*buf, UINT cch) { // Helper function for reading lines from text files. buf MUST be valid and cch MUST be > 1! // Returns 0 on error or the number of characters read including the first \n, \r or \0. // When it returns 0, buf[0] is 0 for EOF and NStream::ERR_* for errors. UINT lrr = lr.ReadLine(buf, cch), eof = 0; if (NStream::OK != lrr) { ++eof; if (!lr.IsEOF()) { buf[0] = (TCHAR) lrr; return 0; } } const bool unicode = lr.IsUnicode(); for(cch = 0;; ++cch) if (!buf[cch] || NStream::IsNewline(buf[cch], unicode)) break; if (cch) eof = 0; // Read something, postpone EOF return ++cch - eof; } #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES TCHAR *CEXEBuild::set_file_predefine(const TCHAR *filename) { TCHAR *oldfileinfo = NULL; TCHAR *oldfilename = definedlist.find(_T("__FILE__")); TCHAR *oldfiledir = definedlist.find(_T("__FILEDIR__")); if (oldfilename && oldfiledir) { oldfileinfo = new TCHAR[_tcslen(oldfilename)+1+_tcslen(oldfiledir)+1]; _tcscpy(oldfileinfo, oldfilename); _tcscat(oldfileinfo, _T("|")); _tcscat(oldfileinfo, oldfiledir); definedlist.del(_T("__FILE__")); definedlist.del(_T("__FILEDIR__")); } const TCHAR *p = _tcsrchr(filename,_T('\\')), *p2 = _tcsrchr(filename,_T('/')); if (p2 > p) p = p2; if (p) p++; else p = filename; definedlist.add(_T("__FILE__"),p); TCHAR dir[260]; // BUGBUG: MAX_PATH outside #ifdef _WIN32, should be PATH/NAME_MAX on POSIX? #ifdef _WIN32 LPTSTR lpFilePart; if (!GetFullPathName(filename, COUNTOF(dir), dir, &lpFilePart)) *dir = _T('\0'); PathRemoveFileSpec(dir); #else if (p == filename) _tcscpy(dir, _T(".")); else my_strncpy(dir, filename, p-filename+!0); #endif definedlist.add(_T("__FILEDIR__"),dir); return oldfileinfo; } void CEXEBuild::restore_file_predefine(TCHAR *oldfilename) { definedlist.del(_T("__FILEDIR__")); definedlist.del(_T("__FILE__")); if (oldfilename) { TCHAR *oldfiledir = _tcschr(oldfilename, _T('|')); definedlist.add(_T("__FILEDIR__"),oldfiledir+1); *oldfiledir = '\0'; definedlist.add(_T("__FILE__"),oldfilename); delete[] oldfilename; } } TCHAR *CEXEBuild::set_timestamp_predefine(const TCHAR *filename) { TCHAR *oldtimestamp = definedlist.find(_T("__TIMESTAMP__")); if (oldtimestamp) { oldtimestamp = _tcsdup(oldtimestamp); definedlist.del(_T("__TIMESTAMP__")); } #ifdef _WIN32 TCHAR datebuf[128] = _T(""), timebuf[128] = _T(""), timestampbuf[256]; WIN32_FIND_DATA fd; FILETIME floctime; SYSTEMTIME stime; HANDLE hSearch = FindFirstFile(filename, &fd); if (hSearch != INVALID_HANDLE_VALUE) { FindClose(hSearch); FileTimeToLocalFileTime(&fd.ftLastWriteTime, &floctime); FileTimeToSystemTime(&floctime, &stime); GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &stime, NULL, datebuf, COUNTOF(datebuf)); GetTimeFormat(LOCALE_USER_DEFAULT, 0, &stime, NULL, timebuf, COUNTOF(timebuf)); wsprintf(timestampbuf,_T("%") NPRIs _T(" %") NPRIs,datebuf,timebuf); definedlist.add(_T("__TIMESTAMP__"),timestampbuf); } #else struct stat st; if (!_tstat(filename, &st)) definedlist.add(_T("__TIMESTAMP__"),PosixBug_CtoTString(ctime(&st.st_mtime))); #endif return oldtimestamp; } void CEXEBuild::restore_timestamp_predefine(TCHAR *oldtimestamp) { definedlist.del(_T("__TIMESTAMP__")); if (oldtimestamp) { definedlist.add(_T("__TIMESTAMP__"),oldtimestamp); free(oldtimestamp); } } TCHAR *CEXEBuild::set_line_predefine(int linecnt, BOOL is_macro) { TCHAR* linebuf = NULL; MANAGE_WITH(linebuf, free); TCHAR temp[128] = _T(""); _stprintf(temp,_T("%d"),linecnt); TCHAR *oldline = definedlist.find(_T("__LINE__")); if (oldline) { oldline = _tcsdup(oldline); definedlist.del(_T("__LINE__")); } if (is_macro && oldline) { linebuf = (TCHAR *)malloc((_tcslen(oldline)+_tcslen(temp)+2)*sizeof(TCHAR)); _stprintf(linebuf,_T("%") NPRIs _T(".%") NPRIs,oldline,temp); } else { linebuf = _tcsdup(temp); } definedlist.add(_T("__LINE__"),linebuf); return oldline; } void CEXEBuild::restore_line_predefine(TCHAR *oldline) { definedlist.del(_T("__LINE__")); if (oldline) { definedlist.add(_T("__LINE__"),oldline); free(oldline); } } void CEXEBuild::set_date_time_predefines() { time_t etime; struct tm *ltime; TCHAR datebuf[128], timebuf[128]; time(&etime); ltime = localtime(&etime); #ifdef _WIN32 SYSTEMTIME st; st.wYear = ltime->tm_year+1900, st.wMonth = ltime->tm_mon + 1, st.wDay = ltime->tm_mday; st.wHour = ltime->tm_hour, st.wMinute = ltime->tm_min, st.wSecond = ltime->tm_sec; st.wMilliseconds = 0; GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, datebuf, sizeof(datebuf)); definedlist.add(_T("__DATE__"), datebuf); GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, timebuf, sizeof(timebuf)); definedlist.add(_T("__TIME__"), timebuf); #else my_strftime(datebuf, sizeof(datebuf), _T("%x"), ltime); definedlist.add(_T("__DATE__"), datebuf); my_strftime(timebuf, sizeof(timebuf), _T("%X"), ltime); definedlist.add(_T("__TIME__"), timebuf); #endif } void CEXEBuild::del_date_time_predefines() { definedlist.del(_T("__DATE__")); definedlist.del(_T("__TIME__")); } #endif TCHAR* CEXEBuild::GetMacro(const TCHAR *macroname, TCHAR**macroend /*= 0*/) { TCHAR *t = (TCHAR*)m_macros.get(), *mbeg, *mbufbeg = t; size_t cbAll = m_macros.getlen(); for (; t && *t; ++t) { mbeg = t; if ((size_t)t - (size_t)mbufbeg >= cbAll) break; const bool foundit = !_tcsicmp(mbeg, macroname); t += _tcslen(t) + 1; // advance over macro name // advance over parameters while (*t) t += _tcslen(t) + 1; t++; // Separator between parameters and data // advance over data while (*t) t += _tcslen(t) + 1; if (foundit) { if (macroend) *macroend = ++t; return mbeg; } } return 0; } TCHAR* CEXEBuild::GetMacro(size_t idx) { TCHAR *t = (TCHAR*)m_macros.get(), *mbufbeg = t; for (size_t i = 0, cbAll = m_macros.getlen(); t && *t; ++t) { if ((size_t)t - (size_t)mbufbeg >= cbAll) break; if (i++ == idx) return t; t += _tcslen(t) + 1; // advance over macro name while (*t) t += _tcslen(t) + 1; // advance over parameters t++; // Separator between parameters and data while (*t) t += _tcslen(t) + 1; // advance over data } return 0; } int CEXEBuild::pp_macro(LineParser&line) { const TCHAR*const macroname = line.gettoken_str(1), *tokstr; if (!macroname[0]) PRINTHELP() if (MacroExists(macroname)) { ERROR_MSG(_T("!macro: macro named \"%") NPRIs _T("\" already exists!\n"), macroname); return PS_ERROR; } m_macros.add(macroname, (int)(_tcslen(macroname)+1)*sizeof(TCHAR)); for (int pc=2; pc < line.getnumtokens(); pc++) { if (!(tokstr = line.gettoken_str(pc))[0]) { ERROR_MSG(_T("!macro: macro parameter %d is empty, not valid!\n"), pc-1); return PS_ERROR; } for (int a = 2; a < pc; a++) { if (!_tcsicmp(tokstr, line.gettoken_str(a))) { ERROR_MSG(_T("!macro: macro parameter named %") NPRIs _T(" is used multiple times!\n"), tokstr); return PS_ERROR; } } m_macros.add(tokstr, (int)(_tcslen(tokstr)+1)*sizeof(TCHAR)); } m_macros.add(_T(""), sizeof(_T(""))); // Separator between parameters and data for (;;) { TCHAR *str = m_templinebuf, *p = str; UINT lrres = curlinereader->ReadLine(str, MAX_LINELENGTH); if (NStream::OK != lrres) { if (curlinereader->IsEOF()) { if (!str[0]) { ERROR_MSG(_T("!macro \"%") NPRIs _T("\": unterminated (no !macroend found in file)!\n"), macroname); return PS_ERROR; } } else { ERROR_MSG(curlinereader->GetErrorMessage(lrres).c_str()); return PS_ERROR; } } //SCRIPT_MSG(_T("%") NPRIs _T("%") NPRIs, str, str[_tcslen(str)-1] == _T('\n') ? _T("") : _T("\n")); // remove trailing whitespace while (*p) p++; if (p > str) p--; while (p >= str && (*p == _T('\r') || *p == _T('\n') || *p == _T(' ') || *p == _T('\t'))) p--; *++p = 0; LineParser l2(false); if (!l2.parse(str)) { if (!_tcsicmp(l2.gettoken_str(0), _T("!macroend"))) { linecnt++; break; } if (!_tcsicmp(l2.gettoken_str(0), _T("!macro"))) { ERROR_MSG(_T("Error: can't define a macro inside a macro!\n")); return PS_ERROR; } } if (str[0]) m_macros.add(str, (int)(_tcslen(str)+1)*sizeof(TCHAR)); else m_macros.add(_T(" "), sizeof(_T(" "))); linecnt++; } m_macros.add(_T(""), sizeof(_T(""))); // End of data return PS_OK; } int CEXEBuild::pp_macroundef(LineParser&line) { const TCHAR*const mname = line.gettoken_str(1); if (!mname[0]) PRINTHELP() TCHAR *mend, *mbeg = GetMacro(mname, &mend); if (!mbeg) { ERROR_MSG(_T("!macroundef: \"%") NPRIs _T("\" does not exist!\n"), mname); return PS_ERROR; } TCHAR *mbufb = (TCHAR*)m_macros.get(); const size_t mcb = ((mend)-mbeg)*sizeof(TCHAR), mbufcb = m_macros.getlen(); memmove(mbeg, mend, mbufcb-(((mbeg-mbufb)*sizeof(TCHAR))+mcb)); m_macros.resize(truncate_cast(int,(size_t)(mbufcb-mcb))); SCRIPT_MSG(_T("!macroundef: %") NPRIs _T("\n"), mname); return PS_OK; } int CEXEBuild::pp_insertmacro(LineParser&line) { static unsigned char g_insertmacrorecursion = 0; const TCHAR*const macroname = line.gettoken_str(1); if (!macroname[0]) PRINTHELP() TCHAR *t = GetMacro(macroname), *m = (TCHAR *)m_macros.get(); SCRIPT_MSG(_T("!insertmacro: %") NPRIs _T("\n"), macroname); if (!t) { ERROR_MSG(_T("!insertmacro: macro named \"%") NPRIs _T("\" not found!\n"), macroname); return PS_ERROR; } t+=_tcslen(t)+1; GrowBuf l_define_names; DefineList l_define_saves; int npr = 0; // advance over params while (*t) { TCHAR *v = definedlist.find(t); if (v) { l_define_saves.add(t,v); definedlist.del(t); } l_define_names.add(t, (int)(_tcslen(t)+1)*sizeof(TCHAR)); definedlist.add(t, line.gettoken_str(npr+2)); npr++; t += _tcslen(t)+1; } l_define_names.add(_T(""), sizeof(_T(""))); t++; if (npr != line.getnumtokens()-2) { ERROR_MSG(_T("!insertmacro: macro \"%") NPRIs _T("\" requires %d parameter(s), passed %d!\n"), macroname, npr,line.getnumtokens()-2); return PS_ERROR; } if (++g_insertmacrorecursion > MAX_MACRORECURSION) { ERROR_MSG(_T("!insertmacro: insert depth is limited to %u macros!\n"), MAX_MACRORECURSION); return PS_ERROR; } const bool oldparserinsidecomment = inside_comment; inside_comment = false; // "!insertmacro foo /*" does not mean that the macro body is a comment TCHAR str[1024]; wsprintf(str, _T("macro:%") NPRIs, macroname); const TCHAR *oldmacroname = m_currentmacroname; m_currentmacroname = macroname; definedlist.set(_T("__MACRO__"), m_currentmacroname); int lp = 0; while (*t) { lp++; if (_tcscmp(t, _T(" "))) { int ret = process_oneline(t, str, lp, PLF_MACRO); if (ret != PS_OK) { ERROR_MSG(_T("Error in macro %") NPRIs _T(" on macroline %d\n"), macroname, lp); return ret; } } { // fix t if process_oneline changed m_macros TCHAR *nm = (TCHAR*)m_macros.get(); if (nm != m) t += nm - m, m = nm; } t += _tcslen(t)+1; } { TCHAR *p = (TCHAR*)l_define_names.get(); while (*p) { definedlist.del(p); TCHAR *v; if ((v = l_define_saves.find(p))) definedlist.add(p,v); p += _tcslen(p)+1; } } definedlist.del(_T("__MACRO__")); m_currentmacroname = oldmacroname; if (oldmacroname) definedlist.add(_T("__MACRO__"), oldmacroname); inside_comment = oldparserinsidecomment; --g_insertmacrorecursion; SCRIPT_MSG(_T("!insertmacro: end of %") NPRIs _T("\n"), macroname); return PS_OK; } int CEXEBuild::pp_tempfile(LineParser&line) { TCHAR *symbol = line.gettoken_str(1); TCHAR *tfpath = create_tempfile_path(); if (!tfpath) { ERROR_MSG(_T("!tempfile: Unable to create temporary file!\n")); return PS_ERROR; } int symexisted = definedlist.add(symbol, tfpath); free(tfpath); if (symexisted) { ERROR_MSG(_T("!tempfile: \"%") NPRIs _T("\" already defined!\n"), symbol); return PS_ERROR; } return PS_OK; } int CEXEBuild::pp_delfile(LineParser&line) { UINT fatal = true, a = 1, matchcount = 0; const TCHAR *fc = line.gettoken_str(a); if (line.getnumtokens()==3) { if (!_tcsicmp(fc,_T("/nonfatal"))) fatal = 0, fc = line.gettoken_str(++a); else PRINTHELP(); } SCRIPT_MSG(_T("!delfile: \"%") NPRIs _T("\"\n"), fc); const TCHAR *fmt = _T("!delfile: \"%") NPRIs _T("\" couldn't be deleted.\n"); tstring dir = get_dir_name(fc), spec = get_file_name(fc); tstring basedir = dir + PLATFORM_PATH_SEPARATOR_STR; if (dir == spec) dir = _T("."), basedir = _T(""); // no path, just file name boost::scoped_ptr dr( new_dir_reader() ); dr->read(dir); // BUGBUG: PATH_CONVERT? dir_reader::iterator files_itr = dr->files().begin(); for (; files_itr != dr->files().end(); files_itr++) { if (!dir_reader::matches(*files_itr, spec)) continue; ++matchcount; tstring file = basedir + *files_itr; // BUGBUG: PATH_CONVERT? fc = file.c_str(); if (-1 == _tunlink(fc)) { if (fatal) return (ERROR_MSG(fmt, fc), PS_ERROR); else warning_fl(DW_PP_DELFILE_DELERROR, fmt, fc); } else SCRIPT_MSG(_T("!delfile: deleted \"%") NPRIs _T("\"\n"), fc); } if (!matchcount) { if (fatal) return (ERROR_MSG(fmt, fc), PS_ERROR); else warning_fl(DW_PP_DELFILE_NOMATCH, fmt, fc); } return PS_OK; } int CEXEBuild::pp_appendfile(LineParser&line) { WORD tok = 0, cp = 0, forceEnc = false, rawnl = false; bool bom = false; TCHAR *param, buf[9+!0]; for (;;) { param = line.gettoken_str(++tok); my_strncpy(buf, param, COUNTOF(buf)); if (!_tcsicmp(param,_T("/RawNL"))) ++rawnl; else if (!_tcsicmp(buf,_T("/CharSet="))) { ++forceEnc, cp = GetEncodingFromString(param+9, bom); if (NStreamEncoding::UNKNOWN == cp) { ERROR_MSG(_T("!appendfile: Invalid parameter \"%") NPRIs _T("\"!\n"), param); return PS_ERROR; } } else break; } if (line.getnumtokens() != 2 + tok) { PRINTHELP(); return PS_ERROR; } param = line.gettoken_str(tok); NOStream ostrm; if (!ostrm.CreateFileForAppending(param, NStreamEncoding::ACP)) { ERROR_MSG(_T("!appendfile: \"%") NPRIs _T("\" couldn't be opened.\n"), param); return PS_ERROR; } if (ostrm.IsUnicode()) bom = false; if (forceEnc) ostrm.StreamEncoding().SetCodepage(cp); const TCHAR *const text = line.gettoken_str(++tok); bool succ = bom ? ostrm.WriteBOM(ostrm.StreamEncoding()) : true; if (!succ || (rawnl ? !ostrm.WriteString(text) : !ostrm.WritePlatformNLString(text))) { ERROR_MSG(_T("!appendfile: error writing to \"%") NPRIs _T("\".\n"), param); return PS_ERROR; } SCRIPT_MSG(_T("!appendfile: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"), param, text); return PS_OK; } static TinyGrowBuf* getmemfileinfo(CEXEBuild&bld, const TCHAR *id, const TCHAR **start = 0, const TCHAR **end = 0) { id = bld.definedlist.find(id); if (!id || id[0] != _T('~') || id[1] != _T('M')) return 0; TinyGrowBuf *buf; if (strtoptr(id + 2, buf) && start) { *start = (TCHAR*) buf->get(); *end = *start + (buf->getlen() / sizeof(TCHAR)); } return buf; } int CEXEBuild::pp_appendmemfile(LineParser&line) { bool del = line.gettoken_str(1)[0] == _T('\0'); const TCHAR *name = line.gettoken_str(1 + del); TinyGrowBuf *file; if (line.getnumtokens() == 2) // Create file { if (!*name) return PS_ERROR; file = new TinyGrowBuf; TCHAR buf[42]; buf[0] = _T('~'), buf[1] = _T('M'); ptrtostr(file, buf + 2); definedlist.set(name, buf); return PS_OK; } file = getmemfileinfo(*this, name); if (!file) return PS_ERROR; if (del) // Delete file { delete file; definedlist.del(name); } else { const TCHAR *data = line.gettoken_str(2); file->add(data, GrowBuf::size_type(_tcslen(data) * sizeof(*data))); } return PS_OK; } enum { PPGVHF_VALID = 0x01, PPGVHF_NOERRORS = 0x02, PPGVHF_PACKED = 0x04, PPGVHF_TLB = 0x08 }; int CEXEBuild::pp_getversionhelper(const TCHAR *cmdname, const TCHAR *path, const TCHAR *basesymname, DWORD high, DWORD low, DWORD flags) { TCHAR *symbuf = m_templinebuf; DWORD tlb = (flags & PPGVHF_TLB), noerrors = (flags & PPGVHF_NOERRORS); FILE *pF = tlb ? MSTLB_fopen(path) : FOPEN(path, ("rb")); if (pF) fclose(pF); bool vnum = pF && (flags & PPGVHF_VALID); // LibraryLocal users want to detect "file not found" vs "no version info" if (!vnum) high = low = 0; DWORD vals[] = { high >> 16, high & 0xffff, low >> 16, low & 0xffff }, count = 4; if (tlb) count = 2, vals[0] = high, vals[1] = low, vals[2] = vals[3] = 0; if (!pF) { if (noerrors) return PS_OK; ERROR_MSG(_T("%") NPRIs _T(": error reading version info from \"%") NPRIs _T("\"\n"), cmdname, path); return PS_ERROR; } if (flags & PPGVHF_PACKED) { SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T(" (%lu.%lu)->(%") NPRIs _T(")\n"), cmdname, path, high, low, basesymname); _stprintf(symbuf,_T("%") NPRIs _T("HIGH"), basesymname), vnum ? definedlist.set_ui32(symbuf, high) : definedlist.set(symbuf, _T("")); _stprintf(symbuf,_T("%") NPRIs _T("LOW"), basesymname), vnum ? definedlist.set_ui32(symbuf, low) : definedlist.set(symbuf, _T("")); } else { SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T(" (%u.%u.%u.%u)->(%") NPRIs _T("<1..%d>)\n"), cmdname, path, vals[0], vals[1], vals[2], vals[3], basesymname, (int) count); for (UINT i = 0; i < count; ++i) { _stprintf(symbuf,_T("%") NPRIs _T("%u"), basesymname, i+1); vnum ? definedlist.set_ui32(symbuf, vals[i]) : definedlist.set(symbuf, _T("")); } } return PS_OK; } int CEXEBuild::pp_getversion(int which_token, LineParser&line) { const bool tlb = TOK_P_GETTLBVERSION == which_token; const TCHAR *cmdname = tlb ? _T("!gettlbversion") : _T("!getdllversion"), *path; DWORD ti = 1, flags = tlb ? PPGVHF_TLB : 0, low, high, prod = 0; for (;; ++ti) { if (!_tcsicmp(line.gettoken_str(ti), _T("/noerrors"))) flags |= PPGVHF_NOERRORS; else if (!_tcsicmp(line.gettoken_str(ti), _T("/packed"))) flags |= PPGVHF_PACKED; else if (!_tcsicmp(line.gettoken_str(ti), _T("/productversion"))) ++prod; else break; } if ((tlb ? GetTLBVersion : GetDLLVersion)(path = line.gettoken_str(ti), high, low, !!prod)) flags |= PPGVHF_VALID; return pp_getversionhelper(cmdname, path, line.gettoken_str(ti+1), high, low, flags); } int CEXEBuild::pp_searchreplacestring(LineParser&line) { int ignoreCase = !_tcsicmp(line.gettoken_str(1), _T("/ignorecase")); if (line.getnumtokens() != 5+ignoreCase) PRINTHELP() TCHAR *define = line.gettoken_str(1+ignoreCase); TCHAR *src = line.gettoken_str(2+ignoreCase); TCHAR *search = line.gettoken_str(3+ignoreCase); TCHAR *replace = line.gettoken_str(4+ignoreCase); int searchlen = (int)_tcslen(search), replacelen = (int)_tcslen(replace); if (!searchlen) { ERROR_MSG(_T("!searchreplace: search string must not be empty for search/replace!\n")); return PS_ERROR; } GrowBuf valout; while (*src) { if (ignoreCase ? _tcsnicmp(src, search, searchlen) : _tcsncmp(src, search, searchlen)) valout.add(src++, sizeof(TCHAR)); else { valout.add(replace, sizeof(TCHAR)*replacelen); src += searchlen; } } valout.add(_T(""),sizeof(TCHAR)); definedlist.del(define); // allow changing variables since we'll often use this in series if (definedlist.add(define, (TCHAR*)valout.get())) { ERROR_MSG(_T("!searchreplace: error defining \"%") NPRIs _T("\"!\n"), define); return PS_ERROR; } SCRIPT_MSG(_T("!searchreplace: \"%") NPRIs _T("\"=\"%") NPRIs _T("\"\n"), define,(TCHAR*)valout.get()); return S_OK; } int CEXEBuild::pp_searchparsestring(LineParser&line) { bool ignCase = false, noErrors = false, isFile = false; int parmOffs = 1; while (parmOffs < line.getnumtokens()) { if (!_tcsicmp(line.gettoken_str(parmOffs), _T("/ignorecase"))) { ignCase = true; parmOffs++; } else if (!_tcsicmp(line.gettoken_str(parmOffs), _T("/noerrors"))) { noErrors = true; parmOffs++; } else if (!_tcsicmp(line.gettoken_str(parmOffs), _T("/file"))) { isFile = true; parmOffs++; } else break; } if (parmOffs+3 > line.getnumtokens()) { ERROR_MSG(_T("!searchparse: not enough parameters\n")); return PS_ERROR; } const TCHAR *source_string = line.gettoken_str(parmOffs++); DefineList *list = 0; if (isFile) { const TCHAR *const filename = source_string; NIStream filestrm; if (!filestrm.OpenFileForReading(filename)) { ERROR_MSG(_T("!searchparse /file: error opening \"%") NPRIs _T("\"\n"), filename); return PS_ERROR; } UINT req_parm = (line.getnumtokens() - parmOffs)/2, fail_parm = 0, linnum = 0; NStreamLineReader lr(filestrm); GrowBuf tmpstr; TCHAR *str = m_templinebuf; for (;;) { tmpstr.resize(0); for (;;) { ++linnum; UINT cch = read_line_helper(lr, str, MAX_LINELENGTH); if (!cch) { if (*str) { tstring lrmsg = lr.GetErrorMessage((UINT)*str, filename, linnum); ERROR_MSG(_T("!searchparse: %") NPRIs, lrmsg.c_str()); return PS_ERROR; } break; // EOF } str[--cch] = _T('\0'); // remove newline const bool endSlash = (cch && _T('\\') == str[cch-1]); if (endSlash) --cch; // don't include the slash character if (tmpstr.getlen() || endSlash) tmpstr.add(str,cch*sizeof(TCHAR)); // if we have valid contents and not ending on slash, then done if (!endSlash && (str[0] || tmpstr.getlen())) break; } if (!str[0] && !tmpstr.getlen()) break; // reached eof TCHAR *thisline = str; if (tmpstr.getlen()) { tmpstr.add(_T("\0"),sizeof(TCHAR)); thisline = (TCHAR*)tmpstr.get(); } UINT linefailparm; DefineList *tlist = searchParseString(thisline, line, parmOffs, ignCase, true, &linefailparm); if (linefailparm > fail_parm) fail_parm = linefailparm; if (tlist && tlist->getnum()) { if (!list || tlist->getnum() > list->getnum()) { delete list; list = tlist, tlist = 0; if ((unsigned)list->getnum() >= req_parm) { fail_parm = -1; // success break; // we found all the tokens, stop parsing the file } } } delete tlist; // parse line } if ((UINT)-1 != fail_parm && !noErrors) { const TCHAR *msgprefix = !fail_parm ? _T("starting ") : _T(""); TCHAR *p = line.gettoken_str(parmOffs + (fail_parm*2)); ERROR_MSG(_T("!searchparse: %") NPRIs _T("string \"%") NPRIs _T("\" not found in file!\n"), msgprefix, p ? p : _T("(null)")); return PS_ERROR; } } else { list = searchParseString(source_string, line, parmOffs, ignCase, noErrors); if (!list && !noErrors) return PS_ERROR; } if (list) // if we got our list, merge them defines in { for (int i=0; i < list->getnum(); i++) { TCHAR *def = list->getname(i), *val = list->getvalue(i); if (def && val) definedlist.set(def,val); } } delete list; return PS_OK; } DefineList *CEXEBuild::searchParseString(const TCHAR *source_string, LineParser&line, int parmOffs, bool ignCase, bool noErrors, UINT*failParam) { const bool allowEmptyFirstTok = true; if (failParam) *failParam = 0; DefineList *ret = NULL; const TCHAR *defout = 0, *src_start = 0, *tok; int toklen = 0, maxlen; for (;;) { tok = line.gettoken_str(parmOffs++); const bool lasttoken = parmOffs > line.getnumtokens(); if (!*tok) tok = 0, maxlen = -1; // No more tokens to search for, save the rest of the string else { toklen = (int) _tcslen(tok); while (*source_string && (ignCase?_tcsnicmp(source_string, tok, toklen):_tcsncmp(source_string, tok, toklen))) source_string++; maxlen = (int)(source_string - src_start); // Length of previous string } if (defout && defout[0]) // We now know the start and length of the previous string, add it to the list { if (!ret) ret = new DefineList(); if (maxlen < 0) ret->add(defout, src_start); else ret->addn(defout, maxlen, src_start); } if (!tok && lasttoken) break; if (!*source_string || (allowEmptyFirstTok ? false : !tok)) // We did not find the requested token! { if (failParam) *failParam = ret ? ret->getnum() : 0; if (noErrors) break; // Caller is OK with a incomplete list of matched strings const TCHAR *msgprefix = src_start ? _T("") : _T("starting "); ERROR_MSG(_T("!searchparse: %") NPRIs _T("string \"%") NPRIs _T("\" not found, aborted search!\n"), msgprefix, tok ? tok : _T("(null)")); delete ret; return NULL; } defout = line.gettoken_str(parmOffs++), src_start = source_string += toklen; } return ret; } int CEXEBuild::pp_verbose(LineParser&line) { for(int argi = 1; argi < line.getnumtokens(); ++argi) { int k = line.gettoken_enum(argi, _T("push\0pop\0")), v, convsucc; if (k < 0) // not push/pop, just set the level { v = line.gettoken_int(argi, &convsucc); if (!convsucc || v < 0 || v > 4 ) { // < 2.47 would reset level to 0 without warning! ERROR_MSG(_T("!verbose: Invalid verbose level\n")); return PS_ERROR; } } else { if (k) // pop { int l = verbose_stack.getlen(); if (l) { v= ((int*)verbose_stack.get())[(l/sizeof(int))-1]; verbose_stack.resize(l-sizeof(int)); } else { warning_fl(DW_PP_VERBOSE_POP_EMPTY_STACK, _T("!verbose: Pop failed, stack is empty")); continue; // Pop failed, should still process the next parameter } } else // push { v = get_verbosity(); verbose_stack.add(&v,sizeof(int)); continue; } } set_verbosity(v); } return PS_OK; } int CEXEBuild::pp_define(LineParser&line) { const TCHAR *cmdnam = line.gettoken_str(0), *define = line.gettoken_str(1); GrowBuf file_buf; TCHAR datebuf[256], mathbuf[256], *value; int dupemode = 0; if (!_tcsicmp(define, _T("/ifndef"))) dupemode = 1; else if (!_tcsicmp(define, _T("/redef"))) dupemode = 2; if (dupemode != 0) { line.eattoken(); define = line.gettoken_str(1); } if (!_tcsicmp(define, _T("/date")) || !_tcsicmp(define, _T("/utcdate"))) { if (line.getnumtokens() != 4) PRINTHELPEX(cmdnam) const TCHAR *date_type = define; time_t rawtime; time(&rawtime); define = line.gettoken_str(2), value = line.gettoken_str(3); if (!_tcsicmp(date_type, _T("/utcdate"))) rawtime = mktime(gmtime(&rawtime)); datebuf[0] = 0; size_t s = _tcsftime(datebuf, COUNTOF(datebuf), value, localtime(&rawtime)); if (s == 0) datebuf[0] = _T('\0'); else datebuf[max(s, COUNTOF(datebuf)-1)] = _T('\0'); value = datebuf; } else if (!_tcsicmp(define, _T("/file")) || !_tcsicmp(define, _T("/file_noerr"))) { if (line.getnumtokens() != 4) PRINTHELPEX(cmdnam) const TCHAR *const filename = line.gettoken_str(3), *const swit = define; NIStream filestrm; if (!filestrm.OpenFileForReading(filename)) { if (!swit[5]) { // "/file" vs "/file_noerr" ERROR_MSG(_T("!define /file: file not found (\"%") NPRIs _T("\")\n"), filename); return PS_ERROR; } } else { NStreamLineReader lr(filestrm); TCHAR *str = m_templinebuf; for (UINT linnum = 0;;) { ++linnum; UINT cch = read_line_helper(lr, str, MAX_LINELENGTH); if (!cch) { if (*str) { tstring lrmsg = lr.GetErrorMessage((UINT)*str, filename, linnum); ERROR_MSG(_T("!define %") NPRIs _T(": %") NPRIs, swit, lrmsg.c_str()); return PS_ERROR; } break; // EOF } str[--cch] = _T('\0'); // Remove \r or \n, we always append \n if (file_buf.getlen()) file_buf.add(_T("\n"), sizeof(TCHAR)); file_buf.add(str, cch*sizeof(TCHAR)); } } define = line.gettoken_str(2); file_buf.add(_T("\0"), sizeof(TCHAR)); value = (TCHAR *)file_buf.get(); } else if (!_tcsicmp(define, _T("/math"))) { int value1, value2, tc = line.getnumtokens(), onlyval1 = 0; TCHAR *mathop; if (tc != 5 && tc != 6) badmathsyntax: PRINTHELPEX(cmdnam) define = line.gettoken_str(2); value1 = line.gettoken_int(3); mathop = line.gettoken_str(4); value2 = line.gettoken_int(5); value = mathbuf; if (!_tcscmp(mathop,_T("+"))) { _stprintf(value, _T("%d"), value1 + value2); } else if (!_tcscmp(mathop, _T("-"))) { _stprintf(value, _T("%d"), value1 - value2); } else if (!_tcscmp(mathop, _T("*"))) { _stprintf(value, _T("%d"), value1 * value2); } else if (!_tcscmp(mathop, _T("&"))) { _stprintf(value, _T("%d"), value1 & value2); } else if (!_tcscmp(mathop, _T("|"))) { _stprintf(value, _T("%d"), value1 | value2); } else if (!_tcscmp(mathop, _T("^"))) { _stprintf(value, _T("%d"), value1 ^ value2); } else if (!_tcscmp(mathop, _T("~"))) { _stprintf(value, _T("%d"), ~ value1), ++onlyval1; } else if (!_tcscmp(mathop, _T("!"))) { _stprintf(value, _T("%d"), ! value1), ++onlyval1; } else if (!_tcscmp(mathop, _T("&&"))) { _stprintf(value, _T("%d"), value1 && value2); } else if (!_tcscmp(mathop, _T("||"))) { _stprintf(value, _T("%d"), value1 || value2); } else if (!_tcscmp(mathop, _T("<<")) || !_tcscmp(mathop, _T("<<<")) ) { _stprintf(value, _T("%d"), value1 << value2); } else if (!_tcscmp(mathop, _T(">>"))) { _stprintf(value, _T("%d"), (signed int)value1 >> (signed int)value2); } else if (!_tcscmp(mathop, _T(">>>"))) { _stprintf(value, _T("%u"), (unsigned int)value1 >> (unsigned int)value2); } else if (!_tcscmp(mathop, _T("/"))) { if (value2 == 0) { ERROR_MSG(_T("!define /math: division by zero! (\"%i %") NPRIs _T(" %i\")\n"), value1, mathop, value2); return PS_ERROR; } _stprintf(value, _T("%d"), value1 / value2); } else if (!_tcscmp(mathop, _T("%"))) { if (value2 == 0) { ERROR_MSG(_T("!define /math: division by zero! (\"%i %") NPRIs _T(" %i\")\n"),value1,mathop,value2); return PS_ERROR; } _stprintf(value, _T("%d"), value1 % value2); } else goto badmathsyntax; if (tc + onlyval1 != 6) goto badmathsyntax; } else if (!_tcsicmp(define, _T("/intfmt"))) { if (line.getnumtokens() != 5) PRINTHELPEX(cmdnam) define = line.gettoken_str(2); _stprintf(value = mathbuf, line.gettoken_str(3), line.gettoken_int(4)); } else { if (line.getnumtokens() >= 4) PRINTHELPEX(cmdnam) value = line.gettoken_str(2); } if (dupemode == 2) definedlist.del(define); if (definedlist.add(define, value)) { if (dupemode == 1) return PS_OK; ERROR_MSG(_T("!define: \"%") NPRIs _T("\" already defined!\n"), define); return PS_ERROR; } SCRIPT_MSG(_T("!define: \"%") NPRIs _T("\"=\"%") NPRIs _T("\"\n"), define, value); return PS_OK; } int CEXEBuild::pp_undef(LineParser&line) { UINT noerr = false, stopswitch = false, handled = 0; for (int ti = 1; ti < line.getnumtokens(); ++ti) { const TCHAR *name = line.gettoken_str(ti); if (!stopswitch && !_tcsicmp(name, _T("/noerrors"))) { ++noerr; continue; } stopswitch = ++handled; if (definedlist.del(name) && !noerr) warning_fl(DW_PP_UNDEF_UNDEFINED, _T("!undef: \"%") NPRIs _T("\" not defined!"), name); else SCRIPT_MSG(_T("!undef: \"%") NPRIs _T("\"\n"), name); } if (!handled) { PRINTHELP(); return PS_ERROR; } return PS_OK; } int CEXEBuild::pp_packhdr(LineParser&line) { unsigned int bufOf = false; TCHAR *packname = line.gettoken_str(1); PATH_CONVERT(packname); if (!strtrycpy(build_packname, packname, COUNTOF(build_packname))) ++bufOf; if (!strtrycpy(build_packcmd, line.gettoken_str(2), COUNTOF(build_packcmd))) ++bufOf; SCRIPT_MSG(_T("!packhdr: filename=\"%") NPRIs _T("\", command=\"%") NPRIs _T("\"\n"), build_packname, build_packcmd); return bufOf ? PS_ERROR : PS_OK; } template void slist_append(T&list, T&item) { T prev; for (prev = list; prev && prev->next;) prev = prev->next; (prev ? prev->next : list) = item; } int CEXEBuild::pp_finalize(int which_token, LineParser&line) { #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT if (which_token == TOK_P_UNINSTFINALIZE) { ERROR_MSG(_T("Error: %") NPRIs _T(" specified, %") NPRIns _T(" not defined.\n"), line.gettoken_str(0), "NSIS_CONFIG_UNINSTALL_SUPPORT"); return PS_ERROR; } #endif TCHAR* cmdstr = line.gettoken_str(1); int validparams = false; postbuild_cmd *newcmd = postbuild_cmd::make(cmdstr, line.gettoken_enum(2, _T("<\0>\0<>\0=\0ignore\0")), line.gettoken_int(3, &validparams)); if (line.getnumtokens() == 1+1) newcmd->cmpop = 4, validparams = true; // Just a command, ignore the exit code if (newcmd->cmpop == -1 || !validparams) PRINTHELP(); slist_append(which_token == TOK_P_UNINSTFINALIZE ? postubuild_cmds : postbuild_cmds, newcmd); SCRIPT_MSG(_T("!%") NPRIns _T("finalize: \"%") NPRIs _T("\"\n"), which_token == TOK_P_UNINSTFINALIZE ? "uninst" : "", cmdstr); return PS_OK; } int CEXEBuild::pp_execute(int which_token, LineParser&line) { const TCHAR *cmdname=get_commandtoken_name(which_token); const TCHAR *exec=line.gettoken_str(1), *define=0; TCHAR buf[33]; int comp=line.gettoken_enum(2,_T("<\0>\0<>\0=\0ignore\0")); int validparams=true, ret=-1, cmpv=0, forceutf8=0; switch(line.getnumtokens()-1) { case 1: comp=4; break; case 2: comp=5, validparams=!!*(define=line.gettoken_str(2)); break; case 3: cmpv=line.gettoken_int(3,&validparams); break; default: forceutf8=comp=-1; } if (!validparams || comp == -1) PRINTHELP() tstring compile; if (TOK_P_MAKENSIS == which_token) { extern const TCHAR *g_argv0; compile=_T("\""), compile+=get_executable_path(g_argv0), compile+= _T("\""); compile+= _T(" ") OPT_STR _T("v"), wsprintf(buf,_T("%d"),get_verbosity()), compile+=buf; #if defined(_WIN32) && defined(_UNICODE) // POSIX does not support -OUTPUTCHARSET compile+= _T(" ") OPT_STR _T("OCS UTF8"), forceutf8++; // Force UTF-8 and disable batch-file workaround in RunChildProcessRedirected #endif if (*exec) compile+= _T(" "), compile+=exec; exec=compile.c_str(); } SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\"\n"),cmdname,exec); if (preprocessonly) PREPROCESSONLY_BEGINCOMMENT(); #ifdef _WIN32 if (TOK_P_SYSTEMEXEC != which_token) ret=RunChildProcessRedirected(exec, forceutf8 ? true : false); else #endif //~ _WIN32 ret=sane_system(exec), (void)forceutf8; // forceutf8 is not used on POSIX if (comp == 5) { definedlist.set_si32(define,ret); } else if (!check_external_exitcode(ret,comp,cmpv)) { ERROR_MSG(_T("%") NPRIs _T(": returned %d, aborting\n"),cmdname,ret); return PS_ERROR; } if (preprocessonly) PREPROCESSONLY_ENDCOMMENT(); SCRIPT_MSG(_T("%") NPRIs _T(": returned %d\n"),cmdname,ret); return PS_OK; } int CEXEBuild::pp_addincludedir(LineParser&line) { TCHAR *f = line.gettoken_str(1); PATH_CONVERT(f); include_dirs.add(f, 0); return PS_OK; } static const TCHAR *g_incerrfmtstr = _T("!include: error in script: \"%") NPRIs _T("\" on line %d\n"); static const TCHAR *g_incerrlvlfmtstr = _T("!include: too many levels of includes (%d max).\n"); int CEXEBuild::includeScript(const TCHAR *file, NStreamEncoding&enc) { NIStream incstrm; const bool openok = incstrm.OpenFileForReading(file, enc); if (NStreamEncoding::AUTO == enc.GetCodepage() && build_unicode && !enc.IsUnicodeCodepage(enc.GetPlatformDefaultCodepage()) && enc.GetPlatformDefaultCodepage() == incstrm.StreamEncoding().GetCodepage() ) { incstrm.StreamEncoding().SetCodepage(NStreamEncoding::UTF8); // !include defaults to UTF-8 after "Unicode true" } enc = incstrm.StreamEncoding(); TCHAR bufcpdisp[20]; incstrm.StreamEncoding().GetCPDisplayName(bufcpdisp); SCRIPT_MSG(_T("!include: \"%") NPRIs _T("\" (%") NPRIs _T(")\n"), file, bufcpdisp); if (!openok) { ERROR_MSG(_T("!include: could not open file: \"%") NPRIs _T("\"\n"), file); return PS_ERROR; } if (build_include_depth >= MAX_INCLUDEDEPTH) { ERROR_MSG(g_incerrlvlfmtstr, MAX_INCLUDEDEPTH); return PS_ERROR; } build_include_depth++; const int last_linecnt = linecnt; const TCHAR *last_filename = curfilename; curfilename = file, linecnt = 0; NStreamLineReader linereader(incstrm); NStreamLineReader *last_linereader = curlinereader; curlinereader = &linereader; #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES TCHAR *oldfilename = set_file_predefine(curfilename); TCHAR *oldtimestamp = set_timestamp_predefine(curfilename); #endif int r = parseScript(); const int errline = linecnt; #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES restore_file_predefine(oldfilename); restore_timestamp_predefine(oldtimestamp); #endif curfilename = last_filename, linecnt = last_linecnt; curlinereader = last_linereader; build_include_depth--; if (r != PS_EOF && r != PS_OK) { ERROR_MSG(g_incerrfmtstr, file, errline); return PS_ERROR; } SCRIPT_MSG(_T("!include: closed: \"%") NPRIs _T("\"\n"), file); return PS_OK; } int CEXEBuild::includeScriptLines(const TCHAR *start, const TCHAR *end, const TCHAR *name) { if (build_include_depth >= MAX_INCLUDEDEPTH) { ERROR_MSG(g_incerrlvlfmtstr, MAX_INCLUDEDEPTH); return PS_ERROR; } build_include_depth++; tstring buf; int ret = PS_OK; bool unicode = sizeof(*start) > sizeof(char); for (unsigned int ln = 0; start < end && ret == PS_OK;) { const TCHAR *line = start, eot = 4; size_t i, nl; for (i = 0, nl = 0;; ++i) { nl = &line[i] < end ? NStream::IsNewline(line[i], unicode) : eot; if (nl || !line[i]) break; } if (nl) { buf.assign(line, i); line = buf.c_str(); } if (*line) ret = process_oneline(line, name, ++ln, PLF_VIRTUALFILE); if (ret != PS_OK) ERROR_MSG(g_incerrfmtstr, name, ln); start += i + 1; } build_include_depth--; return ret; } int CEXEBuild::pp_include(LineParser&line) { bool required = true, memfile = false, done = false; NStreamEncoding enc(NStreamEncoding::AUTO); const TCHAR *f; unsigned int toks = line.getnumtokens() - 1, included = 0; for(unsigned int tok = 0; toks;) { f = line.gettoken_str(++tok); if (tok >= toks) break; if (!_tcsicmp(f,_T("/memfile"))) memfile = true; if (!_tcsicmp(f,_T("/nonfatal"))) required = false; TCHAR buf[9+1]; my_strncpy(buf, f, COUNTOF(buf)); if (!_tcsicmp(buf,_T("/charset="))) { WORD cp = GetEncodingFromString(f+9); if (NStreamEncoding::UNKNOWN == cp) toks = 0; enc.SafeSetCodepage(cp); } } if (!toks || !*f) PRINTHELP(); if (memfile) { const TCHAR *s, *e, *n = get_memorycode_filename(); if (getmemfileinfo(*this, f, &s, &e)) { return includeScriptLines(s, e, n); } done = true, f = n; } const TCHAR *fc = my_convert(f); tstring dir = get_dir_name(fc), spec = get_file_name(fc), basedir = dir; my_convert_free(const_cast(fc)); path_append_separator(basedir); if (dir == spec) basedir = _T(""), dir = _T("."); // no path, just file name // search working directory boost::scoped_ptr dr( new_dir_reader() ); dr->read(dir); for (dir_reader::iterator files_itr = dr->files().begin(); !done && files_itr != dr->files().end(); files_itr++) { if (!dir_reader::matches(*files_itr, spec)) continue; tstring incfile = basedir + *files_itr; if (includeScript(incfile.c_str(), enc) != PS_OK) return PS_ERROR; else included++; } if (included) return PS_OK; // search include dirs TCHAR *incdir = include_dirs.get(); int incdirs = include_dirs.getnum(); for (int i = 0; !done && i < incdirs; i++, incdir += _tcslen(incdir) + 1) { tstring curincdir(incdir), incfile; if (_T(".") != dir) path_append(curincdir, dir); boost::scoped_ptr dr( new_dir_reader() ); dr->read(curincdir); for (dir_reader::iterator incdir_itr = dr->files().begin(); incdir_itr != dr->files().end(); incdir_itr++) { if (!dir_reader::matches(*incdir_itr, spec)) continue; path_append(incfile = curincdir, *incdir_itr); if (includeScript(incfile.c_str(), enc) != PS_OK) return PS_ERROR; else included++; } if (included) return PS_OK; } if (!included) // nothing found? { if (required) { ERROR_MSG(_T("!include: could not find: \"%") NPRIs _T("\"\n"), f); return PS_ERROR; } else warning_fl(DW_INCLUDE_NONFATAL_NOT_FOUND, _T("!include: could not find: \"%") NPRIs _T("\""), f); } return PS_OK; } int CEXEBuild::pp_cd(LineParser&line) { const TCHAR *dir = line.gettoken_str(1); if (!dir[0] || _tchdir(dir)) { ERROR_MSG(_T("!cd: error changing to: \"%") NPRIs _T("\"\n"), dir); return PS_ERROR; } return PS_OK; } int CEXEBuild::pp_boolifyexpression(LineParser&line, int &result, bool allow_logicneg, int ignore_last_tokens) { const TCHAR *cmdnam = line.gettoken_str(0); // Must save name now before eattoken! int istrue = 0, mod = 0, logicneg = 0; if (allow_logicneg && !_tcscmp(line.gettoken_str(1),_T("!"))) logicneg++, line.eattoken(); int numtokens = line.getnumtokens() - ignore_last_tokens; if (numtokens == 2) { istrue = line.gettoken_number(1) || line.gettoken_int(1); } else if (numtokens == 3) { if (!_tcsicmp(line.gettoken_str(1),_T("/fileexists"))) { TCHAR *fc = my_convert(line.gettoken_str(2)); tstring dir = get_dir_name(fc), spec = get_file_name(fc); my_convert_free(fc); if (dir == spec) dir = _T("."); boost::scoped_ptr dr( new_dir_reader() ); dr->hack_simpleexcluded().erase(_T(".")); dr->read(dir); for (dir_reader::iterator fit = dr->files().begin(); fit != dr->files().end() && !istrue; fit++) { if (dir_reader::matches(*fit, spec)) istrue = true; } if (!istrue) for (dir_reader::iterator dit = dr->dirs().begin(); dit != dr->dirs().end() && !istrue; dit++) { if (dir_reader::matches(*dit, spec)) istrue = true; } } else PRINTHELPEX(cmdnam) } else if (numtokens == 4) { int cnv1 = 1, cnv2 = 1; mod = line.gettoken_enum(2,_T("==\0!=\0S==\0S!=\0=\0<>\0<=\0<\0>\0>=\0&\0&&\0|\0||\0")); switch(mod) { case 0: istrue = _tcsicmp(line.gettoken_str(1),line.gettoken_str(3)) == 0; break; case 1: istrue = _tcsicmp(line.gettoken_str(1),line.gettoken_str(3)) != 0; break; case 2: istrue = _tcscmp(line.gettoken_str(1),line.gettoken_str(3)) == 0; break; case 3: istrue = _tcscmp(line.gettoken_str(1),line.gettoken_str(3)) != 0; break; case 4: istrue = line.gettoken_number(1,&cnv1) == line.gettoken_number(3,&cnv2); break; case 5: istrue = line.gettoken_number(1,&cnv1) != line.gettoken_number(3,&cnv2); break; case 6: istrue = line.gettoken_number(1,&cnv1) <= line.gettoken_number(3,&cnv2); break; case 7: istrue = line.gettoken_number(1,&cnv1) < line.gettoken_number(3,&cnv2); break; case 8: istrue = line.gettoken_number(1,&cnv1) > line.gettoken_number(3,&cnv2); break; case 9: istrue = line.gettoken_number(1,&cnv1) >= line.gettoken_number(3,&cnv2); break; case 10: istrue = (line.gettoken_int(1,&cnv1) & line.gettoken_int(3,&cnv2)) != 0; break; case 11: istrue = line.gettoken_int(1,&cnv1) && line.gettoken_int(3,&cnv2); break; case 12: case 13: istrue = line.gettoken_int(1,&cnv1) || line.gettoken_int(3,&cnv2); break; default: PRINTHELPEX(cmdnam) } if (!cnv1 || !cnv2) warning_fl(DW_PARSE_BADNUMBER, _T("Invalid number: \"%") NPRIs _T("\""), line.gettoken_str(!cnv1 ? 1 : 3)); } else { PRINTHELPEX(cmdnam) } result = logicneg ? !istrue : istrue; return PS_OK; } int CEXEBuild::pp_assert(LineParser&line) { const TCHAR *message = line.gettoken_str(line.getnumtokens() - 1); int istrue, ec = pp_boolifyexpression(line, istrue, false, 1); if (ec != PS_ERROR && !istrue) { tstring buf = _T(""); if (!*message) { for (int i = 1, c = line.getnumtokens() - 1, any = 0; i < c; ++i) buf += (_T(" ") + !(any++)), buf += line.gettoken_str(i); message = buf.c_str(); } ERROR_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), get_commandtoken_name(TOK_P_ASSERT), message); return PS_ERROR; } return ec; } nsis-3.11/Source/strlist.cpp000077500000000000000000000247321477201124000160730ustar00rootroot00000000000000/* * strlist.cpp: Implementation of the StringList class. * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support and Doxygen comments by Jim Park -- 08/01/2007 */ #include "strlist.h" #include "utf.h" #include "util.h" // For PrintColorFmtMsg_ERR #ifdef _UNICODE char* convert_processed_string_to_ansi(char *out, const TCHAR *in, WORD codepage); // defined in build.cpp #endif static inline bool byte_rev_match(const void*ptr1, const void*ptr2, size_t cb) { char *p1 = (char*) ptr1, *p2 = (char*) ptr2; for(; cb--;) if (p1[cb] != p2[cb]) return false; return true; } unsigned int ExeHeadStringList::getnum() const { char *p = (char*) m_gr.get(); if (!p) return 1; // The empty string always exists unsigned int num = 1; size_t cbList = gettotalsize(), cb = 0, pos; pos = 1 + !!m_wide, p += pos; // Skip empty string if (m_wide) { for(;;) { if ((pos+=cb) >= cbList) break; cb = (StrLenUTF16(p+=cb) + 1) * 2, ++num; } } else { for(;;) { if ((pos+=cb) >= cbList) break; cb = strlen(p+=cb) + 1, ++num; } } return num; } bool ExeHeadStringList::get(unsigned int offset, tstring&outstr) const { if (0 == offset) { outstr.assign(_T("")); return true; } char *p = (char*) m_gr.get(); unsigned int cbList = gettotalsize(); if (p && cbList < offset) { if (m_wide) StrSetUTF16LE(outstr,&p[offset*WIDEDIV]); else // BUGBUG: There is no way for us to know the correct codepage outstr = CtoTString(&p[offset]); return true; } return false; } /* * find() finds the offset where the string is stored, returns -1 if not found. * It only compares raw byte values, there is no Unicode normalization handling. * If ppBufMB is non-null you must delete[] it (Only valid when m_wide is false)! */ unsigned int ExeHeadStringList::find(const TCHAR *str, WORD codepage, bool processed, char**ppBufMB) const { if (m_wide && *str) { WCToUTF16LEHlpr cnv; if (!cnv.Create(str)) return -1; unsigned int pos = find(cnv.Get(),StrLenUTF16(cnv.Get()),codepage,processed,ppBufMB); cnv.Destroy(); return pos; } else { return find(str,(unsigned int)_tcslen(str),codepage,processed,ppBufMB); } } unsigned int ExeHeadStringList::find(const void *ptr, unsigned int cchF, WORD codepage, bool processed, char**ppBufMB) const { const wchar_t *find = (const wchar_t*) ptr; // Data is: m_wide ? UTF16LE : wchar_t if (!*find) return 0; // The empty string is always first (ExeHead uses string block offset 0 to indicate no parameter present in some places). char *p = (char*) m_gr.get(); if (!p) return -1; unsigned int cbF = ++cchF * 2; // Include \0 as part of cchF, * 2 for UTF16 & DBCS. char *bufMB = 0; if (!m_wide) { unsigned int cbMB; bufMB = new char[cbF]; if (processed) { char *pTmp = convert_processed_string_to_ansi(bufMB,find,codepage); cbMB = (int)(pTmp ? pTmp - bufMB : 0); } else { cbMB = WideCharToMultiByte(codepage,0,find,cchF,bufMB,cbF,0,0); } #ifndef NDEBUG if (!cbMB) { const TCHAR *fmt = _T("Unable to convert%")NPRIns _T(" string \"%")NPRIs _T("\" to codepage %u\n"); PrintColorFmtMsg_ERR(fmt,(processed ? " processed" : ""),find,codepage); } #endif assert(cbMB); cbF = cbMB, find = (const wchar_t*) bufMB; } size_t cbList = gettotalsize(), cb = 0, retval = -1, pos; pos = 1 + !!m_wide, p += pos; // Skip empty string if (m_wide) { for(;;) { if ((pos+=cb) >= cbList) break; cb = (StrLenUTF16(p+=cb) + 1) * 2; if (cb < cbF) continue; size_t cbOfs = cb - cbF; if (byte_rev_match(p + cbOfs,find,cbF)) { retval = (pos + cbOfs) / WIDEDIV; break; } } } else { for(;;) { if ((pos+=cb) >= cbList) break; cb = (unsigned int) strlen(p+=cb) + 1; if (cb < cbF) continue; size_t cbOfs = cb - cbF; if (byte_rev_match(p + cbOfs,find,cbF)) { retval = (pos + cbOfs); break; } } if (ppBufMB) *ppBufMB = bufMB; else delete[] bufMB; } // -1 is a valid magic return value but we must avoid the truncation check in truncate_cast return retval != (size_t)(-1) ? truncate_cast(unsigned int,retval) : (unsigned int) retval; } int ExeHeadStringList::add(const TCHAR *str, WORD codepage, bool processed) { char *p = (char*) m_gr.get(); if (!p) { if (!*str) return 0; // Delay allocating the empty string char *&zero = p, cb = 1 + !!m_wide; unsigned int pos = m_gr.add(&zero,cb); assert(0 == pos); } char *bufMB = 0; unsigned int pos = find(str,codepage,processed,m_wide ? 0 : &bufMB); if ((unsigned int)-1 != pos) { delete[] bufMB; return pos; } if (m_wide) { WCToUTF16LEHlpr cnv; if (!cnv.Create(str)) throw std::bad_alloc(); pos = m_gr.add(cnv.Get(),cnv.GetSize()) / WIDEDIV; cnv.Destroy(); } else { unsigned int cbMB = (unsigned int) strlen(bufMB) + 1; pos = m_gr.add(bufMB,cbMB); delete[] bufMB; } return pos; } int StringList::add(const TCHAR *str, int case_sensitive) { int a=find(str,case_sensitive); if (a >= 0 && case_sensitive!=-1) return a; return m_gr.add(str,truncate_cast(int,(_tcslen(str)+1)*sizeof(TCHAR)))/sizeof(TCHAR); } // use 2 for case sensitive end-of-string matches too int StringList::find(const TCHAR *str, int case_sensitive, int *idx/*=NULL*/) const // returns -1 if not found { const TCHAR *s=get(); int ml=getcount(); int offs=0; size_t str_slen = _tcslen(str); size_t offs_slen; if (idx) *idx=0; while (offs < ml) { // Check if the whole string matches str. if ((case_sensitive && !_tcscmp(s+offs,str)) || (!case_sensitive && !_tcsicmp(s+offs,str))) { return offs; } offs_slen = _tcslen(s+offs); // Check if just the end of the string matches str. if (case_sensitive==2 && str_slen < offs_slen && // check for end of string !_tcscmp(s + offs + offs_slen - str_slen,str)) { return truncate_cast(int,offs + offs_slen - str_slen); } offs += truncate_cast(int,offs_slen + 1); if (idx) (*idx)++; } return -1; } // pos is the position in TCHARs, not bytes. void StringList::delbypos(int pos) { TCHAR *s=(TCHAR*) m_gr.get(); int len=(int)_tcslen(s+pos)+1; if (pos+len < getcount()) { // Move everything after the string position to the current position. memcpy(s+pos,s+pos+len, (getcount()-pos+len)*sizeof(TCHAR)); } m_gr.resize(m_gr.getlen()-len*sizeof(TCHAR)); } // idx corresponds to the nth string in the list. int StringList::idx2pos(int idx) const { TCHAR *s=(TCHAR*) m_gr.get(); int offs=0; int cnt=0; if (idx>=0) while (offs < getcount()) { if (cnt++ == idx) return offs; offs+=(int)_tcslen(s+offs)+1; } return -1; } int StringList::getnum() const { TCHAR *s=(TCHAR*) m_gr.get(); int ml=getcount(); int offs=0; int idx=0; while (offs < ml) { offs+=(int)_tcslen(s+offs)+1; idx++; } return idx; } // ========== // DefineList // ========== /** * Since the SortedStringList base class handles the memory for .name values, * this destructor handles all the .value values in struct define. */ DefineList::~DefineList() { struct define *s=(struct define*) m_gr.get(); int num=m_gr.getlen()/sizeof(struct define); for (int i=0; i::add(name); if (pos == -1) return 1; size_t cbVal = ++maxvallen * sizeof(TCHAR); TCHAR **newvalue=&(((struct define*) m_gr.get())[pos].value); *newvalue = (TCHAR*)malloc(cbVal); if (!(*newvalue)) { extern int g_display_errors; extern void quit(); if (g_display_errors) { PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: DefineList malloc(%lu) failed.\n"), truncate_cast(unsigned long,cbVal)); } quit(); } my_strncpy(*newvalue, value, maxvallen); return 0; } int DefineList::add(const TCHAR *name, const TCHAR *value/*=_T("")*/) { return addn(name, _tcslen(value), value); } int DefineList::set(const TCHAR *name, const TCHAR *value/*=_T("")*/) { del(name); return add(name, value); } int DefineList::set_si32(const TCHAR *name, long value) { TCHAR buf[50]; _stprintf(buf, _T("%ld"), value); return set(name, buf); } int DefineList::set_ui32(const TCHAR *name, unsigned long value) { TCHAR buf[50]; _stprintf(buf, _T("%lu"), value); return set(name, buf); } TCHAR *DefineList::find(const TCHAR *name) { int v=SortedStringList::find(name); if (v==-1) { return NULL; } return ((struct define*) m_gr.get())[v].value; } // returns 0 on success, 1 otherwise int DefineList::del(const TCHAR *str) { int pos=SortedStringList::find(str); if (pos==-1) return 1; struct define *db=(struct define *) m_gr.get(); free(db[pos].value); delbypos(pos); return 0; } int DefineList::getnum() { return m_gr.getlen()/sizeof(define); } TCHAR *DefineList::getname(int num) { if ((unsigned int)getnum() <= (unsigned int)num) return 0; return ((struct define*) m_gr.get())[num].name; } TCHAR *DefineList::getvalue(int num) { if ((unsigned int)getnum() <= (unsigned int)num) return 0; return ((struct define*) m_gr.get())[num].value; } // ============== // FastStringList // ============== int FastStringList::add(const TCHAR *name, int case_sensitive/*=0*/) { int pos = SortedStringListND::add(name, case_sensitive); if (pos == -1) return -1; return ((struct string_t*) m_gr.get())[pos].name; } TCHAR *FastStringList::get() const { return (TCHAR*)m_strings.get(); } int FastStringList::getcount() const { return m_strings.getlen()/sizeof(TCHAR); } int FastStringList::getnum() const { return m_gr.getlen()/sizeof(struct string_t); } nsis-3.11/Source/strlist.h000077500000000000000000000457361477201124000155470ustar00rootroot00000000000000/* * strlist.h: Implementation of the StringList class. * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support and Doxygen comments by Jim Park -- 07/27/2007 */ #ifndef _STRLIST_H_ #define _STRLIST_H_ #include "Platform.h" #include #include #include "tchar.h" #include "growbuf.h" #include "util.h" /** * Implements a list of strings mapped into a straight buffer. It is * virtually always O(n) to do any basic operations on this thing. Very * memory efficient but very slow performance. */ class StringList { private: // don't copy instances StringList(const StringList&); void operator=(const StringList&); public: StringList() {} ~StringList() {} /** * Adds a string to the StringList. If the string already exists in the * list, then it just returns the index of the found string. * * @param str String to add. * * @param case_sensitive If 0, search for whole string case insensitively. * If 1, then search for whole string case sensitively. If 2, then search * for just the end of the string match case sensitively. Basically it's * like searching for regexp('str$') in the list of string. If -1, then it * adds the string regardless of whether there is a match or not! * * @return the index to the string in TCHARs. */ int add(const TCHAR *str, int case_sensitive); /** * Search the StringList for a string. If the string already exists in the * list then it returns the index of the found string. Returns -1 on * failure. * * @param str String to search for. * * @param case_sensitive If 0, search for whole string case insensitively.If * 1, then search for whole string case sensitively. If 2, then * search for just the end of the string match, case sensitively. * Basically it's like searching for regexp('str$') in the list of string. * * @param idx If not NULL, the *idx is set to the cardinal number of the * string. In other words, it tells you which nth string it is in the * list. * * @return the TCHAR index to the string (not necessarily the byte positional * offset). -1 if not found. */ int find(const TCHAR *str, int case_sensitive, int *idx=NULL) const; // returns -1 if not found /** * Delete the string at the positional index. * * @param pos The number of TCHARS to count from the beginning of the buffer * before the start of the string. */ void delbypos(int pos); void deleteall() { m_gr.resize(0); } /** * Converts the string index to the positional TCHAR index. For example, * it gives the answer to which TCHAR position is the beginning of the * nth string in the list? * * @param idx The string index. */ int idx2pos(int idx) const; /** * Get the count of the number of strings in the list. * @return the number of string in the list. */ int getnum() const; /** * Get the buffer straight as a const TCHAR pointer. Very unwise to use. * @return m_gr.m_s cast as a TCHAR*. */ const TCHAR *get() const { return (const TCHAR*) m_gr.get(); } /** * Get the buffer size (number of TCHARs). * @return The buffer size (number of TCHARs). */ int getcount() const { return m_gr.getlen() / sizeof(TCHAR); } protected: GrowBuf m_gr; }; #include "tstring.h" /** * Stores a list of strings as UTF16LE or raw bytes (multibyte char*). */ class ExeHeadStringList { private: // don't copy instances ExeHeadStringList(const ExeHeadStringList&); void operator=(const ExeHeadStringList&); public: ExeHeadStringList() { m_wide = false; m_gr.set_zeroing(true); } void setunicode(bool unicode) { m_wide = unicode; } bool addemptystring() { return true; } // Added by add() when the first real string is added int add(const TCHAR *str, WORD codepage, bool processed); unsigned int find(const TCHAR *str, WORD codepage, bool processed, char**ppBufMB) const; bool get(unsigned int offset, tstring&str) const; unsigned int getnum() const; unsigned int gettotalsize() const { return m_gr.get() ? m_gr.getlen() : (m_wide ? 2 : 1); } const void* getstorageptr() const { return m_gr.get() ? m_gr.get() : (void*)L""; } protected: unsigned int find(const void *str, unsigned int cchF, WORD codepage, bool processed, char**ppBufMB) const; GrowBuf m_gr; bool m_wide; // Are we storing wide or narrow strings enum {WIDEDIV=2}; // ExeHead expects us to provide offsets this way, also helps UTF16 offsets for shell constants to fit in < 0xFF }; /** * This class maintains a list of T types in a GrowBuf sorted by T.name which * is assumed to be a string (TCHAR*). So it's really sort of a * map where X is whatever else is defined in T. But T must define * a TCHAR* name. */ template class SortedStringList { public: /** * Jim Park: Note that SortedStringList actually owns T.name. * Yes, this violates all kinds of encapsulation ideas. */ virtual ~SortedStringList() { T *s=(T*) m_gr.get(); size_t num = m_gr.getlen()/sizeof(T); for (size_t i=0; i ll) { int res; if (case_sensitive) res=_tcscmp(str, data[nextpos].name); else res=_tcsicmp(str, data[nextpos].name); if (res==0) return returnbestpos ? -1 : nextpos; if (res<0) ul=nextpos; else ll=nextpos+1; nextpos=(ul+ll)/2; } return returnbestpos ? nextpos : -1; } /** * This function looks for str in T.name and deletes the T in the * buffer. * * @return Returns 0 on success, 1 on failure. */ int del(const TCHAR *str, int case_sensitive=0) { int pos=find(str, case_sensitive); if (pos==-1) return 1; delbypos(pos); return 0; } /** * Given a T position, it deletes it from the buffer. It will * move the rest of the Ts to fill its position. * * @param pos The position of the target for deletion in T* offsets. */ void delbypos(int pos) { T *db=(T *) m_gr.get(); free(db[pos].name); memmove(db+pos,db+pos+1, m_gr.getlen()-(pos*sizeof(T))-sizeof(T)); m_gr.resize(m_gr.getlen()-sizeof(T)); } protected: TinyGrowBuf m_gr; }; /** * This class maintains a list of T types in a GrowBuf sorted by T.name which * is assumed to be an index into m_strings. So it's really sort of a * map where X is whatever else is defined in T. But T must define * a int name. * * This version does not have a delete function, hence the ND designation. * Also, because nothing is malloc'ed and free'd, this structure can be * placed in a single flat buffer. (Of course, T itself can be holding * pointers to things on the heap, which this structure does not * disallow explicitly.) */ template class SortedStringListND // no delete - can be placed in GrowBuf { public: SortedStringListND() { } virtual ~SortedStringListND() { } /** * Adds name into the list of sorted strings. * * @param name String to store. * @param case_sensitive Look for string case sensitively. Default is 0. * @param alwaysreturnpos Always return the position regardless of whether * name was inserted into the list or not. The default is 0. * * @return Returns -1 when name already exists, otherwise the T offset * into which the struct was stored in m_gr. If alwaysreturnpos * is true, then it will return the byte offset regardless of whether * the string was found. */ int add(const TCHAR *name, int case_sensitive=0, int alwaysreturnpos=0) { int where=0; T newstruct={0,}; // Find the best position to insert. int pos=find(name,-1,case_sensitive,1,&where); if (pos==-1) return alwaysreturnpos ? where : -1; // Note that .name is set with the TCHAR* offset into m_strings. newstruct.name=m_strings.add(name,((unsigned int)_tcslen(name)+1)*sizeof(TCHAR))/sizeof(TCHAR); m_gr.add(&newstruct,sizeof(T)); T *s=(T*) m_gr.get(); memmove(s+pos+1, s+pos, m_gr.getlen()-((pos+1)*sizeof(T))); memcpy(s+pos, &newstruct, sizeof(T)); return pos; } /** * This function looks for the string str, in T.name in the buffer m_gr. * If it finds it, it returns the position found. Otherwise, it returns * -1. * * This behavior changes when returnbestpos == 1. In this case, * it will do the reverse. It will return -1 when it is found, noting * that there is no good place to put this duplicate string. If it * is not found, it returns the position where it ought to be * placed. * * When case_sensitive == -1 and returnbestpos == 1, then when the string * is found, it returns * the position of the string so that one can overwrite it. Very strange * special case behavior that I'm not sure if anyone actually uses. * * @param str The key string to search for. * * @param n_chars The number of characters to compare. Use -1 to match * the entire string. * * @param case_sensitive 1 = case sensitive, 0 = case insensitive, * -1 is a special case where it is case sensitive and overrides the * returnbestpos behavior when the string is found. * * @param returnbestpos If 1, then look for the best position to add the * string. If found in the list, return -1. * * @param where When str is found, returns the position of the string. * * @return The position of T where T.name == str. If returnbestpos != 0 * then return the best position to add T if not found, otherwise, -1. */ int find ( const TCHAR* str, /* key to search for */ int n_chars=-1, /* if -1, test the entire string, otherwise just n characters */ int case_sensitive=0, int returnbestpos=0, /* if not found, return best pos */ int*where=0 ) const { T *data=(T *) m_gr.get(); int ul = m_gr.getlen()/sizeof(T); int ll = 0; int nextpos = (ul+ll)/2; // Do binary search on m_gr which is sorted. m_strings is NOT sorted. while (ul > ll) { int res; const TCHAR *pCurr = (TCHAR*) m_strings.get() + data[nextpos].name; if (n_chars < 0) { if (case_sensitive) res = _tcscmp(str, pCurr); else res = _tcsicmp(str, pCurr); } else { unsigned int pCurr_len = (unsigned int) _tcslen(pCurr); if (case_sensitive) res = _tcsncmp(str, pCurr, STD_MIN((unsigned int) n_chars, pCurr_len)); else res = _tcsnicmp(str, pCurr, STD_MIN((unsigned int) n_chars, pCurr_len)); // If there is a match and we are looking for a partial match and // n_chars is NOT the length of the current string, then the // comparison result is determined by the length comparison. if (res == 0 && n_chars != -1 && (unsigned int) n_chars != pCurr_len) res = n_chars - pCurr_len; } // Found! if (res==0) { // Return where we found it in *where. if (where) *where = nextpos; // If returnbestpos, then we should return -1, otherwise where // we found it. But if (returnbestpos && case_sensitive == -1) // returns nextpos. return returnbestpos ? (case_sensitive!=-1 ? -1 : nextpos) : nextpos; } if (res<0) ul=nextpos; else ll=nextpos+1; nextpos=(ul+ll)/2; } return returnbestpos ? nextpos : -1; } protected: TinyGrowBuf m_gr; // Sorted array of Ts GrowBuf m_strings; // Unsorted array of TCHAR strings (contains the .names) }; /** * Structure stored by DefineList. */ struct define { TCHAR *name; // key TCHAR *value; // value stored }; /** * DefineList is a specialized version of a SortedStringList * which is like a string to string mapping class. */ class DefineList : public SortedStringList { private: // don't copy instances DefineList(const DefineList&); void operator=(const DefineList&); public: /* Empty default constructor */ DefineList() {} // VC6 complains otherwise virtual ~DefineList(); /** * Add a name-value pair, case insensitively. * * @param name The name of the variable or key to search by. In a * std::map, it would be the .first of the pair. * * @param value The value to store. In a std::map, it would be the.second * of the pair. * * @return Returns 0 if successful, 1 if already exists. Errors cause * general program exit with error logging. */ int add(const TCHAR *name, const TCHAR *value=_T("")); int addn(const TCHAR *name, size_t maxvallen, const TCHAR *value); // maxvallen does not include \0 int set(const TCHAR *name, const TCHAR *value=_T("")); int set_si32(const TCHAR *name, long value); int set_ui32(const TCHAR *name, unsigned long value); /** * This function returns the pointer to the .value TCHAR* that corresponds * to the name key. * * @param name The key to search with. * * @return The TCHAR* to the value portion of the define struct. If not * found, returns NULL. */ TCHAR *find(const TCHAR *name); /** * This function deletes the define struct corresponding to the key 'str'. * * @return Returns 0 on success, 1 otherwise */ int del(const TCHAR *str); /** * This function returns the number of define structs in the sorted array. */ int getnum(); /** * Get the .name string of the (num)th define struct in the sorted array. * * @return Returns 0 if not found, otherwise the pointer to the .name. */ TCHAR *getname(int num); /** * Get the .value string of the (num)th define struct in the sorted array. * * @return Returns 0 if not found, otherwise the pointer to the .value. */ TCHAR *getvalue(int num); }; /** * Storage unit for FastStringList. Contains the byte offset into m_strings. */ struct string_t { int name; }; /** * This class uses SortedStringListND to implement a "faster" storage of * strings. It sort of implements a std::set that allows you * to add to the set and check for existence of the set. * * It's only faster in the sense that memory moves now only need to occur * on the array of string_t structs (or pointers) rather than entire * strings. A truly faster implementation would be using a hash table. */ class FastStringList : public SortedStringListND { private: // don't copy instances FastStringList(const FastStringList&); void operator=(const FastStringList&); public: /* Empty constructor */ FastStringList() {} // VC6 complains otherwise /* Empty virtual destructor */ virtual ~FastStringList() {} /** * Adds name to sorted array and returns the TCHAR* offset of m_strings * where it is stored. * * @param name The string to store. * * @param case_sensitive Should we store this case sensitively or not? * Setting case_sensitive to -1 will cause it to be case sensitive and * always overwrite. (Weird bad behavior). * * @return The TCHAR* offset of name in m_string as an int. */ int add(const TCHAR *name, int case_sensitive=0); /** * Get the buffer that contains the list of the strings in the order * in which they were added. * * @return The pointer to m_strings as a TCHAR*. */ TCHAR *get() const; /** * The size of the collection of m_strings as a count of TCHARs. * * @return the size of m_strings as count of TCHARs. */ int getcount() const; /** * The number of strings stored in the sorted array. * * @return The number of strings stored. */ int getnum() const; }; #endif//_STRLIST_H_ nsis-3.11/Source/tchar.h000077500000000000000000000141351477201124000151310ustar00rootroot00000000000000/* * tchar.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * This software is provided 'as-is', without any express or implied * warranty. * * For Unicode support by Jim Park -- 08/30/2007 */ // Jim Park: Only those we use are listed here. #pragma once #ifdef _UNICODE #include #ifndef _T #define __T(x) L ## x #define _T(x) __T(x) #define _TEXT(x) __T(x) #endif #if !defined(_WIN32) && defined(EXEHEAD) typedef unsigned short TCHAR, _TUCHAR; #else // MinGW typedefs TCHAR and _TCHAR inside #ifndef _TCHAR_DEFINED // MSVC typedefs TCHAR inside #ifndef _TCHAR_DEFINED // and _TCHAR and _T*CHAR inside #ifndef __TCHAR_DEFINED. // We don't want to break MSVCs _TSCHAR and _TXCHAR so we don't protect our typedef... #if defined(_WIN32) && ((_MSC_VER>1 && (_MSC_VER<1400 || !defined(_NATIVE_WCHAR_T_DEFINED))) || !defined(_WCHAR_T_DEFINED)) // VC6 knows about __wchar_t but does not support it. /Zc:wchar_t is on by default starting with VC8. // VC7.1 supports __wchar_t but using it causes problems with conversions from WCHAR (unsigned short)? typedef unsigned short TCHAR, _TUCHAR; #else typedef wchar_t TCHAR, _TUCHAR; #endif #endif // program #define _tmain wmain #define _tWinMain wWinMain #define _tenviron _wenviron #define __targv __wargv // printfs #define _ftprintf fwprintf #define _sntprintf _snwprintf #if (defined(_MSC_VER) && (_MSC_VER<=1310||_MSC_FULL_VER<=140040310)) || defined(__MINGW32__) # define _stprintf swprintf #else # define _stprintf _swprintf #endif #define _tprintf wprintf #define _vftprintf vfwprintf #define _vsntprintf _vsnwprintf #if defined(_MSC_VER) && (_MSC_VER<=1310||_MSC_FULL_VER<=140040310) # define _vstprintf vswprintf #else # define _vstprintf _vswprintf #endif // scanfs #define _tscanf wscanf #define _stscanf swscanf // string manipulations #define _tcscat wcscat #define _tcschr wcschr #define _tcsclen wcslen #define _tcscpy wcscpy #define _tcsdup _wcsdup #define _tcslen wcslen #define _tcsrchr(s,c) ( wcsrchr((wchar_t*)(s), (c)) ) // bug #1085: If is included the compiler has problems picking the correct overloaded function #define _tcsstr wcsstr #define _tcstok wcstok // string comparisons #define _tcscmp wcscmp #define _tcsicmp _wcsicmp #define _tcsncicmp _wcsnicmp #define _tcsncmp wcsncmp #define _tcsnicmp _wcsnicmp // upper / lower #define _tcslwr _wcslwr #define _tcsupr _wcsupr #define _totlower towlower #define _totupper towupper // conversions to numbers #define _tcstoi64 _wcstoi64 #define _tcstol wcstol #define _tcstoul wcstoul #if !defined(_WIN32) || !defined(_MSC_VER) || (defined(_MSC_VER) && ((_MSC_VER<=1200) || defined(_DLL))) // _wtof does not exist in older versions of MSVCRT.dll # define _tstof my_wtof #else # define _tstof _wtof #endif #define _tstoi _wtoi #define _tstoi64 _wtoi64 #define _ttoi _wtoi #define _ttoi64 _wtoi64 #define _ttol _wtol // conversion from numbers to strings //Only VC has this? #define _itot _itow #define _ltot _ltow #define _i64tot _i64tow #define _ui64tot _ui64tow // file manipulations #define _tfopen _wfopen #define _topen _wopen #define _tremove _wremove #define _tunlink _wunlink #define _tstat _wstat // reading and writing to i/o #define _fgettc fgetwc #define _fgetts fgetws #define _fputts fputws #define _gettchar getwchar // directory #define _tchdir _wchdir // environment #define _tgetenv _wgetenv #define _tsystem _wsystem // time #define _tcsftime wcsftime #else // ANSI #ifndef _T #define _T(x) x #define _TEXT(x) x #endif typedef char TCHAR; typedef unsigned char _TUCHAR; // program #define _tmain main #define _tWinMain WinMain #define _tenviron environ #define __targv __argv // printfs #define _ftprintf fprintf #define _sntprintf _snprintf #define _stprintf sprintf #define _tprintf printf #define _vftprintf vfprintf #define _vsntprintf _vsnprintf #define _vstprintf vsprintf // scanfs #define _tscanf scanf #define _stscanf sscanf // string manipulations #define _tcscat strcat #define _tcschr strchr #define _tcsclen strlen #define _tcscnlen strnlen #define _tcscpy strcpy #define _tcsdup _strdup #define _tcslen strlen #define _tcsrchr strrchr #define _tcsstr strstr #define _tcstok strtok // string comparisons #define _tcscmp strcmp #define _tcsncmp strncmp #define _tcsncicmp _strnicmp #ifdef _WIN32 #define _tcsicmp _stricmp #define _tcsnicmp _strnicmp #else #define _tcsicmp strcasecmp #define _tcsnicmp strncasecmp #endif // upper / lower #define _tcslwr _strlwr #define _tcsupr _strupr #define _totupper toupper #define _totlower tolower // conversions to numbers #define _tcstol strtol #define _tcstoul strtoul #define _tstof atof #define _tstoi atoi #define _tstoi64 _atoi64 #define _tstoi64 _atoi64 #define _ttoi atoi #define _ttoi64 _atoi64 #define _ttol atol // conversion from numbers to strings #define _i64tot _i64toa #define _itot _itoa #define _ltot _ltoa #define _ui64tot _ui64toa // file manipulations #define _tfopen fopen #define _topen _open #define _tremove remove #define _tunlink _unlink #define _tstat stat // _stat on Windows? // reading and writing to i/o #define _fgettc fgetc #define _fgetts fgets #define _fputts fputs #define _gettchar getchar // directory #define _tchdir _chdir // environment #define _tgetenv getenv #define _tsystem system // time #define _tcsftime strftime #endif // is functions (the same in Unicode / ANSI on MinGW? MSVC does not agree!) #ifndef _istascii #if defined(_MSC_VER) && defined(_UNICODE) #define _istascii iswascii #else #define _istascii __isascii #endif #endif nsis-3.11/Source/tokens.cpp000077500000000000000000000762751477201124000157030ustar00rootroot00000000000000/* * tokens.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/10/2007 */ #include "Platform.h" #include #include #include "build.h" #include "tokens.h" typedef struct { int id; const TCHAR *name; int num_parms; // minimum number of parameters int opt_parms; // optional parameters, usually 0, can be -1 for unlimited. const TCHAR *usage_str; int placement; // where the token can be placed } tokenType; static tokenType tokenlist[TOK__LAST] = { {TOK_ABORT,_T("Abort"),0,1,_T("[message]"),TP_CODE}, {TOK_ADDBRANDINGIMAGE,_T("AddBrandingImage"),2,1,_T("(top|left|bottom|right) (height|width) [padding]"),TP_GLOBAL}, {TOK_ADDSIZE,_T("AddSize"),1,0,_T("size_to_add_to_section_in_kb"),TP_SEC}, {TOK_AUTOCLOSE,_T("AutoCloseWindow"),1,0,_T("(false|true)"),TP_GLOBAL}, {TOK_BGFONT,_T("BGFont"),0,6,_T("[font_face [height [weight] [/ITALIC] [/UNDERLINE] [/STRIKE]]]"),TP_GLOBAL}, {TOK_BGGRADIENT,_T("BGGradient"),0,3,_T("(off | [top_color [bottom_color [text_color]]])"),TP_GLOBAL}, {TOK_BRANDINGTEXT,_T("BrandingText"),1,1,_T("[/TRIM(LEFT|RIGHT|CENTER)] installer_text"),TP_GLOBAL}, {TOK_BRINGTOFRONT,_T("BringToFront"),0,0,_T(""),TP_CODE}, {TOK_CALL,_T("Call"),1,0,_T("function_name | [:label_name]"),TP_CODE}, {TOK_CALLINSTDLL,_T("CallInstDLL"),2,1,_T("dll_path_on_target.dll function"),TP_CODE}, {TOK_CAPTION,_T("Caption"),1,0,_T("installer_caption"),TP_GLOBAL|TP_PAGEEX}, {TOK_CHANGEUI,_T("ChangeUI"),2,0,_T("(all|dlg_id) ui_file.exe"),TP_GLOBAL}, {TOK_CLEARERRORS,_T("ClearErrors"),0,0,_T(""),TP_CODE}, {TOK_COMPTEXT,_T("ComponentText"),0,3,_T("[component_page_description] [component_subtext1] [component_subtext2]"),TP_PG}, {TOK_GETDLLVERSION,_T("GetDLLVersion"),3,1,_T("[/ProductVersion] filename $(user_var: high output) $(user_var: low output)"),TP_CODE}, {TOK_GETDLLVERSIONLOCAL,_T("GetDLLVersionLocal"),3,1,_T("localfilename $(user_var: high output) $(user_var: low output)"),TP_CODE}, {TOK_GETFILETIME,_T("GetFileTime"),3,0,_T("file $(user_var: high output) $(user_var: low output)"),TP_CODE}, {TOK_GETFILETIMELOCAL,_T("GetFileTimeLocal"),3,0,_T("localfile $(user_var: high output) $(user_var: low output)"),TP_CODE}, {TOK_COPYFILES,_T("CopyFiles"),2,3,_T("[/SILENT] [/FILESONLY] source_path destination_path [total_size_in_kb]"),TP_CODE}, {TOK_CRCCHECK,_T("CRCCheck"),1,0,_T("(on|force|off)"),TP_GLOBAL}, {TOK_CREATEDIR,_T("CreateDirectory"),1,0,_T("directory_name"),TP_CODE}, {TOK_CREATEFONT,_T("CreateFont"),2,5,_T("$(user_var: handle output) face_name [height weight /ITALIC /UNDERLINE /STRIKE]"),TP_CODE}, {TOK_CREATESHORTCUT,_T("CreateShortcut"),2,7,_T("[/NoWorkingDir] shortcut_name.lnk shortcut_target [parameters [icon_file [icon index [showmode [hotkey [comment]]]]]]\n showmode=(SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED)\n hotkey=(ALT|CONTROL|EXT|SHIFT)|(F1-F24|A-Z)"),TP_CODE}, {TOK_DBOPTIMIZE,_T("SetDatablockOptimize"),1,0,_T("(off|on)"),TP_ALL}, {TOK_DELETEINISEC,_T("DeleteINISec"),2,0,_T("ini_file section_name"),TP_CODE}, {TOK_DELETEINISTR,_T("DeleteINIStr"),3,0,_T("ini_file section_name entry_name"),TP_CODE}, {TOK_DELETEREGKEY,_T("DeleteRegKey"),2,-1,_T("[/ifempty | /ifnosubkeys | /ifnovalues] root_key subkey\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_DELETEREGVALUE,_T("DeleteRegValue"),3,0,_T("root_key subkey entry_name\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_DELETE,_T("Delete"),1,1,_T("[/REBOOTOK] filespec"),TP_CODE}, {TOK_DETAILPRINT,_T("DetailPrint"),1,0,_T("message"),TP_CODE}, {TOK_DIRTEXT,_T("DirText"),0,4,_T("[directory_page_description] [directory_page_subtext] [browse_button_text] [browse_dlg_text]"),TP_PG}, //{TOK_DIRSHOW,_T("DirShow"),1,0,_T("(show|hide)"),TP_PG}, {TOK_DIRSHOW,_T("DirShow"),0,0,_T("doesn't currently work"),TP_ALL}, {TOK_DIRVAR,_T("DirVar"),1,0,_T("$(user_var: dir in/out))"),TP_PAGEEX}, {TOK_DIRVERIFY,_T("DirVerify"),1,0,_T("auto|leave"),TP_PAGEEX}, {TOK_GETINSTDIRERROR,_T("GetInstDirError"),1,0,_T("$(user_var: error output)"),TP_CODE}, {TOK_ROOTDIRINST,_T("AllowRootDirInstall"),1,0,_T("(true|false)"),TP_GLOBAL}, {TOK_CHECKBITMAP,_T("CheckBitmap"),1,0,_T("local_bitmap.bmp"),TP_GLOBAL}, {TOK_ENABLEWINDOW,_T("EnableWindow"),2,0,_T("hwnd state(1|0)"),TP_CODE}, {TOK_ENUMREGKEY,_T("EnumRegKey"),4,0,_T("$(user_var: output) rootkey subkey index\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_ENUMREGVAL,_T("EnumRegValue"),4,0,_T("$(user_var: output) rootkey subkey index\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_EXCH,_T("Exch"),0,1,_T("[$(user_var)] | [stack_item_index]"),TP_CODE}, {TOK_EXEC,_T("Exec"),1,0,_T("command_line"),TP_CODE}, {TOK_EXECWAIT,_T("ExecWait"),1,1,_T("command_line [$(user_var: return value)]"),TP_CODE}, {TOK_EXECSHELL,_T("ExecShell"),2,11,_T("[flags] verb file [parameters [showmode]]\n verb=(open|print)\n showmode=(SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_HIDE|SW_SHOW)"),TP_CODE}, {TOK_EXECSHELLWAIT,_T("ExecShellWait"),2,11,_T("[flags] verb file [parameters [showmode]]"),TP_CODE}, {TOK_EXPANDENVSTRS,_T("ExpandEnvStrings"),2,0,_T("$(user_var: output) string"),TP_CODE}, {TOK_FINDWINDOW,_T("FindWindow"),2,3,_T("$(user_var: handle output) WindowClass [WindowTitle] [Window_Parent] [Child_After]"),TP_CODE}, {TOK_FINDCLOSE,_T("FindClose"),1,0,_T("$(user_var: handle input)"),TP_CODE}, {TOK_FINDFIRST,_T("FindFirst"),3,0,_T("$(user_var: handle output) $(user_var: filename output) filespec"),TP_CODE}, {TOK_FINDNEXT,_T("FindNext"),2,0,_T("$(user_var: handle input) $(user_var: filename output)"),TP_CODE}, {TOK_FILE,_T("File"),1,-1,_T("[/nonfatal] [/a] ([/r] [/x filespec [...]] filespec [...] |\n /oname=outfile one_file_only)"),TP_CODE}, {TOK_FILEBUFSIZE,_T("FileBufSize"),1,0,_T("buf_size_mb"),TP_ALL}, {TOK_FLUSHINI,_T("FlushINI"),1,0,_T("ini_file"),TP_CODE}, {TOK_RESERVEFILE,_T("ReserveFile"),1,-1,_T("[/nonfatal] [/r] [/x filespec [...]] file [file...] | [/nonfatal] /plugin file.dll"),TP_ALL}, {TOK_FILECLOSE,_T("FileClose"),1,0,_T("$(user_var: handle input)"),TP_CODE}, {TOK_FILEERRORTEXT,_T("FileErrorText"),0,2,_T("[text (can contain $0)] [text without ignore (can contain $0)]"),TP_GLOBAL}, {TOK_FILEOPEN,_T("FileOpen"),3,0,_T("$(user_var: handle output) filename openmode\n openmode=r|w|a"),TP_CODE}, {TOK_FILEREAD,_T("FileRead"),2,1,_T("$(user_var: handle input) $(user_var: text output) [maxlen]"),TP_CODE}, {TOK_FILEWRITE,_T("FileWrite"),2,0,_T("$(user_var: handle input) text"),TP_CODE}, {TOK_FILEREADBYTE,_T("FileReadByte"),2,0,_T("$(user_var: handle input) $(user_var: bytevalue output)"),TP_CODE}, {TOK_FILEWRITEBYTE,_T("FileWriteByte"),2,0,_T("$(user_var: handle input) bytevalue"),TP_CODE}, #ifdef _UNICODE {TOK_FILEREADUTF16LE,_T("FileReadUTF16LE"),2,1,_T("$(user_var: handle input) $(user_var: text output) [maxlen]"),TP_CODE}, {TOK_FILEWRITEUTF16LE,_T("FileWriteUTF16LE"),2,1,_T("[/BOM] $(user_var: handle input) text"),TP_CODE}, {TOK_FILEREADWORD,_T("FileReadWord"),2,0,_T("$(user_var: handle input) $(user_var: wordvalue output)"),TP_CODE}, {TOK_FILEWRITEWORD,_T("FileWriteWord"),2,0,_T("$(user_var: handle input) wordvalue"),TP_CODE}, #endif {TOK_FILESEEK,_T("FileSeek"),2,2,_T("$(user_var: handle input) offset [mode] [$(user_var: new position output)]\n mode=SET|CUR|END"),TP_CODE}, {TOK_FUNCTION,_T("Function"),1,0,_T("function_name"),TP_GLOBAL}, {TOK_FUNCTIONEND,_T("FunctionEnd"),0,0,_T(""),TP_FUNC}, {TOK_GETDLGITEM,_T("GetDlgItem"),3,0,_T("$(user_var: handle output) dialog item_id"),TP_CODE}, {TOK_GETFULLPATHNAME,_T("GetFullPathName"),2,1,_T("[/SHORT] $(user_var: result) path_or_file"),TP_CODE}, {TOK_GETTEMPFILENAME,_T("GetTempFileName"),1,1,_T("$(user_var: name output) [base_dir]"),TP_CODE}, {TOK_GETKNOWNFOLDERPATH,_T("GetKnownFolderPath"),2,0,_T("$(user_var: result) knownfolderid"),TP_CODE}, {TOK_GETWINVER,_T("GetWinVer"),2,0,_T("$(user_var: result) field\n field=MAJOR|MINOR|BUILD|SERVICEPACK"),TP_CODE}, {TOK_READMEMORY,_T("ReadMemory"),3,0,_T("$(user_var: result) address size"),TP_CODE}, {TOK_HIDEWINDOW,_T("HideWindow"),0,0,_T(""),TP_CODE}, {TOK_ICON,_T("Icon"),1,0,_T("local_icon.ico"),TP_GLOBAL}, {TOK_IFABORT,_T("IfAbort"),1,1,_T("label_to_goto_if_abort [label_to_goto_if_no_abort]"),TP_CODE}, {TOK_IFERRORS,_T("IfErrors"),1,1,_T("label_to_goto_if_errors [label_to_goto_if_no_errors]"),TP_CODE}, {TOK_IFFILEEXISTS,_T("IfFileExists"),2,1,_T("filename label_to_goto_if_file_exists [label_to_goto_otherwise]"),TP_CODE}, {TOK_IFREBOOTFLAG,_T("IfRebootFlag"),1,1,_T("jump_if_set [jump_if_not_set]"),TP_CODE}, {TOK_IFSILENT,_T("IfSilent"),1,1,_T("jump_if_silent [jump_if_not_silent]"),TP_CODE}, {TOK_IFRTLLANG,_T("IfRtlLanguage"),1,1,_T("goto_true [goto_false]"),TP_CODE}, {TOK_INSTALLDIRREGKEY,_T("InstallDirRegKey"),3,0,_T("root_key subkey entry_name\n root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD)"),TP_GLOBAL}, {TOK_INSTCOLORS,_T("InstallColors"),1,1,_T("(/windows | (foreground_color background_color))"),TP_GLOBAL}, {TOK_INSTDIR,_T("InstallDir"),1,0,_T("default_install_directory"),TP_GLOBAL}, {TOK_INSTPROGRESSFLAGS,_T("InstProgressFlags"),0,-1,_T("[flag [...]]\n flag={smooth|colored}"),TP_GLOBAL}, {TOK_INSTTYPE,_T("InstType"),1,1,_T("[un.]install_type_name [index_output] | /[UNINST]NOCUSTOM | /CUSTOMSTRING=str | /[UNINST]COMPONENTSONLYONCUSTOM"),TP_GLOBAL}, {TOK_INTOP,_T("IntOp"),3,1,_T("$(user_var: result) val1 OP [val2]\n OP=(+ - * / % | & ^ ~ ! || && << >> >>>)"),TP_CODE}, {TOK_INTPTROP,_T("IntPtrOp"),3,1,_T("$(user_var: result) val1 OP [val2]"),TP_CODE}, {TOK_INTCMP,_T("IntCmp"),3,2,_T("val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]"),TP_CODE}, {TOK_INTCMPU,_T("IntCmpU"),3,2,_T("val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]"),TP_CODE}, {TOK_INT64CMP,_T("Int64Cmp"),3,2,_T("val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]"),TP_CODE}, {TOK_INT64CMPU,_T("Int64CmpU"),3,2,_T("val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]"),TP_CODE}, {TOK_INTPTRCMP,_T("IntPtrCmp"),3,2,_T("val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]"),TP_CODE}, {TOK_INTPTRCMPU,_T("IntPtrCmpU"),3,2,_T("val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]"),TP_CODE}, {TOK_INTFMT,_T("IntFmt"),3,0,_T("$(user_var: output) format_string input"),TP_CODE}, {TOK_INT64FMT,_T("Int64Fmt"),3,0,_T("$(user_var: output) format_string input"),TP_CODE}, {TOK_ISWINDOW,_T("IsWindow"),2,1,_T("hwnd jump_if_window [jump_if_not_window]"),TP_CODE}, {TOK_GOTO,_T("Goto"),1,0,_T("label"),TP_CODE}, {TOK_LANGSTRING,_T("LangString"),3,0,_T("[un.]name lang_id|0 string"),TP_GLOBAL}, {TOK_LANGSTRINGUP,_T("LangStringUP"),0,0,_T("obsolete, use LangString."),TP_ALL}, {TOK_LICENSEDATA,_T("LicenseData"),1,0,_T("local_file_that_has_license_text | license_lang_string"),TP_PG}, {TOK_LICENSEFORCESELECTION,_T("LicenseForceSelection"),1,2,_T("(checkbox [accept_text] | radiobuttons [accept_text] [decline_text] | off)"),TP_PG}, {TOK_LICENSELANGSTRING,_T("LicenseLangString"),3,0,_T("name lang_id|0 license_path"),TP_GLOBAL}, {TOK_LICENSETEXT,_T("LicenseText"),1,1,_T("license_page_description [license_button_text]"),TP_PG}, {TOK_LICENSEBKCOLOR,_T("LicenseBkColor"),1,0,_T("background_color"),TP_GLOBAL}, {TOK_LOADNLF,_T("LoadLanguageFile"),1,0,_T("language.nlf"),TP_GLOBAL}, {TOK_LOGSET,_T("LogSet"),1,0,_T("on|off"),TP_CODE}, {TOK_LOGTEXT,_T("LogText"),1,0,_T("text"),TP_CODE}, {TOK_MESSAGEBOX,_T("MessageBox"),2,6,_T("mode messagebox_text [/SD return] [return_check label_to_goto_if_equal [return_check2 label2]]\n mode=modeflag[|modeflag[|modeflag[...]]]\n ") _T("modeflag=(MB_ABORTRETRYIGNORE|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_YESNO|MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_USERICON|MB_TOPMOST|MB_SETFOREGROUND|MB_RIGHT"),TP_CODE}, {TOK_NOP,_T("Nop"),0,0,_T(""),TP_CODE}, {TOK_NAME,_T("Name"),1,1,_T("installer_name [installer_name_doubled_ampersands]"),TP_GLOBAL}, {TOK_OUTFILE,_T("OutFile"),1,0,_T("install_output.exe"),TP_GLOBAL}, #ifdef NSIS_SUPPORT_CODECALLBACKS {TOK_PAGE,_T("Page"),1,4,_T("((custom [creator_function] [leave_function] [caption]) | ((license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function])) [/ENABLECANCEL]"),TP_GLOBAL}, #else {TOK_PAGE,_T("Page"),1,1,_T("license|components|directory|instfiles|uninstConfirm [/ENABLECANCEL]"),TP_GLOBAL}, #endif {TOK_PAGECALLBACKS,_T("PageCallbacks"),0,3,_T("([creator_function] [leave_function]) | ([pre_function] [show_function] [leave_function])"),TP_PAGEEX}, {TOK_PAGEEX,_T("PageEx"),1,0,_T("[un.](custom|uninstConfirm|license|components|directory|instfiles)"),TP_GLOBAL}, {TOK_PAGEEXEND,_T("PageExEnd"),0,0,_T(""),TP_PAGEEX}, {TOK_POP,_T("Pop"),1,0,_T("$(user_var: output)"),TP_CODE}, {TOK_PUSH,_T("Push"),1,0,_T("string"),TP_CODE}, {TOK_QUIT,_T("Quit"),0,0,_T(""),TP_CODE}, {TOK_READINISTR,_T("ReadINIStr"),4,0,_T("$(user_var: output) ini_file section entry_name"),TP_CODE}, {TOK_READREGDWORD,_T("ReadRegDWORD"),4,0,_T("$(user_var: output) rootkey subkey entry\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_READREGSTR,_T("ReadRegStr"),4,0,_T("$(user_var: output) rootkey subkey entry\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_READENVSTR,_T("ReadEnvStr"),2,0,_T("$(user_var: output) name"),TP_CODE}, {TOK_REBOOT,_T("Reboot"),0,0,_T(""),TP_CODE}, {TOK_REGDLL,_T("RegDLL"),1,1,_T("dll_path_on_target.dll [entrypoint_symbol]"),TP_CODE}, {TOK_RENAME,_T("Rename"),2,1,_T("[/REBOOTOK] source_file destination_file"),TP_CODE}, {TOK_RET,_T("Return"),0,0,_T(""),TP_CODE}, {TOK_RMDIR,_T("RMDir"),1,2,_T("[/r] [/REBOOTOK] directory_name"),TP_CODE}, {TOK_SECTION,_T("Section"),0,3,_T("[/o] [-][un.][section_name] [section index output]"),TP_GLOBAL}, {TOK_SECTIONEND,_T("SectionEnd"),0,0,_T(""),TP_SEC}, {TOK_SECTIONINSTTYPE,_T("SectionInstType"),1,-1,_T("InstTypeIdx [InstTypeIdx [...]]"),TP_SEC}, {TOK_SECTIONIN,_T("SectionIn"),1,-1,_T("InstTypeIdx [InstTypeIdx [...]]"),TP_SEC}, {TOK_SUBSECTION,_T("SubSection"),1,2,_T("deprecated - use SectionGroup"),TP_GLOBAL}, {TOK_SECTIONGROUP,_T("SectionGroup"),1,2,_T("[/e] [un.]section_group_name [section index output]"),TP_GLOBAL}, {TOK_SUBSECTIONEND,_T("SubSectionEnd"),0,0,_T("deprecated - use SectionGroupEnd"),TP_GLOBAL}, {TOK_SECTIONGROUPEND,_T("SectionGroupEnd"),0,0,_T(""),TP_GLOBAL}, {TOK_SEARCHPATH,_T("SearchPath"),2,0,_T("$(user_var: result) filename"),TP_CODE}, {TOK_SECTIONSETFLAGS,_T("SectionSetFlags"),2,0,_T("section_index flags"),TP_CODE}, {TOK_SECTIONGETFLAGS,_T("SectionGetFlags"),2,0,_T("section_index $(user_var: output flags)"),TP_CODE}, {TOK_SECTIONSETINSTTYPES,_T("SectionSetInstTypes"),2,0,_T("section_index inst_types"),TP_CODE}, {TOK_SECTIONGETINSTTYPES,_T("SectionGetInstTypes"),2,0,_T("section_index $(user_var: output inst_types)"),TP_CODE}, {TOK_SECTIONGETTEXT,_T("SectionGetText"),2,0,_T("section_index $(user_var: output text)"),TP_CODE}, {TOK_SECTIONSETTEXT,_T("SectionSetText"),2,0,_T("section_index text_string"),TP_CODE}, {TOK_SECTIONGETSIZE,_T("SectionGetSize"),2,0,_T("section_index $(user_var: output size)"),TP_CODE}, {TOK_SECTIONSETSIZE,_T("SectionSetSize"),2,0,_T("section_index new_size"),TP_CODE}, {TOK_GETCURINSTTYPE,_T("GetCurInstType"),1,0,_T("$(user_var: output inst_type_idx)"),TP_CODE}, {TOK_SETCURINSTTYPE,_T("SetCurInstType"),1,0,_T("inst_type_idx"),TP_CODE}, {TOK_INSTTYPESETTEXT,_T("InstTypeSetText"),2,0,_T("insttype_index text"),TP_CODE}, {TOK_INSTTYPEGETTEXT,_T("InstTypeGetText"),2,0,_T("insttype_index $(user_var: output text)"),TP_CODE}, {TOK_SENDMESSAGE,_T("SendMessage"),4,2,_T("hwnd message [wparam|STR:wParam] [lparam|STR:lParam] [$(user_var: return value)] [/TIMEOUT=X]"),TP_CODE}, {TOK_SETAUTOCLOSE,_T("SetAutoClose"),1,0,_T("(false|true)"),TP_CODE}, {TOK_SETCTLCOLORS,_T("SetCtlColors"),2,2,_T("hwnd [/BRANDING] [text_color] [transparent|bg_color]"),TP_CODE}, {TOK_SETBRANDINGIMAGE,_T("SetBrandingImage"),1,2,_T("[/IMGID=image_item_id_in_dialog] [/RESIZETOFIT] bitmap.bmp"),TP_CODE}, {TOK_LOADANDSETIMAGE,_T("LoadAndSetImage"),4,6,_T("[/EXERESOURCE] [/STRINGID] [/RESIZETOFIT[WIDTH|HEIGHT]] ctrl imagetype lrflags imageid [$(user_var: imagehandle)]"),TP_CODE}, {TOK_SETCOMPRESS,_T("SetCompress"),1,0,_T("(off|auto|force)"),TP_ALL}, {TOK_SETCOMPRESSOR,_T("SetCompressor"),1,2,_T("[/FINAL] [/SOLID] (zlib|bzip2|lzma)"),TP_GLOBAL}, {TOK_SETCOMPRESSORDICTSIZE,_T("SetCompressorDictSize"),1,0,_T("dict_size_mb"),TP_ALL}, {TOK_SETCOMPRESSIONLEVEL,_T("SetCompressionLevel"),1,0,_T("level_0-9"),TP_ALL}, {TOK_SETDATESAVE,_T("SetDateSave"),1,0,_T("(off|on)"),TP_ALL}, {TOK_SETDETAILSVIEW,_T("SetDetailsView"),1,0,_T("(hide|show)"),TP_CODE}, {TOK_SETDETAILSPRINT,_T("SetDetailsPrint"),1,0,_T("(none|listonly|textonly|both|lastused)"),TP_CODE}, {TOK_SETERRORS,_T("SetErrors"),0,0,_T(""),TP_CODE}, {TOK_SETERRORLEVEL,_T("SetErrorLevel"),1,0,_T("error_level"),TP_CODE}, {TOK_GETERRORLEVEL,_T("GetErrorLevel"),1,0,_T("$(user_var: output)"),TP_CODE}, {TOK_SETFILEATTRIBUTES,_T("SetFileAttributes"),2,0,_T("file attribute[|attribute[...]]\n attribute=(NORMAL|ARCHIVE|HIDDEN|OFFLINE|READONLY|SYSTEM|TEMPORARY|0)"),TP_CODE}, {TOK_SETFONT,_T("SetFont"),2,1,_T("[/LANG=lang_id] font_face_name font_size"),TP_GLOBAL}, {TOK_SETOUTPATH,_T("SetOutPath"),1,0,_T("output_path"),TP_CODE}, {TOK_SETOVERWRITE,_T("SetOverwrite"),1,0,_T("on|off|try|ifnewer|ifdiff"),TP_ALL}, {TOK_SETPLUGINUNLOAD,_T("SetPluginUnload"),1,0,_T("deprecated - plug-ins should handle this on their own"),TP_ALL}, {TOK_SETREBOOTFLAG,_T("SetRebootFlag"),1,0,_T("true|false"),TP_CODE}, {TOK_GETREGVIEW,_T("GetRegView"),1,0,_T("$(user_var: output)"),TP_CODE}, {TOK_SETREGVIEW,_T("SetRegView"),1,0,_T("32|64|default|lastused"),TP_CODE}, {TOK_IFALTREGVIEW,_T("IfAltRegView"),1,1,_T("goto_true [goto_false]"),TP_CODE}, {TOK_GETSHELLVARCONTEXT,_T("GetShellVarContext"),1,0,_T("$(user_var: output)"),TP_CODE}, {TOK_SETSHELLVARCONTEXT,_T("SetShellVarContext"),1,0,_T("all|current|lastused"),TP_CODE}, {TOK_IFSHELLVARCONTEXTALL,_T("IfShellVarContextAll"),1,1,_T("goto_true [goto_false]"),TP_CODE}, {TOK_SETSILENT,_T("SetSilent"),1,0,_T("silent|normal"),TP_CODE}, {TOK_SHOWDETAILS,_T("ShowInstDetails"),1,0,_T("(hide|show|nevershow)"),TP_GLOBAL}, {TOK_SHOWDETAILSUNINST,_T("ShowUninstDetails"),1,0,_T("(hide|show|nevershow)"),TP_GLOBAL}, {TOK_SHOWWINDOW,_T("ShowWindow"),2,0,_T("hwnd show_state"),TP_CODE}, {TOK_SILENTINST,_T("SilentInstall"),1,0,_T("(normal|silent|silentlog)"),TP_GLOBAL}, {TOK_SILENTUNINST,_T("SilentUnInstall"),1,0,_T("(normal|silent)"),TP_GLOBAL}, {TOK_SLEEP,_T("Sleep"),1,0,_T("sleep_time_in_ms"),TP_CODE}, {TOK_STRCMP,_T("StrCmp"),3,1,_T("str1 str2 label_to_goto_if_equal [label_to_goto_if_not]"),TP_CODE}, {TOK_STRCMPS,_T("StrCmpS"),3,1,_T("str1 str2 label_to_goto_if_equal [label_to_goto_if_not]"),TP_CODE}, {TOK_STRCPY,_T("StrCpy"),2,2,_T("$(user_var: output) str [maxlen] [startoffset]"),TP_CODE}, {TOK_UNSAFESTRCPY,_T("UnsafeStrCpy"),2,2,_T("$(var: output) str [maxlen] [startoffset]"),TP_CODE}, {TOK_STRLEN,_T("StrLen"),2,0,_T("$(user_var: length output) str"),TP_CODE}, {TOK_SUBCAPTION,_T("SubCaption"),2,0,_T("page_number(0-4) new_subcaption"),TP_GLOBAL}, #ifdef _UNICODE {TOK_TARGET,_T("Target"),1,0,_T("cpu-charset"),TP_GLOBAL}, {TOK_TARGETCPU,_T("CPU"),1,0,_T("x86|amd64"),TP_GLOBAL}, {TOK_TARGETUNICODE,_T("Unicode"),1,0,_T("true|false"),TP_GLOBAL}, #endif {TOK_UNINSTALLEXENAME,_T("UninstallExeName"),0,0,_T("no longer supported, use WriteUninstaller from section."),TP_ALL}, {TOK_UNINSTCAPTION,_T("UninstallCaption"),1,0,_T("uninstaller_caption"),TP_GLOBAL}, {TOK_UNINSTICON,_T("UninstallIcon"),1,0,_T("icon_on_local_system.ico"),TP_GLOBAL}, #ifdef NSIS_SUPPORT_CODECALLBACKS {TOK_UNINSTPAGE,_T("UninstPage"),1,4,_T("((custom [creator_function] [leave_function] [caption]) | ((license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function])) [/ENABLECANCEL]"),TP_GLOBAL}, #else {TOK_UNINSTPAGE,_T("UninstPage"),1,1,_T("license|components|directory|instfiles|uninstConfirm [/ENABLECANCEL]"),TP_GLOBAL}, #endif {TOK_UNINSTTEXT,_T("UninstallText"),1,1,_T("Text_to_go_on_uninstall_page [subtext]"),TP_PG}, {TOK_UNINSTSUBCAPTION,_T("UninstallSubCaption"),2,0,_T("page_number(0-2) new_subcaption"),TP_GLOBAL}, {TOK_UNREGDLL,_T("UnRegDLL"),1,0,_T("dll_path_on_target.dll"),TP_CODE}, {TOK_WINDOWICON,_T("WindowIcon"),1,0,_T("on|off"),TP_GLOBAL}, {TOK_WRITEINISTR,_T("WriteINIStr"),4,0,_T("ini_file section_name entry_name new_value"),TP_CODE}, {TOK_WRITEREGBIN,_T("WriteRegBin"),4,0,_T("rootkey subkey entry_name hex_string_like_12848412AB\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEREGMULTISZ,_T("WriteRegMultiStr"),5,0,_T("/REGEDIT5 rootkey subkey entry_name hex_string_like_660000000000\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEREGDWORD,_T("WriteRegDWORD"),4,0,_T("rootkey subkey entry_name new_value_dword\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEREGSTR,_T("WriteRegStr"),4,0,_T("rootkey subkey entry_name new_value_string\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEREGEXPANDSTR,_T("WriteRegExpandStr"),4,0,_T("rootkey subkey entry_name new_value_string\n root_key=(HKCR[32|64]|HKLM[32|64]|HKCU[32|64]|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEREGNONE,_T("WriteRegNone"),3,1,_T("rootkey subkey entry_name [hex_data]"),TP_CODE}, {TOK_WRITEUNINSTALLER,_T("WriteUninstaller"),1,0,_T("uninstall_exe_name"),TP_CODE}, {TOK_PEADDRESOURCE,_T("PEAddResource"),3,2,_T("[/OVERWRITE|/REPLACE] file restype resname [reslang]"),TP_GLOBAL}, {TOK_PEREMOVERESOURCE,_T("PERemoveResource"),3,1,_T("[/NOERRORS] restype resname reslang|ALL"),TP_GLOBAL}, {TOK_PEDLLCHARACTERISTICS,_T("PEDllCharacteristics"),2,0,_T("addbits removebits"),TP_GLOBAL}, {TOK_PESUBSYSVER,_T("PESubsysVer"),1,0,_T("major.minor"),TP_GLOBAL}, {TOK_XPSTYLE,_T("XPStyle"),1,0,_T("(on|off)"),TP_GLOBAL}, {TOK_REQEXECLEVEL,_T("RequestExecutionLevel"),1,0,_T("none|user|highest|admin"),TP_GLOBAL}, {TOK_MANIFEST_APPENDCUSTOMSTRING,_T("ManifestAppendCustomString"),2,0,_T("path string"),TP_GLOBAL}, {TOK_MANIFEST_DPIAWARE,_T("ManifestDPIAware"),1,0,_T("notset|true|false"),TP_GLOBAL}, {TOK_MANIFEST_DPIAWARENESS,_T("ManifestDPIAwareness"),1,0,_T("comma_separated_string"),TP_GLOBAL}, {TOK_MANIFEST_LPAWARE,_T("ManifestLongPathAware"),1,0,_T("notset|true|false"),TP_GLOBAL}, {TOK_MANIFEST_SUPPORTEDOS,_T("ManifestSupportedOS"),1,-1,_T("none|all|WinVista|Win7|Win8|Win8.1|Win10|{GUID} [...]"),TP_GLOBAL}, {TOK_MANIFEST_MAXVERSIONTESTED,_T("ManifestMaxVersionTested"),1,0,_T("maj.min.bld.rev"),TP_GLOBAL}, {TOK_MANIFEST_DISABLEWINDOWFILTERING,_T("ManifestDisableWindowFiltering"),1,0,_T("notset|true"),TP_GLOBAL}, {TOK_MANIFEST_GDISCALING,_T("ManifestGdiScaling"),1,0,_T("notset|true"),TP_GLOBAL}, {TOK_P_PACKEXEHEADER,_T("!packhdr"),2,0,_T("temp_file_name command_line_to_compress_that_temp_file"),TP_ALL}, {TOK_P_FINALIZE,_T("!finalize"),1,2,_T("command_with_%1 []"),TP_ALL}, {TOK_P_UNINSTFINALIZE,_T("!uninstfinalize"),1,2,_T("command_with_%1 []"),TP_ALL}, {TOK_P_SYSTEMEXEC,_T("!system"),1,2,_T("command [ | ]\n OP=(< > <> =)"),TP_ALL}, {TOK_P_EXECUTE,_T("!execute"),1,2,_T("command [ | ]\n OP=(< > <> =)"),TP_ALL}, {TOK_P_MAKENSIS,_T("!makensis"),1,2,_T("parameters [ | ]"),TP_ALL}, {TOK_P_ADDINCLUDEDIR,_T("!addincludedir"),1,0,_T("dir"),TP_ALL}, {TOK_P_INCLUDE,_T("!include"),1,2,_T("[/NONFATAL] [/CHARSET=<") TSTR_INPUTCHARSET _T(">] filename.nsh"),TP_ALL}, {TOK_P_CD,_T("!cd"),1,0,_T("absolute_or_relative_new_directory"),TP_ALL}, {TOK_P_IF,_T("!if"),1,3,_T("[!] (value [(==,!=,S==,S!=,=,<>,<=,<,>,>=,&,&&,||) value2] | /FILEEXISTS path)"),TP_ALL}, {TOK_P_IFDEF,_T("!ifdef"),1,-1,_T("symbol [| symbol2 [& symbol3 [...]]]"),TP_ALL}, {TOK_P_IFNDEF,_T("!ifndef"),1,-1,_T("symbol [| symbol2 [& symbol3 [...]]]"),TP_ALL}, {TOK_P_ENDIF,_T("!endif"),0,0,_T(""),TP_ALL}, {TOK_P_DEFINE,_T("!define"),1,5,_T("[/ifndef | /redef] ([/date|/utcdate] symbol [value]) | (/file symbol filename) | (/intfmt gflag fmtstr value) | (/math symbol val1 OP val2)\n OP=(+ - * / % << >> >>> & | ^ ~ ! && ||)"),TP_ALL}, {TOK_P_UNDEF,_T("!undef"),1,-1,_T("[/noerrors] symbol [...]"),TP_ALL}, {TOK_P_ELSE,_T("!else"),0,-1,_T("[if[macro][n][def] ...]"),TP_ALL}, {TOK_P_ECHO,_T("!echo"),1,0,_T("message"),TP_ALL}, {TOK_P_WARNING,_T("!warning"),0,1,_T("[warning_message]"),TP_ALL}, {TOK_P_ERROR,_T("!error"),0,1,_T("[error_message]"),TP_ALL}, {TOK_P_ASSERT,_T("!assert"),2,2,_T("value [op value2] message"),TP_ALL}, {TOK_P_VERBOSE,_T("!verbose"),1,-1,_T("verbose_level | push | pop [...]"),TP_ALL}, {TOK_P_PRAGMA,_T("!pragma"),1,-1,_T("warning | warning "),TP_ALL}, {TOK_P_MACRO,_T("!macro"),1,-1,_T("macroname [parms ...]"),TP_ALL}, {TOK_P_MACROEND,_T("!macroend"),0,0,_T(""),TP_ALL}, {TOK_P_MACROUNDEF,_T("!macroundef"),1,0,_T("macroname"),TP_ALL}, {TOK_P_INSERTMACRO,_T("!insertmacro"),1,-1,_T("macroname [parms ...]"),TP_ALL}, {TOK_P_IFMACRODEF,_T("!ifmacrodef"),1,-1,_T("macro [| macro2 [& macro3 [...]]]"),TP_ALL}, {TOK_P_IFMACRONDEF,_T("!ifmacrondef"),1,-1,_T("macro [| macro2 [& macro3 [...]]]"),TP_ALL}, {TOK_P_TEMPFILE,_T("!tempfile"),1,0,_T("symbol"),TP_ALL}, {TOK_P_DELFILE,_T("!delfile"),1,1,_T("[/nonfatal] file"),TP_ALL}, {TOK_P_APPENDFILE,_T("!appendfile"),2,2,_T("[/CHARSET=<") TSTR_OUTPUTCHARSET _T(">] [/RAWNL] file appended_line"),TP_ALL}, {TOK_P_APPENDMEMFILE,_T("!appendmemfile"),1,1,_T("memfile [append]"),TP_ALL}, {TOK_P_GETDLLVERSION,_T("!getdllversion"),2,3,_T("[/noerrors] [/packed] [/productversion] localfilename define_basename"),TP_ALL}, {TOK_P_GETTLBVERSION,_T("!gettlbversion"),2,2,_T("[/noerrors] [/packed] localfilename define_basename"),TP_ALL}, {TOK_P_SEARCHPARSESTRING,_T("!searchparse"),3,-1,_T("[/ignorecase] [/noerrors] [/file] source_string_or_file substring OUTPUTSYM1 [substring [OUTPUTSYM2 [substring ...]]]"),TP_ALL}, {TOK_P_SEARCHREPLACESTRING,_T("!searchreplace"),4,1,_T("[/ignorecase] output_name source_string substring replacestring"),TP_ALL}, {TOK_MISCBUTTONTEXT,_T("MiscButtonText"),0,4,_T("[back button text] [next button text] [cancel button text] [close button text]"),TP_GLOBAL}, {TOK_DETAILSBUTTONTEXT,_T("DetailsButtonText"),0,1,_T("[details button text]"),TP_PG}, {TOK_UNINSTBUTTONTEXT,_T("UninstallButtonText"),0,1,_T("[uninstall button text]"),TP_GLOBAL}, {TOK_INSTBUTTONTEXT,_T("InstallButtonText"),0,1,_T("[install button text]"),TP_GLOBAL}, {TOK_SPACETEXTS,_T("SpaceTexts"),0,2,_T("none | ([space required text] [space available text])"),TP_GLOBAL}, {TOK_COMPLETEDTEXT,_T("CompletedText"),0,1,_T("[completed text]"),TP_PG}, {TOK_GETFUNCTIONADDR,_T("GetFunctionAddress"),2,0,_T("output function"),TP_CODE}, {TOK_GETLABELADDR,_T("GetLabelAddress"),2,0,_T("output label"),TP_CODE}, {TOK_GETCURRENTADDR,_T("GetCurrentAddress"),1,0,_T("output"),TP_CODE}, {TOK_PLUGINDIR,_T("!addplugindir"),1,1,_T("[/target] new_plugin_directory"),TP_ALL}, {TOK_INITPLUGINSDIR,_T("InitPluginsDir"),0,0,_T(""),TP_CODE}, // Added by ramon 23 May 2003 {TOK_ALLOWSKIPFILES,_T("AllowSkipFiles"),1,0,_T("(off|on)"),TP_ALL}, // Added by ramon 3 jun 2003 {TOK_DEFVAR,_T("Var"),1,1,_T("[/GLOBAL] var_name"),TP_ALL}, // Added by ramon 6 jun 2003 {TOK_VI_ADDKEY,_T("VIAddVersionKey"),2,1,_T("[/LANG=lang_id] keyname value"),TP_GLOBAL}, {TOK_VI_SETPRODUCTVERSION,_T("VIProductVersion"),1,0,_T("version_string_X.X.X.X"),TP_GLOBAL}, {TOK_VI_SETFILEVERSION,_T("VIFileVersion"),1,0,_T("version_string_X.X.X.X"),TP_GLOBAL}, {TOK_LOCKWINDOW,_T("LockWindow"),1,0,_T("(on|off)"),TP_CODE}, }; const TCHAR* CEXEBuild::get_commandtoken_name(int tok) { for (UINT x = 0; x < TOK__LAST; ++x) if (tokenlist[x].id==tok) return tokenlist[x].name; return 0; } bool CEXEBuild::print_cmdhelp(const TCHAR *commandname, bool cmdhelp) { // Print function chosen at run time because of bug #1203, -CMDHELP to stdout. void (CEXEBuild::*printer)(const TCHAR *s, ...) const = cmdhelp ? &CEXEBuild::INFO_MSG : &CEXEBuild::ERROR_MSG; UINT x; for (x = 0; x < TOK__LAST; ++x) { if (!commandname || !_tcsicmp(tokenlist[x].name,commandname)) { (this->*printer)(_T("%") NPRIs _T("%") NPRIs _T(" %") NPRIs _T("\n"),commandname?_T("Usage: "):_T(""),tokenlist[x].name,tokenlist[x].usage_str); if (commandname) break; } } if (x == TOK__LAST && commandname) { ERROR_MSG(_T("Invalid command \"%") NPRIs _T("\"\n"),commandname); return false; } return true; } void CEXEBuild::print_help(const TCHAR *commandname) { print_cmdhelp(commandname); } bool CEXEBuild::is_ppbranch_token(const TCHAR *s) { int np, op, pos, tkid = get_commandtoken(s, &np, &op, &pos); switch(tkid) { case TOK_P_IF: case TOK_P_ELSE: case TOK_P_ENDIF: case TOK_P_IFDEF: case TOK_P_IFNDEF: case TOK_P_IFMACRODEF: case TOK_P_IFMACRONDEF: return true; default: return false; } } bool CEXEBuild::is_pp_token(int tkid) { // NOTE: This assumes that all TOK_P_* in tokens.h are grouped together. return (tkid >= TOK_P_IF && tkid <= TOK_P_SEARCHREPLACESTRING); } bool CEXEBuild::is_unsafe_pp_token(int tkid) { switch(tkid) { case TOK_P_TEMPFILE: case TOK_P_APPENDFILE: case TOK_P_DELFILE: case TOK_P_SYSTEMEXEC: case TOK_P_EXECUTE: case TOK_P_MAKENSIS: case TOK_P_PACKEXEHEADER: case TOK_P_FINALIZE: return true; } return false; } int CEXEBuild::get_commandtoken(const TCHAR *s, int *np, int *op, int *pos) { for (UINT x = 0; x < TOK__LAST; ++x) if (!_tcsicmp(tokenlist[x].name,s)) { *np=tokenlist[x].num_parms; *op=tokenlist[x].opt_parms; *pos=x; return tokenlist[x].id; } return -1; } int CEXEBuild::GetCurrentTokenPlace() { if (build_cursection) return build_cursection_isfunc ? TP_FUNC : TP_SEC; if (cur_page) return TP_PAGEEX; return TP_GLOBAL; } int CEXEBuild::IsTokenPlacedRight(int pos, const TCHAR *tok) { if (preprocessonly) return PS_OK; if ((unsigned int) pos > (sizeof(tokenlist) / sizeof(tokenType))) return PS_OK; int tp = tokenlist[pos].placement; int cp = GetCurrentTokenPlace(); if (tp & cp) { return PS_OK; } else { TCHAR err[1024]; if (cp == TP_SEC) { _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid in Section\n")); } else if (cp == TP_FUNC) { _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid in Function\n")); } else if (cp == TP_PAGEEX) { _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid in PageEx\n")); } else { _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid outside ")); if (tp & TP_SEC) _tcscat(err, _T("Section")); if (tp & TP_FUNC) { if (tp & TP_SEC) { if (tp & TP_PAGEEX) { _tcscat(err, _T(", ")); } else { _tcscat(err, _T(" or ")); } } _tcscat(err, _T("Function")); } if (tp & TP_PAGEEX) { if (tp & TP_CODE) { _tcscat(err, _T(" or ")); } _tcscat(err, _T("PageEx")); } _tcscat(err, _T("\n")); } ERROR_MSG(err, tok); return PS_ERROR; } } nsis-3.11/Source/tokens.h000077500000000000000000000145371477201124000153410ustar00rootroot00000000000000/* * tokens.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Added commands for Unicode support by Jim Park -- 08/21/2007 */ #ifndef _TOKENS_H_ #define _TOKENS_H_ // the order of these two lists no longer needs to match. -J enum { // header setting tokens TOK_NAME, TOK_CAPTION, TOK_UNINSTCAPTION, TOK_ICON, TOK_UNINSTICON, TOK_CHECKBITMAP, TOK_WINDOWICON, TOK_DIRTEXT, TOK_COMPTEXT, TOK_LICENSEBKCOLOR, TOK_LICENSEDATA, TOK_LICENSEFORCESELECTION, TOK_LICENSELANGSTRING, TOK_LICENSETEXT, TOK_UNINSTTEXT, TOK_SILENTINST, TOK_SILENTUNINST, TOK_INSTTYPE, TOK_OUTFILE, TOK_INSTDIR, TOK_INSTALLDIRREGKEY, TOK_UNINSTALLEXENAME, TOK_CRCCHECK, TOK_AUTOCLOSE, TOK_SHOWDETAILS, TOK_SHOWDETAILSUNINST, TOK_DIRSHOW, TOK_ROOTDIRINST, TOK_BGFONT, TOK_BGGRADIENT, TOK_INSTCOLORS, TOK_SUBCAPTION, TOK_UNINSTSUBCAPTION, TOK_BRANDINGTEXT, TOK_FILEERRORTEXT, TOK_INSTPROGRESSFLAGS, TOK_PEADDRESOURCE, TOK_PEREMOVERESOURCE, TOK_PEDLLCHARACTERISTICS, TOK_PESUBSYSVER, TOK_XPSTYLE, TOK_REQEXECLEVEL, TOK_MANIFEST_APPENDCUSTOMSTRING, TOK_MANIFEST_DPIAWARE, TOK_MANIFEST_DPIAWARENESS, TOK_MANIFEST_LPAWARE, TOK_MANIFEST_SUPPORTEDOS, TOK_MANIFEST_MAXVERSIONTESTED, TOK_MANIFEST_DISABLEWINDOWFILTERING, TOK_MANIFEST_GDISCALING, TOK_CHANGEUI, TOK_ADDBRANDINGIMAGE, TOK_SETFONT, TOK_LOADNLF, TOK_RESERVEFILE, TOK_ALLOWSKIPFILES, TOK_DEFVAR, TOK_VI_ADDKEY, TOK_VI_SETPRODUCTVERSION, TOK_VI_SETFILEVERSION, #ifdef _UNICODE TOK_TARGET, TOK_TARGETCPU, TOK_TARGETUNICODE, #endif TOK_MISCBUTTONTEXT, TOK_DETAILSBUTTONTEXT, TOK_UNINSTBUTTONTEXT, TOK_INSTBUTTONTEXT, TOK_SPACETEXTS, TOK_COMPLETEDTEXT, TOK_LANGSTRING, TOK_LANGSTRINGUP, // compression stuff TOK_SETCOMPRESS, TOK_DBOPTIMIZE, TOK_SETCOMPRESSOR, TOK_SETCOMPRESSORDICTSIZE, TOK_SETCOMPRESSIONLEVEL, TOK_FILEBUFSIZE, // system "preprocessor"ish tokens TOK_P_IF, TOK_P_IFDEF, TOK_P_IFNDEF, TOK_P_ELSE, TOK_P_ENDIF, TOK_P_DEFINE, TOK_P_UNDEF, TOK_P_PACKEXEHEADER, TOK_P_FINALIZE, TOK_P_UNINSTFINALIZE, TOK_P_SYSTEMEXEC, TOK_P_EXECUTE, TOK_P_MAKENSIS, TOK_P_ADDINCLUDEDIR, TOK_P_INCLUDE, TOK_P_CD, TOK_P_ECHO, TOK_P_WARNING, TOK_P_ERROR, TOK_P_ASSERT, TOK_P_VERBOSE, TOK_P_PRAGMA, TOK_P_MACRO, TOK_P_MACROEND, TOK_P_MACROUNDEF, TOK_P_INSERTMACRO, TOK_P_IFMACRODEF, TOK_P_IFMACRONDEF, TOK_P_TEMPFILE, TOK_P_DELFILE, TOK_P_APPENDFILE, TOK_P_APPENDMEMFILE, TOK_P_GETDLLVERSION, TOK_P_GETTLBVERSION, TOK_P_SEARCHPARSESTRING, TOK_P_SEARCHREPLACESTRING, // section/function stuff TOK_SECTION, TOK_SECTIONEND, TOK_SECTIONINSTTYPE, TOK_SECTIONIN, TOK_SECTIONGROUP, TOK_SECTIONGROUPEND, TOK_SUBSECTION, TOK_SUBSECTIONEND, TOK_FUNCTION, TOK_FUNCTIONEND, TOK_ADDSIZE, // page ordering TOK_PAGE, TOK_UNINSTPAGE, // PageEx stuff TOK_PAGEEX, TOK_PAGEEXEND, TOK_DIRVAR, TOK_DIRVERIFY, TOK_PAGECALLBACKS, TOK_GETINSTDIRERROR, // flag setters TOK_SETDATESAVE, TOK_SETOVERWRITE, TOK_SETPLUGINUNLOAD, // instructions TOK_NOP, TOK_GOTO, TOK_RET, TOK_CALL, TOK_SETOUTPATH, TOK_CREATEDIR, TOK_EXEC, TOK_EXECWAIT, TOK_EXECSHELL, TOK_EXECSHELLWAIT, TOK_CALLINSTDLL, TOK_REGDLL, TOK_UNREGDLL, TOK_RENAME, TOK_MESSAGEBOX, TOK_DELETEREGVALUE, TOK_DELETEREGKEY, TOK_WRITEREGSTR, TOK_WRITEREGEXPANDSTR, TOK_WRITEREGBIN, TOK_WRITEREGMULTISZ, TOK_WRITEREGDWORD, TOK_WRITEREGNONE, TOK_DELETEINISEC, TOK_DELETEINISTR, TOK_FLUSHINI, TOK_WRITEINISTR, TOK_CREATESHORTCUT, TOK_FINDWINDOW, TOK_DELETE, TOK_RMDIR, TOK_FILE, TOK_COPYFILES, TOK_SETFILEATTRIBUTES, TOK_SLEEP, TOK_BRINGTOFRONT, TOK_HIDEWINDOW, TOK_IFFILEEXISTS, TOK_ABORT, TOK_QUIT, TOK_SETDETAILSVIEW, TOK_SETDETAILSPRINT, TOK_SETAUTOCLOSE, TOK_IFERRORS, TOK_CLEARERRORS, TOK_SETERRORS, TOK_IFABORT, TOK_STRCPY, TOK_UNSAFESTRCPY, TOK_STRCMP, TOK_STRCMPS, TOK_GETTEMPFILENAME, TOK_GETFUNCTIONADDR, TOK_GETLABELADDR, TOK_GETCURRENTADDR, TOK_READINISTR, TOK_READREGSTR, TOK_READREGDWORD, TOK_READENVSTR, TOK_EXPANDENVSTRS, TOK_DETAILPRINT, TOK_SEARCHPATH, TOK_GETDLLVERSION, TOK_GETDLLVERSIONLOCAL, TOK_GETFILETIME, TOK_GETFILETIMELOCAL, TOK_STRLEN, TOK_INTOP, TOK_INTPTROP, TOK_INTCMP, TOK_INTCMPU, TOK_INT64CMP, TOK_INT64CMPU, TOK_INTPTRCMP, TOK_INTPTRCMPU, TOK_INTFMT, TOK_INT64FMT, TOK_ENUMREGKEY, TOK_ENUMREGVAL, TOK_PUSH, TOK_POP, TOK_EXCH, TOK_SENDMESSAGE, TOK_ISWINDOW, TOK_GETDLGITEM, TOK_SETCTLCOLORS, TOK_FINDFIRST, TOK_FINDNEXT, TOK_FINDCLOSE, TOK_FILEOPEN, TOK_FILECLOSE, TOK_FILEREAD, TOK_FILEWRITE, TOK_FILEREADBYTE, TOK_FILEWRITEBYTE, #ifdef _UNICODE TOK_FILEREADUTF16LE, TOK_FILEWRITEUTF16LE, TOK_FILEREADWORD, TOK_FILEWRITEWORD, #endif TOK_FILESEEK, TOK_GETFULLPATHNAME, TOK_GETKNOWNFOLDERPATH, TOK_GETWINVER, TOK_READMEMORY, TOK_REBOOT, TOK_IFREBOOTFLAG, TOK_SETREBOOTFLAG, TOK_WRITEUNINSTALLER, TOK_LOGSET, TOK_LOGTEXT, TOK_SETBRANDINGIMAGE, TOK_LOADANDSETIMAGE, TOK_SECTIONSETTEXT, TOK_SECTIONGETTEXT, TOK_SECTIONSETFLAGS, TOK_SECTIONGETFLAGS, TOK_SECTIONSETINSTTYPES, TOK_SECTIONGETINSTTYPES, TOK_SECTIONSETSIZE, TOK_SECTIONGETSIZE, TOK_INSTTYPESETTEXT, TOK_INSTTYPEGETTEXT, TOK_GETCURINSTTYPE, TOK_SETCURINSTTYPE, TOK_GETREGVIEW, TOK_SETREGVIEW, TOK_IFALTREGVIEW, TOK_GETSHELLVARCONTEXT, TOK_SETSHELLVARCONTEXT, TOK_IFSHELLVARCONTEXTALL, TOK_PLUGINDIR, TOK_INITPLUGINSDIR, TOK_CREATEFONT, TOK_SHOWWINDOW, TOK_ENABLEWINDOW, TOK_SETSILENT, TOK_IFSILENT, TOK_SETERRORLEVEL, TOK_GETERRORLEVEL, TOK_IFRTLLANG, TOK_LOCKWINDOW, TOK__LAST, TOK__PLUGINCOMMAND }; #endif//_TOKENS_H_ nsis-3.11/Source/tstring.cpp000077500000000000000000000027241477201124000160560ustar00rootroot00000000000000// tstring.cpp // // This file is a part of Unicode NSIS. // // Copyright (C) 2007-2025 Jim Park // // Licensed under the zlib/libpng license (the "License"); // you may not use this file except in compliance with the License. // // This software is provided 'as-is', without any expressed or implied // warranty. // // Provides TSTRING support. #ifdef _UNICODE #include "tstring.h" #include "util.h" #include #include void CtoTString::Init(const char* str, UINT cp) { #if defined(_UNICODE) && !defined(_WIN32) if (CP_ACP == cp) { assert(NSISRT_free_is_STDC_free()); m_wStr = NSISRT_mbtowc(str); // Should be faster than iconv return ; } #endif int len = MultiByteToWideChar(cp, 0, str, -1, NULL, 0); m_wStr = (wchar_t*) malloc(len*sizeof(wchar_t)); if (m_wStr) MultiByteToWideChar(cp, 0, str, -1, m_wStr, len); } void CtoTString::Init(const char* str) { Init(str, CP_ACP); } CtoTString::~CtoTString() { free(m_wStr); m_wStr = 0; } void TtoCString::Init(const wchar_t* str) { #if defined(_UNICODE) && !defined(_WIN32) assert(NSISRT_free_is_STDC_free()); m_cStr = NSISRT_wctomb(str); // Should be faster than iconv return ; #endif int len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, 0, 0); m_cStr = (char*) malloc(len); if (m_cStr) WideCharToMultiByte(CP_ACP, 0, str, -1, m_cStr, len, 0, 0); } TtoCString::~TtoCString() { free(m_cStr); m_cStr = 0; } #endif nsis-3.11/Source/tstring.h000077500000000000000000000043671477201124000155300ustar00rootroot00000000000000// tstring.h // // This file is a part of Unicode NSIS. // // Copyright (C) 2007-2025 Jim Park // // Licensed under the zlib/libpng license (the "License"); // you may not use this file except in compliance with the License. // // This software is provided 'as-is', without any expressed or implied // warranty. // // Provides TSTRING support. /* Unicode support by Jim Park -- 07/23/2007 */ #ifndef NSIS_TSTRING___H__ #define NSIS_TSTRING___H__ #include "Platform.h" #include "tchar.h" #include /* Abstract string type as well. */ #ifdef _UNICODE typedef std::wstring tstring; typedef std::wofstream tofstream; typedef std::wifstream tifstream; #else typedef std::string tstring; typedef std::ofstream tofstream; typedef std::ifstream tifstream; #endif #ifndef _UNICODE #define CtoTString(str) (str) #define CtoTString2(str,cp) (str) #define TtoCString(str) (str) #define CtoTStrParam CtoTString #else #define CtoTString2(str,cp) CtoTString((str),(cp)) #define CtoTStrParam(str) ( (const TCHAR*) CtoTString((str)) ) // Use this when passing as a vararg parameter // This is a helpful little function for converting exceptions or // other system type things that come back ANSI and must be // utilized as either ANSI or wchar_t depending on _UNICODE. class CtoTString { void Init(const char* str, UINT cp); void Init(const char* str); public: CtoTString(const char* str) { Init(str); } CtoTString(const char* str, UINT cp) { Init(str, cp); } CtoTString(const std::string& str) { Init(str.c_str()); } ~CtoTString(); operator const wchar_t*() const { return m_wStr; } inline const wchar_t*GetTStr() const { return m_wStr; } private: wchar_t* m_wStr; }; // There may be system things that require C strings but we // may actually have Unicode strings. class TtoCString { void Init(const wchar_t* str); public: TtoCString(const wchar_t* wStr) { Init(wStr); } TtoCString(const tstring& wStr) { Init(wStr.c_str()); } ~TtoCString(); operator const char*() const { return m_cStr; }; private: char* m_cStr; }; #endif // _UNICODE #define PosixBug_CtoTString CtoTString #define PosixBug_TtoCString TtoCString #endif // NSIS_TSTRING___H__ nsis-3.11/Source/uservars.h000077500000000000000000000072311477201124000157010ustar00rootroot00000000000000/* * uservars.h * * This file is a part of NSIS. * * Copyright (C) 2003 Ramon * Copyright (C) 2003-2025 NSIS Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Doxygen comments by Jim Park -- 07/25/2007 */ #ifndef ___USERVARS___H_____ #define ___USERVARS___H_____ #include "lang.h" struct uservarstring { int name; int index; int pos; int reference; }; class UserVarsStringList : public SortedStringListND { public: /* Default constructor */ UserVarsStringList() : m_index(0) {} /* Destructor */ virtual ~UserVarsStringList() {} /** * Adds a name to the UserVarsStringList. Sets reference count to * ref_count. * * @param name The User variable string to store. * @param ref_count The reference count to store. Default is 0. * @return The index of the added variable string. */ int add(const TCHAR *name, int ref_count = 0 ) { int pos=SortedStringListND::add(name); if (pos == -1) return -1; uservarstring* ustr = ((uservarstring*) m_gr.get()) + pos; ustr->index = m_index; ustr->pos = pos; ustr->reference = ref_count; int temp = m_index; m_index++; return temp; } /** * Get the index of the string that matches 'name.' * * @param name The name of the string to search for. * @param n_chars If -1, match entire string, otherwise compare only * n_chars worth of characters. * @return The index position of the structure where structure.name == * name. */ int get(const TCHAR *name, int n_chars = -1) const { int v = SortedStringListND::find(name, n_chars); if (v == -1) return -1; return (((struct uservarstring*) m_gr.get())[v].index); } /** * Get count of strings. * * @return The count of strings. */ int getnum() const { return m_index; } /** * Given the index of the structure, return the reference count. * * @return The reference count of the nth uservarstring structure. * If not found, returns -1. */ int get_reference(int idx) const { int pos=get_internal_idx(idx); if (pos==-1) return -1; return (((struct uservarstring*) m_gr.get())[pos].reference); } /** * Given the index of the structure, increment the reference count. * * @return The previous reference count (before the increment). * If not found, returns -1. */ int inc_reference(int idx) { int pos=get_internal_idx(idx); if (pos==-1) return -1; return ((struct uservarstring*) m_gr.get())[pos].reference++; } /** * Given the index of the structure, return the string value * of the name. * * @return String value of the name as TCHAR*. * If not found, returns NULL. */ TCHAR *idx2name(int idx) { int pos=get_internal_idx(idx); if (pos==-1) return NULL; struct uservarstring *data=(struct uservarstring *) m_gr.get(); return ((TCHAR*) m_strings.get() + data[pos].name); } private: int m_index; int get_internal_idx(int idx) const { struct uservarstring *data=(struct uservarstring *) m_gr.get(); for (int i = 0; i < m_index; i++) { if (data[i].index == idx) { return i; } } return -1; } }; #endif nsis-3.11/Source/utf.cpp000077500000000000000000000463101477201124000151610ustar00rootroot00000000000000/* * utf.cpp * * This file is a part of NSIS. * * Copyright (C) 2011-2025 Anders Kjersem * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * */ #include "utf.h" #include "util.h" #define FIX_ENDIAN_INT16LETOHOST_INPLACE FIX_ENDIAN_INT16_INPLACE UINT StrLenUTF16(const void*str) { return sizeof(wchar_t) == 2 ? (UINT)wcslen((wchar_t*)str) : InlineStrLenUTF16(str); } bool StrSetUTF16LE(tstring&dest, const void*src) { #ifndef _WIN32 CharEncConv cec; if (!cec.Initialize(-1,NStreamEncoding::UTF16LE)) return false; src = (const void*) cec.Convert(src); if (!src) return false; #endif #ifdef C_ASSERT C_ASSERT(sizeof(tstring::value_type) >= sizeof(wchar_t)); #endif try { dest = (wchar_t*) src; } catch(...) { return false; } return true; } void UTF16InplaceEndianSwap(void*Buffer, UINT cch) { unsigned short *p = (unsigned short *) Buffer; while(cch--) p[cch] = SWAP_ENDIAN_INT16(p[cch]); } inline UINT UTF8ToWC_Convert(LPCSTR StrU8,UINT cbU8,wchar_t*Buffer,UINT cchBuf) { #ifndef MB_ERR_INVALID_CHARS const UINT MB_ERR_INVALID_CHARS = 8; // MSDN says this flag is OK for CP_UTF8 #endif return (UINT) MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,StrU8,cbU8,Buffer,cchBuf); } inline UINT UTF8ToWC_Prepare(LPCSTR StrU8,UINT cbU8) { return UTF8ToWC_Convert(StrU8,cbU8,0,0); } UINT WCFromCodePoint(wchar_t*Dest,UINT cchDest,UINT32 CodPt) { // Don't allow half surrogate pairs if (CodPt >= 0xd800 && CodPt <= 0xdfff) CodPt = UNICODE_REPLACEMENT_CHARACTER; #ifdef _WIN32 if (CodPt <= 0xffff && cchDest) { *Dest = (wchar_t) CodPt; return 1; } else if (cchDest >= 2) { const UINT32 lead_offset = 0xd800 - (0x10000 >> 10); UINT16 lead = lead_offset + (CodPt >> 10), trail = 0xdc00 + (CodPt & 0x3ff); Dest[0] = lead, Dest[1] = trail; return 2; } return 0; #else iconvdescriptor iconvd; if (!iconvd.Open("wchar_t",iconvdescriptor::GetHostEndianUCS4Code())) return 0; size_t inleft = 4; UINT cchW = iconvd.Convert(&CodPt,&inleft,Dest,cchDest*sizeof(wchar_t)) / sizeof(wchar_t); return !inleft ? cchW : 0; #endif } wchar_t* DupWCFromBytes(void*Buffer,UINT cbBuffer,UINT32 SrcCP) { /*\ Converts a buffer encoded with SrcCP to a \0 terminated wchar_t malloc'ed buffer. Returns 0 on failure. \*/ CharEncConv cec; cec.SetAllowOptimizedReturn(!!(SrcCP&DWCFBF_ALLOWOPTIMIZEDRETURN)); if (!cec.Initialize(-1, SrcCP&=~DWCFBF_ALLOWOPTIMIZEDRETURN)) return 0; wchar_t *pWC = (wchar_t*) cec.Convert(Buffer, cbBuffer); return pWC ? (wchar_t*) cec.Detach() : 0; } BOOL CharEncConv::IsValidCodePage(UINT cp) { #ifdef _WIN32 if (cp <= 1 || NStreamEncoding::IsUnicodeCodepage(cp)) return true; // Allow ACP/OEM/UTF* #endif return cp < NStreamEncoding::CPCOUNT && ::IsValidCodePage(cp); } bool CharEncConv::Initialize(UINT32 ToEnc, UINT32 FromEnc) { /* ** Initialize() with a Windows codepage or -1 for wchar_t */ const WORD UTF32LE = NStreamEncoding::UTF32LE; #ifdef _WIN32 if (NStreamEncoding::UTF16LE == ToEnc) ToEnc = -1; if (NStreamEncoding::UTF16LE == FromEnc) FromEnc = -1; #endif m_TE = (WORD) ToEnc, m_FE = (WORD) FromEnc; if ((UTF32LE|1) == (m_FE|1) || (UTF32LE|1) == (m_TE|1)) return false; // UTF-32 is a pain to deal with on Windows #ifdef _WIN32 return (IsWE(m_FE) || IsValidCodePage(FromEnc)) && (IsWE(m_TE) || IsValidCodePage(ToEnc)); #else char f[50], t[COUNTOF(f)]; if (IsWE(m_FE)) strcpy(f, "wchar_t"); else create_code_page_string(f, COUNTOF(f), m_FE); if (IsWE(m_TE)) strcpy(t, "wchar_t"); else create_code_page_string(t, COUNTOF(t), m_TE); return m_TE == m_FE || m_iconvd.Open(t, f); #endif } size_t CharEncConv::GuessOutputSize(size_t cbConverted) { UINT cus = IsWE(m_TE) ? sizeof(wchar_t) : NStreamEncoding::GetCodeUnitSize(m_TE); size_t zt = 1, cch = cbConverted / cus; if (!cch) return 0; switch(cus) { case 1: zt = !((char*)m_Result)[--cch]; break; case 2: zt = !((WORD*)m_Result)[--cch]; break; case 4: zt = !((UINT32*)m_Result)[--cch]; break; } return (cch + (zt ? 0 : 1)) * cus; } void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut) { /* ** Convert() mallocs a buffer and converts Src (as m_FE) to m_TE. ** If cbSrc is -1 the size is calculated. cbOut can be NULL. ** Returns a pointer to the buffer on success or 0 on error. ** The buffer is valid until you call Close() or Convert(). */ #ifdef _WIN32 m_OptimizedReturn = false; #endif if ((size_t)-1 == cbSrc) { UINT cus = IsWE(m_FE) ? sizeof(wchar_t) : NStreamEncoding::GetCodeUnitSize(m_FE); switch(cus) { case 1: cbSrc = strlen((char*)Src); break; case 2: cbSrc = StrLenUTF16(Src); break; //case 4: // No UTF-32 support... default: if (sizeof(wchar_t) > 2 && sizeof(wchar_t) == cus) { cbSrc = wcslen((wchar_t*)Src); break; } assert(0); return 0; } cbSrc = (cbSrc + 1) * cus; } if (m_FE == m_TE) { #ifdef _WIN32 if (m_AllowOptimizedReturn && IsWE(m_FE)) { if (cbOut) { cbSrc /= sizeof(wchar_t); if (cbSrc && ((WORD*)Src)[--cbSrc]) ++cbSrc; *cbOut = cbSrc * sizeof(wchar_t); } m_OptimizedReturn = true; return (void*) (m_Result = (char*) Src); } #endif char *p = (char*) realloc(m_Result, cbSrc + sizeof(UINT32)); if (p) m_Result = p; else return 0; memcpy(p, Src, cbSrc); *((UINT32*)(p+cbSrc)) = 0; if (cbOut) *cbOut = GuessOutputSize(cbSrc); return m_Result; } #ifdef _WIN32 if (!IsWE(m_FE) && !IsWE(m_TE) && NStreamEncoding::UTF16BE != m_TE) { // We need a middle step: Src -> wchar_t -> Target CharEncConv cec; if (!cec.Initialize(-1, m_FE)) return 0; size_t cbConv; char *pWC = (char*) cec.Convert(Src, cbSrc, &cbConv); if (!pWC) return 0; this->m_FE = -1; return this->Convert(pWC, cbConv, cbOut); } if (IsWE(m_FE)) { if (NStreamEncoding::UTF16BE == m_TE) goto l_swapUTF16; cbSrc /= sizeof(wchar_t); UINT cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, (int)cbSrc, 0, 0, 0, 0); char *p = (char*) realloc(m_Result, (cbDest + 1) * sizeof(char)); if (p) m_Result = p; else return 0; if (!(cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, (int)cbSrc, p, (int)cbDest, 0, 0))) return 0; if (p[--cbDest]) p[++cbDest] = '\0'; // Always \0 terminate if (cbOut) *cbOut = cbDest; // cbOut never includes the \0 terminator } else { UINT cchDest; if (NStreamEncoding::UTF16BE == m_FE) // UTF16BE -> UTF16LE/wchar_t { l_swapUTF16: char *p = (char*) realloc(m_Result, cbSrc + sizeof(wchar_t)); if (p) m_Result = p; else return 0; memcpy(p, Src, cbSrc); cchDest = (UINT) (cbSrc / sizeof(wchar_t)); UTF16InplaceEndianSwap(p, cchDest); if (!cchDest) *((WORD*)p) = 0, ++cchDest; // For "--cchDest" during \0 termination } else { cchDest = MultiByteToWideChar(m_FE, 0, (char*)Src, (int)cbSrc, 0, 0); char *p = (char*) realloc(m_Result, (cchDest + 1) * sizeof(wchar_t)); if (p) m_Result = p; else return 0; if (!(cchDest = MultiByteToWideChar(m_FE, 0, (char*)Src, (int)cbSrc, (LPWSTR)p, (int)cchDest))) return 0; if (NStreamEncoding::UTF16BE == m_TE) UTF16InplaceEndianSwap(p, cchDest); } if (((WORD*)m_Result)[--cchDest]) ((WORD*)m_Result)[++cchDest] = '\0'; if (cbOut) *cbOut = cchDest * sizeof(wchar_t); } #else char *in = (char*) Src; size_t cbConv; if (!nsis_iconv_reallociconv(m_iconvd, &in, &cbSrc, &m_Result, cbConv)) return 0; if (cbOut) *cbOut = GuessOutputSize(cbConv); #endif return m_Result; } #if !defined(_WIN32) || !defined(_UNICODE) bool WCToUTF16LEHlpr::Create(const TCHAR*in, unsigned int codepage) { CharEncConv cec; if (!cec.Initialize(NStreamEncoding::UTF16LE, -1)) return false; if (!cec.Convert(in)) return false; m_s = (unsigned short*) cec.Detach(); return true; } #endif UINT DetectUTFBOM(void*Buffer, UINT cb) { unsigned char *b = (unsigned char*) Buffer; if (cb >= 3 && 0xef == b[0] && 0xbb == b[1] && 0xbf == b[2]) return NStreamEncoding::UTF8; if (cb >= 2) { if (cb >= 4 && !b[0] && !b[1] && 0xfe == b[2] && 0xff == b[3]) return NStreamEncoding::UTF32BE; if (0xff == b[0] && 0xfe == b[1]) return (cb >= 4 && !b[2] && !b[3]) ? NStreamEncoding::UTF32LE : NStreamEncoding::UTF16LE; if (0xfe == b[0] && 0xff == b[1]) return NStreamEncoding::UTF16BE; } return 0; } UINT DetectUTFBOM(FILE*strm) { /*\ Tries to detect a BOM at the current position in a stream. If a BOM is found it is eaten. NOTE: ungetc is only guaranteed to support 1 pushback, lets hope no MBCS file starts with parts of a BOM. \*/ const int b1 = fgetc(strm); if (EOF == b1) return 0; if (0xef == b1) { const int b2 = fgetc(strm); if (0xbb == b2) { const int b3 = fgetc(strm); if (0xbf == b3) return NStreamEncoding::UTF8; ungetc(b3,strm); } ungetc(b2,strm); } if (0xfe == b1 || 0xff == b1 || 0x00 == b1) { const int b2 = fgetc(strm), b3 = fgetc(strm); if (b1 && (b1^b2) == (0xfe^0xff)) { if (0xff == b1 && 0 == b3) { const int b4 = fgetc(strm); if (0 == b4) return NStreamEncoding::UTF32LE; ungetc(b4,strm); } ungetc(b3,strm); return 0xff == b1 ? NStreamEncoding::UTF16LE : NStreamEncoding::UTF16BE; } if (0 == b1 && 0 == b2) { if (0xfe == b3) { const int b4 = fgetc(strm); if (0xff == b4) return NStreamEncoding::UTF32BE; ungetc(b4,strm); } } ungetc(b3,strm); ungetc(b2,strm); } ungetc(b1,strm); return 0; } static bool IsUTFEncodingString(const TCHAR*s, const TCHAR*suff) { if (S7ChLwr(s[0]) == 'u' && S7ChLwr(s[1]) == 't' && S7ChLwr(s[2]) == 'f') { s += 3 + (s[3] == '-' || s[3] == '_'); return !_tcsicmp(s, suff); } return false; } WORD GetEncodingFromString(const TCHAR*s, bool&BOM) { BOM = false; if (!_tcsicmp(s,_T("ACP"))) return NStreamEncoding::ACP; if (!_tcsicmp(s,_T("OEM"))) return NStreamEncoding::OEMCP; if (IsUTFEncodingString(s, _T("8"))) return NStreamEncoding::UTF8; if (IsUTFEncodingString(s, _T("8SIG")) || IsUTFEncodingString(s, _T("8BOM"))) return (BOM = true, NStreamEncoding::UTF8); if (IsUTFEncodingString(s, _T("16LE")) || (IsUTFEncodingString(s, _T("16LEBOM")) && (BOM = true))) return NStreamEncoding::UTF16LE; if (IsUTFEncodingString(s, _T("16BE")) || (IsUTFEncodingString(s, _T("16BEBOM")) && (BOM = true))) return NStreamEncoding::UTF16LE; if (S7IsChEqualI('C', *s++) && S7IsChEqualI('P', *s++)) { int cp = _tstoi(s); if (cp > 0 && cp < NStreamEncoding::CPCOUNT) return (WORD) cp; } return NStreamEncoding::UNKNOWN; } WORD GetEncodingFromString(const TCHAR*s) { bool bom; return GetEncodingFromString(s, bom); } void NStreamEncoding::GetCPDisplayName(WORD CP, TCHAR*Buf) { TCHAR mybuf[10]; const TCHAR *p = mybuf; switch(CP) { case ACP: p = _T("ACP"); break; case OEMCP: p = _T("OEM"); break; case UTF16LE: p = _T("UTF16LE"); break; case UTF16BE: p = _T("UTF16BE"); break; case UTF32LE: p = _T("UTF32LE"); break; case UTF32BE: p = _T("UTF32BE"); break; case UTF8: p = _T("UTF8"); break; case BINARY: p = _T("BIN"); break; default: _stprintf(mybuf,_T("CP%u"), CP); if (CP >= NStreamEncoding::CPCOUNT) p = _T("?"); } _tcscpy(Buf, p); } bool NBaseStream::Attach(FILE*hFile, WORD enc, bool Seek /*= true*/) { Close(); m_hFile = hFile; if (!m_hFile) return false; if (!NStream::SetBinaryMode(m_hFile) && m_hFile != stdin) return false; WORD cp = 0; if (enc != NStreamEncoding::BINARY) { fpos_t pos; if (Seek && !fgetpos(m_hFile, &pos)) rewind(m_hFile); else Seek = false; cp = DetectUTFBOM(m_hFile); if (Seek) { fsetpos(m_hFile, &pos); if (cp) { DetectUTFBOM(m_hFile); // parseScript() etc does not like the BOM, make sure we skip past it fseek(m_hFile, 0, SEEK_CUR); // Force intervening call to a file positioning function so writes works for files with BOM opened with "a+" } } } if (!cp) cp = enc; m_Enc.SafeSetCodepage(cp); return true; } bool NOStream::WriteString(const wchar_t*Str, size_t cch /*= -1*/) { CharEncConv cec; if (!cec.Initialize(m_Enc.GetCodepage(), -1)) return false; cec.SetAllowOptimizedReturn(true); if ((size_t)-1 != cch) cch *= sizeof(wchar_t); // cec.Convert wants byte count size_t cbConv; char *p = (char*) cec.Convert(Str, cch, &cbConv); return p && WriteOctets(p, cbConv); } bool NOStream::WritePlatformNLString(const wchar_t*Str, size_t cch /*= -1*/) { #ifdef _WIN32 size_t cch2 = 0, nlcount = 0; for(; cch2 < cch && Str[cch2]; ++cch2) if (L'\n' == Str[cch2]) ++nlcount; if (nlcount) { cch = cch2 + nlcount; wchar_t chPrev = 0, *buf = (wchar_t*) malloc(cch * sizeof(wchar_t)); if (!buf) return false; for(size_t s = 0, d = 0; d < cch; ++s, ++d) { if (L'\n' == Str[s]) { if (L'\r' != chPrev) buf[d++] = L'\r'; else --cch; } buf[d] = chPrev = Str[s]; } bool retval = WriteString(buf, cch); free(buf); return retval; } #endif return WriteString(Str, cch); } tstring NStreamLineReader::GetErrorMessage(UINT Error, const TCHAR*Filename, UINT Line) { tstring msg; TCHAR buf[40]; switch(Error) { case NStream::ERR_BUFFEROVERFLOW: msg = _T("Line too long"); break; case NStream::ERR_IOERROR: msg = _T("I/O error"), Filename = 0; break; case NStream::ERR_UNSUPPORTEDENCODING: StreamEncoding().GetCPDisplayName(buf); msg = tstring(buf) + _T(" is not supported"), Filename = 0; break; default: msg = _T("Bad text encoding"); break; } if (Filename) { const TCHAR *filelinesep = *Filename ? _T(":") : _T(""); _stprintf(buf,_T("%") NPRIs _T("%u"),filelinesep,Line); msg = msg + _T(": ") + Filename + buf; } return msg + _T("\n"); } UINT NStreamLineReader::ReadLine(wchar_t*Buffer, UINT cchBuf) { /*\ Reads from the associated stream until it finds a new-line or the read fails (I/O error or EOF). It fails with ERR_BUFFEROVERFLOW if cchBuf-1 wchar_t's are read without finding the end of the line. Buffer MUST be a valid pointer, it will be \0 terminated as long as cchBuf > 0. \*/ if (!cchBuf) return NStream::ERR_BUFFEROVERFLOW; #ifndef MB_ERR_INVALID_CHARS const UINT MB_ERR_INVALID_CHARS = 8; #endif const UINT cchFullBuf = cchBuf; NIStream&strm = GetStream(); #ifndef _WIN32 iconvdescriptor iconvd; #endif l_restart: if (StreamEncoding().IsUTF8()) { for(;;) { BYTE cb = 0; // bytes in chU8 -1 BYTE chU8[6]; if (!strm.ReadOctet(&chU8[0])) goto l_ioerror; UINT cchWC; #if defined(_WIN32) || defined(__CYGWIN__) // wchar_t==UTF16LE on Cygwin: www.mail-archive.com/bug-gnulib@gnu.org/msg21543.html // Fast path if wchar_t == UTF16 and in ASCII range if (chU8[0] <= 127 && sizeof(wchar_t) == 2) { cchWC = ++cb; if (cchBuf <= cchWC) goto l_lineoverflow; *Buffer = (wchar_t) chU8[0]; } else #endif { if (!UTF8_GetTrailCount(chU8[0], cb)) goto l_badutf; for(BYTE moreU8 = 0; moreU8 < cb;) { BYTE b; if (!strm.ReadOctet(&b)) goto l_ioerror; if (0x80 != (0xC0 & b)) goto l_badutf; // chU8[1..n] must be 0b10xxxxxx chU8[++moreU8] = b; } ++cb; cchWC = UTF8ToWC_Prepare((LPCSTR)chU8,cb); if (!cchWC) goto l_badutf; if (cchBuf <= cchWC) goto l_lineoverflow; cchWC = UTF8ToWC_Convert((LPCSTR)chU8,cb,Buffer,cchWC); } if (CompleteLine(Buffer,cchWC,cchBuf,true)) goto l_success; } } else if (StreamEncoding().IsUTF16()) { #ifndef _WIN32 if (!iconvd.Open("wchar_t", iconvdescriptor::GetHostEndianUCS4Code())) goto l_unsupportedencoding; #endif const bool utf16be = StreamEncoding().IsUTF16BE(); unsigned short lead, trail, cchWC; for(;;) { if (!strm.ReadInt16(&lead)) goto l_ioerror; FIX_ENDIAN_INT16LETOHOST_INPLACE(lead); if (utf16be) lead = SWAP_ENDIAN_INT16(lead); if (IsTrailSurrogateUTF16(lead)) goto l_badutf; UINT32 codpt = lead; if (cchBuf <= 1) goto l_lineoverflow; Buffer[0] = lead, cchWC = 1; if (IsLeadSurrogateUTF16(lead)) { if (!strm.ReadInt16(&trail)) goto l_ioerror; FIX_ENDIAN_INT16LETOHOST_INPLACE(trail); if (utf16be) trail = SWAP_ENDIAN_INT16(trail); if (!IsTrailSurrogateUTF16(trail)) goto l_badutf; codpt = CodePointFromUTF16SurrogatePair(lead,trail); #ifdef _WIN32 if (cchBuf <= 2) goto l_lineoverflow; Buffer[1] = trail, ++cchWC; #endif } if (!IsValidUnicodeCodePoint(codpt)) goto l_badutf; #ifndef _WIN32 char tmpdest[8]; // Should be plenty of space to store one UCS4 character as wchar_t(s) size_t inleft = 4; cchWC = iconvd.Convert(&codpt,&inleft,tmpdest,sizeof(tmpdest)) / sizeof(wchar_t); if (!cchWC) goto l_badutf; if (cchBuf <= cchWC) goto l_lineoverflow; for (UINT i = cchWC; i;) --i, Buffer[i] = ((wchar_t*)tmpdest)[i]; #endif if (CompleteLine(Buffer,cchWC,cchBuf,true)) goto l_success; } } else if (StreamEncoding().IsUnicode()) { goto l_unsupportedencoding; } else { const UINT cp = StreamEncoding().GetCodepage(); UINT mbtowcflags = (cp < 50220 && cp != 42) ? MB_ERR_INVALID_CHARS : 0; for(;;) { BYTE bufMB[2]; BYTE mb = 0; if (!strm.ReadOctet(&bufMB[0])) goto l_ioerror; if (IsDBCSLeadByteEx(cp,bufMB[0])) { if (!strm.ReadOctet(&bufMB[++mb])) goto l_ioerror; } ++mb; UINT cchWC = MultiByteToWideChar(cp,mbtowcflags,(LPCSTR)bufMB,mb,0,0); if (!cchWC) goto l_badencoding; if (cchBuf <= cchWC) goto l_lineoverflow; cchWC = MultiByteToWideChar(cp,mbtowcflags,(LPCSTR)bufMB,mb,Buffer,cchWC); if (CompleteLine(Buffer,cchWC,cchBuf,false)) goto l_success; } } l_ioerror: *Buffer = 0; return NStream::ERR_IOERROR; l_lineoverflow: *Buffer = 0; return NStream::ERR_BUFFEROVERFLOW; l_badutf: l_badencoding: *Buffer = 0; return NStream::ERR_INVALIDENCODING; l_unsupportedencoding: *Buffer = 0; return NStream::ERR_UNSUPPORTEDENCODING; l_success: *Buffer = 0; // "Foo\r\nBar" is 2 and not 3 lines const wchar_t chThisNL = *--Buffer, chPrevNL = m_PrevNL; const bool onlyNL = ++cchBuf == cchFullBuf; m_PrevNL = chThisNL; if (onlyNL && (chPrevNL^chThisNL) == ('\r'^'\n')) { m_PrevNL = 0; goto l_restart; // Previous line was "Foo\r". This line was "\n", ignore it. } return NStream::OK; } nsis-3.11/Source/utf.h000077500000000000000000000265141477201124000146320ustar00rootroot00000000000000/* * utf.h * * This file is a part of NSIS. * * Copyright (C) 2011-2025 Anders Kjersem * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * */ #ifndef NSIS_UTF_H #define NSIS_UTF_H #include "Platform.h" const WORD UNICODE_REPLACEMENT_CHARACTER = 0xfffd; #define TSTR_INPUTCHARSET _T("ACP|OEM|CP#|UTF8|UTF16") #define TSTR_OUTPUTCHARSET _T("ACP|OEM|CP#|UTF8[SIG]|UTF16[BOM]") template T S7ChLwr(T c) { return c>='A' && c<='Z' ? (T)(c|32) : c; } template T S7ChUpr(T c) { return c>='a' && c<='z' ? (T)(c-'a'+'A') : c; } template bool S7IsChEqualI(char ch,T cmp) { return S7ChLwr((T)ch) == S7ChLwr(cmp); } inline bool IsValidUnicodeCodePoint(UINT32 c,bool StrictUTF32=false) { // Unicode 6.1: 16.7 Noncharacters if ((c&0xfffe) == 0xfffe) return false; // ..FFFE & ..FFFF is reserved in each plane if (c >= 0xfdd0 && c <= 0xfdef) return false; // Reserved in BMP if (StrictUTF32 && c > 0x10ffff) return false; return true; } inline bool IsLeadSurrogateUTF16(unsigned short c) { return c >= 0xd800 && c <= 0xdbff; } inline bool IsTrailSurrogateUTF16(unsigned short c) { return c >= 0xdc00 && c <= 0xdfff; } inline UINT32 CodePointFromUTF16SurrogatePair(unsigned short lea,unsigned short tra) { const UINT32 surrogate_offset = 0x10000 - (0xD800 << 10) - 0xDC00; return ((UINT32)lea << 10) + tra + surrogate_offset; } inline bool UTF8_GetTrailCount(unsigned char chFirst, unsigned char &cb) { // This function should only be used to get a rough idea of how large the encoded // codepoint is, just because it returns true does not mean that it is valid UTF-8! cb = 0; if (0xC0 == (0xC0 & chFirst)) { ++cb; if (0xE0 == (0xE0 & chFirst)) { ++cb; if (0xF0 == (0xF0 & chFirst)) { ++cb; if (0xF8 == (0xF8 & chFirst)) { ++cb; if (0xFC == (0xFE & chFirst)) ++cb; else return 0xFC >= (0xFE & chFirst); } } } return true; } return (signed char)chFirst >= 0; } inline UINT InlineStrLenUTF16(const void*str) { unsigned short *p = (unsigned short *) str; UINT cch = 0; for(;p[cch];) ++cch; return cch; } #ifdef MAKENSIS #include #include #include "tstring.h" #include "util.h" // iconvdescriptor & my_fopen #ifdef _WIN32 #include // For _setmode #include // For _O_BINARY #endif FILE* my_fopen(const TCHAR *path, const char *mode); // from util.h void UTF16InplaceEndianSwap(void*Buffer, UINT cch); UINT StrLenUTF16(const void*str); bool StrSetUTF16LE(tstring&dest, const void*src); UINT WCFromCodePoint(wchar_t*Dest,UINT cchDest,UINT32 CodPt); #define DWCFBF_ALLOWOPTIMIZEDRETURN 0x80000000 // DupWCFromBytes can return input Buffer wchar_t* DupWCFromBytes(void*Buffer,UINT cbBuffer,UINT32 SrcCP); UINT DetectUTFBOM(void*Buffer,UINT cb); UINT DetectUTFBOM(FILE*strm); WORD GetEncodingFromString(const TCHAR*s, bool&BOM); WORD GetEncodingFromString(const TCHAR*s); class CharEncConv { char *m_Result; WORD m_TE, m_FE; #ifdef _WIN32 bool m_AllowOptimizedReturn; // Can Convert() return Src buffer? bool m_OptimizedReturn; #else iconvdescriptor m_iconvd; #endif protected: size_t GuessOutputSize(size_t cbConverted); static bool IsWE(WORD Encoding) { return (WORD)-1 == Encoding; } static bool IsWE(UINT32 Encoding) { return (UINT32)-1 == Encoding; } public: CharEncConv() : m_Result(0) { SetAllowOptimizedReturn(false); } ~CharEncConv() { Close(); } void Close() { #ifdef _WIN32 if (!m_OptimizedReturn) #endif free(m_Result); m_Result = 0; #ifndef _WIN32 m_iconvd.Close(); #endif } void* Detach() { void *p = m_Result; m_Result = 0; return p; } bool Initialize(UINT32 ToEnc, UINT32 FromEnc); void* Convert(const void*Src, size_t cbSrc = -1, size_t*cbOut = 0); #ifdef _WIN32 void SetAllowOptimizedReturn(bool val = true) { m_AllowOptimizedReturn = val; } #else void SetAllowOptimizedReturn(bool val = false) {} #endif static BOOL IsValidCodePage(UINT cp); }; class WCToUTF16LEHlpr { unsigned short* m_s; public: WCToUTF16LEHlpr() : m_s(0) {} bool Create(const TCHAR*in, unsigned int codepage = CP_ACP) #if !defined(_WIN32) || !defined(_UNICODE) ; #else { m_s = (unsigned short*) in; return true; } #endif void Destroy() { #if !defined(_WIN32) || !defined(_UNICODE) free(m_s); #endif } const unsigned short* Get() const { return m_s; } UINT GetLen() const { return StrLenUTF16(m_s); } UINT GetSize() const { return (GetLen()+1) * 2; } unsigned short* Detach() { unsigned short *r = m_s; m_s = 0; return r; } void CopyTo(unsigned short*Dest) const { memcpy(Dest, Get(), GetSize()); } }; class NStreamEncoding { protected: WORD m_cp; public: enum { ACP = CP_ACP, OEMCP = 1, UTF16LE = 1200, UTF16BE = 1201, UTF32LE = 12000, UTF32BE = 12001, UTF8 = CP_UTF8, UNKNOWN = (0xffff-0), AUTO = (0xffff-1), BINARY = (0xffff-2), CPCOUNT = (0xffff-3) // Must be less than our other magic numbers }; NStreamEncoding() { Reset(); } NStreamEncoding(WORD cp) { Reset(), SetCodepage(cp); } WORD GetCodepage() const { return m_cp; } void SetCodepage(WORD cp) { m_cp = cp; } void SafeSetCodepage(WORD cp) { if (NStreamEncoding::AUTO==cp) cp = GetPlatformDefaultCodepage(); SetCodepage(cp); } void Reset() { SetCodepage(GetPlatformDefaultCodepage()); } WORD GetPlatformDefaultCodepage() const { #ifdef _WIN32 return ACP; #else return UTF8; #endif } bool IsUTF8() const { return UTF8==GetCodepage(); } bool IsUTF16() const { return (UTF16LE|1)==(GetCodepage()|1); } bool IsUTF16LE() const { return UTF16LE==GetCodepage(); } bool IsUTF16BE() const { return UTF16BE==GetCodepage(); } bool IsUnicode() const { return IsUnicodeCodepage(GetCodepage()); } void GetCPDisplayName(TCHAR*Buf) { GetCPDisplayName(m_cp, Buf); } static UINT GetCodeUnitSize(WORD cp) { if ((UTF16LE|1)==(cp|1)) return 2; if ((UTF32LE|1)==(cp|1)) return 4; return 1; } static bool IsUnicodeCodepage(WORD cp) { return UTF8==cp || (UTF16LE|1)==(cp|1) || (UTF32LE|1)==(cp|1); } static void GetCPDisplayName(WORD CP, TCHAR*Buf); }; class NStream { public: enum { OK = 0, ERR_BUFFEROVERFLOW, ERR_IOERROR, ERR_INVALIDENCODING, ERR_UNSUPPORTEDENCODING, }; static bool IsNewline(wchar_t chW, bool HandleUnicodeNL) { if (L'\n'==chW || L'\r'==chW) return true; if (HandleUnicodeNL) { // www.unicode.org/standard/reports/tr13/tr13-5.html#UNICODE NEWLINE GUIDELINES if (L'\f'==chW) return true; // FF/Form Feed if (L'\v'==chW) return true; // VT/Vertical Tab // NOTIMPLEMENTED: NEL/Next Line/U+0085 // NOTIMPLEMENTED: LS/Line Separator/U+2028 // NOTIMPLEMENTED: PS/Paragraph Separator/U+2029 } return false; } #ifdef _WIN32 static bool SetBinaryMode(int fd) { return -1 != _setmode(fd, _O_BINARY); } static bool SetBinaryMode(FILE*f) { return SetBinaryMode(_fileno(f)); } #else static bool SetBinaryMode(int fd) { return true; } static bool SetBinaryMode(FILE*f) { return true; } #endif }; class NBaseStream { protected: FILE* m_hFile; NStreamEncoding m_Enc; public: NBaseStream(FILE *hFile = 0) : m_hFile(hFile) {} ~NBaseStream() { Close(); } FILE* GetHandle() const { return m_hFile; } NStreamEncoding& StreamEncoding() { return m_Enc; } bool IsEOF() const { return feof(m_hFile) != 0; } bool IsError() const { return ferror(m_hFile) != 0; } bool IsUnicode() const { return m_Enc.IsUnicode(); } void Close() { FILE*hF = Detach(); if (hF) fclose(hF); } bool OpenFileForReading(const TCHAR* Path, WORD enc = NStreamEncoding::AUTO) { return Attach(my_fopen(Path, "rb"), enc); } bool OpenFileForReading(const TCHAR* Path, NStreamEncoding&Enc) { return OpenFileForReading(Path, Enc.GetCodepage()); } FILE* Detach() { FILE *hFile = m_hFile; m_hFile = 0; return hFile; } bool Attach(FILE*hFile, WORD enc, bool Seek = true); UINT ReadOctets(void*Buffer, UINT cbBuf) { size_t cb = fread(Buffer, 1, cbBuf, m_hFile); return (UINT) cb; } bool ReadOctets(void*Buffer, UINT*pcbBuf) { UINT cbReq = *pcbBuf, cb = ReadOctets(Buffer, cbReq); *pcbBuf = cb; return cbReq == cb; } bool ReadOctet(void*Buffer) { return 1 == ReadOctets(Buffer, 1); } bool ReadInt16(void*Buffer) { return 2 == ReadOctets(Buffer, 2); } }; class NIStream : public NBaseStream { public: bool OpenStdIn(WORD enc = NStreamEncoding::AUTO) { return Attach(stdin, enc, false); } bool OpenStdIn(NStreamEncoding&Enc) { return OpenStdIn(Enc.GetCodepage()); } }; class NOStream : public NBaseStream { public: NOStream(FILE *hFile = 0) : NBaseStream(hFile) {} bool CreateFileForWriting(const TCHAR* Path, WORD enc = NStreamEncoding::AUTO) { return Attach(my_fopen(Path, "w+b"), enc); } bool CreateFileForWriting(const TCHAR* Path, NStreamEncoding&Enc) { return CreateFileForWriting(Path, Enc.GetCodepage()); } bool CreateFileForAppending(const TCHAR* Path, WORD enc = NStreamEncoding::AUTO) { return Attach(my_fopen(Path, "a+b"), enc); } bool CreateFileForAppending(const TCHAR* Path, NStreamEncoding&Enc) { return CreateFileForAppending(Path, Enc.GetCodepage()); } bool WriteOctets(void*Buffer, size_t cbBuf) { return cbBuf == fwrite(Buffer, 1, cbBuf, m_hFile); } bool WriteBOM(NStreamEncoding&Enc) { static const unsigned char u8b[] = {0xEF,0xBB,0xBF}; static const unsigned char u16lb[] = {0xFF,0xFE}, u16bb[] = {0xFE,0xFF}; switch(Enc.GetCodepage()) { case NStreamEncoding::UTF8: return WriteOctets((void*) u8b, sizeof(u8b)); case NStreamEncoding::UTF16LE: return WriteOctets((void*) u16lb, sizeof(u16lb)); case NStreamEncoding::UTF16BE: return WriteOctets((void*) u16bb, sizeof(u16bb)); } return false; } bool WriteString(const wchar_t*Str, size_t cch = -1); bool WritePlatformNLString(const wchar_t*Str, size_t cch = -1); }; class NStreamLineReader { protected: NIStream &m_Strm; wchar_t m_PrevNL; public: NStreamLineReader(NIStream &Strm) : m_Strm(Strm), m_PrevNL(0) {} NIStream& GetStream() { return m_Strm; } NStreamEncoding& StreamEncoding() { return m_Strm.StreamEncoding(); } bool IsEOF() const { return m_Strm.IsEOF(); } bool IsUnicode() const { return m_Strm.IsUnicode(); } UINT ReadLine(wchar_t*Buffer, UINT cchBuf); tstring GetErrorMessage(UINT Error, const TCHAR*Filename=0, UINT Line=0); protected: bool CompleteLine(wchar_t*&BufWC, UINT cchWC, UINT&cchRemain, bool HandleUnicodeNL) { const wchar_t chW = *BufWC; BufWC += cchWC, cchRemain -= cchWC; if (0 == --cchWC) // We only care about code points that fit in a single wchar_t return NStream::IsNewline(chW, HandleUnicodeNL); return false; } }; #endif // MAKENSIS #endif // NSIS_UTF_H nsis-3.11/Source/util.cpp000077500000000000000000001262641477201124000153470ustar00rootroot00000000000000/* * util.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #include #include #include #include #include "tchar.h" #include "exehead/fileform.h" #include "util.h" #include "strlist.h" #include "winchar.h" #include "utf.h" #include "BinInterop.h" #ifndef _WIN32 # include # include // for close(2) # include // for open(2) # include # include # include # include # ifdef _UNICODE # include # endif #endif #ifdef __APPLE__ namespace Apple { // defines struct section # include // for _NSGetExecutablePath }; # define FALSE 0 // bugs #1851365, #2497290 # define TRUE 1 # include // for MAXPATHLEN #endif #include // for assert #include #include #include using namespace std; extern int g_display_errors; extern FILE *g_output, *g_errout; #ifdef _WIN32 static char* CreateMappedFileView(LPCTSTR Path, DWORD FAccess, DWORD FShare, DWORD FMode, DWORD PProtect, DWORD MAccess, size_t &FSize) { char *pView = NULL, restoreGLE = false, validSize; HANDLE hFile = CreateFile(Path, FAccess, FShare, NULL, FMode, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) return pView; ULARGE_INTEGER fs; validSize = GetFileSize64(hFile, fs) && (sizeof(size_t) >= 8 || !fs.HighPart); FSize = sizeof(size_t) >= 8 ? (size_t) fs.QuadPart : fs.LowPart; HANDLE hMap = validSize ? CreateFileMapping(hFile, NULL, PProtect, 0, 0, NULL) : INVALID_HANDLE_VALUE; if (hMap != INVALID_HANDLE_VALUE) { CloseHandle(hFile); if ((pView = (char*) MapViewOfFile(hMap, MAccess, 0, 0, 0))) { CloseHandle(hMap); } else { DWORD error = restoreGLE ? GetLastError() : 0; CloseHandle(hMap); if (restoreGLE) SetLastError(error); } } else { DWORD error = restoreGLE ? GetLastError() : 0; CloseHandle(hFile); if (restoreGLE) SetLastError(error); } return pView; } #else #include #include static char* CreateMappedFileView(const TCHAR *Path, const char *FMode, int PProtect, int MFlags, size_t &FSize) { char *pView = NULL; FILE *pFile = FOPEN(Path, FMode); if (pFile) { struct stat fs; int fd = fileno(pFile), toobig; if (-1 != fd && 0 == fstat(fd, &fs)) { FSize = (size_t) fs.st_size, toobig = sizeof(size_t) < sizeof(fs.st_size) && (INT64)FSize != fs.st_size; void *p = !toobig ? mmap(NULL, FSize, PProtect, MFlags, fd, 0) : MAP_FAILED; if (p != MAP_FAILED) pView = (char*) p; } fclose(pFile); } return pView; } #endif //~ _WIN32 double my_wtof(const wchar_t *str) { char buf[100]; WideCharToMultiByte(0,0,str,-1,buf,100,0,0); return atof(buf); } size_t my_strncpy(TCHAR*Dest, const TCHAR*Src, size_t cchMax) { // Dest and Src must be valid, Dest is always \0 terminated. // Returns number of TCHARs copied to Dest (not counting \0); min(strlen(Src),cchMax-1). size_t cch = 0; if (cchMax) for (TCHAR c; --cchMax;) { if (!(c = Src[cch])) break; Dest[cch++] = c; } Dest[cch] = _T('\0'); return cch; } size_t my_strftime(TCHAR *s, size_t max, const TCHAR *fmt, const struct tm *tm) { return _tcsftime(s, max, fmt, tm); } // Returns 0 if everything is OK // Returns -1 if can't find the file // Returns -2 if the file is an invalid bitmap // Returns -3 if the size doesn't match // Returns -4 if the bpp doesn't match int update_bitmap(CResourceEditor* re, WORD id, const TCHAR* filename, int width/*=0*/, int height/*=0*/, int maxbpp/*=0*/) { FILE *f = FOPEN(filename, ("rb")); if (!f) return -1; signed char hdr[14+124], retval = -2; size_t size = fread(hdr, 1, sizeof(hdr), f); GENERICIMAGEINFO info; if (IsBMPFile(hdr, size, &info) && 0 == fseek(f, 0, SEEK_SET) && LoadImageCanLoadFileFromResource(hdr, size)) { if ((width && width != (int) info.Width) || (height && height != (int) info.Height)) retval = -3; else if (maxbpp && maxbpp < info.BPP) retval = -4; else if (re->UpdateResource(RT_BITMAP, id, NSIS_DEFAULT_LANG, f, CResourceEditor::TM_AUTO)) retval = 0; } fclose(f); return retval; } tstring make_friendly_resource_path(const TCHAR*rt, const TCHAR*rn, LANGID rl) { tstring s = _T(""); TCHAR buf[42], sep = _T('\\'); s += IS_INTRESOURCE(rt) ? (wsprintf(buf, _T("#%d"), (int)(size_t) rt), buf) : rt; s += sep; s += IS_INTRESOURCE(rn) ? (wsprintf(buf, _T("#%d"), (int)(size_t) rn), buf) : rn; s += sep; if (rl == CResourceEditor::ALLLANGID) s += _T("All"); else s += (wsprintf(buf, _T("%d"), (int)(size_t) rl), buf); return s; } #ifndef _WIN32 void PathConvertWinToPosix(char*p); BOOL IsDBCSLeadByteEx(unsigned int CodePage, unsigned char TestChar) { if (CP_UTF8 == CodePage) return false; //blogs.msdn.com/b/michkap/archive/2007/04/19/2190207.aspx const char buf[] = {(char)TestChar, 'a', 'b', '\0'}; // Untested and probably not the best way to do this! return CharNextExA(CodePage, buf, 0) > &buf[1]; } TCHAR *CharPrev(const TCHAR *s, const TCHAR *p) { if (!s || !p || p < s) return NULL; while (*s) { TCHAR *n = CharNext(s); if (n >= p) break; s = n; } return const_cast(s); } char *CharNextA(const char *s) { int l = 0, mbl; if (s && *s) mbl = mblen(s, MB_CUR_MAX), l = max(1, mbl); return const_cast(s + l); } wchar_t *CharNextW(const wchar_t *s) { if (sizeof(*s) == 2 && IsLeadSurrogateUTF16(*s)) ++s; //BUGBUG: This assumes that 16bit wchar_t == UTF16 // else if (...) BUGBUG: Is this the best we can do? What about combining characters/diacritics etc? return const_cast(s + 1); } char *CharNextExA(WORD codepage, const char *s, int flags) { // blogs.msdn.com/b/michkap/archive/2007/04/19/2190207.aspx implies that // CharNextExA uses IsDBCSLeadByteEx, should we do the same? const char* orglocct = NSISRT_setlocale_wincp(LC_CTYPE, codepage), *np; int len = mblen(s, strlen(s)); if (len > 0) np = s + len; else np = s + 1; setlocale(LC_CTYPE, orglocct); return const_cast(np); } int wsprintf(TCHAR *s, const TCHAR *format, ...) { va_list val; va_start(val, format); int res = _vsntprintf(s, 1024+1, format, val); if (res >= 0) s[res] = _T('\0'); va_end(val); return res; } static char g_nrt_iconv_narrowlocbuf[50], *g_nrt_iconv_narrowloc = 0; #define setlocale_ACP(cat) setlocale((cat), "") #define iconv_ACP g_nrt_iconv_narrowloc #define setlocale_OEM(cat) NSISRT_setlocale_wincp((cat), 1252) #define iconv_OEM "CP1252" #ifdef HAVE_LANGINFO_H // BUGBUG: scons needs to check for HAVE_LANGINFO_H and HAVE_NL_LANGINFO support? #include #endif bool NSISRT_Initialize() // Init function for POSIX { iconvdescriptor id; g_nrt_iconv_narrowloc = const_cast(""); // Use "" and not "char", "char" is a GNU extension? if (!id.Open("wchar_t", g_nrt_iconv_narrowloc)) { unsigned int cchmax = COUNTOF(g_nrt_iconv_narrowlocbuf); const char *tmp = ""; #ifdef HAVE_NL_LANGINFO tmp = nl_langinfo(CODESET); // TODO: Use libcharset or locale_charset if possible if (strlen(tmp) >= cchmax) tmp = ""; #endif strcpy(g_nrt_iconv_narrowloc = g_nrt_iconv_narrowlocbuf, tmp); if (!id.Open("wchar_t", g_nrt_iconv_narrowloc)) { // Unable to determine the iconv narrow string code, UTF-8 is the best we can do create_code_page_string(g_nrt_iconv_narrowloc, cchmax, CP_UTF8); } } return nsis_iconv_get_host_endian_ucs4_code() && IsValidCodePage(NSISRT_GetASCIICodepage()); } const char* NSISRT_setlocale_wincp(int cat, unsigned int cp) { if (cp <= 1) return CP_ACP == cp ? setlocale_ACP(cat) : setlocale_OEM(cat); char buf[40]; const char *p, *p1 = 0, *p2 = 0; sprintf(buf, ".CP%u", cp); p = setlocale(cat, &buf[1]); // "CP%u" if (!p) p = setlocale(cat, buf); // ".CP%u" this is the format used by MSVCRT? if (!p) { switch(cp) // This list is probably incomplete { case 932: p1 = "SJIS"; break; // Not an exact match but CP932 already failed, this is the best we can do case 936: p1 = "EUCCN", p2 = "euc-CN"; break; case 949: p1 = "EUCKR", p2 = "euc-KR"; break; case 950: p1 = "Big5"; break; case 20866: p1 = "KOI8-R"; break; case 20932: p1 = "EUCJP", p2 = "euc-JP"; break; case 65001: p1 = "UTF-8", p2 = "utf8"; break; default: if (cp >= 28591 && cp <= 28599) sprintf(buf, "ISO-8859-%u", cp - 28590), p1 = buf; if (cp == 28603 || cp == 28605) sprintf(buf, "ISO-8859-%u", (cp - 28600) + 10), p1 = buf; } if (!(p = setlocale(cat, p1))) p = setlocale(cat, p2); } return p; } wchar_t* NSISRT_mbtowc(const char *Str) { const char *orglocct = setlocale(LC_CTYPE, ""); wchar_t *d = 0; const char *s = Str; size_t cch = mbsrtowcs(0, &s, 0, 0); if ((size_t)-1 != cch && (d = (wchar_t*) malloc(++cch * sizeof(wchar_t)))) { cch = mbsrtowcs(d, &Str, cch, 0); if ((size_t) -1 == cch) { NSISRT_free(d); d = 0; } } if (!errno) errno = ENOMEM; setlocale(LC_CTYPE, orglocct); return d; } char* NSISRT_wctomb(const wchar_t *Str) { const char *orglocct = setlocale(LC_CTYPE, ""); char *d = 0; const wchar_t *s = Str; errno = 0; size_t cb = wcsrtombs(0, &s, 0, 0); if ((size_t) -1 != cb && (d = (char*) malloc(++cb))) { cb = wcsrtombs(d, &Str, cb, 0); if ((size_t) -1 == cb) { NSISRT_free(d); d = 0; } } if (!errno) errno = ENOMEM; setlocale(LC_CTYPE, orglocct); return d; } char* NSISRT_wctombpath(const wchar_t *Path) { char *p = NSISRT_wctomb(Path); if (p) PathConvertWinToPosix(p); return p; } char* NSISRT_ttombpath(const TCHAR *Path) { #ifdef _UNICODE return NSISRT_wctombpath(Path); #else char *p = _tcsdup(Path); if (p) PathConvertWinToPosix(p); else errno = ENOMEM; return p; #endif } #include int _wcsnicmp(const wchar_t *a, const wchar_t *b, size_t n) { // Note: Behavior depends on the LC_CTYPE category of the current locale. #if _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L return wcsncasecmp(a, b, n); #else int diff = 0; for ( ; n--; ++a, ++b ) if ((diff = (int) towlower(*a) - (int) towlower(*b)) || !*a) break; return diff; #endif } int _wcsicmp(const wchar_t *a, const wchar_t *b) { return _wcsnicmp(a, b, (size_t)-1); } long _wtol(const wchar_t *s) { return wcstol(s, 0, 10); } int _wtoi(const wchar_t *s) { errno = 0; long int r = _wtol(s); if (errno) r = 0; if (LONG_MIN == r) r = INT_MIN; if (LONG_MAX == r) r = INT_MAX; return (int) r; } int _swprintf(wchar_t *d, const wchar_t *f, ...) { va_list val; va_start(val, f); int res = _vsnwprintf(d, INT_MAX / sizeof(*d), f, val); va_end(val); return res; } wchar_t* _wcsdup(const wchar_t *s) { wchar_t *d = (wchar_t*) malloc((wcslen(s)+1) * sizeof(wchar_t)); if (d) wcscpy(d, s); return d; } wchar_t* _wgetenv(const wchar_t *wname) { mbstate_t mbs; memset(&mbs,0,sizeof(mbs)); char *nval, *nval2, nname[200]; // Hopefully this is enough size_t cbnn = wcsrtombs(nname, &wname, sizeof(nname), &mbs); if ((size_t)-1 == cbnn || !(nval = getenv(nname))) return NULL; static wchar_t *g_wval = 0; // Not thread safe! for ( unsigned int cch = 200;; cch *= 2 ) { if (!(g_wval = (wchar_t*) realloc(g_wval, cch * sizeof(wchar_t)))) break; nval2 = nval; memset(&mbs,0,sizeof(mbs)); size_t cchwv = mbsrtowcs(g_wval, const_cast(&nval2), cch, &mbs); if ((size_t)-1 == cchwv) return NULL; if (!nval2) return g_wval; } errno = ENOMEM; return 0; } int _wremove(const wchar_t *Path) { const char *path = NSISRT_wctomb(Path); // Caller should have converted to POSIX path if (!path) return -1; const int retval = remove(path); NSISRT_free(path); return retval; } int _wchdir(const wchar_t *Path) { const char *path = NSISRT_wctomb(Path); // Caller should have converted to POSIX path if (!path) return -1; const int retval = chdir(path); NSISRT_free(path); return retval; } #include #include int _wstat(const wchar_t *Path, struct stat *pS) { const char *path = NSISRT_wctomb(Path); // Caller should have converted to POSIX path if (!path) return -1; const int retval = stat(path, pS); NSISRT_free(path); return retval; } #ifdef _UNICODE static int NSISRT_wsystem(const wchar_t *wcmd) { if (!wcmd) return system(NULL); // NOTE: Only the first drive in the path will be converted to posix style (c:\foo d:\bar > /c/foo d:/bar) const char *cmd = NSISRT_wctombpath(wcmd); if (!cmd) return -1; const int retval = system(cmd); NSISRT_free(cmd); return retval; } #endif const char* nsis_iconv_get_host_endian_ucs4_code() { static const char* ucs4 = 0; if (!ucs4) { iconvdescriptor id; #define NRT_TMP_IGHEUC(s) if (id.Open("wchar_t", (s))) return ucs4 = (s) NRT_TMP_IGHEUC("UCS-4-INTERNAL"); NRT_TMP_IGHEUC(Platform_IsBigEndian() ? "UCS-4BE" : "UCS-4LE"); NRT_TMP_IGHEUC(Platform_IsBigEndian() ? "UTF-32BE" : "UTF-32LE"); #undef NRT_TMP_IGHEUC } return ucs4; } bool nsis_iconv_reallociconv(iconv_t CD, char**In, size_t*cbInLeft, char**Mem, size_t&cbConverted) { char *in, *heap = *Mem; UINT cbMem = 512; size_t inleft, outleft, icvret = (size_t) -1; for(;;) { in = *In, inleft = *cbInLeft, outleft = cbMem - sizeof(UINT32); // Leave room for \0 char *p = (char*) realloc(heap, cbMem), *out = p; if (!p) break; heap = p, icvret = nsis_iconv_adaptor(iconv, CD, &in, &inleft, &out, &outleft); if ((size_t) -1 != icvret || E2BIG != errno) break; cbMem *= 4; } *In = in, *Mem = heap; cbConverted = cbMem - (outleft + sizeof(UINT32)), *cbInLeft = inleft; if ((size_t) -1 != icvret) { *((UINT32*)(&heap[cbConverted])) = 0; return true; } return false; } const unsigned short CODEPAGESTR_MAXLEN = 50; // Should be plenty void create_code_page_string(TCHAR *buf, size_t len, UINT code_page) { if (!g_nrt_iconv_narrowloc) NSISRT_Initialize(); // For winchar.cpp unit test switch(code_page) { case CP_ACP: _sntprintf(buf, len, _T("%") NPRIns, iconv_ACP); return; case CP_OEMCP: _sntprintf(buf, len, _T("%") NPRIns, iconv_OEM); return; case CP_UTF8: _sntprintf(buf, len, _T("UTF-8")); return; case 1200: // UTF16LE case 1201: // UTF16BE _sntprintf(buf, len, _T("UTF-16%cE"), 1200 == code_page ? 'L' : 'B'); return; } _sntprintf(buf, len, _T("CP%d//TRANSLIT"), code_page); } #ifdef _UNICODE void create_code_page_string(char*buf, size_t len, UINT code_page) { TCHAR t[CODEPAGESTR_MAXLEN]; create_code_page_string(t, COUNTOF(t), code_page); RawTStrToASCII(t, buf, len); } #endif int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, const wchar_t* lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar) { static char buffer[4096]; // BUGBUG: Should this be 4*NSIS_MAX_STRLEN for large string build? char cp[CODEPAGESTR_MAXLEN]; create_code_page_string(cp, COUNTOF(cp), CodePage); iconv_t cd = iconv_open(cp, "wchar_t"); if (cd == (iconv_t) -1) return 0; if (cchWideChar < 0) cchWideChar = (int) wcslen(lpWideCharStr) + 1; if (cbMultiByte == 0) cbMultiByte = sizeof(buffer), lpMultiByteStr = buffer; char *in = (char *) lpWideCharStr, *out = lpMultiByteStr; size_t inbytes = cchWideChar * sizeof(wchar_t), outbytes = cbMultiByte; if (nsis_iconv_adaptor(iconv, cd, &in, &inbytes, &out, &outbytes) == (size_t) -1) { iconv_close(cd); return 0; } iconv_close(cd); return cbMultiByte - outbytes; } int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, wchar_t* lpWideCharStr, int cchWideChar) { static wchar_t buffer[4096]; // BUGBUG: Should this be 4*NSIS_MAX_STRLEN for large string build? char cp[CODEPAGESTR_MAXLEN]; create_code_page_string(cp, COUNTOF(cp), CodePage); iconv_t cd = iconv_open("wchar_t", cp); if (cd == (iconv_t) -1) return 0; if (cbMultiByte < 0) cbMultiByte = strlen(lpMultiByteStr) + 1; if (cchWideChar == 0) cchWideChar = sizeof(buffer), lpWideCharStr = buffer; char *in = (char *) lpMultiByteStr, *out = (char *) lpWideCharStr; size_t inbytes = cbMultiByte, outbytes = cchWideChar * sizeof(wchar_t); if (nsis_iconv_adaptor(iconv, cd, &in, &inbytes, &out, &outbytes) == (size_t) -1) { iconv_close(cd); return 0; } iconv_close(cd); return cchWideChar - (outbytes / sizeof (wchar_t)); } BOOL IsValidCodePage(UINT CodePage) { char cp[CODEPAGESTR_MAXLEN]; create_code_page_string(cp, COUNTOF(cp), CodePage); iconv_t cd = iconv_open("wchar_t", cp); if (cd == (iconv_t) -1) return FALSE; iconv_close(cd); return TRUE; } #ifdef _UNICODE void PathConvertWinToPosix(char*p) { if ('\"' == *p) ++p; // Skip opening quote if any (For !system) size_t len = strlen(p); /* Replace drive letter X: by /x */ if (len >= 2 && ':' == p[1]) p[1] = (char) tolower((int) p[0]), p[0] = '/'; do if ('\\' == *p) *p = '/'; while (*(p = CharNextA(p))); } #endif void PathConvertWinToPosix(TCHAR*p) { if (_T('\"') == *p) ++p; // Skip opening quote if any (For !system) size_t len = _tcsclen(p); /* Replace drive letter X: by /x */ if (len >= 2 && _T(':') == p[1]) p[1] = (TCHAR) tolower((int) p[0]), p[0] = _T('/'); do if (_T('\\') == *p) *p = _T('/'); while (*(p = CharNext(p))); } #define MY_ERROR_MSG(x) {if (g_display_errors) {PrintColorFmtMsg_ERR(_T("%") NPRIs, x);}} TCHAR *my_convert(const TCHAR *path) { TCHAR *converted_path = _tcsdup(path); if (!converted_path) { MY_ERROR_MSG(_T("Error: could not allocate memory in my_convert()\n")); return 0; } PathConvertWinToPosix(converted_path); return converted_path; } void my_convert_free(TCHAR *converted_path) { free(converted_path); } int my_open(const TCHAR *pathname, int flags) { #ifndef _UNICODE int result = open(pathname, flags); #else char *nativepath = NSISRT_ttombpath(pathname); if (!nativepath) return -1; int result = open(nativepath, flags); NSISRT_free(nativepath); #endif return result; } #endif //! _WIN32 FILE* my_fopen(const TCHAR *path, const char *mode) { FILE*f = 0; #ifndef _UNICODE f = fopen(path, mode); #else #ifdef _WIN32 TCHAR tmode[20]; for (int i=0; ; ++i) if (0 == (tmode[i] = mode[i])) break; f = _wfopen(path, tmode); #else char *nativepath = NSISRT_wctombpath(path); if (nativepath) { f = fopen(nativepath, mode); NSISRT_free(nativepath); } #endif #endif return f; } static inline const TCHAR* getptrstrfmt_tstr() { #ifdef _WIN32 return sizeof(void*) > 4 ? _T("%I64u") : _T("%u"); #else assert(sizeof(void*) <= sizeof(unsigned long long)); return sizeof(void*) > sizeof(unsigned long) ? _T("%llu") : _T("%lu"); #endif } static inline const char* getptrstrfmt_cstr() { #ifdef _WIN32 return sizeof(void*) > 4 ? "%I64u" : "%u"; #else assert(sizeof(void*) <= sizeof(unsigned long long)); return sizeof(void*) > sizeof(unsigned long) ? "%llu" : "%lu"; #endif } int ptrtostr(const void* Src, TCHAR*Dst) { return wsprintf(Dst, getptrstrfmt_tstr(), Src); } void* strtoptr(const TCHAR*Src) { #ifdef _WIN32 void*v; return _stscanf(Src, getptrstrfmt_tstr(), &v) == 1 ? v : 0; #else #ifdef _UNICODE char buf[42]; size_t cb = wcsrtombs(buf, &Src, sizeof(buf), 0); if (cb >= sizeof(buf)) return 0; #else const char* buf = Src; #endif if (sizeof(void*) > sizeof(unsigned long)) { unsigned long long v; return sscanf(buf, getptrstrfmt_cstr(), &v) == 1 ? (void*) v : 0; } else { unsigned long v; return sscanf(buf, getptrstrfmt_cstr(), &v) == 1 ? (void*) v : 0; } #endif } #include #include #if (defined(_MSC_VER) && (_MSC_VER >= 1200)) || defined(__MINGW32__) #include UINT64 get_file_size64(FILE *f) { INT64 s = _filelengthi64(_fileno(f)); // Could also use _get_osfhandle+GetFileSize64 return (INT64) -1L != s ? s : invalid_file_size64; } #else UINT64 get_file_size64(FILE *f) { UINT64 result = invalid_file_size64; // 32bit platforms require _FILE_OFFSET_BITS = 64 to correctly return the size #if _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L || defined(__APPLE__) || defined(__FreeBSD__) struct stat st; if (0 == fstat(fileno(f), &st) && st.st_size <= (sizeof(st.st_size) >= 8 ? (off_t)0x7fffffffffffffffLL : LONG_MAX)) result = (UINT64) st.st_size; #else long cb, restoreseek = true; fpos_t orgpos; if (!restoreseek || 0 == fgetpos(f, &orgpos)) if (0 == fseek(f, 0, SEEK_END)) // Not fully portable! if ((cb = ftell(f)) != -1L) // This might not be correct for files in text mode! if (!restoreseek || 0 == fsetpos(f, &orgpos)) result = cb; #endif return result; } #endif UINT32 get_file_size32(FILE *f) { UINT32 result = invalid_file_size32; #if _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L struct stat st; if (0 == fstat(fileno(f), &st) && st.st_size <= (sizeof(st.st_size) >= 8 ? (off_t)0xffffffffUL : LONG_MAX)) result = (UINT32) st.st_size; #else UINT64 size64 = get_file_size64(f); if (size64 <= 0xffffffffUL && invalid_file_size64 != size64) result = (UINT32) size64; #endif return result; } UINT64 Platform_GetMaxFileSize() { #ifdef _WIN32 return ~(UINT64)0; #elif _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L || defined(__APPLE__) || defined(__FreeBSD__) struct stat st; if (sizeof(st.st_size) >= 8) { #ifdef LLONG_MAX return (UINT64)(off_t)LLONG_MAX; #endif const UINT64 sixthree = (~(UINT64)0) >> 1; return (off_t)sixthree > 0 ? sixthree : (UINT32)(off_t)0xffffffffUL; } return (UINT64)(off_t)LONG_MAX; #endif return (UINT)INT_MAX; } BYTE* alloc_and_read_file(FILE *f, unsigned long &size) { BYTE *result = 0, *mem = 0; if (!f) return result; UINT32 size32 = get_file_size32(f); mem = (invalid_file_size32 != size32) ? (BYTE*) malloc(size = size32) : 0; if (mem) if (0 == fseek(f, 0, SEEK_SET)) if (fread(mem, 1, size, f) == size) result = mem, mem = 0; free(mem); return result; } BYTE* alloc_and_read_file(const TCHAR *filepath, unsigned long &size) { BYTE *result = 0; FILE*f = FOPEN(filepath, ("rb")); if (f) { result = alloc_and_read_file(f, size); fclose(f); } return result; } void close_file_view(FILEVIEW&mmfv) { #ifdef _WIN32 if (mmfv.base) UnmapViewOfFile(mmfv.base); #else if (mmfv.base) munmap(mmfv.base, mmfv.size); #endif } char* create_file_view_readonly(const TCHAR *filepath, FILEVIEW&mmfv) { #ifdef _WIN32 return mmfv.base = CreateMappedFileView(filepath, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, PAGE_READONLY, FILE_MAP_READ, mmfv.size); #else return mmfv.base = CreateMappedFileView(filepath, "rb", PROT_READ, MAP_SHARED, mmfv.size); #endif } size_t write_octets_to_file(const TCHAR *filename, const void *data, size_t cb) { FILE *hfile = FOPEN(filename, ("wb")); if (!hfile) return 0; size_t ret = fwrite(data, 1, cb, hfile); fclose(hfile); return ret; } TCHAR* create_tempfile_path() { TCHAR *tfpath = NULL; #ifdef _WIN32 TCHAR buftmpdir[MAX_PATH], buf[MAX_PATH]; DWORD cch = GetTempPath(COUNTOF(buftmpdir), buftmpdir); if (cch && cch < COUNTOF(buftmpdir) && GetTempFileName(buftmpdir, _T("nst"), 0, buf)) tfpath = _tcsdup(buf); #else //! _WIN32 char narrowpath[] = ("/tmp/makensisXXXXXX"); const mode_t org_umask = umask(0077); int fd = mkstemp(narrowpath); umask(org_umask); if (fd != -1) { #ifdef _UNICODE assert(NSISRT_free_is_STDC_free()); tfpath = NSISRT_mbtowc(narrowpath); #else tfpath = _tcsdup(narrowpath); #endif close(fd); } #endif //~ _WIN32 return tfpath; } tstring get_full_path(const tstring &path) { #ifdef _WIN32 TCHAR real_path[1024], *fnpart; DWORD rc = GetFullPathName(path.c_str(), COUNTOF(real_path), real_path, &fnpart); assert(rc <= 1024); // path size is limited by MAX_PATH (260) assert(rc != 0); // rc==0 in case of error return tstring(real_path); #else // !_WIN32 tstring result; char *rpret = 0, *inputpath = NSISRT_ttombpath(path.c_str()); if (!inputpath) return tstring(path); #ifdef PATH_MAX static char buffer[PATH_MAX]; #else // !PATH_MAX #if _POSIX_C_SOURCE >= 200809L char *buffer = NULL; // realpath can malloc #else int path_max = pathconf(inputpath, _PC_PATH_MAX); if (path_max <= 0) path_max = 4096; char *buffer = (char *) malloc(path_max * sizeof(char)); if (buffer) #endif #endif // ~PATH_MAX { rpret = realpath(inputpath, buffer); } result = CtoTString(rpret ? rpret : inputpath); #ifndef PATH_MAX free(rpret ? rpret : buffer); #endif NSISRT_free(inputpath); return result; #endif // ~_WIN32 } tstring get_string_prefix(const tstring& str, const tstring& separator) { const tstring::size_type last_separator_pos = str.rfind(separator); if (last_separator_pos == string::npos) return str; return str.substr(0, last_separator_pos); } tstring get_string_suffix(const tstring& str, const tstring& separator) { const tstring::size_type last_separator_pos = str.rfind(separator); if (last_separator_pos == tstring::npos) return str; return str.substr(last_separator_pos + separator.size(), tstring::npos); } tstring get_dir_name(const tstring& path) { return get_string_prefix(path, PLATFORM_PATH_SEPARATOR_STR); // BUGBUG: Windows should support "\" and "/" } tstring get_file_name(const tstring& path) { return get_string_suffix(path, PLATFORM_PATH_SEPARATOR_STR); // BUGBUG: Windows should support "\" and "/" } tstring get_executable_path(const TCHAR* argv0) { #ifdef _WIN32 TCHAR temp_buf[MAX_PATH+1]; temp_buf[0] = _T('\0'); int rc = GetModuleFileName(NULL,temp_buf,MAX_PATH); assert(rc != 0); return tstring(temp_buf); #elif __APPLE__ char temp_buf[MAXPATHLEN+1]; unsigned int buf_len = MAXPATHLEN; int rc = Apple::_NSGetExecutablePath(temp_buf, &buf_len); assert(rc == 0); return tstring(CtoTString(temp_buf)); #else /* Linux/BSD/POSIX/etc */ char *path = NULL, *pathtmp; size_t len = 100; int nchars; while(1){ pathtmp = (char*)realloc(path,len+1); if (!pathtmp) { basic: free(path); // Note: Not using _tgetenv(_T("_")) here because it is not always set correctly. !makensis instruction in SVN r7372 will execute "/usr/bin/scons"! return get_full_path(argv0); } path = pathtmp; nchars = readlink("/proc/self/exe", path, len); if (nchars == -1) { goto basic; } if (nchars < (int) len) { path[nchars] = '\0'; tstring result; result = CtoTString(path); free(path); return result; } len *= 2; } #endif } tstring get_executable_dir(const TCHAR *argv0) { return get_dir_name(get_executable_path(argv0)); } tstring remove_file_extension(const tstring& path) { return get_string_prefix(path, _T(".")); } tstring& path_append_separator(tstring& path) { tstring::iterator ib = path.begin(), ie = path.end(); if (ib != ie && !IsPathSeparator(*--ie)) path += PLATFORM_PATH_SEPARATOR_STR; return path; } tstring& path_append(tstring& base, const TCHAR* more) { if (IsPathSeparator(*more)) ++more; return path_append_separator(base) += more; } static int PathGetDosDriveNumber(const TCHAR *p) { // Note: Unlike PathGetDriveNumber(), we require a path separator after the colon. if (p[0] && _T(':') == p[1] && IsAgnosticPathSeparator(p[2])) { const TCHAR loch = p[0]|32; if (loch >= _T('a') && loch <= _T('z')) return loch - _T('a'); } return -1; } bool IsWindowsPathRelative(const TCHAR *p) { if (_T('\\') == p[0]) return _T('\\') != p[1]; // Current drive relative, not (unverified) UNC return PathGetDosDriveNumber(p) < 0; } tstring replace_all(const TCHAR *str, const TCHAR *find, const TCHAR *repl) { tstring out = str; for (size_t cchF = _tcslen(find), cchR = _tcslen(repl), i = 0; ; i += cchR) if ((i = out.find(find, i)) == tstring::npos) return out; else out.replace(i, cchF, repl); } struct ToLower { TCHAR operator() (TCHAR c) const { return _totlower(c); } }; tstring lowercase(const tstring &str) { tstring result = str; transform(str.begin(), str.end(), result.begin(), ToLower()); return result; } void RawTStrToASCII(const TCHAR*in,char*out,UINT maxcch) { const bool empty = !maxcch; for(; maxcch && *in; --maxcch) *out++ = (char) *in++; if (!empty) *out = 0; } /* * ExpandoStrFmtVaList returns the number of characters written excluding * the \0 terminator or 0 on error. * realloc() is used on *ppMalloc if cchStack is not * large enough to hold the formatted string. */ size_t ExpandoStrFmtVaList(wchar_t*Stack, size_t cchStack, wchar_t**ppMalloc, const wchar_t*FmtStr, va_list Args) { #ifdef _WIN32 static size_t qlen = INT_MAX; // For _vsnwprintf, the \0 terminator is not part of the input size # if _MSC_VER < 1310 const bool have__vscwprintf = false; # define ExpandoStrFmtVaList_vsnwprintf(d,c,f,v) _vsnwprintf((d),(c)?(c)-1:0,(f),(v)) // Allow INT_MAX hack on MinGW and older versions of VC that don't have _vscwprintf # else const bool have__vscwprintf = true; # define ExpandoStrFmtVaList_vsnwprintf(d,c,f,v) ( INT_MAX==(c) ? _vscwprintf((f),(v)) : _vsnwprintf((d),(c)?(c)-1:0,(f),(v)) ) # endif #else const size_t qlen = INT_MAX; # define ExpandoStrFmtVaList_vsnwprintf vswprintf #endif #if defined(_ISOC99_SOURCE) || _POSIX_C_SOURCE >= 200112L const bool cansizecalc = true, msvcbackdoor = false; #else static char testedsizecalc = 0; if (!testedsizecalc) { #ifdef _WIN32 int cch = have__vscwprintf ? 0 : ExpandoStrFmtVaList_vsnwprintf(0, qlen = 0, L"333", Args); if (cch != 3) cch = ExpandoStrFmtVaList_vsnwprintf(0, qlen = INT_MAX, L"333", Args); // Is this actually necessary? Just set qlen = INT_MAX if have__vscwprintf? #else wchar_t testbuf[1+!0]; int cch = ExpandoStrFmtVaList_vsnwprintf(testbuf, COUNTOF(testbuf), L"333", Args); #endif testedsizecalc = (3 == cch) + 1; } #ifdef _WIN32 const bool msvcbackdoor = !!(testedsizecalc - 1), cansizecalc = false; #else const bool cansizecalc = !!(testedsizecalc - 1), msvcbackdoor = false; #endif #endif size_t &cchAvail = cchStack, cch; wchar_t *&dest = Stack, *mem = *ppMalloc; for(;;) { cch = ExpandoStrFmtVaList_vsnwprintf(dest, cchAvail, FmtStr, Args); if ((int)cch < 0) { cch = 0; if (cansizecalc) break; // vswprintf error, abort! if (msvcbackdoor) cchAvail = ExpandoStrFmtVaList_vsnwprintf(0, qlen, FmtStr, Args) + 1; else cchAvail = 4 * STD_MAX(cchAvail, (size_t)500); } else { if (cch < cchAvail) break; // We are done. cchAvail = ++cch; // cch from vswprintf did not include the \0 terminator } dest = mem = (wchar_t*) realloc(mem, cchAvail * sizeof(wchar_t)); if (!mem) return 0; } *ppMalloc = mem; return cch; } const TCHAR* GetFriendlySize(UINT64 n, unsigned int&fn, GETFRIENDLYSIZEFLAGS f) { static const TCHAR* scale[] = { _T(" bytes"), _T(" KiB"), _T(" MiB"), _T(" GiB"), _T(" TiB") }; unsigned char s = 0, accurate = f&GFSF_BYTESIFPOSSIBLE; while(n > ((s || !accurate) ? (1024*1024)-1 : UINT_MAX)) n /= 1024, ++s; fn = (unsigned int) n; if (!s) return (f&GFSF_HIDEBYTESCALE) ? _T("") : 1 == fn ? _T(" byte") : scale[s]; return s >= COUNTOF(scale) ? _T(" ?") : scale[s]; } #ifdef _WIN32 #ifdef _UNICODE int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain, bool ForceUTF8) { // We have to deliver the requested output encoding to our host (if any) and the // only way to do that is to convert the pipe content from what we hope is UTF-8. // The reason we need a pipe in the first place is because we cannot trust the // child to call GetConsoleOutputCP(), and even if we could, UTF-16 is not valid there. UINT cp = CP_UTF8, mbtwcf = MB_ERR_INVALID_CHARS, oemcp = GetOEMCP(); errno = ENOMEM; if (!cmdprefix) cmdprefix = L""; size_t cch1 = _tcslen(cmdprefix), cch2 = _tcslen(cmdmain); WCHAR *cmd = (WCHAR*) malloc( (cch1 + cch2 + 1) * sizeof(WCHAR) ); if (!cmd) return -1; _tcscpy(cmd, cmdprefix); _tcscat(cmd, cmdmain); SECURITY_DESCRIPTOR sd = { 1, 0, SE_DACL_PRESENT, NULL, }; SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, TRUE }; const UINT orgwinconcp = GetConsoleCP(), orgwinconoutcp = GetConsoleOutputCP(); if (orgwinconoutcp == oemcp && !ForceUTF8) cp = oemcp, mbtwcf = 0; // Bug #1092: Batch files not a fan of UTF-8 HANDLE hSIRd, hSIWr, hSORd, hSOWr; PROCESS_INFORMATION pi; if (!CreatePipe(&hSIRd, &hSIWr, &sa, 0)) // XCopy.exe does not work without a valid StdIn! hSIRd = hSIWr = INVALID_HANDLE_VALUE; BOOL ok = CreatePipe(&hSORd, &hSOWr, &sa, 0); if (!ok) hSORd = hSOWr = 0; else { STARTUPINFO si = {sizeof(si)}; si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = si.hStdError = hSOWr; si.hStdInput = hSIRd; errno = ECHILD; SetConsoleOutputCP(cp); ok = CreateProcess(0, cmd, 0, 0, TRUE, 0, 0, 0, &si, &pi); CloseHandle(hSOWr); // We want ERROR_BROKEN_PIPE when the child is done } free(cmd); DWORD childec = -1; if (ok) { bool fullbuf = false, utf8 = CP_UTF8 == cp, okt; char iobuf[512]; DWORD cbRead, cbOfs = 0, cchwb = 0, i; WCHAR wbuf[100], wchbuf[2+1]; // A surrogate pair + \0 for(;;) { BOOL okr = ReadFile(hSORd, iobuf+cbOfs, sizeof(iobuf)-cbOfs, &cbRead, 0); cbRead += cbOfs, cbOfs = 0; unsigned char cbTrail, cch; for(i = 0; i < cbRead;) { cch = 0; if (utf8) { okt = UTF8_GetTrailCount(iobuf[i], cbTrail); if (!okt) // Not UTF-8? Switching to a MBCS CP { switchcp: cp = orgwinconoutcp, mbtwcf = 0, utf8 = false; SetConsoleOutputCP(cp = (CP_UTF8 == cp ? CP_ACP : cp)); continue; } if (!cbTrail) cch++, wchbuf[0] = iobuf[i]; // ASCII } else { cbTrail = !!IsDBCSLeadByteEx(cp, iobuf[i]); } if (i+cbTrail >= cbRead) // Read more first? { memmove(iobuf, iobuf+i, cbOfs = cbRead - i); if (okr) break; else i = 0; } if (!cch) { cch = MultiByteToWideChar(cp, mbtwcf, &iobuf[i], 1+cbTrail, wchbuf, COUNTOF(wchbuf)-1); if (!cch) { if (utf8) goto switchcp; cch++, wchbuf[0] = UNICODE_REPLACEMENT_CHARACTER; } } i += 1+cbTrail; if (0xfeff == wchbuf[0] && 1 == cch) cch = 0; // MakeNsisW is not a fan of the BOM, eat it. if (!cch) continue; wbuf[cchwb++] = wchbuf[0]; if (--cch) wbuf[cchwb++] = wchbuf[1]; fullbuf = cchwb+cch >= COUNTOF(wbuf)-1; // cch is 1 for surrogate pairs if (!okr || fullbuf || L'\n' == wchbuf[0]) // Stop on \n so \r\n conversion has enough context (...\r\n vs ...\n) { finalwrite: #ifdef MAKENSIS extern WINSIO_OSDATA g_osdata_stdout; WinStdIO_OStreamWrite(g_osdata_stdout, wbuf, cchwb); // Faster than _ftprintf #else wbuf[cchwb] = L'\0'; _ftprintf(g_output, _T("%") NPRIs, wbuf); #endif cchwb = 0; } } if (!okr) { if (cchwb) goto finalwrite; // End of stream without a ending newline, write out the remaining data. break; } } fflush(g_output); WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &childec); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } SetConsoleCP(orgwinconcp), SetConsoleOutputCP(orgwinconoutcp); CloseHandle(hSIRd), CloseHandle(hSIWr); CloseHandle(hSORd); return childec; } #else int RunChildProcessRedirected(LPCSTR cmd, bool ForceUTF8) { STARTUPINFO si = { sizeof(STARTUPINFO), }; PROCESS_INFORMATION pi; if (!CreateProcess(NULL, const_cast(cmd), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return GetLastError(); WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &si.cb); CloseHandle(pi.hThread), CloseHandle(pi.hProcess); return (int) si.cb; } #endif //~ _UNICODE #endif //~ _WIN32 int sane_system(const TCHAR *command) { #ifdef _WIN32 // workaround for bug #1509909 // http://sf.net/tracker/?func=detail&atid=373085&aid=1509909&group_id=22049 // // cmd.exe /C has some weird handling for quotes. it strips // the surrounding quotes, if they exist. if there are quotes // around the program path and its arguments, it will strip // the outer quotes. this may result in something like: // `program files\nsis\makensis.exe" "args` // which obviously fails... // // to avoid the stripping, a harmless string is prefixed to the command line. const TCHAR*const prefix = _T("IF 1==1 "); #ifdef _UNICODE if (!command) return 0; else if (!*command) return 1; tstring fixedcmd = _tgetenv(_T("COMSPEC")); if (!fixedcmd.length()) fixedcmd = _T("CMD.EXE"); fixedcmd += _T(" /C "), fixedcmd += prefix; return RunChildProcessRedirected(fixedcmd.c_str(), command); #else tstring fixedcmd = prefix; fixedcmd += _T(""), fixedcmd += command; return _tsystem(fixedcmd.c_str()); #endif // ~_UNICODE #else // !_WIN32 #ifndef _UNICODE TCHAR* cmd = const_cast(command); PATH_CONVERT(cmd); return _tsystem(cmd); #else return NSISRT_wsystem(command); #endif #endif // ~_WIN32 } #ifdef _WIN32 bool GetFileSize64(HANDLE hFile, ULARGE_INTEGER &uli) { uli.LowPart = GetFileSize(hFile, &uli.HighPart); return INVALID_FILE_SIZE != uli.LowPart || !GetLastError(); } #endif //~ _WIN32 #if defined(_WIN32) && defined(_UNICODE) && defined(MAKENSIS) #include // for _get_osfhandle bool WINAPI WinStdIO_OStreamInit(WINSIO_OSDATA&osd, FILE*strm, WORD cp, int bom) { // bom < 0: override cp if UTF detected but never write BOM // bom = 0: ignore BOM and force cp // bom > 0: override cp if UTF detected, write BOM if it does not already exist const int fd = _fileno(strm); osd.mode = 0, osd.hCRT = strm, osd.hNative = (HANDLE) _get_osfhandle(fd); if (INVALID_HANDLE_VALUE == osd.hNative) return false; DWORD conmode; if (GetConsoleMode(osd.hNative, &conmode)) osd.mode++; else osd.mode--; bool succ = NStream::SetBinaryMode(fd); DWORD cbio = 0; ULARGE_INTEGER uli; if (succ && 0 != bom && GetFileSize64(osd.hNative, uli) && uli.QuadPart) { OVERLAPPED olap = {0}; // Used to read from start of file unsigned char bufbom[4]; if (ReadFile(osd.hNative, bufbom, sizeof(bufbom), &cbio, &olap)) { UINT detbom = DetectUTFBOM(bufbom, cbio); if (detbom) cp = (WORD) detbom, bom = 0; } SetFilePointer(osd.hNative, 0, 0, FILE_END); } osd.mustwritebom = bom > 0 && !cbio, osd.cp = cp; return succ || (sizeof(TCHAR) > 1 && WinStdIO_IsConsole(osd)); // Don't care about BOM for WriteConsoleW } bool WINAPI WinStdIO_OStreamWrite(WINSIO_OSDATA&osd, const wchar_t *Str, UINT cch) { if ((UINT)-1 == cch) cch = (UINT)_tcslen(Str); DWORD cbio; if (WinStdIO_IsConsole(osd)) return WriteConsoleW(osd.hNative, Str, cch, &cbio, 0) || !cch; NOStream strm(osd.hCRT); NStreamEncoding &enc = strm.StreamEncoding(); enc.SetCodepage(osd.cp); bool retval = false; if (osd.mustwritebom) { osd.mustwritebom = false; if (enc.IsUnicode() && !strm.WriteBOM(enc)) { osd.mode = 1, osd.hNative = 0; // Something is wrong, stop writing! goto end; } } retval = strm.WritePlatformNLString(Str, cch); end: strm.Detach(); return retval; } static WINSIO_OSDATA*WinStdIO_GetNativeStreamData(FILE*strm) { extern WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr; if (g_output == strm) return &g_osdata_stdout; return g_errout == strm ? &g_osdata_stderr : NULL; } int WINAPI WinStdIO_vfwprintf(FILE*strm, const wchar_t*Fmt, va_list val) { WINSIO_OSDATA*pOSD; if (Fmt && (pOSD = WinStdIO_GetNativeStreamData(strm))) { ExpandoString buf; errno = ENOMEM; const size_t cchfmt = buf.StrVFmt(Fmt, val, false); UINT cch = (UINT) cchfmt; assert(sizeof(size_t) <= 4 || cchfmt == cch); if (cch && !WinStdIO_OStreamWrite(*pOSD, buf, cch)) { cch = 0, errno = EIO; } return cch ? cch : (*Fmt ? -1 : 0); } return vfwprintf(strm, Fmt, val); } int WinStdIO_fwprintf(FILE*strm, const wchar_t*Fmt, ...) { va_list val; va_start(val, Fmt); int rv = _vftprintf(strm, Fmt, val); va_end(val); return rv; } int WinStdIO_wprintf(const wchar_t*Fmt, ...) { va_list val; va_start(val, Fmt); int rv = _vftprintf(g_output, Fmt, val); va_end(val); return rv; } static HANDLE NSISRT_FastGetConsoleScreenHandle() { extern WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr; return WinStdIO_IsConsole(g_osdata_stdout) ? g_osdata_stdout.hNative : g_osdata_stderr.hNative; } bool NSISRT_Initialize() // Init function for MakeNSIS Win32 { static bool inited = false; if (inited) return inited; extern WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr; g_osdata_stderr.mode = g_osdata_stdout.mode = 0, g_osdata_stderr.hNative = g_osdata_stdout.hNative = 0; return (inited = true); } #elif defined(_WIN32) #define NSISRT_FastGetConsoleScreenHandle NSISRT_GetConsoleScreenHandle bool NSISRT_Initialize() { return true; } // Init function for non-MakeNSIS Win32 (NSISRT_DEFINEGLOBALS sets g_output and g_errout) static HANDLE NSISRT_GetConsoleScreenHandle() { DWORD cm; HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); return GetConsoleMode(hCon, &cm) ? hCon : GetStdHandle(STD_ERROR_HANDLE); } #endif void PrintColorFmtErrMsg(const TCHAR *fmtstr, va_list args) { PrintColorFmtMsg_WARN(_T("")); // flush g_output SetPrintColorERR(); _vftprintf(g_errout, fmtstr, args), fflush(g_errout); ResetPrintColor(); } void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args) { #ifdef _WIN32 HANDLE hWin32Con = NSISRT_FastGetConsoleScreenHandle(); static INT32 contxtattrbak = -1; WORD txtattr = 0; if (contxtattrbak < 0) { if (-1 == contxtattrbak) { CONSOLE_SCREEN_BUFFER_INFO csbi; contxtattrbak = -2; if (GetConsoleScreenBufferInfo(hWin32Con, &csbi)) { contxtattrbak = csbi.wAttributes; goto gottxtattrbak; } } } else { gottxtattrbak: switch(type & 0xF) { case 0: goto resettxtattr; case 1: txtattr = FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED; break; case 2: txtattr = FOREGROUND_INTENSITY|FOREGROUND_RED; break; } // Use original background color if our text will still be readable if ((contxtattrbak & 0xF0) != (txtattr<<4)) txtattr |= (contxtattrbak & 0xF0); if ((txtattr & 0xFF) == 0xFE) txtattr &= ~FOREGROUND_INTENSITY; // BrightYellow on BrightWhite is hard to read SetConsoleTextAttribute(hWin32Con, txtattr); } #endif if (fmtstr) _vftprintf(g_output, fmtstr, args); fflush(g_output); #ifdef _WIN32 if (contxtattrbak >= 0 && !(0x10 & type)) { resettxtattr: SetConsoleTextAttribute(hWin32Con, contxtattrbak); } #endif } void FlushOutputAndResetPrintColor() { fflush(g_output); #ifdef _WIN32 PrintColorFmtMsg(0, NULL, (va_list)NULL); //va_list is just a pointer on windows so this is ok #endif } unsigned char Platform_SupportsUTF8Conversion() { static unsigned char cached = 0; if (0 == cached) cached = 1 + !!IsValidCodePage(CP_UTF8); return (cached - 1); } void *operator new(size_t size) NSIS_CXX_THROWSPEC(bad_alloc) { void *p = malloc(size); if (!p) throw bad_alloc(); return p; } void *operator new[](size_t size) NSIS_CXX_THROWSPEC(bad_alloc) { return operator new(size); } void operator delete(void *p) NSIS_CXX_NOEXCEPT() { if (p) free(p); } void operator delete [](void *p) NSIS_CXX_NOEXCEPT() { if (p) free(p); } nsis-3.11/Source/util.h000077500000000000000000000407021477201124000150040ustar00rootroot00000000000000/* * util.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/10/2007 */ #ifndef _UTIL_H_ #define _UTIL_H_ #include "tstring.h" // for std::string #include "boost/scoped_ptr.hpp" // for boost::scoped_ptr #include "ResourceEditor.h" #ifndef _WIN32 # include # include # include #endif #include #include static inline bool ui_add(unsigned int &r, unsigned int a, unsigned int b) { return (r = a + b) >= a; } static inline bool si_add(int &r, int a, int b) { unsigned int na = a < 0, aa = na ? a * -1 : a, nb = b < 0, ab = nb ? b * -1 : b, t = aa + ab, uz = 0; return na == nb && (t > INT_MAX || (~uz / 2 > INT_MAX && t < aa)) ? false : (r = a + b, true); // Good enough for our use } extern double my_wtof(const wchar_t *str); extern size_t my_strncpy(TCHAR*Dest, const TCHAR*Src, size_t cchMax); template bool strtrycpy(T*Dest, const T*Src, size_t cchCap) { size_t c = my_strncpy(Dest, Src, cchCap); return c < cchCap && !Src[c]; } size_t my_strftime(TCHAR *s, size_t max, const TCHAR *fmt, const struct tm *tm); template bool ChIsHex(T c) { return (c >= '0' && c <= '9') || ((c|32) >= 'a' && (c|32) <= 'f'); } // Adds the bitmap in filename using resource editor re as id id. // If width or height are specified it will also make sure the bitmap is in that size int update_bitmap(CResourceEditor* re, WORD id, const TCHAR* filename, int width=0, int height=0, int maxbpp=0); tstring make_friendly_resource_path(const TCHAR*rt, const TCHAR*rn, LANGID rl); TCHAR* create_tempfile_path(); tstring get_full_path(const tstring& path); tstring get_dir_name(const tstring& path); tstring get_file_name(const tstring& path); tstring get_executable_path(const TCHAR* argv0); tstring get_executable_dir(const TCHAR *argv0); tstring remove_file_extension(const tstring& path); tstring& path_append_separator(tstring& path); tstring& path_append(tstring& base, const TCHAR* more); inline tstring& path_append(tstring& base, const tstring& more) { return path_append(base, more.c_str()); } #ifdef _WIN32 #define IsPathSeparator IsAgnosticPathSeparator #else #define IsPathSeparator(c) ( PLATFORM_PATH_SEPARATOR_C == (c) ) #endif inline bool IsAgnosticPathSeparator(const TCHAR c) { return _T('\\') == c || _T('/') == c; } bool IsWindowsPathRelative(const TCHAR *p); tstring replace_all(const TCHAR*str, const TCHAR*find, const TCHAR* replace); tstring lowercase(const tstring&); tstring get_string_prefix(const tstring& str, const tstring& separator); tstring get_string_suffix(const tstring& str, const tstring& separator); void RawTStrToASCII(const TCHAR*in,char*out,UINT maxcch); size_t ExpandoStrFmtVaList(wchar_t*Stack, size_t cchStack, wchar_t**ppMalloc, const wchar_t*FmtStr, va_list Args); template class ExpandoString { T m_stack[S ? S : 1], *m_heap; public: ExpandoString() : m_heap(0) {} ~ExpandoString() { free(m_heap); } void Reserve(size_t cch) { if (S && cch <= S) return ; void *p = realloc(m_heap, cch * sizeof(T)); if (!p) throw std::bad_alloc(); m_heap = (T*) p; } size_t StrFmt(const T*f, ...) { va_list v; va_start(v, f); size_t r = StrVFmt(f, v); va_end(v); return r; } size_t StrVFmt(const T*FmtStr, va_list Args, bool throwonerr = true) { size_t n = ExpandoStrFmtVaList(m_stack, COUNTOF(m_stack), &m_heap, FmtStr, Args); if (throwonerr && !n && *FmtStr) throw std::bad_alloc(); return n; } T* GetPtr() { return m_heap ? m_heap : m_stack; } operator T*() { return GetPtr(); } }; typedef enum { GFSF_BYTESIFPOSSIBLE = 0x1, GFSF_HIDEBYTESCALE = 0x2, GFSF_DEFAULT = 0 } GETFRIENDLYSIZEFLAGS; const TCHAR* GetFriendlySize(UINT64 n, unsigned int&fn, GETFRIENDLYSIZEFLAGS f = GFSF_DEFAULT); class FriendlySize { const TCHAR* m_s; unsigned int m_n; public: FriendlySize(UINT64 n, size_t f = GFSF_DEFAULT) { Calculate(n, f); } void Calculate(UINT64 n, size_t f) { m_s = GetFriendlySize(n, m_n, (GETFRIENDLYSIZEFLAGS)f); } unsigned int UInt() const { return m_n; } const TCHAR* Scale() const { return m_s; } }; int sane_system(const TCHAR *command); template static size_t freadall(void*b, size_t cb, S*s) { return cb == fread(b, 1, cb, s) ? cb : 0; } template static inline size_t freadpod(T&b, S*s) { return freadall(b, sizeof(T), s); } struct CStdFileStreamOnMemory { typedef CStdFileStreamOnMemory S_t; BYTE*m_Base; size_t m_cb, m_pos; template CStdFileStreamOnMemory(T*p, size_t cb) : m_Base((BYTE*)p), m_cb(cb), m_pos(0) {} template static inline bool assignfp(fpos_t*p, V v) { if (sizeof(p) >= sizeof(v)) return (*(V*)p = v, true); UINT t = (UINT) v; return t == v && sizeof(p) >= sizeof(t) && assignfp(p, t); } template static inline void readfp(V&v, const fpos_t*p) { v = sizeof(p) >= sizeof(v) ? *(V*)p : *(UINT*)p; } friend inline size_t fclose(S_t*s) { return 0; } friend int fgetpos(S_t*s, fpos_t*pos) { return assignfp(pos, s->m_pos) ? 0 : 1; } friend int fsetpos(S_t*s, const fpos_t*pos) { size_t v; readfp(v, pos); return v < s->m_cb ? (s->m_pos = v, 0) : 1; } friend int fseek(S_t*s, long int offset, int origin) { if ((unsigned long) offset != (size_t) offset) return 1; // long int will usually fit in our size_t size_t newpos, invalid = 0; switch(origin) { case SEEK_SET: newpos = (size_t) offset, invalid = offset < 0; break; case SEEK_CUR: newpos = s->m_pos + offset; break; case SEEK_END: newpos = s->m_cb + offset; break; default: ++invalid; } if (!(invalid += s->m_cb <= newpos)) s->m_pos = newpos; return (int) invalid; } friend size_t fread(void*b, size_t e, size_t c, S_t*s) { size_t cb = e * c, endpos = s->m_pos + cb; if (endpos < s->m_pos || cb < c) return 0; // EOF/Overflow if (s->m_cb < endpos) cb = s->m_cb - s->m_pos; // EOF memcpy(b, s->m_Base + s->m_pos, cb); return (s->m_pos += cb, cb); } }; #define NSISRT_DEFINEGLOBALS() int g_display_errors=1; FILE *g_output=stdout, *g_errout=stderr void PrintColorFmtErrMsg(const TCHAR *fmtstr, va_list args); void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args); void FlushOutputAndResetPrintColor(); #ifdef _WIN32 #ifdef _UNICODE int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain, bool ForceUTF8 = false); inline int RunChildProcessRedirected(LPCWSTR cmd, bool ForceUTF8 = false) { return RunChildProcessRedirected(0, cmd, ForceUTF8); } #ifdef MAKENSIS typedef struct { HANDLE hNative; FILE*hCRT; WORD cp; signed char mode; // -1 = redirected, 0 = unknown, 1 = console bool mustwritebom; } WINSIO_OSDATA; inline bool WinStdIO_IsConsole(WINSIO_OSDATA&osd) { return osd.mode > 0; } inline bool WinStdIO_IsRedirected(WINSIO_OSDATA&osd) { return osd.mode < 0; } bool WINAPI WinStdIO_OStreamInit(WINSIO_OSDATA&osd, FILE*strm, WORD cp, int bom = 1); bool WINAPI WinStdIO_OStreamWrite(WINSIO_OSDATA&osd, const wchar_t *Str, UINT cch = -1); int WINAPI WinStdIO_vfwprintf(FILE*strm, const wchar_t*Fmt, va_list val); int WinStdIO_fwprintf(FILE*strm, const wchar_t*Fmt, ...); int WinStdIO_wprintf(const wchar_t*Fmt, ...); #ifndef _MSC_VER // our tchar.h already defined everything... #include // Make sure we include the CRTs tchar.h in case it is pulled in by something else later. #endif // We don't hook fflush since the native handle is only used with WriteConsoleW #undef _vsntprintf #define _vsntprintf Error: TODO #undef _tprintf #define _tprintf WinStdIO_wprintf #undef _ftprintf #define _ftprintf WinStdIO_fwprintf #undef _vftprintf #define _vftprintf WinStdIO_vfwprintf #endif // ~MAKENSIS #else int RunChildProcessRedirected(LPCSTR cmd, bool ForceUTF8 = false); #endif // ~_UNICODE #define ResetPrintColor() FlushOutputAndResetPrintColor() // For reset ONLY, use PrintColorFmtMsg(0,NULL ... #define SetPrintColorWARN() PrintColorFmtMsg(1|0x10, NULL, (va_list)NULL) #define SetPrintColorERR() PrintColorFmtMsg(2|0x10, NULL, (va_list)NULL) #else #define ResetPrintColor() #define SetPrintColorWARN() #define SetPrintColorERR() #endif // ~_WIN32 inline void PrintColorFmtMsg_WARN(const TCHAR *fmtstr, ...) { va_list val; va_start(val,fmtstr); PrintColorFmtMsg(1, fmtstr, val); va_end(val); } inline void PrintColorFmtMsg_ERR(const TCHAR *fmtstr, ...) { va_list val; va_start(val,fmtstr); PrintColorFmtErrMsg(fmtstr, val); va_end(val); } bool NSISRT_Initialize(); #define NSISRT_GetASCIICodepage() ( 1252 ) #ifndef _WIN32 // iconv const inconsistency workaround by Alexandre Oliva template inline size_t nsis_iconv_adaptor (size_t (*iconv_func)(iconv_t, T, size_t *, char**,size_t*), iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { return iconv_func (cd, (T)inbuf, inbytesleft, outbuf, outbytesleft); } const char* nsis_iconv_get_host_endian_ucs4_code(); bool nsis_iconv_reallociconv(iconv_t CD, char**In, size_t*cbInLeft, char**Mem, size_t&cbConverted); void create_code_page_string(char*buf, size_t len, UINT code_page); // Create iconv code from Windows codepage class iconvdescriptor { iconv_t m_cd; public: iconvdescriptor(iconv_t cd = (iconv_t)-1) : m_cd(cd) {} ~iconvdescriptor() { Close(); } void Close() { if ((iconv_t)-1 != m_cd) { iconv_close(m_cd); m_cd = (iconv_t)-1; } } bool Open(const char*tocode, const char*fromcode) { m_cd = iconv_open(tocode, fromcode); return (iconv_t)-1 != m_cd; } UINT Convert(void*inbuf, size_t*pInLeft, void*outbuf, size_t outLeft) { char *in = (char*) inbuf, *out = (char*) outbuf; size_t orgOutLeft = outLeft; size_t ret = nsis_iconv_adaptor(iconv, *this, &in, pInLeft, &out, &outLeft); if ((size_t)(-1) == ret) ret = 0, *pInLeft = 1; else ret = orgOutLeft - outLeft; return ret; } iconv_t GetDescriptor() const { return m_cd; } operator iconv_t() const { return m_cd; } static const char* GetHostEndianUCS4Code() { return nsis_iconv_get_host_endian_ucs4_code(); } }; BOOL IsDBCSLeadByteEx(unsigned int CodePage, unsigned char TestChar); TCHAR *CharPrev(const TCHAR *s, const TCHAR *p); char *CharNextA(const char *s); wchar_t *CharNextW(const wchar_t *s); char *CharNextExA(WORD codepage, const char *s, int flags); int wsprintf(TCHAR *s, const TCHAR *format, ...); int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, const wchar_t* lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar); int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, wchar_t* lpWideCharStr, int cchWideChar); BOOL IsValidCodePage(UINT CodePage); #ifdef _UNICODE #define CharNext CharNextW #else #define CharNext CharNextA #endif #define NSISRT_free_is_STDC_free() 1 // NSISRT_free == free #define NSISRT_free(p) ( free((void*)(p)) ) wchar_t* NSISRT_mbtowc(const char *Str); char* NSISRT_wctomb(const wchar_t *Str); char* NSISRT_wctombpath(const wchar_t *Path); char* NSISRT_ttombpath(const TCHAR *Path); const char* NSISRT_setlocale_wincp(int cat, unsigned int cp); int _wcsicmp(const wchar_t *a, const wchar_t *b); int _wcsnicmp(const wchar_t *a, const wchar_t *b, size_t n); long _wtol(const wchar_t *s); int _wtoi(const wchar_t *s); int _swprintf(wchar_t *d, const wchar_t *f, ...); wchar_t* _wcsdup(const wchar_t *s); wchar_t* _wgetenv(const wchar_t *wname); int _wremove(const wchar_t *Path); #define _wunlink _wremove // BUGBUG: This is not 100% correct, _wremove can also call rmdir int _wchdir(const wchar_t *Path); int _wstat(const wchar_t *Path, struct stat *pS); TCHAR *my_convert(const TCHAR *path); void my_convert_free(TCHAR *converted_path); int my_open(const TCHAR *pathname, int flags); #define OPEN(a, b) my_open(a, b) #else // _WIN32 bool GetFileSize64(HANDLE hFile, ULARGE_INTEGER &uli); #define my_convert(x) (x) #define my_convert_free(x) #define OPEN(a, b) _topen(a, b) #endif //~ _WIN32 FILE* my_fopen(const TCHAR *path, const char *mode); #define FOPEN(a, b) my_fopen((a), (b)) int ptrtostr(const void* Src, TCHAR*Dst); void* strtoptr(const TCHAR*Src); template T strtoptr(const TCHAR*Src, T&Dst) { return Dst = (T) strtoptr(Src); } UINT64 Platform_GetMaxFileSize(); const UINT32 invalid_file_size32 = ~ (UINT32) 0; UINT32 get_file_size32(FILE *f); const UINT64 invalid_file_size64 = ~ (UINT64) 0; UINT64 get_file_size64(FILE *f); BYTE* alloc_and_read_file(FILE *f, unsigned long &size); BYTE* alloc_and_read_file(const TCHAR *filepath, unsigned long &size); typedef struct { char*base; size_t size; } FILEVIEW; void close_file_view(FILEVIEW&mmfv); char* create_file_view_readonly(const TCHAR *filepath, FILEVIEW&mmfv); size_t write_octets_to_file(const TCHAR *filename, const void *data, size_t cb); // round a value up to be a multiple of 512 // assumption: T is an int type template inline T align_to_512(const T x) { return (x+511) & ~511; } template inline T read_ptr_as(const void*p) { #if defined(_MSC_VER) && (_MSC_VER-0 < 1400) // TODO: Figure out which versions are able to optimize the memcpy return *(T*)(p); #else T t; memcpy(&t, p, sizeof(T)); return t; #endif } // some values need to be truncated from size_t to [unsigned] int, using this function is better than a plain cast template inline R internaltruncate_cast(T t) { assert((~((T)0)) > T(0)); // Only unsigned types supported right now if (sizeof(T) > sizeof(R)) assert(t <= (T)(~((R)0))); // BUGBUG: What if R is a signed type? return (R) t; } template inline R debugtruncate_cast(T t,const char*f,unsigned int l) { #ifdef MAKENSIS if (sizeof(T) > sizeof(R) && !( (t <= (T)(~((R)0))) )) { _tprintf(_T("unsafe truncate_cast: %") NPRIns _T(":%u\n"),f,l); if (sizeof(T) <= sizeof(void*)) _tprintf(_T("\t%ph > %ph\n"),(void*)(UINT_PTR)(t),(void*)(UINT_PTR)(~((R)0))); } #endif return internaltruncate_cast(t); } #if defined(DEBUG) || defined(_WIN64) // Always enabled for experimental 64-bit builds #define truncate_cast(ret_t,input) debugtruncate_cast((input),__FILE__,__LINE__) #else #define truncate_cast(ret_t,input) internaltruncate_cast((input)) #endif // ================ // ResourceManagers // ================ // When a ResourceManager instance goes out of scope, it will run // _FREE_RESOURCE on the resource. // Example use: // int fd = open(..); // assert(fd != -1); // MANAGE_WITH(fd, close); class BaseResourceManager { protected: BaseResourceManager() {} public: virtual ~BaseResourceManager() {} }; template class ResourceManager : public BaseResourceManager { public: ResourceManager(_RESOURCE& resource) : m_resource(resource) {} virtual ~ResourceManager() { m_free_resource(m_resource); }; private: // members _RESOURCE& m_resource; _FREE_RESOURCE m_free_resource; private: // don't copy instances ResourceManager(const ResourceManager&); void operator=(const ResourceManager&); }; #define RM_MANGLE_FREEFUNC(freefunc) __free_with_##freefunc #define RM_DEFINE_FREEFUNC(freefunc) \ struct RM_MANGLE_FREEFUNC(freefunc) { \ template void operator()(T& x) { freefunc(x); } \ } typedef boost::scoped_ptr ResourceManagerPtr; template void createResourceManager(_RESOURCE& resource, ResourceManagerPtr& ptr) { ptr.reset(new ResourceManager<_RESOURCE, _FREE_RESOURCE>(resource)); } #define RM_MANGLE_RESOURCE(resource) resource##_autoManager #define MANAGE_WITH(resource, freefunc) \ ResourceManagerPtr RM_MANGLE_RESOURCE(resource); \ createResourceManager( \ resource, RM_MANGLE_RESOURCE(resource)) // Add more resource-freeing functions here when you need them RM_DEFINE_FREEFUNC(close); RM_DEFINE_FREEFUNC(CloseHandle); RM_DEFINE_FREEFUNC(fclose); RM_DEFINE_FREEFUNC(free); RM_DEFINE_FREEFUNC(my_convert_free); // Auto path conversion #ifndef _WIN32 # define PATH_CONVERT(x) x = my_convert(x); MANAGE_WITH(x, my_convert_free); #else # define PATH_CONVERT(x) #endif // Platform detection inline bool Platform_IsBigEndian() { return FIX_ENDIAN_INT16(0x00ff) != 0x00ff; } unsigned char Platform_SupportsUTF8Conversion(); #ifdef _WIN32 #define Platform_IsWindows() ( !0 ) #else #define Platform_IsWindows() ( 0 ) #endif #endif //_UTIL_H_ nsis-3.11/Source/validateunicode.cpp000077500000000000000000000107761477201124000175320ustar00rootroot00000000000000// validateunicode.cpp // // This file is a part of Unicode NSIS. // // Copyright (C) 2009-2025 Jim Park // // Licensed under the zlib/libpng license (the "License"); // you may not use this file except in compliance with the License. // // This software is provided 'as-is', without any expressed or implied // warranty. // // This class can be used to check a buffer to see if it has the expected // Unicode encoding and look for byte order marks. #ifdef _UNICODE #include "validateunicode.h" #include int CValidateUnicode::ValidateUTF8(unsigned char* buf, size_t characters) { bool hasNonAscii = false; int bytesToFollow = 0; for ( ; characters != 0 ; --characters) { unsigned char ch = *buf++; if (bytesToFollow != 0) // in the middle of a multi-byte sequence? { if ((ch & 0xC0) != 0x80) return 0; // we expected a continuation byte hasNonAscii = true; --bytesToFollow; } else if (ch & 0x80) { if ((ch & 0xC0) == 0x80) return 0; // continuation byte outside multi-byte sequence else if ((ch & 0xE0) == 0xC0) bytesToFollow = 1; else if ((ch & 0xF0) == 0xE0) bytesToFollow = 2; else if ((ch & 0xF8) == 0xF0) bytesToFollow = 3; else return 0; // byte is invalid UTF-8 (outside RFC 3629) } else if (ch == 0 && characters != 1) return 0; // NUL character in the middle of the buffer } if (bytesToFollow != 0) return 0; // end of buffer in the middle of a multi-byte sequence return hasNonAscii ? 2 : 1; } bool CValidateUnicode::ValidateUTF16LE(unsigned char* buf, size_t bytes) { // We need to make sure the endianness matches the processor. // Intel x86 is little endian. return ValidateUTF16((unsigned short*)(buf), bytes/2); } bool CValidateUnicode::ValidateUTF16BE(unsigned char* buf, size_t bytes) { std::vector correctedBuf(bytes/2); for (size_t i = 0; i < bytes; i += 2) { correctedBuf[i/2] = buf[i] << 8 | buf[i+1]; } return ValidateUTF16(&correctedBuf[0], correctedBuf.size()); } bool CValidateUnicode::ValidateUTF16(unsigned short* buf, size_t characters) { unsigned short ch; bool valid = true; while (valid && characters > 0) { // Last character may be 0. if ((ch = *buf) == 0 && characters != 1) { valid = false; } else if (ch >= 0xd800 && ch <= 0xdbff) { unsigned short trailing = *(++buf); --characters; // Unpaired leading surrogate found? if (trailing < 0xdc00 || trailing > 0xdfff) { valid = false; } // Invalid surrogate pairs found? else if ((ch == 0xd83f || ch == 0xd87f || ch == 0xd8bf || ch == 0xd8ff || ch == 0xd93f || ch == 0xd97f || ch == 0xd9bf || ch == 0xd9ff || ch == 0xda3f || ch == 0xdA7f || ch == 0xdabf || ch == 0xdaff || ch == 0xdb3f || ch == 0xdb7f || ch == 0xdbbf || ch == 0xdbff) && (trailing == 0xdffe || trailing == 0xdfff)) { valid = false; } } // Unpaired trailing surrogate! else if (ch >= 0xdc00 && ch <= 0xdfff) { valid = false; } // Invalid values else if (ch == 0xfffe || ch == 0xffff || (ch >= 0xfdd0 && ch <= 0xfdef)) { valid = false; } ++buf; --characters; } return valid; } CValidateUnicode::FILE_TYPE CValidateUnicode::CheckBOM( unsigned char* buf, size_t bytes) { FILE_TYPE result = UNKNOWN; if (bytes >= 2) { if (buf[0] == 0xff && buf[1] == 0xfe) { result = UTF_16LE; } else if (buf[0] == 0xfe && buf[1] == 0xff) { result = UTF_16BE; } else if (bytes >= 3 && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf) { result = UTF_8; } else if (bytes >= 4) { if (buf[0] == 0 && buf[1] == 0 && buf[2] == 0xfe && buf[3] == 0xff) { result = UTF_32BE; } else if (buf[0] == 0xff && buf[1] == 0xfe && buf[2] == 0 && buf[3] == 0) { result = UTF_32LE; } } } return result; } const TCHAR* CValidateUnicode::TypeToName(CValidateUnicode::FILE_TYPE ftype) { static const TCHAR* names[] = { _T("UTF-8"), _T("UTF-16LE"), _T("UTF-16BE"), _T("UTF-32LE"), _T("UTF-32BE"), _T("UNKNOWN") }; return names[ftype]; } #endif nsis-3.11/Source/validateunicode.h000077500000000000000000000032441477201124000171670ustar00rootroot00000000000000// validateunicode.h // // This file is a part of Unicode NSIS. // // Copyright (C) 2009-2025 Jim Park // // Licensed under the zlib/libpng license (the "License"); // you may not use this file except in compliance with the License. // // This software is provided 'as-is', without any expressed or implied // warranty. // // This class can be used to check a buffer to see if it has the expected // Unicode encoding and look for byte order marks. #ifndef _VALIDATEUNICODE_ #define _VALIDATEUNICODE_ #include "tchar.h" #include class CValidateUnicode { public: // Enum type for each Unicode encoding. enum FILE_TYPE { UTF_8 = 0, UTF_16LE, UTF_16BE, UTF_32LE, UTF_32BE, UNKNOWN }; // Make sure that the buffer contains valid UTF-8 encoding. static int ValidateUTF8(unsigned char* buf, size_t characters); // Make sure that the buffer contains valid UTF-16LE encoding. static bool ValidateUTF16LE(unsigned char* buf, size_t bytes); // Make sure that the buffer contains valid UTF-16BE encoding. static bool ValidateUTF16BE(unsigned char* buf, size_t bytes); // Make sure that the buffer contains valid UTF-16 encoding. static bool ValidateUTF16(unsigned short* buf, size_t characters); // Does the buffer have a byte order mark? And if so, what does it say? static FILE_TYPE CheckBOM(unsigned char* buf, size_t bytes); // Convert a FILE_TYPE enum to a string. static const TCHAR* TypeToName(FILE_TYPE ftype); protected: // Given the initial byte of a UTF-8 character, how many bytes are to // follow? static int GetBytesToFollow(unsigned char ch); }; #endif nsis-3.11/Source/winchar.cpp000077500000000000000000000057251477201124000160230ustar00rootroot00000000000000/* * winchar.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #include "Platform.h" #include "winchar.h" #include "util.h" #include "utf.h" #include #include using std::runtime_error; int WinWStrICmpASCII(const WINWCHAR *a, const char *b) { int diff = 0; do diff = static_cast(S7ChLwr(*a)) - static_cast(S7ChLwr(*b++)); while (*a++ && !diff); return diff; } int WinWStrNICmpASCII(const WINWCHAR *a, const char *b, size_t n) { int diff = 0; for ( ; n--; ++a, ++b ) { diff = static_cast(S7ChLwr(*a)) - static_cast(S7ChLwr(*b)); if (diff || !*a) break; } return diff; } WINWCHAR* WinWStrDupFromChar(const char *s, unsigned int cp) { int cch = MultiByteToWideChar(cp, 0, s, -1, 0, 0); wchar_t *p = (wchar_t*) malloc(cch * sizeof(wchar_t)); if (p) { MultiByteToWideChar(cp, 0, s, -1, p, cch); #ifndef _WIN32 wchar_t *p2 = (wchar_t*) WinWStrDupFromWC(p); free(p), p = p2; #endif } return (WINWCHAR*) p; } #ifndef _WIN32 size_t WinWStrLen(const WINWCHAR *s) { #ifdef MAKENSIS // Only makensis implements all the functions in utf.cpp return StrLenUTF16(s); #else return sizeof(wchar_t) == 2 ? wcslen((wchar_t*)s) : InlineStrLenUTF16(s); #endif } WINWCHAR* WinWStrCpy(WINWCHAR *d, const WINWCHAR *s) { WINWCHAR *ret = d; while (*s) *d++ = *s++; *d = 0; return ret; } WINWCHAR* WinWStrNCpy(WINWCHAR *d, const WINWCHAR *s, size_t n) { WINWCHAR *ret = d; while (n && *s) *d++ = *s++, n--; while (n--) *d++ = 0; return ret; } int WinWStrCmp(const WINWCHAR *a, const WINWCHAR *b) { int diff = 0; do diff = static_cast(*a) - static_cast(*b++); while (*a++ && !diff); return diff; } WINWCHAR* WinWStrDupFromWinWStr(const WINWCHAR *s) { WINWCHAR *d = (WINWCHAR*) malloc((WinWStrLen(s) + 1) * sizeof(WINWCHAR)); if (d) WinWStrCpy(d, s); assert(!d || !IS_INTRESOURCE(d)); // DialogTemplate strings can be ATOMs return d; } WINWCHAR* WinWStrDupFromWC(const wchar_t *s) { #ifdef MAKENSIS WCToUTF16LEHlpr cnv; if (!cnv.Create(s)) throw runtime_error("Unicode conversion failed"); return (WINWCHAR*) cnv.Detach(); #else // NOTE: Anything outside the ASCII range will not convert correctly! size_t cch = wcslen(s); WINWCHAR* p = (WINWCHAR*) malloc(++cch * 2); if (p) for (size_t i = 0; i < cch; ++i) p[i] = FIX_ENDIAN_INT16(s[i]); return p; #endif } int WinWStrToInt(const WINWCHAR *s) { unsigned int v = 0, base = 10, top = '9'; int sign = 1; if (*s == _T('-')) ++s, sign = -1; for ( unsigned int c;; ) { if ((c = *s++) >= '0' && c <= top) c -= '0'; else break; v *= base, v += c; } return ((int)v) * sign; } #endif // ~!_WIN32 nsis-3.11/Source/winchar.h000077500000000000000000000044761477201124000154720ustar00rootroot00000000000000/* * winchar.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. */ #ifndef INC_NSIS_WINCHAR #define INC_NSIS_WINCHAR #include "Platform.h" #define MAKEINTRESOURCEWINW(i) ( (WINWCHAR*) MAKEINTRESOURCEW(i) ) int WinWStrICmpASCII(const WINWCHAR *a, const char *b); int WinWStrNICmpASCII(const WINWCHAR *a, const char *b, size_t n); #ifdef _WIN32 inline size_t WinWStrLen(const WINWCHAR *s) { return wcslen((wchar_t*)s); } inline WINWCHAR* WinWStrCpy(WINWCHAR *d, const WINWCHAR *s) { return (WINWCHAR*)wcscpy((wchar_t*)d, (wchar_t*)s); } inline WINWCHAR* WinWStrNCpy(WINWCHAR *d, const WINWCHAR *s, size_t n) { return (WINWCHAR*)wcsncpy((wchar_t*)d, (wchar_t*)s, n); } inline int WinWStrCmp(const WINWCHAR *a, const WINWCHAR *b) { return wcscmp((wchar_t*)a, (wchar_t*)b); } inline WINWCHAR* WinWStrDupFromWinWStr(const WINWCHAR *s) { return (WINWCHAR*)wcsdup((wchar_t*)s); } inline WINWCHAR* WinWStrDupFromWC(const wchar_t *s) { return WinWStrDupFromWinWStr((WINWCHAR*)s); } inline int WinWStrToInt(const WINWCHAR *s) { return _wtoi((wchar_t*)s); } #else // !_WIN32 size_t WinWStrLen(const WINWCHAR *s); WINWCHAR* WinWStrCpy(WINWCHAR *d, const WINWCHAR *s); WINWCHAR* WinWStrNCpy(WINWCHAR *d, const WINWCHAR *s, size_t n); int WinWStrCmp(const WINWCHAR *a, const WINWCHAR *b); WINWCHAR* WinWStrDupFromWinWStr(const WINWCHAR *s); WINWCHAR* WinWStrDupFromWC(const wchar_t *s); int WinWStrToInt(const WINWCHAR *s); #endif // ~_WIN32 WINWCHAR* WinWStrDupFromChar(const char *s, unsigned int cp); inline WINWCHAR* WinWStrDupFromChar(const char *s) { return WinWStrDupFromChar(s, CP_ACP); } #ifdef _UNICODE inline WINWCHAR* WinWStrDupFromTChar(const wchar_t *s) { return WinWStrDupFromWC(s); } inline WINWCHAR* WinWStrDupFromTChar(const wchar_t *s, unsigned int codepage) { return WinWStrDupFromTChar(s); } #else inline WINWCHAR* WinWStrDupFromTChar(const char *s, unsigned int cp) { return WinWStrDupFromChar(s, cp); } inline WINWCHAR* WinWStrDupFromTChar(const char *s) { return WinWStrDupFromChar(s, CP_ACP); } #endif #endif // ~INC_NSIS_WINCHAR nsis-3.11/Source/writer.cpp000077500000000000000000000062331477201124000156770ustar00rootroot00000000000000/* * writer.cpp * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #include "exehead/config.h" #include "writer.h" #include "growbuf.h" #include "util.h" #include #include #include #include "tchar.h" void writer_sink::write_byte(const unsigned char b) { write_data(&b, 1); } void writer_sink::write_short(const short s) { short fs = FIX_ENDIAN_INT16(s); write_data(&fs, sizeof(short)); } void writer_sink::write_int(const int i) { int fi = FIX_ENDIAN_INT32(i); write_data(&fi, sizeof(int)); } void writer_sink::write_int64(const INT64 i) { INT64 fi = FIX_ENDIAN_INT64(i); write_data(&fi, sizeof(INT64)); } void writer_sink::write_int_array(const int i[], const size_t len) { for (size_t l = 0; l < len; l++) { write_int(i[l]); } } // size in this case is the length of the string to write. void writer_sink::write_string(const TCHAR *s, size_t size) { #ifdef _UNICODE if (m_ti.is_unicode()) { bool strEnd = false; TCHAR ch = L'\0'; for (; size ; size--) { if (!strEnd) { ch = *s++; if (ch == _T('\0')) strEnd = true; } write_short(ch); } } else { char *wb = new char[size]; memset(wb, 0, size); WideCharToMultiByte(CP_ACP, 0, s, -1, wb, (int)size, NULL, NULL); write_data(wb, size); delete [] wb; } #else //TODO: Why does this allocate memory? It could just write the string and a manual zero character? char *wb = new char[size]; memset(wb, 0, size); strncpy(wb, s, size); write_data(wb, size); delete [] wb; #endif } void writer_sink::write_growbuf(const IGrowBuf *b) { write_data(b->get(), b->getlen()); } namespace hlp { template static inline bool issigned() { return T(-1) < T(0); } template static inline bool issigned(const T&t) { return issigned(); } } void growbuf_writer_sink::write_data(const void *data, const size_t size) { // TODO: Replace all of this with a simple call when GrowBuf is changed to use size_t if (sizeof(size) == sizeof(sink_type::size_type) && hlp::issigned(size) == hlp::issigned()) { m_buf->add(data, truncate_cast(sink_type::size_type, size)); } else { size_t left = size; sink_type::size_type cbmaxadd = INT_MAX, cb; for (char *p = (char *) data; left; p += cb, left -= cb) { cb = left >= (size_t) cbmaxadd ? cbmaxadd : (sink_type::size_type) left; m_buf->add(p, cb); } } } void file_writer_sink::write_data(const void *data, const size_t size) { if (fwrite(data, 1, size, m_fp) != size) { throw std::runtime_error("error writing"); } } #ifdef NSIS_CONFIG_CRC_SUPPORT #include "crc32.h" void crc_writer_sink::write_data(const void *data, const size_t size) { *m_crc = CRC32(*m_crc, (const unsigned char *) data, size); } #endif nsis-3.11/Source/writer.h000077500000000000000000000047071477201124000153500ustar00rootroot00000000000000/* * writer.h * * This file is a part of NSIS. * * Copyright (C) 1999-2025 Nullsoft and Contributors * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. * * Licence details can be found in the file COPYING. * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/13/2007 */ #ifndef ___WRITER__H___ #define ___WRITER__H___ #include "exehead/config.h" #include "growbuf.h" #include "crc32.h" #include #include "tchar.h" class writer_target_info { public: writer_target_info(bool Unicode = 0, bool Cpu64 = 0) { m_f = (Unicode ? F_U : 0) | (Cpu64 ? F_64 : 0); } bool is_unicode() const { return !!(m_f & F_U); } bool is_64bit() const { return !!(m_f & F_64); } protected: enum { F_U = 0x01, F_64 = 0x80 }; BYTE m_f; }; class writer_sink { public: writer_sink(const writer_target_info&ti) : m_ti(ti) {} virtual ~writer_sink() {} virtual void write_byte(const unsigned char b); virtual void write_short(const short s); virtual void write_int(const int i); virtual void write_int64(const INT64 i); virtual void write_int_array(const int i[], const size_t len); virtual void write_string(const TCHAR *s, size_t size); virtual void write_growbuf(const IGrowBuf *b); virtual void write_data(const void *data, const size_t size) = 0; virtual const writer_target_info& get_target_info() const { return m_ti; } protected: writer_target_info m_ti; }; class writer { public: writer(writer_sink *sink) : m_sink(sink) {} virtual ~writer() {} protected: writer_sink *m_sink; }; class growbuf_writer_sink : public writer_sink { public: typedef IGrowBuf sink_type; growbuf_writer_sink(sink_type *buf, const writer_target_info&ti) : writer_sink(ti), m_buf(buf) { } virtual void write_data(const void *data, const size_t size); private: sink_type *m_buf; }; class file_writer_sink : public writer_sink { public: file_writer_sink(FILE *fp, const writer_target_info&ti) : writer_sink(ti), m_fp(fp) {} virtual void write_data(const void *data, const size_t size); private: FILE *m_fp; }; #ifdef NSIS_CONFIG_CRC_SUPPORT class crc_writer_sink : public writer_sink { public: crc_writer_sink(crc32_t *crc) : writer_sink(writer_target_info()), m_crc(crc) {} virtual void write_data(const void *data, const size_t size); private: crc32_t *m_crc; }; #endif #endif//!___WRITER__H___ nsis-3.11/Source/zlib/000077500000000000000000000000001477201124000146105ustar00rootroot00000000000000nsis-3.11/Source/zlib/INFBLOCK.C000077500000000000000000000533171477201124000161170ustar00rootroot00000000000000/* * This file is a part of the zlib compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.zlib.net/ * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/27/2007 * All messages and true strings turned into TCHARs for when we * create viewable messages. */ #include "../Platform.h" #include "../exehead/config.h" #include "ZUTIL.H" #ifndef min # define min(x,y) ((xbitb=b;s->bitk=k;} #define UPDIN {z->avail_in=n;z->next_in=p;} #define UPDOUT {s->write=q;} #define UPDATE {UPDBITS UPDIN UPDOUT} #define LEAVE(r) {UPDATE inflate_flush(z); return r;} /* get bytes and bits */ #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} #define NEEDBYTE {if(!n)LEAVE(Z_OK)} #define NEXTBYTE (n--,*p++) #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<>=(j);k-=(j);} /* output bytes */ #define WAVAIL (uInt)(qread?s->read-q-1:s->end-q) #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} #define FLUSH {UPDOUT inflate_flush(z); LOADOUT} #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE(Z_OK)}}} #define OUTBYTE(a) {*q++=(Byte)(a);m--;} /* load local pointers */ #define LOAD {LOADIN LOADOUT} #define LAST (s->last == DRY) #define FIXEDH 544 /* number of hufts used by fixed tables */ typedef struct inflate_blocks_state FAR inflate_blocks_statef; #define exop word.what.Exop #define bits word.what.Bits /* And'ing with mask[n] masks the lower n bits */ local unsigned short inflate_mask[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; // use to reduce .data #define INFLATE_MASK(x, n) (x & (~((unsigned short) 0xFFFF << n))) local const char border[] = { /* Order of the bit length code lengths */ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Tables for deflate from PKZIP's appnote.txt. */ local const unsigned short cplens[31] = { /* Copy lengths for literal codes 257..285 */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; /* see note #13 above about 258 */ local const unsigned short cplext[31] = { /* Extra bits for literal codes 257..285 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ local const unsigned short cpdist[30] = { /* Copy offsets for distance codes 0..29 */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; local const unsigned short cpdext[30] = { /* Extra bits for distance codes */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; /* build fixed tables only once--keep them here */ local char fixed_built = 0; local inflate_huft fixed_mem[FIXEDH]; local uInt fixed_bl=9; local uInt fixed_bd=5; local inflate_huft *fixed_tl; local inflate_huft *fixed_td; /* copy as much as possible from the sliding window to the output area */ local void ZEXPORT inflate_flush(z) z_streamp z; { inflate_blocks_statef *s = &z->blocks; uInt n; Bytef *q; /* local copies of source and destination pointers */ q = s->read; again: /* compute number of bytes to copy as far as end of window */ n = (uInt)((q <= s->write ? s->write : s->end) - q); n = min(n, z->avail_out); /* update counters */ z->avail_out -= n; //z->total_out += n; /* copy as far as end of window */ zmemcpy(z->next_out, q, n); z->next_out += n; q += n; /* see if more to copy at beginning of window */ if (q == s->end) { /* wrap pointers */ q = s->window; if (s->write == s->end) s->write = s->window; /* do the same for the beginning of the window */ goto again; } /* update pointers */ s->read = q; } #define BMAX 15 /* maximum bit length of any code */ local int ZEXPORT huft_build( uIntf *b, /* code lengths in bits (all assumed <= BMAX) */ uInt n, /* number of codes (assumed <= 288) */ uInt s, /* number of simple-valued codes (0..s-1) */ const unsigned short *d, /* list of base values for non-simple codes */ const unsigned short *e, /* list of extra bits for non-simple codes */ inflate_huft * FAR *t, /* result: starting table */ uIntf *m, /* maximum lookup bits, returns actual */ inflate_huft *hp, /* space for trees */ uInt *hn) /* working area: values in order of bit length */ { static uIntf v[288]; /* work area for huft_build */ uInt a; /* counter for codes of length k */ uInt c[BMAX+1]; /* bit length count table */ uInt f; /* i repeats in table every f entries */ int g; /* maximum code length */ int h; /* table level */ uInt i; /* counter, current code */ uInt j; /* counter */ int k; /* number of bits in current code */ int l; /* bits per table (returned in m) */ uIntf *p; /* pointer into c[], b[], or v[] */ inflate_huft *q; /* points to current table */ struct inflate_huft_s r; /* table entry for structure assignment */ inflate_huft *u[BMAX]; /* table stack */ int w; /* bits before this table == (l * h) */ uInt x[BMAX+1]; /* bit offsets, then code stack */ uIntf *xp; /* pointer into x */ int y; /* number of dummy codes added */ uInt z; /* number of entries in current table */ #ifdef __GNUC__ r.base = 0; // Avoid GCC "may be used uninitialized in this function" warning #endif /* Generate counts for each bit length */ p=c; y=16; while (y--) *p++ = 0; p = b; i = n; do { c[*p++]++; /* assume all entries <= BMAX */ } while (--i); if (c[0] == n) /* null input--all zero length codes */ { *t = (inflate_huft *)Z_NULL; *m = 0; return Z_OK; } /* Find minimum and maximum length, bound *m by those */ l = *m; for (j = 1; j <= BMAX; j++) if (c[j]) break; k = j; /* minimum code length */ if ((uInt)l < j) l = j; for (i = BMAX; i; i--) if (c[i]) break; g = i; /* maximum code length */ if ((uInt)l > i) l = i; *m = l; /* Adjust last length count to fill out codes, if needed */ for (y = 1 << j; j < i; j++, y <<= 1) if ((y -= c[j]) < 0) return Z_DATA_ERROR; if ((y -= c[i]) < 0) return Z_DATA_ERROR; c[i] += y; /* Generate starting offsets into the value table for each length */ x[1] = j = 0; p = c + 1; xp = x + 2; while (--i) { /* note that i == g from above */ *xp++ = (j += *p++); } /* Make a table of values in order of bit lengths */ p = b; i = 0; do { if ((j = *p++) != 0) v[x[j]++] = i; } while (++i < n); n = x[g]; /* set n to length of v */ /* Generate the Huffman codes and for each, make the table entries */ x[0] = i = 0; /* first Huffman code is zero */ p = v; /* grab values in bit order */ h = -1; /* no tables yet--level -1 */ w = -l; /* bits decoded == (l * h) */ u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ q = (inflate_huft *)Z_NULL; /* ditto */ z = 0; /* ditto */ /* go through the bit lengths (k already is bits in shortest code) */ for (; k <= g; k++) { a = c[k]; while (a--) { int nextw=w; /* here i is the Huffman code of length k bits for value *p */ /* make tables up to required level */ while (k > (nextw=w + l)) { h++; /* compute minimum size table less than or equal to l bits */ z = g - nextw; z = z > (uInt)l ? l : z; /* table size upper limit */ if ((f = 1 << (j = k - nextw)) > a + 1) /* try a k-w bit table */ { /* too few codes for k-w bit table */ f -= a + 1; /* deduct codes from patterns left */ xp = c + k; if (j < z) while (++j < z && (f <<= 1) > *++xp) /* try smaller tables up to z bits */ { f -= *xp; /* else deduct codes from patterns */ } } z = 1 << j; /* table entries for j-bit table */ /* allocate new table */ if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ return Z_MEM_ERROR; /* not enough memory */ u[h] = q = hp + *hn; *hn += z; /* connect to last table, if there is one */ if (h) { x[h] = i; /* save pattern for backing up */ r.bits = (Byte)l; /* bits to dump before this table */ r.exop = (Byte)j; /* bits in this table */ j = i >> w; r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ u[h-1][j] = r; /* connect to last table */ } else *t = q; /* first table is returned result */ w=nextw; /* previous table always l bits */ } /* set up table entry in r */ r.bits = (Byte)(k - w); if (p >= v + n) r.exop = 128 + 64; /* out of values--invalid code */ else if (*p < s) { r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ r.base = *p++; /* simple code is just the value */ } else { r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ r.base = d[*p++ - s]; } /* fill code-like entries with r */ f = 1 << (k - w); for (j = i >> w; j < z; j += f) q[j] = r; /* backwards increment the k-bit code i */ for (j = 1 << (k - 1); i & j; j >>= 1) i ^= j; i ^= j; /* backup over finished tables */ while ((i & ((1 << w) - 1)) != x[h]) { h--; /* don't need to update q */ w -= l; } } } /* Return Z_BUF_ERROR if we were given an incomplete table */ return (y != 0 && g != 1) ? Z_BUF_ERROR : Z_OK; } int ZEXPORT inflate(z_streamp z) { inflate_blocks_statef *s = &z->blocks; inflate_codes_statef *c = &s->sub.decode.t_codes; /* codes state */ // lousy two bytes saved by doing this struct { uInt t; /* temporary storage */ uLong b; /* bit buffer */ uInt k; /* bits in bit buffer */ Bytef *p; /* input data pointer */ uInt n; /* bytes available there */ Bytef *q; /* output window write pointer */ uInt m; /* bytes to end of window or read pointer */ /* CODES variables */ inflate_huft *j; /* temporary pointer */ uInt e; /* extra bits or operation */ Bytef *f; /* pointer to copy strings from */ } _state; #define t _state.t #define b _state.b #define k _state.k #define p _state.p #define n _state.n #define q _state.q #define m _state.m /* copy input/output information to locals (UPDATE macro restores) */ LOAD /* process input based on current state */ for (;;) switch (s->mode) { case TYPE: NEEDBITS(3) t = (uInt)b & 7; DUMPBITS(3) s->last = (t & 1) ? DRY : TYPE; switch (t >> 1) { case 0: /* stored */ Tracev((stderr, _T("inflate: stored block%s\n"), LAST ? _T(" (last)") : _T(""))); DUMPBITS(k&7) s->mode = LENS; /* get length of stored block */ break; case 1: /* fixed */ Tracev((stderr, _T("inflate: fixed codes block%s\n"), LAST ? _T(" (last)") : _T(""))); { if (!fixed_built) { int _k; /* temporary variable */ uInt f = 0; /* number of hufts used in fixed_mem */ static uIntf c[288]; /* length list for huft_build */ /* literal table */ for (_k = 0; _k < 288; _k++) { char v=8; if (_k > 143) { if (_k < 256) v++; else if (_k < 280) v--; } c[_k] = v; } huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, fixed_mem, &f); /* distance table */ for (_k = 0; _k < 30; _k++) c[_k] = 5; huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, fixed_mem, &f); /* done */ fixed_built++; } //s->sub.decode.t_codes.mode = CODES_START; s->sub.decode.t_codes.lbits = (Byte)fixed_bl; s->sub.decode.t_codes.dbits = (Byte)fixed_bd; s->sub.decode.t_codes.ltree = fixed_tl; s->sub.decode.t_codes.dtree = fixed_td; } s->mode = CODES_START; break; case 2: /* dynamic */ Tracev((stderr, _T("inflate: dynamic codes block%s\n"), LAST ? _T(" (last)") : _T(""))); s->mode = TABLE; break; case 3: /* illegal */ /* the only illegal value possible is 3 because we check only 2 bits */ goto bad; } break; case LENS: NEEDBITS(32) s->sub.left = (uInt)b & 0xffff; b = k = 0; /* dump bits */ Tracev((stderr, _T("inflate: stored length %u\n"), s->sub.left)); s->mode = s->sub.left ? STORED : s->last; break; case STORED: { uInt mn; if (n == 0) LEAVE(Z_OK) NEEDOUT mn = min(m, n); t = min(s->sub.left, mn); zmemcpy(q, p, t); p += t; n -= t; q += t; m -= t; if (!(s->sub.left -= t)) s->mode = s->last; break; } case TABLE: NEEDBITS(14) s->sub.trees.table = t = (uInt)b & 0x3fff; if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) { s->mode = BAD; LEAVE(Z_DATA_ERROR); } //t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); DUMPBITS(14) s->sub.trees.index = 0; Tracev((stderr, _T("inflate: table sizes ok\n"))); s->mode = BTREE; case BTREE: while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) { NEEDBITS(3) s->sub.trees.t_blens[(int)border[s->sub.trees.index++]] = (uInt)b & 7; DUMPBITS(3) } while (s->sub.trees.index < 19) s->sub.trees.t_blens[(int)border[s->sub.trees.index++]] = 0; s->sub.trees.bb = 7; { uInt hn = 0; /* hufts used in space */ t = huft_build(s->sub.trees.t_blens, 19, 19, (unsigned short*)Z_NULL, (unsigned short*)Z_NULL, &s->sub.trees.tb, &s->sub.trees.bb, s->hufts, &hn); if (t != Z_OK || !s->sub.trees.bb) { s->mode = BAD; break; } } s->sub.trees.index = 0; Tracev((stderr, _T("inflate: bits tree ok\n"))); s->mode = DTREE; case DTREE: while (t = s->sub.trees.table, s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) { inflate_huft *h; uInt i, j, c; t = s->sub.trees.bb; NEEDBITS(t) h = s->sub.trees.tb + ((uInt)b & (uInt)inflate_mask[t]); t = h->bits; c = h->base; if (c < 16) { DUMPBITS(t) s->sub.trees.t_blens[s->sub.trees.index++] = c; } else /* c == 16..18 */ { if (c == 18) { i=7; j=11; } else { i=c-14; j=3; } NEEDBITS(t+i) DUMPBITS(t) j += (uInt)b & (uInt)inflate_mask[i]; DUMPBITS(i) i = s->sub.trees.index; t = s->sub.trees.table; if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { s->mode = BAD; LEAVE(Z_DATA_ERROR); } c = c == 16 ? s->sub.trees.t_blens[i - 1] : 0; do { s->sub.trees.t_blens[i++] = c; } while (--j); s->sub.trees.index = i; } } s->sub.trees.tb = Z_NULL; { uInt hn = 0; /* hufts used in space */ uInt bl, bd; inflate_huft *tl, *td; int nl,nd; t = s->sub.trees.table; nl = 257 + (t & 0x1f); nd = 1 + ((t >> 5) & 0x1f); bl = 9; /* must be <= 9 for lookahead assumptions */ bd = 6; /* must be <= 9 for lookahead assumptions */ t = huft_build(s->sub.trees.t_blens, nl, 257, cplens, cplext, &tl, &bl, s->hufts, &hn); if (bl == 0) t = Z_DATA_ERROR; if (t == Z_OK) { /* build distance tree */ t = huft_build(s->sub.trees.t_blens + nl, nd, 0, cpdist, cpdext, &td, &bd, s->hufts, &hn); } if (t != Z_OK || (bd == 0 && nl > 257)) { s->mode = BAD; LEAVE(Z_DATA_ERROR); } Tracev((stderr, _T("inflate: trees ok\n"))); //s->sub.decode.t_codes.mode = CODES_START; s->sub.decode.t_codes.lbits = (Byte)bl; s->sub.decode.t_codes.dbits = (Byte)bd; s->sub.decode.t_codes.ltree = tl; s->sub.decode.t_codes.dtree = td; } s->mode = CODES_START; #define j (_state.j) #define e (_state.e) #define f (_state.f) /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ case CODES_START: /* x: set up for LEN */ c->sub.code.need = c->lbits; c->sub.code.tree = c->ltree; s->mode = CODES_LEN; case CODES_LEN: /* i: get length/literal/eob next */ t = c->sub.code.need; NEEDBITS(t) j = c->sub.code.tree + ((uInt)b & (uInt)inflate_mask[t]); DUMPBITS(j->bits) e = (uInt)(j->exop); if (e == 0) /* literal */ { c->sub.lit = j->base; s->mode = CODES_LIT; break; } if (e & 16) /* length */ { c->sub.copy.get = e & 15; c->len = j->base; s->mode = CODES_LENEXT; break; } if ((e & 64) == 0) /* next table */ { c->sub.code.need = e; c->sub.code.tree = j + j->base; break; } if (e & 32) /* end of block */ { s->mode = CODES_WASH; break; } goto bad; case CODES_LENEXT: /* i: getting length extra (have base) */ t = c->sub.copy.get; NEEDBITS(t) c->len += (uInt)b & (uInt)inflate_mask[t]; DUMPBITS(t) c->sub.code.need = c->dbits; c->sub.code.tree = c->dtree; s->mode = CODES_DIST; case CODES_DIST: /* i: get distance next */ t = c->sub.code.need; NEEDBITS(t) j = c->sub.code.tree + ((uInt)b & (uInt)inflate_mask[t]); DUMPBITS(j->bits) e = (uInt)(j->exop); if (e & 16) /* distance */ { c->sub.copy.get = e & 15; c->sub.copy.dist = j->base; s->mode = CODES_DISTEXT; break; } if ((e & 64) == 0) /* next table */ { c->sub.code.need = e; c->sub.code.tree = j + j->base; break; } goto bad; /* invalid code */ case CODES_DISTEXT: /* i: getting distance extra */ t = c->sub.copy.get; NEEDBITS(t) c->sub.copy.dist += (uInt)b & (uInt)inflate_mask[t]; DUMPBITS(t) s->mode = CODES_COPY; case CODES_COPY: /* o: copying bytes in window, waiting for space */ f = (uInt)(q - s->window) < c->sub.copy.dist ? s->end - (c->sub.copy.dist - (q - s->window)) : q - c->sub.copy.dist; while (c->len) { NEEDOUT OUTBYTE(*f++) if (f == s->end) f = s->window; c->len--; } s->mode = CODES_START; break; case CODES_LIT: /* o: got literal, waiting for output space */ NEEDOUT OUTBYTE(c->sub.lit) s->mode = CODES_START; break; case CODES_WASH: /* o: got eob, possibly more output */ if (k > 7) /* return unused byte, if any */ { k -= 8; n++; p--; /* can always return one */ } /* flushing will be done in DRY */ #undef j #undef e #undef f case DRY: FLUSH if (s->write != s->read) LEAVE(Z_OK) if (s->mode == CODES_WASH) { Tracev((stderr, _T("inflate: codes end, %lu total out\n"), z->total_out + (q >= s->read ? q - s->read : (s->end - s->read) + (q - s->window)))); } /* DRY if last, TYPE if not */ s->mode = s->last; if (s->mode == TYPE) break; LEAVE(Z_STREAM_END) //case BAD: //r = Z_DATA_ERROR; //LEAVE default: // we'll call Z_STREAM_ERROR if BAD anyway bad: s->mode = BAD; LEAVE(Z_STREAM_ERROR) } } #undef t #undef b #undef k #undef p #undef n #undef q #undef m nsis-3.11/Source/zlib/ZCONF.H000077500000000000000000000031311477201124000156010ustar00rootroot00000000000000/* * This file is a part of the zlib compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.zlib.net/ * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 */ /* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: ZCONF.H,v 1.3 2007/01/13 17:28:23 kichik Exp $ */ #ifndef _ZCONF_H #define _ZCONF_H #define MAX_MEM_LEVEL 9 /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif #define OF(args) args #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef FAR # define FAR #endif typedef unsigned char Byte; /* 8 bits */ typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ typedef Byte FAR Bytef; typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; typedef void FAR *voidpf; typedef void *voidp; #ifndef z_off_t # define z_off_t long #endif #endif /* _ZCONF_H */ nsis-3.11/Source/zlib/ZLIB.H000077500000000000000000000227051477201124000154720ustar00rootroot00000000000000/* * This file is a part of the zlib compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.zlib.net/ * * This software is provided 'as-is', without any express or implied * warranty. * * Unicode support by Jim Park -- 08/27/2007 */ /* zlib.h -- interface of the 'zlib' general purpose compression library version 1.1.3, July 9th, 1998 Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu */ #ifndef _ZLIB_H #define _ZLIB_H #include "ZCONF.H" #include "ZUTIL.H" #ifdef __cplusplus extern "C" { #endif #ifdef EXEHEAD typedef struct inflate_huft_s FAR inflate_huft; typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ CODES_START, /* x: set up for LEN */ CODES_LEN, /* i: get length/literal/eob next */ CODES_LENEXT, /* i: getting length extra (have base) */ CODES_DIST, /* i: get distance next */ CODES_DISTEXT, /* i: getting distance extra */ CODES_COPY, /* o: copying bytes in window, waiting for space */ CODES_LIT, /* o: got literal, waiting for output space */ CODES_WASH, /* o: got eob, possibly still output waiting */ //CODES_END, /* x: got eob and all data flushed */ //CODES_BADCODE, /* x: got error */ TYPE, /* get type bits (3, including end bit) */ LENS, /* get lengths for stored */ STORED, /* processing stored block */ TABLE, /* get table lengths */ BTREE, /* get bit lengths tree for a dynamic block */ DTREE, /* get length, distance trees for a dynamic block */ CODES, /* processing fixed or dynamic block */ DRY, /* output remaining window bytes */ DONE, /* finished last block, done */ BAD /* got a data error--stuck here */ } inflate_mode; /* inflate codes private state */ struct inflate_codes_state { /* mode */ //inflate_mode mode; /* current inflate_codes mode */ /* mode dependent information */ uInt len; union { struct { inflate_huft *tree; /* pointer into tree */ uInt need; /* bits needed */ } code; /* if LEN or DIST, where in tree */ uInt lit; /* if LIT, literal */ struct { uInt get; /* bits to get for extra */ uInt dist; /* distance back to copy from */ } copy; /* if EXT or COPY, where and how much */ } sub; /* submode */ /* mode independent information */ Byte lbits; /* ltree bits decoded per branch */ Byte dbits; /* dtree bits decoder per branch */ inflate_huft *ltree; /* literal/length/eob tree */ inflate_huft *dtree; /* distance tree */ }; struct inflate_huft_s { union { struct { Byte Exop; /* number of extra bits or operation */ Byte Bits; /* number of bits in this code or subcode */ } what; } word; unsigned short base; /* literal, length base, distance base, or table offset */ }; #define MANY 1440 typedef struct inflate_codes_state inflate_codes_statef; struct inflate_blocks_state { /* mode */ inflate_mode mode; /* current inflate_block mode */ /* mode dependent information */ union { uInt left; /* if STORED, bytes left to copy */ struct { uInt table; /* table lengths (14 bits) */ uInt index; /* index into blens (or border) */ uIntf t_blens[258+31+31]; /* bit lengths of codes */ uInt bb; /* bit length tree depth */ inflate_huft *tb; /* bit length decoding tree */ } trees; /* if DTREE, decoding info for trees */ struct { inflate_codes_statef t_codes; } decode; /* if CODES, current state */ } sub; /* submode */ uInt last; /* DRY if this block is the last block, TYPE otherwise */ /* mode independent information */ uInt bitk; /* bits in bit buffer */ uLong bitb; /* bit buffer */ inflate_huft hufts[MANY]; /* single malloc for tree space */ Bytef window[1 << MAX_WBITS]; /* sliding window */ Bytef *end; /* one byte after sliding window */ Bytef *read; /* window read pointer */ Bytef *write; /* window write pointer */ uLong check; /* check on output */ }; #else struct internal_state; #endif typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ #ifndef EXEHEAD uLong total_in; /* total nb of input bytes read so far */ #endif Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ #ifndef EXEHEAD uLong total_out; /* total nb of bytes output so far */ #endif // TCHAR *msg; /* last error message, NULL if no error */ //struct internal_state FAR *state; /* not visible by applications */ #ifdef EXEHEAD struct inflate_blocks_state blocks; /* current inflate_blocks state */ #else struct internal_state *state; #endif } z_stream; typedef z_stream FAR *z_streamp; #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 /* Allowed flush values; see deflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #ifndef EXEHEAD #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) #else // EXEHEAD doesn't need a specific return code, just < 0 #define Z_STREAM_ERROR Z_ERRNO #define Z_DATA_ERROR Z_ERRNO #define Z_MEM_ERROR Z_ERRNO #define Z_BUF_ERROR Z_ERRNO #define Z_VERSION_ERROR Z_ERRNO #endif /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_ASCII 1 #define Z_UNKNOWN 2 /* Possible values of the data_type field */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); #define inflateInit(x) inflateReset(x) int ZEXPORT inflate(z_streamp z); ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); //void ZEXPORT inflateReset OF(( // z_streamp)); #define inflateReset(z) \ { \ (z)->blocks.mode = TYPE; \ (z)->blocks.bitk = (z)->blocks.bitb = 0; \ (z)->blocks.read = (z)->blocks.write = (z)->blocks.window; \ (z)->blocks.end = (z)->blocks.window + (1 << DEF_WBITS); \ } /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const TCHAR *version, int stream_size)); //ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, // const TCHAR *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const TCHAR *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), _T(""), sizeof(z_stream)) #ifdef __cplusplus } #endif #endif /* _ZLIB_H */ nsis-3.11/Source/zlib/ZUTIL.H000077500000000000000000000045621477201124000156420ustar00rootroot00000000000000/* * This file is a part of the zlib compression module for NSIS. * * Copyright and license information can be found below. * Modifications Copyright (C) 1999-2025 Nullsoft and Contributors * * The original zlib source code is available at * http://www.zlib.net/ * * This software is provided 'as-is', without any express or implied * warranty. * * Reviewed for Unicode support by Jim Park -- 08/27/2007 * The messages generated here are mostly #def'ed out, but are used * when debugging. So in order for the messages to be viewable in * Unicode version, using TCHAR macros. */ /* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id: ZUTIL.H,v 1.6 2007/01/25 18:07:40 kichik Exp $ */ #ifndef _Z_UTIL_H #define _Z_UTIL_H #include "../Platform.h" #include "ZLIB.H" #include "../tchar.h" #ifndef local # define local static #endif typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #define DEF_MEM_LEVEL MAX_MEM_LEVEL #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ #ifdef EXEHEAD # ifdef _WIN32 # include "../exehead/util.h" # define zmemcpy mini_memcpy # else # include // Avoid "incompatible implicit declaration of built-in function" # define zmemcpy memcpy # endif #else # define zmemcpy memcpy # define zmemzero(a,b) memset(a,0,b) #endif #define Assert(cond,msg) #define Trace(x) #define Tracev(x) #define Tracevv(x) #define Tracec(c,x) #define Tracecv(c,x) #define ZALLOC(strm, items, size) malloc((items)*(size)) #define ZFREE(strm, addr) { if (addr) free(addr); } #define TRY_FREE(s, p) { ZFREE(s, p); } #define ERR_RETURN(strm,err) return (err) #endif /* _Z_UTIL_H */ nsis-3.11/TODO.txt000077500000000000000000000005561477201124000137270ustar00rootroot00000000000000TODO ---- NSIS * Compiler plug-ins * Empty subsections should not show * Option to cancel the installation process EXAMPLES * Write an advanced paging example showing multiple components page with multiple instfiles pages PLUG-INS * InstallOptions - custom class names so you can include any control you want * nsExec - live outputsnsis-3.11/nsisconf.nsh000077500000000000000000000032761477201124000147570ustar00rootroot00000000000000;------------------------ ;DEFAULT NSIS CONFIG FILE ;------------------------ ;This header file will be included when compiling any NSIS installer, ;you can use it to add script code to every installer you compile. ;This file is treated as if it is in the directory of your script. ;When using relative paths, the files have to be in your build directory. ;------------------------ ;EXAMPLES ;------------------------ ;Compress installer exehead with an executable compressor (such as UPX / Petite). ;Paths should be absolute to allow building from any location. ;Note that your executable compressor should not compress the first icon. ;!packhdr temp.dat '"C:\Program Files\upx\upx" -9 -q temp.dat' ;!packhdr temp.dat '"C:\Program Files\petite\petite" -9 -b0 -r** -p0 -y temp.dat' ;------------------------ ;Set default compressor ;SetCompressor bzip2 ;------------------------ ;Change the default icons ;Icon "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" ;UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico" ;------------------------ ;Define symbols ;!define COMPANYNAME "bla" ;------------------------ ;MODERN UI ;------------------------ ;The Modern UI will insert the MUI_NSISCONF macro just before processing the settings. ;Here you can set default settings for the Modern UI. ;------------------------ !define MUI_INSERT_NSISCONF !macro MUI_NSISCONF ;Example: Change the default Modern UI icons ;!ifndef MUI_ICON & MUI_UNICON ; !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" ; !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico" ;!endif !macroend